net: sched: avoid atomic swap in tcf_exts_change
authorJiri Pirko <jiri@mellanox.com>
Fri, 4 Aug 2017 12:29:15 +0000 (14:29 +0200)
committerDavid S. Miller <davem@davemloft.net>
Fri, 4 Aug 2017 18:21:24 +0000 (11:21 -0700)
tcf_exts_change is always called on newly created exts, which are not used
on fastpath. Therefore, simple struct copy is enough.

Signed-off-by: Jiri Pirko <jiri@mellanox.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
include/net/pkt_cls.h
net/sched/cls_api.c
net/sched/cls_rsvp.h
net/sched/cls_tcindex.c

index b8959c9a190d4cd6123f892ed6bca64257e0950c..e0c54f1114677cf68f219f71f4c5eedf25a838ec 100644 (file)
@@ -201,8 +201,7 @@ int tcf_exts_validate(struct net *net, struct tcf_proto *tp,
                      struct nlattr **tb, struct nlattr *rate_tlv,
                      struct tcf_exts *exts, bool ovr);
 void tcf_exts_destroy(struct tcf_exts *exts);
-void tcf_exts_change(struct tcf_proto *tp, struct tcf_exts *dst,
-                    struct tcf_exts *src);
+void tcf_exts_change(struct tcf_exts *dst, struct tcf_exts *src);
 int tcf_exts_dump(struct sk_buff *skb, struct tcf_exts *exts);
 int tcf_exts_dump_stats(struct sk_buff *skb, struct tcf_exts *exts);
 int tcf_exts_get_dev(struct net_device *dev, struct tcf_exts *exts,
index 735d556a528318ecc2d12eba7ef6de0a8c945276..e655221c654e16d51b8bf4eac5fab29108d58110 100644 (file)
@@ -883,18 +883,12 @@ int tcf_exts_validate(struct net *net, struct tcf_proto *tp, struct nlattr **tb,
 }
 EXPORT_SYMBOL(tcf_exts_validate);
 
-void tcf_exts_change(struct tcf_proto *tp, struct tcf_exts *dst,
-                    struct tcf_exts *src)
+void tcf_exts_change(struct tcf_exts *dst, struct tcf_exts *src)
 {
 #ifdef CONFIG_NET_CLS_ACT
        struct tcf_exts old = *dst;
 
-       tcf_tree_lock(tp);
-       dst->nr_actions = src->nr_actions;
-       dst->actions = src->actions;
-       dst->type = src->type;
-       tcf_tree_unlock(tp);
-
+       *dst = *src;
        tcf_exts_destroy(&old);
 #endif
 }
index 0d9d077986992926a79af6236b8840181517679d..4adb67a734915d8be968ce51f24811c1cd8811fa 100644 (file)
@@ -518,7 +518,7 @@ static int rsvp_change(struct net *net, struct sk_buff *in_skb,
                        tcf_bind_filter(tp, &n->res, base);
                }
 
-               tcf_exts_change(tp, &n->exts, &e);
+               tcf_exts_change(&n->exts, &e);
                rsvp_replace(tp, n, handle);
                return 0;
        }
@@ -591,7 +591,7 @@ insert:
                        if (f->tunnelhdr == 0)
                                tcf_bind_filter(tp, &f->res, base);
 
-                       tcf_exts_change(tp, &f->exts, &e);
+                       tcf_exts_change(&f->exts, &e);
 
                        fp = &s->ht[h2];
                        for (nfp = rtnl_dereference(*fp); nfp;
index 66924d147e97335b0bdce434bdf6216dd1a602f2..d69f828f3feda507fece51ec42f24701bea5bfed 100644 (file)
@@ -419,9 +419,9 @@ tcindex_set_parms(struct net *net, struct tcf_proto *tp, unsigned long base,
        }
 
        if (old_r)
-               tcf_exts_change(tp, &r->exts, &e);
+               tcf_exts_change(&r->exts, &e);
        else
-               tcf_exts_change(tp, &cr.exts, &e);
+               tcf_exts_change(&cr.exts, &e);
 
        if (old_r && old_r != r) {
                err = tcindex_filter_result_init(old_r);
@@ -439,7 +439,7 @@ tcindex_set_parms(struct net *net, struct tcf_proto *tp, unsigned long base,
                struct tcindex_filter *nfp;
                struct tcindex_filter __rcu **fp;
 
-               tcf_exts_change(tp, &f->result.exts, &r->exts);
+               tcf_exts_change(&f->result.exts, &r->exts);
 
                fp = cp->h + (handle % cp->hash);
                for (nfp = rtnl_dereference(*fp);