From nobody Mon Apr 6 21:13:05 2026 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 9C0EEC433F5 for ; Thu, 6 Oct 2022 13:50:00 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S231500AbiJFNt4 (ORCPT ); Thu, 6 Oct 2022 09:49:56 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:48372 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S231512AbiJFNtw (ORCPT ); Thu, 6 Oct 2022 09:49:52 -0400 Received: from mail-pj1-x102e.google.com (mail-pj1-x102e.google.com [IPv6:2607:f8b0:4864:20::102e]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id B82A2B493 for ; Thu, 6 Oct 2022 06:49:46 -0700 (PDT) Received: by mail-pj1-x102e.google.com with SMTP id x1-20020a17090ab00100b001fda21bbc90so4386324pjq.3 for ; Thu, 06 Oct 2022 06:49:46 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date; bh=pAOyHNo2Ogz8benvCK0BMK/ZXWCdH9NtvY9tUBlmQgQ=; b=oTowoydDyAkpARgML6g7GzRmeF311CW8HrohiULAiRheYMxj6z6voHc8PfiRDQLJZk SeZw8sGXTS3+F0uR90r3XWrTaDY+dMkWEyHdsEzIWq0bDGc+Yhy18zyRhJLUrTfv0mJ6 wyjZegco+9RmBprKj1PbsUoZN0s6CuT76Y9ONE9W/0IZzsP11OcW8DazvxDUTIteCNg7 gS8ZYO8ClzaVr4ppD82Ji05lS2BlZ6IqNH5y520tFmU3NMXffLvKS4t/47riODMHPhb/ ephjK7oyDc5COw37/or/6RQhjg5/yuN1Ga03gPyTPPStucja6tvOt6HRcywSaaArQrIu +qDQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date; bh=pAOyHNo2Ogz8benvCK0BMK/ZXWCdH9NtvY9tUBlmQgQ=; b=ocUJDsOvZR/RfO4kQmrFkaGJ8ZuM2aYMSAVrykENRiiB9sKyOkwE3q8kW9PZRZkIHG EAFgQqGgC72hi5AH7Dcs6a2xjJTm7f4A+ngnPChuPQMQQb5iUx0tpxLp11CUh33PGo39 YQ4kIvRAH2ftjg5Cu9Zq/1EOg6YJwl9SFM/WVsIHaPLCJvo0ye1ZqZbQBXwrveNmIt82 k9W/gaHaWUUJEiiBSCn8I/Chc0n5gEWAgZ4XH0LbZQBUC4hwjM3HBeT7wQ2N4zuGIvSZ wliK5qVOpRsIpb0yb+PVJL7yYEJZ6KNWOdf/a479x5+iwkybfIMJ67bHl0zkBx1PWku1 errA== X-Gm-Message-State: ACrzQf3gAk54PCDYwUWyUVtRTb1mqJRbC14pcaUfE0nn0nSvGnVAUnZ2 fSG7kRR0y3k3QURGjSThy+K1 X-Google-Smtp-Source: AMsMyM5cCrhHsinO11H0aWRdW1l/kf7wzsq5ZSXzHZMnGUbODs1FP0WILk8VIRrN2z+giOjEXAHBxw== X-Received: by 2002:a17:90b:1d85:b0:20b:20b0:29cd with SMTP id pf5-20020a17090b1d8500b0020b20b029cdmr580300pjb.131.1665064185925; Thu, 06 Oct 2022 06:49:45 -0700 (PDT) Received: from localhost.localdomain ([220.158.158.220]) by smtp.gmail.com with ESMTPSA id k25-20020a635a59000000b00434760ee36asm1874053pgm.16.2022.10.06.06.49.41 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 06 Oct 2022 06:49:44 -0700 (PDT) From: Manivannan Sadhasivam To: kishon@kernel.org, lpieralisi@kernel.org, bhelgaas@google.com Cc: linux-pci@vger.kernel.org, linux-kernel@vger.kernel.org, kw@linux.com, robh@kernel.org, vidyas@nvidia.com, vigneshr@ti.com, Manivannan Sadhasivam Subject: [PATCH v3 1/5] PCI: dra7xx: Use threaded IRQ handler for "dra7xx-pcie-main" IRQ Date: Thu, 6 Oct 2022 19:19:23 +0530 Message-Id: <20221006134927.41437-2-manivannan.sadhasivam@linaro.org> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20221006134927.41437-1-manivannan.sadhasivam@linaro.org> References: <20221006134927.41437-1-manivannan.sadhasivam@linaro.org> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" The "dra7xx-pcie-main" hard IRQ handler is just printing the IRQ status and calling the dw_pcie_ep_linkup() API if LINK_UP status is set. But the execution of dw_pcie_ep_linkup() depends on the EPF driver and may take more time depending on the EPF implementation. In general, hard IRQ handlers are supposed to return quickly and not block for so long. Moreover, there is no real need of the current IRQ handler to be a hard IRQ handler. So switch to the threaded IRQ handler for the "dra7xx-pcie-main" IRQ. Signed-off-by: Manivannan Sadhasivam Acked-by: Kishon Vijay Abraham I --- drivers/pci/controller/dwc/pci-dra7xx.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/pci/controller/dwc/pci-dra7xx.c b/drivers/pci/controll= er/dwc/pci-dra7xx.c index 38462ed11d07..4ae807e7cf79 100644 --- a/drivers/pci/controller/dwc/pci-dra7xx.c +++ b/drivers/pci/controller/dwc/pci-dra7xx.c @@ -840,7 +840,7 @@ static int dra7xx_pcie_probe(struct platform_device *pd= ev) } dra7xx->mode =3D mode; =20 - ret =3D devm_request_irq(dev, irq, dra7xx_pcie_irq_handler, + ret =3D devm_request_threaded_irq(dev, irq, NULL, dra7xx_pcie_irq_handler, IRQF_SHARED, "dra7xx-pcie-main", dra7xx); if (ret) { dev_err(dev, "failed to request irq\n"); --=20 2.25.1 From nobody Mon Apr 6 21:13:05 2026 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 86749C433FE for ; Thu, 6 Oct 2022 13:50:15 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S229510AbiJFNuN (ORCPT ); Thu, 6 Oct 2022 09:50:13 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:50042 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S231600AbiJFNuF (ORCPT ); Thu, 6 Oct 2022 09:50:05 -0400 Received: from mail-pj1-x102e.google.com (mail-pj1-x102e.google.com [IPv6:2607:f8b0:4864:20::102e]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 92F6114D2F for ; Thu, 6 Oct 2022 06:49:52 -0700 (PDT) Received: by mail-pj1-x102e.google.com with SMTP id x1-20020a17090ab00100b001fda21bbc90so4386600pjq.3 for ; Thu, 06 Oct 2022 06:49:52 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date; bh=PFAW0jcwtPS3OhOTEsyS1TaHRevCT8P/51hfS6qzO/0=; b=XbL5jZNUUKXEiK1u2yAh2XjMo9JrXVhEG6s45pdssMhcckLQfzKl5TyNqp9xhLguG9 ov6efDxeJ/OpTauHbeWKGubyk8nmkZ0frvB0931/42GCU57aK6jZmmRo3EFq0Wvrk/sQ VveP+1s1nqV3fnYAbx7ypCAZ6ZuRFEh6L0VeoWsPg6P8u34Q5ByaRzYQNEV3kp8I7n2u SHIQ/piSpxgfOgTtTfDazd5KPaVJ6aGCsIamTS1HLctAbMOyWeXIHxSQVEH7KzUbCvqA 7pF/b/C78Bfq9nQctz1ynXZDPLyzvd54oOeF/pJMBz2+1jgUkgwUUliCH6+OvmItDzjG f5Pw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date; bh=PFAW0jcwtPS3OhOTEsyS1TaHRevCT8P/51hfS6qzO/0=; b=4qTg6CwB9q9BHOGNjcsoUTi9SWG7aH3YrAa+FNiYPJvze9aY5dXJRpuVH+hhJB50Le IMlxHTQbp/W2+Hju8xFmRBiRjicHNa777oGjeisKMUm4ZqKqKQZTc2/N+Xf5+D2yqAj5 KQgQECpBfGieVp4Q/taPbJp/RTVbuOYfBdVIko3tW345paNdgIAYiw59eEcv363ndJdY 7tNtDWheJd+4KfkQv5eu8k5/fQDpMDjun8FQ03m7dlzQ01OtPcJzZS0uByUYMsou5g4h SA5BmmXxLL7pHy85zQrf9eJrgA2uND+ld+TB4RxK3HSuHP6GQSLQycLgvHIbyQBspJ9x VyWw== X-Gm-Message-State: ACrzQf06wXYH0bXzS/e+ubJ78aicJWzw01/14o1KWdM4uglwYp2KF81L IIJgq7XicBU3e6kzmwp8QavF X-Google-Smtp-Source: AMsMyM5xaxKXrosoPmAx2Qu5DUI+EN+99LbrZR2mjLKSwZpFm2w1XpzWVVo9XnEfhsv6NC31xPKYOg== X-Received: by 2002:a17:903:2d1:b0:17d:ba07:42d4 with SMTP id s17-20020a17090302d100b0017dba0742d4mr4859423plk.92.1665064191962; Thu, 06 Oct 2022 06:49:51 -0700 (PDT) Received: from localhost.localdomain ([220.158.158.220]) by smtp.gmail.com with ESMTPSA id k25-20020a635a59000000b00434760ee36asm1874053pgm.16.2022.10.06.06.49.46 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 06 Oct 2022 06:49:49 -0700 (PDT) From: Manivannan Sadhasivam To: kishon@kernel.org, lpieralisi@kernel.org, bhelgaas@google.com Cc: linux-pci@vger.kernel.org, linux-kernel@vger.kernel.org, kw@linux.com, robh@kernel.org, vidyas@nvidia.com, vigneshr@ti.com, Manivannan Sadhasivam Subject: [PATCH v3 2/5] PCI: tegra194: Move dw_pcie_ep_linkup() to threaded IRQ handler Date: Thu, 6 Oct 2022 19:19:24 +0530 Message-Id: <20221006134927.41437-3-manivannan.sadhasivam@linaro.org> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20221006134927.41437-1-manivannan.sadhasivam@linaro.org> References: <20221006134927.41437-1-manivannan.sadhasivam@linaro.org> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" dw_pcie_ep_linkup() may take more time to execute depending on the EPF driver implementation. Calling this API in the hard IRQ handler is not encouraged since the hard IRQ handlers are supposed to complete quickly. So move the dw_pcie_ep_linkup() call to threaded IRQ handler. Signed-off-by: Manivannan Sadhasivam --- drivers/pci/controller/dwc/pcie-tegra194.c | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/drivers/pci/controller/dwc/pcie-tegra194.c b/drivers/pci/contr= oller/dwc/pcie-tegra194.c index 1b6b437823d2..6a487f52e1fb 100644 --- a/drivers/pci/controller/dwc/pcie-tegra194.c +++ b/drivers/pci/controller/dwc/pcie-tegra194.c @@ -287,6 +287,7 @@ struct tegra_pcie_dw { struct gpio_desc *pex_refclk_sel_gpiod; unsigned int pex_rst_irq; int ep_state; + long link_status; }; =20 static inline struct tegra_pcie_dw *to_tegra_pcie(struct dw_pcie *pci) @@ -450,9 +451,13 @@ static void pex_ep_event_hot_rst_done(struct tegra_pci= e_dw *pcie) static irqreturn_t tegra_pcie_ep_irq_thread(int irq, void *arg) { struct tegra_pcie_dw *pcie =3D arg; + struct dw_pcie_ep *ep =3D &pcie->pci.ep; struct dw_pcie *pci =3D &pcie->pci; u32 val, speed; =20 + if (test_and_clear_bit(0, &pcie->link_status)) + dw_pcie_ep_linkup(ep); + speed =3D dw_pcie_readw_dbi(pci, pcie->pcie_cap_base + PCI_EXP_LNKSTA) & PCI_EXP_LNKSTA_CLS; clk_set_rate(pcie->core_clk, pcie_gen_freq[speed - 1]); @@ -499,7 +504,6 @@ static irqreturn_t tegra_pcie_ep_irq_thread(int irq, vo= id *arg) static irqreturn_t tegra_pcie_ep_hard_irq(int irq, void *arg) { struct tegra_pcie_dw *pcie =3D arg; - struct dw_pcie_ep *ep =3D &pcie->pci.ep; int spurious =3D 1; u32 status_l0, status_l1, link_status; =20 @@ -515,7 +519,7 @@ static irqreturn_t tegra_pcie_ep_hard_irq(int irq, void= *arg) link_status =3D appl_readl(pcie, APPL_LINK_STATUS); if (link_status & APPL_LINK_STATUS_RDLH_LINK_UP) { dev_dbg(pcie->dev, "Link is up with Host\n"); - dw_pcie_ep_linkup(ep); + set_bit(0, &pcie->link_status); } } =20 --=20 2.25.1 From nobody Mon Apr 6 21:13:05 2026 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 9AF57C4332F for ; Thu, 6 Oct 2022 13:50:20 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S231659AbiJFNuS (ORCPT ); Thu, 6 Oct 2022 09:50:18 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:50076 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S230472AbiJFNuJ (ORCPT ); Thu, 6 Oct 2022 09:50:09 -0400 Received: from mail-pj1-x102a.google.com (mail-pj1-x102a.google.com [IPv6:2607:f8b0:4864:20::102a]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 33255286CA for ; Thu, 6 Oct 2022 06:49:56 -0700 (PDT) Received: by mail-pj1-x102a.google.com with SMTP id a5-20020a17090aa50500b002008eeb040eso5000066pjq.1 for ; Thu, 06 Oct 2022 06:49:56 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date; bh=mWMJic3+3eVweR7Hb3wJwKAsDypmbh3PTgAfppiGim0=; b=ZkJ3eSSvWEQHG4zrCYO/rtAQMC+rTCblUgkXT/sojUfeAz6djcfzmaQhTE1VFhHlb5 c1atXYEjU3xEGE7hI13KaDEcIgKWkEtN1hvwHwEilxv96++sncyPLWqzhVGEXpdUs06G CdnNu3apyqKTZeVSCSOWHTmHzGnFe3F2KnJM3MWKtya9Y3YnYefumWTirYL9USS1lYub A/mEPLmhBfwN3a8nKOKM2rGPY5Mu7KrZF82KX4Ex4dyspcvVZE3FoiZPzuE8M8MOv+bw OGNw6BEO2hAZNd93A/lo5mHGoPx0ZTYnxKuuVNn8KZcYJUWz6h7H+Lqu3yOpWNU2Gh62 93nA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date; bh=mWMJic3+3eVweR7Hb3wJwKAsDypmbh3PTgAfppiGim0=; b=svI6PWebPisnhrMk85wGt/9l2v6BKfSSU1yQG5+bgV5EsV4zvtc/BrwMeLFImzS5bB X7jEeAhsLGJQhCqVUgVjMtSs7dkB2UGl9MlRu3oybFmLzP6jUvcWIniX4G6932UXsboi K6EdJU1GtlU3bK+5AdFqYfP+cvx1wvk7sOwW0wERIOpKDQofqeSm4wsyyZiR4THEYPtB lWFYirN/Ipj0pY5JcKi4GxC75qGW6sA+nzmbxsxXVIuMMO/sadm+0hCyj1EL9crPl0b3 +qF87NVRMl93E7kz75xxEYpqVENcZrnkjAL4d1H2L/h5vLbemSsFEJ3qEHdh6RqE4JN6 jnag== X-Gm-Message-State: ACrzQf1jIT99/Oopa6o/T7e5/UDISlpDI7tcQmJWC7TgbS1vVyLxI/fz +jsDYCGHZ+Yl0PP2gcP8imRk X-Google-Smtp-Source: AMsMyM6adD7Qiz1npAI/QIQqcXzzqSFAqQ7y/8Uf2egzhAubDRgCFWLfQ2y5Xniqseks4ePMXNdkGg== X-Received: by 2002:a17:90a:4b47:b0:20a:e47c:1450 with SMTP id o7-20020a17090a4b4700b0020ae47c1450mr10742123pjl.198.1665064195847; Thu, 06 Oct 2022 06:49:55 -0700 (PDT) Received: from localhost.localdomain ([220.158.158.220]) by smtp.gmail.com with ESMTPSA id k25-20020a635a59000000b00434760ee36asm1874053pgm.16.2022.10.06.06.49.52 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 06 Oct 2022 06:49:55 -0700 (PDT) From: Manivannan Sadhasivam To: kishon@kernel.org, lpieralisi@kernel.org, bhelgaas@google.com Cc: linux-pci@vger.kernel.org, linux-kernel@vger.kernel.org, kw@linux.com, robh@kernel.org, vidyas@nvidia.com, vigneshr@ti.com, Manivannan Sadhasivam Subject: [PATCH v3 3/5] PCI: endpoint: Use a separate lock for protecting epc->pci_epf list Date: Thu, 6 Oct 2022 19:19:25 +0530 Message-Id: <20221006134927.41437-4-manivannan.sadhasivam@linaro.org> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20221006134927.41437-1-manivannan.sadhasivam@linaro.org> References: <20221006134927.41437-1-manivannan.sadhasivam@linaro.org> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" The EPC controller maintains a list of EPF drivers added to it. For protecting this list against the concurrent accesses, the epc->lock (used for protecting epc_ops) has been used so far. Since there were no users trying to use epc_ops and modify the pci_epf list simultaneously, this was not an issue. But with the addition of callback mechanism for passing the events, this will be a problem. Because the pci_epf list needs to be iterated first for getting hold of the EPF driver and then the relevant event specific callback needs to be called for the driver. If the same epc->lock is used, then it will result in a deadlock scenario. For instance, ... mutex_lock(&epc->lock); list_for_each_entry(epf, &epc->pci_epf, list) { epf->event_ops->core_init(epf); | |-> pci_epc_set_bar(); | |-> mutex_lock(&epc->lock) # DEADLOCK ... So to fix this issue, use a separate lock called "list_lock" for protecting the pci_epf list against the concurrent accesses. This lock will also be used by the callback mechanism. Signed-off-by: Manivannan Sadhasivam Acked-by: Kishon Vijay Abraham I --- drivers/pci/endpoint/pci-epc-core.c | 9 +++++---- include/linux/pci-epc.h | 2 ++ 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/drivers/pci/endpoint/pci-epc-core.c b/drivers/pci/endpoint/pci= -epc-core.c index 3bc9273d0a08..6cce430d431b 100644 --- a/drivers/pci/endpoint/pci-epc-core.c +++ b/drivers/pci/endpoint/pci-epc-core.c @@ -613,7 +613,7 @@ int pci_epc_add_epf(struct pci_epc *epc, struct pci_epf= *epf, if (type =3D=3D SECONDARY_INTERFACE && epf->sec_epc) return -EBUSY; =20 - mutex_lock(&epc->lock); + mutex_lock(&epc->list_lock); func_no =3D find_first_zero_bit(&epc->function_num_map, BITS_PER_LONG); if (func_no >=3D BITS_PER_LONG) { @@ -640,7 +640,7 @@ int pci_epc_add_epf(struct pci_epc *epc, struct pci_epf= *epf, =20 list_add_tail(list, &epc->pci_epf); ret: - mutex_unlock(&epc->lock); + mutex_unlock(&epc->list_lock); =20 return ret; } @@ -672,11 +672,11 @@ void pci_epc_remove_epf(struct pci_epc *epc, struct p= ci_epf *epf, list =3D &epf->sec_epc_list; } =20 - mutex_lock(&epc->lock); + mutex_lock(&epc->list_lock); clear_bit(func_no, &epc->function_num_map); list_del(list); epf->epc =3D NULL; - mutex_unlock(&epc->lock); + mutex_unlock(&epc->list_lock); } EXPORT_SYMBOL_GPL(pci_epc_remove_epf); =20 @@ -773,6 +773,7 @@ __pci_epc_create(struct device *dev, const struct pci_e= pc_ops *ops, } =20 mutex_init(&epc->lock); + mutex_init(&epc->list_lock); INIT_LIST_HEAD(&epc->pci_epf); ATOMIC_INIT_NOTIFIER_HEAD(&epc->notifier); =20 diff --git a/include/linux/pci-epc.h b/include/linux/pci-epc.h index a48778e1a4ee..fe729dfe509b 100644 --- a/include/linux/pci-epc.h +++ b/include/linux/pci-epc.h @@ -122,6 +122,7 @@ struct pci_epc_mem { * struct pci_epc - represents the PCI EPC device * @dev: PCI EPC device * @pci_epf: list of endpoint functions present in this EPC device + * list_lock: Mutex for protecting pci_epf list * @ops: function pointers for performing endpoint operations * @windows: array of address space of the endpoint controller * @mem: first window of the endpoint controller, which corresponds to @@ -139,6 +140,7 @@ struct pci_epc_mem { struct pci_epc { struct device dev; struct list_head pci_epf; + struct mutex list_lock; const struct pci_epc_ops *ops; struct pci_epc_mem **windows; struct pci_epc_mem *mem; --=20 2.25.1 From nobody Mon Apr 6 21:13:05 2026 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id D1B72C433FE for ; Thu, 6 Oct 2022 13:50:27 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S231608AbiJFNu0 (ORCPT ); Thu, 6 Oct 2022 09:50:26 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:50968 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S231712AbiJFNuM (ORCPT ); Thu, 6 Oct 2022 09:50:12 -0400 Received: from mail-pl1-x632.google.com (mail-pl1-x632.google.com [IPv6:2607:f8b0:4864:20::632]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 9C9C75601C for ; Thu, 6 Oct 2022 06:50:01 -0700 (PDT) Received: by mail-pl1-x632.google.com with SMTP id x6so1745309pll.11 for ; Thu, 06 Oct 2022 06:50:00 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date; bh=b98/tdiTwcvqr19Hh3b2b2FTs+schd1Q4q9W1vv+i7w=; b=f3lE3n1jFX5eANT3457wStFC3x8NgEWMerXa7SYsS4AMyPnchWeOmot0g5vwPiv7L4 fW/GZheMjMzyAB2CJjKXehrMRRdBFEpBpHdgWpWcfK9aKcLCTrXWFA3vCvShmnv1mLwD MjPE5DlX+qXwxPMjeOe4iEw6zecAQlA9csayKh8ddVPAXmVrKyCNxqPPP+h21TRSJQj1 OBWFt3BUrldpwTkbV8S87/iPicmgvPcnhCU7V+nWUFLHxfiA0obg2DyU9c3Y/uSONYRT j5HwA0BPZ7qYXgdzqdZW9NFCvTD+W0cWNuSQ+bfCFM/Vv59+yluuLCJTjtZafKpqTx4L iFFw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date; bh=b98/tdiTwcvqr19Hh3b2b2FTs+schd1Q4q9W1vv+i7w=; b=GgDhaN3jwcVoGfqXwSH8X1D0f6Bg/JDKkN9mOiS5eHFgm7DjfHVvrNPaGw4JsIJVi7 C8t2OVvepiwIPfjbU1k2KlVtkRjJxW0M26VwpJjEBIxvcREZCavQNR5zioKY6G7CVYuR WulIV+Or5YAuHUE8nK0LMpmdBLZ+44/OVOB+hz7wUpRlGxQO6EcHubFtZMFUB9DyWZp7 XkK3nsbKrlXjjARcP+tMKz4ZkXhG+mHH++ejTl+yrRo6Ump5hRHKw3fC5QNrDLklZ8se XqG5QaUIrjEplaB5h2XLDwZaXnaRJjwh3FfkQfD5updPygyHbnMhQ93af7cOfNbUbbqN /5GQ== X-Gm-Message-State: ACrzQf1xikvH5FGvbq/PCkw5dLqjn6soj+KX06J8O1xA1ZmWYUaZghy/ Md6flgB2VVl5WmJ+caPBdTg0 X-Google-Smtp-Source: AMsMyM4P7ZuRzbrkXhZRWHNPuzPp2qehAKeCoVS8zM5dgefeOtWm2noYpuK7VzCYrXRQHqTic/7a8Q== X-Received: by 2002:a17:90a:cd02:b0:205:efbd:6f60 with SMTP id d2-20020a17090acd0200b00205efbd6f60mr10800376pju.111.1665064199534; Thu, 06 Oct 2022 06:49:59 -0700 (PDT) Received: from localhost.localdomain ([220.158.158.220]) by smtp.gmail.com with ESMTPSA id k25-20020a635a59000000b00434760ee36asm1874053pgm.16.2022.10.06.06.49.56 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 06 Oct 2022 06:49:58 -0700 (PDT) From: Manivannan Sadhasivam To: kishon@kernel.org, lpieralisi@kernel.org, bhelgaas@google.com Cc: linux-pci@vger.kernel.org, linux-kernel@vger.kernel.org, kw@linux.com, robh@kernel.org, vidyas@nvidia.com, vigneshr@ti.com, Manivannan Sadhasivam Subject: [PATCH v3 4/5] PCI: endpoint: Use callback mechanism for passing events from EPC to EPF Date: Thu, 6 Oct 2022 19:19:26 +0530 Message-Id: <20221006134927.41437-5-manivannan.sadhasivam@linaro.org> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20221006134927.41437-1-manivannan.sadhasivam@linaro.org> References: <20221006134927.41437-1-manivannan.sadhasivam@linaro.org> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" Instead of using the notifiers for passing the events from EPC to EPF, let's introduce a callback based mechanism where the EPF drivers can populate relevant callbacks for EPC events they want to subscribe. The use of notifiers in kernel is not recommended if there is a real link between the sender and receiver, like in this case. Also, the existing atomic notifier forces the notification functions to be in atomic context while the caller may be in non-atomic context. For instance, the two in-kernel users of the notifiers, pcie-qcom and pcie-tegra194, both are calling the notifier functions in non-atomic context (from threaded IRQ handlers). This creates a sleeping in atomic context issue with the existing EPF_TEST driver that calls the EPC APIs that may sleep. For all these reasons, let's get rid of the notifier chains and use the simple callback mechanism for signalling the events from EPC to EPF drivers. This preserves the context of the caller and avoids the latency of going through a separate interface for triggering the notifications. As a first step of the transition, the core_init() callback is introduced in this commit, that'll replace the existing CORE_INIT notifier used for signalling the init complete event from EPC. During the occurrence of the event, EPC will go over the list of EPF drivers attached to it and will call the core_init() callback if available. Signed-off-by: Manivannan Sadhasivam --- drivers/pci/endpoint/functions/pci-epf-test.c | 13 ++++++------- drivers/pci/endpoint/pci-epc-core.c | 11 ++++++++++- include/linux/pci-epf.h | 11 ++++++++++- 3 files changed, 26 insertions(+), 9 deletions(-) diff --git a/drivers/pci/endpoint/functions/pci-epf-test.c b/drivers/pci/en= dpoint/functions/pci-epf-test.c index a6f906a96669..868de17e1ad2 100644 --- a/drivers/pci/endpoint/functions/pci-epf-test.c +++ b/drivers/pci/endpoint/functions/pci-epf-test.c @@ -826,20 +826,17 @@ static int pci_epf_test_core_init(struct pci_epf *epf) return 0; } =20 +static const struct pci_epc_event_ops pci_epf_test_event_ops =3D { + .core_init =3D pci_epf_test_core_init, +}; + static int pci_epf_test_notifier(struct notifier_block *nb, unsigned long = val, void *data) { struct pci_epf *epf =3D container_of(nb, struct pci_epf, nb); struct pci_epf_test *epf_test =3D epf_get_drvdata(epf); - int ret; =20 switch (val) { - case CORE_INIT: - ret =3D pci_epf_test_core_init(epf); - if (ret) - return NOTIFY_BAD; - break; - case LINK_UP: queue_delayed_work(kpcitest_workqueue, &epf_test->cmd_handler, msecs_to_jiffies(1)); @@ -1010,6 +1007,8 @@ static int pci_epf_test_probe(struct pci_epf *epf, co= nst struct pci_epf_device_i =20 INIT_DELAYED_WORK(&epf_test->cmd_handler, pci_epf_test_cmd_handler); =20 + epf->event_ops =3D &pci_epf_test_event_ops; + epf_set_drvdata(epf, epf_test); return 0; } diff --git a/drivers/pci/endpoint/pci-epc-core.c b/drivers/pci/endpoint/pci= -epc-core.c index 6cce430d431b..ba54f17ae06f 100644 --- a/drivers/pci/endpoint/pci-epc-core.c +++ b/drivers/pci/endpoint/pci-epc-core.c @@ -707,10 +707,19 @@ EXPORT_SYMBOL_GPL(pci_epc_linkup); */ void pci_epc_init_notify(struct pci_epc *epc) { + struct pci_epf *epf; + if (!epc || IS_ERR(epc)) return; =20 - atomic_notifier_call_chain(&epc->notifier, CORE_INIT, NULL); + mutex_lock(&epc->list_lock); + list_for_each_entry(epf, &epc->pci_epf, list) { + mutex_lock(&epf->lock); + if (epf->event_ops->core_init) + epf->event_ops->core_init(epf); + mutex_unlock(&epf->lock); + } + mutex_unlock(&epc->list_lock); } EXPORT_SYMBOL_GPL(pci_epc_init_notify); =20 diff --git a/include/linux/pci-epf.h b/include/linux/pci-epf.h index 0c94cc1513bc..a06f3b4c8bee 100644 --- a/include/linux/pci-epf.h +++ b/include/linux/pci-epf.h @@ -18,7 +18,6 @@ struct pci_epf; enum pci_epc_interface_type; =20 enum pci_notify_event { - CORE_INIT, LINK_UP, }; =20 @@ -72,6 +71,14 @@ struct pci_epf_ops { struct config_group *group); }; =20 +/** + * struct pci_epf_event_ops - Callbacks for capturing the EPC events + * @core_init: Callback for the EPC initialization complete event + */ +struct pci_epc_event_ops { + int (*core_init)(struct pci_epf *epf); +}; + /** * struct pci_epf_driver - represents the PCI EPF driver * @probe: ops to perform when a new EPF device has been bound to the EPF = driver @@ -140,6 +147,7 @@ struct pci_epf_bar { * @is_vf: true - virtual function, false - physical function * @vfunction_num_map: bitmap to manage virtual function number * @pci_vepf: list of virtual endpoint functions associated with this func= tion + * @event_ops: Callbacks for capturing the EPC events */ struct pci_epf { struct device dev; @@ -170,6 +178,7 @@ struct pci_epf { unsigned int is_vf; unsigned long vfunction_num_map; struct list_head pci_vepf; + const struct pci_epc_event_ops *event_ops; }; =20 /** --=20 2.25.1 From nobody Mon Apr 6 21:13:05 2026 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 6B2DBC433FE for ; Thu, 6 Oct 2022 13:50:45 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S230321AbiJFNun (ORCPT ); Thu, 6 Oct 2022 09:50:43 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:50384 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S231734AbiJFNuW (ORCPT ); Thu, 6 Oct 2022 09:50:22 -0400 Received: from mail-pg1-x530.google.com (mail-pg1-x530.google.com [IPv6:2607:f8b0:4864:20::530]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 71A77804B6 for ; Thu, 6 Oct 2022 06:50:04 -0700 (PDT) Received: by mail-pg1-x530.google.com with SMTP id f193so2000737pgc.0 for ; Thu, 06 Oct 2022 06:50:04 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date; bh=Y0MJ+CUZZvqiC06rOGoANeiEeLDH+rfWRVr8HGOI0zE=; b=m+gzwteEDOkMfL/WFoicBOTuBgNGNC5upbaRmlPnAq2+eHEimZ0IGhaNNfATO+I1td Fn3w+pSkPbAUQQa+rkRijGa3SOLJqJYtHJTyXKs4hyB72V3W7V/U2Ju2JTuaz3TPRuy8 B/lfYiInVeMGS/AEKNlIqfgp3kvP4FqNs6b4T5RIYUSZEwPbWY23T9iBKt9q1M12iay+ nfyyiG3eZdJgU1qkdUtEveHSxNp3sEcXFQi/6ptvJGqyVM2PmZpcQ9QSw6PPFtIX/AUV wtSMKYDrziZaMG9NJ2K/LQ0SJ7TTIdKtukh7jaIuLOjvubG3sGCpuwKnzJP74uvJKdKO aobQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date; bh=Y0MJ+CUZZvqiC06rOGoANeiEeLDH+rfWRVr8HGOI0zE=; b=cyImq7P89Cp7+ZD36cQ5vReWr6kEp+wclhKdUV2/PlccjA71kLpLxPFOTxECur1LHa HtOMlY+MtxWJ/xJtbfAI9y2W0VX+J5gjroV9i10gHsi8qfv8U5/7N6AJ+F1ut1NG8jKN wjuaIBSnUTNurJCOHB6HdOQrLuxLk6WLPGty/zsEKjJxPBnBEH8Tn0GmXHgreOWSSDVw 83M8T2HiqhKrbYtNgtPob6i/YpXv2MNCNnJKam3GjfCFosmzP3cQHUaUwlnjHDvbflXX 1sXYeLCyQ98njSRYjvhtLBdvHtlnUI2yH7OQWxzHcoZWeYwrHufDX4D45id4beMRZPnp mYKw== X-Gm-Message-State: ACrzQf1nEqDeL8PSzdduzdmv8dwJbvukum8Iflcb42l2qzDwjK08kNdm e5cr3RlPFr6h0EsUX0HYI6Go X-Google-Smtp-Source: AMsMyM7gSbJZ96bcqtZTdVs4/z84De0pFcLRe4b2AbJgXTAHQk0JwrMBVcmscWQYl5xaVRo5E2YdJQ== X-Received: by 2002:a63:b545:0:b0:43c:2ad9:b00 with SMTP id u5-20020a63b545000000b0043c2ad90b00mr1456pgo.535.1665064203337; Thu, 06 Oct 2022 06:50:03 -0700 (PDT) Received: from localhost.localdomain ([220.158.158.220]) by smtp.gmail.com with ESMTPSA id k25-20020a635a59000000b00434760ee36asm1874053pgm.16.2022.10.06.06.49.59 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 06 Oct 2022 06:50:02 -0700 (PDT) From: Manivannan Sadhasivam To: kishon@kernel.org, lpieralisi@kernel.org, bhelgaas@google.com Cc: linux-pci@vger.kernel.org, linux-kernel@vger.kernel.org, kw@linux.com, robh@kernel.org, vidyas@nvidia.com, vigneshr@ti.com, Manivannan Sadhasivam Subject: [PATCH v3 5/5] PCI: endpoint: Use link_up() callback in place of LINK_UP notifier Date: Thu, 6 Oct 2022 19:19:27 +0530 Message-Id: <20221006134927.41437-6-manivannan.sadhasivam@linaro.org> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20221006134927.41437-1-manivannan.sadhasivam@linaro.org> References: <20221006134927.41437-1-manivannan.sadhasivam@linaro.org> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" As a part of the transition towards callback mechanism for signalling the events from EPC to EPF, let's use the link_up() callback in the place of the LINK_UP notifier. This also removes the notifier support completely from the PCI endpoint framework. Signed-off-by: Manivannan Sadhasivam --- drivers/pci/endpoint/functions/pci-epf-test.c | 33 ++++++------------- drivers/pci/endpoint/pci-epc-core.c | 12 +++++-- include/linux/pci-epc.h | 8 ----- include/linux/pci-epf.h | 8 ++--- 4 files changed, 22 insertions(+), 39 deletions(-) diff --git a/drivers/pci/endpoint/functions/pci-epf-test.c b/drivers/pci/en= dpoint/functions/pci-epf-test.c index 868de17e1ad2..f75045f2dee3 100644 --- a/drivers/pci/endpoint/functions/pci-epf-test.c +++ b/drivers/pci/endpoint/functions/pci-epf-test.c @@ -826,30 +826,21 @@ static int pci_epf_test_core_init(struct pci_epf *epf) return 0; } =20 -static const struct pci_epc_event_ops pci_epf_test_event_ops =3D { - .core_init =3D pci_epf_test_core_init, -}; - -static int pci_epf_test_notifier(struct notifier_block *nb, unsigned long = val, - void *data) +int pci_epf_test_link_up(struct pci_epf *epf) { - struct pci_epf *epf =3D container_of(nb, struct pci_epf, nb); struct pci_epf_test *epf_test =3D epf_get_drvdata(epf); =20 - switch (val) { - case LINK_UP: - queue_delayed_work(kpcitest_workqueue, &epf_test->cmd_handler, - msecs_to_jiffies(1)); - break; - - default: - dev_err(&epf->dev, "Invalid EPF test notifier event\n"); - return NOTIFY_BAD; - } + queue_delayed_work(kpcitest_workqueue, &epf_test->cmd_handler, + msecs_to_jiffies(1)); =20 - return NOTIFY_OK; + return 0; } =20 +static const struct pci_epc_event_ops pci_epf_test_event_ops =3D { + .core_init =3D pci_epf_test_core_init, + .link_up =3D pci_epf_test_link_up, +}; + static int pci_epf_test_alloc_space(struct pci_epf *epf) { struct pci_epf_test *epf_test =3D epf_get_drvdata(epf); @@ -976,12 +967,8 @@ static int pci_epf_test_bind(struct pci_epf *epf) if (ret) epf_test->dma_supported =3D false; =20 - if (linkup_notifier || core_init_notifier) { - epf->nb.notifier_call =3D pci_epf_test_notifier; - pci_epc_register_notifier(epc, &epf->nb); - } else { + if (!linkup_notifier && !core_init_notifier) queue_work(kpcitest_workqueue, &epf_test->cmd_handler.work); - } =20 return 0; } diff --git a/drivers/pci/endpoint/pci-epc-core.c b/drivers/pci/endpoint/pci= -epc-core.c index ba54f17ae06f..5dac1496cf16 100644 --- a/drivers/pci/endpoint/pci-epc-core.c +++ b/drivers/pci/endpoint/pci-epc-core.c @@ -690,10 +690,19 @@ EXPORT_SYMBOL_GPL(pci_epc_remove_epf); */ void pci_epc_linkup(struct pci_epc *epc) { + struct pci_epf *epf; + if (!epc || IS_ERR(epc)) return; =20 - atomic_notifier_call_chain(&epc->notifier, LINK_UP, NULL); + mutex_lock(&epc->list_lock); + list_for_each_entry(epf, &epc->pci_epf, list) { + mutex_lock(&epf->lock); + if (epf->event_ops->link_up) + epf->event_ops->link_up(epf); + mutex_unlock(&epf->lock); + } + mutex_unlock(&epc->list_lock); } EXPORT_SYMBOL_GPL(pci_epc_linkup); =20 @@ -784,7 +793,6 @@ __pci_epc_create(struct device *dev, const struct pci_e= pc_ops *ops, mutex_init(&epc->lock); mutex_init(&epc->list_lock); INIT_LIST_HEAD(&epc->pci_epf); - ATOMIC_INIT_NOTIFIER_HEAD(&epc->notifier); =20 device_initialize(&epc->dev); epc->dev.class =3D pci_epc_class; diff --git a/include/linux/pci-epc.h b/include/linux/pci-epc.h index fe729dfe509b..301bb0e53707 100644 --- a/include/linux/pci-epc.h +++ b/include/linux/pci-epc.h @@ -135,7 +135,6 @@ struct pci_epc_mem { * @group: configfs group representing the PCI EPC device * @lock: mutex to protect pci_epc ops * @function_num_map: bitmap to manage physical function number - * @notifier: used to notify EPF of any EPC events (like linkup) */ struct pci_epc { struct device dev; @@ -151,7 +150,6 @@ struct pci_epc { /* mutex to protect against concurrent access of EP controller */ struct mutex lock; unsigned long function_num_map; - struct atomic_notifier_head notifier; }; =20 /** @@ -194,12 +192,6 @@ static inline void *epc_get_drvdata(struct pci_epc *ep= c) return dev_get_drvdata(&epc->dev); } =20 -static inline int -pci_epc_register_notifier(struct pci_epc *epc, struct notifier_block *nb) -{ - return atomic_notifier_chain_register(&epc->notifier, nb); -} - struct pci_epc * __devm_pci_epc_create(struct device *dev, const struct pci_epc_ops *ops, struct module *owner); diff --git a/include/linux/pci-epf.h b/include/linux/pci-epf.h index a06f3b4c8bee..bc613f0df7e3 100644 --- a/include/linux/pci-epf.h +++ b/include/linux/pci-epf.h @@ -17,10 +17,6 @@ struct pci_epf; enum pci_epc_interface_type; =20 -enum pci_notify_event { - LINK_UP, -}; - enum pci_barno { NO_BAR =3D -1, BAR_0, @@ -74,9 +70,11 @@ struct pci_epf_ops { /** * struct pci_epf_event_ops - Callbacks for capturing the EPC events * @core_init: Callback for the EPC initialization complete event + * @link_up: Callback for the EPC link up event */ struct pci_epc_event_ops { int (*core_init)(struct pci_epf *epf); + int (*link_up)(struct pci_epf *epf); }; =20 /** @@ -135,7 +133,6 @@ struct pci_epf_bar { * @driver: the EPF driver to which this EPF device is bound * @id: Pointer to the EPF device ID * @list: to add pci_epf as a list of PCI endpoint functions to pci_epc - * @nb: notifier block to notify EPF of any EPC events (like linkup) * @lock: mutex to protect pci_epf_ops * @sec_epc: the secondary EPC device to which this EPF device is bound * @sec_epc_list: to add pci_epf as list of PCI endpoint functions to seco= ndary @@ -164,7 +161,6 @@ struct pci_epf { struct pci_epf_driver *driver; const struct pci_epf_device_id *id; struct list_head list; - struct notifier_block nb; /* mutex to protect against concurrent access of pci_epf_ops */ struct mutex lock; =20 --=20 2.25.1