lkml.org 
[lkml]   [2018]   [Feb]   [3]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH AUTOSEL for 4.14 042/110] net/mlx5: Cleanup IRQs in case of unload failure
    Date
    From: Moshe Shemesh <moshe@mellanox.com>

    [ Upstream commit d6b2785cd55ee72e9608762650b3ef299f801b1b ]

    When mlx5_stop_eqs fails to destroy any of the eqs it returns with an error.
    In such failure flow the function will return without
    releasing all EQs irqs and then pci_free_irq_vectors will fail.
    Fix by only warn on destroy EQ failure and continue to release other
    EQs and their irqs.

    It fixes the following kernel trace:
    kernel: kernel BUG at drivers/pci/msi.c:352!
    ...
    ...
    kernel: Call Trace:
    kernel: pci_disable_msix+0xd3/0x100
    kernel: pci_free_irq_vectors+0xe/0x20
    kernel: mlx5_load_one.isra.17+0x9f5/0xec0 [mlx5_core]

    Fixes: e126ba97dba9 ("mlx5: Add driver for Mellanox Connect-IB adapters")
    Signed-off-by: Moshe Shemesh <moshe@mellanox.com>
    Signed-off-by: Saeed Mahameed <saeedm@mellanox.com>
    Signed-off-by: Sasha Levin <alexander.levin@microsoft.com>
    ---
    drivers/net/ethernet/mellanox/mlx5/core/eq.c | 20 +++++++++++++-------
    include/linux/mlx5/driver.h | 2 +-
    2 files changed, 14 insertions(+), 8 deletions(-)

    diff --git a/drivers/net/ethernet/mellanox/mlx5/core/eq.c b/drivers/net/ethernet/mellanox/mlx5/core/eq.c
    index fc606bfd1d6e..494726f02e3e 100644
    --- a/drivers/net/ethernet/mellanox/mlx5/core/eq.c
    +++ b/drivers/net/ethernet/mellanox/mlx5/core/eq.c
    @@ -776,7 +776,7 @@ err1:
    return err;
    }

    -int mlx5_stop_eqs(struct mlx5_core_dev *dev)
    +void mlx5_stop_eqs(struct mlx5_core_dev *dev)
    {
    struct mlx5_eq_table *table = &dev->priv.eq_table;
    int err;
    @@ -785,22 +785,28 @@ int mlx5_stop_eqs(struct mlx5_core_dev *dev)
    if (MLX5_CAP_GEN(dev, pg)) {
    err = mlx5_destroy_unmap_eq(dev, &table->pfault_eq);
    if (err)
    - return err;
    + mlx5_core_err(dev, "failed to destroy page fault eq, err(%d)\n",
    + err);
    }
    #endif

    err = mlx5_destroy_unmap_eq(dev, &table->pages_eq);
    if (err)
    - return err;
    + mlx5_core_err(dev, "failed to destroy pages eq, err(%d)\n",
    + err);

    - mlx5_destroy_unmap_eq(dev, &table->async_eq);
    + err = mlx5_destroy_unmap_eq(dev, &table->async_eq);
    + if (err)
    + mlx5_core_err(dev, "failed to destroy async eq, err(%d)\n",
    + err);
    mlx5_cmd_use_polling(dev);

    err = mlx5_destroy_unmap_eq(dev, &table->cmd_eq);
    - if (err)
    + if (err) {
    + mlx5_core_err(dev, "failed to destroy command eq, err(%d)\n",
    + err);
    mlx5_cmd_use_events(dev);
    -
    - return err;
    + }
    }

    int mlx5_core_eq_query(struct mlx5_core_dev *dev, struct mlx5_eq *eq,
    diff --git a/include/linux/mlx5/driver.h b/include/linux/mlx5/driver.h
    index a13525daf09b..574a01caa193 100644
    --- a/include/linux/mlx5/driver.h
    +++ b/include/linux/mlx5/driver.h
    @@ -1017,7 +1017,7 @@ int mlx5_create_map_eq(struct mlx5_core_dev *dev, struct mlx5_eq *eq, u8 vecidx,
    enum mlx5_eq_type type);
    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);
    +void mlx5_stop_eqs(struct mlx5_core_dev *dev);
    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);
    --
    2.11.0
    \
     
     \ /
      Last update: 2018-02-03 19:50    [W:2.959 / U:0.088 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site