Import 2.1.89
[davej-history.git] / net / core / dst.c
index 698308f..e94ef29 100644 (file)
@@ -79,6+79,11 @@ static int dst_blackhole(struct sk_buff *skb)
 void * dst_alloc(int size, struct dst_ops * ops)
 {
        struct dst_entry * dst;
+
+       if (ops->gc && atomic_read(&ops->entries) > ops->gc_thresh) {
+               if (ops->gc())
+                       return NULL;
+       }
        dst = kmalloc(size, GFP_ATOMIC);
        if (!dst)
                return NULL;
@@ -89,6+94,7 @@ void * dst_alloc(int size, struct dst_ops * ops)
        dst->input = dst_discard;
        dst->output = dst_blackhole;
        atomic_inc(&dst_total);
+       atomic_inc(&ops->entries);
        return dst;
 }
 
@@ -122,6+128,8 @@ void dst_destroy(struct dst_entry * dst)
                neigh_release(neigh);
        }
 
+       atomic_dec(&dst->ops->entries);
+
        if (dst->ops->destroy)
                dst->ops->destroy(dst);
        atomic_dec(&dst_total);
close