[dpdk-dev] [PATCH] net/mlx5: fix use of bit numbers instead of masks

2017-11-10 Thread Edward Makarov
The constant ETHTOOL_LINK_MODE_1000baseT_Full_BIT and the others like
that in mlx5_link_update_unlocked_gs must be bit masks but unfortunately
they are bit numbers. This commit fixes the issue.

Fixes: 188408719888 ("net/mlx5: fix support for newer link speeds")
Cc: nelio.laranje...@6wind.com
Cc: sta...@dpdk.org

Signed-off-by: Edward Makarov 
---
 drivers/net/mlx5/mlx5_ethdev.c | 50 +-
 drivers/net/mlx5/mlx5_utils.h  |  4 
 2 files changed, 29 insertions(+), 25 deletions(-)

diff --git a/drivers/net/mlx5/mlx5_ethdev.c b/drivers/net/mlx5/mlx5_ethdev.c
index c31ea4b62..a3cef6891 100644
--- a/drivers/net/mlx5/mlx5_ethdev.c
+++ b/drivers/net/mlx5/mlx5_ethdev.c
@@ -865,39 +865,39 @@ mlx5_link_update_unlocked_gs(struct rte_eth_dev *dev, int 
wait_to_complete)
sc = ecmd->link_mode_masks[0] |
((uint64_t)ecmd->link_mode_masks[1] << 32);
priv->link_speed_capa = 0;
-   if (sc & ETHTOOL_LINK_MODE_Autoneg_BIT)
+   if (sc & MLX5_BITSHIFT(ETHTOOL_LINK_MODE_Autoneg_BIT))
priv->link_speed_capa |= ETH_LINK_SPEED_AUTONEG;
-   if (sc & (ETHTOOL_LINK_MODE_1000baseT_Full_BIT |
- ETHTOOL_LINK_MODE_1000baseKX_Full_BIT))
+   if (sc & (MLX5_BITSHIFT(ETHTOOL_LINK_MODE_1000baseT_Full_BIT) |
+ MLX5_BITSHIFT(ETHTOOL_LINK_MODE_1000baseKX_Full_BIT)))
priv->link_speed_capa |= ETH_LINK_SPEED_1G;
-   if (sc & (ETHTOOL_LINK_MODE_1baseKX4_Full_BIT |
- ETHTOOL_LINK_MODE_1baseKR_Full_BIT |
- ETHTOOL_LINK_MODE_1baseR_FEC_BIT))
+   if (sc & (MLX5_BITSHIFT(ETHTOOL_LINK_MODE_1baseKX4_Full_BIT) |
+ MLX5_BITSHIFT(ETHTOOL_LINK_MODE_1baseKR_Full_BIT) |
+ MLX5_BITSHIFT(ETHTOOL_LINK_MODE_1baseR_FEC_BIT)))
priv->link_speed_capa |= ETH_LINK_SPEED_10G;
-   if (sc & (ETHTOOL_LINK_MODE_2baseMLD2_Full_BIT |
- ETHTOOL_LINK_MODE_2baseKR2_Full_BIT))
+   if (sc & (MLX5_BITSHIFT(ETHTOOL_LINK_MODE_2baseMLD2_Full_BIT) |
+ MLX5_BITSHIFT(ETHTOOL_LINK_MODE_2baseKR2_Full_BIT)))
priv->link_speed_capa |= ETH_LINK_SPEED_20G;
-   if (sc & (ETHTOOL_LINK_MODE_4baseKR4_Full_BIT |
- ETHTOOL_LINK_MODE_4baseCR4_Full_BIT |
- ETHTOOL_LINK_MODE_4baseSR4_Full_BIT |
- ETHTOOL_LINK_MODE_4baseLR4_Full_BIT))
+   if (sc & (MLX5_BITSHIFT(ETHTOOL_LINK_MODE_4baseKR4_Full_BIT) |
+ MLX5_BITSHIFT(ETHTOOL_LINK_MODE_4baseCR4_Full_BIT) |
+ MLX5_BITSHIFT(ETHTOOL_LINK_MODE_4baseSR4_Full_BIT) |
+ MLX5_BITSHIFT(ETHTOOL_LINK_MODE_4baseLR4_Full_BIT)))
priv->link_speed_capa |= ETH_LINK_SPEED_40G;
-   if (sc & (ETHTOOL_LINK_MODE_56000baseKR4_Full_BIT |
- ETHTOOL_LINK_MODE_56000baseCR4_Full_BIT |
- ETHTOOL_LINK_MODE_56000baseSR4_Full_BIT |
- ETHTOOL_LINK_MODE_56000baseLR4_Full_BIT))
+   if (sc & (MLX5_BITSHIFT(ETHTOOL_LINK_MODE_56000baseKR4_Full_BIT) |
+ MLX5_BITSHIFT(ETHTOOL_LINK_MODE_56000baseCR4_Full_BIT) |
+ MLX5_BITSHIFT(ETHTOOL_LINK_MODE_56000baseSR4_Full_BIT) |
+ MLX5_BITSHIFT(ETHTOOL_LINK_MODE_56000baseLR4_Full_BIT)))
priv->link_speed_capa |= ETH_LINK_SPEED_56G;
-   if (sc & (ETHTOOL_LINK_MODE_25000baseCR_Full_BIT |
- ETHTOOL_LINK_MODE_25000baseKR_Full_BIT |
- ETHTOOL_LINK_MODE_25000baseSR_Full_BIT))
+   if (sc & (MLX5_BITSHIFT(ETHTOOL_LINK_MODE_25000baseCR_Full_BIT) |
+ MLX5_BITSHIFT(ETHTOOL_LINK_MODE_25000baseKR_Full_BIT) |
+ MLX5_BITSHIFT(ETHTOOL_LINK_MODE_25000baseSR_Full_BIT)))
priv->link_speed_capa |= ETH_LINK_SPEED_25G;
-   if (sc & (ETHTOOL_LINK_MODE_5baseCR2_Full_BIT |
- ETHTOOL_LINK_MODE_5baseKR2_Full_BIT))
+   if (sc & (MLX5_BITSHIFT(ETHTOOL_LINK_MODE_5baseCR2_Full_BIT) |
+ MLX5_BITSHIFT(ETHTOOL_LINK_MODE_5baseKR2_Full_BIT)))
priv->link_speed_capa |= ETH_LINK_SPEED_50G;
-   if (sc & (ETHTOOL_LINK_MODE_10baseKR4_Full_BIT |
- ETHTOOL_LINK_MODE_10baseSR4_Full_BIT |
- ETHTOOL_LINK_MODE_10baseCR4_Full_BIT |
- ETHTOOL_LINK_MODE_10baseLR4_ER4_Full_BIT))
+   if (sc & (MLX5_BITSHIFT(ETHTOOL_LINK_MODE_10baseKR4_Full_BIT) |
+ MLX5_BITSHIFT(ETHTOOL_LINK_MODE_10baseSR4_Full_BIT) |
+ MLX5_BITSHIFT(ETHTOOL_LINK_MODE_10baseCR4_Full_BIT) |
+ MLX5_BITSHIFT(ETHTOOL_LINK_MODE_10baseLR4_ER4_Full_BIT)))
priv->link_speed_capa |= ETH_LINK_SPEED_100G;
dev_link.link_duplex =

Re: [dpdk-dev] [PATCH] net/virtio: fix wrong variable assignment in helper macro

2020-08-29 Thread Edward Makarov

On 8/29/20 2:22 PM, Andrew Rybchenko wrote:
> On 8/14/20 12:21 PM, Vipul Ashri wrote:
>> Inside Macro ASSIGN_UNLESS_EQUAL(var, val), assignment to var is always
>> failing as assignment done using var_ having local scope only.
>> This leads to TX packets not going out and found broken due to cleanup
>> malfunctioning. This patch fixes the wrong variable assignment.
>>
>> Fixes: 57f90f894588 ("net/virtio: reuse packed ring functions")
>> Cc: sta...@dpdk.org
>>
>> Signed-off-by: Vipul Ashri 
>> ---
>>   drivers/net/virtio/virtqueue.h | 6 ++
>>   1 file changed, 2 insertions(+), 4 deletions(-)
>>
>> diff --git a/drivers/net/virtio/virtqueue.h b/drivers/net/virtio/virtqueue.h
>> index 105a9c00c..20c95471e 100644
>> --- a/drivers/net/virtio/virtqueue.h
>> +++ b/drivers/net/virtio/virtqueue.h
>> @@ -607,10 +607,8 @@ virtqueue_notify(struct virtqueue *vq)
>>   
>>   /* avoid write operation when necessary, to lessen cache issues */
>>   #define ASSIGN_UNLESS_EQUAL(var, val) do { \
>> -typeof(var) var_ = (var);   \
>> -typeof(val) val_ = (val);   \
>> -if ((var_) != (val_))   \
>> -(var_) = (val_);\
>> +if ((var) != (val)) \
>> +(var) = (val);  \
> 
> Good catch. As I understand the old code tries to avoid
> processing of var and val expressions twice. It looks it
> could be kept for val at least. Just keep if condition as in
> old code and fix the last line above:
>      (var) = val_;
> Since var_ and val_are local variables there is no necessity
> to enclose it in parenthesis (but does not harm if done).
> var_ may be really removed since since resulting code will
> use it only once.

I think there is a solution to avoid multiple evaluations of parameters:

// var is definitely an lvalue, so its address can definitely be taken
#define ASSIGN_UNLESS_EQUAL(var, val) do {  \
typeof(var) *const var_ = &(var);   \
typeof(val)  const val_ = (val);\
if (*var_ != val_)  \
*var_ = val_;   \
} while (0)

The solution relies on the compiler optimizer. Here is the comparison of
what the variants are compiled into:

https://godbolt.org/z/nnvq5q