lkml.org 
[lkml]   [2018]   [Feb]   [28]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Date
    Subject[PATCH 3.16 134/254] net/mlx5: Cleanup IRQs in case of unload failure
    3.16.55-rc1 review patch.  If anyone has any objections, please let me know.

    ------------------

    From: Moshe Shemesh <moshe@mellanox.com>

    commit d6b2785cd55ee72e9608762650b3ef299f801b1b upstream.

    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>
    [bwh: Backported to 3.16: there's no pfault_eq]
    Signed-off-by: Ben Hutchings <ben@decadent.org.uk>
    ---
    --- a/drivers/net/ethernet/mellanox/mlx5/core/eq.c
    +++ b/drivers/net/ethernet/mellanox/mlx5/core/eq.c
    @@ -485,23 +485,28 @@ 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;

    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,
    --- a/include/linux/mlx5/driver.h
    +++ b/include/linux/mlx5/driver.h
    @@ -759,7 +759,7 @@ int mlx5_create_map_eq(struct mlx5_core_
    int nent, u64 mask, const char *name, struct mlx5_uar *uar);
    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_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);

    \
     
     \ /
      Last update: 2018-02-28 18:09    [W:4.146 / U:0.568 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site