From nobody Wed Apr 8 12:50:38 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 EC2FFC6FA83 for ; Sat, 10 Sep 2022 09:05:36 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S229565AbiIJJFf (ORCPT ); Sat, 10 Sep 2022 05:05:35 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:57726 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229552AbiIJJFa (ORCPT ); Sat, 10 Sep 2022 05:05:30 -0400 Received: from mail-wr1-x434.google.com (mail-wr1-x434.google.com [IPv6:2a00:1450:4864:20::434]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id EDB0C5C950 for ; Sat, 10 Sep 2022 02:05:28 -0700 (PDT) Received: by mail-wr1-x434.google.com with SMTP id c11so6938700wrp.11 for ; Sat, 10 Sep 2022 02:05:28 -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=XZ9bImxf8XtKwz5O25eFDJyl1TKgS+4Hi4wWwjJENYHZOY29lP2VbpTwYOMWw++olk 4K1qpSSO4+87Hd6R+l2+0U0FqICl6zqzF0GSBh84YzSC4whAlP/MdFl21okuGN10B6Yh Sn8/q4/61ZcdlRKw4yjYBQnjgt0naNiZCApDprcpVXwF25huetUS/7ok5KdCu0Ty+J/Z cu6jV5yEoGommBEYZlut/agcSalGVwtlTwIp5k4KkI8gewIAZVYazi0bOSNUFSn0sWqx zaSSgaqEqKUC8EgGhwXOKIDrdGQSdyYn+ywLMVk5Ap0P19n4IkEEy0TnDVBdAaQxa9vd GQSA== 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=1iAB+ZfUWY0GU/31V105XQbLRw9kVkCl3CtWLFtaOX+fNNXKlVXqLeGP5/uVSVVw4H XY6xFO0KRGNfYgMFxbt25ASoBqRHn/U9tihRDjwWQ3HEpP/2rdkEppWJgxcJSBwAHUe5 LISOw4r6WqU+9Oed9QcA/FlUFUzdQhovVcm0v7gPz6gfOBgqUqFA6Oqrs7g2t34+Fnup S0wl2sHZW8Fj75hegJUhVxPJFvr6Kh5PPEww2/jfk0C2rskrcaBOakOCrt3IfqStHWc2 UYoOtFgmdlViCBQdpASbV6RRlnGduIUsf1CZwMPV1paKsrPkQ0cS7kK02R6rSUaVxyZ+ sptA== X-Gm-Message-State: ACgBeo2sJAj5o/EdaI3KGVkIw597D1/smYD3SogR5vayIsCZH965ST/g VHgpduEAVgpGNcICGg+x47ZW X-Google-Smtp-Source: AA6agR6JF41rR8QPL5xWtDvgTWZqQ98E41/qIkwxUXbocZyQdJPUfyiZPLyuHGg3ZwaAWUEH25O4Aw== X-Received: by 2002:a05:6000:1245:b0:228:6aa7:dbb2 with SMTP id j5-20020a056000124500b002286aa7dbb2mr10485053wrx.77.1662800727504; Sat, 10 Sep 2022 02:05:27 -0700 (PDT) Received: from localhost.localdomain ([117.217.182.47]) by smtp.gmail.com with ESMTPSA id i81-20020a1c3b54000000b003a8418ee646sm3081677wma.12.2022.09.10.02.05.22 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 10 Sep 2022 02:05:27 -0700 (PDT) From: Manivannan Sadhasivam To: kishon@ti.com, lpieralisi@kernel.org, bhelgaas@google.com Cc: kw@linux.com, robh@kernel.org, vidyas@nvidia.com, linux-pci@vger.kernel.org, linux-kernel@vger.kernel.org, Manivannan Sadhasivam Subject: [PATCH v2 1/3] PCI: endpoint: Use a separate lock for protecting epc->pci_epf list Date: Sat, 10 Sep 2022 14:35:06 +0530 Message-Id: <20220910090508.61157-2-manivannan.sadhasivam@linaro.org> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20220910090508.61157-1-manivannan.sadhasivam@linaro.org> References: <20220910090508.61157-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 --- 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 Wed Apr 8 12:50:38 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 38E03ECAAD5 for ; Sat, 10 Sep 2022 09:05:51 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S229691AbiIJJFs (ORCPT ); Sat, 10 Sep 2022 05:05:48 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:58538 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229596AbiIJJFm (ORCPT ); Sat, 10 Sep 2022 05:05:42 -0400 Received: from mail-wm1-x330.google.com (mail-wm1-x330.google.com [IPv6:2a00:1450:4864:20::330]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id C0C135E559 for ; Sat, 10 Sep 2022 02:05:34 -0700 (PDT) Received: by mail-wm1-x330.google.com with SMTP id az24-20020a05600c601800b003a842e4983cso3410501wmb.0 for ; Sat, 10 Sep 2022 02:05:34 -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=ohJS3hlCgdsZHY3kYb3U5BKU2/re/UNPkN9oF6OlLGO8sqrImlo8onawrAwuQhqnjK hjPX8ycYVFwYyY0uXf5KAOkfL5FE+5oiw7AwDe0vuR7OsdAltEtS+tq2d1vWpjbNJSZW k68fQ8hL3lJcA5mTpLH/0lSlfA+21eFkoTOlzF1Dn8zyNpNm9zI4qEinxg0Q3DvlAYHw DurNCNO/Tw6mngJtG4K1PEM5UYgkXfhDeys1Ttr61fghb6wACmKw2mnT1PKNJ5D09LXj ZGQlRYCXNoDPdi6LkLwFM6DJZqBmCZXuPi+1w37U5fk8CntzcFH6dUxpv/6DxwQ4xWhd q8WA== 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=ZaFeUtrspWRifa8F9go2UdOc+guJt0bf+4M3jgFa0vsxiFz+HO0iL7rA1FQJmVixhw n1xM9kIVPyinoV3xVm/3r8l+Wjnn0f3EeDe8cVhy5CZnFbsT5rXjbi8x8U3XUmhhS75O IhCMCOSgybECIzyLglS4se8q6GtxXQLQcKF8iDqQ2cXzrgbOa0p8yFVlJUOjkgnoVm54 9nuE8Ue/sP/ad/HB/B1h/slxPys3ATAnfymEPn96bR4OYQKxc+84C6hMd54Yut3Kn/wA A/WPxDZlZamefkPP9nVYNN5RLquhVRW3tZ+F2moH4Z70xw1UFI89c6DUlN5Fbx6NBHpG BV3Q== X-Gm-Message-State: ACgBeo25V2McG4/o2TB7/dLL1rDC8dR9FXKaTI+VoilZkhEQm9RMiBP0 ecSV8TzByXgcpzXSQKfuindW X-Google-Smtp-Source: AA6agR4VCabiqZGHOihA6XufU8f13OMt9bFL0OCiGQoZ5lBepE/P6lsxg8w4Q38HSGAyDXQ2uFUnPg== X-Received: by 2002:a05:600c:5028:b0:3a8:4349:153c with SMTP id n40-20020a05600c502800b003a84349153cmr7870930wmr.130.1662800733313; Sat, 10 Sep 2022 02:05:33 -0700 (PDT) Received: from localhost.localdomain ([117.217.182.47]) by smtp.gmail.com with ESMTPSA id i81-20020a1c3b54000000b003a8418ee646sm3081677wma.12.2022.09.10.02.05.27 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 10 Sep 2022 02:05:32 -0700 (PDT) From: Manivannan Sadhasivam To: kishon@ti.com, lpieralisi@kernel.org, bhelgaas@google.com Cc: kw@linux.com, robh@kernel.org, vidyas@nvidia.com, linux-pci@vger.kernel.org, linux-kernel@vger.kernel.org, Manivannan Sadhasivam Subject: [PATCH v2 2/3] PCI: endpoint: Use callback mechanism for passing events from EPC to EPF Date: Sat, 10 Sep 2022 14:35:07 +0530 Message-Id: <20220910090508.61157-3-manivannan.sadhasivam@linaro.org> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20220910090508.61157-1-manivannan.sadhasivam@linaro.org> References: <20220910090508.61157-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 Wed Apr 8 12:50:38 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 1EBBDC6FA82 for ; Sat, 10 Sep 2022 09:06:00 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S229535AbiIJJF6 (ORCPT ); Sat, 10 Sep 2022 05:05:58 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:58934 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229689AbiIJJFs (ORCPT ); Sat, 10 Sep 2022 05:05:48 -0400 Received: from mail-wm1-x32e.google.com (mail-wm1-x32e.google.com [IPv6:2a00:1450:4864:20::32e]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 3501367CB8 for ; Sat, 10 Sep 2022 02:05:40 -0700 (PDT) Received: by mail-wm1-x32e.google.com with SMTP id n23-20020a7bc5d7000000b003a62f19b453so6647545wmk.3 for ; Sat, 10 Sep 2022 02:05:40 -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=JL/7tJpFFNt6I0x+sRh6bunVJzy8r/WOAsVV8w76zGCB5XQVktEAGb9HHK8vHI9YeC HjPByWNqnByPDygAadbwGtWtsXqR6FMMja6ms122eqsOKu4FjkKiByxo+ecuOzbSeY/s xEo5kb8papQjc2m2QYsL6r96rrjoYVXPyGlWo9wvdz/lm2NaG6bRMDrkxVsHVTBUSjkb gWxBFZRYesLcVdktsaJenYpazA3dqMmEAQFR25FqYxBbhUzIGGOFToAOeEt1Jn375crv bOQCPaqqvFA7AUsanhJLwmS1aGgYdPQvY5lLBJqlZ3bIN1qOiEcPqUp0kTW1PKhTSqR7 2/Ug== 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=SuBjlgwWSHKlFKc9qL9jNWGycJbh6uyyvsAgdhJq5Pyf5dxh0daklocmYmjnc5+uRa 99QUMnwAWYTD8VJTZoYs6PMxHAAYBXyWJWutDbrHQ91FOA+k6qGZlu5B+yn2HxSjvHaW G/QzUpf/aqKqE4XtoVnReubphK+0Xew7BXsex4rbAJ35OWxfj4kp0d2qtLoGVhszcYN2 r9dnvYXBprGpgf2Nm2DCwaLtFZRWK7DHZ2mkw3qmqPuZihBcaXvBLnOxugP3ft0N3DsF zZgYjEBphPKRHLYOupoRwRcb0kDY4Vvy20t5S44dsQcB73YveSyUk/6Isuavw9/1ZBTl DQPw== X-Gm-Message-State: ACgBeo1kfclKeBF8kT+C5FPpQq0r3FEtpMRlR4rUXSCnZYHwayeSCYrX 3vLr48MXmqm60NqGqqkqXdHv X-Google-Smtp-Source: AA6agR6xqNmpMJ+bl9GxDyy+2JYWrL4dYlAvfr90iqZ/8pT9q+jsTeABU0kY1dKfQPXmQSIC5lfHzw== X-Received: by 2002:a05:600c:3512:b0:3a5:e9d3:d418 with SMTP id h18-20020a05600c351200b003a5e9d3d418mr7958031wmq.0.1662800739168; Sat, 10 Sep 2022 02:05:39 -0700 (PDT) Received: from localhost.localdomain ([117.217.182.47]) by smtp.gmail.com with ESMTPSA id i81-20020a1c3b54000000b003a8418ee646sm3081677wma.12.2022.09.10.02.05.33 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 10 Sep 2022 02:05:38 -0700 (PDT) From: Manivannan Sadhasivam To: kishon@ti.com, lpieralisi@kernel.org, bhelgaas@google.com Cc: kw@linux.com, robh@kernel.org, vidyas@nvidia.com, linux-pci@vger.kernel.org, linux-kernel@vger.kernel.org, Manivannan Sadhasivam Subject: [PATCH v2 3/3] PCI: endpoint: Use link_up() callback in place of LINK_UP notifier Date: Sat, 10 Sep 2022 14:35:08 +0530 Message-Id: <20220910090508.61157-4-manivannan.sadhasivam@linaro.org> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20220910090508.61157-1-manivannan.sadhasivam@linaro.org> References: <20220910090508.61157-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