On Wed 29 Aug 2018 at 17:15, Cong Wang <xiyou.wangc...@gmail.com> wrote: > According to the new locking rule, we have to take tcf_lock > for both ->init() and ->dump(), as RTNL will be removed. > However, it is missing for act_connmark.
Thank you for finding and fixing this! > > Cc: Vlad Buslov <vla...@mellanox.com> > Signed-off-by: Cong Wang <xiyou.wangc...@gmail.com> > --- > net/sched/act_connmark.c | 11 ++++++++--- > 1 file changed, 8 insertions(+), 3 deletions(-) > > diff --git a/net/sched/act_connmark.c b/net/sched/act_connmark.c > index e869c0ee63c8..8475913f2070 100644 > --- a/net/sched/act_connmark.c > +++ b/net/sched/act_connmark.c > @@ -143,8 +143,10 @@ static int tcf_connmark_init(struct net *net, struct > nlattr *nla, > return -EEXIST; > } > /* replacing action and zone */ > + spin_lock_bh(&ci->tcf_lock); > ci->tcf_action = parm->action; > ci->zone = parm->zone; > + spin_unlock_bh(&ci->tcf_lock); > ret = 0; > } > > @@ -156,16 +158,16 @@ static inline int tcf_connmark_dump(struct sk_buff > *skb, struct tc_action *a, > { > unsigned char *b = skb_tail_pointer(skb); > struct tcf_connmark_info *ci = to_connmark(a); > - > struct tc_connmark opt = { > .index = ci->tcf_index, > .refcnt = refcount_read(&ci->tcf_refcnt) - ref, > .bindcnt = atomic_read(&ci->tcf_bindcnt) - bind, > - .action = ci->tcf_action, > - .zone = ci->zone, > }; > struct tcf_t t; > > + spin_lock_bh(&ci->tcf_lock); > + opt.action = ci->tcf_action; > + opt.zone = ci->zone; > if (nla_put(skb, TCA_CONNMARK_PARMS, sizeof(opt), &opt)) > goto nla_put_failure; > > @@ -173,9 +175,12 @@ static inline int tcf_connmark_dump(struct sk_buff *skb, > struct tc_action *a, > if (nla_put_64bit(skb, TCA_CONNMARK_TM, sizeof(t), &t, > TCA_CONNMARK_PAD)) > goto nla_put_failure; > + spin_unlock_bh(&ci->tcf_lock); > > return skb->len; > + > nla_put_failure: > + spin_unlock_bh(&ci->tcf_lock); > nlmsg_trim(skb, b); > return -1; > }