[dpdk-dev] [PATCH] net/mlx5: fix use of bit numbers instead of masks
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
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