When the mlx4_core driver calls request_irq() to allocate interrupt resources, it uses the fixed device name string "mlx4_core". When multiple IB cards are present in the system, every instance of the resource is named "mlx4_core" in /proc/interrupts. This can make it very confusing trying to work out exactly where IB interrupts are going and why.
The mlx4_core driver has been modified to use the PCI name of the IB card for the purpose of allocating interrupt resources. Signed-off-by: Arputham Benjamin <[email protected]> --- diff -rup a/drivers/net/mlx4/eq.c b/drivers/net/mlx4/eq.c --- a/drivers/net/mlx4/eq.c 2009-08-03 19:42:18.737707766 -0700 +++ b/drivers/net/mlx4/eq.c 2009-08-03 19:42:48.175515414 -0700 @@ -615,7 +615,8 @@ int mlx4_init_eq_table(struct mlx4_dev * priv->eq_table.clr_int = priv->clr_base + (priv->eq_table.inta_pin < 32 ? 4 : 0); - priv->eq_table.irq_names = kmalloc(16 * dev->caps.num_comp_vectors, GFP_KERNEL); + priv->eq_table.irq_names = kmalloc(DEVICE_NAME_MAX * + (dev->caps.num_comp_vectors + 1), GFP_KERNEL); if (!priv->eq_table.irq_names) { err = -ENOMEM; goto err_out_bitmap; @@ -638,17 +639,25 @@ int mlx4_init_eq_table(struct mlx4_dev * goto err_out_comp; if (dev->flags & MLX4_FLAG_MSI_X) { - static const char async_eq_name[] = "mlx4-async"; const char *eq_name; for (i = 0; i < dev->caps.num_comp_vectors + 1; ++i) { if (i < dev->caps.num_comp_vectors) { - snprintf(priv->eq_table.irq_names + i * 16, 16, - "mlx4-comp-%d", i); - eq_name = priv->eq_table.irq_names + i * 16; - } else - eq_name = async_eq_name; + snprintf(priv->eq_table.irq_names + + i * DEVICE_NAME_MAX, + DEVICE_NAME_MAX, + "mlx4-comp...@pci:%s", i, + pci_name(dev->pdev)); + } else { + snprintf(priv->eq_table.irq_names + + i * DEVICE_NAME_MAX, + DEVICE_NAME_MAX, + "mlx4-as...@pci:%s", + pci_name(dev->pdev)); + } + eq_name = priv->eq_table.irq_names + + i * DEVICE_NAME_MAX; err = request_irq(priv->eq_table.eq[i].irq, mlx4_msi_x_interrupt, 0, eq_name, priv->eq_table.eq + i); @@ -658,8 +667,12 @@ int mlx4_init_eq_table(struct mlx4_dev * priv->eq_table.eq[i].have_irq = 1; } } else { + snprintf(priv->eq_table.irq_names, + DEVICE_NAME_MAX, + DRV_NAME "@pci:%s", + pci_name(dev->pdev)); err = request_irq(dev->pdev->irq, mlx4_interrupt, - IRQF_SHARED, DRV_NAME, dev); + IRQF_SHARED, priv->eq_table.irq_names, dev); if (err) goto err_out_async; diff -rup a/drivers/net/mlx4/mlx4.h b/drivers/net/mlx4/mlx4.h --- a/drivers/net/mlx4/mlx4.h 2009-08-03 19:42:18.737707766 -0700 +++ b/drivers/net/mlx4/mlx4.h 2009-08-03 19:43:01.532335625 -0700 @@ -198,6 +198,8 @@ struct mlx4_cq_table { struct mlx4_icm_table cmpt_table; }; +#define DEVICE_NAME_MAX 64 + struct mlx4_eq_table { struct mlx4_bitmap bitmap; char *irq_names; _______________________________________________ general mailing list [email protected] http://lists.openfabrics.org/cgi-bin/mailman/listinfo/general To unsubscribe, please visit http://openib.org/mailman/listinfo/openib-general
