From patchwork Wed Mar 12 03:42:21 2014 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: clsoto@linux.vnet.ibm.com X-Patchwork-Id: 3815341 Return-Path: X-Original-To: patchwork-linux-rdma@patchwork.kernel.org Delivered-To: patchwork-parsemail@patchwork2.web.kernel.org Received: from mail.kernel.org (mail.kernel.org [198.145.19.201]) by patchwork2.web.kernel.org (Postfix) with ESMTP id BF24DBF540 for ; Wed, 12 Mar 2014 03:58:43 +0000 (UTC) Received: from mail.kernel.org (localhost [127.0.0.1]) by mail.kernel.org (Postfix) with ESMTP id C6E282028D for ; Wed, 12 Mar 2014 03:58:42 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id E17262026F for ; Wed, 12 Mar 2014 03:58:41 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1753094AbaCLD60 (ORCPT ); Tue, 11 Mar 2014 23:58:26 -0400 Received: from [32.97.110.57] ([32.97.110.57]:60355 "HELO jupiter1-lp2.austin.ibm.com" rhost-flags-FAIL-FAIL-OK-FAIL) by vger.kernel.org with SMTP id S1752154AbaCLD6Z (ORCPT ); Tue, 11 Mar 2014 23:58:25 -0400 X-Greylist: delayed 599 seconds by postgrey-1.27 at vger.kernel.org; Tue, 11 Mar 2014 23:58:15 EDT Received: by jupiter1-lp2.austin.ibm.com (Postfix, from userid 0) id 595FD12D153; Tue, 11 Mar 2014 22:45:12 -0500 (CDT) Message-Id: <20140312034512.232925284@linux.vnet.ibm.com> References: <20140312034219.637916521@linux.vnet.ibm.com> User-Agent: quilt/0.46-1 Date: Tue, 11 Mar 2014 22:42:21 -0500 From: clsoto@linux.vnet.ibm.com To: eli@mellanox.com, roland@kernel.org, sean.hefty@intel.com, hal.rosenstock@gmail.com, linux-rdma@vger.kernel.org, netdev@vger.kernel.org Cc: brking@linux.vnet.ibm.com, Carol Soto Subject: [Patch 2/2] IB/mlx5: Free resources during PCI error Content-Disposition: inline; filename=ib_mlx5_free_resources_during_pci_error.patch Sender: linux-rdma-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-rdma@vger.kernel.org X-Spam-Status: No, score=-6.9 required=5.0 tests=BAYES_00, RCVD_IN_DNSWL_HI, T_RP_MATCHES_RCVD, UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on mail.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP This patch is to make sure that during a pci error, the remove_one function frees the resources even though the hardware command failed to avoid memory leaks when the adapter recovers. Also make sure that remove_one function goes thru all the functions like disable all irqs and disable pci so when the remove_one function is done then the eehd daemon will continue the recovery process. Signed-off-by: Carol Soto --- drivers/infiniband/hw/mlx5/mr.c | 9 ++++++--- drivers/infiniband/hw/mlx5/qp.c | 6 +++++- drivers/net/ethernet/mellanox/mlx5/core/eq.c | 8 +++----- drivers/net/ethernet/mellanox/mlx5/core/main.c | 1 - include/linux/mlx5/driver.h | 2 +- 5 files changed, 15 insertions(+), 11 deletions(-) Index: b/drivers/infiniband/hw/mlx5/mr.c =================================================================== --- a/drivers/infiniband/hw/mlx5/mr.c +++ b/drivers/infiniband/hw/mlx5/mr.c @@ -471,9 +471,12 @@ static void clean_keys(struct mlx5_ib_de ent->size--; spin_unlock_irq(&ent->lock); err = mlx5_core_destroy_mkey(&dev->mdev, &mr->mmr); - if (err) - mlx5_ib_warn(dev, "failed destroy mkey\n"); - else + if (err) { + if (pci_channel_offline(dev->mdev.pdev)) + kfree(mr); + else + mlx5_ib_warn(dev, "failed destroy mkey\n"); + } else kfree(mr); } } Index: b/drivers/infiniband/hw/mlx5/qp.c =================================================================== --- a/drivers/infiniband/hw/mlx5/qp.c +++ b/drivers/infiniband/hw/mlx5/qp.c @@ -2564,7 +2564,11 @@ int mlx5_ib_dealloc_xrcd(struct ib_xrcd err = mlx5_core_xrcd_dealloc(&dev->mdev, xrcdn); if (err) { - mlx5_ib_warn(dev, "failed to dealloc xrcdn 0x%x\n", xrcdn); + if (pci_channel_offline(dev->mdev.pdev)) + kfree(xrcd); + else + mlx5_ib_warn(dev, "failed to dealloc xrcdn 0x%x\n", + xrcdn); return err; } Index: b/drivers/net/ethernet/mellanox/mlx5/core/eq.c =================================================================== --- a/drivers/net/ethernet/mellanox/mlx5/core/eq.c +++ b/drivers/net/ethernet/mellanox/mlx5/core/eq.c @@ -482,14 +482,12 @@ 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_destroy_unmap_eq(dev, &table->pages_eq); mlx5_destroy_unmap_eq(dev, &table->async_eq); mlx5_cmd_use_polling(dev); @@ -498,7 +496,7 @@ int mlx5_stop_eqs(struct mlx5_core_dev * if (err) mlx5_cmd_use_events(dev); - return err; + return; } int mlx5_core_eq_query(struct mlx5_core_dev *dev, struct mlx5_eq *eq, Index: b/drivers/net/ethernet/mellanox/mlx5/core/main.c =================================================================== --- a/drivers/net/ethernet/mellanox/mlx5/core/main.c +++ b/drivers/net/ethernet/mellanox/mlx5/core/main.c @@ -508,7 +508,6 @@ void mlx5_dev_cleanup(struct mlx5_core_d mlx5_stop_health_poll(dev); if (mlx5_cmd_teardown_hca(dev)) { dev_err(&dev->pdev->dev, "tear_down_hca failed, skip cleanup\n"); - return; } mlx5_pagealloc_stop(dev); mlx5_reclaim_startup_pages(dev); Index: b/include/linux/mlx5/driver.h =================================================================== --- a/include/linux/mlx5/driver.h +++ b/include/linux/mlx5/driver.h @@ -721,7 +721,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);