net/mlx5_core: Fix trimming down IRQ number
authorDoron Tsur <doront@mellanox.com>
Sun, 17 Jan 2016 09:25:47 +0000 (11:25 +0200)
committerDavid S. Miller <davem@davemloft.net>
Sun, 17 Jan 2016 17:08:04 +0000 (12:08 -0500)
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>
drivers/infiniband/hw/mlx5/cq.c
drivers/net/ethernet/mellanox/mlx5/core/en_main.c
drivers/net/ethernet/mellanox/mlx5/core/main.c
include/linux/mlx5/cq.h
include/linux/mlx5/driver.h

index 3dfd287256d628892823173a4794620b4e22849e..92ddae101ecc7dc6032705e56a2c75d46fd0bf71 100644 (file)
@@ -756,7 +756,7 @@ struct ib_cq *mlx5_ib_create_cq(struct ib_device *ibdev,
        int uninitialized_var(index);
        int uninitialized_var(inlen);
        int cqe_size;
-       int irqn;
+       unsigned int irqn;
        int eqn;
        int err;
 
index 5c74a734f1589c14be7ab60e07ed966eaba1b006..c56d91a2812b04bf0857be048a7fb11fc8b2c1d0 100644 (file)
@@ -752,7 +752,7 @@ static int mlx5e_create_cq(struct mlx5e_channel *c,
        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;
 
@@ -806,7 +806,7 @@ static int mlx5e_enable_cq(struct mlx5e_cq *cq, struct mlx5e_cq_param *param)
        void *in;
        void *cqc;
        int inlen;
-       int irqn_not_used;
+       unsigned int irqn_not_used;
        int eqn;
        int err;
 
@@ -1517,7 +1517,7 @@ static int mlx5e_create_drop_cq(struct mlx5e_priv *priv,
        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, &param->wq, param->cqc, &cq->wq,
index 67676cf0d507b99d35582534dd8e1f5e889bd33c..b37749a3730e576ef798d02ae380caad91d44fbf 100644 (file)
@@ -585,7 +585,8 @@ static void mlx5_irq_clear_affinity_hints(struct mlx5_core_dev *mdev)
                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;
index abc4767695e4bcd6a53fa1eaf8bd8d7809349d26..b2c9fada8eac36b282c5cc05ffe6b7142f456805 100644 (file)
@@ -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;
index 2fd7019f69dbf1e40fbf1a64cfb9b4ec39938f92..5162f3533042825d03ea5c6244d1735bd55a8663 100644 (file)
@@ -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;
@@ -783,7 +783,8 @@ int mlx5_create_map_eq(struct mlx5_core_dev *dev, struct mlx5_eq *eq, u8 vecidx,
 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);