Skip to content

Commit db058a1

Browse files
Saeed Mahameeddavem330
authored andcommitted
net/mlx5_core: Set irq affinity hints
Preparation for upcoming ethernet driver. - Move msix array from eq_table struct to priv since its not related to eq_table - Intorduce irq_info struct to hold all irq information - Move name from mlx5_eq to irq_info struct since it is irq property. - Set IRQ affinity hints Signed-off-by: Achiad Shochat <achiad@mellanox.com> Signed-off-by: Rana Shahout <ranas@mellanox.com> Signed-off-by: Saeed Mahameed <saeedm@mellanox.com> Signed-off-by: Amir Vadai <amirv@mellanox.com> Signed-off-by: David S. Miller <davem@davemloft.net>
1 parent 64ffaa2 commit db058a1

File tree

3 files changed

+117
-21
lines changed

3 files changed

+117
-21
lines changed

drivers/net/ethernet/mellanox/mlx5/core/eq.c

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -339,7 +339,7 @@ static void init_eq_buf(struct mlx5_eq *eq)
339339
int mlx5_create_map_eq(struct mlx5_core_dev *dev, struct mlx5_eq *eq, u8 vecidx,
340340
int nent, u64 mask, const char *name, struct mlx5_uar *uar)
341341
{
342-
struct mlx5_eq_table *table = &dev->priv.eq_table;
342+
struct mlx5_priv *priv = &dev->priv;
343343
struct mlx5_create_eq_mbox_in *in;
344344
struct mlx5_create_eq_mbox_out out;
345345
int err;
@@ -377,14 +377,15 @@ int mlx5_create_map_eq(struct mlx5_core_dev *dev, struct mlx5_eq *eq, u8 vecidx,
377377
goto err_in;
378378
}
379379

380-
snprintf(eq->name, MLX5_MAX_EQ_NAME, "%s@pci:%s",
380+
snprintf(priv->irq_info[vecidx].name, MLX5_MAX_IRQ_NAME, "%s@pci:%s",
381381
name, pci_name(dev->pdev));
382+
382383
eq->eqn = out.eq_number;
383384
eq->irqn = vecidx;
384385
eq->dev = dev;
385386
eq->doorbell = uar->map + MLX5_EQ_DOORBEL_OFFSET;
386-
err = request_irq(table->msix_arr[vecidx].vector, mlx5_msix_handler, 0,
387-
eq->name, eq);
387+
err = request_irq(priv->msix_arr[vecidx].vector, mlx5_msix_handler, 0,
388+
priv->irq_info[vecidx].name, eq);
388389
if (err)
389390
goto err_eq;
390391

@@ -400,7 +401,7 @@ int mlx5_create_map_eq(struct mlx5_core_dev *dev, struct mlx5_eq *eq, u8 vecidx,
400401
return 0;
401402

402403
err_irq:
403-
free_irq(table->msix_arr[vecidx].vector, eq);
404+
free_irq(priv->msix_arr[vecidx].vector, eq);
404405

405406
err_eq:
406407
mlx5_cmd_destroy_eq(dev, eq->eqn);
@@ -416,16 +417,15 @@ EXPORT_SYMBOL_GPL(mlx5_create_map_eq);
416417

417418
int mlx5_destroy_unmap_eq(struct mlx5_core_dev *dev, struct mlx5_eq *eq)
418419
{
419-
struct mlx5_eq_table *table = &dev->priv.eq_table;
420420
int err;
421421

422422
mlx5_debug_eq_remove(dev, eq);
423-
free_irq(table->msix_arr[eq->irqn].vector, eq);
423+
free_irq(dev->priv.msix_arr[eq->irqn].vector, eq);
424424
err = mlx5_cmd_destroy_eq(dev, eq->eqn);
425425
if (err)
426426
mlx5_core_warn(dev, "failed to destroy a previously created eq: eqn %d\n",
427427
eq->eqn);
428-
synchronize_irq(table->msix_arr[eq->irqn].vector);
428+
synchronize_irq(dev->priv.msix_arr[eq->irqn].vector);
429429
mlx5_buf_free(dev, &eq->buf);
430430

431431
return err;

drivers/net/ethernet/mellanox/mlx5/core/main.c

Lines changed: 101 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@
3838
#include <linux/dma-mapping.h>
3939
#include <linux/slab.h>
4040
#include <linux/io-mapping.h>
41+
#include <linux/interrupt.h>
4142
#include <linux/mlx5/driver.h>
4243
#include <linux/mlx5/cq.h>
4344
#include <linux/mlx5/qp.h>
@@ -208,7 +209,8 @@ static void release_bar(struct pci_dev *pdev)
208209

209210
static int mlx5_enable_msix(struct mlx5_core_dev *dev)
210211
{
211-
struct mlx5_eq_table *table = &dev->priv.eq_table;
212+
struct mlx5_priv *priv = &dev->priv;
213+
struct mlx5_eq_table *table = &priv->eq_table;
212214
int num_eqs = 1 << dev->caps.gen.log_max_eq;
213215
int nvec;
214216
int i;
@@ -218,29 +220,37 @@ static int mlx5_enable_msix(struct mlx5_core_dev *dev)
218220
if (nvec <= MLX5_EQ_VEC_COMP_BASE)
219221
return -ENOMEM;
220222

221-
table->msix_arr = kzalloc(nvec * sizeof(*table->msix_arr), GFP_KERNEL);
222-
if (!table->msix_arr)
223-
return -ENOMEM;
223+
priv->msix_arr = kcalloc(nvec, sizeof(*priv->msix_arr), GFP_KERNEL);
224+
225+
priv->irq_info = kcalloc(nvec, sizeof(*priv->irq_info), GFP_KERNEL);
226+
if (!priv->msix_arr || !priv->irq_info)
227+
goto err_free_msix;
224228

225229
for (i = 0; i < nvec; i++)
226-
table->msix_arr[i].entry = i;
230+
priv->msix_arr[i].entry = i;
227231

228-
nvec = pci_enable_msix_range(dev->pdev, table->msix_arr,
232+
nvec = pci_enable_msix_range(dev->pdev, priv->msix_arr,
229233
MLX5_EQ_VEC_COMP_BASE + 1, nvec);
230234
if (nvec < 0)
231235
return nvec;
232236

233237
table->num_comp_vectors = nvec - MLX5_EQ_VEC_COMP_BASE;
234238

235239
return 0;
240+
241+
err_free_msix:
242+
kfree(priv->irq_info);
243+
kfree(priv->msix_arr);
244+
return -ENOMEM;
236245
}
237246

238247
static void mlx5_disable_msix(struct mlx5_core_dev *dev)
239248
{
240-
struct mlx5_eq_table *table = &dev->priv.eq_table;
249+
struct mlx5_priv *priv = &dev->priv;
241250

242251
pci_disable_msix(dev->pdev);
243-
kfree(table->msix_arr);
252+
kfree(priv->irq_info);
253+
kfree(priv->msix_arr);
244254
}
245255

246256
struct mlx5_reg_host_endianess {
@@ -507,6 +517,77 @@ static int mlx5_core_disable_hca(struct mlx5_core_dev *dev)
507517
return 0;
508518
}
509519

520+
static int mlx5_irq_set_affinity_hint(struct mlx5_core_dev *mdev, int i)
521+
{
522+
struct mlx5_priv *priv = &mdev->priv;
523+
struct msix_entry *msix = priv->msix_arr;
524+
int irq = msix[i + MLX5_EQ_VEC_COMP_BASE].vector;
525+
int numa_node = dev_to_node(&mdev->pdev->dev);
526+
int err;
527+
528+
if (!zalloc_cpumask_var(&priv->irq_info[i].mask, GFP_KERNEL)) {
529+
mlx5_core_warn(mdev, "zalloc_cpumask_var failed");
530+
return -ENOMEM;
531+
}
532+
533+
err = cpumask_set_cpu_local_first(i, numa_node, priv->irq_info[i].mask);
534+
if (err) {
535+
mlx5_core_warn(mdev, "cpumask_set_cpu_local_first failed");
536+
goto err_clear_mask;
537+
}
538+
539+
err = irq_set_affinity_hint(irq, priv->irq_info[i].mask);
540+
if (err) {
541+
mlx5_core_warn(mdev, "irq_set_affinity_hint failed,irq 0x%.4x",
542+
irq);
543+
goto err_clear_mask;
544+
}
545+
546+
return 0;
547+
548+
err_clear_mask:
549+
free_cpumask_var(priv->irq_info[i].mask);
550+
return err;
551+
}
552+
553+
static void mlx5_irq_clear_affinity_hint(struct mlx5_core_dev *mdev, int i)
554+
{
555+
struct mlx5_priv *priv = &mdev->priv;
556+
struct msix_entry *msix = priv->msix_arr;
557+
int irq = msix[i + MLX5_EQ_VEC_COMP_BASE].vector;
558+
559+
irq_set_affinity_hint(irq, NULL);
560+
free_cpumask_var(priv->irq_info[i].mask);
561+
}
562+
563+
static int mlx5_irq_set_affinity_hints(struct mlx5_core_dev *mdev)
564+
{
565+
int err;
566+
int i;
567+
568+
for (i = 0; i < mdev->priv.eq_table.num_comp_vectors; i++) {
569+
err = mlx5_irq_set_affinity_hint(mdev, i);
570+
if (err)
571+
goto err_out;
572+
}
573+
574+
return 0;
575+
576+
err_out:
577+
for (i--; i >= 0; i--)
578+
mlx5_irq_clear_affinity_hint(mdev, i);
579+
580+
return err;
581+
}
582+
583+
static void mlx5_irq_clear_affinity_hints(struct mlx5_core_dev *mdev)
584+
{
585+
int i;
586+
587+
for (i = 0; i < mdev->priv.eq_table.num_comp_vectors; i++)
588+
mlx5_irq_clear_affinity_hint(mdev, i);
589+
}
590+
510591
int mlx5_vector2eqn(struct mlx5_core_dev *dev, int vector, int *eqn, int *irqn)
511592
{
512593
struct mlx5_eq_table *table = &dev->priv.eq_table;
@@ -549,7 +630,7 @@ static void free_comp_eqs(struct mlx5_core_dev *dev)
549630
static int alloc_comp_eqs(struct mlx5_core_dev *dev)
550631
{
551632
struct mlx5_eq_table *table = &dev->priv.eq_table;
552-
char name[MLX5_MAX_EQ_NAME];
633+
char name[MLX5_MAX_IRQ_NAME];
553634
struct mlx5_eq *eq;
554635
int ncomp_vec;
555636
int nent;
@@ -566,7 +647,7 @@ static int alloc_comp_eqs(struct mlx5_core_dev *dev)
566647
goto clean;
567648
}
568649

569-
snprintf(name, MLX5_MAX_EQ_NAME, "mlx5_comp%d", i);
650+
snprintf(name, MLX5_MAX_IRQ_NAME, "mlx5_comp%d", i);
570651
err = mlx5_create_map_eq(dev, eq,
571652
i + MLX5_EQ_VEC_COMP_BASE, nent, 0,
572653
name, &dev->priv.uuari.uars[0]);
@@ -730,6 +811,12 @@ static int mlx5_dev_init(struct mlx5_core_dev *dev, struct pci_dev *pdev)
730811
goto err_stop_eqs;
731812
}
732813

814+
err = mlx5_irq_set_affinity_hints(dev);
815+
if (err) {
816+
dev_err(&pdev->dev, "Failed to alloc affinity hint cpumask\n");
817+
goto err_free_comp_eqs;
818+
}
819+
733820
MLX5_INIT_DOORBELL_LOCK(&priv->cq_uar_lock);
734821

735822
mlx5_init_cq_table(dev);
@@ -739,6 +826,9 @@ static int mlx5_dev_init(struct mlx5_core_dev *dev, struct pci_dev *pdev)
739826

740827
return 0;
741828

829+
err_free_comp_eqs:
830+
free_comp_eqs(dev);
831+
742832
err_stop_eqs:
743833
mlx5_stop_eqs(dev);
744834

@@ -793,6 +883,7 @@ static void mlx5_dev_cleanup(struct mlx5_core_dev *dev)
793883
mlx5_cleanup_srq_table(dev);
794884
mlx5_cleanup_qp_table(dev);
795885
mlx5_cleanup_cq_table(dev);
886+
mlx5_irq_clear_affinity_hints(dev);
796887
free_comp_eqs(dev);
797888
mlx5_stop_eqs(dev);
798889
mlx5_free_uuars(dev, &priv->uuari);

include/linux/mlx5/driver.h

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -85,7 +85,7 @@ enum {
8585
};
8686

8787
enum {
88-
MLX5_MAX_EQ_NAME = 32
88+
MLX5_MAX_IRQ_NAME = 32
8989
};
9090

9191
enum {
@@ -349,7 +349,6 @@ struct mlx5_eq {
349349
u8 eqn;
350350
int nent;
351351
u64 mask;
352-
char name[MLX5_MAX_EQ_NAME];
353352
struct list_head list;
354353
int index;
355354
struct mlx5_rsc_debug *dbg;
@@ -412,7 +411,6 @@ struct mlx5_eq_table {
412411
struct mlx5_eq pages_eq;
413412
struct mlx5_eq async_eq;
414413
struct mlx5_eq cmd_eq;
415-
struct msix_entry *msix_arr;
416414
int num_comp_vectors;
417415
/* protect EQs list
418416
*/
@@ -465,9 +463,16 @@ struct mlx5_mr_table {
465463
struct radix_tree_root tree;
466464
};
467465

466+
struct mlx5_irq_info {
467+
cpumask_var_t mask;
468+
char name[MLX5_MAX_IRQ_NAME];
469+
};
470+
468471
struct mlx5_priv {
469472
char name[MLX5_MAX_NAME_LEN];
470473
struct mlx5_eq_table eq_table;
474+
struct msix_entry *msix_arr;
475+
struct mlx5_irq_info *irq_info;
471476
struct mlx5_uuar_info uuari;
472477
MLX5_DECLARE_DOORBELL_LOCK(cq_uar_lock);
473478

0 commit comments

Comments
 (0)