From patchwork Wed Jan 11 11:40:58 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Manivannan Sadhasivam X-Patchwork-Id: 41928 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:a5d:4e01:0:0:0:0:0 with SMTP id p1csp3271027wrt; Wed, 11 Jan 2023 03:46:09 -0800 (PST) X-Google-Smtp-Source: AMrXdXvrUS9LoX71nM++ixeNvPMdtTaSOOXsjIT/tC9Qnji4VXaQpEj2NP49ov2sbN20b1DkiiJJ X-Received: by 2002:a05:6a20:7da3:b0:ad:d982:4538 with SMTP id v35-20020a056a207da300b000add9824538mr107714159pzj.55.1673437568800; Wed, 11 Jan 2023 03:46:08 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1673437568; cv=none; d=google.com; s=arc-20160816; b=jbVwc7PjR7Tm+ge8jHZlQIoU0kl+iIAvizxQ5lKpfgdNixTowC/7pPpjclWFKZ6Hl8 lVdMAr5bLonZtSST0OgM4wt3QMlY2abNmTXc3WQ51XZHz1S1mdJzqD0Y1/wBS4T+1Uzl tzVrEGYdBpT1P4zqS+YeYx1AmqJ+PFDCRrkcx1OaVZlNVH0NNcENbuL1m8AmcuBkc5PY 5shJPoSwHOrNxOTIanNsmgfSUUhalYBTecyHxUlzmyNgNj2ib5I95hmT4pIF0sM1DUju WYZOQRo3obwWZvByg6xblNtZu5HJm0KPTFnjV5jgLVa2MOy/tIZrA5VoHUY8Mfdv7zBd 519Q== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:mime-version :references:in-reply-to:message-id:date:subject:cc:to:from :dkim-signature; bh=MtspVR08c2Hzxz4d1S9naljhmqqgR/iHq8R5vgVdVO8=; b=hK0pPy/qnaZCfPGOPUE+OxP8aEk9JPhKTr7idBnk14GvOQg53xEcMZorB+gpxiwljU pJXMEQc4eNVzZJxhXYYheJtqPGIYgAU7fHiLQ9DOlUMHjLvbceuixQsCHwGLMkaZxqjf ngsoS6PHGel993Tj33MrOrsvszMSFv7s0+rEa3oX5H6D+oQbwXK3f7I61LpBXTrESheX sEETZY5gX8CTDS5MYJhrJXli3KwROvFS7Scu+chG5P7sZm3hDb3I26RmpmpD8dX1YdkY I39p5gqg1SWDy9jbJZlHi0VV4sVFYVRlPb67xpjXykynD+c+BRMsZd8DmwsvialWsNWK os2g== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@linaro.org header.s=google header.b=BmCUr8xA; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linaro.org Received: from out1.vger.email (out1.vger.email. [2620:137:e000::1:20]) by mx.google.com with ESMTP id d11-20020a631d0b000000b0046040a8be4esi13860182pgd.754.2023.01.11.03.45.55; Wed, 11 Jan 2023 03:46:08 -0800 (PST) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) client-ip=2620:137:e000::1:20; Authentication-Results: mx.google.com; dkim=pass header.i=@linaro.org header.s=google header.b=BmCUr8xA; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linaro.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S231888AbjAKLoa (ORCPT + 99 others); Wed, 11 Jan 2023 06:44:30 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:38140 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S232336AbjAKLml (ORCPT ); Wed, 11 Jan 2023 06:42:41 -0500 Received: from mail-pj1-x1035.google.com (mail-pj1-x1035.google.com [IPv6:2607:f8b0:4864:20::1035]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 5C75E1AA3C for ; Wed, 11 Jan 2023 03:41:32 -0800 (PST) Received: by mail-pj1-x1035.google.com with SMTP id z4-20020a17090a170400b00226d331390cso16819753pjd.5 for ; Wed, 11 Jan 2023 03:41:32 -0800 (PST) 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 :message-id:reply-to; bh=MtspVR08c2Hzxz4d1S9naljhmqqgR/iHq8R5vgVdVO8=; b=BmCUr8xANyYLZih9JbA/unTaGgYJvNd65uoCjO9Jag5rfVgVoLxKCos6Lh3ASfL/Ph q2T6gg2lPhM+JfUoSA8H+mQ1BIhJMLUT/fLFs4FHKaJyNTBDK5uPC0iOPNy61/JyLxiL K7Lq821g/WollalKKe/N1m0kdTUmLxla3LbhGh2LMwAcF9X7ZOR0d7yr2DVbD9llE2MV 20Aqe/t8N0I/pBHhDc4OihxLJQoVfZGnr9TCb8/VSyMNzdxMFmOkmCCuTfossncA94tX DNMMOY5rEL+3htAuHLe0U9V1xcJtt0U1FW6rAvKXZciyr679EnXsyQHVK5je8td7anoS f8rg== 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:message-id:reply-to; bh=MtspVR08c2Hzxz4d1S9naljhmqqgR/iHq8R5vgVdVO8=; b=b1+t9lOBttHLSXCunHaGGtT3L/djNRMEtonvRqlyPqhQpvRoIBqVklr+1lK+ZNPmVV TIlqpxa0eXcwgj+NG4gsbNGLRCy8pf6/vN1+I3oJ9qVcGTzqFtpjgxJrxB0rblNeZAlN jxy0ijMSvkEpsDwKC8SCoD786o6EoeLojaAc1SvGSfx1M9ywj8FZY9lSmQ/aGJSCVSt7 059jo/pllHw+sY81oNaWwLBxGegAoKR0nxqQUllIddIMjlILQbrpGc6FuzDfsu+eZLQI wGIbaB3qvCWmqL5fviODv2c+9wDs1uMcjwJrOEcZkCW1FZ2grf7LyUpnkk+KfCt5r6fa y/Wg== X-Gm-Message-State: AFqh2kpbaD+y3YmWxDwSlCYKLJ3v51y5DDyNpGKnrao22UqsTH+kg242 MfUDRB+Cpi781oyDQ62lsZQx X-Received: by 2002:a17:902:6b89:b0:18f:6cb:1730 with SMTP id p9-20020a1709026b8900b0018f06cb1730mr70863669plk.26.1673437291848; Wed, 11 Jan 2023 03:41:31 -0800 (PST) Received: from localhost.localdomain ([117.217.177.1]) by smtp.gmail.com with ESMTPSA id u14-20020a170902e5ce00b0018958a913a2sm9942688plf.223.2023.01.11.03.41.27 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 11 Jan 2023 03:41:30 -0800 (PST) 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: [RESEND v4 4/5] PCI: endpoint: Use callback mechanism for passing events from EPC to EPF Date: Wed, 11 Jan 2023 17:10:58 +0530 Message-Id: <20230111114059.6553-5-manivannan.sadhasivam@linaro.org> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20230111114059.6553-1-manivannan.sadhasivam@linaro.org> References: <20230111114059.6553-1-manivannan.sadhasivam@linaro.org> MIME-Version: 1.0 X-Spam-Status: No, score=-2.1 required=5.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,RCVD_IN_DNSWL_NONE, SPF_HELO_NONE,SPF_PASS autolearn=unavailable autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on lindbergh.monkeyblade.net Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org X-getmail-retrieved-from-mailbox: =?utf-8?q?INBOX?= X-GMAIL-THRID: =?utf-8?q?1754726472211354590?= X-GMAIL-MSGID: =?utf-8?q?1754726472211354590?= 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 Acked-by: Kishon Vijay Abraham I 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/endpoint/functions/pci-epf-test.c index 55283d2379a6..2fe161747e51 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; } +static const struct pci_epc_event_ops pci_epf_test_event_ops = { + .core_init = pci_epf_test_core_init, +}; + static int pci_epf_test_notifier(struct notifier_block *nb, unsigned long val, void *data) { struct pci_epf *epf = container_of(nb, struct pci_epf, nb); struct pci_epf_test *epf_test = epf_get_drvdata(epf); - int ret; switch (val) { - case CORE_INIT: - ret = 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) INIT_DELAYED_WORK(&epf_test->cmd_handler, pci_epf_test_cmd_handler); + epf->event_ops = &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 2c023db8f51c..7cb9587c6548 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; - 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 && 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); diff --git a/include/linux/pci-epf.h b/include/linux/pci-epf.h index 009a07147c61..fa629c191f00 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; enum pci_notify_event { - CORE_INIT, LINK_UP, }; @@ -72,6 +71,14 @@ struct pci_epf_ops { struct config_group *group); }; +/** + * 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 @@ -139,6 +146,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 function + * @event_ops: Callbacks for capturing the EPC events */ struct pci_epf { struct device dev; @@ -168,6 +176,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; }; /**