* [PATCH net 1/2] net/mlx5_core: Fix race in create EQ
2014-11-06 10:51 [PATCH net 0/2] mlx5_core fixes for 3.18 Eli Cohen
@ 2014-11-06 10:51 ` Eli Cohen
2014-11-06 10:51 ` [PATCH net 2/2] net/mlx5_core: Fix race on driver load Eli Cohen
[not found] ` <1415271082-7644-1-git-send-email-eli-VPRAkNaXOzVWk0Htik3J/w@public.gmane.org>
2 siblings, 0 replies; 4+ messages in thread
From: Eli Cohen @ 2014-11-06 10:51 UTC (permalink / raw)
To: davem; +Cc: netdev, linux-rdma, ogerlitz, Eli Cohen
After the EQ is created, it can possibly generate interrupts and the interrupt
handler is referencing eq->dev. It is therefore required to set eq->dev before
calling request_irq() so if an event is generated before request_irq() returns,
we will have a valid eq->dev field.
Signed-off-by: Eli Cohen <eli@mellanox.com>
---
drivers/net/ethernet/mellanox/mlx5/core/eq.c | 7 +++----
1 file changed, 3 insertions(+), 4 deletions(-)
diff --git a/drivers/net/ethernet/mellanox/mlx5/core/eq.c b/drivers/net/ethernet/mellanox/mlx5/core/eq.c
index a278238a2db6..ad2c96a02a53 100644
--- a/drivers/net/ethernet/mellanox/mlx5/core/eq.c
+++ b/drivers/net/ethernet/mellanox/mlx5/core/eq.c
@@ -374,15 +374,14 @@ int mlx5_create_map_eq(struct mlx5_core_dev *dev, struct mlx5_eq *eq, u8 vecidx,
snprintf(eq->name, MLX5_MAX_EQ_NAME, "%s@pci:%s",
name, pci_name(dev->pdev));
eq->eqn = out.eq_number;
+ eq->irqn = vecidx;
+ eq->dev = dev;
+ eq->doorbell = uar->map + MLX5_EQ_DOORBEL_OFFSET;
err = request_irq(table->msix_arr[vecidx].vector, mlx5_msix_handler, 0,
eq->name, eq);
if (err)
goto err_eq;
- eq->irqn = vecidx;
- eq->dev = dev;
- eq->doorbell = uar->map + MLX5_EQ_DOORBEL_OFFSET;
-
err = mlx5_debug_eq_add(dev, eq);
if (err)
goto err_irq;
--
2.1.2
^ permalink raw reply related [flat|nested] 4+ messages in thread* [PATCH net 2/2] net/mlx5_core: Fix race on driver load
2014-11-06 10:51 [PATCH net 0/2] mlx5_core fixes for 3.18 Eli Cohen
2014-11-06 10:51 ` [PATCH net 1/2] net/mlx5_core: Fix race in create EQ Eli Cohen
@ 2014-11-06 10:51 ` Eli Cohen
[not found] ` <1415271082-7644-1-git-send-email-eli-VPRAkNaXOzVWk0Htik3J/w@public.gmane.org>
2 siblings, 0 replies; 4+ messages in thread
From: Eli Cohen @ 2014-11-06 10:51 UTC (permalink / raw)
To: davem; +Cc: netdev, linux-rdma, ogerlitz, Eli Cohen
When events arrive at driver load, the event handler gets called even before
the spinlock and list are initialized. Fix this by moving the initialization
before EQs creation.
Signed-off-by: Eli Cohen <eli@mellanox.com>
---
drivers/net/ethernet/mellanox/mlx5/core/main.c | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/drivers/net/ethernet/mellanox/mlx5/core/main.c b/drivers/net/ethernet/mellanox/mlx5/core/main.c
index 88b2ffa0edfb..ecc6341e728a 100644
--- a/drivers/net/ethernet/mellanox/mlx5/core/main.c
+++ b/drivers/net/ethernet/mellanox/mlx5/core/main.c
@@ -855,14 +855,14 @@ static int init_one(struct pci_dev *pdev,
dev->profile = &profile[prof_sel];
dev->event = mlx5_core_event;
+ INIT_LIST_HEAD(&priv->ctx_list);
+ spin_lock_init(&priv->ctx_lock);
err = mlx5_dev_init(dev, pdev);
if (err) {
dev_err(&pdev->dev, "mlx5_dev_init failed %d\n", err);
goto out;
}
- INIT_LIST_HEAD(&priv->ctx_list);
- spin_lock_init(&priv->ctx_lock);
err = mlx5_register_device(dev);
if (err) {
dev_err(&pdev->dev, "mlx5_register_device failed %d\n", err);
--
2.1.2
^ permalink raw reply related [flat|nested] 4+ messages in thread