From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mail-qt1-f172.google.com (mail-qt1-f172.google.com [209.85.160.172]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 546EF2C325C for ; Fri, 19 Jun 2026 08:35:36 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=pass smtp.client-ip=209.85.160.172 ARC-Seal:i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1781858137; cv=pass; b=IdlxYAMcm2qhwf4VUB6m9q96Ba375KugtS0uWZnzNNRo3WflLoRDrmxejDXEvPBA58d0/AvX1ufAJedXWrrylstLCUBgt18tzEMxf2Q7kfMTwLlDSuajKW2C+aajPIa+REtjTgWlzRrm6h70mjb6/CYmETN5gLntlrqZa2nvzyU= ARC-Message-Signature:i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1781858137; c=relaxed/simple; bh=/2P664m7jGEtDAIgqO27YOlQWepzpwSiTCXRoum/oLE=; h=MIME-Version:References:In-Reply-To:From:Date:Message-ID:Subject: To:Cc:Content-Type; b=Wj+7wO7QNEjonU5b4yXVCFBaW0z7BSVPicBruDCXJS02SyQQsVLcnI7QeILAPncxOfiMHdadP+hqUifjkq1d+9nWaS3kgAenx7Kbp/vEPugDv66EmVsru5xHJH8wCh0uq6w/73EuNnGmfrHPUi+IdIE2jzEaWo8MbsdBnNSqLSM= ARC-Authentication-Results:i=2; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com; spf=pass smtp.mailfrom=google.com; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b=udsHHS+i; arc=pass smtp.client-ip=209.85.160.172 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=google.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="udsHHS+i" Received: by mail-qt1-f172.google.com with SMTP id d75a77b69052e-51765331535so124861cf.1 for ; Fri, 19 Jun 2026 01:35:36 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1781858135; cv=none; d=google.com; s=arc-20260327; b=gKYcxhi6QdixDqXx04Z/Mh3g6ygzC2utNQmWk6tSVx2NImdBIW8Y06xbKO94YtI8u8 1LxSoHgs5RQVw1k0S1AC7zYs4FGAQlE5/1lwN2OLmLrk3ocSA9DcpEHcyIv29GT+j4DK 9Y82Ym5UbJEuHZa7vGRir0Pp5YR7SpzeuHmhrb8b2CGGauxjTI2iIt1huAy5oZFxHpUs tK6pwRiPqG4pyxTr2XqKrf2zDHHMkThbOVYW9+EiJ7SaQ8G+NFCIlrwNNRny3doPH03l C7jvLSgiaYY+0f2jWfXawHqZepAb53mkkGJUCRukdKCQXhoxJAKJ5mRa5sfjBqA8XcMq 8s6w== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20260327; h=cc:to:subject:message-id:date:from:in-reply-to:references :mime-version:dkim-signature; bh=vJCNxtqxuBlYp3k8AwtzAL+0dBQBaE1Rgq6EFlCIf04=; fh=EHJ+7yvpEiakE/P4ESNLuOTIFO4F0qY4Ye1tTBwEcnw=; b=snJ68t191/5tT2RlAZdi5GlUwXe+0feArHogz2HWfTQRFcqodLBou7br18SZrKpS5/ IGHrCfdxaoJMkUifEuurL3ZU9q/U8bjK8MYZV6rbmlgcMjFMljDpExgqW22TgUYGYE2U rkz6Nqk6Eb/77Mf+iZ6MMMZNbBvKSnPqVvGQh4i4fvBHeAtiFQ+VvKvNUmzhiEuvOdra HvdWJtqihkRSR5D4ABqknQ9h8PoFrmbB/BEVQYC8FuM6Sr4ZGYwhqnoTBX1PCwJoB0Jb S5fK0Eq6pES7oAIZ8eLcafu+jZEobM2PXo1a/yF0ENZko/LSp18l0vRIs3KAHznnFhql ndOA==; darn=vger.kernel.org ARC-Authentication-Results: i=1; mx.google.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20251104; t=1781858135; x=1782462935; darn=vger.kernel.org; h=content-type:cc:to:subject:message-id:date:from:in-reply-to :references:mime-version:from:to:cc:subject:date:message-id:reply-to :content-type; bh=vJCNxtqxuBlYp3k8AwtzAL+0dBQBaE1Rgq6EFlCIf04=; b=udsHHS+i25aggofArHhr2DS9m2ry8BQzgg3eT2kMYyLe77BdjoruBV9gi3qxkPzyA2 PkXqN5uCS0x92UWIv/YoFDZdkGs2Me24stmBd4Gs7t8/WcOoTlenIh/DsAcRhBUzQiVF AiqwjI6X1AdurJ7DJ+MPiJVXQk6UQZzveYywVdOxc9JmVtEpVvOTMkmmRqu5ZA2tmpvr 0dtawsZDq5vMfEk7UdMyxTWkko3CgFUaLoZSUwC3wWL3flZVOM1fU3o3pwNFwX3KQYNF k+AeXJ8NmaI1LUw1v1yF3qYIYX9kjZ8YQUErPGaNm7Ip6+fZIdcPG9RYAsWKHBzS/44e ZuMA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1781858135; x=1782462935; h=content-type:cc:to:subject:message-id:date:from:in-reply-to :references:mime-version:x-gm-gg:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to:content-type; bh=vJCNxtqxuBlYp3k8AwtzAL+0dBQBaE1Rgq6EFlCIf04=; b=Sm3peEQJumuhdRIA/sVv0xlv8bQftuFzWb5DFN60IIbiIh4Qhk1xVoPFOMCA1fMFj2 6hkKJf3/kRvxCcfAS6VJdJWqVK9+6AarJRlS5o5o1Cr7y36+Kcxkt5ykABPnjalyoTsY DQAG/zWjQXlsfC0UUhMNAMgaRTyZbEcaWJ1UWQRKEFdZo+oMGXvzanaBAakj2oaxlZk7 cRJBnXWV5ht75253enuSRmYBSKzKURp8uYqV5yJ6X1CG+zSLDOnsL07BcEFkO5Qds4bY dram+oTyT1Kx9DN2L+aARrTTmpdGNttWlauH6dzeKta5tfub+HREN7as5h24LwVshPuD Hf7g== X-Forwarded-Encrypted: i=1; AFNElJ8SIMqLZD2ijNfKk3QlN9P3HhOOKcGb7KQ4tmWVY/pbxtqgKpOETOKgvK25ugZ/sf2hJEN931s88ie/18U=@vger.kernel.org X-Gm-Message-State: AOJu0YySPqwjf8f+6mg6pUJls+Gd0sopBmM2tYoNGjtXdFtxdao43M0T hPcTiRx9GJc8FzyYTbiwdG44WTpPpe6YXnf9O2qevoOnWqsCyNQTUdlPelVAqz61aeZTfE4nQWw kLO/qNZWJnqSKVi0+oIyiyHqmRl0RDUWB2rj+jMb0 X-Gm-Gg: AfdE7clIB1jDXgv/OVOlvbi67sB7KQDx96/lNe0iFah7/JBicmzpVgQHhgHZ9HvqTc+ fHCEK+t1/DLnVkfnNDbGfIaAlm68G4/9uMXKE9F2yqa3jxOEhEWCSO/fOGESSewc7nsTz/eYmy8 JF0gHX8rvtSuGpz4g9jDu4Ibi1W1KPJ1Q2zPDXkRJtHAsXvUPieQTT/q9bnGsmo5P22OTiZPkiF +wPpAZw6NBUO7Z3qT9bDqZzaRUHjg5qiBhXYLHYwG0NxlVcZXSmO9ZMZbUPyCZ9/woYsZEIww== X-Received: by 2002:a05:622a:8893:b0:517:99ea:ab7e with SMTP id d75a77b69052e-519e4a70452mr6973311cf.24.1781858134705; Fri, 19 Jun 2026 01:35:34 -0700 (PDT) Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 References: <20260618-gmem-inplace-conversion-v8-0-9d2959357853@google.com> <20260618-gmem-inplace-conversion-v8-10-9d2959357853@google.com> In-Reply-To: <20260618-gmem-inplace-conversion-v8-10-9d2959357853@google.com> From: Fuad Tabba Date: Fri, 19 Jun 2026 09:34:57 +0100 X-Gm-Features: AVVi8Ce8UOYY3ibWf7EXz5J6tTWRIQf_RIk-gcXz8kRs-aLeFMDUqknE2c7ssDk Message-ID: Subject: Re: [PATCH v8 10/46] KVM: guest_memfd: Wire up core private/shared attribute interfaces To: ackerleytng@google.com Cc: aik@amd.com, andrew.jones@linux.dev, binbin.wu@linux.intel.com, brauner@kernel.org, chao.p.peng@linux.intel.com, david@kernel.org, jmattson@google.com, jthoughton@google.com, michael.roth@amd.com, oupton@kernel.org, pankaj.gupta@amd.com, qperret@google.com, rick.p.edgecombe@intel.com, rientjes@google.com, shivankg@amd.com, steven.price@arm.com, willy@infradead.org, wyihan@google.com, yan.y.zhao@intel.com, forkloop@google.com, pratyush@kernel.org, suzuki.poulose@arm.com, aneesh.kumar@kernel.org, liam@infradead.org, Paolo Bonzini , Sean Christopherson , Thomas Gleixner , Ingo Molnar , Borislav Petkov , Dave Hansen , x86@kernel.org, "H. Peter Anvin" , Steven Rostedt , Masami Hiramatsu , Mathieu Desnoyers , Jonathan Corbet , Shuah Khan , Shuah Khan , Vishal Annapurve , Andrew Morton , Chris Li , Kairui Song , Kemeng Shi , Nhat Pham , Barry Song , Axel Rasmussen , Yuanchu Xie , Wei Xu , Youngjun Park , Qi Zheng , Shakeel Butt , Kiryl Shutsemau , Baoquan He , Jason Gunthorpe , Vlastimil Babka , kvm@vger.kernel.org, linux-kernel@vger.kernel.org, linux-trace-kernel@vger.kernel.org, linux-doc@vger.kernel.org, linux-kselftest@vger.kernel.org, linux-mm@kvack.org, linux-coco@lists.linux.dev Content-Type: text/plain; charset="UTF-8" On Fri, 19 Jun 2026 at 01:31, Ackerley Tng via B4 Relay wrote: > > From: Sean Christopherson > > With in-place conversion, guest_memfd is able to track the private/shared > status of memory. Use a global flag to toggle between tracking > private/shared status per-vm or within guest_memfd. > > When queried for supported vm memory attributes, return 0 if attributes are > tracked in guest_memfd. > > When querying for memory attributes over a range, look up memory attributes > based on the flag's state at query time. > > For per-GFN memory attribute queries, choosing an implementation (VM or > guest_memfd lookup) at KVM load time. > > The flag is always false for now and will be made toggle-able after all > in-place conversion features are added in subsequent patches. > > If/since the flag is false, if CONFIG_KVM_VM_MEMORY_ATTRIBUTES is also not > selected, the per-GFN memory attribute query defaults to returning > 0 (false/not private). > > Co-developed-by: Ackerley Tng > Signed-off-by: Ackerley Tng > Signed-off-by: Sean Christopherson Reviewed-by: Fuad Tabba Cheers, /fuad > --- > include/linux/kvm_host.h | 4 ++++ > virt/kvm/guest_memfd.c | 22 +++++++++++++++++++--- > virt/kvm/kvm_main.c | 12 +++++++++++- > 3 files changed, 34 insertions(+), 4 deletions(-) > > diff --git a/include/linux/kvm_host.h b/include/linux/kvm_host.h > index 27687fb9d5201..acb552745b428 100644 > --- a/include/linux/kvm_host.h > +++ b/include/linux/kvm_host.h > @@ -2560,6 +2560,8 @@ static inline bool kvm_mem_range_is_private(struct kvm *kvm, gfn_t start, > #endif /* CONFIG_KVM_VM_MEMORY_ATTRIBUTES */ > > #ifdef kvm_arch_has_private_mem > +extern bool gmem_in_place_conversion; > + > typedef bool (kvm_mem_is_private_t)(struct kvm *kvm, gfn_t gfn); > DECLARE_STATIC_CALL(__kvm_mem_is_private, kvm_mem_is_private_t); > > @@ -2568,6 +2570,8 @@ static inline bool kvm_mem_is_private(struct kvm *kvm, gfn_t gfn) > return static_call(__kvm_mem_is_private)(kvm, gfn); > } > #else > +#define gmem_in_place_conversion false > + > static inline bool kvm_mem_is_private(struct kvm *kvm, gfn_t gfn) > { > return false; > diff --git a/virt/kvm/guest_memfd.c b/virt/kvm/guest_memfd.c > index bca912db5be6e..e0e544ef47d69 100644 > --- a/virt/kvm/guest_memfd.c > +++ b/virt/kvm/guest_memfd.c > @@ -926,6 +926,24 @@ int kvm_gmem_get_pfn(struct kvm *kvm, struct kvm_memory_slot *slot, > EXPORT_SYMBOL_FOR_KVM_INTERNAL(kvm_gmem_get_pfn); > > #ifdef CONFIG_HAVE_KVM_ARCH_GMEM_POPULATE > +static bool kvm_gmem_range_is_private(struct file *file, pgoff_t index, > + size_t nr_pages, struct kvm *kvm, gfn_t gfn) > +{ > + struct maple_tree *mt = &GMEM_I(file_inode(file))->attributes; > + pgoff_t end = index + nr_pages - 1; > + void *entry; > + > + if (!gmem_in_place_conversion) > + return kvm_range_has_vm_memory_attributes(kvm, gfn, gfn + nr_pages, > + KVM_MEMORY_ATTRIBUTE_PRIVATE, > + KVM_MEMORY_ATTRIBUTE_PRIVATE); > + > + mt_for_each(mt, entry, index, end) { > + if (xa_to_value(entry) != KVM_MEMORY_ATTRIBUTE_PRIVATE) > + return false; > + } > + return true; > +} > > static long __kvm_gmem_populate(struct kvm *kvm, struct kvm_memory_slot *slot, > struct file *file, gfn_t gfn, struct page *src_page, > @@ -946,9 +964,7 @@ static long __kvm_gmem_populate(struct kvm *kvm, struct kvm_memory_slot *slot, > > folio_unlock(folio); > > - if (!kvm_range_has_vm_memory_attributes(kvm, gfn, gfn + 1, > - KVM_MEMORY_ATTRIBUTE_PRIVATE, > - KVM_MEMORY_ATTRIBUTE_PRIVATE)) { > + if (!kvm_gmem_range_is_private(file, index, 1, kvm, gfn)) { > ret = -EINVAL; > goto out_put_folio; > } > diff --git a/virt/kvm/kvm_main.c b/virt/kvm/kvm_main.c > index 8b238e461b854..01761f6e25d25 100644 > --- a/virt/kvm/kvm_main.c > +++ b/virt/kvm/kvm_main.c > @@ -101,6 +101,10 @@ EXPORT_SYMBOL_FOR_KVM_INTERNAL(halt_poll_ns_shrink); > static bool __ro_after_init allow_unsafe_mappings; > module_param(allow_unsafe_mappings, bool, 0444); > > +#ifdef kvm_arch_has_private_mem > +bool __ro_after_init gmem_in_place_conversion = false; > +#endif > + > /* > * Ordering of locks: > * > @@ -2422,6 +2426,9 @@ static int kvm_vm_ioctl_clear_dirty_log(struct kvm *kvm, > static u64 kvm_supported_vm_mem_attributes(struct kvm *kvm) > { > #ifdef kvm_arch_has_private_mem > + if (gmem_in_place_conversion) > + return 0; > + > if (!kvm || kvm_arch_has_private_mem(kvm)) > return KVM_MEMORY_ATTRIBUTE_PRIVATE; > #endif > @@ -2633,8 +2640,11 @@ EXPORT_STATIC_CALL_GPL(__kvm_mem_is_private); > > static void kvm_init_memory_attributes(void) > { > + if (gmem_in_place_conversion) > + static_call_update(__kvm_mem_is_private, kvm_gmem_is_private); > #ifdef CONFIG_KVM_VM_MEMORY_ATTRIBUTES > - static_call_update(__kvm_mem_is_private, kvm_vm_mem_is_private); > + else > + static_call_update(__kvm_mem_is_private, kvm_vm_mem_is_private); > #endif > } > #else > > -- > 2.55.0.rc0.738.g0c8ab3ebcc-goog > >