From nobody Fri Mar 29 10:33:32 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zohomail.com: domain of lists.xenproject.org designates 192.237.175.120 as permitted sender) client-ip=192.237.175.120; envelope-from=xen-devel-bounces@lists.xenproject.org; helo=lists.xenproject.org; Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of lists.xenproject.org designates 192.237.175.120 as permitted sender) smtp.mailfrom=xen-devel-bounces@lists.xenproject.org; dmarc=pass(p=none dis=none) header.from=kernel.org ARC-Seal: i=1; a=rsa-sha256; t=1642035634; cv=none; d=zohomail.com; s=zohoarc; b=Md0sXgx024yAzX8PCP7S5UhZk7j/jW/NaOInibwmYn6FODISXmMVtxPD5HMsRou4K/RIrKUXafSQnzzTLMW96KH6cRjgU/SrAR8SiedCbBmlD32fVs8RJV7CQCM2gmF2KMfLwXNT7y4J88CpjbKDT6kce0Jca7v1kERCOYANFNg= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1642035634; h=Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=6zt3mE1CVFyrXrTY85W0GCWVm6ga4f2jAS8czsdDsQQ=; b=G7qkgR0kAjVoh1zcXCPS+DLyfY5xxIyU04tU6Xb+CP5O5d5l/LIdWIKLp8B/gstQWUYnt+s5gZjtc9YumMjWOqQ4U/xMBSrUPPqWGPH/p87mvyq3IVDB/b1enVoZfep79THmB3zd5YFSJ8tMfuNRTwqGGsArKyTFMnYMHmD3WTM= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of lists.xenproject.org designates 192.237.175.120 as permitted sender) smtp.mailfrom=xen-devel-bounces@lists.xenproject.org; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists.xenproject.org (lists.xenproject.org [192.237.175.120]) by mx.zohomail.com with SMTPS id 1642035634389750.0036097404477; Wed, 12 Jan 2022 17:00:34 -0800 (PST) Received: from list by lists.xenproject.org with outflank-mailman.256947.441273 (Exim 4.92) (envelope-from ) id 1n7oTJ-00079r-2J; Thu, 13 Jan 2022 01:00:09 +0000 Received: by outflank-mailman (output) from mailman id 256947.441273; Thu, 13 Jan 2022 01:00:09 +0000 Received: from localhost ([127.0.0.1] helo=lists.xenproject.org) by lists.xenproject.org with esmtp (Exim 4.92) (envelope-from ) id 1n7oTI-000796-VT; Thu, 13 Jan 2022 01:00:08 +0000 Received: by outflank-mailman (input) for mailman id 256947; Thu, 13 Jan 2022 01:00:07 +0000 Received: from se1-gles-sth1-in.inumbo.com ([159.253.27.254] helo=se1-gles-sth1.inumbo.com) by lists.xenproject.org with esmtp (Exim 4.92) (envelope-from ) id 1n7oTH-0006MA-2g for xen-devel@lists.xenproject.org; Thu, 13 Jan 2022 01:00:07 +0000 Received: from dfw.source.kernel.org (dfw.source.kernel.org [139.178.84.217]) by se1-gles-sth1.inumbo.com (Halon) with ESMTPS id 24ece892-740c-11ec-bd6f-bfb69f65cdc7; Thu, 13 Jan 2022 02:00:05 +0100 (CET) Received: from smtp.kernel.org (relay.kernel.org [52.25.139.140]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by dfw.source.kernel.org (Postfix) with ESMTPS id AF4B361BCB; Thu, 13 Jan 2022 01:00:04 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id D2E44C36AE9; Thu, 13 Jan 2022 01:00:03 +0000 (UTC) X-Outflank-Mailman: Message body and most headers restored to incoming version X-BeenThere: xen-devel@lists.xenproject.org List-Id: Xen developer discussion List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Errors-To: xen-devel-bounces@lists.xenproject.org Precedence: list Sender: "Xen-devel" X-Inumbo-ID: 24ece892-740c-11ec-bd6f-bfb69f65cdc7 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1642035604; bh=894PkSIwThzVc3Bij8r5rtzhdxDcpe7P+4k/m0m/WcY=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=Re7m3TDQ+0SxdSa5cbtOYK19kiY3H+rYiFfB/Xq+wslcjYWSlL12lmzTtrKEJ5RMw VUqh5o0pJFNjXXZ/d+hAueor5CygVbEvEfFphvchCTwamz51ABnx6eF04XbkfD30Kv Nmih5bsWNh2DRG9WABOIZUZncxuoQs0uN5mO539drlIFctiYNKikL7BOT9xeeSyFaH 5BYyk8yEMSARYsc0/5mjCOleh5aE99MaM5Roeh7jhzWBHS1GzUJVKr2Mt0gbyI4h8b uzIW5PrZyTUMl2kN39x8b3et57e6C8dwlONwO3XXltC3qvstSNhCkZfVTlU2U4NQj9 gdqTzlx0i1zLA== From: Stefano Stabellini To: jgross@suse.com Cc: sstabellini@kernel.org, boris.ostrovsky@oracle.com, xen-devel@lists.xenproject.org, Luca Miccio , Stefano Stabellini Subject: [LINUX PATCH v2 1/1] xen: add support for initializing xenstore later as HVM domain Date: Wed, 12 Jan 2022 17:00:02 -0800 Message-Id: <20220113010002.1180463-1-sstabellini@kernel.org> X-Mailer: git-send-email 2.25.1 In-Reply-To: References: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-ZohoMail-DKIM: pass (identity @kernel.org) X-ZM-MESSAGEID: 1642035635735100001 Content-Type: text/plain; charset="utf-8" From: Luca Miccio When running as dom0less guest (HVM domain on ARM) the xenstore event channel is available at domain creation but the shared xenstore interface page only becomes available later on. In that case, wait for a notification on the xenstore event channel, then complete the xenstore initialization later, when the shared page is actually available. Signed-off-by: Luca Miccio Signed-off-by: Stefano Stabellini --- Changes in v2: - remove XENFEAT_xenstore_late_init --- drivers/xen/xenbus/xenbus_probe.c | 80 +++++++++++++++++++++++-------- 1 file changed, 61 insertions(+), 19 deletions(-) diff --git a/drivers/xen/xenbus/xenbus_probe.c b/drivers/xen/xenbus/xenbus_= probe.c index fe360c33ce71..51e52e175892 100644 --- a/drivers/xen/xenbus/xenbus_probe.c +++ b/drivers/xen/xenbus/xenbus_probe.c @@ -65,6 +65,7 @@ #include "xenbus.h" =20 =20 +static int xs_init_irq; int xen_store_evtchn; EXPORT_SYMBOL_GPL(xen_store_evtchn); =20 @@ -750,6 +751,17 @@ static void xenbus_probe(void) { xenstored_ready =3D 1; =20 + if (!xen_store_interface) { + xen_store_interface =3D xen_remap(xen_store_gfn << XEN_PAGE_SHIFT, + XEN_PAGE_SIZE); + /* + * Now it is safe to free the IRQ used for xenstore late + * initialization. No need to unbind: it is about to be + * bound again. + */ + free_irq(xs_init_irq, &xb_waitq); + } + /* * In the HVM case, xenbus_init() deferred its call to * xs_init() in case callbacks were not operational yet. @@ -798,20 +810,22 @@ static int __init xenbus_probe_initcall(void) { /* * Probe XenBus here in the XS_PV case, and also XS_HVM unless we - * need to wait for the platform PCI device to come up. + * need to wait for the platform PCI device to come up or + * xen_store_interface is not ready. */ if (xen_store_domain_type =3D=3D XS_PV || (xen_store_domain_type =3D=3D XS_HVM && - !xs_hvm_defer_init_for_callback())) + !xs_hvm_defer_init_for_callback() && + xen_store_interface !=3D NULL)) xenbus_probe(); =20 /* - * For XS_LOCAL, spawn a thread which will wait for xenstored - * or a xenstore-stubdom to be started, then probe. It will be - * triggered when communication starts happening, by waiting - * on xb_waitq. + * For XS_LOCAL or when xen_store_interface is not ready, spawn a + * thread which will wait for xenstored or a xenstore-stubdom to be + * started, then probe. It will be triggered when communication + * starts happening, by waiting on xb_waitq. */ - if (xen_store_domain_type =3D=3D XS_LOCAL) { + if (xen_store_domain_type =3D=3D XS_LOCAL || xen_store_interface =3D=3D N= ULL) { struct task_struct *probe_task; =20 probe_task =3D kthread_run(xenbus_probe_thread, NULL, @@ -907,6 +921,20 @@ static struct notifier_block xenbus_resume_nb =3D { .notifier_call =3D xenbus_resume_cb, }; =20 +static irqreturn_t xenbus_late_init(int irq, void *unused) +{ + int err =3D 0; + uint64_t v =3D 0; + + err =3D hvm_get_parameter(HVM_PARAM_STORE_PFN, &v); + if (err || !v || !~v) + return IRQ_HANDLED; + xen_store_gfn =3D (unsigned long)v; + + wake_up(&xb_waitq); + return IRQ_HANDLED; +} + static int __init xenbus_init(void) { int err; @@ -959,23 +987,37 @@ static int __init xenbus_init(void) * * Also recognize all bits set as an invalid value. */ - if (!v || !~v) { + if (!v) { err =3D -ENOENT; goto out_error; } - /* Avoid truncation on 32-bit. */ + if (v =3D=3D ~0ULL) { + err =3D bind_evtchn_to_irqhandler(xen_store_evtchn, + xenbus_late_init, + 0, "xenstore_late_init", + &xb_waitq); + if (err < 0) { + pr_err("xenstore_late_init couldn't bind irq err=3D%d\n", + err); + return err; + } + + xs_init_irq =3D err; + } else { + /* Avoid truncation on 32-bit. */ #if BITS_PER_LONG =3D=3D 32 - if (v > ULONG_MAX) { - pr_err("%s: cannot handle HVM_PARAM_STORE_PFN=3D%llx > ULONG_MAX\n", - __func__, v); - err =3D -EINVAL; - goto out_error; - } + if (v > ULONG_MAX) { + pr_err("%s: cannot handle HVM_PARAM_STORE_PFN=3D%llx > ULONG_MAX\n", + __func__, v); + err =3D -EINVAL; + goto out_error; + } #endif - xen_store_gfn =3D (unsigned long)v; - xen_store_interface =3D - xen_remap(xen_store_gfn << XEN_PAGE_SHIFT, - XEN_PAGE_SIZE); + xen_store_gfn =3D (unsigned long)v; + xen_store_interface =3D + xen_remap(xen_store_gfn << XEN_PAGE_SHIFT, + XEN_PAGE_SIZE); + } break; default: pr_warn("Xenstore state unknown\n"); --=20 2.25.1