Skip to content

Commit 9e311e7

Browse files
Yuval Atiasdavem330
authored andcommitted
net/mlx4_en: Use affinity hint
The “affinity hint” mechanism is used by the user space daemon, irqbalancer, to indicate a preferred CPU mask for irqs. Irqbalancer can use this hint to balance the irqs between the cpus indicated by the mask. We wish the HCA to preferentially map the IRQs it uses to numa cores close to it. To accomplish this, we use cpumask_set_cpu_local_first(), that sets the affinity hint according the following policy: First it maps IRQs to “close” numa cores. If these are exhausted, the remaining IRQs are mapped to “far” numa cores. Signed-off-by: Yuval Atias <[email protected]> Signed-off-by: Amir Vadai <[email protected]> Signed-off-by: David S. Miller <[email protected]>
1 parent da91309 commit 9e311e7

File tree

3 files changed

+46
-2
lines changed

3 files changed

+46
-2
lines changed

drivers/net/ethernet/mellanox/mlx4/en_cq.c

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -163,6 +163,13 @@ int mlx4_en_activate_cq(struct mlx4_en_priv *priv, struct mlx4_en_cq *cq,
163163
netif_napi_add(cq->dev, &cq->napi, mlx4_en_poll_tx_cq,
164164
NAPI_POLL_WEIGHT);
165165
} else {
166+
struct mlx4_en_rx_ring *ring = priv->rx_ring[cq->ring];
167+
168+
err = irq_set_affinity_hint(cq->mcq.irq,
169+
ring->affinity_mask);
170+
if (err)
171+
mlx4_warn(mdev, "Failed setting affinity hint\n");
172+
166173
netif_napi_add(cq->dev, &cq->napi, mlx4_en_poll_rx_cq, 64);
167174
napi_hash_add(&cq->napi);
168175
}
@@ -179,8 +186,11 @@ void mlx4_en_destroy_cq(struct mlx4_en_priv *priv, struct mlx4_en_cq **pcq)
179186

180187
mlx4_en_unmap_buffer(&cq->wqres.buf);
181188
mlx4_free_hwq_res(mdev->dev, &cq->wqres, cq->buf_size);
182-
if (priv->mdev->dev->caps.comp_pool && cq->vector)
189+
if (priv->mdev->dev->caps.comp_pool && cq->vector) {
190+
if (!cq->is_tx)
191+
irq_set_affinity_hint(cq->mcq.irq, NULL);
183192
mlx4_release_eq(priv->mdev->dev, cq->vector);
193+
}
184194
cq->vector = 0;
185195
cq->buf_size = 0;
186196
cq->buf = NULL;

drivers/net/ethernet/mellanox/mlx4/en_netdev.c

Lines changed: 34 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1526,6 +1526,27 @@ static void mlx4_en_linkstate(struct work_struct *work)
15261526
mutex_unlock(&mdev->state_lock);
15271527
}
15281528

1529+
static int mlx4_en_init_affinity_hint(struct mlx4_en_priv *priv, int ring_idx)
1530+
{
1531+
struct mlx4_en_rx_ring *ring = priv->rx_ring[ring_idx];
1532+
int numa_node = priv->mdev->dev->numa_node;
1533+
int ret = 0;
1534+
1535+
if (!zalloc_cpumask_var(&ring->affinity_mask, GFP_KERNEL))
1536+
return -ENOMEM;
1537+
1538+
ret = cpumask_set_cpu_local_first(ring_idx, numa_node,
1539+
ring->affinity_mask);
1540+
if (ret)
1541+
free_cpumask_var(ring->affinity_mask);
1542+
1543+
return ret;
1544+
}
1545+
1546+
static void mlx4_en_free_affinity_hint(struct mlx4_en_priv *priv, int ring_idx)
1547+
{
1548+
free_cpumask_var(priv->rx_ring[ring_idx]->affinity_mask);
1549+
}
15291550

15301551
int mlx4_en_start_port(struct net_device *dev)
15311552
{
@@ -1567,9 +1588,16 @@ int mlx4_en_start_port(struct net_device *dev)
15671588

15681589
mlx4_en_cq_init_lock(cq);
15691590

1591+
err = mlx4_en_init_affinity_hint(priv, i);
1592+
if (err) {
1593+
en_err(priv, "Failed preparing IRQ affinity hint\n");
1594+
goto cq_err;
1595+
}
1596+
15701597
err = mlx4_en_activate_cq(priv, cq, i);
15711598
if (err) {
15721599
en_err(priv, "Failed activating Rx CQ\n");
1600+
mlx4_en_free_affinity_hint(priv, i);
15731601
goto cq_err;
15741602
}
15751603
for (j = 0; j < cq->size; j++)
@@ -1578,6 +1606,7 @@ int mlx4_en_start_port(struct net_device *dev)
15781606
if (err) {
15791607
en_err(priv, "Failed setting cq moderation parameters\n");
15801608
mlx4_en_deactivate_cq(priv, cq);
1609+
mlx4_en_free_affinity_hint(priv, i);
15811610
goto cq_err;
15821611
}
15831612
mlx4_en_arm_cq(priv, cq);
@@ -1715,8 +1744,10 @@ int mlx4_en_start_port(struct net_device *dev)
17151744
mac_err:
17161745
mlx4_en_put_qp(priv);
17171746
cq_err:
1718-
while (rx_index--)
1747+
while (rx_index--) {
17191748
mlx4_en_deactivate_cq(priv, priv->rx_cq[rx_index]);
1749+
mlx4_en_free_affinity_hint(priv, i);
1750+
}
17201751
for (i = 0; i < priv->rx_ring_num; i++)
17211752
mlx4_en_deactivate_rx_ring(priv, priv->rx_ring[i]);
17221753

@@ -1847,6 +1878,8 @@ void mlx4_en_stop_port(struct net_device *dev, int detach)
18471878
msleep(1);
18481879
mlx4_en_deactivate_rx_ring(priv, priv->rx_ring[i]);
18491880
mlx4_en_deactivate_cq(priv, cq);
1881+
1882+
mlx4_en_free_affinity_hint(priv, i);
18501883
}
18511884
}
18521885

drivers/net/ethernet/mellanox/mlx4/mlx4_en.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -313,6 +313,7 @@ struct mlx4_en_rx_ring {
313313
unsigned long csum_ok;
314314
unsigned long csum_none;
315315
int hwtstamp_rx_filter;
316+
cpumask_var_t affinity_mask;
316317
};
317318

318319
struct mlx4_en_cq {

0 commit comments

Comments
 (0)