From nobody Tue Apr 7 12:53:42 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 E1B723431F5 for ; Fri, 13 Mar 2026 06:12:48 +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=1773382370; cv=none; b=vErJTZJzsXyV85niHS6+u8UgXLSJDggQJ8noiAZNOOiP9VSO8MlIXxyQpjVqDactAyml6lll3Sb3jjjrabvXAC+WIAyNrd08bpwsMHawT0UziJ/8x/XYDmF1u2ZCa7h6Jb/huW72T+gUt3G+iHVDf4qxRrDMuieO1UkRDY3u6Vo= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1773382370; c=relaxed/simple; bh=dCzSCpaG1ZfhwHuWBnl8WkjBivcedlrblANYJCmmXLw=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=rqkSa7KLJx+79BxFOgf4n95jq/vPP7fNrR3SarA9RNOzpXoWWUa5Li0xhTnV+z/GLarn4GDLctHctSzyAwBsWCXv74KK4ksCaIMsE7x3jR0s6IKebVduXA4M/dMmEtDV6E1RWD++Bw+LcTXfbdy64Y4lLuxY1YorB+EKQMdpULo= 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=T2yTn5Fn; 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="T2yTn5Fn" Received: by mail-pj1-f73.google.com with SMTP id 98e67ed59e1d1-3594620fe97so12544709a91.1 for ; Thu, 12 Mar 2026 23:12:48 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20251104; t=1773382368; x=1773987168; 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=igAKGPZs3Yn8RFN95Dzr41maaofuMmxtQrDmAbA4Zlo=; b=T2yTn5Fnfx+GuBQeW1cXP4Fdm+PiHpmvAN6lS15FTgq0BdSbRyGNcmE+mtL6fsUXEJ lsIH1i8QUUAMZw/UGalcTVFKoxLH4Ee3BT3sWc8UFfwDdQgJj6t2BAQ+dyhdu5X/SPPh IWWrt2yLI54hEfoX/2ECTo8s3z+Oh8nnnlbNQyS/+bXlSPRu4sjhe7ZN/kcnNRq1JHVP ZRPTRZBNIAqM0eGvZIjg6yBAGr1Oc/LjQQ98nXo+txZcITS91iPnPzB58S0KAjvvGEJh NP+AhY4c98ZpmOs3aBvKzSmtuT4gSFPBvJ29n1riIOOadnmt4kcH6q4W/6Zg5Vj+SW5E LmKQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1773382368; x=1773987168; 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=igAKGPZs3Yn8RFN95Dzr41maaofuMmxtQrDmAbA4Zlo=; b=O/cOKvtg4zMxMSwyuEObeln21WdTa2A+JEqtlLknqCGRqkCdaLYiRlIivFq4zokApk Fh8v8cXcL3bQT7nDytls3Jw7cE+Pw2KyfmAZEBSswKAx8SfQvI7joaqng9QasU6LlVdx n/zqE1blhjIN2e5GD+3FyMigM9+7tQnwO3vt07MZ6Jo5QJEDU/F0e6gNJf0M6zhUkleM MZER+hv8A4MvDUgXKKp8s/eAPXDUdhcfwzmJ2cVHecXEisIt0YwodDn52HsSsaFcvL2N 6WuOUW5lqYDyVy6yRbpv0SO0Gd5xoFWXyASMGYuVXxQw47GxztlAusTqlRbALlkPIHv2 TXZw== X-Forwarded-Encrypted: i=1; AJvYcCXQnHmLgJO5mAizKhRmOHvyVbqau0qy5m8mPIv4PDDQvt20Rp3k6hr/crN4FVYkyWoI1mz6zAXFN9KuJTU=@vger.kernel.org X-Gm-Message-State: AOJu0Yyzu+FFBWexQTwe6uXLNrVU3ZsPDOXPXeqntAeddM2RwqqXyo24 h7I1q4JAMXDRble9egJAMT/pWQEDHc6q2DsDL4XE0lsLVQoiUHdf4CXc9z9vROe+Nc+tWoE059y JFss58JUHeOl6891jQGkVieqC6Q== X-Received: from pjji1.prod.google.com ([2002:a17:90a:6501:b0:359:8332:2cce]) (user=ackerleytng job=prod-delivery.src-stubby-dispatcher) by 2002:a17:90b:3888:b0:359:1063:6b02 with SMTP id 98e67ed59e1d1-35a220033c7mr1965219a91.18.1773382368016; Thu, 12 Mar 2026 23:12:48 -0700 (PDT) Date: Fri, 13 Mar 2026 06:12:40 +0000 In-Reply-To: <20260313-gmem-inplace-conversion-v3-0-5fc12a70ec89@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20260313-gmem-inplace-conversion-v3-0-5fc12a70ec89@google.com> X-Developer-Key: i=ackerleytng@google.com; a=ed25519; pk=sAZDYXdm6Iz8FHitpHeFlCMXwabodTm7p8/3/8xUxuU= X-Developer-Signature: v=1; a=ed25519-sha256; t=1773382364; l=8193; i=ackerleytng@google.com; s=20260225; h=from:subject:message-id; bh=SgPEW/88BT04ZTg7kf0aC5QiYWJ/VH6PQfUxsjhUyo0=; b=TaRTC8HrKfJiiBHiOlhfyqje1q2nDglb7gTbUculap4XLUDkb9lQ2qWVkTnyUcj2naqJDRcvA lRL7RVAAR79BMgAnd/9m8Ly9Kt2/RbE7p8Ba8AmO5LH6v/D2qPNSIgp X-Mailer: b4 0.14.3 Message-ID: <20260313-gmem-inplace-conversion-v3-1-5fc12a70ec89@google.com> Subject: [PATCH RFC v3 01/43] 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 , 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, 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 | 134 +++++++++++++++++++++++++++++++++++++++++++--= ---- 1 file changed, 118 insertions(+), 16 deletions(-) diff --git a/virt/kvm/guest_memfd.c b/virt/kvm/guest_memfd.c index 017d84a7adf37..67709af03f39d 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,7 @@ struct gmem_inode { struct inode vfs_inode; =20 u64 flags; + struct maple_tree attributes; }; =20 static __always_inline struct gmem_inode *GMEM_I(struct inode *inode) @@ -59,6 +61,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 +424,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 +586,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 +661,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 +865,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 +887,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 +1018,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.851.ga537e3e6e9-goog From nobody Tue Apr 7 12:53:42 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 1EE42346E7A for ; Fri, 13 Mar 2026 06:12:51 +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=1773382372; cv=none; b=uuVxlEAl0uoH8Dz3oj7vdIl/pdKu6VzZt/vnmfLrI/Uk4aQ1+mflposdCQrtegp6ZEg31vlOlZz8NRoGc2s5baKko2Qelnm5r3mIK/hJz/Ztfz5TgMP6TQbZ6JEwELxYYLWYLV6Iz3GxH2e8ezSbPO7o6kgQzJHcyQc/B8Fpv38= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1773382372; c=relaxed/simple; bh=6/72ofsvwRK4bb8us6hhCR6Dyob4ABX7lV3kNcDt+oo=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=heEGh5RkZBAu9FKBIJjXqz5+gOH1ROEoBaydCz3pEIt4sU4IY2jN9dPMeH1gMJI5nUCsE1nmRakYHk7lf9WtCIo3jmcP+yeG+Y8PUSylmIM/27TNieNROsiel5mXGDXNXk+DFZfw3A/WQyK5BzZhSkBLUYIajvSK2YGAvDRBpr4= 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=USVuUHl7; 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="USVuUHl7" Received: by mail-pj1-f73.google.com with SMTP id 98e67ed59e1d1-35a1a764225so1322432a91.1 for ; Thu, 12 Mar 2026 23:12:51 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20251104; t=1773382370; x=1773987170; 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=wqyxAZkPbXKIsoN/7qS/+e4J2x78nPCOIZjEbaOcSBk=; b=USVuUHl7CJJ9jJfoJAukscmxYQnMHhUP0r+2hpIbblKFnV4AaAWBep7VUgrDGKGVsN cUjMGRn4wloFqwiNmZNNfdY9q1slirJ7p3VFeurnynJXTT3cG8MSjMjOBScsejFALusm 4edXnvvuLlJscRBk/TObiICfZH4qA4JNOJQo0zE6oaV98wWIm8BhWHOVpG44nyhlc3gC Mnj7cOavzscUmwMg62U6lsXk2+DyMHGjJfMFRasU3IjQbJIMgeACCLKfuNwfI+ASVe++ YYcAEhNsA7oFkyipHYjS8QaDGXCl2qitoGLgFrTSFY3XQ0dKunw2KAQkqhpMwxz2Iflm 7nwQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1773382371; x=1773987171; 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=wqyxAZkPbXKIsoN/7qS/+e4J2x78nPCOIZjEbaOcSBk=; b=dJU+CLy5+9rZsttXuBJff4/t6yemurIi00P6TS+7m+N+djgkvOmGbbrwsW/ucVieVI fv4mumtQ91oN7/Lvreb8vvshz0i9wj79uojlQYnulyhuDujHIYrOH/E6ITj11lUXA20k 8R6WEIE6hiFdOayYDCAjVvLHgkpAmc5j2qJ9ubGrzo0pgAFDvfpF8dnp0sc97xbAL5aQ QcSkf9gQrMx2ossytYEw3m/PMIVQTE52joM1qzDJU8tPBcEpqJLK+jKZeTAhskpHFSG5 olyHK8jvpQCHNRY/J6ZAyWonKXlAaKb0izPpZ8Caaj3j9GbAjPbPtAv9HJL3+tKrs5xz t4Zw== X-Forwarded-Encrypted: i=1; AJvYcCUETrWOSXIj/w2pPkdKOThJaSHwonHp7i49xxF3UGbIys4XX+ifHxhfp/bo5OTxq5y2W4H4Id3vAsGhMdo=@vger.kernel.org X-Gm-Message-State: AOJu0YzYbEGVRoACN4j2fKqlyEyabXLt7KMoljTWSN5Aly/67CXEYlW+ 5QQAfh3/feYWugAfTe1Y+zNe9cZ91qXPzmCA+OrsW14y4QMi3C7Pyg2HZZ+vtzmouj9/irVNohd dlKP81jGKGTx9jCkxNf/6bfSshQ== X-Received: from pgac7.prod.google.com ([2002:a05:6a02:2947:b0:c73:7d8e:b5dc]) (user=ackerleytng job=prod-delivery.src-stubby-dispatcher) by 2002:a17:90b:1e43:b0:35a:10b6:1208 with SMTP id 98e67ed59e1d1-35a11ad03e8mr5360834a91.14.1773382369651; Thu, 12 Mar 2026 23:12:49 -0700 (PDT) Date: Fri, 13 Mar 2026 06:12:41 +0000 In-Reply-To: <20260313-gmem-inplace-conversion-v3-0-5fc12a70ec89@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20260313-gmem-inplace-conversion-v3-0-5fc12a70ec89@google.com> X-Developer-Key: i=ackerleytng@google.com; a=ed25519; pk=sAZDYXdm6Iz8FHitpHeFlCMXwabodTm7p8/3/8xUxuU= X-Developer-Signature: v=1; a=ed25519-sha256; t=1773382364; l=8589; i=ackerleytng@google.com; s=20260225; h=from:subject:message-id; bh=HOZ0tBJg5vK53vB9iEjp9H9Ek9+9wY3gtxNmuGlqJEs=; b=l2Tg+QZ8MkzGgkOfBhw9QInbF/jxR127g1P+lufbRCPD5D69+6F8oHEOLF10RsLGlpJQrYscS muNBtOXT9VDA/gy0Lx1JP1uakSR7j4s6KWA7GhBnp1nqt8MCVhCgP9f X-Mailer: b4 0.14.3 Message-ID: <20260313-gmem-inplace-conversion-v3-2-5fc12a70ec89@google.com> Subject: [PATCH RFC v3 02/43] 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 , 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, 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.851.ga537e3e6e9-goog From nobody Tue Apr 7 12:53:42 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 AEC2D34D4CB for ; Fri, 13 Mar 2026 06:12:52 +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=1773382374; cv=none; b=TAZIE4MwofSHiJ9ok4gXFHBDV/isndjK62dr+6v5zFA1iU3ee6LLeMeijMUBEGMxE1aa6RmoQQCHYBUYy5eu4Z61bPeUr7OULi+QB+JKsy9723ERoGinElIPIJghqAXb+kJQeOF75qZnzV2eFVAl1wtXgET5MLQX7Uur6DnsAas= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1773382374; c=relaxed/simple; bh=MRHw5oy5tFyWNvt56O9mcO7PI2R39CflC4bmNd2C60k=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=H7AvlDzY97jaOzROUB00VhS4Yt92i6OAWEVyG5P06KEpfd95mXL1VtUaRPscdj6yiuxMKd8zhZ08gLv3a9j5xGAcoAu//zxERaxhjCsF0oX9QQILMHaQLb8qv/f9UxINnLovPnBYzM5t2IrAvprCAnCgieIfYPFlqquDhFmf+Eg= 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=P9dBzs5N; 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="P9dBzs5N" Received: by mail-pl1-f201.google.com with SMTP id d9443c01a7336-2aed37d9310so14775ad.3 for ; Thu, 12 Mar 2026 23:12:52 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20251104; t=1773382372; x=1773987172; 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=7kRWhL+HkcSRRi26b8Op9JhhRMhDncUeSMvvheOqHO0=; b=P9dBzs5NoIjM9N6ZfHT1tZ/hqembV/VYsLoyIIPFNnwBClMyAq9ChFYkvk/nCRHJkg Oa6ZR3+I0FGjIg2nU/eG1uHFy21+WJtl1yToIgzEX+JdFULLlj6ouD2KddNwN0AwoSfb ZjUpZV3UaZHLkVgevkQIcT4lNu88wAj+e1LPbbyQ4k0bL2Zy34z4utCqrk4ibzIvyN9A cnf8TVgFDeh2qDNhdi9mAg3thBAj7EzpQUz/q7ZrbvMylzO6U7ClAG+yDvSs13R7YnSn gE9jfYU4ZIN5bW+lSBLIRx3NBFq8lvYR0W20WGKeADFE4Ddf+2ZMcSEtU7vU660QG3iQ 0VAg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1773382372; x=1773987172; 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=7kRWhL+HkcSRRi26b8Op9JhhRMhDncUeSMvvheOqHO0=; b=UkJfrggKBb2GiH1UvKq5DcPd9N3nBzsT93oGLNKyR2A8Kbgri19Z2flVcs21rkDtGg 8duQEhWKo358UAvVakzfsIAlqZWvhdLPBiyPXAqhhQmgBScrQjfcXO++KAJsizwIpVGa bjrycDmDB6adIMLa9+1qvT4pfLKphABUA8m5A3lZANLbtV9xBRS5mAJxN/I1cMNF3dSE 6msEY0+06AEycO4i+Nh3HdGOOhpkvtccQ7T9MsrJRzxNciHj0Hw1X+vSvu3JszyGUqw/ V2V41AUxdNoXPO7SNumGwYt6FOdDjkNDD5+drhoJfNpt5iKT57wRrGSoP7LD3LLdwujK 6pvQ== X-Forwarded-Encrypted: i=1; AJvYcCU4Y1PwwU0eCdz44qe4mB/ZlMqVP6yPMCJQ6aj6I584IOWKcmoWe0dgurt1tJJrqsK/Y3M7PRcfjaA67vs=@vger.kernel.org X-Gm-Message-State: AOJu0Yyat1yHq0Zj75gIzz7tpjclrh8M6cgy6rnkbPuvVzcSSk2afKRv 5zaBGDuYeWfxsXbWWNhIYLss3llqIl3rhbExluoopO4zjNHANzGXzxneOj3ZEm2MrMRtGVKBbhv XYUQzNUiSGj/ZMREbDx3yKjnCGQ== X-Received: from plef1.prod.google.com ([2002:a17:902:f381:b0:2ae:420c:c02a]) (user=ackerleytng job=prod-delivery.src-stubby-dispatcher) by 2002:a17:903:3804:b0:2ae:4445:f397 with SMTP id d9443c01a7336-2aeca9ec6aamr17773125ad.16.1773382371838; Thu, 12 Mar 2026 23:12:51 -0700 (PDT) Date: Fri, 13 Mar 2026 06:12:42 +0000 In-Reply-To: <20260313-gmem-inplace-conversion-v3-0-5fc12a70ec89@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20260313-gmem-inplace-conversion-v3-0-5fc12a70ec89@google.com> X-Developer-Key: i=ackerleytng@google.com; a=ed25519; pk=sAZDYXdm6Iz8FHitpHeFlCMXwabodTm7p8/3/8xUxuU= X-Developer-Signature: v=1; a=ed25519-sha256; t=1773382364; l=1737; i=ackerleytng@google.com; s=20260225; h=from:subject:message-id; bh=SQorwu5NmjhCMRk1oX2e95cjFDSBZ7C/wme7YI2Safw=; b=BHQfpfOJVOPF572H7KOE0msVDrKGZUSyz6wGCvpiE0UcPhIUix+u1Tv6eCcQRd1Shu80yIiIv kXCpa4oqY4EDKBHo5FBojjEQ0I5LvI6zzsNmcvtkSVZYa1Ejso2F1hk X-Mailer: b4 0.14.3 Message-ID: <20260313-gmem-inplace-conversion-v3-3-5fc12a70ec89@google.com> Subject: [PATCH RFC v3 03/43] 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 , 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, 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.851.ga537e3e6e9-goog From nobody Tue Apr 7 12:53:42 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 7131B35AC01 for ; Fri, 13 Mar 2026 06:12:54 +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=1773382376; cv=none; b=mhOrxH+MiiCQpIEetal9OaxVpzpjLZXs+oWFE8ub7gkAe1PrxZT4QsWSLQ1mwRDc789gbqtSalVdN90O4L2krd7E5MJQoQn5Jfw47MNSYrfhI9FtgJjvwKLfFAZlJoVXysDL4F8vWAZ1qtMXbTPsxemlFCTrDw+MsL29TDjIkIk= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1773382376; c=relaxed/simple; bh=Z8Fj9mzRSl86D/84DXYcJ2/GuewGJS5xI9UqDcwvm0o=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=GH77nzUzkvnotmBjHTZLm2Kq5sCdeGgwHzFi21+TcIQqXfKn7HMIQ2zwmDsBlg/9iClRq6pxmi4m4pQ0c2TdysbzrzRMyQrxeyo/I25noB5gYBDNk6XCtPybzKe4JrhaeultXt9X50Pzq7456ifFVyHnl3XUFCyhWTIYl2Pgra4= 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=OuyetPqf; 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="OuyetPqf" Received: by mail-pg1-f202.google.com with SMTP id 41be03b00d2f7-c73a4983fc0so1063253a12.3 for ; Thu, 12 Mar 2026 23:12:54 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20251104; t=1773382374; x=1773987174; 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=iOyUOG17doN86gJPVX53Tfmosd3UCLbDnOJKtetJrAM=; b=OuyetPqf10ovjXqc2ys18ZV9UUQ8MibbOXMF/KkPgr/vkBWIrMjb6Q5GsxhsIKuJFN ofT55mTXOxBamg6HXibWGTm9TgVBm9y/9kk704QbfEQ/bCypz24EpedZRMCCsdj+oqZW DpbgP4nkVlZ1EnXxooPWvYNCqFvRona31G3+6BtUZeIwJXu3hCWrxWqC2vs4AHzFpwea AsrxrGTA4MxtMg141jkghZujVt8KxWY7Em0e+O+4kbVr4xS2YkAmY4LATQxglEQtybin dcKnnaIiB2ceAR5Prnvie+zJlua21xJ9PoaPlGrmQGU1mpzhA+MNgbRsO578iAonhOko YQ9g== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1773382374; x=1773987174; 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=iOyUOG17doN86gJPVX53Tfmosd3UCLbDnOJKtetJrAM=; b=G+SVB8X5RYr+wkjKsmFn8eUQIigTaTcI6hMouKEA2OevzOLvh3w0UTbLDUBeduYP38 l8P1X4n3dwDm1zRUKFFT9jzkNNIXB39a4GolWitmdEATCDRibZCYhE5Lg3LpKrsauppQ 1HHbAFzeDJRlSJSn/+b51/BjUzYxpqHehHjn8QanzSza31uu/YdHhBtQdnWkKcwaggxY R/5x//Jk6YUz0cAP+ZWHeqHxR/DbKPB1UlniCHhHRVUguC/7LwXbWMFwmb+zSBcexwwO l/t/alBxxdyagpfpCprncfJ9PvTbZnx8Us0ZglvWcY67totfhRvIcXJD4W04LEggqMH4 j30A== X-Forwarded-Encrypted: i=1; AJvYcCWiRmgaSAxBXgr8S+3y+qz0jnETX/AdWkbh7t6QpM2hq7g8OIkJS6W0I9NM3ksr2SFA9WDTm9JThaDR/ss=@vger.kernel.org X-Gm-Message-State: AOJu0YzfXe6nSULFmuVUEl4LmXYYCtKxKhEYHkPNWeVjJnPum12cQTEz oN3QoVH1SgwOmhlRQww1e7jxBwXR+ViLMey0/wqgnWTvYQTnap5CyewkyiDsZ0KtDz0H53hE8WR S0MjN3TkRMq1fwslP6k/l1FPOLg== X-Received: from pgbcv10.prod.google.com ([2002:a05:6a02:420a:b0:c73:87bb:2ffd]) (user=ackerleytng job=prod-delivery.src-stubby-dispatcher) by 2002:a05:6a21:9f10:b0:394:2fbb:bc6b with SMTP id adf61e73a8af0-398ecd3634dmr1711573637.46.1773382373538; Thu, 12 Mar 2026 23:12:53 -0700 (PDT) Date: Fri, 13 Mar 2026 06:12:43 +0000 In-Reply-To: <20260313-gmem-inplace-conversion-v3-0-5fc12a70ec89@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20260313-gmem-inplace-conversion-v3-0-5fc12a70ec89@google.com> X-Developer-Key: i=ackerleytng@google.com; a=ed25519; pk=sAZDYXdm6Iz8FHitpHeFlCMXwabodTm7p8/3/8xUxuU= X-Developer-Signature: v=1; a=ed25519-sha256; t=1773382364; l=7204; i=ackerleytng@google.com; s=20260225; h=from:subject:message-id; bh=OpURI5RSMWwx8gZDv6qxQgEUGnaqN+TPyr1JkglhGlo=; b=k5SF6DJF7PJeu7qJeWlFaZ6kFJRp/jCmmCdmie5NE14HvmREX17tKbPFuUg+/3mpd1KKXfsWW v21k8SXCouJA3qqPw2JPzsx1/a2DXt5r5WIR4rUmfe36s//U16OENi2 X-Mailer: b4 0.14.3 Message-ID: <20260313-gmem-inplace-conversion-v3-4-5fc12a70ec89@google.com> Subject: [PATCH RFC v3 04/43] 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 , 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, 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.851.ga537e3e6e9-goog From nobody Tue Apr 7 12:53:42 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 31B663630BA for ; Fri, 13 Mar 2026 06:12:56 +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=1773382377; cv=none; b=dL22YlpuMYF75owVsXmwHAHOrLdMAzjlQWQOJ+qrg2USBcSIpOBHYuehusCyFSym4ErH127+4MpA8EmhpAW8pfiD4Fm5Zx+GUiGtx/9A7H+IGxuYR4YOki66W6+291lG/KvJoT0qtB2Z23cldXYFE3woEP1/GeboA6QKwMTwrHM= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1773382377; c=relaxed/simple; bh=f/u8MBDxButqty3WBnBpsVNFR5HY5T58VePQCl+a2Lw=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=FuNNdi1LWMyFQqW8+Ee7MQIW5KJ0Y/DYL/z8BBriaeuJELXyDCXwoETtUd0AVU8A5ygZ9L2MEPXC05zm5jrHBigCpVHniNdxyBUqTTqpVYcmnGqYAip2CvdP2rHdTz8Yuu9wPBl3G5lXeFkYg3E2AewrDbY1kANlk/zegd8yWSc= 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=BvYKMk1/; 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="BvYKMk1/" Received: by mail-pj1-f73.google.com with SMTP id 98e67ed59e1d1-354bc535546so1716919a91.3 for ; Thu, 12 Mar 2026 23:12:56 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20251104; t=1773382375; x=1773987175; 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=tfqXPeUWEOK3mFRzlMp1M77AHWf7AiKbvJ1Jssn8XG8=; b=BvYKMk1/dll3MhQ1E2IgRZkVubf4NXGkH7S4m7b66HHzyr+xvPhzR6R65PyOR5SmJD m8WXQ3vE5+8hyZGalq79qXoaG4Eq1BZcrsH76v80oHPmdU6CUKwJTBrVfUj0oTR1XWp3 rUE70nhlY9vtJNO2EX0hnBGZAcPLIKqmB0kVso8i/HtxdkxGipPIsdR/X4tSZQVDCSUj yKoD350ocOnGD5XKVBCSdAGnBfSvUmwyl1jtVUjBqu+6eAXHTXOdEqgxjgZPomnCSU6P 534k6OCdkcGvofP5zDKZXF/X9+BL4j0bdg9uNErfVIIEYckspMgbU13Yx19Vzt0wPb8l gWGg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1773382375; x=1773987175; 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=tfqXPeUWEOK3mFRzlMp1M77AHWf7AiKbvJ1Jssn8XG8=; b=D721k61glKEDHH/QwR1vGS+8YlzYp67pMaRs+ert+/vt1cGNqqdCekYL5/v7qNBnrq o5qjZI+EdwivPH7kHqrs7drK7vjHTclb1/FmfgYDDxrGsweiE1SCQKeJ038o2DiMyWXe RcuzD/ceYWKrhXfBfLThxTIrax7LmZYLprv2jATaMe3sKwSNbKRe+Z7QuAKrUDRAYWXt JI0gmmrBQCUXTO2mfMMdMLcj9Wx1kAtPHiYmz5+EmDgjiMibEBOFc7l15m2okCJfiFWf u8+NlQHCkGfBL6uP9X/j1jfMFcZy78wtlvdnkVQVqlPzxw9nCtaxcgYfVwnWeQtuWYEG 3N2Q== X-Forwarded-Encrypted: i=1; AJvYcCUDCIGsIQC+XJViqf8wwhi+vgQ29c3h6GQOkyf4Km8YbTE7OnixCGuIUsnMSjiPYhb8dhdx76KpYfz6kn4=@vger.kernel.org X-Gm-Message-State: AOJu0Yxcy0U5Mfo5M0TCEKGXo0vSUQqIMK6ElTw1vcd35zOSxVkKU7db 1Ej4sTA3KdmXWoUsccMwEqWhVTJc2LWPFUt6uBt7iqVTf9mcTMlfqQneHzDdBc7AmVWT8oiO5Ix pRWyR71YBlySlSePzV0h/AQofCg== X-Received: from pjbgt17.prod.google.com ([2002:a17:90a:f2d1:b0:359:f0e8:29f8]) (user=ackerleytng job=prod-delivery.src-stubby-dispatcher) by 2002:a17:90b:4a8f:b0:359:8a78:569c with SMTP id 98e67ed59e1d1-35a2205566amr1686742a91.25.1773382375196; Thu, 12 Mar 2026 23:12:55 -0700 (PDT) Date: Fri, 13 Mar 2026 06:12:44 +0000 In-Reply-To: <20260313-gmem-inplace-conversion-v3-0-5fc12a70ec89@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20260313-gmem-inplace-conversion-v3-0-5fc12a70ec89@google.com> X-Developer-Key: i=ackerleytng@google.com; a=ed25519; pk=sAZDYXdm6Iz8FHitpHeFlCMXwabodTm7p8/3/8xUxuU= X-Developer-Signature: v=1; a=ed25519-sha256; t=1773382364; l=3888; i=ackerleytng@google.com; s=20260225; h=from:subject:message-id; bh=TbzwfWzIJZ9f4hVjCD6QuFLHmDIdFCBsbyhlDASSybw=; b=ApPMO0tHVQBB8+8qRb0igQBkr6D2uQauHnOpA7Zcvx7wKgW4Q/Fjw5jbyvH3RR+9K+UcWadd3 mQyNl7uH72fAx5ORxla9nJeQT3viD7Tu7q9V1tW8vyFuNe3NybDhkU6 X-Mailer: b4 0.14.3 Message-ID: <20260313-gmem-inplace-conversion-v3-5-5fc12a70ec89@google.com> Subject: [PATCH RFC v3 05/43] 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 , 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, 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 67709af03f39d..e93e95940ec74 100644 --- a/virt/kvm/guest_memfd.c +++ b/virt/kvm/guest_memfd.c @@ -510,6 +510,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.851.ga537e3e6e9-goog From nobody Tue Apr 7 12:53:42 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 B82FA3659F3 for ; Fri, 13 Mar 2026 06:12:57 +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=1773382380; cv=none; b=ZdUNVxfmqOyVQ8pv+EbidjfBGemjLhch6r+5gDIyK57wT2CMJAjNJu3VDvI0qul1ok7ptlo2eUJLQrYIk8QI0OHymmWpf0F6w7hX+1qP5FWVfAIeuMGMwSa3lPPpzz7U31lhRLTmtoNKPqjKpxWcBJqe+XGXuyswKJMNXmeMKVQ= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1773382380; c=relaxed/simple; bh=6l4gROx7jzaHEpW5EeWmylCHb6Dln97vDEPH0vMevUU=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=PU/8hTHmjVWmrExtdlykkTCMwIUaq7N0rCRVY+p5HTgQy4s0xfVpG8wq2pqZU7Z8ZdPwepqT+z1HooGT8V/zmGFvNj7yY+vMEMmZ8IYIdtGfhdeOU0nQM5KrVb2mUGbEWaf2ps0BnkKjNfwqsCk1O9qax3EQX1zwBYxW+9I6A2k= 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=s6X+udTa; 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="s6X+udTa" Received: by mail-pj1-f74.google.com with SMTP id 98e67ed59e1d1-35a203038c8so863042a91.3 for ; Thu, 12 Mar 2026 23:12:57 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20251104; t=1773382377; x=1773987177; 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=gcDmUTz+2QJCEjrFt10fJ/5y22/0S6e6j1N3ESHDYEw=; b=s6X+udTaeHfaxforCrc3BHP2tH7KdreFjHz1dC5tqs/S6B+uTHNFBAHF/oTDjE2DCK mWnJBtCoouS0Yb8eVC/xGe2A34vFbalVuoCiYuLX6oAxHSvBsCCsBlQfibNc0GlM+w+l Dz8kqQk8Y+IlvkUJabkb+GakANKo32WhaFlzHMzJ+G9oNb+sl6orclxZ/pHX8CJe6s7G E/NQXrwRtjHbp4A8EW9wmRpk/m0+TnuHfqNNH+OlLvkjkw2HJ9BP6mQiwv1Eh8ATknmh 93a/7yF938mvtkoZCQoKRY1U+PW82PVCP+ZiLWgdsRF1m8MtlSMkFtMaMcWsdSy6IIRv jm8w== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1773382377; x=1773987177; 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=gcDmUTz+2QJCEjrFt10fJ/5y22/0S6e6j1N3ESHDYEw=; b=PMEh5s70Rz/ilhamfnxHerYVIm8hi8BiYKjHsD4jz2EkRfUBvLibPAyvNEMz6hU1IN k4noLFfphS2RDOGEBvRHxZvuQkl1QksfGgiDMS18TaYJSBSBJKYmriANN5HZqfYvCUVl 9fr0007tHwX3iwLBmYx0B2W8V7m78NHu2J+JmbGNXniYtkmM9zV6JtUwyjNH6IfkxISB QM5SkdL7z4vc5gXMMrYVK4lcJyqKPX0GxMH4H9OyBvJRmAxDRjVkXxd7/zCEZu417PRs mRONd076QKsAFbQULbglChgL19vRwTleICN70mUFRSiOtAUUpc3joJOZW2CgbbkjdVxq KbRg== X-Forwarded-Encrypted: i=1; AJvYcCXGMZr2P12sm89vk9SB+NAVkP42Re/cwa6r4EhHL4/XZpn2x+eC2wqQ4IM0JKpdVlR+dr3E4S3GQU372OY=@vger.kernel.org X-Gm-Message-State: AOJu0Yyetad6mQQQO5vTXVGc/9ZjHnEvthtMjQlJMSCewOEq3/wWpeIu Wy2uMr2hbd3iySx+Cd1/l56sGHzS7uS26p7jscBLzyDc8CXJTD0W4GX3Xxf0GMjbWyOxSNKVr98 CjqNu6jqzfnVvOJ+7MEZhx1lDfQ== X-Received: from pjbie24.prod.google.com ([2002:a17:90b:4018:b0:359:8bb2:c98d]) (user=ackerleytng job=prod-delivery.src-stubby-dispatcher) by 2002:a17:90b:3f85:b0:359:ff8a:ee52 with SMTP id 98e67ed59e1d1-35a21e4edbamr1952130a91.6.1773382376871; Thu, 12 Mar 2026 23:12:56 -0700 (PDT) Date: Fri, 13 Mar 2026 06:12:45 +0000 In-Reply-To: <20260313-gmem-inplace-conversion-v3-0-5fc12a70ec89@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20260313-gmem-inplace-conversion-v3-0-5fc12a70ec89@google.com> X-Developer-Key: i=ackerleytng@google.com; a=ed25519; pk=sAZDYXdm6Iz8FHitpHeFlCMXwabodTm7p8/3/8xUxuU= X-Developer-Signature: v=1; a=ed25519-sha256; t=1773382364; l=5783; i=ackerleytng@google.com; s=20260225; h=from:subject:message-id; bh=6l4gROx7jzaHEpW5EeWmylCHb6Dln97vDEPH0vMevUU=; b=sCHE4aruHhHNVBD2yopcHXCLUXwh+U3kB1yeszQMikNVOBJ9YprFXvSYO12Y8Y2hLpbvia8xs bx8ztRQait9DRBntyze/Gr5L9dhTy5q66mCYMrvVSzvfiBH4+mIYFoW X-Mailer: b4 0.14.3 Message-ID: <20260313-gmem-inplace-conversion-v3-6-5fc12a70ec89@google.com> Subject: [PATCH RFC v3 06/43] 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 , 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, 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 e93e95940ec74..501f4d6e87909 100644 --- a/virt/kvm/guest_memfd.c +++ b/virt/kvm/guest_memfd.c @@ -931,12 +931,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 attributes) + 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; @@ -951,9 +970,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.851.ga537e3e6e9-goog From nobody Tue Apr 7 12:53:42 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 542A9366566 for ; Fri, 13 Mar 2026 06:12:59 +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=1773382381; cv=none; b=lER7hDexMqEdkffiOiqHGb9ofYLXnUpfuhVJl7m5mW5Y5Uoayo6/ddmQU2PWLpxa9AHrFp7WLHfYN0FouaISj9jmp097E5NwpxIJWqfgJprgY2LRqMV3ExY+XX9QtLIOPjuMxh1w51U3JLogtbOG0tYMiWOsyeWSvcWzypwbUkk= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1773382381; c=relaxed/simple; bh=lZywDt32gEFzsmecEA4QgNgSbK+hdPuFQzg/RmbbgZo=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=Zs7lUPMGbKBaPuM9yImBeJSY4caX8zboev3P3lGjctNdY2vUe34VuRhb/qCe4WwLIagXuoIVm3MUK0BK7scr584KZTInUTUJOCpOB9ioAcxCOO4p6rtg0tk7sbdxBIfOzdC4kQMMPZsvvd+LD2BLl67p+SAGNvU06i8NgnKTjDo= 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=HCe4tYIv; 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="HCe4tYIv" Received: by mail-pj1-f73.google.com with SMTP id 98e67ed59e1d1-3598c05c806so1920175a91.0 for ; Thu, 12 Mar 2026 23:12:59 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20251104; t=1773382379; x=1773987179; 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=YmoXXIRdkxEQ9ndfTXjPolg/SPgAKKLMCCKfdI00E1E=; b=HCe4tYIvsKI/yGdpGeBOfNws6kl1z5HuUnJKPm2BfQJfJX9xVX3bGoOkLfY9Hhi+PA MMRAlf0wp8rC9pykiDDUyTD77rx7RFuLukFmJfUjGc5VDI9ccgKbcZAvW2tdM8GB9dle ocWiSJg5eJF3Z5YYqF9vRQY/1dcbj/L3M7IeKZJRg1QcVVKIA7AdhdXWpEBel2GzXaDQ QrnCrrwuERW7DUYhxC9WpKWTH6uu2NdKKHDaifc1vb+c34NFunXnnozpn0ISm3lwz145 ka/DfSz498e3TTLZOFMntciDQaJDBmor7y8ftTWNJOM3RTOR2dipe4F1eQ00tuGNEIwi Ifig== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1773382379; x=1773987179; 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=YmoXXIRdkxEQ9ndfTXjPolg/SPgAKKLMCCKfdI00E1E=; b=qrN3/HLtLJQ5oh7OKpJUim9YqCv026obEWjqdpJgUIAOZYLbuVyP3c6Ea3OFrg3ReR /F5VSSN7K6fqHRbtoxkDyQK5RmCIMnmd+4r5GnpEgnqGfGSnKJ9c+UoIfI8q2cfBcg0H xnxF2gn+YOMRsHEUP4UYQ8qIaEYfHY15oqmgfWqWZz6VmWxezTLOUtjaP1QYwN0M5mcG ESV+s8HRm+4eAq6ncGUMKuMYaGAtf6dEUlZclJ/mcX65R+EVaXLmXP17mG9rbG6EdtXk BFP6EypYVSBnumeEZDyAyLqcj7vaFAwe5487OSWRz75j8K2AaiaZQkpS1SdR+JkgROsu oxjA== X-Forwarded-Encrypted: i=1; AJvYcCWnDjGNDxf8XaoWXSUn4owIwpcCse3/MOnS0ZJL3tHF5pBxoVGLsd7IF+9A9NxQNKCgjw880OJEAZBsJsA=@vger.kernel.org X-Gm-Message-State: AOJu0YwwGhOtWNiy0vTukJ0RoJYE7Pi6jYA5Zmb2yMqBuflvJKlPMq4M amgs3xhOUJBDaIjNXHlFXH/AMcDvurZGrDFqEt1o/tLCBwxUAvA76jz/wauEATPmdVtKRnpTUNk Mqc3npMLhY9NWcPisqc0o7QroQg== X-Received: from pjbil4.prod.google.com ([2002:a17:90b:1644:b0:359:92db:6c34]) (user=ackerleytng job=prod-delivery.src-stubby-dispatcher) by 2002:a17:90b:3c11:b0:35a:18b1:c248 with SMTP id 98e67ed59e1d1-35a21f67a61mr1921776a91.12.1773382378546; Thu, 12 Mar 2026 23:12:58 -0700 (PDT) Date: Fri, 13 Mar 2026 06:12:46 +0000 In-Reply-To: <20260313-gmem-inplace-conversion-v3-0-5fc12a70ec89@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20260313-gmem-inplace-conversion-v3-0-5fc12a70ec89@google.com> X-Developer-Key: i=ackerleytng@google.com; a=ed25519; pk=sAZDYXdm6Iz8FHitpHeFlCMXwabodTm7p8/3/8xUxuU= X-Developer-Signature: v=1; a=ed25519-sha256; t=1773382364; l=7171; i=ackerleytng@google.com; s=20260225; h=from:subject:message-id; bh=lZywDt32gEFzsmecEA4QgNgSbK+hdPuFQzg/RmbbgZo=; b=wXOKwBAcrs4+sjPZdmmjkofJZaHvV9KlzWtq8KOyStQozujFVMUo/V5NxHcke98fiezOI/hU1 6mNboGooVYaD/MFoDyivkU6ez5Z94jAZoYTsbxmrpYamUtgHQtZ455u X-Mailer: b4 0.14.3 Message-ID: <20260313-gmem-inplace-conversion-v3-7-5fc12a70ec89@google.com> Subject: [PATCH RFC v3 07/43] 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 , 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, 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. Since KVM_SET_MEMORY_ATTRIBUTES2 is not limited to be used only with the vm ioctl, return 1 for KVM_CAP_MEMORY_ATTRIBUTES2 as long as struct kvm_memory_attributes2 and KVM_SET_MEMORY_ATTRIBUTES2 can be used. KVM_CAP_MEMORY_ATTRIBUTES must still be used to actually get valid attributes. Handle KVM_CAP_MEMORY_ATTRIBUTES2 and return 1 regardless of CONFIG_KVM_VM_MEMORY_ATTRIBUTES, since KVM_SET_MEMORY_ATTRIBUTES2 is not limited to a vm ioctl and can also be used with the guest_memfd ioctl. 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 | 35 ++++++++++++++++++++++++++++++++--- 3 files changed, 76 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..89c31eb71a1ca 100644 --- a/virt/kvm/kvm_main.c +++ b/virt/kvm/kvm_main.c @@ -2621,7 +2621,7 @@ 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; =20 @@ -4966,6 +4966,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 +5192,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 +5382,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.851.ga537e3e6e9-goog From nobody Tue Apr 7 12:53:42 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 F14E836826E for ; Fri, 13 Mar 2026 06:13:00 +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=1773382382; cv=none; b=tpd2DLn7qgyTm3Oog4uSLC3UpxFC9daKC2SlwFxq4bl8umLvbPKXF6ln7AgrpgS4dibLDUn36uYS7bQRn6qtbMppo0CWLd3JRvxeDhCxD/3+r1fOM14a2YdKueerccqRZPZV+NRSPcQZ8kWFGewPTftsOJof/XqvzAghDEEwmto= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1773382382; c=relaxed/simple; bh=fH+LSf/23FxM9lMSz/vi70SjQxxQNSNxmhV0HLx1ah0=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=dI2cH9kaPV6U2HWoyTtdF2ce/gZFoNOw6h9wzpLrZSRcgNTlBduMCelup9d1wVYjifKn5w62Z/QzYF/OstHPTY5NGJP4wB6lYGAvQMCL1za0N9Ngcr7kKQZzaVHOKqZuihiraY6Cm6QWqXOiOS7I0oquxNsPSYrSJzvUbUPSVQo= 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=ebN8UdAq; 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="ebN8UdAq" Received: by mail-pj1-f74.google.com with SMTP id 98e67ed59e1d1-354bc535546so1717066a91.3 for ; Thu, 12 Mar 2026 23:13:00 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20251104; t=1773382380; x=1773987180; 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=iYyaw5i8MlJ/nWMerV4znKSGD3kzvn0fRy3QYPpJsM0=; b=ebN8UdAqTNuwkyUrV7h2efMz0MWwf4XP6HwsGBw2tjr+jggQaH0qGRQAQGzn8pe8Lv Akqww6JFcE/IeimE3vb5DDl2kieEKD/8y9vtETj/zBh9mZ4nq5WRpdklMCpqtSeo/faE oYmfiDbBQeJeQ/PrqTUQcWv+aPQzdEl26mRUC1H8VjhkdPTjerAJvg5RGKFIgycPGgsE 44RS6Loxwq60VYRdTTSHks5hFBtNJOuekPqX2KJ6DktCsp3BiqtLgkHGhmOVkFcfyoaJ RRGx5Yatc5CJmXAI4obnKz73XSuMt35qMu6Ts4U2Hv5jCWcjFTVT7v3dvoDzNEbu1buH YP6A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1773382380; x=1773987180; 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=iYyaw5i8MlJ/nWMerV4znKSGD3kzvn0fRy3QYPpJsM0=; b=RY0aNjypdUoerTcREB52iX+pd8nA6GiQVF8vf4Dypg2cSurHJ74wopGG2L+e8hYI7D HgzSdI0sI+nEz5ek0pt66QAiwfdHN36tgCzpxxBGIjhzsjyE/OBfhtVFL89d0bNGH9ou Q2x6/6ayA1JjUzkt7eqcCdAnyq6rSj0SeBcqoTcvZ+bX+qU5rsGGlUpb2yr9AJ5qdjnC Pja+vPuUvH19l1VlmPL+Ae0aV2o7AhqzRlDnJ9+7C5C4pu9CC4VFAjTZXyijAr36iD7m NuOdEOjBkLWqLMvyw69CZPU2+PYLiKsQ7Bwjc75wsbQ1xaq0qvfpQZ5tDn29OlbT7zyZ 6Pyg== X-Forwarded-Encrypted: i=1; AJvYcCUdrjYMcw5NUeh6H9OqB3PtO6clrqsUd/EIrEEEogp/IxEthXtCzdNyYx/igyT2SGe6nh8QaR0T6vR2Xug=@vger.kernel.org X-Gm-Message-State: AOJu0YzApRDo/EM/4V75QEC4nTd2/I9mZRrIH78/TJ3h3bk825N1oO2y TpwfaHzP2bAZ07ilVqfR643eLSxwJowt3Exd9Wy5Z6laQILwlilQ//w+BVckQTS8SHkXAcx6gBV R9Dm+1XGPPcPR0qdox6+DmYoZlw== X-Received: from pjbgt17.prod.google.com ([2002:a17:90a:f2d1:b0:359:f0e8:29f8]) (user=ackerleytng job=prod-delivery.src-stubby-dispatcher) by 2002:a17:90b:394f:b0:340:25f0:a9b with SMTP id 98e67ed59e1d1-35a220aae41mr1691496a91.33.1773382380145; Thu, 12 Mar 2026 23:13:00 -0700 (PDT) Date: Fri, 13 Mar 2026 06:12:47 +0000 In-Reply-To: <20260313-gmem-inplace-conversion-v3-0-5fc12a70ec89@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20260313-gmem-inplace-conversion-v3-0-5fc12a70ec89@google.com> X-Developer-Key: i=ackerleytng@google.com; a=ed25519; pk=sAZDYXdm6Iz8FHitpHeFlCMXwabodTm7p8/3/8xUxuU= X-Developer-Signature: v=1; a=ed25519-sha256; t=1773382364; l=1336; i=ackerleytng@google.com; s=20260225; h=from:subject:message-id; bh=1AZUV8HVIE/b1+LKkBMNxVm/VNTc/d2us9MbDw7Vwa4=; b=Et0cAwEV3IQ/8isSspCH/jVwwIUU9y5cDrWGWHgQMY4mZV5OisfESJD5AG8EgWNvSuLXcdMpw QnNWKTfg15WDankXnf+RjdpGbRJ7cfwJ+RfuHWUOQhBiYM/qJ9OwAt3 X-Mailer: b4 0.14.3 Message-ID: <20260313-gmem-inplace-conversion-v3-8-5fc12a70ec89@google.com> Subject: [PATCH RFC v3 08/43] 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 , 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, 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.851.ga537e3e6e9-goog From nobody Tue Apr 7 12:53:42 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 9E33536AB4C for ; Fri, 13 Mar 2026 06:13:02 +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=1773382385; cv=none; b=oPKnxFLZxFoO3ZwLTW7NIbMtSe1CBZWCgiyOXFMjVkBhSRa5jlvnzMRnT/48NwmmLVtqYdSO2tv6knt1vsLYOVcFFTp0/uZNNLHwiYbFlExih0GDzKKfmebDdHkIiWe7UiUCtxvrok6+HAgU1uMmbA38579RkLiSYzWNhgrNfMM= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1773382385; c=relaxed/simple; bh=WoN2BfcFEYSzjATfBJ3Pt1hasRF30hgH7H+lIIHmtNA=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=boxk82HVRSba+6kVKXsfxdAM+XrRuU94L0AQop8UPDA3oTEoCfUYjytEPK0MHwp1EZkXP92meHwmFoKw7DyV3CoK/LKntQIqMKywhOUD9CYPG4u/ONvwlnzBaGLX96yvWMBiqG+yxxQeMpzywrgsYBNJZj1z8lluwEulODVQ+DU= 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=VRr8WhJx; 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="VRr8WhJx" Received: by mail-pj1-f74.google.com with SMTP id 98e67ed59e1d1-35449510446so1466672a91.0 for ; Thu, 12 Mar 2026 23:13:02 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20251104; t=1773382382; x=1773987182; 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=Q/SdpAuBERqDWbcEV3Piz6umSjqaIsJ0fzmifgli6y0=; b=VRr8WhJxvmLYFm9JIi8m0Mtr0yXNFQjrAktAGNeayKYuU9haRekAiSuZsOd1NcmX5t FN3mSXnplFKcNQopnVJemNcxFMEzqx7Hc7hp9w0sBIqK1T2jdi/b3r56mSqVkG/epm4v ZyJAG/8Qkdli0JXp/LBlTMpHhbpFmNEOWEJ0lLTSxMIfMc3Q7fD/RxJxzFFKfVZ7+FZM KkdDFpnBmQuaBgJDn2IxUsmJci2FXzf3GDWGbiDT+3em3atPuvsfX9eO50wpH/kuHiGY 4lV3r1gWt+wCrNje6sdlBRP/JBKgYQ56IDZU+mctCfc9ZXgP5OwFl7cnZZ9d8Wi+0jaH 1kRw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1773382382; x=1773987182; 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=Q/SdpAuBERqDWbcEV3Piz6umSjqaIsJ0fzmifgli6y0=; b=mxNTRJuCEpsVWQodbvTwtd+7Kct2sNSObjn5F+UqApQ9T8NeLGbv4APKS9qOBsd2OJ WiW1VAhsKJLbBJMyKn2ojiMFKrrVivXfBCdy4ew0ZDHhx4CYvhOO1EkmF/Lpkl0BZqkj 5vxWrhrQqjv6pjNrzn4DqoUbvYuvYm9WBirKr/wM4fjZhM/sh1j+G/Sm5OiCakVcV0om LIJ6rJsYv52egIjEAMNEY0ZG5UJ/bMzTfLhHZvmXQleEOi8IU4Y189PfZdkifjf1sbbX XgS+q6R1SnpilBXh6kuPsWO86Iwzr1VqNwIjKM02qljOF01rfYL5v/paMn6lAjxQOkFG Geig== X-Forwarded-Encrypted: i=1; AJvYcCWps3MOOtCoWPPtE2BmeucmOkySkRIclur15fU366v9EpBhl0mRqDhICECnd2ChVpYLMQ8XPuVDmmS5yhg=@vger.kernel.org X-Gm-Message-State: AOJu0YxUhkwZcNRNaAAVUvcAQnT8bNauoy9LsiZEeNC5Fo4TqPOYXrYX d9OgocPMI8L6QrNe/LO0XOIvjIj4c0mrof/nnnZtXxZ2JxO83caihwnOCsJz+RFUvehUKzwQQd9 SLD1BaG12kvJnRggJ76woDGZfuQ== X-Received: from pjbpv11.prod.google.com ([2002:a17:90b:3c8b:b0:354:3742:4ba7]) (user=ackerleytng job=prod-delivery.src-stubby-dispatcher) by 2002:a17:90b:3d05:b0:359:ff8a:ee4c with SMTP id 98e67ed59e1d1-35a21ed3e2bmr1820125a91.11.1773382381765; Thu, 12 Mar 2026 23:13:01 -0700 (PDT) Date: Fri, 13 Mar 2026 06:12:48 +0000 In-Reply-To: <20260313-gmem-inplace-conversion-v3-0-5fc12a70ec89@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20260313-gmem-inplace-conversion-v3-0-5fc12a70ec89@google.com> X-Developer-Key: i=ackerleytng@google.com; a=ed25519; pk=sAZDYXdm6Iz8FHitpHeFlCMXwabodTm7p8/3/8xUxuU= X-Developer-Signature: v=1; a=ed25519-sha256; t=1773382364; l=14458; i=ackerleytng@google.com; s=20260225; h=from:subject:message-id; bh=WoN2BfcFEYSzjATfBJ3Pt1hasRF30hgH7H+lIIHmtNA=; b=WPMK25Ym1u+l+pfOfL+clL6bGa5OvCKVRaJhIeYGniClUI/Ge8nJKuHPmJ9Z5a+3PjcxfT2r7 8q8OJ3A0BykArT+o06M81eYwIdhI48wMDCDkCBIS14DBmBinpbQ3unJ X-Mailer: b4 0.14.3 Message-ID: <20260313-gmem-inplace-conversion-v3-9-5fc12a70ec89@google.com> Subject: [PATCH RFC v3 09/43] 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 , 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, 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 | 211 +++++++++++++++++++++++++++++++++++++= +--- virt/kvm/kvm_main.c | 15 +-- 6 files changed, 264 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 501f4d6e87909..8e4866bb8145d 100644 --- a/virt/kvm/guest_memfd.c +++ b/virt/kvm/guest_memfd.c @@ -178,10 +178,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, @@ -547,11 +549,201 @@ 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); + } + + 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); +} + +static int __kvm_gmem_set_attributes(struct inode *inode, pgoff_t start, + size_t nr_pages, uint64_t attrs, + pgoff_t *err_index) +{ + 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 (attrs & KVM_MEMORY_ATTRIBUTE_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; + } + } + + kvm_gmem_invalidate_begin(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 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, @@ -934,20 +1126,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 attributes) - 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 89c31eb71a1ca..b8f5ce3a33e27 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) { @@ -4978,6 +4968,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.851.ga537e3e6e9-goog From nobody Tue Apr 7 12:53:42 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 359B936C9FA for ; Fri, 13 Mar 2026 06:13:04 +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=1773382387; cv=none; b=rGBE2xaVUWLopJxbhnLxOIrvV3siAyLvqKJIoJcx3s4suOgiQRWH3W2zeEhUe4QSrBkf9ScecHacrE5Hl4CZX+ye3K2tJRCWruI0J/6fn1bJPaHn5iI20Z0nTJ3HRn1+zdlPoRp0f8Aq/1I62wfqwBmmNt8oQp2lPu2rf0fUD1E= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1773382387; c=relaxed/simple; bh=mOJ8kGxeDUajA7ZMCrZoSsh4f2uVT7I/AV/dLdGVkmc=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=XZ4F2mzX32gtymGBAEfRYZNDOwLF++Q7v0s9RxtISw7sAMPdKyAI/LWe1mwe0dh78BPh8BItrjZLFYXrUPPsENJkVKY3xlpsL6qq7RphIWLYJOZ+LEf+ZWBp1Nm6ZQNfDX8kVTC4UnPX2MipCId1PUXav7qiMJ704CUz0cXOTTw= 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=ra2wntBU; 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="ra2wntBU" Received: by mail-pf1-f201.google.com with SMTP id d2e1a72fcca58-82a11aeee8cso466105b3a.0 for ; Thu, 12 Mar 2026 23:13:04 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20251104; t=1773382384; x=1773987184; 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=Axi0INWC8775c3KWZdhtJweqpQD38EitbVRhvmpW8ao=; b=ra2wntBUa0WvAVXCBtC+xWiN5BvNR6Vv5ps/ltxa0RP7pW3nZyvfHFWEJ3yV9SyT7o 8YyqAJFXwXk8oO8lSHtgI9qvX+hWjmlq0QmCELgOIZCSt49Lb8478oY9ajeybtKje52O TM+N9/bpg+A2floEdYloHurj7Zu5PLzudI9OXbaaDNczpiVKLErv8jFSTx4MKrRmO3ZK lka76hYtGuauhct40o25V+zrRmZjVA199qrqrGOAJnnJRd2690KjlU1nU4CwbrceTyfL r0bHUwI0xpV77HjYlzXcAp7UaUuXgY5JhXaWkGVG8goOP/U4isppPfBBhBicDx9Q69/y iuKw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1773382384; x=1773987184; 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=Axi0INWC8775c3KWZdhtJweqpQD38EitbVRhvmpW8ao=; b=azVqGmPFLPZVdI3sQOPbSFmn2g0AJYfRxQvX5bYFmEGTO5Z8paNd2YRQTDYwkQEnJr KI8GnsgmjQz7Bg5SdwCTHZA6G/zzVjoSC7lNW8yPrMNk7Ed8GxIrM6H1SDjywgvFYAIP YSkc3hWsi4D2iF0lFNACY524TNTrtGvEXjJQEEuUXw41p8BL97Bljsm2YfVzillOwM9e RgY/w6K08jl4fa4jxDUK1BQOop7hqYfDItL+N/NiCKd0RCP1XWwMs7h45NeS8MQaSDnd Hfuh9w4AxiHLyc3KWybp7JEz2+BuuE8siQCCX364zq8bkjfKhqWMbb8RpQDeL01XGMBq pg2Q== X-Forwarded-Encrypted: i=1; AJvYcCXxLWQWmURDwEWpkArXNL3+O/ErErx6riRF6Dz690GTIZfVuecmOe2vrltZfh4Z5eUr6eyR92ytp8IXZ2g=@vger.kernel.org X-Gm-Message-State: AOJu0YwP/ufmTxYnn4IIdX6DSJPqnbQZv/jWwU6cOfYKvO5uf8K8ikyH u1KCReACjhP8c0qBq7q4GJU3GBYbAM12s0Qsdwju8EXbn/vVqRSwUynmB0e7FGXAfEyzgYyjrtx SLuInxKKTBEzE8IpDld0E9AWepQ== X-Received: from pfbbk3.prod.google.com ([2002:aa7:8303:0:b0:829:8ed3:28ba]) (user=ackerleytng job=prod-delivery.src-stubby-dispatcher) by 2002:aa7:8896:0:b0:827:2b00:4b21 with SMTP id d2e1a72fcca58-82a19928c63mr1524473b3a.66.1773382383877; Thu, 12 Mar 2026 23:13:03 -0700 (PDT) Date: Fri, 13 Mar 2026 06:12:49 +0000 In-Reply-To: <20260313-gmem-inplace-conversion-v3-0-5fc12a70ec89@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20260313-gmem-inplace-conversion-v3-0-5fc12a70ec89@google.com> X-Developer-Key: i=ackerleytng@google.com; a=ed25519; pk=sAZDYXdm6Iz8FHitpHeFlCMXwabodTm7p8/3/8xUxuU= X-Developer-Signature: v=1; a=ed25519-sha256; t=1773382364; l=2649; i=ackerleytng@google.com; s=20260225; h=from:subject:message-id; bh=mOJ8kGxeDUajA7ZMCrZoSsh4f2uVT7I/AV/dLdGVkmc=; b=wUIAgRpe7+Dc2qRlSZCPcaqsTtORZWK/ma9UgO/87UOqCWKJD0He/Y+AdDVBXawVSe/fkrz4x S2WgoE2yvXtDbY3e22MPOONlu8velunLn8nfuPhosOQ3omM/tX6pEAb X-Mailer: b4 0.14.3 Message-ID: <20260313-gmem-inplace-conversion-v3-10-5fc12a70ec89@google.com> Subject: [PATCH RFC v3 10/43] 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 , 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, 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. 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 --- virt/kvm/guest_memfd.c | 22 ++++++++++++++++------ 1 file changed, 16 insertions(+), 6 deletions(-) diff --git a/virt/kvm/guest_memfd.c b/virt/kvm/guest_memfd.c index 8e4866bb8145d..c4f6bdad6289e 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 @@ -566,25 +567,34 @@ 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 (!lru_drained) { + lru_add_drain_all(); + lru_drained =3D true; + } else { *err_index =3D folio->index; break; } --=20 2.53.0.851.ga537e3e6e9-goog From nobody Tue Apr 7 12:53:42 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 1265F34A79E for ; Fri, 13 Mar 2026 06:13:06 +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=1773382389; cv=none; b=Owuw232TOUGJpBQHiwcj1PcS179/zExx116JwtMTsrsbcM9hvEDKuPnXH33GuQBTmwdqO9dTJ8Qkg8LIROG1JX/gEzcURDwjC2F0m6Si+Fj3ZQIir6vvyhEH4wVaPLbg76Jn69CNVE4fpWh8Upr5rutqi0sa7awRaFti3eIZx/c= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1773382389; c=relaxed/simple; bh=+yxvt6miDsLo0aPzGIl2cuUjXFw4HY73dvLlkFiduNY=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=WWHRJrCyv/fOK5Jadz2zZAYtj3/fYIMFA7IjMONQTGeXnEZ9kIMVPjQarXX1vvBNEHP3XcNgDJhWLwi2BML0jZQunlUbb00UxFTPbp5JA5fDGZ4H/kg672Bup8rkwTE5LR1d0TcGXIKLQAYYFUklSb1hC18SkIA5HSoAiFA+tyM= 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=L11UPzTQ; 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="L11UPzTQ" Received: by mail-pj1-f74.google.com with SMTP id 98e67ed59e1d1-35678f99c6eso1346226a91.1 for ; Thu, 12 Mar 2026 23:13:06 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20251104; t=1773382386; x=1773987186; 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=b75o2IzoSOCf08/jbE8J7pfDBRNnIyHyOWOLbNdF1vQ=; b=L11UPzTQZsjVyClKszCwVBPJIrNF+Lz8QhVKb65MhKcV6iGa29FOaTCr1GzQB7tq4y EkgBAOzbT+ij3CdEbQfesgvj6AWS40x2fdqnlO9UaW2z58sIRIXvtePGKKdxFTWIO7mU C5HgYPEnTl4RTxSxE2yzpgqF5CHm3Yq8ryH0r5NK2sN/X2pZGxZvOyP9FMq0+FLLWg1h /2u3VIQBMwjtl9S4c1fErcSYWoXfZ4qEpSBeKz5caw0rnVthWev48VFdCemS6Gh8oXIA Rl1YKQNlDdehxL9AF3xgH+D9I8B76DQ7JxIwaN2IKFuPUhTlQNgV/udksfk86pfXnK2f PDQQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1773382386; x=1773987186; 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=b75o2IzoSOCf08/jbE8J7pfDBRNnIyHyOWOLbNdF1vQ=; b=ALbeMncdL/CEWeHqWS4tNnazEHw11wgpEADKt/NtcDJk4IbIG10nADSUYJ/OHcLwlD K7JJ38AvtWpmeiij8PJL/vhLiPUJSUzA4VrY1KJcyJJE74otlScR7o/ZkZ1FQG2naHFY akTfEQko2DFMD5Tw5R31/3vRdMXeo6hFck13iTipcQZ5Z8mF6Ug5qJg7ME6jqFRq8YN3 jUaP819kLjlMNzq1g6MjrEgrVZ6QKCqgLznfQyiuQHFuTGzMy1Jn5aw3quUzjfne+EEO m5F4jGpNv9kHGFYWKpSr0uyOPEcGSkkvxBflJbTFH6c4nsW+1vESc/1kAZufuLbcR6Tx c86g== X-Forwarded-Encrypted: i=1; AJvYcCXE0QiGKd/9EX7q5OHhErJ71LHvQIHIqaKxdY+2Gl0YIIaF1ndOvkM10JAOkblxAJcOlEryo6p+/FWzCtc=@vger.kernel.org X-Gm-Message-State: AOJu0Yz02lkt0401PwaUqph6/pzH700dEruL4ECeQmdhzGzN4GD7LeAM bujGNfwlj4/qLIuuLORspg49R0CaZ7G7NwyrRpcm1xY72g0T5Tq4lDWX5BAAn7Bczuhguyhjify 8Wh1xD1FWWfAIl+L6/IDnR7sH2g== X-Received: from pjni7.prod.google.com ([2002:a17:90a:8387:b0:359:78a3:a05b]) (user=ackerleytng job=prod-delivery.src-stubby-dispatcher) by 2002:a17:90b:1e45:b0:359:f2e1:5906 with SMTP id 98e67ed59e1d1-35a21e3958emr1821235a91.4.1773382386033; Thu, 12 Mar 2026 23:13:06 -0700 (PDT) Date: Fri, 13 Mar 2026 06:12:50 +0000 In-Reply-To: <20260313-gmem-inplace-conversion-v3-0-5fc12a70ec89@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20260313-gmem-inplace-conversion-v3-0-5fc12a70ec89@google.com> X-Developer-Key: i=ackerleytng@google.com; a=ed25519; pk=sAZDYXdm6Iz8FHitpHeFlCMXwabodTm7p8/3/8xUxuU= X-Developer-Signature: v=1; a=ed25519-sha256; t=1773382364; l=1751; i=ackerleytng@google.com; s=20260225; h=from:subject:message-id; bh=9Ip75FUnko/0RMTmmR8hpogS1RIjLLZ87GSWphxWeLk=; b=TeyrKLRZr7KdaZpJOnTQ82Tnubf0KxrjYIwwgyxVitGP6OaiDEw2tA9byUcAF7CMB/WOPpYan mVI26pDsudzDK60E97MrrbP9QYf3ETOPcuNtgVvZGbWGXV3ovh0UE2P X-Mailer: b4 0.14.3 Message-ID: <20260313-gmem-inplace-conversion-v3-11-5fc12a70ec89@google.com> Subject: [PATCH RFC v3 11/43] 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 , 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, 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.851.ga537e3e6e9-goog From nobody Tue Apr 7 12:53:42 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 A9131370D4D for ; Fri, 13 Mar 2026 06:13:08 +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=1773382391; cv=none; b=EdPXoQ0CYr4a7SajKgtOa93nokb8LVZ8VvHoWjeaM8vOD3+EDdc0Rrf7AyVueZLkb5FtQ3D4K7sglARwUErq0Bsu0Rfora+Jc3bQTaCPyCRRX6taSgf3ECAGD2xjlFpC9JZa/oO2idbwMpFnW/GkkrqKimoJN0cLk3cImlrblQA= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1773382391; c=relaxed/simple; bh=cCfNsCI87fg6TEnfgoRKAm3vjZfM30ZKoMGU1LRZRBo=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=cvzPNtYnSHzyFRoKfCELgvc6PJR2sKSOQlkhNqRvYFfBGB4LM0IvAGcpSC6xr3J1bVc2lu94Gqe/wmg9wwn4VLwv1KOWksS7JlL5nXHMHYJdxHW7Olp7S9GT+HXOelXKMHSY3M1bhGJ067wTjkYI1jdaPEGYYW8VrEhiZ01oqcc= 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=ZBgbTAhe; 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="ZBgbTAhe" Received: by mail-pg1-f202.google.com with SMTP id 41be03b00d2f7-c7385e8fa73so925056a12.3 for ; Thu, 12 Mar 2026 23:13:08 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20251104; t=1773382388; x=1773987188; 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=lTunW/QNrd+D2aaY5sITtIPS8ag2VRP0yYeRUeCHtMw=; b=ZBgbTAheyn74oo/DGKNYaeCqJCoOIr5Nan2IneK/Zzbx41TCYgZ0ZUE0a1MuBuXTDG C/c9iBt4REGSnWHx/tqr2OVSJvqUSn7kT+HcGha87IVSD2XjNZ6G+aNFuGVShaHCcfw8 nbGvBowREZ8LeyGQ7XUeyFCd6+c3i/+jx7+b+XsY0MMvK4sWQND7O1pTsv5VJtlq5qsw PodYvbcGRcBOQiaHSiJOE/tJ18umS0O0WDTKb4vizBK/XER0orYkpuh82YioY5cbNFEi umhZrXwqB0jPzybFgEIt+NXU/8lhMpm/nGAx7LvkEkoben5JQMvMuKSLJGRxFoGZ7Ljw fpgg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1773382388; x=1773987188; 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=lTunW/QNrd+D2aaY5sITtIPS8ag2VRP0yYeRUeCHtMw=; b=CXGTdVXwAM3C2zHwa3zbhKXf7Q6+rPkCNp5kZWhd6GFEH/fYBDUWM2fMP0sFEq+gVR IlTOruqdVMAI11HX0TlHGSCME0I1jOVcqdCmJTEwtqHvj+TglLaj28SVMg5lsYzY4I3D waCEg7JxvsAg8y9rxN+PJgao3rmb/rwzJylKghv3oBazjhM38qMqWyZ0v1/k+tYDhoxj Lp2xHcbOGutx+DHOlNvwhv/NJATqo+gpWTsjoF3dRiIf52t6jki9BfL/8fXYD6CfNKO6 +X8cN2fMNxCxWjc95DcdHni5qNxoeY3K+tZvZ0fXjg5X94lkF3R7mcno7NvjxOmIqK9b 8Myg== X-Forwarded-Encrypted: i=1; AJvYcCWmKodaXedqMwq/EtSpn1B19LQHSeRVHF46L9RL19p0netQqJVcK2qsmCrQn5fkzYRdAu+1VaoXOCScTtw=@vger.kernel.org X-Gm-Message-State: AOJu0Yz5Odn+XWaoGrBGzMnvnW2X0kMxjIHwnMxGUV49llmLNjEVdsTe i5iPVe7wSbsclWO+Ccoshl9evt2/ev89pqM4Uy2IcmuaaBbvDmCvoNLA+S5obe8oUK770y2+rYQ Oe6qvjUt4LBRTkXZaP7ElnyJv9A== X-Received: from pgww15.prod.google.com ([2002:a05:6a02:2c8f:b0:c65:d823:cdf2]) (user=ackerleytng job=prod-delivery.src-stubby-dispatcher) by 2002:a05:6a21:2d42:b0:398:7d4a:c2c5 with SMTP id adf61e73a8af0-398eca52535mr1641278637.20.1773382387685; Thu, 12 Mar 2026 23:13:07 -0700 (PDT) Date: Fri, 13 Mar 2026 06:12:51 +0000 In-Reply-To: <20260313-gmem-inplace-conversion-v3-0-5fc12a70ec89@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20260313-gmem-inplace-conversion-v3-0-5fc12a70ec89@google.com> X-Developer-Key: i=ackerleytng@google.com; a=ed25519; pk=sAZDYXdm6Iz8FHitpHeFlCMXwabodTm7p8/3/8xUxuU= X-Developer-Signature: v=1; a=ed25519-sha256; t=1773382364; l=2855; i=ackerleytng@google.com; s=20260225; h=from:subject:message-id; bh=nUG7MbP2VMtZ/RqI1k3lVv6HlTa0rLwtPHHfG9+apaQ=; b=gIIAcTAoq+uh6ZLKHTYgkGSDsVcXa8Oje6UJiWgcGy3Vt15Tyj1DsgsgEZxls9Z0bpWC4urhr c83+zR3qU4jB7TwLhF6aLoFZOf67MMkSywGzRdj1slybgAxZUnFmyqS X-Mailer: b4 0.14.3 Message-ID: <20260313-gmem-inplace-conversion-v3-12-5fc12a70ec89@google.com> Subject: [PATCH RFC v3 12/43] 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 , 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, 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 b8f5ce3a33e27..9744d3a7fd917 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.851.ga537e3e6e9-goog From nobody Tue Apr 7 12:53:42 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 46118371065 for ; Fri, 13 Mar 2026 06:13:10 +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=1773382392; cv=none; b=TYATb+HKazIt1aP5iCsS46o1NcvS8nKzf0nfau9xffzDDXY/2F8KYZ0PKU1490m+NhF+poJEWUiUAaYs/JQGaJOflSegL1Ux3kgPkaajeR9ib2ehXsFlxc2TnMs5k43/qRznxB+rI0U+qh5mgelGGJwWZGDKoZYoFFi5+zBqCEk= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1773382392; c=relaxed/simple; bh=ZcXSegqXtJz+HuVqaKPnc6MToB5+TO4fJ8GJ419WYts=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=H5+sodnAV3e6kFGhuzcBlI7hmoLC6t40yglHJR8T3gAzY/zH3Kudg0EH1TmGU5En8JV6MwuxJZ1DmSUGb4GoAewMZeh+CRrELnGBIfuA4K1vNL4Trc4AeLaxrUUpo7ZKGNiWuMAofK1isk89B9kqGzCXrl6NKqocTP9YtGafEzc= 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=A//1RUV1; 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="A//1RUV1" Received: by mail-pl1-f202.google.com with SMTP id d9443c01a7336-2ae57228f64so18748005ad.0 for ; Thu, 12 Mar 2026 23:13:10 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20251104; t=1773382389; x=1773987189; 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=WVpdQpvFLdCQp08tqM1IF+MQMy3lD0i845Y7ArLQP5k=; b=A//1RUV1LP7F/1CNF+cHamVeGgShEyq5To0RXvYvaKdhJbyo8DfSmWgtckVp0Sw2rI zwRKTWV/MSufzBVLbBufgfvUhU0gPO9KM4LJEUqCf0Hzf2fXCUn3g8OALDvfKo0h1Lba 4+cQCpGk4ypQovWDAm3itSYfFHKpfTuUEH0RiMGGDbmBWIgUKxBPbKeBgQG7MwhaMbjW 14TMPZQwlJyPCLm7xWpKdU31e/rCSKknxuIozN7EbRhMfbg7aa04BrQNqeCnlp5Ts4vt 3M0MJjDvOIIN9vepRN4eV4hDHEc9VsN/6MtGDv/oP5h1n144Lr0hC5NYkxH3RZnRY9GX kucg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1773382389; x=1773987189; 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=WVpdQpvFLdCQp08tqM1IF+MQMy3lD0i845Y7ArLQP5k=; b=r2ashQw4u/LCULBSibYhjyUeSUCmFsGEzWnhobubc8/bz44AQE1pnLJI0Z6N22ILXH 5MpT/7RiZBBTN5eRnz9vt/eqT2IeVaWdvSjMqreMzeuIQUJVrPnBd+YmsByoxfzxoW43 3r9nTgqThMnnW6BrMyhr1YYlEAvZwEpRYoqn8mgDkfSHHRrPNPrH5BUqMvRaLRlaJO/m 8RULaqnPN9MDIcJSrUH5GanvXqbY/J7ZiJg2lAA9nNeNOtdDeQovuUU6DmUZ1Dw2KSf6 /H+syE7u9wwYoLAJaWJypEViw5mspIYrDekBgH0cZd/0dX/jpCFB4McWd2iU+e75fT2H oNKg== X-Forwarded-Encrypted: i=1; AJvYcCWXFTQzetT0JevxMtybuIn1E5BAkSRH/hJ8PJpIT9Fh42pIxKYAAYOO4OegCqYwJVTQCYA+q1644EgmhfA=@vger.kernel.org X-Gm-Message-State: AOJu0YyxiSwAY/lst7mctNwuib8xfLZBSwVfZevnaVouaXDUVxbSCQdr bkgkTcO+K0eIo9/b0snZpFmwsiq3LFPFsPrbUNDyjVY+WJ7MhQLLLvVYsXf3avHLNa5l6ty/SyW lvM4E26grSw1y0XaAVMq6bDEmrw== X-Received: from plbjz16.prod.google.com ([2002:a17:903:4310:b0:2ae:caac:985e]) (user=ackerleytng job=prod-delivery.src-stubby-dispatcher) by 2002:a17:902:ce08:b0:2ae:69d3:5b9f with SMTP id d9443c01a7336-2aecac3d018mr20770965ad.52.1773382389302; Thu, 12 Mar 2026 23:13:09 -0700 (PDT) Date: Fri, 13 Mar 2026 06:12:52 +0000 In-Reply-To: <20260313-gmem-inplace-conversion-v3-0-5fc12a70ec89@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20260313-gmem-inplace-conversion-v3-0-5fc12a70ec89@google.com> X-Developer-Key: i=ackerleytng@google.com; a=ed25519; pk=sAZDYXdm6Iz8FHitpHeFlCMXwabodTm7p8/3/8xUxuU= X-Developer-Signature: v=1; a=ed25519-sha256; t=1773382364; l=2779; i=ackerleytng@google.com; s=20260225; h=from:subject:message-id; bh=QMqLBWfipRQk2humW1I5jERFAazkEA548/OzFfNNg9I=; b=ZpxqH6lsLfyqCPHMBj39EaT5Wr/G0YsQVfYA2dBpQ+Jh+l1wbMHQyFZdFvAc9VJwqQog0+kd3 01n2EBWt0LfBavEqyn/JEadsWWfbY187i7sB+gpT1ZPHGtcMzsug/Vd X-Mailer: b4 0.14.3 Message-ID: <20260313-gmem-inplace-conversion-v3-13-5fc12a70ec89@google.com> Subject: [PATCH RFC v3 13/43] 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 , 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, 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.851.ga537e3e6e9-goog From nobody Tue Apr 7 12:53:42 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 3E0F936C9FA for ; Fri, 13 Mar 2026 06:13:12 +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=1773382394; cv=none; b=Qqqz/Tt3wlXB3S+UIdJDCJ4aJNQwwhCgDIi4LmSznRmdzVokAGvB4l51icgqEpf+Qrn/aM982MZKB3bqvLqEXuC4/tKVL6H5+y6KnoR0QjzL8U5vUjekp2ENN4oz6mrwT9XxgrEJlZ2htEwF0BhTf8tr4wB83qjxxfHCfc2UlSo= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1773382394; c=relaxed/simple; bh=lEnML6fk8+WAkIxMuWVBhCw0MzMHDX4CUEoAyGmBO/o=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=mGOJpJWKdGBTy/YQeR9NwMTBaBfI63qZLARLUsDIJfrAX5GwKL7Ph6rvp7BilYrHcDVewdCBYj2dpR3c9BAhk4HD2mNDz2g/XlUzAbqb+xqzJGUTXdTUi0sMMBeVTo4VD7wFRXQLzv/UNCjUfX5JHp95irn6E7Zdhbpncd+e/3Q= 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=q4WNTF/6; 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="q4WNTF/6" Received: by mail-pj1-f74.google.com with SMTP id 98e67ed59e1d1-35a1e725a8fso6008018a91.3 for ; Thu, 12 Mar 2026 23:13:12 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20251104; t=1773382392; x=1773987192; 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=uT/wLR5Jn4iFTGZ6y1IwwIViRXwEzg+e1s6zn05HggY=; b=q4WNTF/6GOE/ZdyKaY/XgZJHVsaG/sqwMViEy3dSG3pN6NA+6V4ODs6bY/8PntlTcM Rb4AyduUAvOshlqza/r3aqtYEOqZc4nX+HTCGjg2uPal0WyRSvFeipBpke9unIhT8oGd JPZffmTHli6OYxs42SV6r6ashjzpv+lJdAinbXEVasTAaNBQv6ZXGeJVpB4Xbs8cJjFI aN4gKHdWT2e6DWezTcguQ6c8e5G+8SXE6zL7aC9itEeLqdZq5FlvFDS3jAd9TtyCX20p 5VoTSU3X9XB+ZSkjTwoEW9xTSeYxzyXya6RHGwExPinh5fkGpSYc7c+G45/Np04DtU++ Bn1Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1773382392; x=1773987192; 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=uT/wLR5Jn4iFTGZ6y1IwwIViRXwEzg+e1s6zn05HggY=; b=Nk3eopaLRvVS+ju0lxzfh/xzUwCaPzgMLOFk8FbdqqjCdLPi5tNL5VTKnafo+45dlA jvs7ir951AQP9wje3Wkg4vNcPAL1CRAfiKjSeetltZJRHrtlZRYAE4VuopwHgUycbGRy 9Cyv5GI4d30xQihV4pwQVczkxBbPHyDAcBhJdl7vKU6Nw0H6YmHMbr9+LM/xF9/9o2b9 kVP9Ooch/bwbLY4U9ddrod07ZH7mKKI2twXq+Izpz9kHrL5vIPjCcTAkuA/3zI0aYGia gIoTmYrLoUjAVvEdvBzg9yf5i7Bsr2bBwA766E0mDYnX/HRf+LWrFwNX4dI/2xpa59Mb kSoA== X-Forwarded-Encrypted: i=1; AJvYcCU3wStGuAhPATS7kQ1HncGdIQtCKlEdWEis3BCPFlH09rDZtTXE2mTmNC3VKUOMtKcprLpT4Uc4BFRLaHM=@vger.kernel.org X-Gm-Message-State: AOJu0Yz2LFy3mQoKBa77snJwN/S3tnX2GT9CXGbAtCIm7/dY4I1GtCjv 8/U9lCpcFFQOTfe2vyBHWi6IAwUnbLdJ+pPdRsoUdpbH64nsPXkQeIvXS15ri1L/A3uSVqnjCb1 Q7tkEv7BkK9L9E88UTeDsyap2xA== X-Received: from pjbqo12.prod.google.com ([2002:a17:90b:3dcc:b0:359:7bbc:ec98]) (user=ackerleytng job=prod-delivery.src-stubby-dispatcher) by 2002:a17:90b:528e:b0:354:bf10:e6a5 with SMTP id 98e67ed59e1d1-35a21f064eemr2022217a91.10.1773382391422; Thu, 12 Mar 2026 23:13:11 -0700 (PDT) Date: Fri, 13 Mar 2026 06:12:53 +0000 In-Reply-To: <20260313-gmem-inplace-conversion-v3-0-5fc12a70ec89@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20260313-gmem-inplace-conversion-v3-0-5fc12a70ec89@google.com> X-Developer-Key: i=ackerleytng@google.com; a=ed25519; pk=sAZDYXdm6Iz8FHitpHeFlCMXwabodTm7p8/3/8xUxuU= X-Developer-Signature: v=1; a=ed25519-sha256; t=1773382364; l=3719; i=ackerleytng@google.com; s=20260225; h=from:subject:message-id; bh=knPXn7cTEnE32qPaGovYRbheax1spbV5ScE3bJAhH3I=; b=av3R7r+Shr8bLUoixCjc0bCw3zOPZcyvF7XPQxV5ePTYJuRhwxvUgvJsHygoTOMmqbwNxir0X z6vTB/yifbyB+UjlgUW4cgJeERFLeJ0hVlahLsfOMA2I+baOvyO3BsZ X-Mailer: b4 0.14.3 Message-ID: <20260313-gmem-inplace-conversion-v3-14-5fc12a70ec89@google.com> Subject: [PATCH RFC v3 14/43] 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 , 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, 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/lib/kvm_util.c | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) 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.851.ga537e3e6e9-goog From nobody Tue Apr 7 12:53:42 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 0B726372ECA for ; Fri, 13 Mar 2026 06:13:14 +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=1773382396; cv=none; b=MERVvZLPTKG4bjR/Feh7onfqlyotwb34o2oeTqwgX5CyYZMKj3Pk13xjxkFGnsd7G31Qp3RUK3dumlo/3uqMltIpf080FUqhn9LV4lX+sEQ9sELAVMhq8lUCuZuGp1f94zYJUfNonhKLfmVZ9FksXCM2tvT8pj0bhzX8DHzS5do= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1773382396; c=relaxed/simple; bh=LB/c9880A4gPkN7BFedv8GkhIgobxX+Kgw1lEard0qU=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=lGMti/eLourBXp48YGO8m5L3Sp5e7oLUK5aKH504Wrpsxdaf0iV/YqAep9KNi/2iq3b84h8VLvz28UXZPKK1VeQGVC17eMLXQpfLp7cPV6UXuA4/T5DKLV4tM8oj26peCjZCwav5vc3G4gYVouBeQ8eo1XEVLGaZnlgL0HKx9tI= 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=OI9hprbV; 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="OI9hprbV" Received: by mail-pj1-f73.google.com with SMTP id 98e67ed59e1d1-3595485abbbso1929743a91.2 for ; Thu, 12 Mar 2026 23:13:14 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20251104; t=1773382393; x=1773987193; 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=kA4vlpQjFWqvT5wQWRcoveFoqdTQ4mLT81y2IZEP3Cg=; b=OI9hprbVJtCOwpcwAKWNgrZYQ9VjeCnrxPRQCvXKNh1gKsRbrvYyCV55V3uMZSkbfT 7zM1nkK1JSkuv8fuQXOLy4lhev2N+Oce+wep0rXkoI1zb2qP232rh4+46T2dOUyorNQQ CTZ0AGqG1676FXgZX9LpRxHjIlR69kqrgoAhjZL7y2sNy87x1P45FVGl/JflA9UGfutR 0QBrXwDiWEz9P+3KUihsKdBYgspJOGW/oV+RI2C2XkjyRfKp7DLPq3XNPxvtYy6/z3Zp dbRd4tk4xMoSI/7xhR/pUSPD5+/eNRONyIGZvWYI+23flr8vqrsbbzAmsOak7A8i3CHH OiTA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1773382393; x=1773987193; 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=kA4vlpQjFWqvT5wQWRcoveFoqdTQ4mLT81y2IZEP3Cg=; b=C4oIvHeg1t2xokSt4fB+CeSknJ2FSjhzJ2xgVTe/ht029CC673JnQhJaCldlgcC5Vj kLsAI5D0z/LoxQjMVyzNMDBu2HSdQ7KmORdo57Daw4BRiqxkvTQu7Z7/j9AaN7Rkpqcn /ZGyz55fCRKWyxvSmMQ9lFhuwwZx57mg5m+LNaYrFJfe81VTu79VhPo8QlMB+7pzHz/L ZiFDDKo4fvCERpYaSAr9Mo+Wsu7fGb2O3TYVBILoDEHjtAv9h2p7mPFos3d4UTxQuua7 /vEQOSa8bgpelhzHJPHocdQdeceF9zeT7MAFxJKQtD3ISPhgCFQI1yQPogYC1NMglyOY lCyQ== X-Forwarded-Encrypted: i=1; AJvYcCWkRDrFWWLCZwTQYpD0xyqP4KRo284Nwcn5ZOemnEUBBXW7a4CEGOFZcJLwDibGLt1GF2dX7eBllvEugSg=@vger.kernel.org X-Gm-Message-State: AOJu0YyMdGGcmTrH03xXWvgVlKa75gpmXV4E2WBQjgNO23o5Ztr1mS2s 5Vjzivvwz3RBItFv4urBKUzHZINMBBrZQiFahyBUNKc3YXeBRlTPG/i7DMWV+DMfFUC0vidcUBi RysyjFJ9vsMrqTw6WbBpaSDIrfw== X-Received: from pjpq24.prod.google.com ([2002:a17:90a:a018:b0:359:f13d:47e3]) (user=ackerleytng job=prod-delivery.src-stubby-dispatcher) by 2002:a17:90b:4b82:b0:32e:3829:a71c with SMTP id 98e67ed59e1d1-35a22003cfbmr1920770a91.16.1773382393031; Thu, 12 Mar 2026 23:13:13 -0700 (PDT) Date: Fri, 13 Mar 2026 06:12:54 +0000 In-Reply-To: <20260313-gmem-inplace-conversion-v3-0-5fc12a70ec89@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20260313-gmem-inplace-conversion-v3-0-5fc12a70ec89@google.com> X-Developer-Key: i=ackerleytng@google.com; a=ed25519; pk=sAZDYXdm6Iz8FHitpHeFlCMXwabodTm7p8/3/8xUxuU= X-Developer-Signature: v=1; a=ed25519-sha256; t=1773382364; l=5513; i=ackerleytng@google.com; s=20260225; h=from:subject:message-id; bh=wjluatSRa4SZMqiPhVXUZiGzpgBh6y1tcvUXSnigBps=; b=SnHcT6BLijI/s/eop0MIHaP4TDea+AZNypT33DeRdeN6br0y1kobmWHh3mfT63BN0GTKQ/mYX JGeVEfKTF+FARlop7kGa3xz2A0KnwROEVv0kpUFAz3RSWyq3EJggbz7 X-Mailer: b4 0.14.3 Message-ID: <20260313-gmem-inplace-conversion-v3-15-5fc12a70ec89@google.com> Subject: [PATCH RFC v3 15/43] 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 , 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, 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 8b39cb919f4fc..caca482aad859 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 guest_memfd_fd, uint64_t guest_memfd_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.851.ga537e3e6e9-goog From nobody Tue Apr 7 12:53:42 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 90FA6373C0F for ; Fri, 13 Mar 2026 06:13:15 +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=1773382397; cv=none; b=kFIsK3iwsuIaD+jOT2xpl9Ym+iluJlD5k1jkXomSUMv8yqglxvXIe6z49+L0aB/WcezqbDo1fMBTLHwYT3Ou4kSSQ5RT0ug/N9AiFMljbauiXzuWJL9UhD30EXF6mHlEffJ5eGhQnuceTEpl+69DY0+/fnmA1HaKGDKyrR668uo= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1773382397; c=relaxed/simple; bh=sxgVJ8rTnsDVVvkkCb/N/5psScG4ZKh4tfTvkLAGmSs=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=lvG0B0ym/zAYq3t5/dPY3UOwwspQBD9QovOPpfBZnqNdyRcxtW6F1IIXlx+hYMaSy9tSr5sFbUlXpTGUf01W2Thd5zGlJRfrqv8PbcIOU8D17jSXjk5P3k5vHw87ywYHIrhnFefUkLKotxgsRp/RRkjVUZb5lwB5Ic2SIlJiZjc= 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=GDEL/DeO; 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="GDEL/DeO" Received: by mail-pg1-f202.google.com with SMTP id 41be03b00d2f7-c73939e0314so935878a12.1 for ; Thu, 12 Mar 2026 23:13:15 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20251104; t=1773382395; x=1773987195; 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=iIA73EOEF8zfWIRjnNLmO0fDuVTBhQUnDUuak7WvzwY=; b=GDEL/DeOO6NCk0Uodeb5OJuRacXLG07pLtKZBXGZufV95LMk9GSfFgxh6O/BdY1gcs tY2zviB7vV7+NuuZulVTf63+Y+3vT8uT95NmuO51o9RO6WCOYV2Px5Mu2Bt/qxxb6+TM piov101iHHOSRr02lwxAKQAP3j9UNPqWWfLnPZDc9eJxi8OpT2GYqtwkD88wYaAcZaxN pvSqcGld38K3fOIgL/MBcVbXgKYpyukRHBUArE594QpJbvgVuzrbuZ7vrt5W/tzbKYez cysmEeFqd2i55BudFD56ntEQOJ26lJ1xWdSK3oyRl4xbL1Y2ElHV8vPENBwgULuYkyUz Cs0Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1773382395; x=1773987195; 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=iIA73EOEF8zfWIRjnNLmO0fDuVTBhQUnDUuak7WvzwY=; b=Q5jOGqTdOUoHJrwJpSARk/l4wKzPG+OMNVS8AhIUvBQm6Rhkf6ruz3FmIdwIw8Mjgx AW8CO/onEFNfXL7ZjXJsE/P/kiSVqF1reA9UZ9F3TvSLfH42pVUY4PYlWQtdj4m5/0IA Qq9zkwaI5m2ZJIVqGdzHbvnS5beG7JO/em4QVVRT7pXrrckXTJjTCaEx9PlMSTNXxrjj 5fXgixlVnbcs1KWghI4i8lBXStkUUU4epNfGh/73F3XYpJwf78GAW/q0TUa/UKJja5kd JlfT/2mMYegg6Q39Sv3s7lc+lx+3b6sNsqdMZEF3sBDDXwT+uD0peUMZyIylU/HWMGuJ NdSQ== X-Forwarded-Encrypted: i=1; AJvYcCW47Mhl3BduV0REue0LHCCS21L2vPsyMWFqufWh7OJ68Uxd4o2gBpR3PEOeSShHT+m3wr7xxgg8zgnQbkc=@vger.kernel.org X-Gm-Message-State: AOJu0Yz7PzyG7hDP5dakuMeGjhJsO950sZiJV/D0asoaAhXYoSughdGV KEYlKPUC0sNhx+vDJJiJ3vPjhprDdWQXCNDzESOIHoDqSa6pjITq7l9MMnj+hbUJKJ7IpXJTtXu OR4C4drSoRoirBdVgDT5itB81UQ== X-Received: from pfdj23.prod.google.com ([2002:a05:6a00:9517:b0:82a:ff5:27d9]) (user=ackerleytng job=prod-delivery.src-stubby-dispatcher) by 2002:a05:6a00:301c:b0:821:8ea4:480e with SMTP id d2e1a72fcca58-82a197046d3mr1745281b3a.10.1773382394655; Thu, 12 Mar 2026 23:13:14 -0700 (PDT) Date: Fri, 13 Mar 2026 06:12:55 +0000 In-Reply-To: <20260313-gmem-inplace-conversion-v3-0-5fc12a70ec89@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20260313-gmem-inplace-conversion-v3-0-5fc12a70ec89@google.com> X-Developer-Key: i=ackerleytng@google.com; a=ed25519; pk=sAZDYXdm6Iz8FHitpHeFlCMXwabodTm7p8/3/8xUxuU= X-Developer-Signature: v=1; a=ed25519-sha256; t=1773382364; l=2423; i=ackerleytng@google.com; s=20260225; h=from:subject:message-id; bh=P0HrtVxcvcqlWA/iAGoaJvXr6ZzCxwiLrVIFwieOOvo=; b=OFFegv3rd3IOZnzHW+6v/BpR4KTo/XpLg67/Eww9gNEmgAMLEZet90hrjrXlozg5YLYGSdcXE jyOPrYDtK26CFbb50GcRq6HOrH+9D2ETzJgeZNit2x7W2pBp7xYG0rw X-Mailer: b4 0.14.3 Message-ID: <20260313-gmem-inplace-conversion-v3-16-5fc12a70ec89@google.com> Subject: [PATCH RFC v3 16/43] 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 , 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, 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.851.ga537e3e6e9-goog From nobody Tue Apr 7 12:53:42 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 3CD8D374E41 for ; Fri, 13 Mar 2026 06:13:17 +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=1773382399; cv=none; b=hABpWMwbjnKGJILdgq0rlM7XOTuWw8rMY/SOGW19AabiHKk0SZ0LlEOpF5CFk+pWbm7eRTBPqVrW+1kbUbF4EJYyOnGiyOggRpA3HTrRPt0ldYHjYx414BN7vB0jZcUDlnT8WUxolfK0Mf/RXPNdplKyi8TaPdP1GJMpMSn9BZc= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1773382399; c=relaxed/simple; bh=2bKFn7DxXybMi2Eo6xsWXzHmRVA+8uQonK2JT0DPcs8=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=OMmTI0Z4YLkSLWLCGDmorVOpfOiQcmHegZZh/Cc5GKeq5CsR7fr6Vb2uOFu3bTprBOrqj6dLYwG7GJ1/EJBC8gKqn4cZahPPgBmeWihDIRhbZlr65LEG0sDI9DfCGA46SQGeeg5Y0BTGjzOkYvUcnHRAkgAFwudJnVzEqhPX2CM= 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=LKnBOH11; 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="LKnBOH11" Received: by mail-pj1-f73.google.com with SMTP id 98e67ed59e1d1-35a203038c8so863373a91.3 for ; Thu, 12 Mar 2026 23:13:17 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20251104; t=1773382396; x=1773987196; 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=prn+/FfRoFXlGR9u8MjJ/9HdwBqMGCmRUDTQNyUT33c=; b=LKnBOH11nNy1QohpQxeemHKEgzIhDL6bUXYJEtRTnKBsR9AVuNhsmVvSRmnDlPV2qB NTkqOCVMP+2jtm5Jl+jVf9sHas3c65i0eDBT5pgQjJqQN+xosiX1mgHJQopw2U/lzBd6 EEX6MBTjcHPD7t/sU640S3RfC/qvHfEOHLE1GaMQaoeqEbrqHsqgOTd9E86E/a65m70g yUKCohHUJR+imgl+b/gptUWsNxyVoFmPS0chi8foXZHlhI4EBZz5cu0uh6NYXMMiQIpi XtbY0yZub/iqWTQatjn7pAxc926bkh/rvfoVxeHzoDwHWMPMpZ2oBsOnGm5tnxTh85rI M2mQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1773382396; x=1773987196; 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=prn+/FfRoFXlGR9u8MjJ/9HdwBqMGCmRUDTQNyUT33c=; b=rOjugT06K4aL5U8Py3kb+5tuWhb4+5Um0bswrUPd8KYQzTYhDhz8ZPvG1BZxyaLnKh PFnIdHoCMczWtoGRyNGl7MCvv8qXSE84qIhI07aF5IvnYra4nbbe19Q3pBCPcxxftY2E iz6NfyG9L4WyYJBNsy2woKOttmd07DrLmtJ0Oics/bRiJ8zkidpZKo3j7V8/EVtH1OW3 7m2YVaMOvW+PWKUbEH5N2vLESByOX7HRCmAgXunp41XbZC2WLwJbM0Qyx81zLe6vbX6A STIoCsA3yNP1lwxguBfDaoMGV6T9871S8PMYFBzg2qOt4QO/ok1UrS3AUnAcpOADhKgz 83/g== X-Forwarded-Encrypted: i=1; AJvYcCVPZQwQmd+bSOnMYRi8uBokQ8VXrnZYtTU2cxALhouZ9XQtCyckYBaKYJtFhi5/ZSnZa78cOM1//ffQdIs=@vger.kernel.org X-Gm-Message-State: AOJu0YzlfQy2Uskf4tNWDbsFDZzd3IrjYW9YB2I81/sSW5bbaftZaLzS rqdCIfujBRe/z89x8apvtNd0s62x4paKpwD4JRvNIFh1DGEj/gMM2NAdOrs6yQFaPtw5+YJlLNz gJOPAC+84RREjzfNHzfBo7olQGA== X-Received: from pjbli13.prod.google.com ([2002:a17:90b:48cd:b0:356:20f7:5344]) (user=ackerleytng job=prod-delivery.src-stubby-dispatcher) by 2002:a17:90b:4b82:b0:359:fa1e:2bcb with SMTP id 98e67ed59e1d1-35a21e4721amr1828333a91.2.1773382396244; Thu, 12 Mar 2026 23:13:16 -0700 (PDT) Date: Fri, 13 Mar 2026 06:12:56 +0000 In-Reply-To: <20260313-gmem-inplace-conversion-v3-0-5fc12a70ec89@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20260313-gmem-inplace-conversion-v3-0-5fc12a70ec89@google.com> X-Developer-Key: i=ackerleytng@google.com; a=ed25519; pk=sAZDYXdm6Iz8FHitpHeFlCMXwabodTm7p8/3/8xUxuU= X-Developer-Signature: v=1; a=ed25519-sha256; t=1773382364; l=1677; i=ackerleytng@google.com; s=20260225; h=from:subject:message-id; bh=2bKFn7DxXybMi2Eo6xsWXzHmRVA+8uQonK2JT0DPcs8=; b=UsseJW23riRqFSAIxPK8qnPAGqJurB0Ctj5jOfqiKNkUC9t+LwPGzVx/dr+QiKe6u1ukz4Hf7 k666ysDyRPdCxyh2c6ANRQbRGBbWH9t1P6eRcebLtVxIaqwBCwgjIPx X-Mailer: b4 0.14.3 Message-ID: <20260313-gmem-inplace-conversion-v3-17-5fc12a70ec89@google.com> Subject: [PATCH RFC v3 17/43] 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 , 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, 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 caca482aad859..fc55ad3c67485 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.851.ga537e3e6e9-goog From nobody Tue Apr 7 12:53:42 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 8688F375AA2 for ; Fri, 13 Mar 2026 06:13:19 +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=1773382401; cv=none; b=ASlW2haYP87yFvKZpdK+BPyptrmrrVwsL0NEV0zrfdF3wFNguRZic5FGux+wyXb3cnXaFsOAeZv/ho1xm+teWZpLPJ7/nKl2E+tiAXTC4tzqwjP0Beg5/Xomx893kBOJl+i2lE2yvMXuk0JN/82Lz2aci/OTFXkqlezFDsHrYNE= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1773382401; c=relaxed/simple; bh=bMuIvbANV6whsHe/9Uf4i1Iz6OP8YGDNiGzY3Lul/Ts=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=UYulfg/PU6eDcZbw1X/A6ZdoHLDKG2WimDH1W+qlAGE/EYgSdWuccCh0qhkKwwuJd0rPX5HpAyV0wm9Hy4/Z2XGD3ifT7PSNPocVvAYdyQqIo0f3PrueyAP+GfiTxQbpk9bear+q3BK1xXm5pZcex2KPNisxFt0dkbX63TzBwqw= 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=Adlp9YqF; 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="Adlp9YqF" Received: by mail-pf1-f201.google.com with SMTP id d2e1a72fcca58-829ba0e63e8so789541b3a.2 for ; Thu, 12 Mar 2026 23:13:19 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20251104; t=1773382399; x=1773987199; 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=QknoZXBKlPCGwx1irT4+gYrnFv4rWV1IvMUMC4bd+4I=; b=Adlp9YqFVZ/0kZVl1gOaiLeaP02UyV+gwAzakx1CwddnL7kBVC/leVdTcm6c1LxJTJ MQXYiTPquZFkfpLGQc8q+4dgoT3paEPBtRSO6T9/DJFs/Wt2tS09WvrMeY56DdJWlEMo 6Ykr2b6QgWBgwhj2gi+fmz+mR1hC5rbmeeEF5nxdjJ72eiLtITraskG5TTLyD+EOgHZG RicR8o6AY1nL9abTP2kDX8b3ZUaf7+Ad4zEI3Pv9Z9XGErADj/gxPo88rvI/9fSak64d VPAQ/9GETTt6G2JGSfrBSkqKZm0SvNvc46PAQ6iGaF0O87LcBEGlEtj3SyM1lib7wkX5 pxng== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1773382399; x=1773987199; 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=QknoZXBKlPCGwx1irT4+gYrnFv4rWV1IvMUMC4bd+4I=; b=VolraLqm/6bTImayK+BLusBXadKeViB6cFINWllwE6cdi5ctTv0XlK+13MfV9gmtB7 bvDBzLJ0xNDvtejH3PtffZ66zTbLSYf7N62o200BViGmIlpMw+jVmp7G9uKqz28Rm507 FBpSf/AnHETldDvIEgGHAO2ZdObxU78uB1QlFb27XCIakHx5oTfIp//P0V1ovZF2QyN7 Auam96M943J1nskmSowYvKNcSDOlirqrpoNxINg5GgWpFnUaQXg3iBkpCD9pszUvI8tt GFLBbYqCmJjOTYj0FMhrZ5UQPapMTMpnWqYpbKUmIO/9hqj04x2l9JJLKRGpOyeeEcQf 7npA== X-Forwarded-Encrypted: i=1; AJvYcCU6BO1UD7Lvpw1Pdx2BJ0C3BpeQCTtqJha2KdcIDjSlIgt7wlKusTFnLip6ePUMLgaHWIDBT/ZOn2La3V0=@vger.kernel.org X-Gm-Message-State: AOJu0YxX3iIBkpcuA9/iYEvG5bH133uwBzE7uKP+txJDwIykusRhX+j7 7c9DcRF2WcsR+ndnLTw/6pIBryatO9enrZYIDvya6uLh5GhceCQ3mkSY6xVfE4F3UAOHhOWDeZ5 KSes3Ci6bWQjBNLb87r1oCpwtYw== X-Received: from pfld5.prod.google.com ([2002:a05:6a00:1985:b0:7e8:b7f1:f957]) (user=ackerleytng job=prod-delivery.src-stubby-dispatcher) by 2002:a05:6a00:23d2:b0:829:6f28:1d6 with SMTP id d2e1a72fcca58-82a196f5730mr1947629b3a.13.1773382398356; Thu, 12 Mar 2026 23:13:18 -0700 (PDT) Date: Fri, 13 Mar 2026 06:12:57 +0000 In-Reply-To: <20260313-gmem-inplace-conversion-v3-0-5fc12a70ec89@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20260313-gmem-inplace-conversion-v3-0-5fc12a70ec89@google.com> X-Developer-Key: i=ackerleytng@google.com; a=ed25519; pk=sAZDYXdm6Iz8FHitpHeFlCMXwabodTm7p8/3/8xUxuU= X-Developer-Signature: v=1; a=ed25519-sha256; t=1773382364; l=5329; i=ackerleytng@google.com; s=20260225; h=from:subject:message-id; bh=3sSrOJAlZS2IXh3VCeWaAhxTVEFs3kS8NsgUAhaH5Jc=; b=AN1YnbEfb1F2TkaQQpPX1DyWGYGoMBr3dXAuDgbZOWFOOvW8Ejji0gH/z7UKRx+wEouyz10+t GVh+DUFSNPcAaHLANfsWx2imPLwzue1iOqejIRs/eDerfBkVTX/eb7Y X-Mailer: b4 0.14.3 Message-ID: <20260313-gmem-inplace-conversion-v3-18-5fc12a70ec89@google.com> Subject: [PATCH RFC v3 18/43] 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 , 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, 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 | 89 ++++++++++++++++++++++= ++-- 1 file changed, 82 insertions(+), 7 deletions(-) diff --git a/tools/testing/selftests/kvm/include/kvm_util.h b/tools/testing= /selftests/kvm/include/kvm_util.h index fc55ad3c67485..1c0f41bf847d0 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,69 @@ 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) +{ + struct kvm_memory_attributes2 attr =3D { + .attributes =3D attributes, + .offset =3D offset, + .size =3D size, + .flags =3D 0, + }; + 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) +{ + return __gmem_set_memory_attributes(fd, offset, size, + KVM_MEMORY_ATTRIBUTE_PRIVATE, + error_offset); +} + +static inline int __gmem_set_shared(int fd, loff_t offset, uint64_t size, + loff_t *error_offset) +{ + return __gmem_set_memory_attributes(fd, offset, size, 0, error_offset); +} + +static inline void gmem_set_memory_attributes(int fd, loff_t offset, + uint64_t size, uint64_t attributes) +{ + struct kvm_memory_attributes2 attr =3D { + .attributes =3D attributes, + .offset =3D offset, + .size =3D size, + .flags =3D 0, + }; + + 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) +{ + gmem_set_memory_attributes(fd, offset, size, KVM_MEMORY_ATTRIBUTE_PRIVATE= ); +} + +static inline void gmem_set_shared(int fd, loff_t offset, uint64_t size) +{ + gmem_set_memory_attributes(fd, offset, size, 0); +} + void vm_guest_mem_fallocate(struct kvm_vm *vm, uint64_t gpa, uint64_t size, bool punch_hole); =20 --=20 2.53.0.851.ga537e3e6e9-goog From nobody Tue Apr 7 12:53:42 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 DAEFE34752A for ; Fri, 13 Mar 2026 06:13:20 +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=1773382402; cv=none; b=O5RMcLEaHiD6L/frDu5cNX7WkpPDZw60juXDJZto3VdwdRuq+RKmPYzU+ElIdlG0LGeRORX+QmoasEcBXDtppPnQ9jTe0WEFeGrRd3xu/9vCSnFWx8cywCUkJq9Ge/eNFeDR5VA4KOPykcR3xmDZ87jdgJXEzShAVuKz8AhBitg= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1773382402; c=relaxed/simple; bh=VCCSpA3AS6hHm+ENDcF9qJ8iBl7sQQf1o45kkgk5fZw=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=ALQwliKS5/WNR4WuG9FU7iW+fgWve2coNQBARjS/mLw15FF0tg/qQTm21FMeIY60FZtGV15RSN7hyGFXsHsLYoX19xftEF64b8UYMBOAh6sLmPQV9YdLBb8tGr8jZvkJmdFcXiHZkUFhKOqR3iQSQBlkeHEOMYQp5jGDE3Th3v0= 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=fYgG43c5; 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="fYgG43c5" Received: by mail-pj1-f74.google.com with SMTP id 98e67ed59e1d1-358e95e81aeso11356285a91.0 for ; Thu, 12 Mar 2026 23:13:20 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20251104; t=1773382400; x=1773987200; 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=qgXFoz9ekKe+3sYo8ozU6H5YkwmF/X37i5aAwoxFjgg=; b=fYgG43c5ESftIYTZqQiebsO7uErm4AZwi+ZduXB0aJEhAl9YjA3jBXJz9SsLX+oRyG rDl9cilE4qeRALLJoWkC7xg1juOs5jY3hMEC3xVP13VQZK4L+U5iElNNZjuqdnyu8s93 POXbGmFPVkDCv6QMDRJDfabVUn3RcDrXQmaYSv0TGrWg+0USPKlkMpNqd4chgjMA9uDb Cw/ch3awjvSbHldaqmLOpBWDZlnIIBsm+i2DJmQWrpYWrFqJPOIBscIADL5H9RMhiyep LcyW0wOkysbG+5bDv+lRZV6aHEVzzrC3MJT4uHldRRCSNuFYvE2BDqN26aAfLmd3x2aL NKZg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1773382400; x=1773987200; 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=qgXFoz9ekKe+3sYo8ozU6H5YkwmF/X37i5aAwoxFjgg=; b=gTmURcp6Nq/XDbqZ+IPji9g5UX1aHCdcjLFEhkk6PUwJflsHOlimDCfEqXvGkv8Fg5 xK9u3Eses/ABpd/Ayqw9rqe2yiOTvIyqMkiYnZ92vBfN5ghC9JgSb1VEFRPWuJ4LDZdf 7vYT6Psvbp4Mxtu1ZX914THXfUBSw+nER5uPuylZNvqw4jQKMlNtWAH1hQcvIBXLGqnt SFvkGYoiR7vtNfGzQij4DofdxTTDy30hGSw9G88U/hCCqa/vUfJUdPAZJFzdhfc0ZGo5 iFRVZBsDgrfEMvl5Vh/DmQUySN7Ohm7nLULYd6ISGFByQN1iy4X1l4qaxZAyU7phtjyl ZLUg== X-Forwarded-Encrypted: i=1; AJvYcCUIn+QNAxfwNyg5e9qdfLWRfC8pgXHGO/6yMVxeGzSxbAu2QPUXbcGKEJOuWHkapwEgSDebsEXbs6Iznow=@vger.kernel.org X-Gm-Message-State: AOJu0Yx7UAzqy1Wym4u9NI8fmItl+zhv9FVBNnItX1YTsPO3BbNLTyEm i/YYvklZxuPlrh/5at3Bq5hnvAqFEg115+c780F4In4xydWfAMtVyS4dz36lPF/pGibyy+1DhH1 zCsxDbME8WXy3q6FWexMEzXQ/Ow== X-Received: from pjst18.prod.google.com ([2002:a17:90b:192:b0:359:8c74:aec4]) (user=ackerleytng job=prod-delivery.src-stubby-dispatcher) by 2002:a17:90b:1d03:b0:359:8f13:667d with SMTP id 98e67ed59e1d1-35a22055567mr1949026a91.27.1773382400064; Thu, 12 Mar 2026 23:13:20 -0700 (PDT) Date: Fri, 13 Mar 2026 06:12:58 +0000 In-Reply-To: <20260313-gmem-inplace-conversion-v3-0-5fc12a70ec89@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20260313-gmem-inplace-conversion-v3-0-5fc12a70ec89@google.com> X-Developer-Key: i=ackerleytng@google.com; a=ed25519; pk=sAZDYXdm6Iz8FHitpHeFlCMXwabodTm7p8/3/8xUxuU= X-Developer-Signature: v=1; a=ed25519-sha256; t=1773382364; l=3774; i=ackerleytng@google.com; s=20260225; h=from:subject:message-id; bh=VCCSpA3AS6hHm+ENDcF9qJ8iBl7sQQf1o45kkgk5fZw=; b=iXgh6mA1Etl3js3hch/keoCikkJCcLY3s1QnWww0YCaa/ZORCpXXO+66olCvqtMLrfcOFvoR6 DMDJaFSivFLARj0oi3HU+1SYFbao41Lxm0jgSldlNi7OwRzR7QVwiTK X-Mailer: b4 0.14.3 Message-ID: <20260313-gmem-inplace-conversion-v3-19-5fc12a70ec89@google.com> Subject: [PATCH RFC v3 19/43] 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 , 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, 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.851.ga537e3e6e9-goog From nobody Tue Apr 7 12:53:42 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 89547377573 for ; Fri, 13 Mar 2026 06:13: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=1773382405; cv=none; b=gHxfBf/nlyuSwHsTZjwqpHF+M+SyJ8tqlXmP0MrlBdbxxdZGjb8/wvstKxzObAht+/PONUCmcfE58MwUwVg2tQe3YyHiwFArDpo7Bt+Q86JIJAjprPIXm7dDK/vw326lpgNx1aFacsmBwEqh1MpuTnu4NVn/IroEWRWWlOhpLtc= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1773382405; c=relaxed/simple; bh=sIEJVLeTqRqLSaN5tVABf/ZOlEW27jmDzCtSrYmFzkw=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=J5lkZ45YbkajNW5YksSTIn2aCvErAT9WGDbWhKX3x76GhJnX/3js2Bu8ws3o3Rp4IL/ASEyHayqr8FMerjFkLnojRw61SbJjbiYRekiE+hgL8ry2NpFt+mKHTaXUVs55tNVWEmLUmeKh62d9ClGk+v6uLcEjs/3ArdBU3F86MHU= 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=FU1XjHKg; 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="FU1XjHKg" Received: by mail-pf1-f202.google.com with SMTP id d2e1a72fcca58-829a9d3073bso746294b3a.2 for ; Thu, 12 Mar 2026 23:13:22 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20251104; t=1773382402; x=1773987202; 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=kWe/IBG9hG/OYU/GHGWRrrF1rsYV1Pob+CvrOk70TW4=; b=FU1XjHKg1F1GHXO4iJKKdNbnvphGOgJxcqJ4/+oGIHJjPDHXf6cM4d0eB0YpIe4S89 9Fyie2Fcy5xdrHbxyEzlYcGrF6NGbpdfWroXp348JnLPXKJJPX9CdRzhNxgv8y1higk8 iA+b3kpL/cZjnFIS+GW4TBwI9GQ71AYK4fAjvDWF2ngZo27PNv3cp4MSIL0JXuEzIDiJ fN96Qt9fUrEnjZBkJoM1HVp30WBs/OhHegBIjOqNLZOUQcjNkmVKZ6QQdI9gt3gjDBiF Z19VsMgfazP6HChy93NJumvy2Xis2SvzWop5JzLzii7NyOH72zXoh/TzLs7HqS9H5Wrl JVqA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1773382402; x=1773987202; 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=kWe/IBG9hG/OYU/GHGWRrrF1rsYV1Pob+CvrOk70TW4=; b=eTU3AShH3JaXBWfykSwQe8fkT7dZdpOWrQsR9sZ7CLe5rq+RhTMh5Zme2xkLdzqpw5 +z/HTZsDqhXzdK4PDOkgrg8IxxQsn8CmGBaxRJi4V9Xc/p287aSKInI4K1fKQp/USfmG UyHVueN9Um7skRzcMj5xAxwEtRw8HSxTC1v3AS5msJUvnM2cyl30QUyfx7OTeFT2Y/3m lGg26PfrWy1wM26EI9/KswPeWSgqqmrRwR34EjOMG4v4MirHdEvTywhCuyJbBLo0MEaQ 0cEHVoGgmpb0A2Vf0NMkgijNlS9+1meDoBKDa7Mfwqitoc1z+iZmnIV4qcKMK63U8BTS HoLQ== X-Forwarded-Encrypted: i=1; AJvYcCW8HcdXslvGtKJPdJ4EMZX4bSVEAO20Bzbxunw1xjQvA/8pYIHhvzw/Xs86YZL0NuZ/TX+bR5e72Xe7n1g=@vger.kernel.org X-Gm-Message-State: AOJu0YyIv0Zpz2Qn7GQnm877t+50C21ODIpvCn5AQjcRFTkocuFiWkuw a3gpjni4gLJ/OA5tY94ZN0mEWnkVfrt4uuoWBZmKoZll3E4667rNVyb2Xg/Xcax7DRsThJk0SEg 9DcKEFJNh3KzGYzT3Y3nw5/T8xg== X-Received: from pfbbj6.prod.google.com ([2002:a05:6a00:3186:b0:829:8b7d:2b76]) (user=ackerleytng job=prod-delivery.src-stubby-dispatcher) by 2002:a05:6a00:2196:b0:824:3670:66d1 with SMTP id d2e1a72fcca58-82a1970a5b8mr1787360b3a.27.1773382401656; Thu, 12 Mar 2026 23:13:21 -0700 (PDT) Date: Fri, 13 Mar 2026 06:12:59 +0000 In-Reply-To: <20260313-gmem-inplace-conversion-v3-0-5fc12a70ec89@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20260313-gmem-inplace-conversion-v3-0-5fc12a70ec89@google.com> X-Developer-Key: i=ackerleytng@google.com; a=ed25519; pk=sAZDYXdm6Iz8FHitpHeFlCMXwabodTm7p8/3/8xUxuU= X-Developer-Signature: v=1; a=ed25519-sha256; t=1773382364; l=7490; i=ackerleytng@google.com; s=20260225; h=from:subject:message-id; bh=sIEJVLeTqRqLSaN5tVABf/ZOlEW27jmDzCtSrYmFzkw=; b=wDTTpUMt3XCtHepxnWWLgvse6OXLV1A/swd3UF3kIFkys6PIhu+8JFh+elCJbb5qv812jH22B kHLPeMMm24KDLG7FyjPnL1kBhcONQA/vQfCzApYguQXu7DrFFZloqYs X-Mailer: b4 0.14.3 Message-ID: <20260313-gmem-inplace-conversion-v3-20-5fc12a70ec89@google.com> Subject: [PATCH RFC v3 20/43] 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 , 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, 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 | 199 +++++++++++++++++= ++++ 2 files changed, 200 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..48265215f218e --- /dev/null +++ b/tools/testing/selftests/kvm/guest_memfd_conversions_test.c @@ -0,0 +1,199 @@ +// 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; + struct kvm_vm *vm; + + vm =3D __vm_create_shape_with_one_vcpu(shape, &t->vcpu, nr_pages, guest_d= o_rmw); + + 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); + 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); + 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.851.ga537e3e6e9-goog From nobody Tue Apr 7 12:53:42 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 141F634F24B for ; Fri, 13 Mar 2026 06:13: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=1773382405; cv=none; b=X1H0jXpOJUvhR2hwoD0mPGXAq3OcyOYNDV44uVEIus4ZGDqX+Lk9GwvZFzpy4rJMpePE1xfA+znnNmINbu8NfrDipGxxvgLQP4eP25uEilvHpoiIhDtd9EGP/1571yX0BzOhWMFjWknhclZxNHuLBYxO0CkFwkieWEcytNaBVMw= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1773382405; c=relaxed/simple; bh=q/hUjyayyxIUGAve3+Vu0unD6ouS2wqBVjqcFYH1mcY=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=d6tLe8mZ45a8drDOi5Z81rqlF6EwmpAU76llYjzCvI/+PPETs+sjmucFGAAL/y/cH/O9qFN7RFiiuiUZQeRM6OcoZqh/vKLhKbwKzl7Aelo2PfMMtXtXeu6J/Q8ZJBHTfmuIWxS0oNOtXVgXMHuKGJBtMN08ZYfq+E3VMD9sMRs= 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=J0RmnLD/; 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="J0RmnLD/" Received: by mail-pg1-f202.google.com with SMTP id 41be03b00d2f7-b630753cc38so9526578a12.1 for ; Thu, 12 Mar 2026 23:13:24 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20251104; t=1773382403; x=1773987203; 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=wqFbSwro/vziukGQDmOP6ESDyzxqHCPDGmwxuCwTFaw=; b=J0RmnLD/3eTGT6w+x4G5sERgE9MO+AOwgomJZ+1nAzpGpn9ixkF0sSuZ3dJQp2zj0b DMnc+CLj7iN1b0xksFyqBAKOjIto/O5tn3u41EtfIY/SKOaudZqtAVG4RleMsy9wOJAg pPVQ43qXHLQryoCUEZTWtipgNssT9aN0GEF695hph5/0qBjGMfLKoI8RTwxnMGDlh9l0 AA8ZzZOCVqxAhEbzwCWU7nKmo6gscvktfTONbbuGzYhSYPG8DZ8lzIdnunMElAmudFyA hcBr2+JRqlvFnNLiw+dFPvmvB/jv52czrubN5VhhNJkajlsO1+Vr21JNGz1VZykGmHiK UW/w== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1773382403; x=1773987203; 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=wqFbSwro/vziukGQDmOP6ESDyzxqHCPDGmwxuCwTFaw=; b=VjxsswQCwkT9YujkGqt3c2pQ+uAVDfs5w2txBoEY8gXizX5jDBHjsQKWGjejit/gIW +/hIDtuG4gnaJH5gnACU2GNFeBDH+UE3woyffWvqQjYFZ0JJPltipPey5IZdOcSODNoO JSNfSHefq66Jjsa7PcisrkTZQI1tEQ8avM/XqgFigSpqHP8fstLGm6VvJOabY9d11ZK1 v4DKADuuoEC9Ibq1jRa7zSjCHcPC2VuWRPMVFUqW2OfmA0FHDVn+7mLlh1ba2wMiL18x WxulwJCUVepR1ZOBUUeioXMLGgHxQqi4B8sBJrahE/NHC1HZ9p+Rbt7nhCPWJ/XlAQZ5 gnMw== X-Forwarded-Encrypted: i=1; AJvYcCWg4wdaLNeowGTYvtObSn6R4zvcewHB/mHMCuB18StxHYhYcSbUXiakACC5DpE1DDdywcm132tT0FD1yH8=@vger.kernel.org X-Gm-Message-State: AOJu0YwhMHA7LRzru7hMslUdFMmbiodlHaUMmpJ48z6AmhPbrLWpTQh+ nOYcWEcH3IFNOwOzAMR+wlNZZv1jdp/1IcXZK8vyjxa+HXiSf0O25HQmTV7dzbqAgaerLJbp+MB x7vARQUp9DELTnrXM9irohaJmNw== X-Received: from pgaq65.prod.google.com ([2002:a63:4344:0:b0:c73:782a:efb7]) (user=ackerleytng job=prod-delivery.src-stubby-dispatcher) by 2002:a05:6a21:48f:b0:398:7eb4:8aa4 with SMTP id adf61e73a8af0-398ecb06ee9mr1431398637.31.1773382403294; Thu, 12 Mar 2026 23:13:23 -0700 (PDT) Date: Fri, 13 Mar 2026 06:13:00 +0000 In-Reply-To: <20260313-gmem-inplace-conversion-v3-0-5fc12a70ec89@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20260313-gmem-inplace-conversion-v3-0-5fc12a70ec89@google.com> X-Developer-Key: i=ackerleytng@google.com; a=ed25519; pk=sAZDYXdm6Iz8FHitpHeFlCMXwabodTm7p8/3/8xUxuU= X-Developer-Signature: v=1; a=ed25519-sha256; t=1773382364; l=1633; i=ackerleytng@google.com; s=20260225; h=from:subject:message-id; bh=q/hUjyayyxIUGAve3+Vu0unD6ouS2wqBVjqcFYH1mcY=; b=KFALu0XqU0kUJRGPpaQ6XHmJJBfjiFhtEtx+3eZJ7J8OPNlvzxV5bAOANVDRnUrzOqL1+MumN MZf3kMjOT6GBk4TMFhbOmbJtjrpSiF8aaYqitNajbyCMlhj0wXREzD3 X-Mailer: b4 0.14.3 Message-ID: <20260313-gmem-inplace-conversion-v3-21-5fc12a70ec89@google.com> Subject: [PATCH RFC v3 21/43] 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 , 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, 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 48265215f218e..438937980f040 100644 --- a/tools/testing/selftests/kvm/guest_memfd_conversions_test.c +++ b/tools/testing/selftests/kvm/guest_memfd_conversions_test.c @@ -95,6 +95,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; @@ -186,6 +192,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.851.ga537e3e6e9-goog From nobody Tue Apr 7 12:53:42 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 06142379EF2 for ; Fri, 13 Mar 2026 06:13:25 +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=1773382407; cv=none; b=K8ZQPHLo/tFGhygwoOjo4rprfZmgDVSW29vG6H5cmyLbcjxEC7Ds8Asdu58/rJoS+p2AwaBuWIppzCbaBIPtTFhTUFV7GFBYEtpQiBzwWV3u9+I2azwxST36TfleMyhMBP6wl8zueqy4sDdRei8FphgPl54Q1Ta/idfWmC1sxQs= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1773382407; c=relaxed/simple; bh=itkY9wgPiMgf9oi7V9RAZ6UqNoaBLUThcOQtF4d2iTA=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=uUoQT9yVhdC76pRUogzSU/Tne+18ybh5HnWtm7irXnQbCQdcXIDJ/TldbpLDGd+Jn3WBVRKZN0X5Cp/+NC4i0mq7M06OJLOhFBf0DU6BrMlK5/2fLF4/rKeJeTSQnti1taCOg1JxgsGFltpeTqn8dNvDVIjKeHD84OGe7ULKEmw= 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=gE4p9toq; 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="gE4p9toq" Received: by mail-pj1-f74.google.com with SMTP id 98e67ed59e1d1-359fdf17147so1122942a91.1 for ; Thu, 12 Mar 2026 23:13:25 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20251104; t=1773382405; x=1773987205; 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=6WRMPslSzXA9N46XX4OSjlA+u99x3cUsFKsLZGeZjw4=; b=gE4p9toqn3RNS8BKy3jlPzk97Li1nW87h/fuseZwANAw9Gd0Hz1WWyLAyt5dkCACcx y1mEgkaqYNLGr7TgB4ozXRm7eT4bTAuuyqLPTwgjr6ndTAO6brqtnhGmxUeIxX4sCQtr MWkzO3hgg8DAwAdWwrckkM4gnFo0RddyLeH1ORq064eUAh94cf6SPm0RwgJV6uRdIJ7T 5t9MGygaqwS5+x3pVlYHrOVPDVb/pIkq2tdV5suqnkHrZg7vvtLLQVsZlCu/5KCTlol0 yDN/qqsfLqY8/zCrcnr+e14RUTb9xfbbrRd5Vom8PEBi+GyvZAtUH5M3Gwra8ECixyra WB2g== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1773382405; x=1773987205; 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=6WRMPslSzXA9N46XX4OSjlA+u99x3cUsFKsLZGeZjw4=; b=nxAdV7Tq5mJmyk22W6AwrZaIMjHIwQXLbqGIeETlBQAMlheA9S/CIsQVLZ1xp3pOXx 135WCr7OubE08BwexexRai+HJH6tuU/xSXgf8CwxWdXhZTPJap9Rhlmm4FcAz2/fowWj fYsPBJKSfE+lpWg88tgmDrU564Hm2Bzt/DfR73shpnyzcF5LM6meb8TiGmqVJr2m1OrS ayTGC12/ujRwx9WH7gDAi8KoOBzDMv3Fg5vVwncdwgrYFppuP9UAk57PZwA5Qd7lXatb xwxvdVS/L2n7tc3E6UXQlxBjKRjAJ0Ku/UH088j5HyJ9gS0htIMz6c8ywDdYybxmCOym KGnQ== X-Forwarded-Encrypted: i=1; AJvYcCWFlsrl07RcTLcAdMTi0iAS5I4m3UxF+qeB7FPWskTEko7Tq40cbR8QL9IUZUC2fs1BfgiIeae2nGXJ32Y=@vger.kernel.org X-Gm-Message-State: AOJu0YzsD+SWtdprzNcdc3LSSUNeuRd1yaIV6am37DsUQNkcRuyDaI9a ntBKxKUGMJ6dD7BcKqOAoCW/2P59M/D2w+iwomBN2HBESQYgG3qrRBWezcIn7uLcEaOp7slH6nm 4FGF/251VepTjxcZMjcjdqHZwXg== X-Received: from pjbfy24.prod.google.com ([2002:a17:90b:218:b0:359:7aaf:b9c5]) (user=ackerleytng job=prod-delivery.src-stubby-dispatcher) by 2002:a17:90b:4ace:b0:34c:2db6:57a7 with SMTP id 98e67ed59e1d1-35a21ea872dmr1961832a91.8.1773382404906; Thu, 12 Mar 2026 23:13:24 -0700 (PDT) Date: Fri, 13 Mar 2026 06:13:01 +0000 In-Reply-To: <20260313-gmem-inplace-conversion-v3-0-5fc12a70ec89@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20260313-gmem-inplace-conversion-v3-0-5fc12a70ec89@google.com> X-Developer-Key: i=ackerleytng@google.com; a=ed25519; pk=sAZDYXdm6Iz8FHitpHeFlCMXwabodTm7p8/3/8xUxuU= X-Developer-Signature: v=1; a=ed25519-sha256; t=1773382364; l=3937; i=ackerleytng@google.com; s=20260225; h=from:subject:message-id; bh=itkY9wgPiMgf9oi7V9RAZ6UqNoaBLUThcOQtF4d2iTA=; b=a61kaj/rPon3ZHqkvB5ewKQB3WhoxC2KDqXTPh9Vz7jb6nUr43CAK79qoIkP89ijHOEjvgDaA jw+nqCnk8rCB7YD8RMwPsSJWfp68nTUEJXuCVlD1+jq9IrfsDyMZ9t8 X-Mailer: b4 0.14.3 Message-ID: <20260313-gmem-inplace-conversion-v3-22-5fc12a70ec89@google.com> Subject: [PATCH RFC v3 22/43] KVM: selftests: Test indexing 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 , 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, 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. 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 | 56 ++++++++++++++++++= ++++ 1 file changed, 56 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 438937980f040..8044581d5e5e6 100644 --- a/tools/testing/selftests/kvm/guest_memfd_conversions_test.c +++ b/tools/testing/selftests/kvm/guest_memfd_conversions_test.c @@ -63,6 +63,9 @@ 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); + + /* NULL this out to avoid second free on full teardown in multipage tests= . */ + t->vcpu->vm =3D NULL; } =20 FIXTURE_TEARDOWN(gmem_conversions) @@ -101,6 +104,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; @@ -199,6 +225,36 @@ 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; + + /* + * 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, i, i * 2); + + for (i =3D 0; i < nr_pages; ++i) { + if (i =3D=3D test_page) + test_convert_to_private(t, i, i * 2, i * 4); + else + test_shared(t, i, i * 2, i * 3, i * 4); + } + + for (i =3D 0; i < nr_pages; ++i) { + if (i =3D=3D test_page) + test_convert_to_shared(t, i, i * 4, i * 5, i * 6); + else + test_shared(t, i, i * 4, i * 5, i * 6); + } +} + 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.851.ga537e3e6e9-goog From nobody Tue Apr 7 12:53:42 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 67C21378811 for ; Fri, 13 Mar 2026 06:13:27 +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=1773382408; cv=none; b=hb8BERLJ3xdsZ/13J6X9R45lG3I4dpY2C8WObYo0qebBRpv9ibu39dXZUaEY+tkiINgHylza+QOQGsTVdl5tvN79hdj1yUOBbE25CZnHjO2sEg0HWwZKDuk3X/QfRvsLNhlYNWJLncaMvvJPpCi3HBAiTmsdO62QKrzuyzYZhTI= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1773382408; c=relaxed/simple; bh=efC+TzVwwA+lCFeRajm2dnq2MqPAbO6F5f4+fKbrYw4=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=pfTrmFTlKBSx+FtcyhBiU7zq+Z8DlCRQPyxggAFpjKSg84x4zkGCDm4lhHvvHOMkYws8wPMQ1rpYinVYL3EPNPNZxtzm3eXUsdWySwPBDL9WeosZGqFK+h3REK4sTtOf3h2oX5VGyk0AmPhXDdPkkZ3OdlJwGkZvtlhNHaD7mfs= 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=HN0YAtv9; 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="HN0YAtv9" Received: by mail-pg1-f201.google.com with SMTP id 41be03b00d2f7-b62da7602a0so1327483a12.2 for ; Thu, 12 Mar 2026 23:13:27 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20251104; t=1773382407; x=1773987207; 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=SKsDiBkOMuSiXMAD20hKx6nWgAocdhX8X7LRy61gCzM=; b=HN0YAtv9b/GcBALegpZP+cvZMrB9a8Ql4i9AZ7cPdzRvHSC/8Uh5Zi0iUIA2OBWggb j1cG+89Mc3Ccrhf1GOxAWK3nF46U/5XcIcgnaooCLRkOJ030XDOPMb8Pwmv6i9/ZrBNL ndEXC8uFasURBp90S1vd6F7PEPla0EkxjcaU9L0xtYHyLHaOC60Lcy3Ba+/EhpjO2QsJ CBo4BMOX+VM4EvwdxzYOw2H+/y66PeLT/deCVbr1plyE4Pn+2/iqs6uhAa7Orz59KChs kf42r/VSx0LBHjJi+5ItkuHqMyk4jpdp8z+/vpHlOLMkdrtvuD7Z28k9jGl2aTeWjxyo ZBdQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1773382407; x=1773987207; 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=SKsDiBkOMuSiXMAD20hKx6nWgAocdhX8X7LRy61gCzM=; b=ESF+gldJTSZkBNwrbQ5cHh4GEWkgzQhM3YgPUE5eYDVGpMLEiwaD2wK1CGCSkL0k9D U+tfvvHlcI80oEGjBEA6T8NJDJ8/M/cceawC/+uUXP0FGdAjNX8v321O/6DlgpRJfGhX qBoP5K9MsV5F/NMVj2T3lkxO3jlCQhs2i2/80jkT3mr/mkHzhsJQ5FZTfuTOZrF6vkDS Vh+ivRFybuRGpuWh9/0hGaqXQ3g+Ko2qO2MlQAxNQ+ovG1rcg9grFAxJed0C/ePN3f+5 skQmMQ8MAyUlyfGF/wC+vZbu5VdYkNFK5ouWLB5Qq9/5iBbVqfSFFr/RDx90Hb7mJQHj uQug== X-Forwarded-Encrypted: i=1; AJvYcCUzwKxHogrqRdEQEJbTdIlO5+ZFsvjyFSSS2wTFPtRX9Hpo7N+kbfA434uQocvrUbVkX3Ip2Fv7ayuBLdk=@vger.kernel.org X-Gm-Message-State: AOJu0YwfEMGRYCJ5iMlQEXvhLJULQe13b38dLt1kyI2pjFj+Xl7LEwgt dXRttX0ttFxsMAQhhVJvQSpIR/8h01ACbz6rO4XMdwieY0QwTChLT6pb7KVoiuQfWOzaOPBRZWR z5A0EWsBjK1MLbxMAUtrJkxIemg== X-Received: from pgbcr10.prod.google.com ([2002:a05:6a02:410a:b0:c73:959f:8cb0]) (user=ackerleytng job=prod-delivery.src-stubby-dispatcher) by 2002:a05:6a20:144d:b0:398:9ef1:f8f with SMTP id adf61e73a8af0-398ecb1744amr1704318637.27.1773382406593; Thu, 12 Mar 2026 23:13:26 -0700 (PDT) Date: Fri, 13 Mar 2026 06:13:02 +0000 In-Reply-To: <20260313-gmem-inplace-conversion-v3-0-5fc12a70ec89@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20260313-gmem-inplace-conversion-v3-0-5fc12a70ec89@google.com> X-Developer-Key: i=ackerleytng@google.com; a=ed25519; pk=sAZDYXdm6Iz8FHitpHeFlCMXwabodTm7p8/3/8xUxuU= X-Developer-Signature: v=1; a=ed25519-sha256; t=1773382364; l=1693; i=ackerleytng@google.com; s=20260225; h=from:subject:message-id; bh=efC+TzVwwA+lCFeRajm2dnq2MqPAbO6F5f4+fKbrYw4=; b=dXLbU8TDG6aMEm1oHbIyweTeDvQxQuyJ0+hdf+31mE9HrelOO4tSatiFFzIn09YxmWZrCjBur ALwKc2H67ijDc6hNbI8tzXF4Vo/omiqpUdsqXy6yiqfUIbMskk/03MF X-Mailer: b4 0.14.3 Message-ID: <20260313-gmem-inplace-conversion-v3-23-5fc12a70ec89@google.com> Subject: [PATCH RFC v3 23/43] 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 , 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, 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_MEMORY_CONVERT_GUEST ioctl can be called on a memory region at any time. If the guest has 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 8044581d5e5e6..b48aa5d9f8cd4 100644 --- a/tools/testing/selftests/kvm/guest_memfd_conversions_test.c +++ b/tools/testing/selftests/kvm/guest_memfd_conversions_test.c @@ -255,6 +255,20 @@ GMEM_CONVERSION_MULTIPAGE_TEST_INIT_SHARED(indexing, 4) } } =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.851.ga537e3e6e9-goog From nobody Tue Apr 7 12:53:42 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 E3D3B37CD2A for ; Fri, 13 Mar 2026 06:13:28 +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=1773382410; cv=none; b=Y3SPdW4pqGxz7W+G43E7QPd0flVLszd30nr0Ue6qHl15fx/1E3+aRp6X6dQU5a2LwfIogf03gO6SRmDV0iH4cGfNS9gjIAClVnkPPxWv3r8A04pbQjLmyruG+2RE8USseCTpwq5nuQNWhLHfgt2Rc+OvW2lxo50Jt/OQStySJZc= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1773382410; c=relaxed/simple; bh=MEMjE4y0f6LhKehfiB3tEKsufTe0/3lqX56LNLOryw8=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=Z0QGBQ6oYSZxQaILcrBg+MiQ28N15I7rpAD/Lh7i2HcadMk7JhtlGH3P13ks1u4I3NQywfK8vJH3OSFfH2qR4TWYlxAzndAxSjP+P62Uw+ao9R0toJ4a6i5tnonnZ9T40l8QmxTJfH0igATNhZEnBmaGclNpXn+qcGH0B5Z2cAk= 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=PCvpItMr; 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="PCvpItMr" Received: by mail-pj1-f73.google.com with SMTP id 98e67ed59e1d1-359fe4e9ea7so1572460a91.0 for ; Thu, 12 Mar 2026 23:13:28 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20251104; t=1773382408; x=1773987208; 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=Oy9U1Yzq6xW4Th7f+ij9YnI65zWgo+o6WIuvEc9wDEI=; b=PCvpItMrjaeVJNGTuPpKNj5fOiZLmSkSLpRzFSncoeyM/6KZBHNcqQSWQm9UFyA6vG vn1koSVoD3UmqL9LfQ1FYvb8gRGvOTiyu+0wYKEkmK8YImOZ0xaWA2wcUmpKIJ6Egp+q kvnkFOP0wATHEQ0o9QCX7FHje+Nt6+aZC3LGos9qUXQ1fEQrkM8JOmEQ3QaTpyPZsnY8 LekJPDI6gHnsPoYV/Afxz/NbVV6fQGvv82s33Cqp7qcutiehXHGGtm0yglruW60NEjC4 l4G5Tww0J2LcZduRIo8QDDoJs+1xixaFX55v8Js4BTfh1lBLBWE8iBlTDJ+MrgkeuUlk o2cA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1773382408; x=1773987208; 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=Oy9U1Yzq6xW4Th7f+ij9YnI65zWgo+o6WIuvEc9wDEI=; b=rT22C5TcvRxdbl3r3IvDPkAWk2y0MMwcJhZg+LxXoc1TzHawrkTs60Bs9Ncl6A7JOE qxAevjqk2oAr8LcuFjWRxwtPwazc+wms9xfW7U3/SHzL8ePhbtXlExLGZ8Qq9okL9pJK mMi7COMbUoFSVAOMinxOr/OreauGEYv4iVj0UU/kKJPdvieNrlQf7+9kjITx9TyGV6oO KjZp6ZBJdD24yC5/q5L01zRchzXmWs/wcUjbAbYU6yZTUeaeDTezmQTrFSsP8SXm6zvr cvWIT/NeQB6WbI/NZdHbPz2KyGQzGV7l2j+sgXWxyXycykHvvdPt8+5Xiu1jShmysDbA O5QQ== X-Forwarded-Encrypted: i=1; AJvYcCXYQrj7X/hqentNtC8d/owOOlVXKMRCc8zh/gtrwxOT67DPaAiAfXXHI8B1Fip3Kp9/h0jOjNW/4mNfeXA=@vger.kernel.org X-Gm-Message-State: AOJu0Yz7Cnmr/zagBjRVD/483uJd2mmLV7xPGGWqR3Zr2Bko1YBd4dM/ 78yVdKzjB/ymA0jcEoL8GbuKnnhgJQunGqTd6GA6K1uvEW/MotKkXgSKmz3hCE5MKY8OgGxGmYP 8cts8sQR9wTZ27vjG7WQvEjdh2w== X-Received: from pjbfz16.prod.google.com ([2002:a17:90b:250:b0:35a:624:7b40]) (user=ackerleytng job=prod-delivery.src-stubby-dispatcher) by 2002:a17:90a:d2c8:b0:359:8d70:c4e2 with SMTP id 98e67ed59e1d1-35a21e9918dmr1865751a91.11.1773382408169; Thu, 12 Mar 2026 23:13:28 -0700 (PDT) Date: Fri, 13 Mar 2026 06:13:03 +0000 In-Reply-To: <20260313-gmem-inplace-conversion-v3-0-5fc12a70ec89@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20260313-gmem-inplace-conversion-v3-0-5fc12a70ec89@google.com> X-Developer-Key: i=ackerleytng@google.com; a=ed25519; pk=sAZDYXdm6Iz8FHitpHeFlCMXwabodTm7p8/3/8xUxuU= X-Developer-Signature: v=1; a=ed25519-sha256; t=1773382364; l=2213; i=ackerleytng@google.com; s=20260225; h=from:subject:message-id; bh=MEMjE4y0f6LhKehfiB3tEKsufTe0/3lqX56LNLOryw8=; b=oNq0kuW26yPSYn9oq/nhubUv5O2dPP0/W8tRj/6R2mWwZXnJf1A8F24iejaOWNgvwxoSBckOV iuOURBWHN2HA7FkQ/wo060NPdk3fi8GDpTOL3GcHBC/7nPnhCfrsT3v X-Mailer: b4 0.14.3 Message-ID: <20260313-gmem-inplace-conversion-v3-24-5fc12a70ec89@google.com> Subject: [PATCH RFC v3 24/43] 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 , 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, 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 | 30 ++++++++++++++++++= ++++ 1 file changed, 30 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 b48aa5d9f8cd4..9dc47316112fa 100644 --- a/tools/testing/selftests/kvm/guest_memfd_conversions_test.c +++ b/tools/testing/selftests/kvm/guest_memfd_conversions_test.c @@ -269,6 +269,36 @@ 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); + 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.851.ga537e3e6e9-goog From nobody Tue Apr 7 12:53:42 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 F1E2D37E2E5 for ; Fri, 13 Mar 2026 06:13:30 +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=1773382415; cv=none; b=DylUe/smIyD2c9+96ECKaZ7oQZCTbiA+DxUUP5QECfM/5YcIMCv4If+fSmRX37TiVJE4AtGHYyAIAaFi+a2c4hMDpYkO7ZSBN+LB+7yotTcFN1sHwMpjaT3tXN+QqzUC/IZmtC37nGjGcEcfpgQ6XImjKUyadaoB4C3eiIsDjKM= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1773382415; c=relaxed/simple; bh=6YBdYnXlnh2ASr+fdMWCeSskWVJ/R8KPH/FCsiDXM2A=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=nxH4KzweVuq3eL1KH7jV8NNDZqfbn8wziyo1MTCgHaZJ59HJEsXZ0uThmlYaJR8GfEKCvmSUvNX2bzcdJInSPNGCHhWxarb49A6FvWu3qPC9EWw6CCH82rNjEhV3A1OlHQ6c8K01EmgZoOzkvQPICClh/AhY47ZAcO147mkZgQ4= 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=DhQNIhGq; 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="DhQNIhGq" Received: by mail-pj1-f74.google.com with SMTP id 98e67ed59e1d1-35a0b51eb23so1237682a91.2 for ; Thu, 12 Mar 2026 23:13:30 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20251104; t=1773382410; x=1773987210; 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=SD49el3nXHpiu7TuqLWU43zl6qsgos40VISsm5tNJ20=; b=DhQNIhGqTEkcMv6e23g3ZIp2K+YHbqXzQh0L69fiN+jTZVYIYWO1YDOpIv3J24irGv Ie/p6UdESuoYo5yKQkR4P8Xn2ktk0rvIkX26fMD/Iyc7ZjYh8K/B1M8Pu+IIGCETVOcE l1sUArBrtjclWoaBXdCRvPLRlF0SBfn/B4KlYxRbbvtk0UE8Mnn1f1ZJYRo5X/bnWm/u zVavM8+Mgm1/rDHqD/lsDoOe+QHrKWPBJG/OtQLcu+j1tC2L7+kSBmERwOOm+rqHBM3T HErpcsQVLE+7gOi75P++zdf2NO/OpMe7tWPt2wPcjgnxC0aC+abUJQnBvB1p1kGbxHVn 2ewA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1773382410; x=1773987210; 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=SD49el3nXHpiu7TuqLWU43zl6qsgos40VISsm5tNJ20=; b=oDyXm8Yqi6BI1Dl8GRlrXZXVii7pxooSh3PGm+Z0CBNBFg7yDrbUTVYd7sGTFC6ThN 2uY/qvfi/JYQfaBOQ7DbkKL60Ga2FZ1S4/1AFM2BtbNKyi+sg7iY40VgJLE+Kl4Wb4G/ B8LHSFWdPHAyKj3iGDA+OJE+eE//B7Yzcdoj9VYt1gchVzyWtk0qatswSDurmYzBAfeL UQR4tpAxY5xFCVF2pUWC4ukU+ycNwXNWqnGRqNr/CNxfnUaDLE8KOnmBIiO9/snjNqzQ +RXWNzEgXL3ltr2Zyx+eFWW+jV/7/KdoUrmrKSV/iis4sgQQ+/lrfzC6z/5Cyh5v8DS9 EcSg== X-Forwarded-Encrypted: i=1; AJvYcCXDl1C0VifXGnrLcrSMqZCXumOW8ScZaPBac1bs6NfXadsSN/ymZW1UavHXJBsAEk/VTf7xNjoV53WUV5A=@vger.kernel.org X-Gm-Message-State: AOJu0YxYA5xUzoCU+BY+yXI25TAWDnOKXjbO6NSQwHH0KxZwfsZOIM7l t+d1P7G/MqaXK+gUCrAd5MK6RklGImXAejGmCZWcjb/nyciWGAEV6SrR+jGTXON40A5QxOD8N0C /EwH46kY8Rl8ndS0gJP9fooKbMQ== X-Received: from pjboh7.prod.google.com ([2002:a17:90b:3a47:b0:35a:1f1c:b57]) (user=ackerleytng job=prod-delivery.src-stubby-dispatcher) by 2002:a17:90b:4c4d:b0:359:f4de:8084 with SMTP id 98e67ed59e1d1-35a22055496mr1715311a91.23.1773382409773; Thu, 12 Mar 2026 23:13:29 -0700 (PDT) Date: Fri, 13 Mar 2026 06:13:04 +0000 In-Reply-To: <20260313-gmem-inplace-conversion-v3-0-5fc12a70ec89@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20260313-gmem-inplace-conversion-v3-0-5fc12a70ec89@google.com> X-Developer-Key: i=ackerleytng@google.com; a=ed25519; pk=sAZDYXdm6Iz8FHitpHeFlCMXwabodTm7p8/3/8xUxuU= X-Developer-Signature: v=1; a=ed25519-sha256; t=1773382364; l=2091; i=ackerleytng@google.com; s=20260225; h=from:subject:message-id; bh=6YBdYnXlnh2ASr+fdMWCeSskWVJ/R8KPH/FCsiDXM2A=; b=PNTHQTPEfvhJt4KUJLTiC0sl1nGoyiRCq6pFiPQ3jfgkc13AGfEITB7bzmxWmbXGiusnqhK6F AmOrgyjI5khA8B6UdYdsA47sTUdRja2AJF9DD2ZITHM2l2nUZTSuFdF X-Mailer: b4 0.14.3 Message-ID: <20260313-gmem-inplace-conversion-v3-25-5fc12a70ec89@google.com> Subject: [PATCH RFC v3 25/43] KVM: selftests: Test precision of conversion 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 , 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, Ackerley Tng Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Enhance the guest_memfd indexing selftest to also verify the precision of memory conversions between private and shared. The existing test converted a single page within a multi-page mapping but did not explicitly check the state of the surrounding pages after the conversion loop. Add checks to confirm that converting a single page from shared to private only affects the target page. Iterate through all other pages in the guest_memfd region to ensure they remain in their original shared state, thus verifying that the conversion operation is precise and does not have unintended side effects. Signed-off-by: Ackerley Tng --- tools/testing/selftests/kvm/guest_memfd_conversions_test.c | 13 ++++++++++= +-- 1 file changed, 11 insertions(+), 2 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 9dc47316112fa..b109f078bc6bd 100644 --- a/tools/testing/selftests/kvm/guest_memfd_conversions_test.c +++ b/tools/testing/selftests/kvm/guest_memfd_conversions_test.c @@ -227,7 +227,8 @@ GMEM_CONVERSION_TEST_INIT_SHARED(init_shared) =20 /* * Test indexing of pages within guest_memfd, using test data that is a mu= ltiple - * of page index. + * of page index. Also test the precision of conversion, that it does not + * affect surrounding pages. */ GMEM_CONVERSION_MULTIPAGE_TEST_INIT_SHARED(indexing, 4) { @@ -247,12 +248,20 @@ GMEM_CONVERSION_MULTIPAGE_TEST_INIT_SHARED(indexing, = 4) test_shared(t, i, i * 2, i * 3, i * 4); } =20 + /* Confirm that only one page was converted */ for (i =3D 0; i < nr_pages; ++i) { if (i =3D=3D test_page) - test_convert_to_shared(t, i, i * 4, i * 5, i * 6); + test_private(t, i, i * 4, i * 6); else test_shared(t, i, i * 4, i * 5, i * 6); } + + for (i =3D 0; i < nr_pages; ++i) { + if (i =3D=3D test_page) + test_convert_to_shared(t, i, i * 6, i * 7, i * 8); + else + test_shared(t, i, i * 6, i * 7, i * 8); + } } =20 /* --=20 2.53.0.851.ga537e3e6e9-goog From nobody Tue Apr 7 12:53:42 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 79B7037E306 for ; Fri, 13 Mar 2026 06:13: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=1773382416; cv=none; b=ufH+AEu7qSUfhZsw6Q5E9+WzEFSQFshBhISPlu3MrIrYfBeheJYE+MwjxOy0w94PGTVhfWxm5aawEZL0yEDmMp92Uz4MEGxDuCoX5E4TqaXQSctkLM8b0CEc4SfqmG7hL7E+h9hZWvZKdPVAEnL039x3LXoS4QZRCVg1XsjyJoY= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1773382416; c=relaxed/simple; bh=56/zjr6xU9a2m6PNWz2cIUvRanV0VxsnnbXP2H5M1fU=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=pMZTOCbH+9pVwMVcqwvacLvl+pfmJEJ5Eqeut1tczyUpisEyq4+oRD0bLe8ApC5u52aMGvIs9odnnHKtcj3P7VyFoVZXj95kh4Fg/Yu7gakT+tu9HwCZCJfAPXl++pRU4lmVJBv7UTx3PmFqGYCPIg9SmbMTlxJ1IQvr2KzzxqM= 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=UNRuDLcw; 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="UNRuDLcw" Received: by mail-pj1-f74.google.com with SMTP id 98e67ed59e1d1-3594620fe97so12547443a91.1 for ; Thu, 12 Mar 2026 23:13:32 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20251104; t=1773382412; x=1773987212; 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=sSBIDB/ezQI0Wvtx4iOhvmaJE6wuN3Y0svhFaOA6jy4=; b=UNRuDLcwnKqG6BZ8TeS/u5mkDvOkKXUuLKgv6PJzlZSAAhK73EnVP6tBhR53saeqXu SFL5fw0fFS2MQ42XVTqlaUThjVMAWZgIF7jZQ480YN+Tqu00kztDBaFrmw11pnT5ayle lq6wPMMrrUX5EY8XpWYqMU8/bVVvnO23MKaiSO2U7j96hLT6MxTBc4qDHpx1H+Sk6zrQ 6hYOCQ717YR60vtgEaR9yUa8Ph5xGbs8p8rT3xVChupqDO9hYN++yFSipQb5TpqkMuI2 5yTcQefm6tNPUcZTIRSYxzo73HLLFM9M8cKs0+xMg/YaNiz7+4Do/z1uX62Ss7WBw8bh j2Nw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1773382412; x=1773987212; 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=sSBIDB/ezQI0Wvtx4iOhvmaJE6wuN3Y0svhFaOA6jy4=; b=kzYX+rSg3xsBr6m0Stc1Tf0rSmlxVh1R2pZ5yMxyndOdO4W8C2c6mh9PXMdgY6qiJX JUGqp8nZIBYxtJJCq3XsSbk/9clCF0MAay6HTtDPQh8t6M/7kDdpl0zvP5ZuOThjr3Rg oeTuP8yBJo3duijVnIxuznG5kDMafdHoA62mBHPiY6bjdW4QLX4FL9qAgSYXEbI+Ay3F DNiIINSZhu2oYp7FBt4GNSLUtUKc6zzZOBRLtErei2jIf198Ni3ghgoePtd7WtABtGCJ PtR3CuR/nCUH+aYpnJqAlQ2akwAu99KC1ptgeyiy6zNBC8rZJEpZHteWFwGToI4BoWIK TTaQ== X-Forwarded-Encrypted: i=1; AJvYcCXBDzUblGYscxxFJSfRLi4VNgQgncE+f5m++8OdlsNltKggGfxYvHfyWKKfoYcJr5Lv7vCn7G0HABT2v74=@vger.kernel.org X-Gm-Message-State: AOJu0YxSpf4fo4fg8Ro3y1yXs+7UqpH/CIyAPHukLqDzAn9kw2H0RBcJ XpKJGGCV+Z7KC+lS+6RMXyor4zRWa56THmHteD7lSUaX/cKpxY6/OmbZbHZg24Jfdz2ZaXAm5NU ezxYpvBPZaIaq/Ji3dkhCZbbIbg== X-Received: from pjbli13.prod.google.com ([2002:a17:90b:48cd:b0:356:20f7:5344]) (user=ackerleytng job=prod-delivery.src-stubby-dispatcher) by 2002:a17:90b:4c8f:b0:353:e91:9b38 with SMTP id 98e67ed59e1d1-35a220b9fdcmr1978831a91.34.1773382411375; Thu, 12 Mar 2026 23:13:31 -0700 (PDT) Date: Fri, 13 Mar 2026 06:13:05 +0000 In-Reply-To: <20260313-gmem-inplace-conversion-v3-0-5fc12a70ec89@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20260313-gmem-inplace-conversion-v3-0-5fc12a70ec89@google.com> X-Developer-Key: i=ackerleytng@google.com; a=ed25519; pk=sAZDYXdm6Iz8FHitpHeFlCMXwabodTm7p8/3/8xUxuU= X-Developer-Signature: v=1; a=ed25519-sha256; t=1773382364; l=1962; i=ackerleytng@google.com; s=20260225; h=from:subject:message-id; bh=56/zjr6xU9a2m6PNWz2cIUvRanV0VxsnnbXP2H5M1fU=; b=h9jqU7xHor+02bUk347m4gpVjd5rVb7Yxm/mn+WFbkm85uDs4u9mnaWihlocy3zeYfVDrJkFW tW/T0KZJLkBD/zA4yrx71TTuDTl1JU5erPasZYBKgBt5Ic8lMs7D8GP X-Mailer: b4 0.14.3 Message-ID: <20260313-gmem-inplace-conversion-v3-26-5fc12a70ec89@google.com> Subject: [PATCH RFC v3 26/43] 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 , 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, 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 b109f078bc6bd..89881a71902e6 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" @@ -308,6 +309,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.851.ga537e3e6e9-goog From nobody Tue Apr 7 12:53:42 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 C5B1F37CD55 for ; Fri, 13 Mar 2026 06:13:33 +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=1773382418; cv=none; b=OHCdEm+fHodBKrsfftF/Jq4FD4CTIumrf5cJ1JkhZuxZ3Bu0k2HLfXYixO7gB/qrJw8l9TsRkKXWRIK74w6+R6Y2+V5wbEC3J9bnNAH7V8udrN9/cAlNBT2yLMxLjYd3ruAn5Xmm/8lNBidlbqabpRt66WdBhmpOlviqOKUYsgE= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1773382418; c=relaxed/simple; bh=AsQimpP6VPCpX/GeA3PXLmrBwdE8bqvci7sU/Y3ufXs=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=nGxyuAw3PoU7bkmslfXH0xCY7n/4AHLzflxbeJuNhKlzt+vuOctxQyqMmdaH42QhFffXPiVunYo/4hIDHNQlXwkFAm1tkDgSP+8cjZx6Jow/3KuoSL7W6WSbLvEYvz595sAzQwPKaPTKm4Eb5srsKS61/WGK9faHpAMEQgvZs30= 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=XRiWkCSV; 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="XRiWkCSV" Received: by mail-pj1-f73.google.com with SMTP id 98e67ed59e1d1-35a1a764225so1322888a91.1 for ; Thu, 12 Mar 2026 23:13:33 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20251104; t=1773382413; x=1773987213; 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=CYNGOoNNh7RW693z87teeFuj/YH+4YrK5JAx0qc/QTU=; b=XRiWkCSVLhdFTGBcZYNn1hBrtn1DzZoJTtIiFrcoI634tKr2aV3v8A4OVoQDD3emxa DVO6tQAcQLKCFK+utKfawyvYsc6tN4LeritZAudo5dkjmj9EmPQakvpOQPpYdKyMY0as WafnpAarM72O03lRdBRLkT1XlbQkqZUnb4nAsuYfc9PtmCXhAjpTHgj0b5omOtwPWCyq +osjql4VBcXQZQ0s1d+x/6hcGXqwubE1ZJAGSJXTSV34OFY0btK5gZmWs7aZzI87/WOQ RMMLkHkcbISiqxBPeeGDz1AhSfjD18+VOHKHLZJiUHC7n+dl7+9g8m4I+MhpZeMVbGMZ p1lg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1773382413; x=1773987213; 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=CYNGOoNNh7RW693z87teeFuj/YH+4YrK5JAx0qc/QTU=; b=h3WSrOaj9PaYW8T4DEsKcHARhOj29V2uMhBufneytZub/1MSYP09jS0+w2hN9MIxyc EdGOaEPTexOwtoA8p07M1uujluuxa1gdXmeRYw/hxJZM10DZaTGoXN6Wo13Ip0ZziYp2 6ODvZob4o08sLvfUxjo/QRpjTPTzQv2O0VqDNajhF1gsvwKzWuYyRU29TtPX7gsK2Vmo VYM2BnmEQy+r9NduNImmSZS6eGrKIDhu2hPYJFhgjMVhMCHQqDQLMnew3CdC9x0hMXew jcFxZeAY17AM2hbSrvloKLrcYJgI0IS465ZzCY+Sdjfr0vk6LNSzPBBQlQlf4QDbYIBX oesA== X-Forwarded-Encrypted: i=1; AJvYcCUnuT+zNNoDCsvj9t7/a3nJS0NqGAozd0v9qKTdGnfl4zxrg4Yd5mlYXImhtfmcrgML9s+dsH1GjtxjtP8=@vger.kernel.org X-Gm-Message-State: AOJu0YxqSts4fQPW2yFl3ZLrDsQzlhJSU7xI/iQH5C46kH1P55kCjgEX 0RCjjigwdkhD9Jvbvy2NXzn6EU063sgJGpLBm+r+c5FTZRPfrVSEXT2kHf5IFgsFUl1poU+4rjs IDIJ1f11POTgQvY/ucYQc1qFuvw== X-Received: from pjvf3.prod.google.com ([2002:a17:90a:da83:b0:359:86b9:176d]) (user=ackerleytng job=prod-delivery.src-stubby-dispatcher) by 2002:a17:90b:1fcc:b0:359:8dfc:d39a with SMTP id 98e67ed59e1d1-35a11940b38mr5012681a91.4.1773382412954; Thu, 12 Mar 2026 23:13:32 -0700 (PDT) Date: Fri, 13 Mar 2026 06:13:06 +0000 In-Reply-To: <20260313-gmem-inplace-conversion-v3-0-5fc12a70ec89@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20260313-gmem-inplace-conversion-v3-0-5fc12a70ec89@google.com> X-Developer-Key: i=ackerleytng@google.com; a=ed25519; pk=sAZDYXdm6Iz8FHitpHeFlCMXwabodTm7p8/3/8xUxuU= X-Developer-Signature: v=1; a=ed25519-sha256; t=1773382364; l=3457; i=ackerleytng@google.com; s=20260225; h=from:subject:message-id; bh=VmcKXTBk9OIQ151891CwT/J/1loQnzBkF6yygKgeTPk=; b=z3KgLYQjwUaYikW8XAOodIwQ93xrZsUpHVKoezptz6hG2AKa7cWLyyzelsKs++CcZexA/5KQ8 RM4G7PiCRZXBpyLNHyr7/eGs7fAM0F2Z7u3swsCGBSOSQZvOCOykYJ5 X-Mailer: b4 0.14.3 Message-ID: <20260313-gmem-inplace-conversion-v3-27-5fc12a70ec89@google.com> Subject: [PATCH RFC v3 27/43] 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 , 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, 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 89881a71902e6..c1a9cc7c9fae6 100644 --- a/tools/testing/selftests/kvm/guest_memfd_conversions_test.c +++ b/tools/testing/selftests/kvm/guest_memfd_conversions_test.c @@ -322,6 +322,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.851.ga537e3e6e9-goog From nobody Tue Apr 7 12:53:42 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 A98FC37EFF5 for ; Fri, 13 Mar 2026 06:13:35 +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=1773382419; cv=none; b=Mgk+OwHhUnehbS2a3lHeOeKfYX9Nw6qIXLUP8nGVZo8jfxYDU/HOVoCQ+bvoOhrmaaBxuDBK93ipMMoACrD8V8bSLGbnt/MByGOXqo18Fg0gLvvELZyyYVAz+RUsrmjOg0GDlCyRp3sp1aIQETSzWDDaCTXbs6tKHWICbo3fdxA= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1773382419; c=relaxed/simple; bh=xRKb3bVMcx/uVRBFcKELGtm1TsNEsqcmghIMICAO0wI=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=eE5JYuFrOBsekVpEjQ+UvtqqyNzsNiOXwi9hhnmGJAh+i8PSC9oBUjHIiGPdKIyFAZI7irGYJJ55eOE+slhtoxk587jKom3JhTI3cB/BKjNCiXonUqSuWDEikvXuFZbx83Zcl6Ju4v1KD7fqQ/6b14SvlOVC6RLvKHs2terT7oU= 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=qyHt+hsb; 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="qyHt+hsb" Received: by mail-pl1-f202.google.com with SMTP id d9443c01a7336-2ae59e057f1so24892495ad.1 for ; Thu, 12 Mar 2026 23:13:35 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20251104; t=1773382415; x=1773987215; 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=MtLKd6/akGAIni+0N8+cFKVyOqbU6nOkVaBf+x9Xbcg=; b=qyHt+hsbM3whvSZ0YKRIpGAY1vPC2QssEZuVuYsbYzZTi6ynLVyrx/S9RB9SefRlQY 7jA3sFN1JpDEpTufAC/sw4f3FrnfAsM9c2puKaHeeAqw8f39I96sK0SptIq5afKcj6Rl M+fU0f7QzmSspMUx6FUFz3gr0/sEUlJXmspk+4S6pgQCJqeYlIVAFG/BntMMWKP4iGkr XJCA8aOC2OvNkUjmqkf2rHr21tT/BJR3y+Dy0DoJCZXc8r9uI5vtPoWdUw4Ub+9mTdm8 YsW/jZHqujMRBX2Eb5Ejig68DrcjOcNx3RzKdi4r6q7HhlFd5cWiwMDGtXgKw89VoWzZ JM4w== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1773382415; x=1773987215; 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=MtLKd6/akGAIni+0N8+cFKVyOqbU6nOkVaBf+x9Xbcg=; b=psa/RQp9sVEEcItyuFKLkvdiJbEPGw/T2whhkU/12i14nXKO67jaCdC59Qab3JBh1c XOVs43r0lOL2mqkGH3y1xuqUMPM0wEQg3AQwEiSEhkfc18OUfM3kJr+XpCfqp6vnzClD 7NDypRAzwJJoRRI7U/iiRMgfQrEO0PZXCUKKx3pRsja9Mjetlskdq9/GitBanLVZgH8h VQNMOkmObBlbq74wJHxHhnYFabl0xZahbl6dO3gGayLWbEGwX/Ynz3rAVy3dnwTiZU0x bmg79R+G7PdnLCDGjNbifshYHKhvP7aSBKx0ZGeD8sKHZg0TNN7ctGi1Jv44oEm1AwcI pA3g== X-Forwarded-Encrypted: i=1; AJvYcCXSY1AkybrhmOTuYwVtVr5K9eBIpXbuJU0/xYDAn7DlAXpkE5krnR2k031XIhC+KZFx/Xp5CAT6sCvFLsY=@vger.kernel.org X-Gm-Message-State: AOJu0Yy087bR6+95d8QRMncemL0SBgoOw5Fh9RcbNpkFmfsJiFIFXXCi MvTbg4RNTOlk0JWNDT4HFbDeVycq59ykzO9gPRWGIXqp7lnyQizEIcCxtmhbhA2Ncck3mBufzzH Fv1kCxaqt2jt0XVwQxrNpZEzQjw== X-Received: from pjtz21.prod.google.com ([2002:a17:90a:cb15:b0:359:f37c:e0a5]) (user=ackerleytng job=prod-delivery.src-stubby-dispatcher) by 2002:a17:90b:540d:b0:359:2d1c:9206 with SMTP id 98e67ed59e1d1-35a220bacbdmr1758060a91.33.1773382414557; Thu, 12 Mar 2026 23:13:34 -0700 (PDT) Date: Fri, 13 Mar 2026 06:13:07 +0000 In-Reply-To: <20260313-gmem-inplace-conversion-v3-0-5fc12a70ec89@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20260313-gmem-inplace-conversion-v3-0-5fc12a70ec89@google.com> X-Developer-Key: i=ackerleytng@google.com; a=ed25519; pk=sAZDYXdm6Iz8FHitpHeFlCMXwabodTm7p8/3/8xUxuU= X-Developer-Signature: v=1; a=ed25519-sha256; t=1773382364; l=3729; i=ackerleytng@google.com; s=20260225; h=from:subject:message-id; bh=xRKb3bVMcx/uVRBFcKELGtm1TsNEsqcmghIMICAO0wI=; b=4UlIoexpGM586Ep9gpcgcpdjTd+BgERPWiazIPux/Pti//AcvAjinkDe07IGBccFkXXhQyT3l 2SDQznJ0i3JAz7Lsp03hMRKGOS/RwR/HlpbrT0AR6Z1kG7mJvjjbsx5 X-Mailer: b4 0.14.3 Message-ID: <20260313-gmem-inplace-conversion-v3-28-5fc12a70ec89@google.com> Subject: [PATCH RFC v3 28/43] 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 , 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, 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 | 78 ++++++++++++++++++= ++++ 1 file changed, 78 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 c1a9cc7c9fae6..8727474325451 100644 --- a/tools/testing/selftests/kvm/guest_memfd_conversions_test.c +++ b/tools/testing/selftests/kvm/guest_memfd_conversions_test.c @@ -396,6 +396,84 @@ 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); + } 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); + + 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.851.ga537e3e6e9-goog From nobody Tue Apr 7 12:53:42 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 5B6F137F727 for ; Fri, 13 Mar 2026 06:13:37 +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=1773382421; cv=none; b=RRGpMGwOTUhSFoNL9vcmv0EIHw/zXMgN6t4vis7PbS2MpwckLr6wJ0JHI/xf2z6AMJvjUIAroMLvsVY8ebPVXhnynsMsFUqa+CTfffKcnxUNGYuIhaoq8P0sgp74ztVRfiRFIgwJ86L0WI+KOvr1aLstpPKWNu32H2qgwAsZLPo= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1773382421; c=relaxed/simple; bh=8rmlUkLqBvtb8VE4ywj3txjREoaW/02KSXQr9g1SYJE=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=btE2dzaGWIoOdunGduTGvTw7WKyQKbM9DDRjksRRPjWBVaBy2GItUEdb38ky/+V+dQeJBvuhvcvhYVigOsR8HOw40DgBuraJeJOdDMmMr3QI3TcyVVzFSvzfKru4tJRKHMrL98HL5w31BNG13WDd/URg+HmrmEMW/tcNAyRLO8w= 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=KE5Al0WP; 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="KE5Al0WP" Received: by mail-pj1-f74.google.com with SMTP id 98e67ed59e1d1-35a1e725a8fso6009744a91.3 for ; Thu, 12 Mar 2026 23:13:37 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20251104; t=1773382416; x=1773987216; 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=P6lTN64xldfnaq1LQEg2mnalldlsdX5OYA6deCZIOs8=; b=KE5Al0WPJqS/e9TQX5UQf3lTm0FVUV/q6eEzLgD0jiNJHrHQLEv2Bv53GJFmwS1iUa ilN5jC6XqDmUBVLnVbJf98aUioGhmCU7psUDCe4I+9YCXbWo8NF+NbsgcP8G5wDhdvOE 5qCTn6jYU9M6mz2GfF+2M8mxdGfFzKtEYfoK9fG/11viUTofqByDm+WrvEohJZJMQk2i lDdDQtv0jy1UeZSI0A9MJXRyqE9ZzYS2Vio1ACHAdt/s6APGN33SxKe3PROBgun4t2x1 c31dOe3EpAc+EIkc5Oc9pD2kkrUu/lhpTn2YSF77EFVpun9HA5i9QKgtCdo09TOZIFfJ 0AIQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1773382416; x=1773987216; 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=P6lTN64xldfnaq1LQEg2mnalldlsdX5OYA6deCZIOs8=; b=sDxV9Q/uqG82yzFWSuN2x+bZWDhg3+GZzoWx1wgEQIwEPNsef2pl6xip2ALoRmABA8 feejZ35SaV2U7SUwgr/Y7hYSHugxaPwGKZYpP3IDfPdIAKIUgvDzIzVxId+h8rk4yyFc 6rnhp1D5aIVmdDWdKSCf/cGbqVzqkjSzyrTCVeuTLC4clPWtDW7j5+ekD/GK8CpNV7nl XVEy1NIK8P5NsACu9pasROWC/kj+qw+y4z8/IeRsS8UV98f7WNQ5rrfY7zXJTWWuVrDd ZR4O4KcPDSHtyp+e7bjC4Zv+fcPF39iE5UCgnphws30CLkEwbEEia/5DrVNxF+El+iuy ZPaQ== X-Forwarded-Encrypted: i=1; AJvYcCUItNRgQxTSZyv2MAtcwriBuGSUx9fOyq+AcfhvUzLRxvR/bQeq0phd6GD6DfHhOfBan9LtyjdtSzqbqdE=@vger.kernel.org X-Gm-Message-State: AOJu0YxCzH92GCutaE6AM8aJLtKnlW+PvAjWZWdvTwaP9TK1TkXWWdIB 0D2VITghSJ6Im5el5RvhV4WYcHAGDApw78M1GKGvmukrtK3W59qg2e9RSvgYpG512H5OCk937em w49t/t+wBNsP9vZ96a1iJ+fhF7A== X-Received: from pjbie24.prod.google.com ([2002:a17:90b:4018:b0:359:8bb2:c98d]) (user=ackerleytng job=prod-delivery.src-stubby-dispatcher) by 2002:a17:90b:3501:b0:359:fa1e:2bc3 with SMTP id 98e67ed59e1d1-35a21ea5dbfmr2042093a91.6.1773382416219; Thu, 12 Mar 2026 23:13:36 -0700 (PDT) Date: Fri, 13 Mar 2026 06:13:08 +0000 In-Reply-To: <20260313-gmem-inplace-conversion-v3-0-5fc12a70ec89@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20260313-gmem-inplace-conversion-v3-0-5fc12a70ec89@google.com> X-Developer-Key: i=ackerleytng@google.com; a=ed25519; pk=sAZDYXdm6Iz8FHitpHeFlCMXwabodTm7p8/3/8xUxuU= X-Developer-Signature: v=1; a=ed25519-sha256; t=1773382364; l=2496; i=ackerleytng@google.com; s=20260225; h=from:subject:message-id; bh=8rmlUkLqBvtb8VE4ywj3txjREoaW/02KSXQr9g1SYJE=; b=psSIWaz0KuTYFKMs6GurXm+OD/Yge/qNJfZCqk2NcpYOyItN2iaatxc5TI3jjqSWzjZSgXrRU VJ6ONZ7JBVlCrVlqUIszI5Iuk7bh4fnJnGmQiv+NDrlA6tPu9EyikvF X-Mailer: b4 0.14.3 Message-ID: <20260313-gmem-inplace-conversion-v3-29-5fc12a70ec89@google.com> Subject: [PATCH RFC v3 29/43] 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 , 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, 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.851.ga537e3e6e9-goog From nobody Tue Apr 7 12:53:42 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 F06B837F74B for ; Fri, 13 Mar 2026 06:13:38 +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=1773382423; cv=none; b=fLCgBGLonltgB5j5FvXlaWSf4FogSxZOdeXI7cywtmzopVTaQo6p/MhH10kEPHgTHKrX+njxTotyiH7DQK48L7uQzpg6QfKdgnT9Yv7MKS2f15/cjhWDFAz4dGkz5hJz67/rywbaYEJtR63BO/sSICV810Jm/iduEEcZj3w9oo0= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1773382423; c=relaxed/simple; bh=0AvRrh6vEolvov+ilblsavP802x/MyKKPaG/juCrxSw=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=eS4MiN25S32HtGvrMlgwnaVsk/PxhCE1VVh8NzWAGjctrYSiKA3oktlyYyIrCwNEzI1Ax1TiWUnBMQFBBVUlWNZGFJYAIyWUtqBgcXtnUzRS7gNaw2coSAWkDP3+pqEjh0zobuMlNLFhMeQw2KieGvy1Yz5yO+Wy4OLP+Ffo0+8= 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=DNPFQBSU; 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="DNPFQBSU" Received: by mail-pj1-f74.google.com with SMTP id 98e67ed59e1d1-35a21d5246fso695720a91.2 for ; Thu, 12 Mar 2026 23:13:38 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20251104; t=1773382418; x=1773987218; 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=u0n8Uv+LnWZDbbOj01OuzxvOS5iNrHuDnl1B5SLsuNA=; b=DNPFQBSUKua+clQmEpJTxqiinIRejFGXtl6V5yAp8IMzdWz2YlvQ6p5m702EMvJVrS wtDu6pSBuh/S1o5kReYX/zunY2KCr0jZ9u0HiyO27ICt3zBsCpT+73c92Euk45thmbp0 1EAjmpURY9SZubN/Z1LoBBFep3NJUqIqdTWbGZnCLw+zE/y3oU6yv1LaE1eOZXNz1i82 1rT6KFZSTP4uFV3NStr4f6PvqTHLYonoIy0SQymlDGt/VOHY2G/t26HQtthrOXfDhGj5 IeyK9u6ASGapABH0xNr4Buts11wfh4d50i0UIX11htfjegnqP7kJX1OPIZuKFxYdWidq R59g== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1773382418; x=1773987218; 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=u0n8Uv+LnWZDbbOj01OuzxvOS5iNrHuDnl1B5SLsuNA=; b=j6P25zfPjBJU5/L4Vw9gmbJNNLpq91cWjC79lslaMO9M6HCMwJkFAVpBT8+m45LPI4 Wqf5xD7ctv3Q+RvQ/55F5N1g4BiU4UVebqHnNRdubFcEpq2ElsGlZGOg6Aa2E1vIIVzy GYwbJ8c7JI1y9oY/3G6EeQF+xnnOz8hAIcsWHMrl150bPrHILZhBK60EqHlW8tZl5OZc KLZQjDDCgZbvPkDA7YGGT4sxyjslVgr9ULgorSvL2HlEu0CLtXTpDzTglzYA1PZXNFUP ymhpPnUhiVbTJ4pPBLopKUx28OrwJ/rlV7ynRND7duv+BMZ/oyoCO2kEP55q5IGJqfep OEyg== X-Forwarded-Encrypted: i=1; AJvYcCWITVV+nWHTQjPypvh/Y2WuCRJ1wej1bF9o7TekA9QuaJMVQxGPw2KjSa9djhAb6Qv8BQNiB6KD/JGw910=@vger.kernel.org X-Gm-Message-State: AOJu0Yx42fhijEPedYfroT6o+Tc9Mb5cjdhzUlXwpqKo8QNtd9775uxF TXA/0H7HyGS4RAqru3pKGOgZ0z7MtOyPHZPXQsZ6oWviox4mwmv/VrXqlFKF48Tj3IQaXcyWEd6 4dCZukH8MSvwTMNDirS3X+3kpWA== X-Received: from pjbie24.prod.google.com ([2002:a17:90b:4018:b0:359:8bb2:c98d]) (user=ackerleytng job=prod-delivery.src-stubby-dispatcher) by 2002:a17:90b:3c11:b0:359:f7d2:a1fe with SMTP id 98e67ed59e1d1-35a21f5decemr1878689a91.9.1773382417898; Thu, 12 Mar 2026 23:13:37 -0700 (PDT) Date: Fri, 13 Mar 2026 06:13:09 +0000 In-Reply-To: <20260313-gmem-inplace-conversion-v3-0-5fc12a70ec89@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20260313-gmem-inplace-conversion-v3-0-5fc12a70ec89@google.com> X-Developer-Key: i=ackerleytng@google.com; a=ed25519; pk=sAZDYXdm6Iz8FHitpHeFlCMXwabodTm7p8/3/8xUxuU= X-Developer-Signature: v=1; a=ed25519-sha256; t=1773382364; l=3935; i=ackerleytng@google.com; s=20260225; h=from:subject:message-id; bh=0AvRrh6vEolvov+ilblsavP802x/MyKKPaG/juCrxSw=; b=Oqn+kMoXiALCHT/I5zr1jx+6Bu2QtC9I0x7Z++M22HSCzj46+HAGaUfwfPI/FhcRcgAfSNWe7 2uRQSqdZQ+CD23+sfbfxrWQjqpgESh1jN4DKp9Zljz94lOs6+wmOSf6 X-Mailer: b4 0.14.3 Message-ID: <20260313-gmem-inplace-conversion-v3-30-5fc12a70ec89@google.com> Subject: [PATCH RFC v3 30/43] 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 , 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, 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 1c0f41bf847d0..f05f5ebf0c569 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; + fd =3D kvm_gpa_to_guest_memfd(vm, gpa, &fd_offset, &len); + len =3D min(end - gpa, len); =20 - 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); - - 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.851.ga537e3e6e9-goog From nobody Tue Apr 7 12:53:42 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 A8E1237EFFE for ; Fri, 13 Mar 2026 06:13:40 +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=1773382425; cv=none; b=PWJs4nLaN/cntS8+K131WFGC/uVNH1+TMvF+8DzwN4g6YPJCpL0d7PWTBzala5F/zfsMZGZKr+nZqskf72zqVwkZ/ozR1/iSIk0AeC7ThLDK3dF6gHCPEoCuAwJ9agHav9M6WhuR1VGtwOcXqF2FxxaQ179Nxa363ai4V1lP2Gs= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1773382425; c=relaxed/simple; bh=aSgpCJ/+CEz5WLnq+ZIsNaLgtlURyDcAX64hYkmBOv0=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=nSXUmsnxvi4dmJ1zmki9fcyo85Y9wxOv3zyx2xiqAMv/kXB8GgWiqFppSVwjOM05/WtozSUMAUbLKuLtfD978wI4XUj8DhJndw7FgjmFDWL01uut7WG0FuawyE4LYPJLvTRVI+JDof/E1coNz9Wk/SXWemxXSLSt0mTHcehny6s= 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=kqRUu7Fx; 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="kqRUu7Fx" Received: by mail-pl1-f201.google.com with SMTP id d9443c01a7336-2adc527eaf5so13880625ad.0 for ; Thu, 12 Mar 2026 23:13:40 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20251104; t=1773382420; x=1773987220; 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=9BzVYsA3kNACHoMy8wwuYISEzNkcuCvKxQpW69pzKj8=; b=kqRUu7FxhBohrsFdkDVnlyyGqYOg926If7Tl6G0csOaNToi6R+5xs1g+vdjBQJTnQR g3VSFLuBHI2n3BYOcAZuyZDHdcVWRnMYvN+cUUcWengTb0xQNMB7RPikJxWsfmlaLxNc 7ybBa7F2dL+bNKI/X7JpgPCYg/+4f0Cdx61PolpJQozOgjuE4auBasSKApx6oXpiPP3I n9PiblrQEI4L96kfPJU1xUtF8x2htBdB1WreVDz6iqZAqN20bnHIzAZMncH0Dc+8QI+6 FrDnd6PR/xQq2d6FBr88aEOHKmeVCSyQ8xbgystmf4kY3Wu0GiZOsSTuJjmN1coiti1S LF/A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1773382420; x=1773987220; 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=9BzVYsA3kNACHoMy8wwuYISEzNkcuCvKxQpW69pzKj8=; b=XOegzHq+kmnsXjqiw6vbAu0UiROHQaq47CxA60YqV9jN+6XNzYszlSW708i759tRu4 jCcBIe8fyXsAtSaLW53LACOcP70PtWUxiReNkdGwPWTyucM5klSV8Pk+JRUTbAWcLmlQ OETcyOMwFZ6OCG97jszaE6kJ3bSfgcUfxQc4vY5Mjc3Qdk4qzKG8IjhM4YZVd8rx9wXW duWWhU9MPXXUu4oLqCCGip2qiKXu05FHFXyfOGYF8mRteRCMBY/GEMfj42wTWEFm7JqZ Qx7+LWwLv19cXeH/HVdK+DJ/uNP11xzl2Jf7zFRCaweqFibXwjPlbjHtz2WiYsFg4TUl sD1w== X-Forwarded-Encrypted: i=1; AJvYcCU1z4eUc0sfxCY55vyNv+8eNyDxJHEzsZeH/BeJZGoPdWUiy05MVRlFNtdxWBgg209Rj1MpIXQRJKbvBDw=@vger.kernel.org X-Gm-Message-State: AOJu0Yw3npu3uHJWe0p9PFIJDX5PKh8Q6ZWBzaYXQniETQ/y2w1ZJ2bT QdHcs34gyM2yLFi/N9EQhm9OGSoVMWarKklKWXIaRuT0YYOYPwjOizZ354QpOxF5psNSP78jcVB yBJa3SN4c+mUpc3TNb6ZDeYFU1g== X-Received: from plbmm6.prod.google.com ([2002:a17:903:a06:b0:2ae:bcf8:c324]) (user=ackerleytng job=prod-delivery.src-stubby-dispatcher) by 2002:a17:903:234e:b0:2ae:56bd:5318 with SMTP id d9443c01a7336-2aecaa40072mr17899725ad.22.1773382419519; Thu, 12 Mar 2026 23:13:39 -0700 (PDT) Date: Fri, 13 Mar 2026 06:13:10 +0000 In-Reply-To: <20260313-gmem-inplace-conversion-v3-0-5fc12a70ec89@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20260313-gmem-inplace-conversion-v3-0-5fc12a70ec89@google.com> X-Developer-Key: i=ackerleytng@google.com; a=ed25519; pk=sAZDYXdm6Iz8FHitpHeFlCMXwabodTm7p8/3/8xUxuU= X-Developer-Signature: v=1; a=ed25519-sha256; t=1773382364; l=2718; i=ackerleytng@google.com; s=20260225; h=from:subject:message-id; bh=v6F0/65iA3JRUfC1QmgBIJnF3zWWs+e6BseTT95B4p4=; b=nDXRIWwyxZomGeHvQUbNSLIecKS8Wq8s9llOyXJlEhoEZMP6VGk4bIHOCwNtANyHljL1bm+gl fTm6mXcMhorCTRUTgCnXGkDb7ONsIJel+g5ciJ2+ew9GVxZir+k0FG5 X-Mailer: b4 0.14.3 Message-ID: <20260313-gmem-inplace-conversion-v3-31-5fc12a70ec89@google.com> Subject: [PATCH RFC v3 31/43] 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 , 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, 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. Signed-off-by: Sean Christopherson Co-developed-by: Ackerley Tng Signed-off-by: Ackerley Tng --- tools/testing/selftests/kvm/include/kvm_util.h | 44 +++++++++++++++++++---= ---- 1 file changed, 32 insertions(+), 12 deletions(-) diff --git a/tools/testing/selftests/kvm/include/kvm_util.h b/tools/testing= /selftests/kvm/include/kvm_util.h index f05f5ebf0c569..e4de0050d1ab3 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, @@ -531,6 +519,38 @@ static inline void gmem_set_shared(int fd, loff_t offs= et, uint64_t size) gmem_set_memory_attributes(fd, offset, size, 0); } =20 +static inline void vm_mem_set_memory_attributes(struct kvm_vm *vm, uint64_= t gpa, + uint64_t size, uint64_t attrs) +{ + 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); + } + } else { + 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) +{ + vm_mem_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_mem_set_memory_attributes(vm, gpa, size, 0); +} + void vm_guest_mem_fallocate(struct kvm_vm *vm, uint64_t gpa, uint64_t size, bool punch_hole); =20 --=20 2.53.0.851.ga537e3e6e9-goog From nobody Tue Apr 7 12:53:42 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 9C2F437FF71 for ; Fri, 13 Mar 2026 06:13:42 +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=1773382427; cv=none; b=LfDVEjZei2sw5oBtOSuwMcc8txlVvH5qKOfzPeaWM/5zSHW5wsj8+YDsxvAj+dZrMxJGrnGFnou9SjR1P0tBotadMiHANk8wrOAO3WAVVj23Zi2Xcr4NW8ZRJVwU1yiPHOw+YqYcmx3CH29iKXSXoqidElc4F3PtJc5QNDz5Slo= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1773382427; c=relaxed/simple; bh=pZ6v+xP1DHhPqvyCuFHofjd5+OY1APZufY1JisJXeEU=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=mf5KR5zKlBSe4iQqtDtS95i12Z8qMadPGtM3753x72YUS/mEYAq5eflaxC2CQyiFPaTRa40g5QOHQv8OxvwuYFvh7e/26YAUy9qyBoCd5VYe5gXznVZSi0sh4QeXBla/Rpv0xm1+DlglORfFNV3kmILrdySHG8Okb07GsfCuakg= 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=auw4P1hD; 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="auw4P1hD" Received: by mail-pj1-f73.google.com with SMTP id 98e67ed59e1d1-358f058973fso2004743a91.1 for ; Thu, 12 Mar 2026 23:13:42 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20251104; t=1773382422; x=1773987222; 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=q3pm+yxpNJ4bjwMx7Ok0ozOrfDqq2giI/WA9S2QCn4I=; b=auw4P1hDKl8KOLQtMC5H1RREuZaZxxCctqKSEciW5TtMRl9rsmcN24j17JTa+7+WzW cXdZ/dF+BMU7oEC3qZ7F25naWHLvzsMYK+LLMlb2BOaUOjJ7I/IiSIiOD5vsDvSrZ6An 6c0r7sRv/rFgGEFPr7xJORrVNYFTd1D5NKD+vYFc4LuWyZZ9Xuq8WpgeGfiA0JePR6nN /njT0mUWCMhs9aNFA1B4QBSesp6VZtCOCC7jE+kA9czLfJ7y2A6lXT4BT9IXbKDY+Tne vHRC8fX5Qvvfvil78pcfSEnfAlk8PzHnh0lu2SEFHsCqxgy1X5FsZpe3q8gSktGjCjs+ o0tg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1773382422; x=1773987222; 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=q3pm+yxpNJ4bjwMx7Ok0ozOrfDqq2giI/WA9S2QCn4I=; b=iwBto6DY4lfILIHWdHmexcM8mHEmS0j8uogZDoj31y0xVZT9cXCLDhKyDwW8pQtV2c 1R1Ii2neK7wKzOoxpKcGqMTe3LVwZzNRDx2C3JwNF/BWTVAftAAsUlxthitrukhz8EMF wHF4ZUWnTrRqt4c/Ko72Uu4P2HjA/dYvBNutkVq7rLe6rfwmGx/4KIqJdLKub7NZgL0e 3fBQiHqqjWVcGhYO8pczJRvRVfXZZnwdcnsnCM1DhXUOsAvTcuvOtExsDGO/wjAqULYz oRePZvuN6LOCQQZcQPPSJVxc2x8f8HGM82Tc2GFGFkUjDBfjHJlphxFXskDgxdHxDdqi btMw== X-Forwarded-Encrypted: i=1; AJvYcCW03lvio147JVP+eiO0k9YsnoWz/+WrBWYHIH85yzgH4VaNbaf0hZZJ9KkFtmXwyGz58qJC+26nPz/7Prw=@vger.kernel.org X-Gm-Message-State: AOJu0YyyDwl7QxojqVmdR4Tkmuju5daxgIjSGXAJwHMANhH9FcVinPQ7 P+XTFT8+igWFr5K9LzjvuJqPtAhLIRc5y0ewGGRNiUKfHgmDq1tvQbP/P0VQqtl5F/5tWWl9Jrw ELIf18w8zTTonFaRuDUl0ElvmKw== X-Received: from pgam23.prod.google.com ([2002:a05:6a02:2b57:b0:c1d:a753:c89c]) (user=ackerleytng job=prod-delivery.src-stubby-dispatcher) by 2002:a17:90b:1b0d:b0:359:8ef8:7a77 with SMTP id 98e67ed59e1d1-35a21e9856fmr1976153a91.9.1773382421157; Thu, 12 Mar 2026 23:13:41 -0700 (PDT) Date: Fri, 13 Mar 2026 06:13:11 +0000 In-Reply-To: <20260313-gmem-inplace-conversion-v3-0-5fc12a70ec89@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20260313-gmem-inplace-conversion-v3-0-5fc12a70ec89@google.com> X-Developer-Key: i=ackerleytng@google.com; a=ed25519; pk=sAZDYXdm6Iz8FHitpHeFlCMXwabodTm7p8/3/8xUxuU= X-Developer-Signature: v=1; a=ed25519-sha256; t=1773382364; l=1296; i=ackerleytng@google.com; s=20260225; h=from:subject:message-id; bh=2ixRhmKM6wBtzpBxyab3JJ4WtVOqoaynTYQ6b4ldkEw=; b=jT40ITR3BJfZenzh9aLy+3m9D07lyaX2Q0JABVIxCnVdwmo1loWSA2A8EGWXkC3EXk/xxd6Jc r6zcCInNS3jCw44Ylno1BpElXVZVhJBcj0DUXytmGS/K2n5bvB1aRce X-Mailer: b4 0.14.3 Message-ID: <20260313-gmem-inplace-conversion-v3-32-5fc12a70ec89@google.com> Subject: [PATCH RFC v3 32/43] 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 , 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, 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.851.ga537e3e6e9-goog From nobody Tue Apr 7 12:53:42 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 105873806CA for ; Fri, 13 Mar 2026 06:13:43 +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=1773382432; cv=none; b=I4eHDetI0XlfnDE9i1Fc06Hu85tZwIQGtEy7b5kEAROMuGKgdodVilaotjm76nSLesiOI7jmmXRhruQ2oQGEddX57VjyFJoungsd3n3cwz6bxlkwdCJj90bEo+8l29pI9wwVcWFlBXksJTMnriUnNR/AJRjRLVoeQj1up+qoepc= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1773382432; c=relaxed/simple; bh=eBC3jcG3ScbW3j4TjbtW1xeOPBdtG1NgqDFJ/RzbnOk=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=Fs1Aa6eojTOiObJWwz+JcBciCzDyhafnj7XXiXBbAleBG6W23nUxzDAggeH2umkjFTO2KHNvqVY+lfWvgvYU6RZodi7ru4DzvYUAOeSSik3ZKzewQoRYlYgZz1/ZPQPx9cAN7CF4+jsBfDrXNmQ54bvtkm6Zz319LTb+hwbAIdU= 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=RT/qPJ3W; 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="RT/qPJ3W" Received: by mail-pj1-f74.google.com with SMTP id 98e67ed59e1d1-35845fcf0f5so2150397a91.0 for ; Thu, 12 Mar 2026 23:13:43 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20251104; t=1773382423; x=1773987223; 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=fLaJoksD73aDG0T7R/zOcgKAGIjczNDrfVGYxHJRiJ4=; b=RT/qPJ3WUXjIpMvoYMYCfBnLEvizy4wWPmsilK2TUX/6+Skql5gfgYtKl6QO6NLfvR j413zI05X5Nt6WkrsE9xA5DbvDOh4tiHsP4rzenlE87HEdOmXJtBBbntdKePr4cqLqqu q37pKT/pXGeZ4o0Xk1SuBWrihPLCPnZWuV23SghGND2sSe+DqottM9sYkTTDIr2zkcr4 Hxjl3L0ZfdtGb4+JQedownnJVbFW+TzQMPp1V8lf2EYe/wDWdzd429S1GkzB8tsOGVGQ AX18VuRviNPUTeqJw+XAlNRSg9vSuAU3sy9xMAXnx87d+eyHhK1ePiszUiA+dhCxPGBJ Mfnw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1773382423; x=1773987223; 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=fLaJoksD73aDG0T7R/zOcgKAGIjczNDrfVGYxHJRiJ4=; b=TntSMKAnuAAr4A1udjGHfwwIHkKhK2nyb5CdYPsi70/HYLBw9VT0uEenw59sHJleyE 9KU7dTuaaEmC33g2iWauYnZ7pJUHUGj4F2c0dfNpsOuKktO6HwjOtbtFlHI09oO2xRGf i+18+1hGKi5h1gbMoVI0RUNcG1Kl8ubhd0RQwqag+LcCjhHOIS9toPwWjm0Uw9593pN1 C3+ZSTQx4gCZvFTYgQSsYCxNKorDX0xYIcXUXmfTApGj3U8yyBxynwDTsTD8crfA5iWi /SPkVgbiq2iYvmlZfGIDAEZem4fF0xS/G6BJwS2r1XZa+oOzrPUPobDZjdIiwIF8Nu2k 1zOg== X-Forwarded-Encrypted: i=1; AJvYcCUvd5+OyMhYakNhUu3z/E6SBH/7W7pjt2EvhejB0eZbLeTqZ1Kp8pBmkrIeZ4YYJv2YjPMNWVJDALUopcE=@vger.kernel.org X-Gm-Message-State: AOJu0Yy42ZaZm7gY7hdVaThAwZtItqFEUtdern01sjhQvK54pK3g2pYL AReWgga4bTKh8yelpFKd3xTgHMY0oWlhyzL4t3qnaQgr51t9Bk7dkekF/mqISi0X4dPRA/SXI0a tW9YgPKzBJiSX1ntYWRMHvoEq6w== X-Received: from pjbfz8.prod.google.com ([2002:a17:90b:248:b0:356:3104:ed7]) (user=ackerleytng job=prod-delivery.src-stubby-dispatcher) by 2002:a17:90b:4f42:b0:35a:26e:4522 with SMTP id 98e67ed59e1d1-35a11a6e854mr5613363a91.11.1773382422784; Thu, 12 Mar 2026 23:13:42 -0700 (PDT) Date: Fri, 13 Mar 2026 06:13:12 +0000 In-Reply-To: <20260313-gmem-inplace-conversion-v3-0-5fc12a70ec89@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20260313-gmem-inplace-conversion-v3-0-5fc12a70ec89@google.com> X-Developer-Key: i=ackerleytng@google.com; a=ed25519; pk=sAZDYXdm6Iz8FHitpHeFlCMXwabodTm7p8/3/8xUxuU= X-Developer-Signature: v=1; a=ed25519-sha256; t=1773382364; l=5246; i=ackerleytng@google.com; s=20260225; h=from:subject:message-id; bh=eBC3jcG3ScbW3j4TjbtW1xeOPBdtG1NgqDFJ/RzbnOk=; b=xc5ePCN6yiNnnFknPRBFvGETXFBQmdy6FOAWKHysQD4E3pAN0eOpXDpm8UAoiqGBvjRU2afAk 5MQZGwgRZcGB6WLb5SkHg2k++3ucYfdMymNP17vm85Tc0TAg7xd4UtS X-Mailer: b4 0.14.3 Message-ID: <20260313-gmem-inplace-conversion-v3-33-5fc12a70ec89@google.com> Subject: [PATCH RFC v3 33/43] 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 , 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, 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 | 30 +++++++++++++--------= ---- tools/testing/selftests/kvm/lib/kvm_util.c | 18 ++++++++++----- tools/testing/selftests/kvm/lib/test_util.c | 7 ------ 3 files changed, 29 insertions(+), 26 deletions(-) diff --git a/tools/testing/selftests/kvm/include/test_util.h b/tools/testin= g/selftests/kvm/include/test_util.h index 2871a42928471..63e57d189f5fd 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); +extern __thread sigjmp_buf expect_sigbus_jmpbuf; +extern __thread bool expecting_sigbus; +extern void catchall_signal_handler(int signum); =20 -#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); \ +#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..f4aa762f050aa 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 bool 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.851.ga537e3e6e9-goog From nobody Tue Apr 7 12:53:42 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 77E0A37C902 for ; Fri, 13 Mar 2026 06:13:45 +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=1773382432; cv=none; b=m26c0nzep9a86XGiRN30AZ7y9WCEXANddKyFS3mRGQSue6kWp+CktaBuQnKxmDsNVsqRqI7OxM9gNpmLh/pGIk4AKnu9m0UEyMVOJCZzpgd+Lk7rfusNHpLcuT4oo8LeH9DBoERJHWxhtQ4FuuyuR+FVCpfwkaDL13CA2sHMhP4= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1773382432; c=relaxed/simple; bh=7baj+z7g9OZlOTGExGlQINWyEefRps7Kn+Swb89S7aE=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=Lt+HNDVCXc12Vh8v7JvfD+YZlRzp8LkP6zxrGIlY7cBZ9cCQbZJu5f2QL5Y1RyoHd1xCBBS+pbWKIPWgn1gxT+ZY00c/pU01GOJPljenCw6V5ccdh+69j9PBPe6lbCJLiJaXrPnzTnqNbx5Z+3EGy4mo1VbjNT36yMyNMGUIyro= 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=Rhj5lbVc; 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="Rhj5lbVc" Received: by mail-pj1-f73.google.com with SMTP id 98e67ed59e1d1-358e425c261so2028652a91.3 for ; Thu, 12 Mar 2026 23:13:45 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20251104; t=1773382425; x=1773987225; 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=EBannU+WuhOvmz78TN99QSN8sfUoje21sNZst91foHc=; b=Rhj5lbVc1Lt9C1g3p+npgzQam1RLpvScCumbA2EaZw6Mtlo627Ywg7UV9J+TZKr7VN PvDM2luLmsM/1qN5h22zbc1Pl3lEzDCt6IunI5nSAwFNx0IEQYbp81sVgDQytfNTizMz j0TEaOuonwKzK0eDF9d5TpR8+jZjgFKjg8XppiPGmR3eehrDm9VpNuStZrcTO5HPTxhE IdHmNNE/mXSPg+nfEwm5p+lKqbvHbmvEQGHb7AdMF2/ErDElJIEq31XiAcH+QPwq+I/M CG3f1rvxbTTJ7PnKD3HCAH0yqL1OOJssS4l8f44dMTCW1hBEftzhPBGs771L/IfMGigG 4rnw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1773382425; x=1773987225; 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=EBannU+WuhOvmz78TN99QSN8sfUoje21sNZst91foHc=; b=JsPw15hhLRvlXDuq6WCWcYw3N1NsPrp8+zUnfhU3Cq2Umk1OPj7bswbApEHoCQIEAL WENfdSReJYq0eiBUYEAn4yseBJpdOLRF6Y20yKR/n3P/M6hOfH4E9D6Mphvsb3QU3LjJ g/Argi7QtLZReM9oJRaZBXmnyjUekSNXlrbkSvosJSXenBz+6Cs/07vDsboJTwitw133 v73gMOEekv9faLcLv+BpvRR1+P3fpGp6Kw7R7uiA6hcwIHTQUsdMh8vEjFdoKL0KjAQ6 EM3CaLd7Rn1uMMqQjoZjNhHLZzFd6wkSRJM1UzdJ3YaHMauiF8WUeOmfdToFM2bKwWsr 5amQ== X-Forwarded-Encrypted: i=1; AJvYcCWD38RH8Xtogv8aZzLNtC+nNm8BeFDAvkZDxIoLwXlFn3JqYjIPa77T7ChQroQz2mhHOQajgPBFYsDv/vU=@vger.kernel.org X-Gm-Message-State: AOJu0YxcBLeGN6eS1Tq3rmwITVf7Nb5q/jZ++3J2JTB4TrxDufOtinzr 3mrjt+b99PA0m43yrnji9p4wf9d9ahNTtUhuXLXvGc9vWATwh5HmJFtC+L/PjS5CV8p9eBbcDD7 eK0xzjVEkV4K4QrSGJ2ugpd+QRg== X-Received: from pjqo17.prod.google.com ([2002:a17:90a:ac11:b0:359:7b20:386f]) (user=ackerleytng job=prod-delivery.src-stubby-dispatcher) by 2002:a17:90b:1b10:b0:359:8e59:16e6 with SMTP id 98e67ed59e1d1-35a22081199mr1710882a91.32.1773382424391; Thu, 12 Mar 2026 23:13:44 -0700 (PDT) Date: Fri, 13 Mar 2026 06:13:13 +0000 In-Reply-To: <20260313-gmem-inplace-conversion-v3-0-5fc12a70ec89@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20260313-gmem-inplace-conversion-v3-0-5fc12a70ec89@google.com> X-Developer-Key: i=ackerleytng@google.com; a=ed25519; pk=sAZDYXdm6Iz8FHitpHeFlCMXwabodTm7p8/3/8xUxuU= X-Developer-Signature: v=1; a=ed25519-sha256; t=1773382364; l=5167; i=ackerleytng@google.com; s=20260225; h=from:subject:message-id; bh=7baj+z7g9OZlOTGExGlQINWyEefRps7Kn+Swb89S7aE=; b=kUhQoynFqKPsxAdmBjO/vTP0Gy6ZShpRNugkxoBtOFLE1mPImtF/bHOWuqO1aYQPPZODQc50C PvHBPWns7CyC8kOFG4C+hxn98epDAdLduKVxvmwDeFCoP3cZLygTbCL X-Mailer: b4 0.14.3 Message-ID: <20260313-gmem-inplace-conversion-v3-34-5fc12a70ec89@google.com> Subject: [PATCH RFC v3 34/43] 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 , 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, 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 | 39 ++++++++++++++++++= ---- 1 file changed, 32 insertions(+), 7 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..f85717662a73b 100644 --- a/tools/testing/selftests/kvm/x86/private_mem_conversions_test.c +++ b/tools/testing/selftests/kvm/x86/private_mem_conversions_test.c @@ -307,8 +307,8 @@ static void handle_exit_hypercall(struct kvm_vcpu *vcpu) 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); + vm_mem_set_memory_attributes(vm, gpa, size, + map_shared ? 0 : KVM_MEMORY_ATTRIBUTE_PRIVATE); run->hypercall.ret =3D 0; } =20 @@ -352,8 +352,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 +394,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 +410,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 +470,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.851.ga537e3e6e9-goog From nobody Tue Apr 7 12:53:42 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 34B3A37B41C for ; Fri, 13 Mar 2026 06:13:46 +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=1773382434; cv=none; b=fLC0uK54YJfCnhAyGtDKj5evjt63n3Qhv2GwqLqKZ3nsajkfDWTehDKmJX2j/SQhu42pwXG6p6za88GCso+ETLhxJSEysg0EyjXGNOInBN0Dr+XsDI6GcD4uRADKCG0tQ6j/7Vf2tfoYZrnJbeN/YM0Zd42scdr+6Cl1D9Jm3ig= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1773382434; c=relaxed/simple; bh=+5tIR4frwM4OWqSh/ZYr9ntMYrCrPfvZUQ7q+6ihHq0=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=CN9Mmn32Ev5/d6TN9jV8TXJjRI2kUxWd0Cd0TPc8yzZSz1Wl/MU2RE1eizXXL4dz9+DvjCMPs71QIbHZ2JUMRP5xLKEEyAMhoF9EAUMf6wLupY5J86ik9LKLaHUdFG4Lzg70Jf8d7ZEGlYtRayvH42nFXyFxi0F7aeKQ/cXbOo0= 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=mhNNSi7C; 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="mhNNSi7C" Received: by mail-pg1-f201.google.com with SMTP id 41be03b00d2f7-c73939e0314so936083a12.1 for ; Thu, 12 Mar 2026 23:13:46 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20251104; t=1773382426; x=1773987226; 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=cRZPV0Jn99UEoemERWZsoqEdi1cZNzUoBuSgEmpyk28=; b=mhNNSi7CBBIX/PQzcbWf+ZHobxPfksfV6TOAjfYd1TKQj8zg46zPzGrM9WHyFiq4F7 UHGOkII3cE9UbNBL3W+z2m8ZcVVevwbSmSzZiALtiAtXBNDM71K+WBC0vIVCOhWJsZSh VgKiU4dWVQXRkBSnhsaWoTcVkn2a+6M5tszjlfvhfILRRRKEWyjs+Spss/cLrWb9Q7mH 52s+UI5YvrpIn2VK63/b0O5zFJtVo6PQJp8ECDuLdLvDGJbmqjNiDGrUlStqr5HKU/Kz 8TwjcZ9E/mPK4J+E9CrnUbFobBrenxB799/hbMLB9zJ9xGaFbb7H7SC03DD5l490KgiG ycPg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1773382426; x=1773987226; 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=cRZPV0Jn99UEoemERWZsoqEdi1cZNzUoBuSgEmpyk28=; b=MagFfaX8EZnILPF3EU9pc4VCKG2uiBlz8uYCPqXvlwcMPcw58iPnOd+pSGfHueQJT2 ID86uFgeUKTwPtH7V4qhf1e6ZNPI+CEb/tkxyINxT2OWwxv0o4ovssw6oQozPIvBIiKW 0fGA52OhSl7J5UsUbo8TGenoL7DIykHiBS2CAWrTEGLfLJnQ70kGqMwAlHKxNIfbbacn dbvkUJgpKH4TKdeXbP6gfnisB//w8LmmwTwoB6PAdleELNeaELXv0xvyr54apxTEWf7K Yt9JuYvYdAQbY8oOxZOou8GsmZWMVVvr3Pcb98L85YJLfjiXgnJmiyegLzK3LjsKB7wZ 0cmQ== X-Forwarded-Encrypted: i=1; AJvYcCWnniFF5kjK82jpiD8PwCsIOhG6yhKAK6WNN8WJN27hSLNrVAURmesFLvqGZOWN0eDojKw7h9BQOgC5yqE=@vger.kernel.org X-Gm-Message-State: AOJu0YxN7iQY8ivs2iefs/Cf/m3TYyeN65AiXk77n04F7SBd6y/pDVsD CdRfa/spGWR1eFYZHxYCVTVSqmgDELW/9B8JlPttR5rMb0MqvheoAGf6VN28QCQr5hFsJjStSvu JTMOdvo6MLfLM/A8jeKxd+xinJg== X-Received: from pgbcv10.prod.google.com ([2002:a05:6a02:420a:b0:c70:ab5b:1db4]) (user=ackerleytng job=prod-delivery.src-stubby-dispatcher) by 2002:a05:6300:648f:b0:38e:95fb:3c8 with SMTP id adf61e73a8af0-398ecda3217mr1744809637.59.1773382426020; Thu, 12 Mar 2026 23:13:46 -0700 (PDT) Date: Fri, 13 Mar 2026 06:13:14 +0000 In-Reply-To: <20260313-gmem-inplace-conversion-v3-0-5fc12a70ec89@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20260313-gmem-inplace-conversion-v3-0-5fc12a70ec89@google.com> X-Developer-Key: i=ackerleytng@google.com; a=ed25519; pk=sAZDYXdm6Iz8FHitpHeFlCMXwabodTm7p8/3/8xUxuU= X-Developer-Signature: v=1; a=ed25519-sha256; t=1773382364; l=6877; i=ackerleytng@google.com; s=20260225; h=from:subject:message-id; bh=+5tIR4frwM4OWqSh/ZYr9ntMYrCrPfvZUQ7q+6ihHq0=; b=VhpH9dBnF58xKb2zfft8mJo46RKUyWcv5dkJyQNNyd+6RD0jDjoe5l1rGJ1S0jPY92ogAmy3m J12gExmzbI1BoGEfZ5qQc8Xww9b5V5I84lcrDJ2XdgpCRW8eyhYXL9E X-Mailer: b4 0.14.3 Message-ID: <20260313-gmem-inplace-conversion-v3-35-5fc12a70ec89@google.com> Subject: [PATCH RFC v3 35/43] 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 , 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, 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. Use python to be able to issue an ioctl to /dev/kvm. Update .gitignore to allowlist python scripts. Signed-off-by: Ackerley Tng --- tools/testing/selftests/kvm/.gitignore | 1 + .../kvm/x86/private_mem_conversions_test.py | 152 +++++++++++++++++= ++++ 2 files changed, 153 insertions(+) diff --git a/tools/testing/selftests/kvm/.gitignore b/tools/testing/selftes= ts/kvm/.gitignore index 1d41a046a7bfd..d7e9c1d97e376 100644 --- a/tools/testing/selftests/kvm/.gitignore +++ b/tools/testing/selftests/kvm/.gitignore @@ -4,6 +4,7 @@ !*.c !*.h !*.S +!*.py !*.sh !.gitignore !config diff --git a/tools/testing/selftests/kvm/x86/private_mem_conversions_test.p= y b/tools/testing/selftests/kvm/x86/private_mem_conversions_test.py new file mode 100755 index 0000000000000..17f46c21e85e5 --- /dev/null +++ b/tools/testing/selftests/kvm/x86/private_mem_conversions_test.py @@ -0,0 +1,152 @@ +#!/usr/bin/env python3 +# SPDX-License-Identifier: GPL-2.0-only +# +# Wrapper script which runs different test setups of +# private_mem_conversions_test. +# +# Copyright (C) 2025, Google LLC. + +import os +import fcntl +import sys +import subprocess + + +NUM_VCPUS_TO_TEST =3D 4 +NUM_MEMSLOTS_TO_TEST =3D NUM_VCPUS_TO_TEST + +# Required pages are based on the test setup in the C code. +# These static requirements are set to the maximum required for +# NUM_VCPUS_TO_TEST, over all the hugetlb-related tests +REQUIRED_NUM_2M_HUGEPAGES =3D 1024 * NUM_VCPUS_TO_TEST +REQUIRED_NUM_1G_HUGEPAGES =3D 2 * NUM_VCPUS_TO_TEST + + +def get_hugepage_count(page_size_kb: int) -> int: + """Reads the current number of hugepages available for a given size.""" + try: + path =3D f"/sys/kernel/mm/hugepages/hugepages-{page_size_kb}kB/nr_= hugepages" + with open(path, 'r') as f: + return int(f.read().strip()) + except (FileNotFoundError, ValueError): + return 0 + + +def get_default_hugepage_size_in_kb(): + """Reads the default hugepage size from /proc/meminfo.""" + try: + with open("/proc/meminfo", 'r') as f: + for line in f: + if line.startswith("Hugepagesize:"): + parts =3D line.split() + if len(parts) >=3D 2 and parts[1].isdigit(): + return int(parts[1]) + except FileNotFoundError: + return None + + +def run_tests(executable_path: str, src_type: str, num_memslots: int, num_= vcpus: int) -> None: + """Runs the test executable with different arguments.""" + command =3D [executable_path, "-s", src_type, "-m", str(num_memslots),= "-n", str(num_vcpus)] + print(" ".join(command)) + _ =3D subprocess.run(command, check=3DTrue) + + +def kvm_check_cap(capability: int) -> int: + KVM_CHECK_EXTENSION =3D 0xAE03 + KVM_DEVICE =3D '/dev/kvm' + + if not os.path.exists(KVM_DEVICE): + print(f"Error: KVM device not found at {KVM_DEVICE}. Is the 'kvm' = module loaded?") + return -1 + + try: + fd =3D os.open(KVM_DEVICE, os.O_RDONLY) + + result =3D fcntl.ioctl(fd, KVM_CHECK_EXTENSION, capability) + + os.close(fd) + return result + except OSError as e: + print(f"Error issuing KVM ioctl on {KVM_DEVICE}: {e}", file=3Dsys.= stderr) + if fd > 0: + os.close(fd) + return -1 + + +def kvm_has_gmem_attributes() -> bool: + KVM_CAP_GUEST_MEMFD_MEMORY_ATTRIBUTES =3D 246 + + return kvm_check_cap(KVM_CAP_GUEST_MEMFD_MEMORY_ATTRIBUTES) > 0 + + +def get_backing_source_types() -> list[str]: + hugepage_2mb_count =3D get_hugepage_count(2048) + hugepage_2mb_enabled =3D hugepage_2mb_count >=3D REQUIRED_NUM_2M_HUGEP= AGES + hugepage_1gb_count =3D get_hugepage_count(1048576) + hugepage_1gb_enabled =3D hugepage_1gb_count >=3D REQUIRED_NUM_1G_HUGEP= AGES + + default_hugepage_size_kb =3D get_default_hugepage_size_in_kb() + hugepage_default_enabled =3D False + if default_hugepage_size_kb =3D=3D 2048: + hugepage_default_enabled =3D hugepage_2mb_enabled + elif default_hugepage_size_kb =3D=3D 1048576: + hugepage_default_enabled =3D hugepage_1gb_enabled + + backing_src_types: list[str] =3D ["anonymous", "anonymous_thp"] + + if hugepage_default_enabled: + backing_src_types.append("anonymous_hugetlb") + else: + print("skipping anonymous_hugetlb backing source type") + + if hugepage_2mb_enabled: + backing_src_types.append("anonymous_hugetlb_2mb") + else: + print("skipping anonymous_hugetlb_2mb backing source type") + + if hugepage_1gb_enabled: + backing_src_types.append("anonymous_hugetlb_1gb") + else: + print("skipping anonymous_hugetlb_1gb backing source type") + + backing_src_types.append("shmem") + + if hugepage_default_enabled: + backing_src_types.append("shared_hugetlb") + else: + print("skipping shared_hugetlb backing source type") + + return backing_src_types + + +def main(): + script_dir =3D os.path.dirname(os.path.abspath(__file__)) + test_executable =3D os.path.join(script_dir, "private_mem_conversions_= test") + + if not os.path.exists(test_executable): + print(f"Error: Test executable not found at '{test_executable}'", = file=3Dsys.stderr) + sys.exit(1) + + return_code =3D 0 + + backing_src_types =3D ["shmem"] if kvm_has_gmem_attributes() else get_= backing_source_types() + try: + for i, src_type in enumerate(backing_src_types): + if i > 0: + print() + run_tests(test_executable, src_type, num_memslots=3D1, num_vcp= us=3D1) + run_tests(test_executable, src_type, num_memslots=3D1, num_vcp= us=3DNUM_VCPUS_TO_TEST) + run_tests(test_executable, src_type, num_memslots=3DNUM_MEMSLO= TS_TO_TEST, num_vcpus=3DNUM_VCPUS_TO_TEST) + except subprocess.CalledProcessError as e: + print(f"Test failed for source type '{src_type}'. Command: {' '.jo= in(e.cmd)}", file=3Dsys.stderr) + return_code =3D e.returncode + except Exception as e: + print(f"An unexpected error occurred: {e}", file=3Dsys.stderr) + return_code =3D 1 + + sys.exit(return_code) + + +if __name__ =3D=3D "__main__": + main() --=20 2.53.0.851.ga537e3e6e9-goog From nobody Tue Apr 7 12:53:42 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 D8FE8382F00 for ; Fri, 13 Mar 2026 06:13:48 +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=1773382437; cv=none; b=IWijmhgpuJXXEmlt6Vh/rxVNN9gvrkXcBdssd9CRsE0kSwtMQhWTpThjXiNXm7zO/WfQCwD+KXM35S+Zi4aevKnceMDC5J0zYeN/ALAYD1ZDEVebo85HA/oQROCNGTrBIX9rcpzzdQtUT/6w6FEd7saK50XO13qHJEHOlXjloB8= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1773382437; c=relaxed/simple; bh=jlY63jaXZygIGaOgZtVxKiuMw6fZISJPN/Vv35T8zZM=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=Q+96rBw4+d5Y3la40fI+t1iazJVrt7rGerkZ2RchouHebCmddiB4Pcl72RR1gxpKyyF0RSZ0z4cfTuWZVpXF+iHgjApvIuc7IZjWpX/CGi41n97U5L0rND5n2uhlByO3owGMPe8/EY6o8JuK9yYqH2KElNoiMyA9HMtHZBNvj/k= 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=ENg1sZGE; 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="ENg1sZGE" Received: by mail-pl1-f202.google.com with SMTP id d9443c01a7336-2ae4f27033cso19226495ad.3 for ; Thu, 12 Mar 2026 23:13:48 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20251104; t=1773382428; x=1773987228; 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=fvNVntiarmCGsWTxZpON78d07G8svxge2O9rBbJ0yac=; b=ENg1sZGEmjQ+uBR0zH/uGdOTzpH9wuOYDpp9/hLDvI2M5m8Ta/1rQpxAF+gx15fsOe I86TLBSt8Uxgt+zrVkhK3X8/m+zX348lFnYysOkJdoVHuh9Nd+kZJRhzx6mcm4bZGd8U Z5v1dLPp0cf5oNiiEJL/wyewsPguiNJPzrDkhvGx8fJqCYzPuQMDHIUzv9p8IlSFg3zW gkU8CR3Gfwu/ZwdSCs+QI1grgJXyUR/k9j83wkF6bIeDavDktZ5js+aIP513tNhcSpP8 Wc57J0JfINGOtcrNYRZUYZY0x5RQl7aSd9IH3K7jPuchxwE4zguuJ/+QXXlSIQH7k0MB r1sQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1773382428; x=1773987228; 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=fvNVntiarmCGsWTxZpON78d07G8svxge2O9rBbJ0yac=; b=OKwqPovYKRgrWoUTGGfjoLBj941ix1iHgpDUBfxrYHbp/o7vOUyEhxmYF0WVrC21UU izx8gyqaNr7IlE18FUvhZTpAXC/zoGVMzvBnmx65EHiPXeeaGiV1YdWIg+rz5sm9M63x Lp1FDIOxJJ1lzdTJMkraa5L89GLEzjY7+px+TjjCY2JRsTXrPOi1YRuCpEkbuMRHcUH8 ah5XEihBUECqEaUNTiJo4Xkh6DVFsGemUrvp9pYAemoNPEJdHFR/EF4CNTF0ejVvAT4F RWaKczkf9Cjt/+PTRG8tnvkGRgTe0BsKaC18ZO002Lsxi8qY4BVtCEkScIMc9sl9z7Cy DLkg== X-Forwarded-Encrypted: i=1; AJvYcCVQtimo1bcqhic7haYV8uC6sY7kSYjFL9O+skh93gfT3XBOgvLE3o8SIun3Tr/rmo/Nnb/eIgY3KqA3YcY=@vger.kernel.org X-Gm-Message-State: AOJu0Yx52p/FSCjx0+IlLsUmqbwAmGP9qZz4ePFsGC/1CJ+jBAHuOlOb QUsRLNoSPWY7g4OdDUr5wqtmujV88Lgtaq6NQ/EkJp60dtAJVTGkbbUsTnab0IAXkEv7QcyGtiN 2gPIFm2FLkWiKctjdGYFglNKcqg== X-Received: from pglr19.prod.google.com ([2002:a63:5153:0:b0:c5e:84e5:d15c]) (user=ackerleytng job=prod-delivery.src-stubby-dispatcher) by 2002:a05:6a21:7103:b0:366:1fea:9b54 with SMTP id adf61e73a8af0-398eccb5ca6mr1499625637.39.1773382427639; Thu, 12 Mar 2026 23:13:47 -0700 (PDT) Date: Fri, 13 Mar 2026 06:13:15 +0000 In-Reply-To: <20260313-gmem-inplace-conversion-v3-0-5fc12a70ec89@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20260313-gmem-inplace-conversion-v3-0-5fc12a70ec89@google.com> X-Developer-Key: i=ackerleytng@google.com; a=ed25519; pk=sAZDYXdm6Iz8FHitpHeFlCMXwabodTm7p8/3/8xUxuU= X-Developer-Signature: v=1; a=ed25519-sha256; t=1773382364; l=1221; i=ackerleytng@google.com; s=20260225; h=from:subject:message-id; bh=0eurx45EffreZpbE0bI2YaqpEA5K0mBVUQDWvwJDhzw=; b=P4sPtMqe0bW3A7Q96bA0pVzSw64TOLkPLdYc+O7v0eJh6YS2NIabW7a1oDP/5Be2J8/so/f7T SM8JzRi7VZ1D8avo6F2PZFyFMGjkJi3JeQSctkzYQGnIaLBJAss2LcL X-Mailer: b4 0.14.3 Message-ID: <20260313-gmem-inplace-conversion-v3-36-5fc12a70ec89@google.com> Subject: [PATCH RFC v3 36/43] 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 , 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, 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 93e603d91311c..831b612449ecf 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); =20 pre_fault_memory(vcpu, gpa, 0, SZ_2M, 0, private); --=20 2.53.0.851.ga537e3e6e9-goog From nobody Tue Apr 7 12:53:42 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 BCC09383C6F for ; Fri, 13 Mar 2026 06:13:50 +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=1773382437; cv=none; b=Z/gSX0OArk1wZAL/3BrO+QZPhouLFc+vbvoFbFcOW9w0zj8gJZCQN6O1hJIFCBXTa/sGu6dKwhgk14vgGbmnOXanMzZ+LtPhXA6jbofNMNGraRQSg96zE8RbdIYjjfX+kRkh9JPgDUdfyyiqIfKiMVzSA+lUbK7cj5gaapQpUYA= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1773382437; c=relaxed/simple; bh=q7T7ZM6Tl29gC85LGwaTuH+syvZLFPTlKap80u9yuvI=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=KkjU8Nupcv5ocmNYM0M0lNzFzPNi+Qdp5lNuUFk8qCtvkIDMsIvuVTNEwqIZnmZ3cVTu3GfqARHQtyD29+3HxEhD//LlxzSt4YBYeLGnK8cCSg3V8SFRXkCYMHuvgj1c8chI9uMdIEAKeJTjBHj6G49tedJjuSK+vuzSy79qBkg= 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=UgFYdifa; 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="UgFYdifa" Received: by mail-pj1-f73.google.com with SMTP id 98e67ed59e1d1-35a1a764225so1323043a91.1 for ; Thu, 12 Mar 2026 23:13:50 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20251104; t=1773382430; x=1773987230; 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=n3aNezrU/0SWJmlPS/7C9/IAodmtbuXAL+hrYf+dJM0=; b=UgFYdifaWQyITjFoRfZkYw2HVv9vuJJso7i/x9r+rV16X9fFymEKa3sLl6aEdRf7HT oFk/+fLFEc8l927mKPZ/HHvoZLYp+UfNrVAJv6moFRYGBrBQ5+cAPwRE4XW6RrkKQv9M 3d0kmsJ/GP73B4ZIluZ9aNA01np1sDtOpe4q9Lza3xO8zB/C+T6+hLKdsBNhHya//hoL 40+6vEI3NQZ0szmGpslB+5aWCaCpDZdlUzroH0j2mLGrqcxutEOdRbaOkSMKqJWXjPqB yUz2NnSwrNWaX3Yl62B68SywYSLTRFtiPOC2/zWltRHKSOeHtWThOKa+MpvX8x39mIok oDtg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1773382430; x=1773987230; 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=n3aNezrU/0SWJmlPS/7C9/IAodmtbuXAL+hrYf+dJM0=; b=IUIaB5bKkmDV0YMjCvfANgsCwFFCwGpaznKDTmLQy0jpZwFZ0WHC8eutFs+4533tWG SlZCWmZUBG60XrNEhXx89zJNe1+3nLKPl5QLeDWRxzKHTg3hcElR0Kff09E4H0VHhnbC BsDsRelo1mKVqHENPlF6JO6srHeGDwOmnCOHdWMRFSyxUBKQaOjWSJLF+5PUvp1z+3V0 ubh0+J0rkmOtr1/glyGzvhhaFtXakoS0gGc/Rmq1kijWannFI/mL2HeCJHR7mQRV1EWV 4XnLvdZem4/4LaTM8x4n8dzbCkiTQrkq9l/saPHEgtOYImDDL3XSV/XKS6RGAAVNcFU2 PWhQ== X-Forwarded-Encrypted: i=1; AJvYcCVYQlNl3TBIwtzvhGgcTpMYwIApyu5cEX5NqBewldOXky8XaZ7aadZ8BzrTdOUeC/IQL3Ew/JXZm2EqKAY=@vger.kernel.org X-Gm-Message-State: AOJu0YyC4/20sclbsXmei2XS4OvjZ1KTqteaF3EZMCWtvNG+yFlujLWS thwj+sqMt43/2uGU+BphrjBNxctoIkCB9LU7PLlH4joMbEya1kNrChC1MZl6yYcYsXkUKOJaGEz PHn3LcC5EVFlIc8XPvHWh4BR+WQ== X-Received: from pjvh11.prod.google.com ([2002:a17:90a:db8b:b0:359:82c7:183a]) (user=ackerleytng job=prod-delivery.src-stubby-dispatcher) by 2002:a17:90b:4f42:b0:35a:26e:4522 with SMTP id 98e67ed59e1d1-35a11a6e854mr5613559a91.11.1773382429299; Thu, 12 Mar 2026 23:13:49 -0700 (PDT) Date: Fri, 13 Mar 2026 06:13:16 +0000 In-Reply-To: <20260313-gmem-inplace-conversion-v3-0-5fc12a70ec89@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20260313-gmem-inplace-conversion-v3-0-5fc12a70ec89@google.com> X-Developer-Key: i=ackerleytng@google.com; a=ed25519; pk=sAZDYXdm6Iz8FHitpHeFlCMXwabodTm7p8/3/8xUxuU= X-Developer-Signature: v=1; a=ed25519-sha256; t=1773382364; l=3738; i=ackerleytng@google.com; s=20260225; h=from:subject:message-id; bh=fumWrtosXoiY4bOOwcVjeexuh6Vm2zjygpTEl7sB3pU=; b=bV/2YPQeaUtgT8k3bUw9lMPPh89LZPCE9CbaoTgQbZMG2AuOkox0NLGeax+/GBTehdn2UPJ3F OlvqZWJ9B3FBXkjZk8Oojxn6Y59PEsKT+z2JB3W945OMYHALufF9tnC X-Mailer: b4 0.14.3 Message-ID: <20260313-gmem-inplace-conversion-v3-37-5fc12a70ec89@google.com> Subject: [PATCH RFC v3 37/43] KVM: selftests: Update private memory exits test 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 , 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, 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 13e72fcec8dd2..10be67441d457 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); + /* Request to access page privately. */ + if (!kvm_has_gmem_attributes) + vm_mem_set_private(vm, EXITS_TEST_GPA, EXITS_TEST_SIZE); =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.851.ga537e3e6e9-goog From nobody Tue Apr 7 12:53:42 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 1A1D537EFFD for ; Fri, 13 Mar 2026 06:13:51 +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=1773382439; cv=none; b=iwSkYVyyRIWrZngVi8P9j1DGKB+RjOVYLikBJn6y+Tdhp3XtTSh+6DpdqcT0mRuX4U2qsYMgHMZoqak116NKbrIuBtOCTM3OPE+YuWISvhPVGXEH2MqCkTL+M77BVV0EEsP4SW72VJloOu/b21gJuzdOeZLLhgu78unNN2q4hGs= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1773382439; c=relaxed/simple; bh=2KjVqTEvpnhVeQDF6oSpdJZ5plfD9T0yEmClN5nA0FM=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=gzgz+RuUK1p/fkbwam1fYrqHqYHeEOlJ1ZyMLumJbaB7hY7+5EVfl4sIYEHOt1rlsnMENm9U3gK3fMoLUXmYSTfXFfrmGQXuo6Fs9Zm7/tLTi9E71ypFgYpTxxyq9ImJa0nuNgyUMsV4a1sfJBwXAHB5yF+Kw8nRw7Use2HPiR4= 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=DHCHkamt; 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="DHCHkamt" Received: by mail-pj1-f74.google.com with SMTP id 98e67ed59e1d1-3568090851aso13926305a91.1 for ; Thu, 12 Mar 2026 23:13:51 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20251104; t=1773382431; x=1773987231; 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=0Y9+LBtNIwUBlImIv/NS8s6X1brjmBLxK4e6zepb28A=; b=DHCHkamtm+AkFQG5llBTd+O5p4u2bUYiqHONFRdA90XYZjP+W7n3CyK/FuAGoJwKfm Vjzd4faIJc0lzBTpl9vTP7DDA6H2w3y2gJgSWfS0QIpWnP1jAFDezHtStAct1f2agJqM aSBPPSPC6jsawndRnZWBz2/9id6TCAUcFpyi3gPoYEWLTJby7FQmbuzb2dHA+CmBE9PP zbN32dNC26IDk6kNw9r0PH6lkwf7F035aYQTK6qTKzhTk59XyRryw+BsuzGY5mXkH0MO XpMvamb6uoEy593JVedA5z2dgO4172yPwnlviEcx6uaRlqEkbJUlIM/hCFMAszdNnTd8 mHjA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1773382431; x=1773987231; 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=0Y9+LBtNIwUBlImIv/NS8s6X1brjmBLxK4e6zepb28A=; b=exzUEZ09r08+xkSi/vgEF/s/NSMqDGz6KeukSvxQRNt1OHfqnNkWTlioK0sZG9Zgjk 1Fm8I81XvtWVrhA2CXyBVNgozuPh60ynIphJ472umLgq3ayzuikequsM2APT5WR7eLqn IOn5Ne4/tTqgbidOLc5f7i7t0Q+qCLaB8BvkzfwGZWZDMmCvnVGFR5CuYqOaSPQ74kaZ LiVwewCcZvSYFmSmXrc4CuET4yT7huwkVa6CcXPU3hpgK674PbxDKQszgjdtnog8LzJB ejjKf4itV1rMIUPE9/7tFsDvDEZiUoQJG45HEO9EU5qxq8kjcrO/Mt0h7OdIFDwmJ8+r k2pQ== X-Forwarded-Encrypted: i=1; AJvYcCUTCCrH2ZVpBzUucnNovTWUmhJ2YXUfnjsM5J7i2IQdcbqRkBu3kRZDtwyuwHnH6qpZkfu+EN5YdRR3Qcc=@vger.kernel.org X-Gm-Message-State: AOJu0YzxjNk1+V4/8IrnEwdMYtrWjCzyL8v2bqmOOby1i9in/rG514Bw G6JtdI/fcOGwIW6UuhfhPvwl6tjhFbkyJjgDnYgkGxpdAI/MkY/aRm3icxi+AOTraoUxZEE8ajx khfO1ZQZUYceHh5EBqWYFovVyIA== X-Received: from pjblw9.prod.google.com ([2002:a17:90b:1809:b0:359:9111:25a5]) (user=ackerleytng job=prod-delivery.src-stubby-dispatcher) by 2002:a17:90b:3888:b0:359:f7d2:a1fa with SMTP id 98e67ed59e1d1-35a21ea67bbmr1975196a91.4.1773382430962; Thu, 12 Mar 2026 23:13:50 -0700 (PDT) Date: Fri, 13 Mar 2026 06:13:17 +0000 In-Reply-To: <20260313-gmem-inplace-conversion-v3-0-5fc12a70ec89@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20260313-gmem-inplace-conversion-v3-0-5fc12a70ec89@google.com> X-Developer-Key: i=ackerleytng@google.com; a=ed25519; pk=sAZDYXdm6Iz8FHitpHeFlCMXwabodTm7p8/3/8xUxuU= X-Developer-Signature: v=1; a=ed25519-sha256; t=1773382364; l=2646; i=ackerleytng@google.com; s=20260225; h=from:subject:message-id; bh=2KjVqTEvpnhVeQDF6oSpdJZ5plfD9T0yEmClN5nA0FM=; b=zH9GavLcekczy6HMVrDu5CSJhFpAOcSOs94lLNZHgnCgfc1Lq7t2aTehE29lTD1R4gvTZS5jc +YtREAD0otZCIyuxlE5tS4rPxcETFLg1RUnbDV4evD2w5rYZccM8NN4 X-Mailer: b4 0.14.3 Message-ID: <20260313-gmem-inplace-conversion-v3-38-5fc12a70ec89@google.com> Subject: [PATCH RFC v3 38/43] 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 , 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, 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 | 9 +++++++++ virt/kvm/guest_memfd.c | 36 ++++++++++++++++++++++++++++++++++++ 2 files changed, 45 insertions(+) diff --git a/include/linux/kvm_host.h b/include/linux/kvm_host.h index 1ea14c66fc82e..bcb81e871fd37 100644 --- a/include/linux/kvm_host.h +++ b/include/linux/kvm_host.h @@ -740,6 +740,15 @@ 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 folio *folio); +int kvm_arch_gmem_apply_content_mode_zero(struct kvm *kvm, + struct folio *folio); +int kvm_arch_gmem_apply_content_mode_preserve(struct kvm *kvm, + struct folio *folio); +int kvm_arch_gmem_apply_content_mode_unspecified(struct kvm *kvm, + struct folio *folio); #endif =20 #ifndef kvm_arch_has_readonly_mem diff --git a/virt/kvm/guest_memfd.c b/virt/kvm/guest_memfd.c index c4f6bdad6289e..f23acbca28e54 100644 --- a/virt/kvm/guest_memfd.c +++ b/virt/kvm/guest_memfd.c @@ -638,6 +638,42 @@ static int kvm_gmem_mas_preallocate(struct ma_state *m= as, u64 attributes, return mas_preallocate(mas, xa_mk_value(attributes), GFP_KERNEL); } =20 +u64 __weak kvm_arch_gmem_supported_content_modes(struct kvm *kvm) +{ + /* Architectures must override with supported modes. */ + return 0; +} + +static u64 kvm_gmem_supported_content_modes(struct kvm *kvm) +{ + return kvm_arch_gmem_supported_content_modes(kvm); +} + +int kvm_gmem_apply_content_mode_zero(struct folio *folio) +{ + folio_zero_segment(folio, 0, folio_size(folio)); + + return 0; +} + +int __weak kvm_arch_gmem_apply_content_mode_unspecified(struct kvm *kvm, + struct folio *folio) +{ + return 0; +} + +int __weak kvm_arch_gmem_apply_content_mode_zero(struct kvm *kvm, + struct folio *folio) +{ + return kvm_gmem_apply_content_mode_zero(folio); +} + +int __weak kvm_arch_gmem_apply_content_mode_preserve(struct kvm *kvm, + struct folio *folio) +{ + 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.851.ga537e3e6e9-goog From nobody Tue Apr 7 12:53:42 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 D78703845B6 for ; Fri, 13 Mar 2026 06:13:53 +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=1773382442; cv=none; b=h+cXEFiy692iqe6BgpTd3vyhcbk18/I/CaXEpDZqdTRTC3y4pB/Z7c5wRIIAtpUvfLW1PQZT5O0oJpXrO/AIRPRWsTqB7CIn+cyL38mOwP2lGHVPg0JF+t3pElmzhX9+tfbI6Eftdlyr7FHbk4y/lTzRZkmjwPS6pPAiPjGQn7M= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1773382442; c=relaxed/simple; bh=PsXVR6/m97u9rpLVI044KHOk18BufZ3/bkmeJAuyM80=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=cXUekFbXZnyrcIdvwul7yWKOKgvfqyjU1w9TA0xznn9P3qvStOJNIWOF496A9Z+cVzBSJ6DGcIEwFQKnq3C7Zwp4j/isUdzGrrp3hoNx5360QM3YZiWA6HIUvUaqYSgtgchjNqUB4ncZsTEuDTqefQ7RknxvxD88oxEoPRtj0+k= 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=eACnccFO; 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="eACnccFO" Received: by mail-pg1-f202.google.com with SMTP id 41be03b00d2f7-c73783c96baso806017a12.2 for ; Thu, 12 Mar 2026 23:13:53 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20251104; t=1773382433; x=1773987233; 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=Ru4SOG48X5hnADT0eQPIQy13r0oyv8ixWqwkXqYhyy0=; b=eACnccFO/T6kJNzvM6HCM3qj08M2q65ZmvYnhWxX6ZeaqFb90Q9WQ/hlgFG0T6I+zp ic60R5rR+BFkVkk0Md4g8YTlKIEf5SSEiKAmU39CTp9gbyVniVIVa74rTasGPS/3iFXu Uz3AkDK2UqXOBENZt5uCEDPzwzHOJ63Yslc0/41DB9zDmcmMY3N02u6hQwLezEvjhGyR PXTy0u5m7Fxmu4ErUMmkk74qqk9eT3KCzqHHl5mx/s0ZmBkcJHvp2ff7mfsXsVtkg7wp qEkAIVhWdVAz3S0PLK4NaX6saC9IK6mp0Ea18cPF/gaqXFKFU92XIh21SU1Nd7ppb4IZ kiLQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1773382433; x=1773987233; 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=Ru4SOG48X5hnADT0eQPIQy13r0oyv8ixWqwkXqYhyy0=; b=M2E3RrVofCQ7ks0yF3h2ogBsnFwCwWOdmgFlfAfvHR4106W3nFOyN47F3m/hQjC6Hk VBYeGY8hLEmCFQRCgqOJq06B9WAd8AWQjDV04jWu2SdkEk0WSD26P57hw5WVgu5VYcE7 vujVA4Uuesx/rWg4Wj9IMtFI20BsSc4Qj4uNtnl97xZAWL8XPUU7OHWWkEFMdo54wmC0 SIYtSP6+yoWg/X6uUCrX4OIHKBbRgbCRNTOAudBmOUEEh5tLkBIaE40F/Vu6RHDrOvip wKmZE7LWYtAUZYg0NqXvjcxW0mbbU2wwJLgMR5ipPzxB1eQ/ul5vv0F6h0WlqRVhFPOI m0fw== X-Forwarded-Encrypted: i=1; AJvYcCWKXEFeMQ0+tWr8gGezv6CW62NG/dZNCvQLg1TQ8bQCrLfKV0umpkslROg+AqMDgp7uwBCWKuP4rI6xQfk=@vger.kernel.org X-Gm-Message-State: AOJu0YyCp94BketffeqfEQaQWNkwDNjtZ4znYpaLKceszhi56PqywaOc VG+ixQqsJ5EYfdlT67f5pmIHdKoeUlrcyvB1Ff5EIp2MvrjM98sRGJe2pcqBB9kz23o7pB2aSUX AEnTHMPNzRU5wTVFzyuSYggLQbA== X-Received: from pfld9.prod.google.com ([2002:a05:6a00:1989:b0:824:a502:8fea]) (user=ackerleytng job=prod-delivery.src-stubby-dispatcher) by 2002:a05:6a00:a113:b0:827:3e19:574b with SMTP id d2e1a72fcca58-82a198ad1bcmr1863557b3a.43.1773382432573; Thu, 12 Mar 2026 23:13:52 -0700 (PDT) Date: Fri, 13 Mar 2026 06:13:18 +0000 In-Reply-To: <20260313-gmem-inplace-conversion-v3-0-5fc12a70ec89@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20260313-gmem-inplace-conversion-v3-0-5fc12a70ec89@google.com> X-Developer-Key: i=ackerleytng@google.com; a=ed25519; pk=sAZDYXdm6Iz8FHitpHeFlCMXwabodTm7p8/3/8xUxuU= X-Developer-Signature: v=1; a=ed25519-sha256; t=1773382364; l=7369; i=ackerleytng@google.com; s=20260225; h=from:subject:message-id; bh=PsXVR6/m97u9rpLVI044KHOk18BufZ3/bkmeJAuyM80=; b=owLHrJvPH+l1S7PSWEo0c0posSa5NI9r+gR/dXJ1kxWlqXVcWCE3yqX5Fz/J11W0Cplhquj3O WVU750zLuu/BG4RBzBcDZY3JbDsFeKGGQXkwf3B0FdWOS3B1Id6bQKC X-Mailer: b4 0.14.3 Message-ID: <20260313-gmem-inplace-conversion-v3-39-5fc12a70ec89@google.com> Subject: [PATCH RFC v3 39/43] 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 , 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, 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 | 40 +++++++++++++++++++++++++++++ include/uapi/linux/kvm.h | 4 +++ virt/kvm/guest_memfd.c | 58 ++++++++++++++++++++++++++++++++++++++= ++-- 3 files changed, 100 insertions(+), 2 deletions(-) diff --git a/Documentation/virt/kvm/api.rst b/Documentation/virt/kvm/api.rst index 15148c80cfdb6..3ec92f8606099 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,44 @@ 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 guaranteed 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). + +TODO: Document CAP after CAP discussion. + 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 f23acbca28e54..6bfcb2ed12c61 100644 --- a/virt/kvm/guest_memfd.c +++ b/virt/kvm/guest_memfd.c @@ -674,8 +674,50 @@ int __weak kvm_arch_gmem_apply_content_mode_preserve(s= truct kvm *kvm, return -EOPNOTSUPP; } =20 +static int kvm_gmem_apply_content_mode_folio(struct kvm *kvm, + struct folio *folio, + uint64_t content_mode) +{ + switch (content_mode) { + case KVM_SET_MEMORY_ATTRIBUTES2_MODE_UNSPECIFIED: + return kvm_arch_gmem_apply_content_mode_unspecified(kvm, folio); + case KVM_SET_MEMORY_ATTRIBUTES2_ZERO: + return kvm_arch_gmem_apply_content_mode_zero(kvm, folio); + case KVM_SET_MEMORY_ATTRIBUTES2_PRESERVE: + return kvm_arch_gmem_apply_content_mode_preserve(kvm, folio); + default: + WARN_ONCE(1, "Unexpected policy requested."); + return -EOPNOTSUPP; + } +} + +static void kvm_gmem_apply_content_mode(struct inode *inode, pgoff_t start, + pgoff_t end, struct kvm *kvm, + uint64_t content_mode) +{ + struct address_space *mapping =3D inode->i_mapping; + struct folio_batch fbatch; + int i; + + folio_batch_init(&fbatch); + while (filemap_get_folios(mapping, &start, end - 1, &fbatch)) { + + for (i =3D 0; i < folio_batch_count(&fbatch); ++i) { + struct folio *folio =3D fbatch.folios[i]; + int ret; + + ret =3D kvm_gmem_apply_content_mode_folio(kvm, folio, + content_mode); + WARN_ON_ONCE(ret); + } + + folio_batch_release(&fbatch); + } +} + 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) { struct address_space *mapping =3D inode->i_mapping; @@ -689,6 +731,12 @@ static int __kvm_gmem_set_attributes(struct inode *ino= de, pgoff_t start, =20 filemap_invalidate_lock(mapping); =20 + if (content_mode && + !(kvm_gmem_supported_content_modes(kvm) & content_mode)) { + r =3D -EOPNOTSUPP; + goto out; + } + mas_init(&mas, mt, start); =20 if (kvm_gmem_range_has_attributes(mt, start, nr_pages, attrs)) { @@ -715,6 +763,8 @@ static int __kvm_gmem_set_attributes(struct inode *inod= e, pgoff_t start, =20 kvm_gmem_invalidate_begin(inode, start, end); =20 + kvm_gmem_apply_content_mode(inode, start, end, kvm, content_mode); + mas_store_prealloc(&mas, xa_mk_value(attrs)); =20 kvm_gmem_invalidate_end(inode, start, end); @@ -736,7 +786,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; @@ -758,7 +812,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 err_index << PAGE_SHIFT; =20 --=20 2.53.0.851.ga537e3e6e9-goog From nobody Tue Apr 7 12:53:42 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 199113845DE for ; Fri, 13 Mar 2026 06:13:55 +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=1773382442; cv=none; b=MlZT0hqknP+U+HlbfjZLhgek5E5wqpJBWbhhEB1SpGisLTeWLdKJa3j4KELOgNZ2X/irw0IJOTCE/vIxQkezWYQ/ayykNxkUmfyM+F9jprwTEDWgl8Ngiqd6RT/8sg3iBv6PfPPrF5XIkKo5JX+/r2JJmzEt92xq10TRIivBf60= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1773382442; c=relaxed/simple; bh=zi0vFAbqQQTVybzQ4d6S9xx2RZ2vGjUZ7QlD1D8veaE=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=LnNtHflK+nw9UidJgJXpWcvfDFF45dw2Hze0pJM0nJDnfFskkOwANyz6HZjdCBK1dCp1XdPpk/Y0+3yXbaAJIUlZSrAU7Z7oYRr/vh2UA00zydHmVkuv3vC6zAMFAD0TVnPcb3PAKEtmQJ+f1J6MOiqQTZEOKAbZO7LspGdUIgo= 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=NSJHxO2E; 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="NSJHxO2E" Received: by mail-pj1-f74.google.com with SMTP id 98e67ed59e1d1-358e95e81aeso11359198a91.0 for ; Thu, 12 Mar 2026 23:13:55 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20251104; t=1773382434; x=1773987234; 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=0GmE625ywHMcKgysjsA+lJI94OnqR7+L6DDyKIjGH1c=; b=NSJHxO2E6Valym34TQ0pv27z6yfmWCKC5ppltcn5xnZJjzP/uocDBEghxEzmeVBwcB 710G/+OI3oDVaQbjW0yzn65wbtBG7cfCBMQufAk7cTmAROvd2BBPGl466pVk7WQegBH8 x+YsasSnBJnwnPiq+pjl0/hKqW3zpefm3+em+4LnfPsjdUeNhzehF2Bp1PJFG5wGQFI8 ab0UhqpXmvXmTi6bLhK/fe/vPNwXPeHaja2nbCtPixy/hvm3xfvho44R9FvvvA/Uf7OS 89eVAqq8fEOhIEM37EeN6rO1ZCp7X5HI2hsBVzFq29E0h7IlwcI78aHPoUvqLVdmWcrm VjFw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1773382434; x=1773987234; 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=0GmE625ywHMcKgysjsA+lJI94OnqR7+L6DDyKIjGH1c=; b=qox0bzy7qn52qKnC6BiDYd63MYncp0jPVVjEMJDFSAt53fGRdyhRJ6yacGYNaFGuB2 pGQz6QUzmxUa+AvA/1fntTQkTd2VC2OzsupVpZ622SSI7pALGnUofXwkkmf/L/Ut57f4 fLyjT2/Qf/CC2CbBHjPd7jZuOM8dDReq5LgV/N94r7FSY92THgRUFjNZLZtyA1iQ6wKv jhoYvplEMP6NNhyoVhk6aKG1AjGerU0pIjfRt+DPBJzDJPyVQLMu9LvLLWnp+1SpX5zQ E/GdjCXbIDZSfB9mwDGIEkcC3anwUZ9IwKmGUeI/MW5c4ptNilVmjbHpiIoEwG1cHPOT q5Tw== X-Forwarded-Encrypted: i=1; AJvYcCW8ygTnjmM+6o2ndUqondTfR2GpN+igUxMTL6pD3ngCYsqcGLuYDTR3tSj06MnUgBDT52wZXpajbmte4gA=@vger.kernel.org X-Gm-Message-State: AOJu0YweskHfEDwOt4UF6huL2qBCbKv8EAWh+XwOofT2pAU8ea2QEau8 /kJqORd/m3EBnYMtmrb/1fcUMcDfjSsHpYz7VYCun+KvucDWEjxApnHo6qtq+A7O3q6cWQQqizc rw7nkuFAHTmaAUg86feGCwD8qKw== X-Received: from pjzh21.prod.google.com ([2002:a17:90a:ea95:b0:359:f772:3291]) (user=ackerleytng job=prod-delivery.src-stubby-dispatcher) by 2002:a17:90b:2684:b0:359:f69a:f7b7 with SMTP id 98e67ed59e1d1-35a21eadddcmr1917876a91.10.1773382434257; Thu, 12 Mar 2026 23:13:54 -0700 (PDT) Date: Fri, 13 Mar 2026 06:13:19 +0000 In-Reply-To: <20260313-gmem-inplace-conversion-v3-0-5fc12a70ec89@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20260313-gmem-inplace-conversion-v3-0-5fc12a70ec89@google.com> X-Developer-Key: i=ackerleytng@google.com; a=ed25519; pk=sAZDYXdm6Iz8FHitpHeFlCMXwabodTm7p8/3/8xUxuU= X-Developer-Signature: v=1; a=ed25519-sha256; t=1773382364; l=2407; i=ackerleytng@google.com; s=20260225; h=from:subject:message-id; bh=zi0vFAbqQQTVybzQ4d6S9xx2RZ2vGjUZ7QlD1D8veaE=; b=o1BGg3s3hX3T3w6RMc4VBLHIMEPRAJ3qHKModFx1Uwf1TqXidghI4On/BHJNfk1vuJqxWuTQM hETvPruZSDoA20O00VnLQLnLa3QLo79hqsbYwTC8q+x8SDSa/B+R6Op X-Mailer: b4 0.14.3 Message-ID: <20260313-gmem-inplace-conversion-v3-40-5fc12a70ec89@google.com> Subject: [PATCH RFC v3 40/43] 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 , 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, 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 | 69 ++++++++++++++++++++++++++++++++++++++++++++++++++= ++++ 1 file changed, 69 insertions(+) diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c index 9c29407712580..49c19897a9c30 100644 --- a/arch/x86/kvm/x86.c +++ b/arch/x86/kvm/x86.c @@ -14078,6 +14078,75 @@ void kvm_arch_gmem_invalidate(kvm_pfn_t start, kvm= _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_SEV_VM: + case KVM_X86_SEV_ES_VM: + case KVM_X86_SNP_VM: + case KVM_X86_TDX_VM: + return 0; + case KVM_X86_DEFAULT_VM: + default: + WARN_ONCE(1, "Unexpected conversion request for vm_type."); + return 0; + } +} + +int kvm_arch_gmem_apply_content_mode_zero(struct kvm *kvm, + struct folio *folio) +{ + switch (kvm->arch.vm_type) { + case KVM_X86_SW_PROTECTED_VM: + return kvm_gmem_apply_content_mode_zero(folio); + 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 folio *folio) +{ + 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; + } +} + +int kvm_arch_gmem_apply_content_mode_unspecified(struct kvm *kvm, + struct folio *folio) +{ + switch (kvm->arch.vm_type) { + case KVM_X86_SW_PROTECTED_VM: { + char *addr; + int i; + + /* + * KVM_X86_SW_PROTECTED_VM is a test vehicle, this + * case is just for testing and does not need to be + * performant. + */ + for (i =3D 0; i < folio_nr_pages(folio); ++i) { + addr =3D kmap_local_page(folio_page(folio, i)); + get_random_bytes(addr, PAGE_SIZE); + kunmap_local(addr); + } + + return 0; + } + default: + return 0; + } +} + #endif =20 int kvm_spec_ctrl_test_value(u64 value) --=20 2.53.0.851.ga537e3e6e9-goog From nobody Tue Apr 7 12:53:42 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 0ABC835AC11 for ; Fri, 13 Mar 2026 06:13:56 +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=1773382444; cv=none; b=QMBU+nXINTyvzhcZhrn9nc5W3crZhFWjJ0oypYrpbTnW06VqyMJJCuYtkFhxmGDh8CTfgEr4NUqCv7gLam9Nyu0c7EOxvb6N+JTp5yFCUqDkx5/t8B7EOtPcXxQR+LqZJoqCltMchyAxhAjP3QAyqiCN24VFePAgg4OjmbKIhzY= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1773382444; c=relaxed/simple; bh=eHYnZ4b1YfTkQYFRV/vwy19bweLPw9di8nJ0CgUFfP0=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=Xo8Zm9DQPi5obm5nApRxAWQK5pHoN4uMZkF8pfdUfgbO4bqdWXZCKoZTPfcuMBIfzp7fT5DVDS+rPrfKXHOO2CP5rrSBhqdWpcg5LxTjePezWgctCf6mmT7SRsUa+vPuHsqJgs7JkCC/NMmyLpjoYsYGOykDCDwJtBVH63qRCOw= 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=DoBT7rCP; 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="DoBT7rCP" Received: by mail-pj1-f74.google.com with SMTP id 98e67ed59e1d1-3594620fe97so12549311a91.1 for ; Thu, 12 Mar 2026 23:13:56 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20251104; t=1773382436; x=1773987236; 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=PeX9NHGT79VIWrTrWv7REJqQFLvO/7s3sB7jc929G+A=; b=DoBT7rCPM4+jejFuS3yd8PugpKZGHirZ5K18heSwJpvpzTC2CgI208KXzIDnrbjpZP bBAteuMFDMVdtwtjT8EaJxIEvw/h/W4ADBKJrqZ3YzCsYLu2hFE4+vMkJC788mYQVtdN XXZc5tmYtsou+61FBXDkShY06E3XBopDcpUK2hIllgW3IyzATW5s8i2nu45grarqzECY tzqijmgYT1JrjGkwUuaS7iY8otj5I1tSTnamhVNWQate3X/Gho5w+5NrxpH01VdUiQPt 7Jk144UBZrDOqBIEcdp917myIFkmubybruFmrKVjyLAfHxcBNUA5ecaJSTRmzfo7KDZq pj5g== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1773382436; x=1773987236; 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=PeX9NHGT79VIWrTrWv7REJqQFLvO/7s3sB7jc929G+A=; b=QrJEGuf3K3K0KgbZ6bWXnQz40Q+kmVKWmuj8DbZG2DrohniZl1cUBbctqiRvEhENwP eNm34EB41j2upPessKLVvEbg63sVu4LgrpUOKZP4yqhRkHBB1M8/Jj+ZDfTxyxlCgAtI wqP0b7WlL/rp8U7R5EwDIXL0Y/2qQtQwJI67JDR+eog+svbAbdt9Readfev2EmdRZa1/ Jf/5Eq/8VBhS7ivZKEo27wqz1bE153uRXupk+JSkvAeTipBemrF2YI1c9E/ucZvjW2OH G1QZYs9foW+01bgzXKDdp9UW3/c0CYcgey06RRuidL7MVaiHMh1CV5jc5aPNDUMXui7L M+rA== X-Forwarded-Encrypted: i=1; AJvYcCXZfdpvDb4AM8dtwcLqe++kjhAgiE2pneAJw6GvrdHhJJ/ogkkN1IogbvkK6RCSIcbAJHXQxCIXGcUxPn0=@vger.kernel.org X-Gm-Message-State: AOJu0Yz14HjCUjCDQZtOyh7riOTPjqIK8yNSMuDSnjxywqnCB6EJyre+ zbXniP3vb5Y4zqmxW4mDKWqUGUwMpUhBxm/4RUqyg6U2Jy9m6N0Lm1xsie75PoCLF4ja7Ok8ol1 TRYSg5Dh8bkLWA7KloJzrEh6TJg== X-Received: from pjbhg18.prod.google.com ([2002:a17:90b:3012:b0:359:8d6a:9bb7]) (user=ackerleytng job=prod-delivery.src-stubby-dispatcher) by 2002:a17:90b:3dcb:b0:354:9b26:cdf7 with SMTP id 98e67ed59e1d1-35a21efae3cmr2174626a91.14.1773382435767; Thu, 12 Mar 2026 23:13:55 -0700 (PDT) Date: Fri, 13 Mar 2026 06:13:20 +0000 In-Reply-To: <20260313-gmem-inplace-conversion-v3-0-5fc12a70ec89@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20260313-gmem-inplace-conversion-v3-0-5fc12a70ec89@google.com> X-Developer-Key: i=ackerleytng@google.com; a=ed25519; pk=sAZDYXdm6Iz8FHitpHeFlCMXwabodTm7p8/3/8xUxuU= X-Developer-Signature: v=1; a=ed25519-sha256; t=1773382364; l=1210; i=ackerleytng@google.com; s=20260225; h=from:subject:message-id; bh=eHYnZ4b1YfTkQYFRV/vwy19bweLPw9di8nJ0CgUFfP0=; b=rqiNCCUj0FITl4TSW1UUj0oq7hsYbkSvZt06OqDlmcSg6UpNG7FtqMbblYVVtVwfIs39KRqkE zn6/r8J1IIsB66DPTP29Y9PgGogkWFKfLEPrDDUIU4WjVn8xw4GWd+6 X-Mailer: b4 0.14.3 Message-ID: <20260313-gmem-inplace-conversion-v3-41-5fc12a70ec89@google.com> Subject: [PATCH RFC v3 41/43] KVM: x86: Support content mode ZERO for TDX 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 , 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, Ackerley Tng Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Support content mode ZERO for TDX by doing nothing, since TDX firmware will zero for the host on private to shared conversions. Signed-off-by: Ackerley Tng --- arch/x86/kvm/x86.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c index 49c19897a9c30..1354fa89edb09 100644 --- a/arch/x86/kvm/x86.c +++ b/arch/x86/kvm/x86.c @@ -14088,8 +14088,9 @@ u64 kvm_arch_gmem_supported_content_modes(struct kv= m *kvm) case KVM_X86_SEV_VM: case KVM_X86_SEV_ES_VM: case KVM_X86_SNP_VM: - case KVM_X86_TDX_VM: return 0; + case KVM_X86_TDX_VM: + return KVM_SET_MEMORY_ATTRIBUTES2_ZERO; case KVM_X86_DEFAULT_VM: default: WARN_ONCE(1, "Unexpected conversion request for vm_type."); @@ -14103,6 +14104,9 @@ int kvm_arch_gmem_apply_content_mode_zero(struct kv= m *kvm, switch (kvm->arch.vm_type) { case KVM_X86_SW_PROTECTED_VM: return kvm_gmem_apply_content_mode_zero(folio); + case KVM_X86_TDX_VM: + /* Rely on TDX firmware to do zeroing. */ + return 0; default: WARN_ONCE(1, "Unexpected request to zero for vm_type."); return -EOPNOTSUPP; --=20 2.53.0.851.ga537e3e6e9-goog From nobody Tue Apr 7 12:53:42 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 402C638644A for ; Fri, 13 Mar 2026 06:13:58 +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=1773382446; cv=none; b=GKiDalrFPjP+ja18m294R3mNNHEv98ClqO7CnXl1ThNVTHAPx6o4cHYIT2/nAyC13XdkHfSV0K9RViW+o9m0PJ+FGywyCcE8lE4a7KJUXGHXBrdwDmWNJCvEnXqZzVy2ONTcm6DsCBSe7//XHSx5oyudsjr12KjaWZyFplhkerI= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1773382446; c=relaxed/simple; bh=jMppRVlQD15qfnbHJ+Ggg+oye4+7onduPHPctp/bZDc=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=Ms6PnCX1JTdwQV9TlzQhEAnOGm4c3rwzQCkPnyd7Rerxjc827zJnPJJXXjQgPgYwit200AgXV/fBQRKWMoDKoRGc+Uqxl+qEl1ZE2LvaeuXZv61k8cobJE4Jo1w7KVZvGnEPBMMvjVVLgP5WHOLRYl9p30jvWwQuMwBWPyanwhQ= 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=uM8r25Xz; 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="uM8r25Xz" Received: by mail-pj1-f73.google.com with SMTP id 98e67ed59e1d1-35641c14663so2075553a91.2 for ; Thu, 12 Mar 2026 23:13:58 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20251104; t=1773382438; x=1773987238; 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=flzVJbpKSMnnP696xfvyJEPIAPVlhNt4vM9KSgemnu8=; b=uM8r25XzYUu57Q/sqb9YC8t+Ztg8G9cLy5V3fO7kMnH/gVpCjqT87ye60xidwCB680 4ya41EJKugrv9B3lOU61qhtNFdvbECAkiUWNlutOPOsTp4aSGvLVnpmG6Hs3mlJXCXJQ bDckbACf1yMQcsg8mInD01EuoAaFVICkYwezKF2osNNnqVxaOS37Jsi9sA4IyPvVOi1I WQa2/7qz4NlmWxCM7Vb0xebAq1Ve2spjoppbsgafQbNR9f7uTd+FCY5jSiW3C6C0Xj9k UTZRy/xzu8rAx0DSAf6Sg5kK6Xbbl+nQ30UupoWcU99baipShHk7gPb1O8WcUDHHEIEP wpeQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1773382438; x=1773987238; 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=flzVJbpKSMnnP696xfvyJEPIAPVlhNt4vM9KSgemnu8=; b=BDBg14L2ft+44PVvmUDMAGg3hyWoFDB0QdkFSJMOgjfICNvyzg6X4rl8g0Q4Brl+li IJ70NLuhUG2aYuYIPLeJpXAAGDflYL7RIRe4Wfspy8yPCX7yOJE/Qg2EIg4LeVikzldW glP6M3/vAsTXrLSzRjXFfHQQhr4qS2vl+Q8oIVqujO/i6VDGXocfpDODrY55iRsMmOze vi31m93oqFZm5baDyO6LmqbiCA+wgMFOIfYQANTWtdGPSuAga0hlxrOXeeA8HpOqogU7 VUam4+RzDWVaoxRZ2OJ0q8h6aW77A4Nw6vzTZJ4oBQ8yMOGg8uPJvq0AwP7zEQums9VC 2B8g== X-Forwarded-Encrypted: i=1; AJvYcCWEsUcku+MO4MfknoWgm7pg/oUUYXRLMPKbIIqu9AOjJvLdN+gYQ+4cEaNVgcpMZJN7yVa+GjL3ng1OJGo=@vger.kernel.org X-Gm-Message-State: AOJu0YzZ6VqYVcuW/0IOOWyccW+Hyszr8PbnggfcEJtCwM2EeD9CsP62 dfhSMKwZeFmdjGV0X0Gw5RyTG7O30lA3ktre1FBB8Hx7gDAOYefRXxlDooyvdIExQNPkOpmQQa1 RRLGLxfYLCKvTM3OYioHf1YQkKg== X-Received: from pjbft17.prod.google.com ([2002:a17:90b:f91:b0:359:fd48:da4]) (user=ackerleytng job=prod-delivery.src-stubby-dispatcher) by 2002:a17:90b:1dc7:b0:359:855f:ff96 with SMTP id 98e67ed59e1d1-35a21fbebbemr1940093a91.17.1773382437393; Thu, 12 Mar 2026 23:13:57 -0700 (PDT) Date: Fri, 13 Mar 2026 06:13:21 +0000 In-Reply-To: <20260313-gmem-inplace-conversion-v3-0-5fc12a70ec89@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20260313-gmem-inplace-conversion-v3-0-5fc12a70ec89@google.com> X-Developer-Key: i=ackerleytng@google.com; a=ed25519; pk=sAZDYXdm6Iz8FHitpHeFlCMXwabodTm7p8/3/8xUxuU= X-Developer-Signature: v=1; a=ed25519-sha256; t=1773382364; l=4259; i=ackerleytng@google.com; s=20260225; h=from:subject:message-id; bh=jMppRVlQD15qfnbHJ+Ggg+oye4+7onduPHPctp/bZDc=; b=qJakjE/0CkAGoXvxJZjY5873T5pbsePJFjPkxQm8krMJzwe6/h+o4LklvbaEU1rmc+z8bMhj6 rmTNm9YuHMWDdN0AzIP1wjb/NP2XF3MYc5O4S47Km/oeAvRBdI9lVOg X-Mailer: b4 0.14.3 Message-ID: <20260313-gmem-inplace-conversion-v3-42-5fc12a70ec89@google.com> Subject: [PATCH RFC v3 42/43] KVM: selftests: Allow flags to be specified in set_memory_attributes functions 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 , 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, Ackerley Tng Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Update the set_memory_attributes-related selftest library functions to support specification of flags. Signed-off-by: Ackerley Tng --- tools/testing/selftests/kvm/include/kvm_util.h | 36 ++++++++++++++++------= ---- 1 file changed, 22 insertions(+), 14 deletions(-) diff --git a/tools/testing/selftests/kvm/include/kvm_util.h b/tools/testing= /selftests/kvm/include/kvm_util.h index e4de0050d1ab3..a89a4f85aefdb 100644 --- a/tools/testing/selftests/kvm/include/kvm_util.h +++ b/tools/testing/selftests/kvm/include/kvm_util.h @@ -459,13 +459,14 @@ static inline void vm_set_memory_attributes(struct kv= m_vm *vm, uint64_t gpa, static inline int __gmem_set_memory_attributes(int fd, loff_t offset, uint64_t size, uint64_t attributes, - loff_t *error_offset) + loff_t *error_offset, + u64 flags) { struct kvm_memory_attributes2 attr =3D { .attributes =3D attributes, .offset =3D offset, .size =3D size, - .flags =3D 0, + .flags =3D flags, }; int r; =20 @@ -478,27 +479,30 @@ static inline int __gmem_set_memory_attributes(int fd= , loff_t offset, } =20 static inline int __gmem_set_private(int fd, loff_t offset, uint64_t size, - loff_t *error_offset) + loff_t *error_offset, u64 flags) { return __gmem_set_memory_attributes(fd, offset, size, KVM_MEMORY_ATTRIBUTE_PRIVATE, - error_offset); + error_offset, flags); } =20 static inline int __gmem_set_shared(int fd, loff_t offset, uint64_t size, - loff_t *error_offset) + loff_t *error_offset, u64 flags) { - return __gmem_set_memory_attributes(fd, offset, size, 0, error_offset); + return __gmem_set_memory_attributes(fd, offset, size, 0, + error_offset, flags); } =20 static inline void gmem_set_memory_attributes(int fd, loff_t offset, - uint64_t size, uint64_t attributes) + 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 0, + .flags =3D flags, }; =20 TEST_ASSERT_SUPPORTED_ATTRIBUTES(attributes); @@ -511,16 +515,19 @@ static inline void gmem_set_memory_attributes(int fd,= loff_t offset, =20 static inline void gmem_set_private(int fd, loff_t offset, uint64_t size) { - gmem_set_memory_attributes(fd, offset, size, KVM_MEMORY_ATTRIBUTE_PRIVATE= ); + gmem_set_memory_attributes(fd, offset, size, KVM_MEMORY_ATTRIBUTE_PRIVATE, + KVM_SET_MEMORY_ATTRIBUTES2_ZERO); } =20 static inline void gmem_set_shared(int fd, loff_t offset, uint64_t size) { - gmem_set_memory_attributes(fd, offset, size, 0); + gmem_set_memory_attributes(fd, offset, size, 0, + KVM_SET_MEMORY_ATTRIBUTES2_ZERO); } =20 static inline void vm_mem_set_memory_attributes(struct kvm_vm *vm, uint64_= t gpa, - uint64_t size, uint64_t attrs) + uint64_t size, uint64_t attrs, + u64 flags) { if (kvm_has_gmem_attributes) { uint64_t end =3D gpa + size; @@ -532,9 +539,10 @@ static inline void vm_mem_set_memory_attributes(struct= kvm_vm *vm, uint64_t gpa, fd =3D kvm_gpa_to_guest_memfd(vm, addr, &fd_offset, &len); len =3D min(end - addr, len); =20 - gmem_set_memory_attributes(fd, fd_offset, len, attrs); + 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); } } @@ -542,13 +550,13 @@ static inline void vm_mem_set_memory_attributes(struc= t kvm_vm *vm, uint64_t gpa, static inline void vm_mem_set_private(struct kvm_vm *vm, uint64_t gpa, uint64_t size) { - vm_mem_set_memory_attributes(vm, gpa, size, KVM_MEMORY_ATTRIBUTE_PRIVATE); + vm_mem_set_memory_attributes(vm, gpa, size, KVM_MEMORY_ATTRIBUTE_PRIVATE,= 0); } =20 static inline void vm_mem_set_shared(struct kvm_vm *vm, uint64_t gpa, uint64_t size) { - vm_mem_set_memory_attributes(vm, gpa, size, 0); + vm_mem_set_memory_attributes(vm, gpa, size, 0, 0); } =20 void vm_guest_mem_fallocate(struct kvm_vm *vm, uint64_t gpa, uint64_t size, --=20 2.53.0.851.ga537e3e6e9-goog From nobody Tue Apr 7 12:53:42 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 2175B38422D for ; Fri, 13 Mar 2026 06:13:59 +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=1773382447; cv=none; b=qOpYwhAhsAJhBeoni6jqxa+Z61vJ4TbY3YlTXBgkGWsmJQjs7pUhIsLsPet+j9Kd2GxB28riCgk1ErfYq/SLnlbdaFg6XftbcukUhIFZHMkyJMhrj5xmWCOF1KbGZXLTmuQriDUh3dnUncvbXFenO2wSMhwQsbJMVXNiJwQBb84= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1773382447; c=relaxed/simple; bh=9Nmx5HAs+7DRtlj9EWQELGCrvyUoFEJQW/16VzmDbeo=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=I+Y7vZYQS00SxtMj7jj0zxTBfeuQvWW10dtFIk1Y8N3D4mqEDMJ8Rp/PIF9dkuidlQgOOKxU3b3G/ob62vPdOMBH6q4Xn0o3NGc6kFrlqSXyioCey9bG+6z+cxCEQ5Uev5DL1qldxcUyW/AkAf1vMWVjwOvxV8/axdvika9+X+g= 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=JqQmIwwA; 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="JqQmIwwA" Received: by mail-pj1-f74.google.com with SMTP id 98e67ed59e1d1-354490889b6so7918033a91.3 for ; Thu, 12 Mar 2026 23:13:59 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20251104; t=1773382439; x=1773987239; 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=BkSCz6rjDBChxZIrEywkjbjk8auemBVpkQ44aK+RFnM=; b=JqQmIwwARJAMX4oM4CkS45Q83CEQfRQAn9v/+iMrb4xFW99/DZKWMU1/6Zs4KnMCSL PVATJLyRJi2lXZ5iLD+38xHTWln/gIzZvvcYOz/4E0CO4USi+Qg66F7rPhMbBZf0h47A aBbGRR1/rlf1C1KPZDh8AGmwm0dBuyvxUoL4AkthMTOJJjnXgjn3hRicF8C209yE9/O+ nNzDvoa8AtgTrQsaXwmzKPalV0X7WzCA4BFGGMY2YLUUBsMR0/CS6ajhJx/HbeQHpqiA DE2nxz0bCUqJOz+4/QfKjnUKCK+W1i/k89JqVJHQhPqz+wnAI4I/Gc/4F4a/cVhKw1MO ptsw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1773382439; x=1773987239; 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=BkSCz6rjDBChxZIrEywkjbjk8auemBVpkQ44aK+RFnM=; b=J4bI6PLtRfDBoPyHrfoMlkyXlDi25bQpvwS7YNSGILcPP1vnjcqZrQoexsTMBMaBvs /oU1QZiguRpp8YHA7Yrj+HSus7UdO5NfjoZZkbLJG21FUK/PItwJYgYgzoTO8UU3HWJj T7ojLD1l7CEOwtRnqv3ZoYTcCFridY/Cc04Il4uTrVfSjV3/XWALSi7jHo2iiyyryYMt pCw9pB1UCFn/WNaw83PZM1NhUF2gPfDBEJ5m66E5M1cBmhLtFq4u6N8tR1MXzl+mpTk9 J28QnsQOkK625IZQSp578gHlMpAZY77iuWxw7G8ceXgBTKuyQAxCIFCRo0pnudnfQ9re dvpw== X-Forwarded-Encrypted: i=1; AJvYcCWTAsoueJT0XSeOhBfiwcOwM7sQLopgwU/bXeU1URYPnUMgeZ22ttTtW3nHgVW5TO7FV3Swsu+HsjF6SPg=@vger.kernel.org X-Gm-Message-State: AOJu0YynWIhw+LzjewwMTE4VXyPVrJ/UkppwwOl58EBQ3jXosAO9vFuG 6jHsmqq37oa9wKcwYtzvp4ySSfK/QTEOenk82BDutBlweO+6c2gNDaTnii1H8O4nkk7hELLyacx ygzBOIgXoJCDKZijt7NdUgf5Iuw== X-Received: from pjbin22.prod.google.com ([2002:a17:90b:4396:b0:35a:5f:8f72]) (user=ackerleytng job=prod-delivery.src-stubby-dispatcher) by 2002:a17:90b:2784:b0:352:ba0f:fb28 with SMTP id 98e67ed59e1d1-35a21e4ee53mr2119101a91.1.1773382438985; Thu, 12 Mar 2026 23:13:58 -0700 (PDT) Date: Fri, 13 Mar 2026 06:13:22 +0000 In-Reply-To: <20260313-gmem-inplace-conversion-v3-0-5fc12a70ec89@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20260313-gmem-inplace-conversion-v3-0-5fc12a70ec89@google.com> X-Developer-Key: i=ackerleytng@google.com; a=ed25519; pk=sAZDYXdm6Iz8FHitpHeFlCMXwabodTm7p8/3/8xUxuU= X-Developer-Signature: v=1; a=ed25519-sha256; t=1773382364; l=4578; i=ackerleytng@google.com; s=20260225; h=from:subject:message-id; bh=9Nmx5HAs+7DRtlj9EWQELGCrvyUoFEJQW/16VzmDbeo=; b=DC8qeXu7SmMxXtijO6A9hehP0079wJhd+/Ee0WJofb9dO8LXR93tj+fDRl0UuiAZE+leNa+Qb nuEvk/7QGtbD81QpOVmb7HRi0PKdPhIGZa0guKDbYWzcbQKlcpmTgdP X-Mailer: b4 0.14.3 Message-ID: <20260313-gmem-inplace-conversion-v3-43-5fc12a70ec89@google.com> Subject: [PATCH RFC v3 43/43] KVM: selftests: Update tests to use flag-enabled library functions 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 , 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, Ackerley Tng Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Update tests to use the set_memory_attributes-related library functions that now allow specification of flags. This was manually tested by updating content_mode in main() and recompiling/running. TODOs: + If we introduce self-reporting of supported content modes, test based on reported content modes. If supported content modes are relatively static, accept a command line argument for this test to test different content modes. + Fold this patch into the earlier patches after getting through RFC. --- .../selftests/kvm/guest_memfd_conversions_test.c | 20 +++++++++++++++-= ---- .../selftests/kvm/x86/private_mem_conversions_test.c | 10 +++++++--- 2 files changed, 22 insertions(+), 8 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 8727474325451..42f3ea950c192 100644 --- a/tools/testing/selftests/kvm/guest_memfd_conversions_test.c +++ b/tools/testing/selftests/kvm/guest_memfd_conversions_test.c @@ -27,6 +27,7 @@ typedef FIXTURE_DATA(gmem_conversions) test_data_t; FIXTURE_SETUP(gmem_conversions) { } =20 static uint64_t page_size; +static u64 content_mode; =20 static void guest_do_rmw(void); #define GUEST_MEMFD_SHARING_TEST_GVA 0x90000000ULL @@ -192,7 +193,9 @@ static void test_private(test_data_t *t, loff_t pgoff, = char starting_val, 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); + gmem_set_memory_attributes(t->gmem_fd, pgoff * page_size, page_size, + KVM_MEMORY_ATTRIBUTE_PRIVATE, + content_mode); test_private(t, pgoff, starting_val, write_val); } =20 @@ -208,7 +211,8 @@ 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); + gmem_set_memory_attributes(t->gmem_fd, pgoff * page_size, page_size, + 0, content_mode); test_shared(t, pgoff, starting_val, host_write_val, write_val); } =20 @@ -298,7 +302,9 @@ GMEM_CONVERSION_MULTIPAGE_TEST_INIT_SHARED(unallocated_= folios, 8) if (test_page !=3D second_page_to_fault) host_do_rmw(t->mem, second_page_to_fault, 0, 'A'); =20 - gmem_set_private(t->gmem_fd, 0, nr_pages * page_size); + gmem_set_memory_attributes(t->gmem_fd, 0, nr_pages * page_size, + KVM_MEMORY_ATTRIBUTE_PRIVATE, + content_mode); 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; =20 @@ -429,7 +435,8 @@ static void test_convert_to_private_fails(test_data_t *= t, loff_t pgoff, =20 do { ret =3D __gmem_set_private(t->gmem_fd, offset, - nr_pages * page_size, &error_offset); + nr_pages * page_size, &error_offset, + content_mode); } 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, @@ -465,7 +472,9 @@ GMEM_CONVERSION_MULTIPAGE_TEST_INIT_SHARED(elevated_ref= count, 4) =20 unpin_pages(); =20 - gmem_set_private(t->gmem_fd, 0, nr_pages * page_size); + gmem_set_memory_attributes(t->gmem_fd, 0, nr_pages * page_size, + KVM_MEMORY_ATTRIBUTE_PRIVATE, + content_mode); =20 for (i =3D 0; i < nr_pages; i++) { char expected =3D i =3D=3D test_page ? 'B' : 'C'; @@ -481,6 +490,7 @@ int main(int argc, char *argv[]) KVM_MEMORY_ATTRIBUTE_PRIVATE); =20 page_size =3D getpagesize(); + content_mode =3D KVM_SET_MEMORY_ATTRIBUTES2_PRESERVE; =20 return test_harness_run(argc, argv); } 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 f85717662a73b..7d72c36d102c9 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,13 @@ 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_mem_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; + + vm_mem_set_memory_attributes(vm, gpa, size, attrs, + KVM_SET_MEMORY_ATTRIBUTES2_PRESERVE); + } + run->hypercall.ret =3D 0; } =20 --=20 2.53.0.851.ga537e3e6e9-goog