Received: by 2002:a05:6a10:16a7:0:0:0:0 with SMTP id gp39csp3097457pxb; Mon, 9 Nov 2020 02:25:56 -0800 (PST) X-Google-Smtp-Source: ABdhPJwMUTiXvbD5174Qvc7JlApXmid/lhS+ma2//+j/fm+Y0fDrrnO+tqAW6hDBVM7RWICum4z9 X-Received: by 2002:a17:906:888b:: with SMTP id ak11mr14115963ejc.278.1604917556515; Mon, 09 Nov 2020 02:25:56 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1604917556; cv=none; d=google.com; s=arc-20160816; b=Z4TLOvaR/V1jGk6AdCpXaUIBwOd1aYbXfkXnK6z3gDjSrGStD46NfRITMeILSr4jd8 IGsw6UgzAp0ciHCiEXNUhSIF22jSa2wT40SMLgXY0XUgF2ybgpvklR5m0MBYRNbICI53 iWniKcylcI15OGKqXXnuLod1L+XvcwW/XCs5TnlyDM+BYIOgwHASrqfpLQYMPe8gM2ti OJ6RnkpQDXfmvaHvROB6rPtOgXl0CJxnx28muGyxQKSr0Kj1N8Lu5qMJA48mF9tNwxsh UJMkwyYUMoB6XIA2cCUK6lwYBTQk44o+A5F/rwcp8FPXP29vAtIUihv8pmilOJgaTAjr q1Xw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:user-agent:in-reply-to:content-disposition :mime-version:references:message-id:subject:cc:to:from:date :ironport-sdr:ironport-sdr; bh=9pOACu0ecMjFNd2lWTqAYEuDnvfr12e2+XsTryp0fps=; b=vWA2sn43nlDToDugeZ+epDJHpunkuGmiIANcOIlOzmSb9Q/EfaaLbpF9j5Jvz/YbFS LdmlTCGveGw6HIqp6M0fNctXF5I61zUqwUMOmVGyOUB7wfSOfnPi+ZymsjEJs2u7b3P8 VBl5BwRQay6CvSlaLGy9SiR+a2xFjTWS3IDIy34enw/eqDrmL1sooMC8yLuEmm1NhETX xPrpeBn6P7rlsA876MHJ59KhVDomVj734HocRAw4XICZR2O6YAHt44Axe4kmtk+t8qi7 zRWvG487WhGQowCOyJyvzRCgVEtd4xx5HmEG4frxXdvXXtVrYr2Wl0O/4LG/jutxicSB f+Pg== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=intel.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id m8si6882083edj.357.2020.11.09.02.25.34; Mon, 09 Nov 2020 02:25:56 -0800 (PST) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=intel.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1729195AbgKIKWP (ORCPT + 99 others); Mon, 9 Nov 2020 05:22:15 -0500 Received: from mga17.intel.com ([192.55.52.151]:53379 "EHLO mga17.intel.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726176AbgKIKWP (ORCPT ); Mon, 9 Nov 2020 05:22:15 -0500 IronPort-SDR: UOCfyFDjbMo4ko1nWe1ZIH8U53Pn+nt7kMH60ejrDK4FqBLryDh/wvtuLt28ByHlCdFq9pD/Em 5eumu8zKGN5Q== X-IronPort-AV: E=McAfee;i="6000,8403,9799"; a="149630225" X-IronPort-AV: E=Sophos;i="5.77,463,1596524400"; d="scan'208";a="149630225" X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False Received: from orsmga005.jf.intel.com ([10.7.209.41]) by fmsmga107.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 09 Nov 2020 02:22:15 -0800 IronPort-SDR: 5LTh1w7rwukHuQcJ5tSOiWA7rZZQkdxi9oaKieNm3somth2unXeqPqMdC81rjXtNWnxtBed+al 54a7zX7fn5WQ== X-IronPort-AV: E=Sophos;i="5.77,463,1596524400"; d="scan'208";a="540788796" Received: from gliakhov-mobl2.ger.corp.intel.com (HELO ubuntu) ([10.252.48.45]) by orsmga005-auth.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 09 Nov 2020 02:22:13 -0800 Date: Mon, 9 Nov 2020 11:20:24 +0100 From: Guennadi Liakhovetski To: Arnaud POULIQUEN Cc: Mathieu Poirier , "ohad@wizery.com" , "bjorn.andersson@linaro.org" , "linux-remoteproc@vger.kernel.org" , "linux-kernel@vger.kernel.org" Subject: Re: [PATCH v5 8/8] rpmsg: Turn name service into a stand alone driver Message-ID: <20201109102023.GA17692@ubuntu> References: <20201105225028.3058818-1-mathieu.poirier@linaro.org> <20201105225028.3058818-9-mathieu.poirier@linaro.org> <20201106131545.GA10889@ubuntu> <20201106140028.GB10889@ubuntu> <20201106175332.GB3203364@xps15> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: User-Agent: Mutt/1.10.1 (2018-07-13) Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Hi Arnaud, On Mon, Nov 09, 2020 at 09:48:37AM +0100, Arnaud POULIQUEN wrote: > Hi Guennadi, Mathieu, > > On 11/6/20 6:53 PM, Mathieu Poirier wrote: > > On Fri, Nov 06, 2020 at 03:00:28PM +0100, Guennadi Liakhovetski wrote: > >> On Fri, Nov 06, 2020 at 02:15:45PM +0100, Guennadi Liakhovetski wrote: > >>> Hi Mathieu, Arnaud, > >>> > >>> On Thu, Nov 05, 2020 at 03:50:28PM -0700, Mathieu Poirier wrote: > >>>> From: Arnaud Pouliquen > >>>> > >>>> Make the RPMSG name service announcement a stand alone driver so that it > >>>> can be reused by other subsystems. It is also the first step in making the > >>>> functionatlity transport independent, i.e that is not tied to virtIO. > >>> > >>> Sorry, I just realised that my testing was incomplete. I haven't tested > >>> automatic module loading and indeed it doesn't work. If rpmsg_ns is loaded > >>> it probes and it's working, but if it isn't loaded and instead the rpmsg > >>> bus driver is probed (e.g. virtio_rpmsg_bus), calling > >>> rpmsg_ns_register_device() to create a new rpmsg_ns device doesn't cause > >>> rpmsg_ns to be loaded. > >> > >> A simple fix for that is using MODULE_ALIAS("rpmsg:rpmsg_ns"); in rpmsg_ns.c > >> but that alone doesn't fix the problem completely - the module does load then > >> but not quickly enough, the NS announcement from the host / remote arrives > >> before rpmsg_ns has properly registered. I think the best solution would be > >> to link rpmsg_ns.c together with rpmsg_core.c. You'll probably want to keep > >> the module name, so you could rename them to just core.c and ns.c. > > > > I'm pretty sure it is because virtio_device_ready() in rpmsg_probe() is called > > before the kernel has finished loading the name space driver. There has to be > > a way to prevent that from happening - I will investigate further. > > Right, no dependency is set so the rpmsg_ns driver is never probed... > And name service announcement messages are dropped if the service is not present. The mentioned change -MODULE_ALIAS("rpmsg_ns"); +MODULE_ALIAS("rpmsg:rpmsg_ns"); is actually a compulsory fix, without it the driver doesn't even get loaded when a device id registered, using rpmsg_ns_register_device(). So this has to be done as a minimum *if* we keep RPNsg NS as a separate kernel module. However, that still doesn't fix the problem relyably because of timing. I've merged both the RPMsg core and NS into a single module, which fixed the issue for me. I'm appending a patch to this email, but since it's a "fixup" please, feel free to roll it into the original work. But thinking about it, even linking modules together doesn't guarantee the order. I think rpmsg_ns_register_device() should actually actively wait for NS device probing to finish - successfully or not. I can add a complete() / wait_for_completion() pair to the process if you like. Thanks Guennadi > if rpmsg_virtio_bus is built-in > -> using "select RPMSG_NS" in RPMSG_VIRTIO kconfig should ensure that rpmsg_ns is also built-in > if rpmsg_virtio_bus is build as module rpmsg_ns.ko should be loaded first. > -> MODULE_SOFTDEP could be used in virtio_rpmsg_bus.c > > Thanks, > Arnaud From: Guennadi Liakhovetski Subject: [PATCH] fixup! rpmsg: Turn name service into a stand alone driver Link ns.c with core.c together to guarantee immediate probing. Signed-off-by: Guennadi Liakhovetski --- drivers/rpmsg/Makefile | 2 +- drivers/rpmsg/{rpmsg_core.c => core.c} | 13 ++++++++++--- drivers/rpmsg/{rpmsg_ns.c => ns.c} | 13 +++---------- include/linux/{rpmsg_ns.h => rpmsg/ns.h} | 6 +++++- 4 files changed, 19 insertions(+), 15 deletions(-) rename drivers/rpmsg/{rpmsg_core.c => core.c} (99%) rename drivers/rpmsg/{rpmsg_ns.c => ns.c} (87%) rename include/linux/{rpmsg_ns.h => rpmsg/ns.h} (95%) diff --git a/drivers/rpmsg/Makefile b/drivers/rpmsg/Makefile index 8d452656f0ee..5aa79e167372 100644 --- a/drivers/rpmsg/Makefile +++ b/drivers/rpmsg/Makefile @@ -1,7 +1,7 @@ # SPDX-License-Identifier: GPL-2.0 +rpmsg_core-objs := core.o ns.o obj-$(CONFIG_RPMSG) += rpmsg_core.o obj-$(CONFIG_RPMSG_CHAR) += rpmsg_char.o -obj-$(CONFIG_RPMSG_NS) += rpmsg_ns.o obj-$(CONFIG_RPMSG_MTK_SCP) += mtk_rpmsg.o qcom_glink-objs := qcom_glink_native.o qcom_glink_ssr.o obj-$(CONFIG_RPMSG_QCOM_GLINK) += qcom_glink.o diff --git a/drivers/rpmsg/rpmsg_core.c b/drivers/rpmsg/core.c similarity index 99% rename from drivers/rpmsg/rpmsg_core.c rename to drivers/rpmsg/core.c index 6381c1e00741..0c622cced804 100644 --- a/drivers/rpmsg/rpmsg_core.c +++ b/drivers/rpmsg/core.c @@ -14,6 +14,7 @@ #include #include #include +#include #include #include #include @@ -625,21 +626,27 @@ void unregister_rpmsg_driver(struct rpmsg_driver *rpdrv) } EXPORT_SYMBOL(unregister_rpmsg_driver); - static int __init rpmsg_init(void) { int ret; ret = bus_register(&rpmsg_bus); - if (ret) + if (ret) { pr_err("failed to register rpmsg bus: %d\n", ret); + return ret; + } + + ret = rpmsg_ns_init(); + if (ret) + bus_unregister(&rpmsg_bus); return ret; } postcore_initcall(rpmsg_init); -static void __exit rpmsg_fini(void) +static void rpmsg_fini(void) { + rpmsg_ns_exit(); bus_unregister(&rpmsg_bus); } module_exit(rpmsg_fini); diff --git a/drivers/rpmsg/rpmsg_ns.c b/drivers/rpmsg/ns.c similarity index 87% rename from drivers/rpmsg/rpmsg_ns.c rename to drivers/rpmsg/ns.c index 8e26824ca328..859c587b8300 100644 --- a/drivers/rpmsg/rpmsg_ns.c +++ b/drivers/rpmsg/ns.c @@ -7,7 +7,7 @@ #include #include #include -#include +#include #include "rpmsg_internal.h" @@ -84,7 +84,7 @@ static struct rpmsg_driver rpmsg_ns_driver = { .probe = rpmsg_ns_probe, }; -static int rpmsg_ns_init(void) +int rpmsg_ns_init(void) { int ret; @@ -94,15 +94,8 @@ static int rpmsg_ns_init(void) return ret; } -postcore_initcall(rpmsg_ns_init); -static void rpmsg_ns_exit(void) +void rpmsg_ns_exit(void) { unregister_rpmsg_driver(&rpmsg_ns_driver); } -module_exit(rpmsg_ns_exit); - -MODULE_DESCRIPTION("Name service announcement rpmsg Driver"); -MODULE_AUTHOR("Arnaud Pouliquen "); -MODULE_ALIAS("rpmsg_ns"); -MODULE_LICENSE("GPL v2"); diff --git a/include/linux/rpmsg_ns.h b/include/linux/rpmsg/ns.h similarity index 95% rename from include/linux/rpmsg_ns.h rename to include/linux/rpmsg/ns.h index 42786bb759b5..2838788c8448 100644 --- a/include/linux/rpmsg_ns.h +++ b/include/linux/rpmsg/ns.h @@ -4,8 +4,9 @@ #define _LINUX_RPMSG_NS_H #include -#include +#include #include +#include /** * struct rpmsg_ns_msg - dynamic name service announcement message @@ -56,4 +57,7 @@ static inline int rpmsg_ns_register_device(struct rpmsg_device *rpdev) return rpmsg_register_device(rpdev); } +int rpmsg_ns_init(void); +void rpmsg_ns_exit(void); + #endif -- 2.28.0