]> git.proxmox.com Git - mirror_ubuntu-hirsute-kernel.git/blobdiff - net/sched/cls_cgroup.c
net_sched: switch to rcu_work
[mirror_ubuntu-hirsute-kernel.git] / net / sched / cls_cgroup.c
index 762da5c0cf5ea4b997a22325e16a98a4ae6e340c..3bc01bdde1659bdac6eba560bf8410e8bc3adfff 100644 (file)
@@ -23,10 +23,7 @@ struct cls_cgroup_head {
        struct tcf_exts         exts;
        struct tcf_ematch_tree  ematches;
        struct tcf_proto        *tp;
-       union {
-               struct work_struct      work;
-               struct rcu_head         rcu;
-       };
+       struct rcu_work         rwork;
 };
 
 static int cls_cgroup_classify(struct sk_buff *skb, const struct tcf_proto *tp,
@@ -70,24 +67,14 @@ static void __cls_cgroup_destroy(struct cls_cgroup_head *head)
 
 static void cls_cgroup_destroy_work(struct work_struct *work)
 {
-       struct cls_cgroup_head *head = container_of(work,
+       struct cls_cgroup_head *head = container_of(to_rcu_work(work),
                                                    struct cls_cgroup_head,
-                                                   work);
+                                                   rwork);
        rtnl_lock();
        __cls_cgroup_destroy(head);
        rtnl_unlock();
 }
 
-static void cls_cgroup_destroy_rcu(struct rcu_head *root)
-{
-       struct cls_cgroup_head *head = container_of(root,
-                                                   struct cls_cgroup_head,
-                                                   rcu);
-
-       INIT_WORK(&head->work, cls_cgroup_destroy_work);
-       tcf_queue_work(&head->work);
-}
-
 static int cls_cgroup_change(struct net *net, struct sk_buff *in_skb,
                             struct tcf_proto *tp, unsigned long base,
                             u32 handle, struct nlattr **tca,
@@ -134,7 +121,7 @@ static int cls_cgroup_change(struct net *net, struct sk_buff *in_skb,
        rcu_assign_pointer(tp->root, new);
        if (head) {
                tcf_exts_get_net(&head->exts);
-               call_rcu(&head->rcu, cls_cgroup_destroy_rcu);
+               tcf_queue_work(&head->rwork, cls_cgroup_destroy_work);
        }
        return 0;
 errout:
@@ -151,7 +138,7 @@ static void cls_cgroup_destroy(struct tcf_proto *tp,
        /* Head can still be NULL due to cls_cgroup_init(). */
        if (head) {
                if (tcf_exts_get_net(&head->exts))
-                       call_rcu(&head->rcu, cls_cgroup_destroy_rcu);
+                       tcf_queue_work(&head->rwork, cls_cgroup_destroy_work);
                else
                        __cls_cgroup_destroy(head);
        }