Commit 9b0d4446 authored by Jiri Pirko's avatar Jiri Pirko Committed by David S. Miller

net: sched: avoid atomic swap in tcf_exts_change

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: default avatarJiri Pirko <jiri@mellanox.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 705c7091
...@@ -201,8 +201,7 @@ int tcf_exts_validate(struct net *net, struct tcf_proto *tp, ...@@ -201,8 +201,7 @@ int tcf_exts_validate(struct net *net, struct tcf_proto *tp,
struct nlattr **tb, struct nlattr *rate_tlv, struct nlattr **tb, struct nlattr *rate_tlv,
struct tcf_exts *exts, bool ovr); struct tcf_exts *exts, bool ovr);
void tcf_exts_destroy(struct tcf_exts *exts); void tcf_exts_destroy(struct tcf_exts *exts);
void tcf_exts_change(struct tcf_proto *tp, struct tcf_exts *dst, void tcf_exts_change(struct tcf_exts *dst, struct tcf_exts *src);
struct tcf_exts *src);
int tcf_exts_dump(struct sk_buff *skb, struct tcf_exts *exts); 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_dump_stats(struct sk_buff *skb, struct tcf_exts *exts);
int tcf_exts_get_dev(struct net_device *dev, struct tcf_exts *exts, int tcf_exts_get_dev(struct net_device *dev, struct tcf_exts *exts,
......
...@@ -883,18 +883,12 @@ int tcf_exts_validate(struct net *net, struct tcf_proto *tp, struct nlattr **tb, ...@@ -883,18 +883,12 @@ int tcf_exts_validate(struct net *net, struct tcf_proto *tp, struct nlattr **tb,
} }
EXPORT_SYMBOL(tcf_exts_validate); EXPORT_SYMBOL(tcf_exts_validate);
void tcf_exts_change(struct tcf_proto *tp, struct tcf_exts *dst, void tcf_exts_change(struct tcf_exts *dst, struct tcf_exts *src)
struct tcf_exts *src)
{ {
#ifdef CONFIG_NET_CLS_ACT #ifdef CONFIG_NET_CLS_ACT
struct tcf_exts old = *dst; struct tcf_exts old = *dst;
tcf_tree_lock(tp); *dst = *src;
dst->nr_actions = src->nr_actions;
dst->actions = src->actions;
dst->type = src->type;
tcf_tree_unlock(tp);
tcf_exts_destroy(&old); tcf_exts_destroy(&old);
#endif #endif
} }
......
...@@ -518,7 +518,7 @@ static int rsvp_change(struct net *net, struct sk_buff *in_skb, ...@@ -518,7 +518,7 @@ static int rsvp_change(struct net *net, struct sk_buff *in_skb,
tcf_bind_filter(tp, &n->res, base); 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); rsvp_replace(tp, n, handle);
return 0; return 0;
} }
...@@ -591,7 +591,7 @@ static int rsvp_change(struct net *net, struct sk_buff *in_skb, ...@@ -591,7 +591,7 @@ static int rsvp_change(struct net *net, struct sk_buff *in_skb,
if (f->tunnelhdr == 0) if (f->tunnelhdr == 0)
tcf_bind_filter(tp, &f->res, base); tcf_bind_filter(tp, &f->res, base);
tcf_exts_change(tp, &f->exts, &e); tcf_exts_change(&f->exts, &e);
fp = &s->ht[h2]; fp = &s->ht[h2];
for (nfp = rtnl_dereference(*fp); nfp; for (nfp = rtnl_dereference(*fp); nfp;
......
...@@ -419,9 +419,9 @@ tcindex_set_parms(struct net *net, struct tcf_proto *tp, unsigned long base, ...@@ -419,9 +419,9 @@ tcindex_set_parms(struct net *net, struct tcf_proto *tp, unsigned long base,
} }
if (old_r) if (old_r)
tcf_exts_change(tp, &r->exts, &e); tcf_exts_change(&r->exts, &e);
else else
tcf_exts_change(tp, &cr.exts, &e); tcf_exts_change(&cr.exts, &e);
if (old_r && old_r != r) { if (old_r && old_r != r) {
err = tcindex_filter_result_init(old_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, ...@@ -439,7 +439,7 @@ tcindex_set_parms(struct net *net, struct tcf_proto *tp, unsigned long base,
struct tcindex_filter *nfp; struct tcindex_filter *nfp;
struct tcindex_filter __rcu **fp; 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); fp = cp->h + (handle % cp->hash);
for (nfp = rtnl_dereference(*fp); for (nfp = rtnl_dereference(*fp);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment