From mboxrd@z Thu Jan 1 00:00:00 1970 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 bombadil.infradead.org (bombadil.infradead.org [198.137.202.133]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id 01571EA4E07 for ; Mon, 2 Mar 2026 14:41:05 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20210309; h=Sender:List-Subscribe:List-Help :List-Post:List-Archive:List-Unsubscribe:List-Id:Content-Type:MIME-Version: References:In-Reply-To:Subject:Cc:To:From:Message-ID:Date:Reply-To: Content-Transfer-Encoding:Content-ID:Content-Description:Resent-Date: Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID:List-Owner; bh=IkTXPgOoOcrGEvukCA8+yJi0+fYvSBaaSakUT8ohqGw=; b=UsCrv1BadUXMTo7w7VkYlYnKjM ZvWuMD/PUDNc7rpLO0xpqFBwYCf+c5kHQ77mlFEK0g+6KNC7sW+Yoyn8hQAWRdFYDAQ+1ts9YOfQu AjG3/eG8QbQ8RsNmlt/PvpBsdEwCD7AFgvbHjP5VBPzzSJT6kSehjGlzz2Rxp3W20WFUbJPQ1N9yN I1rn31Z0dl3W3JmvzKuKyr7IhwZ0V5g6U9+UQ/mMXcbce9dDJFhhImgmKQwbNGtl9p5VeDKyXbbJ+ FEdg9s0h9CmVmLd4wnKIfX6UYqhgb2tXpolqHybckNJWh7illcU98ZFcXbFinEU1QVoJSdD40Cb4H iH8d2q4w==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.98.2 #2 (Red Hat Linux)) id 1vx4SB-0000000DFbs-2Nmn; Mon, 02 Mar 2026 14:40:59 +0000 Received: from tor.source.kernel.org ([172.105.4.254]) by bombadil.infradead.org with esmtps (Exim 4.98.2 #2 (Red Hat Linux)) id 1vx4SA-0000000DFbf-1X8Z for linux-arm-kernel@lists.infradead.org; Mon, 02 Mar 2026 14:40:58 +0000 Received: from smtp.kernel.org (transwarp.subspace.kernel.org [100.75.92.58]) by tor.source.kernel.org (Postfix) with ESMTP id 84FA1600AD; Mon, 2 Mar 2026 14:40:57 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id 2CD32C2BC87; Mon, 2 Mar 2026 14:40:57 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1772462457; bh=0BX32rikMvdKmXC/ZetcwR4NQo3eeiBaEA6cl/8/jL4=; h=Date:From:To:Cc:Subject:In-Reply-To:References:From; b=bQnl2EfjARf61qvvtmuKW2BmsdeY+7kF/+PPxOJsE6Ua/U1JITg9L3KPIwlNhwF/k prOm/v6D06rZ1UjUkTyOzW4CzXAbKppBTYmZ6/K3VLID1KROqhErHkbriTPSwoQNwS McRg5FPUb/rTUdi7rHTYU0G3IN4JcFE98+RQBolSjxGAaCAPztGb+7Hj8M47Jy2Wm2 D+aegsuvJmrguzO+2AaAYCEZc/pdl7Cb2v/fhvcreFmjJzztvguK4a+gM4h7NmtjNg kb2ttvq8Niyg0hX3in9bZa4Oqksy/II0DgpIAmLaz8/Z37RreUvXo4/DIgNNEWuBt5 1kKmMX+xxPrmQ== Received: from sofa.misterjones.org ([185.219.108.64] helo=goblin-girl.misterjones.org) by disco-boy.misterjones.org with esmtpsa (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.98.2) (envelope-from ) id 1vx4S6-0000000FHIR-37Cg; Mon, 02 Mar 2026 14:40:54 +0000 Date: Mon, 02 Mar 2026 14:40:54 +0000 Message-ID: <86seai8fbd.wl-maz@kernel.org> From: Marc Zyngier To: Steven Price Cc: kvm@vger.kernel.org, kvmarm@lists.linux.dev, Catalin Marinas , Will Deacon , James Morse , Oliver Upton , Suzuki K Poulose , Zenghui Yu , linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org, Joey Gouly , Alexandru Elisei , Christoffer Dall , Fuad Tabba , linux-coco@lists.linux.dev, Ganapatrao Kulkarni , Gavin Shan , Shanker Donthineni , Alper Gun , "Aneesh Kumar K . V" , Emi Kisanuki , Vishal Annapurve Subject: Re: [PATCH v12 11/46] arm64: RMI: Activate realm on first VCPU run In-Reply-To: <20251217101125.91098-12-steven.price@arm.com> References: <20251217101125.91098-1-steven.price@arm.com> <20251217101125.91098-12-steven.price@arm.com> User-Agent: Wanderlust/2.15.9 (Almost Unreal) SEMI-EPG/1.14.7 (Harue) FLIM-LB/1.14.9 (=?UTF-8?B?R29qxY0=?=) APEL-LB/10.8 EasyPG/1.0.0 Emacs/30.1 (aarch64-unknown-linux-gnu) MULE/6.0 (HANACHIRUSATO) MIME-Version: 1.0 (generated by SEMI-EPG 1.14.7 - "Harue") Content-Type: text/plain; charset=US-ASCII X-SA-Exim-Connect-IP: 185.219.108.64 X-SA-Exim-Rcpt-To: steven.price@arm.com, kvm@vger.kernel.org, kvmarm@lists.linux.dev, catalin.marinas@arm.com, will@kernel.org, james.morse@arm.com, oliver.upton@linux.dev, suzuki.poulose@arm.com, yuzenghui@huawei.com, linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org, joey.gouly@arm.com, alexandru.elisei@arm.com, christoffer.dall@arm.com, tabba@google.com, linux-coco@lists.linux.dev, gankulkarni@os.amperecomputing.com, gshan@redhat.com, sdonthineni@nvidia.com, alpergun@google.com, aneesh.kumar@kernel.org, fj0570is@fujitsu.com, vannapurve@google.com X-SA-Exim-Mail-From: maz@kernel.org X-SA-Exim-Scanned: No (on disco-boy.misterjones.org); SAEximRunCond expanded to false X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+linux-arm-kernel=archiver.kernel.org@lists.infradead.org On Wed, 17 Dec 2025 10:10:48 +0000, Steven Price wrote: > > When a VCPU migrates to another physical CPU check To another physical CPU? That's not what kvm_arch_vcpu_run_pid_change() tracks. It really is limited to a new PID being associated to the vpcu thread. Which is indeed the case when the vpcu runs for the first time, but that's about it. If you need to track the physical CPU, we have some tracking for it in vcpu_load(), but that'd need some rework. > if this is the first > time the guest has run, and if so activate the realm. > > Before the realm can be activated it must first be created, this is a > stub in this patch and will be filled in by a later patch. > > Signed-off-by: Steven Price > --- > New patch for v12 > --- > arch/arm64/include/asm/kvm_rmi.h | 1 + > arch/arm64/kvm/arm.c | 6 +++++ > arch/arm64/kvm/rmi.c | 42 ++++++++++++++++++++++++++++++++ > 3 files changed, 49 insertions(+) > > diff --git a/arch/arm64/include/asm/kvm_rmi.h b/arch/arm64/include/asm/kvm_rmi.h > index cb7350f8a01a..e4534af06d96 100644 > --- a/arch/arm64/include/asm/kvm_rmi.h > +++ b/arch/arm64/include/asm/kvm_rmi.h > @@ -69,6 +69,7 @@ void kvm_init_rmi(void); > u32 kvm_realm_ipa_limit(void); > > int kvm_init_realm_vm(struct kvm *kvm); > +int kvm_activate_realm(struct kvm *kvm); > void kvm_destroy_realm(struct kvm *kvm); > void kvm_realm_destroy_rtts(struct kvm *kvm); > > diff --git a/arch/arm64/kvm/arm.c b/arch/arm64/kvm/arm.c > index 941d1bec8e77..542df37b9e82 100644 > --- a/arch/arm64/kvm/arm.c > +++ b/arch/arm64/kvm/arm.c > @@ -951,6 +951,12 @@ int kvm_arch_vcpu_run_pid_change(struct kvm_vcpu *vcpu) > return ret; > } > > + if (kvm_is_realm(vcpu->kvm)) { > + ret = kvm_activate_realm(kvm); > + if (ret) > + return ret; > + } > + > mutex_lock(&kvm->arch.config_lock); > set_bit(KVM_ARCH_FLAG_HAS_RAN_ONCE, &kvm->arch.flags); > mutex_unlock(&kvm->arch.config_lock); > diff --git a/arch/arm64/kvm/rmi.c b/arch/arm64/kvm/rmi.c > index e57e8b7eafa9..98929382c365 100644 > --- a/arch/arm64/kvm/rmi.c > +++ b/arch/arm64/kvm/rmi.c > @@ -223,6 +223,48 @@ void kvm_realm_destroy_rtts(struct kvm *kvm) > WARN_ON(realm_tear_down_rtt_range(realm, 0, (1UL << ia_bits))); > } > > +static int realm_ensure_created(struct kvm *kvm) > +{ > + /* Provided in later patch */ > + return -ENXIO; > +} > + > +int kvm_activate_realm(struct kvm *kvm) > +{ > + struct realm *realm = &kvm->arch.realm; > + int ret; > + > + if (!kvm_is_realm(kvm)) > + return -ENXIO; nit: you already checked for this in caller. > + > + if (kvm_realm_state(kvm) == REALM_STATE_ACTIVE) > + return 0; You probably also want to return early once the realm has been marked as dead -- it shouldn't be able to be a zombie and die twice. > + > + guard(mutex)(&kvm->arch.config_lock); > + /* Check again with the lock held */ > + if (kvm_realm_state(kvm) == REALM_STATE_ACTIVE) > + return 0; > + > + ret = realm_ensure_created(kvm); > + if (ret) > + return ret; > + > + /* Mark state as dead in case we fail */ > + WRITE_ONCE(realm->state, REALM_STATE_DEAD); > + > + if (!irqchip_in_kernel(kvm)) { > + /* Userspace irqchip not yet supported with realms */ > + return -EOPNOTSUPP; > + } > + > + ret = rmi_realm_activate(virt_to_phys(realm->rd)); > + if (ret) > + return -ENXIO; > + > + WRITE_ONCE(realm->state, REALM_STATE_ACTIVE); > + return 0; > +} > + > void kvm_destroy_realm(struct kvm *kvm) > { > struct realm *realm = &kvm->arch.realm; Thanks, M. -- Without deviation from the norm, progress is not possible.