| From foo@baz Tue Jan 26 21:35:03 PST 2016 |
| From: Doron Tsur <doront@mellanox.com> |
| Date: Sun, 17 Jan 2016 11:25:47 +0200 |
| Subject: net/mlx5_core: Fix trimming down IRQ number |
| |
| From: Doron Tsur <doront@mellanox.com> |
| |
| [ Upstream commit 0b6e26ce89391327d955a756a7823272238eb867 ] |
| |
| With several ConnectX-4 cards installed on a server, one may receive |
| irqn > 255 from the kernel API, which we mistakenly trim to 8bit. |
| |
| This causes EQ creation failure with the following stack trace: |
| [<ffffffff812a11f4>] dump_stack+0x48/0x64 |
| [<ffffffff810ace21>] __setup_irq+0x3a1/0x4f0 |
| [<ffffffff810ad7e0>] request_threaded_irq+0x120/0x180 |
| [<ffffffffa0923660>] ? mlx5_eq_int+0x450/0x450 [mlx5_core] |
| [<ffffffffa0922f64>] mlx5_create_map_eq+0x1e4/0x2b0 [mlx5_core] |
| [<ffffffffa091de01>] alloc_comp_eqs+0xb1/0x180 [mlx5_core] |
| [<ffffffffa091ea99>] mlx5_dev_init+0x5e9/0x6e0 [mlx5_core] |
| [<ffffffffa091ec29>] init_one+0x99/0x1c0 [mlx5_core] |
| [<ffffffff812e2afc>] local_pci_probe+0x4c/0xa0 |
| |
| Fixing it by changing of the irqn type from u8 to unsigned int to |
| support values > 255 |
| |
| Fixes: 61d0e73e0a5a ('net/mlx5_core: Use the the real irqn in eq->irqn') |
| Reported-by: Jiri Pirko <jiri@mellanox.com> |
| Signed-off-by: Doron Tsur <doront@mellanox.com> |
| Signed-off-by: Matan Barak <matanb@mellanox.com> |
| Signed-off-by: David S. Miller <davem@davemloft.net> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| --- |
| drivers/infiniband/hw/mlx5/cq.c | 2 +- |
| drivers/net/ethernet/mellanox/mlx5/core/en_main.c | 6 +++--- |
| drivers/net/ethernet/mellanox/mlx5/core/main.c | 3 ++- |
| include/linux/mlx5/cq.h | 2 +- |
| include/linux/mlx5/driver.h | 5 +++-- |
| 5 files changed, 10 insertions(+), 8 deletions(-) |
| |
| --- a/drivers/infiniband/hw/mlx5/cq.c |
| +++ b/drivers/infiniband/hw/mlx5/cq.c |
| @@ -756,7 +756,7 @@ struct ib_cq *mlx5_ib_create_cq(struct i |
| int uninitialized_var(index); |
| int uninitialized_var(inlen); |
| int cqe_size; |
| - int irqn; |
| + unsigned int irqn; |
| int eqn; |
| int err; |
| |
| --- a/drivers/net/ethernet/mellanox/mlx5/core/en_main.c |
| +++ b/drivers/net/ethernet/mellanox/mlx5/core/en_main.c |
| @@ -746,7 +746,7 @@ static int mlx5e_create_cq(struct mlx5e_ |
| struct mlx5_core_dev *mdev = priv->mdev; |
| struct mlx5_core_cq *mcq = &cq->mcq; |
| int eqn_not_used; |
| - int irqn; |
| + unsigned int irqn; |
| int err; |
| u32 i; |
| |
| @@ -800,7 +800,7 @@ static int mlx5e_enable_cq(struct mlx5e_ |
| void *in; |
| void *cqc; |
| int inlen; |
| - int irqn_not_used; |
| + unsigned int irqn_not_used; |
| int eqn; |
| int err; |
| |
| @@ -1498,7 +1498,7 @@ static int mlx5e_create_drop_cq(struct m |
| struct mlx5_core_dev *mdev = priv->mdev; |
| struct mlx5_core_cq *mcq = &cq->mcq; |
| int eqn_not_used; |
| - int irqn; |
| + unsigned int irqn; |
| int err; |
| |
| err = mlx5_cqwq_create(mdev, ¶m->wq, param->cqc, &cq->wq, |
| --- a/drivers/net/ethernet/mellanox/mlx5/core/main.c |
| +++ b/drivers/net/ethernet/mellanox/mlx5/core/main.c |
| @@ -520,7 +520,8 @@ static void mlx5_irq_clear_affinity_hint |
| mlx5_irq_clear_affinity_hint(mdev, i); |
| } |
| |
| -int mlx5_vector2eqn(struct mlx5_core_dev *dev, int vector, int *eqn, int *irqn) |
| +int mlx5_vector2eqn(struct mlx5_core_dev *dev, int vector, int *eqn, |
| + unsigned int *irqn) |
| { |
| struct mlx5_eq_table *table = &dev->priv.eq_table; |
| struct mlx5_eq *eq, *n; |
| --- a/include/linux/mlx5/cq.h |
| +++ b/include/linux/mlx5/cq.h |
| @@ -45,7 +45,7 @@ struct mlx5_core_cq { |
| atomic_t refcount; |
| struct completion free; |
| unsigned vector; |
| - int irqn; |
| + unsigned int irqn; |
| void (*comp) (struct mlx5_core_cq *); |
| void (*event) (struct mlx5_core_cq *, enum mlx5_event); |
| struct mlx5_uar *uar; |
| --- a/include/linux/mlx5/driver.h |
| +++ b/include/linux/mlx5/driver.h |
| @@ -303,7 +303,7 @@ struct mlx5_eq { |
| u32 cons_index; |
| struct mlx5_buf buf; |
| int size; |
| - u8 irqn; |
| + unsigned int irqn; |
| u8 eqn; |
| int nent; |
| u64 mask; |
| @@ -738,7 +738,8 @@ int mlx5_create_map_eq(struct mlx5_core_ |
| int mlx5_destroy_unmap_eq(struct mlx5_core_dev *dev, struct mlx5_eq *eq); |
| int mlx5_start_eqs(struct mlx5_core_dev *dev); |
| int mlx5_stop_eqs(struct mlx5_core_dev *dev); |
| -int mlx5_vector2eqn(struct mlx5_core_dev *dev, int vector, int *eqn, int *irqn); |
| +int mlx5_vector2eqn(struct mlx5_core_dev *dev, int vector, int *eqn, |
| + unsigned int *irqn); |
| int mlx5_core_attach_mcg(struct mlx5_core_dev *dev, union ib_gid *mgid, u32 qpn); |
| int mlx5_core_detach_mcg(struct mlx5_core_dev *dev, union ib_gid *mgid, u32 qpn); |
| |