[dpdk-dev] [PATCH v2 04/13] ethdev: change promiscuous callbacks to return status

Andrew Rybchenko arybchenko at solarflare.com
Fri Sep 13 17:54:49 CEST 2019


On 9/13/19 6:34 PM, Ferruh Yigit wrote:
> On 9/9/2019 12:58 PM, Andrew Rybchenko wrote:
>> Enabling/disabling of promiscuous mode is not always successful and
>> it should be taken into account to be able to handle it properly.
>>
>> When correct return status is unclear from driver code, -EAGAIN is used.
>>
>> Signed-off-by: Andrew Rybchenko <arybchenko at solarflare.com>
> <...>
>
>> diff --git a/lib/librte_ethdev/rte_ethdev.c b/lib/librte_ethdev/rte_ethdev.c
>> index b97dd8aa85..f2e6b4c83b 100644
>> --- a/lib/librte_ethdev/rte_ethdev.c
>> +++ b/lib/librte_ethdev/rte_ethdev.c
>> @@ -1892,30 +1892,38 @@ int
>>   rte_eth_promiscuous_enable(uint16_t port_id)
>>   {
>>   	struct rte_eth_dev *dev;
>> +	uint8_t old_promiscuous;
>> +	int diag;
>>   
>>   	RTE_ETH_VALID_PORTID_OR_ERR_RET(port_id, -ENODEV);
>>   	dev = &rte_eth_devices[port_id];
>>   
>>   	RTE_FUNC_PTR_OR_ERR_RET(*dev->dev_ops->promiscuous_enable, -ENOTSUP);
>> -	(*dev->dev_ops->promiscuous_enable)(dev);
>> -	dev->data->promiscuous = 1;
>> +	old_promiscuous = dev->data->promiscuous;
>> +	diag = (*dev->dev_ops->promiscuous_enable)(dev);
>> +	dev->data->promiscuous = (diag == 0) ? 1 : old_promiscuous;
>>   
>> -	return 0;
>> +	return eth_err(port_id, diag);
>>   }
>>   
>>   int
>>   rte_eth_promiscuous_disable(uint16_t port_id)
>>   {
>>   	struct rte_eth_dev *dev;
>> +	uint8_t old_promiscuous;
>> +	int diag;
>>   
>>   	RTE_ETH_VALID_PORTID_OR_ERR_RET(port_id, -ENODEV);
>>   	dev = &rte_eth_devices[port_id];
>>   
>>   	RTE_FUNC_PTR_OR_ERR_RET(*dev->dev_ops->promiscuous_disable, -ENOTSUP);
>> +	old_promiscuous = dev->data->promiscuous;
>>   	dev->data->promiscuous = 0;
>> -	(*dev->dev_ops->promiscuous_disable)(dev);
>> +	diag = (*dev->dev_ops->promiscuous_disable)(dev);
>> +	if (diag != 0)
>> +		dev->data->promiscuous = old_promiscuous;
> Not a real issue, but the enable/disable does exact same thing, slightly
> different way, it makes double check if logic is different,
> can you adapt one of them for both please.
>
> "
> diag = foo();
> dev->data->promiscuous = (diag == 0) ? 1 : old_promiscuous;
> "
> vs
>
> "
> dev->data->promiscuous = 0;
> diag = bar();
> if (diag != 0)
> 	dev->data->promiscuous = old_promiscuous;
> "

I simply did not want to touch the logic in big patch series.
Don't know why, but enable sets promiscuous=1 after callback,
but disable does it before callback. That's why the difference.
Logically it is a separate change and I definitely don't want to
mix it.

>>   
>> -	return 0;
>> +	return eth_err(port_id, diag);
>>   }
>>   
>>   int
>> diff --git a/lib/librte_ethdev/rte_ethdev_core.h b/lib/librte_ethdev/rte_ethdev_core.h
>> index 2394b32c83..6322348d17 100644
>> --- a/lib/librte_ethdev/rte_ethdev_core.h
>> +++ b/lib/librte_ethdev/rte_ethdev_core.h
>> @@ -52,10 +52,10 @@ typedef int (*eth_dev_reset_t)(struct rte_eth_dev *dev);
>>   typedef int (*eth_is_removed_t)(struct rte_eth_dev *dev);
>>   /**< @internal Function used to detect an Ethernet device removal. */
>>   
>> -typedef void (*eth_promiscuous_enable_t)(struct rte_eth_dev *dev);
>> +typedef int (*eth_promiscuous_enable_t)(struct rte_eth_dev *dev);
>>   /**< @internal Function used to enable the RX promiscuous mode of an Ethernet device. */
>>   
>> -typedef void (*eth_promiscuous_disable_t)(struct rte_eth_dev *dev);
>> +typedef int (*eth_promiscuous_disable_t)(struct rte_eth_dev *dev);
>>   /**< @internal Function used to disable the RX promiscuous mode of an Ethernet device. */
> Should we add a note what is expected return value? This information is not
> available anyplace, it may help driver developers.

Makes sense.



More information about the dev mailing list