Merge tag 'pm-4.18-rc1-2' of git://git.kernel.org/pub/scm/linux/kernel/git/rafael...
[linux-2.6-microblaze.git] / net / sched / cls_fw.c
index 8b20772..29eeeaf 100644 (file)
@@ -47,10 +47,7 @@ struct fw_filter {
 #endif /* CONFIG_NET_CLS_IND */
        struct tcf_exts         exts;
        struct tcf_proto        *tp;
-       union {
-               struct work_struct      work;
-               struct rcu_head         rcu;
-       };
+       struct rcu_work         rwork;
 };
 
 static u32 fw_hash(u32 handle)
@@ -134,21 +131,14 @@ static void __fw_delete_filter(struct fw_filter *f)
 
 static void fw_delete_filter_work(struct work_struct *work)
 {
-       struct fw_filter *f = container_of(work, struct fw_filter, work);
-
+       struct fw_filter *f = container_of(to_rcu_work(work),
+                                          struct fw_filter,
+                                          rwork);
        rtnl_lock();
        __fw_delete_filter(f);
        rtnl_unlock();
 }
 
-static void fw_delete_filter(struct rcu_head *head)
-{
-       struct fw_filter *f = container_of(head, struct fw_filter, rcu);
-
-       INIT_WORK(&f->work, fw_delete_filter_work);
-       tcf_queue_work(&f->work);
-}
-
 static void fw_destroy(struct tcf_proto *tp, struct netlink_ext_ack *extack)
 {
        struct fw_head *head = rtnl_dereference(tp->root);
@@ -164,7 +154,7 @@ static void fw_destroy(struct tcf_proto *tp, struct netlink_ext_ack *extack)
                                         rtnl_dereference(f->next));
                        tcf_unbind_filter(tp, &f->res);
                        if (tcf_exts_get_net(&f->exts))
-                               call_rcu(&f->rcu, fw_delete_filter);
+                               tcf_queue_work(&f->rwork, fw_delete_filter_work);
                        else
                                __fw_delete_filter(f);
                }
@@ -193,7 +183,7 @@ static int fw_delete(struct tcf_proto *tp, void *arg, bool *last,
                        RCU_INIT_POINTER(*fp, rtnl_dereference(f->next));
                        tcf_unbind_filter(tp, &f->res);
                        tcf_exts_get_net(&f->exts);
-                       call_rcu(&f->rcu, fw_delete_filter);
+                       tcf_queue_work(&f->rwork, fw_delete_filter_work);
                        ret = 0;
                        break;
                }
@@ -316,7 +306,7 @@ static int fw_change(struct net *net, struct sk_buff *in_skb,
                rcu_assign_pointer(*fp, fnew);
                tcf_unbind_filter(tp, &f->res);
                tcf_exts_get_net(&f->exts);
-               call_rcu(&f->rcu, fw_delete_filter);
+               tcf_queue_work(&f->rwork, fw_delete_filter_work);
 
                *arg = fnew;
                return err;