On Mon, 2016-09-12 at 16:46 -0400, Jamal Hadi Salim wrote:

> +
> +static int tcf_skbmod_dump(struct sk_buff *skb, struct tc_action *a,
> +                        int bind, int ref)
> +{
> +     struct tcf_skbmod *d = to_skbmod(a);
> +     unsigned char *b = skb_tail_pointer(skb);
> +     struct tcf_skbmod_params  *p = rtnl_dereference(d->skbmod_p);
> +     struct tc_skbmod opt = {
> +             .index   = d->tcf_index,
> +             .refcnt  = d->tcf_refcnt - ref,
> +             .bindcnt = d->tcf_bindcnt - bind,
> +             .action  = d->tcf_action,
> +     };
> +     struct tcf_t t;
> +
> +     rcu_read_lock();

You do not need rcu read lock protection here, RTNL is enough.

> +
> +     opt.flags  = p->flags;
> +     if (nla_put(skb, TCA_SKBMOD_PARMS, sizeof(opt), &opt))
> +             goto nla_put_failure;
> +     if ((p->flags & SKBMOD_F_DMAC) &&
> +         nla_put(skb, TCA_SKBMOD_DMAC, ETH_ALEN, p->eth_dst))
> +             goto nla_put_failure;
> +     if ((p->flags & SKBMOD_F_SMAC) &&
> +         nla_put(skb, TCA_SKBMOD_SMAC, ETH_ALEN, p->eth_src))
> +             goto nla_put_failure;
> +     if ((p->flags & SKBMOD_F_ETYPE) &&
> +         nla_put_u16(skb, TCA_SKBMOD_ETYPE, ntohs(p->eth_type)))
> +             goto nla_put_failure;
> +
> +     tcf_tm_dump(&t, &d->tcf_tm);
> +     if (nla_put_64bit(skb, TCA_SKBMOD_TM, sizeof(t), &t, TCA_SKBMOD_PAD))
> +             goto nla_put_failure;
> +
> +     rcu_read_unlock();
> +
> +     return skb->len;
> +nla_put_failure:
> +     rcu_read_unlock();
> +     nlmsg_trim(skb, b);
> +     return -1;
> +}
> +

Reply via email to