diff options
author | Yevgeny Petrilin <yevgenyp@mellanox.co.il> | 2009-06-08 03:39:58 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2009-06-08 03:39:58 -0400 |
commit | a5b19b635c39fdb819500b0a746b44fe40c9a303 (patch) | |
tree | 454fd8cee549ec12d9abc8604cae826e7b844d9b | |
parent | 6f536f403979d37021508c5804509a379d853788 (diff) |
mlx4: FIX error flow when initializing EQ table
If mlx4_create_eq() would fail for one of EQ's assigned for
completion handling, the code would try to free the same EQ
we failed to create.
The crash was found by Christoph Lameter
Signed-off-by: Yevgeny Petrilin <yevgenyp@mellanox.co.il>
Signed-off-by: David S. Miller <davem@davemloft.net>
-rw-r--r-- | drivers/net/mlx4/eq.c | 4 |
1 files changed, 3 insertions, 1 deletions
diff --git a/drivers/net/mlx4/eq.c b/drivers/net/mlx4/eq.c index 8830dcb92ec8..dee188761a3c 100644 --- a/drivers/net/mlx4/eq.c +++ b/drivers/net/mlx4/eq.c | |||
@@ -623,8 +623,10 @@ int mlx4_init_eq_table(struct mlx4_dev *dev) | |||
623 | err = mlx4_create_eq(dev, dev->caps.num_cqs + MLX4_NUM_SPARE_EQE, | 623 | err = mlx4_create_eq(dev, dev->caps.num_cqs + MLX4_NUM_SPARE_EQE, |
624 | (dev->flags & MLX4_FLAG_MSI_X) ? i : 0, | 624 | (dev->flags & MLX4_FLAG_MSI_X) ? i : 0, |
625 | &priv->eq_table.eq[i]); | 625 | &priv->eq_table.eq[i]); |
626 | if (err) | 626 | if (err) { |
627 | --i; | ||
627 | goto err_out_unmap; | 628 | goto err_out_unmap; |
629 | } | ||
628 | } | 630 | } |
629 | 631 | ||
630 | err = mlx4_create_eq(dev, MLX4_NUM_ASYNC_EQE + MLX4_NUM_SPARE_EQE, | 632 | err = mlx4_create_eq(dev, MLX4_NUM_ASYNC_EQE + MLX4_NUM_SPARE_EQE, |