From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from dpdk.org (dpdk.org [92.243.14.124]) by inbox.dpdk.org (Postfix) with ESMTP id 50101A051C for ; Tue, 11 Feb 2020 15:22:59 +0100 (CET) Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id 0A31329CB; Tue, 11 Feb 2020 15:22:59 +0100 (CET) Received: from mail-wm1-f47.google.com (mail-wm1-f47.google.com [209.85.128.47]) by dpdk.org (Postfix) with ESMTP id 1814F29CB for ; Tue, 11 Feb 2020 15:22:58 +0100 (CET) Received: by mail-wm1-f47.google.com with SMTP id a5so3783873wmb.0 for ; Tue, 11 Feb 2020 06:22:58 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=message-id:subject:from:to:cc:date:in-reply-to:references :user-agent:mime-version:content-transfer-encoding; bh=2i07XKATxqCDESnl5UWcytVLTz/3384Uxn5KIqXnqr0=; b=FwW6IqL9zHnOpJPqeXkRoLT76XXsVmOtgeFJ6OtHoTcXCX4fK43FMGq7UnZBuMyoGD BZHq0zq4Q59+PCiVUbQ09VbfSF1edqEJbLHIvTnWffCZ0uX+OXOehIzSWCvkHijlwoig FLdqQ39nEJXVO6aNbyDxSEqCqFljSb7cbRZ7K+DEaqm6BoIy4vXlR1rEmG1rBUFl+Fwp zCjXexw62figH6ghOq077mHOIGXIOdHKDrGx5DR4M7rTVKLP4sqWmBZSyMWtnhNF5LAg bC4oaKAR3lnEH1bfq30KJnBw8gwPR4zLM3uF31Vioddkbz2RFs0tuL7q6U+NQO8XCB9S 6F4A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:message-id:subject:from:to:cc:date:in-reply-to :references:user-agent:mime-version:content-transfer-encoding; bh=2i07XKATxqCDESnl5UWcytVLTz/3384Uxn5KIqXnqr0=; b=AUxuKDsb9dPB/TU8+i9asnlL06Pz0+h5S+HD/r0ITgdAarWhl5/4ixgX9ubAjg6ujo vTvqlAS5j/k9mj9d65FnxG1Jx/IvHsZgjy8REMcRttsD5VZqsKjBGZr+z9ldAX5qd4Ga Flf5YpXSAcoqHfxgcLL+HhiFhYVt8uvdpMdUJvr7Hb6a62a3ZAeW2p86EJ10n/JPl5zp ivSglSrxbelVCxTooY6y9M7BUzrH25MZxI6fIMWhVME/8cySfv8sDH18Exsq1ZxypKFl iRN/YSW8D2nirhEKY7tR4z4knWl8YA/tyyt0qj2/5liBof3GGxIo3e8s6iDpT8zDGdQF qV/A== X-Gm-Message-State: APjAAAUaRoWFBlwUTjsVOlXEN+YSbtYDw0YiuSIlDmooxYQ6198ME0ll 4KgcymRmlWWEBV1mDoD9sAs= X-Google-Smtp-Source: APXvYqyWK2ngusXq2MBiZyZ0AzNKE8iEBIfLsHabY964jPIvTra5DD6JoXU7/FnEQ+WWDNgoKfi/0A== X-Received: by 2002:a7b:c19a:: with SMTP id y26mr6333757wmi.152.1581430977567; Tue, 11 Feb 2020 06:22:57 -0800 (PST) Received: from bluca-lenovo ([88.98.246.218]) by smtp.gmail.com with ESMTPSA id c74sm4222548wmd.26.2020.02.11.06.22.56 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 11 Feb 2020 06:22:56 -0800 (PST) Message-ID: <31aed464aa917104b0a57c6a32870e67a15a60ba.camel@gmail.com> From: Luca Boccassi To: Bing Zhao Cc: Ori Kam , Slava Ovsiienko , dpdk stable Date: Tue, 11 Feb 2020 14:22:56 +0000 In-Reply-To: References: <20200211112216.3929-1-luca.boccassi@gmail.com> <20200211112216.3929-122-luca.boccassi@gmail.com> Content-Type: text/plain; charset="UTF-8" User-Agent: Evolution 3.30.5-1.1 MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: Re: [dpdk-stable] patch 'net/mlx5: fix modify actions support limitation' has been queued to stable release 19.11.1 X-BeenThere: stable@dpdk.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: patches for DPDK stable branches List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: stable-bounces@dpdk.org Sender: "stable" Hi, The rebasing is done and you can see the result in the mail you replied to. The new 19.11 branch will be pushed by the end of the week. On Tue, 2020-02-11 at 13:48 +0000, Bing Zhao wrote: > Hi Luca, > > Many thanks for your help. > > Yes, this needs to be also applied to the 19.11 stable branch. I want > to rebase it but could not find the branch in > http://git.dpdk.org/dpdk-stable/ > , so would you please share me the > branch information then I can try to finish the rebasing today or > early tomorrow. > > BR. Bing > > > -----Original Message----- > > From: > > luca.boccassi@gmail.com > > < > > luca.boccassi@gmail.com > > > > > Sent: Tuesday, February 11, 2020 7:21 PM > > To: Bing Zhao < > > bingz@mellanox.com > > > > > Cc: Ori Kam < > > orika@mellanox.com > > >; Slava Ovsiienko > > < > > viacheslavo@mellanox.com > > >; dpdk stable < > > stable@dpdk.org > > > > > Subject: patch 'net/mlx5: fix modify actions support limitation' > > has > > been queued to stable release 19.11.1 > > > > Hi, > > > > FYI, your patch has been queued to stable release 19.11.1 > > > > Note it hasn't been pushed to > > https://eur03.safelinks.protection.outlook.com/?url=http%3A%2F%2F > > > > dpdk.org%2Fbrowse%2Fdpdk- > > stable&data=02%7C01%7Cbingz%40mellanox.com%7Cf31d20ac8c > > 4e427386a108d7aee5e8c2%7Ca652971c7d2e4d9ba6a4d149256f461b% > > 7C0%7C0%7C637170174781961835&sdata=no%2BG5nKNzaYL72n > > 3vf5v0ZmfmJLRLNcPfwqgf4YJNU0%3D&reserved=0 yet. > > It will be pushed if I get no objections before 02/13/20. So please > > shout > > if anyone has objections. > > > > Also note that after the patch there's a diff of the upstream > > commit vs > > the patch applied to the branch. This will indicate if there was > > any > > rebasing needed to apply to the stable branch. If there were code > > changes for rebasing > > (ie: not only metadata diffs), please double check that the rebase > > was > > correctly done. > > > > Thanks. > > > > Luca Boccassi > > > > --- > > From e0de816f945e599a933081c53bb060d5dd4cbf13 Mon Sep 17 > > 00:00:00 2001 > > From: Bing Zhao < > > bingz@mellanox.com > > > > > Date: Mon, 20 Jan 2020 11:43:07 +0200 > > Subject: [PATCH] net/mlx5: fix modify actions support limitation > > > > [ upstream commit 024e95759c16c67eee92efffeee34915dc94a9c0 ] > > > > In the root table, there is some limitation of total number of > > header > > modify actions, 16 or 8 for each. But in other tables, there is no > > such > > strict limitation. In an IPv6 case, the IP fields modifying will > > occupy > > more actions than that in IPv4, so the total support number should > > be > > increased in order to support as many actions as possible for an > > IPv6 + > > TCP packet. > > And in the meanwhile, the memory consumption should also be taken > > into consideration because sometimes only several actions are > > needed. > > The root table checking could also be done in low layer driver and > > the > > error code will be returned if the actions number is over the > > maximal > > supported value. > > > > Fixes: 0e9d00027686 ("net/mlx5: check maximum modify actions > > number") > > > > Signed-off-by: Bing Zhao < > > bingz@mellanox.com > > > > > Acked-by: Ori Kam < > > orika@mellanox.com > > > > > Acked-by: Viacheslav Ovsiienko < > > viacheslavo@mellanox.com > > > > > --- > > drivers/net/mlx5/mlx5_flow.h | 15 +++-- > > drivers/net/mlx5/mlx5_flow_dv.c | 104 +++++++++++++++++----------- > > -- > > -- > > 2 files changed, 66 insertions(+), 53 deletions(-) > > > > diff --git a/drivers/net/mlx5/mlx5_flow.h > > b/drivers/net/mlx5/mlx5_flow.h index db12715ecc..13bed08d75 > > 100644 > > --- a/drivers/net/mlx5/mlx5_flow.h > > +++ b/drivers/net/mlx5/mlx5_flow.h > > @@ -391,11 +391,14 @@ struct mlx5_flow_dv_tag_resource { > > > > /* > > * Number of modification commands. > > - * If extensive metadata registers are supported > > - * the maximal actions amount is 16 and 8 otherwise. > > + * If extensive metadata registers are supported, the maximal > > actions > > + amount is > > + * 16 and 8 otherwise on root table. The validation could also be > > done > > + in the > > + * lower driver layer. > > + * On non-root table, there is no limitation, but 32 is enough > > right > > now. > > */ > > -#define MLX5_MODIFY_NUM 16 > > -#define MLX5_MODIFY_NUM_NO_MREG 8 > > +#define MLX5_MAX_MODIFY_NUM 32 > > +#define MLX5_ROOT_TBL_MODIFY_NUM 16 > > +#define MLX5_ROOT_TBL_MODIFY_NUM_NO_MREG 8 > > > > /* Modify resource structure */ > > struct mlx5_flow_dv_modify_hdr_resource { @@ -406,9 +409,9 @@ > > struct mlx5_flow_dv_modify_hdr_resource { > > /**< Verbs modify header action object. */ > > uint8_t ft_type; /**< Flow table type, Rx or Tx. */ > > uint32_t actions_num; /**< Number of modification actions. > > */ > > - struct mlx5_modification_cmd actions[MLX5_MODIFY_NUM]; > > + uint64_t flags; /**< Flags for RDMA API. */ > > + struct mlx5_modification_cmd actions[]; > > /**< Modification actions. */ > > - uint64_t flags; /**< Flags for RDMA API. */ > > }; > > > > /* Jump action resource structure. */ > > diff --git a/drivers/net/mlx5/mlx5_flow_dv.c > > b/drivers/net/mlx5/mlx5_flow_dv.c index 8f77909419..74d1a68e4a > > 100644 > > --- a/drivers/net/mlx5/mlx5_flow_dv.c > > +++ b/drivers/net/mlx5/mlx5_flow_dv.c > > @@ -363,7 +363,7 @@ flow_dv_convert_modify_action(struct > > rte_flow_item *item, > > uint32_t mask; > > uint32_t data; > > > > - if (i >= MLX5_MODIFY_NUM) > > + if (i >= MLX5_MAX_MODIFY_NUM) > > return rte_flow_error_set(error, EINVAL, > > RTE_FLOW_ERROR_TYPE_ACTION, > > NULL, > > "too many items to modify"); > > @@ -404,11 +404,11 @@ flow_dv_convert_modify_action(struct > > rte_flow_item *item, > > ++i; > > ++field; > > } while (field->size); > > - resource->actions_num = i; > > - if (!resource->actions_num) > > + if (resource->actions_num == i) > > return rte_flow_error_set(error, EINVAL, > > > > RTE_FLOW_ERROR_TYPE_ACTION, NULL, > > "invalid modification flow > > item"); > > + resource->actions_num = i; > > return 0; > > } > > > > @@ -569,7 +569,7 @@ flow_dv_convert_action_modify_vlan_vid > > struct mlx5_modification_cmd *actions = &resource->actions[i]; > > struct field_modify_info *field = modify_vlan_out_first_vid; > > > > - if (i >= MLX5_MODIFY_NUM) > > + if (i >= MLX5_MAX_MODIFY_NUM) > > return rte_flow_error_set(error, EINVAL, > > RTE_FLOW_ERROR_TYPE_ACTION, NULL, > > "too many items to modify"); > > @@ -902,7 +902,7 @@ flow_dv_convert_action_set_reg > > struct mlx5_modification_cmd *actions = resource->actions; > > uint32_t i = resource->actions_num; > > > > - if (i >= MLX5_MODIFY_NUM) > > + if (i >= MLX5_MAX_MODIFY_NUM) > > return rte_flow_error_set(error, EINVAL, > > > > RTE_FLOW_ERROR_TYPE_ACTION, NULL, > > "too many items to modify"); > > @@ -914,10 +914,6 @@ flow_dv_convert_action_set_reg > > actions[i].data1 = rte_cpu_to_be_32(conf->data); > > ++i; > > resource->actions_num = i; > > - if (!resource->actions_num) > > - return rte_flow_error_set(error, EINVAL, > > - > > RTE_FLOW_ERROR_TYPE_ACTION, NULL, > > - "invalid modification flow > > item"); > > return 0; > > } > > > > @@ -2256,7 +2252,6 @@ flow_dv_encap_decap_resource_register > > domain = sh->rx_domain; > > else > > domain = sh->tx_domain; > > - > > /* Lookup a matching resource from cache. */ > > LIST_FOREACH(cache_resource, &sh->encaps_decaps, next) { > > if (resource->reformat_type == cache_resource- > > > reformat_type && @@ -3367,21 +3362,27 @@ > > > > flow_dv_validate_action_port_id(struct rte_eth_dev *dev, > > * > > * @param dev > > * Pointer to rte_eth_dev structure. > > + * @param flags > > + * Flags bits to check if root level. > > * > > * @return > > * Max number of modify header actions device can support. > > */ > > static unsigned int > > -flow_dv_modify_hdr_action_max(struct rte_eth_dev *dev) > > +flow_dv_modify_hdr_action_max(struct rte_eth_dev *dev, uint64_t > > flags) > > { > > /* > > * There's no way to directly query the max cap. Although it > > has to be > > * acquried by iterative trial, it is a safe assumption that > > more > > * actions are supported by FW if extensive metadata register > > is > > - * supported. > > + * supported. (Only in the root table) > > */ > > - return mlx5_flow_ext_mreg_supported(dev) ? > > MLX5_MODIFY_NUM : > > - > > MLX5_MODIFY_NUM_NO_MREG; > > + if (!(flags & MLX5DV_DR_ACTION_FLAGS_ROOT_LEVEL)) > > + return MLX5_MAX_MODIFY_NUM; > > + else > > + return mlx5_flow_ext_mreg_supported(dev) ? > > + > > MLX5_ROOT_TBL_MODIFY_NUM : > > + > > MLX5_ROOT_TBL_MODIFY_NUM_NO_MREG; > > } > > > > /** > > @@ -3472,8 +3473,12 @@ flow_dv_modify_hdr_resource_register > > struct mlx5_ibv_shared *sh = priv->sh; > > struct mlx5_flow_dv_modify_hdr_resource *cache_resource; > > struct mlx5dv_dr_domain *ns; > > + uint32_t actions_len; > > > > - if (resource->actions_num > > > flow_dv_modify_hdr_action_max(dev)) > > + resource->flags = > > + dev_flow->group ? 0 : > > MLX5DV_DR_ACTION_FLAGS_ROOT_LEVEL; > > + if (resource->actions_num > > > flow_dv_modify_hdr_action_max(dev, > > + resource->flags)) > > return rte_flow_error_set(error, EOVERFLOW, > > > > RTE_FLOW_ERROR_TYPE_ACTION, NULL, > > "too many modify header > > items"); @@ -3483,17 +3488,15 @@ > > flow_dv_modify_hdr_resource_register > > ns = sh->tx_domain; > > else > > ns = sh->rx_domain; > > - resource->flags = > > - dev_flow->group ? 0 : > > MLX5DV_DR_ACTION_FLAGS_ROOT_LEVEL; > > /* Lookup a matching resource from cache. */ > > + actions_len = resource->actions_num * sizeof(resource- > > > actions[0]); > > > > LIST_FOREACH(cache_resource, &sh->modify_cmds, next) { > > if (resource->ft_type == cache_resource->ft_type && > > resource->actions_num == cache_resource- > > > actions_num && > > > > resource->flags == cache_resource->flags && > > !memcmp((const void *)resource->actions, > > (const void *)cache_resource->actions, > > - (resource->actions_num * > > - sizeof(resource- > > > actions[0])))) { > > > > + actions_len)) { > > DRV_LOG(DEBUG, "modify-header > > resource %p: refcnt %d++", > > (void *)cache_resource, > > rte_atomic32_read(&cache_resource- > > > refcnt)); > > > > @@ -3503,18 +3506,18 @@ flow_dv_modify_hdr_resource_register > > } > > } > > /* Register new modify-header resource. */ > > - cache_resource = rte_calloc(__func__, 1, > > sizeof(*cache_resource), 0); > > + cache_resource = rte_calloc(__func__, 1, > > + sizeof(*cache_resource) + > > actions_len, 0); > > if (!cache_resource) > > return rte_flow_error_set(error, ENOMEM, > > > > RTE_FLOW_ERROR_TYPE_UNSPECIFIED, NULL, > > "cannot allocate resource > > memory"); > > *cache_resource = *resource; > > + rte_memcpy(cache_resource->actions, resource->actions, > > actions_len); > > cache_resource->verbs_action = > > mlx5_glue->dv_create_flow_action_modify_header > > - (sh->ctx, cache_resource- > > > ft_type, > > > > - ns, cache_resource->flags, > > - cache_resource->actions_num > > * > > - sizeof(cache_resource- > > > actions[0]), > > > > + (sh->ctx, cache_resource- > > > ft_type, ns, > > > > + cache_resource->flags, > > actions_len, > > (uint64_t *)cache_resource- > > > actions); > > > > if (!cache_resource->verbs_action) { > > rte_free(cache_resource); > > @@ -6670,10 +6673,13 @@ __flow_dv_translate(struct rte_eth_dev > > *dev, > > }; > > int actions_n = 0; > > bool actions_end = false; > > - struct mlx5_flow_dv_modify_hdr_resource mhdr_res = { > > - .ft_type = attr->egress ? > > MLX5DV_FLOW_TABLE_TYPE_NIC_TX : > > - > > MLX5DV_FLOW_TABLE_TYPE_NIC_RX > > - }; > > + union { > > + struct mlx5_flow_dv_modify_hdr_resource res; > > + uint8_t len[sizeof(struct > > mlx5_flow_dv_modify_hdr_resource) + > > + sizeof(struct mlx5_modification_cmd) * > > + (MLX5_MAX_MODIFY_NUM + 1)]; > > + } mhdr_dummy; > > + struct mlx5_flow_dv_modify_hdr_resource *mhdr_res = > > &mhdr_dummy.res; > > union flow_dv_attr flow_attr = { .attr = 0 }; > > uint32_t tag_be; > > union mlx5_flow_tbl_key tbl_key; > > @@ -6685,15 +6691,19 @@ __flow_dv_translate(struct rte_eth_dev > > *dev, > > uint32_t table; > > int ret = 0; > > > > + mhdr_res->ft_type = attr->egress ? > > MLX5DV_FLOW_TABLE_TYPE_NIC_TX : > > + > > MLX5DV_FLOW_TABLE_TYPE_NIC_RX; > > ret = mlx5_flow_group_to_table(attr, dev_flow->external, attr- > > > group, > > > > &table, error); > > if (ret) > > return ret; > > dev_flow->group = table; > > if (attr->transfer) > > - mhdr_res.ft_type = MLX5DV_FLOW_TABLE_TYPE_FDB; > > + mhdr_res->ft_type = MLX5DV_FLOW_TABLE_TYPE_FDB; > > if (priority == MLX5_FLOW_PRIO_RSVD) > > priority = dev_conf->flow_prio - 1; > > + /* number of actions must be set to 0 in case of dirty stack. > > */ > > + mhdr_res->actions_num = 0; > > for (; !actions_end ; actions++) { > > const struct rte_flow_action_queue *queue; > > const struct rte_flow_action_rss *rss; @@ -6731,7 > > +6741,7 @@ __flow_dv_translate(struct rte_eth_dev *dev, > > }; > > > > if (flow_dv_convert_action_mark(dev, > > &mark, > > - > > &mhdr_res, > > + > > mhdr_res, > > error)) > > return -rte_errno; > > action_flags |= > > MLX5_FLOW_ACTION_MARK_EXT; @@ -6753,7 +6763,7 @@ > > __flow_dv_translate(struct rte_eth_dev *dev, > > actions->conf; > > > > if (flow_dv_convert_action_mark(dev, > > mark, > > - > > &mhdr_res, > > + > > mhdr_res, > > error)) > > return -rte_errno; > > action_flags |= > > MLX5_FLOW_ACTION_MARK_EXT; @@ -6774,7 +6784,7 @@ > > __flow_dv_translate(struct rte_eth_dev *dev, > > break; > > case RTE_FLOW_ACTION_TYPE_SET_META: > > if (flow_dv_convert_action_set_meta > > - (dev, &mhdr_res, attr, > > + (dev, mhdr_res, attr, > > (const struct > > rte_flow_action_set_meta *) > > actions->conf, error)) > > return -rte_errno; > > @@ -6782,7 +6792,7 @@ __flow_dv_translate(struct rte_eth_dev > > *dev, > > break; > > case RTE_FLOW_ACTION_TYPE_SET_TAG: > > if (flow_dv_convert_action_set_tag > > - (dev, &mhdr_res, > > + (dev, mhdr_res, > > (const struct rte_flow_action_set_tag > > *) > > actions->conf, error)) > > return -rte_errno; > > @@ -6882,7 +6892,7 @@ cnt_err: > > mlx5_update_vlan_vid_pcp(actions, &vlan); > > /* If no VLAN push - this is a modify header > > action */ > > if (flow_dv_convert_action_modify_vlan_vid > > - (&mhdr_res, actions, > > error)) > > + (mhdr_res, actions, > > error)) > > return -rte_errno; > > action_flags |= > > MLX5_FLOW_ACTION_OF_SET_VLAN_VID; > > break; > > @@ -6981,7 +6991,7 @@ cnt_err: > > case RTE_FLOW_ACTION_TYPE_SET_MAC_SRC: > > case RTE_FLOW_ACTION_TYPE_SET_MAC_DST: > > if (flow_dv_convert_action_modify_mac > > - (&mhdr_res, actions, error)) > > + (mhdr_res, actions, error)) > > return -rte_errno; > > action_flags |= actions->type == > > > > RTE_FLOW_ACTION_TYPE_SET_MAC_SRC ? > > @@ -6991,7 +7001,7 @@ cnt_err: > > case RTE_FLOW_ACTION_TYPE_SET_IPV4_SRC: > > case RTE_FLOW_ACTION_TYPE_SET_IPV4_DST: > > if (flow_dv_convert_action_modify_ipv4 > > - (&mhdr_res, actions, error)) > > + (mhdr_res, actions, error)) > > return -rte_errno; > > action_flags |= actions->type == > > > > RTE_FLOW_ACTION_TYPE_SET_IPV4_SRC ? > > @@ -7001,7 +7011,7 @@ cnt_err: > > case RTE_FLOW_ACTION_TYPE_SET_IPV6_SRC: > > case RTE_FLOW_ACTION_TYPE_SET_IPV6_DST: > > if (flow_dv_convert_action_modify_ipv6 > > - (&mhdr_res, actions, error)) > > + (mhdr_res, actions, error)) > > return -rte_errno; > > action_flags |= actions->type == > > > > RTE_FLOW_ACTION_TYPE_SET_IPV6_SRC ? > > @@ -7011,7 +7021,7 @@ cnt_err: > > case RTE_FLOW_ACTION_TYPE_SET_TP_SRC: > > case RTE_FLOW_ACTION_TYPE_SET_TP_DST: > > if (flow_dv_convert_action_modify_tp > > - (&mhdr_res, actions, items, > > + (mhdr_res, actions, items, > > &flow_attr, error)) > > return -rte_errno; > > action_flags |= actions->type == > > @@ -7021,13 +7031,13 @@ cnt_err: > > break; > > case RTE_FLOW_ACTION_TYPE_DEC_TTL: > > if (flow_dv_convert_action_modify_dec_ttl > > - (&mhdr_res, items, &flow_attr, > > error)) > > + (mhdr_res, items, &flow_attr, > > error)) > > return -rte_errno; > > action_flags |= MLX5_FLOW_ACTION_DEC_TTL; > > break; > > case RTE_FLOW_ACTION_TYPE_SET_TTL: > > if (flow_dv_convert_action_modify_ttl > > - (&mhdr_res, actions, items, > > + (mhdr_res, actions, items, > > &flow_attr, error)) > > return -rte_errno; > > action_flags |= MLX5_FLOW_ACTION_SET_TTL; > > @@ -7035,7 +7045,7 @@ cnt_err: > > case RTE_FLOW_ACTION_TYPE_INC_TCP_SEQ: > > case RTE_FLOW_ACTION_TYPE_DEC_TCP_SEQ: > > if (flow_dv_convert_action_modify_tcp_seq > > - (&mhdr_res, actions, error)) > > + (mhdr_res, actions, error)) > > return -rte_errno; > > action_flags |= actions->type == > > > > RTE_FLOW_ACTION_TYPE_INC_TCP_SEQ ? > > @@ -7046,7 +7056,7 @@ cnt_err: > > case RTE_FLOW_ACTION_TYPE_INC_TCP_ACK: > > case RTE_FLOW_ACTION_TYPE_DEC_TCP_ACK: > > if (flow_dv_convert_action_modify_tcp_ack > > - (&mhdr_res, actions, error)) > > + (mhdr_res, actions, error)) > > return -rte_errno; > > action_flags |= actions->type == > > > > RTE_FLOW_ACTION_TYPE_INC_TCP_ACK ? > > @@ -7055,13 +7065,13 @@ cnt_err: > > break; > > case MLX5_RTE_FLOW_ACTION_TYPE_TAG: > > if (flow_dv_convert_action_set_reg > > - (&mhdr_res, actions, error)) > > + (mhdr_res, actions, error)) > > return -rte_errno; > > action_flags |= MLX5_FLOW_ACTION_SET_TAG; > > break; > > case MLX5_RTE_FLOW_ACTION_TYPE_COPY_MREG: > > if (flow_dv_convert_action_copy_mreg > > - (dev, &mhdr_res, actions, > > error)) > > + (dev, mhdr_res, actions, > > error)) > > return -rte_errno; > > action_flags |= MLX5_FLOW_ACTION_SET_TAG; > > break; > > @@ -7086,10 +7096,10 @@ cnt_err: > > break; > > case RTE_FLOW_ACTION_TYPE_END: > > actions_end = true; > > - if (mhdr_res.actions_num) { > > + if (mhdr_res->actions_num) { > > /* create modify action if needed. */ > > if > > (flow_dv_modify_hdr_resource_register > > - (dev, &mhdr_res, dev_flow, > > error)) > > + (dev, mhdr_res, dev_flow, > > error)) > > return -rte_errno; > > dev_flow- > > > dv.actions[modify_action_position] = > > > > dev_flow->dv.modify_hdr- > > > verbs_action; > > > > @@ -7098,7 +7108,7 @@ cnt_err: > > default: > > break; > > } > > - if (mhdr_res.actions_num && > > + if (mhdr_res->actions_num && > > modify_action_position == UINT32_MAX) > > modify_action_position = actions_n++; > > } > > -- > > 2.20.1 > > > > --- > > Diff of the applied patch vs upstream commit (please double-check > > if > > non-empty: > > --- > > --- - 2020-02-11 11:17:42.994804790 +0000 > > +++ 0122-net-mlx5-fix-modify-actions-support-limitation.patch > > 2020- > > 02-11 11:17:38.612005311 +0000 > > @@ -1,8 +1,10 @@ > > -From 024e95759c16c67eee92efffeee34915dc94a9c0 Mon Sep 17 > > 00:00:00 2001 > > +From e0de816f945e599a933081c53bb060d5dd4cbf13 Mon Sep 17 > > 00:00:00 2001 > > From: Bing Zhao < > > bingz@mellanox.com > > > > > Date: Mon, 20 Jan 2020 11:43:07 +0200 > > Subject: [PATCH] net/mlx5: fix modify actions support limitation > > > > +[ upstream commit 024e95759c16c67eee92efffeee34915dc94a9c0 ] > > + > > In the root table, there is some limitation of total number of > > header > > modify actions, 16 or 8 for each. But in other tables, there is > > no such > > strict limitation. In an IPv6 case, the IP fields modifying @@ > > -16,21 > > +18,20 @@ maximal supported value. > > > > Fixes: 0e9d00027686 ("net/mlx5: check maximum modify actions > > number") > > -Cc: > > stable@dpdk.org > > > > > > Signed-off-by: Bing Zhao < > > bingz@mellanox.com > > > > > Acked-by: Ori Kam < > > orika@mellanox.com > > > > > Acked-by: Viacheslav Ovsiienko < > > viacheslavo@mellanox.com > > > > > --- > > drivers/net/mlx5/mlx5_flow.h | 15 +++-- > > - drivers/net/mlx5/mlx5_flow_dv.c | 108 +++++++++++++++++-------- > > ---- > > --- > > - 2 files changed, 68 insertions(+), 55 deletions(-) > > + drivers/net/mlx5/mlx5_flow_dv.c | 104 +++++++++++++++++-------- > > --- > > ---- > > + 2 files changed, 66 insertions(+), 53 deletions(-) > > > > diff --git a/drivers/net/mlx5/mlx5_flow.h > > b/drivers/net/mlx5/mlx5_flow.h -index a1c7b67488..9832542328 > > 100644 > > +index db12715ecc..13bed08d75 100644 > > --- a/drivers/net/mlx5/mlx5_flow.h > > +++ b/drivers/net/mlx5/mlx5_flow.h > > -@@ -392,11 +392,14 @@ struct mlx5_flow_dv_tag_resource { > > +@@ -391,11 +391,14 @@ struct mlx5_flow_dv_tag_resource { > > > > /* > > * Number of modification commands. > > @@ -49,7 +50,7 @@ > > > > /* Modify resource structure */ > > struct mlx5_flow_dv_modify_hdr_resource { -@@ -407,9 +410,9 @@ > > struct mlx5_flow_dv_modify_hdr_resource { > > +@@ -406,9 +409,9 @@ struct mlx5_flow_dv_modify_hdr_resource { > > /**< Verbs modify header action object. */ > > uint8_t ft_type; /**< Flow table type, Rx or Tx. */ > > uint32_t actions_num; /**< Number of modification actions. > > */ @@ -62,10 +63,10 @@ > > > > /* Jump action resource structure. */ > > diff --git a/drivers/net/mlx5/mlx5_flow_dv.c > > b/drivers/net/mlx5/mlx5_flow_dv.c -index 26dbaaf329..5a1b42698c > > 100644 > > +index 8f77909419..74d1a68e4a 100644 > > --- a/drivers/net/mlx5/mlx5_flow_dv.c > > +++ b/drivers/net/mlx5/mlx5_flow_dv.c > > -@@ -366,7 +366,7 @@ flow_dv_convert_modify_action(struct > > rte_flow_item *item, > > +@@ -363,7 +363,7 @@ flow_dv_convert_modify_action(struct > > rte_flow_item > > +*item, > > uint32_t mask; > > uint32_t data; > > > > @@ -74,7 +75,7 @@ > > return rte_flow_error_set(error, EINVAL, > > RTE_FLOW_ERROR_TYPE_ACTION, > > NULL, > > "too many items to modify"); > > -@@ -407,11 +407,11 @@ flow_dv_convert_modify_action(struct > > rte_flow_item *item, > > +@@ -404,11 +404,11 @@ flow_dv_convert_modify_action(struct > > +rte_flow_item *item, > > ++i; > > ++field; > > } while (field->size); > > @@ -88,7 +89,7 @@ > > return 0; > > } > > > > -@@ -572,7 +572,7 @@ flow_dv_convert_action_modify_vlan_vid > > +@@ -569,7 +569,7 @@ flow_dv_convert_action_modify_vlan_vid > > struct mlx5_modification_cmd *actions = &resource->actions[i]; > > struct field_modify_info *field = modify_vlan_out_first_vid; > > > > @@ -97,7 +98,7 @@ > > return rte_flow_error_set(error, EINVAL, > > RTE_FLOW_ERROR_TYPE_ACTION, NULL, > > "too many items to modify"); > > -@@ -905,7 +905,7 @@ flow_dv_convert_action_set_reg > > +@@ -902,7 +902,7 @@ flow_dv_convert_action_set_reg > > struct mlx5_modification_cmd *actions = resource->actions; > > uint32_t i = resource->actions_num; > > > > @@ -106,7 +107,7 @@ > > return rte_flow_error_set(error, EINVAL, > > > > RTE_FLOW_ERROR_TYPE_ACTION, NULL, > > "too many items to modify"); > > -@@ -917,10 +917,6 @@ flow_dv_convert_action_set_reg > > +@@ -914,10 +914,6 @@ flow_dv_convert_action_set_reg > > actions[i].data1 = rte_cpu_to_be_32(conf->data); > > ++i; > > resource->actions_num = i; > > @@ -117,7 +118,7 @@ > > return 0; > > } > > > > -@@ -2385,7 +2381,6 @@ flow_dv_encap_decap_resource_register > > +@@ -2256,7 +2252,6 @@ flow_dv_encap_decap_resource_register > > domain = sh->rx_domain; > > else > > domain = sh->tx_domain; > > @@ -125,7 +126,7 @@ > > /* Lookup a matching resource from cache. */ > > LIST_FOREACH(cache_resource, &sh->encaps_decaps, next) { > > if (resource->reformat_type == cache_resource- > > > reformat_type && -@@ -3496,21 +3491,27 @@ > > > > flow_dv_validate_action_port_id(struct rte_eth_dev *dev, > > +@@ -3367,21 +3362,27 @@ flow_dv_validate_action_port_id(struct > > +rte_eth_dev *dev, > > * > > * @param dev > > * Pointer to rte_eth_dev structure. > > @@ -157,7 +158,7 @@ > > } > > > > /** > > -@@ -3669,8 +3670,12 @@ flow_dv_modify_hdr_resource_register > > +@@ -3472,8 +3473,12 @@ flow_dv_modify_hdr_resource_register > > struct mlx5_ibv_shared *sh = priv->sh; > > struct mlx5_flow_dv_modify_hdr_resource *cache_resource; > > struct mlx5dv_dr_domain *ns; > > @@ -171,7 +172,7 @@ > > return rte_flow_error_set(error, EOVERFLOW, > > > > RTE_FLOW_ERROR_TYPE_ACTION, NULL, > > "too many modify header > > items"); -@@ -3680,17 +3685,15 @@ > > flow_dv_modify_hdr_resource_register > > +@@ -3483,17 +3488,15 @@ flow_dv_modify_hdr_resource_register > > ns = sh->tx_domain; > > else > > ns = sh->rx_domain; > > @@ -191,7 +192,7 @@ > > DRV_LOG(DEBUG, "modify-header > > resource %p: refcnt %d++", > > (void *)cache_resource, > > rte_atomic32_read(&cache_resource- > > > refcnt)); > > > > -@@ -3700,18 +3703,18 @@ flow_dv_modify_hdr_resource_register > > +@@ -3503,18 +3506,18 @@ flow_dv_modify_hdr_resource_register > > } > > } > > /* Register new modify-header resource. */ @@ -215,7 +216,7 > > @@ > > (uint64_t *)cache_resource- > > > actions); > > > > if (!cache_resource->verbs_action) { > > rte_free(cache_resource); > > -@@ -7020,10 +7023,13 @@ __flow_dv_translate(struct rte_eth_dev > > *dev, > > +@@ -6670,10 +6673,13 @@ __flow_dv_translate(struct rte_eth_dev > > *dev, > > }; > > int actions_n = 0; > > bool actions_end = false; > > @@ -233,7 +234,7 @@ > > union flow_dv_attr flow_attr = { .attr = 0 }; > > uint32_t tag_be; > > union mlx5_flow_tbl_key tbl_key; > > -@@ -7035,15 +7041,19 @@ __flow_dv_translate(struct rte_eth_dev > > *dev, > > +@@ -6685,15 +6691,19 @@ __flow_dv_translate(struct rte_eth_dev > > *dev, > > uint32_t table; > > int ret = 0; > > > > @@ -254,7 +255,7 @@ > > for (; !actions_end ; actions++) { > > const struct rte_flow_action_queue *queue; > > const struct rte_flow_action_rss *rss; -@@ -7081,7 > > +7091,7 @@ __flow_dv_translate(struct rte_eth_dev *dev, > > +@@ -6731,7 +6741,7 @@ __flow_dv_translate(struct rte_eth_dev > > *dev, > > }; > > > > if (flow_dv_convert_action_mark(dev, > > &mark, @@ -263,7 +264,7 @@ > > error)) > > return -rte_errno; > > action_flags |= > > MLX5_FLOW_ACTION_MARK_EXT; -@@ -7103,7 +7113,7 @@ > > __flow_dv_translate(struct rte_eth_dev *dev, > > +@@ -6753,7 +6763,7 @@ __flow_dv_translate(struct rte_eth_dev > > *dev, > > actions->conf; > > > > if (flow_dv_convert_action_mark(dev, > > mark, @@ -272,7 +273,7 @@ > > error)) > > return -rte_errno; > > action_flags |= > > MLX5_FLOW_ACTION_MARK_EXT; -@@ -7124,7 +7134,7 @@ > > __flow_dv_translate(struct rte_eth_dev *dev, > > +@@ -6774,7 +6784,7 @@ __flow_dv_translate(struct rte_eth_dev > > *dev, > > break; > > case RTE_FLOW_ACTION_TYPE_SET_META: > > if (flow_dv_convert_action_set_meta @@ - > > 281,7 +282,7 @@ > > (const struct > > rte_flow_action_set_meta *) > > actions->conf, error)) > > return -rte_errno; > > -@@ -7132,7 +7142,7 @@ __flow_dv_translate(struct rte_eth_dev > > *dev, > > +@@ -6782,7 +6792,7 @@ __flow_dv_translate(struct rte_eth_dev > > *dev, > > break; > > case RTE_FLOW_ACTION_TYPE_SET_TAG: > > if (flow_dv_convert_action_set_tag > > @@ -290,7 +291,7 @@ > > (const struct rte_flow_action_set_tag > > *) > > actions->conf, error)) > > return -rte_errno; > > -@@ -7232,7 +7242,7 @@ cnt_err: > > +@@ -6882,7 +6892,7 @@ cnt_err: > > mlx5_update_vlan_vid_pcp(actions, &vlan); > > /* If no VLAN push - this is a modify header > > action */ > > if (flow_dv_convert_action_modify_vlan_vid > > @@ -299,7 +300,7 @@ > > return -rte_errno; > > action_flags |= > > MLX5_FLOW_ACTION_OF_SET_VLAN_VID; > > break; > > -@@ -7331,7 +7341,7 @@ cnt_err: > > +@@ -6981,7 +6991,7 @@ cnt_err: > > case RTE_FLOW_ACTION_TYPE_SET_MAC_SRC: > > case RTE_FLOW_ACTION_TYPE_SET_MAC_DST: > > if (flow_dv_convert_action_modify_mac > > @@ -308,7 +309,7 @@ > > return -rte_errno; > > action_flags |= actions->type == > > > > RTE_FLOW_ACTION_TYPE_SET_MAC_SRC ? > > -@@ -7341,7 +7351,7 @@ cnt_err: > > +@@ -6991,7 +7001,7 @@ cnt_err: > > case RTE_FLOW_ACTION_TYPE_SET_IPV4_SRC: > > case RTE_FLOW_ACTION_TYPE_SET_IPV4_DST: > > if (flow_dv_convert_action_modify_ipv4 > > @@ -317,7 +318,7 @@ > > return -rte_errno; > > action_flags |= actions->type == > > > > RTE_FLOW_ACTION_TYPE_SET_IPV4_SRC ? > > -@@ -7351,7 +7361,7 @@ cnt_err: > > +@@ -7001,7 +7011,7 @@ cnt_err: > > case RTE_FLOW_ACTION_TYPE_SET_IPV6_SRC: > > case RTE_FLOW_ACTION_TYPE_SET_IPV6_DST: > > if (flow_dv_convert_action_modify_ipv6 > > @@ -326,7 +327,7 @@ > > return -rte_errno; > > action_flags |= actions->type == > > > > RTE_FLOW_ACTION_TYPE_SET_IPV6_SRC ? > > -@@ -7361,7 +7371,7 @@ cnt_err: > > +@@ -7011,7 +7021,7 @@ cnt_err: > > case RTE_FLOW_ACTION_TYPE_SET_TP_SRC: > > case RTE_FLOW_ACTION_TYPE_SET_TP_DST: > > if (flow_dv_convert_action_modify_tp @@ - > > 335,7 +336,7 @@ > > &flow_attr, error)) > > return -rte_errno; > > action_flags |= actions->type == > > -@@ -7371,13 +7381,13 @@ cnt_err: > > +@@ -7021,13 +7031,13 @@ cnt_err: > > break; > > case RTE_FLOW_ACTION_TYPE_DEC_TTL: > > if (flow_dv_convert_action_modify_dec_ttl > > @@ -351,7 +352,7 @@ > > &flow_attr, error)) > > return -rte_errno; > > action_flags |= MLX5_FLOW_ACTION_SET_TTL; > > -@@ -7385,7 +7395,7 @@ cnt_err: > > +@@ -7035,7 +7045,7 @@ cnt_err: > > case RTE_FLOW_ACTION_TYPE_INC_TCP_SEQ: > > case RTE_FLOW_ACTION_TYPE_DEC_TCP_SEQ: > > if (flow_dv_convert_action_modify_tcp_seq > > @@ -360,7 +361,7 @@ > > return -rte_errno; > > action_flags |= actions->type == > > > > RTE_FLOW_ACTION_TYPE_INC_TCP_SEQ ? > > -@@ -7396,7 +7406,7 @@ cnt_err: > > +@@ -7046,7 +7056,7 @@ cnt_err: > > case RTE_FLOW_ACTION_TYPE_INC_TCP_ACK: > > case RTE_FLOW_ACTION_TYPE_DEC_TCP_ACK: > > if (flow_dv_convert_action_modify_tcp_ack > > @@ -369,7 +370,7 @@ > > return -rte_errno; > > action_flags |= actions->type == > > > > RTE_FLOW_ACTION_TYPE_INC_TCP_ACK ? > > -@@ -7405,13 +7415,13 @@ cnt_err: > > +@@ -7055,13 +7065,13 @@ cnt_err: > > break; > > case MLX5_RTE_FLOW_ACTION_TYPE_TAG: > > if (flow_dv_convert_action_set_reg > > @@ -385,22 +386,7 @@ > > return -rte_errno; > > action_flags |= MLX5_FLOW_ACTION_SET_TAG; > > break; > > -@@ -7435,23 +7445,23 @@ cnt_err: > > - action_flags |= MLX5_FLOW_ACTION_METER; > > - break; > > - case RTE_FLOW_ACTION_TYPE_SET_IPV4_DSCP: > > -- if > > (flow_dv_convert_action_modify_ipv4_dscp(&mhdr_res, > > -+ if > > (flow_dv_convert_action_modify_ipv4_dscp(mhdr_res, > > - actions, > > error)) > > - return -rte_errno; > > - action_flags |= > > MLX5_FLOW_ACTION_SET_IPV4_DSCP; > > - break; > > - case RTE_FLOW_ACTION_TYPE_SET_IPV6_DSCP: > > -- if > > (flow_dv_convert_action_modify_ipv6_dscp(&mhdr_res, > > -+ if > > (flow_dv_convert_action_modify_ipv6_dscp(mhdr_res, > > - actions, > > error)) > > - return -rte_errno; > > - action_flags |= > > MLX5_FLOW_ACTION_SET_IPV6_DSCP; > > +@@ -7086,10 +7096,10 @@ cnt_err: > > break; > > case RTE_FLOW_ACTION_TYPE_END: > > actions_end = true; > > @@ -413,7 +399,7 @@ > > return -rte_errno; > > dev_flow- > > > dv.actions[modify_action_position] = > > > > dev_flow->dv.modify_hdr- > > > verbs_action; > > > > -@@ -7460,7 +7470,7 @@ cnt_err: > > +@@ -7098,7 +7108,7 @@ cnt_err: > > default: > > break; > > } -- Kind regards, Luca Boccassi