mlx4_core: Initialize ctx_list and ctx_lock earlier
We may call mlx4_dispatch_event() before mlx4_register_device() is called for a device, because for example a catastrophic error happens immediately after we enable interrupts. Therefore priv->ctx_list and priv->ctx_lock need to be initialized earlier. This bug was actually exposed by the MSI-X bug that returned IRQ numbers to drivers in reverse order, so that the first FW command interrupt looked to mlx4 like a catastrophic error. Signed-off-by: Roland Dreier <rolandd@cisco.com>
This commit is contained in:
parent
09360d5408
commit
b581401ed0
|
@ -135,9 +135,6 @@ int mlx4_register_device(struct mlx4_dev *dev)
|
||||||
struct mlx4_priv *priv = mlx4_priv(dev);
|
struct mlx4_priv *priv = mlx4_priv(dev);
|
||||||
struct mlx4_interface *intf;
|
struct mlx4_interface *intf;
|
||||||
|
|
||||||
INIT_LIST_HEAD(&priv->ctx_list);
|
|
||||||
spin_lock_init(&priv->ctx_lock);
|
|
||||||
|
|
||||||
mutex_lock(&intf_mutex);
|
mutex_lock(&intf_mutex);
|
||||||
|
|
||||||
list_add_tail(&priv->dev_list, &dev_list);
|
list_add_tail(&priv->dev_list, &dev_list);
|
||||||
|
|
|
@ -787,6 +787,8 @@ static int __devinit mlx4_init_one(struct pci_dev *pdev,
|
||||||
|
|
||||||
dev = &priv->dev;
|
dev = &priv->dev;
|
||||||
dev->pdev = pdev;
|
dev->pdev = pdev;
|
||||||
|
INIT_LIST_HEAD(&priv->ctx_list);
|
||||||
|
spin_lock_init(&priv->ctx_lock);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Now reset the HCA before we touch the PCI capabilities or
|
* Now reset the HCA before we touch the PCI capabilities or
|
||||||
|
|
Loading…
Reference in New Issue