Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

mlx4: Fix tx ring affinity_mask creation

By default, the number of tx queues is limited by the number of online cpus
in mlx4_en_get_profile(). However, this limit no longer holds after the
ethtool .set_channels method has been called. In that situation, the driver
may access invalid bits of certain cpumask variables when queue_index >=
nr_cpu_ids.

Signed-off-by: Benjamin Poirier <bpoirier@suse.de>
Acked-by: Ido Shamay <idos@mellanox.com>
Fixes: d03a68f ("net/mlx4_en: Configure the XPS queue mapping on driver load")
Signed-off-by: David S. Miller <davem@davemloft.net>

authored by

Benjamin Poirier and committed by
David S. Miller
42eab005 0d699f28

+5 -3
+5 -3
drivers/net/ethernet/mellanox/mlx4/en_tx.c
··· 143 143 ring->hwtstamp_tx_type = priv->hwtstamp_config.tx_type; 144 144 ring->queue_index = queue_index; 145 145 146 - if (queue_index < priv->num_tx_rings_p_up && cpu_online(queue_index)) 147 - cpumask_set_cpu(queue_index, &ring->affinity_mask); 146 + if (queue_index < priv->num_tx_rings_p_up) 147 + cpumask_set_cpu_local_first(queue_index, 148 + priv->mdev->dev->numa_node, 149 + &ring->affinity_mask); 148 150 149 151 *pring = ring; 150 152 return 0; ··· 215 213 216 214 err = mlx4_qp_to_ready(mdev->dev, &ring->wqres.mtt, &ring->context, 217 215 &ring->qp, &ring->qp_state); 218 - if (!user_prio && cpu_online(ring->queue_index)) 216 + if (!cpumask_empty(&ring->affinity_mask)) 219 217 netif_set_xps_queue(priv->dev, &ring->affinity_mask, 220 218 ring->queue_index); 221 219