From nobody Thu Apr 2 09:33:37 2026 Received: from mail-pf1-f201.google.com (mail-pf1-f201.google.com [209.85.210.201]) (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 5B301324718 for ; Thu, 26 Mar 2026 22:24:26 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.210.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1774563868; cv=none; b=Mrkmu0UzTUTM1aoMphF4gW+rmgeGW12itvXUzjP8xjgTKOumNrW45c9mvug99Da7+Oy6XtvlmFChIOxSFlTzCsoBvu5MkQaN998D9jDSqWLWu8PC1lose235yKuBDaaF51xRshiU67xbEBsaD6ow/MjPIFvIVZqmTw13Qjc30oE= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1774563868; c=relaxed/simple; bh=01j1qGC4nKoNxNGuH2nf4jfKtDpoOtuGPrPGqt38AeM=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=YIrCiITO0b6UIxj1H2wYV9l1T7vbCBMRMgHXxgbyWmABL3ZqQOA4DawaAC5IddSfuresHxp7GQjTLTO344o9DIGMmxhY4m2GKV+Dvped5LQC4OVrl4kgUbCqnrse8djdfj9MY3NUB7Kz/IwZ54KvuOwmp+Y5y7fHAUWzeX7CuoQ= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com; spf=pass smtp.mailfrom=flex--ackerleytng.bounces.google.com; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b=SKBDdojq; arc=none smtp.client-ip=209.85.210.201 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=flex--ackerleytng.bounces.google.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="SKBDdojq" Received: by mail-pf1-f201.google.com with SMTP id d2e1a72fcca58-82c8768a704so526398b3a.3 for ; Thu, 26 Mar 2026 15:24:26 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20251104; t=1774563866; x=1775168666; darn=vger.kernel.org; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:from:to:cc:subject:date:message-id:reply-to; bh=EvLclgOKHNaEuz+5qe94Ple9yEsi/Y6tRhhrH2HYDiI=; b=SKBDdojqOzKtf1Yv+M1HzlpFfpnIWvGlTVEc99ZM2Or7aekqxxbFmLLvwZtGR33IHU ll1543WN5xFMOrwkHWcyOTD0qgZiRlnJPA4BEknVVEeNSMC0hQ9pparGs4o3ewRcFhKL du1T/03fNlBalOmxRweKi72YnLbmuiVURV7a3+Bs7pmgtq+vcVrxP3ChGpVPKVELe10t Hzjfqa3U7wUoBb/A7VZD8m1rVYiZPGdvDwZiZWhXjxUPFvbOXCCX1zivN5oZh8ACgCev dQ+IUFuUfwHdw44QPtn2ItxQGxUm33MUPrHX/4EXhQyxyiLXD+SZaka5miLFZ1ZOCkwT 7s9g== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1774563866; x=1775168666; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=EvLclgOKHNaEuz+5qe94Ple9yEsi/Y6tRhhrH2HYDiI=; b=Z+uTsvh+QDKuElBbRgbxzPgXzwtHnxiaW7VueUDTb/J25HIZ+xvZr5YXC7PqgR0nSs oUzecf0kKYN8ksWMuwpLsVm4MUpf33Zm/r9OiOG+YtfORLWSYHN63AsjI3OV6A2Jx1bU jppemuSIdaZ+TyJkYcYX68okyIKanB/nZUKdGsT1pPWTR/jZC3VVcKx6MwugrFBvM+Sv UNdFbJj6WMR/mf4OwHcrs8LJmcYgMRyO0h019VXFNKlDrdC+TSa4xZmda+CAF4ga6HDh QmBuPx6/cHEWbs02sl4fAgFNeNZeFaEH2+xI1k7GRmhGiQxa66tiT1ZrZ1uBS0nNyOTp 3kIw== X-Forwarded-Encrypted: i=1; AJvYcCXU41rFp41ZpCUG2WusYGGud/zVsGs+5qUqGp69Er0bOCuaMq/RtrwG0qbsdJC8UXx7xjfYqlaE0pM0E+M=@vger.kernel.org X-Gm-Message-State: AOJu0YzLRy3E8QBeBCMf3SnlH+0NTPcVq91W3KmHAcN+PlIBn3LuWdJq iLtRe64DV2UZS97aHzLScPX/N3c9RaFFl1Te+04CpLaprqnLLNN31LI8eCkZa6oMYFcrLGA3cSP 6hi8E1ZYU91y+9B31aYH/MgixQw== X-Received: from pfbdo1.prod.google.com ([2002:a05:6a00:4a01:b0:82a:69ed:da7f]) (user=ackerleytng job=prod-delivery.src-stubby-dispatcher) by 2002:a05:6a00:1c91:b0:82a:ea3:c172 with SMTP id d2e1a72fcca58-82c960a3070mr122788b3a.46.1774563865140; Thu, 26 Mar 2026 15:24:25 -0700 (PDT) Date: Thu, 26 Mar 2026 15:24:10 -0700 In-Reply-To: <20260326-gmem-inplace-conversion-v4-0-e202fe950ffd@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20260326-gmem-inplace-conversion-v4-0-e202fe950ffd@google.com> X-Developer-Key: i=ackerleytng@google.com; a=ed25519; pk=sAZDYXdm6Iz8FHitpHeFlCMXwabodTm7p8/3/8xUxuU= X-Developer-Signature: v=1; a=ed25519-sha256; t=1774563861; l=8353; i=ackerleytng@google.com; s=20260225; h=from:subject:message-id; bh=/7d+6WxzM1yQ/r5DfFDHnWSFoF6dLqT6urgJkYmJFIc=; b=aNo2rFWL2T9tXzUkyVyzAyRPcD3TrDI87hbSexDY3eJptczvfKo0duBcnObyazM0GuJIUyfeC 0gDwAwcBGMbDhQByr61PqkADsvCAd5UUFA+y/oKrj5z9l1Jq+K1IFep X-Mailer: b4 0.14.3 Message-ID: <20260326-gmem-inplace-conversion-v4-1-e202fe950ffd@google.com> Subject: [PATCH RFC v4 01/44] KVM: guest_memfd: Introduce per-gmem attributes, use to guard user mappings From: Ackerley Tng To: aik@amd.com, andrew.jones@linux.dev, binbin.wu@linux.intel.com, brauner@kernel.org, chao.p.peng@linux.intel.com, david@kernel.org, ira.weiny@intel.com, jmattson@google.com, jroedel@suse.de, 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, tabba@google.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, 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 , Baoquan He , Barry Song , Axel Rasmussen , Yuanchu Xie , Wei Xu , Jason Gunthorpe , Vlastimil Babka Cc: 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, Ackerley Tng Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable From: Sean Christopherson Start plumbing in guest_memfd support for in-place private<=3D>shared conversions by tracking attributes via a maple tree. KVM currently tracks private vs. shared attributes on a per-VM basis, which made sense when a guest_memfd _only_ supported private memory, but tracking per-VM simply can't work for in-place conversions as the shareability of a given page needs to be per-gmem_inode, not per-VM. Use the filemap invalidation lock to protect the maple tree, as taking the lock for read when faulting in memory (for userspace or the guest) isn't expected to result in meaningful contention, and using a separate lock would add significant complexity (avoid deadlock is quite difficult). Signed-off-by: Sean Christopherson Co-developed-by: Ackerley Tng Signed-off-by: Ackerley Tng Co-developed-by: Vishal Annapurve Signed-off-by: Vishal Annapurve Co-developed-by: Fuad Tabba Signed-off-by: Fuad Tabba --- virt/kvm/guest_memfd.c | 139 +++++++++++++++++++++++++++++++++++++++++++--= ---- 1 file changed, 123 insertions(+), 16 deletions(-) diff --git a/virt/kvm/guest_memfd.c b/virt/kvm/guest_memfd.c index 017d84a7adf37..aa2caf5114da2 100644 --- a/virt/kvm/guest_memfd.c +++ b/virt/kvm/guest_memfd.c @@ -4,6 +4,7 @@ #include #include #include +#include #include #include #include @@ -32,6 +33,12 @@ struct gmem_inode { struct inode vfs_inode; =20 u64 flags; + /* + * Every index in this inode, whether memory is populated or + * not, is tracked in attributes. There are no gaps in this + * maple tree. + */ + struct maple_tree attributes; }; =20 static __always_inline struct gmem_inode *GMEM_I(struct inode *inode) @@ -59,6 +66,31 @@ static pgoff_t kvm_gmem_get_index(struct kvm_memory_slot= *slot, gfn_t gfn) return gfn - slot->base_gfn + slot->gmem.pgoff; } =20 +static u64 kvm_gmem_get_attributes(struct inode *inode, pgoff_t index) +{ + struct maple_tree *mt =3D &GMEM_I(inode)->attributes; + void *entry =3D mtree_load(mt, index); + + /* + * The lock _must_ be held for lookups, as some maple tree operations, + * e.g. append, are unsafe (return inaccurate information) with respect + * to concurrent RCU-protected lookups. + */ + lockdep_assert(mt_lock_is_held(mt)); + + return WARN_ON_ONCE(!entry) ? 0 : xa_to_value(entry); +} + +static bool kvm_gmem_is_private_mem(struct inode *inode, pgoff_t index) +{ + return kvm_gmem_get_attributes(inode, index) & KVM_MEMORY_ATTRIBUTE_PRIVA= TE; +} + +static bool kvm_gmem_is_shared_mem(struct inode *inode, pgoff_t index) +{ + return !kvm_gmem_is_private_mem(inode, index); +} + static int __kvm_gmem_prepare_folio(struct kvm *kvm, struct kvm_memory_slo= t *slot, pgoff_t index, struct folio *folio) { @@ -397,10 +429,13 @@ static vm_fault_t kvm_gmem_fault_user_mapping(struct = vm_fault *vmf) if (((loff_t)vmf->pgoff << PAGE_SHIFT) >=3D i_size_read(inode)) return VM_FAULT_SIGBUS; =20 - if (!(GMEM_I(inode)->flags & GUEST_MEMFD_FLAG_INIT_SHARED)) - return VM_FAULT_SIGBUS; + filemap_invalidate_lock_shared(inode->i_mapping); + if (kvm_gmem_is_shared_mem(inode, vmf->pgoff)) + folio =3D kvm_gmem_get_folio(inode, vmf->pgoff); + else + folio =3D ERR_PTR(-EACCES); + filemap_invalidate_unlock_shared(inode->i_mapping); =20 - folio =3D kvm_gmem_get_folio(inode, vmf->pgoff); if (IS_ERR(folio)) { if (PTR_ERR(folio) =3D=3D -EAGAIN) return VM_FAULT_RETRY; @@ -556,6 +591,51 @@ bool __weak kvm_arch_supports_gmem_init_shared(struct = kvm *kvm) return true; } =20 +static int kvm_gmem_init_inode(struct inode *inode, loff_t size, u64 flags) +{ + struct gmem_inode *gi =3D GMEM_I(inode); + MA_STATE(mas, &gi->attributes, 0, (size >> PAGE_SHIFT) - 1); + u64 attrs; + int r; + + inode->i_op =3D &kvm_gmem_iops; + inode->i_mapping->a_ops =3D &kvm_gmem_aops; + inode->i_mode |=3D S_IFREG; + inode->i_size =3D size; + mapping_set_gfp_mask(inode->i_mapping, GFP_HIGHUSER); + + /* + * guest_memfd memory is neither migratable nor swappable: set + * inaccessible to gate off both. + */ + mapping_set_inaccessible(inode->i_mapping); + WARN_ON_ONCE(!mapping_unevictable(inode->i_mapping)); + + gi->flags =3D flags; + + mt_set_external_lock(&gi->attributes, + &inode->i_mapping->invalidate_lock); + + /* + * Store default attributes for the entire gmem instance. Ensuring every + * index is represented in the maple tree at all times simplifies the + * conversion and merging logic. + */ + attrs =3D gi->flags & GUEST_MEMFD_FLAG_INIT_SHARED ? 0 : KVM_MEMORY_ATTRI= BUTE_PRIVATE; + + /* + * Acquire the invalidation lock purely to make lockdep happy. The + * maple tree library expects all stores to be protected via the lock, + * and the library can't know when the tree is reachable only by the + * caller, as is the case here. + */ + filemap_invalidate_lock(inode->i_mapping); + r =3D mas_store_gfp(&mas, xa_mk_value(attrs), GFP_KERNEL); + filemap_invalidate_unlock(inode->i_mapping); + + return r; +} + static int __kvm_gmem_create(struct kvm *kvm, loff_t size, u64 flags) { static const char *name =3D "[kvm-gmem]"; @@ -586,16 +666,9 @@ static int __kvm_gmem_create(struct kvm *kvm, loff_t s= ize, u64 flags) goto err_fops; } =20 - inode->i_op =3D &kvm_gmem_iops; - inode->i_mapping->a_ops =3D &kvm_gmem_aops; - inode->i_mode |=3D S_IFREG; - inode->i_size =3D size; - mapping_set_gfp_mask(inode->i_mapping, GFP_HIGHUSER); - mapping_set_inaccessible(inode->i_mapping); - /* Unmovable mappings are supposed to be marked unevictable as well. */ - WARN_ON_ONCE(!mapping_unevictable(inode->i_mapping)); - - GMEM_I(inode)->flags =3D flags; + err =3D kvm_gmem_init_inode(inode, size, flags); + if (err) + goto err_inode; =20 file =3D alloc_file_pseudo(inode, kvm_gmem_mnt, name, O_RDWR, &kvm_gmem_f= ops); if (IS_ERR(file)) { @@ -797,9 +870,13 @@ int kvm_gmem_get_pfn(struct kvm *kvm, struct kvm_memor= y_slot *slot, if (!file) return -EFAULT; =20 + filemap_invalidate_lock_shared(file_inode(file)->i_mapping); + folio =3D __kvm_gmem_get_pfn(file, slot, index, pfn, max_order); - if (IS_ERR(folio)) - return PTR_ERR(folio); + if (IS_ERR(folio)) { + r =3D PTR_ERR(folio); + goto out; + } =20 if (!folio_test_uptodate(folio)) { clear_highpage(folio_page(folio, 0)); @@ -815,6 +892,8 @@ int kvm_gmem_get_pfn(struct kvm *kvm, struct kvm_memory= _slot *slot, else folio_put(folio); =20 +out: + filemap_invalidate_unlock_shared(file_inode(file)->i_mapping); return r; } EXPORT_SYMBOL_FOR_KVM_INTERNAL(kvm_gmem_get_pfn); @@ -944,13 +1023,41 @@ static struct inode *kvm_gmem_alloc_inode(struct sup= er_block *sb) =20 mpol_shared_policy_init(&gi->policy, NULL); =20 + /* + * Memory attributes are protected by the filemap invalidation lock, but + * the lock structure isn't available at this time. Immediately mark + * maple tree as using external locking so that accessing the tree + * before it's fully initialized results in NULL pointer dereferences + * and not more subtle bugs. + */ + mt_init_flags(&gi->attributes, MT_FLAGS_LOCK_EXTERN); + gi->flags =3D 0; return &gi->vfs_inode; } =20 static void kvm_gmem_destroy_inode(struct inode *inode) { - mpol_free_shared_policy(&GMEM_I(inode)->policy); + struct gmem_inode *gi =3D GMEM_I(inode); + + mpol_free_shared_policy(&gi->policy); + + /* + * Note! Checking for an empty tree is functionally necessary + * to avoid explosions if the tree hasn't been fully + * initialized, i.e. if the inode is being destroyed before + * guest_memfd can set the external lock, lockdep would find + * that the tree's internal ma_lock was not held. + */ + if (!mtree_empty(&gi->attributes)) { + /* + * Acquire the invalidation lock purely to make lockdep happy, + * the inode is unreachable at this point. + */ + filemap_invalidate_lock(inode->i_mapping); + __mt_destroy(&gi->attributes); + filemap_invalidate_unlock(inode->i_mapping); + } } =20 static void kvm_gmem_free_inode(struct inode *inode) --=20 2.53.0.1018.g2bb0e51243-goog From nobody Thu Apr 2 09:33:37 2026 Received: from mail-pg1-f202.google.com (mail-pg1-f202.google.com [209.85.215.202]) (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 91CBE33D4F2 for ; Thu, 26 Mar 2026 22:24:28 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.215.202 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1774563871; cv=none; b=qGYKgPNhPWh6QjoGB6RBldVSJnm5J7EQ5DIC8oFaPuTlQyrXPu/MMVzYp/XD8ACbxVudVK1RxXZF2SQzxfvazQCS8VHEYugMq17WQ7ILU2LonxRs/yoiWGjRRO088DVbqCg1XirKl+jY4lxKFj51JV7HBO15sdPmU2WqNOGXxZg= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1774563871; c=relaxed/simple; bh=OT5zMcyPKtTRuDM2DPTJVa/zX1elxHRLsEzBTP6WWMU=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=S5Hi8aI3VfTpg9HQn6WB6TFoEReUu9nhnmUXzC3UeOPfhJQxLSZsYSSQ+owf+eeXfSFwC7Q/jzWjBWbXEDRrvbNGDOyd4x4zkkbTpbCdepmAbcMNzs9+jWnPcZ0BypT0VhymhpgeMdOG9X+Gv4keSOs2IBGR+wDBe5heyUxSKeE= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com; spf=pass smtp.mailfrom=flex--ackerleytng.bounces.google.com; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b=e166Hk1B; arc=none smtp.client-ip=209.85.215.202 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=flex--ackerleytng.bounces.google.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="e166Hk1B" Received: by mail-pg1-f202.google.com with SMTP id 41be03b00d2f7-c70dd30025fso2644542a12.2 for ; Thu, 26 Mar 2026 15:24:28 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20251104; t=1774563868; x=1775168668; darn=vger.kernel.org; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:from:to:cc:subject:date:message-id:reply-to; bh=tRzhOWKsVJmkjknbsmsUCquvBozs/br4JAMQ/wymcsI=; b=e166Hk1BXHUGkOPVYbwlZ1qut5uR4fVylY8TNDqUHYEG6a6XQkysN9PaD5Fftx3ICd w1TW1WNmcEeK93f4Ldb6PJG/id54FPMClN7VxK/PvaAaJzkBa5Evcwi1/ovt05jK3k7W taX7mzN7XKSmQ9UJy60JZGOBEN+3iaFQe3QnLdihXBEfonOKqZTuk4SMOn6TwMWGumz0 /W/f49rITG/8fQczy+tRLA9XSRJzEh5TASt9d2amOCdP2wGDpN785E8ZsB5E1yIGbwid USIyIi9ZlgBFk7LzuJHI8cjgWZ9Ro/S/QvzeoL0QPRu7/nRh/nmG2/Dnska8uPndWi2R tLTA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1774563868; x=1775168668; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=tRzhOWKsVJmkjknbsmsUCquvBozs/br4JAMQ/wymcsI=; b=eNYIi1NwLezyqPtXRdixCK+2KuFnvpDK9CdoyL0vzLK8tYcKJfSzZos7RbaK64g5Fz Tm2XkDofOgQzVBEtiqAuEmwqjCpBhrJSpOypE9Et2SApa8K2npCn4tuo2j1M2XSWjFXQ VGZgjCxG4X48aMnF81OPgVpJh6N38jK4TxAy7sHMpS2aWdbCreLTArClTEC/v/wP547W MR9NdYfsdT9J1LzaYZ1NSgaU77YtYnzmaVm9PVN4u7cFg0J87BYPDBdHH8mpsfh8dG9m GLXXRiw8MiTxvUWxVcDK9o+WwEQmnL3XlbjqtG+MyPWHdtw2t8/i4XgDXrGxmjhRhrPf RXPQ== X-Forwarded-Encrypted: i=1; AJvYcCXz57Ys+TmZEKHqlScRJqzo0VLarOU5zqJH+DuKjU0zHSeWY5QEn/ziGk8WGbof104SspoweCpbFkzntqg=@vger.kernel.org X-Gm-Message-State: AOJu0Yx82ZBjyc7JqeS9VT5WVYBNxuRsfheQaB9L3Gn82XLRdRVL/OxU IRBMeJuLyK9r98P7An7ItuxUz1NlVrVA/tx+ETTkhW+H+JAW6UEjs7pxOHcG0V8geaZUuBKCKNH 1cwEbdeKpPpeX5NvqyHoh0wnDcQ== X-Received: from pfbmb26.prod.google.com ([2002:a05:6a00:761a:b0:829:a3d9:9345]) (user=ackerleytng job=prod-delivery.src-stubby-dispatcher) by 2002:a05:6a20:938c:b0:398:7874:35d3 with SMTP id adf61e73a8af0-39c8787ce0dmr349724637.10.1774563867320; Thu, 26 Mar 2026 15:24:27 -0700 (PDT) Date: Thu, 26 Mar 2026 15:24:11 -0700 In-Reply-To: <20260326-gmem-inplace-conversion-v4-0-e202fe950ffd@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20260326-gmem-inplace-conversion-v4-0-e202fe950ffd@google.com> X-Developer-Key: i=ackerleytng@google.com; a=ed25519; pk=sAZDYXdm6Iz8FHitpHeFlCMXwabodTm7p8/3/8xUxuU= X-Developer-Signature: v=1; a=ed25519-sha256; t=1774563861; l=8590; i=ackerleytng@google.com; s=20260225; h=from:subject:message-id; bh=W1zJkAfZkcw61WvJ+RZ3gwzvU8jdJUXcVpR4YoBXm0g=; b=R6/KWXLba+toxe7GZnl+/a3Ivn6ZDGzwkgdfWMGavAFcE8OXmHI6WDUv2dCoNkWsNwNwKMkc+ ZZPmatvckdoAa4iACPXijGshHI1bBWO0jucn2vTG3lzgv6vD7SoXW2F X-Mailer: b4 0.14.3 Message-ID: <20260326-gmem-inplace-conversion-v4-2-e202fe950ffd@google.com> Subject: [PATCH RFC v4 02/44] KVM: Rename KVM_GENERIC_MEMORY_ATTRIBUTES to KVM_VM_MEMORY_ATTRIBUTES From: Ackerley Tng To: aik@amd.com, andrew.jones@linux.dev, binbin.wu@linux.intel.com, brauner@kernel.org, chao.p.peng@linux.intel.com, david@kernel.org, ira.weiny@intel.com, jmattson@google.com, jroedel@suse.de, 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, tabba@google.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, 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 , Baoquan He , Barry Song , Axel Rasmussen , Yuanchu Xie , Wei Xu , Jason Gunthorpe , Vlastimil Babka Cc: 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, Ackerley Tng Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable From: Sean Christopherson Rename the per-VM memory attributes Kconfig to make it explicitly about per-VM attributes in anticipation of adding memory attributes support to guest_memfd, at which point it will be possible (and desirable) to have memory attributes without the per-VM support, even in x86. No functional change intended. Signed-off-by: Sean Christopherson --- arch/x86/include/asm/kvm_host.h | 2 +- arch/x86/kvm/Kconfig | 6 +++--- arch/x86/kvm/mmu/mmu.c | 2 +- arch/x86/kvm/x86.c | 2 +- include/linux/kvm_host.h | 8 ++++---- include/trace/events/kvm.h | 4 ++-- virt/kvm/Kconfig | 2 +- virt/kvm/kvm_main.c | 14 +++++++------- 8 files changed, 20 insertions(+), 20 deletions(-) diff --git a/arch/x86/include/asm/kvm_host.h b/arch/x86/include/asm/kvm_hos= t.h index 6e4e3ef9b8c72..cf3d2bdababc7 100644 --- a/arch/x86/include/asm/kvm_host.h +++ b/arch/x86/include/asm/kvm_host.h @@ -2329,7 +2329,7 @@ void kvm_configure_mmu(bool enable_tdp, int tdp_force= d_root_level, int tdp_max_root_level, int tdp_huge_page_level); =20 =20 -#ifdef CONFIG_KVM_GENERIC_MEMORY_ATTRIBUTES +#ifdef CONFIG_KVM_VM_MEMORY_ATTRIBUTES #define kvm_arch_has_private_mem(kvm) ((kvm)->arch.has_private_mem) #endif =20 diff --git a/arch/x86/kvm/Kconfig b/arch/x86/kvm/Kconfig index 801bf9e520db3..26f6afd51bbdc 100644 --- a/arch/x86/kvm/Kconfig +++ b/arch/x86/kvm/Kconfig @@ -84,7 +84,7 @@ config KVM_SW_PROTECTED_VM bool "Enable support for KVM software-protected VMs" depends on EXPERT depends on KVM_X86 && X86_64 - select KVM_GENERIC_MEMORY_ATTRIBUTES + select KVM_VM_MEMORY_ATTRIBUTES help Enable support for KVM software-protected VMs. Currently, software- protected VMs are purely a development and testing vehicle for @@ -135,7 +135,7 @@ config KVM_INTEL_TDX bool "Intel Trust Domain Extensions (TDX) support" default y depends on INTEL_TDX_HOST - select KVM_GENERIC_MEMORY_ATTRIBUTES + select KVM_VM_MEMORY_ATTRIBUTES select HAVE_KVM_ARCH_GMEM_POPULATE help Provides support for launching Intel Trust Domain Extensions (TDX) @@ -159,7 +159,7 @@ config KVM_AMD_SEV depends on KVM_AMD && X86_64 depends on CRYPTO_DEV_SP_PSP && !(KVM_AMD=3Dy && CRYPTO_DEV_CCP_DD=3Dm) select ARCH_HAS_CC_PLATFORM - select KVM_GENERIC_MEMORY_ATTRIBUTES + select KVM_VM_MEMORY_ATTRIBUTES select HAVE_KVM_ARCH_GMEM_PREPARE select HAVE_KVM_ARCH_GMEM_INVALIDATE select HAVE_KVM_ARCH_GMEM_POPULATE diff --git a/arch/x86/kvm/mmu/mmu.c b/arch/x86/kvm/mmu/mmu.c index b922a8b000577..792701b093234 100644 --- a/arch/x86/kvm/mmu/mmu.c +++ b/arch/x86/kvm/mmu/mmu.c @@ -7889,7 +7889,7 @@ void kvm_mmu_pre_destroy_vm(struct kvm *kvm) vhost_task_stop(kvm->arch.nx_huge_page_recovery_thread); } =20 -#ifdef CONFIG_KVM_GENERIC_MEMORY_ATTRIBUTES +#ifdef CONFIG_KVM_VM_MEMORY_ATTRIBUTES static bool hugepage_test_mixed(struct kvm_memory_slot *slot, gfn_t gfn, int level) { diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c index fd1c4a36b5936..7e133a9da11f0 100644 --- a/arch/x86/kvm/x86.c +++ b/arch/x86/kvm/x86.c @@ -13509,7 +13509,7 @@ static int kvm_alloc_memslot_metadata(struct kvm *k= vm, } } =20 -#ifdef CONFIG_KVM_GENERIC_MEMORY_ATTRIBUTES +#ifdef CONFIG_KVM_VM_MEMORY_ATTRIBUTES kvm_mmu_init_memslot_memory_attributes(kvm, slot); #endif =20 diff --git a/include/linux/kvm_host.h b/include/linux/kvm_host.h index 6b76e7a6f4c22..e75f7295af5d0 100644 --- a/include/linux/kvm_host.h +++ b/include/linux/kvm_host.h @@ -721,7 +721,7 @@ static inline int kvm_arch_vcpu_memslots_id(struct kvm_= vcpu *vcpu) } #endif =20 -#ifndef CONFIG_KVM_GENERIC_MEMORY_ATTRIBUTES +#ifndef CONFIG_KVM_VM_MEMORY_ATTRIBUTES static inline bool kvm_arch_has_private_mem(struct kvm *kvm) { return false; @@ -870,7 +870,7 @@ struct kvm { #ifdef CONFIG_HAVE_KVM_PM_NOTIFIER struct notifier_block pm_notifier; #endif -#ifdef CONFIG_KVM_GENERIC_MEMORY_ATTRIBUTES +#ifdef CONFIG_KVM_VM_MEMORY_ATTRIBUTES /* Protected by slots_lock (for writes) and RCU (for reads) */ struct xarray mem_attr_array; #endif @@ -2513,7 +2513,7 @@ static inline bool kvm_memslot_is_gmem_only(const str= uct kvm_memory_slot *slot) return slot->flags & KVM_MEMSLOT_GMEM_ONLY; } =20 -#ifdef CONFIG_KVM_GENERIC_MEMORY_ATTRIBUTES +#ifdef CONFIG_KVM_VM_MEMORY_ATTRIBUTES static inline unsigned long kvm_get_memory_attributes(struct kvm *kvm, gfn= _t gfn) { return xa_to_value(xa_load(&kvm->mem_attr_array, gfn)); @@ -2535,7 +2535,7 @@ static inline bool kvm_mem_is_private(struct kvm *kvm= , gfn_t gfn) { return false; } -#endif /* CONFIG_KVM_GENERIC_MEMORY_ATTRIBUTES */ +#endif /* CONFIG_KVM_VM_MEMORY_ATTRIBUTES */ =20 #ifdef CONFIG_KVM_GUEST_MEMFD int kvm_gmem_get_pfn(struct kvm *kvm, struct kvm_memory_slot *slot, diff --git a/include/trace/events/kvm.h b/include/trace/events/kvm.h index b282e3a867696..1ba72bd73ea2f 100644 --- a/include/trace/events/kvm.h +++ b/include/trace/events/kvm.h @@ -358,7 +358,7 @@ TRACE_EVENT(kvm_dirty_ring_exit, TP_printk("vcpu %d", __entry->vcpu_id) ); =20 -#ifdef CONFIG_KVM_GENERIC_MEMORY_ATTRIBUTES +#ifdef CONFIG_KVM_VM_MEMORY_ATTRIBUTES /* * @start: Starting address of guest memory range * @end: End address of guest memory range @@ -383,7 +383,7 @@ TRACE_EVENT(kvm_vm_set_mem_attributes, TP_printk("%#016llx -- %#016llx [0x%lx]", __entry->start, __entry->end, __entry->attr) ); -#endif /* CONFIG_KVM_GENERIC_MEMORY_ATTRIBUTES */ +#endif /* CONFIG_KVM_VM_MEMORY_ATTRIBUTES */ =20 TRACE_EVENT(kvm_unmap_hva_range, TP_PROTO(unsigned long start, unsigned long end), diff --git a/virt/kvm/Kconfig b/virt/kvm/Kconfig index 794976b88c6f9..5119cb37145fc 100644 --- a/virt/kvm/Kconfig +++ b/virt/kvm/Kconfig @@ -100,7 +100,7 @@ config KVM_ELIDE_TLB_FLUSH_IF_YOUNG config KVM_MMU_LOCKLESS_AGING bool =20 -config KVM_GENERIC_MEMORY_ATTRIBUTES +config KVM_VM_MEMORY_ATTRIBUTES bool =20 config KVM_GUEST_MEMFD diff --git a/virt/kvm/kvm_main.c b/virt/kvm/kvm_main.c index 9093251beb398..301d7ddac6ba6 100644 --- a/virt/kvm/kvm_main.c +++ b/virt/kvm/kvm_main.c @@ -1122,7 +1122,7 @@ static struct kvm *kvm_create_vm(unsigned long type, = const char *fdname) spin_lock_init(&kvm->mn_invalidate_lock); rcuwait_init(&kvm->mn_memslots_update_rcuwait); xa_init(&kvm->vcpu_array); -#ifdef CONFIG_KVM_GENERIC_MEMORY_ATTRIBUTES +#ifdef CONFIG_KVM_VM_MEMORY_ATTRIBUTES xa_init(&kvm->mem_attr_array); #endif =20 @@ -1307,7 +1307,7 @@ static void kvm_destroy_vm(struct kvm *kvm) cleanup_srcu_struct(&kvm->irq_srcu); srcu_barrier(&kvm->srcu); cleanup_srcu_struct(&kvm->srcu); -#ifdef CONFIG_KVM_GENERIC_MEMORY_ATTRIBUTES +#ifdef CONFIG_KVM_VM_MEMORY_ATTRIBUTES xa_destroy(&kvm->mem_attr_array); #endif kvm_arch_free_vm(kvm); @@ -2425,7 +2425,7 @@ static int kvm_vm_ioctl_clear_dirty_log(struct kvm *k= vm, } #endif /* CONFIG_KVM_GENERIC_DIRTYLOG_READ_PROTECT */ =20 -#ifdef CONFIG_KVM_GENERIC_MEMORY_ATTRIBUTES +#ifdef CONFIG_KVM_VM_MEMORY_ATTRIBUTES static u64 kvm_supported_mem_attributes(struct kvm *kvm) { if (!kvm || kvm_arch_has_private_mem(kvm)) @@ -2630,7 +2630,7 @@ static int kvm_vm_ioctl_set_mem_attributes(struct kvm= *kvm, =20 return kvm_vm_set_mem_attributes(kvm, start, end, attrs->attributes); } -#endif /* CONFIG_KVM_GENERIC_MEMORY_ATTRIBUTES */ +#endif /* CONFIG_KVM_VM_MEMORY_ATTRIBUTES */ =20 struct kvm_memory_slot *gfn_to_memslot(struct kvm *kvm, gfn_t gfn) { @@ -4928,7 +4928,7 @@ static int kvm_vm_ioctl_check_extension_generic(struc= t kvm *kvm, long arg) case KVM_CAP_SYSTEM_EVENT_DATA: case KVM_CAP_DEVICE_CTRL: return 1; -#ifdef CONFIG_KVM_GENERIC_MEMORY_ATTRIBUTES +#ifdef CONFIG_KVM_VM_MEMORY_ATTRIBUTES case KVM_CAP_MEMORY_ATTRIBUTES: return kvm_supported_mem_attributes(kvm); #endif @@ -5332,7 +5332,7 @@ static long kvm_vm_ioctl(struct file *filp, break; } #endif /* CONFIG_HAVE_KVM_IRQ_ROUTING */ -#ifdef CONFIG_KVM_GENERIC_MEMORY_ATTRIBUTES +#ifdef CONFIG_KVM_VM_MEMORY_ATTRIBUTES case KVM_SET_MEMORY_ATTRIBUTES: { struct kvm_memory_attributes attrs; =20 @@ -5343,7 +5343,7 @@ static long kvm_vm_ioctl(struct file *filp, r =3D kvm_vm_ioctl_set_mem_attributes(kvm, &attrs); break; } -#endif /* CONFIG_KVM_GENERIC_MEMORY_ATTRIBUTES */ +#endif /* CONFIG_KVM_VM_MEMORY_ATTRIBUTES */ case KVM_CREATE_DEVICE: { struct kvm_create_device cd; =20 --=20 2.53.0.1018.g2bb0e51243-goog From nobody Thu Apr 2 09:33:37 2026 Received: from mail-pf1-f202.google.com (mail-pf1-f202.google.com [209.85.210.202]) (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 CC638315D40 for ; Thu, 26 Mar 2026 22:24:30 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.210.202 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1774563872; cv=none; b=nCHL2P7WsMnZyvY50cum/mIbb2DjnoGct7UUUaTi6EejGlLsZNVF2GK+9lYtA3g0oOx1C3od7dDF+gYnnyxsbihf+qkSVsvfvIQH3hr2tqasYwdANIZQrE+rx9NNrUMEgdyWi6yP94hBNO9XrYnvl/drEKsJsQd0EGK6kz+TtYU= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1774563872; c=relaxed/simple; bh=JHd56pbgZlSOVjn9idwqI34aZJE76SCMw1AclkyeKWI=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=dGqLr4brAtGQTQW+nlY+N8e5VPke+Ac9DJWgsHDkC7zUhqIhevhVPGFMODHmeC4/O0n0OjwwP23u6bt/7p+a2YHPAoRtgqMGWQ1fHkeoyUFpOdQqM9kShaih+Xa+5fsF27JOb5qE2IenQ+9KGIxOGtjwS76Um6W2LBoIINAKwlc= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com; spf=pass smtp.mailfrom=flex--ackerleytng.bounces.google.com; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b=jcrVgQ0/; arc=none smtp.client-ip=209.85.210.202 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=flex--ackerleytng.bounces.google.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="jcrVgQ0/" Received: by mail-pf1-f202.google.com with SMTP id d2e1a72fcca58-82c7ec40f92so2061005b3a.0 for ; Thu, 26 Mar 2026 15:24:30 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20251104; t=1774563870; x=1775168670; darn=vger.kernel.org; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:from:to:cc:subject:date:message-id:reply-to; bh=dl/bsWYJpdZnQGZ2ISOX0kOe5zrNHYK/8ud0vcSuZwg=; b=jcrVgQ0/JCvNQ4nBIwSWlBCMo/9PWMQf6+jOeKV0DIkHr4sMedKfo/2SCWe+eViEwS BTqYfm2RC4NNriz8Gn0jdPUMjFsLDKNlEhq6hIrNS33zVd7PuNdX6GUlpkPAlV3JGsVJ rzCF4PNCkECnsWgHmRSS5jC5/ClN2qSqixV+2IZhnpLe2sujzmpN4wofPpFBx0zvWQlt bJImaOUnzonkq70qrK9dmL0TKuCWTPGg6PJ9ydKhxhUMITunV06VTeKElwJd6pYTJzL3 GrYu5MloMZqnTzVmfuauH994AMwC2qukcauA6immNk7qFe8TGKCZYj4Swl/65SuyGU3T Gg3A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1774563870; x=1775168670; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=dl/bsWYJpdZnQGZ2ISOX0kOe5zrNHYK/8ud0vcSuZwg=; b=Ne3fwfIKicNCARJtoNZ3bPh3u8AcYUBiEFHHOkip3R0k7fWuAXI6unYUyKDjBS6kDH LPH1SfLGW5k7oRIP7GTFR1nxAV/vspFOw+/0Bdc0ysLLmfzji/4i6hJwvxPHckPg1iDR RVDYStPu6b7gcoN6rgQvy7JHkZwMWWRK2TTWHMr32d5LrnVLQC72epn5GVNbTKOspuy3 xP6rCmFeklT5SBNl4KHkzGQDAJgMG30SedvouHdmbwcveB4R4sSdllb2z1SUXrLDbgw5 cIe+LNhV5T+hwFziyseo7vuplzxfctlFlcCl3OWVc9BgPENurvKejUiGlPol5MhjcZQO T/qw== X-Forwarded-Encrypted: i=1; AJvYcCWiIC6h22g2GyPUOMiGwF4DcEwpxHHO2NnTyd/qBCvwr61lYsQZIFcFriXamTAE3orlcXsJxHqe0a+KKJo=@vger.kernel.org X-Gm-Message-State: AOJu0YxJ0F2qM1DaZ3Ei/0sSzVr0TM67GnCbEC/SZGWMtUdtX4MvxGgO xd+4Hk4+FGPamnTIjxapeBMsF6TZkU3QVH1aKtZN/o4k/cKFGCIckiWoGcZHC+9pQE8b2sP28vn mshUUYCB2UlyixCg/5esLza5saQ== X-Received: from pfbg26.prod.google.com ([2002:a05:6a00:ae1a:b0:82c:20b9:f6a6]) (user=ackerleytng job=prod-delivery.src-stubby-dispatcher) by 2002:a05:6a00:ac89:b0:824:d09b:9126 with SMTP id d2e1a72fcca58-82c95d38df7mr155334b3a.14.1774563869575; Thu, 26 Mar 2026 15:24:29 -0700 (PDT) Date: Thu, 26 Mar 2026 15:24:12 -0700 In-Reply-To: <20260326-gmem-inplace-conversion-v4-0-e202fe950ffd@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20260326-gmem-inplace-conversion-v4-0-e202fe950ffd@google.com> X-Developer-Key: i=ackerleytng@google.com; a=ed25519; pk=sAZDYXdm6Iz8FHitpHeFlCMXwabodTm7p8/3/8xUxuU= X-Developer-Signature: v=1; a=ed25519-sha256; t=1774563861; l=1738; i=ackerleytng@google.com; s=20260225; h=from:subject:message-id; bh=Emrp5cxolz1mmhbaFPRl70Urv1qo5yybaBiy/upVECw=; b=jNlhGG1OFNUmd0OJb2inFZ4ZpQXusBqRlpeNCh3mEZZbGhxSKlauRl1XnPma0bUG0/xPMxb/k pNzq1W9TKccDAK5fYnvrlY1CdXcfNoI0wfb8UynYBbRBdZFhi+ZrIzs X-Mailer: b4 0.14.3 Message-ID: <20260326-gmem-inplace-conversion-v4-3-e202fe950ffd@google.com> Subject: [PATCH RFC v4 03/44] KVM: Enumerate support for PRIVATE memory iff kvm_arch_has_private_mem is defined From: Ackerley Tng To: aik@amd.com, andrew.jones@linux.dev, binbin.wu@linux.intel.com, brauner@kernel.org, chao.p.peng@linux.intel.com, david@kernel.org, ira.weiny@intel.com, jmattson@google.com, jroedel@suse.de, 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, tabba@google.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, 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 , Baoquan He , Barry Song , Axel Rasmussen , Yuanchu Xie , Wei Xu , Jason Gunthorpe , Vlastimil Babka Cc: 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, Ackerley Tng Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable From: Sean Christopherson Explicitly guard reporting support for KVM_MEMORY_ATTRIBUTE_PRIVATE based on kvm_arch_has_private_mem being #defined in anticipation of decoupling kvm_supported_mem_attributes() from CONFIG_KVM_VM_MEMORY_ATTRIBUTES. guest_memfd support for memory attributes will be unconditional to avoid yet more macros (all architectures that support guest_memfd are expected to use per-gmem attributes at some point), at which point enumerating support KVM_MEMORY_ATTRIBUTE_PRIVATE based solely on memory attributes being supported _somewhere_ would result in KVM over-reporting support on arm64. Signed-off-by: Sean Christopherson --- include/linux/kvm_host.h | 2 +- virt/kvm/kvm_main.c | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/include/linux/kvm_host.h b/include/linux/kvm_host.h index e75f7295af5d0..4ba42a1278d5f 100644 --- a/include/linux/kvm_host.h +++ b/include/linux/kvm_host.h @@ -721,7 +721,7 @@ static inline int kvm_arch_vcpu_memslots_id(struct kvm_= vcpu *vcpu) } #endif =20 -#ifndef CONFIG_KVM_VM_MEMORY_ATTRIBUTES +#ifndef kvm_arch_has_private_mem static inline bool kvm_arch_has_private_mem(struct kvm *kvm) { return false; diff --git a/virt/kvm/kvm_main.c b/virt/kvm/kvm_main.c index 301d7ddac6ba6..793a2c8476b09 100644 --- a/virt/kvm/kvm_main.c +++ b/virt/kvm/kvm_main.c @@ -2428,8 +2428,10 @@ static int kvm_vm_ioctl_clear_dirty_log(struct kvm *= kvm, #ifdef CONFIG_KVM_VM_MEMORY_ATTRIBUTES static u64 kvm_supported_mem_attributes(struct kvm *kvm) { +#ifdef kvm_arch_has_private_mem if (!kvm || kvm_arch_has_private_mem(kvm)) return KVM_MEMORY_ATTRIBUTE_PRIVATE; +#endif =20 return 0; } --=20 2.53.0.1018.g2bb0e51243-goog From nobody Thu Apr 2 09:33:37 2026 Received: from mail-pg1-f202.google.com (mail-pg1-f202.google.com [209.85.215.202]) (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 C7FCE313E1B for ; Thu, 26 Mar 2026 22:24:32 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.215.202 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1774563874; cv=none; b=iZV6IJDQg6y4TVEYmTz7Op9wK0A3eY+AUuTlFwarY9w5igdUkckYy7q3e+vnScyrPt789nO1gJ3UyaPJi0JpPN2EELNL0cEv5VlHKKqtAtn14rZjQJCo813rXQAWKGzOjg9LSr2VhwPBqhYSSRD80EBhKXnk2RGp6vapTXoDXaU= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1774563874; c=relaxed/simple; bh=U9TZUlSXcsS1k9uKx4EGIT2HPjNCFjAb/HAJK8DDjW4=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=t/xrirhTNV56zln/4OSPAOGSifX1yGOCUMmExjig1T9uZ9sMzuZaD8ppTIqquh60J9d/OiNSf3FyXNuSIQPFcIh/t/XbD/U+rJcs3rGkxtywnIeeb4FbqHJfVdP+zcKQjwiKcN4UrSYjMRHZYx2mBh2kGRn5SIVmad6etcbRWnE= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com; spf=pass smtp.mailfrom=flex--ackerleytng.bounces.google.com; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b=J/aGu15T; arc=none smtp.client-ip=209.85.215.202 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=flex--ackerleytng.bounces.google.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="J/aGu15T" Received: by mail-pg1-f202.google.com with SMTP id 41be03b00d2f7-c6e24ee93a6so1739301a12.0 for ; Thu, 26 Mar 2026 15:24:32 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20251104; t=1774563872; x=1775168672; darn=vger.kernel.org; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:from:to:cc:subject:date:message-id:reply-to; bh=Uuod0qNsBqG0ybFgd9PBXDc0yAcGuU/GT8QI9Nhe6Gw=; b=J/aGu15TGuHt+h4rp2ZYWipuAJ6+7/F655AlmszZteqrG5JIPB24Zu2zTZtMPewMhH I5fsEu9YxcMy4BKeN/V6sq7/sVZZ3nWVakCc376sYiUZskgDpT0eJ4HIQBG0omhdH7U6 asSWb35D4xx6oUfGWb78lpEE8a7E+Vw3rymW5sq80yqJj3cSeUIrjflMgyqUKXNLV9y3 Wvo64KIA+11Di5tGhB9lBLWsL92fZqgWY76+ItLod6uUxoCeOgcY2Ci+neqYGKAvLQK8 Sg3nhR/Sk7we52/qALMNFurnypkZlFHK7fqe0OA1i93Kao7fiJcGxBLygNh7yCPWUsvc TOog== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1774563872; x=1775168672; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=Uuod0qNsBqG0ybFgd9PBXDc0yAcGuU/GT8QI9Nhe6Gw=; b=ZBAmoRyvPyW3Qug9c8maTud4fAmTMcC160lv+u67O2SObL+jMz7QHgqm6jTjIp8NHu g1nq0jYHMU7gztQeEffgJZfd1pPzY0Y9U5WWTpDAJgWN7rEEI9OZOQHy4USUiyrLA6TK lxM6/uKQNax03dN2L25/wlL1+lMBX31scqDLM94CzKXOv5NYNeQH7J94Zq/gpv3VyS12 ARPpEnGdv+6pMJogrSax1AoGVH5QSZdZn+M1Y53CGzL1CUAsMYvcAxDeeeWEYdBZtjIS Nj1/Xio5YC+j7/KfipFTCVnehAT0pF3xYncHKC6++kmFMF6DUl/EkJ5jpVZvK49ojThe PRNw== X-Forwarded-Encrypted: i=1; AJvYcCXMCc2juEL+V7ociABN+AabUs4TzbLOD+wdkW/FU0Y+mL3fznC4rwHxn9sMgXPrF2cBHu14bvsdLpC1jeY=@vger.kernel.org X-Gm-Message-State: AOJu0Yy5LS1Z59JQZQWKV0vXPTSAnRRiBhAwaG/ZtGFcFfLPEt8oo6al 7yUeTwORMfoIRbem4DJrymTMYdDV/cunFFHuy0wgdEqiQJCJfUulyhxI3W2ImWiqIqhj7ioLp8p Rm5oI0wvgqEhkXBFuaAkqi+u3hQ== X-Received: from pfwy40.prod.google.com ([2002:a05:6a00:1ca8:b0:824:b498:b016]) (user=ackerleytng job=prod-delivery.src-stubby-dispatcher) by 2002:a05:6a20:734c:b0:398:7796:7823 with SMTP id adf61e73a8af0-39c8a6c2c3dmr53801637.6.1774563871440; Thu, 26 Mar 2026 15:24:31 -0700 (PDT) Date: Thu, 26 Mar 2026 15:24:13 -0700 In-Reply-To: <20260326-gmem-inplace-conversion-v4-0-e202fe950ffd@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20260326-gmem-inplace-conversion-v4-0-e202fe950ffd@google.com> X-Developer-Key: i=ackerleytng@google.com; a=ed25519; pk=sAZDYXdm6Iz8FHitpHeFlCMXwabodTm7p8/3/8xUxuU= X-Developer-Signature: v=1; a=ed25519-sha256; t=1774563861; l=7205; i=ackerleytng@google.com; s=20260225; h=from:subject:message-id; bh=/JytenNZfjjNb9hRJUQg500AB0c4FxxGLQWAYRKsn0w=; b=4r4+flO7ttXNdQ93SWrdcLKha6lQNoz8f2QPBrxTfNAA72iRfUoeW262p0DxOmnmH5JuJg7+G HNG+G6sGKY1BRkJ5Tm/HoIP7Ry3hoOe95oqZJa1ynzR3czBKZW15qf6 X-Mailer: b4 0.14.3 Message-ID: <20260326-gmem-inplace-conversion-v4-4-e202fe950ffd@google.com> Subject: [PATCH RFC v4 04/44] KVM: Stub in ability to disable per-VM memory attribute tracking From: Ackerley Tng To: aik@amd.com, andrew.jones@linux.dev, binbin.wu@linux.intel.com, brauner@kernel.org, chao.p.peng@linux.intel.com, david@kernel.org, ira.weiny@intel.com, jmattson@google.com, jroedel@suse.de, 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, tabba@google.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, 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 , Baoquan He , Barry Song , Axel Rasmussen , Yuanchu Xie , Wei Xu , Jason Gunthorpe , Vlastimil Babka Cc: 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, Ackerley Tng Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable From: Sean Christopherson Introduce the basic infrastructure to allow per-VM memory attribute tracking to be disabled. This will be built-upon in a later patch, where a module param can disable per-VM memory attribute tracking. Split the Kconfig option into a base KVM_MEMORY_ATTRIBUTES and the existing KVM_VM_MEMORY_ATTRIBUTES. The base option provides the core plumbing, while the latter enables the full per-VM tracking via an xarray and the associated ioctls. kvm_get_memory_attributes() now performs a static call that either looks up kvm->mem_attr_array with CONFIG_KVM_VM_MEMORY_ATTRIBUTES is enabled, or just returns 0 otherwise. The static call can be patched depending on whether per-VM tracking is enabled by the CONFIG. No functional change intended. Signed-off-by: Sean Christopherson --- arch/x86/include/asm/kvm_host.h | 2 +- include/linux/kvm_host.h | 23 ++++++++++++--------- virt/kvm/Kconfig | 4 ++++ virt/kvm/kvm_main.c | 44 +++++++++++++++++++++++++++++++++++++= +++- 4 files changed, 62 insertions(+), 11 deletions(-) diff --git a/arch/x86/include/asm/kvm_host.h b/arch/x86/include/asm/kvm_hos= t.h index cf3d2bdababc7..537f25121e345 100644 --- a/arch/x86/include/asm/kvm_host.h +++ b/arch/x86/include/asm/kvm_host.h @@ -2329,7 +2329,7 @@ void kvm_configure_mmu(bool enable_tdp, int tdp_force= d_root_level, int tdp_max_root_level, int tdp_huge_page_level); =20 =20 -#ifdef CONFIG_KVM_VM_MEMORY_ATTRIBUTES +#ifdef CONFIG_KVM_MEMORY_ATTRIBUTES #define kvm_arch_has_private_mem(kvm) ((kvm)->arch.has_private_mem) #endif =20 diff --git a/include/linux/kvm_host.h b/include/linux/kvm_host.h index 4ba42a1278d5f..5393854ca5966 100644 --- a/include/linux/kvm_host.h +++ b/include/linux/kvm_host.h @@ -2513,19 +2513,15 @@ static inline bool kvm_memslot_is_gmem_only(const s= truct kvm_memory_slot *slot) return slot->flags & KVM_MEMSLOT_GMEM_ONLY; } =20 -#ifdef CONFIG_KVM_VM_MEMORY_ATTRIBUTES +#ifdef CONFIG_KVM_MEMORY_ATTRIBUTES +typedef unsigned long (kvm_get_memory_attributes_t)(struct kvm *kvm, gfn_t= gfn); +DECLARE_STATIC_CALL(__kvm_get_memory_attributes, kvm_get_memory_attributes= _t); + static inline unsigned long kvm_get_memory_attributes(struct kvm *kvm, gfn= _t gfn) { - return xa_to_value(xa_load(&kvm->mem_attr_array, gfn)); + return static_call(__kvm_get_memory_attributes)(kvm, gfn); } =20 -bool kvm_range_has_memory_attributes(struct kvm *kvm, gfn_t start, gfn_t e= nd, - unsigned long mask, unsigned long attrs); -bool kvm_arch_pre_set_memory_attributes(struct kvm *kvm, - struct kvm_gfn_range *range); -bool kvm_arch_post_set_memory_attributes(struct kvm *kvm, - struct kvm_gfn_range *range); - static inline bool kvm_mem_is_private(struct kvm *kvm, gfn_t gfn) { return kvm_get_memory_attributes(kvm, gfn) & KVM_MEMORY_ATTRIBUTE_PRIVATE; @@ -2535,6 +2531,15 @@ static inline bool kvm_mem_is_private(struct kvm *kv= m, gfn_t gfn) { return false; } +#endif + +#ifdef CONFIG_KVM_VM_MEMORY_ATTRIBUTES +bool kvm_range_has_memory_attributes(struct kvm *kvm, gfn_t start, gfn_t e= nd, + unsigned long mask, unsigned long attrs); +bool kvm_arch_pre_set_memory_attributes(struct kvm *kvm, + struct kvm_gfn_range *range); +bool kvm_arch_post_set_memory_attributes(struct kvm *kvm, + struct kvm_gfn_range *range); #endif /* CONFIG_KVM_VM_MEMORY_ATTRIBUTES */ =20 #ifdef CONFIG_KVM_GUEST_MEMFD diff --git a/virt/kvm/Kconfig b/virt/kvm/Kconfig index 5119cb37145fc..3fea89c45cfb4 100644 --- a/virt/kvm/Kconfig +++ b/virt/kvm/Kconfig @@ -100,7 +100,11 @@ config KVM_ELIDE_TLB_FLUSH_IF_YOUNG config KVM_MMU_LOCKLESS_AGING bool =20 +config KVM_MEMORY_ATTRIBUTES + bool + config KVM_VM_MEMORY_ATTRIBUTES + select KVM_MEMORY_ATTRIBUTES bool =20 config KVM_GUEST_MEMFD diff --git a/virt/kvm/kvm_main.c b/virt/kvm/kvm_main.c index 793a2c8476b09..dbdcef90a4950 100644 --- a/virt/kvm/kvm_main.c +++ b/virt/kvm/kvm_main.c @@ -102,6 +102,17 @@ EXPORT_SYMBOL_FOR_KVM_INTERNAL(halt_poll_ns_shrink); static bool allow_unsafe_mappings; module_param(allow_unsafe_mappings, bool, 0444); =20 +#ifdef CONFIG_KVM_MEMORY_ATTRIBUTES +#ifdef CONFIG_KVM_VM_MEMORY_ATTRIBUTES +static bool vm_memory_attributes =3D true; +#else +#define vm_memory_attributes false +#endif +DEFINE_STATIC_CALL_RET0(__kvm_get_memory_attributes, kvm_get_memory_attrib= utes_t); +EXPORT_SYMBOL_FOR_KVM_INTERNAL(STATIC_CALL_KEY(__kvm_get_memory_attributes= )); +EXPORT_SYMBOL_FOR_KVM_INTERNAL(STATIC_CALL_TRAMP(__kvm_get_memory_attribut= es)); +#endif + /* * Ordering of locks: * @@ -2425,7 +2436,7 @@ static int kvm_vm_ioctl_clear_dirty_log(struct kvm *k= vm, } #endif /* CONFIG_KVM_GENERIC_DIRTYLOG_READ_PROTECT */ =20 -#ifdef CONFIG_KVM_VM_MEMORY_ATTRIBUTES +#ifdef CONFIG_KVM_MEMORY_ATTRIBUTES static u64 kvm_supported_mem_attributes(struct kvm *kvm) { #ifdef kvm_arch_has_private_mem @@ -2436,6 +2447,12 @@ static u64 kvm_supported_mem_attributes(struct kvm *= kvm) return 0; } =20 +#ifdef CONFIG_KVM_VM_MEMORY_ATTRIBUTES +static unsigned long kvm_get_vm_memory_attributes(struct kvm *kvm, gfn_t g= fn) +{ + return xa_to_value(xa_load(&kvm->mem_attr_array, gfn)); +} + /* * Returns true if _all_ gfns in the range [@start, @end) have attributes * such that the bits in @mask match @attrs. @@ -2632,7 +2649,24 @@ static int kvm_vm_ioctl_set_mem_attributes(struct kv= m *kvm, =20 return kvm_vm_set_mem_attributes(kvm, start, end, attrs->attributes); } +#else /* CONFIG_KVM_VM_MEMORY_ATTRIBUTES */ +static unsigned long kvm_get_vm_memory_attributes(struct kvm *kvm, gfn_t g= fn) +{ + BUILD_BUG_ON(1); +} #endif /* CONFIG_KVM_VM_MEMORY_ATTRIBUTES */ +static void kvm_init_memory_attributes(void) +{ + if (vm_memory_attributes) + static_call_update(__kvm_get_memory_attributes, + kvm_get_vm_memory_attributes); + else + static_call_update(__kvm_get_memory_attributes, + (void *)__static_call_return0); +} +#else /* CONFIG_KVM_MEMORY_ATTRIBUTES */ +static void kvm_init_memory_attributes(void) { } +#endif /* CONFIG_KVM_MEMORY_ATTRIBUTES */ =20 struct kvm_memory_slot *gfn_to_memslot(struct kvm *kvm, gfn_t gfn) { @@ -4932,6 +4966,9 @@ static int kvm_vm_ioctl_check_extension_generic(struc= t kvm *kvm, long arg) return 1; #ifdef CONFIG_KVM_VM_MEMORY_ATTRIBUTES case KVM_CAP_MEMORY_ATTRIBUTES: + if (!vm_memory_attributes) + return 0; + return kvm_supported_mem_attributes(kvm); #endif #ifdef CONFIG_KVM_GUEST_MEMFD @@ -5338,6 +5375,10 @@ static long kvm_vm_ioctl(struct file *filp, case KVM_SET_MEMORY_ATTRIBUTES: { struct kvm_memory_attributes attrs; =20 + r =3D -ENOTTY; + if (!vm_memory_attributes) + goto out; + r =3D -EFAULT; if (copy_from_user(&attrs, argp, sizeof(attrs))) goto out; @@ -6528,6 +6569,7 @@ int kvm_init(unsigned vcpu_size, unsigned vcpu_align,= struct module *module) kvm_preempt_ops.sched_in =3D kvm_sched_in; kvm_preempt_ops.sched_out =3D kvm_sched_out; =20 + kvm_init_memory_attributes(); kvm_init_debug(); =20 r =3D kvm_vfio_ops_init(); --=20 2.53.0.1018.g2bb0e51243-goog From nobody Thu Apr 2 09:33:37 2026 Received: from mail-pf1-f201.google.com (mail-pf1-f201.google.com [209.85.210.201]) (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 C642034B68F for ; Thu, 26 Mar 2026 22:24:35 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.210.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1774563877; cv=none; b=O+0inmdjXGgWGcJDbWyc50o5P8SI/qj1XhtSCUAaqF26oNLGReF7OUKCO0lyhze2hSWaOgiCTiolLR2HCmU2K5jOYHWVj7mU99y+raiPMfBnE8JzqbbJc1RofLJwyvAiJJxmGZoJV5dBN67bWx45Gx6KwLqz9B6ibfYJPwyUpHU= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1774563877; c=relaxed/simple; bh=i32Zv1Qc2V8hto0b0Lqq2MavvvgIuECmKPzYxYPEz1A=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=cRSIsYQoFGnFoErr0q/NaRoR5xMTTihi/eAZH3G42fcErrbT22emy2yXOVBkr/lABWjcmzA7F76v8rCMPTNFzUf1egJ7Fqm+LncQIYyDiaAhXZ7XNBZHDKSrpYjLqneyk/NeTtjf6Epd7OQHRmepRWN+BMH+crOLnzWjVynelT4= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com; spf=pass smtp.mailfrom=flex--ackerleytng.bounces.google.com; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b=VZvyf41H; arc=none smtp.client-ip=209.85.210.201 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=flex--ackerleytng.bounces.google.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="VZvyf41H" Received: by mail-pf1-f201.google.com with SMTP id d2e1a72fcca58-82c7a84a43eso3125233b3a.0 for ; Thu, 26 Mar 2026 15:24:35 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20251104; t=1774563875; x=1775168675; darn=vger.kernel.org; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:from:to:cc:subject:date:message-id:reply-to; bh=n14jCm7yu9LC/vBpPkzyqFC4opRbuCMIWsyoVMZR2YQ=; b=VZvyf41HUbtzVJpBJqAmBrPEHmGI8wWJEnE56c38ZKtOUv1EcdseYFvMJtiE7BOdk5 LgZH4iiZDmGQojcaZjcc3iVzN634SHD7m4ObhGISbjn0KhehCtFctWhetnPTaHVnpglF RqU3a5R78/fGELBvPYlwQbUCAsS1G97sKyP/WdoiGfQeUbPffhFBfb0iu2ZrltZVnQl8 DdQlQmiJTKCt5zqDNZTqBoskVsJ/sAxG/jQOP7X8mjB6QWLZeBvPn3abD4dgwb00Uv8d wP5LKYAaQom0KENffiX8aBZFm+sqvYB7Smw6ehdTDK37DoewHDpqMIWf1SBT3xROW5fT v/KA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1774563875; x=1775168675; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=n14jCm7yu9LC/vBpPkzyqFC4opRbuCMIWsyoVMZR2YQ=; b=AWgGOSCFFjcN2L3ZxnTLGFWNKSKDoRCp9MH8p0TWwAVC5Cg0d6Tjw4s89TMAZYaWma lMMa4lngZTcuVgDmCUqED7Nt9kCdhvsZQ0QW1QwKqsciFQgEYY0zj5Jm59BPtw/EEOdq vD0BwSaQKv311wjhBAAmnFyFCzHEuOa60P4MM8IRwBqTlFM9LkQLHNK86DAIJbxKvgiV zyNuhTTydAJa4/YzjBimBbRN4IdRudMGfAj7B6a/uABo01dfcZBCf01AILePvDiRqDUD VK63+SrsWvQxK5zzsjIfNUK5JUM+a4ycK0kBsX7P/EzxGWzxj5xhkVw2IEqijGQ0ifQT z1rA== X-Forwarded-Encrypted: i=1; AJvYcCUH1Brf1dSQKaff2zCijpUW270oQ6tt4N/t4cFNk6l1/ebkLyAJfM4bDYN0i3B/IlGUT3FvQ9+FuoKDBEY=@vger.kernel.org X-Gm-Message-State: AOJu0YxLdHwT64F/sc+Aw7jkohfh/0iY4aQMJIUF6ACdjBudVvq0aR4P cZ8uZDBoIB8NwV6clYNmI2c+fjQ8+NBhiigWpdFRjzrYPuBfaPBVNUdmRs49pTv1TxHz49NCNpg PwhBplAm/gwuJ2MOA1RE0acPcNA== X-Received: from pfbhw2.prod.google.com ([2002:a05:6a00:8902:b0:829:9a65:4170]) (user=ackerleytng job=prod-delivery.src-stubby-dispatcher) by 2002:a05:6a00:23c8:b0:82a:805a:7cc with SMTP id d2e1a72fcca58-82c959d4be3mr153491b3a.4.1774563874655; Thu, 26 Mar 2026 15:24:34 -0700 (PDT) Date: Thu, 26 Mar 2026 15:24:14 -0700 In-Reply-To: <20260326-gmem-inplace-conversion-v4-0-e202fe950ffd@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20260326-gmem-inplace-conversion-v4-0-e202fe950ffd@google.com> X-Developer-Key: i=ackerleytng@google.com; a=ed25519; pk=sAZDYXdm6Iz8FHitpHeFlCMXwabodTm7p8/3/8xUxuU= X-Developer-Signature: v=1; a=ed25519-sha256; t=1774563861; l=3889; i=ackerleytng@google.com; s=20260225; h=from:subject:message-id; bh=nVwpFGhdInAIYcCOHyVf1SHbYDR/5EzcpRzGcQJhTh0=; b=lflg/f6MMNyq8okFwTq8rOBXOZkFUGGSvNBdwadMelTajGXnQi6GmTxDhWAO0pxC0zzFjJp3+ HdOJ+KijHgvBGAbFtTm0ldKzRrFPcdzb6FLv+Jrlabq3WDMpA8igjmx X-Mailer: b4 0.14.3 Message-ID: <20260326-gmem-inplace-conversion-v4-5-e202fe950ffd@google.com> Subject: [PATCH RFC v4 05/44] KVM: guest_memfd: Wire up kvm_get_memory_attributes() to per-gmem attributes From: Ackerley Tng To: aik@amd.com, andrew.jones@linux.dev, binbin.wu@linux.intel.com, brauner@kernel.org, chao.p.peng@linux.intel.com, david@kernel.org, ira.weiny@intel.com, jmattson@google.com, jroedel@suse.de, 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, tabba@google.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, 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 , Baoquan He , Barry Song , Axel Rasmussen , Yuanchu Xie , Wei Xu , Jason Gunthorpe , Vlastimil Babka Cc: 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, Ackerley Tng Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable From: Sean Christopherson Implement kvm_gmem_get_memory_attributes() for guest_memfd to allow the KVM core and architecture code to query per-GFN memory attributes. kvm_gmem_get_memory_attributes() finds the memory slot for a given GFN and queries the guest_memfd file's to determine if the page is marked as private. If vm_memory_attributes is not enabled, there is no shared/private tracking at the VM level. Install the guest_memfd implementation as long as guest_memfd is enabled to give guest_memfd a chance to respond on attributes. guest_memfd should look up attributes regardless of whether this memslot is gmem-only since attributes are now tracked by gmem regardless of whether mmap() is enabled. Signed-off-by: Sean Christopherson Co-developed-by: Ackerley Tng Signed-off-by: Ackerley Tng --- include/linux/kvm_host.h | 2 ++ virt/kvm/guest_memfd.c | 37 +++++++++++++++++++++++++++++++++++++ virt/kvm/kvm_main.c | 3 +++ 3 files changed, 42 insertions(+) diff --git a/include/linux/kvm_host.h b/include/linux/kvm_host.h index 5393854ca5966..0f84421b3f49e 100644 --- a/include/linux/kvm_host.h +++ b/include/linux/kvm_host.h @@ -2542,6 +2542,8 @@ bool kvm_arch_post_set_memory_attributes(struct kvm *= kvm, struct kvm_gfn_range *range); #endif /* CONFIG_KVM_VM_MEMORY_ATTRIBUTES */ =20 +unsigned long kvm_gmem_get_memory_attributes(struct kvm *kvm, gfn_t gfn); + #ifdef CONFIG_KVM_GUEST_MEMFD int kvm_gmem_get_pfn(struct kvm *kvm, struct kvm_memory_slot *slot, gfn_t gfn, kvm_pfn_t *pfn, struct page **page, diff --git a/virt/kvm/guest_memfd.c b/virt/kvm/guest_memfd.c index aa2caf5114da2..6f4252c8b3f59 100644 --- a/virt/kvm/guest_memfd.c +++ b/virt/kvm/guest_memfd.c @@ -515,6 +515,43 @@ static int kvm_gmem_mmap(struct file *file, struct vm_= area_struct *vma) return 0; } =20 +unsigned long kvm_gmem_get_memory_attributes(struct kvm *kvm, gfn_t gfn) +{ + struct kvm_memory_slot *slot =3D gfn_to_memslot(kvm, gfn); + struct inode *inode; + unsigned long attrs; + + /* + * If this gfn has no associated memslot, there's no chance of the gfn + * being backed by private memory, since guest_memfd must be used for + * private memory, and guest_memfd must be associated with some memslot. + */ + if (!slot) + return 0; + + CLASS(gmem_get_file, file)(slot); + if (!file) + return 0; + + inode =3D file_inode(file); + + /* + * Acquire the filemap lock to ensure the mtree lookup gets a + * stable result. The caller _must_ still protect consumption + * of private vs. shared by checking + * mmu_invalidate_retry_gfn() under mmu_lock to serialize + * against ongoing attribute updates. Acquiring the filemap + * lock only ensures a stable _lookup_, the result can become + * stale as soon as the lock is dropped. + */ + filemap_invalidate_lock_shared(inode->i_mapping); + attrs =3D kvm_gmem_get_attributes(inode, kvm_gmem_get_index(slot, gfn)); + filemap_invalidate_unlock_shared(inode->i_mapping); + + return attrs; +} +EXPORT_SYMBOL_FOR_KVM_INTERNAL(kvm_gmem_get_memory_attributes); + static struct file_operations kvm_gmem_fops =3D { .mmap =3D kvm_gmem_mmap, .open =3D generic_file_open, diff --git a/virt/kvm/kvm_main.c b/virt/kvm/kvm_main.c index dbdcef90a4950..7bb59679c9316 100644 --- a/virt/kvm/kvm_main.c +++ b/virt/kvm/kvm_main.c @@ -2660,6 +2660,9 @@ static void kvm_init_memory_attributes(void) if (vm_memory_attributes) static_call_update(__kvm_get_memory_attributes, kvm_get_vm_memory_attributes); + else if (IS_ENABLED(CONFIG_KVM_GUEST_MEMFD)) + static_call_update(__kvm_get_memory_attributes, + kvm_gmem_get_memory_attributes); else static_call_update(__kvm_get_memory_attributes, (void *)__static_call_return0); --=20 2.53.0.1018.g2bb0e51243-goog From nobody Thu Apr 2 09:33:37 2026 Received: from mail-pg1-f202.google.com (mail-pg1-f202.google.com [209.85.215.202]) (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 1DC8E34DCEC for ; Thu, 26 Mar 2026 22:24:37 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.215.202 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1774563879; cv=none; b=A4rb5ZYDOadi4LsmqMoP2bU8zvkihz6otKKeaLfr93MP8oYgV4t4vVZJyd6slj+Uv4NoFOaA9awV40Yo7ehWrNn8QA78a8fZGr+D3QFW4KzprFXL3NVu8qy2rcoGa3SnZwjzd6whzYAZFibs853Ql4k1lPE22bF+oQvkJD3nd4E= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1774563879; c=relaxed/simple; bh=vymNc3F4VBBGneenNd8IucPbAr1SdMuDYSLrejXwwUQ=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=i1coSM4YMY+mr8Ig/59znBivqI/LvmCqPMONqn1xJWlBO0yOuaAT3/v1Ls1clTvqzVQqBnqoFxXkAQfqvFKj1v7iKQ3SWGeLZFWdE6hbQTlLGKNQHd3Sp6MZk8C+wZJtcThcMNkUrnEBakdvqVl8BNDZf6tduYamTheuBZRZ12Q= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com; spf=pass smtp.mailfrom=flex--ackerleytng.bounces.google.com; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b=WvS3T43J; arc=none smtp.client-ip=209.85.215.202 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=flex--ackerleytng.bounces.google.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="WvS3T43J" Received: by mail-pg1-f202.google.com with SMTP id 41be03b00d2f7-c741f044883so1095631a12.0 for ; Thu, 26 Mar 2026 15:24:37 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20251104; t=1774563877; x=1775168677; darn=vger.kernel.org; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:from:to:cc:subject:date:message-id:reply-to; bh=L64Ei+w9HuDhN4D3+e2YG8ZNRPlnX30IypUuq/5FXOw=; b=WvS3T43J3zS+dqWZKkD72bxGuh/DRC7k99vWg6cNrpeDpwBce62OJevZJyx1T3qf2G JLw7FG/b7KExzKtwxbOvFWtuy6wEinO2f53sxcByXEiGTzi7pDEmm5vy3OH34o+luYLv itz1xBfxYzz3XpHpGiGjHPGRydjYHvfbMAUXFhR9aB+i99QixPScIPvMWN+5Cz9ukWy9 INPOn7OI4eHMwhQ04Ywzik3jd6vfYpSV6a4EeQ4qt71xy+ynQFzI9nDUx9Fhbl38hVon tAm6EyEb7sIbx+t1AOInonKcqtZlot1fkHStKv7e5AvwnxfBY4bQTpU44WoUZ/NzY3jk 2vBA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1774563877; x=1775168677; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=L64Ei+w9HuDhN4D3+e2YG8ZNRPlnX30IypUuq/5FXOw=; b=PpXoOxnwRFXwybRtUYDg4aHSnO+l9XKI9ZKuogkt1ovK8ppFGYBKMU8JFCLG1Qtqho 7rk6mopYbASw3vLstNcC2cNIWOqPupLcM6PDuKBL57kSfy7qyCsG3Bv6NCHI812Xd+hF D5BgGqfOXkojbYc6dzWe6BJPyQJrX91+Suf6ObUYodVDSXb92OzuHwPUmG33qL4pHA+V dqtoIC+V3aOp/ScyDP1ABriiAsUHzmt6OQG0x5yl1IIX/dMk/iUBB/IFoaWsKSxbIIZu zIE4PkhGM3NrHX0xyK3rSDSbchHuGncKsRJgbdsyvVlzpPQPG6Snzt572F/ITjL546vI Is2w== X-Forwarded-Encrypted: i=1; AJvYcCVDL/d4xG2u8IM+FZW0l9aSeVLBbp99F3/mT0JlnlhqbBb34RPicdaCm/Fsaz5Uc/627qX0pNpKxrseFA8=@vger.kernel.org X-Gm-Message-State: AOJu0Ywn/DjH8+BRQl88RMcp4FFRDu5SIR2YfhkYouZh6TZFvPdXXD17 iK0It4L5TY1KM7O62UfqG2wF2OStCz32wPi5/IJE3GDvZxmFWLgvmOdG1qtQ4y81ARnlhuyCvIx 67SEJ3DmTUorHeFGaEtNJgnjxbg== X-Received: from pgbcr6.prod.google.com ([2002:a05:6a02:4106:b0:c73:c1e2:84e7]) (user=ackerleytng job=prod-delivery.src-stubby-dispatcher) by 2002:a05:6a20:431d:b0:38d:ee4a:e82f with SMTP id adf61e73a8af0-39c87c4aed6mr312128637.63.1774563876758; Thu, 26 Mar 2026 15:24:36 -0700 (PDT) Date: Thu, 26 Mar 2026 15:24:15 -0700 In-Reply-To: <20260326-gmem-inplace-conversion-v4-0-e202fe950ffd@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20260326-gmem-inplace-conversion-v4-0-e202fe950ffd@google.com> X-Developer-Key: i=ackerleytng@google.com; a=ed25519; pk=sAZDYXdm6Iz8FHitpHeFlCMXwabodTm7p8/3/8xUxuU= X-Developer-Signature: v=1; a=ed25519-sha256; t=1774563861; l=5802; i=ackerleytng@google.com; s=20260225; h=from:subject:message-id; bh=vymNc3F4VBBGneenNd8IucPbAr1SdMuDYSLrejXwwUQ=; b=1LWUYI7gs645uKY5pvp+JN0SJPLpfIcJb5vTHCCN4uONoDtA/ZkQwB57ZGcilNgQcL6dc3IRn laHi/lbCytrCWoczD6QHAkpcw7DrsnR7zLOahw4n2P3/9JSmm1eBIJs X-Mailer: b4 0.14.3 Message-ID: <20260326-gmem-inplace-conversion-v4-6-e202fe950ffd@google.com> Subject: [PATCH RFC v4 06/44] KVM: guest_memfd: Update kvm_gmem_populate() to use gmem attributes From: Ackerley Tng To: aik@amd.com, andrew.jones@linux.dev, binbin.wu@linux.intel.com, brauner@kernel.org, chao.p.peng@linux.intel.com, david@kernel.org, ira.weiny@intel.com, jmattson@google.com, jroedel@suse.de, 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, tabba@google.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, 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 , Baoquan He , Barry Song , Axel Rasmussen , Yuanchu Xie , Wei Xu , Jason Gunthorpe , Vlastimil Babka Cc: 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, Ackerley Tng Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Update the guest_memfd populate() flow to pull memory attributes from the gmem instance instead of the VM when KVM is not configured to track shared/private status in the VM. Rename the per-VM API to make it clear that it retrieves per-VM attributes, i.e. is not suitable for use outside of flows that are specific to generic per-VM attributes. Co-developed-by: Sean Christopherson Signed-off-by: Sean Christopherson Signed-off-by: Ackerley Tng --- arch/x86/kvm/mmu/mmu.c | 2 +- include/linux/kvm_host.h | 14 +++++++++++++- virt/kvm/guest_memfd.c | 24 +++++++++++++++++++++--- virt/kvm/kvm_main.c | 8 +++----- 4 files changed, 38 insertions(+), 10 deletions(-) diff --git a/arch/x86/kvm/mmu/mmu.c b/arch/x86/kvm/mmu/mmu.c index 792701b093234..f21e16f22dd7b 100644 --- a/arch/x86/kvm/mmu/mmu.c +++ b/arch/x86/kvm/mmu/mmu.c @@ -7978,7 +7978,7 @@ static bool hugepage_has_attrs(struct kvm *kvm, struc= t kvm_memory_slot *slot, const unsigned long end =3D start + KVM_PAGES_PER_HPAGE(level); =20 if (level =3D=3D PG_LEVEL_2M) - return kvm_range_has_memory_attributes(kvm, start, end, ~0, attrs); + return kvm_range_has_vm_memory_attributes(kvm, start, end, ~0, attrs); =20 for (gfn =3D start; gfn < end; gfn +=3D KVM_PAGES_PER_HPAGE(level - 1)) { if (hugepage_test_mixed(slot, gfn, level - 1) || diff --git a/include/linux/kvm_host.h b/include/linux/kvm_host.h index 0f84421b3f49e..19f026f8de390 100644 --- a/include/linux/kvm_host.h +++ b/include/linux/kvm_host.h @@ -2534,12 +2534,24 @@ static inline bool kvm_mem_is_private(struct kvm *k= vm, gfn_t gfn) #endif =20 #ifdef CONFIG_KVM_VM_MEMORY_ATTRIBUTES -bool kvm_range_has_memory_attributes(struct kvm *kvm, gfn_t start, gfn_t e= nd, +extern bool vm_memory_attributes; +bool kvm_range_has_vm_memory_attributes(struct kvm *kvm, gfn_t start, gfn_= t end, unsigned long mask, unsigned long attrs); bool kvm_arch_pre_set_memory_attributes(struct kvm *kvm, struct kvm_gfn_range *range); bool kvm_arch_post_set_memory_attributes(struct kvm *kvm, struct kvm_gfn_range *range); +#else +#define vm_memory_attributes false +static inline bool kvm_range_has_vm_memory_attributes(struct kvm *kvm, + gfn_t start, gfn_t end, + unsigned long mask, + unsigned long attrs) +{ + WARN_ONCE(1, "Unexpected call to kvm_range_has_vm_memory_attributes()"); + + return false; +} #endif /* CONFIG_KVM_VM_MEMORY_ATTRIBUTES */ =20 unsigned long kvm_gmem_get_memory_attributes(struct kvm *kvm, gfn_t gfn); diff --git a/virt/kvm/guest_memfd.c b/virt/kvm/guest_memfd.c index 6f4252c8b3f59..b6ffa8734175d 100644 --- a/virt/kvm/guest_memfd.c +++ b/virt/kvm/guest_memfd.c @@ -936,12 +936,31 @@ int kvm_gmem_get_pfn(struct kvm *kvm, struct kvm_memo= ry_slot *slot, EXPORT_SYMBOL_FOR_KVM_INTERNAL(kvm_gmem_get_pfn); =20 #ifdef CONFIG_HAVE_KVM_ARCH_GMEM_POPULATE +static bool kvm_gmem_range_is_private(struct gmem_inode *gi, pgoff_t index, + size_t nr_pages, struct kvm *kvm, gfn_t gfn) +{ + pgoff_t end =3D index + nr_pages - 1; + void *entry; + + if (vm_memory_attributes) + return kvm_range_has_vm_memory_attributes(kvm, gfn, gfn + nr_pages, + KVM_MEMORY_ATTRIBUTE_PRIVATE, + KVM_MEMORY_ATTRIBUTE_PRIVATE); + + mt_for_each(&gi->attributes, entry, index, end) { + if (xa_to_value(entry) !=3D KVM_MEMORY_ATTRIBUTE_PRIVATE) + return false; + } + + return true; +} =20 static long __kvm_gmem_populate(struct kvm *kvm, struct kvm_memory_slot *s= lot, struct file *file, gfn_t gfn, struct page *src_page, kvm_gmem_populate_cb post_populate, void *opaque) { pgoff_t index =3D kvm_gmem_get_index(slot, gfn); + struct gmem_inode *gi; struct folio *folio; kvm_pfn_t pfn; int ret; @@ -956,9 +975,8 @@ static long __kvm_gmem_populate(struct kvm *kvm, struct= kvm_memory_slot *slot, =20 folio_unlock(folio); =20 - if (!kvm_range_has_memory_attributes(kvm, gfn, gfn + 1, - KVM_MEMORY_ATTRIBUTE_PRIVATE, - KVM_MEMORY_ATTRIBUTE_PRIVATE)) { + gi =3D GMEM_I(file_inode(file)); + if (!kvm_gmem_range_is_private(gi, index, 1, kvm, gfn)) { ret =3D -EINVAL; goto out_put_folio; } diff --git a/virt/kvm/kvm_main.c b/virt/kvm/kvm_main.c index 7bb59679c9316..70b594dafc5cc 100644 --- a/virt/kvm/kvm_main.c +++ b/virt/kvm/kvm_main.c @@ -104,9 +104,7 @@ module_param(allow_unsafe_mappings, bool, 0444); =20 #ifdef CONFIG_KVM_MEMORY_ATTRIBUTES #ifdef CONFIG_KVM_VM_MEMORY_ATTRIBUTES -static bool vm_memory_attributes =3D true; -#else -#define vm_memory_attributes false +bool vm_memory_attributes =3D true; #endif DEFINE_STATIC_CALL_RET0(__kvm_get_memory_attributes, kvm_get_memory_attrib= utes_t); EXPORT_SYMBOL_FOR_KVM_INTERNAL(STATIC_CALL_KEY(__kvm_get_memory_attributes= )); @@ -2457,7 +2455,7 @@ static unsigned long kvm_get_vm_memory_attributes(str= uct kvm *kvm, gfn_t gfn) * Returns true if _all_ gfns in the range [@start, @end) have attributes * such that the bits in @mask match @attrs. */ -bool kvm_range_has_memory_attributes(struct kvm *kvm, gfn_t start, gfn_t e= nd, +bool kvm_range_has_vm_memory_attributes(struct kvm *kvm, gfn_t start, gfn_= t end, unsigned long mask, unsigned long attrs) { XA_STATE(xas, &kvm->mem_attr_array, start); @@ -2591,7 +2589,7 @@ static int kvm_vm_set_mem_attributes(struct kvm *kvm,= gfn_t start, gfn_t end, mutex_lock(&kvm->slots_lock); =20 /* Nothing to do if the entire range has the desired attributes. */ - if (kvm_range_has_memory_attributes(kvm, start, end, ~0, attributes)) + if (kvm_range_has_vm_memory_attributes(kvm, start, end, ~0, attributes)) goto out_unlock; =20 /* --=20 2.53.0.1018.g2bb0e51243-goog From nobody Thu Apr 2 09:33:37 2026 Received: from mail-pj1-f73.google.com (mail-pj1-f73.google.com [209.85.216.73]) (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 9FC8434D909 for ; Thu, 26 Mar 2026 22:24:39 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.216.73 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1774563881; cv=none; b=qu14oyCuRWDsnH0U62XKPN6WIMhuHm/uflbHfW2Dv2ff5tgmtFwMuI+fUUfRJiG8K/gDeiqiul+bApW/x4PLvYyuQuv/RKB9Kk3NGTI6PElyGScUrxYzUreVs1obYO2VQEcdmRzwg2yWsL3IgKdXTS4H3hBEr3fhG447fdqd14c= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1774563881; c=relaxed/simple; bh=Bkrh8dbtdInO5wZHJbP237TumUuE8eZL80zRafq4z5c=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=Y3fK2Z0VBfzZM0SQtTgAiSTLqqkeXYZO6kexPHuY61tazto0BZlU4oSSqGukYeHy71fB3zCr7TRV2n9RkVaT5wjGJz6CAEFkiiCx+RTRkBfqyKv0hnOd9RYSpOD8Vt6vm3nnSX3ap/77Mr7/PAFQ7m52rhRnsDApqXlh1EWyJX8= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com; spf=pass smtp.mailfrom=flex--ackerleytng.bounces.google.com; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b=W9jtKfwX; arc=none smtp.client-ip=209.85.216.73 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=flex--ackerleytng.bounces.google.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="W9jtKfwX" Received: by mail-pj1-f73.google.com with SMTP id 98e67ed59e1d1-35641c14663so1962595a91.2 for ; Thu, 26 Mar 2026 15:24:39 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20251104; t=1774563879; x=1775168679; darn=vger.kernel.org; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:from:to:cc:subject:date:message-id:reply-to; bh=tsJB8DUiPUozVAwHEUqka6GAzAJgxzJ+NiuNM0UTPFA=; b=W9jtKfwXT6LDzVvXXsaDpOIRThQrulrcXC/NAc4NplFY7CbuQAtwqUYWh5dJgQgVsQ O9gXfeI7kuWwH3YzUAo03N9nDXkI6oWVsba9dYCKzx9ydvwa5ZmXpEXqDPe1w3fr/vSN iiVxaH7AAVlWJkhqqVrkP+qEUiLVgC5i+mnSwI0aYoFLRq9NRmnoSRvzB9t2qLZ3Txtj 6pmhfJHEEY2aC/GjGFMhPwEussjVMW9GfLbM0BbswX15ROD5U6XpwAB92MpaNRss7pes bW0O0m6gWLaH2EbkRIo4gcKqpM44Xd9DoicL9JPitSgVbJEzTCSzprMzDKusvZSDuf2n Nr+w== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1774563879; x=1775168679; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=tsJB8DUiPUozVAwHEUqka6GAzAJgxzJ+NiuNM0UTPFA=; b=Ent+odHzWtpsA+wiQ48y/krmmZG5GYRDzAb5EklcGVz/vNiIPS79O3S38CbgUZKjTj 1u0+kqEHry6SLIzCd1FfaQ9D6hdeNcvwgd8g+kmwBFsrvCn5szBqP1pNf8wCV3K1136E w8PeapFdvQWFV4805FeMvzC2IIlt2d25KYQlIfK8G31AsYwjLJ374EfqEjDG9WJq09TI WDF0D7yw/VPZDcGHzeMH9PoaLpBimnlShLR1h+aB8Z7hXaWVeUgf/U/95XPCjsbODUqE vTEOwlIxPuQ+4V83VXWpY/Vn4ompHtB/h742lv0uJlRAa8QlKlZuWCbYE2o5C27waX+P 3e+g== X-Forwarded-Encrypted: i=1; AJvYcCXjV6Y2oqzqiTAUurat1hdG/MSQ4bZAy7IaMpjG3o/c90RP0R/rrZijmaci/UZUMvCSwQ+454VcfdiDwGg=@vger.kernel.org X-Gm-Message-State: AOJu0YwiKPS59pmhBKwWRSfAaTqoFb9x1rFoqCEyjq/i7Wf//NVCuo6V gYKrHh2aS4Pa9BRG2JqEqhreQIRvU9NM635XPB90oNrQuavSIh/g5jyVsjIMMHlK14SyD+QAC6L Ai/f1ycqdRFMMX8TDSXdzo5/Hvw== X-Received: from pjtf15.prod.google.com ([2002:a17:90a:c28f:b0:359:8bb2:c98d]) (user=ackerleytng job=prod-delivery.src-stubby-dispatcher) by 2002:a17:90b:3e81:b0:35b:a8cf:7969 with SMTP id 98e67ed59e1d1-35c30000104mr272692a91.11.1774563878752; Thu, 26 Mar 2026 15:24:38 -0700 (PDT) Date: Thu, 26 Mar 2026 15:24:16 -0700 In-Reply-To: <20260326-gmem-inplace-conversion-v4-0-e202fe950ffd@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20260326-gmem-inplace-conversion-v4-0-e202fe950ffd@google.com> X-Developer-Key: i=ackerleytng@google.com; a=ed25519; pk=sAZDYXdm6Iz8FHitpHeFlCMXwabodTm7p8/3/8xUxuU= X-Developer-Signature: v=1; a=ed25519-sha256; t=1774563861; l=2199; i=ackerleytng@google.com; s=20260225; h=from:subject:message-id; bh=Bkrh8dbtdInO5wZHJbP237TumUuE8eZL80zRafq4z5c=; b=r+Ksvf5Tzi9wrZK3RvQc1ByJZ1ZJxVo8VxXv/mzOeG32ukrA+EzJbetR3GTGB2X4avA5pYEIw 2Sc+4DsfnYHB5FEh+yTsFYKnnRlz4kYJ7QAOuJpchSQEInd/x8o+zGI X-Mailer: b4 0.14.3 Message-ID: <20260326-gmem-inplace-conversion-v4-7-e202fe950ffd@google.com> Subject: [PATCH RFC v4 07/44] KVM: guest_memfd: Only prepare folios for private pages From: Ackerley Tng To: aik@amd.com, andrew.jones@linux.dev, binbin.wu@linux.intel.com, brauner@kernel.org, chao.p.peng@linux.intel.com, david@kernel.org, ira.weiny@intel.com, jmattson@google.com, jroedel@suse.de, 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, tabba@google.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, 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 , Baoquan He , Barry Song , Axel Rasmussen , Yuanchu Xie , Wei Xu , Jason Gunthorpe , Vlastimil Babka Cc: 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, Ackerley Tng Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable All-shared guest_memfd used to be only supported for non-CoCo VMs where preparation doesn't apply. INIT_SHARED is about to be supported for non-CoCo VMs in a later patch in this series. In addition, KVM_SET_MEMORY_ATTRIBUTES2 is about to be supported in guest_memfd in a later patch in this series. This means that the kvm fault handler may now call kvm_gmem_get_pfn() on a shared folio for a CoCo VM where preparation applies. Add a check to make sure that preparation is only performed for private folios. Preparation will be undone on freeing (see kvm_gmem_free_folio()) and on conversion to shared. Signed-off-by: Ackerley Tng --- virt/kvm/guest_memfd.c | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/virt/kvm/guest_memfd.c b/virt/kvm/guest_memfd.c index b6ffa8734175d..d414ebfcb4c19 100644 --- a/virt/kvm/guest_memfd.c +++ b/virt/kvm/guest_memfd.c @@ -900,6 +900,7 @@ int kvm_gmem_get_pfn(struct kvm *kvm, struct kvm_memory= _slot *slot, int *max_order) { pgoff_t index =3D kvm_gmem_get_index(slot, gfn); + struct inode *inode; struct folio *folio; int r =3D 0; =20 @@ -907,7 +908,8 @@ int kvm_gmem_get_pfn(struct kvm *kvm, struct kvm_memory= _slot *slot, if (!file) return -EFAULT; =20 - filemap_invalidate_lock_shared(file_inode(file)->i_mapping); + inode =3D file_inode(file); + filemap_invalidate_lock_shared(inode->i_mapping); =20 folio =3D __kvm_gmem_get_pfn(file, slot, index, pfn, max_order); if (IS_ERR(folio)) { @@ -920,7 +922,8 @@ int kvm_gmem_get_pfn(struct kvm *kvm, struct kvm_memory= _slot *slot, folio_mark_uptodate(folio); } =20 - r =3D kvm_gmem_prepare_folio(kvm, slot, gfn, folio); + if (kvm_gmem_is_private_mem(inode, index)) + r =3D kvm_gmem_prepare_folio(kvm, slot, gfn, folio); =20 folio_unlock(folio); =20 @@ -930,7 +933,7 @@ int kvm_gmem_get_pfn(struct kvm *kvm, struct kvm_memory= _slot *slot, folio_put(folio); =20 out: - filemap_invalidate_unlock_shared(file_inode(file)->i_mapping); + filemap_invalidate_unlock_shared(inode->i_mapping); return r; } EXPORT_SYMBOL_FOR_KVM_INTERNAL(kvm_gmem_get_pfn); --=20 2.53.0.1018.g2bb0e51243-goog From nobody Thu Apr 2 09:33:37 2026 Received: from mail-pf1-f201.google.com (mail-pf1-f201.google.com [209.85.210.201]) (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 185B133CEA9 for ; Thu, 26 Mar 2026 22:24:41 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.210.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1774563883; cv=none; b=nTpSfHrnX736USikamJcnlY6ceiVzeT2I7j7/E5lnowE62yBo4lh6G8QRGL9MEb6vyrKllNwjowK/siWcYe7gVp2wKY171yOATUUHp9kQ86Sa0MFEptaKCXPT5UPXAxQvSE+19umWuBta6ElIgnBtMJ+mzhzVwu33iaTzN99rkU= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1774563883; c=relaxed/simple; bh=rr13v0ReufuLtKHyRyN4FDB898pT6Hlku9bGOsppn1A=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=PCOdzqr6XhOzmEfzIXkAWOEOfkbH/t307TEqFdZLTTkc46ByzViLdkxDibVHgcJPBNMsS4+1tP6jxscrotYeibw6WRwNOVHwHGqecOaGn38/GRK6qFhuN2VBZ819go1FSPBCPaS/SAWENc5/Tpt8xA67PUWsaBh+MCVbKyGHdDQ= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com; spf=pass smtp.mailfrom=flex--ackerleytng.bounces.google.com; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b=TviceDe0; arc=none smtp.client-ip=209.85.210.201 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=flex--ackerleytng.bounces.google.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="TviceDe0" Received: by mail-pf1-f201.google.com with SMTP id d2e1a72fcca58-82a77f807e4so2632644b3a.3 for ; Thu, 26 Mar 2026 15:24:41 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20251104; t=1774563881; x=1775168681; darn=vger.kernel.org; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:from:to:cc:subject:date:message-id:reply-to; bh=scH0lZ1p8wn4J/rr93E4hm/58GW/JK+mDvgq+J6pH2U=; b=TviceDe0wyOjgXBHzQTxp5LovD9/kGvj6ZSNw3swqRarD1L1RoJf0RO0U7GOv3zHWd 8a0FjAa8yXXjM+erOh8ApsVoKi9bCNvXja8SFAozYHnlxPUptsA+EgAr7IZMHo+SDl4J FyIeN6WjJO3ciR66BQIRECtCj00TvSvYeC+J5VLkrUBVHn7zLrvNHhagcbDaMWOfDVEg UDLWfT6RUnUHn0X0csjZxytfWEv4YWk7bSE8G7Jb08JDynedVtnarMVSJT9tCRwG6fZS MSWU82ObwMtPtYf4t/6g1x+2d68kYOp5tH4A2LlRJ0ZtSZqdHUPRwlo6p5pdyyQV0GQ6 YVXw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1774563881; x=1775168681; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=scH0lZ1p8wn4J/rr93E4hm/58GW/JK+mDvgq+J6pH2U=; b=bB51TdGyi1b0wyxYDQM2bCp+GF0S1gj4bwZw8BG57zb9O5jb/dYnb7hsT0pXiNqezk A0ggOvPKCzW3qRB9Q3dqRoZWUcqPgi4xxYPSMk3PQ3R1w/41yDiSChN5UnLrAbJHKWZk 0listrnGy6PONx+3OnZOvlp5qCC7S4W8fpKn2XKos2wQzX38mD1/r1zOEUxO8SIX+1Nj JItW+Z5UIUxtPcN7Mgs8WQgmA9MtqWln7cPP1La5rvpJm667qg7aFiddJ4Rr3WYOgjdc BA2hXOHCbWlaerDww4opdAKMANxJsMuAkcKQd2tjrZx3y10SWUC4jn15DVVoCaif6AEM av+Q== X-Forwarded-Encrypted: i=1; AJvYcCXM6vcCtYYs5jQ675q1END4GHHfLkyz5RZOtOJxwLWBY1/KA9NVCSkLyYwigy3CLv9qgkfd9XSKdXfoe+g=@vger.kernel.org X-Gm-Message-State: AOJu0Yx7edfnrGG6kuRE+UXi7/Ox8r6PtuEtyZqt6x0ISPugHHQQnrSd A8eVIdcp/vBTplfifv0KD2gRJE5kcixEMaAYSekE6YsfOc2U9qtfDxWE+p4prwf1EQjeQCt9j/7 vz+8NYSpeJbhEsdfnwQ09uQntIg== X-Received: from pfbmb26.prod.google.com ([2002:a05:6a00:761a:b0:829:a3d9:9345]) (user=ackerleytng job=prod-delivery.src-stubby-dispatcher) by 2002:a05:6a00:14d1:b0:824:374a:1424 with SMTP id d2e1a72fcca58-82c96045159mr128711b3a.58.1774563880905; Thu, 26 Mar 2026 15:24:40 -0700 (PDT) Date: Thu, 26 Mar 2026 15:24:17 -0700 In-Reply-To: <20260326-gmem-inplace-conversion-v4-0-e202fe950ffd@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20260326-gmem-inplace-conversion-v4-0-e202fe950ffd@google.com> X-Developer-Key: i=ackerleytng@google.com; a=ed25519; pk=sAZDYXdm6Iz8FHitpHeFlCMXwabodTm7p8/3/8xUxuU= X-Developer-Signature: v=1; a=ed25519-sha256; t=1774563861; l=7356; i=ackerleytng@google.com; s=20260225; h=from:subject:message-id; bh=rr13v0ReufuLtKHyRyN4FDB898pT6Hlku9bGOsppn1A=; b=nFeFzTX8ygVbPanVDLq7QCIuwm0m3IM+MkQCg+3Y/ZgpL4egW6yC/P2AYDQ3LIc1fpYcY3/Vc q5YdI9LOQx9CHKVyQhNKOkJtQCHUwiYrJZy8/+KcXHHCuWBiotb3HSv X-Mailer: b4 0.14.3 Message-ID: <20260326-gmem-inplace-conversion-v4-8-e202fe950ffd@google.com> Subject: [PATCH RFC v4 08/44] KVM: Introduce KVM_SET_MEMORY_ATTRIBUTES2 From: Ackerley Tng To: aik@amd.com, andrew.jones@linux.dev, binbin.wu@linux.intel.com, brauner@kernel.org, chao.p.peng@linux.intel.com, david@kernel.org, ira.weiny@intel.com, jmattson@google.com, jroedel@suse.de, 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, tabba@google.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, 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 , Baoquan He , Barry Song , Axel Rasmussen , Yuanchu Xie , Wei Xu , Jason Gunthorpe , Vlastimil Babka Cc: 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, Ackerley Tng Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Introduce a "version 2" of KVM_SET_MEMORY_ATTRIBUTES to support returning information back to userspace. This new ioctl and structure will, in a later patch, be shared as a guest_memfd ioctl, where the padding in the new kvm_memory_attributes2 structure will be for writing the response from the guest_memfd ioctl to userspace. A new ioctl is necessary for these reasons: 1. KVM_SET_MEMORY_ATTRIBUTES is currently a write-only ioctl and does not allow userspace to read fields. There's nothing in code (yet?) that validates this, but using _IOWR for consistency would be prudent. 2. KVM_SET_MEMORY_ATTRIBUTES, when used as a guest_memfd ioctl, will need an additional field to provide userspace with more error details. Alternatively, a completely new ioctl could be defined, unrelated to KVM_SET_MEMORY_ATTRIBUTES, but using the same ioctl number and struct for the vm and guest_memfd ioctls streamlines the interface for userspace. In addition, any memory attributes, implemented on the vm or guest_memfd ioctl, can be easily shared with the other. Add KVM_CAP_MEMORY_ATTRIBUTES2 to indicate that struct kvm_memory_attributes2 exists and can be used either with KVM_SET_MEMORY_ATTRIBUTES2 via the vm or guest_memfd ioctl. Handle KVM_CAP_MEMORY_ATTRIBUTES2 and return the same supported attributes as would be returned for KVM_CAP_MEMORY_ATTRIBUTES - the supported attributes are the same for now, regardless of the CAP requested. Suggested-by: Sean Christopherson Signed-off-by: Ackerley Tng --- Documentation/virt/kvm/api.rst | 32 ++++++++++++++++++++++++++++++++ include/uapi/linux/kvm.h | 12 ++++++++++++ virt/kvm/kvm_main.c | 40 +++++++++++++++++++++++++++++++++++++-= -- 3 files changed, 81 insertions(+), 3 deletions(-) diff --git a/Documentation/virt/kvm/api.rst b/Documentation/virt/kvm/api.rst index 032516783e962..0b61e2579e1d8 100644 --- a/Documentation/virt/kvm/api.rst +++ b/Documentation/virt/kvm/api.rst @@ -6359,6 +6359,8 @@ S390: Returns -EINVAL if the VM has the KVM_VM_S390_UCONTROL flag set. Returns -EINVAL if called on a protected VM. =20 +.. _KVM_SET_MEMORY_ATTRIBUTES: + 4.141 KVM_SET_MEMORY_ATTRIBUTES ------------------------------- =20 @@ -6551,6 +6553,36 @@ KVM_S390_KEYOP_SSKE Sets the storage key for the guest address ``guest_addr`` to the key specified in ``key``, returning the previous value in ``key``. =20 +4.145 KVM_SET_MEMORY_ATTRIBUTES2 +--------------------------------- + +:Capability: KVM_CAP_MEMORY_ATTRIBUTES2 +:Architectures: x86 +:Type: vm ioctl +:Parameters: struct kvm_memory_attributes2 (in/out) +:Returns: 0 on success, <0 on error + +KVM_SET_MEMORY_ATTRIBUTES2 is an extension to +KVM_SET_MEMORY_ATTRIBUTES that supports returning (writing) values to +userspace. The original (pre-extension) fields are shared with +KVM_SET_MEMORY_ATTRIBUTES identically. + +Attribute values are shared with KVM_SET_MEMORY_ATTRIBUTES. + +:: + + struct kvm_memory_attributes2 { + __u64 address; + __u64 size; + __u64 attributes; + __u64 flags; + __u64 reserved[12]; + }; + + #define KVM_MEMORY_ATTRIBUTE_PRIVATE (1ULL << 3) + +See also: :ref: `KVM_SET_MEMORY_ATTRIBUTES`. + .. _kvm_run: =20 5. The kvm_run structure diff --git a/include/uapi/linux/kvm.h b/include/uapi/linux/kvm.h index 80364d4dbebb0..16567d4a769e5 100644 --- a/include/uapi/linux/kvm.h +++ b/include/uapi/linux/kvm.h @@ -989,6 +989,7 @@ struct kvm_enable_cap { #define KVM_CAP_ARM_SEA_TO_USER 245 #define KVM_CAP_S390_USER_OPEREXEC 246 #define KVM_CAP_S390_KEYOP 247 +#define KVM_CAP_MEMORY_ATTRIBUTES2 248 =20 struct kvm_irq_routing_irqchip { __u32 irqchip; @@ -1637,6 +1638,17 @@ struct kvm_memory_attributes { __u64 flags; }; =20 +/* Available with KVM_CAP_MEMORY_ATTRIBUTES2 */ +#define KVM_SET_MEMORY_ATTRIBUTES2 _IOWR(KVMIO, 0xd2, struct= kvm_memory_attributes2) + +struct kvm_memory_attributes2 { + __u64 address; + __u64 size; + __u64 attributes; + __u64 flags; + __u64 reserved[12]; +}; + #define KVM_MEMORY_ATTRIBUTE_PRIVATE (1ULL << 3) =20 #define KVM_CREATE_GUEST_MEMFD _IOWR(KVMIO, 0xd4, struct kvm_create_guest= _memfd) diff --git a/virt/kvm/kvm_main.c b/virt/kvm/kvm_main.c index 70b594dafc5cc..3c261904322f0 100644 --- a/virt/kvm/kvm_main.c +++ b/virt/kvm/kvm_main.c @@ -2621,9 +2621,10 @@ static int kvm_vm_set_mem_attributes(struct kvm *kvm= , gfn_t start, gfn_t end, return r; } static int kvm_vm_ioctl_set_mem_attributes(struct kvm *kvm, - struct kvm_memory_attributes *attrs) + struct kvm_memory_attributes2 *attrs) { gfn_t start, end; + int i; =20 /* flags is currently not used. */ if (attrs->flags) @@ -2634,6 +2635,10 @@ static int kvm_vm_ioctl_set_mem_attributes(struct kv= m *kvm, return -EINVAL; if (!PAGE_ALIGNED(attrs->address) || !PAGE_ALIGNED(attrs->size)) return -EINVAL; + for (i =3D 0; i < ARRAY_SIZE(attrs->reserved); i++) { + if (attrs->reserved[i]) + return -EINVAL; + } =20 start =3D attrs->address >> PAGE_SHIFT; end =3D (attrs->address + attrs->size) >> PAGE_SHIFT; @@ -4966,6 +4971,7 @@ static int kvm_vm_ioctl_check_extension_generic(struc= t kvm *kvm, long arg) case KVM_CAP_DEVICE_CTRL: return 1; #ifdef CONFIG_KVM_VM_MEMORY_ATTRIBUTES + case KVM_CAP_MEMORY_ATTRIBUTES2: case KVM_CAP_MEMORY_ATTRIBUTES: if (!vm_memory_attributes) return 0; @@ -5191,6 +5197,14 @@ do { \ sizeof_field(struct kvm_userspace_memory_region2, field)); \ } while (0) =20 +#define SANITY_CHECK_MEMORY_ATTRIBUTES_FIELD(field) \ +do { \ + BUILD_BUG_ON(offsetof(struct kvm_memory_attributes, field) !=3D \ + offsetof(struct kvm_memory_attributes2, field)); \ + BUILD_BUG_ON(sizeof_field(struct kvm_memory_attributes, field) !=3D \ + sizeof_field(struct kvm_memory_attributes2, field)); \ +} while (0) + static long kvm_vm_ioctl(struct file *filp, unsigned int ioctl, unsigned long arg) { @@ -5373,15 +5387,35 @@ static long kvm_vm_ioctl(struct file *filp, } #endif /* CONFIG_HAVE_KVM_IRQ_ROUTING */ #ifdef CONFIG_KVM_VM_MEMORY_ATTRIBUTES + case KVM_SET_MEMORY_ATTRIBUTES2: case KVM_SET_MEMORY_ATTRIBUTES: { - struct kvm_memory_attributes attrs; + struct kvm_memory_attributes2 attrs; + unsigned long size; + + if (ioctl =3D=3D KVM_SET_MEMORY_ATTRIBUTES) { + /* + * Fields beyond struct kvm_memory_attributes shouldn't + * be accessed, but avoid leaking kernel memory in case + * of a bug. + */ + memset(&attrs, 0, sizeof(attrs)); + size =3D sizeof(struct kvm_memory_attributes); + } else { + size =3D sizeof(struct kvm_memory_attributes2); + } + + /* Ensure the common parts of the two structs are identical. */ + SANITY_CHECK_MEMORY_ATTRIBUTES_FIELD(address); + SANITY_CHECK_MEMORY_ATTRIBUTES_FIELD(size); + SANITY_CHECK_MEMORY_ATTRIBUTES_FIELD(attributes); + SANITY_CHECK_MEMORY_ATTRIBUTES_FIELD(flags); =20 r =3D -ENOTTY; if (!vm_memory_attributes) goto out; =20 r =3D -EFAULT; - if (copy_from_user(&attrs, argp, sizeof(attrs))) + if (copy_from_user(&attrs, argp, size)) goto out; =20 r =3D kvm_vm_ioctl_set_mem_attributes(kvm, &attrs); --=20 2.53.0.1018.g2bb0e51243-goog From nobody Thu Apr 2 09:33:37 2026 Received: from mail-pf1-f202.google.com (mail-pf1-f202.google.com [209.85.210.202]) (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 F052E36B045 for ; Thu, 26 Mar 2026 22:24:43 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.210.202 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1774563886; cv=none; b=hZ2K0mjVdQj40YshdHP+rBHjyn+B2oRW84jWPV+tvd8kiUoj4C1h3nEdb3DBzTkXvSFEtR5UUpbe9M/bWPwIlnXaCKq6q/PKOThCrA8SZM1yyKy+xI/kPsY9D/NLuC/xEXAt9GDwJGSjSFqm0f2ohUROe4/ZkcmR1XLBjp6JnOI= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1774563886; c=relaxed/simple; bh=gE3KclXG+bVXmn4N8I/Pzv4zqyHg9U3PnnxTKQ6BJAA=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=IHi6a6lhUI5IAOCjAPmUJUlZDPx1T0vCKMSFHJqnhwOcG8cJNHFmZ2pZvjyfN6Mmd6ja78qFHhDD0pA49df/tNOZQ7LUMeGbdy+J7hHXRANddEAoMTtbFqllcpSm2J9aA062Y63X0g+uijPL7c8nQ49naw835K/nLWUYrM3awb0= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com; spf=pass smtp.mailfrom=flex--ackerleytng.bounces.google.com; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b=sX1/hitR; arc=none smtp.client-ip=209.85.210.202 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=flex--ackerleytng.bounces.google.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="sX1/hitR" Received: by mail-pf1-f202.google.com with SMTP id d2e1a72fcca58-82c73627355so943750b3a.2 for ; Thu, 26 Mar 2026 15:24:43 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20251104; t=1774563883; x=1775168683; darn=vger.kernel.org; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:from:to:cc:subject:date:message-id:reply-to; bh=tmnO4hb2PIIA1EWduI9O/UbYa6yJaVxG6FOYNP/OZJo=; b=sX1/hitRHE9h8u9vOXDMAshvOtEFJibLgOYVrMM50ReUqX6jC99w0z+ICWD0cl8tRL ZNfZCD9jD1rFEKSiqMiK0pcydY13PKEEQMuLNPlrAk1rZTgigmn9oALnSr3xlmST35v0 Szl7XvqnKjIGcF9ZZnMG46dIdKYVPGo1kKqgRKMF31XqJPxSRWXbRZIb0QGkFkJqITPi pmoe6tz79S+2ddO2KT541aL24H2Xo6NpytFoaIGMFGJkaly0RgjBbJF2ksBy9jkBZWSy 5JUwnI0exuP3nopY+7WJBc566pbdqwfHRej7OCV9nyVFCx3lwZ1xFaWAUxsl1xode42Y w2ig== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1774563883; x=1775168683; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=tmnO4hb2PIIA1EWduI9O/UbYa6yJaVxG6FOYNP/OZJo=; b=FB8vBo8M4cXMrsi1nsEh9pJtrNIRr9uofc1dbATQXeee9SX6psXB+ErKX0Ppjca2CJ Tz5em7K3JEJDF/Gv6kt5HNVVA2HbFKKLI1EkBHdpUI9hBJdoAyUg0tIMYRLJ3F/3q1TT W/4twrmwIv16HWeG48iTo30G5UcO+yddJwfe6dDvmf7PHI8ORZblEVrb3dC2b5WsNwid ZmN66/Qe3nDjguMOVjeXza9u5waqZ0fTbpXiJmBV3BCB5jPS5YXn99kS2rypWdQ+NTK2 +DcAXqemUKCv09d/I1VxVFzflCtagTvX412GAbJV3Os3m/BKQ1WsAcNo9A6iNtr5gpqr cmGQ== X-Forwarded-Encrypted: i=1; AJvYcCXi84jfk2KJN/PjG/kdL2ymM66bG4B28Cf1USd78FlWyavPq7lH3UmV56oUdP5G7GDQKKWkXCt+ZVn0ugI=@vger.kernel.org X-Gm-Message-State: AOJu0YxR4IseIEFetQM3zUuHWbd7bhpMV3C96Knom6VfUIicP2iMGTP2 S8QEuq5MW6ikfU0CPzOVr2dGjKgchWsjFFYuPJv6VSeszRM3sFPlWkZXCIhI5Q7BM6FoSA7a5JK kc+i4wkkKo/edxenk9HdhHFDG+w== X-Received: from pfbgi8.prod.google.com ([2002:a05:6a00:63c8:b0:82a:1997:96c2]) (user=ackerleytng job=prod-delivery.src-stubby-dispatcher) by 2002:a05:6a00:3388:b0:82a:e3de:27c2 with SMTP id d2e1a72fcca58-82c95ff78dfmr127743b3a.41.1774563883057; Thu, 26 Mar 2026 15:24:43 -0700 (PDT) Date: Thu, 26 Mar 2026 15:24:18 -0700 In-Reply-To: <20260326-gmem-inplace-conversion-v4-0-e202fe950ffd@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20260326-gmem-inplace-conversion-v4-0-e202fe950ffd@google.com> X-Developer-Key: i=ackerleytng@google.com; a=ed25519; pk=sAZDYXdm6Iz8FHitpHeFlCMXwabodTm7p8/3/8xUxuU= X-Developer-Signature: v=1; a=ed25519-sha256; t=1774563861; l=1337; i=ackerleytng@google.com; s=20260225; h=from:subject:message-id; bh=FPot4968BrrzY7lVw+wCqRSRqFOGaqVnuLbaco54t84=; b=pT1cKE5qo45twbYLFoifTHiRtxOTgBfSw8h/PmpQsnlghxeqA74ByQ0l7/JmSNZsH3jS0kwEA FZDy0ff5dwLBbaIcg7YIVPXmB7vme9WkWcqdC7GLxJMEVGO2PA4rqXh X-Mailer: b4 0.14.3 Message-ID: <20260326-gmem-inplace-conversion-v4-9-e202fe950ffd@google.com> Subject: [PATCH RFC v4 09/44] KVM: guest_memfd: Enable INIT_SHARED on guest_memfd for x86 Coco VMs From: Ackerley Tng To: aik@amd.com, andrew.jones@linux.dev, binbin.wu@linux.intel.com, brauner@kernel.org, chao.p.peng@linux.intel.com, david@kernel.org, ira.weiny@intel.com, jmattson@google.com, jroedel@suse.de, 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, tabba@google.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, 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 , Baoquan He , Barry Song , Axel Rasmussen , Yuanchu Xie , Wei Xu , Jason Gunthorpe , Vlastimil Babka Cc: 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, Ackerley Tng Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable From: Sean Christopherson Now that guest_memfd supports tracking private vs. shared within gmem itself, allow userspace to specify INIT_SHARED on a guest_memfd instance for x86 Confidential Computing (CoCo) VMs, so long as per-VM attributes are disabled, i.e. when it's actually possible for a guest_memfd instance to contain shared memory. Signed-off-by: Sean Christopherson --- arch/x86/kvm/x86.c | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c index 7e133a9da11f0..9c29407712580 100644 --- a/arch/x86/kvm/x86.c +++ b/arch/x86/kvm/x86.c @@ -14056,14 +14056,13 @@ bool kvm_arch_no_poll(struct kvm_vcpu *vcpu) } =20 #ifdef CONFIG_KVM_GUEST_MEMFD -/* - * KVM doesn't yet support initializing guest_memfd memory as shared for V= Ms - * with private memory (the private vs. shared tracking needs to be moved = into - * guest_memfd). - */ bool kvm_arch_supports_gmem_init_shared(struct kvm *kvm) { - return !kvm_arch_has_private_mem(kvm); + /* + * INIT_SHARED isn't supported if the memory attributes are per-VM, + * in which case guest_memfd can _only_ be used for private memory. + */ + return !vm_memory_attributes || !kvm_arch_has_private_mem(kvm); } =20 #ifdef CONFIG_HAVE_KVM_ARCH_GMEM_PREPARE --=20 2.53.0.1018.g2bb0e51243-goog From nobody Thu Apr 2 09:33:37 2026 Received: from mail-pf1-f202.google.com (mail-pf1-f202.google.com [209.85.210.202]) (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 E2464375F87 for ; Thu, 26 Mar 2026 22:24:45 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.210.202 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1774563889; cv=none; b=RJsFP3C3u40s1XTHHbWQRS9FgO/It3RdGsZ7fMmYWYtVXUNo7AIbXWrKtlldR/3hyWGW3dXyTzE82Jv2GrBctTlbp3Qi4/dMIWAc3mTnXkAGUkQZSmEaICKk49ew/txixbqdwNbfCm47+7591t29tk2k1XJ5j5NEiCN2oH3mxL4= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1774563889; c=relaxed/simple; bh=9ixsRIaeC9vea9dnhRR9Gp60vmsiq3UD4+TPS2FFgGw=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=kDmna30UNOXUPBw7BBZqWYwa4oCXkqUR0Y/9JxTdywj8lXgckJN7GMSa+JiLUEP/tOrctmCC4aQqTHW7jAj16GkBBMkJav2OjwT2IcSkRRJpE1j6u3uUuMEu2anqDXxuosTqis3wXB1309AR2sYt+w4j2/RT/DdeIrlqM4hlERw= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com; spf=pass smtp.mailfrom=flex--ackerleytng.bounces.google.com; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b=JvJ9bdsx; arc=none smtp.client-ip=209.85.210.202 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=flex--ackerleytng.bounces.google.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="JvJ9bdsx" Received: by mail-pf1-f202.google.com with SMTP id d2e1a72fcca58-82a855dc82aso1148091b3a.2 for ; Thu, 26 Mar 2026 15:24:45 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20251104; t=1774563885; x=1775168685; darn=vger.kernel.org; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:from:to:cc:subject:date:message-id:reply-to; bh=hNz7dKp3qod8Iu2OS/CY/d/eVhoCNMajDkSF7493OBc=; b=JvJ9bdsxiEQkfS3B3SZSCu+xoWgtaHmROqulYQUxvi25StC1MUJUbaM5w3t35JekK1 yTvi8iLrAMT5cn11sYG6dgefjHwxPRcrPGnARc09sPk5kFRtEWsX2dk9QZ65sVIllNgs ybB1n8Lu6T+BW//GyA6K84mRbDUANhjKWZ0OObfsnNmADkby1Pk0qKaAyNNYH1tRp8Vq Pb6PopqU1MxF+KKRO+xQTy57JdwtHNdAcBBeT4y1Ir7604vZ19Pr9s9czjbCMySJ6UiX SaPXPqTWsI64dK1q1F8OuycyqA9zhDTAROxdtx1RCLn6/V+Rc4/s+bJ7fY8LC+HLDtLf XR+w== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1774563885; x=1775168685; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=hNz7dKp3qod8Iu2OS/CY/d/eVhoCNMajDkSF7493OBc=; b=E3mSyYoXV5TMDdwDIoIXPdU7gGsq6cXupTYUJPmhmAUbNvnSZOOSmgMrJAcZhTAeoF Q/+u4VwnZ8bZzEM5nYoO5iPFIeuyQhVEu7bU4AL6DaZK7yh/HpZIrCd4aDogb8KCpn3l GUa57imSawgrFGiKmOl9f5H1EoFOJGXOAY2KV0v713+7aZUayTa8gP2x8Fi7EaLkyJKz LoAtwEQJ07g9UsZux7XAPY4FPLVas9bsYT0CJdjYLquzvvPzQzihJ0T2hzrUr3SnmUCh Aniz5rq+kaBuDzkOBLpkKaaA+FXQoUXDrnecO8BrHIvL7DGaeJ606lV+n/vEHrVX9ZkS LzSA== X-Forwarded-Encrypted: i=1; AJvYcCWkPFaHlaisY6lzOsuMUaDggY5UoYp2iWU11Nd2xq9hfeWYtNq59/U6PNiwD8FJIDP8twTL2YpnkD7wNms=@vger.kernel.org X-Gm-Message-State: AOJu0YyumM1zZSrU12/S8W3NjS7EDzQ3A1eZF0vNPPjXpULS7SQDOskb YgVApgnt2jRcVCL6Hdu0xUzws5D3A6YuNy7a+HVVvnBHL1dWVsTV1fVv/ImEVqj7RPkhFJgNilD yxiJ2t5ZhPA0eSfSPmqE88mWIcg== X-Received: from pfbig17.prod.google.com ([2002:a05:6a00:8b91:b0:7b0:bc2e:959b]) (user=ackerleytng job=prod-delivery.src-stubby-dispatcher) by 2002:a05:6a00:4b12:b0:82a:8030:f574 with SMTP id d2e1a72fcca58-82c9605623dmr135288b3a.33.1774563884826; Thu, 26 Mar 2026 15:24:44 -0700 (PDT) Date: Thu, 26 Mar 2026 15:24:19 -0700 In-Reply-To: <20260326-gmem-inplace-conversion-v4-0-e202fe950ffd@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20260326-gmem-inplace-conversion-v4-0-e202fe950ffd@google.com> X-Developer-Key: i=ackerleytng@google.com; a=ed25519; pk=sAZDYXdm6Iz8FHitpHeFlCMXwabodTm7p8/3/8xUxuU= X-Developer-Signature: v=1; a=ed25519-sha256; t=1774563861; l=15781; i=ackerleytng@google.com; s=20260225; h=from:subject:message-id; bh=9ixsRIaeC9vea9dnhRR9Gp60vmsiq3UD4+TPS2FFgGw=; b=sPWuy+R3a1t7m79dAJ8Gjh7qEWTks+CQpdvcIIbeFS6JR5Nko6LhtlHnopauaj4S6vicH4i/+ BNzZoot3Wo3DVChCt4R5+ygp4SnrF1R73nQKNf30EpJff3nUhKr+FCA X-Mailer: b4 0.14.3 Message-ID: <20260326-gmem-inplace-conversion-v4-10-e202fe950ffd@google.com> Subject: [PATCH RFC v4 10/44] KVM: guest_memfd: Add support for KVM_SET_MEMORY_ATTRIBUTES2 From: Ackerley Tng To: aik@amd.com, andrew.jones@linux.dev, binbin.wu@linux.intel.com, brauner@kernel.org, chao.p.peng@linux.intel.com, david@kernel.org, ira.weiny@intel.com, jmattson@google.com, jroedel@suse.de, 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, tabba@google.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, 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 , Baoquan He , Barry Song , Axel Rasmussen , Yuanchu Xie , Wei Xu , Jason Gunthorpe , Vlastimil Babka Cc: 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, Ackerley Tng Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable For shared to private conversions, if refcounts on any of the folios within the range are elevated, fail the conversion with -EAGAIN. At the point of shared to private conversion, all folios in range are also unmapped. The filemap_invalidate_lock() is held, so no faulting can occur. Hence, from that point on, only transient refcounts can be taken on the folios associated with that guest_memfd. Hence, it is safe to do the conversion from shared to private. After conversion is complete, refcounts may become elevated, but that is fine since users of transient refcounts don't actually access memory. For private to shared conversions, there are no refcount checks, since the guest is the only user of private pages, and guest_memfd will be the only holder of refcounts on private pages. Signed-off-by: Ackerley Tng Co-developed-by: Sean Christopherson Signed-off-by: Sean Christopherson --- Documentation/virt/kvm/api.rst | 48 +++++++- include/linux/kvm_host.h | 10 ++ include/uapi/linux/kvm.h | 9 +- virt/kvm/Kconfig | 1 + virt/kvm/guest_memfd.c | 245 +++++++++++++++++++++++++++++++++++++= +--- virt/kvm/kvm_main.c | 17 ++- 6 files changed, 300 insertions(+), 30 deletions(-) diff --git a/Documentation/virt/kvm/api.rst b/Documentation/virt/kvm/api.rst index 0b61e2579e1d8..15148c80cfdb6 100644 --- a/Documentation/virt/kvm/api.rst +++ b/Documentation/virt/kvm/api.rst @@ -117,7 +117,7 @@ description: x86 includes both i386 and x86_64. =20 Type: - system, vm, or vcpu. + system, vm, vcpu or guest_memfd. =20 Parameters: what parameters are accepted by the ioctl. @@ -6557,11 +6557,22 @@ KVM_S390_KEYOP_SSKE --------------------------------- =20 :Capability: KVM_CAP_MEMORY_ATTRIBUTES2 -:Architectures: x86 -:Type: vm ioctl +:Architectures: all +:Type: vm, guest_memfd ioctl :Parameters: struct kvm_memory_attributes2 (in/out) :Returns: 0 on success, <0 on error =20 +Errors: + + =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D + EINVAL The specified `offset` or `size` were invalid (e.g. not + page aligned, causes an overflow, or size is zero). + EFAULT The parameter address was invalid. + EAGAIN Some page within requested range had unexpected refcounts. The + offset of the page will be returned in `error_offset`. + ENOMEM Ran out of memory trying to track private/shared state + =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D + KVM_SET_MEMORY_ATTRIBUTES2 is an extension to KVM_SET_MEMORY_ATTRIBUTES that supports returning (writing) values to userspace. The original (pre-extension) fields are shared with @@ -6572,15 +6583,42 @@ Attribute values are shared with KVM_SET_MEMORY_ATT= RIBUTES. :: =20 struct kvm_memory_attributes2 { - __u64 address; + /* in */ + union { + __u64 address; + __u64 offset; + }; __u64 size; __u64 attributes; __u64 flags; - __u64 reserved[12]; + /* out */ + __u64 error_offset; + __u64 reserved[11]; }; =20 #define KVM_MEMORY_ATTRIBUTE_PRIVATE (1ULL << 3) =20 +Set attributes for a range of offsets within a guest_memfd to +KVM_MEMORY_ATTRIBUTE_PRIVATE to limit the specified guest_memfd backed +memory range for guest_use. Even if KVM_CAP_GUEST_MEMFD_MMAP is +supported, after a successful call to set +KVM_MEMORY_ATTRIBUTE_PRIVATE, the requested range will not be mappable +into host userspace and will only be mappable by the guest. + +To allow the range to be mappable into host userspace again, call +KVM_SET_MEMORY_ATTRIBUTES2 on the guest_memfd again with +KVM_MEMORY_ATTRIBUTE_PRIVATE unset. + +If this ioctl returns -EAGAIN, the offset of the page with unexpected +refcounts will be returned in `error_offset`. This can occur if there +are transient refcounts on the pages, taken by other parts of the +kernel. + +Userspace is expected to figure out how to remove all known refcounts +on the shared pages, such as refcounts taken by get_user_pages(), and +try the ioctl again. A possible source of these long term refcounts is +if the guest_memfd memory was pinned in IOMMU page tables. + See also: :ref: `KVM_SET_MEMORY_ATTRIBUTES`. =20 .. _kvm_run: diff --git a/include/linux/kvm_host.h b/include/linux/kvm_host.h index 19f026f8de390..1ea14c66fc82e 100644 --- a/include/linux/kvm_host.h +++ b/include/linux/kvm_host.h @@ -2514,6 +2514,16 @@ static inline bool kvm_memslot_is_gmem_only(const st= ruct kvm_memory_slot *slot) } =20 #ifdef CONFIG_KVM_MEMORY_ATTRIBUTES +static inline u64 kvm_supported_mem_attributes(struct kvm *kvm) +{ +#ifdef kvm_arch_has_private_mem + if (!kvm || kvm_arch_has_private_mem(kvm)) + return KVM_MEMORY_ATTRIBUTE_PRIVATE; +#endif + + return 0; +} + typedef unsigned long (kvm_get_memory_attributes_t)(struct kvm *kvm, gfn_t= gfn); DECLARE_STATIC_CALL(__kvm_get_memory_attributes, kvm_get_memory_attributes= _t); =20 diff --git a/include/uapi/linux/kvm.h b/include/uapi/linux/kvm.h index 16567d4a769e5..29baaa60de35a 100644 --- a/include/uapi/linux/kvm.h +++ b/include/uapi/linux/kvm.h @@ -990,6 +990,7 @@ struct kvm_enable_cap { #define KVM_CAP_S390_USER_OPEREXEC 246 #define KVM_CAP_S390_KEYOP 247 #define KVM_CAP_MEMORY_ATTRIBUTES2 248 +#define KVM_CAP_GUEST_MEMFD_MEMORY_ATTRIBUTES 249 =20 struct kvm_irq_routing_irqchip { __u32 irqchip; @@ -1642,11 +1643,15 @@ struct kvm_memory_attributes { #define KVM_SET_MEMORY_ATTRIBUTES2 _IOWR(KVMIO, 0xd2, struct= kvm_memory_attributes2) =20 struct kvm_memory_attributes2 { - __u64 address; + union { + __u64 address; + __u64 offset; + }; __u64 size; __u64 attributes; __u64 flags; - __u64 reserved[12]; + __u64 error_offset; + __u64 reserved[11]; }; =20 #define KVM_MEMORY_ATTRIBUTE_PRIVATE (1ULL << 3) diff --git a/virt/kvm/Kconfig b/virt/kvm/Kconfig index 3fea89c45cfb4..e371e079e2c50 100644 --- a/virt/kvm/Kconfig +++ b/virt/kvm/Kconfig @@ -109,6 +109,7 @@ config KVM_VM_MEMORY_ATTRIBUTES =20 config KVM_GUEST_MEMFD select XARRAY_MULTI + select KVM_MEMORY_ATTRIBUTES bool =20 config HAVE_KVM_ARCH_GMEM_PREPARE diff --git a/virt/kvm/guest_memfd.c b/virt/kvm/guest_memfd.c index d414ebfcb4c19..0cff9a85a4c53 100644 --- a/virt/kvm/guest_memfd.c +++ b/virt/kvm/guest_memfd.c @@ -183,10 +183,12 @@ static struct folio *kvm_gmem_get_folio(struct inode = *inode, pgoff_t index) =20 static enum kvm_gfn_range_filter kvm_gmem_get_invalidate_filter(struct ino= de *inode) { - if (GMEM_I(inode)->flags & GUEST_MEMFD_FLAG_INIT_SHARED) - return KVM_FILTER_SHARED; - - return KVM_FILTER_PRIVATE; + /* + * TODO: Limit invalidations based on the to-be-invalidated range, i.e. + * invalidate shared/private if and only if there can possibly be + * such mappings. + */ + return KVM_FILTER_SHARED | KVM_FILTER_PRIVATE; } =20 static void __kvm_gmem_invalidate_begin(struct gmem_file *f, pgoff_t start, @@ -552,11 +554,235 @@ unsigned long kvm_gmem_get_memory_attributes(struct = kvm *kvm, gfn_t gfn) } EXPORT_SYMBOL_FOR_KVM_INTERNAL(kvm_gmem_get_memory_attributes); =20 +static bool kvm_gmem_range_has_attributes(struct maple_tree *mt, + pgoff_t index, size_t nr_pages, + u64 attributes) +{ + pgoff_t end =3D index + nr_pages - 1; + void *entry; + + lockdep_assert(mt_lock_is_held(mt)); + + mt_for_each(mt, entry, index, end) { + if (xa_to_value(entry) !=3D attributes) + return false; + } + + return true; +} + +static bool kvm_gmem_is_safe_for_conversion(struct inode *inode, pgoff_t s= tart, + size_t nr_pages, pgoff_t *err_index) +{ + struct address_space *mapping =3D inode->i_mapping; + const int filemap_get_folios_refcount =3D 1; + pgoff_t last =3D start + nr_pages - 1; + struct folio_batch fbatch; + bool safe =3D true; + int i; + + folio_batch_init(&fbatch); + while (safe && filemap_get_folios(mapping, &start, last, &fbatch)) { + + for (i =3D 0; i < folio_batch_count(&fbatch); ++i) { + struct folio *folio =3D fbatch.folios[i]; + + if (folio_ref_count(folio) !=3D + folio_nr_pages(folio) + filemap_get_folios_refcount) { + safe =3D false; + *err_index =3D folio->index; + break; + } + } + + folio_batch_release(&fbatch); + cond_resched(); + } + + return safe; +} + +/* + * Preallocate memory for attributes to be stored on a maple tree, pointed= to + * by mas. Adjacent ranges with attributes identical to the new attributes + * will be merged. Also sets mas's bounds up for storing attributes. + * + * This maintains the invariant that ranges with the same attributes will + * always be merged. + */ +static int kvm_gmem_mas_preallocate(struct ma_state *mas, u64 attributes, + pgoff_t start, size_t nr_pages) +{ + pgoff_t end =3D start + nr_pages; + pgoff_t last =3D end - 1; + void *entry; + + /* Try extending range. entry is NULL on overflow/wrap-around. */ + mas_set_range(mas, end, end); + entry =3D mas_find(mas, end); + if (entry && xa_to_value(entry) =3D=3D attributes) + last =3D mas->last; + + if (start > 0) { + mas_set_range(mas, start - 1, start - 1); + entry =3D mas_find(mas, start - 1); + if (entry && xa_to_value(entry) =3D=3D attributes) + start =3D mas->index; + } + + mas_set_range(mas, start, last); + return mas_preallocate(mas, xa_mk_value(attributes), GFP_KERNEL); +} + +#ifdef CONFIG_HAVE_KVM_ARCH_GMEM_INVALIDATE +static void kvm_gmem_invalidate(struct inode *inode, pgoff_t start, pgoff_= t end) +{ + struct folio_batch fbatch; + pgoff_t next =3D start; + int i; + + folio_batch_init(&fbatch); + while (filemap_get_folios(inode->i_mapping, &next, end - 1, &fbatch)) { + for (i =3D 0; i < folio_batch_count(&fbatch); ++i) { + struct folio *folio =3D fbatch.folios[i]; + unsigned long pfn =3D folio_pfn(folio); + + kvm_arch_gmem_invalidate(pfn, pfn + folio_nr_pages(folio)); + } + + folio_batch_release(&fbatch); + cond_resched(); + } +} +#else +static void kvm_gmem_invalidate(struct inode *inode, pgoff_t start, pgoff_= t end) {} +#endif + +static int __kvm_gmem_set_attributes(struct inode *inode, pgoff_t start, + size_t nr_pages, uint64_t attrs, + pgoff_t *err_index) +{ + bool to_private =3D attrs & KVM_MEMORY_ATTRIBUTE_PRIVATE; + struct address_space *mapping =3D inode->i_mapping; + struct gmem_inode *gi =3D GMEM_I(inode); + pgoff_t end =3D start + nr_pages; + struct maple_tree *mt; + struct ma_state mas; + int r; + + mt =3D &gi->attributes; + + filemap_invalidate_lock(mapping); + + mas_init(&mas, mt, start); + + if (kvm_gmem_range_has_attributes(mt, start, nr_pages, attrs)) { + r =3D 0; + goto out; + } + + r =3D kvm_gmem_mas_preallocate(&mas, attrs, start, nr_pages); + if (r) { + *err_index =3D start; + goto out; + } + + if (to_private) { + unmap_mapping_pages(mapping, start, nr_pages, false); + + if (!kvm_gmem_is_safe_for_conversion(inode, start, nr_pages, + err_index)) { + mas_destroy(&mas); + r =3D -EAGAIN; + goto out; + } + } + + /* + * From this point on guest_memfd has performed necessary + * checks and can proceed to do guest-breaking changes. + */ + + kvm_gmem_invalidate_begin(inode, start, end); + + if (!to_private) + kvm_gmem_invalidate(inode, start, end); + + mas_store_prealloc(&mas, xa_mk_value(attrs)); + + kvm_gmem_invalidate_end(inode, start, end); +out: + filemap_invalidate_unlock(mapping); + return r; +} + +static long kvm_gmem_set_attributes(struct file *file, void __user *argp) +{ + struct gmem_file *f =3D file->private_data; + struct inode *inode =3D file_inode(file); + struct kvm_memory_attributes2 attrs; + pgoff_t err_index; + size_t nr_pages; + pgoff_t index; + int i, r; + + if (copy_from_user(&attrs, argp, sizeof(attrs))) + return -EFAULT; + + if (attrs.flags) + return -EINVAL; + if (attrs.error_offset) + return -EINVAL; + for (i =3D 0; i < ARRAY_SIZE(attrs.reserved); i++) { + if (attrs.reserved[i]) + return -EINVAL; + } + if (attrs.attributes & ~kvm_supported_mem_attributes(f->kvm)) + return -EINVAL; + if (attrs.size =3D=3D 0 || attrs.offset + attrs.size < attrs.offset) + return -EINVAL; + if (!PAGE_ALIGNED(attrs.offset) || !PAGE_ALIGNED(attrs.size)) + return -EINVAL; + + if (attrs.offset >=3D inode->i_size || + attrs.offset + attrs.size > inode->i_size) + return -EINVAL; + + nr_pages =3D attrs.size >> PAGE_SHIFT; + index =3D attrs.offset >> PAGE_SHIFT; + r =3D __kvm_gmem_set_attributes(inode, index, nr_pages, attrs.attributes, + &err_index); + if (r) { + attrs.error_offset =3D ((uint64_t)err_index) << PAGE_SHIFT; + + if (copy_to_user(argp, &attrs, sizeof(attrs))) + return -EFAULT; + } + + return r; +} + +static long kvm_gmem_ioctl(struct file *file, unsigned int ioctl, + unsigned long arg) +{ + switch (ioctl) { + case KVM_SET_MEMORY_ATTRIBUTES2: + if (vm_memory_attributes) + return -ENOTTY; + + return kvm_gmem_set_attributes(file, (void __user *)arg); + default: + return -ENOTTY; + } +} + + static struct file_operations kvm_gmem_fops =3D { .mmap =3D kvm_gmem_mmap, .open =3D generic_file_open, .release =3D kvm_gmem_release, .fallocate =3D kvm_gmem_fallocate, + .unlocked_ioctl =3D kvm_gmem_ioctl, }; =20 static int kvm_gmem_migrate_folio(struct address_space *mapping, @@ -942,20 +1168,13 @@ EXPORT_SYMBOL_FOR_KVM_INTERNAL(kvm_gmem_get_pfn); static bool kvm_gmem_range_is_private(struct gmem_inode *gi, pgoff_t index, size_t nr_pages, struct kvm *kvm, gfn_t gfn) { - pgoff_t end =3D index + nr_pages - 1; - void *entry; - if (vm_memory_attributes) return kvm_range_has_vm_memory_attributes(kvm, gfn, gfn + nr_pages, KVM_MEMORY_ATTRIBUTE_PRIVATE, KVM_MEMORY_ATTRIBUTE_PRIVATE); =20 - mt_for_each(&gi->attributes, entry, index, end) { - if (xa_to_value(entry) !=3D KVM_MEMORY_ATTRIBUTE_PRIVATE) - return false; - } - - return true; + return kvm_gmem_range_has_attributes(&gi->attributes, index, nr_pages, + KVM_MEMORY_ATTRIBUTE_PRIVATE); } =20 static long __kvm_gmem_populate(struct kvm *kvm, struct kvm_memory_slot *s= lot, diff --git a/virt/kvm/kvm_main.c b/virt/kvm/kvm_main.c index 3c261904322f0..85c14197587d4 100644 --- a/virt/kvm/kvm_main.c +++ b/virt/kvm/kvm_main.c @@ -2435,16 +2435,6 @@ static int kvm_vm_ioctl_clear_dirty_log(struct kvm *= kvm, #endif /* CONFIG_KVM_GENERIC_DIRTYLOG_READ_PROTECT */ =20 #ifdef CONFIG_KVM_MEMORY_ATTRIBUTES -static u64 kvm_supported_mem_attributes(struct kvm *kvm) -{ -#ifdef kvm_arch_has_private_mem - if (!kvm || kvm_arch_has_private_mem(kvm)) - return KVM_MEMORY_ATTRIBUTE_PRIVATE; -#endif - - return 0; -} - #ifdef CONFIG_KVM_VM_MEMORY_ATTRIBUTES static unsigned long kvm_get_vm_memory_attributes(struct kvm *kvm, gfn_t g= fn) { @@ -2635,6 +2625,8 @@ static int kvm_vm_ioctl_set_mem_attributes(struct kvm= *kvm, return -EINVAL; if (!PAGE_ALIGNED(attrs->address) || !PAGE_ALIGNED(attrs->size)) return -EINVAL; + if (attrs->error_offset) + return -EINVAL; for (i =3D 0; i < ARRAY_SIZE(attrs->reserved); i++) { if (attrs->reserved[i]) return -EINVAL; @@ -4983,6 +4975,11 @@ static int kvm_vm_ioctl_check_extension_generic(stru= ct kvm *kvm, long arg) return 1; case KVM_CAP_GUEST_MEMFD_FLAGS: return kvm_gmem_get_supported_flags(kvm); + case KVM_CAP_GUEST_MEMFD_MEMORY_ATTRIBUTES: + if (vm_memory_attributes) + return 0; + + return kvm_supported_mem_attributes(kvm); #endif default: break; --=20 2.53.0.1018.g2bb0e51243-goog From nobody Thu Apr 2 09:33:37 2026 Received: from mail-pf1-f201.google.com (mail-pf1-f201.google.com [209.85.210.201]) (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 B5F8E372B3D for ; Thu, 26 Mar 2026 22:24:47 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.210.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1774563890; cv=none; b=cPvH/Q8mQc4TZvcLnKbVcmuM1lSdMEI17TFEJ/3rmO6kP9P2H823/b2DxtnDu5JZqB/0yMmDvIxPI87Cycl7nnZYpXt5iXFiisyC+KL1rtf6G5q1SaRfFUDYfnxoU5P3D1mBgWg95hOTEV8HjCaLNNt6LXWmk7P5nqWkdUS+Ej0= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1774563890; c=relaxed/simple; bh=ZJiMvoi/meyCAH/H680tKhOQBTf6lB9IuvXAsiQfyOo=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=tc4LZv6Fq0DZn+hnNxVgk3Zw/+IzPBvn/VFgb+yP1IRgNRzJCZeC01IA+AERzOi9tT+I426lmYsPh4ikPaY0mvHdgExAMTHmXC6ftbdn2K2l0OG1DRFtc6vXf9LS3dzdPnGRAVIzyi/FJ+Qwzz2BLG/VW8QZ+BTOJ2Z45sxetqQ= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com; spf=pass smtp.mailfrom=flex--ackerleytng.bounces.google.com; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b=wlW1WYtM; arc=none smtp.client-ip=209.85.210.201 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=flex--ackerleytng.bounces.google.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="wlW1WYtM" Received: by mail-pf1-f201.google.com with SMTP id d2e1a72fcca58-82a782029b7so1139493b3a.3 for ; Thu, 26 Mar 2026 15:24:47 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20251104; t=1774563887; x=1775168687; darn=vger.kernel.org; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:from:to:cc:subject:date:message-id:reply-to; bh=nCgdcXsysKW/U1BkGMVZDbqNfZApi8yNye51/HQjjFw=; b=wlW1WYtMen+85IuzAwD6tJEeV3Vs1WkPAcGyMqY9OxMnX6obAabC7yLAe7qx+pNAvn cMMxpxYEaJ5onRU6LUUN1WB4CgovlfFDksbYllNPnlLU3+BjHajCHY2/3XySFgsI2K0N sWoIP/DvhKOzzqhGmQyk2Jr3YBHnmJnX24/eBT0++2y6u3Cem+AlJUc1nFx1UE53dXeO GXFgy2tQyXs4Xo8JUgmZuUKuvCIFOEGia2HX8M65qn1f6KC8TYI+PHuceozL5iOrcfed r9NWSmwxCSa4lrH/2SHunV9shQdCMmpgJHph6rlBlTXBKwSRpwf1CfUdpA4rR3dTt7jG 0miQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1774563887; x=1775168687; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=nCgdcXsysKW/U1BkGMVZDbqNfZApi8yNye51/HQjjFw=; b=eU5dJdXsdSMOgL7HglnVIxBqSAnDsC1kZgPDSdtdnCZnFvYXCM0wNZTcLNTOC1c0JX wtjt9qq/b3Xj7MRGb0TIdkUlzNAAC+ATMt/IergDwlHJqsatnt+674OWs1EvHIUvVwYM UnLlwjwlVoVfXmC2cXUrF8EIfraspl+KkBd3A0WxvUts+wPM5ZlEFWu0XLNEKn9uL9Lo RJTxQElqpDELyf7qxLAxj+8THH24vuKH3NekR5u68+8lFNeCDKLNPXiZWyZPEuI7YE78 HXOYlH/LDmvcM8CdNNXIpYVSKwm0WXZm63tJwnFLkuds0Aaauy9QGd7f+GkDvSsEnQF9 7ZcA== X-Forwarded-Encrypted: i=1; AJvYcCV+DbfY+tUXINJzqD5UGDLBARB7Q32iX6DmhAiUbiELB3Te/DOnxVpRPVPdTvffU6jbUtiYNi0VH+QE6xU=@vger.kernel.org X-Gm-Message-State: AOJu0Yw52Ent5tLxvzB9b8PLNwlC3ZsOwbd7OY4zzcKTrTc9UUfLJPG0 MVfNBSy+kHYxjcJC8qq4QzcNigwA+lFsmOgo5aC9I9lN3UcKGr+eFbLPkXJA0NZjPlJsJ/+LAl+ fV2v8Az/NwCbe4c5LjkyDowfQ1Q== X-Received: from pfgt12.prod.google.com ([2002:a05:6a00:138c:b0:829:7493:545c]) (user=ackerleytng job=prod-delivery.src-stubby-dispatcher) by 2002:a05:6a00:1c96:b0:823:12cb:f5d1 with SMTP id d2e1a72fcca58-82c95d35b57mr160274b3a.6.1774563886617; Thu, 26 Mar 2026 15:24:46 -0700 (PDT) Date: Thu, 26 Mar 2026 15:24:20 -0700 In-Reply-To: <20260326-gmem-inplace-conversion-v4-0-e202fe950ffd@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20260326-gmem-inplace-conversion-v4-0-e202fe950ffd@google.com> X-Developer-Key: i=ackerleytng@google.com; a=ed25519; pk=sAZDYXdm6Iz8FHitpHeFlCMXwabodTm7p8/3/8xUxuU= X-Developer-Signature: v=1; a=ed25519-sha256; t=1774563861; l=3273; i=ackerleytng@google.com; s=20260225; h=from:subject:message-id; bh=ZJiMvoi/meyCAH/H680tKhOQBTf6lB9IuvXAsiQfyOo=; b=WRe5ynfWZSuX+kx9jMY0JasXB4rIPKpI9ql6ibZPHFbe+yzbcDGcpqU1uX+402hGD156NdMiH L7DiNdokHKID+cbe2SXtvZ5GHdpaoaiPi/BbdGDX1VVbt0wzzcHVT/X X-Mailer: b4 0.14.3 Message-ID: <20260326-gmem-inplace-conversion-v4-11-e202fe950ffd@google.com> Subject: [PATCH RFC v4 11/44] KVM: guest_memfd: Handle lru_add fbatch refcounts during conversion safety check From: Ackerley Tng To: aik@amd.com, andrew.jones@linux.dev, binbin.wu@linux.intel.com, brauner@kernel.org, chao.p.peng@linux.intel.com, david@kernel.org, ira.weiny@intel.com, jmattson@google.com, jroedel@suse.de, 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, tabba@google.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, 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 , Baoquan He , Barry Song , Axel Rasmussen , Yuanchu Xie , Wei Xu , Jason Gunthorpe , Vlastimil Babka Cc: 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, Ackerley Tng Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable When checking if a guest_memfd folio is safe for conversion, its refcount is examined. A folio may be present in a per-CPU lru_add fbatch, which temporarily increases its refcount. This can lead to a false positive, incorrectly indicating that the folio is in use and preventing the conversion, even if it is otherwise safe. The conversion process might not be on the same CPU that holds the folio in its fbatch, making a simple per-CPU check insufficient. To address this, drain all CPUs' lru_add fbatches if an unexpectedly high refcount is encountered during the safety check. This is performed at most once per conversion request. Draining only if the folio in question may be lru cached. guest_memfd folios are unevictable, so they can only reside in the lru_add fbatch. If the folio's refcount is still unsafe after draining, then the conversion is truly deemed unsafe. Signed-off-by: Ackerley Tng --- mm/swap.c | 2 ++ virt/kvm/guest_memfd.c | 23 +++++++++++++++++------ 2 files changed, 19 insertions(+), 6 deletions(-) diff --git a/mm/swap.c b/mm/swap.c index bb19ccbece464..4861661c71fab 100644 --- a/mm/swap.c +++ b/mm/swap.c @@ -37,6 +37,7 @@ #include #include #include +#include =20 #include "internal.h" =20 @@ -898,6 +899,7 @@ void lru_add_drain_all(void) lru_add_drain(); } #endif /* CONFIG_SMP */ +EXPORT_SYMBOL_FOR_KVM(lru_add_drain_all); =20 atomic_t lru_disable_count =3D ATOMIC_INIT(0); =20 diff --git a/virt/kvm/guest_memfd.c b/virt/kvm/guest_memfd.c index 0cff9a85a4c53..20a09d9bbcd2b 100644 --- a/virt/kvm/guest_memfd.c +++ b/virt/kvm/guest_memfd.c @@ -8,6 +8,7 @@ #include #include #include +#include =20 #include "kvm_mm.h" =20 @@ -571,25 +572,35 @@ static bool kvm_gmem_range_has_attributes(struct mapl= e_tree *mt, return true; } =20 -static bool kvm_gmem_is_safe_for_conversion(struct inode *inode, pgoff_t s= tart, - size_t nr_pages, pgoff_t *err_index) +static bool kvm_gmem_is_safe_for_conversion(struct inode *inode, + pgoff_t start, size_t nr_pages, + pgoff_t *err_index) { struct address_space *mapping =3D inode->i_mapping; const int filemap_get_folios_refcount =3D 1; pgoff_t last =3D start + nr_pages - 1; struct folio_batch fbatch; + bool lru_drained =3D false; bool safe =3D true; int i; =20 folio_batch_init(&fbatch); while (safe && filemap_get_folios(mapping, &start, last, &fbatch)) { =20 - for (i =3D 0; i < folio_batch_count(&fbatch); ++i) { + for (i =3D 0; i < folio_batch_count(&fbatch);) { struct folio *folio =3D fbatch.folios[i]; =20 - if (folio_ref_count(folio) !=3D - folio_nr_pages(folio) + filemap_get_folios_refcount) { - safe =3D false; + safe =3D (folio_ref_count(folio) =3D=3D + folio_nr_pages(folio) + + filemap_get_folios_refcount); + + if (safe) { + ++i; + } else if (folio_may_be_lru_cached(folio) && + !lru_drained) { + lru_add_drain_all(); + lru_drained =3D true; + } else { *err_index =3D folio->index; break; } --=20 2.53.0.1018.g2bb0e51243-goog From nobody Thu Apr 2 09:33:37 2026 Received: from mail-pg1-f201.google.com (mail-pg1-f201.google.com [209.85.215.201]) (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 BFFAE377ECA for ; Thu, 26 Mar 2026 22:24:49 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.215.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1774563891; cv=none; b=GuaQ2oBfiFlDocwjX4pbzXVzesPp0xv7GSpcMY8qRZSOVUi1adlHIfT0z5oLPi4tE+TtXdfiuHL5VG42oQkcD6BLASQZ7UTY3saKMaSqSLiefT0L9zNf0Qu5RJa/RS4SWXfCp3mUPZdU3LgXoTVtfzKuggirV5qJC6TJcSS1ORw= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1774563891; c=relaxed/simple; bh=9AbnVGj52dYRY1Gu1IOMz+RQizSjYS4bjrECQdvobIg=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=t/MaETuteCIKU8CyZArfqmsBiCMWKYh/3fbUob90syQ/DKQS7/iDX+5QAnGngBVwuCekxmuY1k0rkZZQZUOQ0c54m94gT8cMgSZrlB2UGN4PcBNP7rBAbLI7hqDFV3SfQlYaHDP/82zlK99qmTayqkeOJsi+V9xQb2PGNk/dNHM= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com; spf=pass smtp.mailfrom=flex--ackerleytng.bounces.google.com; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b=cIAHQKRf; arc=none smtp.client-ip=209.85.215.201 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=flex--ackerleytng.bounces.google.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="cIAHQKRf" Received: by mail-pg1-f201.google.com with SMTP id 41be03b00d2f7-c7424d91b2dso977253a12.1 for ; Thu, 26 Mar 2026 15:24:49 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20251104; t=1774563889; x=1775168689; darn=vger.kernel.org; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:from:to:cc:subject:date:message-id:reply-to; bh=nVWPwC6pxhgIAnF5094KQEX5dCEhr5KYAaDw4qPFZtk=; b=cIAHQKRfNDQtdbXGpHDm5qqt9wfdpNHMYCnkh4a3deocXIB7VBALvfS1V3OQk9hHxz bJI7d461rnIQMVZSMpFQhLtvvIBB+E3nkjcfSTg0Nh3xFr0Z1bWbX8+H5tYF+0cXLHz9 TRX6fJHoQ9JOBc+wD0OYq5JNzznxDOtq4INimshi1SQzm93y2TO3r8/0ECoWGWyoUxFc Broc92fEDU2RM3DhW7Aa3quDFe3w6AymPip+eRJHsp9AwH8YzXbWHmDuFlqe3qo6+ohp jG9AQ3YPgp8ewkeay77Ffkfh9bAmqqP//R2jmD4LRO/raFob1KeCepGjIK+rQQHMZJ+X 6HVQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1774563889; x=1775168689; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=nVWPwC6pxhgIAnF5094KQEX5dCEhr5KYAaDw4qPFZtk=; b=KEXMWatL1eKLYXvVDjdvJKtsU1tE4NZ79tPK/nrwPDtk2W+ofRkeGgL+4yqcyil1oH 9sGY6OiQrSnRkRVPdWTlhowXWEtT55CbropaY6PcNugsGniV/40N+/8hcu0IbU7EQd5o W/hY2Rla0WnU2CEBGqJZnu6U0BJ6A9g13WVuqhtPmsA0Lfx6kfDg9py2jxlFMelp8mL9 a2JcD/0+QZVxosXCoXfJes01W534q4zYSJgz5PReJaT52orICSqPDIbHfsX5EZTdDOV6 4g8tT3tPHbPgtw4c3jMGG3f3j4Wq5d//51Z/+156dzzHUzXTyMxVf2ClYf0g8s0mhuQ8 2CdA== X-Forwarded-Encrypted: i=1; AJvYcCX+D+XGHmsVKfmIiOy0F3FRqWewzzRDIHkxcbXRqgN2jBcPocEbImQC4ukVdSPfNAJq2ki4EKUot3eneug=@vger.kernel.org X-Gm-Message-State: AOJu0YxGV78/NfmLcgXWBrSPgcnD/wpqUpYXR0bFyzVmTgoxYGG1dSrj MZo5Nnue3qdHndZSqZzlNkShizS8gKyZzrL9S6OwVlFj3eYgjj8b0BoszCmnQp+6g5jkGAeE/+M uWH9siLwA2MdzLPdgUu7iuPDOsw== X-Received: from pfjg13.prod.google.com ([2002:a05:6a00:b8d:b0:829:884e:b688]) (user=ackerleytng job=prod-delivery.src-stubby-dispatcher) by 2002:a05:6a00:2d0c:b0:81f:5ec1:8bcd with SMTP id d2e1a72fcca58-82c95ea94dcmr142656b3a.20.1774563888635; Thu, 26 Mar 2026 15:24:48 -0700 (PDT) Date: Thu, 26 Mar 2026 15:24:21 -0700 In-Reply-To: <20260326-gmem-inplace-conversion-v4-0-e202fe950ffd@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20260326-gmem-inplace-conversion-v4-0-e202fe950ffd@google.com> X-Developer-Key: i=ackerleytng@google.com; a=ed25519; pk=sAZDYXdm6Iz8FHitpHeFlCMXwabodTm7p8/3/8xUxuU= X-Developer-Signature: v=1; a=ed25519-sha256; t=1774563861; l=3818; i=ackerleytng@google.com; s=20260225; h=from:subject:message-id; bh=9AbnVGj52dYRY1Gu1IOMz+RQizSjYS4bjrECQdvobIg=; b=kc7IoC0mcSRd+pSE2vC9D3Uk9DcdVSJweK7d8NasersOpLBpqrsExouK2O75W2pgSl/5dLP7W +yGN4wGXJetCGmCWXjtwUwUvZiTUK4/T8FKHTTkq4UHanZPTfIU0TqT X-Mailer: b4 0.14.3 Message-ID: <20260326-gmem-inplace-conversion-v4-12-e202fe950ffd@google.com> Subject: [PATCH RFC v4 12/44] KVM: guest_memfd: Introduce default handlers for content modes From: Ackerley Tng To: aik@amd.com, andrew.jones@linux.dev, binbin.wu@linux.intel.com, brauner@kernel.org, chao.p.peng@linux.intel.com, david@kernel.org, ira.weiny@intel.com, jmattson@google.com, jroedel@suse.de, 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, tabba@google.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, 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 , Baoquan He , Barry Song , Axel Rasmussen , Yuanchu Xie , Wei Xu , Jason Gunthorpe , Vlastimil Babka Cc: 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, Ackerley Tng Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Currently, when setting memory attributes, KVM provides no guarantees about the memory contents. Introduce default handlers for applying memory content modes, which different architectures should override. These handlers will be used later to apply memory content modes during set memory attributes requests. Signed-off-by: Ackerley Tng --- include/linux/kvm_host.h | 12 +++++++++ virt/kvm/guest_memfd.c | 67 ++++++++++++++++++++++++++++++++++++++++++++= ++++ 2 files changed, 79 insertions(+) diff --git a/include/linux/kvm_host.h b/include/linux/kvm_host.h index 1ea14c66fc82e..4ba3c4b303f4a 100644 --- a/include/linux/kvm_host.h +++ b/include/linux/kvm_host.h @@ -740,6 +740,18 @@ static inline u64 kvm_gmem_get_supported_flags(struct = kvm *kvm) =20 return flags; } + +u64 kvm_arch_gmem_supported_content_modes(struct kvm *kvm); +int kvm_gmem_apply_content_mode_zero(struct inode *inode, pgoff_t start, + pgoff_t end); +int kvm_arch_gmem_apply_content_mode_zero(struct kvm *kvm, struct inode *i= node, + pgoff_t start, pgoff_t end); +int kvm_arch_gmem_apply_content_mode_preserve(struct kvm *kvm, + struct inode *inode, + pgoff_t start, pgoff_t end); +int kvm_arch_gmem_apply_content_mode_unspecified(struct kvm *kvm, + struct inode *inode, + pgoff_t start, pgoff_t end); #endif =20 #ifndef kvm_arch_has_readonly_mem diff --git a/virt/kvm/guest_memfd.c b/virt/kvm/guest_memfd.c index 20a09d9bbcd2b..e270e54e030f0 100644 --- a/virt/kvm/guest_memfd.c +++ b/virt/kvm/guest_memfd.c @@ -1,4 +1,6 @@ // SPDX-License-Identifier: GPL-2.0 +#include "asm-generic/errno.h" +#include "linux/page-flags.h" #include #include #include @@ -669,6 +671,71 @@ static void kvm_gmem_invalidate(struct inode *inode, p= goff_t start, pgoff_t end) static void kvm_gmem_invalidate(struct inode *inode, pgoff_t start, pgoff_= t end) {} #endif =20 +u64 __weak kvm_arch_gmem_supported_content_modes(struct kvm *kvm) +{ + /* Architectures must override with supported modes. */ + return 0; +} + +int kvm_gmem_apply_content_mode_zero(struct inode *inode, pgoff_t start, + pgoff_t end) +{ + struct address_space *mapping =3D inode->i_mapping; + struct folio_batch fbatch; + int ret =3D 0; + int i; + + folio_batch_init(&fbatch); + while (!ret && filemap_get_folios(mapping, &start, end - 1, &fbatch)) { + for (i =3D 0; !ret && i < folio_batch_count(&fbatch); ++i) { + struct folio *folio =3D fbatch.folios[i]; + + folio_lock(folio); + + if (folio_test_hwpoison(folio)) { + ret =3D -EHWPOISON; + } else { + /* + * Hard-coding zeroed range since + * guest_memfd only supports PAGE_SIZE + * folios and start and end have been + * checked to be PAGE_SIZE aligned. + */ + folio_zero_segment(folio, 0, PAGE_SIZE); + } + + folio_unlock(folio); + } + + folio_batch_release(&fbatch); + cond_resched(); + } + + return ret; +} + +int __weak kvm_arch_gmem_apply_content_mode_unspecified(struct kvm *kvm, + struct inode *inode, + pgoff_t start, + pgoff_t end) +{ + return 0; +} + +int __weak kvm_arch_gmem_apply_content_mode_zero(struct kvm *kvm, + struct inode *inode, + pgoff_t start, pgoff_t end) +{ + return kvm_gmem_apply_content_mode_zero(inode, start, end); +} + +int __weak kvm_arch_gmem_apply_content_mode_preserve(struct kvm *kvm, + struct inode *inode, + pgoff_t start, pgoff_t end) +{ + return -EOPNOTSUPP; +} + static int __kvm_gmem_set_attributes(struct inode *inode, pgoff_t start, size_t nr_pages, uint64_t attrs, pgoff_t *err_index) --=20 2.53.0.1018.g2bb0e51243-goog From nobody Thu Apr 2 09:33:37 2026 Received: from mail-pg1-f201.google.com (mail-pg1-f201.google.com [209.85.215.201]) (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 EA16E381AF7 for ; Thu, 26 Mar 2026 22:24:51 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.215.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1774563894; cv=none; b=R/GYVY5wyek1jEDuhvyFvyXglvbHlcwtWGfwrlaSCYv7U3P3QuP/HhnAhLT50TW1iyHdg1mXtBqMtl2/LxZEB9r5BUEUInfntU1D8XT8jjAXNL/SdyaDb2c7939xX1IaHXq2jtL50whoet56T5jUloYLyiEocWo3Uj/E5L1W13w= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1774563894; c=relaxed/simple; bh=eaxuIPrrRTVlEIpTTwJih/3FgUZ9QiOBP/yNtBEER/o=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=dncsdAwH8ukn0rzsrHP5ncUkHFD1eKT+8Ly/64M2Ue28QVFjRIziihHZ2HFvDsfE4GJ+kjrts8D1Kypvv9qhu+Xb9aGd6nBlSTTBVlqsK4sAzxTdtZL5sFqQl9PXuwgQTvaQ6bNEgIAZ661bpvBd6ofPzO7QqOcnQDBu747MBoI= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com; spf=pass smtp.mailfrom=flex--ackerleytng.bounces.google.com; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b=buJq/DAC; arc=none smtp.client-ip=209.85.215.201 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=flex--ackerleytng.bounces.google.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="buJq/DAC" Received: by mail-pg1-f201.google.com with SMTP id 41be03b00d2f7-c70ea91bfe1so1030807a12.1 for ; Thu, 26 Mar 2026 15:24:51 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20251104; t=1774563891; x=1775168691; darn=vger.kernel.org; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:from:to:cc:subject:date:message-id:reply-to; bh=SRjeBkkI/dZyZ5QjbTq8w6K/fHOt1rR7cB2loz7QmY4=; b=buJq/DACEwwoS8nsqsrOxmNPMMIjskIaYfYzIpgAyf0PxXmMsiLD82c6U1Dj0u9z+R cvD7aD9sxuwbZ3Zu4ZWT+Au82gN+WI6DrT69Zu0MRYr7NEg4cwvGcg8qQLPYg8+RM/1g tdtxRrB+w0aTOlv5FRdTLUo79g5P6+ZwB+Vvx3Crs5he3lVNAZbxjVhhK2qXxD3PzP1e nEcPQvnvui84HaAeWr7EOZex/8I9FN7obuDp/XKAEjivOUV41cQOhIfJkHCBG5FViSV6 IpVflg00XBU3ref69sQ/nKtKhZNPrpj5WCTqCu6RMFe6DK1UwTvR3GXx16PWcJA4/DaH jsCg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1774563891; x=1775168691; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=SRjeBkkI/dZyZ5QjbTq8w6K/fHOt1rR7cB2loz7QmY4=; b=alAtlg/EfdHvd49c2jbK2FrZjHdWWnTYC+zsu8/IQn/4LLsUiZIF14KidVJZBUVnKZ 8xsFG1pbTuPr/QSRm0BemNna3PqMIcfNrL63lqUNdQNiHw7fdXNB0jbr7zYPlWV165LM FXtTISpxwUdDi87TslcY90fWx/ODwSHSi0dgAv2q0LptSzZo4C1UsKJTcxTzEhqIuG/Q WR9HYZUvkGLQfrln77VHGqTrFvwpQP6W+f5HZnKcIwVvfSzc9ryVnVqt3N0U6N1J2xTf VGXkmHFI4Z9sjHFGenVvuBwe3wvC+cBOqWEPp7PgV2Jl505H4Y46OENAASoJRHwOBk9I dJZg== X-Forwarded-Encrypted: i=1; AJvYcCXVEw6pn8t3TEyo4mKs6TNypf/tPNLlejpWDIwXxfZxymS/WfVUPejHe80CkmGHj9VEc5WpejDlvpIM7IQ=@vger.kernel.org X-Gm-Message-State: AOJu0YwCi81duvNbaLIB7yAlyUjP7i6kEA50Ceou3Cd4jwU8T9wyke4k OIglHo40YRKKOpSzUzGGXsftbgdRgHVnXMR2VCpu9GGEkygne3EhLZWuSryfWoTSyu72NdwuVo+ 6Ti6pAK3cn8SINavzThHz+QoIXg== X-Received: from pfbif3.prod.google.com ([2002:a05:6a00:8b03:b0:82c:2477:2e24]) (user=ackerleytng job=prod-delivery.src-stubby-dispatcher) by 2002:a05:6a00:c82:b0:827:2ed6:888f with SMTP id d2e1a72fcca58-82c96035be6mr118926b3a.54.1774563890837; Thu, 26 Mar 2026 15:24:50 -0700 (PDT) Date: Thu, 26 Mar 2026 15:24:22 -0700 In-Reply-To: <20260326-gmem-inplace-conversion-v4-0-e202fe950ffd@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20260326-gmem-inplace-conversion-v4-0-e202fe950ffd@google.com> X-Developer-Key: i=ackerleytng@google.com; a=ed25519; pk=sAZDYXdm6Iz8FHitpHeFlCMXwabodTm7p8/3/8xUxuU= X-Developer-Signature: v=1; a=ed25519-sha256; t=1774563861; l=8571; i=ackerleytng@google.com; s=20260225; h=from:subject:message-id; bh=eaxuIPrrRTVlEIpTTwJih/3FgUZ9QiOBP/yNtBEER/o=; b=K13+dJQF86Un8WqHDlu2mJRGc8cKb+wpv2mI96f+F2KmJrbn1NkIqQIwXR4TQX2NsGMI5IGiJ 7CZ1Zrr9V8EDdHQVj3N94MUmpF4t1bK7IW1kpMbQXoeLH/p6zBbG6ha X-Mailer: b4 0.14.3 Message-ID: <20260326-gmem-inplace-conversion-v4-13-e202fe950ffd@google.com> Subject: [PATCH RFC v4 13/44] KVM: guest_memfd: Apply content modes while setting memory attributes From: Ackerley Tng To: aik@amd.com, andrew.jones@linux.dev, binbin.wu@linux.intel.com, brauner@kernel.org, chao.p.peng@linux.intel.com, david@kernel.org, ira.weiny@intel.com, jmattson@google.com, jroedel@suse.de, 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, tabba@google.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, 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 , Baoquan He , Barry Song , Axel Rasmussen , Yuanchu Xie , Wei Xu , Jason Gunthorpe , Vlastimil Babka Cc: 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, Ackerley Tng Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Provide defined memory content modes so that KVM can make guarantees about memory content after setting memory attributes, according to userspace requests. Suggested-by: Sean Christoperson Signed-off-by: Ackerley Tng --- Documentation/virt/kvm/api.rst | 61 ++++++++++++++++++++++++++++++++++++++= ++++ include/uapi/linux/kvm.h | 4 +++ virt/kvm/guest_memfd.c | 56 ++++++++++++++++++++++++++++++++++++-- 3 files changed, 119 insertions(+), 2 deletions(-) diff --git a/Documentation/virt/kvm/api.rst b/Documentation/virt/kvm/api.rst index 15148c80cfdb6..90587a9c09d3f 100644 --- a/Documentation/virt/kvm/api.rst +++ b/Documentation/virt/kvm/api.rst @@ -6571,6 +6571,8 @@ Errors: EAGAIN Some page within requested range had unexpected refcounts. The offset of the page will be returned in `error_offset`. ENOMEM Ran out of memory trying to track private/shared state + EOPNOTSUPP There is no way for KVM to guarantee in-memory contents as + requested. =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D =20 KVM_SET_MEMORY_ATTRIBUTES2 is an extension to @@ -6619,6 +6621,65 @@ on the shared pages, such as refcounts taken by get_= user_pages(), and try the ioctl again. A possible source of these long term refcounts is if the guest_memfd memory was pinned in IOMMU page tables. =20 +By default, KVM makes no guarantees about the in-memory values after +memory is convert to/from shared/private. Optionally, userspace may +instruct KVM to ensure the contents of memory are zeroed or preserved, +e.g. to enable in-place sharing of data, or as an optimization to +avoid having to re-zero memory when userspace could have relied on the +trusted entity to guarantee the memory will be zeroed as part of the +entire conversion process. + +The content modes available are as follows: + +``KVM_SET_MEMORY_ATTRIBUTES2_ZERO`` + + On conversion, KVM guarantees all entities that have "allowed" + access to the memory will read zeros. E.g. on private to shared + conversion, both trusted and untrusted code will read zeros. + + Zeroing is currently only supported for private-to-shared + conversions, as KVM in general is untrusted and thus cannot + guarantee the guest (or any trusted entity) will read zeros after + conversion. Note, some CoCo implementations do zero memory contents + such that the guest reads zeros after conversion, and the guest may + choose to rely on that behavior. However, that's a contract between + the trusted CoCo entity and the guest, not between KVM and the + guest. + +``KVM_SET_MEMORY_ATTRIBUTES2_PRESERVE`` + + On conversion, KVM guarantees memory contents will be preserved with + respect to the last written unencrypted value. As a concrete + example, if the host writes ``0xbeef`` to shared memory and converts + the memory to private, the guest will also read ``0xbeef``, even if + the in-memory data is encrypted as part of the conversion. And vice + versa, if the guest writes ``0xbeef`` to private memory and then + converts the memory to shared, the host (and guest) will read + ``0xbeef`` (if the memory is accessible). + +Note: These content modes apply to the entire requested range, not +just the parts of the range that underwent conversion. For example, if +this was the initial state: + + * [0x0000, 0x1000): shared + * [0x1000, 0x2000): private + * [0x2000, 0x3000): shared + +and range [0x0000, 0x3000) was set to shared, the content mode would +apply to all memory in [0x0000, 0x3000), not just the range that +underwent conversion [0x1000, 0x2000). + +Note: These content modes apply only to allocated memory. No +guarantees are made on offset ranges that do not have memory allocated +(yet). For example, if this was the initial state: + + * [0x0000, 0x1000): shared + * [0x1000, 0x2000): not allocated + * [0x2000, 0x3000): shared + +and range [0x0000, 0x3000) was set to shared, the content mode would +apply to only to offset ranges [0x0000, 0x1000) and [0x2000, 0x3000). + See also: :ref: `KVM_SET_MEMORY_ATTRIBUTES`. =20 .. _kvm_run: diff --git a/include/uapi/linux/kvm.h b/include/uapi/linux/kvm.h index 29baaa60de35a..0fc9ad4ea0d93 100644 --- a/include/uapi/linux/kvm.h +++ b/include/uapi/linux/kvm.h @@ -1642,6 +1642,10 @@ struct kvm_memory_attributes { /* Available with KVM_CAP_MEMORY_ATTRIBUTES2 */ #define KVM_SET_MEMORY_ATTRIBUTES2 _IOWR(KVMIO, 0xd2, struct= kvm_memory_attributes2) =20 +#define KVM_SET_MEMORY_ATTRIBUTES2_MODE_UNSPECIFIED 0 +#define KVM_SET_MEMORY_ATTRIBUTES2_ZERO (1ULL << 0) +#define KVM_SET_MEMORY_ATTRIBUTES2_PRESERVE (1ULL << 1) + struct kvm_memory_attributes2 { union { __u64 address; diff --git a/virt/kvm/guest_memfd.c b/virt/kvm/guest_memfd.c index e270e54e030f0..eeac7678fcf4e 100644 --- a/virt/kvm/guest_memfd.c +++ b/virt/kvm/guest_memfd.c @@ -677,6 +677,19 @@ u64 __weak kvm_arch_gmem_supported_content_modes(struc= t kvm *kvm) return 0; } =20 +static bool kvm_gmem_content_mode_is_supported(struct kvm *kvm, + u64 content_mode, + bool to_private) +{ + if (content_mode =3D=3D KVM_SET_MEMORY_ATTRIBUTES2_MODE_UNSPECIFIED) + return true; + + if (content_mode =3D=3D KVM_SET_MEMORY_ATTRIBUTES2_ZERO && to_private) + return false; + + return kvm_arch_gmem_supported_content_modes(kvm) & content_mode; +} + int kvm_gmem_apply_content_mode_zero(struct inode *inode, pgoff_t start, pgoff_t end) { @@ -736,8 +749,26 @@ int __weak kvm_arch_gmem_apply_content_mode_preserve(s= truct kvm *kvm, return -EOPNOTSUPP; } =20 +static int kvm_gmem_apply_content_mode(struct kvm *kvm, uint64_t content_m= ode, + struct inode *inode, pgoff_t start, + pgoff_t end) +{ + switch (content_mode) { + case KVM_SET_MEMORY_ATTRIBUTES2_MODE_UNSPECIFIED: + return kvm_arch_gmem_apply_content_mode_unspecified(kvm, inode, start, e= nd); + case KVM_SET_MEMORY_ATTRIBUTES2_ZERO: + return kvm_arch_gmem_apply_content_mode_zero(kvm, inode, start, end); + case KVM_SET_MEMORY_ATTRIBUTES2_PRESERVE: + return kvm_arch_gmem_apply_content_mode_preserve(kvm, inode, start, end); + default: + WARN_ONCE(1, "Unexpected policy requested."); + return -EOPNOTSUPP; + } +} + static int __kvm_gmem_set_attributes(struct inode *inode, pgoff_t start, size_t nr_pages, uint64_t attrs, + struct kvm *kvm, uint64_t content_mode, pgoff_t *err_index) { bool to_private =3D attrs & KVM_MEMORY_ATTRIBUTE_PRIVATE; @@ -752,9 +783,23 @@ static int __kvm_gmem_set_attributes(struct inode *ino= de, pgoff_t start, =20 filemap_invalidate_lock(mapping); =20 + if (!kvm_gmem_content_mode_is_supported(kvm, content_mode, + to_private)) { + r =3D -EOPNOTSUPP; + *err_index =3D start; + goto out; + } + mas_init(&mas, mt, start); =20 if (kvm_gmem_range_has_attributes(mt, start, nr_pages, attrs)) { + /* + * Even if no update is required to attributes, the + * requested content mode is applied. + */ + WARN_ON(kvm_gmem_apply_content_mode(kvm, content_mode, + inode, start, end)); + r =3D 0; goto out; } @@ -786,6 +831,9 @@ static int __kvm_gmem_set_attributes(struct inode *inod= e, pgoff_t start, if (!to_private) kvm_gmem_invalidate(inode, start, end); =20 + WARN_ON(kvm_gmem_apply_content_mode(kvm, content_mode, inode, + start, end)); + mas_store_prealloc(&mas, xa_mk_value(attrs)); =20 kvm_gmem_invalidate_end(inode, start, end); @@ -807,7 +855,11 @@ static long kvm_gmem_set_attributes(struct file *file,= void __user *argp) if (copy_from_user(&attrs, argp, sizeof(attrs))) return -EFAULT; =20 - if (attrs.flags) + if (attrs.flags & ~(KVM_SET_MEMORY_ATTRIBUTES2_ZERO | + KVM_SET_MEMORY_ATTRIBUTES2_PRESERVE)) + return -EINVAL; + if ((attrs.flags & KVM_SET_MEMORY_ATTRIBUTES2_ZERO) && + (attrs.flags & KVM_SET_MEMORY_ATTRIBUTES2_PRESERVE)) return -EINVAL; if (attrs.error_offset) return -EINVAL; @@ -829,7 +881,7 @@ static long kvm_gmem_set_attributes(struct file *file, = void __user *argp) nr_pages =3D attrs.size >> PAGE_SHIFT; index =3D attrs.offset >> PAGE_SHIFT; r =3D __kvm_gmem_set_attributes(inode, index, nr_pages, attrs.attributes, - &err_index); + f->kvm, attrs.flags, &err_index); if (r) { attrs.error_offset =3D ((uint64_t)err_index) << PAGE_SHIFT; =20 --=20 2.53.0.1018.g2bb0e51243-goog From nobody Thu Apr 2 09:33:37 2026 Received: from mail-pg1-f201.google.com (mail-pg1-f201.google.com [209.85.215.201]) (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 42661386429 for ; Thu, 26 Mar 2026 22:24:54 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.215.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1774563895; cv=none; b=K5UMWdp6xkiQAh6nV5iM4iVCZSgvaz0xjB/RMoLVHZyV2CFC3AcqwONGTYsC4Mw/jk4lDkIU1uZfkkBaINQ7B+4R+M1uGp/Fg3iphFRu3NhSeQmgz1NvqTDC3GWR7tubXbQsRwpdwnTZ3w/xOtpPv3//guK+Sn3je6Ni/BBeOgU= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1774563895; c=relaxed/simple; bh=+lH9JgLOF707IWKJRbslu6RR2YV0S99MONEW8Yc3BZ8=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=s6AGNtaLDUew/XadbcFpAQSQD3X9IimTxZMnKaZ75Rl8wB84zmlPWtBz3kNHc6I1mzMaBGGYGgKQBP6NLXXywANG+jVNZhHm9UEI9gq5S+W7tp6kxKihlU9jOQtR4bCBL9aaakhvAnR4tc+y3FcQdd5Sn+/LpDi3AfyluMTHiTQ= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com; spf=pass smtp.mailfrom=flex--ackerleytng.bounces.google.com; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b=dRGO0fFQ; arc=none smtp.client-ip=209.85.215.201 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=flex--ackerleytng.bounces.google.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="dRGO0fFQ" Received: by mail-pg1-f201.google.com with SMTP id 41be03b00d2f7-c7424d91b2dso977281a12.1 for ; Thu, 26 Mar 2026 15:24:54 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20251104; t=1774563894; x=1775168694; darn=vger.kernel.org; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:from:to:cc:subject:date:message-id:reply-to; bh=krjKKoUHOcKbfpf9SpjvgIZEA4m0P+3HWizcMkU39sE=; b=dRGO0fFQcn6iin7wNsdIdxtGeXHBZwU8tVS8u5jJY6Q9DTWYntjVdewCv/zHGxZvfH NpipVC4nbtfAJYp+1qMn4Nfzybvs6fPBC6xjnne+Q63y+S/PhbvImcFan1ZpFui8eDH/ ecNZn6QyBECHVjOOtWTl7YGSNwzrlLdA9fZxgnFtgmhxVJTrcN+V8iEKISo/BMVMKL7z 4IUhR28XEk+IY6qhI6b5Hvt/8a14klDwFm7Ogu4vCjjwdgbW6vcISGTqrdefLsYRZqck gWyuyovL82/QVthORjyTD/rYEDgFO1LOD8QgJUdT+2JUblQTRchCTDuw13MCpcKdKph/ cn7A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1774563894; x=1775168694; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=krjKKoUHOcKbfpf9SpjvgIZEA4m0P+3HWizcMkU39sE=; b=F3aTH8IOTgQ4jihzSxYmASSgPsBhknEP1qmi2VCQfGzdbKRSiZiRR5pynPG5bKHRlO o/5NbskkxZ1pZs58Y+C6ZWPBKjEXmnuk/HyRlxuVbGx12lbqhU6CYFGF1l2nZfWso2ec FksCvPpZWguObi11NjkzDa8A09G+yQt2uvfUrgEuAuVVxlRWhzER5cXtNPwmVq33g2w3 CqL6yfy14jj7RCH6GzF4b7fjrNQGxvDlX2HU9HWl9HDjMYLLuuLKK6R+c0u65SlKggKQ QDp98YOZy2/S393Uh5D39P47eWymKpwUMGpXLaPa7GnNd6VM6ZBVzyejqzE8GlgD7DwT HR/g== X-Forwarded-Encrypted: i=1; AJvYcCUHLGwgD2waZFAOOVUTSv/QBnt90oQmFHW/ulM+A1J5j16WKZGoH2HHCj7eS3aJnPlgdmUCHaxlAVynNG8=@vger.kernel.org X-Gm-Message-State: AOJu0YyqMFeju21eCkGFWCwfeA/gVqwr3rkSLqbA0JUkPJjDi/Zw/UTL iim4laXds3x5HzJagvJctr4m1EXFfzqRGaaLd1mwK/Z4yTQoKyzfQw+ivWOpI9nB60Kj4MN/zsU MlpSdhOVjFUNGGVxmwz91P+07dg== X-Received: from pfbfa24.prod.google.com ([2002:a05:6a00:2d18:b0:829:813e:c970]) (user=ackerleytng job=prod-delivery.src-stubby-dispatcher) by 2002:a05:6a00:4b12:b0:829:a127:518 with SMTP id d2e1a72fcca58-82c9605434bmr143072b3a.40.1774563893212; Thu, 26 Mar 2026 15:24:53 -0700 (PDT) Date: Thu, 26 Mar 2026 15:24:23 -0700 In-Reply-To: <20260326-gmem-inplace-conversion-v4-0-e202fe950ffd@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20260326-gmem-inplace-conversion-v4-0-e202fe950ffd@google.com> X-Developer-Key: i=ackerleytng@google.com; a=ed25519; pk=sAZDYXdm6Iz8FHitpHeFlCMXwabodTm7p8/3/8xUxuU= X-Developer-Signature: v=1; a=ed25519-sha256; t=1774563861; l=3333; i=ackerleytng@google.com; s=20260225; h=from:subject:message-id; bh=+lH9JgLOF707IWKJRbslu6RR2YV0S99MONEW8Yc3BZ8=; b=M/Gbb884LE5QPF+3EzZzuqSIO6Odv8JZWUawyA7Mhz//bCISt9epGhctguzMXhMlD/ZE6w0Rj EGaXkNBVodNBXGot/DtKS79CF61Z84KbG7KljbyQM3ZQboU3Sv7s68x X-Mailer: b4 0.14.3 Message-ID: <20260326-gmem-inplace-conversion-v4-14-e202fe950ffd@google.com> Subject: [PATCH RFC v4 14/44] KVM: x86: Add support for applying content modes From: Ackerley Tng To: aik@amd.com, andrew.jones@linux.dev, binbin.wu@linux.intel.com, brauner@kernel.org, chao.p.peng@linux.intel.com, david@kernel.org, ira.weiny@intel.com, jmattson@google.com, jroedel@suse.de, 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, tabba@google.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, 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 , Baoquan He , Barry Song , Axel Rasmussen , Yuanchu Xie , Wei Xu , Jason Gunthorpe , Vlastimil Babka Cc: 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, Ackerley Tng Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable For x86, override the default implementations of content mode functions to handle reporting of supported content modes, and application of requested modes based on x86 VM types. Signed-off-by: Ackerley Tng --- arch/x86/kvm/x86.c | 101 +++++++++++++++++++++++++++++++++++++++++++++++++= ++++ 1 file changed, 101 insertions(+) diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c index 9c29407712580..3bbc8ffbf489e 100644 --- a/arch/x86/kvm/x86.c +++ b/arch/x86/kvm/x86.c @@ -14078,6 +14078,107 @@ void kvm_arch_gmem_invalidate(kvm_pfn_t start, kv= m_pfn_t end) kvm_x86_call(gmem_invalidate)(start, end); } #endif + +u64 kvm_arch_gmem_supported_content_modes(struct kvm *kvm) +{ + switch (kvm->arch.vm_type) { + case KVM_X86_SW_PROTECTED_VM: + return KVM_SET_MEMORY_ATTRIBUTES2_ZERO | + KVM_SET_MEMORY_ATTRIBUTES2_PRESERVE; + case KVM_X86_SNP_VM: + case KVM_X86_TDX_VM: + return KVM_SET_MEMORY_ATTRIBUTES2_ZERO; + default: + return 0; + } +} + +int kvm_arch_gmem_apply_content_mode_zero(struct kvm *kvm, struct inode *i= node, + pgoff_t start, pgoff_t end) +{ + switch (kvm->arch.vm_type) { + case KVM_X86_SW_PROTECTED_VM: + case KVM_X86_SNP_VM: + case KVM_X86_TDX_VM: + /* + * TDX firmware will zero on unmapping from the + * Secure-EPTs, but suppose a shared page with + * contents was converted to private, and then + * converted back without ever being mapped into + * Secure-EPTs: guest_memfd can't rely on TDX firmware + * for zeroing then. + */ + return kvm_gmem_apply_content_mode_zero(inode, start, end); + default: + WARN_ONCE(1, "Unexpected request to zero for vm_type."); + return -EOPNOTSUPP; + } +} + +int kvm_arch_gmem_apply_content_mode_preserve(struct kvm *kvm, + struct inode *inode, + pgoff_t start, pgoff_t end) +{ + switch (kvm->arch.vm_type) { + case KVM_X86_SW_PROTECTED_VM: + return 0; + default: + WARN_ONCE(1, "Unexpected request to preserve for vm_type."); + return -EOPNOTSUPP; + } +} + +static int __scramble_range(struct inode *inode, pgoff_t start, pgoff_t en= d) +{ + struct address_space *mapping =3D inode->i_mapping; + struct folio_batch fbatch; + struct folio *f; + char *kaddr; + int ret =3D 0; + int i; + + folio_batch_init(&fbatch); + while (!ret && filemap_get_folios(mapping, &start, end - 1, &fbatch)) { + for (i =3D 0; !ret && i < folio_batch_count(&fbatch); ++i) { + f =3D fbatch.folios[i]; + + folio_lock(f); + + if (folio_test_hwpoison(f)) { + ret =3D -EHWPOISON; + } else { + /* + * Hard-coding range to scramble since + * guest_memfd only supports PAGE_SIZE + * folios now. + */ + kaddr =3D kmap_local_folio(f, 0); + get_random_bytes(kaddr, PAGE_SIZE); + kunmap_local(kaddr); + } + + folio_unlock(f); + } + + folio_batch_release(&fbatch); + cond_resched(); + } + + return ret; +} + +int kvm_arch_gmem_apply_content_mode_unspecified(struct kvm *kvm, + struct inode *inode, + pgoff_t start, pgoff_t end) +{ + switch (kvm->arch.vm_type) { + case KVM_X86_SW_PROTECTED_VM: + return __scramble_range(inode, start, end); + default: + return 0; + } +} + #endif =20 int kvm_spec_ctrl_test_value(u64 value) --=20 2.53.0.1018.g2bb0e51243-goog From nobody Thu Apr 2 09:33:37 2026 Received: from mail-pf1-f201.google.com (mail-pf1-f201.google.com [209.85.210.201]) (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 0D08838838F for ; Thu, 26 Mar 2026 22:24:55 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.210.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1774563897; cv=none; b=UyJID3C2eni7sSltVODiKEZGTD9qS032kFLuXn0EoFoiSPjLMVuWofIxTovzpNBQOKM8HLz71LPMWRkc8cjSuw6oRT7VOmzzKRKJNlBM1rQERAUiLeLhCYpmcKH8vntDaLx8DXtlJ+PaILBfB8seZX1AATKckWiIIQCMzfOdUiQ= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1774563897; c=relaxed/simple; bh=k0rIEhQmrf2G34ijeqLeCvTfDWOQ9le3qaLEQJYYHBc=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=jNQPFQbBk9AwWO9yC0tBNf5r/qsgHjw89qYtj7yk3WmvjcqCt6ZtdUViXEvJ4QXG7pSqdbqNYAz9lcJ2Ex2BBrBi6s8DjRGYaV3vAk2VBI0VbLqBQ8doBTWyA40+WxXwrkkOs+2+fHENswVCS08BMkwNcrSj590xVvTgy/OVcG0= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com; spf=pass smtp.mailfrom=flex--ackerleytng.bounces.google.com; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b=G17Hsqxw; arc=none smtp.client-ip=209.85.210.201 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=flex--ackerleytng.bounces.google.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="G17Hsqxw" Received: by mail-pf1-f201.google.com with SMTP id d2e1a72fcca58-82c71a8969eso899660b3a.1 for ; Thu, 26 Mar 2026 15:24:55 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20251104; t=1774563895; x=1775168695; darn=vger.kernel.org; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:from:to:cc:subject:date:message-id:reply-to; bh=t5sAlrGE9K54t1wVa5MW/TMmXMtzYRZrp4A2ve/Zymo=; b=G17Hsqxw4Welb4eIipTrOiBxBnawR+K+OsYRJc5tAoM1O8BhURhYiQQUWanO6U558J B9JeGjE9QMCjV3Y3/FmMpNOl/ICRzsw4V8LIv6PU9tvKi6An8qlaFadQTzR0BnsyGZqN YuoV8avgJnTx1clx3oiq1upetHygk7BNqQvN/r5a8YY6JW+kees/j5GzFKwKKgaDEG32 r6SfTLV30K9aNDE6aqMsRiJbMLsy/MDY87OyF8LeSA5Mlx2iX5DAJI8ByT+CJeLZKZXG XS4ezdLP2Z/KPFliOo1USAi9DG9U6o4TthYLjaMSk21++8p6SnEaR5eL89h7Gs+4P0ZU Ks+w== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1774563895; x=1775168695; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=t5sAlrGE9K54t1wVa5MW/TMmXMtzYRZrp4A2ve/Zymo=; b=XPIpzsrUYtAgVx1cxa4c9K9T7HY/AQdUvVDZAzM93hpKdtX4ZP8Pi9cQSZHy2KmfLP rrF5RvT8SrVGKmmzxsx8zjORginYPNGSLbchDKlLeSZ8te0TC93oE95l2BCkf+xh8YEL YNsv0r0urGddls1MaSu7mAmOqYQB14PusxDu0G2Skavnsrljb4/mNh3qFtbFeic1eAlg oXf2TA/7KH9yyzHDKx7socJRbitIMT3E0yCvHf8XzFUMGgj8S9SwdkLkC+2sB/PTpRtc YX/mMmNJZ+rXq+l1sMbHoQyrfsHilM2GoIztzSE9REJrVcLOvHg0gWRPppOAKRFpm6uN wwMw== X-Forwarded-Encrypted: i=1; AJvYcCUrJDddQdJQPNzU4jaDxaeErSL0t8ZOx4Dv9xIVSVW5JPkTBkK8e2rPcNxx0UtCMKKxzVSw57+waNIxqzs=@vger.kernel.org X-Gm-Message-State: AOJu0YyXH2EoyagGIGkZ6f+IMXkeuXWddeJb15eh4v9Nv5tFXW/ozRFk mBbD9558xVYpbpFaUX5RHFonOD39ui3U0+rwA8Oc4+4Ez5SkobIdVyPhRnpTS+RAL2Nc9ZZ0xlP /2Tl2HQgRDWNs2taTwUfn9+askQ== X-Received: from pfbfb15.prod.google.com ([2002:a05:6a00:2d8f:b0:829:9082:12ca]) (user=ackerleytng job=prod-delivery.src-stubby-dispatcher) by 2002:a05:6a00:bc81:b0:82a:81b6:d8a6 with SMTP id d2e1a72fcca58-82c95ed3b8amr136334b3a.25.1774563895023; Thu, 26 Mar 2026 15:24:55 -0700 (PDT) Date: Thu, 26 Mar 2026 15:24:24 -0700 In-Reply-To: <20260326-gmem-inplace-conversion-v4-0-e202fe950ffd@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20260326-gmem-inplace-conversion-v4-0-e202fe950ffd@google.com> X-Developer-Key: i=ackerleytng@google.com; a=ed25519; pk=sAZDYXdm6Iz8FHitpHeFlCMXwabodTm7p8/3/8xUxuU= X-Developer-Signature: v=1; a=ed25519-sha256; t=1774563861; l=2976; i=ackerleytng@google.com; s=20260225; h=from:subject:message-id; bh=k0rIEhQmrf2G34ijeqLeCvTfDWOQ9le3qaLEQJYYHBc=; b=IWLi+POwxzAv6171snEkLJVWDYN28Uuep3Son7R0IlBi2Sc94mxhcktuxdQooqH4T04aDlDmq +h30zn8kj/LDlT1kMmeMRqgH+wx8i80pH8UDKHg1NuB4KJ+CpPgIlNh X-Mailer: b4 0.14.3 Message-ID: <20260326-gmem-inplace-conversion-v4-15-e202fe950ffd@google.com> Subject: [PATCH RFC v4 15/44] KVM: Add CAP to enumerate supported SET_MEMORY_ATTRIBUTES2 flags From: Ackerley Tng To: aik@amd.com, andrew.jones@linux.dev, binbin.wu@linux.intel.com, brauner@kernel.org, chao.p.peng@linux.intel.com, david@kernel.org, ira.weiny@intel.com, jmattson@google.com, jroedel@suse.de, 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, tabba@google.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, 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 , Baoquan He , Barry Song , Axel Rasmussen , Yuanchu Xie , Wei Xu , Jason Gunthorpe , Vlastimil Babka Cc: 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, Ackerley Tng Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Add CAP to enumerate supported SET_MEMORY_ATTRIBUTES2 flags, so userspace can find out which flags are supported when sending the KVM_SET_MEMORY_ATTRIBUTES2 ioctl to a guest_memfd. These flags are only supported by guest_memfd, hence, if vm_memory_attributes is enabled, return 0 - no flags are supported when KVM_SET_MEMORY_ATTRIBUTES2 is sent to a VM fd. Signed-off-by: Ackerley Tng --- Documentation/virt/kvm/api.rst | 3 +++ include/linux/kvm_host.h | 12 ++++++++++++ include/uapi/linux/kvm.h | 1 + virt/kvm/kvm_main.c | 5 +++++ 4 files changed, 21 insertions(+) diff --git a/Documentation/virt/kvm/api.rst b/Documentation/virt/kvm/api.rst index 90587a9c09d3f..73101d6e649b7 100644 --- a/Documentation/virt/kvm/api.rst +++ b/Documentation/virt/kvm/api.rst @@ -6680,6 +6680,9 @@ guarantees are made on offset ranges that do not have= memory allocated and range [0x0000, 0x3000) was set to shared, the content mode would apply to only to offset ranges [0x0000, 0x1000) and [0x2000, 0x3000). =20 +The supported content modes can be queried using +``KVM_CAP_MEMORY_ATTRIBUTES2_FLAGS``. + See also: :ref: `KVM_SET_MEMORY_ATTRIBUTES`. =20 .. _kvm_run: diff --git a/include/linux/kvm_host.h b/include/linux/kvm_host.h index 4ba3c4b303f4a..d671c9795dfce 100644 --- a/include/linux/kvm_host.h +++ b/include/linux/kvm_host.h @@ -2536,6 +2536,18 @@ static inline u64 kvm_supported_mem_attributes(struc= t kvm *kvm) return 0; } =20 +static inline u64 kvm_supported_set_mem_attributes2_flags(struct kvm *kvm) +{ + if (!IS_ENABLED(CONFIG_KVM_GUEST_MEMFD)) + return 0; + + if (!kvm) + return KVM_SET_MEMORY_ATTRIBUTES2_ZERO | + KVM_SET_MEMORY_ATTRIBUTES2_PRESERVE; + + return kvm_arch_gmem_supported_content_modes(kvm); +} + typedef unsigned long (kvm_get_memory_attributes_t)(struct kvm *kvm, gfn_t= gfn); DECLARE_STATIC_CALL(__kvm_get_memory_attributes, kvm_get_memory_attributes= _t); =20 diff --git a/include/uapi/linux/kvm.h b/include/uapi/linux/kvm.h index 0fc9ad4ea0d93..4d1e09d022c48 100644 --- a/include/uapi/linux/kvm.h +++ b/include/uapi/linux/kvm.h @@ -991,6 +991,7 @@ struct kvm_enable_cap { #define KVM_CAP_S390_KEYOP 247 #define KVM_CAP_MEMORY_ATTRIBUTES2 248 #define KVM_CAP_GUEST_MEMFD_MEMORY_ATTRIBUTES 249 +#define KVM_CAP_MEMORY_ATTRIBUTES2_FLAGS 250 =20 struct kvm_irq_routing_irqchip { __u32 irqchip; diff --git a/virt/kvm/kvm_main.c b/virt/kvm/kvm_main.c index 85c14197587d4..6607127eaaeed 100644 --- a/virt/kvm/kvm_main.c +++ b/virt/kvm/kvm_main.c @@ -4980,6 +4980,11 @@ static int kvm_vm_ioctl_check_extension_generic(stru= ct kvm *kvm, long arg) return 0; =20 return kvm_supported_mem_attributes(kvm); + case KVM_CAP_MEMORY_ATTRIBUTES2_FLAGS: + if (vm_memory_attributes) + return 0; + + return kvm_supported_set_mem_attributes2_flags(kvm); #endif default: break; --=20 2.53.0.1018.g2bb0e51243-goog From nobody Thu Apr 2 09:33:37 2026 Received: from mail-pj1-f74.google.com (mail-pj1-f74.google.com [209.85.216.74]) (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 3FC9938D6AC for ; Thu, 26 Mar 2026 22:24:58 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.216.74 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1774563899; cv=none; b=n8qNKQkR3B1kv5A0+VsE1gZeHfPWcMMKDM5wr6XyPbppgbylL+CnsmN05G+3Glbs+w0Buew4n+1UNkJvJo1Il70uZXgaaZqN7PFWkAHi86So/jSqpztzXCv9i4ZZIEXH7HqguWuo33RyhKF0XgJigSxY7JMxM++Fgmu/6EetxHI= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1774563899; c=relaxed/simple; bh=ZNSJzwaW770z2O3jcaJypKgW8TksjMRyicAzfFzxMB8=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=RN1mXWZGnK7n4iuQ0X2XTMl1A0H6j+Xccdhz4yWBlUhJE65Z7KgXvbYmbT3MeXSpNqXpap2rUrKDhEBjOuIaS3/LXGcMXTrptgCmcYkxHPQDO8jb0wbVwwhB9S0ftLOPuLGXIezOIP+/gXGaRaMpXA/OvyDgD31vG7Ox7YDidT4= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com; spf=pass smtp.mailfrom=flex--ackerleytng.bounces.google.com; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b=K7K7MvmK; arc=none smtp.client-ip=209.85.216.74 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=flex--ackerleytng.bounces.google.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="K7K7MvmK" Received: by mail-pj1-f74.google.com with SMTP id 98e67ed59e1d1-3568090851aso4602085a91.1 for ; Thu, 26 Mar 2026 15:24:58 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20251104; t=1774563898; x=1775168698; darn=vger.kernel.org; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:from:to:cc:subject:date:message-id:reply-to; bh=TP0m4OKRUtxmtY99mVH8PUf9pC8qTzihU9Otk33F2IE=; b=K7K7MvmK2+/B8lyJiMTc0BSwsm+IeoSkQVj2FReN9EfdL3DwT8l6jBpwJnRocBo/TQ 8P2WANdwhYwA+jjkneGkdgsypLiC83sOz8YOswQd4x8K5VWQ0ZH6ZtdZ4eF6tVhXkUXl bpoUKB7O6u67WFMl0+rhJmUVGv1/GYSR4X2ubRsAeSJhkOQepeohO3who2c8olUS/l4a UJavsvseTl73RF5R8WjZv408xhVTBtFbbHfnti8MRl7CvVyowLTwvhcd+R29+VXKz9DJ ojULGMrefW5FSiF/EzbGF+xOFYdKdajQ6s0xz0LVQgR8rGVV//D0VtatDu7WyGWLxET7 hnUg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1774563898; x=1775168698; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=TP0m4OKRUtxmtY99mVH8PUf9pC8qTzihU9Otk33F2IE=; b=sCnsK+x3y4X/vDYXYVtw7TysLJpH1qDmLIkNRszhEZEqchmKTrbF2USnQpcyJH2W4N 05ffQ/eDta/JcNj9U6/d/bwZ2eTd/gDY/4+SxUETDmc5AvPZOp9jwpf50SF/VIHkq4IH de1rpvHR3bIE02vm065xuPhbUmYdg1AmBcj9ATH5dT2CsyhyLHwaVL5Eo47NC3jghNmc uuHcS4GxE59QYUvnUSBHOk6wyhlUyFSJj2f1WocXOYAMDYb/l8bXIhnJTVyDTWIKdaKh VODUKxd9y5J5G+s27Dv2Bf/IMz7F7z2ZpauPItoM0zUyYW5tDpMpfLQg9aGMUfyfwr4t XY0A== X-Forwarded-Encrypted: i=1; AJvYcCUEWh21NwDC5WzInmcgHvRacH4ff+G9+6+y7zwMV0dTX9i+lL5NimfSg8pBIyYPry/jaVSxu/YysFxm39A=@vger.kernel.org X-Gm-Message-State: AOJu0YwNJy/007t8tZDzfUoeEaznezWK04o14s/3RCdH55YdQnXPGpC/ 8mHbObDlYkNuUB/Uv5DuztvwHPxSIw6mhkEZ2cUL/WxoPDeWGOArStAyV1ovjlt/CBhdlCSEivI g/Ano0adLMXnv87UFCV4pNNcIDg== X-Received: from pga10.prod.google.com ([2002:a05:6a02:4f8a:b0:c6e:1954:345]) (user=ackerleytng job=prod-delivery.src-stubby-dispatcher) by 2002:a17:90b:4ad0:b0:35b:e594:5038 with SMTP id 98e67ed59e1d1-35c300b7e5amr211045a91.17.1774563897304; Thu, 26 Mar 2026 15:24:57 -0700 (PDT) Date: Thu, 26 Mar 2026 15:24:25 -0700 In-Reply-To: <20260326-gmem-inplace-conversion-v4-0-e202fe950ffd@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20260326-gmem-inplace-conversion-v4-0-e202fe950ffd@google.com> X-Developer-Key: i=ackerleytng@google.com; a=ed25519; pk=sAZDYXdm6Iz8FHitpHeFlCMXwabodTm7p8/3/8xUxuU= X-Developer-Signature: v=1; a=ed25519-sha256; t=1774563861; l=1752; i=ackerleytng@google.com; s=20260225; h=from:subject:message-id; bh=eWTeX+992GeYO26dNFWGC344Wuak8bbQzmW7qdSnDKw=; b=SL6pYdxlhvPJikdSi+mQfL/6DG+UDH5L2C4BN1AeU1jYKBkDwTYhcD1AK0H3INZXB0ml7c0AA j3kIXGoRZuyCSKk9sI3NBJpxVzzQomxNO1Xr6/eqMY1cnRkZkNjdzmW X-Mailer: b4 0.14.3 Message-ID: <20260326-gmem-inplace-conversion-v4-16-e202fe950ffd@google.com> Subject: [PATCH RFC v4 16/44] KVM: Move KVM_VM_MEMORY_ATTRIBUTES config definition to x86 From: Ackerley Tng To: aik@amd.com, andrew.jones@linux.dev, binbin.wu@linux.intel.com, brauner@kernel.org, chao.p.peng@linux.intel.com, david@kernel.org, ira.weiny@intel.com, jmattson@google.com, jroedel@suse.de, 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, tabba@google.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, 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 , Baoquan He , Barry Song , Axel Rasmussen , Yuanchu Xie , Wei Xu , Jason Gunthorpe , Vlastimil Babka Cc: 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, Ackerley Tng Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable From: Sean Christopherson Bury KVM_VM_MEMORY_ATTRIBUTES in x86 to discourage other architectures from adding support for per-VM memory attributes, because tracking private vs. shared memory on a per-VM basis is now deprecated in favor of tracking on a per-guest_memfd basis, and no other memory attributes are on the horizon. This will also allow modifying KVM_VM_MEMORY_ATTRIBUTES to be user-selectable (in x86) without creating weirdness in KVM's Kconfigs. Now that guest_memfd support memory attributes, it's entirely possible to run x86 CoCo VMs without support for KVM_VM_MEMORY_ATTRIBUTES. Leave the code itself in common KVM so that it's trivial to undo this change if new per-VM attributes do come along. Signed-off-by: Sean Christopherson --- arch/x86/kvm/Kconfig | 4 ++++ virt/kvm/Kconfig | 4 ---- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/arch/x86/kvm/Kconfig b/arch/x86/kvm/Kconfig index 26f6afd51bbdc..b6d65ee664d0f 100644 --- a/arch/x86/kvm/Kconfig +++ b/arch/x86/kvm/Kconfig @@ -80,6 +80,10 @@ config KVM_WERROR =20 If in doubt, say "N". =20 +config KVM_VM_MEMORY_ATTRIBUTES + select KVM_MEMORY_ATTRIBUTES + bool + config KVM_SW_PROTECTED_VM bool "Enable support for KVM software-protected VMs" depends on EXPERT diff --git a/virt/kvm/Kconfig b/virt/kvm/Kconfig index e371e079e2c50..663de6421eda2 100644 --- a/virt/kvm/Kconfig +++ b/virt/kvm/Kconfig @@ -103,10 +103,6 @@ config KVM_MMU_LOCKLESS_AGING config KVM_MEMORY_ATTRIBUTES bool =20 -config KVM_VM_MEMORY_ATTRIBUTES - select KVM_MEMORY_ATTRIBUTES - bool - config KVM_GUEST_MEMFD select XARRAY_MULTI select KVM_MEMORY_ATTRIBUTES --=20 2.53.0.1018.g2bb0e51243-goog From nobody Thu Apr 2 09:33:37 2026 Received: from mail-pf1-f202.google.com (mail-pf1-f202.google.com [209.85.210.202]) (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 12ADB38F92D for ; Thu, 26 Mar 2026 22:25:00 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.210.202 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1774563901; cv=none; b=toSRfmSgD/cKtOa1TvLYPSul7+hkpOUYgy/Q02Fq6rNSudNFbw4voAgdkt8RsWkpwn5+BLn3+vNZ/POEnV9bS02UAZTjCQN93AsGHC+2yRK99gHAnvRE5Aiowt8DQtrhYkTq3u8/PAqkkIbRYNwUpqLX37sp5h18vUMajkgZFWg= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1774563901; c=relaxed/simple; bh=tJ9dGCdGH+eMi1rzPnbXzIog9htm51QzhB2FZFrGK3o=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=HcvdNXoClOIYE7HiXHb+V8OM6DaUwDaUKyuZQfWcrMYuTAjUsReLZWJ636YOltbekIJo+l/fH6PUj/ePDjr8EtwmXz5IYGCKnEg/wrVnJNNqWmxc6NKqoi2mCApYjtpIi2hhqF7UZkmZWtHgAv7lwL2P9LPMW2F5BiaPimscmBc= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com; spf=pass smtp.mailfrom=flex--ackerleytng.bounces.google.com; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b=FIMECDLR; arc=none smtp.client-ip=209.85.210.202 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=flex--ackerleytng.bounces.google.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="FIMECDLR" Received: by mail-pf1-f202.google.com with SMTP id d2e1a72fcca58-82c7ec40f92so2061422b3a.0 for ; Thu, 26 Mar 2026 15:25:00 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20251104; t=1774563899; x=1775168699; darn=vger.kernel.org; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:from:to:cc:subject:date:message-id:reply-to; bh=Ammt0BhOIyLXS2ULMUn5WewBTpBTKqlX10HzkZ/Adsk=; b=FIMECDLRohoy2njyqs9/MC3lpXOAMJR8Ssc/IW8vRi1msn4tQ7O980FXSYVP6P4WH4 tRNttoWbOyfCtPtCx4TNItcjQZUrHG9ehph36SpZBqqZnl3+bEWOlaTpUaXbesMcLTIp HQIsvIrr/XuOEU6LkgRfblYBpRIVKSaMJdJwDNFeRwrjtbIazY1J0kehwHkscUSCOxSl evQ1rledcxzosklpE2LpZyQD6xFZD6qo4lPagh9dV0fSgT12J0mFivaSdK5a9x5CDWoV vmF7qHVGTEvUaE/4wOEPEDNW1+y/qcxlcLHxS3+yN/tfWVo0DvuXvFZ86alKcguzRF/9 qq0A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1774563899; x=1775168699; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=Ammt0BhOIyLXS2ULMUn5WewBTpBTKqlX10HzkZ/Adsk=; b=cob4EoKiiRexjzoXOXMIfI/laT1DPxB0egjkjea1+OXG29VEaUOqYDxYHlLElg13lN LCoMmKtLP52bwXBtK5WwT+Lx84y2zXw9HKL7prq4LDGTlb5CIXfkTkv0ghfnq/n13uVs f/nQHFZLaogZjKk4noS65lULw6+da8jq3V3TkpUNEvQXC7upOWljDTpggJb31DmLjbJG RloNBP+ngE3RlXk+3Lk3JlY+sn+dwDo7Locw7E3x94mdGESYE3iPl1bIO1dlrh8OP98c ZRqzWcD+RGaZUBAGVEKfG4sQ/1yaGUS1vo5Q5szBCwpAMJMzQZy96Zr5WqG6brcsW4yN U60w== X-Forwarded-Encrypted: i=1; AJvYcCUXBMZ2WZm08BcsmV3hZquLaOWE15bdHGzKJX7IMZsE516DtSFvyNdhlEfm9J1CsTXxlW7C2njbJMXM6Gs=@vger.kernel.org X-Gm-Message-State: AOJu0YylYbI5wI45O8aS488+apSgndtLc6M48J8CrExjAoubfutU1IHJ OJXmJ4NY+p0xjkPguzgOAuhsmAPkI3fEbphePW6YShGG+LMfEPzcdpnq3v+6Nmt0SvbuFoHJ+bi 9EXiKx6aQqhTrR1GoVcla5Gb5VQ== X-Received: from pfblh10.prod.google.com ([2002:a05:6a00:710a:b0:827:1713:6de8]) (user=ackerleytng job=prod-delivery.src-stubby-dispatcher) by 2002:a05:6a00:909e:b0:829:86a5:d30a with SMTP id d2e1a72fcca58-82c95d3979fmr158458b3a.16.1774563899156; Thu, 26 Mar 2026 15:24:59 -0700 (PDT) Date: Thu, 26 Mar 2026 15:24:26 -0700 In-Reply-To: <20260326-gmem-inplace-conversion-v4-0-e202fe950ffd@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20260326-gmem-inplace-conversion-v4-0-e202fe950ffd@google.com> X-Developer-Key: i=ackerleytng@google.com; a=ed25519; pk=sAZDYXdm6Iz8FHitpHeFlCMXwabodTm7p8/3/8xUxuU= X-Developer-Signature: v=1; a=ed25519-sha256; t=1774563861; l=2856; i=ackerleytng@google.com; s=20260225; h=from:subject:message-id; bh=YkFqhRwEQZVyHiDJUj6H4E4tU4Wvsdzaj7skS/qkZuE=; b=fYqOIs0iI3/nAEboIQ/PrkKD3DqiKgh0ZKOH0/alwG+ByCa4bQDdDE7B7eewnHx+Vkr5yyN3L qYWooCrUe9JDhY0cerupGdZo3deYAs2/zlmrWXsG3XBYe8lS1/Lli9y X-Mailer: b4 0.14.3 Message-ID: <20260326-gmem-inplace-conversion-v4-17-e202fe950ffd@google.com> Subject: [PATCH RFC v4 17/44] KVM: Let userspace disable per-VM mem attributes, enable per-gmem attributes From: Ackerley Tng To: aik@amd.com, andrew.jones@linux.dev, binbin.wu@linux.intel.com, brauner@kernel.org, chao.p.peng@linux.intel.com, david@kernel.org, ira.weiny@intel.com, jmattson@google.com, jroedel@suse.de, 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, tabba@google.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, 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 , Baoquan He , Barry Song , Axel Rasmussen , Yuanchu Xie , Wei Xu , Jason Gunthorpe , Vlastimil Babka Cc: 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, Ackerley Tng Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable From: Sean Christopherson Make vm_memory_attributes a module parameter so that userspace can disable the use of memory attributes on the VM level. To avoid inconsistencies in the way memory attributes are tracked in KVM and guest_memfd, the vm_memory_attributes module_param is made read-only (0444). Make CONFIG_KVM_VM_MEMORY_ATTRIBUTES selectable, only for (CoCo) VM types that might use vm_memory_attributes. Signed-off-by: Sean Christopherson Signed-off-by: Ackerley Tng --- arch/x86/kvm/Kconfig | 13 +++++++++---- virt/kvm/kvm_main.c | 1 + 2 files changed, 10 insertions(+), 4 deletions(-) diff --git a/arch/x86/kvm/Kconfig b/arch/x86/kvm/Kconfig index b6d65ee664d0f..8b97d341bd33f 100644 --- a/arch/x86/kvm/Kconfig +++ b/arch/x86/kvm/Kconfig @@ -82,13 +82,20 @@ config KVM_WERROR =20 config KVM_VM_MEMORY_ATTRIBUTES select KVM_MEMORY_ATTRIBUTES - bool + depends on KVM_SW_PROTECTED_VM || KVM_INTEL_TDX || KVM_AMD_SEV + bool "Enable per-VM memory attributes (for CoCo VMs)" + help + Enable support for per-VM memory attributes, which are deprecated in + favor of tracking memory attributes in guest_memfd. Select this if + you need to run CoCo VMs using a VMM that doesn't support guest_memfd + memory attributes. + + If unsure, say N. =20 config KVM_SW_PROTECTED_VM bool "Enable support for KVM software-protected VMs" depends on EXPERT depends on KVM_X86 && X86_64 - select KVM_VM_MEMORY_ATTRIBUTES help Enable support for KVM software-protected VMs. Currently, software- protected VMs are purely a development and testing vehicle for @@ -139,7 +146,6 @@ config KVM_INTEL_TDX bool "Intel Trust Domain Extensions (TDX) support" default y depends on INTEL_TDX_HOST - select KVM_VM_MEMORY_ATTRIBUTES select HAVE_KVM_ARCH_GMEM_POPULATE help Provides support for launching Intel Trust Domain Extensions (TDX) @@ -163,7 +169,6 @@ config KVM_AMD_SEV depends on KVM_AMD && X86_64 depends on CRYPTO_DEV_SP_PSP && !(KVM_AMD=3Dy && CRYPTO_DEV_CCP_DD=3Dm) select ARCH_HAS_CC_PLATFORM - select KVM_VM_MEMORY_ATTRIBUTES select HAVE_KVM_ARCH_GMEM_PREPARE select HAVE_KVM_ARCH_GMEM_INVALIDATE select HAVE_KVM_ARCH_GMEM_POPULATE diff --git a/virt/kvm/kvm_main.c b/virt/kvm/kvm_main.c index 6607127eaaeed..05e203f5292be 100644 --- a/virt/kvm/kvm_main.c +++ b/virt/kvm/kvm_main.c @@ -105,6 +105,7 @@ module_param(allow_unsafe_mappings, bool, 0444); #ifdef CONFIG_KVM_MEMORY_ATTRIBUTES #ifdef CONFIG_KVM_VM_MEMORY_ATTRIBUTES bool vm_memory_attributes =3D true; +module_param(vm_memory_attributes, bool, 0444); #endif DEFINE_STATIC_CALL_RET0(__kvm_get_memory_attributes, kvm_get_memory_attrib= utes_t); EXPORT_SYMBOL_FOR_KVM_INTERNAL(STATIC_CALL_KEY(__kvm_get_memory_attributes= )); --=20 2.53.0.1018.g2bb0e51243-goog From nobody Thu Apr 2 09:33:37 2026 Received: from mail-pg1-f201.google.com (mail-pg1-f201.google.com [209.85.215.201]) (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 8A091391516 for ; Thu, 26 Mar 2026 22:25:02 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.215.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1774563903; cv=none; b=diseieHYQOFAvcYx+capcBWAPRpjtd8NzGBiCVgj0XW/PdXbu1b794YPjUuGTS2SdwZ74qctGCIm3dnJiP0E2C4CMvkT2gm11T4fqvGr2X4YuBOlZ5cpWCjw/DiOkkSAzvEKtBpLDHZNCIa+abxtlszv/Pqb/S7LVsX+MhpOkuA= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1774563903; c=relaxed/simple; bh=0jjB+L00bmlKsXNHZVQZg/Gbh9xkSf09ciqRSU44Jrg=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=tFqe1Vgaf7gjZQvR+rnbLeXCpAcN9grd6YB1niyDaeAXFzI+0k/EjRMGoZ1VuNZJkxF0Bcz2EijJdbxJlAVzJEyhDeV5Bs+fOpuKKdZd4D6//v90Vmi2QDu0hNNHWTRXBz5va9hWsR1FH2Zq8iWuXtIz19xIy/o01J6inc5DFb4= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com; spf=pass smtp.mailfrom=flex--ackerleytng.bounces.google.com; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b=M6zuOQhT; arc=none smtp.client-ip=209.85.215.201 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=flex--ackerleytng.bounces.google.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="M6zuOQhT" Received: by mail-pg1-f201.google.com with SMTP id 41be03b00d2f7-c7656dba76aso933127a12.1 for ; Thu, 26 Mar 2026 15:25:02 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20251104; t=1774563902; x=1775168702; darn=vger.kernel.org; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:from:to:cc:subject:date:message-id:reply-to; bh=afYjOzvP16h/SfxvhTKPo6PFaH7oiLN+m8p/p0wfDgE=; b=M6zuOQhT3GQqMMaQ6XOdKNGfLUAYoeeIkpTBzkCGG2xbA/AT3PjIHrrnw1fyFXCi9Z 9e3Yx7viyaV+PsDJ5xqB458/FqVErp79qZvcXwLGZ3s8lZAF9A0TomoTrc6+VZN+h+o/ SWHSaM2wSup2VSQNjgjgFI3Wx209cYN0EDPpnUw8eT1fUZUrANDPhGBhC+ziSFP5/p+7 ujVzQJVywLhuA2F6R4Lx2NX2gxnkaRcIXOD3lmzCJmDhLTsX5dKgedP9ioylpXzavrQe 5vWWovsHQ0vlJp6SASLlkpEfKwpY5xN4CI7dg8yVXXa7RYgOegh0OHM12srg09wF+TYj ApZg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1774563902; x=1775168702; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=afYjOzvP16h/SfxvhTKPo6PFaH7oiLN+m8p/p0wfDgE=; b=bBrIoVFGWmUryXcVz8wfbhNFAtjwOYgedzNia2oKIfouTvCM3ER4gKsX/e0V5w2+Yp kp97wHitX30gB9j2X2uJLpJ1G3x+hC8QQ+fTODVKfy37kLxStCU7mr7FgnZapujZmgeR PCthxxH1/k2kwP8ZIITNJbOaf7NPNwD/y7k5ehP2oDsVBYpmfMpHB57SiPtVnjCqiU9u H5Tf+fWRIj6pHlvraMEoTDtb6g45678atgeSOO02zSUlYN2by2J38L0nMzz1/G5T9HvU 2p9ymdCy1HRWtW1AiJEzym+D65Z1cxGhglAmt8txTlgwL4OPt9xHp31lPMet8JS3RhTl OehQ== X-Forwarded-Encrypted: i=1; AJvYcCWp2coRtG0QB5a6ME0jQro5sewIukEwseMpY3KNWM5cF/tDagDux6JFOkvZuQXTpZxRp1rSEMiyNyw5o7c=@vger.kernel.org X-Gm-Message-State: AOJu0YzWdB11d4+qiflkT1xnBaZ9iyR8bpe+1x3zv13thn4YfYId/KP2 Vf9JNjp6yrrsT+f823oNui0WMNHm+DFpnV+6GDtfXnWiEilA2dorRFgp8GOUHeokwAZvzamcZzK tCOoQ9lteplF51mYxLlNraTaiPw== X-Received: from pgli25.prod.google.com ([2002:a63:1319:0:b0:c6e:1869:6f24]) (user=ackerleytng job=prod-delivery.src-stubby-dispatcher) by 2002:a05:6a21:9992:b0:398:a5c7:3dc9 with SMTP id adf61e73a8af0-39c87b6affdmr315892637.49.1774563901450; Thu, 26 Mar 2026 15:25:01 -0700 (PDT) Date: Thu, 26 Mar 2026 15:24:27 -0700 In-Reply-To: <20260326-gmem-inplace-conversion-v4-0-e202fe950ffd@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20260326-gmem-inplace-conversion-v4-0-e202fe950ffd@google.com> X-Developer-Key: i=ackerleytng@google.com; a=ed25519; pk=sAZDYXdm6Iz8FHitpHeFlCMXwabodTm7p8/3/8xUxuU= X-Developer-Signature: v=1; a=ed25519-sha256; t=1774563861; l=2780; i=ackerleytng@google.com; s=20260225; h=from:subject:message-id; bh=7TZkUYE885M/wXgOBZe37BZPynsdjK5T8U6+o9woLC4=; b=314JAxzEs6WcJiM6YyGFVmcscyTLi7cuvImPq+mUF9Ii+v6RmtfL08R7F3Q+0ERv7vn2+MJyY FZVNih8negYDvxZ4BfDeQXb+WPayqddg+asn8A0sbOoVY9TrZpWfcM2 X-Mailer: b4 0.14.3 Message-ID: <20260326-gmem-inplace-conversion-v4-18-e202fe950ffd@google.com> Subject: [PATCH RFC v4 18/44] KVM: selftests: Create gmem fd before "regular" fd when adding memslot From: Ackerley Tng To: aik@amd.com, andrew.jones@linux.dev, binbin.wu@linux.intel.com, brauner@kernel.org, chao.p.peng@linux.intel.com, david@kernel.org, ira.weiny@intel.com, jmattson@google.com, jroedel@suse.de, 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, tabba@google.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, 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 , Baoquan He , Barry Song , Axel Rasmussen , Yuanchu Xie , Wei Xu , Jason Gunthorpe , Vlastimil Babka Cc: 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, Ackerley Tng Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable From: Sean Christopherson When adding a memslot associated a guest_memfd instance, create/dup the guest_memfd before creating the "normal" backing file. This will allow dup'ing the gmem fd as the normal fd when guest_memfd supports mmap(), i.e. to make guest_memfd the _only_ backing source for the memslot. Signed-off-by: Sean Christopherson --- tools/testing/selftests/kvm/lib/kvm_util.c | 45 +++++++++++++++-----------= ---- 1 file changed, 23 insertions(+), 22 deletions(-) diff --git a/tools/testing/selftests/kvm/lib/kvm_util.c b/tools/testing/sel= ftests/kvm/lib/kvm_util.c index 1959bf556e88e..610cb32ff207e 100644 --- a/tools/testing/selftests/kvm/lib/kvm_util.c +++ b/tools/testing/selftests/kvm/lib/kvm_util.c @@ -1061,6 +1061,29 @@ void vm_mem_add(struct kvm_vm *vm, enum vm_mem_backi= ng_src_type src_type, if (alignment > 1) region->mmap_size +=3D alignment; =20 + if (flags & KVM_MEM_GUEST_MEMFD) { + if (guest_memfd < 0) { + uint32_t guest_memfd_flags =3D 0; + + TEST_ASSERT(!guest_memfd_offset, + "Offset must be zero when creating new guest_memfd"); + guest_memfd =3D vm_create_guest_memfd(vm, mem_size, guest_memfd_flags); + } else { + /* + * Install a unique fd for each memslot so that the fd + * can be closed when the region is deleted without + * needing to track if the fd is owned by the framework + * or by the caller. + */ + guest_memfd =3D kvm_dup(guest_memfd); + } + + region->region.guest_memfd =3D guest_memfd; + region->region.guest_memfd_offset =3D guest_memfd_offset; + } else { + region->region.guest_memfd =3D -1; + } + region->fd =3D -1; if (backing_src_is_shared(src_type)) region->fd =3D kvm_memfd_alloc(region->mmap_size, @@ -1090,28 +1113,6 @@ void vm_mem_add(struct kvm_vm *vm, enum vm_mem_backi= ng_src_type src_type, =20 region->backing_src_type =3D src_type; =20 - if (flags & KVM_MEM_GUEST_MEMFD) { - if (guest_memfd < 0) { - uint32_t guest_memfd_flags =3D 0; - TEST_ASSERT(!guest_memfd_offset, - "Offset must be zero when creating new guest_memfd"); - guest_memfd =3D vm_create_guest_memfd(vm, mem_size, guest_memfd_flags); - } else { - /* - * Install a unique fd for each memslot so that the fd - * can be closed when the region is deleted without - * needing to track if the fd is owned by the framework - * or by the caller. - */ - guest_memfd =3D kvm_dup(guest_memfd); - } - - region->region.guest_memfd =3D guest_memfd; - region->region.guest_memfd_offset =3D guest_memfd_offset; - } else { - region->region.guest_memfd =3D -1; - } - region->unused_phy_pages =3D sparsebit_alloc(); if (vm_arch_has_protected_memory(vm)) region->protected_phy_pages =3D sparsebit_alloc(); --=20 2.53.0.1018.g2bb0e51243-goog From nobody Thu Apr 2 09:33:37 2026 Received: from mail-pj1-f74.google.com (mail-pj1-f74.google.com [209.85.216.74]) (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 75CD0392801 for ; Thu, 26 Mar 2026 22:25:04 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.216.74 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1774563906; cv=none; b=ZEeMeEcaA1YICeFRtYoR1vWeuR0u0cMkUWUIH3X9jRm86NykWVJg5n8wGWPXuz6GGUxHhCAlWGoLcebT7r2AJZnvqC9CU6apHJtYD6GyjKH8uk0sftbTQgz4vC963KnLfXJrql2HsbOvM2dEl/oT3OGxItsCxI7TGJCQGpHF0o8= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1774563906; c=relaxed/simple; bh=J0YJXMjPxx1mE3N73hm/V0s/FuuGhfZqzFLf682Q2KI=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=TCyyDKtu4GMhzKfaPFzU/5qJxz5kG+ZEiRVeckls/g72Ie9xtcp52bWRP4zWu4oqlSmLsZBaX7AteL+lU3We6rXZOczilDL+0RFBO5dNrHcqYZ//nm+l3os1bLy8WhNCzO02zHCU4EDVAnISKVeud9TyFbx7e844IB0KgSwFwMg= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com; spf=pass smtp.mailfrom=flex--ackerleytng.bounces.google.com; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b=p1QJ5K6n; arc=none smtp.client-ip=209.85.216.74 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=flex--ackerleytng.bounces.google.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="p1QJ5K6n" Received: by mail-pj1-f74.google.com with SMTP id 98e67ed59e1d1-359812e4fefso2269061a91.1 for ; Thu, 26 Mar 2026 15:25:04 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20251104; t=1774563904; x=1775168704; darn=vger.kernel.org; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:from:to:cc:subject:date:message-id:reply-to; bh=N0AfLg74ibzAu140IbuS6KqPXC4lmrO5NcvdvIrpN3Y=; b=p1QJ5K6n2i7jEDSOJuzBQXOAY7YTVTWj9LG1VmdEaPLdlVEPe4zKcIsvnfyMf7lbOW FpP5stW7wARhgdGEmywgDOAek6WhG3ypJG2rE5TJYhefPQ7PXgTijBl+wKowIQD4s5Fv +ibZiXGsQgYXuBDVYWhOBYVTpnSltYikEuXN7IdPBoIFGSLlSlSwsBKCMS6oCNYRM6HK Xyw8MkCCrM/GhkQStzy0S5ywdMtVSy6qFyRYbk4bWE6FWGPz1P4Gpeijkas2iejWlXNQ /AJOkoe038+pZwjQMWzEXL8/NI6+/iZ/5rxuYFz9JUUaWVgq3rP6vTgxza2gTqpz9itQ vXMQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1774563904; x=1775168704; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=N0AfLg74ibzAu140IbuS6KqPXC4lmrO5NcvdvIrpN3Y=; b=hwrXBBPajBJfvP8TfVssImVp1hSCaYbLsr8Za9ExaKAmnxa3kAKI8Npp/DCrUQEEM8 fOMITVvNaZXqLRlXsHKlt1DzhMzhpbgZKPu74L1KOfwZtjq324ZQFdfO1Yw0+FUVdEC4 hZkYDRDfs2z7g14r063xw1jjZhohDzfopkcJmZH1kjjXvUPbvl97p9qfqd5X2eanPa4H KSOOZFKHr/PLyYTkh4SH4aX8LnEWaCbsead3r4HhqLKCaDdgbdkfeABCjxHyXJ46qabl 0DXBNTU5PvUBuxnF3jGsJPSsHM0E44j42ecU45rZuFraEz1diz1muhBER+h83qogUdng o2wA== X-Forwarded-Encrypted: i=1; AJvYcCW+quAINAn8RdXt6qPe9t4oxzrZsdAkAJ/ycl2eIaq1xdCQC/vjZUdlAt9XeJ3YAYxiqgJP19kwWVzoIM8=@vger.kernel.org X-Gm-Message-State: AOJu0YwZpMHrsyoSXw7RVI/IPlaGGpAXuBbnOXb+HV5uYegq4sJDJwCV 0O4ud46qTAfRBU2XhnW01nTUddlhua/f7ujAAIbwERwlY7Xo5TKMOFJA1EzRzBDUfYpLu8DTTdM ERzqv+btuKFkZzkjpI+5bLm7WoA== X-Received: from pgkk190.prod.google.com ([2002:a63:24c7:0:b0:c74:0:159]) (user=ackerleytng job=prod-delivery.src-stubby-dispatcher) by 2002:a17:90a:d814:b0:35c:2c52:36fd with SMTP id 98e67ed59e1d1-35c2c52382fmr821726a91.6.1774563903368; Thu, 26 Mar 2026 15:25:03 -0700 (PDT) Date: Thu, 26 Mar 2026 15:24:28 -0700 In-Reply-To: <20260326-gmem-inplace-conversion-v4-0-e202fe950ffd@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20260326-gmem-inplace-conversion-v4-0-e202fe950ffd@google.com> X-Developer-Key: i=ackerleytng@google.com; a=ed25519; pk=sAZDYXdm6Iz8FHitpHeFlCMXwabodTm7p8/3/8xUxuU= X-Developer-Signature: v=1; a=ed25519-sha256; t=1774563861; l=5219; i=ackerleytng@google.com; s=20260225; h=from:subject:message-id; bh=dxbgvaJqRZzv2vGZ9u5pjomGspaIbZaRbW4aKAljf7k=; b=wV0d4J61F+88MMmUOEj8SB8tpW2u2ELih6nXIkge/TuEF4oY1ccRCo7VZ9HK9VqJJRu358hu/ 9pcZhQytEw+C/MBAPE/saZD1ovxLtloKGpZJ2GX1KLWmd0vnkFDA9wg X-Mailer: b4 0.14.3 Message-ID: <20260326-gmem-inplace-conversion-v4-19-e202fe950ffd@google.com> Subject: [PATCH RFC v4 19/44] KVM: selftests: Rename guest_memfd{,_offset} to gmem_{fd,offset} From: Ackerley Tng To: aik@amd.com, andrew.jones@linux.dev, binbin.wu@linux.intel.com, brauner@kernel.org, chao.p.peng@linux.intel.com, david@kernel.org, ira.weiny@intel.com, jmattson@google.com, jroedel@suse.de, 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, tabba@google.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, 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 , Baoquan He , Barry Song , Axel Rasmussen , Yuanchu Xie , Wei Xu , Jason Gunthorpe , Vlastimil Babka Cc: 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, Ackerley Tng Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable From: Sean Christopherson Rename local variables and function parameters for the guest memory file descriptor and its offset to use a "gmem_" prefix instead of "guest_memfd_". No functional change intended. Signed-off-by: Sean Christopherson --- tools/testing/selftests/kvm/include/kvm_util.h | 6 +++--- tools/testing/selftests/kvm/lib/kvm_util.c | 26 +++++++++++++---------= ---- 2 files changed, 16 insertions(+), 16 deletions(-) diff --git a/tools/testing/selftests/kvm/include/kvm_util.h b/tools/testing= /selftests/kvm/include/kvm_util.h index 8b39cb919f4fc..b2d35824f2a72 100644 --- a/tools/testing/selftests/kvm/include/kvm_util.h +++ b/tools/testing/selftests/kvm/include/kvm_util.h @@ -690,10 +690,10 @@ int __vm_set_user_memory_region(struct kvm_vm *vm, ui= nt32_t slot, uint32_t flags uint64_t gpa, uint64_t size, void *hva); void vm_set_user_memory_region2(struct kvm_vm *vm, uint32_t slot, uint32_t= flags, uint64_t gpa, uint64_t size, void *hva, - uint32_t guest_memfd, uint64_t guest_memfd_offset); + uint32_t gmem_fd, uint64_t gmem_offset); int __vm_set_user_memory_region2(struct kvm_vm *vm, uint32_t slot, uint32_= t flags, uint64_t gpa, uint64_t size, void *hva, - uint32_t guest_memfd, uint64_t guest_memfd_offset); + uint32_t gmem_fd, uint64_t gmem_offset); =20 void vm_userspace_mem_region_add(struct kvm_vm *vm, enum vm_mem_backing_src_type src_type, @@ -701,7 +701,7 @@ void vm_userspace_mem_region_add(struct kvm_vm *vm, uint32_t flags); void vm_mem_add(struct kvm_vm *vm, enum vm_mem_backing_src_type src_type, uint64_t gpa, uint32_t slot, uint64_t npages, uint32_t flags, - int guest_memfd_fd, uint64_t guest_memfd_offset); + int gmem_fd, uint64_t gmem_offset); =20 #ifndef vm_arch_has_protected_memory static inline bool vm_arch_has_protected_memory(struct kvm_vm *vm) diff --git a/tools/testing/selftests/kvm/lib/kvm_util.c b/tools/testing/sel= ftests/kvm/lib/kvm_util.c index 610cb32ff207e..3b64fbadcd88d 100644 --- a/tools/testing/selftests/kvm/lib/kvm_util.c +++ b/tools/testing/selftests/kvm/lib/kvm_util.c @@ -947,7 +947,7 @@ void vm_set_user_memory_region(struct kvm_vm *vm, uint3= 2_t slot, uint32_t flags, =20 int __vm_set_user_memory_region2(struct kvm_vm *vm, uint32_t slot, uint32_= t flags, uint64_t gpa, uint64_t size, void *hva, - uint32_t guest_memfd, uint64_t guest_memfd_offset) + uint32_t gmem_fd, uint64_t gmem_offset) { struct kvm_userspace_memory_region2 region =3D { .slot =3D slot, @@ -955,8 +955,8 @@ int __vm_set_user_memory_region2(struct kvm_vm *vm, uin= t32_t slot, uint32_t flag .guest_phys_addr =3D gpa, .memory_size =3D size, .userspace_addr =3D (uintptr_t)hva, - .guest_memfd =3D guest_memfd, - .guest_memfd_offset =3D guest_memfd_offset, + .guest_memfd =3D gmem_fd, + .guest_memfd_offset =3D gmem_offset, }; =20 TEST_REQUIRE_SET_USER_MEMORY_REGION2(); @@ -966,10 +966,10 @@ int __vm_set_user_memory_region2(struct kvm_vm *vm, u= int32_t slot, uint32_t flag =20 void vm_set_user_memory_region2(struct kvm_vm *vm, uint32_t slot, uint32_t= flags, uint64_t gpa, uint64_t size, void *hva, - uint32_t guest_memfd, uint64_t guest_memfd_offset) + uint32_t gmem_fd, uint64_t gmem_offset) { int ret =3D __vm_set_user_memory_region2(vm, slot, flags, gpa, size, hva, - guest_memfd, guest_memfd_offset); + gmem_fd, gmem_offset); =20 TEST_ASSERT(!ret, "KVM_SET_USER_MEMORY_REGION2 failed, errno =3D %d (%s)", errno, strerror(errno)); @@ -979,7 +979,7 @@ void vm_set_user_memory_region2(struct kvm_vm *vm, uint= 32_t slot, uint32_t flags /* FIXME: This thing needs to be ripped apart and rewritten. */ void vm_mem_add(struct kvm_vm *vm, enum vm_mem_backing_src_type src_type, uint64_t gpa, uint32_t slot, uint64_t npages, uint32_t flags, - int guest_memfd, uint64_t guest_memfd_offset) + int gmem_fd, uint64_t gmem_offset) { int ret; struct userspace_mem_region *region; @@ -1062,12 +1062,12 @@ void vm_mem_add(struct kvm_vm *vm, enum vm_mem_back= ing_src_type src_type, region->mmap_size +=3D alignment; =20 if (flags & KVM_MEM_GUEST_MEMFD) { - if (guest_memfd < 0) { - uint32_t guest_memfd_flags =3D 0; + if (gmem_fd < 0) { + uint32_t gmem_flags =3D 0; =20 - TEST_ASSERT(!guest_memfd_offset, + TEST_ASSERT(!gmem_offset, "Offset must be zero when creating new guest_memfd"); - guest_memfd =3D vm_create_guest_memfd(vm, mem_size, guest_memfd_flags); + gmem_fd =3D vm_create_guest_memfd(vm, mem_size, gmem_flags); } else { /* * Install a unique fd for each memslot so that the fd @@ -1075,11 +1075,11 @@ void vm_mem_add(struct kvm_vm *vm, enum vm_mem_back= ing_src_type src_type, * needing to track if the fd is owned by the framework * or by the caller. */ - guest_memfd =3D kvm_dup(guest_memfd); + gmem_fd =3D kvm_dup(gmem_fd); } =20 - region->region.guest_memfd =3D guest_memfd; - region->region.guest_memfd_offset =3D guest_memfd_offset; + region->region.guest_memfd =3D gmem_fd; + region->region.guest_memfd_offset =3D gmem_offset; } else { region->region.guest_memfd =3D -1; } --=20 2.53.0.1018.g2bb0e51243-goog From nobody Thu Apr 2 09:33:37 2026 Received: from mail-pl1-f201.google.com (mail-pl1-f201.google.com [209.85.214.201]) (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 42E093939AB for ; Thu, 26 Mar 2026 22:25:06 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1774563907; cv=none; b=aQg5IqlebyJd1B9vDYmYh/2+QH2AQM6eclroD452R65BRcFWozJhuRRGKdcUhyBPRBSiCzD7Sc33uuuzyLJ/E06Tcus1+JDSQdTTPqUK/MQe4otXB1gOSRFxRDWoc5+aQPYjGJMqba5Zjx/uCkBS51YOq5JokGKK7ss8j4qyt6M= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1774563907; c=relaxed/simple; bh=lV6fFCVa5Ssv2nfU9VT8o7Ba92Z0xl34eyZmNTzM1LQ=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=JBBr5f6a5+MVVF7AYSjQrJMx3ew64Z+xUCJCBh19i1C1Y88s7zvbvrCTXtRs9AlC+zvcuQ/4yZ82jmVDzwmLKgOYPj613aSlGIuDgQDDEMI3cpazI4K/wWpVm5JSiezcK64l1Z0fNoXY596iw0TFLIbxeuI80UvFTUPmEnyqeqY= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com; spf=pass smtp.mailfrom=flex--ackerleytng.bounces.google.com; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b=X7Ck2tL9; arc=none smtp.client-ip=209.85.214.201 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=flex--ackerleytng.bounces.google.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="X7Ck2tL9" Received: by mail-pl1-f201.google.com with SMTP id d9443c01a7336-2b0c0d064aaso11242485ad.0 for ; Thu, 26 Mar 2026 15:25:06 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20251104; t=1774563906; x=1775168706; darn=vger.kernel.org; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:from:to:cc:subject:date:message-id:reply-to; bh=WEpiZ3Ie+u8cFKZvwOJ8qoXWS/RraT/cFEJPQll04wM=; b=X7Ck2tL9CIRdZJcvS2cfTNT5TdkzrEHAbPoU+UskZCPmsCOF9GSDsEgqHsKvbenByc d8TqnkI4pZtKvSgzljm8WHZJjSaWmxoZFkGQDtnftSiQ5RIHOps0EViO4/g5bqbk13Iy s53tr1LbW/nGmft1qcgkqHGd2Sf9pE4LkKA1yF7WYIYda4nuugVQx1FFJLC17J/3ITMv fpbxLcXAnhekhDpJ28BvOTpmmMcGrbfJteKg4e9/v7C+PcgXF0icRhByLjQIhZIxE/Xf EedJFpETjVrkqdfsnAT8PHBZP/N9b118lNc3rdSHHWWGN9fL6LWmasXeEpKCtnZyjrdq Tsaw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1774563906; x=1775168706; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=WEpiZ3Ie+u8cFKZvwOJ8qoXWS/RraT/cFEJPQll04wM=; b=WAB3eAzxfQdRI7YoI//aZo9HfIAj6RX0rHlretQIV0IiSXc09MszWisKmoZ8cfK9mn VmRD40lb0pbfs3ZfQJk19w/x2+XWGK5ILZTacx/8vtF5SDPKuBQwJWkh/oM3EI1LhSjM 1tK4csbJvVdUx7mkFTgaGF2OuqaPf7egyzAgZMcOnRs+3K7vdXP8dFY6vaSClJsD48WQ pclP7k6frx4WBGAnxwZFZIrvSmyJ9Hlloloyku4rmiRNA4DMNQwhtQCKYxn3GA5A64Ph xHmIMnVtRHB3u4+7Y536NEw4FGBIxlqDasLYBRZ4e7sfDQ7xzClXTxyFQHHDYtE+gx+L vDtw== X-Forwarded-Encrypted: i=1; AJvYcCXb4JYtgaGx23aPxIajgF05ws1jau6dQmWHbkGORamakMxCtiqybLawre/8r2iB8ZLWR030T00EaunKqRs=@vger.kernel.org X-Gm-Message-State: AOJu0Yz6/t2OYlI9C+t2CHFL+DmrnhB2KTRk00xCPFOnRkmIK2e3V2oC mjl88W0WbJqjy1oqBk5kDrpoO9xxYN+JUDIUwRbTfa5YA33zMb8mvixjko1jXGUz9Q8H094bwuq MgSkHeABizyB74jEzl9xhw4lclA== X-Received: from plco20.prod.google.com ([2002:a17:902:e294:b0:29f:25cf:e576]) (user=ackerleytng job=prod-delivery.src-stubby-dispatcher) by 2002:a17:903:40cf:b0:2b0:9a6f:cbb with SMTP id d9443c01a7336-2b0cdcb0c85mr2171345ad.26.1774563905367; Thu, 26 Mar 2026 15:25:05 -0700 (PDT) Date: Thu, 26 Mar 2026 15:24:29 -0700 In-Reply-To: <20260326-gmem-inplace-conversion-v4-0-e202fe950ffd@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20260326-gmem-inplace-conversion-v4-0-e202fe950ffd@google.com> X-Developer-Key: i=ackerleytng@google.com; a=ed25519; pk=sAZDYXdm6Iz8FHitpHeFlCMXwabodTm7p8/3/8xUxuU= X-Developer-Signature: v=1; a=ed25519-sha256; t=1774563861; l=5500; i=ackerleytng@google.com; s=20260225; h=from:subject:message-id; bh=3vNAWgtLoposophLWrViaHYvvOXZ6Fk6ckKHKISBIQw=; b=5ZW/84CSiLisXbfe1r14r83e3Hy3AoEnZdshNnLemzJjOMY2dPsrs925RHSHU1mSj258Dyyz5 VMpW+WjIPY4DZdPwGAgjCBX703FNh7usPXzDd1fpjoEGG2Zj0tLFl/f X-Mailer: b4 0.14.3 Message-ID: <20260326-gmem-inplace-conversion-v4-20-e202fe950ffd@google.com> Subject: [PATCH RFC v4 20/44] KVM: selftests: Add support for mmap() on guest_memfd in core library From: Ackerley Tng To: aik@amd.com, andrew.jones@linux.dev, binbin.wu@linux.intel.com, brauner@kernel.org, chao.p.peng@linux.intel.com, david@kernel.org, ira.weiny@intel.com, jmattson@google.com, jroedel@suse.de, 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, tabba@google.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, 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 , Baoquan He , Barry Song , Axel Rasmussen , Yuanchu Xie , Wei Xu , Jason Gunthorpe , Vlastimil Babka Cc: 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, Ackerley Tng Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable From: Sean Christopherson Accept gmem_flags in vm_mem_add() to be able to create a guest_memfd within vm_mem_add(). When vm_mem_add() is used to set up a guest_memfd for a memslot, set up the provided (or created) gmem_fd as the fd for the user memory region. This makes it available to be mmap()-ed from just like fds from other memory sources. mmap() from guest_memfd using the provided gmem_flags and gmem_offset. Add a kvm_slot_to_fd() helper to provide convenient access to the file descriptor of a memslot. Update existing callers of vm_mem_add() to pass 0 for gmem_flags to preserve existing behavior. Signed-off-by: Sean Christopherson [For guest_memfds, mmap() using gmem_offset instead of 0 all the time.] Signed-off-by: Ackerley Tng --- tools/testing/selftests/kvm/include/kvm_util.h | 7 ++++++- tools/testing/selftests/kvm/lib/kvm_util.c | 19 +++++++++++----= ---- .../selftests/kvm/x86/private_mem_conversions_test.c | 2 +- 3 files changed, 18 insertions(+), 10 deletions(-) diff --git a/tools/testing/selftests/kvm/include/kvm_util.h b/tools/testing= /selftests/kvm/include/kvm_util.h index b2d35824f2a72..4e06724cd2935 100644 --- a/tools/testing/selftests/kvm/include/kvm_util.h +++ b/tools/testing/selftests/kvm/include/kvm_util.h @@ -701,7 +701,7 @@ void vm_userspace_mem_region_add(struct kvm_vm *vm, uint32_t flags); void vm_mem_add(struct kvm_vm *vm, enum vm_mem_backing_src_type src_type, uint64_t gpa, uint32_t slot, uint64_t npages, uint32_t flags, - int gmem_fd, uint64_t gmem_offset); + int gmem_fd, uint64_t gmem_offset, uint64_t gmem_flags); =20 #ifndef vm_arch_has_protected_memory static inline bool vm_arch_has_protected_memory(struct kvm_vm *vm) @@ -735,6 +735,11 @@ void *addr_gva2hva(struct kvm_vm *vm, vm_vaddr_t gva); vm_paddr_t addr_hva2gpa(struct kvm_vm *vm, void *hva); void *addr_gpa2alias(struct kvm_vm *vm, vm_paddr_t gpa); =20 +static inline int kvm_slot_to_fd(struct kvm_vm *vm, uint32_t slot) +{ + return memslot2region(vm, slot)->fd; +} + #ifndef vcpu_arch_put_guest #define vcpu_arch_put_guest(mem, val) do { (mem) =3D (val); } while (0) #endif diff --git a/tools/testing/selftests/kvm/lib/kvm_util.c b/tools/testing/sel= ftests/kvm/lib/kvm_util.c index 3b64fbadcd88d..82d6945efa29a 100644 --- a/tools/testing/selftests/kvm/lib/kvm_util.c +++ b/tools/testing/selftests/kvm/lib/kvm_util.c @@ -979,12 +979,13 @@ void vm_set_user_memory_region2(struct kvm_vm *vm, ui= nt32_t slot, uint32_t flags /* FIXME: This thing needs to be ripped apart and rewritten. */ void vm_mem_add(struct kvm_vm *vm, enum vm_mem_backing_src_type src_type, uint64_t gpa, uint32_t slot, uint64_t npages, uint32_t flags, - int gmem_fd, uint64_t gmem_offset) + int gmem_fd, uint64_t gmem_offset, uint64_t gmem_flags) { int ret; struct userspace_mem_region *region; size_t backing_src_pagesz =3D get_backing_src_pagesz(src_type); size_t mem_size =3D npages * vm->page_size; + off_t mmap_offset =3D 0; size_t alignment; =20 TEST_REQUIRE_SET_USER_MEMORY_REGION2(); @@ -1063,8 +1064,6 @@ void vm_mem_add(struct kvm_vm *vm, enum vm_mem_backin= g_src_type src_type, =20 if (flags & KVM_MEM_GUEST_MEMFD) { if (gmem_fd < 0) { - uint32_t gmem_flags =3D 0; - TEST_ASSERT(!gmem_offset, "Offset must be zero when creating new guest_memfd"); gmem_fd =3D vm_create_guest_memfd(vm, mem_size, gmem_flags); @@ -1085,13 +1084,17 @@ void vm_mem_add(struct kvm_vm *vm, enum vm_mem_back= ing_src_type src_type, } =20 region->fd =3D -1; - if (backing_src_is_shared(src_type)) + if (flags & KVM_MEM_GUEST_MEMFD && gmem_flags & GUEST_MEMFD_FLAG_MMAP) { + region->fd =3D kvm_dup(gmem_fd); + mmap_offset =3D gmem_offset; + } else if (backing_src_is_shared(src_type)) { region->fd =3D kvm_memfd_alloc(region->mmap_size, src_type =3D=3D VM_MEM_SRC_SHARED_HUGETLB); + } =20 - region->mmap_start =3D kvm_mmap(region->mmap_size, PROT_READ | PROT_WRITE, - vm_mem_backing_src_alias(src_type)->flag, - region->fd); + region->mmap_start =3D __kvm_mmap(region->mmap_size, PROT_READ | PROT_WRI= TE, + vm_mem_backing_src_alias(src_type)->flag, + region->fd, mmap_offset); =20 TEST_ASSERT(!is_backing_src_hugetlb(src_type) || region->mmap_start =3D=3D align_ptr_up(region->mmap_start, backing_s= rc_pagesz), @@ -1152,7 +1155,7 @@ void vm_userspace_mem_region_add(struct kvm_vm *vm, uint64_t gpa, uint32_t slot, uint64_t npages, uint32_t flags) { - vm_mem_add(vm, src_type, gpa, slot, npages, flags, -1, 0); + vm_mem_add(vm, src_type, gpa, slot, npages, flags, -1, 0, 0); } =20 /* diff --git a/tools/testing/selftests/kvm/x86/private_mem_conversions_test.c= b/tools/testing/selftests/kvm/x86/private_mem_conversions_test.c index 1969f4ab9b280..41f6b38f04071 100644 --- a/tools/testing/selftests/kvm/x86/private_mem_conversions_test.c +++ b/tools/testing/selftests/kvm/x86/private_mem_conversions_test.c @@ -399,7 +399,7 @@ static void test_mem_conversions(enum vm_mem_backing_sr= c_type src_type, uint32_t for (i =3D 0; i < nr_memslots; i++) vm_mem_add(vm, src_type, BASE_DATA_GPA + slot_size * i, BASE_DATA_SLOT + i, slot_size / vm->page_size, - KVM_MEM_GUEST_MEMFD, memfd, slot_size * i); + KVM_MEM_GUEST_MEMFD, memfd, slot_size * i, 0); =20 for (i =3D 0; i < nr_vcpus; i++) { uint64_t gpa =3D BASE_DATA_GPA + i * per_cpu_size; --=20 2.53.0.1018.g2bb0e51243-goog From nobody Thu Apr 2 09:33:37 2026 Received: from mail-pj1-f74.google.com (mail-pj1-f74.google.com [209.85.216.74]) (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 9C29439448D for ; Thu, 26 Mar 2026 22:25:08 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.216.74 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1774563910; cv=none; b=JLVh/IleGPhgjxMZJ50DnUsOhnuoyVNg3blbwcxDYJBVcY1zo7t23X/MMt1Ylvfpz/ObgeN/lNpyyl5CCBZ8whuqBuTzp8nYiFnbgpVqqh4KUoUUNE5LhqxPknhbs07mZA7Q2PVnDGLFHQ2s1EI+WiSjUk/kRomYTAF69po56K8= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1774563910; c=relaxed/simple; bh=Xyl14WuQ359smVDmZU9FmOAAAQ4mehFnzmF6UoKVLNY=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=H6gHSr9FHeX+yZLddXSmdCf4HY2bElqi5Tvltsg4jukc9ncoKVVDEoFUqixw1WQ22t8Qsg3bIEFCEonsU3+oID7ESMolkLP/itl3Y8+vsM0Lsjl/BB4jqxBoF+NbWii9sQRXrsXrEQbcRAg1D21r05AHVjEzGltPifVQPfCO/N8= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com; spf=pass smtp.mailfrom=flex--ackerleytng.bounces.google.com; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b=Cvpjw1YZ; arc=none smtp.client-ip=209.85.216.74 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=flex--ackerleytng.bounces.google.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="Cvpjw1YZ" Received: by mail-pj1-f74.google.com with SMTP id 98e67ed59e1d1-358e425c261so1830494a91.3 for ; Thu, 26 Mar 2026 15:25:08 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20251104; t=1774563908; x=1775168708; darn=vger.kernel.org; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:from:to:cc:subject:date:message-id:reply-to; bh=owzrYdfkye/YERaKc5lVrVSnV0ZRCiFrjdhCMOA3vqA=; b=Cvpjw1YZl9AERnW441AjE0+DXH85VfDZrcb+iQYGzFXzmC5qXe5TCuvyUTuetc8nSv o/7SQXPm0qzNfCAGuTInyPNa93GUU6RuZ9bENo5AvgX5/RIK5OGoL1Jy+ELTF3UZ0V97 mYjYXyj/hQ+jGG85weSv395Xjn3+NqCVINldAxldadk07XAae8MqAMsW36ByLe4pPlIk lBxXhQZouXul8cE9zmrVbZ9KjlyzgrCunsct35S490gex6IofDmuUwhkDnfStrLLAUHc jpYkPnV6nwaZmiF1vebbYfkZcwVU98X3+WhMdfStJoZPRKVAQC+ffHdFA58S2I5n1Sbb E6FQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1774563908; x=1775168708; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=owzrYdfkye/YERaKc5lVrVSnV0ZRCiFrjdhCMOA3vqA=; b=kKt6KlBIFAQoQx9NDL8Iym0Lt2YAjiT3QHnkYwdY9kUraS8Mn1ne6V0/FBHp+l2QIx La8XwzpvvCn+PuBgn9zz+LsW/CykutVv6u4Zw58o5k7HCXN6jPoOG1d+rCrtXSHqfh/9 vFGv199M4M5dtAL0yNTxapsFnCEMT81mnUwsbpDVEU9sudxB0B6GQjKmuBd/4mmmqTUq aApuacxeyFwTZALLZLnV+GAa9DmINKcrUviEG7AepslvKxjhQ4hWWQ6LWWmjIHdKb4hK D0/aIMCtpi3eCfGgyqf++3n/8TaYvUQm+OfqSu2N8oA4yzn9SuAmCXLgqszG8eHqvyv3 4nMg== X-Forwarded-Encrypted: i=1; AJvYcCWag0ggcLp3yOXVydAlOlOUnrhYz/f31fgkbjKRglqn8GytzuZrotLMb74MFN9S60u7PPkbX1KCddyXp4I=@vger.kernel.org X-Gm-Message-State: AOJu0YztAqXYtr55WDF702DxPpmxzv/ORb90ZRWP3S0IkR01Ax++sZ/+ mne7+GCvxhrZV68mjagQP9TzT1z4XqFSY/NidfCHRwRBE4a7PvYaXTQmUTVXrlJF2BlXpTuifSs CPS2vqtELBa1XKKQNWHH6WI2MCw== X-Received: from pjbil12.prod.google.com ([2002:a17:90b:164c:b0:35b:9d0e:7821]) (user=ackerleytng job=prod-delivery.src-stubby-dispatcher) by 2002:a17:90b:17cd:b0:35b:e594:503a with SMTP id 98e67ed59e1d1-35c2ffd0ebbmr200447a91.9.1774563907528; Thu, 26 Mar 2026 15:25:07 -0700 (PDT) Date: Thu, 26 Mar 2026 15:24:30 -0700 In-Reply-To: <20260326-gmem-inplace-conversion-v4-0-e202fe950ffd@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20260326-gmem-inplace-conversion-v4-0-e202fe950ffd@google.com> X-Developer-Key: i=ackerleytng@google.com; a=ed25519; pk=sAZDYXdm6Iz8FHitpHeFlCMXwabodTm7p8/3/8xUxuU= X-Developer-Signature: v=1; a=ed25519-sha256; t=1774563861; l=2424; i=ackerleytng@google.com; s=20260225; h=from:subject:message-id; bh=SPrXtBzhAZ8kM/S0wIFvUys1KOsEIn60uKsPIVirly4=; b=Pb2Ke7FYWhiSBLICKGMsXf4XmOQ7g9IKaopuyp04/7PZlASOeNyYFutPu026ZSgYzfo3iSfAk 84jt/X+M0iCCjjNze4tzM8Q5uhhhTW0IjXQ1s4Nh16h/Gz+oHiW+LZG X-Mailer: b4 0.14.3 Message-ID: <20260326-gmem-inplace-conversion-v4-21-e202fe950ffd@google.com> Subject: [PATCH RFC v4 21/44] KVM: selftests: Add selftests global for guest memory attributes capability From: Ackerley Tng To: aik@amd.com, andrew.jones@linux.dev, binbin.wu@linux.intel.com, brauner@kernel.org, chao.p.peng@linux.intel.com, david@kernel.org, ira.weiny@intel.com, jmattson@google.com, jroedel@suse.de, 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, tabba@google.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, 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 , Baoquan He , Barry Song , Axel Rasmussen , Yuanchu Xie , Wei Xu , Jason Gunthorpe , Vlastimil Babka Cc: 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, Ackerley Tng Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable From: Sean Christopherson Add a global variable, kvm_has_gmem_attributes, to make the result of checking for KVM_CAP_GUEST_MEMFD_MEMORY_ATTRIBUTES available to all tests. kvm_has_gmem_attributes is true if guest_memfd tracks memory attributes, as opposed to VM-level tracking. This global variable is synced to the guest for testing convenience, to avoid introducing subtle bugs when host/guest state is desynced. Signed-off-by: Sean Christopherson Signed-off-by: Ackerley Tng --- tools/testing/selftests/kvm/include/test_util.h | 2 ++ tools/testing/selftests/kvm/lib/kvm_util.c | 5 +++++ 2 files changed, 7 insertions(+) diff --git a/tools/testing/selftests/kvm/include/test_util.h b/tools/testin= g/selftests/kvm/include/test_util.h index b4872ba8ed124..2871a42928471 100644 --- a/tools/testing/selftests/kvm/include/test_util.h +++ b/tools/testing/selftests/kvm/include/test_util.h @@ -113,6 +113,8 @@ struct guest_random_state { extern uint32_t guest_random_seed; extern struct guest_random_state guest_rng; =20 +extern bool kvm_has_gmem_attributes; + struct guest_random_state new_guest_random_state(uint32_t seed); uint32_t guest_random_u32(struct guest_random_state *state); =20 diff --git a/tools/testing/selftests/kvm/lib/kvm_util.c b/tools/testing/sel= ftests/kvm/lib/kvm_util.c index 82d6945efa29a..404efb5318f09 100644 --- a/tools/testing/selftests/kvm/lib/kvm_util.c +++ b/tools/testing/selftests/kvm/lib/kvm_util.c @@ -24,6 +24,8 @@ uint32_t guest_random_seed; struct guest_random_state guest_rng; static uint32_t last_guest_seed; =20 +bool kvm_has_gmem_attributes; + static size_t vcpu_mmap_sz(void); =20 int __open_path_or_exit(const char *path, int flags, const char *enoent_he= lp) @@ -521,6 +523,7 @@ struct kvm_vm *__vm_create(struct vm_shape shape, uint3= 2_t nr_runnable_vcpus, } guest_rng =3D new_guest_random_state(guest_random_seed); sync_global_to_guest(vm, guest_rng); + sync_global_to_guest(vm, kvm_has_gmem_attributes); =20 kvm_arch_vm_post_create(vm, nr_runnable_vcpus); =20 @@ -2365,6 +2368,8 @@ void __attribute((constructor)) kvm_selftest_init(voi= d) guest_random_seed =3D last_guest_seed =3D random(); pr_info("Random seed: 0x%x\n", guest_random_seed); =20 + kvm_has_gmem_attributes =3D kvm_has_cap(KVM_CAP_GUEST_MEMFD_MEMORY_ATTRIB= UTES); + kvm_selftest_arch_init(); } =20 --=20 2.53.0.1018.g2bb0e51243-goog From nobody Thu Apr 2 09:33:37 2026 Received: from mail-pg1-f202.google.com (mail-pg1-f202.google.com [209.85.215.202]) (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 737F8348477 for ; Thu, 26 Mar 2026 22:25:10 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.215.202 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1774563911; cv=none; b=qR2hP4M7Avq+ds0XAFA4KaRHBqumE3NEDt0Oz6lOYUedI+grQmcrsxUcsivz3QBfAzVAYrhi+0qiTpNlXTIkwj6esW9n5zvi/4D2JpiPhiYKNXYlYjxg+PFdoEApqUJpnJ9ZLh5ZKAO5PI7Bdhwz0RKdS0Dle5mkS57zvylIG8w= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1774563911; c=relaxed/simple; bh=keOumRETk/gmfETxrp2mpR7R5rvo3p/7A7+F96j8jbs=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=h7UJNY4ZBnn0P5FdPakcIkFBmaCEDjAetYHSYIsT0P0K/tuf/G9RSWdzsTj9/mFn9KiSOm2XgcIoMwOTWsMNPKn8e270rI+wP4ZXdf+1sEPTKivFybNqpQK/p3990uJ1bMTXc+HEsR81EHlRUOlfCqLvbB5w2DncPe8P+OkX5GQ= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com; spf=pass smtp.mailfrom=flex--ackerleytng.bounces.google.com; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b=EjvRVFiT; arc=none smtp.client-ip=209.85.215.202 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=flex--ackerleytng.bounces.google.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="EjvRVFiT" Received: by mail-pg1-f202.google.com with SMTP id 41be03b00d2f7-c70f19f0f37so863705a12.0 for ; Thu, 26 Mar 2026 15:25:10 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20251104; t=1774563910; x=1775168710; darn=vger.kernel.org; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:from:to:cc:subject:date:message-id:reply-to; bh=BKAErh/ctHw4bBFHVNVYhm/xs3KUEiqQAb+NxvlWO48=; b=EjvRVFiTsNPRfXEZqaHCXV2rLd1aDQ3il6HJCo+vVig/NdGpkgIoQZFxzdYVRUmsAc pS7LDDT/ERhVBuzS8wfYGaMFkTq8P+VfnpiBi+v1qpSmTNSkq1wzhdTeG9ARHUL4Oxq5 3s9hlSj4hzcQiO3y+cmfYc8OLrewbYVYHqeWVd4RSJ0IXXyJbN0J0XVgGHgojDBoqW+A 6hvQxy2uSeWaKu0vT/CiZdHggdMBUl6TIBUKKyyX58DN62/7veyHCridj2xD5wu7qXCI RDBqY5YmJ0jH+ymueQYV5mY/X+/ewia6d81fY/9moEA5TE6W9/3dJfivob8hzZIXvlj1 C4GQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1774563910; x=1775168710; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=BKAErh/ctHw4bBFHVNVYhm/xs3KUEiqQAb+NxvlWO48=; b=Uhxp3ERwC11bBgWiXFXwGNVt94Sf6eJjcrf8k0h0Q6B1U+b6i68geT7+mqg1GIyyte YaN2XEw3SqmY3DLP4NUc5/Rco2bnZhIPHJE4Fg2TeHMq6WEhM8Ay+w6S7asjF+gcmGwA Y4J7/GeD1ceyF/aXN9f05VZeXScWpS9XVg0LRPETH7QRuuA3LgHmPXfNxs/XqVKWj6Xv 3uFsBTxgp8wHl7fqj/dJnIDKUYwklcWdz0GTRtEdZYFpsPvhZ/pfNudvyKyf/NRBYmer D7bVHYVMGzsoN4wsCab7daP8P54GqXX0pciyoH21A1a7BkxUz8p/Fc9WD+HUzRALD7XD jNlA== X-Forwarded-Encrypted: i=1; AJvYcCU+qR1mAsZR1/xv46zSUweLHSj1cEe+o8onFKwGuNHSHLYcDU7SovhjucCjXC1Iil0J27ubz0KDU4YbgSY=@vger.kernel.org X-Gm-Message-State: AOJu0YxJbodg6UZn2dmCuzY9k5nZgh5qotBXITiXVTCWAThVJ+9RKSDV op/4jFXE1ufavCv0z0jCHIBND3taX+Xp4WVCFEQr6Cyvbi1Hb7YpPXRDP88lRy2RXTw37t9hqZS kLa4LQbe3sYG082Hc10hI5B0wJg== X-Received: from pfvf6.prod.google.com ([2002:a05:6a00:1ac6:b0:82c:63f8:59dd]) (user=ackerleytng job=prod-delivery.src-stubby-dispatcher) by 2002:a05:6a00:1bcd:b0:829:7b30:92f4 with SMTP id d2e1a72fcca58-82c9696ee44mr32265b3a.16.1774563909447; Thu, 26 Mar 2026 15:25:09 -0700 (PDT) Date: Thu, 26 Mar 2026 15:24:31 -0700 In-Reply-To: <20260326-gmem-inplace-conversion-v4-0-e202fe950ffd@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20260326-gmem-inplace-conversion-v4-0-e202fe950ffd@google.com> X-Developer-Key: i=ackerleytng@google.com; a=ed25519; pk=sAZDYXdm6Iz8FHitpHeFlCMXwabodTm7p8/3/8xUxuU= X-Developer-Signature: v=1; a=ed25519-sha256; t=1774563861; l=1678; i=ackerleytng@google.com; s=20260225; h=from:subject:message-id; bh=keOumRETk/gmfETxrp2mpR7R5rvo3p/7A7+F96j8jbs=; b=NE1rni1CgJtrAphsc7U2X9T0bOxF0e+UOsyULzNujOmZouX64/8+6HJYWpj4MdSaexkYeIq1A gHippqmvpB1CC16FucD2+hckjbybeObuIuqg4FlEecf9ENkHDM8/f5e X-Mailer: b4 0.14.3 Message-ID: <20260326-gmem-inplace-conversion-v4-22-e202fe950ffd@google.com> Subject: [PATCH RFC v4 22/44] KVM: selftests: Update framework to use KVM_SET_MEMORY_ATTRIBUTES2 From: Ackerley Tng To: aik@amd.com, andrew.jones@linux.dev, binbin.wu@linux.intel.com, brauner@kernel.org, chao.p.peng@linux.intel.com, david@kernel.org, ira.weiny@intel.com, jmattson@google.com, jroedel@suse.de, 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, tabba@google.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, 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 , Baoquan He , Barry Song , Axel Rasmussen , Yuanchu Xie , Wei Xu , Jason Gunthorpe , Vlastimil Babka Cc: 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, Ackerley Tng Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Update KVM selftest framework to use KVM_SET_MEMORY_ATTRIBUTES2 and the accompanying struct kvm_memory_attributes2. Signed-off-by: Ackerley Tng --- tools/testing/selftests/kvm/include/kvm_util.h | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/tools/testing/selftests/kvm/include/kvm_util.h b/tools/testing= /selftests/kvm/include/kvm_util.h index 4e06724cd2935..1e00bfa59dcd5 100644 --- a/tools/testing/selftests/kvm/include/kvm_util.h +++ b/tools/testing/selftests/kvm/include/kvm_util.h @@ -420,7 +420,7 @@ static inline void vm_enable_cap(struct kvm_vm *vm, uin= t32_t cap, uint64_t arg0) static inline void vm_set_memory_attributes(struct kvm_vm *vm, uint64_t gp= a, uint64_t size, uint64_t attributes) { - struct kvm_memory_attributes attr =3D { + struct kvm_memory_attributes2 attr =3D { .attributes =3D attributes, .address =3D gpa, .size =3D size, @@ -428,13 +428,16 @@ static inline void vm_set_memory_attributes(struct kv= m_vm *vm, uint64_t gpa, }; =20 /* - * KVM_SET_MEMORY_ATTRIBUTES overwrites _all_ attributes. These flows + * KVM_SET_MEMORY_ATTRIBUTES2 overwrites _all_ attributes. These flows * need significant enhancements to support multiple attributes. */ TEST_ASSERT(!attributes || attributes =3D=3D KVM_MEMORY_ATTRIBUTE_PRIVATE, "Update me to support multiple attributes!"); =20 - vm_ioctl(vm, KVM_SET_MEMORY_ATTRIBUTES, &attr); + __TEST_REQUIRE(kvm_check_cap(KVM_CAP_MEMORY_ATTRIBUTES2) > 0, + "No valid attributes for VM fd ioctl!"); + + vm_ioctl(vm, KVM_SET_MEMORY_ATTRIBUTES2, &attr); } =20 =20 --=20 2.53.0.1018.g2bb0e51243-goog From nobody Thu Apr 2 09:33:37 2026 Received: from mail-pf1-f201.google.com (mail-pf1-f201.google.com [209.85.210.201]) (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 3E27F399039 for ; Thu, 26 Mar 2026 22:25:12 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.210.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1774563914; cv=none; b=soFZVuSYmbfk0Ot/5dgu/3Rd4BKPMIMelJlBCh36su3wqu17bqI38cvKd0iHJii1SUc3q4YqHj9nnZyRMRnfHW5WZV97Om7Nm6lrRdrgEcAdV/52rH3bD/muEN5vL9Gy5WwA2H7FoYOTInfoO8BdFyzY8MhnnXZvaq3tgCGyc3g= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1774563914; c=relaxed/simple; bh=yYG3YivBMJIwRv071r6L32F9EbPt+b8iDngttvXtDfE=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=aDpuCnd6JyVaMHy3nQNcHdOy+A4LvrMSMXHZHvM8AyJt3yeirc5FeA1IbSreHpgEL3gZjjAfnNeVfJUgZQiEnaeujNKHKbNIa+fT19Lf1sebpKAttElQy+Vg3IawMaR6OXyoZcw0wcr/KkR583dh4zSaRn2dSvD6USWiwHnuCuM= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com; spf=pass smtp.mailfrom=flex--ackerleytng.bounces.google.com; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b=NMlAKuvt; arc=none smtp.client-ip=209.85.210.201 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=flex--ackerleytng.bounces.google.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="NMlAKuvt" Received: by mail-pf1-f201.google.com with SMTP id d2e1a72fcca58-82c69a734a4so1188611b3a.1 for ; Thu, 26 Mar 2026 15:25:12 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20251104; t=1774563912; x=1775168712; darn=vger.kernel.org; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:from:to:cc:subject:date:message-id:reply-to; bh=iJLCurHGT9Ozv2z9SVGQ9QgPs5YFI09GMd1yNupksws=; b=NMlAKuvtpPAYUI0wjNA0cnhXmsf7+GmeGnPu6Hyf8qg9pFtdArS/7poCQNwm7WUHUt Yp6+aO1oeL4eoZNQgoeCFASSavxBFycj8GFJrnBvVpjumR9YK4GDM1FZWjZGZxrH+gqe wcodTSwwwVHJjL8o6S7m1sBk3t0NczhP3VsPHsnlnvS5bjZo9BWQF16FEi6E/qZDEGti FDujIxqVYZelZwRxfnG6iyvx9sWNDkJZACzQxP3BH98HLiA0z0zN32MNfCUXYScRMDrP SVhJYAIWkJHNMJSg+Eub3x4GCLqlcJQH/HHW8EqgVQaPN5khRDCP5CIsypDV3V9WlX1t jbIg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1774563912; x=1775168712; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=iJLCurHGT9Ozv2z9SVGQ9QgPs5YFI09GMd1yNupksws=; b=XrdjjvuIdziijlQR1vVtHsgneeUO5sDsZ/sT2maZFY6rWToCNqKpwbWYbbUAFX/UEe 8eYG7P+TPWFShT1cTqX7ECB2KrA5ip25iKZfixGcSg/dSvxdj7u+VqyJqfZs38dLic3u nlWlKd2yyygsfqLZt+Oi0EoEPmn08OCP+MkPAyRsE8HSS13qOb3YMtHl25vTHAyb5ieQ TWI4r/5nI1neUlJcHu8NeYMRP67RvXcUGdVgfmzZ3qLehpJ7q3kLjN9xpJNjze+Npf5i L0B31ZnKhqDz3uW7t4A1h0EBtcJnhVn0YNsJfGeGsd+EbXVA0Yb3055iVa1tSVHuTmNS 1KLg== X-Forwarded-Encrypted: i=1; AJvYcCV9s2pmWdlidi2QG8k6K8wvU7WQu3CPAgjQOahl9uPKqYAlF4aoD2CPgKr5lIvLHFGAZNaIDmeLPd703w8=@vger.kernel.org X-Gm-Message-State: AOJu0YyNEFCWZRNvdPl4UjusnqIkWAt5QUbSuzXF++tz+t5n3U1jPE3j uDNhPoKVjJuOvzxnKQxjbKH4AHDoHqSCdquATMRwN6WdOwrASgFqbnlE0MTuV88KZJixc30zDpi +8Kv3/d+XC3aZTuPqT8FbyWyOGA== X-Received: from pfbbe3.prod.google.com ([2002:a05:6a00:1f03:b0:824:a502:8fea]) (user=ackerleytng job=prod-delivery.src-stubby-dispatcher) by 2002:a05:6a00:ab84:b0:81f:4884:4fed with SMTP id d2e1a72fcca58-82c95d2f63dmr173790b3a.7.1774563911494; Thu, 26 Mar 2026 15:25:11 -0700 (PDT) Date: Thu, 26 Mar 2026 15:24:32 -0700 In-Reply-To: <20260326-gmem-inplace-conversion-v4-0-e202fe950ffd@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20260326-gmem-inplace-conversion-v4-0-e202fe950ffd@google.com> X-Developer-Key: i=ackerleytng@google.com; a=ed25519; pk=sAZDYXdm6Iz8FHitpHeFlCMXwabodTm7p8/3/8xUxuU= X-Developer-Signature: v=1; a=ed25519-sha256; t=1774563861; l=5492; i=ackerleytng@google.com; s=20260225; h=from:subject:message-id; bh=lS+IBAVYXwyHlv6WRF1Ol2Kaf5AEubNCdwiCGV0mlpA=; b=UaxYPJnJsXBYpB+JCRQ8jNBQhVVjBXkwA8wKaHeliaKJ/42jC2aJMtTG8w6UgKW7fyU8fJPka BfSgymmQNisA+eaG58gYT/0dNC446XTbQbd/0mLQJ3e1SiqrLkjcNug X-Mailer: b4 0.14.3 Message-ID: <20260326-gmem-inplace-conversion-v4-23-e202fe950ffd@google.com> Subject: [PATCH RFC v4 23/44] KVM: selftests: Add helpers for calling ioctls on guest_memfd From: Ackerley Tng To: aik@amd.com, andrew.jones@linux.dev, binbin.wu@linux.intel.com, brauner@kernel.org, chao.p.peng@linux.intel.com, david@kernel.org, ira.weiny@intel.com, jmattson@google.com, jroedel@suse.de, 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, tabba@google.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, 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 , Baoquan He , Barry Song , Axel Rasmussen , Yuanchu Xie , Wei Xu , Jason Gunthorpe , Vlastimil Babka Cc: 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, Ackerley Tng Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable From: Sean Christopherson Add helper functions to kvm_util.h to support calling ioctls, specifically KVM_SET_MEMORY_ATTRIBUTES2, on a guest_memfd file descriptor. Introduce gmem_ioctl() and __gmem_ioctl() macros, modeled after the existing vm_ioctl() helpers, to provide a standard way to call ioctls on a guest_memfd. Add gmem_set_memory_attributes() and its derivatives (gmem_set_private(), gmem_set_shared()) to set memory attributes on a guest_memfd region. Also provide "__" variants that return the ioctl error code instead of aborting the test. These helpers will be used by upcoming guest_memfd tests. To avoid code duplication, factor out the check for supported memory attributes into a new macro, TEST_ASSERT_SUPPORTED_ATTRIBUTES, and use it in both the existing vm_set_memory_attributes() and the new gmem_set_memory_attributes() helpers. Signed-off-by: Sean Christopherson --- tools/testing/selftests/kvm/include/kvm_util.h | 94 ++++++++++++++++++++++= ++-- 1 file changed, 87 insertions(+), 7 deletions(-) diff --git a/tools/testing/selftests/kvm/include/kvm_util.h b/tools/testing= /selftests/kvm/include/kvm_util.h index 1e00bfa59dcd5..a539a98f79e08 100644 --- a/tools/testing/selftests/kvm/include/kvm_util.h +++ b/tools/testing/selftests/kvm/include/kvm_util.h @@ -333,6 +333,16 @@ static inline bool kvm_has_cap(long cap) TEST_ASSERT(!ret, __KVM_IOCTL_ERROR(#cmd, ret)); \ }) =20 +#define __gmem_ioctl(gmem_fd, cmd, arg) \ + kvm_do_ioctl(gmem_fd, cmd, arg) + +#define gmem_ioctl(gmem_fd, cmd, arg) \ +({ \ + int ret =3D __gmem_ioctl(gmem_fd, cmd, arg); \ + \ + TEST_ASSERT(!ret, __KVM_IOCTL_ERROR(#cmd, ret)); \ +}) + static __always_inline void static_assert_is_vm(struct kvm_vm *vm) { } =20 #define __vm_ioctl(vm, cmd, arg) \ @@ -417,6 +427,14 @@ static inline void vm_enable_cap(struct kvm_vm *vm, ui= nt32_t cap, uint64_t arg0) vm_ioctl(vm, KVM_ENABLE_CAP, &enable_cap); } =20 +/* + * KVM_SET_MEMORY_ATTRIBUTES overwrites _all_ attributes. These flows need + * significant enhancements to support multiple attributes. + */ +#define TEST_ASSERT_SUPPORTED_ATTRIBUTES(attributes) \ + TEST_ASSERT(!attributes || attributes =3D=3D KVM_MEMORY_ATTRIBUTE_PRIVATE= , \ + "Update me to support multiple attributes!") + static inline void vm_set_memory_attributes(struct kvm_vm *vm, uint64_t gp= a, uint64_t size, uint64_t attributes) { @@ -427,12 +445,7 @@ static inline void vm_set_memory_attributes(struct kvm= _vm *vm, uint64_t gpa, .flags =3D 0, }; =20 - /* - * KVM_SET_MEMORY_ATTRIBUTES2 overwrites _all_ attributes. These flows - * need significant enhancements to support multiple attributes. - */ - TEST_ASSERT(!attributes || attributes =3D=3D KVM_MEMORY_ATTRIBUTE_PRIVATE, - "Update me to support multiple attributes!"); + TEST_ASSERT_SUPPORTED_ATTRIBUTES(attributes); =20 __TEST_REQUIRE(kvm_check_cap(KVM_CAP_MEMORY_ATTRIBUTES2) > 0, "No valid attributes for VM fd ioctl!"); @@ -440,7 +453,6 @@ static inline void vm_set_memory_attributes(struct kvm_= vm *vm, uint64_t gpa, vm_ioctl(vm, KVM_SET_MEMORY_ATTRIBUTES2, &attr); } =20 - static inline void vm_mem_set_private(struct kvm_vm *vm, uint64_t gpa, uint64_t size) { @@ -453,6 +465,74 @@ static inline void vm_mem_set_shared(struct kvm_vm *vm= , uint64_t gpa, vm_set_memory_attributes(vm, gpa, size, 0); } =20 +static inline int __gmem_set_memory_attributes(int fd, loff_t offset, + uint64_t size, + uint64_t attributes, + loff_t *error_offset, + u64 flags) +{ + struct kvm_memory_attributes2 attr =3D { + .attributes =3D attributes, + .offset =3D offset, + .size =3D size, + .flags =3D flags, + }; + int r; + + TEST_ASSERT_SUPPORTED_ATTRIBUTES(attributes); + + r =3D __gmem_ioctl(fd, KVM_SET_MEMORY_ATTRIBUTES2, &attr); + if (r) + *error_offset =3D attr.error_offset; + return r; +} + +static inline int __gmem_set_private(int fd, loff_t offset, uint64_t size, + loff_t *error_offset, u64 flags) +{ + return __gmem_set_memory_attributes(fd, offset, size, + KVM_MEMORY_ATTRIBUTE_PRIVATE, + error_offset, flags); +} + +static inline int __gmem_set_shared(int fd, loff_t offset, uint64_t size, + loff_t *error_offset, u64 flags) +{ + return __gmem_set_memory_attributes(fd, offset, size, 0, + error_offset, flags); +} + +static inline void gmem_set_memory_attributes(int fd, loff_t offset, + uint64_t size, + uint64_t attributes, + u64 flags) +{ + struct kvm_memory_attributes2 attr =3D { + .attributes =3D attributes, + .offset =3D offset, + .size =3D size, + .flags =3D flags, + }; + + TEST_ASSERT_SUPPORTED_ATTRIBUTES(attributes); + + __TEST_REQUIRE(kvm_check_cap(KVM_CAP_GUEST_MEMFD_MEMORY_ATTRIBUTES) > 0, + "No valid attributes for guest_memfd ioctl!"); + + gmem_ioctl(fd, KVM_SET_MEMORY_ATTRIBUTES2, &attr); +} + +static inline void gmem_set_private(int fd, loff_t offset, uint64_t size, = u64 flags) +{ + gmem_set_memory_attributes(fd, offset, size, + KVM_MEMORY_ATTRIBUTE_PRIVATE, flags); +} + +static inline void gmem_set_shared(int fd, loff_t offset, uint64_t size, u= 64 flags) +{ + gmem_set_memory_attributes(fd, offset, size, 0, flags); +} + void vm_guest_mem_fallocate(struct kvm_vm *vm, uint64_t gpa, uint64_t size, bool punch_hole); =20 --=20 2.53.0.1018.g2bb0e51243-goog From nobody Thu Apr 2 09:33:37 2026 Received: from mail-pg1-f202.google.com (mail-pg1-f202.google.com [209.85.215.202]) (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 738913A0B1A for ; Thu, 26 Mar 2026 22:25:14 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.215.202 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1774563915; cv=none; b=UuFQs22+tNUeSK03KALkvDt3GPd+Fy46W95/f6aPhbiCtc989dR7EsNr2SZPWcnzLQ2OOJc/qk/MDBgEOTXTgAVhC6i2E+W6sDSQVOeyEj4nc2T1gQPg/9CQUZn5zKrIR0BXFparcBzBSV+9gliVdVMJRiZ19xSk6vTaNKILUWk= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1774563915; c=relaxed/simple; bh=zRxx5/gHPS2JHJuJIs+5pNbq2l0ZSiKHaA8Zk5RuA84=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=ZwZVfbH5W4glrjw03IxQZE88142C38Sv2st/M7lhd7i9xKt0BXX44ysxMeaD36vSSBsxvSISPAcfV7R7wVhWrxGeFPVwtzyw/AyiGIPxKqwKPdVvKxvLgDDY8yuqbNS3Z5zqwCs+6SN433vn5xC5AKAegUBam57hEnY3p2q+pyk= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com; spf=pass smtp.mailfrom=flex--ackerleytng.bounces.google.com; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b=KwXe5RzR; arc=none smtp.client-ip=209.85.215.202 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=flex--ackerleytng.bounces.google.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="KwXe5RzR" Received: by mail-pg1-f202.google.com with SMTP id 41be03b00d2f7-c741a9ef5f0so1036163a12.1 for ; Thu, 26 Mar 2026 15:25:14 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20251104; t=1774563914; x=1775168714; darn=vger.kernel.org; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:from:to:cc:subject:date:message-id:reply-to; bh=o5T9NfG8XOkzMLDmEFGNVKs1ndpz9+nD9vrw6ykVGHU=; b=KwXe5RzROVPyZibr32Aj2hqkgVYzHv0XOkJkpNQ4szZwLtR718oNlgrPSPvMXTCDwQ asRGOn1zZtACT8VlJ58VutWFJPPym8tVxhBd890SHGdS3pwb2U6TDRD/OFnt9RnUpRrH 7sa/9n/oz5Ich+YGZwYoBlZ+qoApA3K0ay8MZpNKiFHRjRJg1HcJqCyz6i2AeYUHVVSq uuC+xZduxs/hT3R4mrVgLjgA3BzblYuUpJOZlNKbpNuMUbWTCCKTpfoyHhz7PsM4IMXa OkiGs0SrQToqjUwgYugoNorgtlJ8uo/pOkDsY7BAH92VCBE/Um82nLh7d/6MMPeOPOo2 vfyQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1774563914; x=1775168714; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=o5T9NfG8XOkzMLDmEFGNVKs1ndpz9+nD9vrw6ykVGHU=; b=QP3+vp6iPmjlcjYa9/qo0+/IIb9w3FYn2/waA5+P2JQckU69lXm3mZc/bOmcpZXtDV 3Ptwkbaa7v9DGn5+WvcRhXP9tqvnXv+6AcqqIQVhfOaHZ6USVG49RyaMjPltbCzDkzvG xX4fOJoDEtSNIR3l8m3OVNRPqpEvtW19jLekB46p+o/2MFN30X7GAdhdW7ocmwxRncB8 umZs6JG40y4y0p/fU/hhitfr7EEYimBJYdgrwZXDB3Fd+HjsR7y79ojvel5Hn2am5zTt z3/NyksIfS4p4GIXb3xHdB0WU3XgEIDCaV7gKvaVie2W1FxZ/5qyesifvOmcctIke2e5 vCAw== X-Forwarded-Encrypted: i=1; AJvYcCWFzualvRK5zV0iJNe4u5cy40aGm8+5FgQ9tSRDsVLhRany07hD0PMNnREog42C9uNpA326kSXPxCSosMw=@vger.kernel.org X-Gm-Message-State: AOJu0Yx4a/JSLAPQqY4DlD65gVlGXyqHVte6PFmdDF95HCZEEjHi68a7 vQUDiohxZJTiah/Va7yvAa+WxCQ4HQQ9j1f15XDfRLCTaRiQq/9mWwCC4I0fQ86jxn7Mgeqw3/u SMwbdXoH7OeV3uuYH/CNf3pSfHQ== X-Received: from pfjt19.prod.google.com ([2002:a05:6a00:21d3:b0:829:7eec:794]) (user=ackerleytng job=prod-delivery.src-stubby-dispatcher) by 2002:a05:6a00:ab89:b0:827:2792:e401 with SMTP id d2e1a72fcca58-82c867801f0mr2756930b3a.15.1774563913210; Thu, 26 Mar 2026 15:25:13 -0700 (PDT) Date: Thu, 26 Mar 2026 15:24:33 -0700 In-Reply-To: <20260326-gmem-inplace-conversion-v4-0-e202fe950ffd@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20260326-gmem-inplace-conversion-v4-0-e202fe950ffd@google.com> X-Developer-Key: i=ackerleytng@google.com; a=ed25519; pk=sAZDYXdm6Iz8FHitpHeFlCMXwabodTm7p8/3/8xUxuU= X-Developer-Signature: v=1; a=ed25519-sha256; t=1774563861; l=3775; i=ackerleytng@google.com; s=20260225; h=from:subject:message-id; bh=zRxx5/gHPS2JHJuJIs+5pNbq2l0ZSiKHaA8Zk5RuA84=; b=VbHUBBR0WU0omOVPBuMXZyxIW6ATPi3tjRPVcgfbz9ptdEr9eML7Tg/j/U1YitZYGTOZMkqw9 iofJmFKNJQICGz7MXZMzJC3tsckH1ROc9T4vFF1M+jcA/cyGvgNFUVl X-Mailer: b4 0.14.3 Message-ID: <20260326-gmem-inplace-conversion-v4-24-e202fe950ffd@google.com> Subject: [PATCH RFC v4 24/44] KVM: selftests: Test using guest_memfd for guest private memory From: Ackerley Tng To: aik@amd.com, andrew.jones@linux.dev, binbin.wu@linux.intel.com, brauner@kernel.org, chao.p.peng@linux.intel.com, david@kernel.org, ira.weiny@intel.com, jmattson@google.com, jroedel@suse.de, 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, tabba@google.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, 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 , Baoquan He , Barry Song , Axel Rasmussen , Yuanchu Xie , Wei Xu , Jason Gunthorpe , Vlastimil Babka Cc: 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, Ackerley Tng Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Add a selftest to verify that a memory region backed by a guest_memfd can be used as private guest memory. This is a key use case for confidential computing guests where the host should not have access to the guest's memory contents. The new test, test_guest_private_mem, creates a protected VM, maps a guest_memfd into the guest's address space, and then marks the region as private. The guest code then writes to and reads from this private memory region to verify it is accessible. To better distinguish between the test cases, rename the existing test that verifies shared host/guest access from test_guest_memfd_guest to test_guest_shared_mem. Signed-off-by: Ackerley Tng --- tools/testing/selftests/kvm/guest_memfd_test.c | 57 ++++++++++++++++++++++= ++-- 1 file changed, 53 insertions(+), 4 deletions(-) diff --git a/tools/testing/selftests/kvm/guest_memfd_test.c b/tools/testing= /selftests/kvm/guest_memfd_test.c index cc329b57ce2e9..10b57fd4fa9ba 100644 --- a/tools/testing/selftests/kvm/guest_memfd_test.c +++ b/tools/testing/selftests/kvm/guest_memfd_test.c @@ -406,7 +406,7 @@ static void test_guest_memfd(unsigned long vm_type) kvm_vm_free(vm); } =20 -static void guest_code(uint8_t *mem, uint64_t size) +static void guest_code_test_guest_shared_mem(uint8_t *mem, uint64_t size) { size_t i; =20 @@ -418,7 +418,7 @@ static void guest_code(uint8_t *mem, uint64_t size) GUEST_DONE(); } =20 -static void test_guest_memfd_guest(void) +static void test_guest_shared_mem(void) { /* * Skip the first 4gb and slot0. slot0 maps <1gb and is used to back @@ -437,7 +437,8 @@ static void test_guest_memfd_guest(void) if (!kvm_check_cap(KVM_CAP_GUEST_MEMFD_FLAGS)) return; =20 - vm =3D __vm_create_shape_with_one_vcpu(VM_SHAPE_DEFAULT, &vcpu, 1, guest_= code); + vm =3D __vm_create_shape_with_one_vcpu(VM_SHAPE_DEFAULT, &vcpu, 1, + guest_code_test_guest_shared_mem); =20 TEST_ASSERT(vm_check_cap(vm, KVM_CAP_GUEST_MEMFD_FLAGS) & GUEST_MEMFD_FLA= G_MMAP, "Default VM type should support MMAP, supported flags =3D 0x%x", @@ -469,6 +470,53 @@ static void test_guest_memfd_guest(void) kvm_vm_free(vm); } =20 +static void guest_code_test_guest_private_mem(uint8_t *mem) +{ + WRITE_ONCE(mem[0], 0xff); + GUEST_ASSERT_EQ(READ_ONCE(mem[0]), 0xff); + + GUEST_DONE(); +} + +static void test_guest_private_mem(void) +{ + const struct vm_shape shape =3D { + .mode =3D VM_MODE_DEFAULT, + .type =3D KVM_X86_SW_PROTECTED_VM, + }; + /* + * Skip the first 4gb and slot0. slot0 maps <1gb and is used to back + * the guest's code, stack, and page tables, and low memory contains + * the PCI hole and other MMIO regions that need to be avoided. + */ + const uint64_t gpa =3D SZ_4G; + const int slot =3D 1; + + struct kvm_vcpu *vcpu; + struct kvm_vm *vm; + size_t npages; + int fd; + + npages =3D page_size / getpagesize(); + vm =3D __vm_create_shape_with_one_vcpu(shape, &vcpu, npages, + guest_code_test_guest_private_mem); + + fd =3D vm_create_guest_memfd(vm, page_size, 0); + vm_mem_add(vm, VM_MEM_SRC_SHMEM, gpa, slot, npages, KVM_MEM_GUEST_MEMFD, + fd, 0, 0); + + virt_map(vm, gpa, gpa, npages); + vm_mem_set_private(vm, gpa, page_size); + + vcpu_args_set(vcpu, 1, gpa); + vcpu_run(vcpu); + + TEST_ASSERT_EQ(get_ucall(vcpu, NULL), UCALL_DONE); + + close(fd); + kvm_vm_free(vm); +} + int main(int argc, char *argv[]) { unsigned long vm_types, vm_type; @@ -488,5 +536,6 @@ int main(int argc, char *argv[]) for_each_set_bit(vm_type, &vm_types, BITS_PER_TYPE(vm_types)) test_guest_memfd(vm_type); =20 - test_guest_memfd_guest(); + test_guest_shared_mem(); + test_guest_private_mem(); } --=20 2.53.0.1018.g2bb0e51243-goog From nobody Thu Apr 2 09:33:37 2026 Received: from mail-pl1-f201.google.com (mail-pl1-f201.google.com [209.85.214.201]) (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 AD03C39F17E for ; Thu, 26 Mar 2026 22:25:16 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1774563918; cv=none; b=n3T8mDKlymED1yKXJroTi/aZxZu8A3JNMkV6LxorBE3x7EvKby6e9If128WKSOGzXv04oErKosMk78/Y/jOf3YjS/dzNuau3Q171hipfX7qrE3YOEwx/R4BmfPTV00AQV2gimGO1g2SyiW1tI8iggACCmTYXAfEr/hB/5UfBaC4= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1774563918; c=relaxed/simple; bh=AxVKgPSCm2I7h8Lx0QIPdypNEPHgsQvWmCjIPR9V/GY=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=PUv8mH77Qk/iMSShMTpUn+d9GsWFYTi46t8lXWNwAPHT7ek8gQ1l1Qi4txs3IjejXXdeVa7Y0uOn8TpMYiGehemDDa8Mboj9YI2xNMJQCCvPcjlj2ZkhvuNtgP/OX/IDK66jlJSKz12JU0xdrmWW9L0c7SeXNgu5yHyNPmU9AmQ= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com; spf=pass smtp.mailfrom=flex--ackerleytng.bounces.google.com; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b=jv6T6C2C; arc=none smtp.client-ip=209.85.214.201 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=flex--ackerleytng.bounces.google.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="jv6T6C2C" Received: by mail-pl1-f201.google.com with SMTP id d9443c01a7336-2b064884a7cso46406425ad.3 for ; Thu, 26 Mar 2026 15:25:16 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20251104; t=1774563916; x=1775168716; darn=vger.kernel.org; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:from:to:cc:subject:date:message-id:reply-to; bh=K/xEg8U0k16qmBs22Yin6V5IasSwJGzfsYduOVmW5QE=; b=jv6T6C2CfNl2pHgnzIrxuKldWvJ0R9wn47hhvVMJ2sd5W9L8y68cHSF6YM2/dn/qVF Fv4xglPbBCJD2gKemoKKGWN7vrccaUkgloqFjdZ+QH90ClDqt7n3AGpfyzOJdkUbfqp/ LxPdl1rmw9CZlR9KbihJjkfpUHld7Xq3GXod9nn7QUpNAA2tfLPJZjG9tLhSSvXT0gxK GD3ekCixi3heHv+KSCboK7meD63WtVU+Q058avXmwCIeJjMz+E5pciYbv1ZmXDDcOnek KWPZXjMDes5HeLvts/TU8vyoKOh0nESJSNIaLjkgwX3GYGdWYcHWTCuptDgjdLbWXQzF vx7Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1774563916; x=1775168716; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=K/xEg8U0k16qmBs22Yin6V5IasSwJGzfsYduOVmW5QE=; b=e3DSKFx9BdQQM42E8hF8mi/1RsRaVGyaJj2F4H/MpPE5D3L6nNt3FszHvlS514LY7O rTiDgifWrNjOtO55zQUZkHKz5ajP/jgyZqF1mesjBucZPP6HHcnnINy66GHg88g/qscV 2T6wSt2z7ZofugoaYMV1gRsn4XPPIDbuUFHFa7tNZijxH95CfOoXCC/xUermNbc9OGSk fJ7j0i/MS5xQ8+GHLgV505rrhrHhuZ5RosZhYcy8wx/f7fmBplAiVZyljwvvfcT6kA61 6pHHj4IEoxvDEWnaYEc5NH+hP0N3x8cvVfHgfB4AFj++FMG+6aWkniIbmWoZVtpwPJqa wLpg== X-Forwarded-Encrypted: i=1; AJvYcCXpL655s9FaZ9EZc701z8zLce65QjdV1Fh8CZ0mue/47xIohkgrNz9hHxxzUmYSBYwbQECQTfbJClvXFwM=@vger.kernel.org X-Gm-Message-State: AOJu0Yz828vl70YOPI76fIyg6pmp1gZTWBRzrvvE0JhzZVKBv3A8fZJU eftAKLC9RldJj9IDcNb2m7U4G+c4FLL4T8hQXUj3DnuHLT+USzPb794glbF6c4LW4fXOphBMLC0 BRghaYMlKpnkH6lIKbCF97bhMSg== X-Received: from plbw4.prod.google.com ([2002:a17:902:d3c4:b0:2b0:6147:a0ee]) (user=ackerleytng job=prod-delivery.src-stubby-dispatcher) by 2002:a17:902:ce8d:b0:2b0:4fd1:ed5d with SMTP id d9443c01a7336-2b0cdc04394mr3089425ad.8.1774563915706; Thu, 26 Mar 2026 15:25:15 -0700 (PDT) Date: Thu, 26 Mar 2026 15:24:34 -0700 In-Reply-To: <20260326-gmem-inplace-conversion-v4-0-e202fe950ffd@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20260326-gmem-inplace-conversion-v4-0-e202fe950ffd@google.com> X-Developer-Key: i=ackerleytng@google.com; a=ed25519; pk=sAZDYXdm6Iz8FHitpHeFlCMXwabodTm7p8/3/8xUxuU= X-Developer-Signature: v=1; a=ed25519-sha256; t=1774563861; l=7748; i=ackerleytng@google.com; s=20260225; h=from:subject:message-id; bh=AxVKgPSCm2I7h8Lx0QIPdypNEPHgsQvWmCjIPR9V/GY=; b=RIi45adW++Tghf19GJO9/Kc2z9rBRs5GXnlv3MugDCYn5rDU3Qh1nIWxtW/nBK1Tj0b7PewD/ Gzl8YIGFLTvDROog9G2zJe9/IotvK8YhPpMYAEbP5qZtfHbDG2bnNWL X-Mailer: b4 0.14.3 Message-ID: <20260326-gmem-inplace-conversion-v4-25-e202fe950ffd@google.com> Subject: [PATCH RFC v4 25/44] KVM: selftests: Test basic single-page conversion flow From: Ackerley Tng To: aik@amd.com, andrew.jones@linux.dev, binbin.wu@linux.intel.com, brauner@kernel.org, chao.p.peng@linux.intel.com, david@kernel.org, ira.weiny@intel.com, jmattson@google.com, jroedel@suse.de, 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, tabba@google.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, 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 , Baoquan He , Barry Song , Axel Rasmussen , Yuanchu Xie , Wei Xu , Jason Gunthorpe , Vlastimil Babka Cc: 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, Ackerley Tng Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Add a selftest for the guest_memfd memory attribute conversion ioctls. The test starts the guest_memfd as all-private (the default state), and verifies the basic flow of converting a single page to shared and then back to private. Add infrastructure that supports extensions to other conversion flow tests. This infrastructure will be used in upcoming patches for other conversion tests. Signed-off-by: Ackerley Tng Co-developed-by: Sean Christopherson Signed-off-by: Sean Christopherson --- tools/testing/selftests/kvm/Makefile.kvm | 1 + .../selftests/kvm/guest_memfd_conversions_test.c | 205 +++++++++++++++++= ++++ 2 files changed, 206 insertions(+) diff --git a/tools/testing/selftests/kvm/Makefile.kvm b/tools/testing/selft= ests/kvm/Makefile.kvm index dc68371f76a33..0e2a9adfca57e 100644 --- a/tools/testing/selftests/kvm/Makefile.kvm +++ b/tools/testing/selftests/kvm/Makefile.kvm @@ -147,6 +147,7 @@ TEST_GEN_PROGS_x86 +=3D access_tracking_perf_test TEST_GEN_PROGS_x86 +=3D coalesced_io_test TEST_GEN_PROGS_x86 +=3D dirty_log_perf_test TEST_GEN_PROGS_x86 +=3D guest_memfd_test +TEST_GEN_PROGS_x86 +=3D guest_memfd_conversions_test TEST_GEN_PROGS_x86 +=3D hardware_disable_test TEST_GEN_PROGS_x86 +=3D memslot_modification_stress_test TEST_GEN_PROGS_x86 +=3D memslot_perf_test diff --git a/tools/testing/selftests/kvm/guest_memfd_conversions_test.c b/t= ools/testing/selftests/kvm/guest_memfd_conversions_test.c new file mode 100644 index 0000000000000..841b2824ae996 --- /dev/null +++ b/tools/testing/selftests/kvm/guest_memfd_conversions_test.c @@ -0,0 +1,205 @@ +// SPDX-License-Identifier: GPL-2.0-only +/* + * Copyright (c) 2024, Google LLC. + */ +#include +#include + +#include +#include +#include + +#include "kvm_util.h" +#include "kselftest_harness.h" +#include "test_util.h" +#include "ucall_common.h" + +FIXTURE(gmem_conversions) { + struct kvm_vcpu *vcpu; + int gmem_fd; + /* HVA of the first byte of the memory mmap()-ed from gmem_fd. */ + char *mem; +}; + +typedef FIXTURE_DATA(gmem_conversions) test_data_t; + +FIXTURE_SETUP(gmem_conversions) { } + +static uint64_t page_size; + +static void guest_do_rmw(void); +#define GUEST_MEMFD_SHARING_TEST_GVA 0x90000000ULL + +/* + * Defer setup until the individual test is invoked so that tests can spec= ify + * the number of pages and flags for the guest_memfd instance. + */ +static void gmem_conversions_do_setup(test_data_t *t, int nr_pages, + int gmem_flags) +{ + const struct vm_shape shape =3D { + .mode =3D VM_MODE_DEFAULT, + .type =3D KVM_X86_SW_PROTECTED_VM, + }; + /* + * Use high GPA above APIC_DEFAULT_PHYS_BASE to avoid clashing with + * APIC_DEFAULT_PHYS_BASE. + */ + const uint64_t gpa =3D SZ_4G; + const uint32_t slot =3D 1; + u64 supported_flags; + struct kvm_vm *vm; + + vm =3D __vm_create_shape_with_one_vcpu(shape, &t->vcpu, nr_pages, guest_d= o_rmw); + + supported_flags =3D vm_check_cap(vm, KVM_CAP_MEMORY_ATTRIBUTES2_FLAGS); + TEST_REQUIRE(supported_flags & KVM_SET_MEMORY_ATTRIBUTES2_PRESERVE); + + vm_mem_add(vm, VM_MEM_SRC_SHMEM, gpa, slot, nr_pages, + KVM_MEM_GUEST_MEMFD, -1, 0, gmem_flags); + + t->gmem_fd =3D kvm_slot_to_fd(vm, slot); + t->mem =3D addr_gpa2hva(vm, gpa); + virt_map(vm, GUEST_MEMFD_SHARING_TEST_GVA, gpa, nr_pages); +} + +static void gmem_conversions_do_teardown(test_data_t *t) +{ + /* No need to close gmem_fd, it's owned by the VM structure. */ + kvm_vm_free(t->vcpu->vm); +} + +FIXTURE_TEARDOWN(gmem_conversions) +{ + gmem_conversions_do_teardown(self); +} + +/* + * In these test definition macros, __nr_pages and nr_pages is used to set= up + * the total number of pages in the guest_memfd under test. This will be + * available in the test definitions as nr_pages. + */ + +#define __GMEM_CONVERSION_TEST(test, __nr_pages, flags) \ +static void __gmem_conversions_##test(test_data_t *t, int nr_pages); \ + \ +TEST_F(gmem_conversions, test) \ +{ \ + gmem_conversions_do_setup(self, __nr_pages, flags); \ + __gmem_conversions_##test(self, __nr_pages); \ +} \ +static void __gmem_conversions_##test(test_data_t *t, int nr_pages) \ + +#define GMEM_CONVERSION_TEST(test, __nr_pages, flags) \ + __GMEM_CONVERSION_TEST(test, __nr_pages, (flags) | GUEST_MEMFD_FLAG_MMAP) + +#define __GMEM_CONVERSION_TEST_INIT_PRIVATE(test, __nr_pages) \ + GMEM_CONVERSION_TEST(test, __nr_pages, 0) + +#define GMEM_CONVERSION_TEST_INIT_PRIVATE(test) \ + __GMEM_CONVERSION_TEST_INIT_PRIVATE(test, 1) + +struct guest_check_data { + void *mem; + char expected_val; + char write_val; +}; +static struct guest_check_data guest_data; + +static void guest_do_rmw(void) +{ + for (;;) { + char *mem =3D READ_ONCE(guest_data.mem); + + GUEST_ASSERT_EQ(READ_ONCE(*mem), READ_ONCE(guest_data.expected_val)); + WRITE_ONCE(*mem, READ_ONCE(guest_data.write_val)); + + GUEST_SYNC(0); + } +} + +static void run_guest_do_rmw(struct kvm_vcpu *vcpu, loff_t pgoff, + char expected_val, char write_val) +{ + struct ucall uc; + int r; + + guest_data.mem =3D (void *)GUEST_MEMFD_SHARING_TEST_GVA + pgoff * page_si= ze; + guest_data.expected_val =3D expected_val; + guest_data.write_val =3D write_val; + sync_global_to_guest(vcpu->vm, guest_data); + + do { + r =3D __vcpu_run(vcpu); + } while (r =3D=3D -1 && errno =3D=3D EINTR); + + TEST_ASSERT_EQ(r, 0); + + switch (get_ucall(vcpu, &uc)) { + case UCALL_ABORT: + REPORT_GUEST_ASSERT(uc); + case UCALL_SYNC: + break; + default: + TEST_FAIL("Unexpected ucall %lu", uc.cmd); + } +} + +static void host_do_rmw(char *mem, loff_t pgoff, char expected_val, + char write_val) +{ + TEST_ASSERT_EQ(READ_ONCE(mem[pgoff * page_size]), expected_val); + WRITE_ONCE(mem[pgoff * page_size], write_val); +} + +static void test_private(test_data_t *t, loff_t pgoff, char starting_val, + char write_val) +{ + TEST_EXPECT_SIGBUS(WRITE_ONCE(t->mem[pgoff * page_size], write_val)); + run_guest_do_rmw(t->vcpu, pgoff, starting_val, write_val); + TEST_EXPECT_SIGBUS(READ_ONCE(t->mem[pgoff * page_size])); +} + +static void test_convert_to_private(test_data_t *t, loff_t pgoff, + char starting_val, char write_val) +{ + gmem_set_private(t->gmem_fd, pgoff * page_size, page_size, + KVM_SET_MEMORY_ATTRIBUTES2_PRESERVE); + test_private(t, pgoff, starting_val, write_val); +} + +static void test_shared(test_data_t *t, loff_t pgoff, char starting_val, + char host_write_val, char write_val) +{ + host_do_rmw(t->mem, pgoff, starting_val, host_write_val); + run_guest_do_rmw(t->vcpu, pgoff, host_write_val, write_val); + TEST_ASSERT_EQ(READ_ONCE(t->mem[pgoff * page_size]), write_val); +} + +static void test_convert_to_shared(test_data_t *t, loff_t pgoff, + char starting_val, char host_write_val, + char write_val) +{ + gmem_set_shared(t->gmem_fd, pgoff * page_size, page_size, + KVM_SET_MEMORY_ATTRIBUTES2_PRESERVE); + test_shared(t, pgoff, starting_val, host_write_val, write_val); +} + +GMEM_CONVERSION_TEST_INIT_PRIVATE(init_private) +{ + test_private(t, 0, 0, 'A'); + test_convert_to_shared(t, 0, 'A', 'B', 'C'); + test_convert_to_private(t, 0, 'C', 'E'); +} + + +int main(int argc, char *argv[]) +{ + TEST_REQUIRE(kvm_check_cap(KVM_CAP_VM_TYPES) & BIT(KVM_X86_SW_PROTECTED_V= M)); + TEST_REQUIRE(kvm_check_cap(KVM_CAP_GUEST_MEMFD_MEMORY_ATTRIBUTES) & + KVM_MEMORY_ATTRIBUTE_PRIVATE); + + page_size =3D getpagesize(); + + return test_harness_run(argc, argv); +} --=20 2.53.0.1018.g2bb0e51243-goog From nobody Thu Apr 2 09:33:37 2026 Received: from mail-pf1-f201.google.com (mail-pf1-f201.google.com [209.85.210.201]) (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 754A63A7593 for ; Thu, 26 Mar 2026 22:25:18 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.210.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1774563919; cv=none; b=X0XvXWnN7e5bHlrH0Tar4+ZrOW3bzrGzaDl4cgFRPUS7uE077M2cONLqWov9ROXLdHhSrhqivbIMlZfjzrDfYdyj4pgv/UQhsXD6d0+Tbho5YY9/5FOO9fkhlgOR0Rq1f27/NUQ1tSbH3HahD9tkVrtB5dKFFRaz79J/yXoP6jU= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1774563919; c=relaxed/simple; bh=ArwNEKwwbHDIAB+t8VvlCTKnXSiAkRboJv5hBzhssb8=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=HE1hruZfBIbf5xPBTxyUc757l5g8UZ0NQ9iUGP3NBN65kFeAtvB9wGWLIi1YRwl3b4xzfmhrfbACjCPNZ65LLlxGbF9eNGWJN3K+Wxn6FaKGy+E+JcFv1Aoo8+7cC82rTRCTpM5kEzqZVoUBEdAtOQSvjmpEHC23+H8xGiCwjrI= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com; spf=pass smtp.mailfrom=flex--ackerleytng.bounces.google.com; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b=cF6tadEA; arc=none smtp.client-ip=209.85.210.201 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=flex--ackerleytng.bounces.google.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="cF6tadEA" Received: by mail-pf1-f201.google.com with SMTP id d2e1a72fcca58-82a8203055bso1084139b3a.1 for ; Thu, 26 Mar 2026 15:25:18 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20251104; t=1774563918; x=1775168718; darn=vger.kernel.org; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:from:to:cc:subject:date:message-id:reply-to; bh=CxbETzKCXSc1z/DONft2GKvio3jGrUYSbzzgOX+Xf7Y=; b=cF6tadEA+t53w5s4sFp5v60oMpCRU76cxW/4pMUAEyn4sdz1chqlc2RJtUdo/9E941 u/w3FajvzaX56npIArgVxdDviYqb+a3rLX39fHgwxO0iRB7nduNZ0N9aQBGARxjOVxLl 822y0QCjqxzoP64znEoMT2JZR+geChwZz0Puw+FJYHFSQtxybcosHlSRGbazx5GStPgN Xnbi6wKFza1y8mcIyxaAu4YgpxIrEiAjjHVIfZU94XRPDVJF3/B2QFz57xrpd9bFftV4 YWHKtkt7BCOIXQSvEg8/pNEZzEhTxT5fOQngB8IpH5WRTmPyG5azPsgQL7oYHPx6IkOo TqFg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1774563918; x=1775168718; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=CxbETzKCXSc1z/DONft2GKvio3jGrUYSbzzgOX+Xf7Y=; b=b+G0QQFpY85ZL60tk1mCbp0DluFlRet2P82OIwJCem6AxxZvzMqGLqNFGlf+MyjGpR c/zuZTKIubbQAoZ3N0YBGLADHpVc2AGXsFwLiLEX77n4rG527wY5+KGF17aX2zRCfBAm Gn8HCnCqKSSV4gIrsIa+9US7onlALiHwv2JSjFwDDKoaFb6QLo2PVnB+0XV/TtJEbwoa fSBCNmAHDpAZsnNQypRHfiORmfA+jwQxFBi6qKhJb0Nr0boj9XDZLcoNo4WUFLu+KFDF Dapy02f9GD+M0z6d3ODWPuR7dAm7F3H6bk/moxbaCCNxciUEbO13d1XNu9WU/d13Ysvw 1k4w== X-Forwarded-Encrypted: i=1; AJvYcCWFFe5TTOfp8JtA/mwXZLb2RDCP5hc4V116qwWbWE8AOMQfvjZSGMwkbno4j8liTW2FUdKNuOJM9tHrMjU=@vger.kernel.org X-Gm-Message-State: AOJu0YzSg7+XuhMReiTkjeIZ9iBmBH7TzL9H6kKTEYCnjKnQz9oVXxDs ckTFXLLE1kqfsziHuXdv3vPjzOeTxtAgzzi1zRFJaCBMbHX6KHC89Nq1lvvhhEKR4PohRE7pwLZ tUnJm7IVUqIh8MPBm60AcY2EdFQ== X-Received: from pfjt19.prod.google.com ([2002:a05:6a00:21d3:b0:829:7eec:794]) (user=ackerleytng job=prod-delivery.src-stubby-dispatcher) by 2002:a05:6a00:2d9c:b0:829:9ea2:3e17 with SMTP id d2e1a72fcca58-82c95d45917mr156048b3a.9.1774563917419; Thu, 26 Mar 2026 15:25:17 -0700 (PDT) Date: Thu, 26 Mar 2026 15:24:35 -0700 In-Reply-To: <20260326-gmem-inplace-conversion-v4-0-e202fe950ffd@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20260326-gmem-inplace-conversion-v4-0-e202fe950ffd@google.com> X-Developer-Key: i=ackerleytng@google.com; a=ed25519; pk=sAZDYXdm6Iz8FHitpHeFlCMXwabodTm7p8/3/8xUxuU= X-Developer-Signature: v=1; a=ed25519-sha256; t=1774563861; l=1634; i=ackerleytng@google.com; s=20260225; h=from:subject:message-id; bh=ArwNEKwwbHDIAB+t8VvlCTKnXSiAkRboJv5hBzhssb8=; b=HuNUrwsYNrR2xPk/81EPYUE2OyqfcxrfmGxVWyTqFZ8vv4BhYbVtUf37zL0SDyT8xifQZ2GBO GDQbPyxFFKxB4OFuan+Lw5MWnRIWkraFqN+uu8w7p8oOz9swRrVK2Bi X-Mailer: b4 0.14.3 Message-ID: <20260326-gmem-inplace-conversion-v4-26-e202fe950ffd@google.com> Subject: [PATCH RFC v4 26/44] KVM: selftests: Test conversion flow when INIT_SHARED From: Ackerley Tng To: aik@amd.com, andrew.jones@linux.dev, binbin.wu@linux.intel.com, brauner@kernel.org, chao.p.peng@linux.intel.com, david@kernel.org, ira.weiny@intel.com, jmattson@google.com, jroedel@suse.de, 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, tabba@google.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, 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 , Baoquan He , Barry Song , Axel Rasmussen , Yuanchu Xie , Wei Xu , Jason Gunthorpe , Vlastimil Babka Cc: 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, Ackerley Tng Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Add a test case to verify that conversions between private and shared memory work correctly when the memory is initially created as shared. Signed-off-by: Ackerley Tng Co-developed-by: Sean Christopherson Signed-off-by: Sean Christopherson --- tools/testing/selftests/kvm/guest_memfd_conversions_test.c | 12 ++++++++++= ++ 1 file changed, 12 insertions(+) diff --git a/tools/testing/selftests/kvm/guest_memfd_conversions_test.c b/t= ools/testing/selftests/kvm/guest_memfd_conversions_test.c index 841b2824ae996..81cbdb5def565 100644 --- a/tools/testing/selftests/kvm/guest_memfd_conversions_test.c +++ b/tools/testing/selftests/kvm/guest_memfd_conversions_test.c @@ -99,6 +99,12 @@ static void __gmem_conversions_##test(test_data_t *t, in= t nr_pages) \ #define GMEM_CONVERSION_TEST_INIT_PRIVATE(test) \ __GMEM_CONVERSION_TEST_INIT_PRIVATE(test, 1) =20 +#define __GMEM_CONVERSION_TEST_INIT_SHARED(test, __nr_pages) \ + GMEM_CONVERSION_TEST(test, __nr_pages, GUEST_MEMFD_FLAG_INIT_SHARED) + +#define GMEM_CONVERSION_TEST_INIT_SHARED(test) \ + __GMEM_CONVERSION_TEST_INIT_SHARED(test, 1) + struct guest_check_data { void *mem; char expected_val; @@ -192,6 +198,12 @@ GMEM_CONVERSION_TEST_INIT_PRIVATE(init_private) test_convert_to_private(t, 0, 'C', 'E'); } =20 +GMEM_CONVERSION_TEST_INIT_SHARED(init_shared) +{ + test_shared(t, 0, 0, 'A', 'B'); + test_convert_to_private(t, 0, 'B', 'C'); + test_convert_to_shared(t, 0, 'C', 'D', 'E'); +} =20 int main(int argc, char *argv[]) { --=20 2.53.0.1018.g2bb0e51243-goog From nobody Thu Apr 2 09:33:37 2026 Received: from mail-pg1-f202.google.com (mail-pg1-f202.google.com [209.85.215.202]) (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 B04D63B8D4F for ; Thu, 26 Mar 2026 22:25:20 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.215.202 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1774563922; cv=none; b=c0VYntEcmzl33kAtsKjtOnSmHsbALd2WS593hoJFkmp27fDcnlhWFYg1eP75dSmElI64R982VV94n0EbUKH6o/4Vpd7ZdjWdWFfM23jxinaYpA3cvBqN5yHEprx+5w9iB+O0nLrFe5gOfDvqeft//CTPcRuEvL9rbdxQ3D3M7JE= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1774563922; c=relaxed/simple; bh=wRfY1Jn+9IVOYoMa8jY758mvqEtTI8tV2HC+aaXp76s=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=pdyF8uWHzwVZlIb9uqmxvFlCDd1KTvHON+2vtnlqqasiWU+H2ltDW2QToPANig6+tyjkJZZR8GUjG6rSv53OaBkEjxyCsk1GbB1Xi8NWHwRPlrPBnodt3inUGgP39PKoZhyRoST5Q0/7iZteBAx4m+0xoXVBNYbArEMRDQCc/WM= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com; spf=pass smtp.mailfrom=flex--ackerleytng.bounces.google.com; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b=nB1sweSw; arc=none smtp.client-ip=209.85.215.202 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=flex--ackerleytng.bounces.google.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="nB1sweSw" Received: by mail-pg1-f202.google.com with SMTP id 41be03b00d2f7-c7423ba5342so2999583a12.0 for ; Thu, 26 Mar 2026 15:25:20 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20251104; t=1774563920; x=1775168720; darn=vger.kernel.org; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:from:to:cc:subject:date:message-id:reply-to; bh=sIzVYLR/FSUWm85vLUs87YDAHw4Wlol7nmVi6FxJ/b0=; b=nB1sweSwNzWZKd0eQAQ5szsZKjCprvX2qQFaWRTNMAkmf+6B7S+c4iE9jGpyekiui2 Fn6guvYWjpxNoCcMSPzn9j22SQL9aRMMiv8/eMoGrOOjQhexQHsnJBu/3BLs33xprplH b2Cc6rg6E/Wt8abV/6Jzpn5XSGbKAMMZXj5TDbbeJSTi3uOfhnc2LhEHFv5zQLT/gzRp IW5oo2UTh1TpfcVrX3xl1C3msJ3uaH4Y195LFMSwAx/DzHqAO9LzbKAuxi7/JfeXq0a4 EYS0zWTU7p9h4WwDyBh6nhr+c0zFk6M6dwSq1aQ/5BLkyxpnhjm5p2vqpPWZnAWFAowX 6nmQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1774563920; x=1775168720; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=sIzVYLR/FSUWm85vLUs87YDAHw4Wlol7nmVi6FxJ/b0=; b=o1AXCCUyEley2V7CFss/v6BOCHvB6ABwZ1duom1B2OWmQt4GKOwkIxKq0V+p0dc2YL K4kaZe8rBL8RbYjCDc2zQ0MbZ0ETxcAYBVWH5FKjeddS9sWD0rXuDwy3ecKYufB/6GHl f6golW7yHOuwSMU04qtaLv7zsw/fvkYwkG+2ZtnQfSduWb/EARYCu2J8dTPuDyZJF9z/ LxtjoiHrJfHv021a+zWKjOYQeIE6n3GsQ5G+965Xk1sNJQis+xymocyJbwWSBzjUFMhb /Ykp+2KKJ1I+lEqMLG02AXcdMCKal4JV3eBt3z0KM8YvAKa7ikQrIv7Uakkyhk6vlf17 uqAw== X-Forwarded-Encrypted: i=1; AJvYcCXrvoWKnyB56iFby4xQ6F6h/5Zo5vfbPMI4bV0bHliYpdsvmjOUJjmA2h8k5wXpBGuk3jzOxDFRaRzuxOs=@vger.kernel.org X-Gm-Message-State: AOJu0YxcYE+TtIpo2ZQdgFIk/7eKsl+4nd5eYUGt44km5pWZx4UP0E6v n4XsmCNEDZ4H5vMSPTw9pUV3KPXR+a6aiwYLv83ZNOhZGIWvuOsDpjk18kOL46HjWDU6+G+w9hM lMGvsaSmlCG7T7f6wtfpfOQHMCA== X-Received: from pfjt19.prod.google.com ([2002:a05:6a00:21d3:b0:82c:6ae6:e5b]) (user=ackerleytng job=prod-delivery.src-stubby-dispatcher) by 2002:a05:6a00:9a6:b0:82c:6d88:2a8e with SMTP id d2e1a72fcca58-82c95c1133emr168762b3a.20.1774563919656; Thu, 26 Mar 2026 15:25:19 -0700 (PDT) Date: Thu, 26 Mar 2026 15:24:36 -0700 In-Reply-To: <20260326-gmem-inplace-conversion-v4-0-e202fe950ffd@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20260326-gmem-inplace-conversion-v4-0-e202fe950ffd@google.com> X-Developer-Key: i=ackerleytng@google.com; a=ed25519; pk=sAZDYXdm6Iz8FHitpHeFlCMXwabodTm7p8/3/8xUxuU= X-Developer-Signature: v=1; a=ed25519-sha256; t=1774563861; l=4465; i=ackerleytng@google.com; s=20260225; h=from:subject:message-id; bh=wRfY1Jn+9IVOYoMa8jY758mvqEtTI8tV2HC+aaXp76s=; b=Iwk4pQNeckXclXoEM1Aas23TToytRGIPodJHXlnaUzRgEA3ZxoElFgD1mmgzcEoO9mzC7z3Sa MbCRq7O0sgoB82kC/gB6bsmiYm1TnEJqhIm2wTtU37WXhw2ymIQgiGS X-Mailer: b4 0.14.3 Message-ID: <20260326-gmem-inplace-conversion-v4-27-e202fe950ffd@google.com> Subject: [PATCH RFC v4 27/44] KVM: selftests: Test conversion precision in guest_memfd From: Ackerley Tng To: aik@amd.com, andrew.jones@linux.dev, binbin.wu@linux.intel.com, brauner@kernel.org, chao.p.peng@linux.intel.com, david@kernel.org, ira.weiny@intel.com, jmattson@google.com, jroedel@suse.de, 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, tabba@google.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, 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 , Baoquan He , Barry Song , Axel Rasmussen , Yuanchu Xie , Wei Xu , Jason Gunthorpe , Vlastimil Babka Cc: 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, Ackerley Tng Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable The existing guest_memfd conversion tests only use single-page memory regions. This provides no coverage for multi-page guest_memfd objects, specifically whether KVM correctly handles the page index for conversion operations. An incorrect implementation could, for example, always operate on the first page regardless of the index provided. Add a new test case to verify that conversions between private and shared memory correctly target the specified page within a multi-page guest_memfd. This test also verifies the precision of memory conversions by converting a single page an then iterating through all other pages ensure they remain in their original state. To support this test, add a new GMEM_CONVERSION_MULTIPAGE_TEST_INIT_SHARED macro that handles setting up and tearing down the VM for each page iteration. The teardown logic is adjusted to prevent a double-free in this new scenario. Signed-off-by: Ackerley Tng Co-developed-by: Sean Christopherson Signed-off-by: Sean Christopherson --- .../selftests/kvm/guest_memfd_conversions_test.c | 70 ++++++++++++++++++= ++++ 1 file changed, 70 insertions(+) diff --git a/tools/testing/selftests/kvm/guest_memfd_conversions_test.c b/t= ools/testing/selftests/kvm/guest_memfd_conversions_test.c index 81cbdb5def565..3388f06bc51db 100644 --- a/tools/testing/selftests/kvm/guest_memfd_conversions_test.c +++ b/tools/testing/selftests/kvm/guest_memfd_conversions_test.c @@ -65,8 +65,13 @@ static void gmem_conversions_do_setup(test_data_t *t, in= t nr_pages, =20 static void gmem_conversions_do_teardown(test_data_t *t) { + /* Use NULL to avoid second free in FIXTURE_TEARDOWN (multipage tests). */ + if (!t->vcpu) + return; + /* No need to close gmem_fd, it's owned by the VM structure. */ kvm_vm_free(t->vcpu->vm); + t->vcpu =3D NULL; } =20 FIXTURE_TEARDOWN(gmem_conversions) @@ -105,6 +110,29 @@ static void __gmem_conversions_##test(test_data_t *t, = int nr_pages) \ #define GMEM_CONVERSION_TEST_INIT_SHARED(test) \ __GMEM_CONVERSION_TEST_INIT_SHARED(test, 1) =20 +/* + * Repeats test over nr_pages in a guest_memfd of size nr_pages, providing= each + * test iteration with test_page, the index of the page under test in + * guest_memfd. test_page takes values 0..(nr_pages - 1) inclusive. + */ +#define GMEM_CONVERSION_MULTIPAGE_TEST_INIT_SHARED(test, __nr_pages) \ +static void __gmem_conversions_multipage_##test(test_data_t *t, int nr_pag= es, \ + const int test_page); \ + \ +TEST_F(gmem_conversions, test) \ +{ \ + const uint64_t flags =3D GUEST_MEMFD_FLAG_MMAP | GUEST_MEMFD_FLAG_INIT_SH= ARED; \ + int i; \ + \ + for (i =3D 0; i < __nr_pages; ++i) { \ + gmem_conversions_do_setup(self, __nr_pages, flags); \ + __gmem_conversions_multipage_##test(self, __nr_pages, i); \ + gmem_conversions_do_teardown(self); \ + } \ +} \ +static void __gmem_conversions_multipage_##test(test_data_t *t, int nr_pag= es, \ + const int test_page) + struct guest_check_data { void *mem; char expected_val; @@ -205,6 +233,48 @@ GMEM_CONVERSION_TEST_INIT_SHARED(init_shared) test_convert_to_shared(t, 0, 'C', 'D', 'E'); } =20 +/* + * Test indexing of pages within guest_memfd, using test data that is a mu= ltiple + * of page index. + */ +GMEM_CONVERSION_MULTIPAGE_TEST_INIT_SHARED(indexing, 4) +{ + int i; + + /* Get a char that varies with both i and v. */ +#define f(x, v) ((x << 4) + (v)) +#define r(v) (f(i, v)) +#define c(v) (f(test_page, v)) + + /* + * Start with the highest index, to catch any errors when, perhaps, the + * first page is returned even for the last index. + */ + for (i =3D nr_pages - 1; i >=3D 0; --i) + test_shared(t, i, 0, r(0), r(2)); + + test_convert_to_private(t, test_page, c(2), c(3)); + + for (i =3D 0; i < nr_pages; ++i) { + if (i =3D=3D test_page) + test_private(t, i, r(3), r(4)); + else + test_shared(t, i, r(2), r(3), r(4)); + } + + test_convert_to_shared(t, test_page, c(4), c(5), c(6)); + + for (i =3D 0; i < nr_pages; ++i) { + char expected =3D i =3D=3D test_page ? r(6) : r(4); + + test_shared(t, i, expected, r(7), r(8)); + } + +#undef c +#undef r +#undef f +} + int main(int argc, char *argv[]) { TEST_REQUIRE(kvm_check_cap(KVM_CAP_VM_TYPES) & BIT(KVM_X86_SW_PROTECTED_V= M)); --=20 2.53.0.1018.g2bb0e51243-goog From nobody Thu Apr 2 09:33:37 2026 Received: from mail-pf1-f202.google.com (mail-pf1-f202.google.com [209.85.210.202]) (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 AAA8E3BC683 for ; Thu, 26 Mar 2026 22:25:22 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.210.202 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1774563924; cv=none; b=IxqP2qUAqcGmWRvHNuiq6XBAHD1psUE8C4KTCBfBHlE7sQtsnC+5aReEi64Sujt7RX83jjF1KylLuZ4uC2h0IMTctTG/DC04jA+1ugiB3KN1VVtExkPqDkZvNafoMZAA1rUkAnKacIVaqrFamQgmCn/hqfzfm40AojEkoyPtADE= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1774563924; c=relaxed/simple; bh=6GHfy5Gjl/zAQ6e2mdyS+8IkN1+t3F2076IrLeNAKh4=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=FryzQ+CsowWyMPQYUm8d5l88ZHjTbxzMyGiA5DbD+olM6XqCeOOd2oasw9+uIdixiacjL8yoUsxlgTtr1lSfa5eHezc6vfarxHJku5J90kutx9gpXrg30vqbb77r70TmhENUREoSUNhkgUxk+Vq+gtdUI+igB3vDLJIq0Lp6TWg= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com; spf=pass smtp.mailfrom=flex--ackerleytng.bounces.google.com; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b=v1MffO8R; arc=none smtp.client-ip=209.85.210.202 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=flex--ackerleytng.bounces.google.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="v1MffO8R" Received: by mail-pf1-f202.google.com with SMTP id d2e1a72fcca58-82c38b85c25so2734985b3a.3 for ; Thu, 26 Mar 2026 15:25:22 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20251104; t=1774563922; x=1775168722; darn=vger.kernel.org; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:from:to:cc:subject:date:message-id:reply-to; bh=OMzauqzu1N0T+RdZOJts60YeEjJTRcPELOzUqUrSMzA=; b=v1MffO8RiaH90mFYckLFZ5gdhTd7BAqhQkOdkqcqxHjPr7jMIIkx+hKeZgPCd2PJlQ 8SsA79u9Orau9gbFa5xPteH5pIbl+Y/cKWJquegq0hPtQnBYn6mrOpDxMGz8OqduPrNx SZw+RfbTkp2NbBxQIDwjjHD0TrBUlB3mJfS4HcbrUZcV0eIpYwmQHVnnC0twVvNtpSDJ E1P2ShJpNrPcUSqG8C9RbSM+nSHghXTer+GZndTp4z6lY7iKoNLeE4+g3OsMpRQFz8oG xtJghtG7iiAIK5YMuHhuK0uMR0eNmiipdnkcuvoNPpcrGwznhjsp8Lnh/FoYH87aBJ2a 00gg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1774563922; x=1775168722; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=OMzauqzu1N0T+RdZOJts60YeEjJTRcPELOzUqUrSMzA=; b=Cyw+EZO4nZ2sNRuZl8E9duU0ZeBN3AZ0KQ6JI4vm6c3Vmo0L0USN0RI3pWg6HsqyRQ DmSuVi/lFxE2j4kLM+nFye/ioj+5QGQglrb1vixOkVS+WF67q8Ht5JGr9qWUrQ7GgjsU b0gHVwOPTtp40WoJQqsW9UL1EkuN8EUpeDMWcC3/+WRWQLEW7uWojbON6KI/aM8b/79Q yi9voxL36v9mqwbhXVrOLE7XJFOSa5DpzTutG//nMl+M6MYPCFjcsyoarYmWMobIyuyY a8/N3lU3PYiLgRMLQASGrH9vcvKazgUa4VWsEsaIzIUO5y2rkch3i0vOoGN9Ek4OeD51 /qwA== X-Forwarded-Encrypted: i=1; AJvYcCU32d8PhOoBlX0YfvLanBfhUZTpj2wPjDKTHAD5VgVPcm8blk4vfMs1vgudD9cmOnDBuu8eiz8WRB4+jp8=@vger.kernel.org X-Gm-Message-State: AOJu0YwDUKo7e+P2K0w7qPVZ8L9jzqu6xczmlmxVcBn7gYFz+cVC0ovS s10fG2rhT8FFNi/gPZpiJQdliNL3BOS06cOsT68PFOhq04YZ1ydDtThtWouoHW4MkS4fdl2H+L+ L0FqHBBgTm8EO0SV59UJts5AqrA== X-Received: from pfjf18.prod.google.com ([2002:a05:6a00:22d2:b0:82c:8530:819b]) (user=ackerleytng job=prod-delivery.src-stubby-dispatcher) by 2002:a05:6a00:23c8:b0:82a:805a:7cc with SMTP id d2e1a72fcca58-82c959d4be3mr154865b3a.4.1774563921606; Thu, 26 Mar 2026 15:25:21 -0700 (PDT) Date: Thu, 26 Mar 2026 15:24:37 -0700 In-Reply-To: <20260326-gmem-inplace-conversion-v4-0-e202fe950ffd@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20260326-gmem-inplace-conversion-v4-0-e202fe950ffd@google.com> X-Developer-Key: i=ackerleytng@google.com; a=ed25519; pk=sAZDYXdm6Iz8FHitpHeFlCMXwabodTm7p8/3/8xUxuU= X-Developer-Signature: v=1; a=ed25519-sha256; t=1774563861; l=1702; i=ackerleytng@google.com; s=20260225; h=from:subject:message-id; bh=6GHfy5Gjl/zAQ6e2mdyS+8IkN1+t3F2076IrLeNAKh4=; b=c0+/tVHHCj0rRhXtP95bZmzyVS99cg5m742QeRGaOCMuqdCrbTR5SGdXnoc6pcKSp6OoBARjg dKSpjzbhP3OC/hursTJC8G2V8dCdYgi2xvh0GxAAJepAlmCgB5i/jZU X-Mailer: b4 0.14.3 Message-ID: <20260326-gmem-inplace-conversion-v4-28-e202fe950ffd@google.com> Subject: [PATCH RFC v4 28/44] KVM: selftests: Test conversion before allocation From: Ackerley Tng To: aik@amd.com, andrew.jones@linux.dev, binbin.wu@linux.intel.com, brauner@kernel.org, chao.p.peng@linux.intel.com, david@kernel.org, ira.weiny@intel.com, jmattson@google.com, jroedel@suse.de, 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, tabba@google.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, 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 , Baoquan He , Barry Song , Axel Rasmussen , Yuanchu Xie , Wei Xu , Jason Gunthorpe , Vlastimil Babka Cc: 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, Ackerley Tng Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Add two test cases to the guest_memfd conversions selftest to cover the scenario where a conversion is requested before any memory has been allocated in the guest_memfd region. The KVM_SET_MEMORY_ATTRIBUTES2 ioctl can be called on a memory region at any time. If the guest had not yet faulted in any pages for that region, the kernel must record the conversion request and apply the requested state when the pages are eventually allocated. The new tests cover both conversion directions. Signed-off-by: Ackerley Tng Co-developed-by: Sean Christopherson Signed-off-by: Sean Christopherson --- tools/testing/selftests/kvm/guest_memfd_conversions_test.c | 14 ++++++++++= ++++ 1 file changed, 14 insertions(+) diff --git a/tools/testing/selftests/kvm/guest_memfd_conversions_test.c b/t= ools/testing/selftests/kvm/guest_memfd_conversions_test.c index 3388f06bc51db..1198c9c914318 100644 --- a/tools/testing/selftests/kvm/guest_memfd_conversions_test.c +++ b/tools/testing/selftests/kvm/guest_memfd_conversions_test.c @@ -275,6 +275,20 @@ GMEM_CONVERSION_MULTIPAGE_TEST_INIT_SHARED(indexing, 4) #undef f } =20 +/* + * Test that even if there are no folios yet, conversion requests are reco= rded + * in guest_memfd. + */ +GMEM_CONVERSION_TEST_INIT_SHARED(before_allocation_shared) +{ + test_convert_to_private(t, 0, 0, 'A'); +} + +GMEM_CONVERSION_TEST_INIT_PRIVATE(before_allocation_private) +{ + test_convert_to_shared(t, 0, 0, 'A', 'B'); +} + int main(int argc, char *argv[]) { TEST_REQUIRE(kvm_check_cap(KVM_CAP_VM_TYPES) & BIT(KVM_X86_SW_PROTECTED_V= M)); --=20 2.53.0.1018.g2bb0e51243-goog From nobody Thu Apr 2 09:33:37 2026 Received: from mail-pg1-f202.google.com (mail-pg1-f202.google.com [209.85.215.202]) (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 7152A3BE14D for ; Thu, 26 Mar 2026 22:25:24 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.215.202 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1774563926; cv=none; b=h6zWGU37uyABTGNWTFAqY9OCccb9hxjzbVBwKipF6SQWCfhTSai6RfHNiUjKqxNESFrLBS1Y5ZcFQizO5ryi/AaIlOKeHzQxpQ7V7DyAYpmNuGn0xE2hC9A9PRvW4ugs3/lcKthy8BO5bNXLSA+m2bEKZj3Th7qb4aeQsEndDs4= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1774563926; c=relaxed/simple; bh=oHklOacZgiD0w5i2dlS6G3/6wCT4tptcmpz8kawfH5k=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=a6Ucr+DtPn98HsIlO9EA2TSf7VoIq8Zt2mDxneJivL7QgLKY1JOkEU2rhqATXyHprscFfiXL7JN20tSKNcLY/ciuFMQkN3e/O9NWXG1Yxa8P9XNHVnJc61ubrTIi/tEkzMhzcQsAYi9/kU1//NIkxq2+r6F61b1wsn0myf2xJaQ= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com; spf=pass smtp.mailfrom=flex--ackerleytng.bounces.google.com; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b=dfcgBgh3; arc=none smtp.client-ip=209.85.215.202 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=flex--ackerleytng.bounces.google.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="dfcgBgh3" Received: by mail-pg1-f202.google.com with SMTP id 41be03b00d2f7-c709551ec08so2741876a12.3 for ; Thu, 26 Mar 2026 15:25:24 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20251104; t=1774563924; x=1775168724; darn=vger.kernel.org; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:from:to:cc:subject:date:message-id:reply-to; bh=E1xYMD/ygmI2J6L6yZT+C265xiVpI/P15LX3jXqm3Xk=; b=dfcgBgh3QsUyTetXaxxZILIH4NOqD2AjY/TzHEz05JFk4PU8q/RwhBwi0wmEbqlYJB 9tuGeDdUZgL8eHkL2KgwGcjpXe8S5xZPO4Wg0QlDD3/vmbHFveSztKIB0CLtull6fPtI ijonnS9FnRa/HMfshoSUXbhTaDmlz7HrNYAD/lK0iPp4RKcHuL+5BOKQFS/936vTQsr/ F2VBd+U6tZtsE3O5QF94qntZwQepEZPZ2DyPFwh0IlBF4FVcjwJeH8tU317ZWtPADqOk 9iQslmkSOM8R4XqWNPgFd5TuvXkRzreTy8K/4rXX3ytCNSq3VB7GCiarTMPj8bv3lIyD QKMA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1774563924; x=1775168724; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=E1xYMD/ygmI2J6L6yZT+C265xiVpI/P15LX3jXqm3Xk=; b=sgJclLWmTHs44MQ52PRbXjYo91AkSjg0hoYCwU7NJySI11unV/cxTkJSOTtIFugDb5 NKfh37KguJeKm+/ke1Gir9KFEs2R3ghjrI5qexanCFAFjZgRfLvj6SjotKNQzy6tHU3l 8+4/TP5OlZWmOknJz0augvWua67biiBK7TWdCNrCKlmW0CNkqSfBDDoogLCqpmGbuJln ppSBqMySus0dFjBjtLRDCGpULijkDm1edEGZ/bCIIYhPWUpZszjshS/ONZmaWUgPB512 FMln6eZEhGeVvVmHRtDX2NsSnBniLAgf66F5PJnxRWTAxPsp+/9WBtlQYjRx+HylVjNa 4bBw== X-Forwarded-Encrypted: i=1; AJvYcCURygo4aFgCVrqZ1QggKEgX2e4Xo5wlff7P1jVBTZ076xPDKgM3grezIOH380HZEJYnPQabJzgCvyb6RnE=@vger.kernel.org X-Gm-Message-State: AOJu0Yx4/wFmlo1Xl/1ISmi99Tl3DjJcU5phPXpFkSRbxUYmlXcnsCLj SLtmNEkksmvXIFacE11foxF3xXldvTKaUEtw3zRLqC1IrXkbF9bVBzAgtHOzECt2O38MCJCZcqz MC5y/kpOPkZTATufHFw8bqn0R5w== X-Received: from pfbfo22.prod.google.com ([2002:a05:6a00:6016:b0:82c:6863:427a]) (user=ackerleytng job=prod-delivery.src-stubby-dispatcher) by 2002:a05:6a00:348b:b0:829:6f37:158a with SMTP id d2e1a72fcca58-82c95c036cdmr167633b3a.18.1774563923362; Thu, 26 Mar 2026 15:25:23 -0700 (PDT) Date: Thu, 26 Mar 2026 15:24:38 -0700 In-Reply-To: <20260326-gmem-inplace-conversion-v4-0-e202fe950ffd@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20260326-gmem-inplace-conversion-v4-0-e202fe950ffd@google.com> X-Developer-Key: i=ackerleytng@google.com; a=ed25519; pk=sAZDYXdm6Iz8FHitpHeFlCMXwabodTm7p8/3/8xUxuU= X-Developer-Signature: v=1; a=ed25519-sha256; t=1774563861; l=2257; i=ackerleytng@google.com; s=20260225; h=from:subject:message-id; bh=oHklOacZgiD0w5i2dlS6G3/6wCT4tptcmpz8kawfH5k=; b=t7NZE6MbqQDRWbQsWbc0txg2U4p4153wpJM1gp3EaoANwnq92WnqbVCOltBJBXIrWcw+W5+GI jF48qJjsPNLBWBTO1mypfrEwWyywX8S14Vetlu9iUQQtlDVpnf415F4 X-Mailer: b4 0.14.3 Message-ID: <20260326-gmem-inplace-conversion-v4-29-e202fe950ffd@google.com> Subject: [PATCH RFC v4 29/44] KVM: selftests: Convert with allocated folios in different layouts From: Ackerley Tng To: aik@amd.com, andrew.jones@linux.dev, binbin.wu@linux.intel.com, brauner@kernel.org, chao.p.peng@linux.intel.com, david@kernel.org, ira.weiny@intel.com, jmattson@google.com, jroedel@suse.de, 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, tabba@google.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, 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 , Baoquan He , Barry Song , Axel Rasmussen , Yuanchu Xie , Wei Xu , Jason Gunthorpe , Vlastimil Babka Cc: 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, Ackerley Tng Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Add a guest_memfd selftest to verify that memory conversions work correctly with allocated folios in different layouts. By iterating through which pages are initially faulted, the test covers various layouts of contiguous allocated and unallocated regions, exercising conversion with different range layouts. Signed-off-by: Ackerley Tng Co-developed-by: Sean Christopherson Signed-off-by: Sean Christopherson --- .../selftests/kvm/guest_memfd_conversions_test.c | 31 ++++++++++++++++++= ++++ 1 file changed, 31 insertions(+) diff --git a/tools/testing/selftests/kvm/guest_memfd_conversions_test.c b/t= ools/testing/selftests/kvm/guest_memfd_conversions_test.c index 1198c9c914318..8f09671505b32 100644 --- a/tools/testing/selftests/kvm/guest_memfd_conversions_test.c +++ b/tools/testing/selftests/kvm/guest_memfd_conversions_test.c @@ -289,6 +289,37 @@ GMEM_CONVERSION_TEST_INIT_PRIVATE(before_allocation_pr= ivate) test_convert_to_shared(t, 0, 0, 'A', 'B'); } =20 +/* + * Test that when some of the folios in the conversion range are allocated, + * conversion requests are handled correctly in guest_memfd. Vary the ran= ges + * allocated before conversion, using test_page, to cover various layouts = of + * contiguous allocated and unallocated regions. + */ +GMEM_CONVERSION_MULTIPAGE_TEST_INIT_SHARED(unallocated_folios, 8) +{ + const int second_page_to_fault =3D 4; + int i; + + /* + * Fault 2 of the pages to test filemap range operations except when + * test_page =3D=3D second_page_to_fault. + */ + host_do_rmw(t->mem, test_page, 0, 'A'); + if (test_page !=3D second_page_to_fault) + host_do_rmw(t->mem, second_page_to_fault, 0, 'A'); + + gmem_set_private(t->gmem_fd, 0, nr_pages * page_size, + KVM_SET_MEMORY_ATTRIBUTES2_PRESERVE); + for (i =3D 0; i < nr_pages; ++i) { + char expected =3D (i =3D=3D test_page || i =3D=3D second_page_to_fault) = ? 'A' : 0; + + test_private(t, i, expected, 'B'); + } + + for (i =3D 0; i < nr_pages; ++i) + test_convert_to_shared(t, i, 'B', 'C', 'D'); +} + int main(int argc, char *argv[]) { TEST_REQUIRE(kvm_check_cap(KVM_CAP_VM_TYPES) & BIT(KVM_X86_SW_PROTECTED_V= M)); --=20 2.53.0.1018.g2bb0e51243-goog From nobody Thu Apr 2 09:33:37 2026 Received: from mail-pj1-f73.google.com (mail-pj1-f73.google.com [209.85.216.73]) (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 8EE2C3BED28 for ; Thu, 26 Mar 2026 22:25:26 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.216.73 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1774563927; cv=none; b=TDoUzknYfL+JUhKfbfZa4Ge2a+nAyPkCpxQZHFjf0M1B12N0IbdhZ9Utg3nY5qfT9O6TEmsjVzt9Z+TIG9b//HyraSXGpoK/4imdnW6DYjh6WI4eR0SklzX5vuxRsPBxtBC14yrWuiE0NUwkH2GADuzQ70vadF4FVbx5v/QRhZI= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1774563927; c=relaxed/simple; bh=+wZOcpFDmRXwMUiTSKOEYcZYo2gBc+x0kj6bHpNQCtY=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=Kuv+vivPcS/ORen5/v/6RtXolDs1506OJjBe4z3QrHKIN4+udOCkflR7na/Vsy4W+uCJgJy/4uX2lx1Q5nOaFBUQgPImkhGbejwlamvR+h+Dhj+KVKV4tqvdscsCgMAyXw3RutKqxY0pYhniCV1gjc2VYb6/0szskBYP+xZ24eE= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com; spf=pass smtp.mailfrom=flex--ackerleytng.bounces.google.com; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b=p1U96V5F; arc=none smtp.client-ip=209.85.216.73 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=flex--ackerleytng.bounces.google.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="p1U96V5F" Received: by mail-pj1-f73.google.com with SMTP id 98e67ed59e1d1-354bc535546so1637644a91.3 for ; Thu, 26 Mar 2026 15:25:26 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20251104; t=1774563926; x=1775168726; darn=vger.kernel.org; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:from:to:cc:subject:date:message-id:reply-to; bh=lwC7doJg1Gvj03U54dEFf5nEFPJBiFxpbSbYLz91w9E=; b=p1U96V5FkPT9aZkY9J9/6oDrjCdifVVczmlTAobsOWoZXfMrtN9j9mXTlCBTejasMd /r67t5VSnnBTQJnb0qZxBdvq0d5HQM6TDP1MyW1rZZZBknxGbz7ElOWN0etJdidWR3I8 H1zP3HSuxzavy52MO9w4sPt4zjaufw4f9c6inximDk85oWDDRPRvozwmfTuAlgYMIRLj QCP69CKWG+ZeQehbXkKOVbXwcDU729c/s/tvJY9RmmBUQe2AUG3V4MyzF4l/zHMiGO8Z NPYfLNeZTLYoLiwWqQgQj8hSMa6M4B4u+R+UrfzxRBAU1jrjH6H9pPyQunxXaft+aHS+ veag== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1774563926; x=1775168726; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=lwC7doJg1Gvj03U54dEFf5nEFPJBiFxpbSbYLz91w9E=; b=CSzC5/uBt15jGSs4vNTeWqlQcjBp736YJuEFAkz5BptQ7DPADQyLpixRPNnBIrtF4P w6UEXX5XTB+M6YNXPJeimpoSIqHez9lxBi15jY3kWELjfF6UhLBS/IKhQgnpqHTy3d8f QNWtNPvDcSzVWE/J7QleDNaUGhalxmJds0ckrEzdiF8xSgCM5ORwave/geUKCWEudFL9 6CbWgCb4/h4mvXaioWXU/1kweaPvMGsU4ApAfNT97qRsTDlsuotPqs5snPmJkU99FNHp FZzk73DVjXbU3Gx+0fXAA5dkdWsbdV8RLasXPgIS8e3MAWSbU/I3VlB3vLaJwbNuxroG zvdw== X-Forwarded-Encrypted: i=1; AJvYcCXnYV90hc5scpHtn878CVjzOm4i9mrbexjBfP7ktSq5+tk46jbvv0E0j2dlqHCfBd+whj9qoxYQwu1OZzw=@vger.kernel.org X-Gm-Message-State: AOJu0YzLkHqZHP+lwEopDi7bZsPH+SLxFxK81i09F+kL0HAw7b5GdLbm 1bVFb97PWlNBAyRwIpDlEf+xGVITkDeIta3P3pHQ6APsrUZ1ma3nrUmhG24CrJxm2VNaGjU7vAb q49P0Dub/a06cA1ULpMrCK04+kA== X-Received: from pjqx4.prod.google.com ([2002:a17:90a:b004:b0:35c:2df3:c081]) (user=ackerleytng job=prod-delivery.src-stubby-dispatcher) by 2002:a17:90b:4b06:b0:35b:e52a:7d23 with SMTP id 98e67ed59e1d1-35c30117e64mr191331a91.28.1774563925502; Thu, 26 Mar 2026 15:25:25 -0700 (PDT) Date: Thu, 26 Mar 2026 15:24:39 -0700 In-Reply-To: <20260326-gmem-inplace-conversion-v4-0-e202fe950ffd@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20260326-gmem-inplace-conversion-v4-0-e202fe950ffd@google.com> X-Developer-Key: i=ackerleytng@google.com; a=ed25519; pk=sAZDYXdm6Iz8FHitpHeFlCMXwabodTm7p8/3/8xUxuU= X-Developer-Signature: v=1; a=ed25519-sha256; t=1774563861; l=1963; i=ackerleytng@google.com; s=20260225; h=from:subject:message-id; bh=+wZOcpFDmRXwMUiTSKOEYcZYo2gBc+x0kj6bHpNQCtY=; b=aIMdopLnLwO2DBw/+/pPTRO0PTRtL85NVIpPoFXjBwUu+m8reLPqJ0xX4iIa55xeC6M1az4Vh 4yReKUF3iOvDQCxU+P/EwvSTm1mCOOA+k1k+K+iQe1qoaGLasqt7PbD X-Mailer: b4 0.14.3 Message-ID: <20260326-gmem-inplace-conversion-v4-30-e202fe950ffd@google.com> Subject: [PATCH RFC v4 30/44] KVM: selftests: Test that truncation does not change shared/private status From: Ackerley Tng To: aik@amd.com, andrew.jones@linux.dev, binbin.wu@linux.intel.com, brauner@kernel.org, chao.p.peng@linux.intel.com, david@kernel.org, ira.weiny@intel.com, jmattson@google.com, jroedel@suse.de, 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, tabba@google.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, 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 , Baoquan He , Barry Song , Axel Rasmussen , Yuanchu Xie , Wei Xu , Jason Gunthorpe , Vlastimil Babka Cc: 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, Ackerley Tng Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Add a test to verify that deallocating a page in a guest memfd region via fallocate() with FALLOC_FL_PUNCH_HOLE does not alter the shared or private status of the corresponding memory range. When a page backing a guest memfd mapping is deallocated, e.g., by punching a hole or truncating the file, and then subsequently faulted back in, the new page must inherit the correct shared/private status tracked by guest_memfd. Signed-off-by: Ackerley Tng Co-developed-by: Sean Christopherson Signed-off-by: Sean Christopherson --- tools/testing/selftests/kvm/guest_memfd_conversions_test.c | 14 ++++++++++= ++++ 1 file changed, 14 insertions(+) diff --git a/tools/testing/selftests/kvm/guest_memfd_conversions_test.c b/t= ools/testing/selftests/kvm/guest_memfd_conversions_test.c index 8f09671505b32..f195a202b3785 100644 --- a/tools/testing/selftests/kvm/guest_memfd_conversions_test.c +++ b/tools/testing/selftests/kvm/guest_memfd_conversions_test.c @@ -10,6 +10,7 @@ #include =20 #include "kvm_util.h" +#include "kvm_syscalls.h" #include "kselftest_harness.h" #include "test_util.h" #include "ucall_common.h" @@ -320,6 +321,19 @@ GMEM_CONVERSION_MULTIPAGE_TEST_INIT_SHARED(unallocated= _folios, 8) test_convert_to_shared(t, i, 'B', 'C', 'D'); } =20 +/* Truncation should not affect shared/private status. */ +GMEM_CONVERSION_TEST_INIT_SHARED(truncate) +{ + host_do_rmw(t->mem, 0, 0, 'A'); + kvm_fallocate(t->gmem_fd, FALLOC_FL_KEEP_SIZE | FALLOC_FL_PUNCH_HOLE, 0, = page_size); + host_do_rmw(t->mem, 0, 0, 'A'); + + test_convert_to_private(t, 0, 'A', 'B'); + + kvm_fallocate(t->gmem_fd, FALLOC_FL_KEEP_SIZE | FALLOC_FL_PUNCH_HOLE, 0, = page_size); + test_private(t, 0, 0, 'A'); +} + int main(int argc, char *argv[]) { TEST_REQUIRE(kvm_check_cap(KVM_CAP_VM_TYPES) & BIT(KVM_X86_SW_PROTECTED_V= M)); --=20 2.53.0.1018.g2bb0e51243-goog From nobody Thu Apr 2 09:33:37 2026 Received: from mail-pj1-f74.google.com (mail-pj1-f74.google.com [209.85.216.74]) (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 D99613C199F for ; Thu, 26 Mar 2026 22:25:28 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.216.74 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1774563930; cv=none; b=PhLg75WZNVOWjpbqJQAfAUyXqjhcsCGntKu6pVCi3JZJS38yGQVF3ybeSyIBMfIIUz2MYqKC0SvFI2p7n1hmYrcWridPkwZIO6hvprzzHqsR4YmcI3DCT0UixMXdXzbsRZu4TKFgf/Y+51VZVo8RkBovEmPOpyj/IRvb+XoYBz0= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1774563930; c=relaxed/simple; bh=EJWEqTmrsqcShTogzYuHHUB7CpsDPadL7YI1wJxLFCY=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=Wp3EtIStJTC/ae9ub5g6kg3G02zOVNBAOo/m6pW/zdBTAhKWE5+b6Y6dS/19TNfesgmZ+ZmgMNgoiN1YuFH78HQXWOpGTHmBk7aKq1AK8JzpGEDMRPC0mmvUigAIFr6/9JqJaqetdVwqqRMKKOhZLy9hhdEPkS3aLlzttRo96Fc= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com; spf=pass smtp.mailfrom=flex--ackerleytng.bounces.google.com; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b=FL1V894/; arc=none smtp.client-ip=209.85.216.74 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=flex--ackerleytng.bounces.google.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="FL1V894/" Received: by mail-pj1-f74.google.com with SMTP id 98e67ed59e1d1-359fe4e9ea7so1252311a91.0 for ; Thu, 26 Mar 2026 15:25:28 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20251104; t=1774563928; x=1775168728; darn=vger.kernel.org; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:from:to:cc:subject:date:message-id:reply-to; bh=2ggNswhhr/Zm517OANSqq2rkmE45vkRU03sHcZjDR0o=; b=FL1V894/67Qnw8yVSdMgQlcfwbov3WIhJNdTbHhEo8ZVi9X2ws1DKcLek6n9zJKm0G xh3BkjBRp+dlOnBaTJw02Gz2OqoX3o6+3vlLTD1TEhAVywHvZMnKoaJHUP5i9WT2WPfd dLxiswFagqLRq7EMSneLJ9JKFLYmA90KXfRkAIpTXcvm5L8iEKeVrSr8PQF3H+Xvt9eL EoDDNdkO54WoNJ42VXJlK34Y3Oq2dOMaKPjL06LYb1QcVVnaOTnfKIdZs59KQ6uflnkd gPqQG5wVP8ha4LEjxgIypCp8WmW/He5rFlFJmb6yLGWgAv3MM2LCAIei05RVlfXamWan lLHQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1774563928; x=1775168728; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=2ggNswhhr/Zm517OANSqq2rkmE45vkRU03sHcZjDR0o=; b=je8ncTUnaHf7aOWSnJsFpVL5oJ7kUJU8d6U6fVDU+YvVOxaju8xZ+j1Kq8YF/cTx3X G3kcU2uuAHDutc6gD2Rjmkuu6gKl8j2Yw7EtITPFRAtRTi8meqLJLrli1yI7zCBZqiI9 HuUtpWADLLZ7vIiRK9FKeI+VQpQtxD7owZ/c2RKb7ew6zmAu3JO092ltkbjzs4/KsWw7 P133gOrLGDkjLCwf/o0Dr6HEqy563h8ibDXr3wSqBNYCOXzThCsN3CLj2QtLh+XKfvum r1ypNn7MJx/5lcVbjuNZGRjDcvba2DcJ+NRR5JU8OAOxgnhiSdZM6Jm6taDvEIjzAP5q 6Sow== X-Forwarded-Encrypted: i=1; AJvYcCVpD084FaY5GcAJKzwGet6P2I5IGHj2dN9ASFfX/iAxc7vMVud9YBq9GwW5pS8f+kGviRvoks9ltrZZyLo=@vger.kernel.org X-Gm-Message-State: AOJu0YzZ/fFyCTVu3ZrmspPm/4aHhrbpW48UhZ9kQmsd3kHQRiPtneX2 rmmQ7T1pkyZ/VuvLsbT8DJhFzIh2ilkv2j6GHI5gS2aoSBENFadIJKBHDLib2K1otHf+kWlh/79 4oVFTpzJpzJz564a1Wr8/Ntbe2g== X-Received: from pjnj7.prod.google.com ([2002:a17:90a:8407:b0:35b:a7ec:bdcf]) (user=ackerleytng job=prod-delivery.src-stubby-dispatcher) by 2002:a17:90b:4b09:b0:35b:91e1:e110 with SMTP id 98e67ed59e1d1-35c300b28c2mr201652a91.20.1774563927809; Thu, 26 Mar 2026 15:25:27 -0700 (PDT) Date: Thu, 26 Mar 2026 15:24:40 -0700 In-Reply-To: <20260326-gmem-inplace-conversion-v4-0-e202fe950ffd@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20260326-gmem-inplace-conversion-v4-0-e202fe950ffd@google.com> X-Developer-Key: i=ackerleytng@google.com; a=ed25519; pk=sAZDYXdm6Iz8FHitpHeFlCMXwabodTm7p8/3/8xUxuU= X-Developer-Signature: v=1; a=ed25519-sha256; t=1774563861; l=3458; i=ackerleytng@google.com; s=20260225; h=from:subject:message-id; bh=rCHdbveRHCq7Lbc/rPtcgMntFgrdjmRTxwCISj2xSoA=; b=94b8fZUYxxJIKK9M9r3xD06IQ9vXckRDERR0FGKGfKfHyQV+XY++9gfIYlhDE3CaPLXOwvElg etkz1NTy8bKCo8Ev2jmSLBQv/vyzxaNNaFAVWxjQJtFQibPkf6fSTHU X-Mailer: b4 0.14.3 Message-ID: <20260326-gmem-inplace-conversion-v4-31-e202fe950ffd@google.com> Subject: [PATCH RFC v4 31/44] KVM: selftests: Test that shared/private status is consistent across processes From: Ackerley Tng To: aik@amd.com, andrew.jones@linux.dev, binbin.wu@linux.intel.com, brauner@kernel.org, chao.p.peng@linux.intel.com, david@kernel.org, ira.weiny@intel.com, jmattson@google.com, jroedel@suse.de, 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, tabba@google.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, 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 , Baoquan He , Barry Song , Axel Rasmussen , Yuanchu Xie , Wei Xu , Jason Gunthorpe , Vlastimil Babka Cc: 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, Ackerley Tng Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable From: Sean Christopherson Add a test to verify that a guest_memfd's shared/private status is consistent across processes, and that any shared pages previously mapped in any process are unmapped from all processes. The test forks a child process after creating the shared guest_memfd region so that the second process exists alongside the main process for the entire test. The processes then take turns to access memory to check that the shared/private status is consistent across processes. Signed-off-by: Sean Christopherson Co-developed-by: Ackerley Tng Signed-off-by: Ackerley Tng --- .../selftests/kvm/guest_memfd_conversions_test.c | 74 ++++++++++++++++++= ++++ 1 file changed, 74 insertions(+) diff --git a/tools/testing/selftests/kvm/guest_memfd_conversions_test.c b/t= ools/testing/selftests/kvm/guest_memfd_conversions_test.c index f195a202b3785..ed310f26d88a1 100644 --- a/tools/testing/selftests/kvm/guest_memfd_conversions_test.c +++ b/tools/testing/selftests/kvm/guest_memfd_conversions_test.c @@ -334,6 +334,80 @@ GMEM_CONVERSION_TEST_INIT_SHARED(truncate) test_private(t, 0, 0, 'A'); } =20 +/* Test that shared/private memory protections work and are seen from any = process. */ +GMEM_CONVERSION_TEST_INIT_SHARED(forked_accesses) +{ + /* + * No races are intended in this test, shared memory is only used to + * coordinate between processes. + */ + static enum { + STATE_INIT, + STATE_CHECK_SHARED, + STATE_DONE_CHECKING_SHARED, + STATE_CHECK_PRIVATE, + STATE_DONE_CHECKING_PRIVATE, + } *test_state; + pid_t child_pid; + + test_state =3D kvm_mmap(sizeof(*test_state), PROT_READ | PROT_WRITE, + MAP_SHARED | MAP_ANONYMOUS, -1); + +#define TEST_STATE_AWAIT(__state) \ + while (READ_ONCE(*test_state) !=3D __state) { \ + if (child_pid !=3D 0) { \ + int status; \ + pid_t pid; \ + do { \ + pid =3D waitpid(child_pid, &status, WNOHANG); \ + } while (pid =3D=3D -1 && errno =3D=3D EINTR); \ + if (pid =3D=3D -1) \ + TEST_FAIL("Couldn't check child status."); \ + else if (pid !=3D 0) \ + TEST_FAIL("Child exited prematurely."); \ + } \ + } + +#define TEST_STATE_SET(__state) WRITE_ONCE(*test_state, __state) + + child_pid =3D fork(); + TEST_ASSERT(child_pid !=3D -1, "fork failed"); + + if (child_pid =3D=3D 0) { + const char inconsequential =3D 0xdd; + + TEST_STATE_AWAIT(STATE_CHECK_SHARED); + + /* + * This maps the pages into the child process as well, and tests + * that the conversion process will unmap the guest_memfd memory + * from all processes. + */ + host_do_rmw(t->mem, 0, 0xB, 0xC); + + TEST_STATE_SET(STATE_DONE_CHECKING_SHARED); + TEST_STATE_AWAIT(STATE_CHECK_PRIVATE); + + TEST_EXPECT_SIGBUS(READ_ONCE(t->mem[0])); + TEST_EXPECT_SIGBUS(WRITE_ONCE(t->mem[0], inconsequential)); + + TEST_STATE_SET(STATE_DONE_CHECKING_PRIVATE); + exit(0); + } + + test_shared(t, 0, 0, 0xA, 0xB); + + TEST_STATE_SET(STATE_CHECK_SHARED); + TEST_STATE_AWAIT(STATE_DONE_CHECKING_SHARED); + + test_convert_to_private(t, 0, 0xC, 0xD); + + TEST_STATE_SET(STATE_CHECK_PRIVATE); + TEST_STATE_AWAIT(STATE_DONE_CHECKING_PRIVATE); + + kvm_munmap(test_state, sizeof(*test_state)); +} + int main(int argc, char *argv[]) { TEST_REQUIRE(kvm_check_cap(KVM_CAP_VM_TYPES) & BIT(KVM_X86_SW_PROTECTED_V= M)); --=20 2.53.0.1018.g2bb0e51243-goog From nobody Thu Apr 2 09:33:37 2026 Received: from mail-pf1-f202.google.com (mail-pf1-f202.google.com [209.85.210.202]) (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 790EE33F385 for ; Thu, 26 Mar 2026 22:25:30 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.210.202 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1774563931; cv=none; b=ceOS8LVnPoHoiQzOUyitYSVARbUyQmia3K4PiN5ryTF/86juVKbkSTsSvO0eNbcJhgmNygV/ixtx/9d8mEYY6zn3vKwjCfSYFwM10VJOnlfSHIMiA8PpENXNYL1pwPkolET6o8Hd6ftIxJW+mo5j2W2Id0nto72MM27+grSb/Nc= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1774563931; c=relaxed/simple; bh=49y6ENDTk+sGjQthlPC0PI5YjXBfXeC7oiHabUVd5+c=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=kkAM/lIZM4j0sVwnVzHPGNRfVKE/A6Grxc2zCV7Z7twuA+hloIUfiGK9wIqDB5ylRLsz8eNEK2GDnieBI08tYo5I5iTvkGr5Yit+y+uyn4y0b+5M7OVSpwzK6PXkaW8yt12NQOj0z2EfmIbYEk+fro0PZ5h888dRldYMv6t/40o= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com; spf=pass smtp.mailfrom=flex--ackerleytng.bounces.google.com; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b=PFYxi+OZ; arc=none smtp.client-ip=209.85.210.202 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=flex--ackerleytng.bounces.google.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="PFYxi+OZ" Received: by mail-pf1-f202.google.com with SMTP id d2e1a72fcca58-82a782029b7so1139724b3a.3 for ; Thu, 26 Mar 2026 15:25:30 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20251104; t=1774563930; x=1775168730; darn=vger.kernel.org; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:from:to:cc:subject:date:message-id:reply-to; bh=4FDVrh5pBAWxA/8NukVOzbt4j2jYZyIOrjhQG/FDGfA=; b=PFYxi+OZI7E39KcF7SwuJM6KlnAtjVcLnzJrrY3ivJMkF5vKIaAs/RdQS92OU2sprk 5ygz2YS6MEAgjnsRIgpXHJiY1AH7wsDTZSUT8sIn+r0anmFwdTyuMJVjQKEv872OS6Yr kEUIRLFEkPETycsa+ww5BzUfmv6AlOKgFResu4AAdcjBKpzKUSuqwjXdlYwsc8OtP/W4 6HFXPHDnMDQ0EzQNNYPxmxM56jsJmklIe7fWsBZFMW1ri6ay7N/CvQNS+GMbjnKZ6zt9 aFVZ7OD9Dbiv8+YBZI1QDIpBMKKwbyOH+Z4taXowbQ6D/5NwYOoiOKJNm43KC3EAKoHQ WQqQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1774563930; x=1775168730; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=4FDVrh5pBAWxA/8NukVOzbt4j2jYZyIOrjhQG/FDGfA=; b=lsw6uytkCtUY+24jKcPhcT0NUikNbpQ1PrLSHjPw7sTIPvfafKJGquo4UDXDkarW3j WNf5UqRYleUHsHeiADsB+msXscBFHjvOUyTY6mi/vsrsH9+Lt34sC9IFqx2JeQrjxHzQ U4bi9kqX9h7Zy+wGAAyuxEDHmMuhX/zaf8b+Wha+EiNB9GEc40BWHr0cgHsjMzDrJXQS EINlnEiFA6WGo0OB+nHj5AG/cDKo1PlyuTg6BT2cSKwW0Oba7P5H2NjlfA5R6iUtixuq 7lMjXRlKyBEF1c06AWQmt1CMmxM2AI2Sb80Y87VwjWKh/fz20vMpJ5mcLi2OSXLMiW9B pKGg== X-Forwarded-Encrypted: i=1; AJvYcCXbp+TzjWfsvgPZurCY3+Ivz7yYnVhbKshxQmdfd5N4u1VG22tWIHoM3vJzDmSVqmjGCrDTiz8jdqABD00=@vger.kernel.org X-Gm-Message-State: AOJu0Yz7VJWG7QeKAb51qLlcQibXXJGKPAWWdgLFNcq5EDJGBS74HKVI uV7NgP/JXB66fa84rRjQcgVs9JW+5Y1IBZhYqmMZ0OY7guaF0nOYb6eMp1TvcesNG1bubkiOwbe 3iiTTzThV8iEGCklC7tOxGEn2MA== X-Received: from pfbmy24-n1.prod.google.com ([2002:a05:6a00:6d58:10b0:82c:85db:66f1]) (user=ackerleytng job=prod-delivery.src-stubby-dispatcher) by 2002:a05:6a00:a118:b0:824:188b:c173 with SMTP id d2e1a72fcca58-82c95d35fa3mr154180b3a.5.1774563929625; Thu, 26 Mar 2026 15:25:29 -0700 (PDT) Date: Thu, 26 Mar 2026 15:24:41 -0700 In-Reply-To: <20260326-gmem-inplace-conversion-v4-0-e202fe950ffd@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20260326-gmem-inplace-conversion-v4-0-e202fe950ffd@google.com> X-Developer-Key: i=ackerleytng@google.com; a=ed25519; pk=sAZDYXdm6Iz8FHitpHeFlCMXwabodTm7p8/3/8xUxuU= X-Developer-Signature: v=1; a=ed25519-sha256; t=1774563861; l=3818; i=ackerleytng@google.com; s=20260225; h=from:subject:message-id; bh=49y6ENDTk+sGjQthlPC0PI5YjXBfXeC7oiHabUVd5+c=; b=65aFdTZaaBhbx01UOD21wSDI5gmFYvI5UY4Oon4kj35EozZ/PT0v5jtWiriWeTssIZ8LZ5iDi nW+/95/cI0ZBsoUfv6UZ6e3zDpiwjAXZks4pArcDWAYh9DVJGtT36bz X-Mailer: b4 0.14.3 Message-ID: <20260326-gmem-inplace-conversion-v4-32-e202fe950ffd@google.com> Subject: [PATCH RFC v4 32/44] KVM: selftests: Test conversion with elevated page refcount From: Ackerley Tng To: aik@amd.com, andrew.jones@linux.dev, binbin.wu@linux.intel.com, brauner@kernel.org, chao.p.peng@linux.intel.com, david@kernel.org, ira.weiny@intel.com, jmattson@google.com, jroedel@suse.de, 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, tabba@google.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, 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 , Baoquan He , Barry Song , Axel Rasmussen , Yuanchu Xie , Wei Xu , Jason Gunthorpe , Vlastimil Babka Cc: 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, Ackerley Tng Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Add a selftest to verify that converting a shared guest_memfd page to a private page fails if the page has an elevated reference count. When KVM converts a shared page to a private one, it expects the page to have a reference count equal to the reference counts taken by the filemap. If another kernel subsystem holds a reference to the page, for example via pin_user_pages(), the conversion must be aborted. This test uses vmsplice to increment the refcount of a specific page. The reference is kept on the page by not reading data out from vmsplice's destination pipe. It then attempts to convert a range of pages, including the page with elevated refcount, from shared to private. The test asserts that both bulk and single-page conversion attempts correctly fail with EAGAIN for the pinned page. After the page is unpinned, the test verifies that subsequent conversions succeed. Signed-off-by: Ackerley Tng Co-developed-by: Sean Christopherson Signed-off-by: Sean Christopherson --- .../selftests/kvm/guest_memfd_conversions_test.c | 80 ++++++++++++++++++= ++++ 1 file changed, 80 insertions(+) diff --git a/tools/testing/selftests/kvm/guest_memfd_conversions_test.c b/t= ools/testing/selftests/kvm/guest_memfd_conversions_test.c index ed310f26d88a1..4ccd3d515bb26 100644 --- a/tools/testing/selftests/kvm/guest_memfd_conversions_test.c +++ b/tools/testing/selftests/kvm/guest_memfd_conversions_test.c @@ -408,6 +408,86 @@ GMEM_CONVERSION_TEST_INIT_SHARED(forked_accesses) kvm_munmap(test_state, sizeof(*test_state)); } =20 +static int pin_pipe[2] =3D { -1, -1 }; + +static void pin_pages(void *vaddr, uint64_t size) +{ + struct iovec iov =3D { + .iov_base =3D vaddr, + .iov_len =3D size, + }; + + if (pin_pipe[1] < 0) + TEST_ASSERT_EQ(pipe(pin_pipe), 0); + + TEST_ASSERT_EQ(vmsplice(pin_pipe[1], &iov, 1, 0), size); +} + +static void unpin_pages(void) +{ + close(pin_pipe[1]); + pin_pipe[1] =3D -1; + close(pin_pipe[0]); + pin_pipe[0] =3D -1; +} + +static void test_convert_to_private_fails(test_data_t *t, loff_t pgoff, + size_t nr_pages, + loff_t expected_error_offset) +{ + loff_t offset =3D pgoff * page_size; + loff_t error_offset =3D -1ul; + int ret; + + do { + ret =3D __gmem_set_private(t->gmem_fd, offset, + nr_pages * page_size, &error_offset, + KVM_SET_MEMORY_ATTRIBUTES2_PRESERVE); + } while (ret =3D=3D -1 && errno =3D=3D EINTR); + TEST_ASSERT(ret =3D=3D -1 && errno =3D=3D EAGAIN, + "Wanted EAGAIN on page %lu, got %d (ret =3D %d)", pgoff, + errno, ret); + TEST_ASSERT_EQ(error_offset, expected_error_offset); +} + +GMEM_CONVERSION_MULTIPAGE_TEST_INIT_SHARED(elevated_refcount, 4) +{ + int i; + + pin_pages(t->mem + test_page * page_size, page_size); + + for (i =3D 0; i < nr_pages; i++) + test_shared(t, i, 0, 'A', 'B'); + + /* + * Converting in bulk should fail as long any page in the range has + * unexpected refcounts. + */ + test_convert_to_private_fails(t, 0, nr_pages, test_page * page_size); + + for (i =3D 0; i < nr_pages; i++) { + /* + * Converting page-wise should also fail as long any page in the + * range has unexpected refcounts. + */ + if (i =3D=3D test_page) + test_convert_to_private_fails(t, i, 1, test_page * page_size); + else + test_convert_to_private(t, i, 'B', 'C'); + } + + unpin_pages(); + + gmem_set_private(t->gmem_fd, 0, nr_pages * page_size, + KVM_SET_MEMORY_ATTRIBUTES2_PRESERVE); + + for (i =3D 0; i < nr_pages; i++) { + char expected =3D i =3D=3D test_page ? 'B' : 'C'; + + test_private(t, i, expected, 'D'); + } +} + int main(int argc, char *argv[]) { TEST_REQUIRE(kvm_check_cap(KVM_CAP_VM_TYPES) & BIT(KVM_X86_SW_PROTECTED_V= M)); --=20 2.53.0.1018.g2bb0e51243-goog From nobody Thu Apr 2 09:33:37 2026 Received: from mail-pj1-f74.google.com (mail-pj1-f74.google.com [209.85.216.74]) (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 A24163C943B for ; Thu, 26 Mar 2026 22:25:32 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.216.74 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1774563935; cv=none; b=Eds5Ynd1oVQF8xSRAjBMxhiiKikXp3PRnAA79qM2ay2xFXZPrJO/zUtt3pXLt83VclCKeCLKFsTaZRzXtdcpn3YuyOxVKMXi46ERPMYAdKEG1TOUJKveWR8DxLzTxHaSlFNIdAca8nO/gy4wLvpaE0zQs31uera+y0quWtbPo0k= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1774563935; c=relaxed/simple; bh=2ZYGthoKRbcvONZFk1cPKbY2ke749z4V+HjyMMraW/E=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=klJuP3DZu+u0I3uheXwJqlk67k/OXuq5nlhGCCyk8PpsvR8cFvaDGVcUDBu2wNmq/TArFkyILJuyukyqbAfKULUU38fWn8EfXaSlTXHmf2A3aMPTtUD5ReHi+xpYQuKj33GDs0QxVyS+bMvQr6RJsgJ/p0pC06maSApcbUV14y4= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com; spf=pass smtp.mailfrom=flex--ackerleytng.bounces.google.com; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b=SA2XYR9P; arc=none smtp.client-ip=209.85.216.74 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=flex--ackerleytng.bounces.google.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="SA2XYR9P" Received: by mail-pj1-f74.google.com with SMTP id 98e67ed59e1d1-354bc535546so1637726a91.3 for ; Thu, 26 Mar 2026 15:25:32 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20251104; t=1774563932; x=1775168732; darn=vger.kernel.org; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:from:to:cc:subject:date:message-id:reply-to; bh=OM6bcucdXi/Ue6i8Gkw8+ejbHTWQvbY6+osZOGX6pUs=; b=SA2XYR9Pcw2sO3cMCtwq1AB53c20PAPn6O2RXTpzkcLIc9wStt99NA/rBbPR1xurFE IHw7Rc6XHWv22dzyxo9MMebcybRHTA3n9b97PNwXWSKsf8d5G9qSHN0dxEIPDifz7pda bKsGMpxR6oI+QHmSqaKa2WzczX5F+t8OwxxDeoUVZXP6rE0PGhK7WRQoaSIeCvhvEAH+ O4qRPeJHxLsuKLeJhYiu4Bh7VhPjeUVsIDaL5HrsT1Sjss7kY/BIKAG878tEaYRwzvzv zlAE7kBEyT1g9NTNQaJT4hU3xIWFmenuvZzej9+pl0zAQblNMiKq7itcm+y/g6O98Mv8 sGFQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1774563932; x=1775168732; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=OM6bcucdXi/Ue6i8Gkw8+ejbHTWQvbY6+osZOGX6pUs=; b=sgjLPpbhI78srRGu6sX71/H1VTDSfE3d9MKW8mkxJghfn1RAeVGef34eDj6pgMukzk vHx+eMzvdt3k4gJu4gvu4SFuXxHXdFg6oUb0PogfmmHA7GugRLddxuPlApRvDXmsGN3B CmTZP1WPSpUlgqKZFTuaw+ybak3gpF6sYrxe3mdfXz3x9mrozdl3zZ0ePZF0I5Gm9oar kKsFtitLy1HI37maTt1VX/vlZ9jxxzimpwR6q3tRGtWFqsO+V64GraTlCE//Ao5BOMjz rUNUcKndZnQ/X8nTCt+eKkdzS0LWgxX0lUYvTd8mVeni22MyxMviRcXo7PtaaU0xB5ru QutA== X-Forwarded-Encrypted: i=1; AJvYcCXh9uDy2/HxXjhZ3arHuJUTLDXBHNAPESu36l212JDTTuzPRdWRkbZ4OZpbforUchSIECQWOwrGkO2okFc=@vger.kernel.org X-Gm-Message-State: AOJu0YwZTjlbqpswtAAu5gvy0jSFFMA9bgCSmkSBtZk9XXm2SfojBozR ol0rT4qyPzLdH7YU1TCf9IiZfJ4ScxJ8tqxMmLaHPfmU3Vp0UGOTsYQfcKYUEUKVZM4P6QBIAnt Qmtteu0li5SllDwGvzgZ9UCWTdw== X-Received: from pjvg12.prod.google.com ([2002:a17:90a:db0c:b0:35b:963b:d15c]) (user=ackerleytng job=prod-delivery.src-stubby-dispatcher) by 2002:a17:90b:164a:b0:359:f2e1:5906 with SMTP id 98e67ed59e1d1-35c2ffb6610mr255604a91.4.1774563931699; Thu, 26 Mar 2026 15:25:31 -0700 (PDT) Date: Thu, 26 Mar 2026 15:24:42 -0700 In-Reply-To: <20260326-gmem-inplace-conversion-v4-0-e202fe950ffd@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20260326-gmem-inplace-conversion-v4-0-e202fe950ffd@google.com> X-Developer-Key: i=ackerleytng@google.com; a=ed25519; pk=sAZDYXdm6Iz8FHitpHeFlCMXwabodTm7p8/3/8xUxuU= X-Developer-Signature: v=1; a=ed25519-sha256; t=1774563861; l=1295; i=ackerleytng@google.com; s=20260225; h=from:subject:message-id; bh=2ZYGthoKRbcvONZFk1cPKbY2ke749z4V+HjyMMraW/E=; b=VuHoCdb1cXqd/SymNBIuKfRDMf7jBA8kvor2Rc5njfBTsWjLGscdR6iz+qugvp9JbPMpMjCNe rHxLUQdCHQNAA95+Me/U0IMElwV2qBwPhOOGr5EKNAKqarJ2Dw0SRzt X-Mailer: b4 0.14.3 Message-ID: <20260326-gmem-inplace-conversion-v4-33-e202fe950ffd@google.com> Subject: [PATCH RFC v4 33/44] KVM: selftests: Test that conversion to private does not support ZERO From: Ackerley Tng To: aik@amd.com, andrew.jones@linux.dev, binbin.wu@linux.intel.com, brauner@kernel.org, chao.p.peng@linux.intel.com, david@kernel.org, ira.weiny@intel.com, jmattson@google.com, jroedel@suse.de, 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, tabba@google.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, 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 , Baoquan He , Barry Song , Axel Rasmussen , Yuanchu Xie , Wei Xu , Jason Gunthorpe , Vlastimil Babka Cc: 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, Ackerley Tng Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Test that conversion to private specifying the KVM_SET_MEMORY_ATTRIBUTES2_ZERO flag returns -1 and sets errno to EOPNOTSUPP. Signed-off-by: Ackerley Tng --- .../testing/selftests/kvm/guest_memfd_conversions_test.c | 15 +++++++++++= ++++ 1 file changed, 15 insertions(+) diff --git a/tools/testing/selftests/kvm/guest_memfd_conversions_test.c b/t= ools/testing/selftests/kvm/guest_memfd_conversions_test.c index 4ccd3d515bb26..c0abc69f15332 100644 --- a/tools/testing/selftests/kvm/guest_memfd_conversions_test.c +++ b/tools/testing/selftests/kvm/guest_memfd_conversions_test.c @@ -488,6 +488,21 @@ GMEM_CONVERSION_MULTIPAGE_TEST_INIT_SHARED(elevated_re= fcount, 4) } } =20 +GMEM_CONVERSION_TEST_INIT_SHARED(convert_to_private_does_not_support_zero) +{ + const loff_t start_offset =3D 0; + loff_t error_offset =3D -1ul; + int ret; + + ret =3D __gmem_set_private(t->gmem_fd, start_offset, nr_pages * page_size, + &error_offset, + KVM_SET_MEMORY_ATTRIBUTES2_ZERO); + + TEST_ASSERT_EQ(ret, -1); + TEST_ASSERT_EQ(errno, EOPNOTSUPP); + TEST_ASSERT_EQ(error_offset, start_offset); +} + int main(int argc, char *argv[]) { TEST_REQUIRE(kvm_check_cap(KVM_CAP_VM_TYPES) & BIT(KVM_X86_SW_PROTECTED_V= M)); --=20 2.53.0.1018.g2bb0e51243-goog From nobody Thu Apr 2 09:33:37 2026 Received: from mail-pf1-f201.google.com (mail-pf1-f201.google.com [209.85.210.201]) (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 5BA7E3CFF41 for ; Thu, 26 Mar 2026 22:25:35 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.210.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1774563938; cv=none; b=M5oawgd+BHxVjC5MUWSJ07TEbwPw5HM55xUnTKKfjoAVgDNk0Hpljghow9L3yAYuncSU2UpMXAKckppP0buKTWNmBrkaWjzWUvruSNSBphpcl4Nb74GYOUnFqSw31MK0sM67oL51BACq7jEDlXvVyCjm6ozCoDlLS0ZaKe7rdfY= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1774563938; c=relaxed/simple; bh=mbmnyh+Paq6B3nFHJjVqfDuPSLNxTEBywi3jrm5yLoM=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=IC/eui/EDxU5pkDqCbWwjyt1M7OU690Eu2cgdnJ3UT1GHsiYGZMi06lwNKJTrjWmsosav8zb4NS0uDNHCSi2uwgXONen3mswhAzQWmTOT3E+x9fNfWLyRW/KmgZi6CDmuQV1cEMs7uEUM4kr95n1eQsZ8Kf1mJBzi8xmrv9ZRHo= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com; spf=pass smtp.mailfrom=flex--ackerleytng.bounces.google.com; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b=dX0Ig1BC; arc=none smtp.client-ip=209.85.210.201 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=flex--ackerleytng.bounces.google.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="dX0Ig1BC" Received: by mail-pf1-f201.google.com with SMTP id d2e1a72fcca58-82c69a734a4so1188811b3a.1 for ; Thu, 26 Mar 2026 15:25:35 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20251104; t=1774563934; x=1775168734; darn=vger.kernel.org; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:from:to:cc:subject:date:message-id:reply-to; bh=qQv/c3jRIYhBhzt6KigDfrqgdsyHsqIxf08hCghwjGs=; b=dX0Ig1BC9f6wcZaVnloMFz091FKUqAa+Ppua+0yjFzpjZAE8ii5eDY0znaAEO6jcre yAsEraf9sEOmsm+9F7w63jJf1kjJ6/fJssqp1JZAJo0HPbrVixupIDZfCTsJzr271jyX Ex3VIjIvxbXFMFVFgbJSs0AQ8CwqKQeYp1pQKJAWBWmQNJ4SF80lEJIUCNQlN0LqsTEb BaS074t2mmTZn8BEEP3eND//nrPn6FguamVh7DQGfEERdh6HzSAGyBRBotQIx6Crn7+n ihjAjaeIZtUYjfjTNS2sFVA3PB4fq5FhQs3e1gh+kZsaW5swLjZnDzuxIhaoSgw9BupC sDuQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1774563934; x=1775168734; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=qQv/c3jRIYhBhzt6KigDfrqgdsyHsqIxf08hCghwjGs=; b=Y827l2CZhAHcQOKp/tY9HV3KJfxfdbtvwyL+82PYPqmc7tiaShHiR9TwsGhK1uyyod Iz9vpAbRPkz3AQ3v5+azvdzp3MSzuRSy8oU3nJh3VHSdayEJsRkNpw51CPyGNG3vl5WB Mw5fnqzX9OoNiF8qAPMZEQMFN0Sa/zqn2O+/T7SnmCnW9UX+YAiVH1aGv7kn5LUJv/4y wOFgbt0pFgyKR5yTbZuIVXtKXpbIaYkGmd1i0nx4+1w5ruPjDSME4TQamjyKB+T80LOb B5dn9evlN/p6wPjfzv2GwuAVANGYilmXFa+iroqiShu+4qylparSx3d7BoPLGiQA50nx Asgw== X-Forwarded-Encrypted: i=1; AJvYcCV80HXi8eGYiLv5zJ1X0L8zReKPEQx8hBrgmxI3XlERP3328xpPJ0ZFfC4bluuCMbjQhVqEc5wsw0abTpQ=@vger.kernel.org X-Gm-Message-State: AOJu0YxNm854EuCFNS6DJ43DM/d2acnv+zr3BG6LEjbue1cxb8kSy8O4 AN53eJzFDoGzC6oEf1ZgB5+j9uzKroXHzeo1HkumuCBKmDTCFulI5kQ7pnAcLqHWbczJ92IKy05 Hpnzwce/uD4zQaX8LukTgRcqYug== X-Received: from pfbfb41.prod.google.com ([2002:a05:6a00:2da9:b0:829:7d34:ff99]) (user=ackerleytng job=prod-delivery.src-stubby-dispatcher) by 2002:a05:6a00:13a9:b0:824:36f8:346f with SMTP id d2e1a72fcca58-82c95e7986bmr157171b3a.25.1774563933827; Thu, 26 Mar 2026 15:25:33 -0700 (PDT) Date: Thu, 26 Mar 2026 15:24:43 -0700 In-Reply-To: <20260326-gmem-inplace-conversion-v4-0-e202fe950ffd@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20260326-gmem-inplace-conversion-v4-0-e202fe950ffd@google.com> X-Developer-Key: i=ackerleytng@google.com; a=ed25519; pk=sAZDYXdm6Iz8FHitpHeFlCMXwabodTm7p8/3/8xUxuU= X-Developer-Signature: v=1; a=ed25519-sha256; t=1774563861; l=2836; i=ackerleytng@google.com; s=20260225; h=from:subject:message-id; bh=mbmnyh+Paq6B3nFHJjVqfDuPSLNxTEBywi3jrm5yLoM=; b=ayjE20AS++xWp9N9WMziD80Oj2fnaF8+fEzlR1NValnRS6nVfyJUGa/eCX/UeeAKeN4u7/8Jy xLD/R+OSUjsBKl4tO0uelwfjOm2q3N6Bn3lz/wkKJsC7TbYULR2LjZv X-Mailer: b4 0.14.3 Message-ID: <20260326-gmem-inplace-conversion-v4-34-e202fe950ffd@google.com> Subject: [PATCH RFC v4 34/44] KVM: selftests: Support checking that data not equal expected From: Ackerley Tng To: aik@amd.com, andrew.jones@linux.dev, binbin.wu@linux.intel.com, brauner@kernel.org, chao.p.peng@linux.intel.com, david@kernel.org, ira.weiny@intel.com, jmattson@google.com, jroedel@suse.de, 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, tabba@google.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, 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 , Baoquan He , Barry Song , Axel Rasmussen , Yuanchu Xie , Wei Xu , Jason Gunthorpe , Vlastimil Babka Cc: 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, Ackerley Tng Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Expand run_guest_do_rmw() to support checking that data at given pgoff is not equal to expected_val. This will be used in a later patch that tests that memory contents are scrambled. Signed-off-by: Ackerley Tng --- .../selftests/kvm/guest_memfd_conversions_test.c | 17 +++++++++++++= ---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/tools/testing/selftests/kvm/guest_memfd_conversions_test.c b/t= ools/testing/selftests/kvm/guest_memfd_conversions_test.c index c0abc69f15332..277b122ec294c 100644 --- a/tools/testing/selftests/kvm/guest_memfd_conversions_test.c +++ b/tools/testing/selftests/kvm/guest_memfd_conversions_test.c @@ -137,6 +137,7 @@ static void __gmem_conversions_multipage_##test(test_da= ta_t *t, int nr_pages, \ struct guest_check_data { void *mem; char expected_val; + bool assert_not_equal; char write_val; }; static struct guest_check_data guest_data; @@ -146,7 +147,13 @@ static void guest_do_rmw(void) for (;;) { char *mem =3D READ_ONCE(guest_data.mem); =20 - GUEST_ASSERT_EQ(READ_ONCE(*mem), READ_ONCE(guest_data.expected_val)); + if (READ_ONCE(guest_data.assert_not_equal)) { + GUEST_ASSERT_NE(READ_ONCE(*mem), + READ_ONCE(guest_data.expected_val)); + } else { + GUEST_ASSERT_EQ(READ_ONCE(*mem), + READ_ONCE(guest_data.expected_val)); + } WRITE_ONCE(*mem, READ_ONCE(guest_data.write_val)); =20 GUEST_SYNC(0); @@ -154,13 +161,15 @@ static void guest_do_rmw(void) } =20 static void run_guest_do_rmw(struct kvm_vcpu *vcpu, loff_t pgoff, - char expected_val, char write_val) + char expected_val, char write_val, + bool assert_not_equal) { struct ucall uc; int r; =20 guest_data.mem =3D (void *)GUEST_MEMFD_SHARING_TEST_GVA + pgoff * page_si= ze; guest_data.expected_val =3D expected_val; + guest_data.assert_not_equal =3D assert_not_equal; guest_data.write_val =3D write_val; sync_global_to_guest(vcpu->vm, guest_data); =20 @@ -191,7 +200,7 @@ static void test_private(test_data_t *t, loff_t pgoff, = char starting_val, char write_val) { TEST_EXPECT_SIGBUS(WRITE_ONCE(t->mem[pgoff * page_size], write_val)); - run_guest_do_rmw(t->vcpu, pgoff, starting_val, write_val); + run_guest_do_rmw(t->vcpu, pgoff, starting_val, write_val, false); TEST_EXPECT_SIGBUS(READ_ONCE(t->mem[pgoff * page_size])); } =20 @@ -207,7 +216,7 @@ static void test_shared(test_data_t *t, loff_t pgoff, c= har starting_val, char host_write_val, char write_val) { host_do_rmw(t->mem, pgoff, starting_val, host_write_val); - run_guest_do_rmw(t->vcpu, pgoff, host_write_val, write_val); + run_guest_do_rmw(t->vcpu, pgoff, host_write_val, write_val, false); TEST_ASSERT_EQ(READ_ONCE(t->mem[pgoff * page_size]), write_val); } =20 --=20 2.53.0.1018.g2bb0e51243-goog From nobody Thu Apr 2 09:33:37 2026 Received: from mail-pf1-f201.google.com (mail-pf1-f201.google.com [209.85.210.201]) (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 194EF3CF056 for ; Thu, 26 Mar 2026 22:25:37 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.210.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1774563938; cv=none; b=XcUVszpln8mndxD4XfZhjyjwamFsf/lXK3o0zONOy8wUDTIl/7dbemBG9bCeAvkeE5AgDe2LuMeUMXqUkRgE72KJSGuIGFv30yCkA706zYXrSawl9ljbCfi/dg3Xzyifh983XEo98cbLEqH+FQ5AWJtQyjEMCdh9U1tOy/dSNDI= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1774563938; c=relaxed/simple; bh=TKwIneM09cvvLCUdRFakE58DgmH+kzGWLG04CD3qLX8=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=ExHOBRyArit8WwNJP3oALVecMFNat35XpsrKjPC7vYs0fGvMsOu8VJI0WwScTQOVJrEWNOR+8snhHdqm3vWaH17Eedk8aTzp3qMqjQ3xo0Tw4JyAN8FEvVKCHMHRrfRX58uBZMmizAp2fEn4NdwexTUbHQ0Nab5a5jiU4ysdodo= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com; spf=pass smtp.mailfrom=flex--ackerleytng.bounces.google.com; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b=fMHy8Lvz; arc=none smtp.client-ip=209.85.210.201 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=flex--ackerleytng.bounces.google.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="fMHy8Lvz" Received: by mail-pf1-f201.google.com with SMTP id d2e1a72fcca58-82c699d8caaso2756464b3a.1 for ; Thu, 26 Mar 2026 15:25:37 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20251104; t=1774563936; x=1775168736; darn=vger.kernel.org; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:from:to:cc:subject:date:message-id:reply-to; bh=TZhopEmz9QupHvhORYz2gLUFM61nCO/Ej/TdDgxiHZM=; b=fMHy8Lvz3jUIQdIlEMB6pA6wX5cFOE4BwfJTG5hhaXoFjpReg177BOhQDUAP84niO+ W2p3pFp8MATWetgIxVuQIjssLKXwayoWVixuN7LSW36XafEZorJGQ4Kv0pQzOaq8hLy0 wLekFTWAM/FI3emeKMUay4qVdpFrSdU6CTx7QDI6bXq7o9yRL0s2RVWPPioiQhyDGpQ5 TPjN1jrBoLyiKjAcwk37/Gq7p/sw+K9gPio6ryTJZ9UIJSDjsaBbgSV5I38neoNX5TXh 5By2N9VYwFG1MPcXSOOBmhUiSj4Xa4B4JOcTNhYp/D59xRm80Fvl2O0NUmMEo9XTrwsr FStg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1774563936; x=1775168736; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=TZhopEmz9QupHvhORYz2gLUFM61nCO/Ej/TdDgxiHZM=; b=KhZRD2F94ReQEwcvZ14LFEBRT/8wT9Qr45b777Wxpo5/EcVqizwkKLWvjhmOv+pvoX a7pHHGh75jrL7YgbekFj4iaNLe2qniOmjqqwhg4t7rnoZr4l8wXDKPfmvzv3V7VFnA4W +/v5EK8stqBTweEuIcpkUwoV0ziirU5VK6aKNhp2xiow4M2Y24H7WaknBhx5glgyBNFH hrt4WiDKoOb1uRjVESkFOAyC27EFrh/Mac/0yVUcuKrnj2mfHNNh0/nP88QEYCfcoIFx fID2Xk/sbTgT3/2Qy6aUFLfIWIXBsMWaT7gA1v0PsyMnrvtZE4fgnvWKf3Yv2aitSQ2n WhsQ== X-Forwarded-Encrypted: i=1; AJvYcCVm+Spobomzz034R91r3P8zNzjbo5FXKb4q8NWPVFbrvEEhGxHUqtzPqcsz+WySAxdpVY/WWT0glSdabgE=@vger.kernel.org X-Gm-Message-State: AOJu0YygALuur8LBPa6s48LOdxpPZDQbjtfg3Z4vFgdvesgZAmh1R0c/ Q4VUq6s6EuV/tDsjZRYP91xRSSFpicLfPE3X9kqR2W/rarD/Ox0KUY9bHR0R1iZUuz+NbQJDWit UbTDD1fQPH2G9Y6HQeNrQmXh4Iw== X-Received: from pfbji4.prod.google.com ([2002:a05:6a00:8f04:b0:829:a298:e5f2]) (user=ackerleytng job=prod-delivery.src-stubby-dispatcher) by 2002:a05:6a00:b60c:b0:82a:780f:a18a with SMTP id d2e1a72fcca58-82c95ee9102mr155260b3a.44.1774563936260; Thu, 26 Mar 2026 15:25:36 -0700 (PDT) Date: Thu, 26 Mar 2026 15:24:44 -0700 In-Reply-To: <20260326-gmem-inplace-conversion-v4-0-e202fe950ffd@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20260326-gmem-inplace-conversion-v4-0-e202fe950ffd@google.com> X-Developer-Key: i=ackerleytng@google.com; a=ed25519; pk=sAZDYXdm6Iz8FHitpHeFlCMXwabodTm7p8/3/8xUxuU= X-Developer-Signature: v=1; a=ed25519-sha256; t=1774563861; l=2085; i=ackerleytng@google.com; s=20260225; h=from:subject:message-id; bh=TKwIneM09cvvLCUdRFakE58DgmH+kzGWLG04CD3qLX8=; b=oVFtCvMAE6x+EWDc+ry+cyq4SuvkUPW14QkvvxiXdSdeccBpOGoDim0sAaLqVyLTdu9yvnNDz 56H+dt+vbO1ARLNr5kGJLYZ6iZL2rOnEZG0XxMIEmctPUz2XJRmzJZV X-Mailer: b4 0.14.3 Message-ID: <20260326-gmem-inplace-conversion-v4-35-e202fe950ffd@google.com> Subject: [PATCH RFC v4 35/44] KVM: selftests: Test that not specifying a conversion flag scrambles memory contents From: Ackerley Tng To: aik@amd.com, andrew.jones@linux.dev, binbin.wu@linux.intel.com, brauner@kernel.org, chao.p.peng@linux.intel.com, david@kernel.org, ira.weiny@intel.com, jmattson@google.com, jroedel@suse.de, 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, tabba@google.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, 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 , Baoquan He , Barry Song , Axel Rasmussen , Yuanchu Xie , Wei Xu , Jason Gunthorpe , Vlastimil Babka Cc: 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, Ackerley Tng Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable When using KVM_SET_MEMORY_ATTRIBUTES2, not specifying flags for the ioctl implies no guarantees on memory contents. For KVM_X86_SW_PROTECTED_VM, this mode is implemented by scrambling contents of converted memory ranges. Add a test to check that the unspecified conversion mode was handled in KVM by checking the expected behavior, that existing memory contents are scrambled. Signed-off-by: Ackerley Tng --- .../selftests/kvm/guest_memfd_conversions_test.c | 28 ++++++++++++++++++= ++++ 1 file changed, 28 insertions(+) diff --git a/tools/testing/selftests/kvm/guest_memfd_conversions_test.c b/t= ools/testing/selftests/kvm/guest_memfd_conversions_test.c index 277b122ec294c..4b2f00afda01c 100644 --- a/tools/testing/selftests/kvm/guest_memfd_conversions_test.c +++ b/tools/testing/selftests/kvm/guest_memfd_conversions_test.c @@ -512,6 +512,34 @@ GMEM_CONVERSION_TEST_INIT_SHARED(convert_to_private_do= es_not_support_zero) TEST_ASSERT_EQ(error_offset, start_offset); } =20 +GMEM_CONVERSION_TEST_INIT_SHARED(convert_mode_unspecified_scrambles) +{ + loff_t error_offset =3D -1ul; + int ret; + + test_shared(t, 0, 0, 'A', 'B'); + ret =3D __gmem_set_private(t->gmem_fd, 0, nr_pages * page_size, + &error_offset, 0); + TEST_ASSERT_EQ(ret, 0); + TEST_ASSERT_EQ(error_offset, -1ul); + + /* + * Since the content mode 0 scrambles data in memory, there is + * a small chance that this test will falsely fail when the + * scrambled value matches the initial value. + */ + run_guest_do_rmw(t->vcpu, 0, 'B', 'C', true); + + ret =3D __gmem_set_shared(t->gmem_fd, 0, nr_pages * page_size, + &error_offset, 0); + TEST_ASSERT_EQ(ret, 0); + TEST_ASSERT_EQ(error_offset, -1ul); + + /* Same small chance of falsely failing test applies here. */ + TEST_ASSERT(READ_ONCE(t->mem[0]) !=3D 'C', + "Conversion without specifying mode should scramble memory."); +} + int main(int argc, char *argv[]) { TEST_REQUIRE(kvm_check_cap(KVM_CAP_VM_TYPES) & BIT(KVM_X86_SW_PROTECTED_V= M)); --=20 2.53.0.1018.g2bb0e51243-goog From nobody Thu Apr 2 09:33:37 2026 Received: from mail-pl1-f201.google.com (mail-pl1-f201.google.com [209.85.214.201]) (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 CB1AB3D16E0 for ; Thu, 26 Mar 2026 22:25:38 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1774563940; cv=none; b=WST5r7zmRZYA08uzUNYMQ79uL8k3fBUspYY0RD8OOz+JxqrIIaorQ7ocJHPzCa4eM8eiTkzOLVhZkgMicT2/wKzW7F+G8TmFIKwRHKUA47+GbhckWwLN4MIfXUQcLARVq+c8gx7JK21hQO3jmUaV0/LWxYDmmugwV8UVssrqoAY= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1774563940; c=relaxed/simple; bh=rWCcSWsmhbugoQ/CrLBaDfQJULRa6k6zO+0SZDZQZEw=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=BkJNp2+W5L9edY5DLB0AheCs1lN/XmMlO/kSLxdaYq6f5ImayAvBYZrAlaN9KdTQPUIw8r7yxDMv32BkNqRtMqjbzvGi5IuY58llt/GOgQdpKzbnnhBkCaHOD151Phj/87U6xk26SAFfNSQ5Jze50to6/zuqVcXs0BFfZDJpV7c= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com; spf=pass smtp.mailfrom=flex--ackerleytng.bounces.google.com; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b=TzVoMkUN; arc=none smtp.client-ip=209.85.214.201 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=flex--ackerleytng.bounces.google.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="TzVoMkUN" Received: by mail-pl1-f201.google.com with SMTP id d9443c01a7336-2b06c242a34so44866875ad.0 for ; Thu, 26 Mar 2026 15:25:38 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20251104; t=1774563938; x=1775168738; darn=vger.kernel.org; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:from:to:cc:subject:date:message-id:reply-to; bh=d2+twVU5Kq9cuyYv1c7sUjk5voAbaDSz+rxqzaEeBxI=; b=TzVoMkUN1hAIZgQVWWLj9seZWk/IYD4fpc/TK6YbNhNUnYGOr0J5euoNjHP677hIn6 KggK2BSgySldQLrW3yaIegokNsIJ4PU3wXc7w0WhfMnL0YgADyfmm9wYfGUp3Ip+12dG Xf5slyWMwjaRLojlubEqXpPRxTAuJk/nzcAZxGFNtq1V3IO4LsriLlqOKtfDhzAE4Ojc fkZfpFh98VJ7MV36SE5YV0diy8A2bS/wutI8jhlCrxvp9mkflKTbGWCQ8CAKi5w3Z+23 AcbDHDonuS4X1fcJUIW0aMRrhlfq0ztEldvWrxTYorLrIBl5naIiOAEfqpL2WVXp0MQa 8uTw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1774563938; x=1775168738; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=d2+twVU5Kq9cuyYv1c7sUjk5voAbaDSz+rxqzaEeBxI=; b=sNKWgQ/s/S4k6IAbYEi/DGistPQKL/hZqj7vT77GKOj/+MIjO5RjSbmljZDINbVfHc OJzuf1amEIsDmjn3m85wRHCgoq9y9g8KLr9c+zHv/ydkzBF4x7od17TL1+Ft4rTXWZzP nGmgT0JYpto8M8WpouzSlgb1Xos1Nnmfn4borBH666DgwrapCuOZI2GH2bfWIkpGNRfP U52xAeJwp7wvhrsk8iDNzvoqgEdC6rnX7BpPAp1FNx7W8BRtHn15+sSKjkpPskUImnhD tfOH71VSUtRJEDivPic2A4ShDbl+W7f0qg5+Ja25Xs44vEjFJB7i4qHs27FS3QIPgs9u jxMQ== X-Forwarded-Encrypted: i=1; AJvYcCWaK2HqehOF9PiQ+lSsPrDQ7DkNbz5CU03G4aoFKF3kznub/ea/+leE2GVX7WiQ3/J4dPCMJJ4n1AnhM7Y=@vger.kernel.org X-Gm-Message-State: AOJu0YzUi4vs96C4rwT1vLbCk/VOyIwHnq1jLy2GWo44VibxNld00ue8 gz5AgJ4x3e8c9P+WzBFg7ri8gA6c76yUtuoBc6psfqjfa3ivzV0OEi480JqCUCUzeek5Gx9UETU azr98l5yI5NNvw4M7wNk0Hj8USw== X-Received: from ploh10.prod.google.com ([2002:a17:902:f70a:b0:2ae:cc99:f449]) (user=ackerleytng job=prod-delivery.src-stubby-dispatcher) by 2002:a17:902:fd44:b0:2b0:c106:a402 with SMTP id d9443c01a7336-2b0cdc041cfmr1807345ad.3.1774563937933; Thu, 26 Mar 2026 15:25:37 -0700 (PDT) Date: Thu, 26 Mar 2026 15:24:45 -0700 In-Reply-To: <20260326-gmem-inplace-conversion-v4-0-e202fe950ffd@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20260326-gmem-inplace-conversion-v4-0-e202fe950ffd@google.com> X-Developer-Key: i=ackerleytng@google.com; a=ed25519; pk=sAZDYXdm6Iz8FHitpHeFlCMXwabodTm7p8/3/8xUxuU= X-Developer-Signature: v=1; a=ed25519-sha256; t=1774563861; l=2497; i=ackerleytng@google.com; s=20260225; h=from:subject:message-id; bh=rWCcSWsmhbugoQ/CrLBaDfQJULRa6k6zO+0SZDZQZEw=; b=pUQCq5SrWuGgz06BeAocUDvHqxQeLoxpdNN2qf+xv5H6xfMk48K1Oz6M3gJfWh5qm4+iuM/cB 3ipj4RgmEYVCD2ax7x9bK4do0PRj5QXuzR0HkNjDUyGsG3ewhZB4IbG X-Mailer: b4 0.14.3 Message-ID: <20260326-gmem-inplace-conversion-v4-36-e202fe950ffd@google.com> Subject: [PATCH RFC v4 36/44] KVM: selftests: Reset shared memory after hole-punching From: Ackerley Tng To: aik@amd.com, andrew.jones@linux.dev, binbin.wu@linux.intel.com, brauner@kernel.org, chao.p.peng@linux.intel.com, david@kernel.org, ira.weiny@intel.com, jmattson@google.com, jroedel@suse.de, 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, tabba@google.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, 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 , Baoquan He , Barry Song , Axel Rasmussen , Yuanchu Xie , Wei Xu , Jason Gunthorpe , Vlastimil Babka Cc: 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, Ackerley Tng Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable private_mem_conversions_test used to reset the shared memory that was used for the test to an initial pattern at the end of each test iteration. Then, it would punch out the pages, which would zero memory. Without in-place conversion, the resetting would write shared memory, and hole-punching will zero private memory, hence resetting the test to the state at the beginning of the for loop. With in-place conversion, resetting writes memory as shared, and hole-punching zeroes the same physical memory, hence undoing the reset done before the hole punch. Move the resetting after the hole-punching, and reset the entire PER_CPU_DATA_SIZE instead of just the tested range. With in-place conversion, this zeroes and then resets the same physical memory. Without in-place conversion, the private memory is zeroed, and the shared memory is reset to init_p. This is sufficient since at each test stage, the memory is assumed to start as shared, and private memory is always assumed to start zeroed. Conversion zeroes memory, so the future test stages will work as expected. Fixes: 43f623f350ce1 ("KVM: selftests: Add x86-only selftest for private me= mory conversions") Signed-off-by: Ackerley Tng --- tools/testing/selftests/kvm/x86/private_mem_conversions_test.c | 9 ++++++-= -- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/tools/testing/selftests/kvm/x86/private_mem_conversions_test.c= b/tools/testing/selftests/kvm/x86/private_mem_conversions_test.c index 41f6b38f04071..47f1eb9212591 100644 --- a/tools/testing/selftests/kvm/x86/private_mem_conversions_test.c +++ b/tools/testing/selftests/kvm/x86/private_mem_conversions_test.c @@ -202,15 +202,18 @@ static void guest_test_explicit_conversion(uint64_t b= ase_gpa, bool do_fallocate) guest_sync_shared(gpa, size, p3, p4); memcmp_g(gpa, p4, size); =20 - /* Reset the shared memory back to the initial pattern. */ - memset((void *)gpa, init_p, size); - /* * Free (via PUNCH_HOLE) *all* private memory so that the next * iteration starts from a clean slate, e.g. with respect to * whether or not there are pages/folios in guest_mem. */ guest_map_shared(base_gpa, PER_CPU_DATA_SIZE, true); + + /* + * Hole-punching above zeroed private memory. Reset shared + * memory in preparation for the next GUEST_STAGE. + */ + memset((void *)base_gpa, init_p, PER_CPU_DATA_SIZE); } } =20 --=20 2.53.0.1018.g2bb0e51243-goog From nobody Thu Apr 2 09:33:37 2026 Received: from mail-pg1-f201.google.com (mail-pg1-f201.google.com [209.85.215.201]) (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 54F323D811D for ; Thu, 26 Mar 2026 22:25:41 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.215.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1774563943; cv=none; b=rHgo7bNsS91EJA0EBh0+06385/+4WBQ7VrKg17PTFS1HRmgSmq+VWc9t83plP47wbr6Ec+5j27hPeUAJMspKI70waASOBnnJEQ3LS+pikTEnKYzojSEfUJoyt6QPtP6jNKHLkyfQFo4JWSl5Ws6K3XMUk8FYtKyoXHm5sMVhKNE= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1774563943; c=relaxed/simple; bh=Iex+2GjcnFztYZs6o03UC8jgSSpVm69SQTPm4qzz0wo=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=DJEgaaa3lUHL454vLqLY9mZr8AjGdZO663HPR0qfFRVfHJoYQBtGS0tzlhL2u3rSgkB51n4klxOG5EVkFFHDHds/wXv0fL8gJPC0VOHzwYWoJpwPQuCHhRONRfSCLL/nR1CqS8ZTmDQjfKjDOslC2Wk8zn4iDyW6OxeFXGOVgLY= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com; spf=pass smtp.mailfrom=flex--ackerleytng.bounces.google.com; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b=obRr/MHq; arc=none smtp.client-ip=209.85.215.201 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=flex--ackerleytng.bounces.google.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="obRr/MHq" Received: by mail-pg1-f201.google.com with SMTP id 41be03b00d2f7-c70ea91bfe1so1031030a12.1 for ; Thu, 26 Mar 2026 15:25:41 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20251104; t=1774563941; x=1775168741; darn=vger.kernel.org; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:from:to:cc:subject:date:message-id:reply-to; bh=T0kEUH0AVz9474H95ZJeKVlqpWC9wv6k4l4eJTTe5z0=; b=obRr/MHqDMcqmfjRy/dL/0BbOOexLUPkxNiYBJWQid5PfniHx96F+lKJT/9vu5Kr1O KH4fa8LaxMiGi4v9+vYGBn3f5+urmrTsgAraof7lJliRqhcqdwOj50QI5CpuJ+xNE24X LS44YGrkIHzerfvg5fXfrlzR/sSXXuDNR+/9N19vpMZw7rjLOwGyI9LfjOL3oMU/L2u5 tRocl/+thgNql/3+yIwjaaYxCDoxCrqNbrA/uLP7g4wbnkqcV77JA+57rV5qKB2/hx2f 1ay47f88rHbo2Gnm91nECEpYWLdHWj/lzyzBeZBzDVy+32okDbqOHYYoWWnk1wR5EaLw Sotg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1774563941; x=1775168741; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=T0kEUH0AVz9474H95ZJeKVlqpWC9wv6k4l4eJTTe5z0=; b=RnHEMWwo/tA8TDxZdaX0tv9Zko+CnywX6uHu9ufv8BPN0aD3iIWcPlKQ8Q7T9EtOWC InDLilQWE66+QStos9FN08GGR1y868KamUFcqtOydRElV/D2SESILntdr6T5L/kvLOMx jmwrHWE/1dGJqUV/sH710+j8ve0yJKjT/JGQPRfUbP7rkK4eEFrZGrV25IbXDmKUVhqb 8cw5FHg6p+9RwvSlN6Wxmflmy11eayVzU24lt7vFXhvyd8dgBYc7Z+co6yMvuya1NfMV m8JHh/k/Fm+3dfLxdaeR63KMwUGl1doFc5Kvcstmpz99P6xbIc31FpN/IhR01QokteZz wteA== X-Forwarded-Encrypted: i=1; AJvYcCW7aPIu+/byNolnMKb/YiTDMTgfIhieAN9DTCDR5o/OgSgOg4aHDoOse53rdn/aM+pmC04G8WB9KILuFcM=@vger.kernel.org X-Gm-Message-State: AOJu0Yx4GV3VINZcPZ/qjRHgRYS0/Mga2LgpRGyhcsPH3FEnD0ekpD86 +OBGVznxpFJwofnzs/Ve6sTLLTAMrq9eT8Wj/YtjEdMl0Gl9Jco7AlpDRRpJZpP6SJri1Slt5+4 YPdR+kWdAunIgmAittPGtgl6x4A== X-Received: from pfbbe3.prod.google.com ([2002:a05:6a00:1f03:b0:82c:70d1:f303]) (user=ackerleytng job=prod-delivery.src-stubby-dispatcher) by 2002:a05:6300:210c:b0:39c:cdb:5d81 with SMTP id adf61e73a8af0-39c87b616c8mr305023637.32.1774563940116; Thu, 26 Mar 2026 15:25:40 -0700 (PDT) Date: Thu, 26 Mar 2026 15:24:46 -0700 In-Reply-To: <20260326-gmem-inplace-conversion-v4-0-e202fe950ffd@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20260326-gmem-inplace-conversion-v4-0-e202fe950ffd@google.com> X-Developer-Key: i=ackerleytng@google.com; a=ed25519; pk=sAZDYXdm6Iz8FHitpHeFlCMXwabodTm7p8/3/8xUxuU= X-Developer-Signature: v=1; a=ed25519-sha256; t=1774563861; l=3936; i=ackerleytng@google.com; s=20260225; h=from:subject:message-id; bh=Iex+2GjcnFztYZs6o03UC8jgSSpVm69SQTPm4qzz0wo=; b=LFg1NDSfx+bum67XPaMfMmazQlzXZqxkRIG8TginmY6+F7SKNrf7qVkCww33oClPBp0A+AaN7 OS52FCGGuuqC+V+eBWfg0ZX4o+q1AYjZII78BhV4qnGvy49q3S5we2t X-Mailer: b4 0.14.3 Message-ID: <20260326-gmem-inplace-conversion-v4-37-e202fe950ffd@google.com> Subject: [PATCH RFC v4 37/44] KVM: selftests: Provide function to look up guest_memfd details from gpa From: Ackerley Tng To: aik@amd.com, andrew.jones@linux.dev, binbin.wu@linux.intel.com, brauner@kernel.org, chao.p.peng@linux.intel.com, david@kernel.org, ira.weiny@intel.com, jmattson@google.com, jroedel@suse.de, 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, tabba@google.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, 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 , Baoquan He , Barry Song , Axel Rasmussen , Yuanchu Xie , Wei Xu , Jason Gunthorpe , Vlastimil Babka Cc: 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, Ackerley Tng Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Introduce a new helper, kvm_gpa_to_guest_memfd(), to find the guest_memfd-related details of a memory region that contains a given guest physical address (GPA). The function returns the file descriptor for the memfd, the offset into the file that corresponds to the GPA, and the number of bytes remaining in the region from that GPA. kvm_gpa_to_guest_memfd() was factored out from vm_guest_mem_fallocate(); refactor vm_guest_mem_fallocate() to use the new helper. Signed-off-by: Ackerley Tng Co-developed-by: Sean Christopherson Signed-off-by: Sean Christopherson --- tools/testing/selftests/kvm/include/kvm_util.h | 3 +++ tools/testing/selftests/kvm/lib/kvm_util.c | 34 ++++++++++++++++------= ---- 2 files changed, 24 insertions(+), 13 deletions(-) diff --git a/tools/testing/selftests/kvm/include/kvm_util.h b/tools/testing= /selftests/kvm/include/kvm_util.h index a539a98f79e08..3434f3df028b0 100644 --- a/tools/testing/selftests/kvm/include/kvm_util.h +++ b/tools/testing/selftests/kvm/include/kvm_util.h @@ -427,6 +427,9 @@ static inline void vm_enable_cap(struct kvm_vm *vm, uin= t32_t cap, uint64_t arg0) vm_ioctl(vm, KVM_ENABLE_CAP, &enable_cap); } =20 +int kvm_gpa_to_guest_memfd(struct kvm_vm *vm, vm_paddr_t gpa, off_t *fd_of= fset, + uint64_t *nr_bytes); + /* * KVM_SET_MEMORY_ATTRIBUTES overwrites _all_ attributes. These flows need * significant enhancements to support multiple attributes. diff --git a/tools/testing/selftests/kvm/lib/kvm_util.c b/tools/testing/sel= ftests/kvm/lib/kvm_util.c index 404efb5318f09..6deb6b333a066 100644 --- a/tools/testing/selftests/kvm/lib/kvm_util.c +++ b/tools/testing/selftests/kvm/lib/kvm_util.c @@ -1291,27 +1291,19 @@ void vm_guest_mem_fallocate(struct kvm_vm *vm, uint= 64_t base, uint64_t size, bool punch_hole) { const int mode =3D FALLOC_FL_KEEP_SIZE | (punch_hole ? FALLOC_FL_PUNCH_HO= LE : 0); - struct userspace_mem_region *region; uint64_t end =3D base + size; uint64_t gpa, len; off_t fd_offset; - int ret; + int fd, ret; =20 for (gpa =3D base; gpa < end; gpa +=3D len) { - uint64_t offset; - - region =3D userspace_mem_region_find(vm, gpa, gpa); - TEST_ASSERT(region && region->region.flags & KVM_MEM_GUEST_MEMFD, - "Private memory region not found for GPA 0x%lx", gpa); + fd =3D kvm_gpa_to_guest_memfd(vm, gpa, &fd_offset, &len); + len =3D min(end - gpa, len); =20 - offset =3D gpa - region->region.guest_phys_addr; - fd_offset =3D region->region.guest_memfd_offset + offset; - len =3D min_t(uint64_t, end - gpa, region->region.memory_size - offset); - - ret =3D fallocate(region->region.guest_memfd, mode, fd_offset, len); + ret =3D fallocate(fd, mode, fd_offset, len); TEST_ASSERT(!ret, "fallocate() failed to %s at %lx (len =3D %lu), fd =3D= %d, mode =3D %x, offset =3D %lx", punch_hole ? "punch hole" : "allocate", gpa, len, - region->region.guest_memfd, mode, fd_offset); + fd, mode, fd_offset); } } =20 @@ -1717,6 +1709,22 @@ void *addr_gpa2alias(struct kvm_vm *vm, vm_paddr_t g= pa) return (void *) ((uintptr_t) region->host_alias + offset); } =20 +int kvm_gpa_to_guest_memfd(struct kvm_vm *vm, vm_paddr_t gpa, off_t *fd_of= fset, + uint64_t *nr_bytes) +{ + struct userspace_mem_region *region; + vm_paddr_t gpa_offset; + + region =3D userspace_mem_region_find(vm, gpa, gpa); + TEST_ASSERT(region && region->region.flags & KVM_MEM_GUEST_MEMFD, + "guest_memfd memory region not found for GPA 0x%lx", gpa); + + gpa_offset =3D gpa - region->region.guest_phys_addr; + *fd_offset =3D region->region.guest_memfd_offset + gpa_offset; + *nr_bytes =3D region->region.memory_size - gpa_offset; + return region->region.guest_memfd; +} + /* Create an interrupt controller chip for the specified VM. */ void vm_create_irqchip(struct kvm_vm *vm) { --=20 2.53.0.1018.g2bb0e51243-goog From nobody Thu Apr 2 09:33:37 2026 Received: from mail-pl1-f202.google.com (mail-pl1-f202.google.com [209.85.214.202]) (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 E13593DEAF5 for ; Thu, 26 Mar 2026 22:25:42 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.202 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1774563944; cv=none; b=pq9rAc9126lZ/mXtbM+sfLYE5pst9lo/vVOGJbl405fFKa2+AbgzBnMxjcJY4Ze+Nvi2GZM69bjFhL3BxVFhN1wr9rEBAQZNV0FYyu5FBQiVXKwnqy+AGLtrMVsmdVKWvtlunIfRAzqgsx4Aea8vpJlOboWd3YfW5GXe/bw35MA= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1774563944; c=relaxed/simple; bh=cIqWAq5WjkT3kwr//fCKAzdxhjaZz9Zb7L+/dQP6WPc=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=J07haQrowYpoRldQk1/X8vEDexw3i9EjqyrTeMtW8353Agt4MWzyqTD1d55noQsTgO0kuHS4/cyuoli/1lVGqVk3Gf/I0+KeMU0nnoYJDPZS8u3xgTqS0j2zrEihYYtDsdKZC5CfzTRspchE+YmsPmPOw8JKNSIIyP8o2snCouE= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com; spf=pass smtp.mailfrom=flex--ackerleytng.bounces.google.com; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b=FzHk6KOK; arc=none smtp.client-ip=209.85.214.202 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=flex--ackerleytng.bounces.google.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="FzHk6KOK" Received: by mail-pl1-f202.google.com with SMTP id d9443c01a7336-2b0be865f19so17698615ad.1 for ; Thu, 26 Mar 2026 15:25:42 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20251104; t=1774563942; x=1775168742; darn=vger.kernel.org; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:from:to:cc:subject:date:message-id:reply-to; bh=NdTzJ2knx/A8nF/dOxU4yhfVKOq5sU9Aj61j8WPVqZE=; b=FzHk6KOKfWR1X/mjgGxGGc8To4iKG3hnhbURyPmyY48d/LfDxtD1tG5GNOnaftdQOQ 6i1JJY04FnIgpzR0xmzOmkW/8K8WmNPpov8DgCJSNmOozAH70CiIE6gpHGjqP1Y1ZMvT C5nG4XGk3UapfOM6289GsbBnpcAIHLLPWvWzFwVYjSbLHVNwFrx3Lmf2xQjLjlRcHCmh xusFYLPWV9CsO0WwNDlkZijXc5wLDDGasEPiH8lD3EimtJNI9w1GjEVGR5C2KyOOMzcI g1A/OJGj0bxFoMEw8YDcroHKYMoTZ+GfZ32ThN/uPbxXwhI+/qDwXRR6qEzy1QEqz002 eylQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1774563942; x=1775168742; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=NdTzJ2knx/A8nF/dOxU4yhfVKOq5sU9Aj61j8WPVqZE=; b=fEUFO13n0dN5bTygGMH3oEUEtHRQ0N3qzNy9Cg3cZy9FS1CzaqGQL4MXI/HYw1eY5e rNhEF6E833gLfllWhC825XQul1slTtq3D1p/YB6iQsoqHQAmyPKg/goapj9q5IUYhpoj wITZJe0KGYY3MoTDXry15zaMxPFiDSJSAMIbh8JuGBQ8yNfRZng2SzaL/tXwpulnDQeS nRPAtn5clXi3rDVMT+3RIyc4yNG10G7PEf0TIirMEuwkERCk0DeDzGBXUCuOEywI36jp /IJZhMcZ0q/YIJqBqL7IcN/KNt1WMnTbRyEup0w6fgFTFJ3wS1WOiwifLZ6Ceu9Qeru1 SLXg== X-Forwarded-Encrypted: i=1; AJvYcCXkQbk/x9Ev1QbwSYhOXbhrRtIGGgXU1QraCTqze/K128JbZMXQV9ls09bm3DeuzrjlSU4tpllwaAZehJo=@vger.kernel.org X-Gm-Message-State: AOJu0Yz9O26R3CZvsd/ZcxSCuhxKypDqay9EIQ8hFUbhvZ2q2BdpxJn7 RKK/lrI9BfjcpCxMvwbT7Ol6xHy0ztrKqcUB8Cy57mb3ZxQF9FVxpGS2J1v7ZxfTaKhflZtwn8N GAQ70DtUh0pB+1hX8f/mjLf2x0A== X-Received: from pgmc18.prod.google.com ([2002:a63:1c52:0:b0:c62:b045:9c6]) (user=ackerleytng job=prod-delivery.src-stubby-dispatcher) by 2002:a05:6a21:a613:b0:39b:8dcb:f36d with SMTP id adf61e73a8af0-39c87b62ed8mr216909637.35.1774563941902; Thu, 26 Mar 2026 15:25:41 -0700 (PDT) Date: Thu, 26 Mar 2026 15:24:47 -0700 In-Reply-To: <20260326-gmem-inplace-conversion-v4-0-e202fe950ffd@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20260326-gmem-inplace-conversion-v4-0-e202fe950ffd@google.com> X-Developer-Key: i=ackerleytng@google.com; a=ed25519; pk=sAZDYXdm6Iz8FHitpHeFlCMXwabodTm7p8/3/8xUxuU= X-Developer-Signature: v=1; a=ed25519-sha256; t=1774563861; l=6049; i=ackerleytng@google.com; s=20260225; h=from:subject:message-id; bh=HTZEVC19RcC53M2zFJOXKx3E4yoW/HTjTM3xN8ow870=; b=uEc48GV8on+0fQ8uBTGhWcrb0PLgSO+WOxNKaWbY/+7Aqk0ReLt7gB+ydu3HEXGauVkuxE5ig nsML4IvRgkLAnNEduyZAUtxVKvwTGuIvP0C83uzA53a/ilyROx1iLj0 X-Mailer: b4 0.14.3 Message-ID: <20260326-gmem-inplace-conversion-v4-38-e202fe950ffd@google.com> Subject: [PATCH RFC v4 38/44] KVM: selftests: Provide common function to set memory attributes From: Ackerley Tng To: aik@amd.com, andrew.jones@linux.dev, binbin.wu@linux.intel.com, brauner@kernel.org, chao.p.peng@linux.intel.com, david@kernel.org, ira.weiny@intel.com, jmattson@google.com, jroedel@suse.de, 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, tabba@google.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, 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 , Baoquan He , Barry Song , Axel Rasmussen , Yuanchu Xie , Wei Xu , Jason Gunthorpe , Vlastimil Babka Cc: 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, Ackerley Tng Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable From: Sean Christopherson Introduce vm_mem_set_memory_attributes(), which handles setting of memory attributes for a range of guest physical addresses, regardless of whether the attributes should be set via guest_memfd or via the memory attributes at the VM level. Refactor existing vm_mem_set_{shared,private} functions to use the new function. Update existing caller of vm_mem_set_private(). Signed-off-by: Sean Christopherson Co-developed-by: Ackerley Tng Signed-off-by: Ackerley Tng --- tools/testing/selftests/kvm/guest_memfd_test.c | 2 +- tools/testing/selftests/kvm/include/kvm_util.h | 47 ++++++++++++++++--= ---- tools/testing/selftests/kvm/lib/x86/sev.c | 2 +- .../testing/selftests/kvm/pre_fault_memory_test.c | 2 +- .../selftests/kvm/x86/private_mem_kvm_exits_test.c | 4 +- 5 files changed, 40 insertions(+), 17 deletions(-) diff --git a/tools/testing/selftests/kvm/guest_memfd_test.c b/tools/testing= /selftests/kvm/guest_memfd_test.c index 10b57fd4fa9ba..ff8c0c56399dd 100644 --- a/tools/testing/selftests/kvm/guest_memfd_test.c +++ b/tools/testing/selftests/kvm/guest_memfd_test.c @@ -506,7 +506,7 @@ static void test_guest_private_mem(void) fd, 0, 0); =20 virt_map(vm, gpa, gpa, npages); - vm_mem_set_private(vm, gpa, page_size); + vm_mem_set_private(vm, gpa, page_size, 0); =20 vcpu_args_set(vcpu, 1, gpa); vcpu_run(vcpu); diff --git a/tools/testing/selftests/kvm/include/kvm_util.h b/tools/testing= /selftests/kvm/include/kvm_util.h index 3434f3df028b0..d975cc3047a2d 100644 --- a/tools/testing/selftests/kvm/include/kvm_util.h +++ b/tools/testing/selftests/kvm/include/kvm_util.h @@ -456,18 +456,6 @@ static inline void vm_set_memory_attributes(struct kvm= _vm *vm, uint64_t gpa, vm_ioctl(vm, KVM_SET_MEMORY_ATTRIBUTES2, &attr); } =20 -static inline void vm_mem_set_private(struct kvm_vm *vm, uint64_t gpa, - uint64_t size) -{ - vm_set_memory_attributes(vm, gpa, size, KVM_MEMORY_ATTRIBUTE_PRIVATE); -} - -static inline void vm_mem_set_shared(struct kvm_vm *vm, uint64_t gpa, - uint64_t size) -{ - vm_set_memory_attributes(vm, gpa, size, 0); -} - static inline int __gmem_set_memory_attributes(int fd, loff_t offset, uint64_t size, uint64_t attributes, @@ -536,6 +524,41 @@ static inline void gmem_set_shared(int fd, loff_t offs= et, uint64_t size, u64 fla gmem_set_memory_attributes(fd, offset, size, 0, flags); } =20 +static inline void vm_mem_set_memory_attributes(struct kvm_vm *vm, uint64_= t gpa, + uint64_t size, uint64_t attrs, + u64 flags) +{ + if (kvm_has_gmem_attributes) { + uint64_t end =3D gpa + size; + uint64_t addr, len; + off_t fd_offset; + int fd; + + for (addr =3D gpa; addr < end; addr +=3D len) { + fd =3D kvm_gpa_to_guest_memfd(vm, addr, &fd_offset, &len); + len =3D min(end - addr, len); + + gmem_set_memory_attributes(fd, fd_offset, len, attrs, flags); + } + } else { + TEST_ASSERT(!flags, "Flags are not supported."); + vm_set_memory_attributes(vm, gpa, size, attrs); + } +} + +static inline void vm_mem_set_private(struct kvm_vm *vm, uint64_t gpa, + uint64_t size, u64 flags) +{ + vm_mem_set_memory_attributes(vm, gpa, size, + KVM_MEMORY_ATTRIBUTE_PRIVATE, flags); +} + +static inline void vm_mem_set_shared(struct kvm_vm *vm, uint64_t gpa, + uint64_t size, u64 flags) +{ + vm_mem_set_memory_attributes(vm, gpa, size, 0, flags); +} + void vm_guest_mem_fallocate(struct kvm_vm *vm, uint64_t gpa, uint64_t size, bool punch_hole); =20 diff --git a/tools/testing/selftests/kvm/lib/x86/sev.c b/tools/testing/self= tests/kvm/lib/x86/sev.c index c3a9838f4806a..d3a7241e5fc13 100644 --- a/tools/testing/selftests/kvm/lib/x86/sev.c +++ b/tools/testing/selftests/kvm/lib/x86/sev.c @@ -33,7 +33,7 @@ static void encrypt_region(struct kvm_vm *vm, struct user= space_mem_region *regio const uint64_t offset =3D (i - lowest_page_in_region) * vm->page_size; =20 if (private) - vm_mem_set_private(vm, gpa_base + offset, size); + vm_mem_set_private(vm, gpa_base + offset, size, 0); =20 if (is_sev_snp_vm(vm)) snp_launch_update_data(vm, gpa_base + offset, diff --git a/tools/testing/selftests/kvm/pre_fault_memory_test.c b/tools/te= sting/selftests/kvm/pre_fault_memory_test.c index 93e603d91311c..3b2c4179d42ee 100644 --- a/tools/testing/selftests/kvm/pre_fault_memory_test.c +++ b/tools/testing/selftests/kvm/pre_fault_memory_test.c @@ -188,7 +188,7 @@ static void __test_pre_fault_memory(unsigned long vm_ty= pe, bool private) virt_map(vm, gva, gpa, TEST_NPAGES); =20 if (private) - vm_mem_set_private(vm, gpa, TEST_SIZE); + vm_mem_set_private(vm, gpa, TEST_SIZE, 0); =20 pre_fault_memory(vcpu, gpa, 0, SZ_2M, 0, private); pre_fault_memory(vcpu, gpa, SZ_2M, PAGE_SIZE * 2, PAGE_SIZE, private); diff --git a/tools/testing/selftests/kvm/x86/private_mem_kvm_exits_test.c b= /tools/testing/selftests/kvm/x86/private_mem_kvm_exits_test.c index 13e72fcec8dd2..cbcb5d6d04436 100644 --- a/tools/testing/selftests/kvm/x86/private_mem_kvm_exits_test.c +++ b/tools/testing/selftests/kvm/x86/private_mem_kvm_exits_test.c @@ -63,7 +63,7 @@ static void test_private_access_memslot_deleted(void) virt_map(vm, EXITS_TEST_GVA, EXITS_TEST_GPA, EXITS_TEST_NPAGES); =20 /* Request to access page privately */ - vm_mem_set_private(vm, EXITS_TEST_GPA, EXITS_TEST_SIZE); + vm_mem_set_private(vm, EXITS_TEST_GPA, EXITS_TEST_SIZE, 0); =20 pthread_create(&vm_thread, NULL, (void *(*)(void *))run_vcpu_get_exit_reason, @@ -99,7 +99,7 @@ static void test_private_access_memslot_not_private(void) virt_map(vm, EXITS_TEST_GVA, EXITS_TEST_GPA, EXITS_TEST_NPAGES); =20 /* Request to access page privately */ - vm_mem_set_private(vm, EXITS_TEST_GPA, EXITS_TEST_SIZE); + vm_mem_set_private(vm, EXITS_TEST_GPA, EXITS_TEST_SIZE, 0); =20 exit_reason =3D run_vcpu_get_exit_reason(vcpu); =20 --=20 2.53.0.1018.g2bb0e51243-goog From nobody Thu Apr 2 09:33:37 2026 Received: from mail-pf1-f201.google.com (mail-pf1-f201.google.com [209.85.210.201]) (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 5A70C3542CA for ; Thu, 26 Mar 2026 22:25:45 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.210.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1774563946; cv=none; b=XASxoFs8vdA3TgD9CuItQoSCeykf0MlMmvL5peXnMhGdKwWb/rWQjUz6DwXlgzrUQ81xIydCmw8SrZl/9TtEHzZrNbfZHVb/ZFIgmxRBuMxTsxE8RpF8LNUBFf47x0BOSwYRzMfHPsH6bPX2bCspqjwywCspAi6yIhXDJD+8wRs= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1774563946; c=relaxed/simple; bh=TfemElEfdERFkRLsHdlR0kNi3ItobD/8s52eJnmiwi0=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=DA5VJfNossMHsSVuJc38qHslnu3DdzWFVJ79FjR73MMd3hzjzAE7Cy1ipvLvNgo3VE9Uwz0XnoY2rSHZ332Ask/SPbMnXQ+nfLZtSdIooG1QpkgnzSVHa0RWI6G8+ID80/ohNs8gCCFvbUmpVSD9Oy/CEVpg9mLNvTlW42q7c60= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com; spf=pass smtp.mailfrom=flex--ackerleytng.bounces.google.com; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b=dPMvGsNG; arc=none smtp.client-ip=209.85.210.201 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=flex--ackerleytng.bounces.google.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="dPMvGsNG" Received: by mail-pf1-f201.google.com with SMTP id d2e1a72fcca58-82c70d1f65aso1086241b3a.1 for ; Thu, 26 Mar 2026 15:25:45 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20251104; t=1774563945; x=1775168745; darn=vger.kernel.org; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:from:to:cc:subject:date:message-id:reply-to; bh=Uu5GxkLk2ihC25vK1ewNFZZkf5k5QyN5WL/Cx64gQr4=; b=dPMvGsNGBERuKUU24DRYIC0oZ1BT6qGoDB1iZjnMTZC+cptXz/l6k+anA1Njha1c3v 74a9CGqwMA106pFsk5wClT1eIliUDFplIq6M4J6ENUBHFMUNHOmKcLldl64Gn922eZTT 3UthHX7Wo8VNnXvfrIt5iyc0WlYRrLQzbowSnV3ujDKXeYktsyDlK31Yb9kGs7frTJww R2fEKIU4Hm0jb3d1MzcBnSmgOn+kC1zIDnSrJ/H0jAB1YShCFV9T4JMW2Sy0UhtCbp7l zVFa7eWK1x5DOEggNQqheEd7DYNP2RRtQ95qNM7VOO3Rymixch9taknipvoHAo+DI55B Tlkw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1774563945; x=1775168745; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=Uu5GxkLk2ihC25vK1ewNFZZkf5k5QyN5WL/Cx64gQr4=; b=Ic9kHbs1+Dhrq7AEqhYEHHaaogTY+QTNhvcjeFZli1K54UD8uBlBi9j+w19ob0l1VY FOGlrMJznw6u6uP7q8CGVVTMdkMv38Jg/DWE3D6hqBCFRHWQ7SZ5Y7TUbHiFRRcXUEEW sLDduWUjAmG4PknyABW2JUtUxiSvWp+aAofuBii9tH5mtsHGdtpNhgZBZLRqCQlVdtSE ktMpdjKqY0oDdphOiHEMor4lEfnA6QGSabcTXWIS8xPDv0GNaNoYHyMvcBK4csk1JFCH 2EoAZkIDJfMWdwhjW0vYl3jhxRBvf1RRMJGZQI6s1ehPkDy2IdEXBRmBN+CVgB3wRPDT MByg== X-Forwarded-Encrypted: i=1; AJvYcCX7v6paXZsUGSKxEZ03brwk2j+CKcQtA6EIg9NygWLkRsWOSfpnDbtgqs/l6VK/kNRkcnxB/T1gtzbFcEI=@vger.kernel.org X-Gm-Message-State: AOJu0Yxo9+L1mWtgTnP+PzWK/WIjlwpj+ihFFpRqzijb7iO6l8+kfUo8 V/qTo2m1/4pig+VkXWxZw/vwInJcnv2h4wSIFPEaI7NlpoStLv2foER6viHhjFzHW6I0L9mF6nm 4CgImoLx72pba5A5eNzSr/0HYlQ== X-Received: from pfbln8.prod.google.com ([2002:a05:6a00:3cc8:b0:7b9:1e6:e516]) (user=ackerleytng job=prod-delivery.src-stubby-dispatcher) by 2002:a05:6a00:1f03:b0:82a:6166:3a9c with SMTP id d2e1a72fcca58-82c9602597fmr137178b3a.29.1774563944430; Thu, 26 Mar 2026 15:25:44 -0700 (PDT) Date: Thu, 26 Mar 2026 15:24:48 -0700 In-Reply-To: <20260326-gmem-inplace-conversion-v4-0-e202fe950ffd@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20260326-gmem-inplace-conversion-v4-0-e202fe950ffd@google.com> X-Developer-Key: i=ackerleytng@google.com; a=ed25519; pk=sAZDYXdm6Iz8FHitpHeFlCMXwabodTm7p8/3/8xUxuU= X-Developer-Signature: v=1; a=ed25519-sha256; t=1774563861; l=1297; i=ackerleytng@google.com; s=20260225; h=from:subject:message-id; bh=lEdbMLRc9XzFP+/DjPRFPv8Oj2L73VX0SttQ1H+9ibg=; b=Lzqqurlvp5Ti9M3NDoksM02NMKtbbW2WTjtthOuBwY9jkE+E3i27WA/wipcC/9QRLsA8QLCRD lkWb3PDIcJtD/RB2l596NV5A74CNdl8PajbjHY1/QAqCHxi6RcLc2od X-Mailer: b4 0.14.3 Message-ID: <20260326-gmem-inplace-conversion-v4-39-e202fe950ffd@google.com> Subject: [PATCH RFC v4 39/44] KVM: selftests: Check fd/flags provided to mmap() when setting up memslot From: Ackerley Tng To: aik@amd.com, andrew.jones@linux.dev, binbin.wu@linux.intel.com, brauner@kernel.org, chao.p.peng@linux.intel.com, david@kernel.org, ira.weiny@intel.com, jmattson@google.com, jroedel@suse.de, 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, tabba@google.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, 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 , Baoquan He , Barry Song , Axel Rasmussen , Yuanchu Xie , Wei Xu , Jason Gunthorpe , Vlastimil Babka Cc: 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, Ackerley Tng Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable From: Sean Christopherson Check that a valid fd provided to mmap() must be accompanied by MAP_SHARED. With an invalid fd (usually used for anonymous mappings), there are no constraints on mmap() flags. Add this check to make sure that when a guest_memfd is used as region->fd, the flag provided to mmap() will include MAP_SHARED. Signed-off-by: Sean Christopherson [Rephrase assertion message.] Signed-off-by: Ackerley Tng --- tools/testing/selftests/kvm/lib/kvm_util.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/tools/testing/selftests/kvm/lib/kvm_util.c b/tools/testing/sel= ftests/kvm/lib/kvm_util.c index 6deb6b333a066..6f7d3adb25d0a 100644 --- a/tools/testing/selftests/kvm/lib/kvm_util.c +++ b/tools/testing/selftests/kvm/lib/kvm_util.c @@ -1095,6 +1095,9 @@ void vm_mem_add(struct kvm_vm *vm, enum vm_mem_backin= g_src_type src_type, src_type =3D=3D VM_MEM_SRC_SHARED_HUGETLB); } =20 + TEST_ASSERT(region->fd =3D=3D -1 || backing_src_is_shared(src_type), + "A valid fd provided to mmap() must be accompanied by MAP_SHARED."); + region->mmap_start =3D __kvm_mmap(region->mmap_size, PROT_READ | PROT_WRI= TE, vm_mem_backing_src_alias(src_type)->flag, region->fd, mmap_offset); --=20 2.53.0.1018.g2bb0e51243-goog From nobody Thu Apr 2 09:33:37 2026 Received: from mail-pj1-f74.google.com (mail-pj1-f74.google.com [209.85.216.74]) (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 65A133E0C7C for ; Thu, 26 Mar 2026 22:25:47 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.216.74 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1774563948; cv=none; b=e6fHfDPWvWwql+CSFVhjS8WFBg+KOjhy2GwunW6SBgrmiriOcmsEf3YjAD0GDMyp08Vse+brozN7C1GlQksjbBa3qRlIf8sjHtFQKlF73p7P4W628XSKlTnQ4LKnFv9CvZfqjHlb+Af4JY5YWS14+COjNyRQuUEPw06FDYmg/1s= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1774563948; c=relaxed/simple; bh=UdkBDo4oFBkXTHel5o8ZsFzPW+C1nVjCh4r6CInrjXo=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=rg1dvyCwCRcIaDeKL17OWzsht4fwErKSHrYPkSR0lVE36Vqlw17Eu49FNYjs3IP8+DzujeMG3WtGqnnB31xykq9A6EoPqMms5lu27AcA6rlagYRWRrYKn3En0DmWDZGE8bzDYhUg5KyvGCPQOGl61b15JzmlT2FHW9WzmrxOvyQ= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com; spf=pass smtp.mailfrom=flex--ackerleytng.bounces.google.com; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b=gS5d3kjc; arc=none smtp.client-ip=209.85.216.74 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=flex--ackerleytng.bounces.google.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="gS5d3kjc" Received: by mail-pj1-f74.google.com with SMTP id 98e67ed59e1d1-35bea322389so1723001a91.1 for ; Thu, 26 Mar 2026 15:25:47 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20251104; t=1774563947; x=1775168747; darn=vger.kernel.org; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:from:to:cc:subject:date:message-id:reply-to; bh=uxISHYd3W3FTll0OYwaGPsDXdAUGKJkLGuwa2uoTRP0=; b=gS5d3kjcf9ZAX9djM5DGOv++dr5JvMipK8mGdW92aRPH5nq3Xny31A8F3wSQlANyuo xQpnmNBU589AewtFsGb75RO3Sxe8YtEeqxTa0kNMF1DAmD85/yIfe6sKomOlSxqWxckT W4EhblZkuSmRG2PSzWVKPhsXj/MK2WjJW0cCV7KjSwhVMHbmsYpD0pf2OZq9rOyMvEDY ztaDcDUpMQ+E3e3qL0Vhi1Srk0uE/U/V0Zn+IqbhCkRaMhcWFnrng7IOFBwVmMlsaKNc 1jJs330PH4YktYt5n5U5vjIX8/oxWMkYQFr7Or474mluGLReIypIji+RzMkOoTj9DpVQ NPpA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1774563947; x=1775168747; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=uxISHYd3W3FTll0OYwaGPsDXdAUGKJkLGuwa2uoTRP0=; b=VMjO0EDtUf++IugTXj5M6FllMq8DmmCg41p7B6lBKd9yCGtOd4Gkhu60gr3AptdAyv +lUX37HpAQVxQzgWfrqvZS9CJITav4pHgAfRLPq8XBd+PKYTSp8HK7X4PhiI3u8O7Zou xZLJVH96zLC3vp7uMvQo97rE3pq3u58olbTEWkW/QrORhlcq37/A5BGMS2MXCCyg1Thw T7VXS5e6zUdM6vFfN+Z1A6shkYNgA1lW1wPYvrb5E9l3UnEoJGuG3DKkbsQmygvy+vwW rkkdYFdTxLyJsFXwWFub+dcLJvTuedGBbs3Yzkymuv5MWhlLjPCZH3mHHiaYn3p8bnut vTmQ== X-Forwarded-Encrypted: i=1; AJvYcCVWE0Qq9DTAbCAx9+qS9EFVHEZMphMjhFABS3OJaWS7wjsGj9ab50x9Qqz7EeVfVANZC5MuWD8bCbiosSA=@vger.kernel.org X-Gm-Message-State: AOJu0Yx2WSjx5zxEgEyVulAqixOOoWBtoKiheqhzNTHdL+YneguaLkPl 619oYgfF9XtCNWKqhcK4px/wJopQj+8bCO/aMfvdzqS6DaxViVF+sQxqyKQcmh7dx4715LxVaCT ZGtkLtn8uR9DlYoJAGcY/D/tuMQ== X-Received: from pgbcr7.prod.google.com ([2002:a05:6a02:4107:b0:c74:42:899a]) (user=ackerleytng job=prod-delivery.src-stubby-dispatcher) by 2002:a17:90b:4c:b0:359:8eaa:7f42 with SMTP id 98e67ed59e1d1-35c30056c25mr252326a91.18.1774563946580; Thu, 26 Mar 2026 15:25:46 -0700 (PDT) Date: Thu, 26 Mar 2026 15:24:49 -0700 In-Reply-To: <20260326-gmem-inplace-conversion-v4-0-e202fe950ffd@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20260326-gmem-inplace-conversion-v4-0-e202fe950ffd@google.com> X-Developer-Key: i=ackerleytng@google.com; a=ed25519; pk=sAZDYXdm6Iz8FHitpHeFlCMXwabodTm7p8/3/8xUxuU= X-Developer-Signature: v=1; a=ed25519-sha256; t=1774563861; l=5283; i=ackerleytng@google.com; s=20260225; h=from:subject:message-id; bh=UdkBDo4oFBkXTHel5o8ZsFzPW+C1nVjCh4r6CInrjXo=; b=ekDVL11JYYjJUYvymKIHGTVycixyPeCaJxJvIY0KEoHTIw9VHcxDrJTqDhJsHWWpAaHT93McN K08mqT17n/eDM86iL0+q9pH2zxZ9JI8j/SugMW+LvhwJ33ZMYZTlGvK X-Mailer: b4 0.14.3 Message-ID: <20260326-gmem-inplace-conversion-v4-40-e202fe950ffd@google.com> Subject: [PATCH RFC v4 40/44] KVM: selftests: Make TEST_EXPECT_SIGBUS thread-safe From: Ackerley Tng To: aik@amd.com, andrew.jones@linux.dev, binbin.wu@linux.intel.com, brauner@kernel.org, chao.p.peng@linux.intel.com, david@kernel.org, ira.weiny@intel.com, jmattson@google.com, jroedel@suse.de, 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, tabba@google.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, 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 , Baoquan He , Barry Song , Axel Rasmussen , Yuanchu Xie , Wei Xu , Jason Gunthorpe , Vlastimil Babka Cc: 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, Ackerley Tng Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable The TEST_EXPECT_SIGBUS macro is not thread-safe as it uses a global sigjmp_buf and installs a global SIGBUS signal handler. If multiple threads execute the macro concurrently, they will race on installing the signal handler and stomp on other threads' jump buffers, leading to incorrect test behavior. Make TEST_EXPECT_SIGBUS thread-safe with the following changes: Share the KVM tests' global signal handler. sigaction() applies to all threads; without sharing a global signal handler, one thread may have removed the signal handler that another thread added, hence leading to unexpected signals. The alternative of layering signal handlers was considered, but calling sigaction() within TEST_EXPECT_SIGBUS() necessarily creates a race. To avoid adding new setup and teardown routines to do sigaction() and keep usage of TEST_EXPECT_SIGBUS() simple, share the KVM tests' global signal handler. Opportunistically rename report_unexpected_signal to catchall_signal_handler. To continue to only expect SIGBUS within specific regions of code, use a thread-specific variable, expecting_sigbus, to replace installing and removing signal handlers. Make the execution environment for the thread, sigjmp_buf, a thread-specific variable. As part of TEST_EXPECT_SIGBUS(), assert the prerequisite for this setup, that the current signal handler is the catchall_signal_handler. Signed-off-by: Ackerley Tng --- tools/testing/selftests/kvm/include/test_util.h | 32 +++++++++++++--------= ---- tools/testing/selftests/kvm/lib/kvm_util.c | 18 ++++++++++---- tools/testing/selftests/kvm/lib/test_util.c | 7 ------ 3 files changed, 30 insertions(+), 27 deletions(-) diff --git a/tools/testing/selftests/kvm/include/test_util.h b/tools/testin= g/selftests/kvm/include/test_util.h index 2871a42928471..82f6b371fe767 100644 --- a/tools/testing/selftests/kvm/include/test_util.h +++ b/tools/testing/selftests/kvm/include/test_util.h @@ -80,21 +80,23 @@ do { \ __builtin_unreachable(); \ } while (0) =20 -extern sigjmp_buf expect_sigbus_jmpbuf; -void expect_sigbus_handler(int signum); - -#define TEST_EXPECT_SIGBUS(action) \ -do { \ - struct sigaction sa_old, sa_new =3D { \ - .sa_handler =3D expect_sigbus_handler, \ - }; \ - \ - sigaction(SIGBUS, &sa_new, &sa_old); \ - if (sigsetjmp(expect_sigbus_jmpbuf, 1) =3D=3D 0) { \ - action; \ - TEST_FAIL("'%s' should have triggered SIGBUS", #action); \ - } \ - sigaction(SIGBUS, &sa_old, NULL); \ +extern __thread sigjmp_buf expect_sigbus_jmpbuf; +extern __thread volatile sig_atomic_t expecting_sigbus; +extern void catchall_signal_handler(int signum); + +#define TEST_EXPECT_SIGBUS(action) \ +do { \ + struct sigaction sa =3D {}; \ + \ + TEST_ASSERT_EQ(sigaction(SIGBUS, NULL, &sa), 0); \ + TEST_ASSERT_EQ(sa.sa_handler, &catchall_signal_handler); \ + \ + expecting_sigbus =3D true; \ + if (sigsetjmp(expect_sigbus_jmpbuf, 1) =3D=3D 0) { \ + action; \ + TEST_FAIL("'%s' should have triggered SIGBUS", #action);\ + } \ + expecting_sigbus =3D false; \ } while (0) =20 size_t parse_size(const char *size); diff --git a/tools/testing/selftests/kvm/lib/kvm_util.c b/tools/testing/sel= ftests/kvm/lib/kvm_util.c index 6f7d3adb25d0a..eaa5a1afa1d9b 100644 --- a/tools/testing/selftests/kvm/lib/kvm_util.c +++ b/tools/testing/selftests/kvm/lib/kvm_util.c @@ -2347,13 +2347,20 @@ __weak void kvm_selftest_arch_init(void) { } =20 -static void report_unexpected_signal(int signum) +__thread sigjmp_buf expect_sigbus_jmpbuf; +__thread volatile sig_atomic_t expecting_sigbus; + +void catchall_signal_handler(int signum) { + switch (signum) { + case SIGBUS: { + if (expecting_sigbus) + siglongjmp(expect_sigbus_jmpbuf, 1); + + TEST_FAIL("Unexpected SIGBUS (%d)\n", signum); + } #define KVM_CASE_SIGNUM(sig) \ case sig: TEST_FAIL("Unexpected " #sig " (%d)\n", signum) - - switch (signum) { - KVM_CASE_SIGNUM(SIGBUS); KVM_CASE_SIGNUM(SIGSEGV); KVM_CASE_SIGNUM(SIGILL); KVM_CASE_SIGNUM(SIGFPE); @@ -2365,12 +2372,13 @@ static void report_unexpected_signal(int signum) void __attribute((constructor)) kvm_selftest_init(void) { struct sigaction sig_sa =3D { - .sa_handler =3D report_unexpected_signal, + .sa_handler =3D catchall_signal_handler, }; =20 /* Tell stdout not to buffer its content. */ setbuf(stdout, NULL); =20 + expecting_sigbus =3D false; sigaction(SIGBUS, &sig_sa, NULL); sigaction(SIGSEGV, &sig_sa, NULL); sigaction(SIGILL, &sig_sa, NULL); diff --git a/tools/testing/selftests/kvm/lib/test_util.c b/tools/testing/se= lftests/kvm/lib/test_util.c index 8a1848586a857..03eb99af9b8de 100644 --- a/tools/testing/selftests/kvm/lib/test_util.c +++ b/tools/testing/selftests/kvm/lib/test_util.c @@ -18,13 +18,6 @@ =20 #include "test_util.h" =20 -sigjmp_buf expect_sigbus_jmpbuf; - -void __attribute__((used)) expect_sigbus_handler(int signum) -{ - siglongjmp(expect_sigbus_jmpbuf, 1); -} - /* * Random number generator that is usable from guest code. This is the * Park-Miller LCG using standard constants. --=20 2.53.0.1018.g2bb0e51243-goog From nobody Thu Apr 2 09:33:37 2026 Received: from mail-pg1-f201.google.com (mail-pg1-f201.google.com [209.85.215.201]) (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 A7E8C3E1CF3 for ; Thu, 26 Mar 2026 22:25:49 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.215.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1774563951; cv=none; b=b5Tr13J9YbTzB0abLEWOXb8CMfSBku44/tqcxCKmTlp6PKJIZ08ZXg8qLmEqCyMEkG94ZNg2jIWAI45bvPZe245W8JjCUuB/y2WbyYx7pYD2PU5Fh4g4+Z3t+rIrVla0rNY8zkfLQ+A4YKWDvF8iKMz4WRIcgVunORMczyAfMxI= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1774563951; c=relaxed/simple; bh=atM67lZrb3L/4FSuzE/lIWzYT7CU6pwH5U1B0OOVyHY=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=UPTYoHlLMZJNaKNwONl9n77Eiy4k+CnT2HlIbYCaIm/2STZRWjogaEFmk69Fujocch0q9y/7wIsrP55hVltZY8OeQ3dCIMEmUrqH+X9RDtnwvNP/COjhxRsRiFpp3TVwUZruPgpdbdWNg5ZT9cxUmcxtqH+QNRiwpZT8eMewwDI= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com; spf=pass smtp.mailfrom=flex--ackerleytng.bounces.google.com; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b=vyvdk4GD; arc=none smtp.client-ip=209.85.215.201 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=flex--ackerleytng.bounces.google.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="vyvdk4GD" Received: by mail-pg1-f201.google.com with SMTP id 41be03b00d2f7-c741f038f7cso1005842a12.2 for ; Thu, 26 Mar 2026 15:25:49 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20251104; t=1774563949; x=1775168749; darn=vger.kernel.org; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:from:to:cc:subject:date:message-id:reply-to; bh=YsFx8S2ZIsHTA7mxdUPwMmhoKs9OpIzRTtvg/d03faw=; b=vyvdk4GDEpoTi5tqF13UIRCC6EVzVP5ZrEGvShOwfUs1WNUCmwC0LRtzqDu5sDCYWQ JxfgbpfyRWJz4xlye5x+zSNYxOGQYUx2i0CDMpgVqSBxQjfULyPFwCcfNW8dlTJa80CR JbMRI62iov3MW6Q+1a9BUbIiBv7p4XUP9ngoADhXBh784bpv81Ei8LQOIETDXexz2qC7 rU02g3qIDRlo/wEkldx1MPWCz0Cm/CaN8sszYIATdzV7wCRWz/tt2hTABeAvhsLyTgRk QJkVh9L5OfN+AxzYPKXstArdCy9g+ZIybpHbp4dv2XFyj/DJfQfrxAK2wIcZ608D+fP7 hBkQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1774563949; x=1775168749; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=YsFx8S2ZIsHTA7mxdUPwMmhoKs9OpIzRTtvg/d03faw=; b=Y/HddPtQR7cJuCyIY60FnUKf7bYxeoShEB5yklWgDsDECyZtKndOJxRsoss0x1GLg9 68JdWsytGhCbhc3yBHVtlghL+5jsadP2LRD8qRxbrAhZrl4Xu0HGwgEBF2FJ875RfNHK O/f4VlXLbm9JDHD/5L58Z0RAk/Q0RNoaC8zX6ljYpuBF0awU3Z4Ni9jtjpOPpY+d4w3K WTD5/4VvLlwI69w9iwLydEjRe05J55+P0dpQ8STiaSCbNGRjtnA5qVoipmUkVG6n0Mpe 6bPU/IxdSdmdQ4K32mf4AybL7UFGTEPtdKEc7QBMU2UC1Z1at+t4eD2QtqVCBzrzI1Og IJNA== X-Forwarded-Encrypted: i=1; AJvYcCV1/aLaUM/ANareK/cJt8vZXwxFS/ZE5LAXBojlqdY9vfmjig5l+s8NttstK+U1GkvuKDuWeKgLQuIoof0=@vger.kernel.org X-Gm-Message-State: AOJu0YyDVfB2cdHCZpM4PiRA0GhniZpn74ZeexNAycQUw9HAMAZv4LFS tOc6lerPSQaRfuci58g8CoxVwVsmdSDBePM4Mgrip174qq/gMzF11QIhrjcOfwk4gSTvzOAusId ScqWisVqKj/RL4RWL6sCi6K/8ZQ== X-Received: from pfwy16.prod.google.com ([2002:a05:6a00:1c90:b0:82c:6e7c:ac6d]) (user=ackerleytng job=prod-delivery.src-stubby-dispatcher) by 2002:a05:6a00:b488:b0:82a:60ad:874 with SMTP id d2e1a72fcca58-82c95e9ec0amr174041b3a.19.1774563948768; Thu, 26 Mar 2026 15:25:48 -0700 (PDT) Date: Thu, 26 Mar 2026 15:24:50 -0700 In-Reply-To: <20260326-gmem-inplace-conversion-v4-0-e202fe950ffd@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20260326-gmem-inplace-conversion-v4-0-e202fe950ffd@google.com> X-Developer-Key: i=ackerleytng@google.com; a=ed25519; pk=sAZDYXdm6Iz8FHitpHeFlCMXwabodTm7p8/3/8xUxuU= X-Developer-Signature: v=1; a=ed25519-sha256; t=1774563861; l=5336; i=ackerleytng@google.com; s=20260225; h=from:subject:message-id; bh=atM67lZrb3L/4FSuzE/lIWzYT7CU6pwH5U1B0OOVyHY=; b=5MuqTkb5deqhYAPqYmfVeS6JWQaZBgzlViovjh0d6q6SQRu7C3TxjQOxMfoLP3N43SByS4Jw5 ZnxOUmxggc7B4jsUWt0qDmE7eGPO++o93Lfuw6k6XZIImuFyIUiBC0X X-Mailer: b4 0.14.3 Message-ID: <20260326-gmem-inplace-conversion-v4-41-e202fe950ffd@google.com> Subject: [PATCH RFC v4 41/44] KVM: selftests: Update private_mem_conversions_test to mmap() guest_memfd From: Ackerley Tng To: aik@amd.com, andrew.jones@linux.dev, binbin.wu@linux.intel.com, brauner@kernel.org, chao.p.peng@linux.intel.com, david@kernel.org, ira.weiny@intel.com, jmattson@google.com, jroedel@suse.de, 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, tabba@google.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, 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 , Baoquan He , Barry Song , Axel Rasmussen , Yuanchu Xie , Wei Xu , Jason Gunthorpe , Vlastimil Babka Cc: 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, Ackerley Tng Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Update the private memory conversions selftest to also test conversions that are done "in-place" via per-guest_memfd memory attributes. In-place conversions require the host to be able to mmap() the guest_memfd so that the host and guest can share the same backing physical memory. This includes several updates, that are conditioned on the system supporting per-guest_memfd attributes (kvm_has_gmem_attributes): 1. Set up guest_memfd requesting MMAP and INIT_SHARED. 2. With in-place conversions, the host's mapping points directly to the guest's memory. When the guest converts a region to private, host access to that region is blocked. Update the test to expect a SIGBUS when attempting to access the host virtual address (HVA) of private memory. 3. Use vm_mem_set_memory_attributes(), which chooses how to set memory attributes based on whether kvm_has_gmem_attributes. Restrict the test to using VM_MEM_SRC_SHMEM because guest_memfd's required mmap() flags and page sizes happens to align with those of VM_MEM_SRC_SHMEM. As long as VM_MEM_SRC_SHMEM is used for src_type, vm_mem_add() works as intended. Signed-off-by: Ackerley Tng Co-developed-by: Sean Christopherson Signed-off-by: Sean Christopherson --- .../kvm/x86/private_mem_conversions_test.c | 46 ++++++++++++++++++= ---- 1 file changed, 38 insertions(+), 8 deletions(-) diff --git a/tools/testing/selftests/kvm/x86/private_mem_conversions_test.c= b/tools/testing/selftests/kvm/x86/private_mem_conversions_test.c index 47f1eb9212591..29c3c5b2f538e 100644 --- a/tools/testing/selftests/kvm/x86/private_mem_conversions_test.c +++ b/tools/testing/selftests/kvm/x86/private_mem_conversions_test.c @@ -306,9 +306,14 @@ static void handle_exit_hypercall(struct kvm_vcpu *vcp= u) if (do_fallocate) vm_guest_mem_fallocate(vm, gpa, size, map_shared); =20 - if (set_attributes) - vm_set_memory_attributes(vm, gpa, size, - map_shared ? 0 : KVM_MEMORY_ATTRIBUTE_PRIVATE); + if (set_attributes) { + u64 attrs =3D map_shared ? 0 : KVM_MEMORY_ATTRIBUTE_PRIVATE; + u64 flags =3D kvm_has_gmem_attributes ? + KVM_SET_MEMORY_ATTRIBUTES2_PRESERVE : 0; + + vm_mem_set_memory_attributes(vm, gpa, size, attrs, flags); + } + run->hypercall.ret =3D 0; } =20 @@ -352,8 +357,20 @@ static void *__test_mem_conversions(void *__vcpu) size_t nr_bytes =3D min_t(size_t, vm->page_size, size - i); uint8_t *hva =3D addr_gpa2hva(vm, gpa + i); =20 - /* In all cases, the host should observe the shared data. */ - memcmp_h(hva, gpa + i, uc.args[3], nr_bytes); + /* + * When using per-guest_memfd memory attributes, + * i.e. in-place conversion, host accesses will + * point at guest memory and should SIGBUS when + * guest memory is private. When using per-VM + * attributes, i.e. separate backing for shared + * vs. private, the host should always observe + * the shared data. + */ + if (kvm_has_gmem_attributes && + uc.args[0] =3D=3D SYNC_PRIVATE) + TEST_EXPECT_SIGBUS(READ_ONCE(*hva)); + else + memcmp_h(hva, gpa + i, uc.args[3], nr_bytes); =20 /* For shared, write the new pattern to guest memory. */ if (uc.args[0] =3D=3D SYNC_SHARED) @@ -382,6 +399,7 @@ static void test_mem_conversions(enum vm_mem_backing_sr= c_type src_type, uint32_t const size_t slot_size =3D memfd_size / nr_memslots; struct kvm_vcpu *vcpus[KVM_MAX_VCPUS]; pthread_t threads[KVM_MAX_VCPUS]; + uint64_t gmem_flags; struct kvm_vm *vm; int memfd, i; =20 @@ -397,12 +415,17 @@ static void test_mem_conversions(enum vm_mem_backing_= src_type src_type, uint32_t =20 vm_enable_cap(vm, KVM_CAP_EXIT_HYPERCALL, (1 << KVM_HC_MAP_GPA_RANGE)); =20 - memfd =3D vm_create_guest_memfd(vm, memfd_size, 0); + if (kvm_has_gmem_attributes) + gmem_flags =3D GUEST_MEMFD_FLAG_MMAP | GUEST_MEMFD_FLAG_INIT_SHARED; + else + gmem_flags =3D 0; + + memfd =3D vm_create_guest_memfd(vm, memfd_size, gmem_flags); =20 for (i =3D 0; i < nr_memslots; i++) vm_mem_add(vm, src_type, BASE_DATA_GPA + slot_size * i, BASE_DATA_SLOT + i, slot_size / vm->page_size, - KVM_MEM_GUEST_MEMFD, memfd, slot_size * i, 0); + KVM_MEM_GUEST_MEMFD, memfd, slot_size * i, gmem_flags); =20 for (i =3D 0; i < nr_vcpus; i++) { uint64_t gpa =3D BASE_DATA_GPA + i * per_cpu_size; @@ -452,17 +475,24 @@ static void usage(const char *cmd) =20 int main(int argc, char *argv[]) { - enum vm_mem_backing_src_type src_type =3D DEFAULT_VM_MEM_SRC; + enum vm_mem_backing_src_type src_type; uint32_t nr_memslots =3D 1; uint32_t nr_vcpus =3D 1; int opt; =20 TEST_REQUIRE(kvm_check_cap(KVM_CAP_VM_TYPES) & BIT(KVM_X86_SW_PROTECTED_V= M)); =20 + src_type =3D kvm_has_gmem_attributes ? VM_MEM_SRC_SHMEM : + DEFAULT_VM_MEM_SRC; + while ((opt =3D getopt(argc, argv, "hm:s:n:")) !=3D -1) { switch (opt) { case 's': src_type =3D parse_backing_src_type(optarg); + TEST_ASSERT(!kvm_has_gmem_attributes || + src_type =3D=3D VM_MEM_SRC_SHMEM, + "Testing in-place conversions, only %s mem_type supported\n", + vm_mem_backing_src_alias(VM_MEM_SRC_SHMEM)->name); break; case 'n': nr_vcpus =3D atoi_positive("nr_vcpus", optarg); --=20 2.53.0.1018.g2bb0e51243-goog From nobody Thu Apr 2 09:33:37 2026 Received: from mail-pg1-f202.google.com (mail-pg1-f202.google.com [209.85.215.202]) (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 EE54D3E2748 for ; Thu, 26 Mar 2026 22:25:51 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.215.202 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1774563953; cv=none; b=Ru2J07UhWXo6eyrjQpsoa8kA7sbh9F41o1ReXzlxNVyJAVzWNM6Os8ixNq9iYE+TNVyPO0e/yoze07FpmN9mAemlKNbP1qZnaniYXt6R1Qk/ALCOyRzFh4Te3gtQHCk2kFuwTB6SpYtSuEIqQUP4r7ZjgvVAxX7G/go/T5t0vao= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1774563953; c=relaxed/simple; bh=1UdkhOs2Zqea3da/lUF30fB7TjQvN3BF4p6nSKOEiMw=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=YGtkTvSrrvfGjyJNcC95cmKYzBmVCVh96YwtnZvJSFRGJ8+xtSmDg+3dgTb/yI7Sci0TslHut3rREjcYJQfTzuJyZ1WgPDLnO6GeIegGyYpbGrTw83wO/KCDSyBSqSUj7ytrBbqstk8qRziNQG5ZRpx9SzydBwOh8gfcz0oKDHA= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com; spf=pass smtp.mailfrom=flex--ackerleytng.bounces.google.com; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b=Bj5x/XEp; arc=none smtp.client-ip=209.85.215.202 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=flex--ackerleytng.bounces.google.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="Bj5x/XEp" Received: by mail-pg1-f202.google.com with SMTP id 41be03b00d2f7-c70f19f0f37so863923a12.0 for ; Thu, 26 Mar 2026 15:25:51 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20251104; t=1774563951; x=1775168751; darn=vger.kernel.org; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:from:to:cc:subject:date:message-id:reply-to; bh=FOvCiY0rlYUHe0fOI7v6StFLJG8uwpZnrT+/fXekcCU=; b=Bj5x/XEpFnMFfMV51uL3Fm4k+IQd6m9kP34A3JxIByQMyMBsBZ3TGzlYdsUeXN57G6 AxFj5O1AqSUcF7WzDePwlQ0HYTSB0Vint+xVzfOFYeLV19qWc0KNaXgxzLrQkA+IVvvQ O4F8E7D1jpohnlgVKnXAazbI61pB8LC2fcdRTfgonb7L1ehKgbIGpHcVnlcZ7sGxFs7h wAi2OnAwhQXWRfwa/GUKEM8HNQ4Z5YOUdB2dQcItJ5nWmm8XgbHwM2Xu5LwF9akSjAMI C5CRoLkW/uuS/mc1ytiIXuuBWdRtaUDtjGuOdFzwDVkcUplG41aIlBia1SLje2j1ceGY Fh0g== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1774563951; x=1775168751; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=FOvCiY0rlYUHe0fOI7v6StFLJG8uwpZnrT+/fXekcCU=; b=El95S7SCYuwksnN273oFxvQPvwOd+u6c4+NxPlbdyPEqZD2NlrX03thzPlqyZMKdVP uPLRqDYZDADsVsdHOBxasmmWCchAXWBn9lrZpnzoEbNrW+UHpaDsxo74vsirMDv6i8Tt SnelxUntuzFe/wbjtOop4ew8el9MsdspVrA9jX4p9Kil5Vg4MVgMNKX4KSAUB7kqj8GM ou4fQJCAYHnAOnkc1gSqr6z93Av+83ySk7wHrDQmFokeoen+AkmkY1mmqZz1c7zcqkir IrFK9tUzgjR2Ha3gygVx6D3aaVbMwhr8nnXb6DM2DI3Fq0I8WtdaV/gIY2RDOciH5WmI j3hw== X-Forwarded-Encrypted: i=1; AJvYcCV3UyqcUtiAUSELESlCnFAGt3mrm3GgFSPaROVOTaY9XUXQUzZunbPmP4tCcsnNsB+UZT/V/HlGOXR82Ro=@vger.kernel.org X-Gm-Message-State: AOJu0Yz7YpKaaT4JnxIyOw0J/ZS1YxP3Up98htEOOqLHDv7wcFoRRrIj CC9LOKY2sXe3K18l7YOVjD063lLW9+eONLeI/RVAWJ0GkHhdMplH1DdIzvMzRMYDg/1kNoc8gII eLnJkv+pBnnDG8jfOegdc7jixUw== X-Received: from pfbfm13.prod.google.com ([2002:a05:6a00:2f8d:b0:829:9230:5ae0]) (user=ackerleytng job=prod-delivery.src-stubby-dispatcher) by 2002:a05:6a00:4507:b0:824:b03f:2f65 with SMTP id d2e1a72fcca58-82c86327803mr2544703b3a.7.1774563950966; Thu, 26 Mar 2026 15:25:50 -0700 (PDT) Date: Thu, 26 Mar 2026 15:24:51 -0700 In-Reply-To: <20260326-gmem-inplace-conversion-v4-0-e202fe950ffd@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20260326-gmem-inplace-conversion-v4-0-e202fe950ffd@google.com> X-Developer-Key: i=ackerleytng@google.com; a=ed25519; pk=sAZDYXdm6Iz8FHitpHeFlCMXwabodTm7p8/3/8xUxuU= X-Developer-Signature: v=1; a=ed25519-sha256; t=1774563861; l=7309; i=ackerleytng@google.com; s=20260225; h=from:subject:message-id; bh=1UdkhOs2Zqea3da/lUF30fB7TjQvN3BF4p6nSKOEiMw=; b=meNvl6H7hNe8vhcHr6NLmKIGogD5I73dTRdM0T0sz1m8FYD72Qb0slyTw8HDNsQ1XuejDyVCT q28EwvSh0emB3EOo8KZcCpFTHjegPcgqXIoPGnFsgPbAJ9DfeA1BI4h X-Mailer: b4 0.14.3 Message-ID: <20260326-gmem-inplace-conversion-v4-42-e202fe950ffd@google.com> Subject: [PATCH RFC v4 42/44] KVM: selftests: Add script to exercise private_mem_conversions_test From: Ackerley Tng To: aik@amd.com, andrew.jones@linux.dev, binbin.wu@linux.intel.com, brauner@kernel.org, chao.p.peng@linux.intel.com, david@kernel.org, ira.weiny@intel.com, jmattson@google.com, jroedel@suse.de, 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, tabba@google.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, 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 , Baoquan He , Barry Song , Axel Rasmussen , Yuanchu Xie , Wei Xu , Jason Gunthorpe , Vlastimil Babka Cc: 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, Ackerley Tng Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Add a wrapper script to simplify running the private_mem_conversions_test with a variety of configurations. Manually invoking the test for all supported memory backing source types is tedious. The script automatically detects the availability of 2MB and 1GB hugepages and builds a list of source types to test. It then iterates through the list, running the test for each type with both a single memslot and multiple memslots. This makes it easier to get comprehensive test coverage across different memory configurations. Add and use a helper program in C to be able to read KVM_CAP_GUEST_MEMFD_MEMORY_ATTRIBUTES as defined in header files and then issue the ioctl to read the KVM CAP. Signed-off-by: Ackerley Tng --- tools/testing/selftests/kvm/Makefile.kvm | 4 + .../selftests/kvm/kvm_has_gmem_attributes.c | 17 +++ .../kvm/x86/private_mem_conversions_test.sh | 128 +++++++++++++++++= ++++ 3 files changed, 149 insertions(+) diff --git a/tools/testing/selftests/kvm/Makefile.kvm b/tools/testing/selft= ests/kvm/Makefile.kvm index 0e2a9adfca57e..c326aecfeebb0 100644 --- a/tools/testing/selftests/kvm/Makefile.kvm +++ b/tools/testing/selftests/kvm/Makefile.kvm @@ -54,6 +54,7 @@ LIBKVM_loongarch +=3D lib/loongarch/exception.S =20 # Non-compiled test targets TEST_PROGS_x86 +=3D x86/nx_huge_pages_test.sh +TEST_PROGS_x86 +=3D x86/private_mem_conversions_test.sh =20 # Compiled test targets valid on all architectures with libkvm support TEST_GEN_PROGS_COMMON =3D demand_paging_test @@ -65,6 +66,8 @@ TEST_GEN_PROGS_COMMON +=3D kvm_create_max_vcpus TEST_GEN_PROGS_COMMON +=3D kvm_page_table_test TEST_GEN_PROGS_COMMON +=3D set_memory_region_test =20 +TEST_GEN_PROGS_EXTENDED_COMMON +=3D kvm_has_gmem_attributes + # Compiled test targets TEST_GEN_PROGS_x86 =3D $(TEST_GEN_PROGS_COMMON) TEST_GEN_PROGS_x86 +=3D x86/cpuid_test @@ -242,6 +245,7 @@ SPLIT_TESTS +=3D get-reg-list =20 TEST_PROGS +=3D $(TEST_PROGS_$(ARCH)) TEST_GEN_PROGS +=3D $(TEST_GEN_PROGS_$(ARCH)) +TEST_GEN_PROGS_EXTENDED +=3D $(TEST_GEN_PROGS_EXTENDED_COMMON) TEST_GEN_PROGS_EXTENDED +=3D $(TEST_GEN_PROGS_EXTENDED_$(ARCH)) LIBKVM +=3D $(LIBKVM_$(ARCH)) =20 diff --git a/tools/testing/selftests/kvm/kvm_has_gmem_attributes.c b/tools/= testing/selftests/kvm/kvm_has_gmem_attributes.c new file mode 100644 index 0000000000000..4f361349412fb --- /dev/null +++ b/tools/testing/selftests/kvm/kvm_has_gmem_attributes.c @@ -0,0 +1,17 @@ +// SPDX-License-Identifier: GPL-2.0-only +/* + * Utility to check if KVM supports guest_memfd attributes. + * + * Copyright (C) 2025, Google LLC. + */ + +#include + +#include "kvm_util.h" + +int main(void) +{ + printf("%u\n", kvm_check_cap(KVM_CAP_GUEST_MEMFD_MEMORY_ATTRIBUTES) > 0); + + return 0; +} diff --git a/tools/testing/selftests/kvm/x86/private_mem_conversions_test.s= h b/tools/testing/selftests/kvm/x86/private_mem_conversions_test.sh new file mode 100755 index 0000000000000..7179a4fcdd498 --- /dev/null +++ b/tools/testing/selftests/kvm/x86/private_mem_conversions_test.sh @@ -0,0 +1,128 @@ +#!/bin/bash +# SPDX-License-Identifier: GPL-2.0-only +# +# Wrapper script which runs different test setups of +# private_mem_conversions_test. +# +# Copyright (C) 2025, Google LLC. + +NUM_VCPUS_TO_TEST=3D4 +NUM_MEMSLOTS_TO_TEST=3D$NUM_VCPUS_TO_TEST + +# Required pages are based on the test setup in the C code. +REQUIRED_NUM_2M_HUGEPAGES=3D$((1024 * NUM_VCPUS_TO_TEST)) +REQUIRED_NUM_1G_HUGEPAGES=3D$((2 * NUM_VCPUS_TO_TEST)) + +get_hugepage_count() { + local page_size_kb=3D$1 + local path=3D"/sys/kernel/mm/hugepages/hugepages-${page_size_kb}kB/nr_= hugepages" + if [ -f "$path" ]; then + cat "$path" + else + echo 0 + fi +} + +get_default_hugepage_size_in_kb() { + local size=3D$(grep "Hugepagesize:" /proc/meminfo | awk '{print $2}') + echo "$size" +} + +run_tests() { + local executable_path=3D$1 + local src_type=3D$2 + local num_memslots=3D$3 + local num_vcpus=3D$4 + + echo "$executable_path -s $src_type -m $num_memslots -n $num_vcpus" + "$executable_path" -s "$src_type" -m "$num_memslots" -n "$num_vcpus" +} + +script_dir=3D$(dirname "$(realpath "$0")") +test_executable=3D"${script_dir}/private_mem_conversions_test" +kvm_has_gmem_attributes_tool=3D"${script_dir}/../kvm_has_gmem_attributes" + +if [ ! -f "$test_executable" ]; then + echo "Error: Test executable not found at '$test_executable'" >&2 + exit 1 +fi + +if [ ! -f "$kvm_has_gmem_attributes_tool" ]; then + echo "Error: kvm_has_gmem_attributes utility not found at '$kvm_has_gm= em_attributes_tool'" >&2 + exit 1 +fi + +kvm_has_gmem_attributes=3D$("$kvm_has_gmem_attributes_tool" | tail -n1) + +if [ "$kvm_has_gmem_attributes" -eq 1 ]; then + backing_src_types=3D("shmem") +else + hugepage_2mb_count=3D$(get_hugepage_count 2048) + hugepage_2mb_enabled=3D$((hugepage_2mb_count >=3D REQUIRED_NUM_2M_HUGE= PAGES)) + hugepage_1gb_count=3D$(get_hugepage_count 1048576) + hugepage_1gb_enabled=3D$((hugepage_1gb_count >=3D REQUIRED_NUM_1G_HUGE= PAGES)) + + default_hugepage_size_kb=3D$(get_default_hugepage_size_in_kb) + hugepage_default_enabled=3D0 + if [ "$default_hugepage_size_kb" -eq 2048 ]; then + hugepage_default_enabled=3D$hugepage_2mb_enabled + elif [ "$default_hugepage_size_kb" -eq 1048576 ]; then + hugepage_default_enabled=3D$hugepage_1gb_enabled + fi + + backing_src_types=3D("anonymous" "anonymous_thp") + + if [ "$hugepage_default_enabled" -eq 1 ]; then + backing_src_types+=3D("anonymous_hugetlb") + else + echo "skipping anonymous_hugetlb backing source type" + fi + + if [ "$hugepage_2mb_enabled" -eq 1 ]; then + backing_src_types+=3D("anonymous_hugetlb_2mb") + else + echo "skipping anonymous_hugetlb_2mb backing source type" + fi + + if [ "$hugepage_1gb_enabled" -eq 1 ]; then + backing_src_types+=3D("anonymous_hugetlb_1gb") + else + echo "skipping anonymous_hugetlb_1gb backing source type" + fi + + backing_src_types+=3D("shmem") + + if [ "$hugepage_default_enabled" -eq 1 ]; then + backing_src_types+=3D("shared_hugetlb") + else + echo "skipping shared_hugetlb backing source type" + fi +fi + +return_code=3D0 +for i in "${!backing_src_types[@]}"; do + src_type=3D${backing_src_types[$i]} + if [ "$i" -gt 0 ]; then + echo + fi + + if ! run_tests "$test_executable" "$src_type" 1 1; then + return_code=3D$? + echo "Test failed for source type '$src_type'. Arguments: -s $src_= type -m 1 -n 1" >&2 + break + fi + + if ! run_tests "$test_executable" "$src_type" 1 "$NUM_VCPUS_TO_TEST"; = then + return_code=3D$? + echo "Test failed for source type '$src_type'. Arguments: -s $src_= type -m 1 -n $NUM_VCPUS_TO_TEST" >&2 + break + fi + + if ! run_tests "$test_executable" "$src_type" "$NUM_MEMSLOTS_TO_TEST" = "$NUM_VCPUS_TO_TEST"; then + return_code=3D$? + echo "Test failed for source type '$src_type'. Arguments: -s $src_= type -m $NUM_MEMSLOTS_TO_TEST -n $NUM_VCPUS_TO_TEST" >&2 + break + fi +done + +exit "$return_code" --=20 2.53.0.1018.g2bb0e51243-goog From nobody Thu Apr 2 09:33:37 2026 Received: from mail-pj1-f73.google.com (mail-pj1-f73.google.com [209.85.216.73]) (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 9C8593E2744 for ; Thu, 26 Mar 2026 22:25:53 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.216.73 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1774563954; cv=none; b=Fp2r+6lGOLRWtIm8md2yRjSak9wESitN4eoidLVKDv0THJIim3jCnb0ZMePno63wGcODEBV35v0ngjWLlznihqqbobLOQn9gvkLNo8qagaU02aGyVfjAMpzA7ZsYBpAuPqGVZzRBm/pmYC6m111G3nh5p5hhCBkHYG7d5Kh0e9o= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1774563954; c=relaxed/simple; bh=NOYvJCvJhjhVLEq2W9a+wwzkL2/hh8Nje+0OmjG092o=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=MZGOscdsXn6WeSuKDyfCcJOI9g6Dd3CeHK1kv6YtHt13EFt5O+mDDIsp2w+ZNeC3IHPTIv1mlrYhRqv5sZG9Y2nkA6kaJ/98LRjt3RmvhQ7x/SefqlGfO/TbeqdiG7UqR/6jwXPA5aV5Kdo6eLnG1Yqidb9NuAGoCB3qZXvtbUo= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com; spf=pass smtp.mailfrom=flex--ackerleytng.bounces.google.com; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b=P1W4cBpG; arc=none smtp.client-ip=209.85.216.73 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=flex--ackerleytng.bounces.google.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="P1W4cBpG" Received: by mail-pj1-f73.google.com with SMTP id 98e67ed59e1d1-35ba237d2e0so1721797a91.2 for ; Thu, 26 Mar 2026 15:25:53 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20251104; t=1774563953; x=1775168753; darn=vger.kernel.org; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:from:to:cc:subject:date:message-id:reply-to; bh=K5T3ttFXBFTFqoigTPXjqr+RtWpyGmHMkCotHkIzhdo=; b=P1W4cBpGvJ3FWit2IevugYuMNELdcYbFGFRM4l5QN5xQKiTJCmQJtBwjXKJXHkYvLX AH8SX+OLH8vX4RF6eXC6AMqFUWszi9mmO0oVphy5cITNW6Zcp1ZB4EkaMy3M72d6U8kp LVjvbCJEJ09r5n9fsVU/ul8V4EVkjmV5p3izJKF47ZZCjDGx+gHduC+IQjKNkQy6/2a/ qAEuoerpkRUBmbuHZroYbj2HA32KkTx/SnmO+cBQt0J2IBZzg1FIJ8eYFv5bv6xvAZ4T yAxW60Fr6zJNbbcD/lolKWh3BGtsUKGvSRyAtiwuVxvaj0hUyOESbS7eqgExfcJayG4q B7og== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1774563953; x=1775168753; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=K5T3ttFXBFTFqoigTPXjqr+RtWpyGmHMkCotHkIzhdo=; b=s0DYLBZoqpZY3CtIvIOQtRTCekKAvBUN1LdP1NDxKxi8KCUWkPgYeEN4JuLA04Y0JF 661WuoFNOBJDKbHqKhbQC3zarTlbSlvmzBUvXwTDlfFDdgxFrRZIpB8fYEG/K81hDN60 4uOrFy12YL3DtosDB//EX6rWWvNM/fvKiMfo4Oru3m1Mk0CLNM7aeZ1cx84X9CBWOfSl GceCCJtJkgv6U8MQzZD8B0qurqKKYYBDnzJxLk3nF61kDefjghVLvSY46M1w9Nfr4F3W GvZkHbmWr1N+3iUyJ9jmP8qxqXl2B5dkTzYnjtYcOx1ylUD9NxzVVQWIgUlhUi1CZCpb /gvA== X-Forwarded-Encrypted: i=1; AJvYcCVekzXyMA3hvRLrAqKCpyDvtENHbfVcVTysweEoZRWK3IZdtifWAdYSetoGrHABA/279Q3ASn1+L/GMWSI=@vger.kernel.org X-Gm-Message-State: AOJu0YxQuFJPdj/hpwzHCsZQHlllgP29aJDUxOcyQKyRp/kSQ1D05cc4 iZdUruzHDONAs0kTJ0Igs+L6Ll2S971caAVGlWzTJB8r6xvUYywHkOqCutD+iTEZm1DNbfoXcL3 kG1rHr+lFjG3pMXZdtA+SHxGnLw== X-Received: from pgac11.prod.google.com ([2002:a05:6a02:294b:b0:c6d:c043:2cb4]) (user=ackerleytng job=prod-delivery.src-stubby-dispatcher) by 2002:a17:90b:4e88:b0:35b:a7be:ae47 with SMTP id 98e67ed59e1d1-35c30056d6dmr246000a91.21.1774563952777; Thu, 26 Mar 2026 15:25:52 -0700 (PDT) Date: Thu, 26 Mar 2026 15:24:52 -0700 In-Reply-To: <20260326-gmem-inplace-conversion-v4-0-e202fe950ffd@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20260326-gmem-inplace-conversion-v4-0-e202fe950ffd@google.com> X-Developer-Key: i=ackerleytng@google.com; a=ed25519; pk=sAZDYXdm6Iz8FHitpHeFlCMXwabodTm7p8/3/8xUxuU= X-Developer-Signature: v=1; a=ed25519-sha256; t=1774563861; l=1225; i=ackerleytng@google.com; s=20260225; h=from:subject:message-id; bh=/YIcGPcW7wZJhSlI+0RZdLWi/pX7t9Ru6z34+pKDs+U=; b=nilaAfO0iV6blJ3/Lyvhk7nxY4Fc9srAhxHYkSRRNw5e5PdyvPo5CFKL2qtZRMYmb7vAg9rSY 2VuzYa5m/+5CmT3FIb6yGX1IS4Jrr+PUe0wpNjgsMrimNMuC1aNLWIo X-Mailer: b4 0.14.3 Message-ID: <20260326-gmem-inplace-conversion-v4-43-e202fe950ffd@google.com> Subject: [PATCH RFC v4 43/44] KVM: selftests: Update pre-fault test to work with per-guest_memfd attributes From: Ackerley Tng To: aik@amd.com, andrew.jones@linux.dev, binbin.wu@linux.intel.com, brauner@kernel.org, chao.p.peng@linux.intel.com, david@kernel.org, ira.weiny@intel.com, jmattson@google.com, jroedel@suse.de, 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, tabba@google.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, 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 , Baoquan He , Barry Song , Axel Rasmussen , Yuanchu Xie , Wei Xu , Jason Gunthorpe , Vlastimil Babka Cc: 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, Ackerley Tng Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable From: Sean Christopherson Skip setting memory to private in the pre-fault memory test when using per-gmem memory attributes, as memory is initialized to private by default for guest_memfd, and using vm_mem_set_private() on a guest_memfd instance requires creating guest_memfd with GUEST_MEMFD_FLAG_MMAP (which is totally doable, but would need to be conditional and is ultimately unnecessary). Signed-off-by: Sean Christopherson --- tools/testing/selftests/kvm/pre_fault_memory_test.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/testing/selftests/kvm/pre_fault_memory_test.c b/tools/te= sting/selftests/kvm/pre_fault_memory_test.c index 3b2c4179d42ee..7b7352487fe12 100644 --- a/tools/testing/selftests/kvm/pre_fault_memory_test.c +++ b/tools/testing/selftests/kvm/pre_fault_memory_test.c @@ -187,7 +187,7 @@ static void __test_pre_fault_memory(unsigned long vm_ty= pe, bool private) TEST_NPAGES, private ? KVM_MEM_GUEST_MEMFD : 0); virt_map(vm, gva, gpa, TEST_NPAGES); =20 - if (private) + if (!kvm_has_gmem_attributes && private) vm_mem_set_private(vm, gpa, TEST_SIZE, 0); =20 pre_fault_memory(vcpu, gpa, 0, SZ_2M, 0, private); --=20 2.53.0.1018.g2bb0e51243-goog From nobody Thu Apr 2 09:33:37 2026 Received: from mail-pl1-f202.google.com (mail-pl1-f202.google.com [209.85.214.202]) (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 7BF4D3E3C74 for ; Thu, 26 Mar 2026 22:25:55 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.202 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1774563956; cv=none; b=eb2zfIn3lPF8nwB24nB19uh1Ib36MYf4v0zVZip7+II7CyYGLALqvYQZthkTXnmfY1V69ND2Yz1lkv8edayCLSQQEErmYDXUzqSpfPZ6KCybb9WWXs8LlCdlyUMXLauMVhssLCnMdVhevgzooy/Bv4INTPz875VGM+KCFIefSiI= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1774563956; c=relaxed/simple; bh=ZhM8xOm5+doKADQlrumIE2RLmxJeg0RcHplnkyjK7i8=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=L4kIBgv8mFM0lbEYixnq9+m3Eq+hM6a54Oen/FLI+v/LjzfL0kkT38FdF4mYWAp5ZH8AvEaC/W+p7odmMjdE/BmN1qUqWNI0sVbuiM/e1Iu0B1iceVA8QXFszX54407wZpoLerEeXu4uv5g7qrnzdXYTcORJuMbmn+hs32kVtZQ= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com; spf=pass smtp.mailfrom=flex--ackerleytng.bounces.google.com; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b=O/p9iK6F; arc=none smtp.client-ip=209.85.214.202 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=flex--ackerleytng.bounces.google.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="O/p9iK6F" Received: by mail-pl1-f202.google.com with SMTP id d9443c01a7336-2b06b68783dso17629655ad.3 for ; Thu, 26 Mar 2026 15:25:55 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20251104; t=1774563955; x=1775168755; darn=vger.kernel.org; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:from:to:cc:subject:date:message-id:reply-to; bh=HYq3s+F9mgPwmWrETdAju7b1wzJHYtnrsY9IbvdmqE0=; b=O/p9iK6FUUUjsmcIGFyX+3MexKMppjm614iNBml3tIr+yiB0RLkBcJQD6MIrCr69FS 8FeRFfclcPETMHdmrwupP7aTdXWJIredVdSEwp4an1JgHYddB4NjLW+sFqMPSiwlJjgM pjECbPsDeTUf1bLmYaVbueY3pMuUyxnJoRks3UYa3Q2BeYSQ2QB26385Ewes0jOJGrQF TY+O8L0NmJyd6H4QWOe2F4gx6vTycii4ZygbzhDvTXAPeJgkZfqfGxmKFqLEUDy7wUG/ 1ZmnwOGHGfheBShB3t0aspteIqswcDQbNIfHLmlVebcaiBSqBogBsxDxTscd8FPTAvoF FGKA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1774563955; x=1775168755; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=HYq3s+F9mgPwmWrETdAju7b1wzJHYtnrsY9IbvdmqE0=; b=SzAO84lYw6T1zWaKLptj00L7HM2JVLluv7/nykupLpFNtdtgSu8Yf9ZGA3Gp6tQhAx Vi6ih9uWhWdmG2R8PRY4JuJzuYVT/vetr+VFEt8JW/V+RFAOhfeTq+TdHJ4nMENeYgkU zFpy4qJxy3ST99zFpFeUbIdoAkgnciLQswveErNgEKz1H4xQcwGT2so7huivW4hZOkBt YydcbU00yIDoND/+HfYiek2VPe58jh06vizD4Y9BS3GGf8hyRDipvfmfhP6X0o2467eC X5z+toDoFfobedZyHDg6XCZVIWdCukmfXoOKC7Of5F16wOCPluGRwHd4Ftjz/wsUxIj4 l4Hg== X-Forwarded-Encrypted: i=1; AJvYcCXLrzy7vpec1mPH5fV0phmlBTrXTsIrPk1QseeB2a7YvVvNPT/byAdkcEemSSmCol/PdhL5/ckOh0fIb2o=@vger.kernel.org X-Gm-Message-State: AOJu0Yxc5sXdtEmkIH2KP9PLAAu1TPoyU5RGIUZbnjLVTMjoi56NZ82G IDS5J5JrAmluKlri8f6ru23VEN6+rspv1QlRRlR5oAy4kKWYaZovyjmu8cchrWhXgtx05ndzcJw eJsJJQXR7ZCI+QObkoyHeua+wTQ== X-Received: from plpw13.prod.google.com ([2002:a17:902:9a8d:b0:2b0:6121:c2d1]) (user=ackerleytng job=prod-delivery.src-stubby-dispatcher) by 2002:a17:902:ccd2:b0:2b0:5520:f497 with SMTP id d9443c01a7336-2b0cdc0f454mr2752855ad.9.1774563954612; Thu, 26 Mar 2026 15:25:54 -0700 (PDT) Date: Thu, 26 Mar 2026 15:24:53 -0700 In-Reply-To: <20260326-gmem-inplace-conversion-v4-0-e202fe950ffd@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20260326-gmem-inplace-conversion-v4-0-e202fe950ffd@google.com> X-Developer-Key: i=ackerleytng@google.com; a=ed25519; pk=sAZDYXdm6Iz8FHitpHeFlCMXwabodTm7p8/3/8xUxuU= X-Developer-Signature: v=1; a=ed25519-sha256; t=1774563861; l=3745; i=ackerleytng@google.com; s=20260225; h=from:subject:message-id; bh=ZGSq+gTFZDY/anw9T28+HYi6HmGJV6iDHsC4BSDh08w=; b=bl10NJA+tRza4190u7kAzLQjI0OEISMmC1hhtBIOQpOao11zciKPixnzxzkJzUPyjzD9rwpIj X6HVw8GptTzD9pYDEM6AtX43w8wyaJLsoqTW8KTBj/fh9MfJfpHu8EW X-Mailer: b4 0.14.3 Message-ID: <20260326-gmem-inplace-conversion-v4-44-e202fe950ffd@google.com> Subject: [PATCH RFC v4 44/44] KVM: selftests: Update private memory exits test to work with per-gmem attributes From: Ackerley Tng To: aik@amd.com, andrew.jones@linux.dev, binbin.wu@linux.intel.com, brauner@kernel.org, chao.p.peng@linux.intel.com, david@kernel.org, ira.weiny@intel.com, jmattson@google.com, jroedel@suse.de, 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, tabba@google.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, 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 , Baoquan He , Barry Song , Axel Rasmussen , Yuanchu Xie , Wei Xu , Jason Gunthorpe , Vlastimil Babka Cc: 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, Ackerley Tng Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable From: Sean Christopherson Skip setting memory to private in the private memory exits test when using per-gmem memory attributes, as memory is initialized to private by default for guest_memfd, and using vm_mem_set_private() on a guest_memfd instance requires creating guest_memfd with GUEST_MEMFD_FLAG_MMAP (which is totally doable, but would need to be conditional and is ultimately unnecessary). Expect an emulated MMIO instead of a memory fault exit when attributes are per-gmem, as deleting the memslot effectively drops the private status, i.e. the GPA becomes shared and thus supports emulated MMIO. Skip the "memslot not private" test entirely, as private vs. shared state for x86 software-protected VMs comes from the memory attributes themselves, and so when doing in-place conversions there can never be a disconnect between the expected and actual states. Signed-off-by: Sean Christopherson --- .../selftests/kvm/x86/private_mem_kvm_exits_test.c | 36 ++++++++++++++++++= ---- 1 file changed, 30 insertions(+), 6 deletions(-) diff --git a/tools/testing/selftests/kvm/x86/private_mem_kvm_exits_test.c b= /tools/testing/selftests/kvm/x86/private_mem_kvm_exits_test.c index cbcb5d6d04436..ed1bf27d149dc 100644 --- a/tools/testing/selftests/kvm/x86/private_mem_kvm_exits_test.c +++ b/tools/testing/selftests/kvm/x86/private_mem_kvm_exits_test.c @@ -62,8 +62,9 @@ static void test_private_access_memslot_deleted(void) =20 virt_map(vm, EXITS_TEST_GVA, EXITS_TEST_GPA, EXITS_TEST_NPAGES); =20 - /* Request to access page privately */ - vm_mem_set_private(vm, EXITS_TEST_GPA, EXITS_TEST_SIZE, 0); + /* Request to access page privately. */ + if (!kvm_has_gmem_attributes) + vm_mem_set_private(vm, EXITS_TEST_GPA, EXITS_TEST_SIZE, 0); =20 pthread_create(&vm_thread, NULL, (void *(*)(void *))run_vcpu_get_exit_reason, @@ -74,10 +75,26 @@ static void test_private_access_memslot_deleted(void) pthread_join(vm_thread, &thread_return); exit_reason =3D (uint32_t)(uint64_t)thread_return; =20 - TEST_ASSERT_EQ(exit_reason, KVM_EXIT_MEMORY_FAULT); - TEST_ASSERT_EQ(vcpu->run->memory_fault.flags, KVM_MEMORY_EXIT_FLAG_PRIVAT= E); - TEST_ASSERT_EQ(vcpu->run->memory_fault.gpa, EXITS_TEST_GPA); - TEST_ASSERT_EQ(vcpu->run->memory_fault.size, EXITS_TEST_SIZE); + /* + * If attributes are tracked per-gmem, deleting the memslot that points + * at the gmem instance effectively makes the memory shared, and so the + * read should trigger emulated MMIO. + * + * If attributes are tracked per-VM, deleting the memslot shouldn't + * affect the private attribute, and so KVM should generate a memory + * fault exit (emulated MMIO on private GPAs is disallowed). + */ + if (kvm_has_gmem_attributes) { + TEST_ASSERT_EQ(exit_reason, KVM_EXIT_MMIO); + TEST_ASSERT_EQ(vcpu->run->mmio.phys_addr, EXITS_TEST_GPA); + TEST_ASSERT_EQ(vcpu->run->mmio.len, sizeof(uint64_t)); + TEST_ASSERT_EQ(vcpu->run->mmio.is_write, false); + } else { + TEST_ASSERT_EQ(exit_reason, KVM_EXIT_MEMORY_FAULT); + TEST_ASSERT_EQ(vcpu->run->memory_fault.flags, KVM_MEMORY_EXIT_FLAG_PRIVA= TE); + TEST_ASSERT_EQ(vcpu->run->memory_fault.gpa, EXITS_TEST_GPA); + TEST_ASSERT_EQ(vcpu->run->memory_fault.size, EXITS_TEST_SIZE); + } =20 kvm_vm_free(vm); } @@ -88,6 +105,13 @@ static void test_private_access_memslot_not_private(voi= d) struct kvm_vcpu *vcpu; uint32_t exit_reason; =20 + /* + * Accessing non-private memory as private with a software-protected VM + * isn't possible when doing in-place conversions. + */ + if (kvm_has_gmem_attributes) + return; + vm =3D vm_create_shape_with_one_vcpu(protected_vm_shape, &vcpu, guest_repeatedly_read); =20 --=20 2.53.0.1018.g2bb0e51243-goog