net_sched: sch_fq: use bulk freeing in fq_gc()
authorEric Dumazet <edumazet@google.com>
Sun, 3 May 2020 02:54:20 +0000 (19:54 -0700)
committerDavid S. Miller <davem@davemloft.net>
Sun, 3 May 2020 22:50:31 +0000 (15:50 -0700)
fq_gc() already builds a small array of pointers, so using
kmem_cache_free_bulk() needs very little change.

Signed-off-by: Eric Dumazet <edumazet@google.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
net/sched/sch_fq.c

index ced1f987d7e4d5a09d0c5830b7f6ce01e9e246bc..53ec47ff84693a6c9b94a5e8c155b46aea0d259d 100644 (file)
@@ -214,9 +214,10 @@ static void fq_gc(struct fq_sched_data *q,
                  struct rb_root *root,
                  struct sock *sk)
 {
-       struct fq_flow *f, *tofree[FQ_GC_MAX];
        struct rb_node **p, *parent;
-       int fcnt = 0;
+       void *tofree[FQ_GC_MAX];
+       struct fq_flow *f;
+       int i, fcnt = 0;
 
        p = &root->rb_node;
        parent = NULL;
@@ -239,15 +240,18 @@ static void fq_gc(struct fq_sched_data *q,
                        p = &parent->rb_left;
        }
 
+       if (!fcnt)
+               return;
+
+       for (i = fcnt; i > 0; ) {
+               f = tofree[--i];
+               rb_erase(&f->fq_node, root);
+       }
        q->flows -= fcnt;
        q->inactive_flows -= fcnt;
        q->stat_gc_flows += fcnt;
-       while (fcnt) {
-               struct fq_flow *f = tofree[--fcnt];
 
-               rb_erase(&f->fq_node, root);
-               kmem_cache_free(fq_flow_cachep, f);
-       }
+       kmem_cache_free_bulk(fq_flow_cachep, fcnt, tofree);
 }
 
 static struct fq_flow *fq_classify(struct sk_buff *skb, struct fq_sched_data *q)