[dpdk-stable] [PATCH 19.11.9 1/3] net/hns3: fix HW buffer size on MTU update

Christian Ehrhardt christian.ehrhardt at canonical.com
Mon May 31 10:41:41 CEST 2021


On Sat, May 22, 2021 at 8:47 AM Min Hu (Connor) <humin29 at huawei.com> wrote:
>
> From: Chengchang Tang <tangchengchang at huawei.com>
>
> [ upstream commit 25fb790f7868f8eee96f7f051a834dec01b8a369 ]

Thank you for the backports, queued patches 1-3 for 19.11.9 now

> After MTU changed, the buffer used to store packets in HW should be
> reallocated. And buffer size is allocated based on the maximum frame
> size in the PF struct. However, the value of maximum frame size  is
> not updated in time when MTU is changed. This would lead to a packet
> loss for not enough buffer.
>
> This patch update the maximum frame size before reallocating the HW
> buffer. And a rollback operation is added to avoid the side effects
> of buffer reallocation failures.
>
> Fixes: 1f5ca0b460cd ("net/hns3: support some device operations")
> Fixes: d51867db65c1 ("net/hns3: add initialization")
> Cc: stable at dpdk.org
>
> Signed-off-by: Chengchang Tang <tangchengchang at huawei.com>
> Signed-off-by: Lijun Ou <oulijun at huawei.com>
> ---
>  drivers/net/hns3/hns3_ethdev.c | 22 ++++++++++++++++++----
>  1 file changed, 18 insertions(+), 4 deletions(-)
>
> diff --git a/drivers/net/hns3/hns3_ethdev.c b/drivers/net/hns3/hns3_ethdev.c
> index 3a799ed..952538d 100644
> --- a/drivers/net/hns3/hns3_ethdev.c
> +++ b/drivers/net/hns3/hns3_ethdev.c
> @@ -2418,21 +2418,35 @@ hns3_set_mac_mtu(struct hns3_hw *hw, uint16_t new_mps)
>  static int
>  hns3_config_mtu(struct hns3_hw *hw, uint16_t mps)
>  {
> +       struct hns3_adapter *hns = HNS3_DEV_HW_TO_ADAPTER(hw);
> +       uint16_t original_mps = hns->pf.mps;
> +       int err;
>         int ret;
>
>         ret = hns3_set_mac_mtu(hw, mps);
>         if (ret) {
> -               hns3_err(hw, "Failed to set mtu, ret = %d", ret);
> +               hns3_err(hw, "failed to set mtu, ret = %d", ret);
>                 return ret;
>         }
>
> +       hns->pf.mps = mps;
>         ret = hns3_buffer_alloc(hw);
>         if (ret) {
> -               hns3_err(hw, "Failed to allocate buffer, ret = %d", ret);
> -               return ret;
> +               hns3_err(hw, "failed to allocate buffer, ret = %d", ret);
> +               goto rollback;
>         }
>
>         return 0;
> +
> +rollback:
> +       err = hns3_set_mac_mtu(hw, original_mps);
> +       if (err) {
> +               hns3_err(hw, "fail to rollback MTU, err = %d", err);
> +               return ret;
> +       }
> +       hns->pf.mps = original_mps;
> +
> +       return ret;
>  }
>
>  static int
> @@ -2465,7 +2479,7 @@ hns3_dev_mtu_set(struct rte_eth_dev *dev, uint16_t mtu)
>                          dev->data->port_id, mtu, ret);
>                 return ret;
>         }
> -       hns->pf.mps = (uint16_t)frame_size;
> +
>         if (is_jumbo_frame)
>                 dev->data->dev_conf.rxmode.offloads |=
>                                                 DEV_RX_OFFLOAD_JUMBO_FRAME;
> --
> 2.7.4
>


-- 
Christian Ehrhardt
Staff Engineer, Ubuntu Server
Canonical Ltd


More information about the stable mailing list