On Thu, 8 May 2025 10:17:44 +0200
Morten Brørup <m...@smartsharesystems.com> wrote:

> Wouldn't the correct fix assume the change has no effect if the operation 
> failed, like the _enable_ functions do, i.e.:
> 
> int
> rte_eth_promiscuous_disable(uint16_t port_id)
> {
>       struct rte_eth_dev *dev;
>       int diag = 0;
> 
>       RTE_ETH_VALID_PORTID_OR_ERR_RET(port_id, -ENODEV);
>       dev = &rte_eth_devices[port_id];
> 
>       if (dev->data->promiscuous == 0)
>               return 0;
> 
>       if (dev->dev_ops->promiscuous_disable == NULL)
>               return -ENOTSUP;
> 
> -     dev->data->promiscuous = 0;
>       diag = dev->dev_ops->promiscuous_disable(dev);
> -     if (diag != 0)
> -             dev->data->promiscuous = 1;
> +     if (diag == 0)
> +             dev->data->promiscuous = 0;
>       diag = eth_err(port_id, diag);
> 
>       rte_eth_trace_promiscuous_disable(port_id, dev->data->promiscuous,
>                                         diag);
> 
>       return diag;
> }
> 
> 
> From: Sunyang Wu [mailto:sunyang...@jaguarmicro.com] 
> Sent: Thursday, 8 May 2025 08.27
> 
> Thank you for your reply. Personally, I think that when disabling 
> promiscuous/all-multicast mode, the corresponding flag should be set based on 
> the return value. This is because, at the driver implementation level, the 
> driver may check the flag to determine whether the corresponding disable 
> operation needs to be executed. If the flag is set before the operation is 
> completed, the driver will not execute the operation when it checks the flag, 
> as it will find that the flag has already been set.
> 
> 发件人: Stephen Hemminger <step...@networkplumber.org> 
> 发送时间: 2025年5月8日 13:35
> 收件人: Sunyang Wu <sunyang...@jaguarmicro.com>
> 抄送: dev <dev@dpdk.org>; Thomas Monjalon <tho...@monjalon.net>; Ferruh Yigit 
> <ferruh.yi...@amd.com>; Andrew Rybchenko <andrew.rybche...@oktetlabs.ru>
> 主题: Re: [PATCH] ethdev: optimize how the values of the flag variables are 
> assigned
> 
> 
> External Mail: This email originated from OUTSIDE of the organization! 
> Do not click links, open attachments or provide ANY information unless you 
> recognize the sender and know the content is safe. 
> 
> Why bother? This is not critical path. 
> Original code looked fine 
> 
> On Thu, May 8, 2025, 11:34 Sunyang Wu <sunyang...@jaguarmicro.com> wrote:
> Set the values of the promiscuous and all_multicast variables
> according to the return value.
> 
> Signed-off-by: Sunyang Wu <sunyang...@jaguarmicro.com>
> ---
>  lib/ethdev/rte_ethdev.c | 9 +++------
>  1 file changed, 3 insertions(+), 6 deletions(-)
> 
> diff --git a/lib/ethdev/rte_ethdev.c b/lib/ethdev/rte_ethdev.c
> index d4197322a0..b1f593edc4 100644
> --- a/lib/ethdev/rte_ethdev.c
> +++ b/lib/ethdev/rte_ethdev.c
> @@ -3044,10 +3044,8 @@ rte_eth_promiscuous_disable(uint16_t port_id)
>         if (dev->dev_ops->promiscuous_disable == NULL)
>                 return -ENOTSUP;
> 
> -       dev->data->promiscuous = 0;
>         diag = dev->dev_ops->promiscuous_disable(dev);
> -       if (diag != 0)
> -               dev->data->promiscuous = 1;
> +       dev->data->promiscuous = (diag == 0) ? 0 : 1;
> 
>         diag = eth_err(port_id, diag);
> 
> @@ -3112,10 +3110,9 @@ rte_eth_allmulticast_disable(uint16_t port_id)
> 
>         if (dev->dev_ops->allmulticast_disable == NULL)
>                 return -ENOTSUP;
> -       dev->data->all_multicast = 0;
> +
>         diag = dev->dev_ops->allmulticast_disable(dev);
> -       if (diag != 0)
> -               dev->data->all_multicast = 1;
> +       dev->data->all_multicast = (diag == 0) ? 0 : 1;
> 
>         diag = eth_err(port_id, diag);
> 

Agree.
The concept is good, but it is not an optimization.
There is a bug here. The flag should not be set if driver returns an error.
The error should be directly returned to application and state should not 
change.

Reply via email to