[ovs-dev] OVS DPDK: dpdk_merge pull request

Stokes, Ian ian.stokes at intel.com
Tue Nov 21 13:14:53 UTC 2017


> On Fri, Nov 17, 2017 at 07:27:51PM +0000, Stokes, Ian wrote:
> > The following changes since commit
> 1ae83bb20677b42d63dbb2140fa8ed3144c6260f:
> >
> >   netdev-tc-offloads: Add support for action set (2017-11-16 08:10:29
> > -0800)
> >
> > are available in the git repository at:
> >
> >   https://github.com/istokes/ovs dpdk_merge
> >
> > for you to fetch changes up to af5b0dad30359d14d6412eb80e81783a83a678ce:
> >
> >   netdev-dpdk: Fix mempool creation with large MTU. (2017-11-17
> > 16:26:33 +0000)
> 
> Thanks a lot.  I merged this branch into master.

Thanks Ben.

> 
> This yields a new "sparse" warning:
>     ../lib/netdev-tc-offloads.c:584:20: warning: Variable length array is
> used.
> because of this declaration in parse_put_flow_set_masked_action():
>     char *set_buff[set_len], *set_data, *set_mask;
> 

So this was introduced in commit 1ae83bb20677b42d63dbb2140fa8ed3144c6260f: netdev-tc-offloads: Add support for action set. This was pushed just after I had submitted the pull request (but wasn't actually part of the pull request patches).

It's strange though, I ran sparse before submitting the pull request and it came back clean. Checking after the merge and I don't see the warning you see. (Normally I would not submit a pull request if a sparse warning occurred). What version of sparse are you using out of interest? I'm using sparse-0.5.0-10.
 
> It may or may not be worth fixing that.  In favor of fixing it is keeping
> OVS sparse warning free, but against it is that the replacement would
> probably be malloc(), which is slower.
> 
> However, looking a bit closer (now that I've already done the merge), I
> think there is a bug here.  set_buff[] is declared as char
> *set_buff[set_len], which has size (set_len * sizeof(char *)), but only
> set_len bytes of it are used.  I think that the right declaration would be
> more like uint8_t set_buff[set_len];, although that would lack the proper
> alignment for struct nl_attr.
> 
> Maybe something like this would be the appropriate fix for both issues.
> Will you please review it?

Sure, will be happy to review, but would also be good to get someone with tc-offload experience to sign off also.

Roi has also submitted a patch to fix the issue, maybe Roi could review below also?

https://mail.openvswitch.org/pipermail/ovs-dev/2017-November/341111.html

> 
> Thanks,
> 
> Ben.
> 
> diff --git a/lib/netdev-tc-offloads.c b/lib/netdev-tc-offloads.c index
> 781d849e4a87..d6b61f6360d0 100644
> --- a/lib/netdev-tc-offloads.c
> +++ b/lib/netdev-tc-offloads.c
> @@ -581,7 +581,9 @@ parse_put_flow_set_masked_action(struct tc_flower
> *flower,
>                                   bool hasmask)  {
>      static struct vlog_rate_limit rl = VLOG_RATE_LIMIT_INIT(5, 20);
> -    char *set_buff[set_len], *set_data, *set_mask;
> +    uint64_t set_stub[1024 / 8];
> +    struct ofpbuf set_buf = OFPBUF_STUB_INITIALIZER(set_stub);
> +    char *set_data, *set_mask;
>      char *key = (char *) &flower->rewrite.key;
>      char *mask = (char *) &flower->rewrite.mask;
>      const struct nlattr *attr;
> @@ -589,8 +591,7 @@ parse_put_flow_set_masked_action(struct tc_flower
> *flower,
>      size_t size;
> 
>      /* copy so we can set attr mask to 0 for used ovs key struct members
> */
> -    memcpy(set_buff, set, set_len);
> -    attr = (struct nlattr *) set_buff;
> +    attr = ofpbuf_put(&set_buf, set, set_len);
> 
>      type = nl_attr_type(attr);
>      size = nl_attr_get_size(attr) / 2;
> @@ -600,6 +601,7 @@ parse_put_flow_set_masked_action(struct tc_flower
> *flower,
>      if (type >= ARRAY_SIZE(set_flower_map)
>          || !set_flower_map[type][0].size) {
>          VLOG_DBG_RL(&rl, "unsupported set action type: %d", type);
> +        ofpbuf_uninit(&set_buf);
>          return EOPNOTSUPP;
>      }
> 
> @@ -632,9 +634,11 @@ parse_put_flow_set_masked_action(struct tc_flower
> *flower,
>      if (hasmask && !is_all_zeros(set_mask, size)) {
>          VLOG_DBG_RL(&rl, "unsupported sub attribute of set action type
> %d",
>                      type);
> +        ofpbuf_uninit(&set_buf);
>          return EOPNOTSUPP;
>      }
> 
> +    ofpbuf_uninit(&set_buf);
>      return 0;
>  }
> 


More information about the dev mailing list