]> git.proxmox.com Git - mirror_ubuntu-artful-kernel.git/blobdiff - net/sched/sch_drr.c
net: sched: introduce tcf block infractructure
[mirror_ubuntu-artful-kernel.git] / net / sched / sch_drr.c
index 446d79bb25d9a731cf9eebf017137f35a9adf993..5db2a2843c66f0c864e562541b6a0952f445be44 100644 (file)
@@ -36,6 +36,7 @@ struct drr_class {
 struct drr_sched {
        struct list_head                active;
        struct tcf_proto __rcu          *filter_list;
+       struct tcf_block                *block;
        struct Qdisc_class_hash         clhash;
 };
 
@@ -190,15 +191,14 @@ static void drr_put_class(struct Qdisc *sch, unsigned long arg)
                drr_destroy_class(sch, cl);
 }
 
-static struct tcf_proto __rcu **drr_tcf_chain(struct Qdisc *sch,
-                                             unsigned long cl)
+static struct tcf_block *drr_tcf_block(struct Qdisc *sch, unsigned long cl)
 {
        struct drr_sched *q = qdisc_priv(sch);
 
        if (cl)
                return NULL;
 
-       return &q->filter_list;
+       return q->block;
 }
 
 static unsigned long drr_bind_tcf(struct Qdisc *sch, unsigned long parent,
@@ -431,6 +431,9 @@ static int drr_init_qdisc(struct Qdisc *sch, struct nlattr *opt)
        struct drr_sched *q = qdisc_priv(sch);
        int err;
 
+       err = tcf_block_get(&q->block, &q->filter_list);
+       if (err)
+               return err;
        err = qdisc_class_hash_init(&q->clhash);
        if (err < 0)
                return err;
@@ -462,7 +465,7 @@ static void drr_destroy_qdisc(struct Qdisc *sch)
        struct hlist_node *next;
        unsigned int i;
 
-       tcf_destroy_chain(&q->filter_list);
+       tcf_block_put(q->block);
 
        for (i = 0; i < q->clhash.hashsize; i++) {
                hlist_for_each_entry_safe(cl, next, &q->clhash.hash[i],
@@ -477,7 +480,7 @@ static const struct Qdisc_class_ops drr_class_ops = {
        .delete         = drr_delete_class,
        .get            = drr_get_class,
        .put            = drr_put_class,
-       .tcf_chain      = drr_tcf_chain,
+       .tcf_block      = drr_tcf_block,
        .bind_tcf       = drr_bind_tcf,
        .unbind_tcf     = drr_unbind_tcf,
        .graft          = drr_graft_class,