From patchwork Tue Sep 18 23:58:48 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Keith Busch X-Patchwork-Id: 10605091 X-Patchwork-Delegate: bhelgaas@google.com Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 81418112B for ; Tue, 18 Sep 2018 23:59:00 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 6E9AB2BB9F for ; Tue, 18 Sep 2018 23:59:00 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 62BF32BC29; Tue, 18 Sep 2018 23:59:00 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-7.9 required=2.0 tests=BAYES_00,MAILING_LIST_MULTI, RCVD_IN_DNSWL_HI autolearn=ham version=3.3.1 Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id E25A52BB9F for ; Tue, 18 Sep 2018 23:58:59 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726960AbeISFeA (ORCPT ); Wed, 19 Sep 2018 01:34:00 -0400 Received: from mga05.intel.com ([192.55.52.43]:41235 "EHLO mga05.intel.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1727204AbeISFeA (ORCPT ); Wed, 19 Sep 2018 01:34:00 -0400 X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False Received: from orsmga007.jf.intel.com ([10.7.209.58]) by fmsmga105.fm.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 18 Sep 2018 16:58:57 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.53,391,1531810800"; d="scan'208";a="74110600" Received: from unknown (HELO localhost.lm.intel.com) ([10.232.112.44]) by orsmga007.jf.intel.com with ESMTP; 18 Sep 2018 16:57:13 -0700 From: Keith Busch To: Linux PCI , Bjorn Helgaas Cc: Benjamin Herrenschmidt , Sinan Kaya , Thomas Tai , poza@codeaurora.org, Lukas Wunner , Christoph Hellwig , Mika Westerberg , Keith Busch Subject: [PATCH 12/12] PCI/pciehp: Use device managed allocations Date: Tue, 18 Sep 2018 17:58:48 -0600 Message-Id: <20180918235848.26694-13-keith.busch@intel.com> X-Mailer: git-send-email 2.13.6 In-Reply-To: <20180918235848.26694-1-keith.busch@intel.com> References: <20180918235848.26694-1-keith.busch@intel.com> Sender: linux-pci-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-pci@vger.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP All of pciehp's resources are tied to the lifetime of the device it is driving. This patch simplifies the resource tracking by using the device managed resource allocations. Signed-off-by: Keith Busch --- drivers/pci/hotplug/pciehp_core.c | 14 +++--------- drivers/pci/hotplug/pciehp_hpc.c | 48 +++++++++++---------------------------- 2 files changed, 16 insertions(+), 46 deletions(-) diff --git a/drivers/pci/hotplug/pciehp_core.c b/drivers/pci/hotplug/pciehp_core.c index 334044814dbe..c9ae89f25e8c 100644 --- a/drivers/pci/hotplug/pciehp_core.c +++ b/drivers/pci/hotplug/pciehp_core.c @@ -58,16 +58,16 @@ static int init_slot(struct controller *ctrl) char name[SLOT_NAME_SIZE]; int retval = -ENOMEM; - hotplug = kzalloc(sizeof(*hotplug), GFP_KERNEL); + hotplug = devm_kzalloc(&ctrl->pcie->device, sizeof(*hotplug), GFP_KERNEL); if (!hotplug) goto out; - info = kzalloc(sizeof(*info), GFP_KERNEL); + info = devm_kzalloc(&ctrl->pcie->device, sizeof(*info), GFP_KERNEL); if (!info) goto out; /* Setup hotplug slot ops */ - ops = kzalloc(sizeof(*ops), GFP_KERNEL); + ops = devm_kzalloc(&ctrl->pcie->device, sizeof(*ops), GFP_KERNEL); if (!ops) goto out; @@ -98,11 +98,6 @@ static int init_slot(struct controller *ctrl) if (retval) ctrl_err(ctrl, "pci_hp_initialize failed: error %d\n", retval); out: - if (retval) { - kfree(ops); - kfree(info); - kfree(hotplug); - } return retval; } @@ -111,9 +106,6 @@ static void cleanup_slot(struct controller *ctrl) struct hotplug_slot *hotplug_slot = ctrl->slot->hotplug_slot; pci_hp_destroy(hotplug_slot); - kfree(hotplug_slot->ops); - kfree(hotplug_slot->info); - kfree(hotplug_slot); } /* diff --git a/drivers/pci/hotplug/pciehp_hpc.c b/drivers/pci/hotplug/pciehp_hpc.c index 13650f079188..72c22e9c0b63 100644 --- a/drivers/pci/hotplug/pciehp_hpc.c +++ b/drivers/pci/hotplug/pciehp_hpc.c @@ -45,22 +45,15 @@ static inline int pciehp_request_irq(struct controller *ctrl) } /* Installs the interrupt handler */ - retval = request_threaded_irq(irq, pciehp_isr, pciehp_ist, - IRQF_SHARED, MY_NAME, ctrl); + retval = devm_request_threaded_irq(&ctrl->pcie->device, irq, pciehp_isr, + pciehp_ist, IRQF_SHARED, MY_NAME, + ctrl); if (retval) ctrl_err(ctrl, "Cannot get irq %d for the hotplug controller\n", irq); return retval; } -static inline void pciehp_free_irq(struct controller *ctrl) -{ - if (pciehp_poll_mode) - kthread_stop(ctrl->poll_thread); - else - free_irq(ctrl->pcie->irq, ctrl); -} - static int pcie_poll_cmd(struct controller *ctrl, int timeout) { struct pci_dev *pdev = ctrl_dev(ctrl); @@ -780,17 +773,14 @@ int pcie_init_notification(struct controller *ctrl) if (pciehp_request_irq(ctrl)) return -1; pcie_enable_notification(ctrl); - ctrl->notification_enabled = 1; return 0; } void pcie_shutdown_notification(struct controller *ctrl) { - if (ctrl->notification_enabled) { - pcie_disable_notification(ctrl); - pciehp_free_irq(ctrl); - ctrl->notification_enabled = 0; - } + pcie_disable_notification(ctrl); + if (pciehp_poll_mode) + kthread_stop(ctrl->poll_thread); } static int pcie_init_slot(struct controller *ctrl) @@ -798,7 +788,7 @@ static int pcie_init_slot(struct controller *ctrl) struct pci_bus *subordinate = ctrl_dev(ctrl)->subordinate; struct slot *slot; - slot = kzalloc(sizeof(*slot), GFP_KERNEL); + slot = devm_kzalloc(&ctrl->pcie->device, sizeof(*slot), GFP_KERNEL); if (!slot) return -ENOMEM; @@ -813,14 +803,6 @@ static int pcie_init_slot(struct controller *ctrl) return 0; } -static void pcie_cleanup_slot(struct controller *ctrl) -{ - struct slot *slot = ctrl->slot; - - cancel_delayed_work_sync(&slot->work); - kfree(slot); -} - static inline void dbg_ctrl(struct controller *ctrl) { struct pci_dev *pdev = ctrl->pcie->port; @@ -845,9 +827,9 @@ struct controller *pcie_init(struct pcie_device *dev) u8 occupied, poweron; struct pci_dev *pdev = dev->port; - ctrl = kzalloc(sizeof(*ctrl), GFP_KERNEL); + ctrl = devm_kzalloc(&dev->device, sizeof(*ctrl), GFP_KERNEL); if (!ctrl) - goto abort; + return NULL; ctrl->pcie = dev; pcie_capability_read_dword(pdev, PCI_EXP_SLTCAP, &slot_cap); @@ -893,7 +875,7 @@ struct controller *pcie_init(struct pcie_device *dev) pdev->broken_cmd_compl ? " (with Cmd Compl erratum)" : ""); if (pcie_init_slot(ctrl)) - goto abort_ctrl; + return NULL; /* * If empty slot's power status is on, turn power off. The IRQ isn't @@ -909,17 +891,13 @@ struct controller *pcie_init(struct pcie_device *dev) } return ctrl; - -abort_ctrl: - kfree(ctrl); -abort: - return NULL; } void pciehp_release_ctrl(struct controller *ctrl) { - pcie_cleanup_slot(ctrl); - kfree(ctrl); + struct slot *slot = ctrl->slot; + + cancel_delayed_work_sync(&slot->work); } static void quirk_cmd_compl(struct pci_dev *pdev)