mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-11-15 00:04:15 +08:00
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: Jiri Pirko <jiri@mellanox.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
705c709126
commit
9b0d4446b5
@ -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,
|
||||
|
@ -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
|
||||
}
|
||||
|
@ -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;
|
||||
|
@ -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);
|
||||
|
Loading…
Reference in New Issue
Block a user