From patchwork Wed Jun 20 21:38:32 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Keith Busch X-Patchwork-Id: 10478755 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.web.codeaurora.org (Postfix) with ESMTP id 36177600F6 for ; Wed, 20 Jun 2018 21:35:38 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 276D427CF3 for ; Wed, 20 Jun 2018 21:35:38 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 1B460290DC; Wed, 20 Jun 2018 21:35:38 +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 B0BF427CF3 for ; Wed, 20 Jun 2018 21:35:37 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S933402AbeFTVff (ORCPT ); Wed, 20 Jun 2018 17:35:35 -0400 Received: from mga03.intel.com ([134.134.136.65]:20585 "EHLO mga03.intel.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S933451AbeFTVfY (ORCPT ); Wed, 20 Jun 2018 17:35:24 -0400 X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False Received: from fmsmga005.fm.intel.com ([10.253.24.32]) by orsmga103.jf.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 20 Jun 2018 14:35:23 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.51,249,1526367600"; d="scan'208";a="238905927" Received: from unknown (HELO localhost.lm.intel.com) ([10.232.112.44]) by fmsmga005.fm.intel.com with ESMTP; 20 Jun 2018 14:35:23 -0700 From: Keith Busch To: Linux PCI , Bjorn Helgaas Cc: Sinan Kaya , Oza Pawandeep , Keith Busch Subject: [PATCH 6/7] PCI/DPC: Use threaded IRQ for bottom half handling Date: Wed, 20 Jun 2018 15:38:32 -0600 Message-Id: <20180620213833.25072-6-keith.busch@intel.com> X-Mailer: git-send-email 2.13.6 In-Reply-To: <20180620213833.25072-1-keith.busch@intel.com> References: <20180620213833.25072-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 This patch removes the work struct that was being used to handle a DPC event and uses a threaded IRQ instead for the purpose. Signed-off-by: Keith Busch --- drivers/pci/pcie/dpc.c | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/drivers/pci/pcie/dpc.c b/drivers/pci/pcie/dpc.c index f6098dd171f3..348b59954961 100644 --- a/drivers/pci/pcie/dpc.c +++ b/drivers/pci/pcie/dpc.c @@ -17,7 +17,6 @@ struct dpc_dev { struct pcie_device *dev; - struct work_struct work; u16 cap_pos; bool rp_extensions; u8 rp_log_size; @@ -160,10 +159,10 @@ static void dpc_process_rp_pio_error(struct dpc_dev *dpc) pci_write_config_dword(pdev, cap + PCI_EXP_DPC_RP_PIO_STATUS, status); } -static void dpc_work(struct work_struct *work) +static irqreturn_t dpc_handler(int irq, void *context) { struct aer_err_info info; - struct dpc_dev *dpc = container_of(work, struct dpc_dev, work); + struct dpc_dev *dpc = (struct dpc_dev *)context; struct pci_dev *pdev = dpc->dev->port; struct device *dev = &dpc->dev->device; u16 cap = dpc->cap_pos, status, source, reason, ext_reason; @@ -194,6 +193,8 @@ static void dpc_work(struct work_struct *work) /* We configure DPC so it only triggers on ERR_FATAL */ pcie_do_fatal_recovery(pdev, PCIE_PORT_SERVICE_DPC); + + return IRQ_HANDLED; } static irqreturn_t dpc_irq(int irq, void *context) @@ -210,7 +211,7 @@ static irqreturn_t dpc_irq(int irq, void *context) pci_write_config_word(pdev, cap + PCI_EXP_DPC_STATUS, PCI_EXP_DPC_STATUS_INTERRUPT); if (status & PCI_EXP_DPC_STATUS_TRIGGER) - schedule_work(&dpc->work); + return IRQ_WAKE_THREAD; return IRQ_HANDLED; } @@ -232,11 +233,11 @@ static int dpc_probe(struct pcie_device *dev) dpc->cap_pos = pci_find_ext_capability(pdev, PCI_EXT_CAP_ID_DPC); dpc->dev = dev; - INIT_WORK(&dpc->work, dpc_work); set_service_data(dev, dpc); - status = devm_request_irq(device, dev->irq, dpc_irq, IRQF_SHARED, - "pcie-dpc", dpc); + status = devm_request_threaded_irq(device, dev->irq, dpc_irq, + dpc_handler, IRQF_SHARED, + "pcie-dpc", dpc); if (status) { dev_warn(device, "request IRQ%d failed: %d\n", dev->irq, status);