From nobody Mon Sep 28 04:51:20 2026 Received: from mail-pl1-f199.google.com (mail-pl1-f199.google.com [209.85.214.199]) (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 CF2E43BBFBC for ; Wed, 26 Aug 2026 09:18:09 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.199 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1787735892; cv=none; b=mPf/vspakk31JBXyaQigLe9a692T54n92dM0TOADRbSH9W/eoqZOk0DcQqQztkbDhK1TgxlCL5DsZT6CxNeOy0e9Q1L81OfRzNUMINZr3po69//6D3NirpROVwfRNCb45u2+ipYmQlXA6pHY8jm/7tL2jEu+R4d6q6sc+dRbgCw= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1787735892; c=relaxed/simple; bh=D4ST30jQRX/uRvFqP97izkZ1CblAEsOFPjcrOf14KgA=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=W3BhFcQRBkHDWqPLnIQ4yjMNHT92pzdZZnAt6Wo+kCX9/yYvNHQ3OqUoFjACx9mGVx1/YC5I71hirauLii5e6jOHMmNQt6fnhR3Z/1qxAIgJ8E6m5D98xmLH07eNvOY4ANnAP2PVxYbAFWWATc6Ar5U0IfAFXHqnTW5Q/Oh2FgU= 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=cnOQ9uJZ; arc=none smtp.client-ip=209.85.214.199 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="cnOQ9uJZ" Received: by mail-pl1-f199.google.com with SMTP id d9443c01a7336-2d04908139bso12122095ad.2 for ; Wed, 26 Aug 2026 02:18:09 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20251104; t=1787735889; x=1788340689; darn=vger.kernel.org; h=content-type:cc:to:from:subject:message-id:references:mime-version :in-reply-to:date:from:to:cc:subject:date:message-id:reply-to :content-type; bh=JT2WmuQLq+zfNeKl7/c56AfNeqFR+S/et95W/1dj6Uo=; b=cnOQ9uJZpTrDf0dRaektFp2Rkqyqx8F3daRpJ1y7ztjoolVPyXyeXWjlzfcRTAWbEn mGlcuN+bts0dyinRrcjZe4CIPqO7wZlDXpjMt9QfJ7BfAPuC9SCSa45OE+pWgBN7H4/i PXBF6arb4g7YJzuqWQz/orT+C7jP/WZqszPByjCsj0g/hDkLLoRkqgn1LbXChF5ly16V JFmpfciRhrBcBoVDH8iZbdCb5KM6iv5QuvH2hfcTyoVMYw78/w93sblV8bINstQdfBv7 V1aMdiJz6Z9CCAGhtIASCI27dYPRGUWwT2jVHVRdr2NseLNU7FN5lX9w8CDsBhLxYg/D Tq8Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1787735889; x=1788340689; h=content-type: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:content-type; bh=JT2WmuQLq+zfNeKl7/c56AfNeqFR+S/et95W/1dj6Uo=; b=ac92cXVJsXO1Lg1XdAwktlGldm/So1ED1jlZ0ptze+afH5+YO4SDOFCRFL0zaA+GUK JSLWBoI+GgqfTSMIN3gIIjJOD3/Li0Pu2ibOXJh9T1A5YgbAytJFY6krXLjYOzi48l3q +rpb8o15H9l39g8rAREyatBsTlIphQmQUuFSZtfdO08NeQ9sjsp4EGVSXFdc7eyH80Kx vaiWNEjiPDsGSJERh403PY2qqu9XFmD7dhP00+RFvBDuXiHTacMOJamrGctl4zD9dpeu 0OkYJSN+hXahxYZ22b+oFmk0Ro46bQdPF8jMaDgSvr7DRl63SFrunmvW1bOuQdt8uOBz o6Tg== X-Forwarded-Encrypted: i=1; AHgh+RqjOfN6ZnU/gY2N/BCnfxFubr6IHvSfQFPeBnELO7x7rjGkgRy2cCU89HE/7sAGguW6LSW/M4H5P32D+PI=@vger.kernel.org X-Gm-Message-State: AFuF++kB6+ZTwhlwEGfAZCtwqhRbfpKU9kaVNXR73cb4r39xndeRtNHV n3HjqP/J5m+IXp4LgYp7PEM3svtk/HC+j2EPy/7NRafOr0OrSfnpveHmdMZRZ0BwY2dDEd3thx/ jUqaTxxw+jgwSJcX4JByAIOOCng== X-Received: from plcq19.prod.google.com ([2002:a17:902:e313:b0:2cb:97da:d8ed]) (user=ackerleytng job=prod-delivery.src-stubby-dispatcher) by 2002:a17:902:e550:b0:2ca:1479:d9dc with SMTP id d9443c01a7336-2d707b64aecmr84939595ad.12.1787735888790; Wed, 26 Aug 2026 02:18:08 -0700 (PDT) Date: Wed, 26 Aug 2026 09:17:59 +0000 In-Reply-To: <20260826-gmem-inplace-conversion-v11-0-0a15d8a799aa@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20260826-gmem-inplace-conversion-v11-0-0a15d8a799aa@google.com> X-Developer-Key: i=ackerleytng@google.com; a=ed25519; pk=sAZDYXdm6Iz8FHitpHeFlCMXwabodTm7p8/3/8xUxuU= X-Developer-Signature: v=1; a=ed25519-sha256; t=1787735885; l=3210; i=ackerleytng@google.com; s=20260225; h=from:subject:message-id; bh=MbWJTengbpxG0xzwuz0lf3xMYAKXqHxm3CvrNeYe0yg=; b=hid3XaxmgWKMsVpycO2R5BnX6MEajs6GC6HPVzfM1VFvQ2hq+z9XIlxbkBtBsD30MHilmtY3L IRzNTIuPyMqBQVP+ooVX/F9ukdcP/AjeJNSyeQCltEtrfkmjmdgb3Nr X-Mailer: b4 0.16.0 Message-ID: <20260826-gmem-inplace-conversion-v11-1-0a15d8a799aa@google.com> Subject: [PATCH v11 01/46] KVM: guest_memfd: Optimize away conversion overheads via dead-code elimination 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, jmattson@google.com, jthoughton@google.com, michael.roth@amd.com, oupton@kernel.org, pankaj.gupta@amd.com, qperret@google.com, rick.p.edgecombe@intel.com, rientjes@google.com, shivankg@amd.com, steven.price@arm.com, willy@infradead.org, wyihan@google.com, yan.y.zhao@intel.com, forkloop@google.com, pratyush@kernel.org, suzuki.poulose@arm.com, aneesh.kumar@kernel.org, liam@infradead.org, Paolo Bonzini , Sean Christopherson , Thomas Gleixner , Ingo Molnar , Borislav Petkov , Dave Hansen , x86@kernel.org, "H. Peter Anvin" , Steven Rostedt , Masami Hiramatsu , Mathieu Desnoyers , Jonathan Corbet , Shuah Khan , Shuah Khan , Vishal Annapurve , Andrew Morton , Chris Li , Kairui Song , Kemeng Shi , Nhat Pham , Barry Song , Axel Rasmussen , Yuanchu Xie , Wei Xu , Youngjun Park , Qi Zheng , Shakeel Butt , Kiryl Shutsemau , Baoquan He , Jason Gunthorpe , John Hubbard , Peter Xu , tarunsahu@google.com, Fuad Tabba , Vlastimil Babka Cc: kvm@vger.kernel.org, linux-kernel@vger.kernel.org, linux-trace-kernel@vger.kernel.org, linux-doc@vger.kernel.org, linux-kselftest@vger.kernel.org, linux-mm@kvack.org, linux-coco@lists.linux.dev, Ackerley Tng Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable From: Sean Christopherson Add and use kvm_arch_has_gmem_convert() to guard guest_memfd's invocation of arch hooks related to converting memory between private and shared, as only one half of the x86 CoCo duo needs the runtime hooks (any pre-work is pure overhead for TDX). At this exact moment, the overhead is negligible, but that will change when in-place conversion comes along, at which point to-shared conversions will "need" to find all affected folios prior to calling into arch code. In quotes because very technically that work could be pushed to arch code, but that would bleed guest_memfd details into arch code and would be far worse than adding yet another kvm_arch_has... hook. Opportunistically provide the kvm_arch_gmem_make_private() declaration, and rely on dead-code elimination to eliminate the call to non-existent code when CONFIG_HAVE_KVM_ARCH_GMEM_CONVERT=3Dn. Reported-by: Binbin Wu Closes: https://lore.kernel.org/all/1ec08cd8-3072-4753-ad5e-cd34956647f8@li= nux.intel.com Suggested-by: Ackerley Tng Signed-off-by: Sean Christopherson Signed-off-by: Ackerley Tng --- arch/x86/include/asm/kvm_host.h | 3 +++ include/linux/kvm_host.h | 3 ++- virt/kvm/guest_memfd.c | 5 ++--- 3 files changed, 7 insertions(+), 4 deletions(-) diff --git a/arch/x86/include/asm/kvm_host.h b/arch/x86/include/asm/kvm_hos= t.h index 683bb8bf43a94..6beddd8a0c749 100644 --- a/arch/x86/include/asm/kvm_host.h +++ b/arch/x86/include/asm/kvm_host.h @@ -1854,6 +1854,9 @@ enum kvm_intr_type { #ifdef CONFIG_KVM_GENERIC_MEMORY_ATTRIBUTES #define kvm_arch_has_private_mem(kvm) ((kvm)->arch.has_private_mem) #endif +#ifdef CONFIG_HAVE_KVM_ARCH_GMEM_CONVERT +#define kvm_arch_has_gmem_convert() (!!kvm_x86_ops.gmem_make_private) +#endif =20 #define kvm_arch_has_readonly_mem(kvm) (!(kvm)->arch.has_protected_state) =20 diff --git a/include/linux/kvm_host.h b/include/linux/kvm_host.h index 502465119ca0c..b7516e19ef419 100644 --- a/include/linux/kvm_host.h +++ b/include/linux/kvm_host.h @@ -2597,9 +2597,10 @@ static inline int kvm_gmem_get_pfn(struct kvm *kvm, } #endif /* CONFIG_KVM_GUEST_MEMFD */ =20 -#ifdef CONFIG_HAVE_KVM_ARCH_GMEM_CONVERT int kvm_arch_gmem_make_private(struct kvm *kvm, gfn_t gfn, kvm_pfn_t pfn, kvm_pfn_t nr_pages); +#ifndef CONFIG_HAVE_KVM_ARCH_GMEM_CONVERT +#define kvm_arch_has_gmem_convert() false #endif =20 #ifdef CONFIG_HAVE_KVM_ARCH_GMEM_POPULATE diff --git a/virt/kvm/guest_memfd.c b/virt/kvm/guest_memfd.c index 589762140c3ef..8f8e5b6b70134 100644 --- a/virt/kvm/guest_memfd.c +++ b/virt/kvm/guest_memfd.c @@ -772,11 +772,10 @@ int kvm_gmem_get_pfn(struct kvm *kvm, struct kvm_memo= ry_slot *slot, folio_mark_uptodate(folio); } =20 -#ifdef CONFIG_HAVE_KVM_ARCH_GMEM_CONVERT - if (kvm_gmem_is_private_mem(file_inode(file), index)) + if (kvm_arch_has_gmem_convert() && + kvm_gmem_is_private_mem(file_inode(file), index)) r =3D kvm_arch_gmem_make_private(kvm, gfn, *pfn, (kvm_pfn_t)1 << *max_order); -#endif =20 folio_unlock(folio); folio_put(folio); --=20 2.55.0.887.g758fc8c411-goog From nobody Mon Sep 28 04:51:20 2026 Received: from mail-pl1-f199.google.com (mail-pl1-f199.google.com [209.85.214.199]) (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 821523BBFC0 for ; Wed, 26 Aug 2026 09:18:11 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.199 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1787735893; cv=none; b=GogTCDvwSppLDIeioUwnug5pEowdAAQaAr81BS7WD3oTzk8udx7LQojDR5TYJtcljmcKwDtZm83d7L4GJ3IObUCCvuIxnoXP6Vq29UBMKyy1+LclrrUVe4oc1xfBW5C/ZkW/fTlbyVuAhzpfdm4u4qQ3BhjW6z1W3a83ZoB1zFE= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1787735893; c=relaxed/simple; bh=G1Oe3vHwLnwNUEYSyDQugighaFv0EtGtjgMjuieTH7w=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=kxcOw0BN9EUluu+MKL5AibtdNmwe0rYfbAZGclhbE1IKZLs6dO8PgMsR9g260JX4/3Qn2jjMRJrgjCRia/PVPGvnu6szgOxrkTdOflRKaixcQS1AEYG7VkaFr676cLFu8SIpwZbUe/JeGc0Uu3Degr1EecuRyftbWfc8HI15PkA= 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=azdOw6Ro; arc=none smtp.client-ip=209.85.214.199 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="azdOw6Ro" Received: by mail-pl1-f199.google.com with SMTP id d9443c01a7336-2cee1ec30f2so12267575ad.3 for ; Wed, 26 Aug 2026 02:18:11 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20251104; t=1787735891; x=1788340691; darn=vger.kernel.org; h=content-type:cc:to:from:subject:message-id:references:mime-version :in-reply-to:date:from:to:cc:subject:date:message-id:reply-to :content-type; bh=8XDSSI9/m82E8oEwBtVX/wDbyuOojUfBfVTSxkje5Co=; b=azdOw6RoBNJyiFoUKQ2uaMAo1v5ndrSG7BhE42wIKTUdfH4gsbSDGkc9p755kjYL/5 Rs5EuxBO8Se91par9Q7R+lk0Ib9WJdNBOGQHqs87BzdMQboOj3Y/uq13fA1kDsySXMnU WH48x3RTjTckoxf0IrPYwsEO/hM6IqTG1+cG9FIwuDwe1ZGriPiNfL+d0Df49JWpKUHF aUfDw38tBvN1QwRSh1dPQyOx8E5p/Ad1bLwaY7v5nV8s4C960d0yiw+G1/P8AYPQmo+H N17HFvRNng8wYhYvBQgFUpTbmg/HOejOHbhyZ9os0rt9W4VjgrBfgj7cjx7fmP66K+7C fG8Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1787735891; x=1788340691; h=content-type: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:content-type; bh=8XDSSI9/m82E8oEwBtVX/wDbyuOojUfBfVTSxkje5Co=; b=SOOgFUNeEWBM3R1rpEoR3lFTCf5SgQ2txB+Rjzq30kjjT9nPSEurexRvGlZqadyfQS zAEX2lwmh54fMD0zykE6T0MdGE8dqSwactcIErf2vtxc6yBvtP2U0jH40HX8bYrHapQB E+BX6dViqsNhwmghXKHnJq/E63BIe0yVRsHeV3qJvt0K8TuCf55U7/S6/yhQBSdlug+m e3BAYT3gW2V2UWqWb6NablFw48noJv287j/34l1I1V+Vrq/XEdyDwBGWyb/9FHjaPyGm pxi7v72lr6zrnPinEufXz4zVco8h32rWGhs4KYXyehFOy6Q8uMjpHVMmqQX6Fm8n5huM LiGQ== X-Forwarded-Encrypted: i=1; AHgh+Ro//+bof5o13rECdmauaHVGB2UbQQt67kDbcIRkizFs+UqUcmaDRNozjt5yXp2E93V5bTibffLlvEzpAW8=@vger.kernel.org X-Gm-Message-State: AFuF++k2jl9XCK7LvjAbLZWnAVP+YbekMqQsm9qMb6dpUWsZ1R9UUydV EyMPorolFlEG20J/ARf98JSmjGYaRw9uByYt96c/YTejrkEFvpeBsmNDwyJptjkefeKfVZkI5zc NQlbYvSX5HLuFYVcwyTznjmKdVA== X-Received: from pldb5.prod.google.com ([2002:a17:902:ed05:b0:2cf:b7f5:bad5]) (user=ackerleytng job=prod-delivery.src-stubby-dispatcher) by 2002:a17:902:f70f:b0:2bf:7b62:a038 with SMTP id d9443c01a7336-2d707b7f68emr92673465ad.9.1787735890408; Wed, 26 Aug 2026 02:18:10 -0700 (PDT) Date: Wed, 26 Aug 2026 09:18:00 +0000 In-Reply-To: <20260826-gmem-inplace-conversion-v11-0-0a15d8a799aa@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20260826-gmem-inplace-conversion-v11-0-0a15d8a799aa@google.com> X-Developer-Key: i=ackerleytng@google.com; a=ed25519; pk=sAZDYXdm6Iz8FHitpHeFlCMXwabodTm7p8/3/8xUxuU= X-Developer-Signature: v=1; a=ed25519-sha256; t=1787735885; l=1236; i=ackerleytng@google.com; s=20260225; h=from:subject:message-id; bh=x4GiehEvwthbo+pCvL6V9adeW5xOS5C7xTsIhL+6Zek=; b=s+IQgM8B+Ybq43NAJgLoaKZkS9bVwFm6R6sUMh7Ta7t1ZqeXaVdBjvNLlZzPswTgV7Us8uM7H f7uNAG5zSptDljo14pDwFoYLa2yBFAGT9eOULI9I1qN+OBHVWQBkK3T X-Mailer: b4 0.16.0 Message-ID: <20260826-gmem-inplace-conversion-v11-2-0a15d8a799aa@google.com> Subject: [PATCH v11 02/46] KVM: guest_memfd: Use kvm_mem_is_private() when populating guest_memfd 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, jmattson@google.com, jthoughton@google.com, michael.roth@amd.com, oupton@kernel.org, pankaj.gupta@amd.com, qperret@google.com, rick.p.edgecombe@intel.com, rientjes@google.com, shivankg@amd.com, steven.price@arm.com, willy@infradead.org, wyihan@google.com, yan.y.zhao@intel.com, forkloop@google.com, pratyush@kernel.org, suzuki.poulose@arm.com, aneesh.kumar@kernel.org, liam@infradead.org, Paolo Bonzini , Sean Christopherson , Thomas Gleixner , Ingo Molnar , Borislav Petkov , Dave Hansen , x86@kernel.org, "H. Peter Anvin" , Steven Rostedt , Masami Hiramatsu , Mathieu Desnoyers , Jonathan Corbet , Shuah Khan , Shuah Khan , Vishal Annapurve , Andrew Morton , Chris Li , Kairui Song , Kemeng Shi , Nhat Pham , Barry Song , Axel Rasmussen , Yuanchu Xie , Wei Xu , Youngjun Park , Qi Zheng , Shakeel Butt , Kiryl Shutsemau , Baoquan He , Jason Gunthorpe , John Hubbard , Peter Xu , tarunsahu@google.com, Fuad Tabba , Vlastimil Babka Cc: kvm@vger.kernel.org, linux-kernel@vger.kernel.org, linux-trace-kernel@vger.kernel.org, linux-doc@vger.kernel.org, linux-kselftest@vger.kernel.org, linux-mm@kvack.org, linux-coco@lists.linux.dev, Ackerley Tng , Xiaoyao Li , Fuad Tabba Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable From: Sean Christopherson Use kvm_mem_is_private() when populating guest_memfd instead of using an open coded equivalent. In addition to simplifying the populate code *now*, this avoids the need to provide a range-based gmem lookup API in the future as well. No functional change intended. Signed-off-by: Sean Christopherson Suggested-by: Xiaoyao Li Reviewed-by: Xiaoyao Li Reviewed-by: Binbin Wu Reviewed-by: Fuad Tabba Signed-off-by: Ackerley Tng --- virt/kvm/guest_memfd.c | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/virt/kvm/guest_memfd.c b/virt/kvm/guest_memfd.c index 8f8e5b6b70134..2c5857a73ec94 100644 --- a/virt/kvm/guest_memfd.c +++ b/virt/kvm/guest_memfd.c @@ -805,9 +805,7 @@ 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)) { + if (!kvm_mem_is_private(kvm, gfn)) { ret =3D -EINVAL; goto out_put_folio; } --=20 2.55.0.887.g758fc8c411-goog From nobody Mon Sep 28 04:51:20 2026 Received: from mail-pl1-f199.google.com (mail-pl1-f199.google.com [209.85.214.199]) (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 E902D3BBFC2 for ; Wed, 26 Aug 2026 09:18:14 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.199 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1787735897; cv=none; b=XdMusU7nDFZRUPhikTi5Ny9Uo8mY+Ph6m3wu+7JtxUOccFRgCpgVIJQs7B1P26hDJKsQRBVEsGZ3PIZyAZcfqrlEpGOb89H81Htw+ipZHipZo4VaalzF7QJ1hYYs9+uIY3WGisN0d3W7moKmf2ZDalcasUp8Y5p9HLWLJGoGK7o= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1787735897; c=relaxed/simple; bh=3j4HP/pcwLl+LC7YJJLl650dY7sJQ8xV6gpIzCkDtX4=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=r0QDOB2gUwgqt3OaR8rBv3i9HooZIvjf8bfigdzX4pK2iiLEl2j1vH1OiyG0hbge9l90aMC+GeEbXtFqmDrT+Viz9AZXIP7YWtDZ7YA1HJ09O7krGQMKwJAiHjvUV783gH7HB5GoTg97XQ9FgXyf+WzRhNdM4PNPPrCC+ujaM04= 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=wf6T039b; arc=none smtp.client-ip=209.85.214.199 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="wf6T039b" Received: by mail-pl1-f199.google.com with SMTP id d9443c01a7336-2d6df0a1e18so9975395ad.1 for ; Wed, 26 Aug 2026 02:18:14 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20251104; t=1787735893; x=1788340693; darn=vger.kernel.org; h=content-type:cc:to:from:subject:message-id:references:mime-version :in-reply-to:date:from:to:cc:subject:date:message-id:reply-to :content-type; bh=jW6qehcQroMLAfqimWC+/98gYPjKxQ/Xm+gQk2AWdxQ=; b=wf6T039bATc0puYn++erLl+8bxvURYMR0S1aig8HPEFtbxjk4Br7o2b6ZumvYjFTOo JYOJrD0zggbKP5ZzxRlQdgQlG9AgM0amqW0IHSxT7phkhSLw1SuAS9a2fInEJzMUGxCY QgnYIrhwuVoOkd5ZmJR7pE0JnUiO0LlGdpIK7AOpw97785ijEOP7CsOIZxl7h0DnLmPL H8Z+SItjdYIsw3Zazo7vEllD5F/SsqfkF/XWR/9K3AkQBDtZHIKeGVpeZLuBFujFME+l 3ylTKiHdvqMRcyQ/kCmo0eC4RS6wRywJUQTTKbuSei0HkQLBEJnAUkHQW12XAsTIt8n8 Kt0w== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1787735893; x=1788340693; h=content-type: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:content-type; bh=jW6qehcQroMLAfqimWC+/98gYPjKxQ/Xm+gQk2AWdxQ=; b=GNo55cA6uFzPEFDFmKvIJLQ0ZjUvvZRCACwjxWUNHCAIt7O7BF4uL+v0DfWzD20wLs hb0igydQvUP8Al9bxz2awhKYH01w4zLbUuHdQ8Wfd1Gn9sjX2iEG7HrRPEKNdZngxTCN G7XCvBa961ldrcEKYqhIQLSS8Y8zShATwGmrHzK4VOn6IQM/oS5JcZVCG2yQ7GfHh4Ky niDK+5mH4BHbku3Ekal1QkC9aYbZSqP4Fxu8SYZbnKPJ8+f+nUIGe9xIfl1m+B4qobKf hOMvGs1GUU+QLKjRigGalncE/wmCAO9dsQ6sqWq9J3eMaTHjKZvMr7UwP2QQLP1MiaF+ hFpw== X-Forwarded-Encrypted: i=1; AHgh+RpIm04VDb6xjcqnXBN394Xy+Q3rx10iJSc3GsbLfmoaHBXydQdpOUS5d95Bw1fGLtQhW23RsMz8o1JmMCA=@vger.kernel.org X-Gm-Message-State: AFuF++mwCPzdh5QAL2qHLwzrmVyF/PMQven8DdVTEH3JzZ9J7UOZep1w D2B55U21IMfO2hAzX5jYJXVXx61s6NB0dsakUrUb01Ue0B9E/wJJtPAyvnVqZ2z3n0qaHHsWjPB 8WuqJhdy7dwEIiPyQDszac4EE/Q== X-Received: from plbkr3.prod.google.com ([2002:a17:903:803:b0:2d7:1ff:d1ee]) (user=ackerleytng job=prod-delivery.src-stubby-dispatcher) by 2002:a17:903:11c3:b0:2cc:f5aa:9513 with SMTP id d9443c01a7336-2d707bab981mr79455195ad.10.1787735892152; Wed, 26 Aug 2026 02:18:12 -0700 (PDT) Date: Wed, 26 Aug 2026 09:18:01 +0000 In-Reply-To: <20260826-gmem-inplace-conversion-v11-0-0a15d8a799aa@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20260826-gmem-inplace-conversion-v11-0-0a15d8a799aa@google.com> X-Developer-Key: i=ackerleytng@google.com; a=ed25519; pk=sAZDYXdm6Iz8FHitpHeFlCMXwabodTm7p8/3/8xUxuU= X-Developer-Signature: v=1; a=ed25519-sha256; t=1787735885; l=8901; i=ackerleytng@google.com; s=20260225; h=from:subject:message-id; bh=SEnzznEA5NUsL5Y4N4re64mzaHrxr3QSDUbuTg+NomA=; b=GhCAeUsftl/MAjjcKvIK0iPyIYi5/ZehgDnv1weoDN6O1ArKkXecL34ytH/RnfWRQ8sPaegrd FSm/zS6foADBWKsZuwKgbLzpHYu20tO75OkT63E6a1AUG8HUylRHSUC X-Mailer: b4 0.16.0 Message-ID: <20260826-gmem-inplace-conversion-v11-3-0a15d8a799aa@google.com> Subject: [PATCH v11 03/46] 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, jmattson@google.com, jthoughton@google.com, michael.roth@amd.com, oupton@kernel.org, pankaj.gupta@amd.com, qperret@google.com, rick.p.edgecombe@intel.com, rientjes@google.com, shivankg@amd.com, steven.price@arm.com, willy@infradead.org, wyihan@google.com, yan.y.zhao@intel.com, forkloop@google.com, pratyush@kernel.org, suzuki.poulose@arm.com, aneesh.kumar@kernel.org, liam@infradead.org, Paolo Bonzini , Sean Christopherson , Thomas Gleixner , Ingo Molnar , Borislav Petkov , Dave Hansen , x86@kernel.org, "H. Peter Anvin" , Steven Rostedt , Masami Hiramatsu , Mathieu Desnoyers , Jonathan Corbet , Shuah Khan , Shuah Khan , Vishal Annapurve , Andrew Morton , Chris Li , Kairui Song , Kemeng Shi , Nhat Pham , Barry Song , Axel Rasmussen , Yuanchu Xie , Wei Xu , Youngjun Park , Qi Zheng , Shakeel Butt , Kiryl Shutsemau , Baoquan He , Jason Gunthorpe , John Hubbard , Peter Xu , tarunsahu@google.com, Fuad Tabba , Vlastimil Babka Cc: kvm@vger.kernel.org, linux-kernel@vger.kernel.org, linux-trace-kernel@vger.kernel.org, linux-doc@vger.kernel.org, linux-kselftest@vger.kernel.org, linux-mm@kvack.org, linux-coco@lists.linux.dev, Ackerley Tng , Xiaoyao Li 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 shared/private status 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 (avoiding deadlock is quite difficult). In kvm_gmem_get_pfn(), drop the folio refcount before releasing filemap_invalidate_lock(). This ensures that a competing conversion request from userspace (to be added in a later patch), which also takes the filemap_invalidate_lock(), will never see an elevated refcount due to kvm_gmem_get_pfn(). Co-developed-by: Vishal Annapurve Signed-off-by: Vishal Annapurve Co-developed-by: Fuad Tabba Signed-off-by: Fuad Tabba Signed-off-by: Sean Christopherson Tested-by: Shivank Garg Reviewed-by: Xiaoyao Li Reviewed-by: Binbin Wu Co-developed-by: Ackerley Tng Signed-off-by: Ackerley Tng --- virt/kvm/guest_memfd.c | 136 ++++++++++++++++++++++++++++++++++++++++++---= ---- 1 file changed, 119 insertions(+), 17 deletions(-) diff --git a/virt/kvm/guest_memfd.c b/virt/kvm/guest_memfd.c index 2c5857a73ec94..154fc9622640d 100644 --- a/virt/kvm/guest_memfd.c +++ b/virt/kvm/guest_memfd.c @@ -4,6 +4,7 @@ #include #include #include +#include #include #include #include @@ -34,6 +35,13 @@ struct gmem_inode { struct list_head gmem_file_list; =20 u64 flags; + /* + * Every index in this inode, whether memory is populated or + * not, is tracked in attributes. The entire range of indices, + * corresponding to the size of this inode, is represented in + * this maple tree. + */ + struct maple_tree attributes; }; =20 static __always_inline struct gmem_inode *GMEM_I(struct inode *inode) @@ -61,9 +69,28 @@ 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_default_attributes(struct inode *inode) +{ + bool init_shared =3D GMEM_I(inode)->flags & GUEST_MEMFD_FLAG_INIT_SHARED; + + return init_shared ? 0 : KVM_MEMORY_ATTRIBUTE_PRIVATE; +} + +static u64 kvm_gmem_get_attributes(struct inode *inode, void *entry) +{ + if (WARN_ON_ONCE(!entry)) + return kvm_gmem_get_default_attributes(inode); + + return xa_to_value(entry); +} + static bool kvm_gmem_is_private_mem(struct inode *inode, pgoff_t index) { - return !(GMEM_I(inode)->flags & GUEST_MEMFD_FLAG_INIT_SHARED); + struct maple_tree *mt =3D &GMEM_I(inode)->attributes; + void *entry =3D mtree_load(mt, index); + + return kvm_gmem_get_attributes(inode, entry) & + KVM_MEMORY_ATTRIBUTE_PRIVATE; } =20 static bool kvm_gmem_is_shared_mem(struct inode *inode, pgoff_t index) @@ -364,10 +391,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 (!kvm_gmem_is_shared_mem(inode, vmf->pgoff)) - 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; @@ -520,6 +550,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 kvm_gmem_get_default_attributes(inode); + + /* + * 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]"; @@ -550,16 +625,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)) { @@ -763,9 +831,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)); @@ -780,6 +852,8 @@ int kvm_gmem_get_pfn(struct kvm *kvm, struct kvm_memory= _slot *slot, folio_unlock(folio); 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); @@ -909,6 +983,15 @@ static struct inode *kvm_gmem_alloc_inode(struct super= _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 | MT_FLAGS_USE_RCU); + gi->flags =3D 0; INIT_LIST_HEAD(&gi->gmem_file_list); return &gi->vfs_inode; @@ -916,7 +999,26 @@ static struct inode *kvm_gmem_alloc_inode(struct super= _block *sb) =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.55.0.887.g758fc8c411-goog From nobody Mon Sep 28 04:51:20 2026 Received: from mail-pl1-f197.google.com (mail-pl1-f197.google.com [209.85.214.197]) (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 045153BCD2C for ; Wed, 26 Aug 2026 09:18:15 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.197 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1787735899; cv=none; b=jRfp0QUf/RKxMF+wx6ZTZBYfvqfdbJffedeESuO/cf19LI4AK+MvZzurlqvgF+HX3O91nXCQ/M0MugnY3bZaHrnjQ1e7F+cFu9iEJuO2R2kgSrBcw1JsozSd/nKyG2alBhXl3jA6Gg6oKgYeB2ZlpSdHEsfLZ8yCLN0nqtCzg1Q= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1787735899; c=relaxed/simple; bh=PHg3HYJKZwblYL1XUgNEiIva+pGKLiIaEOzzYbN1rIU=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=jdgoFhvZPa4SkJ7Xg5H36D4ac4QeHlrLJZLw7PWuUF6kxwCoUo96dM1/JOcQ89waoN1r2vZzKjAktiHNu/e3q60RHMsamSaAZfzz7YbiJLOaBjZMJv9Ie9dsrqaslCMOet/Ad/5ZbgqUvhhjRDIJHXcVvnYqFHwd18Zpmko95Z0= 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=T+2v4Q1/; arc=none smtp.client-ip=209.85.214.197 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="T+2v4Q1/" Received: by mail-pl1-f197.google.com with SMTP id d9443c01a7336-2d02df2bf09so8161655ad.0 for ; Wed, 26 Aug 2026 02:18:15 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20251104; t=1787735894; x=1788340694; darn=vger.kernel.org; h=content-type:cc:to:from:subject:message-id:references:mime-version :in-reply-to:date:from:to:cc:subject:date:message-id:reply-to :content-type; bh=FBz9N4MFbqHkEOIZ4nKMBqouKjOi9Jg3kSfpTttXCxI=; b=T+2v4Q1/iW+vYuDqXqbdrKrxPIDJfR665b8a3AapLHooTA4WhBeWJalGq7Kvk8L7YU pSdc+qk08BSCPuxyotMrjBFYixbEeEH2yRmQAd2D7fAg04x0Tl11dkplejEl9As+Q+GK K1LEL04UsSgJpe6jjZuVDvpbpOM9o8ASpvD7K+hIkdAizrJdnxwnhF7oRbUlqdxAqZ4A sU3HN0GoeaJhKrjLNSzh2cFIxSbKgFtF5DyCywT/CRKq2tz8uhcJ7i5DrXni+Om6Jy/E pjhlm9Z6VQLwV0TyFFRpzSKrxmIRGVei1bJBn9bukVqzcAwhnTG/fsPrQTdVRXnnW3Ge G7cw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1787735894; x=1788340694; h=content-type: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:content-type; bh=FBz9N4MFbqHkEOIZ4nKMBqouKjOi9Jg3kSfpTttXCxI=; b=mXXQwvrOZLu/sUOvoGcUmE21YLMmJ5Um6nCBXkfeW3jEiXld+E/u8t+olADhINxxPF oapcAKB1vHtYFzlpK24B08YTF+ZrP9+45nB5azYcseDxQwroRaeHbl3ZvFVIEhHhTmHa Qleqfsbx3Pnz4lxNW7D9znkxc/1qKmdEuZFnc3Bq9hzEIN7/exF2RQh7ca5ISVkx8a9a 7KEJ55d7A9mjndTg3L7IIomWiSBR526RCahxp76vmy00AGEUMWk0lmxGPfw0qiQdfyNb i5ic6AL2wtt8QVjLPIg9F77eVvmsKTJ6+c7LbqyUNOc/jhwxXHD2p2cEyRw0MNVsFG+Y ujJQ== X-Forwarded-Encrypted: i=1; AHgh+RqHIiBm/ULGkh82uCHLUtH/z/jkW/7f610eBRPr8tb1HicjlO/MoGIT0x/4zw5oY2BtMbG9xKzCBJPCtCA=@vger.kernel.org X-Gm-Message-State: AFuF++mskvg0lEptbojGoblXBU7FQ81YOM7ZSFrdHGh4V/wKKxfnHc2O 0yO5swH6Ia6+aB/79oVt2i7P87+F5rintaQVZi7cUu1j8BaqvsasKLGrFvMYSm4t0o/BJLIoMK5 brqcUQ6ObS3l+yrV3MO4GrZOqDw== X-Received: from plv18.prod.google.com ([2002:a17:903:bd2:b0:2ca:b907:d842]) (user=ackerleytng job=prod-delivery.src-stubby-dispatcher) by 2002:a17:903:4b24:b0:2c9:9a2e:dab0 with SMTP id d9443c01a7336-2d707954e7amr92794715ad.3.1787735893912; Wed, 26 Aug 2026 02:18:13 -0700 (PDT) Date: Wed, 26 Aug 2026 09:18:02 +0000 In-Reply-To: <20260826-gmem-inplace-conversion-v11-0-0a15d8a799aa@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20260826-gmem-inplace-conversion-v11-0-0a15d8a799aa@google.com> X-Developer-Key: i=ackerleytng@google.com; a=ed25519; pk=sAZDYXdm6Iz8FHitpHeFlCMXwabodTm7p8/3/8xUxuU= X-Developer-Signature: v=1; a=ed25519-sha256; t=1787735885; l=8898; i=ackerleytng@google.com; s=20260225; h=from:subject:message-id; bh=hQPdfbzAcJ80Cu7pf4GOOlMLi8LkOym9DUQ6K7ygW88=; b=Mj2w5CpRm6N4W+MCTHfhjQSjmqnutb7zrhZNzMCgBzqdxU6jlb5t809lCBh5WWIiVPZvXZulc zV9OM+FTWayDcblR2qgsxFMI9EpxlNVZazn/9exm5KXRmu2JWMmhuBg X-Mailer: b4 0.16.0 Message-ID: <20260826-gmem-inplace-conversion-v11-4-0a15d8a799aa@google.com> Subject: [PATCH v11 04/46] 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, jmattson@google.com, jthoughton@google.com, michael.roth@amd.com, oupton@kernel.org, pankaj.gupta@amd.com, qperret@google.com, rick.p.edgecombe@intel.com, rientjes@google.com, shivankg@amd.com, steven.price@arm.com, willy@infradead.org, wyihan@google.com, yan.y.zhao@intel.com, forkloop@google.com, pratyush@kernel.org, suzuki.poulose@arm.com, aneesh.kumar@kernel.org, liam@infradead.org, Paolo Bonzini , Sean Christopherson , Thomas Gleixner , Ingo Molnar , Borislav Petkov , Dave Hansen , x86@kernel.org, "H. Peter Anvin" , Steven Rostedt , Masami Hiramatsu , Mathieu Desnoyers , Jonathan Corbet , Shuah Khan , Shuah Khan , Vishal Annapurve , Andrew Morton , Chris Li , Kairui Song , Kemeng Shi , Nhat Pham , Barry Song , Axel Rasmussen , Yuanchu Xie , Wei Xu , Youngjun Park , Qi Zheng , Shakeel Butt , Kiryl Shutsemau , Baoquan He , Jason Gunthorpe , John Hubbard , Peter Xu , tarunsahu@google.com, Fuad Tabba , Vlastimil Babka Cc: kvm@vger.kernel.org, linux-kernel@vger.kernel.org, linux-trace-kernel@vger.kernel.org, linux-doc@vger.kernel.org, linux-kselftest@vger.kernel.org, linux-mm@kvack.org, linux-coco@lists.linux.dev, Ackerley Tng , Xiaoyao Li 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 Reviewed-by: Fuad Tabba Reviewed-by: Xiaoyao Li Reviewed-by: Binbin Wu Tested-by: Shivank Garg Signed-off-by: Ackerley Tng --- 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 6beddd8a0c749..744c1f6ff03ed 100644 --- a/arch/x86/include/asm/kvm_host.h +++ b/arch/x86/include/asm/kvm_host.h @@ -1851,7 +1851,7 @@ enum kvm_intr_type { ((vcpu) && (vcpu)->arch.handling_intr_from_guest && \ (!!in_nmi() =3D=3D ((vcpu)->arch.handling_intr_from_guest =3D=3D KVM_HAN= DLING_NMI))) =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 #ifdef CONFIG_HAVE_KVM_ARCH_GMEM_CONVERT diff --git a/arch/x86/kvm/Kconfig b/arch/x86/kvm/Kconfig index 538ed1e803326..2f8e1b5a8a72c 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_CONVERT select HAVE_KVM_ARCH_GMEM_RECLAIM select HAVE_KVM_ARCH_GMEM_INVALIDATE diff --git a/arch/x86/kvm/mmu/mmu.c b/arch/x86/kvm/mmu/mmu.c index 947c9cd843450..b88c00e11854a 100644 --- a/arch/x86/kvm/mmu/mmu.c +++ b/arch/x86/kvm/mmu/mmu.c @@ -8097,7 +8097,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 4b3681796c752..29e41d334cedf 100644 --- a/arch/x86/kvm/x86.c +++ b/arch/x86/kvm/x86.c @@ -10140,7 +10140,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 b7516e19ef419..cffa16647f2ab 100644 --- a/include/linux/kvm_host.h +++ b/include/linux/kvm_host.h @@ -722,7 +722,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; @@ -872,7 +872,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 @@ -2560,7 +2560,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)); @@ -2582,7 +2582,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 c3c0ee253fc77..df575449d97b5 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 65eb26a0520d8..7d5325e3cb44b 100644 --- a/virt/kvm/kvm_main.c +++ b/virt/kvm/kvm_main.c @@ -1116,7 +1116,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 @@ -1301,7 +1301,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); @@ -2419,7 +2419,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)) @@ -2624,7 +2624,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) { @@ -4941,7 +4941,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 @@ -5345,7 +5345,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 @@ -5356,7 +5356,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.55.0.887.g758fc8c411-goog From nobody Mon Sep 28 04:51:20 2026 Received: from mail-pl1-f200.google.com (mail-pl1-f200.google.com [209.85.214.200]) (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 D30CD3BFAF2 for ; Wed, 26 Aug 2026 09:18:17 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.200 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1787735900; cv=none; b=rsGqa0RCykK7oYOanIyKNnCXXrD2l1iqrA7ZpaMyToQq8F0TOdmXKXWYTcyfGZPPSipGhLkWLnpQM0NsJmBPzj8dFS5C5zHyoSm3glh9thGcucg93Tc57DrUEg7lBw+YLmNCKs+2393NZLhYK1CV1VtO839FFtI+coB8Is8IegM= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1787735900; c=relaxed/simple; bh=mIzudRH3R8PElJ60G9cbne5ej0VMWxfhUV90F9mivPw=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=aF86yXdeWJ/J53FexRCa8DwcqXs2Soltfu1Z5RR8i0SWhjWj7aTWRDoSnuiIQfcBLsVYCWAn3AjjVTgUvdkapn/bQnXlzIwhS8sQ3pvgxVOB8jYnzUD8qB4NUH8mcSUsbclS81t33klvtQot/bRxOcpPx94OfHUgLWhi30KiVlo= 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=qszCAr1G; arc=none smtp.client-ip=209.85.214.200 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="qszCAr1G" Received: by mail-pl1-f200.google.com with SMTP id d9443c01a7336-2d7151120d6so5781575ad.3 for ; Wed, 26 Aug 2026 02:18:17 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20251104; t=1787735897; x=1788340697; darn=vger.kernel.org; h=content-type:cc:to:from:subject:message-id:references:mime-version :in-reply-to:date:from:to:cc:subject:date:message-id:reply-to :content-type; bh=TC3Eeg8HHmJGsEMhcB9JAjXxd+Sjyj6Ja2pFhCLMeNM=; b=qszCAr1GWb/i3x8LorGEDGjJazvNrDRmaXPTomdN1q3wjVxe4BelSnKUGgagXImXzw NutT9Yf/Ga9gjyw1pES00iH4W+nRQ+86jOMuALkZ2DlOPzLl6RK0KbKwpCfT3Mn9CFjE bK9ptaZMzb1V3FFqLfm0xgMgArfK6Xfv1YmEz/lCZsrGG9KLQ3QKk1kRLTynEtQ1PKzU F7o5vjiZSOEEcYcSz1VayREd3pcyoujWlrWuuHppiCW8wuZ1TfYrIodrVoJ0sxJzyAfN KiaMgy8n2e1zuAZCZ3AkoynSU9bShugff3rKrJiMVnjBQ+Gohx54kxE1JAWji179rNXZ hWBA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1787735897; x=1788340697; h=content-type: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:content-type; bh=TC3Eeg8HHmJGsEMhcB9JAjXxd+Sjyj6Ja2pFhCLMeNM=; b=DpmT+frPX6RIJrsIpq/Yoo4RlBBapd6UNSfxVNfdE3kICVKa/rtE/YCTLTyaCiOa6D qam1FTQOHyHwFoi1DPkXDs5hiog3heU8W/jZSBT3MOVhY6NPad4vs4d92BuQRkr3sc9w qlc7KTG9/80UwthH23cIcHEyVTNeZ4OeeNoyi4F/3KfnfQ3egU+O23bTRicEfTebTPcX M/szZOzQiMZ6yVsWw1BPC1OV/n5v8i84L92S21BudVwdahTjXYgvvc3ERtczfNTrJbHY R44r3HpVwkUwU9DwLcHkXRj/n3JlKI6ray7o0qDjz6E5OOYJCvyIaZahKV1SrRRnIzDD GoYQ== X-Forwarded-Encrypted: i=1; AHgh+RouqId5g6IHvsmvOhW213gDe76dfMnvnhPbMUCdUtV2zM4chj7hOtHf3/5+fcu1zfRNVaWcO9TfqFPnV8s=@vger.kernel.org X-Gm-Message-State: AFuF++kvUBGb/4AteY3Wtz9Zse/ZnCVXAn40kd+qJNWQskKM6aLPoxTi 17Hs5EeOrzC9tFaEE7KUGScY8B4KYVaKORBdUu0yYhgq+Xs61GF0xFe5EVJB7M8nk2gIaViR3Sz AqcjUj4eKACoCpppoQYvmSeVdog== X-Received: from plgd8.prod.google.com ([2002:a17:902:cec8:b0:2cc:c554:a93e]) (user=ackerleytng job=prod-delivery.src-stubby-dispatcher) by 2002:a17:902:f549:b0:2ca:481:de45 with SMTP id d9443c01a7336-2d707a501e5mr66214505ad.6.1787735895566; Wed, 26 Aug 2026 02:18:15 -0700 (PDT) Date: Wed, 26 Aug 2026 09:18:03 +0000 In-Reply-To: <20260826-gmem-inplace-conversion-v11-0-0a15d8a799aa@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20260826-gmem-inplace-conversion-v11-0-0a15d8a799aa@google.com> X-Developer-Key: i=ackerleytng@google.com; a=ed25519; pk=sAZDYXdm6Iz8FHitpHeFlCMXwabodTm7p8/3/8xUxuU= X-Developer-Signature: v=1; a=ed25519-sha256; t=1787735885; l=2388; i=ackerleytng@google.com; s=20260225; h=from:subject:message-id; bh=ogSExkBJJQ0shJgqMiTFGyZ7TdxK9ZVCrr3NofP4mmE=; b=1VX8N8uXNhbB64TEP35V6sDoTKXKwmyT3n8b5as3eYzSda3HxQRMrx3iH9t7mWRMGk60IOhnx 3126PLKu+/IAhStJ/lCMVD5ke3zv0gqVMqqbPje0NlXfe+BE1kamZ5b X-Mailer: b4 0.16.0 Message-ID: <20260826-gmem-inplace-conversion-v11-5-0a15d8a799aa@google.com> Subject: [PATCH v11 05/46] 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, jmattson@google.com, jthoughton@google.com, michael.roth@amd.com, oupton@kernel.org, pankaj.gupta@amd.com, qperret@google.com, rick.p.edgecombe@intel.com, rientjes@google.com, shivankg@amd.com, steven.price@arm.com, willy@infradead.org, wyihan@google.com, yan.y.zhao@intel.com, forkloop@google.com, pratyush@kernel.org, suzuki.poulose@arm.com, aneesh.kumar@kernel.org, liam@infradead.org, Paolo Bonzini , Sean Christopherson , Thomas Gleixner , Ingo Molnar , Borislav Petkov , Dave Hansen , x86@kernel.org, "H. Peter Anvin" , Steven Rostedt , Masami Hiramatsu , Mathieu Desnoyers , Jonathan Corbet , Shuah Khan , Shuah Khan , Vishal Annapurve , Andrew Morton , Chris Li , Kairui Song , Kemeng Shi , Nhat Pham , Barry Song , Axel Rasmussen , Yuanchu Xie , Wei Xu , Youngjun Park , Qi Zheng , Shakeel Butt , Kiryl Shutsemau , Baoquan He , Jason Gunthorpe , John Hubbard , Peter Xu , tarunsahu@google.com, Fuad Tabba , Vlastimil Babka Cc: kvm@vger.kernel.org, linux-kernel@vger.kernel.org, linux-trace-kernel@vger.kernel.org, linux-doc@vger.kernel.org, linux-kselftest@vger.kernel.org, linux-mm@kvack.org, linux-coco@lists.linux.dev, Ackerley Tng , Xiaoyao Li 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 tracking PRIVATE vs. SHARED state per-guest_memfd, not per-VM (to allow in-place conversion). guest_memfd support for memory attributes is expected to 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 by KVM at-large would result in a system-scope check (NULL @kvm) over-reporting support on arm64. Give architectures full control over overriding the default definition of kvm_arch_has_private_mem() by removing the coupling with CONFIG_KVM_VM_MEMORY_ATTRIBUTES. In a later patch, kvm_arch_has_private_mem() will be defined based on whether architectural features are compiled in, and made orthogonal to CONFIG_KVM_VM_MEMORY_ATTRIBUTES. Signed-off-by: Sean Christopherson Reviewed-by: Fuad Tabba Reviewed-by: Binbin Wu Tested-by: Shivank Garg Reviewed-by: Xiaoyao Li Signed-off-by: Ackerley Tng --- 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 cffa16647f2ab..b45fb80b0aca0 100644 --- a/include/linux/kvm_host.h +++ b/include/linux/kvm_host.h @@ -722,7 +722,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 7d5325e3cb44b..050757544a1cb 100644 --- a/virt/kvm/kvm_main.c +++ b/virt/kvm/kvm_main.c @@ -2422,8 +2422,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.55.0.887.g758fc8c411-goog From nobody Mon Sep 28 04:51:20 2026 Received: from mail-pg1-f198.google.com (mail-pg1-f198.google.com [209.85.215.198]) (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 9AFB93BD22F for ; Wed, 26 Aug 2026 09:18:19 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.215.198 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1787735904; cv=none; b=KQiqhNg5KSiLpMPN6vcpoFAlDAfkb43nhPbsPWJPSjAGH2nEAdHRlbzWfAd7X+mkZJUKkmoEqAkxAld1ZmlV65faTYaFNobiAizYQgZ5w2O1xEmZWOIIeh3IvuBD+PcoJFvuLWkXjFSndTkPQS/CP/K0L1EF4lzYTtsyYZ33I9c= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1787735904; c=relaxed/simple; bh=x7/jUCxI/FxpUs75UkqDlkPkk2RFkh3SPIK06Ac82cA=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=AyyOROlqBBJeCUkCuv6bSW8MKGEr6GL8Es9MXZCyJmEMPVDAMWRjLaJapl7wMpsQMVS2/QYUNtcmxeF+Mn6cCqet5QingVsGZguYI1xnD5RFecNyiuPeYOqOK9u4bHNSCxJWgh8wpglLhXeNv6Rk5CLfEG2oedefa+EstuX34Lc= 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=ZqfwEJBD; arc=none smtp.client-ip=209.85.215.198 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="ZqfwEJBD" Received: by mail-pg1-f198.google.com with SMTP id 41be03b00d2f7-ca6bd8a190cso1042684a12.0 for ; Wed, 26 Aug 2026 02:18:18 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20251104; t=1787735898; x=1788340698; darn=vger.kernel.org; h=content-type:cc:to:from:subject:message-id:references:mime-version :in-reply-to:date:from:to:cc:subject:date:message-id:reply-to :content-type; bh=VXOFbAvR9CFwlqoBiLg/DMTF/cTrNs6QB3JLriOW7Tc=; b=ZqfwEJBDRfMFMt1Mln4mhngKEWBVBkgZRYAg7sjv+37dP58zKShPcbkt+/UzOZE7nh FXV+Nezh2gdkSf6DmXCUA9MyE2dKBhTpD3hP3YI/ZhHF7UrEuCG5Pwz8R/vBBsahfFim CnAU/vbtWfM1+4woOl869418rL/zYs5GGYqOtwkVkEignD4wx1XsM6VFCK9J7lMGL3M3 UYApPSjdcbMuWfQy1F9UEC9rxqfrlyelokwyyH3hlvQEEj7OO8ArCu0AA5LrwgV8hGCI tI6ob7F6kTTtfgAFLpvT7B2EokYruUmlK4T1giUFQbjT6EUYqf402QTkTKLo4vPcghZX u7uQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1787735898; x=1788340698; h=content-type: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:content-type; bh=VXOFbAvR9CFwlqoBiLg/DMTF/cTrNs6QB3JLriOW7Tc=; b=U30aqZbVqePC/ezr3NHbm9eVs9Y2uJl5nQQUk2F8LpE8KJI2mKXafUXqPJeUaGci4V hwGyFGhaHdHICxrQjb9CeJAxeiEMguK1HU4aWpauaHimW93LNXN9gqCHiIE6zqNeUACi ntr56lbCi4Ry6Knr0zMRjtOUnx6exs71DrJr5n7yV+7VZHtWXryQeANUUjK3vr0qxa8G dP/MlaJjdzYfqWJnYIiNAnL+CfOb1/ZRFESc9FiTD5QYeddO7elN/XwVoti8mo9C3XDt Xc1BFupnnwVVZEzLFecjNfXVtGhU5l7sApElR0Tqip6eh1OoMYEnIgoZVrkh9ESJpGor Nu1A== X-Forwarded-Encrypted: i=1; AHgh+Rp0bUz+LoZaC4tCsHlD5K9zfEHpKmxk+ZI3S7HkB4L9VGMAk3JoNcXyrF0PoWkiskEyLqu2PGIhuof///Y=@vger.kernel.org X-Gm-Message-State: AFuF++ntQs0723JI9p/BvnBc+Tk8ZZT4hTeKTLcA4l/UQuTiGmmVvLXV VVIWeL6Xm71PrdRrmdZaOpoi5wM4Qa9phJt0dn2pNuGhcT+AiNukzlEbHpp3qZXYyRrlaze/s1L dd9J1ZXrhCulGmV18i4CwLtF/8A== X-Received: from pgce14.prod.google.com ([2002:a05:6a02:1ce:b0:c9e:3c0b:5818]) (user=ackerleytng job=prod-delivery.src-stubby-dispatcher) by 2002:a05:6a21:6110:b0:3c3:a140:9392 with SMTP id adf61e73a8af0-3cf65e236a2mr11811035637.0.1787735897575; Wed, 26 Aug 2026 02:18:17 -0700 (PDT) Date: Wed, 26 Aug 2026 09:18:04 +0000 In-Reply-To: <20260826-gmem-inplace-conversion-v11-0-0a15d8a799aa@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20260826-gmem-inplace-conversion-v11-0-0a15d8a799aa@google.com> X-Developer-Key: i=ackerleytng@google.com; a=ed25519; pk=sAZDYXdm6Iz8FHitpHeFlCMXwabodTm7p8/3/8xUxuU= X-Developer-Signature: v=1; a=ed25519-sha256; t=1787735885; l=10021; i=ackerleytng@google.com; s=20260225; h=from:subject:message-id; bh=xUTR+KBThxIL2VCY+rMmkFcBUSeCA9bg9Znh3WlP2BE=; b=phNGPU6RaIIi7Yysjmn2Yai4fsOrF9ZD48sQMI2wD7rCP8bn0JGHxxnBB0E0/dsD2HaHdWwUn Hpordy+nL24ANiwgM5xb4wK/6VyuNo+N3pcTMNM3ENXbi1x0UJCqfFV X-Mailer: b4 0.16.0 Message-ID: <20260826-gmem-inplace-conversion-v11-6-0a15d8a799aa@google.com> Subject: [PATCH v11 06/46] KVM: Rename memory attribute APIs to prepare for in-place gmem 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, jmattson@google.com, jthoughton@google.com, michael.roth@amd.com, oupton@kernel.org, pankaj.gupta@amd.com, qperret@google.com, rick.p.edgecombe@intel.com, rientjes@google.com, shivankg@amd.com, steven.price@arm.com, willy@infradead.org, wyihan@google.com, yan.y.zhao@intel.com, forkloop@google.com, pratyush@kernel.org, suzuki.poulose@arm.com, aneesh.kumar@kernel.org, liam@infradead.org, Paolo Bonzini , Sean Christopherson , Thomas Gleixner , Ingo Molnar , Borislav Petkov , Dave Hansen , x86@kernel.org, "H. Peter Anvin" , Steven Rostedt , Masami Hiramatsu , Mathieu Desnoyers , Jonathan Corbet , Shuah Khan , Shuah Khan , Vishal Annapurve , Andrew Morton , Chris Li , Kairui Song , Kemeng Shi , Nhat Pham , Barry Song , Axel Rasmussen , Yuanchu Xie , Wei Xu , Youngjun Park , Qi Zheng , Shakeel Butt , Kiryl Shutsemau , Baoquan He , Jason Gunthorpe , John Hubbard , Peter Xu , tarunsahu@google.com, Fuad Tabba , Vlastimil Babka Cc: kvm@vger.kernel.org, linux-kernel@vger.kernel.org, linux-trace-kernel@vger.kernel.org, linux-doc@vger.kernel.org, linux-kselftest@vger.kernel.org, linux-mm@kvack.org, linux-coco@lists.linux.dev, Ackerley Tng , Xiaoyao Li Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable From: Sean Christopherson Rename memory attribute APIs to add a "vm_" in the name in anticipation of moving PRIVATE tracking into guest_memfd, to allow in-place conversion between SHARED and PRIVATE. At that point, there will effectively be two (potential) sources of memory attributes: the VM and guest_memfd. kvm_vm_set_mem_attributes() already has "vm" in the name to indicate that it is a VM ioctl. Rename it to kvm_set_vm_mem_attributes() to show that it is setting the VM's memory attributes. (Drop the VM-ioctl scoping since it is a helper local to the file.) Update the accompanying trace function to match. No functional change intended. Signed-off-by: Sean Christopherson Reviewed-by: Fuad Tabba Tested-by: Shivank Garg Reviewed-by: Xiaoyao Li Reviewed-by: Binbin Wu Signed-off-by: Ackerley Tng --- arch/x86/kvm/mmu/mmu.c | 14 +++++++------- include/linux/kvm_host.h | 16 ++++++++-------- include/trace/events/kvm.h | 2 +- virt/kvm/kvm_main.c | 32 ++++++++++++++++---------------- 4 files changed, 32 insertions(+), 32 deletions(-) diff --git a/arch/x86/kvm/mmu/mmu.c b/arch/x86/kvm/mmu/mmu.c index b88c00e11854a..10e59507d252f 100644 --- a/arch/x86/kvm/mmu/mmu.c +++ b/arch/x86/kvm/mmu/mmu.c @@ -8116,8 +8116,8 @@ static void hugepage_set_mixed(struct kvm_memory_slot= *slot, gfn_t gfn, lpage_info_slot(gfn, slot, level)->disallow_lpage |=3D KVM_LPAGE_MIXED_FL= AG; } =20 -bool kvm_arch_pre_set_memory_attributes(struct kvm *kvm, - struct kvm_gfn_range *range) +bool kvm_arch_pre_set_vm_memory_attributes(struct kvm *kvm, + struct kvm_gfn_range *range) { struct kvm_memory_slot *slot =3D range->slot; int level; @@ -8186,18 +8186,18 @@ static bool hugepage_has_attrs(struct kvm *kvm, str= uct 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) || - attrs !=3D kvm_get_memory_attributes(kvm, gfn)) + attrs !=3D kvm_get_vm_memory_attributes(kvm, gfn)) return false; } return true; } =20 -bool kvm_arch_post_set_memory_attributes(struct kvm *kvm, - struct kvm_gfn_range *range) +bool kvm_arch_post_set_vm_memory_attributes(struct kvm *kvm, + struct kvm_gfn_range *range) { unsigned long attrs =3D range->arg.attributes; struct kvm_memory_slot *slot =3D range->slot; @@ -8290,7 +8290,7 @@ void kvm_mmu_init_memslot_memory_attributes(struct kv= m *kvm, * be manually checked as the attributes may already be mixed. */ for (gfn =3D start; gfn < end; gfn +=3D nr_pages) { - unsigned long attrs =3D kvm_get_memory_attributes(kvm, gfn); + unsigned long attrs =3D kvm_get_vm_memory_attributes(kvm, gfn); =20 if (hugepage_has_attrs(kvm, slot, gfn, level, attrs)) hugepage_clear_mixed(slot, gfn, level); diff --git a/include/linux/kvm_host.h b/include/linux/kvm_host.h index b45fb80b0aca0..6ca81f5349db8 100644 --- a/include/linux/kvm_host.h +++ b/include/linux/kvm_host.h @@ -2561,21 +2561,21 @@ static inline bool kvm_memslot_is_gmem_only(const s= truct kvm_memory_slot *slot) } =20 #ifdef CONFIG_KVM_VM_MEMORY_ATTRIBUTES -static inline unsigned long kvm_get_memory_attributes(struct kvm *kvm, gfn= _t gfn) +static inline unsigned long kvm_get_vm_memory_attributes(struct kvm *kvm, = gfn_t gfn) { return xa_to_value(xa_load(&kvm->mem_attr_array, 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); +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_vm_memory_attributes(struct kvm *kvm, + struct kvm_gfn_range *range); +bool kvm_arch_post_set_vm_memory_attributes(struct kvm *kvm, + struct kvm_gfn_range *range); =20 static inline bool kvm_mem_is_private(struct kvm *kvm, gfn_t gfn) { - return kvm_get_memory_attributes(kvm, gfn) & KVM_MEMORY_ATTRIBUTE_PRIVATE; + return kvm_get_vm_memory_attributes(kvm, gfn) & KVM_MEMORY_ATTRIBUTE_PRIV= ATE; } #else static inline bool kvm_mem_is_private(struct kvm *kvm, gfn_t gfn) diff --git a/include/trace/events/kvm.h b/include/trace/events/kvm.h index 1ba72bd73ea2f..c4d514d2350cf 100644 --- a/include/trace/events/kvm.h +++ b/include/trace/events/kvm.h @@ -364,7 +364,7 @@ TRACE_EVENT(kvm_dirty_ring_exit, * @end: End address of guest memory range * @attr: The value of the attribute being set. */ -TRACE_EVENT(kvm_vm_set_mem_attributes, +TRACE_EVENT(kvm_set_vm_mem_attributes, TP_PROTO(gfn_t start, gfn_t end, unsigned long attr), TP_ARGS(start, end, attr), =20 diff --git a/virt/kvm/kvm_main.c b/virt/kvm/kvm_main.c index 050757544a1cb..91d5af7d60d0f 100644 --- a/virt/kvm/kvm_main.c +++ b/virt/kvm/kvm_main.c @@ -2420,7 +2420,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 -static u64 kvm_supported_mem_attributes(struct kvm *kvm) +static u64 kvm_supported_vm_mem_attributes(struct kvm *kvm) { #ifdef kvm_arch_has_private_mem if (!kvm || kvm_arch_has_private_mem(kvm)) @@ -2434,19 +2434,19 @@ static u64 kvm_supported_mem_attributes(struct kvm = *kvm) * 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, - unsigned long mask, unsigned long attrs) +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); unsigned long index; void *entry; =20 - mask &=3D kvm_supported_mem_attributes(kvm); + mask &=3D kvm_supported_vm_mem_attributes(kvm); if (attrs & ~mask) return false; =20 if (end =3D=3D start + 1) - return (kvm_get_memory_attributes(kvm, start) & mask) =3D=3D attrs; + return (kvm_get_vm_memory_attributes(kvm, start) & mask) =3D=3D attrs; =20 guard(rcu)(); if (!attrs) @@ -2517,8 +2517,8 @@ static __always_inline void kvm_handle_gfn_range(stru= ct kvm *kvm, KVM_MMU_UNLOCK(kvm); } =20 -static bool kvm_pre_set_memory_attributes(struct kvm *kvm, - struct kvm_gfn_range *range) +static bool kvm_pre_set_vm_memory_attributes(struct kvm *kvm, + struct kvm_gfn_range *range) { /* * Unconditionally add the range to the invalidation set, regardless of @@ -2533,18 +2533,18 @@ static bool kvm_pre_set_memory_attributes(struct kv= m *kvm, */ kvm_mmu_invalidate_range_add(kvm, range->start, range->end); =20 - return kvm_arch_pre_set_memory_attributes(kvm, range); + return kvm_arch_pre_set_vm_memory_attributes(kvm, range); } =20 /* Set @attributes for the gfn range [@start, @end). */ -static int kvm_vm_set_mem_attributes(struct kvm *kvm, gfn_t start, gfn_t e= nd, +static int kvm_set_vm_mem_attributes(struct kvm *kvm, gfn_t start, gfn_t e= nd, unsigned long attributes) { struct kvm_mmu_notifier_range pre_set_range =3D { .start =3D start, .end =3D end, .arg.attributes =3D attributes, - .handler =3D kvm_pre_set_memory_attributes, + .handler =3D kvm_pre_set_vm_memory_attributes, .on_lock =3D kvm_mmu_invalidate_start, .flush_on_ret =3D true, .may_block =3D true, @@ -2553,7 +2553,7 @@ static int kvm_vm_set_mem_attributes(struct kvm *kvm,= gfn_t start, gfn_t end, .start =3D start, .end =3D end, .arg.attributes =3D attributes, - .handler =3D kvm_arch_post_set_memory_attributes, + .handler =3D kvm_arch_post_set_vm_memory_attributes, .on_lock =3D kvm_mmu_invalidate_end, .may_block =3D true, }; @@ -2563,12 +2563,12 @@ static int kvm_vm_set_mem_attributes(struct kvm *kv= m, gfn_t start, gfn_t end, =20 entry =3D attributes ? xa_mk_value(attributes) : NULL; =20 - trace_kvm_vm_set_mem_attributes(start, end, attributes); + trace_kvm_set_vm_mem_attributes(start, end, attributes); =20 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 /* @@ -2607,7 +2607,7 @@ static int kvm_vm_ioctl_set_mem_attributes(struct kvm= *kvm, /* flags is currently not used. */ if (attrs->flags) return -EINVAL; - if (attrs->attributes & ~kvm_supported_mem_attributes(kvm)) + if (attrs->attributes & ~kvm_supported_vm_mem_attributes(kvm)) return -EINVAL; if (attrs->size =3D=3D 0 || attrs->address + attrs->size < attrs->address) return -EINVAL; @@ -2624,7 +2624,7 @@ static int kvm_vm_ioctl_set_mem_attributes(struct kvm= *kvm, */ BUILD_BUG_ON(sizeof(attrs->attributes) !=3D sizeof(unsigned long)); =20 - return kvm_vm_set_mem_attributes(kvm, start, end, attrs->attributes); + return kvm_set_vm_mem_attributes(kvm, start, end, attrs->attributes); } #endif /* CONFIG_KVM_VM_MEMORY_ATTRIBUTES */ =20 @@ -4945,7 +4945,7 @@ 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: - return kvm_supported_mem_attributes(kvm); + return kvm_supported_vm_mem_attributes(kvm); #endif #ifdef CONFIG_KVM_GUEST_MEMFD case KVM_CAP_GUEST_MEMFD: --=20 2.55.0.887.g758fc8c411-goog From nobody Mon Sep 28 04:51:20 2026 Received: from mail-pf1-f199.google.com (mail-pf1-f199.google.com [209.85.210.199]) (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 DA6A93BFAED for ; Wed, 26 Aug 2026 09:18:21 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.210.199 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1787735905; cv=none; b=tRYw+0HmFt0VCLhdDtv0OFqCZH7UyXEN1ufVf0zLm9z9QDUfx6mozjLUlrUszgkcSC4QedZT8nwTYFx+bm/7/eBc/TGSD/QjcvCtLcM72chvSRxii+C/1itrFqzNZO+zVzw0KU6I8s/iunwyZ1XXfDhiMq9MMT2qMEf5AZBS/7g= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1787735905; c=relaxed/simple; bh=adODHppsIc1wwdLxXXaubDfwAX6RazWFw20vgvX1ukU=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=TFQQNaC2tBXWxAj3pCItMjLBwu/r7f+CpDn58CH4wSacUJn/yOJJzXDKbKPwzaAlz3QEmD+A1HGdLQ3Izzy/7y5uoswa+Ee9agVVZxDqrdvHwbPzb9+xjIhNexfVJEqWLE3IBBNNeTSOrM2A9VvOxMIgAwo+rHWfxtHexEC7SU4= 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=CXXr6aFN; arc=none smtp.client-ip=209.85.210.199 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="CXXr6aFN" Received: by mail-pf1-f199.google.com with SMTP id d2e1a72fcca58-84eee2147ffso1060625b3a.0 for ; Wed, 26 Aug 2026 02:18:21 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20251104; t=1787735900; x=1788340700; darn=vger.kernel.org; h=content-type:cc:to:from:subject:message-id:references:mime-version :in-reply-to:date:from:to:cc:subject:date:message-id:reply-to :content-type; bh=t8ccBHCM5YU+7L1JIoIBmJzcK+1OP4Tx7QbvPF9cByU=; b=CXXr6aFNQY6cimAxNlr3eCDyadWbaJg70FQ8eUYCAN1CjWZJjW0nQci4j+1ghbrHSF 3VB2PnomVvjYlYJVazhkYE0gafXyLQjWWmh0jP81Yuh7s0Y/qdpB/NnWqarfWAK7/w6/ GER4w7v2KO/5CxYdE5yQgBT6uwN+Ma0WPYvW7AqaO9KlnwGVmAyPaYkDnF0gUtLhApS9 R+qGtYFo71S/QSyNmbFLG59hBtqnDgqLTMS4xMwYpZ2UZLcXugJJuVojXCMPcSuJuV8+ qk2O5YDaFHRlmHWfZ7fYINGrUllHv4zaUvqs1FeGhFouqIsoH1KwY6yNXc39B7V7CSIi T7pw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1787735900; x=1788340700; h=content-type: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:content-type; bh=t8ccBHCM5YU+7L1JIoIBmJzcK+1OP4Tx7QbvPF9cByU=; b=Pj97TPjzOxbLEr/j7VnMlsJqKsyp0cDGIBRCCb6xXgOAaF/PC6uzM9a0MuOyoehCUh 4V0zv+YRb9xudAHceQuBwYhphx5lx/d3505JNSFKqkkMZzO8974y++Rr6YDqfNpHLjpA S2SuO1BXKHJvipom7nCshuva2MeafPCnLVpdLGif4HGAwglkCB3iN/fKdYUccnj+NLal BeZIJziDBzPiBEQhvEBQfPCP2u/jAsAakK3b2D4nFRNBGrx4yrsOHSGt2OjZDQq/sSZd iGAcAkELz+L8Y0djxYg4+JutW/xnjWfUnNTQu43519YcdICddTVn7wX91ol1KJJFlWqX KF/A== X-Forwarded-Encrypted: i=1; AHgh+RoePWHBPuV/SOy+DjxguFlmvW2yk7nItrU6+fXPrBz4x03ZzKZ8J7oG8KGqDX1RuOl9pIgLkNu9HP8CCMk=@vger.kernel.org X-Gm-Message-State: AFuF++mYPGnane1hUF/xRkMaxH0MtDhB95gEY+77sVUiiIbvNZSSoJ3O ZgjdahBe18IV9DDp6uiQDknQajwXmITIGCXJJJyPYYtIFBdsFyCnuhi4u6Yg0P7mtzjJEJ4C3Re lGIR4QmjHy++dOSuPOBFN5caA9A== X-Received: from pgmc3.prod.google.com ([2002:a63:1c43:0:b0:c9e:a22d:15e8]) (user=ackerleytng job=prod-delivery.src-stubby-dispatcher) by 2002:a05:6a00:1392:b0:852:131f:b9d2 with SMTP id d2e1a72fcca58-853721a4ffamr9144251b3a.2.1787735899281; Wed, 26 Aug 2026 02:18:19 -0700 (PDT) Date: Wed, 26 Aug 2026 09:18:05 +0000 In-Reply-To: <20260826-gmem-inplace-conversion-v11-0-0a15d8a799aa@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20260826-gmem-inplace-conversion-v11-0-0a15d8a799aa@google.com> X-Developer-Key: i=ackerleytng@google.com; a=ed25519; pk=sAZDYXdm6Iz8FHitpHeFlCMXwabodTm7p8/3/8xUxuU= X-Developer-Signature: v=1; a=ed25519-sha256; t=1787735885; l=4963; i=ackerleytng@google.com; s=20260225; h=from:subject:message-id; bh=adODHppsIc1wwdLxXXaubDfwAX6RazWFw20vgvX1ukU=; b=qAec0tsGFxGYk1SoSRFBiiuqAJZEJlc7qzpxmaWzfOGs28joKteKQEPT49Se3lIk9vstlpjPB 7Av3Au/QmG8ApmYCsv64FqojNn5zmavT5iPhsNBkXGeY43AYhlcl7lG X-Mailer: b4 0.16.0 Message-ID: <20260826-gmem-inplace-conversion-v11-7-0a15d8a799aa@google.com> Subject: [PATCH v11 07/46] KVM: Rename kvm_mem_is_private() to kvm_is_private_gfn() 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, jmattson@google.com, jthoughton@google.com, michael.roth@amd.com, oupton@kernel.org, pankaj.gupta@amd.com, qperret@google.com, rick.p.edgecombe@intel.com, rientjes@google.com, shivankg@amd.com, steven.price@arm.com, willy@infradead.org, wyihan@google.com, yan.y.zhao@intel.com, forkloop@google.com, pratyush@kernel.org, suzuki.poulose@arm.com, aneesh.kumar@kernel.org, liam@infradead.org, Paolo Bonzini , Sean Christopherson , Thomas Gleixner , Ingo Molnar , Borislav Petkov , Dave Hansen , x86@kernel.org, "H. Peter Anvin" , Steven Rostedt , Masami Hiramatsu , Mathieu Desnoyers , Jonathan Corbet , Shuah Khan , Shuah Khan , Vishal Annapurve , Andrew Morton , Chris Li , Kairui Song , Kemeng Shi , Nhat Pham , Barry Song , Axel Rasmussen , Yuanchu Xie , Wei Xu , Youngjun Park , Qi Zheng , Shakeel Butt , Kiryl Shutsemau , Baoquan He , Jason Gunthorpe , John Hubbard , Peter Xu , tarunsahu@google.com, Fuad Tabba , Vlastimil Babka Cc: kvm@vger.kernel.org, linux-kernel@vger.kernel.org, linux-trace-kernel@vger.kernel.org, linux-doc@vger.kernel.org, linux-kselftest@vger.kernel.org, linux-mm@kvack.org, linux-coco@lists.linux.dev, Ackerley Tng Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Rename kvm_mem_is_private() to kvm_is_private_gfn() to prepare for in-place conversion, where there will be two lookup functions, kvm_vm_is_private_gfn() and kvm_gmem_is_private_gfn(). This renaming allows consistent prefixing of "vm" vs "gmem" for kvm_*_is_private_gfn(), as opposed to kvm_gmem_mem_is_private(), which looks like a typo. Suggested-by: Sean Christopherson Signed-off-by: Ackerley Tng --- arch/x86/kvm/mmu/mmu.c | 12 ++++++------ arch/x86/kvm/svm/sev.c | 2 +- include/linux/kvm_host.h | 4 ++-- virt/kvm/guest_memfd.c | 2 +- 4 files changed, 10 insertions(+), 10 deletions(-) diff --git a/arch/x86/kvm/mmu/mmu.c b/arch/x86/kvm/mmu/mmu.c index 10e59507d252f..62f751952ad8a 100644 --- a/arch/x86/kvm/mmu/mmu.c +++ b/arch/x86/kvm/mmu/mmu.c @@ -3421,7 +3421,7 @@ int kvm_mmu_max_mapping_level(struct kvm *kvm, struct= kvm_page_fault *fault, is_private =3D fault->is_private; } else { max_level =3D PG_LEVEL_NUM; - is_private =3D kvm_mem_is_private(kvm, gfn); + is_private =3D kvm_is_private_gfn(kvm, gfn); } =20 max_level =3D min(max_level, max_huge_page_level); @@ -3634,13 +3634,13 @@ static bool page_fault_can_be_fast(struct kvm *kvm,= struct kvm_page_fault *fault * guest spinning on a #PF indefinitely, so don't attempt the fast path * in this case. * - * Note that the kvm_mem_is_private() check might race with an + * Note that the kvm_is_private_gfn() check might race with an * attribute update, but this will either result in the guest spinning * on RET_PF_SPURIOUS until the update completes, or an actual spurious * case might go down the slow path. Either case will resolve itself. */ if (kvm->arch.has_private_mem && - fault->is_private !=3D kvm_mem_is_private(kvm, fault->gfn)) + fault->is_private !=3D kvm_is_private_gfn(kvm, fault->gfn)) return false; =20 /* @@ -4708,7 +4708,7 @@ static int kvm_mmu_faultin_pfn(struct kvm_vcpu *vcpu, * Now that we have a snapshot of mmu_invalidate_seq we can check for a * private vs. shared mismatch. */ - if (fault->is_private !=3D kvm_mem_is_private(kvm, fault->gfn)) { + if (fault->is_private !=3D kvm_is_private_gfn(kvm, fault->gfn)) { kvm_mmu_prepare_memory_fault_exit(vcpu, fault); return -EFAULT; } @@ -5111,7 +5111,7 @@ long kvm_arch_vcpu_pre_fault_memory(struct kvm_vcpu *= vcpu, =20 direct_bits =3D 0; if (kvm_arch_has_private_mem(vcpu->kvm) && - kvm_mem_is_private(vcpu->kvm, gpa_to_gfn(range->gpa))) + kvm_is_private_gfn(vcpu->kvm, gpa_to_gfn(range->gpa))) error_code |=3D PFERR_PRIVATE_ACCESS; else direct_bits =3D gfn_to_gpa(kvm_gfn_direct_bits(vcpu->kvm)); @@ -6584,7 +6584,7 @@ int noinline kvm_mmu_page_fault(struct kvm_vcpu *vcpu= , gpa_t cr2_or_gpa, u64 err if (IS_ENABLED(CONFIG_KVM_SW_PROTECTED_VM) && !(error_code & PFERR_RSVD_MASK) && vcpu->kvm->arch.vm_type =3D=3D KVM_X86_SW_PROTECTED_VM && - kvm_mem_is_private(vcpu->kvm, gpa_to_gfn(cr2_or_gpa))) + kvm_is_private_gfn(vcpu->kvm, gpa_to_gfn(cr2_or_gpa))) error_code |=3D PFERR_PRIVATE_ACCESS; =20 r =3D RET_PF_INVALID; diff --git a/arch/x86/kvm/svm/sev.c b/arch/x86/kvm/svm/sev.c index 0a887f8e05d3a..dff684b88f153 100644 --- a/arch/x86/kvm/svm/sev.c +++ b/arch/x86/kvm/svm/sev.c @@ -5030,7 +5030,7 @@ void sev_handle_rmp_fault(struct kvm_vcpu *vcpu, gpa_= t gpa, u64 error_code) * userspace via KVM_EXIT_MEMORY_FAULT events, however, so RMP faults * for shared pages should not end up here. */ - if (!kvm_mem_is_private(kvm, gfn)) { + if (!kvm_is_private_gfn(kvm, gfn)) { pr_warn_ratelimited("SEV: Unexpected RMP fault for non-private GPA 0x%ll= x\n", gpa); return; diff --git a/include/linux/kvm_host.h b/include/linux/kvm_host.h index 6ca81f5349db8..9b97266f61ec8 100644 --- a/include/linux/kvm_host.h +++ b/include/linux/kvm_host.h @@ -2573,12 +2573,12 @@ bool kvm_arch_pre_set_vm_memory_attributes(struct k= vm *kvm, bool kvm_arch_post_set_vm_memory_attributes(struct kvm *kvm, struct kvm_gfn_range *range); =20 -static inline bool kvm_mem_is_private(struct kvm *kvm, gfn_t gfn) +static inline bool kvm_is_private_gfn(struct kvm *kvm, gfn_t gfn) { return kvm_get_vm_memory_attributes(kvm, gfn) & KVM_MEMORY_ATTRIBUTE_PRIV= ATE; } #else -static inline bool kvm_mem_is_private(struct kvm *kvm, gfn_t gfn) +static inline bool kvm_is_private_gfn(struct kvm *kvm, gfn_t gfn) { return false; } diff --git a/virt/kvm/guest_memfd.c b/virt/kvm/guest_memfd.c index 154fc9622640d..b9fee68c90311 100644 --- a/virt/kvm/guest_memfd.c +++ b/virt/kvm/guest_memfd.c @@ -879,7 +879,7 @@ static long __kvm_gmem_populate(struct kvm *kvm, struct= kvm_memory_slot *slot, =20 folio_unlock(folio); =20 - if (!kvm_mem_is_private(kvm, gfn)) { + if (!kvm_is_private_gfn(kvm, gfn)) { ret =3D -EINVAL; goto out_put_folio; } --=20 2.55.0.887.g758fc8c411-goog From nobody Mon Sep 28 04:51:20 2026 Received: from mail-pl1-f198.google.com (mail-pl1-f198.google.com [209.85.214.198]) (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 CD9FF3C13E0 for ; Wed, 26 Aug 2026 09:18:23 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.198 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1787735906; cv=none; b=YT26IpwxHSKPoXQt/2CGEmfNlE4eMsem9OTpGxAGE/abTclqdvjknZkEoUxXlNqf98wg4WxkveqXGlegRQZxq9MyxApPv2cE+D1pdAPUcIS8H17nIxHePjinPSTxyR1JQoxjlJ5Oy4IKY+PDZchHFenGFABbnQ/CbvX7lig6o3A= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1787735906; c=relaxed/simple; bh=VvxOQ+1qgozXGsDN24yFoiXB70BiDrOwXWGmg7dflZ0=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=f3HVffO3UdUhyRs1SyK6QclHaJM9Mz86cbyXN25WONyqplmu+kzTTsU1Ac/qbLiDjMksAO0uFGrpMYI6NpbW3nzKP1zSdYDX6QDi6PrYD1zOdwbBkPE2pXM/xP+FdMoem9rd81D0UN1F6srnmRVP7odgm0r8pbv9JUZVVfxvEMA= 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=p1QNf7tm; arc=none smtp.client-ip=209.85.214.198 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="p1QNf7tm" Received: by mail-pl1-f198.google.com with SMTP id d9443c01a7336-2d52734fc41so17657435ad.1 for ; Wed, 26 Aug 2026 02:18:22 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20251104; t=1787735901; x=1788340701; darn=vger.kernel.org; h=content-type:cc:to:from:subject:message-id:references:mime-version :in-reply-to:date:from:to:cc:subject:date:message-id:reply-to :content-type; bh=g2wiHnbE+Ij1tQvsnQSqnQTpOXXjEOrAZMWxy0XisNw=; b=p1QNf7tmUOCrqFUkik4eJIL99zGu5RBI7+t4hGPAAv+/m01iB3d32sJT9Ni2ITUkE7 5dsNxENoqstmmgKNP+87qAzH/YlSChBQEUA2MKgwnOzPHlFWLcddJ1RCUtKU0xeKMvJ5 ob0zh+RNwe6cHRpxXLSoHjsg4WlcmJ2EYmASP9FujkKwWtEL1mblFdtXWx0zH0t161qe XzhfA1hz55fbIVVcRC9NOZ84q6JsSDRJUX7Hag/ZwDnLpmg9KRISxZQqIfHppdVoSWhL F4dMUUenkPlW45kseKgxuC+8ssyqTulIGNPsv6AHoAoN2WUZB7Fl1WkDFjQoQFwTMCRF LoxQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1787735901; x=1788340701; h=content-type: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:content-type; bh=g2wiHnbE+Ij1tQvsnQSqnQTpOXXjEOrAZMWxy0XisNw=; b=bRs/Sqk+/dOFizzUGySU/d/+Dt3mv6nXsy+OKFaq0uTrBcYnJeBra5bgXFxNDLCdyd 7EhwUn/u9eFyGXLwmv7pD3Fdepb1sDDxuXHMmr89WJihHTQYcZ/RdjWbdNdzPMUjYPB1 rkW9OxIQZF2XG1ktqCgBEWaux1sWkHJV53vgbU5UcfItPVD1aK/iVIYc3ObKBCVVL9JT dluUSMj2jGpqUz440tkKKLGWX5MZzuA3gWqe1K3QUXzKdC4HWnH9ZGO/YQT1r4rSuuDu TYbyjqQP6XjOTDnj6z+EQoYhsEeRF0kyERm6vKRHFdIffS5ObqAE00epr79e41cMvFz7 L0Dw== X-Forwarded-Encrypted: i=1; AHgh+RrgDGhmVCLGYHS4yhYH3BSYsSBelGDnaVf3nLCKvUJd0oVI+Vk6NNMmQ9TyNQv8nZiT3rhpsuAy9pbYlIk=@vger.kernel.org X-Gm-Message-State: AFuF++lKk60RhVs/t6COpJk+ACkH7vaIPoPmu6goSY4opFsBixVeDUZu 4P2FLb7Wm4YelhA2xhU2SjNbkoPAAOrNAg8f/dIvoBNwDennrvilZNMyhzIutx1HtNXuB3CdBBw LGBVsH9hImCC7YPIi33grNDDaMw== X-Received: from plbmz11.prod.google.com ([2002:a17:903:350b:b0:2ca:cbc9:76fd]) (user=ackerleytng job=prod-delivery.src-stubby-dispatcher) by 2002:a17:903:38c8:b0:2d5:ccb7:12c3 with SMTP id d9443c01a7336-2d7079579a8mr85171415ad.2.1787735901060; Wed, 26 Aug 2026 02:18:21 -0700 (PDT) Date: Wed, 26 Aug 2026 09:18:06 +0000 In-Reply-To: <20260826-gmem-inplace-conversion-v11-0-0a15d8a799aa@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20260826-gmem-inplace-conversion-v11-0-0a15d8a799aa@google.com> X-Developer-Key: i=ackerleytng@google.com; a=ed25519; pk=sAZDYXdm6Iz8FHitpHeFlCMXwabodTm7p8/3/8xUxuU= X-Developer-Signature: v=1; a=ed25519-sha256; t=1787735885; l=3261; i=ackerleytng@google.com; s=20260225; h=from:subject:message-id; bh=MYp0jcv/vyqcAp2jfObXcS1n8zbY2OhrXS0jgL07qmI=; b=OjjqRhEDO3WNi+cijL7f8lpbM+OYCuVBl/W4q/2CiXbz6fOaq/lU1MP9wqHNLxp82huANiFAg XO5HfFH8jJwBqR2M0mKoQUKWsQqP9fUpPRG2nMdyg4DpIjwzDgaVUTk X-Mailer: b4 0.16.0 Message-ID: <20260826-gmem-inplace-conversion-v11-8-0a15d8a799aa@google.com> Subject: [PATCH v11 08/46] KVM: Provide generic interface for checking memory private/shared 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, jmattson@google.com, jthoughton@google.com, michael.roth@amd.com, oupton@kernel.org, pankaj.gupta@amd.com, qperret@google.com, rick.p.edgecombe@intel.com, rientjes@google.com, shivankg@amd.com, steven.price@arm.com, willy@infradead.org, wyihan@google.com, yan.y.zhao@intel.com, forkloop@google.com, pratyush@kernel.org, suzuki.poulose@arm.com, aneesh.kumar@kernel.org, liam@infradead.org, Paolo Bonzini , Sean Christopherson , Thomas Gleixner , Ingo Molnar , Borislav Petkov , Dave Hansen , x86@kernel.org, "H. Peter Anvin" , Steven Rostedt , Masami Hiramatsu , Mathieu Desnoyers , Jonathan Corbet , Shuah Khan , Shuah Khan , Vishal Annapurve , Andrew Morton , Chris Li , Kairui Song , Kemeng Shi , Nhat Pham , Barry Song , Axel Rasmussen , Yuanchu Xie , Wei Xu , Youngjun Park , Qi Zheng , Shakeel Butt , Kiryl Shutsemau , Baoquan He , Jason Gunthorpe , John Hubbard , Peter Xu , tarunsahu@google.com, Fuad Tabba , Vlastimil Babka Cc: kvm@vger.kernel.org, linux-kernel@vger.kernel.org, linux-trace-kernel@vger.kernel.org, linux-doc@vger.kernel.org, linux-kselftest@vger.kernel.org, linux-mm@kvack.org, linux-coco@lists.linux.dev, Ackerley Tng , Xiaoyao Li Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable From: Sean Christopherson Introduce a generic kvm_is_private_gfn() interface using a static call to determine if a GFN is private. This allows the implementation for checking a GFN's private/shared status to be set at runtime. In preparation for choosing implementations between a guest_memfd lookup and the existing VM attribute lookup, rename the existing VM-attribute-based check to kvm_vm_is_private_gfn() to emphasize that it looks up VM attributes. Signed-off-by: Sean Christopherson Reviewed-by: Xiaoyao Li Reviewed-by: Fuad Tabba Tested-by: Shivank Garg Reviewed-by: Binbin Wu Signed-off-by: Ackerley Tng --- include/linux/kvm_host.h | 14 ++++++++++++-- virt/kvm/kvm_main.c | 15 +++++++++++++++ 2 files changed, 27 insertions(+), 2 deletions(-) diff --git a/include/linux/kvm_host.h b/include/linux/kvm_host.h index 9b97266f61ec8..3579feb631775 100644 --- a/include/linux/kvm_host.h +++ b/include/linux/kvm_host.h @@ -2573,16 +2573,26 @@ bool kvm_arch_pre_set_vm_memory_attributes(struct k= vm *kvm, bool kvm_arch_post_set_vm_memory_attributes(struct kvm *kvm, struct kvm_gfn_range *range); =20 -static inline bool kvm_is_private_gfn(struct kvm *kvm, gfn_t gfn) +static inline bool kvm_vm_is_private_gfn(struct kvm *kvm, gfn_t gfn) { return kvm_get_vm_memory_attributes(kvm, gfn) & KVM_MEMORY_ATTRIBUTE_PRIV= ATE; } +#endif /* CONFIG_KVM_VM_MEMORY_ATTRIBUTES */ + +#ifdef kvm_arch_has_private_mem +typedef bool (kvm_is_private_gfn_t)(struct kvm *kvm, gfn_t gfn); +DECLARE_STATIC_CALL(__kvm_is_private_gfn, kvm_is_private_gfn_t); + +static inline bool kvm_is_private_gfn(struct kvm *kvm, gfn_t gfn) +{ + return static_call(__kvm_is_private_gfn)(kvm, gfn); +} #else static inline bool kvm_is_private_gfn(struct kvm *kvm, gfn_t gfn) { return false; } -#endif /* CONFIG_KVM_VM_MEMORY_ATTRIBUTES */ +#endif /* kvm_arch_has_private_mem */ =20 #ifdef CONFIG_KVM_GUEST_MEMFD int kvm_gmem_get_pfn(struct kvm *kvm, struct kvm_memory_slot *slot, diff --git a/virt/kvm/kvm_main.c b/virt/kvm/kvm_main.c index 91d5af7d60d0f..78278730b2ae4 100644 --- a/virt/kvm/kvm_main.c +++ b/virt/kvm/kvm_main.c @@ -2628,6 +2628,20 @@ static int kvm_vm_ioctl_set_mem_attributes(struct kv= m *kvm, } #endif /* CONFIG_KVM_VM_MEMORY_ATTRIBUTES */ =20 +#ifdef kvm_arch_has_private_mem +DEFINE_STATIC_CALL_RET0(__kvm_is_private_gfn, kvm_is_private_gfn_t); +EXPORT_STATIC_CALL_GPL(__kvm_is_private_gfn); + +static void kvm_init_memory_attributes(void) +{ +#ifdef CONFIG_KVM_VM_MEMORY_ATTRIBUTES + static_call_update(__kvm_is_private_gfn, kvm_vm_is_private_gfn); +#endif +} +#else +static void kvm_init_memory_attributes(void) { } +#endif + struct kvm_memory_slot *gfn_to_memslot(struct kvm *kvm, gfn_t gfn) { return __gfn_to_memslot(kvm_memslots(kvm), gfn); @@ -6541,6 +6555,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.55.0.887.g758fc8c411-goog From nobody Mon Sep 28 04:51:20 2026 Received: from mail-pl1-f199.google.com (mail-pl1-f199.google.com [209.85.214.199]) (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 A8E913BBA03 for ; Wed, 26 Aug 2026 09:18:24 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.199 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1787735907; cv=none; b=TcHZNvmE8/AmvHMbDSC9KZly/4Wg8UbA9HlnzjNgIWK9LwK8BK4rYmaQXBX5b9DZIA6TazWJxmsotH8Zf8bhgJkDTuu/UMQuRKROn/A5xMZGXs+jBLverWggVmYEuTBkU7/SxwqhO23eThDehhx5gTT2vTKwREDmSRb+kBszonE= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1787735907; c=relaxed/simple; bh=afVcG9MutWV1770JWxX+PFvgEoXu+GeAzkEgFIqy00s=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=Qbcp18JeRnIbJ0JazFyi1u1fQ3M6IuLjWGXzI41g/k6QpfOLXpyGyNZ3MCxxbkmhkyvQ+XMHvga0bNwsuaROV+AVvfVFcoAf7y33uw6iA0sprJBBAzzQP4/E8piH+dtYQoqUEEBBdb04U1lw3Fnvz/PbLkbjNKrh5xbeq2OBUH8= 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=GTTJ//6s; arc=none smtp.client-ip=209.85.214.199 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="GTTJ//6s" Received: by mail-pl1-f199.google.com with SMTP id d9443c01a7336-2d6f73d0f89so12331295ad.0 for ; Wed, 26 Aug 2026 02:18:24 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20251104; t=1787735903; x=1788340703; darn=vger.kernel.org; h=content-type:cc:to:from:subject:message-id:references:mime-version :in-reply-to:date:from:to:cc:subject:date:message-id:reply-to :content-type; bh=SSXq5ekbbkjocQyA2ly+0l1pZ1/sTajHAbm8h8os0E4=; b=GTTJ//6sO9JDL5FHfhG2NwSbUwC3Cd7wHY9sJsu907T9UNg3WePEGPalCNUJCmo4B9 oiFbWg+anBwMz4zYBy3hhHgJYDDPhSrR8wny/uYLrI1yLnpZA8MuawdCuENVewKDWpjX TaZ+04m1y93NI5HMOjM3vTzRvKvbb+VqAi5+LPzrbhkaPZA82dqVcbf36mA63+nBHir4 uMr8qpZDKShlUGhrKORwRqo+5TpDTRH2zmdF4bUbprEnhtj3xkiZGliyn2a9e8P/2HC0 fWf1cwgy04JRAUzUCGsamrW4IdJqt5MbGW8TAlhIcy9BYLc4KlVBf5WHzvOFqWfpzU/2 gdsg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1787735903; x=1788340703; h=content-type: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:content-type; bh=SSXq5ekbbkjocQyA2ly+0l1pZ1/sTajHAbm8h8os0E4=; b=kTJggIXweVEjHad0edXBq6Xd8Hpu1Tcc+YiwaMLOWh/TXTNBhj5wgeZAtHFXzw8cxH yloWhNvlx77dYGXMp0KLbVuSqd/KrSKuscf2F7ZE24yNCnsQCb+/AOa1H7B+zlgmFaf3 v7v/eJl+xXYloigbCcsyYtNpgNm0uSLTypPeos6U++X7I+oJEruB6ltJ6u2QzXuESP74 2kDYNObPuphMG7EFcikupz9nVq5k2zr3YErWOp1JFi4FvCDxIc9kZCHV+Las9Iv6rGZO NrqRKouUhgU0N1kljbdd3xWc7dhWC6PjQwyLm8vZGMVZLTqrgHxXJnutDJ7w7D0b5HsG EGOg== X-Forwarded-Encrypted: i=1; AHgh+RoWM12iHgQMNbuHZa1CATQIJtNKChbFY9b1MPyrY9aW1bFVcbZVHYHN76WChmor/wEv0Jv36lZBKDmzvzQ=@vger.kernel.org X-Gm-Message-State: AFuF++logCYXIQ8acu/7GZ4pbEPi1JOsCOBnTAdP8xEZKaVae9td/TYh +uZqEtZ9xvs7+56UL32LNBM4e40nZPWeOPUUtq7K139TN3OC2KKfdXq3705VTUoQ3YPiX4LNeZS kef+IzAgXXUclUAITWEZQfBVpyQ== X-Received: from plef20.prod.google.com ([2002:a17:902:f394:b0:2cc:79e2:e717]) (user=ackerleytng job=prod-delivery.src-stubby-dispatcher) by 2002:a17:903:950:b0:2cc:777f:d67c with SMTP id d9443c01a7336-2d707c07e9cmr94715185ad.13.1787735902734; Wed, 26 Aug 2026 02:18:22 -0700 (PDT) Date: Wed, 26 Aug 2026 09:18:07 +0000 In-Reply-To: <20260826-gmem-inplace-conversion-v11-0-0a15d8a799aa@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20260826-gmem-inplace-conversion-v11-0-0a15d8a799aa@google.com> X-Developer-Key: i=ackerleytng@google.com; a=ed25519; pk=sAZDYXdm6Iz8FHitpHeFlCMXwabodTm7p8/3/8xUxuU= X-Developer-Signature: v=1; a=ed25519-sha256; t=1787735885; l=4464; i=ackerleytng@google.com; s=20260225; h=from:subject:message-id; bh=1e6H60cQHVz8Bv0xghWxdB5aRwHV1nZY+mB88+mm2c8=; b=QZPrMa3y1le9FkvjJp/5dcixvnPW1Cxrktr1jR2BDdUqrbGMBmSkGWfgX2OA62TxPhPTRY20/ nmfCwWRxRRGBHS3hWtg+rcWOgYmgbTgMgedq1wXxcS572my0zLrZjAF X-Mailer: b4 0.16.0 Message-ID: <20260826-gmem-inplace-conversion-v11-9-0a15d8a799aa@google.com> Subject: [PATCH v11 09/46] KVM: guest_memfd: Stub in ability to enable in-place shared<=>private 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, jmattson@google.com, jthoughton@google.com, michael.roth@amd.com, oupton@kernel.org, pankaj.gupta@amd.com, qperret@google.com, rick.p.edgecombe@intel.com, rientjes@google.com, shivankg@amd.com, steven.price@arm.com, willy@infradead.org, wyihan@google.com, yan.y.zhao@intel.com, forkloop@google.com, pratyush@kernel.org, suzuki.poulose@arm.com, aneesh.kumar@kernel.org, liam@infradead.org, Paolo Bonzini , Sean Christopherson , Thomas Gleixner , Ingo Molnar , Borislav Petkov , Dave Hansen , x86@kernel.org, "H. Peter Anvin" , Steven Rostedt , Masami Hiramatsu , Mathieu Desnoyers , Jonathan Corbet , Shuah Khan , Shuah Khan , Vishal Annapurve , Andrew Morton , Chris Li , Kairui Song , Kemeng Shi , Nhat Pham , Barry Song , Axel Rasmussen , Yuanchu Xie , Wei Xu , Youngjun Park , Qi Zheng , Shakeel Butt , Kiryl Shutsemau , Baoquan He , Jason Gunthorpe , John Hubbard , Peter Xu , tarunsahu@google.com, Fuad Tabba , Vlastimil Babka Cc: kvm@vger.kernel.org, linux-kernel@vger.kernel.org, linux-trace-kernel@vger.kernel.org, linux-doc@vger.kernel.org, linux-kselftest@vger.kernel.org, linux-mm@kvack.org, linux-coco@lists.linux.dev, Ackerley Tng , Xiaoyao Li Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable From: Sean Christopherson Stub in global variable to enable in-place guest_memfd private<=3D>shared memory conversion, which will eventually be exposed to userspace via a module param, and wire up the __kvm_is_private_gfn() static call to the guest_memfd version when in-place conversion is enabled, i.e. when gmem is the sole authority on private vs. shared memory. Cc: Fuad Tabba Cc: Xiaoyao Li Signed-off-by: Sean Christopherson Co-developed-by: Ackerley Tng Signed-off-by: Ackerley Tng --- include/linux/kvm_host.h | 6 ++++++ virt/kvm/guest_memfd.c | 26 ++++++++++++++++++++++++++ virt/kvm/kvm_main.c | 12 +++++++++++- 3 files changed, 43 insertions(+), 1 deletion(-) diff --git a/include/linux/kvm_host.h b/include/linux/kvm_host.h index 3579feb631775..b0110143d2ff8 100644 --- a/include/linux/kvm_host.h +++ b/include/linux/kvm_host.h @@ -2580,6 +2580,8 @@ static inline bool kvm_vm_is_private_gfn(struct kvm *= kvm, gfn_t gfn) #endif /* CONFIG_KVM_VM_MEMORY_ATTRIBUTES */ =20 #ifdef kvm_arch_has_private_mem +extern bool gmem_in_place_conversion; + typedef bool (kvm_is_private_gfn_t)(struct kvm *kvm, gfn_t gfn); DECLARE_STATIC_CALL(__kvm_is_private_gfn, kvm_is_private_gfn_t); =20 @@ -2588,6 +2590,8 @@ static inline bool kvm_is_private_gfn(struct kvm *kvm= , gfn_t gfn) return static_call(__kvm_is_private_gfn)(kvm, gfn); } #else +#define gmem_in_place_conversion false + static inline bool kvm_is_private_gfn(struct kvm *kvm, gfn_t gfn) { return false; @@ -2595,6 +2599,8 @@ static inline bool kvm_is_private_gfn(struct kvm *kvm= , gfn_t gfn) #endif /* kvm_arch_has_private_mem */ =20 #ifdef CONFIG_KVM_GUEST_MEMFD +bool kvm_gmem_is_private_gfn(struct kvm *kvm, gfn_t gfn); + int kvm_gmem_get_pfn(struct kvm *kvm, struct kvm_memory_slot *slot, gfn_t gfn, kvm_pfn_t *pfn, int *max_order); #else diff --git a/virt/kvm/guest_memfd.c b/virt/kvm/guest_memfd.c index b9fee68c90311..5399ae4aae0e7 100644 --- a/virt/kvm/guest_memfd.c +++ b/virt/kvm/guest_memfd.c @@ -478,6 +478,32 @@ static int kvm_gmem_mmap(struct file *file, struct vm_= area_struct *vma) return 0; } =20 +bool kvm_gmem_is_private_gfn(struct kvm *kvm, gfn_t gfn) +{ + struct kvm_memory_slot *slot =3D gfn_to_memslot(kvm, gfn); + struct inode *inode; + + if (!slot) + return 0; + + CLASS(gmem_get_file, file)(slot); + if (!file) + return 0; + + inode =3D file_inode(file); + + /* + * Rely on the maple tree's internal RCU lock to ensure a stable result. + * This result can become stale as soon as the lock is dropped, so the + * caller _must_ protect consumption of private vs. shared either by + * holding guest_memfd's invalidate lock for the entire duration, or by + * checking mmu_invalidate_retry_gfn() under mmu_lock to serialize + * against concurrent attribute updates. + */ + return kvm_gmem_is_private_mem(inode, kvm_gmem_get_index(slot, gfn)); +} +EXPORT_SYMBOL_FOR_KVM_INTERNAL(kvm_gmem_is_private_gfn); + 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 78278730b2ae4..46d2e123448c2 100644 --- a/virt/kvm/kvm_main.c +++ b/virt/kvm/kvm_main.c @@ -102,6 +102,10 @@ EXPORT_SYMBOL_FOR_KVM_INTERNAL(halt_poll_ns_shrink); static bool __ro_after_init allow_unsafe_mappings; module_param(allow_unsafe_mappings, bool, 0444); =20 +#ifdef kvm_arch_has_private_mem +bool __ro_after_init gmem_in_place_conversion =3D false; +#endif + /* * Ordering of locks: * @@ -2423,6 +2427,9 @@ static int kvm_vm_ioctl_clear_dirty_log(struct kvm *k= vm, static u64 kvm_supported_vm_mem_attributes(struct kvm *kvm) { #ifdef kvm_arch_has_private_mem + if (gmem_in_place_conversion) + return 0; + if (!kvm || kvm_arch_has_private_mem(kvm)) return KVM_MEMORY_ATTRIBUTE_PRIVATE; #endif @@ -2634,8 +2641,11 @@ EXPORT_STATIC_CALL_GPL(__kvm_is_private_gfn); =20 static void kvm_init_memory_attributes(void) { + if (gmem_in_place_conversion) + static_call_update(__kvm_is_private_gfn, kvm_gmem_is_private_gfn); #ifdef CONFIG_KVM_VM_MEMORY_ATTRIBUTES - static_call_update(__kvm_is_private_gfn, kvm_vm_is_private_gfn); + else + static_call_update(__kvm_is_private_gfn, kvm_vm_is_private_gfn); #endif } #else --=20 2.55.0.887.g758fc8c411-goog From nobody Mon Sep 28 04:51:20 2026 Received: from mail-pl1-f198.google.com (mail-pl1-f198.google.com [209.85.214.198]) (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 A86E03C37A3 for ; Wed, 26 Aug 2026 09:18:26 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.198 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1787735909; cv=none; b=XmL59Ari0yCHlLHFMsxmIFIYua7xV5o7Ig8HuXBK5HMajwhA0VEhQnHzb3j/7268dUMheLUmNFUQghOu/I7WwAo4+Htm9VOpU2iUocE0NIu6yYC0ue5k4Jfg9Q4zhTKqBX6txE3fwqqDmMuoI5xMOgYHubo0a3t/gQ3bjKt2R48= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1787735909; c=relaxed/simple; bh=afP/+CCsVFTr2xg/bwgkEuVycKnb+hKmVnnJC1PouTo=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=Rr6pYHxjTUimDG1iviOJsp8lcOHh0fyAP+NcuTxqKvw7s4sYxeHzAKUhJxMwkXe+XC2Ozi9mt0ya/fA3VP3wlc6xpVdLlP/As9Ek5sVfIVCfIUcC4MJ3ftFQlOaAGrMqyyDqPPtCe/wHpYBORwDxxw+pYxaqpgf2K2nDWdzmUFg= 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=bIArfXYA; arc=none smtp.client-ip=209.85.214.198 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="bIArfXYA" Received: by mail-pl1-f198.google.com with SMTP id d9443c01a7336-2d02df2bf09so8163495ad.0 for ; Wed, 26 Aug 2026 02:18:26 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20251104; t=1787735905; x=1788340705; darn=vger.kernel.org; h=content-type:cc:to:from:subject:message-id:references:mime-version :in-reply-to:date:from:to:cc:subject:date:message-id:reply-to :content-type; bh=rdZRVSrnkEM/WAJPszboRZoIkHXEJBSzC3AJhV/B8JA=; b=bIArfXYAQVI+yCexFk1kb/tnIp2bSiznXTxSbayweEKfAZ6WtFzZMpISkZ/czdS/cy PHonjFGSL7wPG2AIfWQ3mz0wRwZdwqo2OC75dIIEpB8fBXIa0YD9ooBlD03ti4MoVgUH vMFfO7N6V7wKnZFFO9KUV+4zquDvbLZndAInrxVOJe3WBUu2dFNuzMJyHaxzr95XrAsk ybSGXlJX78SL1aC9HA0cdZAVSGJZYNc8pV4xYsUSqJkrc7n+8fl5As7YX2gGCk5ZDgfm tesStl3nbazMLVlaFKo/mXyu7C7UjqssbQ0I83/2J7eK+xESG5bx+bZUebfNSTsvJQFO ryzg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1787735905; x=1788340705; h=content-type: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:content-type; bh=rdZRVSrnkEM/WAJPszboRZoIkHXEJBSzC3AJhV/B8JA=; b=mg1raedyGJDK6tsvJ4DAll4XcG96hV0rW9aL7oHTN3Mh+LVnCh7ZBTJGxDOnxzkN30 ehuPOa5emEzHcGmwPKtfKc9aFuZLPhV6kkZszqDbJfpl5YRXSVVia6o0ZuxP4m2L9xj1 +hHgKz42UbkYkhHeW/ktAH5fpyr9GgDCentpIUq9cBORaDOft5sNEVxcqxyYyQZrfCks v5YwqeOv4Y8ojCUO47ELIx5SbkNCF3n1B40d/w32gotYQXNYaCKSObd95x+H9cfi/ibR FiznOFXJBbyYDqqkv4Yqx/A05S3XwAl1YF4kmhhXgAg3bCFLK3xTg+GEOePhC3NEla45 64Og== X-Forwarded-Encrypted: i=1; AHgh+RrnTBV5OLrQ2SiKLRexrHQBfTZRpRNnxpmd0mMKgV/dOEGgK8uGemk0jl6f5NrFGXxEJyIUJbY/Bpicgsw=@vger.kernel.org X-Gm-Message-State: AFuF++kx4rShpT9C134wPKRzZwiwCJhGHq2eDGNwqHMUHlGx1vC0dLUb +ho/bz8kXTT08NXVMOu/J4PZaPVNGPSxwysJasyHGC7HsF78qXGcmfnPOsBXvyYVpKpPtn5xXnv fnsU5a2i+4e8kx9N86HaCJfvMMg== X-Received: from plbki11.prod.google.com ([2002:a17:903:68b:b0:2d0:159a:c32f]) (user=ackerleytng job=prod-delivery.src-stubby-dispatcher) by 2002:a17:903:19ed:b0:2cc:864b:539 with SMTP id d9443c01a7336-2d7079ffa9fmr95729835ad.6.1787735904427; Wed, 26 Aug 2026 02:18:24 -0700 (PDT) Date: Wed, 26 Aug 2026 09:18:08 +0000 In-Reply-To: <20260826-gmem-inplace-conversion-v11-0-0a15d8a799aa@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20260826-gmem-inplace-conversion-v11-0-0a15d8a799aa@google.com> X-Developer-Key: i=ackerleytng@google.com; a=ed25519; pk=sAZDYXdm6Iz8FHitpHeFlCMXwabodTm7p8/3/8xUxuU= X-Developer-Signature: v=1; a=ed25519-sha256; t=1787735885; l=2542; i=ackerleytng@google.com; s=20260225; h=from:subject:message-id; bh=JEqd6+3Jm2IN8pmwc/4dv/jyCthiIWqttsX9YClt2p4=; b=nsKZnu1YDavx7WArwRNpZYT8oZFR13lhfa0X6RxUzams7dxT8V2wkp13BS2tew8618zVQoSdk IMAoO1VhDEGCOdZmT0xofpV4JgTgxEjtuLo5vH+ZhyBHGZ/doYV1t9o X-Mailer: b4 0.16.0 Message-ID: <20260826-gmem-inplace-conversion-v11-10-0a15d8a799aa@google.com> Subject: [PATCH v11 10/46] KVM: Consolidate private memory and guest_memfd ifdeffery in kvm_host.h 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, jmattson@google.com, jthoughton@google.com, michael.roth@amd.com, oupton@kernel.org, pankaj.gupta@amd.com, qperret@google.com, rick.p.edgecombe@intel.com, rientjes@google.com, shivankg@amd.com, steven.price@arm.com, willy@infradead.org, wyihan@google.com, yan.y.zhao@intel.com, forkloop@google.com, pratyush@kernel.org, suzuki.poulose@arm.com, aneesh.kumar@kernel.org, liam@infradead.org, Paolo Bonzini , Sean Christopherson , Thomas Gleixner , Ingo Molnar , Borislav Petkov , Dave Hansen , x86@kernel.org, "H. Peter Anvin" , Steven Rostedt , Masami Hiramatsu , Mathieu Desnoyers , Jonathan Corbet , Shuah Khan , Shuah Khan , Vishal Annapurve , Andrew Morton , Chris Li , Kairui Song , Kemeng Shi , Nhat Pham , Barry Song , Axel Rasmussen , Yuanchu Xie , Wei Xu , Youngjun Park , Qi Zheng , Shakeel Butt , Kiryl Shutsemau , Baoquan He , Jason Gunthorpe , John Hubbard , Peter Xu , tarunsahu@google.com, Fuad Tabba , Vlastimil Babka Cc: kvm@vger.kernel.org, linux-kernel@vger.kernel.org, linux-trace-kernel@vger.kernel.org, linux-doc@vger.kernel.org, linux-kselftest@vger.kernel.org, linux-mm@kvack.org, linux-coco@lists.linux.dev, Ackerley Tng , Xiaoyao Li Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable From: Sean Christopherson Move the kvm_arch_has_private_mem() stub and a few guest_memfd function definitions/declarations "down" in kvm_host.h to utilize existing #ifdefs, and so that related code is clustered together. No functional change intended. Signed-off-by: Sean Christopherson Reviewed-by: Xiaoyao Li Reviewed-by: Binbin Wu Reviewed-by: Fuad Tabba Tested-by: Shivank Garg Reviewed-by: David Hildenbrand (Arm) Signed-off-by: Ackerley Tng --- include/linux/kvm_host.h | 37 ++++++++++++++++--------------------- 1 file changed, 16 insertions(+), 21 deletions(-) diff --git a/include/linux/kvm_host.h b/include/linux/kvm_host.h index b0110143d2ff8..ab87effdd221f 100644 --- a/include/linux/kvm_host.h +++ b/include/linux/kvm_host.h @@ -722,27 +722,6 @@ static inline int kvm_arch_vcpu_memslots_id(struct kvm= _vcpu *vcpu) } #endif =20 -#ifndef kvm_arch_has_private_mem -static inline bool kvm_arch_has_private_mem(struct kvm *kvm) -{ - return false; -} -#endif - -#ifdef CONFIG_KVM_GUEST_MEMFD -bool kvm_arch_supports_gmem_init_shared(struct kvm *kvm); - -static inline u64 kvm_gmem_get_supported_flags(struct kvm *kvm) -{ - u64 flags =3D GUEST_MEMFD_FLAG_MMAP; - - if (!kvm || kvm_arch_supports_gmem_init_shared(kvm)) - flags |=3D GUEST_MEMFD_FLAG_INIT_SHARED; - - return flags; -} -#endif - #ifndef kvm_arch_has_readonly_mem static inline bool kvm_arch_has_readonly_mem(struct kvm *kvm) { @@ -2592,6 +2571,11 @@ static inline bool kvm_is_private_gfn(struct kvm *kv= m, gfn_t gfn) #else #define gmem_in_place_conversion false =20 +static inline bool kvm_arch_has_private_mem(struct kvm *kvm) +{ + return false; +} + static inline bool kvm_is_private_gfn(struct kvm *kvm, gfn_t gfn) { return false; @@ -2600,6 +2584,17 @@ static inline bool kvm_is_private_gfn(struct kvm *kv= m, gfn_t gfn) =20 #ifdef CONFIG_KVM_GUEST_MEMFD bool kvm_gmem_is_private_gfn(struct kvm *kvm, gfn_t gfn); +bool kvm_arch_supports_gmem_init_shared(struct kvm *kvm); + +static inline u64 kvm_gmem_get_supported_flags(struct kvm *kvm) +{ + u64 flags =3D GUEST_MEMFD_FLAG_MMAP; + + if (!kvm || kvm_arch_supports_gmem_init_shared(kvm)) + flags |=3D GUEST_MEMFD_FLAG_INIT_SHARED; + + return flags; +} =20 int kvm_gmem_get_pfn(struct kvm *kvm, struct kvm_memory_slot *slot, gfn_t gfn, kvm_pfn_t *pfn, int *max_order); --=20 2.55.0.887.g758fc8c411-goog From nobody Mon Sep 28 04:51:20 2026 Received: from mail-pl1-f198.google.com (mail-pl1-f198.google.com [209.85.214.198]) (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 364F83C4B72 for ; Wed, 26 Aug 2026 09:18:27 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.198 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1787735911; cv=none; b=U/mB+qO8EdPCTaKbeU5aik2/3n722DRMISfAUQzcapOEMA0gzXS96FXjpy5YvFIgoFx9W+ZPT2oCKDmmcT6tdzsysZUIY44SkM2IXqi3LzIw91qrldmfFpHvchy+rfBZfs+dWbRTOCQISchnZ4XFqCPq5+EoUpEV6bwCBQXBhgQ= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1787735911; c=relaxed/simple; bh=n/D+CzWXtwjWicmG4cHiWBsmxeUa/gdAF4ktY4FQ6mA=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=gafGcSM/kyn5J11LMdsQI1FpfXQiCpC46KpC8odctI+R+PUeZgrGuPN6nVuK+VXIZgrbs4TBKK1XuCS7PxqJ4SOkVePvNlrRwz/UpYhEjh6jfJ2dd/tJj7cQexkRrqsvZJdNesou/4XEfo0kbw3SMETBG3y4g7CbWeDeuGyfJPU= 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=RnZYaDyk; arc=none smtp.client-ip=209.85.214.198 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="RnZYaDyk" Received: by mail-pl1-f198.google.com with SMTP id d9443c01a7336-2d001671a54so15927755ad.2 for ; Wed, 26 Aug 2026 02:18:27 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20251104; t=1787735907; x=1788340707; darn=vger.kernel.org; h=content-type:cc:to:from:subject:message-id:references:mime-version :in-reply-to:date:from:to:cc:subject:date:message-id:reply-to :content-type; bh=oTE6Asm+7RXlDcDxfjIUoFgKCyFEbiLPZQMuOphEUv0=; b=RnZYaDyk07MhJtixe9rv4JU3w6Mm1FnpxIqACMKsg5wXGa8YD/KqiuieuTmnYoxlPD hPL087Pt8n1u7TZZgl+XX72WENL1V3JSTgBMDR80cQqVndbajVpoiZa4BSboWq3mM1n3 I6WdgTA9CSJtl69V7TdUbU3VYnz31lKmXKj1EEM3tSEJi2TqlaMgCUs4HqLI0V53D4dY StFd2NZjUdoZzk590CsRWggc/ix9EFuKG+kcFLdTdPBEmwRBZAun0VwjsqA1zjLo06U8 OazUED21zaj8Ft8kLKQkO5KXyWQFDmQ2fxWblNxCKQCovz6imkgWVOSpmiVep5kb3Bj3 8WjQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1787735907; x=1788340707; h=content-type: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:content-type; bh=oTE6Asm+7RXlDcDxfjIUoFgKCyFEbiLPZQMuOphEUv0=; b=B4uZFkxmSzIzqpMGAHFxOb1+s1rO7ze8bC+qk2TG0ZBQ+soGXcbkyOlPfm3qLebIHH c9MRXNUeThFjXkMO7B9S+x6HaQHk4bTar1wWFl90W1oqrHY4IB9RaRDkm9kkzwfhUAla Z+o7cMxhdewgjPwn+i29jniM65rBEEGwVipBRDRdNeNBYv/gicPtiiYBdCpx4FixtzFq LlmE62w5I2YvTlSkiSJQ45nqVn/mZvM5hYqpeMLQDQu89j4YZ2dTkvonw7pDMeikHMrC 8MukPu6cwvjxFYAVeSbmaIYFICkT+9lfksZcJlwJJw/cWQKl2k5+ekFClqngokMA7j4u JKWw== X-Forwarded-Encrypted: i=1; AHgh+Rqoknh1/GnkxLBFEpUl6lsz439qBdqXo4HkcOgdr1dkJZoZs4ta52xwGK1jZjb38GKMma5Wppzk9u0agIY=@vger.kernel.org X-Gm-Message-State: AFuF++kiglJRQeSIZv+2pratQd9uv2jkvjPHNRf4mu9zACLs585+C243 CScXo0MzqG+bkvTO9HkQ+NmTvatDKPNnmBxb5MURge8EYxrO1/Pe9pOCafe+Pl7ZrXAEecqKqIh Ebde4rWjintWX95kZ9TpB+zdQwg== X-Received: from plcx11.prod.google.com ([2002:a17:903:cb:b0:2d6:e968:e012]) (user=ackerleytng job=prod-delivery.src-stubby-dispatcher) by 2002:a17:902:e549:b0:2d6:fec3:bd51 with SMTP id d9443c01a7336-2d707a069c4mr76735725ad.5.1787735906226; Wed, 26 Aug 2026 02:18:26 -0700 (PDT) Date: Wed, 26 Aug 2026 09:18:09 +0000 In-Reply-To: <20260826-gmem-inplace-conversion-v11-0-0a15d8a799aa@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20260826-gmem-inplace-conversion-v11-0-0a15d8a799aa@google.com> X-Developer-Key: i=ackerleytng@google.com; a=ed25519; pk=sAZDYXdm6Iz8FHitpHeFlCMXwabodTm7p8/3/8xUxuU= X-Developer-Signature: v=1; a=ed25519-sha256; t=1787735885; l=3177; i=ackerleytng@google.com; s=20260225; h=from:subject:message-id; bh=YUnwhC+mh4fTP4jvnneQXyA3asq1d/voGqOiDIo7t1o=; b=Wjc/Pos7KfwzIVN8Ns8lzU7jxfHIdmvfrZOOpjQ6O4nJ/C7BmszK2LLtQ7rlqfZLTDl01NH3d k6lZKdmqN+mCdTG+AcXcUlLBxQxLmTU7lbl3u9elGj0Dg7z285TAHtw X-Mailer: b4 0.16.0 Message-ID: <20260826-gmem-inplace-conversion-v11-11-0a15d8a799aa@google.com> Subject: [PATCH v11 11/46] KVM: guest_memfd: Invalidate both SHARED and PRIVATE mappings for in-place conversions 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, jmattson@google.com, jthoughton@google.com, michael.roth@amd.com, oupton@kernel.org, pankaj.gupta@amd.com, qperret@google.com, rick.p.edgecombe@intel.com, rientjes@google.com, shivankg@amd.com, steven.price@arm.com, willy@infradead.org, wyihan@google.com, yan.y.zhao@intel.com, forkloop@google.com, pratyush@kernel.org, suzuki.poulose@arm.com, aneesh.kumar@kernel.org, liam@infradead.org, Paolo Bonzini , Sean Christopherson , Thomas Gleixner , Ingo Molnar , Borislav Petkov , Dave Hansen , x86@kernel.org, "H. Peter Anvin" , Steven Rostedt , Masami Hiramatsu , Mathieu Desnoyers , Jonathan Corbet , Shuah Khan , Shuah Khan , Vishal Annapurve , Andrew Morton , Chris Li , Kairui Song , Kemeng Shi , Nhat Pham , Barry Song , Axel Rasmussen , Yuanchu Xie , Wei Xu , Youngjun Park , Qi Zheng , Shakeel Butt , Kiryl Shutsemau , Baoquan He , Jason Gunthorpe , John Hubbard , Peter Xu , tarunsahu@google.com, Fuad Tabba , Vlastimil Babka Cc: kvm@vger.kernel.org, linux-kernel@vger.kernel.org, linux-trace-kernel@vger.kernel.org, linux-doc@vger.kernel.org, linux-kselftest@vger.kernel.org, linux-mm@kvack.org, linux-coco@lists.linux.dev, Ackerley Tng Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable From: Sean Christopherson When removing one or more folios from a guest_memfd instance, invalidate both SHARED and PRIVATE mappings if in-place conversion is enabled, because stating the obvious, KVM needs to ensure that all mappings to the folio(s) are dropped. Opportunistically rename the helper to capture that it returns a filter for all gfns in anticipation of zapping only the previous mapping types on conversion. I.e. when doing in-place conversion to PRIVATE, only SHARED mappings need to be zapped (ignoring that KVM would ideally not invalidate ranges whose attributes aren't changing in the first place). Note, precisely zapping only the possible mapping types when in-place conversion is disabled is important for functional correctness, not just for performance. Specifically, if KVM zaps both when SHARED vs. PRIVATE is tracked per-VM, then a PUNCH_HOLE operation on a PRIVATE guest_memfd will incorrectly zap SHARED mappings that have nothing to do with that gmem instance (because they're mapped via a VMA, not a gmem fd). And vice versa, a PUNCH_HOLE on a SHARED gmem (if userspace is using an INIT_SHARED gmem for the shared branch of a memslot) could invalidate the PRIVATE mappings of a different gmem instance. The latter case in particular would be a functional bug, as spuriously zapping PRIVATE SPTEs is fatal to TDX, as doing so destroys the contents of the memory. Signed-off-by: Sean Christopherson Signed-off-by: Ackerley Tng --- virt/kvm/guest_memfd.c | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/virt/kvm/guest_memfd.c b/virt/kvm/guest_memfd.c index 5399ae4aae0e7..d4a9877b29ab0 100644 --- a/virt/kvm/guest_memfd.c +++ b/virt/kvm/guest_memfd.c @@ -139,8 +139,11 @@ static struct folio *kvm_gmem_get_folio(struct inode *= inode, pgoff_t index) return folio; } =20 -static enum kvm_gfn_range_filter kvm_gmem_get_invalidate_filter(struct ino= de *inode) +static enum kvm_gfn_range_filter kvm_gmem_get_all_gfns_filter(struct inode= *inode) { + if (gmem_in_place_conversion) + return KVM_FILTER_SHARED | KVM_FILTER_PRIVATE; + if (GMEM_I(inode)->flags & GUEST_MEMFD_FLAG_INIT_SHARED) return KVM_FILTER_SHARED; =20 @@ -191,11 +194,9 @@ static void __kvm_gmem_invalidate_start(struct gmem_fi= le *f, pgoff_t start, static void kvm_gmem_invalidate_start(struct inode *inode, pgoff_t start, pgoff_t end) { - enum kvm_gfn_range_filter attr_filter; + enum kvm_gfn_range_filter attr_filter =3D kvm_gmem_get_all_gfns_filter(in= ode); struct gmem_file *f; =20 - attr_filter =3D kvm_gmem_get_invalidate_filter(inode); - kvm_gmem_for_each_file(f, inode) __kvm_gmem_invalidate_start(f, start, end, attr_filter); } @@ -347,7 +348,7 @@ static int kvm_gmem_release(struct inode *inode, struct= file *file) * memory, as its lifetime is associated with the inode, not the file. */ __kvm_gmem_invalidate_start(f, 0, -1ul, - kvm_gmem_get_invalidate_filter(inode)); + kvm_gmem_get_all_gfns_filter(inode)); __kvm_gmem_invalidate_end(f, 0, -1ul); =20 list_del(&f->entry); --=20 2.55.0.887.g758fc8c411-goog From nobody Mon Sep 28 04:51:20 2026 Received: from mail-pl1-f197.google.com (mail-pl1-f197.google.com [209.85.214.197]) (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 51F163C063A for ; Wed, 26 Aug 2026 09:18:29 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.197 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1787735911; cv=none; b=YmQ3YucYHxe6iJmQV5Xu0bZ8FMGOuTvl+cbHrIMI0/7CkOakrYp3sW/A4KMyFW99KrRbAP1qrTNPbydz1WXLJddVcVhCbSvHZcLKmk/xB8QMWozDCQcmoGSk08PLYWzKJWG0Oa9yPb17etg0B5qEqzgGohmEaoQ83AOc3x6WITk= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1787735911; c=relaxed/simple; bh=d74irKAD/WY1oRS6lvT6VEWWDqrQZv2skOByz9ZePX0=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=rzRFWZw2Rka1pUjGaM6PHUk8M4Tq62+D2V0JrK6E0vY3sFzATFTHGDcdItxzYnouE3lmUrKVU2HFLK/T+pWMjXjmn8Ujv1nK0vYUlLQhjr8jln1oDqxGC8ClUAmRwxcl/tDuU7KgEmDjLKHuBzR/gfTfwnfVlamLrpoK4aYGnHY= 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=PetAwkgt; arc=none smtp.client-ip=209.85.214.197 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="PetAwkgt" Received: by mail-pl1-f197.google.com with SMTP id d9443c01a7336-2cc640dfde3so12090325ad.1 for ; Wed, 26 Aug 2026 02:18:29 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20251104; t=1787735908; x=1788340708; darn=vger.kernel.org; h=content-type:cc:to:from:subject:message-id:references:mime-version :in-reply-to:date:from:to:cc:subject:date:message-id:reply-to :content-type; bh=uXPej6/aazY/Zy0bqnNH6AiLcBSkzXva7x44ZsPvDyg=; b=PetAwkgthqKu2cbtHYj49YohAr3nWYcj57CBdheZ6clRKQX0X7NJ4lAf7bf76ME6VN be6dEAke4UT8oFo+vHkYP+2diM7S1QYUkMeMaOyLvV9qPlOs87hXYd/Bx0BnV72zqJDI QYdNF7CKk6nceylj5csQIko4PcXTrl7zk3frTblwPVVH1MbqE8XgqtQrtyN8b4HMBxW0 Hlq/T4oHHJXsLEpfqu4MGsp92BtcIq2xdSBPwn6ZNjrikjUKwYfx3W0yFwOLnFmPqVru jJVcGhcv+DECvAT8+uoJzQe8cXnEIoxNxQ5xcDzb4aY5HcfzRLfqGmB48bFf9EdEAYXW UzRA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1787735908; x=1788340708; h=content-type: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:content-type; bh=uXPej6/aazY/Zy0bqnNH6AiLcBSkzXva7x44ZsPvDyg=; b=M4XRa13fdJv/Rf1AZ5HPECHN4zUVNK6aRVNb9atJ1lZwRCFPVos+FiyC74+u+zb9Jh 1suuKZid0zicrCpfm2ritsToGX0D5lm7/9+qlP70ZlDFg3NkqqzRQSyDc4/vSsZywLNt VJPJNSrxnwNSd5SXTUINR0TdnrQKGQgdZwSnxpkhXYvbsxhTDfHuBTzXkaDewX42IifP ybRCkIw6DZhM67O7t/K5Gb36C/bzK4trPin3L1TswoB6zsGJ0oXpGuqgFZTqUyMMSVFq owzK3D4rZyiOjLKp5MiGWNEKzOt5JYldfulBb3O+NtkHJg64SYFjeqMUYOrjNFfA8CBd PATg== X-Forwarded-Encrypted: i=1; AHgh+RrNwF2zMF1YVPhaAX2x0Z4lB4MERUjZZicI/2kqk5L1dx7c+TuR2y69/b/bfpGgf+tiPtULxqu1yqwzFpk=@vger.kernel.org X-Gm-Message-State: AFuF++kkdOBAy+xg5DZd1evWauIQM237q4CPp25AjJoGZ8YNHpyvgCTO UyVf0yUKqKRjMYqSHFaNRR34+lGOAaxM0IMaVm8dBnV+zEQwRb44f+LDQnFgvBU1fbf9iEtGhLM D4/udZTaTWy90iVhgyTAjof0RIA== X-Received: from plblh3.prod.google.com ([2002:a17:903:2903:b0:2d3:1b72:ff0a]) (user=ackerleytng job=prod-delivery.src-stubby-dispatcher) by 2002:a17:903:1a0f:b0:2ca:2079:91cc with SMTP id d9443c01a7336-2d707a8eb75mr93292455ad.5.1787735907954; Wed, 26 Aug 2026 02:18:27 -0700 (PDT) Date: Wed, 26 Aug 2026 09:18:10 +0000 In-Reply-To: <20260826-gmem-inplace-conversion-v11-0-0a15d8a799aa@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20260826-gmem-inplace-conversion-v11-0-0a15d8a799aa@google.com> X-Developer-Key: i=ackerleytng@google.com; a=ed25519; pk=sAZDYXdm6Iz8FHitpHeFlCMXwabodTm7p8/3/8xUxuU= X-Developer-Signature: v=1; a=ed25519-sha256; t=1787735885; l=2917; i=ackerleytng@google.com; s=20260225; h=from:subject:message-id; bh=d74irKAD/WY1oRS6lvT6VEWWDqrQZv2skOByz9ZePX0=; b=fCUn+TX3iBXyhcxdFfxYrHVsFqPrFalVdBOqXAzPzLfL/WoqEtNajpCcqHmxHZNjEuZgf7onY ak56oI3jLtlBkiH5CIOlWLg71rSuHsLBV/sKh/x4ig+QvPQxWgiJpVH X-Mailer: b4 0.16.0 Message-ID: <20260826-gmem-inplace-conversion-v11-12-0a15d8a799aa@google.com> Subject: [PATCH v11 12/46] KVM: guest_memfd: Pass mapping type filter to invalidation helper 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, jmattson@google.com, jthoughton@google.com, michael.roth@amd.com, oupton@kernel.org, pankaj.gupta@amd.com, qperret@google.com, rick.p.edgecombe@intel.com, rientjes@google.com, shivankg@amd.com, steven.price@arm.com, willy@infradead.org, wyihan@google.com, yan.y.zhao@intel.com, forkloop@google.com, pratyush@kernel.org, suzuki.poulose@arm.com, aneesh.kumar@kernel.org, liam@infradead.org, Paolo Bonzini , Sean Christopherson , Thomas Gleixner , Ingo Molnar , Borislav Petkov , Dave Hansen , x86@kernel.org, "H. Peter Anvin" , Steven Rostedt , Masami Hiramatsu , Mathieu Desnoyers , Jonathan Corbet , Shuah Khan , Shuah Khan , Vishal Annapurve , Andrew Morton , Chris Li , Kairui Song , Kemeng Shi , Nhat Pham , Barry Song , Axel Rasmussen , Yuanchu Xie , Wei Xu , Youngjun Park , Qi Zheng , Shakeel Butt , Kiryl Shutsemau , Baoquan He , Jason Gunthorpe , John Hubbard , Peter Xu , tarunsahu@google.com, Fuad Tabba , Vlastimil Babka Cc: kvm@vger.kernel.org, linux-kernel@vger.kernel.org, linux-trace-kernel@vger.kernel.org, linux-doc@vger.kernel.org, linux-kselftest@vger.kernel.org, linux-mm@kvack.org, linux-coco@lists.linux.dev, Ackerley Tng Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Accept the mapping type filter as a parameter in the invalidation start helper instead of querying it internally. This allows callers to specify which mappings (shared, private, or both) should be invalidated. In the next patch, the conversion process will use this new parameter to invalidate mappings only when they're different from the target state of the conversion, i.e. invalidate only shared mappings on a shared to private conversion and not both. No functional change intended. Signed-off-by: Ackerley Tng --- virt/kvm/guest_memfd.c | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/virt/kvm/guest_memfd.c b/virt/kvm/guest_memfd.c index d4a9877b29ab0..ab29e7f555787 100644 --- a/virt/kvm/guest_memfd.c +++ b/virt/kvm/guest_memfd.c @@ -192,13 +192,13 @@ static void __kvm_gmem_invalidate_start(struct gmem_f= ile *f, pgoff_t start, } =20 static void kvm_gmem_invalidate_start(struct inode *inode, pgoff_t start, - pgoff_t end) + pgoff_t end, + enum kvm_gfn_range_filter filter) { - enum kvm_gfn_range_filter attr_filter =3D kvm_gmem_get_all_gfns_filter(in= ode); struct gmem_file *f; =20 kvm_gmem_for_each_file(f, inode) - __kvm_gmem_invalidate_start(f, start, end, attr_filter); + __kvm_gmem_invalidate_start(f, start, end, filter); } =20 static void __kvm_gmem_invalidate_end(struct gmem_file *f, pgoff_t start, @@ -224,6 +224,7 @@ static void kvm_gmem_invalidate_end(struct inode *inode= , pgoff_t start, =20 static long kvm_gmem_punch_hole(struct inode *inode, loff_t offset, loff_t= len) { + enum kvm_gfn_range_filter filter =3D kvm_gmem_get_all_gfns_filter(inode); pgoff_t start =3D offset >> PAGE_SHIFT; pgoff_t end =3D (offset + len) >> PAGE_SHIFT; =20 @@ -233,7 +234,7 @@ static long kvm_gmem_punch_hole(struct inode *inode, lo= ff_t offset, loff_t len) */ filemap_invalidate_lock(inode->i_mapping); =20 - kvm_gmem_invalidate_start(inode, start, end); + kvm_gmem_invalidate_start(inode, start, end, filter); =20 truncate_inode_pages_range(inode->i_mapping, offset, offset + len - 1); =20 @@ -522,6 +523,8 @@ static int kvm_gmem_migrate_folio(struct address_space = *mapping, =20 static int kvm_gmem_error_folio(struct address_space *mapping, struct foli= o *folio) { + struct inode *inode =3D mapping->host; + enum kvm_gfn_range_filter filter; pgoff_t start, end; =20 filemap_invalidate_lock_shared(mapping); @@ -529,7 +532,8 @@ static int kvm_gmem_error_folio(struct address_space *m= apping, struct folio *fol start =3D folio->index; end =3D start + folio_nr_pages(folio); =20 - kvm_gmem_invalidate_start(mapping->host, start, end); + filter =3D kvm_gmem_get_all_gfns_filter(inode); + kvm_gmem_invalidate_start(inode, start, end, filter); =20 /* * Do not truncate the range, what action is taken in response to the --=20 2.55.0.887.g758fc8c411-goog From nobody Mon Sep 28 04:51:20 2026 Received: from mail-pg1-f197.google.com (mail-pg1-f197.google.com [209.85.215.197]) (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 14B043CC334 for ; Wed, 26 Aug 2026 09:18:31 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.215.197 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1787735914; cv=none; b=FD0xmmUb/HqA9ps9pVY5EgyjIN6Jyq3ccKTDR1osx/gLaI8Jpee0JB3POknOcWVDJ8vaGpiwgC5gzPDx/JkfUNPkDJ7dxNI0EZkMJEyPbMlK4GjNHLMDuwtflO99Ab9g8mC69rc0DT9C9sz2cLx7iWHPgR+97jp9bBGhRSyR98E= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1787735914; c=relaxed/simple; bh=QFc0EsF1ikqFVpn4U++lX3MemTAkXRo62SHSovLKp3g=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=PRoTtLMpfoeSh6CfnhoOXTL8ZvKwDkOUzBK7lxo2IFi5FG7zvMmusKS/a5689b+ZPTtQJuWKWV2m/YUJ5kv/7JIQ1TYvL+cgTdquVff6+skRlBjM9sVeanCJJ0eQ3ehezjD3o4nJrmf5bFsHIT2r6+1ISDzmRvtuaQO8+gljP2Y= 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=VnRz4on4; arc=none smtp.client-ip=209.85.215.197 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="VnRz4on4" Received: by mail-pg1-f197.google.com with SMTP id 41be03b00d2f7-cc132709c76so1280188a12.3 for ; Wed, 26 Aug 2026 02:18:31 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20251104; t=1787735910; x=1788340710; darn=vger.kernel.org; h=content-type:cc:to:from:subject:message-id:references:mime-version :in-reply-to:date:from:to:cc:subject:date:message-id:reply-to :content-type; bh=a4+muP0BZHkr0B+oWf57LAj+XypxVv4tq4m9lXewalE=; b=VnRz4on4XMaY7Zh6cQ1rO72culCDrpzZWziqoGvYW/HeCT5nrbElhEE3HpEX1OWf0W M3Je3KtUcJW/DPDSTdtsOzLNjp4pOR6ebiQ2Rcp5o7ltO9dF3/HgJoL3jRGNhua4RjuH bRjPc6Xg5M3KzoW7ASYcBJ75gHrY4/wBY1kzejJd/sxbxu3Ut3AVUGT6C77ziDya5iz1 UXjXOQjuk6+yjKgB93VoFkcxyzH4ERd2aaLyDgu7jA8sI9xWzXoFb2sBf61lXdclNP7q O2SbhsFP12VIbFiNIRIXRNXZRpQaPA24oh6DOowucgxpqk2kfUl82EvUYwZz+R5F2XdR AQaA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1787735910; x=1788340710; h=content-type: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:content-type; bh=a4+muP0BZHkr0B+oWf57LAj+XypxVv4tq4m9lXewalE=; b=qjhsXo+E1TvTwLM5cNb2kl9kOhvd5TFJ/7xEXz6ykRGYUcF2DTkDFcgBNzKFChK6xA AsdCgyOc3KCvcN54Ha+Yuf7XDQb0paZjSEK5q8RE3SAu9UUiOft92b5rDw2+pkEXDWLU p3zMveAm+Y0EID6JM1umDHn5+ver/Vk5kTn8zPqUqv8J94c4+KOjaTg6PrcE+t9hBAR4 yaTAgsM1QIV1suDn4sKnBfplYKD54V9l8BUZDGNmyNeo3U4Hgn/NOKfAKvQTTVE4n7iX E38vEB+cFADo9Wwft105Y3OodN0rSQCwWNfEGbi9+b1gccuBRI6eJbbk//OBnB2kj/70 yOUg== X-Forwarded-Encrypted: i=1; AHgh+Rpv4oKhkYGs3zWeDT1Oj2SQbKPAJSKOEMQfL+PAbJC6m/o9zZ5glcOJcY4t3Yyz9xJPz4cwGiCCnyYfTpE=@vger.kernel.org X-Gm-Message-State: AFuF++nRFafmQEq4LbIKfqmw+1dhx92Khm5PTrD/pzDEiNbn4itvfH9h U6q7lkVcgAcz2IvMkG03+lqQJbi0W2rh80S7qsTX8wPqOxLcF5H9yjsuMtJOfXFUu3LzXnBuLG5 SS9jfH2SbNkg4dGKNWebTzDvEng== X-Received: from pgbgc2.prod.google.com ([2002:a05:6a02:4b82:b0:cc1:ca15:6da4]) (user=ackerleytng job=prod-delivery.src-stubby-dispatcher) by 2002:a05:6a00:1745:b0:84e:9257:d0c2 with SMTP id d2e1a72fcca58-85373eb0bf6mr9385662b3a.9.1787735909685; Wed, 26 Aug 2026 02:18:29 -0700 (PDT) Date: Wed, 26 Aug 2026 09:18:11 +0000 In-Reply-To: <20260826-gmem-inplace-conversion-v11-0-0a15d8a799aa@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20260826-gmem-inplace-conversion-v11-0-0a15d8a799aa@google.com> X-Developer-Key: i=ackerleytng@google.com; a=ed25519; pk=sAZDYXdm6Iz8FHitpHeFlCMXwabodTm7p8/3/8xUxuU= X-Developer-Signature: v=1; a=ed25519-sha256; t=1787735885; l=12667; i=ackerleytng@google.com; s=20260225; h=from:subject:message-id; bh=QFc0EsF1ikqFVpn4U++lX3MemTAkXRo62SHSovLKp3g=; b=QAwGSW7iVdzKMCC/LY2QbaPlNjxCxXErz3s8gdWawWGzB3sB+ann5kUz12vx8IDfDoJkGBfHK fCVq/fxqlNLDccyXSxOUHEgWwCxWEnO98UY9zJ3tHhe3vWb/VPUbnAb X-Mailer: b4 0.16.0 Message-ID: <20260826-gmem-inplace-conversion-v11-13-0a15d8a799aa@google.com> Subject: [PATCH v11 13/46] KVM: guest_memfd: Add base 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, jmattson@google.com, jthoughton@google.com, michael.roth@amd.com, oupton@kernel.org, pankaj.gupta@amd.com, qperret@google.com, rick.p.edgecombe@intel.com, rientjes@google.com, shivankg@amd.com, steven.price@arm.com, willy@infradead.org, wyihan@google.com, yan.y.zhao@intel.com, forkloop@google.com, pratyush@kernel.org, suzuki.poulose@arm.com, aneesh.kumar@kernel.org, liam@infradead.org, Paolo Bonzini , Sean Christopherson , Thomas Gleixner , Ingo Molnar , Borislav Petkov , Dave Hansen , x86@kernel.org, "H. Peter Anvin" , Steven Rostedt , Masami Hiramatsu , Mathieu Desnoyers , Jonathan Corbet , Shuah Khan , Shuah Khan , Vishal Annapurve , Andrew Morton , Chris Li , Kairui Song , Kemeng Shi , Nhat Pham , Barry Song , Axel Rasmussen , Yuanchu Xie , Wei Xu , Youngjun Park , Qi Zheng , Shakeel Butt , Kiryl Shutsemau , Baoquan He , Jason Gunthorpe , John Hubbard , Peter Xu , tarunsahu@google.com, Fuad Tabba , Vlastimil Babka Cc: kvm@vger.kernel.org, linux-kernel@vger.kernel.org, linux-trace-kernel@vger.kernel.org, linux-doc@vger.kernel.org, linux-kselftest@vger.kernel.org, linux-mm@kvack.org, linux-coco@lists.linux.dev, Ackerley Tng Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Add a new ioctl (and matching struct), KVM_SET_MEMORY_ATTRIBUTES2, using the same base ioctl number (0xd2), but with R/W semantics for the kernel instead of just read semantics. "Officially" documenting that KVM writes to the payload will allow KVM to support partial/incremental conversions, instead of all-or-nothing updates (which requires complex unwinding), by recording the failing offset if an error occurs. Opportunistically add a new struct as well, even though KVM could squeeze the error offset into "struct kvm_memory_attributes", as there's no cost to doing so in practice. Pad the struct with a pile of extra space to try and avoid ending up with "struct kvm_memory_attributes3" in the future. Use the same layout for the fields that common to version 1 of the struct, e.g. to ease upgrading userspace, and to provide flexibility if KVM ever adds support for KVM_SET_MEMORY_ATTRIBUTES2 at VM scope. Introduce KVM_CAP_GUEST_MEMFD_MEMORY_ATTRIBUTES to advertise the availability of the KVM_SET_MEMORY_ATTRIBUTES2 ioctl. Update the KVM API documentation to define the new ioctl and its behavior, and add the necessary UAPI definitions and capability checks. The process of setting memory attributes has a clear point of no return because, for CoCo VMs, zapping stage 2 page tables is a destructive operation. Unlike regular VMs, where re-faulting pages into the stage 2 page tables merely incurs a performance penalty, CoCo guests must (re-):accept pages after every fault. To preserve CoCo security guarantees, guests will not accept pages they did not explicitly request faults for. Consequently, during memory conversions, any operation that could cause the process to abort must be completed before the stage 2 page tables are zapped. Zap only the ranges that are not already in the requested state to avoid inadvertently destroying (CoCo) data. ARM CCA guests will try to mark the entire DRAM as private at boot. If there are no shared pages at all, the to-private conversion can be skipped, but the existence of a single shared page would require the conversion process to proceed, and if it proceeds, zapping both shared and private pages would destroy data and break the guest. Co-developed-by: Vishal Annapurve Signed-off-by: Vishal Annapurve Co-developed-by: Sean Christopherson Signed-off-by: Sean Christopherson Reviewed-by: Fuad Tabba Reviewed-by: Binbin Wu Suggested-by: Michael Roth Tested-by: Shivank Garg Suggested-by: Suzuki K Poulose Reviewed-by: Suzuki K Poulose Signed-off-by: Ackerley Tng --- Documentation/virt/kvm/api.rst | 63 +++++++++++++++++++++- include/uapi/linux/kvm.h | 15 ++++++ virt/kvm/guest_memfd.c | 119 +++++++++++++++++++++++++++++++++++++= ++++ virt/kvm/kvm_main.c | 23 +++++--- 4 files changed, 212 insertions(+), 8 deletions(-) diff --git a/Documentation/virt/kvm/api.rst b/Documentation/virt/kvm/api.rst index 4eb7e75a7473f..7aad097ffd392 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. @@ -6393,6 +6393,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 @@ -6586,6 +6588,65 @@ 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_GUEST_MEMFD_MEMORY_ATTRIBUTES +:Architectures: all +:Type: guest_memfd ioctl +:Parameters: struct kvm_memory_attributes2 (in) +:Returns: 0 on success, <0 on error + +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` was invalid (e.g. not + page aligned, causes an overflow, or size is zero). + EFAULT The parameter address was invalid. + 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 +KVM_SET_MEMORY_ATTRIBUTES identically. + +Attribute values are shared with KVM_SET_MEMORY_ATTRIBUTES. + +:: + + struct kvm_memory_attributes2 { + union { + __u64 address; + __u64 offset; + }; + __u64 size; + __u64 attributes; + __u64 flags; + __u64 reserved[12]; + }; + + #define KVM_MEMORY_ATTRIBUTE_PRIVATE (1ULL << 3) + +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. + +KVM does not directly manipulate the memory contents of pages during +attribute updates. However, the process of setting these attributes, +which includes operations such as unmapping pages from the host or +stage-2 page tables, may result in side effects on memory contents +that vary across different trusted firmware implementations. + +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 9fc8dfdfd65ff..ccbf7c475ec29 100644 --- a/include/uapi/linux/kvm.h +++ b/include/uapi/linux/kvm.h @@ -998,6 +998,7 @@ struct kvm_enable_cap { #define KVM_CAP_S390_VSIE_ESAMODE 248 #define KVM_CAP_S390_HPAGE_2G 249 #define KVM_CAP_ARM_PMU_V3_STRICT 250 +#define KVM_CAP_GUEST_MEMFD_MEMORY_ATTRIBUTES 251 =20 struct kvm_irq_routing_irqchip { __u32 irqchip; @@ -1650,6 +1651,20 @@ struct kvm_memory_attributes { __u64 flags; }; =20 +/* Available with KVM_CAP_GUEST_MEMFD_MEMORY_ATTRIBUTES */ +#define KVM_SET_MEMORY_ATTRIBUTES2 _IOWR(KVMIO, 0xd2, struct= kvm_memory_attributes2) + +struct kvm_memory_attributes2 { + union { + __u64 address; + __u64 offset; + }; + __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/guest_memfd.c b/virt/kvm/guest_memfd.c index ab29e7f555787..2987611587b18 100644 --- a/virt/kvm/guest_memfd.c +++ b/virt/kvm/guest_memfd.c @@ -506,11 +506,130 @@ bool kvm_gmem_is_private_gfn(struct kvm *kvm, gfn_t = gfn) } EXPORT_SYMBOL_FOR_KVM_INTERNAL(kvm_gmem_is_private_gfn); =20 +/* + * 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(mas, 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(mas, 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) +{ + bool to_private =3D attrs & KVM_MEMORY_ATTRIBUTE_PRIVATE; + struct address_space *mapping =3D inode->i_mapping; + struct gmem_inode *gi =3D GMEM_I(inode); + enum kvm_gfn_range_filter filter; + 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); + r =3D kvm_gmem_mas_preallocate(&mas, attrs, start, nr_pages); + if (r) + goto out; + + /* + * From this point on guest_memfd has performed necessary + * checks and can proceed to do guest-breaking changes. + */ + + filter =3D to_private ? KVM_FILTER_SHARED : KVM_FILTER_PRIVATE; + kvm_gmem_invalidate_start(inode, start, end, filter); + 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; + size_t nr_pages; + pgoff_t index; + int i; + + if (copy_from_user(&attrs, argp, sizeof(attrs))) + return -EFAULT; + + if (attrs.flags) + return -EINVAL; + for (i =3D 0; i < ARRAY_SIZE(attrs.reserved); i++) { + if (attrs.reserved[i]) + return -EINVAL; + } + if (!kvm_arch_has_private_mem(f->kvm)) + return -EINVAL; + if (attrs.attributes & ~KVM_MEMORY_ATTRIBUTE_PRIVATE) + 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 i_size_read(inode) || + attrs.offset + attrs.size > i_size_read(inode)) + return -EINVAL; + + nr_pages =3D attrs.size >> PAGE_SHIFT; + index =3D attrs.offset >> PAGE_SHIFT; + return __kvm_gmem_set_attributes(inode, index, nr_pages, + attrs.attributes); +} + +static long kvm_gmem_ioctl(struct file *file, unsigned int ioctl, + unsigned long arg) +{ + switch (ioctl) { + case KVM_SET_MEMORY_ATTRIBUTES2: + if (!gmem_in_place_conversion) + 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, diff --git a/virt/kvm/kvm_main.c b/virt/kvm/kvm_main.c index 46d2e123448c2..1ea8198821917 100644 --- a/virt/kvm/kvm_main.c +++ b/virt/kvm/kvm_main.c @@ -2423,18 +2423,22 @@ static int kvm_vm_ioctl_clear_dirty_log(struct kvm = *kvm, } #endif /* CONFIG_KVM_GENERIC_DIRTYLOG_READ_PROTECT */ =20 +#ifdef kvm_arch_has_private_mem +static u64 kvm_supports_private_mem(struct kvm *kvm) +{ + return !kvm || kvm_arch_has_private_mem(kvm); +} +#else +#define kvm_supports_private_mem(kvm) false +#endif + #ifdef CONFIG_KVM_VM_MEMORY_ATTRIBUTES static u64 kvm_supported_vm_mem_attributes(struct kvm *kvm) { -#ifdef kvm_arch_has_private_mem - if (gmem_in_place_conversion) + if (gmem_in_place_conversion || !kvm_supports_private_mem(kvm)) return 0; =20 - if (!kvm || kvm_arch_has_private_mem(kvm)) - return KVM_MEMORY_ATTRIBUTE_PRIVATE; -#endif - - return 0; + return KVM_MEMORY_ATTRIBUTE_PRIVATE; } =20 /* @@ -4976,6 +4980,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 (!gmem_in_place_conversion || !kvm_supports_private_mem(kvm)) + return 0; + + return KVM_MEMORY_ATTRIBUTE_PRIVATE; #endif default: break; --=20 2.55.0.887.g758fc8c411-goog From nobody Mon Sep 28 04:51:20 2026 Received: from mail-pl1-f200.google.com (mail-pl1-f200.google.com [209.85.214.200]) (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 713193BD643 for ; Wed, 26 Aug 2026 09:18:32 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.200 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1787735915; cv=none; b=ZM+za4XPvksy6WDqZTQBCKfneaHm1g3vBMoZKEg6IZoAoPdR45xtpAUURcqqWuY35lJGsbS2d3oU1GRPbxcn7oJR7Lyu3lGumQff3s8dzFrEtseGQTGPBGXSbXzwlBlNZ4WhHt1c45YLBWH6Gw+NxXA8JmzjICCW9wVYVUFwtxY= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1787735915; c=relaxed/simple; bh=+ysynpwUlV0mE4GyFNOI2YE86y5cHwtUdkUTLphgh10=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=o7FK9P932BUJPi6CuRODCOv0K03jRBuCv5J46/M09EqvEXDNYaxd6htNHRNXOxTLYXkZFkX70SLzdptXqwxv1Uwro2AoViLEzvBxAwzDg7HscJhrB4tVhPNZngjsQa6iuQLbTF6eORvk83hLSYMKSai8dpeSr954gine9QxlRRo= 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=lUcgvBy5; arc=none smtp.client-ip=209.85.214.200 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="lUcgvBy5" Received: by mail-pl1-f200.google.com with SMTP id d9443c01a7336-2cec4226c70so10272805ad.1 for ; Wed, 26 Aug 2026 02:18:32 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20251104; t=1787735912; x=1788340712; darn=vger.kernel.org; h=content-type:cc:to:from:subject:message-id:references:mime-version :in-reply-to:date:from:to:cc:subject:date:message-id:reply-to :content-type; bh=qJVghZcwIpdjw9VQGaPwDVy8Initc7amwnDZFFILhVg=; b=lUcgvBy5N9s9Svq9h+bw86bu/6lC1COr8CB8TnKWp+suYcqeeKPmnnjt4J3/z+oH4U 31Ph+Wetm2rba/0yjGNefAQphZOxcMhrhIaR9iEoI9DTXOpEwh3EFxTaMfdWx87OdtGO +forQshUt8/KCvmVHW5wTjJWpIV4tMVqOyynNpycIpefPc+Faa7jpNFZw5oYUtnfiH0x hehoHyT7ovzTYbWMHCRXLQ9TEaK7LOS9M/JAAxExkZGN+w0mqG8/+OKmSFxAD91zA+5X 1nJu3e/NWAVb4DvObBiIhq6HZe2oo+uyvtkA9PTiAZ0MawV0vYzQhvdAJpml3MM9Ce+E bM/g== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1787735912; x=1788340712; h=content-type: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:content-type; bh=qJVghZcwIpdjw9VQGaPwDVy8Initc7amwnDZFFILhVg=; b=gdOzGENWbLGO4ca1NNYyRKQh0xiMI5ZfXZd5n6+qv52O27x1sn20rFMS4GL8Fr9evz QBPsVtnjuqj+WWy8D9NHihOea+rF8ImtgprcAm62Q4A3gx1cn6hMyJaIaR6RGbVeDJdu TyObXyA9hbcdZrzhCFBWWAlqJjCU4UHxLuOZ3tA1BHMga8FwniiQSWbnktwdlM03jF/2 JYE4hupxBwbWiQKwgtYACQtxK4FiepevT3GhmGalZSAffKNsPsV2Sa6g21rdNTw/72Gb L1uPaQBH+SawoyLQG+VQtjuku/3Q72DHLj1irsbXIuKdNzOcItkXMGG0mgJnolFI8UrI 2UrA== X-Forwarded-Encrypted: i=1; AHgh+Rr9zzHG9L2vc5Mhm5gTbL5YNLZi2yBKM+lBfvO90NwIORV17Nfb4kBq1d4Jf9GIzPR03PKupgHTijh+RH8=@vger.kernel.org X-Gm-Message-State: AFuF++lch/1Mbuh5IoiGSOHXon3oqwPv5LdP3BiOJi23AHTZ1SdWUM0/ P50Zhmniq03VWx+ZVPr9ZPgjVTjKdH9jPKT9ZwJjchnT21uhWtidBDzt27exRTN0ioWwMN0ZuYt 9lyy4kWmYFPE2JghL+BD+kiSinQ== X-Received: from plbkt4.prod.google.com ([2002:a17:903:884:b0:2d5:e7d8:3c3b]) (user=ackerleytng job=prod-delivery.src-stubby-dispatcher) by 2002:a17:902:ce89:b0:2c9:e9db:8167 with SMTP id d9443c01a7336-2d707a5389bmr84223195ad.7.1787735911419; Wed, 26 Aug 2026 02:18:31 -0700 (PDT) Date: Wed, 26 Aug 2026 09:18:12 +0000 In-Reply-To: <20260826-gmem-inplace-conversion-v11-0-0a15d8a799aa@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20260826-gmem-inplace-conversion-v11-0-0a15d8a799aa@google.com> X-Developer-Key: i=ackerleytng@google.com; a=ed25519; pk=sAZDYXdm6Iz8FHitpHeFlCMXwabodTm7p8/3/8xUxuU= X-Developer-Signature: v=1; a=ed25519-sha256; t=1787735885; l=7723; i=ackerleytng@google.com; s=20260225; h=from:subject:message-id; bh=+ysynpwUlV0mE4GyFNOI2YE86y5cHwtUdkUTLphgh10=; b=iXQ98hLva2UqjB/f4knyONW86m4iuJ3Abi6gsqTTafU6aPgfFIfHAOwoBTVMp4Ow6urwELNC9 5xa4bXhDH4bDKYAAom2V/fChZaiI/Jpko29q7zx1pnUbJXrCUv9ZgO5 X-Mailer: b4 0.16.0 Message-ID: <20260826-gmem-inplace-conversion-v11-14-0a15d8a799aa@google.com> Subject: [PATCH v11 14/46] KVM: guest_memfd: Ensure pages are not in use before 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, jmattson@google.com, jthoughton@google.com, michael.roth@amd.com, oupton@kernel.org, pankaj.gupta@amd.com, qperret@google.com, rick.p.edgecombe@intel.com, rientjes@google.com, shivankg@amd.com, steven.price@arm.com, willy@infradead.org, wyihan@google.com, yan.y.zhao@intel.com, forkloop@google.com, pratyush@kernel.org, suzuki.poulose@arm.com, aneesh.kumar@kernel.org, liam@infradead.org, Paolo Bonzini , Sean Christopherson , Thomas Gleixner , Ingo Molnar , Borislav Petkov , Dave Hansen , x86@kernel.org, "H. Peter Anvin" , Steven Rostedt , Masami Hiramatsu , Mathieu Desnoyers , Jonathan Corbet , Shuah Khan , Shuah Khan , Vishal Annapurve , Andrew Morton , Chris Li , Kairui Song , Kemeng Shi , Nhat Pham , Barry Song , Axel Rasmussen , Yuanchu Xie , Wei Xu , Youngjun Park , Qi Zheng , Shakeel Butt , Kiryl Shutsemau , Baoquan He , Jason Gunthorpe , John Hubbard , Peter Xu , tarunsahu@google.com, Fuad Tabba , Vlastimil Babka Cc: kvm@vger.kernel.org, linux-kernel@vger.kernel.org, linux-trace-kernel@vger.kernel.org, linux-doc@vger.kernel.org, linux-kselftest@vger.kernel.org, linux-mm@kvack.org, linux-coco@lists.linux.dev, Ackerley Tng Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable When converting memory to private in guest_memfd, it is necessary to ensure that the pages are not currently being accessed by any other part of the kernel or userspace to avoid any current user writing to guest private memory. guest_memfd checks for any outstanding references to determine whether a page is still in use. The only expected references after unmapping the range requested for conversion are those that are held by guest_memfd itself. Update the kvm_memory_attributes2 structure to include an error_offset field. This allows KVM to report the exact offset where a conversion failed. If the safety check fails, return -EAGAIN and copy the error_offset back to userspace so that it can potentially retry the operation or handle the failure gracefully. Update documentation to document the error_offset field and the possible -EAGAIN error. Suggested-by: David Hildenbrand Co-developed-by: Vishal Annapurve Signed-off-by: Vishal Annapurve Reviewed-by: Fuad Tabba Tested-by: Shivank Garg Signed-off-by: Ackerley Tng --- Documentation/virt/kvm/api.rst | 19 +++++++++-- include/uapi/linux/kvm.h | 3 +- virt/kvm/guest_memfd.c | 77 ++++++++++++++++++++++++++++++++++++++= +--- 3 files changed, 91 insertions(+), 8 deletions(-) diff --git a/Documentation/virt/kvm/api.rst b/Documentation/virt/kvm/api.rst index 7aad097ffd392..f88d65b78c504 100644 --- a/Documentation/virt/kvm/api.rst +++ b/Documentation/virt/kvm/api.rst @@ -6594,7 +6594,7 @@ KVM_S390_KEYOP_SSKE :Capability: KVM_CAP_GUEST_MEMFD_MEMORY_ATTRIBUTES :Architectures: all :Type: guest_memfd ioctl -:Parameters: struct kvm_memory_attributes2 (in) +:Parameters: struct kvm_memory_attributes2 (in/out) :Returns: 0 on success, <0 on error =20 Errors: @@ -6603,6 +6603,8 @@ Errors: EINVAL The specified `offset` or `size` was 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 =20 @@ -6616,6 +6618,7 @@ Attribute values are shared with KVM_SET_MEMORY_ATTRI= BUTES. :: =20 struct kvm_memory_attributes2 { + /* in */ union { __u64 address; __u64 offset; @@ -6623,7 +6626,9 @@ Attribute values are shared with KVM_SET_MEMORY_ATTRI= BUTES. __u64 size; __u64 attributes; __u64 flags; - __u64 reserved[12]; + /* out */ + __u64 error_offset; + __u64 reserved[11]; }; =20 #define KVM_MEMORY_ATTRIBUTE_PRIVATE (1ULL << 3) @@ -6645,6 +6650,16 @@ which includes operations such as unmapping pages fr= om the host or stage-2 page tables, may result in side effects on memory contents that vary across different trusted firmware implementations. =20 +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/uapi/linux/kvm.h b/include/uapi/linux/kvm.h index ccbf7c475ec29..0ac9e6a790111 100644 --- a/include/uapi/linux/kvm.h +++ b/include/uapi/linux/kvm.h @@ -1662,7 +1662,8 @@ struct kvm_memory_attributes2 { __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/guest_memfd.c b/virt/kvm/guest_memfd.c index 2987611587b18..e4722eb6405b6 100644 --- a/virt/kvm/guest_memfd.c +++ b/virt/kvm/guest_memfd.c @@ -538,8 +538,46 @@ static int kvm_gmem_mas_preallocate(struct ma_state *m= as, u64 attributes, return mas_preallocate(mas, xa_mk_value(attributes), GFP_KERNEL); } =20 +static bool kvm_gmem_has_outstanding_references(struct inode *inode, + pgoff_t start, size_t nr_pages, + pgoff_t *err_index) +{ + struct address_space *mapping =3D inode->i_mapping; + pgoff_t last =3D start + nr_pages - 1; + bool has_outstanding =3D false; + struct folio_batch fbatch; + pgoff_t next; + int i; + + folio_batch_init(&fbatch); + + next =3D start; + while (has_outstanding && filemap_get_folios(mapping, &next, last, &fbatc= h)) { + for (i =3D 0; i < folio_batch_count(&fbatch); ++i) { + struct folio *folio =3D fbatch.folios[i]; + + /* + * Outstanding references are anything other than those + * from the page cache, plus 1 temporary reference held + * by filemap_get_folios() in the folio batch. + */ + if (folio_ref_count(folio) !=3D folio_nr_pages(folio) + 1) { + has_outstanding =3D true; + *err_index =3D max(start, folio->index); + break; + } + } + + folio_batch_release(&fbatch); + cond_resched(); + } + + return has_outstanding; +} + static int __kvm_gmem_set_attributes(struct inode *inode, pgoff_t start, - size_t nr_pages, uint64_t attrs) + size_t nr_pages, uint64_t attrs, + pgoff_t *err_index) { bool to_private =3D attrs & KVM_MEMORY_ATTRIBUTE_PRIVATE; struct address_space *mapping =3D inode->i_mapping; @@ -556,8 +594,28 @@ static int __kvm_gmem_set_attributes(struct inode *ino= de, pgoff_t start, =20 mas_init(&mas, mt, start); r =3D kvm_gmem_mas_preallocate(&mas, attrs, start, nr_pages); - if (r) + if (r) { + *err_index =3D start; goto out; + } + + if (to_private) { + /* + * Forcefully unmap the pages from all userspace page tables, + * and then verify there are no outstanding references, e.g. + * acquired via GUP or similar. Tell userspace to try again if + * there are outstanding references and hope that whatever has + * pinned the page will put its reference "soon". + */ + unmap_mapping_pages(mapping, start, nr_pages, false); + + if (kvm_gmem_has_outstanding_references(inode, start, nr_pages, + err_index)) { + mas_destroy(&mas); + r =3D -EAGAIN; + goto out; + } + } =20 /* * From this point on guest_memfd has performed necessary @@ -578,9 +636,10 @@ 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; + int i, r; =20 if (copy_from_user(&attrs, argp, sizeof(attrs))) return -EFAULT; @@ -606,8 +665,16 @@ static long kvm_gmem_set_attributes(struct file *file,= void __user *argp) =20 nr_pages =3D attrs.size >> PAGE_SHIFT; index =3D attrs.offset >> PAGE_SHIFT; - return __kvm_gmem_set_attributes(inode, index, nr_pages, - attrs.attributes); + r =3D __kvm_gmem_set_attributes(inode, index, nr_pages, attrs.attributes, + &err_index); + if (r) { + attrs.error_offset =3D ((uint64_t)err_index) << PAGE_SHIFT; + + if (copy_to_user(argp, &attrs, sizeof(attrs))) + return -EFAULT; + } + + return r; } =20 static long kvm_gmem_ioctl(struct file *file, unsigned int ioctl, --=20 2.55.0.887.g758fc8c411-goog From nobody Mon Sep 28 04:51:20 2026 Received: from mail-pg1-f199.google.com (mail-pg1-f199.google.com [209.85.215.199]) (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 743FE3D6664 for ; Wed, 26 Aug 2026 09:18:34 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.215.199 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1787735917; cv=none; b=bcJAZTxpEm5FgQopSsRCBwCOgjScgektrnACG+sW5gupM8lFv7Usw/vNhrrMfuehj3mOCqjlGA7JiPXqPeP8hOHOa7SijbDWoeSZEXQs2Ce0zwCA1JphzBOD9ibBVoumpbv7682WzSJaq+4PnRzks0JjHQ8Wk6/HwhAsuXCMjOI= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1787735917; c=relaxed/simple; bh=cfKDOJ7DvEwyC5tuG3+q7zNHiwlxy7Kdncb8W2kXAdk=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=OtW//MziZuTftWcESoZNX3KYvlsZztYiRuIqh+kOFyxAU6uW+xtcEPL8gnn/I/fRoZZ9IW6Pndz1mxIiXwqYGVpRd8wglgB+NIgfEYZyKr1YiPXmM7kwRqqjlrL7TOtWnEIsGFjy0YRoaCsvyUTcqNtMK74GlMl6sTffVwPZYxs= 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=SCyIzMH4; arc=none smtp.client-ip=209.85.215.199 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="SCyIzMH4" Received: by mail-pg1-f199.google.com with SMTP id 41be03b00d2f7-cbb20f82a0eso589849a12.0 for ; Wed, 26 Aug 2026 02:18:34 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20251104; t=1787735913; x=1788340713; darn=vger.kernel.org; h=content-type:cc:to:from:subject:message-id:references:mime-version :in-reply-to:date:from:to:cc:subject:date:message-id:reply-to :content-type; bh=63KksNRMPLdKIK2ffHPVavSJlAIn7eLDeJF6HOKSRZE=; b=SCyIzMH4mqJeBl6p5md+NcROROtXKTTLPMWETeNul5Y+QJNozO1TjtGiAhQezHz/Lj KhNvyG2UVznHtzrOPxGbWx8wMtNCX6//FZWPRa7tIjAJWLEMAs8SXF5k1nKTz8+l+vZB yNK3s8XyfA2pHDY3oFziP13VUPopRsj4HXeqQP3JQ0ccJp5p3uPpaXLY1HpO5/30fyug EP7hdr7wtbk2+EU3cqLllwKZgzISDFmJ/J44X57SZFWxiP5SNgcHFgsO22r6WQl+mkb5 HYS414oRdkmQ+5rMRh/a4v3xPhyfG3vZf7xmA+SntVxq2QiCVh0DodJMA0MjxYF0lnDD oJTg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1787735913; x=1788340713; h=content-type: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:content-type; bh=63KksNRMPLdKIK2ffHPVavSJlAIn7eLDeJF6HOKSRZE=; b=Xfh/WGM0N0o7EOTg6+6QAArG8pgoZX7uaV8Seb3jDkpuqCOvxJa+nJxFpl6eNxtmjk 80wlTOs7C2NzSxcvoNeGh+gPPHzrdvEqPhliaAPqDX0y+CtZCPzNh7UnQjYRh06+PNFg HHbBvoNt3GqkQ5EC9NvWqZDMdbpscbCV+cZcyZ6lQiQaJ5kLUvgHwg5yM6O1jdJBiY2h BIbZBkZsCpL1ZPKDZhAZxrkscnaYnDF2gNaK3sTudatTfypQJH4bSHhKcQAR1QBAMdxt Ut3KXC2v65NAYQmclFI//pNSo4rVmVZTNLhY7/7sJfVyz3SYDrlp1IsC9rjAMm82W2/k LB7w== X-Forwarded-Encrypted: i=1; AHgh+Rr1FyxebFQeWU3R/W87FWCiSVCg98iSSCctIXQ0a4qopR1pPoexBffzcK2DYwVuDbrP3e73hnM36hx7Tz4=@vger.kernel.org X-Gm-Message-State: AFuF++lnwTS1otySqP8B8oTbWILZUJD83Yi5kBCrqwX7XldyXqZqDtnD jw8l25KbD+2YqusFV+tPid2u5pX/GcyIBEVsxeiwAbeHL5dRCJCJmQoYLU+7oW6o34vvCPcFFnB sECAoMVd6a4Q5eOgzSyvM6X0g4w== X-Received: from pgcz13.prod.google.com ([2002:a63:7e0d:0:b0:c86:2164:967d]) (user=ackerleytng job=prod-delivery.src-stubby-dispatcher) by 2002:a05:6a21:8986:b0:3d0:868d:8ccb with SMTP id adf61e73a8af0-3d0868d974amr686524637.13.1787735913113; Wed, 26 Aug 2026 02:18:33 -0700 (PDT) Date: Wed, 26 Aug 2026 09:18:13 +0000 In-Reply-To: <20260826-gmem-inplace-conversion-v11-0-0a15d8a799aa@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20260826-gmem-inplace-conversion-v11-0-0a15d8a799aa@google.com> X-Developer-Key: i=ackerleytng@google.com; a=ed25519; pk=sAZDYXdm6Iz8FHitpHeFlCMXwabodTm7p8/3/8xUxuU= X-Developer-Signature: v=1; a=ed25519-sha256; t=1787735885; l=6544; i=ackerleytng@google.com; s=20260225; h=from:subject:message-id; bh=cfKDOJ7DvEwyC5tuG3+q7zNHiwlxy7Kdncb8W2kXAdk=; b=MMZaGAECpxklCf2BKRBYFhvWtCwjdKJ8nlLlIDN+BD1CFA4tZxsvWwbrbFHu/A54MMIyO+isw yfuQGoiyfH3Bt4RFA1hwR5XmAFrKGC9Lj6QAvTwtAmzCBhMn2uA7O3f X-Mailer: b4 0.16.0 Message-ID: <20260826-gmem-inplace-conversion-v11-15-0a15d8a799aa@google.com> Subject: [PATCH v11 15/46] KVM: guest_memfd: Call arch make_shared callback for to-shared 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, jmattson@google.com, jthoughton@google.com, michael.roth@amd.com, oupton@kernel.org, pankaj.gupta@amd.com, qperret@google.com, rick.p.edgecombe@intel.com, rientjes@google.com, shivankg@amd.com, steven.price@arm.com, willy@infradead.org, wyihan@google.com, yan.y.zhao@intel.com, forkloop@google.com, pratyush@kernel.org, suzuki.poulose@arm.com, aneesh.kumar@kernel.org, liam@infradead.org, Paolo Bonzini , Sean Christopherson , Thomas Gleixner , Ingo Molnar , Borislav Petkov , Dave Hansen , x86@kernel.org, "H. Peter Anvin" , Steven Rostedt , Masami Hiramatsu , Mathieu Desnoyers , Jonathan Corbet , Shuah Khan , Shuah Khan , Vishal Annapurve , Andrew Morton , Chris Li , Kairui Song , Kemeng Shi , Nhat Pham , Barry Song , Axel Rasmussen , Yuanchu Xie , Wei Xu , Youngjun Park , Qi Zheng , Shakeel Butt , Kiryl Shutsemau , Baoquan He , Jason Gunthorpe , John Hubbard , Peter Xu , tarunsahu@google.com, Fuad Tabba , Vlastimil Babka Cc: kvm@vger.kernel.org, linux-kernel@vger.kernel.org, linux-trace-kernel@vger.kernel.org, linux-doc@vger.kernel.org, linux-kselftest@vger.kernel.org, linux-mm@kvack.org, linux-coco@lists.linux.dev, Ackerley Tng , Fuad Tabba Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable When memory in guest_memfd is converted from private to shared, the platform-specific state associated with the guest-private pages must be invalidated or cleaned up. Iterate over the folios in the affected range and call the kvm_arch_gmem_make_shared() hook for each PFN range. This allows architectures to update hardware metadata or encryption states to transition pages to the shared state. Invoke this helper after indicating to KVM's mmu code that an invalidation is in progress to stop in-flight page faults from succeeding. Calling the invalidation helper also calls the arch invalidate hook. For SNP, this kicks any vCPU with a registered VMSA within the range being converted out of the guest. This ensures that make_shared never fails due to the VMSA page being in-use and is important because if make_shared fails, the RMP table would track the page as private while guest_memfd is unaware and tracks the page as shared. Omit support for calling the arch hook to make private, since SNP, the only implementer of the arch make-private hook today, would actually prefer making private only just before faulting memory into the NPTs. Calling the make-private arch hook would require iterating both bindings and the filemap to find the intersection of bindings and allocated folios. On top of that, SNP would need to figure out whether to actually make private based on whether the memory is about to be faulted, or whether it is a conversion. Calling the make-shared arch hook and not the make-private arch hook does leak SNP-specific details into guest_memfd (as in, why only make-shared during conversions but not make-private?), but the additional complexity is not worth taking on until guest_memfd has a user actually requiring an arch make-private call. Reviewed-by: Fuad Tabba Signed-off-by: Ackerley Tng --- arch/x86/include/asm/kvm-x86-ops.h | 2 +- arch/x86/include/asm/kvm_host.h | 2 +- arch/x86/kvm/x86.c | 5 +++++ include/linux/kvm_host.h | 1 + virt/kvm/guest_memfd.c | 42 ++++++++++++++++++++++++++++++++++= ++++ 5 files changed, 50 insertions(+), 2 deletions(-) diff --git a/arch/x86/include/asm/kvm-x86-ops.h b/arch/x86/include/asm/kvm-= x86-ops.h index e213c9ae3e301..67b43c167045b 100644 --- a/arch/x86/include/asm/kvm-x86-ops.h +++ b/arch/x86/include/asm/kvm-x86-ops.h @@ -150,7 +150,7 @@ KVM_X86_OP_OPTIONAL(alloc_apic_backing_page) #ifdef CONFIG_HAVE_KVM_ARCH_GMEM_CONVERT KVM_X86_OP_OPTIONAL_RET0(gmem_make_private) #endif -#ifdef CONFIG_HAVE_KVM_ARCH_GMEM_RECLAIM +#if defined(CONFIG_HAVE_KVM_ARCH_GMEM_CONVERT) || defined(CONFIG_HAVE_KVM_= ARCH_GMEM_RECLAIM) KVM_X86_OP_OPTIONAL(gmem_make_shared) #endif #ifdef CONFIG_HAVE_KVM_ARCH_GMEM_INVALIDATE diff --git a/arch/x86/include/asm/kvm_host.h b/arch/x86/include/asm/kvm_hos= t.h index 744c1f6ff03ed..83e26ce45fb79 100644 --- a/arch/x86/include/asm/kvm_host.h +++ b/arch/x86/include/asm/kvm_host.h @@ -1732,7 +1732,7 @@ struct kvm_x86_ops { int (*gmem_make_private)(struct kvm *kvm, gfn_t gfn, kvm_pfn_t pfn, kvm_pfn_t nr_pages); #endif -#ifdef CONFIG_HAVE_KVM_ARCH_GMEM_RECLAIM +#if defined(CONFIG_HAVE_KVM_ARCH_GMEM_CONVERT) || defined(CONFIG_HAVE_KVM_= ARCH_GMEM_RECLAIM) void (*gmem_make_shared)(kvm_pfn_t pfn, kvm_pfn_t nr_pages); #endif #ifdef CONFIG_HAVE_KVM_ARCH_GMEM_INVALIDATE diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c index 29e41d334cedf..147b3e529cd26 100644 --- a/arch/x86/kvm/x86.c +++ b/arch/x86/kvm/x86.c @@ -10653,6 +10653,11 @@ int kvm_arch_gmem_make_private(struct kvm *kvm, gf= n_t gfn, kvm_pfn_t pfn, { return kvm_x86_call(gmem_make_private)(kvm, gfn, pfn, nr_pages); } + +void kvm_arch_gmem_make_shared(kvm_pfn_t pfn, kvm_pfn_t nr_pages) +{ + kvm_x86_call(gmem_make_shared)(pfn, nr_pages); +} #endif =20 #ifdef CONFIG_HAVE_KVM_ARCH_GMEM_RECLAIM diff --git a/include/linux/kvm_host.h b/include/linux/kvm_host.h index ab87effdd221f..485f18454eb45 100644 --- a/include/linux/kvm_host.h +++ b/include/linux/kvm_host.h @@ -2610,6 +2610,7 @@ static inline int kvm_gmem_get_pfn(struct kvm *kvm, =20 int kvm_arch_gmem_make_private(struct kvm *kvm, gfn_t gfn, kvm_pfn_t pfn, kvm_pfn_t nr_pages); +void kvm_arch_gmem_make_shared(kvm_pfn_t pfn, kvm_pfn_t nr_pages); #ifndef CONFIG_HAVE_KVM_ARCH_GMEM_CONVERT #define kvm_arch_has_gmem_convert() false #endif diff --git a/virt/kvm/guest_memfd.c b/virt/kvm/guest_memfd.c index e4722eb6405b6..d1134b23576e4 100644 --- a/virt/kvm/guest_memfd.c +++ b/virt/kvm/guest_memfd.c @@ -575,6 +575,43 @@ static bool kvm_gmem_has_outstanding_references(struct= inode *inode, return has_outstanding; } =20 +#ifdef CONFIG_HAVE_KVM_ARCH_GMEM_CONVERT +static void kvm_gmem_make_shared(struct inode *inode, pgoff_t start, pgoff= _t end) +{ + struct folio_batch fbatch; + pgoff_t next =3D start; + int i; + + folio_batch_init(&fbatch); + while (filemap_get_folios(inode->i_mapping, &next, end - 1, &fbatch)) { + for (i =3D 0; i < folio_batch_count(&fbatch); ++i) { + struct folio *folio =3D fbatch.folios[i]; + pgoff_t start_index, end_index; + kvm_pfn_t start_pfn; + kvm_pfn_t nr_pages; + + start_index =3D max(start, folio->index); + end_index =3D min(end, folio_next_index(folio)); + /* + * end_index is either in folio or points to + * the first page of the next folio. Hence, + * all pages in range [start_index, end_index) + * are contiguous. + */ + start_pfn =3D folio_file_pfn(folio, start_index); + nr_pages =3D end_index - start_index; + + kvm_arch_gmem_make_shared(start_pfn, nr_pages); + } + + folio_batch_release(&fbatch); + cond_resched(); + } +} +#else +static void kvm_gmem_make_shared(struct inode *inode, pgoff_t start, pgoff= _t end) {} +#endif + static int __kvm_gmem_set_attributes(struct inode *inode, pgoff_t start, size_t nr_pages, uint64_t attrs, pgoff_t *err_index) @@ -624,7 +661,12 @@ static int __kvm_gmem_set_attributes(struct inode *ino= de, pgoff_t start, =20 filter =3D to_private ? KVM_FILTER_SHARED : KVM_FILTER_PRIVATE; kvm_gmem_invalidate_start(inode, start, end, filter); + + if (!to_private && kvm_arch_has_gmem_convert()) + kvm_gmem_make_shared(inode, start, end); + mas_store_prealloc(&mas, xa_mk_value(attrs)); + kvm_gmem_invalidate_end(inode, start, end); out: filemap_invalidate_unlock(mapping); --=20 2.55.0.887.g758fc8c411-goog From nobody Mon Sep 28 04:51:20 2026 Received: from mail-pl1-f198.google.com (mail-pl1-f198.google.com [209.85.214.198]) (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 5B0B43D9540 for ; Wed, 26 Aug 2026 09:18:37 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.198 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1787735920; cv=none; b=dGK88VLbTSccgLgyWob41Yen8XrJEU6dSOyqQJyps8xkpSHZ6ZiaDNr68+kXdA2zcHyWISeT08957J/DKbWY/LcVxY7yqE0LvN5q3VcceQ4/zRT3STWxa901/sz6PQbNukII0TLpNNQUqLFlV84rtj+TFCex6+dSnEdSt7pA5xI= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1787735920; c=relaxed/simple; bh=5Zy0wgRHoYXULlg01g6F2vvkEu14R8QvWTtrIAn8XBM=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=VFe/ycAF/hlSbJPkv07eKhrttd3rCuMUjfUpwPDKJdaUVoDyPcaF7jN90pVqADrCkbiPmnsqP2kj1I6ZUAnwCOhtdmnejp9V1wDYb9GLnl2JBx+uZcH74mOiKm+Bl8d5swi4nFBD9XjTGaAQQNJ7K3/iLapQ9eUWUoEonqJZowA= 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=vD2s2keY; arc=none smtp.client-ip=209.85.214.198 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="vD2s2keY" Received: by mail-pl1-f198.google.com with SMTP id d9443c01a7336-2d6f80c76e6so10325835ad.3 for ; Wed, 26 Aug 2026 02:18:37 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20251104; t=1787735915; x=1788340715; darn=vger.kernel.org; h=content-type:cc:to:from:subject:message-id:references:mime-version :in-reply-to:date:from:to:cc:subject:date:message-id:reply-to :content-type; bh=D9viyxfvYsSlaAuG4kZ9V8QlGv88Bbdqdj5aKht9VSg=; b=vD2s2keYcKLUg9jv8wtF/cuyEqMfESMHDCmA3GIvTHX2qSwIe2H0S7roM2hANWMn74 xuSHBElwhOxn0GtDxY+d65hbstwOt5+EsHlKSfSJGz4fLrxDBFvtb7t25WB59JY2bZo7 pJ3WM5dFpWykYwpmHc64f0bBTGZyFQ+kQ2APZs6lOwIktzWV2IM4KMiAgGzf2udDlw8+ daY1s3E2jc+K8zbiwysBli0mAcknRMcg2aoenSYnWuLTtItrPTTspDewvbHYGNoyaUzW Yfb+H10gO8YBXzhAUesKWS8/iMt3FsbjrdRaQrjHPjEidRKlAT8LzjPJ4tL3YQKsWj97 Aphg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1787735915; x=1788340715; h=content-type: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:content-type; bh=D9viyxfvYsSlaAuG4kZ9V8QlGv88Bbdqdj5aKht9VSg=; b=i6gof094EbdzTRKoMo7DjdkOzsIC06EkSTy15zAYd9BfOxP5FMlMWZSIexRkdfdH8/ Sm0ru18MB4vUw3oBNCIpXZLgACtNVUjYWAY5Ks9qsYEKkQs6XLRjO/Qa89fYIi3pV597 fq1OrKFcWfUTPQ/enNyw6dh9pCVipLUpLyAxXeulE820Ob92363We+ep5xRoGlFID8/8 bAi7nRLHJdgV0hDQ2mPk2i5Qjo6m2EFTZXXoQoQTMYxc918nKzhg3HyMV0/fe9lZ6+jJ 0P6bqDVo1/6dEx/pia24IBXkIGJVFSMDnnib2amU897mcqBuD/nKz0VLDBuUEjTQfhHg GCuw== X-Forwarded-Encrypted: i=1; AHgh+RqdnU+fWNu8ezuiryMFeFjmk1hNzjulApjBzRnHPhjBY+XB5AKmrFBKPsQWjjdjoMBHLB5oaFCtlSo5jgg=@vger.kernel.org X-Gm-Message-State: AFuF++l3E8ya6MdkB3IICDTdIWtyALYDheKRwYuXAsNG2xSugVjdMFMr O6KTeyqCg5ekS6sh7ntDOO3gm8VRazZe0kZt/UG2cwWfoNbAslbOsJA/P6mqy4R7f7aoN47y8Y/ uatrM8d6QXABCHdHIFmiKBJVypA== X-Received: from plmt11.prod.google.com ([2002:a17:903:3d4b:b0:2d0:34d:e973]) (user=ackerleytng job=prod-delivery.src-stubby-dispatcher) by 2002:a17:903:22ca:b0:2d6:fd55:3a9d with SMTP id d9443c01a7336-2d707a55a21mr87392135ad.3.1787735914764; Wed, 26 Aug 2026 02:18:34 -0700 (PDT) Date: Wed, 26 Aug 2026 09:18:14 +0000 In-Reply-To: <20260826-gmem-inplace-conversion-v11-0-0a15d8a799aa@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20260826-gmem-inplace-conversion-v11-0-0a15d8a799aa@google.com> X-Developer-Key: i=ackerleytng@google.com; a=ed25519; pk=sAZDYXdm6Iz8FHitpHeFlCMXwabodTm7p8/3/8xUxuU= X-Developer-Signature: v=1; a=ed25519-sha256; t=1787735885; l=1963; i=ackerleytng@google.com; s=20260225; h=from:subject:message-id; bh=5Zy0wgRHoYXULlg01g6F2vvkEu14R8QvWTtrIAn8XBM=; b=hJwcYJYD3aQhvV9hZ30dJZ8oFevxPiomh64e9F++PWR61XHxRgbkXw3b9UE+Q/itDtGXtMPp4 zJhf3vH1eeDAA7nHPjekSt0TG32A8zYAxjhuYb571OlL26p5daTs2K6 X-Mailer: b4 0.16.0 Message-ID: <20260826-gmem-inplace-conversion-v11-16-0a15d8a799aa@google.com> Subject: [PATCH v11 16/46] KVM: guest_memfd: Return early if range already has requested 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, jmattson@google.com, jthoughton@google.com, michael.roth@amd.com, oupton@kernel.org, pankaj.gupta@amd.com, qperret@google.com, rick.p.edgecombe@intel.com, rientjes@google.com, shivankg@amd.com, steven.price@arm.com, willy@infradead.org, wyihan@google.com, yan.y.zhao@intel.com, forkloop@google.com, pratyush@kernel.org, suzuki.poulose@arm.com, aneesh.kumar@kernel.org, liam@infradead.org, Paolo Bonzini , Sean Christopherson , Thomas Gleixner , Ingo Molnar , Borislav Petkov , Dave Hansen , x86@kernel.org, "H. Peter Anvin" , Steven Rostedt , Masami Hiramatsu , Mathieu Desnoyers , Jonathan Corbet , Shuah Khan , Shuah Khan , Vishal Annapurve , Andrew Morton , Chris Li , Kairui Song , Kemeng Shi , Nhat Pham , Barry Song , Axel Rasmussen , Yuanchu Xie , Wei Xu , Youngjun Park , Qi Zheng , Shakeel Butt , Kiryl Shutsemau , Baoquan He , Jason Gunthorpe , John Hubbard , Peter Xu , tarunsahu@google.com, Fuad Tabba , Vlastimil Babka Cc: kvm@vger.kernel.org, linux-kernel@vger.kernel.org, linux-trace-kernel@vger.kernel.org, linux-doc@vger.kernel.org, linux-kselftest@vger.kernel.org, linux-mm@kvack.org, linux-coco@lists.linux.dev, Ackerley Tng , Xiaoyao Li Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Provide a function to check that a range has given attributes. Optimize setting memory attributes by returning early if all pages in the requested range already have the requested attributes. Reviewed-by: Fuad Tabba Tested-by: Shivank Garg Reviewed-by: Binbin Wu Reviewed-by: Xiaoyao Li Signed-off-by: Ackerley Tng --- virt/kvm/guest_memfd.c | 23 ++++++++++++++++++++++- 1 file changed, 22 insertions(+), 1 deletion(-) diff --git a/virt/kvm/guest_memfd.c b/virt/kvm/guest_memfd.c index d1134b23576e4..6dc199be0eb87 100644 --- a/virt/kvm/guest_memfd.c +++ b/virt/kvm/guest_memfd.c @@ -98,6 +98,24 @@ static bool kvm_gmem_is_shared_mem(struct inode *inode, = pgoff_t index) return !kvm_gmem_is_private_mem(inode, index); } =20 +static bool kvm_gmem_range_has_attributes(struct inode *inode, + pgoff_t index, size_t nr_pages, + u64 attributes) +{ + struct maple_tree *mt =3D &GMEM_I(inode)->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 (kvm_gmem_get_attributes(inode, entry) !=3D attributes) + return false; + } + + return true; +} + /* * Returns a locked folio on success. The caller is responsible for * setting the up-to-date flag before the memory is mapped into the guest. @@ -623,12 +641,15 @@ static int __kvm_gmem_set_attributes(struct inode *in= ode, pgoff_t start, pgoff_t end =3D start + nr_pages; struct maple_tree *mt; struct ma_state mas; - int r; + int r =3D 0; =20 mt =3D &gi->attributes; =20 filemap_invalidate_lock(mapping); =20 + if (kvm_gmem_range_has_attributes(inode, start, nr_pages, attrs)) + goto out; + mas_init(&mas, mt, start); r =3D kvm_gmem_mas_preallocate(&mas, attrs, start, nr_pages); if (r) { --=20 2.55.0.887.g758fc8c411-goog From nobody Mon Sep 28 04:51:20 2026 Received: from mail-pl1-f197.google.com (mail-pl1-f197.google.com [209.85.214.197]) (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 3B46C3BB112 for ; Wed, 26 Aug 2026 09:18:38 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.197 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1787735923; cv=none; b=rSWpgYMyk3QYCreK4oWtZ4cHOCSLFpqjnv58YjB3Vi99gyVTs/+9Cz6K3SBvsC64Ilh+B/8E2EHyXSPnSADcUUpHzBl6Tr9EUnJAXOrWmHGpOIw8DzJpviL1T+RTcB3RQqiIetzH3IhTCeM6MMO56bsrLQ8Dy79icSnpSxJKKCo= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1787735923; c=relaxed/simple; bh=e4S0ntw6a4F+aKPymVSCxm2tk+SUEZ6S7wIWlorrhEQ=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=tlFuhfaWjeQLt68zDwBlqLf2xYaHpN1UsN+pt1uDF/r3TwnVaJ0ZKnv99o5QP9oAFoAJ6daF6K8UgfqA6j0GYCWMlEYTtHBot9JirT4fnIyNlQo22xBRffbitRMZPZ8K7y7sW0907EQazBQ7k/m5/wzIfOBdFAPl4sbPWGeVg58= 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=M7bU53If; arc=none smtp.client-ip=209.85.214.197 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="M7bU53If" Received: by mail-pl1-f197.google.com with SMTP id d9443c01a7336-2d5d00fd19bso16665435ad.1 for ; Wed, 26 Aug 2026 02:18:38 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20251104; t=1787735917; x=1788340717; darn=vger.kernel.org; h=content-type:cc:to:from:subject:message-id:references:mime-version :in-reply-to:date:from:to:cc:subject:date:message-id:reply-to :content-type; bh=wc3a2+OEtllLGwqS/G4AFzAVkgMCaAbj12kGjFWNwhs=; b=M7bU53Ifhcg7ngsfUQD2TfxhlU5cVpNIzP/dMvkOERauVbNgnvfxuj8zyCU8ZggBSM XTg8mKaqTuSqGQ1kKrbQvXgUyOUGibmUxPOmaf2xNc9T5GpzPs3u2WU/w4Yew8dtYMgi BOMjgzdLH9BJhzUYlJEyKGUTZ8rL/8oVFLymlrobUjDNRoqk9GTegx+c1Qk2VLg7gINk a6eCLBl2x8dkwVb3gsb1u+5hpW7IICt+3CkprckMWjYpq02nck/WXtjI5ELprpz4R4eD z6SvGvTt+v1TdDrKrwA+rXk+MwVM3zeK4uXPMO9AK7hF9Ql92/wIjyqoTxAx155PwNQX WBDg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1787735917; x=1788340717; h=content-type: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:content-type; bh=wc3a2+OEtllLGwqS/G4AFzAVkgMCaAbj12kGjFWNwhs=; b=pxxI5FQR8FVgXft7dzOsKufToumILWed3yQtIbs+W1CiTBCUAXJHlpbqXC3lITS9Dd pAuHJ+hW6iqIhjUXf8mjMEtOMET0ia01pR1ZGFw4cIvped5P5iJl0iZLJXDZ3dRgyu97 qngMW+vvNCynO4VOSduojczjRiO3f00a6J55u7C5Pm4bNgR0XpjMoPjsVKZqHKizluq0 rGu0EsRXlhxPXfYMtZ468ATuIIRgShxhnMFkLg4ZOHUudbvUm4aQZfRwzU0INvGlioER ZKjJubdzlt08zvT+AVDyVFsZMzfFnMfPAKS3imMewf+QgCXcf/gaKLzssjqfKqSqJPQe 44IA== X-Forwarded-Encrypted: i=1; AHgh+Rqn3rcMZfbRdS/st9l+WpiUS/+jfjTaqDB5XV2EZXqeW/24hxwUfmjrqfixtphuZHWDixUyMlsQPe1eLu4=@vger.kernel.org X-Gm-Message-State: AFuF++laH26Uy/j8WpBl3TDz9VY11QTJ+HE0lhT52kapvH/FX0XzPUlg Q2HDG4YvhUMyw2SNhuhu3JdGVP1VGconNQPg2VBr/asDM3z9oO1ubKvYpEhh7vPDOkGuN+Z1AzD 76WxY2SEtnB04/XUBVT9UoFNtYg== X-Received: from plbcp5.prod.google.com ([2002:a17:902:e785:b0:2ca:b48c:5a92]) (user=ackerleytng job=prod-delivery.src-stubby-dispatcher) by 2002:a17:903:324f:b0:2cc:f5b8:4c2e with SMTP id d9443c01a7336-2d707b45a87mr94906615ad.9.1787735916498; Wed, 26 Aug 2026 02:18:36 -0700 (PDT) Date: Wed, 26 Aug 2026 09:18:15 +0000 In-Reply-To: <20260826-gmem-inplace-conversion-v11-0-0a15d8a799aa@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20260826-gmem-inplace-conversion-v11-0-0a15d8a799aa@google.com> X-Developer-Key: i=ackerleytng@google.com; a=ed25519; pk=sAZDYXdm6Iz8FHitpHeFlCMXwabodTm7p8/3/8xUxuU= X-Developer-Signature: v=1; a=ed25519-sha256; t=1787735885; l=5838; i=ackerleytng@google.com; s=20260225; h=from:subject:message-id; bh=GtZbHtkgKKmD1ykIZ1T+aJT4kkhlUaxT1aZ4xCvFTqw=; b=31p44BxawoGJ9r8IPJTTeLYxIv5u9shr6L2B0Osy/+Cr+0UKzzsl7/FoRJOIg3vjXE6Tkm2yX UgwpvmnCSctDh5OfgPRHQt5miKkx2TMsXdZLvmxNKBAoutH51xOD2oC X-Mailer: b4 0.16.0 Message-ID: <20260826-gmem-inplace-conversion-v11-17-0a15d8a799aa@google.com> Subject: [PATCH v11 17/46] mm/gup: factor out LRU cache draining for folio into lru_cache_drain_for_folio() 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, jmattson@google.com, jthoughton@google.com, michael.roth@amd.com, oupton@kernel.org, pankaj.gupta@amd.com, qperret@google.com, rick.p.edgecombe@intel.com, rientjes@google.com, shivankg@amd.com, steven.price@arm.com, willy@infradead.org, wyihan@google.com, yan.y.zhao@intel.com, forkloop@google.com, pratyush@kernel.org, suzuki.poulose@arm.com, aneesh.kumar@kernel.org, liam@infradead.org, Paolo Bonzini , Sean Christopherson , Thomas Gleixner , Ingo Molnar , Borislav Petkov , Dave Hansen , x86@kernel.org, "H. Peter Anvin" , Steven Rostedt , Masami Hiramatsu , Mathieu Desnoyers , Jonathan Corbet , Shuah Khan , Shuah Khan , Vishal Annapurve , Andrew Morton , Chris Li , Kairui Song , Kemeng Shi , Nhat Pham , Barry Song , Axel Rasmussen , Yuanchu Xie , Wei Xu , Youngjun Park , Qi Zheng , Shakeel Butt , Kiryl Shutsemau , Baoquan He , Jason Gunthorpe , John Hubbard , Peter Xu , tarunsahu@google.com, Fuad Tabba , Vlastimil Babka Cc: kvm@vger.kernel.org, linux-kernel@vger.kernel.org, linux-trace-kernel@vger.kernel.org, linux-doc@vger.kernel.org, linux-kselftest@vger.kernel.org, linux-mm@kvack.org, linux-coco@lists.linux.dev, Ackerley Tng Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable From: "David Hildenbrand (Arm)" KVM with guest_memfd wants to remove any folio references due to LRU caches, as it really must only allow to convert folios from shared to private when there are no unexpected folio references (e.g., from GUP references). So, to drive the refcount down, it needs a way to flush the LRU caches. Let's factor out what we have in lru_cache_drain_for_folio(). Document it, and also mention that concurrent folio (un)mapping might, in theory, miss detecting LRU cache references. Keep obtaining the expected refcount twice to minimize the possibility. For the current and future user that should work, and we don't really have a better alternative: we could detect if the mapcount changed, but it would still be racy and add more complexity with questionable benefit. Maybe there is a chance to avoid the draining entirely in the future, by avoiding extra references from the LRU cache: Hugh thinks there might be a way. But for the time being, this handling is unfortunately required. Make folio_may_be_lru_cached() accept a const pointer so lru_cache_drain_for_folio() can accept a const pointer as well. Signed-off-by: David Hildenbrand (Arm) Signed-off-by: Ackerley Tng --- include/linux/swap.h | 11 ++++++++++- mm/gup.c | 20 +++++++------------- mm/swap.c | 46 ++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 63 insertions(+), 14 deletions(-) diff --git a/include/linux/swap.h b/include/linux/swap.h index 8f0f68e245baa..e625d64c9e13d 100644 --- a/include/linux/swap.h +++ b/include/linux/swap.h @@ -317,7 +317,7 @@ void folio_add_lru_vma(struct folio *, struct vm_area_s= truct *); void mark_page_accessed(struct page *); void folio_mark_accessed(struct folio *); =20 -static inline bool folio_may_be_lru_cached(struct folio *folio) +static inline bool folio_may_be_lru_cached(const struct folio *folio) { /* * Holding PMD-sized folios in per-CPU LRU cache unbalances accounting. @@ -344,6 +344,15 @@ extern void lru_add_drain(void); extern void lru_add_drain_cpu(int cpu); extern void lru_add_drain_cpu_zone(struct zone *zone); extern void lru_add_drain_all(void); + +enum lru_cache_drained { + LRU_CACHE_NOT_DRAINED, + LRU_CACHE_DRAINED, + LRU_CACHE_DRAINED_ALL, +}; +void lru_cache_drain_for_folio(const struct folio *folio, + unsigned int extra_refs, enum lru_cache_drained *drained); + void folio_deactivate(struct folio *folio); void folio_mark_lazyfree(struct folio *folio); extern void swap_setup(void); diff --git a/mm/gup.c b/mm/gup.c index 0692119b79043..fb0995dc495fc 100644 --- a/mm/gup.c +++ b/mm/gup.c @@ -2266,9 +2266,9 @@ static unsigned long collect_longterm_unpinnable_foli= os( struct list_head *movable_folio_list, struct pages_or_folios *pofs) { + enum lru_cache_drained drained =3D LRU_CACHE_NOT_DRAINED; unsigned long collected =3D 0; struct folio *folio; - int drained =3D 0; long i =3D 0; =20 for (folio =3D pofs_get_folio(pofs, i); folio; @@ -2287,18 +2287,12 @@ static unsigned long collect_longterm_unpinnable_fo= lios( continue; } =20 - if (drained =3D=3D 0 && folio_may_be_lru_cached(folio) && - folio_ref_count(folio) !=3D - folio_expected_ref_count(folio) + 1) { - lru_add_drain(); - drained =3D 1; - } - if (drained =3D=3D 1 && folio_may_be_lru_cached(folio) && - folio_ref_count(folio) !=3D - folio_expected_ref_count(folio) + 1) { - lru_add_drain_all(); - drained =3D 2; - } + /* + * We drain not only to make the folio_isolate_lru() succeed, + * but also to remove any other folio references from LRU + * caches. + */ + lru_cache_drain_for_folio(folio, 1, &drained); =20 if (!folio_isolate_lru(folio)) continue; diff --git a/mm/swap.c b/mm/swap.c index 588f50d8f1a8c..8e965c8ce9aa9 100644 --- a/mm/swap.c +++ b/mm/swap.c @@ -950,6 +950,52 @@ void lru_add_drain_all(void) } #endif /* CONFIG_SMP */ =20 +/** + * lru_cache_drain_for_folio() - drain LRU caches if the caches might hold + * folio references + * @folio: The folio. + * @extra_refs: Extra folio references held by the caller. + * @drained: Drain status for batch folio processing. + * + * Drain LRU caches if the caches might hold folio references. Start + * with a local LRU cache drain, to then drain LRU caches on all CPUs if + * local draining was insufficient. + * + * This function detects LRU cache references by comparing the folio refco= unt + * with the sum of the expected folio refcount + extra references held by = the + * caller. Note that we cannot rely on PG_lru to reliably detect all LRU + * cache references, and there are rare scenarios (concurrent folio (un)ma= pping) + * where this function might miss detecting LRU cache references. + * + * If @drained is not NULL, the function will avoid re-draining LRU caches + * when processing multiple folios in a row. In that case, the variable + * @drained points at must be initialized to LRU_CACHE_NOT_DRAINED before + * the first invocation by the caller. + */ +void lru_cache_drain_for_folio(const struct folio *folio, + unsigned int extra_refs, enum lru_cache_drained *drained) +{ + if (!folio_may_be_lru_cached(folio)) + return; + + if (!drained || *drained =3D=3D LRU_CACHE_NOT_DRAINED) { + if (folio_ref_count(folio) =3D=3D + folio_expected_ref_count(folio) + extra_refs) + return; + lru_add_drain(); + if (drained) + *drained =3D LRU_CACHE_DRAINED; + } + if (!drained || *drained =3D=3D LRU_CACHE_DRAINED) { + if (folio_ref_count(folio) =3D=3D + folio_expected_ref_count(folio) + extra_refs) + return; + lru_add_drain_all(); + if (drained) + *drained =3D LRU_CACHE_DRAINED_ALL; + } +} + atomic_t lru_disable_count =3D ATOMIC_INIT(0); =20 /* --=20 2.55.0.887.g758fc8c411-goog From nobody Mon Sep 28 04:51:20 2026 Received: from mail-pg1-f197.google.com (mail-pg1-f197.google.com [209.85.215.197]) (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 2220139DBF4 for ; Wed, 26 Aug 2026 09:18:40 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.215.197 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1787735926; cv=none; b=YGOEoEw7QNkzNRBxtDfKQxVBefKMu0T3EZhsyrQZ1MnOG2Yk6iyFQFfXChNDjgL/0eJ/62n+Uy8FBNpqzcVmJnU2S3w4TYhNUIs1cllCisRJ1LypTw8j2kmedP0HtH52VImCh61AQklvyGV4DwJru78XOhRr8tTVPk4JHtgyo8s= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1787735926; c=relaxed/simple; bh=ZTwn4UyMShrGZfEU90otJVup2JEojFMgiToKCnnSVVE=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=dOSfNGliHsllhdit428dXLcTPcx5CwroOIInVKa1BRjEKIpq9V1sx5BDboSWrqOR62fcsLhGQq1tHXuZnifPVGdLz+jW5aLyQZxs9Fw3s0vLwnLqDRZVnjbgynPqrjEQ7KpzzjlToLANNHtAHyKiyYLJ97Cfo+IOp9Hx3tQUyoc= 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=fdcfcOy6; arc=none smtp.client-ip=209.85.215.197 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="fdcfcOy6" Received: by mail-pg1-f197.google.com with SMTP id 41be03b00d2f7-cbb92868263so591878a12.2 for ; Wed, 26 Aug 2026 02:18:40 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20251104; t=1787735919; x=1788340719; darn=vger.kernel.org; h=content-type:cc:to:from:subject:message-id:references:mime-version :in-reply-to:date:from:to:cc:subject:date:message-id:reply-to :content-type; bh=S/nf3e4536rn08VcIwbRdla3FrzM9D86FJQTH62XB18=; b=fdcfcOy6HRtOZ73daoZ5zvlxhHTJKMPmTvGcbBfkxdVGLpx3kgm6YEpnNEh81jifWj CidD8pxMoBESJ7UJeWnsesrZF/vzaLA54i2t/Xqfpz2dDw4Kf9vX+RtnCjmeoT8+klXg XshsxVoedZMoxvIP2qqi68MuIUINPr5nkAKdG++Iqq7QH2GGKgbhF7RTE23u8NrjklBp 4r55oCaQsEjXKwfMDQmdwEjkuyv9wCe9C8u0yRAcxKAWGLPmz6/AOcz42cyaLv07vgEj pdd779s8A3cF3YCBTuKdRDUyvEw7KS13FAwHSzmqFa+QCIF45BaJo3JDL0cyEERLHrTJ qu8Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1787735919; x=1788340719; h=content-type: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:content-type; bh=S/nf3e4536rn08VcIwbRdla3FrzM9D86FJQTH62XB18=; b=goyUKZv0GyuEDsF4sd0IHpJEwZeutDUimHKT5O/0lXtMsfQ5QKSjrMwibzYQsLl4vS g8iP2FZM2KPhjXtN20jx0HQkx8O4aTWUJvu7Pci0gldXSFzRETlogb+322MQM8yyZ5Pk aqbViv7vrxVW2WQaK7lR2Fw9bkvX57kO19xWscEdhaBIvTjzfbBuPHkSiOhwd9/CRf0T AQN/wBTJRbWRRN7UFcK5wia2H0ddhMaG4ILGPtraiE6/xnR8ldNTagCgPQQYGRz6RTfJ OLb42XSW6P4b25YYeqbPwXNsQGMxJbGhf7hTTdD2QnsAXTG2siPvHQz/LxnJs6kwo7vw /IWA== X-Forwarded-Encrypted: i=1; AHgh+RoCYIkjvipnO1s5V4YEjn4iPd92SJi5I2nAlAgdwacoyPwwbLjP3qOzr2PRq/NS4KhSWYrK03YS3IvKCSY=@vger.kernel.org X-Gm-Message-State: AFuF++nfJv0xQWvpQes6ajI77oknwddvynIzPTTN/S4OCcLKZMSYqepU oRRmSgmYzwPolkkeOVXfnGKY7VeD1/odEE1Je7HowImttmc1YStN3oOMKO5WCE7begGqBdISok1 hpfKOVihUm5lPPn5WBoADrEnT2g== X-Received: from pgig7.prod.google.com ([2002:a63:f407:0:b0:cc1:c7d3:7c7b]) (user=ackerleytng job=prod-delivery.src-stubby-dispatcher) by 2002:a05:6a21:a383:b0:3cd:8d15:895e with SMTP id adf61e73a8af0-3cf84b53689mr11572460637.12.1787735918168; Wed, 26 Aug 2026 02:18:38 -0700 (PDT) Date: Wed, 26 Aug 2026 09:18:16 +0000 In-Reply-To: <20260826-gmem-inplace-conversion-v11-0-0a15d8a799aa@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20260826-gmem-inplace-conversion-v11-0-0a15d8a799aa@google.com> X-Developer-Key: i=ackerleytng@google.com; a=ed25519; pk=sAZDYXdm6Iz8FHitpHeFlCMXwabodTm7p8/3/8xUxuU= X-Developer-Signature: v=1; a=ed25519-sha256; t=1787735885; l=4708; i=ackerleytng@google.com; s=20260225; h=from:subject:message-id; bh=ZTwn4UyMShrGZfEU90otJVup2JEojFMgiToKCnnSVVE=; b=dDBRMblwUg6UwX2I1hz2Tpxt+EI3WovENt6hqBknKpraB0X285GZYRtS86E6IMk5svSgepv73 EfxqI68rjF/CyC9ce+QdXDFmPsPxg8E1UYpFu6gAUyL8f5QVEBtho9j X-Mailer: b4 0.16.0 Message-ID: <20260826-gmem-inplace-conversion-v11-18-0a15d8a799aa@google.com> Subject: [PATCH v11 18/46] 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, jmattson@google.com, jthoughton@google.com, michael.roth@amd.com, oupton@kernel.org, pankaj.gupta@amd.com, qperret@google.com, rick.p.edgecombe@intel.com, rientjes@google.com, shivankg@amd.com, steven.price@arm.com, willy@infradead.org, wyihan@google.com, yan.y.zhao@intel.com, forkloop@google.com, pratyush@kernel.org, suzuki.poulose@arm.com, aneesh.kumar@kernel.org, liam@infradead.org, Paolo Bonzini , Sean Christopherson , Thomas Gleixner , Ingo Molnar , Borislav Petkov , Dave Hansen , x86@kernel.org, "H. Peter Anvin" , Steven Rostedt , Masami Hiramatsu , Mathieu Desnoyers , Jonathan Corbet , Shuah Khan , Shuah Khan , Vishal Annapurve , Andrew Morton , Chris Li , Kairui Song , Kemeng Shi , Nhat Pham , Barry Song , Axel Rasmussen , Yuanchu Xie , Wei Xu , Youngjun Park , Qi Zheng , Shakeel Butt , Kiryl Shutsemau , Baoquan He , Jason Gunthorpe , John Hubbard , Peter Xu , tarunsahu@google.com, Fuad Tabba , Vlastimil Babka Cc: kvm@vger.kernel.org, linux-kernel@vger.kernel.org, linux-trace-kernel@vger.kernel.org, linux-doc@vger.kernel.org, linux-kselftest@vger.kernel.org, linux-mm@kvack.org, linux-coco@lists.linux.dev, Ackerley Tng , "Vlastimil Babka (SUSE)" , Fuad Tabba Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable A guest_memfd folio has no outstanding references if guest_memfd holds the only references on it. Any other references on the folio may indicate another user, and guest_memfd cannot convert it to private if there may be an existing host user. A folio will have outstanding references if it is present in a per-CPU lru_add fbatch. guest_memfd does not actually participate in LRU, but freshly-allocated folios are still added to the lru_add fbatch for batch LRU statistics processing. A folio may also have extra refcounts if it is on the mlock fbatch. These two known "usages" of the folio are handled by calling lru_cache_drain_for_folio, which drains both the lru_add and mlock fbatches. After draining, if the refcount is still elevated, then there are truly outstanding references. If the page may be dma pinned, DMA is using it and hence there are outstanding references. folio_maybe_dma_pinned() can have false positives, but that's only with a significant number of refcounts, at which point draining LRU is not going to move the needle - it can still be concluded that the folio has outstanding references. If the page is still mapped after guest_memfd tried to unmap it earlier in the conversion process, it also has outstanding references. Return true and exit early to avoid unnecessary draining in these 2 cases. Provide a drain status to only drain once ever while processing a batch of folios. Acked-by: Vlastimil Babka (SUSE) Suggested-by: David Hildenbrand Reviewed-by: Fuad Tabba Reviewed-by: Binbin Wu Signed-off-by: Ackerley Tng --- mm/swap.c | 2 ++ virt/kvm/guest_memfd.c | 30 ++++++++++++++++++++++-------- 2 files changed, 24 insertions(+), 8 deletions(-) diff --git a/mm/swap.c b/mm/swap.c index 8e965c8ce9aa9..9f511b97ab110 100644 --- a/mm/swap.c +++ b/mm/swap.c @@ -37,6 +37,7 @@ #include #include #include +#include =20 #include "internal.h" =20 @@ -995,6 +996,7 @@ void lru_cache_drain_for_folio(const struct folio *foli= o, *drained =3D LRU_CACHE_DRAINED_ALL; } } +EXPORT_SYMBOL_FOR_KVM(lru_cache_drain_for_folio); =20 atomic_t lru_disable_count =3D ATOMIC_INIT(0); =20 diff --git a/virt/kvm/guest_memfd.c b/virt/kvm/guest_memfd.c index 6dc199be0eb87..4912f90567fe8 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" #include "guest_memfd.h" @@ -556,10 +557,28 @@ static int kvm_gmem_mas_preallocate(struct ma_state *= mas, u64 attributes, return mas_preallocate(mas, xa_mk_value(attributes), GFP_KERNEL); } =20 +static bool __folio_has_outstanding_references(struct folio *folio, + enum lru_cache_drained *drained) +{ + if (folio_maybe_dma_pinned(folio) || folio_mapped(folio)) + return true; + + /* 1 reference held by filemap_get_folios() in the folio batch. */ + lru_cache_drain_for_folio(folio, 1, drained); + + /* + * Outstanding references are anything other than those from the page + * cache, plus 1 temporary reference held by filemap_get_folios() in the + * folio batch. + */ + return folio_ref_count(folio) !=3D folio_nr_pages(folio) + 1; +} + static bool kvm_gmem_has_outstanding_references(struct inode *inode, pgoff_t start, size_t nr_pages, pgoff_t *err_index) { + enum lru_cache_drained drained =3D LRU_CACHE_NOT_DRAINED; struct address_space *mapping =3D inode->i_mapping; pgoff_t last =3D start + nr_pages - 1; bool has_outstanding =3D false; @@ -570,17 +589,12 @@ static bool kvm_gmem_has_outstanding_references(struc= t inode *inode, folio_batch_init(&fbatch); =20 next =3D start; - while (has_outstanding && filemap_get_folios(mapping, &next, last, &fbatc= h)) { + while (!has_outstanding && filemap_get_folios(mapping, &next, last, &fbat= ch)) { for (i =3D 0; i < folio_batch_count(&fbatch); ++i) { struct folio *folio =3D fbatch.folios[i]; =20 - /* - * Outstanding references are anything other than those - * from the page cache, plus 1 temporary reference held - * by filemap_get_folios() in the folio batch. - */ - if (folio_ref_count(folio) !=3D folio_nr_pages(folio) + 1) { - has_outstanding =3D true; + has_outstanding =3D __folio_has_outstanding_references(folio, &drained); + if (has_outstanding) { *err_index =3D max(start, folio->index); break; } --=20 2.55.0.887.g758fc8c411-goog From nobody Mon Sep 28 04:51:20 2026 Received: from mail-pg1-f200.google.com (mail-pg1-f200.google.com [209.85.215.200]) (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 10D5B3DAAAE for ; Wed, 26 Aug 2026 09:18:43 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.215.200 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1787735929; cv=none; b=JjtMpIpJoQO6e45KuwQh+Zhv9rKg2EeJCHmPy1UIJ2znIDL0Z8oUHtrYLaqfMbiEcBUmEwnge00Z6TPgokqImLh5glsl9NakCTDhLENiZBXdixGbV1xE4/igfTqqQ8jiKnDo/QP/UurNZ9yIj7QibD5N0iZOyg0Cdw+2jOe1Rlw= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1787735929; c=relaxed/simple; bh=rjS7YIkj9IfMwuN6szgnaq7r9mhIQEiYfekeu/by3Vc=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=CdoeLLVDf9PnfbAbZtYfrrdDNxWZiDOgQfgv7O0NyAwkEvDfu9jFQi4SAG+yu47IE3xqkN90Rfu54S3U/7OKccMFC/AZtJgliRXZAl+o7SU+eNNzbt2Yo5ct3QXkqajr4QGGkxTjsDc1OKrQxC74PSG2o2mBLIDVITZ0JShP5PM= 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=ZmSyFhij; arc=none smtp.client-ip=209.85.215.200 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="ZmSyFhij" Received: by mail-pg1-f200.google.com with SMTP id 41be03b00d2f7-cc1c18c775eso741879a12.0 for ; Wed, 26 Aug 2026 02:18:42 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20251104; t=1787735920; x=1788340720; darn=vger.kernel.org; h=content-type:cc:to:from:subject:message-id:references:mime-version :in-reply-to:date:from:to:cc:subject:date:message-id:reply-to :content-type; bh=mlxub+uHBO/9tuD+fZ54oP42v4czhWpxNnl1EZnj2VA=; b=ZmSyFhijfR8gmzgf8VtnQJvaMaFQh29uhMB88Zx62ItvJt0cuHJZpDekk3E2dTaPuG ijhIpizYu6mMB7iJurlcwm0nDQbM1IdsCeouBYAPA+fLvzYURj61WZfaWD0WTmYJs3rs 2nEBZrfhMTjxTyIsgxD1UkC3i6nQKdeZ/W8o4ZDyZDPOw0NRUlKjAjFElgfK7Y+yKhhV yDYT9EJ37iS42JXiD7uU1thV1sf7tTAcLjOEkVH/t3sUr7AyIEQ8m+Qb3B3WMoG6J7mW cM4QAQ3pQTe737ZzXN2QSvweB73s5PTxE4Dep47AIK4azNHDpQ4fOFOfmH6uGOOaaOy+ HQDQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1787735920; x=1788340720; h=content-type: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:content-type; bh=mlxub+uHBO/9tuD+fZ54oP42v4czhWpxNnl1EZnj2VA=; b=qVNv8waDFK2RKcYq+m7317O8XxetyoWCDuKlQ1khSKb/jDUlZRhih1axeTkCTB3O/n QVKc3BpjLJlEIIjEoOY6oj6AH/E1/lSnFYNkkfy37prfOdevTRWBoJzfjcIlwAHNEO5L gwxm657HNwBohETqaFyeYOdqbmHd8oH3sOZWvy1XnED1utStEGmOnRpLUvhZTpUvwjmP 4rBN4oGU+F0EqmkRJZuQmJNfnLWSMgbe0s1HelrLMA1aER5zktmgoVFYAt7imiSfaTHs ThXfif5kjn6TojzH7Beb+LGqXvpMg+2MuGAHgGjj43dAX3ti5yBU1JW55pZCnBWTOJZV KqTg== X-Forwarded-Encrypted: i=1; AHgh+Rq1xnd0lDqc7t6H2COVkRXuc82qdMhCxNgqVR/bgdao+QBeE3D+vCzAHSEuEPiUis9l9pM2ma5HsZ0njMo=@vger.kernel.org X-Gm-Message-State: AFuF++n5/NnHiS1NrEbKTJwRhQ6zFwEbRrSam9QYx0ippxVcdh+o6Tir BJEiF05/6vHTudIQodER2PVOxs77mo9jOue5hVcKnJmSG3lMtQ394+q1LcM3uOIp3no7plMCVXb op5HpLZ0ZWzuJ1xAjlqKtcJMX1A== X-Received: from pgmn1.prod.google.com ([2002:a63:5c41:0:b0:cc1:b785:2d5c]) (user=ackerleytng job=prod-delivery.src-stubby-dispatcher) by 2002:a05:6a21:1398:b0:3bf:8de9:c64e with SMTP id adf61e73a8af0-3ceed381cdcmr7706302637.2.1787735919845; Wed, 26 Aug 2026 02:18:39 -0700 (PDT) Date: Wed, 26 Aug 2026 09:18:17 +0000 In-Reply-To: <20260826-gmem-inplace-conversion-v11-0-0a15d8a799aa@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20260826-gmem-inplace-conversion-v11-0-0a15d8a799aa@google.com> X-Developer-Key: i=ackerleytng@google.com; a=ed25519; pk=sAZDYXdm6Iz8FHitpHeFlCMXwabodTm7p8/3/8xUxuU= X-Developer-Signature: v=1; a=ed25519-sha256; t=1787735885; l=3028; i=ackerleytng@google.com; s=20260225; h=from:subject:message-id; bh=rjS7YIkj9IfMwuN6szgnaq7r9mhIQEiYfekeu/by3Vc=; b=lCUCj1iZvnbvBq8YHDBpqof0pVd2qwZfFFterSX0jRK7/rf6Au2LXCto6eoK3sBAVMPHL3rmu YzrbJeQTET3CW+0To48scfCtCha+gH4+4h5I0KZt9qWeSUgUInKR50f X-Mailer: b4 0.16.0 Message-ID: <20260826-gmem-inplace-conversion-v11-19-0a15d8a799aa@google.com> Subject: [PATCH v11 19/46] KVM: guest_memfd: Zero page while getting pfn 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, jmattson@google.com, jthoughton@google.com, michael.roth@amd.com, oupton@kernel.org, pankaj.gupta@amd.com, qperret@google.com, rick.p.edgecombe@intel.com, rientjes@google.com, shivankg@amd.com, steven.price@arm.com, willy@infradead.org, wyihan@google.com, yan.y.zhao@intel.com, forkloop@google.com, pratyush@kernel.org, suzuki.poulose@arm.com, aneesh.kumar@kernel.org, liam@infradead.org, Paolo Bonzini , Sean Christopherson , Thomas Gleixner , Ingo Molnar , Borislav Petkov , Dave Hansen , x86@kernel.org, "H. Peter Anvin" , Steven Rostedt , Masami Hiramatsu , Mathieu Desnoyers , Jonathan Corbet , Shuah Khan , Shuah Khan , Vishal Annapurve , Andrew Morton , Chris Li , Kairui Song , Kemeng Shi , Nhat Pham , Barry Song , Axel Rasmussen , Yuanchu Xie , Wei Xu , Youngjun Park , Qi Zheng , Shakeel Butt , Kiryl Shutsemau , Baoquan He , Jason Gunthorpe , John Hubbard , Peter Xu , tarunsahu@google.com, Fuad Tabba , Vlastimil Babka Cc: kvm@vger.kernel.org, linux-kernel@vger.kernel.org, linux-trace-kernel@vger.kernel.org, linux-doc@vger.kernel.org, linux-kselftest@vger.kernel.org, linux-mm@kvack.org, linux-coco@lists.linux.dev, Ackerley Tng , Xiaoyao Li Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Move the folio initialization logic from kvm_gmem_get_pfn() into __kvm_gmem_get_pfn() to also zero pages if the page is to be used in kvm_gmem_populate(). With in-place conversion, the existing data in a guest_memfd page can be populated into guest memory through platform-specific ioctls. Without first zeroing the page obtained using __kvm_gmem_get_pfn(), it might contain uninitialized host memory, which would leak to the guest if the populate completes. guest_memfd pages are zeroed at most once in the page's entire lifetime with guest_memfd, and that is tracked using the uptodate flag. Zeroing the page in __kvm_gmem_get_pfn() is chosen over zeroing in kvm_gmem_get_folio() since other flows, such as a future write() syscall, can get a page, write to the page and then set page uptodate without zeroing. There may be some performance penalty due to redundant zeroing, but this would pale in comparison to the cost of actually assigning the page to the VM. This aligns with the concept of zeroing before first use - the other place where zeroing happens is in kvm_gmem_fault_user_mapping(). On populate failure, the page is not re-zeroed, since on SNP, if firmware rejects a CPUID page, the expected CPUID values provided by firmware are returned to userspace via page contents. More generally, page contents may be modified on populate failure. Don't mark the page uptodate again after populating, since the page would already be marked uptodate before the post_populate() call. Reviewed-by: Fuad Tabba Tested-by: Shivank Garg Reviewed-by: Xiaoyao Li Reviewed-by: Binbin Wu Signed-off-by: Ackerley Tng --- virt/kvm/guest_memfd.c | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/virt/kvm/guest_memfd.c b/virt/kvm/guest_memfd.c index 4912f90567fe8..9c2d52bdf25ec 100644 --- a/virt/kvm/guest_memfd.c +++ b/virt/kvm/guest_memfd.c @@ -1105,6 +1105,11 @@ static struct folio *__kvm_gmem_get_pfn(struct file = *file, return ERR_PTR(-EHWPOISON); } =20 + if (!folio_test_uptodate(folio)) { + clear_highpage(folio_page(folio, 0)); + folio_mark_uptodate(folio); + } + *pfn =3D folio_file_pfn(folio, index); if (max_order) *max_order =3D 0; @@ -1133,11 +1138,6 @@ int kvm_gmem_get_pfn(struct kvm *kvm, struct kvm_mem= ory_slot *slot, goto out; } =20 - if (!folio_test_uptodate(folio)) { - clear_highpage(folio_page(folio, 0)); - folio_mark_uptodate(folio); - } - if (kvm_arch_has_gmem_convert() && kvm_gmem_is_private_mem(file_inode(file), index)) r =3D kvm_arch_gmem_make_private(kvm, gfn, *pfn, @@ -1179,8 +1179,6 @@ static long __kvm_gmem_populate(struct kvm *kvm, stru= ct kvm_memory_slot *slot, } =20 ret =3D post_populate(kvm, gfn, pfn, src_page, opaque); - if (!ret) - folio_mark_uptodate(folio); =20 out_put_folio: folio_put(folio); --=20 2.55.0.887.g758fc8c411-goog From nobody Mon Sep 28 04:51:20 2026 Received: from mail-pg1-f199.google.com (mail-pg1-f199.google.com [209.85.215.199]) (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 904FD3DA7DD for ; Wed, 26 Aug 2026 09:18:43 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.215.199 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1787735928; cv=none; b=ICB+F/uXvl5e/maY8IGvjrTdCqPQq7OW4F+B1uHhPWlNTc0u0lw4wy7icLJuI+opgUlax0BuUIXr/xd87vldvLFZmk2NVrHBzisn9rwEJMDPAAL55sdKs9x6gNuga9acnfvA6GXJbKHx9NAHklQaDQPGeEUzXRIy8irwrBU1RNI= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1787735928; c=relaxed/simple; bh=dy0yCBXrZoOYao0bizb+pCfviB0m67TSA6YqDM4S6vw=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=sBOCBWNd9YtmztOM2uUTuv07CNZr9PvDdWVC9RF3Gc4H2GsReaY/zfHwRvSEEB08JfBogFzexoewsy6S523LN54dO6d6tyZBucgvEp3gtZrdDDzmioPNYdl1f2vg4n+sDDKztZCAbnqD1bW54ZE1KAS3LneI52eodv46SxlFDXg= 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=TB8Ld8Fn; arc=none smtp.client-ip=209.85.215.199 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="TB8Ld8Fn" Received: by mail-pg1-f199.google.com with SMTP id 41be03b00d2f7-cbb467e56aaso608961a12.1 for ; Wed, 26 Aug 2026 02:18:43 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20251104; t=1787735922; x=1788340722; darn=vger.kernel.org; h=content-type:cc:to:from:subject:message-id:references:mime-version :in-reply-to:date:from:to:cc:subject:date:message-id:reply-to :content-type; bh=EKp8H31vpndC0T7+bBVQC7oQPgnms4md5owa5X2MPn8=; b=TB8Ld8Fnq1x2joS1MUsEipBynLBPuDVQefIGCDV6Q/r7vZdiJEvGFDg2aGjrI9oFgN EQdY9UT1ryNO24/+skIgKoG19I1MYzIp5Gxam/ynFzUf7DXaqPFee9OMHV5mr3zTuHdz l/GZ94lkPostpPUmtXDoPOZdFjmRHzxBzVHShr5SJmF/lfuIx+kYhUnS/qXMVc9n5B1H BxqyPI8AqBy4EbGKPUomwJWIs2ZrKvrqdoe1PYQGldwTkxATuU4uNdKxEYYE/mbsMX0o yxZ+0p5ewTT7TVAO8MvQKZMGympfB05W+8xnHf88mVAbLIJboRXFRGtNi2sjUeQgUdlE a89w== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1787735922; x=1788340722; h=content-type: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:content-type; bh=EKp8H31vpndC0T7+bBVQC7oQPgnms4md5owa5X2MPn8=; b=Gbc8tpBuRubtRigNs92styIi+sziXT7AVwipi8NK7ywDU7qwCt613BN2hqjaHm2IyG L8lXx6ua7KkZf5+8U31lRkzDdkVl/AxOem8yJo0QiIZyGtlOzsiUSEyMhOJPOpKOmvwA MDqOEdvGl0mGolV8gVGvFaCRG42KGZ+PoKptOTbgMf4B7Ss5DrL87cdJf2qW+keZY7bF 0/RMILhxAMLufd8I3R53XjXt/DBe4PjQVfvo5+eLVqnQ3yKpis2obHs06xxkKaXr+8tW dd89HWjid7eJ30g0QRRKSxjb3Z7biRb2ThiBfHnWyG4UZ+1l3P51E0xt9Jdc8bmbapg+ 96HA== X-Forwarded-Encrypted: i=1; AHgh+RqskX6rT9dd9Yb2zmMgHw5nfys5ZsNLQZHx4lR11EMVmHjUQDeO6opsbajb5F/9kbkh7QOxZpaqE8dWpVY=@vger.kernel.org X-Gm-Message-State: AFuF++kQOBJEGedFLdeu+gWorPe4+ZWJruk491Vf33vTABHWUDvtZJC4 8WieeXnlwxNY5iMBftBT0Eg/ANjTcrJsZSNPGm1+Ngk/LjFCPvXiJFYNhmXQxU85Pc4bXuV/To8 +E53EVP/V+XNrol0dMHlWkRHK7Q== X-Received: from pgbbo19.prod.google.com ([2002:a05:6a02:393:b0:cc1:4e93:a711]) (user=ackerleytng job=prod-delivery.src-stubby-dispatcher) by 2002:a05:6a21:a03:b0:3c3:9c4e:de3a with SMTP id adf61e73a8af0-3cf82a348a3mr11724369637.6.1787735921564; Wed, 26 Aug 2026 02:18:41 -0700 (PDT) Date: Wed, 26 Aug 2026 09:18:18 +0000 In-Reply-To: <20260826-gmem-inplace-conversion-v11-0-0a15d8a799aa@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20260826-gmem-inplace-conversion-v11-0-0a15d8a799aa@google.com> X-Developer-Key: i=ackerleytng@google.com; a=ed25519; pk=sAZDYXdm6Iz8FHitpHeFlCMXwabodTm7p8/3/8xUxuU= X-Developer-Signature: v=1; a=ed25519-sha256; t=1787735885; l=5596; i=ackerleytng@google.com; s=20260225; h=from:subject:message-id; bh=NFa90siDaW2AryA30Q8bJ5Qh7q7W2DqG2XaPe8+kXyo=; b=v0d5C4wkWWesFaHM60cN7REFurl8Oyg0VII9TPxllUT2UaIYDsS6Nac84jjl3ihI71jCYcDgl xbEFlslA2w6C5IahaWJaj2wX/VE9nKjbCz3wuE3sGID9S2vKNO9OT1k X-Mailer: b4 0.16.0 Message-ID: <20260826-gmem-inplace-conversion-v11-20-0a15d8a799aa@google.com> Subject: [PATCH v11 20/46] KVM: SEV: Make 'uaddr' parameter optional for KVM_SEV_SNP_LAUNCH_UPDATE 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, jmattson@google.com, jthoughton@google.com, michael.roth@amd.com, oupton@kernel.org, pankaj.gupta@amd.com, qperret@google.com, rick.p.edgecombe@intel.com, rientjes@google.com, shivankg@amd.com, steven.price@arm.com, willy@infradead.org, wyihan@google.com, yan.y.zhao@intel.com, forkloop@google.com, pratyush@kernel.org, suzuki.poulose@arm.com, aneesh.kumar@kernel.org, liam@infradead.org, Paolo Bonzini , Sean Christopherson , Thomas Gleixner , Ingo Molnar , Borislav Petkov , Dave Hansen , x86@kernel.org, "H. Peter Anvin" , Steven Rostedt , Masami Hiramatsu , Mathieu Desnoyers , Jonathan Corbet , Shuah Khan , Shuah Khan , Vishal Annapurve , Andrew Morton , Chris Li , Kairui Song , Kemeng Shi , Nhat Pham , Barry Song , Axel Rasmussen , Yuanchu Xie , Wei Xu , Youngjun Park , Qi Zheng , Shakeel Butt , Kiryl Shutsemau , Baoquan He , Jason Gunthorpe , John Hubbard , Peter Xu , tarunsahu@google.com, Fuad Tabba , Vlastimil Babka Cc: kvm@vger.kernel.org, linux-kernel@vger.kernel.org, linux-trace-kernel@vger.kernel.org, linux-doc@vger.kernel.org, linux-kselftest@vger.kernel.org, linux-mm@kvack.org, linux-coco@lists.linux.dev, Ackerley Tng Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable From: Michael Roth Make the source page for populating an SNP guest_memfd instance optional if in-place conversion/population is enabled. If KVM can convert the page in-place, then it's possible for guest memory to be initialized directly from userspace by mmap()'ing the guest_memfd and writing to it while the corresponding GPA ranges are in a 'shared' state, before converting them to the 'private' state expected by KVM_SEV_SNP_LAUNCH_UPDATE. Update the handling/documentation for KVM_SEV_SNP_LAUNCH_UPDATE to allow for 'uaddr' to be set to NULL when in-place conversion is enabled, which SNP_LAUNCH_UPDATE will then use to determine when it should/shouldn't copy in data from a separate memory location. Continue to enforce non-NULL when PRIVATE is tracked per-VM, not per-guest_memfd. Signed-off-by: Michael Roth [Moved condition to snp_launch_update] Signed-off-by: Sean Christopherson Tested-by: Shivank Garg Signed-off-by: Ackerley Tng --- Documentation/virt/kvm/x86/amd-memory-encryption.rst | 14 ++++++++++---- arch/x86/kvm/svm/sev.c | 11 ++++++----- virt/kvm/kvm_main.c | 1 + 3 files changed, 17 insertions(+), 9 deletions(-) diff --git a/Documentation/virt/kvm/x86/amd-memory-encryption.rst b/Documen= tation/virt/kvm/x86/amd-memory-encryption.rst index bd04a908a8dbd..5977fbe33b98c 100644 --- a/Documentation/virt/kvm/x86/amd-memory-encryption.rst +++ b/Documentation/virt/kvm/x86/amd-memory-encryption.rst @@ -503,7 +503,8 @@ secrets. =20 It is required that the GPA ranges initialized by this command have had the KVM_MEMORY_ATTRIBUTE_PRIVATE attribute set in advance. See the documentati= on -for KVM_SET_MEMORY_ATTRIBUTES for more details on this aspect. +for KVM_SET_MEMORY_ATTRIBUTES/KVM_SET_MEMORY_ATTRIBUTES2 for more details = on +this aspect. =20 Upon success, this command is not guaranteed to have processed the entire range requested. Instead, the ``gfn_start``, ``uaddr``, and ``len`` fields= of @@ -511,9 +512,14 @@ range requested. Instead, the ``gfn_start``, ``uaddr``= , and ``len`` fields of remaining range that has yet to be processed. The caller should continue calling this command until those fields indicate the entire range has been processed, e.g. ``len`` is 0, ``gfn_start`` is equal to the last GFN in the -range plus 1, and ``uaddr`` is the last byte of the userspace-provided sou= rce -buffer address plus 1. In the case where ``type`` is KVM_SEV_SNP_PAGE_TYPE= _ZERO, -``uaddr`` will be ignored completely. +range plus 1, and ``uaddr`` (if specified) is the last byte of the +userspace-provided source buffer address plus 1. + +In the case where ``type`` is KVM_SEV_SNP_PAGE_TYPE_ZERO, ``uaddr`` will be +ignored completely. For all other page types, ``uaddr`` is optional if in-= place +conversion is enabled (i.e. when the data had been written directly to +guest_memfd while the page was in the shared state) and is required if in-= place +conversion is disabled. =20 Parameters (in): struct kvm_sev_snp_launch_update =20 diff --git a/arch/x86/kvm/svm/sev.c b/arch/x86/kvm/svm/sev.c index dff684b88f153..63e8cfa9bf559 100644 --- a/arch/x86/kvm/svm/sev.c +++ b/arch/x86/kvm/svm/sev.c @@ -2400,7 +2400,7 @@ static int sev_gmem_post_populate(struct kvm *kvm, gf= n_t gfn, kvm_pfn_t pfn, */ if (ret && !snp_page_reclaim(kvm, pfn) && sev_populate_args->type =3D=3D KVM_SEV_SNP_PAGE_TYPE_CPUID && - sev_populate_args->fw_error =3D=3D SEV_RET_INVALID_PARAM) { + sev_populate_args->fw_error =3D=3D SEV_RET_INVALID_PARAM && src_page)= { void *src_vaddr =3D kmap_local_page(src_page); void *dst_vaddr =3D kmap_local_pfn(pfn); =20 @@ -2433,8 +2433,8 @@ static int snp_launch_update(struct kvm *kvm, struct = kvm_sev_cmd *argp) if (copy_from_user(¶ms, u64_to_user_ptr(argp->data), sizeof(params))) return -EFAULT; =20 - pr_debug("%s: GFN start 0x%llx length 0x%llx type %d flags %d\n", __func_= _, - params.gfn_start, params.len, params.type, params.flags); + pr_debug("%s: GFN start 0x%llx length 0x%llx type %d flags %d src %llx\n"= , __func__, + params.gfn_start, params.len, params.type, params.flags, params.uaddr); =20 if (!params.len || !PAGE_ALIGNED(params.len) || params.flags || (params.type !=3D KVM_SEV_SNP_PAGE_TYPE_NORMAL && @@ -2446,7 +2446,8 @@ static int snp_launch_update(struct kvm *kvm, struct = kvm_sev_cmd *argp) =20 if (params.type =3D=3D KVM_SEV_SNP_PAGE_TYPE_ZERO) src =3D NULL; - else if (!params.uaddr || !PAGE_ALIGNED(params.uaddr)) + else if ((!gmem_in_place_conversion && !params.uaddr) || + !PAGE_ALIGNED(params.uaddr)) return -EINVAL; else src =3D u64_to_user_ptr(params.uaddr); @@ -2493,7 +2494,7 @@ static int snp_launch_update(struct kvm *kvm, struct = kvm_sev_cmd *argp) =20 params.gfn_start +=3D count; params.len -=3D count * PAGE_SIZE; - if (params.type !=3D KVM_SEV_SNP_PAGE_TYPE_ZERO) + if (src && params.type !=3D KVM_SEV_SNP_PAGE_TYPE_ZERO) params.uaddr +=3D count * PAGE_SIZE; =20 if (copy_to_user(u64_to_user_ptr(argp->data), ¶ms, sizeof(params))) diff --git a/virt/kvm/kvm_main.c b/virt/kvm/kvm_main.c index 1ea8198821917..05c518c9b8078 100644 --- a/virt/kvm/kvm_main.c +++ b/virt/kvm/kvm_main.c @@ -104,6 +104,7 @@ module_param(allow_unsafe_mappings, bool, 0444); =20 #ifdef kvm_arch_has_private_mem bool __ro_after_init gmem_in_place_conversion =3D false; +EXPORT_SYMBOL_FOR_KVM_INTERNAL(gmem_in_place_conversion); #endif =20 /* --=20 2.55.0.887.g758fc8c411-goog From nobody Mon Sep 28 04:51:20 2026 Received: from mail-pl1-f198.google.com (mail-pl1-f198.google.com [209.85.214.198]) (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 C14AD3BF698 for ; Wed, 26 Aug 2026 09:18:48 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.198 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1787735932; cv=none; b=j0wS+xQv6+R/XW8q5BBgcK2HeTnzejpBCq1oh6qjKrirD2UQ9JVA/C4i9Zz8cpfBEgAIa+JWt7dpHnzE+ReqN7qtlI9GL2R2/8pkvlomndVX2MVBl8DSdb126GZkr+TSP4OUjJGakRWW9bQZlYsrIpODia5ZEaag2xavjzSOvqw= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1787735932; c=relaxed/simple; bh=PO2MNunZb9HZwBl22ORYDFq+/h4PeNVf9wLGFZFf2Dk=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=QiqOOcLYSh/ytRt8xgsVae5jFaN6Y9iHCY+bHf8Yy/PxlU072/b0/fWSls/jFBSOSVbqr31lL5Ggggvo438ohwIWjpK/3ux4CRtEBPxqQKziV0mLMGFyAf/mbvU1lrVT4A/kPEi8/U6LWZLNc1PFfbJnz/MdMDxPWTzZ6CTjEH4= 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=hr2n4B1r; arc=none smtp.client-ip=209.85.214.198 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="hr2n4B1r" Received: by mail-pl1-f198.google.com with SMTP id d9443c01a7336-2d04908139bso12132765ad.2 for ; Wed, 26 Aug 2026 02:18:48 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20251104; t=1787735924; x=1788340724; darn=vger.kernel.org; h=content-type:cc:to:from:subject:message-id:references:mime-version :in-reply-to:date:from:to:cc:subject:date:message-id:reply-to :content-type; bh=w/MrPAwScae7SNC5gQ+AgoWAoYfkyZe7/ZGB+P6/Few=; b=hr2n4B1rfE+RX3sjAtBaB33XG8E84nxZqhUvfisLwZ6mfeb1/pPnfJuQbdjazJsil4 pjE7T4lhbAeq6Z64w/IjEdbFHYg5D2MZwBrutdOfzyvMH0Acf1M2n0pvAc7yQXjCyMem gSm90TCJsAQxEm5ZoY27yyXEw4nFaAbini7nmMQ+fCRO0Y9nWwQ6h4SYgvkJ9/DjMoXe Z3QXW8VWgj0ePjfISIWuhhCklH0JFdjVGC1ry9lnWXxWdQIyQBYXW8ifyOEQ6aDpnejY UKyLPn2sW8BYzsWloKyOmxdG+i5FkfLshRdhKAIspyWgTpgmpMf+Gao9enwGg9z+WucR VUpA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1787735924; x=1788340724; h=content-type: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:content-type; bh=w/MrPAwScae7SNC5gQ+AgoWAoYfkyZe7/ZGB+P6/Few=; b=DYoaHH/RyGYVLZK9s359fMkr0zQGezTCAxVeYgdGDNrMD4y+kFlTcOC0zBCt/gFrHy qwkTD9QOs8j3Ej0/J/ZstxcwjrA3no8haCZNp7n4lYEqFd+MBBwrne6nI6QmF2wGe59J EUj7oLSZzPsQgTvZzQ12xU8eRje0gup/NE+na13C1mVkwpcAIRtYMJIvC50T/qTEDm09 lHPxFoQijbKVPNc8mb7VZ4WpN2BHZVwmpZXwJ/+TEpSyt6P8OCrypmxbIJxEF3AdYpQQ l1i+z9y6/sfFbtzhxFZ5hsfG796KoIxWxadRjuX9FvAFJdBqbybj6JWWb2pu6jmSiEh6 m0Nw== X-Forwarded-Encrypted: i=1; AHgh+RpeYjH9/orARA0lMTziOCznnas/659U+8TrqyjpjMbcMGW+/ZT4xseUQ03gyNNzFAN5jMxwASR0acNSURI=@vger.kernel.org X-Gm-Message-State: AFuF++loNd/iwnWcyGhxEhi6OvD5zaptsxiZR1NC4B4trbNBfodnHSID b8/QWPBJvFN4CsM98NmDa8gork6awPePazpGjlUuHNyIlWK6EDkWnX/CdBncp4iksg8NglStwA2 ebJv7HQZxc+5F749f3/SWf8YGWQ== X-Received: from plgl2.prod.google.com ([2002:a17:902:f682:b0:2ce:fc90:1592]) (user=ackerleytng job=prod-delivery.src-stubby-dispatcher) by 2002:a17:903:4b24:b0:2c9:9a2e:dab0 with SMTP id d9443c01a7336-2d707954e7amr92849785ad.3.1787735923219; Wed, 26 Aug 2026 02:18:43 -0700 (PDT) Date: Wed, 26 Aug 2026 09:18:19 +0000 In-Reply-To: <20260826-gmem-inplace-conversion-v11-0-0a15d8a799aa@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20260826-gmem-inplace-conversion-v11-0-0a15d8a799aa@google.com> X-Developer-Key: i=ackerleytng@google.com; a=ed25519; pk=sAZDYXdm6Iz8FHitpHeFlCMXwabodTm7p8/3/8xUxuU= X-Developer-Signature: v=1; a=ed25519-sha256; t=1787735885; l=3571; i=ackerleytng@google.com; s=20260225; h=from:subject:message-id; bh=PO2MNunZb9HZwBl22ORYDFq+/h4PeNVf9wLGFZFf2Dk=; b=COR7GFzGLu/psgq6NvdCH71Xw562i7ft3V4TM/YczzmbWiVB3kTpG3bS8GYlAlyMnzKrTQKrs 8XWKHarrzHICgz5dCrSpg3pNIwENjmrLkU/Y5GeRNUx1eSb93bTXP7P X-Mailer: b4 0.16.0 Message-ID: <20260826-gmem-inplace-conversion-v11-21-0a15d8a799aa@google.com> Subject: [PATCH v11 21/46] KVM: TDX: Make source page optional for KVM_TDX_INIT_MEM_REGION 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, jmattson@google.com, jthoughton@google.com, michael.roth@amd.com, oupton@kernel.org, pankaj.gupta@amd.com, qperret@google.com, rick.p.edgecombe@intel.com, rientjes@google.com, shivankg@amd.com, steven.price@arm.com, willy@infradead.org, wyihan@google.com, yan.y.zhao@intel.com, forkloop@google.com, pratyush@kernel.org, suzuki.poulose@arm.com, aneesh.kumar@kernel.org, liam@infradead.org, Paolo Bonzini , Sean Christopherson , Thomas Gleixner , Ingo Molnar , Borislav Petkov , Dave Hansen , x86@kernel.org, "H. Peter Anvin" , Steven Rostedt , Masami Hiramatsu , Mathieu Desnoyers , Jonathan Corbet , Shuah Khan , Shuah Khan , Vishal Annapurve , Andrew Morton , Chris Li , Kairui Song , Kemeng Shi , Nhat Pham , Barry Song , Axel Rasmussen , Yuanchu Xie , Wei Xu , Youngjun Park , Qi Zheng , Shakeel Butt , Kiryl Shutsemau , Baoquan He , Jason Gunthorpe , John Hubbard , Peter Xu , tarunsahu@google.com, Fuad Tabba , Vlastimil Babka Cc: kvm@vger.kernel.org, linux-kernel@vger.kernel.org, linux-trace-kernel@vger.kernel.org, linux-doc@vger.kernel.org, linux-kselftest@vger.kernel.org, linux-mm@kvack.org, linux-coco@lists.linux.dev, Ackerley Tng , Xiaoyao Li Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Update tdx_gmem_post_populate() to handle cases where userspace requests "no source page". To handle "no source page", populate (perform TDH.MEM.PAGE.ADD) using memory in-place at the target PFN. Allow "no source page" only when gmem_in_place_conversion is enabled, because retroactively adding support for out-of-place conversion would mean requiring a userspace update for a feature that's being deprecated. Also, KVM supporting "no source page" without in-place conversion would effectively be an obscure zero-page optimization that relies on the page being zeroed when it is allocated by guest_memfd. Rejecting "no source page" without in-place conversion scenario is valuable for KVM developers since it helps newcomers understand what exactly is and isn't possible. Co-developed-by: Sean Christopherson Signed-off-by: Sean Christopherson Tested-by: Shivank Garg Reviewed-by: Binbin Wu Tested-by: Yan Zhao Reviewed-by: Yan Zhao Reviewed-by: Xiaoyao Li Signed-off-by: Ackerley Tng --- Documentation/virt/kvm/x86/intel-tdx.rst | 4 ++++ arch/x86/kvm/vmx/tdx.c | 8 +++++--- 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/Documentation/virt/kvm/x86/intel-tdx.rst b/Documentation/virt/= kvm/x86/intel-tdx.rst index 6a222e9d09541..d8d9409120e61 100644 --- a/Documentation/virt/kvm/x86/intel-tdx.rst +++ b/Documentation/virt/kvm/x86/intel-tdx.rst @@ -158,6 +158,10 @@ KVM_TDX_INIT_MEM_REGION Initialize @nr_pages TDX guest private memory starting from @gpa with user= space provided data from @source_addr. @source_addr must be PAGE_SIZE-aligned. =20 +If guest_memfd in-place conversion is enabled, pass 0 for @source_addr +to represent "no source page". A source page is required if in-place +conversion is not enabled or not supported. + Note, before calling this sub command, memory attribute of the range [gpa, gpa + nr_pages] needs to be private. Userspace can use KVM_SET_MEMORY_ATTRIBUTES to set the attribute. diff --git a/arch/x86/kvm/vmx/tdx.c b/arch/x86/kvm/vmx/tdx.c index b272c20586a74..7654a9f5fa128 100644 --- a/arch/x86/kvm/vmx/tdx.c +++ b/arch/x86/kvm/vmx/tdx.c @@ -3189,7 +3189,7 @@ static int tdx_gmem_post_populate(struct kvm *kvm, gf= n_t gfn, kvm_pfn_t pfn, if (KVM_BUG_ON(kvm_tdx->page_add_src, kvm)) return -EIO; =20 - kvm_tdx->page_add_src =3D src_page; + kvm_tdx->page_add_src =3D src_page ?: pfn_to_page(pfn); ret =3D kvm_tdp_mmu_map_private_pfn(arg->vcpu, gfn, pfn); kvm_tdx->page_add_src =3D NULL; =20 @@ -3235,7 +3235,8 @@ static int tdx_vcpu_init_mem_region(struct kvm_vcpu *= vcpu, struct kvm_tdx_cmd *c if (copy_from_user(®ion, u64_to_user_ptr(cmd->data), sizeof(region))) return -EFAULT; =20 - if (!PAGE_ALIGNED(region.source_addr) || !region.source_addr || + if (!PAGE_ALIGNED(region.source_addr) || + (!gmem_in_place_conversion && !region.source_addr) || !PAGE_ALIGNED(region.gpa) || !region.nr_pages || region.gpa + (region.nr_pages << PAGE_SHIFT) <=3D region.gpa || !vt_is_tdx_private_gpa(kvm, region.gpa) || @@ -3266,7 +3267,8 @@ static int tdx_vcpu_init_mem_region(struct kvm_vcpu *= vcpu, struct kvm_tdx_cmd *c break; } =20 - region.source_addr +=3D PAGE_SIZE; + if (region.source_addr) + region.source_addr +=3D PAGE_SIZE; region.gpa +=3D PAGE_SIZE; region.nr_pages--; =20 --=20 2.55.0.887.g758fc8c411-goog From nobody Mon Sep 28 04:51:20 2026 Received: from mail-pl1-f197.google.com (mail-pl1-f197.google.com [209.85.214.197]) (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 0C4323DB313 for ; Wed, 26 Aug 2026 09:18:48 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.197 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1787735934; cv=none; b=iWBjTFVkbM4AKEtA9OeRPeL0RCEb4pnfKHXBZeQ+8h78cZXRrP8lM/aE7Js2qvmwwmmlV3Q7IMHX7KgIPrbFU+yL8CnUCN37QVOf81vNqRdNmqrmhMIs4YIZ920MoUAH3oL9sVRPFKmJq7ktpM2n15USQ9lM4tOkukRsyNzEV7Q= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1787735934; c=relaxed/simple; bh=coen2YTr1jMY7N8jgQMR4KIO1rvqehu9jtUhjuViG0w=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=H7qwbEVnPa//htmUpxjAunSbvjugiflUkpQ9+TmZNATe8SmTQAZULS4/lqZmc8mJ46q8PRxFDaCUDHESQIp8fkzFVAoCTNxdAt15JD7ZFlftIu/8FCr6V0Cj/7XiY/tbzBVbtYd4RksBYr9WrCPVwtbIGc+aqfToLEkHAtTWGFQ= 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=aq3iBo4x; arc=none smtp.client-ip=209.85.214.197 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="aq3iBo4x" Received: by mail-pl1-f197.google.com with SMTP id d9443c01a7336-2d55d8cd938so15036445ad.1 for ; Wed, 26 Aug 2026 02:18:48 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20251104; t=1787735925; x=1788340725; darn=vger.kernel.org; h=content-type:cc:to:from:subject:message-id:references:mime-version :in-reply-to:date:from:to:cc:subject:date:message-id:reply-to :content-type; bh=1PoPcctCxCU9xeD6IUV2UNVUEFjzWLV4ASul8wcFVUE=; b=aq3iBo4xLsEdHK5WqHTTz5DD1IcHdOZ+YqT9u0B4nDN44B0Nb/LinBH5ql+WkJqVpr qq2NWys/aC8DUaPd/OZOjCeDRWqE8FUVqgW3uBwCO3tdDBqkndaqzzmlsJMEhFbMIcZx KITJptpRjJ+4+I/L3nZNLe+CRwXKpkYnGVbPMxAuJ6Li7M1ArPBm7DttnMEjwsyyyaUF 64s+wNgK9PKX5rFaFe+snV+3BBo+aETiJnBHw+bq6TWp9hS4edD3TP+WpZW84JtNGWVs /XhSwJyhmRr98NppBJmGMN1hbxh5RjIz2U8sbhkA7f2UKx21nJGZMcBKX/i4oUhAbisI pGwQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1787735925; x=1788340725; h=content-type: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:content-type; bh=1PoPcctCxCU9xeD6IUV2UNVUEFjzWLV4ASul8wcFVUE=; b=eoEjWsR158fCLAcFs0P8tph6U7WkL6rpoA2ZxgmHxD9MpnCfFBIcDNTj0zn/tnx3YF DUt4ZJPNhpMgvj8vkQLqifXjiGiWSQZw0LifmhiMWcUFLIqXFjUvxwUKjM2pyP2APb5p jHNfqYsfSgYftBmoPICUjy3fj9ucjxSf7Eu11SVjcWY6k2RvjSbm/bAuwmvF9MPobXlw AXO7GT84eGQ8swEuvK7Dc/gAvcWrzZ6b27SAPX67STzg9lWsWhWcs8Ju7dMza392cyJY WlCCdBbW/UnCyXwONvGlM8+MmC1ZoOtSJ+A9nqV+6kMdAimuQWYDsq+RMJHE+7mNCK+f ERPA== X-Forwarded-Encrypted: i=1; AHgh+RoGOjTp0uW4lIxwPnwrxI0UHBbiD0vaX3Om2yE7PVS4YJ7tRQrRRXw4EA4P/QzSocKFAv0fUuTBydTSqdE=@vger.kernel.org X-Gm-Message-State: AFuF++m62wFGoJssnTKst77qbY3Nd9z4ell91BebYrB0FBBqGg5Uxr9L IkdYKspKeYdWGYhUxBA2zpllh6pHuv2U7lAdb3fYzLxmdcwkilkYXh+h1vDrInAWctMJfuKw6b5 LqO17PxlgUrdnDrElqQACmUdPVg== X-Received: from plri12.prod.google.com ([2002:a17:903:32cc:b0:2cc:7709:3bc8]) (user=ackerleytng job=prod-delivery.src-stubby-dispatcher) by 2002:a17:903:1a45:b0:2cc:d6de:d597 with SMTP id d9443c01a7336-2d707a9fecbmr93422125ad.7.1787735924909; Wed, 26 Aug 2026 02:18:44 -0700 (PDT) Date: Wed, 26 Aug 2026 09:18:20 +0000 In-Reply-To: <20260826-gmem-inplace-conversion-v11-0-0a15d8a799aa@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20260826-gmem-inplace-conversion-v11-0-0a15d8a799aa@google.com> X-Developer-Key: i=ackerleytng@google.com; a=ed25519; pk=sAZDYXdm6Iz8FHitpHeFlCMXwabodTm7p8/3/8xUxuU= X-Developer-Signature: v=1; a=ed25519-sha256; t=1787735885; l=2002; i=ackerleytng@google.com; s=20260225; h=from:subject:message-id; bh=5+fsxDOXBXvxtjSmr4LTesZGOQ7aAAqTF+3X7TBXdZA=; b=Rx5ixHeP0JEHh6BXcEuohPdB+7Rs9tkd/Cq94uHcIXinftxcsawhYkswrSTC+BPLDcx78kRwU vASNv9iu4SlANU6cEaBK5QarVqaCef2nf28MCtJrwSE8k7ohH/iAF11 X-Mailer: b4 0.16.0 Message-ID: <20260826-gmem-inplace-conversion-v11-22-0a15d8a799aa@google.com> Subject: [PATCH v11 22/46] 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, jmattson@google.com, jthoughton@google.com, michael.roth@amd.com, oupton@kernel.org, pankaj.gupta@amd.com, qperret@google.com, rick.p.edgecombe@intel.com, rientjes@google.com, shivankg@amd.com, steven.price@arm.com, willy@infradead.org, wyihan@google.com, yan.y.zhao@intel.com, forkloop@google.com, pratyush@kernel.org, suzuki.poulose@arm.com, aneesh.kumar@kernel.org, liam@infradead.org, Paolo Bonzini , Sean Christopherson , Thomas Gleixner , Ingo Molnar , Borislav Petkov , Dave Hansen , x86@kernel.org, "H. Peter Anvin" , Steven Rostedt , Masami Hiramatsu , Mathieu Desnoyers , Jonathan Corbet , Shuah Khan , Shuah Khan , Vishal Annapurve , Andrew Morton , Chris Li , Kairui Song , Kemeng Shi , Nhat Pham , Barry Song , Axel Rasmussen , Yuanchu Xie , Wei Xu , Youngjun Park , Qi Zheng , Shakeel Butt , Kiryl Shutsemau , Baoquan He , Jason Gunthorpe , John Hubbard , Peter Xu , tarunsahu@google.com, Fuad Tabba , Vlastimil Babka Cc: kvm@vger.kernel.org, linux-kernel@vger.kernel.org, linux-trace-kernel@vger.kernel.org, linux-doc@vger.kernel.org, linux-kselftest@vger.kernel.org, linux-mm@kvack.org, linux-coco@lists.linux.dev, Ackerley Tng , Xiaoyao Li 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 while RWX memory attributes are on the horizon, they too are expected to be x86-only. 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 supports in-place conversions, 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 Reviewed-by: Fuad Tabba Reviewed-by: Xiaoyao Li Reviewed-by: Binbin Wu Tested-by: Shivank Garg Reviewed-by: David Hildenbrand (Arm) Signed-off-by: Ackerley Tng --- arch/x86/kvm/Kconfig | 3 +++ virt/kvm/Kconfig | 3 --- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/arch/x86/kvm/Kconfig b/arch/x86/kvm/Kconfig index 2f8e1b5a8a72c..abb108886733a 100644 --- a/arch/x86/kvm/Kconfig +++ b/arch/x86/kvm/Kconfig @@ -80,6 +80,9 @@ config KVM_WERROR =20 If in doubt, say "N". =20 +config KVM_VM_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 df575449d97b5..a0678ef8ee3f5 100644 --- a/virt/kvm/Kconfig +++ b/virt/kvm/Kconfig @@ -100,9 +100,6 @@ config KVM_ELIDE_TLB_FLUSH_IF_YOUNG config KVM_MMU_LOCKLESS_AGING bool =20 -config KVM_VM_MEMORY_ATTRIBUTES - bool - config KVM_GUEST_MEMFD select XARRAY_MULTI bool --=20 2.55.0.887.g758fc8c411-goog From nobody Mon Sep 28 04:51:20 2026 Received: from mail-pl1-f197.google.com (mail-pl1-f197.google.com [209.85.214.197]) (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 3E2CA3C0630 for ; Wed, 26 Aug 2026 09:18:51 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.197 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1787735934; cv=none; b=Wd7ZxA3nhJTd7kEVw+Ny5mT4XkRJHHts1XPXwpXdDA0pEHdfAgAKJmiOWrtvXyLhICUsbkivUoHx1HUAPnyAu5pgv2dgFjFTinDMRgB9DaUdb9oK2wLY6ACfkFBtiClKMwFK6mmdcQ86/3d4fmiq6VI5xrjtATsq8OTJVUgRF1w= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1787735934; c=relaxed/simple; bh=tMdiXviK1wZX5Gu5mkLKJd0vddbMyb0Df5lYz3OBLic=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=TXhNfb7Aa4elWOIm+/bsvhv1mKGLwvEoA90ABFxNLOIhSXmCMqMtPzE6oxy88k1Ik/AiqcDP6YBvrAMWy1/u/8ChtPKjPxjB+hL02KzoI7YAHYBDoGN/IwCXFk3t5ZGnG4gjWGBkaLoiQ8AhA1CDUtieMr3Rb+dqAu3x3KTb9JU= 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=gHtApVsY; arc=none smtp.client-ip=209.85.214.197 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="gHtApVsY" Received: by mail-pl1-f197.google.com with SMTP id d9443c01a7336-2d6c166bafcso13235985ad.2 for ; Wed, 26 Aug 2026 02:18:50 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20251104; t=1787735927; x=1788340727; darn=vger.kernel.org; h=content-type:cc:to:from:subject:message-id:references:mime-version :in-reply-to:date:from:to:cc:subject:date:message-id:reply-to :content-type; bh=P2MYy9xCCsRh/a0/MTuFJqGfvDDDTtCK5nvSZnRDqWg=; b=gHtApVsYFt/BTbO4D/jAJ4PPT3NRfD5LLlwOuePs0Buu0rv/gUv9l6h0iq5C99192r vC4JML+sia27rkWJRXzxy8W1pkhoK7JOjs0LwFbfu0WK+wT6653LLTWxu8sHdAZ7DwxM Vxhid65gcSw5I2mSo2ox/zMdFFj4I2XyO9EInqQz/SZODWYesvnTGJwkDD+b3fCPVKat IDGYdNFXzbCe2/EcURTExRyfnaucT+XI1MlUU5cYMX4DAgliGJr+Mob7XzuNcQTx/mSg mxGFMX9dFgKQw2mHhDSzphHmyL4dY5beYQK3qWuFuYnwU5Moj/oNo/4crRZDikju0w5r aAtQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1787735927; x=1788340727; h=content-type: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:content-type; bh=P2MYy9xCCsRh/a0/MTuFJqGfvDDDTtCK5nvSZnRDqWg=; b=WtLSpOJWjwYP+kWbd0sRrLUKWFdP5wbD8/ppPuZjkcnU82FHM58uAnCpWK4vZxCa8v MqpQoQjRdvR136l8KP13sM9M2MH7hqa+ANIWOUcsRdEMiRxbQFnKVk+MRjmOl5OaZXuM jKpuIngHAXpqgwN7r+oqo49SQvC33g9zL1sKHSviBYR1fdb9Toh+VwlH6tagSE7pKx7J U/fh/PdW6dQJd55bs9Usk5Ic0i5H3IW2gWeF2AbIZbXKJWYE++NyoQad/EzAv0vROOYZ N0sff4fISFmOFNFh69vCQzJw6kiQHANdWAJZCGGVOVQaeg7tC80or43fHZi8dpRELhWf Ue2Q== X-Forwarded-Encrypted: i=1; AHgh+RrUGqlLKUzVbgsU8Pror81fKIpfA8K6X5kZiXzvT2DCLPRdns8Pm+ubjmn6Jvnfquy2KpYwdhkRJe/ASjQ=@vger.kernel.org X-Gm-Message-State: AFuF++l6ENCsUiRYv61ttXYtJH/dD40VHKbiTmLdyK+EZBE+8SjzOdrG IA41FKb/RJo2CX6ZHp5TTXWZSz50ZkNSIczc2f3lBCrGBGZq8B08BXHiZoB9eMUz3GC5gO+XEsM Pi7DqNBXJgTUNprQC3PQ4d8ucwQ== X-Received: from plio3.prod.google.com ([2002:a17:903:46c3:b0:2d6:3009:ccc2]) (user=ackerleytng job=prod-delivery.src-stubby-dispatcher) by 2002:a17:903:2283:b0:2d6:7409:7145 with SMTP id d9443c01a7336-2d707a2edd0mr90965095ad.1.1787735926573; Wed, 26 Aug 2026 02:18:46 -0700 (PDT) Date: Wed, 26 Aug 2026 09:18:21 +0000 In-Reply-To: <20260826-gmem-inplace-conversion-v11-0-0a15d8a799aa@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20260826-gmem-inplace-conversion-v11-0-0a15d8a799aa@google.com> X-Developer-Key: i=ackerleytng@google.com; a=ed25519; pk=sAZDYXdm6Iz8FHitpHeFlCMXwabodTm7p8/3/8xUxuU= X-Developer-Signature: v=1; a=ed25519-sha256; t=1787735885; l=7437; i=ackerleytng@google.com; s=20260225; h=from:subject:message-id; bh=erBMg+vYNKFmnIk1EALqLuAs5vQ8G8lIJWnAQEPGhMk=; b=rvsxDqasKEC9y24pJL6GBixd0VO6ms1BpDtgqU2vfiPjwfeBV4W2WWC2J5Xrl4izaS+xS4TWP bS2O2g3q2UYCaaj4SuKQQVw+wKicDiRXtr4U+uVmHBd3z9x3HPMjVOo X-Mailer: b4 0.16.0 Message-ID: <20260826-gmem-inplace-conversion-v11-23-0a15d8a799aa@google.com> Subject: [PATCH v11 23/46] 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, jmattson@google.com, jthoughton@google.com, michael.roth@amd.com, oupton@kernel.org, pankaj.gupta@amd.com, qperret@google.com, rick.p.edgecombe@intel.com, rientjes@google.com, shivankg@amd.com, steven.price@arm.com, willy@infradead.org, wyihan@google.com, yan.y.zhao@intel.com, forkloop@google.com, pratyush@kernel.org, suzuki.poulose@arm.com, aneesh.kumar@kernel.org, liam@infradead.org, Paolo Bonzini , Sean Christopherson , Thomas Gleixner , Ingo Molnar , Borislav Petkov , Dave Hansen , x86@kernel.org, "H. Peter Anvin" , Steven Rostedt , Masami Hiramatsu , Mathieu Desnoyers , Jonathan Corbet , Shuah Khan , Shuah Khan , Vishal Annapurve , Andrew Morton , Chris Li , Kairui Song , Kemeng Shi , Nhat Pham , Barry Song , Axel Rasmussen , Yuanchu Xie , Wei Xu , Youngjun Park , Qi Zheng , Shakeel Butt , Kiryl Shutsemau , Baoquan He , Jason Gunthorpe , John Hubbard , Peter Xu , tarunsahu@google.com, Fuad Tabba , Vlastimil Babka Cc: kvm@vger.kernel.org, linux-kernel@vger.kernel.org, linux-trace-kernel@vger.kernel.org, linux-doc@vger.kernel.org, linux-kselftest@vger.kernel.org, linux-mm@kvack.org, linux-coco@lists.linux.dev, Ackerley Tng , Xiaoyao Li Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable From: Sean Christopherson Allow the user to disable KVM_VM_MEMORY_ATTRIBUTES even when KVM supports PRIVATE and SHARED attributes, and expose gmem_in_place_conversion as a module parameter when per-VM attributes are supported. I.e. let userspace enable in-place PRIVATE<=3D>SHARED conversion of guest_memfd pages. Provide both a Kconfig option and a (conditional) module param so that deployments that use a custom kernel can fully disable per-VM tracking, while not forcing distros to ship two separate kernels in order to provide backwards compatibility for downstream users. Don't allow running VMs with mixed tracking for a given instance of KVM, i.e. disallow toggling the module param after KVM is loaded, as the extra complexity needed to handle per-VM behavior far outweighs any potential benefit. E.g. neither TDX nor SNP supports live migration, so in effect the requirement is that existing deployments that want to support both the old and the new models would need to tell their VMM which flavor of tracking to use. Signed-off-by: Sean Christopherson Reviewed-by: Fuad Tabba Tested-by: Shivank Garg [Define module_param only if CONFIG_KVM_VM_MEMORY_ATTRIBUTES is enabled] Suggested-by: Xiaoyao Li Reviewed-by: Xiaoyao Li Co-developed-by: Ackerley Tng Signed-off-by: Ackerley Tng --- Documentation/admin-guide/kernel-parameters.txt | 25 +++++++++++++++++++++= ++++ Documentation/virt/kvm/api.rst | 7 +++++-- arch/x86/include/asm/kvm_host.h | 4 +++- arch/x86/kvm/Kconfig | 14 ++++++++++---- virt/kvm/kvm_main.c | 5 ++++- 5 files changed, 47 insertions(+), 8 deletions(-) diff --git a/Documentation/admin-guide/kernel-parameters.txt b/Documentatio= n/admin-guide/kernel-parameters.txt index 1069806616b94..0ac44e1bccd28 100644 --- a/Documentation/admin-guide/kernel-parameters.txt +++ b/Documentation/admin-guide/kernel-parameters.txt @@ -3114,6 +3114,31 @@ Kernel parameters kvm.enable_vmware_backdoor=3D[KVM] Support VMware backdoor PV interface. Default is false (don't support). =20 + kvm.gmem_in_place_conversion=3D + [KVM] Controls whether KVM enables in-place conversion + support for guest_memfd and tracks the private/shared + state of memory per guest_memfd instead of per VM. + + If enabled, KVM enables the KVM_SET_MEMORY_ATTRIBUTES2 + ioctl on guest_memfd file descriptors and disables the + legacy VM-scoped KVM_SET_MEMORY_ATTRIBUTES ioctl for + private memory state tracking. Only the + KVM_MEMORY_ATTRIBUTE_PRIVATE attribute moves to + per-guest_memfd tracking; other attributes remain + per-VM. + + This parameter toggles KVM's in-place conversion + capability support. Whether a VMM uses separate backends + or out-of-place memory management is determined by + userspace VMM design. + + Note, this parameter is only available when + CONFIG_KVM_VM_MEMORY_ATTRIBUTES=3Dy. When + CONFIG_KVM_VM_MEMORY_ATTRIBUTES is not set, in-place + conversion is unconditionally enabled. + + Default is Y (on). + kvm.nx_huge_pages=3D [KVM] Controls the software workaround for the X86_BUG_ITLB_MULTIHIT bug. diff --git a/Documentation/virt/kvm/api.rst b/Documentation/virt/kvm/api.rst index f88d65b78c504..d976f8ec2e2dc 100644 --- a/Documentation/virt/kvm/api.rst +++ b/Documentation/virt/kvm/api.rst @@ -6383,9 +6383,12 @@ on-demand. =20 When mapping a gfn into the guest, KVM selects shared vs. private, i.e con= sumes userspace_addr vs. guest_memfd, based on the gfn's KVM_MEMORY_ATTRIBUTE_PR= IVATE -state. At VM creation time, all memory is shared, i.e. the PRIVATE attrib= ute -is '0' for all gfns. Userspace can control whether memory is shared/priva= te by +state. If in-place conversion is disabled, i.e. PRIVATE is tracked per-VM, +then at VM creation time, all memory is shared, i.e. the PRIVATE attribute= is +'0' for all gfns. Userspace can control whether memory is shared/private = by toggling KVM_MEMORY_ATTRIBUTE_PRIVATE via KVM_SET_MEMORY_ATTRIBUTES as nee= ded. +If in-place conversion is enabled, then the starting PRIVATE vs. SHARED st= ate +of a gfn is determined by the relevant guest_memfd instance. =20 S390: ^^^^^ diff --git a/arch/x86/include/asm/kvm_host.h b/arch/x86/include/asm/kvm_hos= t.h index 83e26ce45fb79..e840418427a1d 100644 --- a/arch/x86/include/asm/kvm_host.h +++ b/arch/x86/include/asm/kvm_host.h @@ -1851,7 +1851,9 @@ enum kvm_intr_type { ((vcpu) && (vcpu)->arch.handling_intr_from_guest && \ (!!in_nmi() =3D=3D ((vcpu)->arch.handling_intr_from_guest =3D=3D KVM_HAN= DLING_NMI))) =20 -#ifdef CONFIG_KVM_VM_MEMORY_ATTRIBUTES +#if defined(CONFIG_KVM_SW_PROTECTED_VM) || \ + defined(CONFIG_KVM_INTEL_TDX) || \ + defined(CONFIG_KVM_AMD_SEV) #define kvm_arch_has_private_mem(kvm) ((kvm)->arch.has_private_mem) #endif #ifdef CONFIG_HAVE_KVM_ARCH_GMEM_CONVERT diff --git a/arch/x86/kvm/Kconfig b/arch/x86/kvm/Kconfig index abb108886733a..2c3c22aeafa54 100644 --- a/arch/x86/kvm/Kconfig +++ b/arch/x86/kvm/Kconfig @@ -81,13 +81,21 @@ config KVM_WERROR If in doubt, say "N". =20 config KVM_VM_MEMORY_ATTRIBUTES - bool + bool "Enable per-VM PRIVATE vs. SHARED attributes (for CoCo VMs)" + depends on KVM_SW_PROTECTED_VM || KVM_INTEL_TDX || KVM_AMD_SEV + help + Enable support for tracking PRIVATE vs. SHARED memory using per-VM + memory attributes. Using per-VM attributes is deprecated in favor of + tracking PRIVATE state 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 @@ -138,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) @@ -162,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_CONVERT select HAVE_KVM_ARCH_GMEM_RECLAIM select HAVE_KVM_ARCH_GMEM_INVALIDATE diff --git a/virt/kvm/kvm_main.c b/virt/kvm/kvm_main.c index 05c518c9b8078..929fd3e1a01e6 100644 --- a/virt/kvm/kvm_main.c +++ b/virt/kvm/kvm_main.c @@ -103,7 +103,10 @@ static bool __ro_after_init allow_unsafe_mappings; module_param(allow_unsafe_mappings, bool, 0444); =20 #ifdef kvm_arch_has_private_mem -bool __ro_after_init gmem_in_place_conversion =3D false; +bool __ro_after_init gmem_in_place_conversion =3D !IS_ENABLED(CONFIG_KVM_V= M_MEMORY_ATTRIBUTES); +#ifdef CONFIG_KVM_VM_MEMORY_ATTRIBUTES +module_param(gmem_in_place_conversion, bool, 0444); +#endif EXPORT_SYMBOL_FOR_KVM_INTERNAL(gmem_in_place_conversion); #endif =20 --=20 2.55.0.887.g758fc8c411-goog From nobody Mon Sep 28 04:51:20 2026 Received: from mail-pl1-f197.google.com (mail-pl1-f197.google.com [209.85.214.197]) (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 C7A6F3D8901 for ; Wed, 26 Aug 2026 09:18:52 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.197 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1787735936; cv=none; b=eIw6QYQ3r6M24/u/P8hAeC8fP4b5qj3E3C48OyRTc625ot+X12REsBF6RgbU9A0mhmrAFTqrNBsuqdyNOiwoFyN4pZ084Q0MG55mp30aE6znToLoNiCev2LDu9wd5ih71uMqWO60pUmWAaTzlA7+FYwUudU2bMTWmgWMX894rl0= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1787735936; c=relaxed/simple; bh=pnbv1cdHILrK3XHy3SSf8zg/Qg2gRvmL7b7jEbqu2SI=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=B2jPbUknoHbuDfETrSOy9jR8vSUtLtcoglSl7aynAZ+ia+XMwBTdLZ/o4tJish20M9zwaI4KR2CYgA3U6rdJ0ZBUYM21eP5c+lVHsXamGLorahDiv9E+jKym8fyNazOd9mjxoU1KMx2Heo5kd2viUM1WW9Uva5KePXbyrfRfahw= 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=f6y0Gecz; arc=none smtp.client-ip=209.85.214.197 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="f6y0Gecz" Received: by mail-pl1-f197.google.com with SMTP id d9443c01a7336-2d6fb956002so11300105ad.1 for ; Wed, 26 Aug 2026 02:18:52 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20251104; t=1787735929; x=1788340729; darn=vger.kernel.org; h=content-type:cc:to:from:subject:message-id:references:mime-version :in-reply-to:date:from:to:cc:subject:date:message-id:reply-to :content-type; bh=9xbSTldz0mlkeejSRDvsTzV54cN/f7YMnwUkGWsjOYg=; b=f6y0GeczTBGC2qIf4t/91KY+MfufGBHFvIsJmShC4W9MGYfSlzfHDkkoJiFiOdw0Ud EzXnnyJ4EznvI0CjDjKK7u6cTRqH06KmmVMNvkTP9RFFnn0QKu2A4NS1E1LuYjXtiAgj 9bSu8EB+fyDvreJVpmPsdNSpqJfGbP6e+ibJgKzNeR/WA4k/joonfSdsBJrmgPJjegZN 06dkbLZkvEUqg3UT0l94zxyQ+TSYxAERGxzAl5gDGGOwFe+toqSLfKztHEp5Rv4QUZpQ 45uR+Pqnj2jB05XavBOGWaMnME0YZQ+cXAtmPNgZRnis9I84oM/LfaSJFlCHDPDg2Zyj mlkA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1787735929; x=1788340729; h=content-type: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:content-type; bh=9xbSTldz0mlkeejSRDvsTzV54cN/f7YMnwUkGWsjOYg=; b=rh7kWS2OALRCDV0ONCZDPqZ6NWluIbU8B48NolZ/x+8qx28KqpILSf+5wH0f5TyBNO AVE2/bcTjmWRa0ZoomP7JL+KGV3fOrXhwnrkJXj86PQIVxi8Lax2CGQ/1hGqFFrkm80H V4hdbiWIT5u6kfhnOjmWvrpZmHuRgUon1B3B94Qsd5lFmGyAWEVGoR41Akf3cUVUTkvq 52zDEylfR0uqCxr/bQ90qkH1kzRfRH9GjK2oUdB+KvngyYgHBh6V41kUFvoBnvtDdkgA WN52dulKGjJJrWtBl7yq9N4nqbZ2VNZGvIZ1Tq823oeJuSycLtxc7IXEz6Kx91juhU6F CAmw== X-Forwarded-Encrypted: i=1; AHgh+RqtsUz6d6eJEaX13CeFVlhUUrXydz2mYJ2ZXTDQAxroYmZ4NeZKyk/bypnaUFuDLqQIYk0Rft0vkcxDSno=@vger.kernel.org X-Gm-Message-State: AFuF++l+LHAMbeILCMynZY02mJwmU1h0jrbUrP4eZVrNIy+N2iy3dxjj b0gmUglt19kk8nq4RmUFAlMhSo2Di1Hw/BI60fvBa5yNIBPvjQ/q+eWJYS4h3laVfzswuvnL5jo gFrg2NmV+awkC4pxoSL0dKfzc+g== X-Received: from plco20.prod.google.com ([2002:a17:902:e294:b0:2c9:b703:3bfb]) (user=ackerleytng job=prod-delivery.src-stubby-dispatcher) by 2002:a17:903:2c03:b0:2d6:ee6b:1b08 with SMTP id d9443c01a7336-2d707a2f363mr88247725ad.3.1787735928419; Wed, 26 Aug 2026 02:18:48 -0700 (PDT) Date: Wed, 26 Aug 2026 09:18:22 +0000 In-Reply-To: <20260826-gmem-inplace-conversion-v11-0-0a15d8a799aa@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20260826-gmem-inplace-conversion-v11-0-0a15d8a799aa@google.com> X-Developer-Key: i=ackerleytng@google.com; a=ed25519; pk=sAZDYXdm6Iz8FHitpHeFlCMXwabodTm7p8/3/8xUxuU= X-Developer-Signature: v=1; a=ed25519-sha256; t=1787735885; l=1693; i=ackerleytng@google.com; s=20260225; h=from:subject:message-id; bh=xxgZV80P6tEBI0TS9iatKBLUXrCS72RFfbwoyow/L9Y=; b=I0SLEj0chvLQHB7QukPCMKxNVTQmEiLmipqoJJ+EGN6XfzLrsg82kHlLQjvE5ty/DdT4FbHrE xe7LXVIZZMOCZA0s06FUNYPGMQazgE0t9Oi6aKm/qrHRQUgS8sydK6J X-Mailer: b4 0.16.0 Message-ID: <20260826-gmem-inplace-conversion-v11-24-0a15d8a799aa@google.com> Subject: [PATCH v11 24/46] 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, jmattson@google.com, jthoughton@google.com, michael.roth@amd.com, oupton@kernel.org, pankaj.gupta@amd.com, qperret@google.com, rick.p.edgecombe@intel.com, rientjes@google.com, shivankg@amd.com, steven.price@arm.com, willy@infradead.org, wyihan@google.com, yan.y.zhao@intel.com, forkloop@google.com, pratyush@kernel.org, suzuki.poulose@arm.com, aneesh.kumar@kernel.org, liam@infradead.org, Paolo Bonzini , Sean Christopherson , Thomas Gleixner , Ingo Molnar , Borislav Petkov , Dave Hansen , x86@kernel.org, "H. Peter Anvin" , Steven Rostedt , Masami Hiramatsu , Mathieu Desnoyers , Jonathan Corbet , Shuah Khan , Shuah Khan , Vishal Annapurve , Andrew Morton , Chris Li , Kairui Song , Kemeng Shi , Nhat Pham , Barry Song , Axel Rasmussen , Yuanchu Xie , Wei Xu , Youngjun Park , Qi Zheng , Shakeel Butt , Kiryl Shutsemau , Baoquan He , Jason Gunthorpe , John Hubbard , Peter Xu , tarunsahu@google.com, Fuad Tabba , Vlastimil Babka Cc: kvm@vger.kernel.org, linux-kernel@vger.kernel.org, linux-trace-kernel@vger.kernel.org, linux-doc@vger.kernel.org, linux-kselftest@vger.kernel.org, linux-mm@kvack.org, linux-coco@lists.linux.dev, Ackerley Tng , Xiaoyao Li 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 in-place conversion is enabled, i.e. when it's actually possible for a guest_memfd instance to contain shared memory. Signed-off-by: Sean Christopherson Reviewed-by: Fuad Tabba Reviewed-by: Xiaoyao Li Tested-by: Shivank Garg Reviewed-by: Binbin Wu Signed-off-by: Ackerley Tng --- arch/x86/kvm/x86.c | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c index 147b3e529cd26..45ef4156274ec 100644 --- a/arch/x86/kvm/x86.c +++ b/arch/x86/kvm/x86.c @@ -10637,14 +10637,15 @@ 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 is supported if in-place conversion is enabled, or if + * the VM doesn't support private memory. If the VM has private memory + * and in-place conversion is disabled, then guest_memfd can _only_ be + * used for private memory. + */ + return gmem_in_place_conversion || !kvm_arch_has_private_mem(kvm); } =20 #ifdef CONFIG_HAVE_KVM_ARCH_GMEM_CONVERT --=20 2.55.0.887.g758fc8c411-goog From nobody Mon Sep 28 04:51:20 2026 Received: from mail-pl1-f197.google.com (mail-pl1-f197.google.com [209.85.214.197]) (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 C5DF03BD649 for ; Wed, 26 Aug 2026 09:18:52 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.197 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1787735936; cv=none; b=Q/J7wrRrWBvp1+gX3BVf1n0tz3XAxg32jxDSKsdPcUeGfA0rHuiRwO+EmHRYGTO+B4K+uLbP/S02qB+70ImVwcjXQeofulE9ufS69mC2LEvWJdIi91rQ+kcirDyf2EmOXdEUBQlFmXt36z1fagcAquCOVDHYd7FxexWnnPiJe78= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1787735936; c=relaxed/simple; bh=muKduSh1b24ScYepPCMs+OGpq6B9+q/ZPxcpNHD7eQU=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=jq+EGC8hSi2fCF2t47mNXzGp295TbbW+nr6JmwFcKv6y9XKbFBHWFt4sFebHTS2rLqxirna7Ot1oO/ouTwWVmFt29iWJP/GEd2Z0gEdYNijoxiGueHddtekuRoWaJyNmirBX46xBjt1vJjVGvGwm11vYK9PsSHjvEUQgvoK4xeI= 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=MXgmL+lW; arc=none smtp.client-ip=209.85.214.197 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="MXgmL+lW" Received: by mail-pl1-f197.google.com with SMTP id d9443c01a7336-2ce8a76df2dso16626115ad.2 for ; Wed, 26 Aug 2026 02:18:52 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20251104; t=1787735930; x=1788340730; darn=vger.kernel.org; h=content-type:cc:to:from:subject:message-id:references:mime-version :in-reply-to:date:from:to:cc:subject:date:message-id:reply-to :content-type; bh=TeMJJdODrGJdlu806vqL84QXzoIcKrTnV6sfhdG6lEs=; b=MXgmL+lW14LyZbpun8Rw2/USWuRYtP3w6VlMQqkJ9FYCoBEN7SFqWsV+iaDCBkutqN F5Ry5Lue6kJZvW2k+Erd+A6PNA3FFFPhDIvz77wLe58t7BQx91FyWLEDQfHc0eCq0Fyc kmr0IEECQ1gPRVm6wbZSyqmQOtEpUmb/i9A/grolfGtog2TDn3D3eUb+OiIC5XcwDxKA /F05E96bRtjyvGNr3VtNQl7uvkmfEjPkOUoRrdw6D7rf4eAKk8uTJeIKtXPS41+/NhlN UJW6pFvTkJkqYbonx2oK0fUM49aq4cQui92Iqu3CPIGhN4udOEK+/W3OyQ5/5buFFIdJ LaTQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1787735930; x=1788340730; h=content-type: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:content-type; bh=TeMJJdODrGJdlu806vqL84QXzoIcKrTnV6sfhdG6lEs=; b=XcnLde8cG+sWFFSnnd/M2mtdrjyMvHRjdzEAbzIsRnQgMxPY/vct0dWl1WJ4Te8p3j 2yv2FIdvpjrsM9CJWir31p8OzLVLTgLdPqZY8iwNHEmc5XEAUYZHtn9zM20uo6CONuDS +us1k2PH5rlQScCzMda7DTbG9SE5HjYW2P0nw0ZUofZ9OdO5Nqt7hrSkYM/YiMyh/w30 TavFNJGCZeyY5eDx3/2nHNKwZlFvXci6hvLb+TNs7M8fWkJ4/wVRN3a16YA/OH6COoGy pjgP+XjzFODCc4D1MTe9Dngqp5fJbYsELBHsL4swrUPPveaoEAR7b95pud3TQoZ4uLUP WIzw== X-Forwarded-Encrypted: i=1; AHgh+Ro7OcNwBAxQRIHKGQw8cq8tP9DJj0zyNZ2OwyiDhB1z1KmL+kSw7bqOSL88oGNkzyT5QkxRYmXj1L6YHg4=@vger.kernel.org X-Gm-Message-State: AFuF++ntdUkM2crqfWy3PR1jlVSPXik1ZIKoyRwUGRBAf+bdJ+gYqXem hvVnDQ5gR44ov6cXym6P1ckpN6yIO2QkBvUhsPsNRazRkDYmFLGWzEUipBAGjzcb28pUYtcd+RM 9bb//WVnNM9RD8gi5RQbYbcf/SA== X-Received: from plco20.prod.google.com ([2002:a17:902:e294:b0:2c9:b703:3bfb]) (user=ackerleytng job=prod-delivery.src-stubby-dispatcher) by 2002:a17:903:2341:b0:2cf:c543:2c7e with SMTP id d9443c01a7336-2d707b4639cmr87037965ad.10.1787735930069; Wed, 26 Aug 2026 02:18:50 -0700 (PDT) Date: Wed, 26 Aug 2026 09:18:23 +0000 In-Reply-To: <20260826-gmem-inplace-conversion-v11-0-0a15d8a799aa@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20260826-gmem-inplace-conversion-v11-0-0a15d8a799aa@google.com> X-Developer-Key: i=ackerleytng@google.com; a=ed25519; pk=sAZDYXdm6Iz8FHitpHeFlCMXwabodTm7p8/3/8xUxuU= X-Developer-Signature: v=1; a=ed25519-sha256; t=1787735885; l=2916; i=ackerleytng@google.com; s=20260225; h=from:subject:message-id; bh=7deP7h7QgDnwN6/9QKin5Nm8lfgB+57/3gsjOj+zwyw=; b=CZvlPH/OyUE2cOwFZHq3gx+or4V4GkEfPVHtR5IRBhyoJc09nGOpZZvAf2iumEeelzHT+XQgZ fFOTyta6nJOBd5QLNDNMDklfHWbkIyZvfWZ5tyanGQIZCv0kpN5zCS2 X-Mailer: b4 0.16.0 Message-ID: <20260826-gmem-inplace-conversion-v11-25-0a15d8a799aa@google.com> Subject: [PATCH v11 25/46] 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, jmattson@google.com, jthoughton@google.com, michael.roth@amd.com, oupton@kernel.org, pankaj.gupta@amd.com, qperret@google.com, rick.p.edgecombe@intel.com, rientjes@google.com, shivankg@amd.com, steven.price@arm.com, willy@infradead.org, wyihan@google.com, yan.y.zhao@intel.com, forkloop@google.com, pratyush@kernel.org, suzuki.poulose@arm.com, aneesh.kumar@kernel.org, liam@infradead.org, Paolo Bonzini , Sean Christopherson , Thomas Gleixner , Ingo Molnar , Borislav Petkov , Dave Hansen , x86@kernel.org, "H. Peter Anvin" , Steven Rostedt , Masami Hiramatsu , Mathieu Desnoyers , Jonathan Corbet , Shuah Khan , Shuah Khan , Vishal Annapurve , Andrew Morton , Chris Li , Kairui Song , Kemeng Shi , Nhat Pham , Barry Song , Axel Rasmussen , Yuanchu Xie , Wei Xu , Youngjun Park , Qi Zheng , Shakeel Butt , Kiryl Shutsemau , Baoquan He , Jason Gunthorpe , John Hubbard , Peter Xu , tarunsahu@google.com, Fuad Tabba , Vlastimil Babka Cc: kvm@vger.kernel.org, linux-kernel@vger.kernel.org, linux-trace-kernel@vger.kernel.org, linux-doc@vger.kernel.org, linux-kselftest@vger.kernel.org, linux-mm@kvack.org, linux-coco@lists.linux.dev, Ackerley Tng Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable From: Sean Christopherson When adding a memslot associated with 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 Reviewed-by: Fuad Tabba Tested-by: Shivank Garg Signed-off-by: Ackerley Tng --- 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 9ddc047d5c275..3413d45e34faf 100644 --- a/tools/testing/selftests/kvm/lib/kvm_util.c +++ b/tools/testing/selftests/kvm/lib/kvm_util.c @@ -1077,6 +1077,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) { + u32 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, @@ -1106,28 +1129,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) { - u32 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.55.0.887.g758fc8c411-goog From nobody Mon Sep 28 04:51:20 2026 Received: from mail-pl1-f197.google.com (mail-pl1-f197.google.com [209.85.214.197]) (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 B216E36CDFE for ; Wed, 26 Aug 2026 09:18:54 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.197 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1787735939; cv=none; b=NbwHSt68Pt/G6uLVj4MIYZrrNWl06Krk+Ou+anTxghAdat+DOZDDP8vr69ysZavboqlevM1HFBqK/Wr3sD+JLByOXxSqOhItkwBRYRBx91YEh6waM2rrKMUGmPNgWL+vBaVRyz93OJp4JUbJ3BJTuw5s8kWI9dJPz14bwknUEc4= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1787735939; c=relaxed/simple; bh=YLgunGHL+AL+LncG9sWVRtMDvArYtWgzJi2/TAMkgIg=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=O+Q8+E/Lp7Wd0+IWeK6stiwsdxn2WI0rhUdCQiwedDjtRU3CdKvuPv6wuOCexQxhIZ1XYdWmF/MYbruThnA/U0z7FYGFCX8toZkppS3VAc4NJF1o8JCTk6HLm8q/zjASgCpYzjkZdEIkOdIZN7hoe8617yLpknW/81b797ASFb0= 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=u/XSN1Fc; arc=none smtp.client-ip=209.85.214.197 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="u/XSN1Fc" Received: by mail-pl1-f197.google.com with SMTP id d9443c01a7336-2cfca8558d2so12355425ad.2 for ; Wed, 26 Aug 2026 02:18:53 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20251104; t=1787735932; x=1788340732; darn=vger.kernel.org; h=content-type:cc:to:from:subject:message-id:references:mime-version :in-reply-to:date:from:to:cc:subject:date:message-id:reply-to :content-type; bh=+cjy+nMsHw5PBRs0QTAeMD0IiOId+CkLeVE5YuR6Qzo=; b=u/XSN1Fcxxgy8VZ3iw5SCAJ/vZVtgEVYK33du3Alolfj7F/EFGn/xxmEQWCTo7LWXy pt8oks8yz4QWfrVTBiVbuEHWlibddtlxUyvZZjZyGXR2bzSq7gmCswIW2lDjnPSOpHg2 c03LGIu0A5uffzAwEvZr5pmcfxrmSs6zdTuhhUq9N2BjoU0/VEuFFIN4GpfIKRlq2Y8x 8DrdsHiGo110yrVW/g8UtrKKaSysTHp+tMA2m6w/5r5u5Ls7E1ZFpU5yRPSYqjp6CG+A 4Ob/dOwgfc6dK5PSmR43cCEMMRrkPDi2Y3CRaN0haSGkJU0oeVjM9iI3S3EoNiH2/JVI 4V8Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1787735932; x=1788340732; h=content-type: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:content-type; bh=+cjy+nMsHw5PBRs0QTAeMD0IiOId+CkLeVE5YuR6Qzo=; b=LMLMgWeZYzLQpJ3+o7Bt5Sbf1aYSizZNreAhm7gLfw0CVW1xrrslNCb53itWFdBEox tYEL+UwdtePUijgKnvRhMqt0FNgNSDj/0yMgrt08byw5+4RmZ+saZQ71tid/+owj1Z+8 L7/PC0JIC9UQdPtHCkVtfJh3tEjp+BDsuXfl61TuO975FVD+6VU6UgOmnSFmjtrZumRi Z+Pywdi1qB8d3UtpRf+NH/cTL95yjOyUBpPO64+yp5OB20iBlGn/Op6F2bGj/UQ6fHMe 08rG0yAzGA/fK12JcOd5RnufR7BA89UsSTcoI1m3XpGfMGaTowaCI3zRuKyYsZ81g3fY l/aA== X-Forwarded-Encrypted: i=1; AHgh+Rq+3HMr7RzlRwCbg9p3YH2BOEHw+xu2pIlfBN3/253WcTJ5W9rcUgzfAj+vvey3KswR110YXgPx2CBriu0=@vger.kernel.org X-Gm-Message-State: AFuF++lsiVHDQqsByaZZnPzDrkG08fRL5NGzwK4piGM4yz88QLe0Q0Cf Hux1DdNWkGnVL+/FR5/xV1m27Se6bYyMk6m/6DOTz80/zNVQ7sEoI7RFF6UhWm7lJ8ULtnHlbW8 /vV/6uTcOptMY+YlVYX9cfT0Ueg== X-Received: from plhq8.prod.google.com ([2002:a17:903:11c8:b0:2d2:f257:ff6b]) (user=ackerleytng job=prod-delivery.src-stubby-dispatcher) by 2002:a17:903:b48:b0:2cf:b68a:340 with SMTP id d9443c01a7336-2d707b7f737mr84539505ad.10.1787735931763; Wed, 26 Aug 2026 02:18:51 -0700 (PDT) Date: Wed, 26 Aug 2026 09:18:24 +0000 In-Reply-To: <20260826-gmem-inplace-conversion-v11-0-0a15d8a799aa@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20260826-gmem-inplace-conversion-v11-0-0a15d8a799aa@google.com> X-Developer-Key: i=ackerleytng@google.com; a=ed25519; pk=sAZDYXdm6Iz8FHitpHeFlCMXwabodTm7p8/3/8xUxuU= X-Developer-Signature: v=1; a=ed25519-sha256; t=1787735885; l=5047; i=ackerleytng@google.com; s=20260225; h=from:subject:message-id; bh=mb3uaLD2f73gjBg5EOuTiW5jIrrwXcBsUyiQfGfT2N8=; b=JETiA2QHKaiExWNZCyGlrQT84yI/YT1kdJUQpYKxpqoY5RadHrf8I2YGHK3b4T5c72XHbZUpU 2Jn4PILDbMQB9KRhsSDSu6kzn90BQELMLsi1gc6Ru6P3p1cgHLRu0um X-Mailer: b4 0.16.0 Message-ID: <20260826-gmem-inplace-conversion-v11-26-0a15d8a799aa@google.com> Subject: [PATCH v11 26/46] 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, jmattson@google.com, jthoughton@google.com, michael.roth@amd.com, oupton@kernel.org, pankaj.gupta@amd.com, qperret@google.com, rick.p.edgecombe@intel.com, rientjes@google.com, shivankg@amd.com, steven.price@arm.com, willy@infradead.org, wyihan@google.com, yan.y.zhao@intel.com, forkloop@google.com, pratyush@kernel.org, suzuki.poulose@arm.com, aneesh.kumar@kernel.org, liam@infradead.org, Paolo Bonzini , Sean Christopherson , Thomas Gleixner , Ingo Molnar , Borislav Petkov , Dave Hansen , x86@kernel.org, "H. Peter Anvin" , Steven Rostedt , Masami Hiramatsu , Mathieu Desnoyers , Jonathan Corbet , Shuah Khan , Shuah Khan , Vishal Annapurve , Andrew Morton , Chris Li , Kairui Song , Kemeng Shi , Nhat Pham , Barry Song , Axel Rasmussen , Yuanchu Xie , Wei Xu , Youngjun Park , Qi Zheng , Shakeel Butt , Kiryl Shutsemau , Baoquan He , Jason Gunthorpe , John Hubbard , Peter Xu , tarunsahu@google.com, Fuad Tabba , Vlastimil Babka Cc: kvm@vger.kernel.org, linux-kernel@vger.kernel.org, linux-trace-kernel@vger.kernel.org, linux-doc@vger.kernel.org, linux-kselftest@vger.kernel.org, linux-mm@kvack.org, linux-coco@lists.linux.dev, 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 Reviewed-by: Fuad Tabba Tested-by: Shivank Garg Signed-off-by: Ackerley Tng --- tools/testing/selftests/kvm/include/kvm_util.h | 6 +++--- tools/testing/selftests/kvm/lib/kvm_util.c | 26 +++++++++++++---------= ---- 2 files changed, 16 insertions(+), 16 deletions(-) diff --git a/tools/testing/selftests/kvm/include/kvm_util.h b/tools/testing= /selftests/kvm/include/kvm_util.h index 5a7a455b53875..cf49a84de02e8 100644 --- a/tools/testing/selftests/kvm/include/kvm_util.h +++ b/tools/testing/selftests/kvm/include/kvm_util.h @@ -690,17 +690,17 @@ int __vm_set_user_memory_region(struct kvm_vm *vm, u3= 2 slot, u32 flags, gpa_t gpa, u64 size, void *hva); void vm_set_user_memory_region2(struct kvm_vm *vm, u32 slot, u32 flags, gpa_t gpa, u64 size, void *hva, - u32 guest_memfd, u64 guest_memfd_offset); + u32 gmem_fd, u64 gmem_offset); int __vm_set_user_memory_region2(struct kvm_vm *vm, u32 slot, u32 flags, gpa_t gpa, u64 size, void *hva, - u32 guest_memfd, u64 guest_memfd_offset); + u32 gmem_fd, u64 gmem_offset); =20 void vm_userspace_mem_region_add(struct kvm_vm *vm, enum vm_mem_backing_src_type src_type, gpa_t gpa, u32 slot, u64 npages, u32 flags); void vm_mem_add(struct kvm_vm *vm, enum vm_mem_backing_src_type src_type, gpa_t gpa, u32 slot, u64 npages, u32 flags, - int guest_memfd_fd, u64 guest_memfd_offset); + int gmem_fd, u64 gmem_offset); =20 #ifndef vm_arch_has_protected_memory static inline bool vm_arch_has_protected_memory(struct kvm_vm *vm) diff --git a/tools/testing/selftests/kvm/lib/kvm_util.c b/tools/testing/sel= ftests/kvm/lib/kvm_util.c index 3413d45e34faf..af501a27211a2 100644 --- a/tools/testing/selftests/kvm/lib/kvm_util.c +++ b/tools/testing/selftests/kvm/lib/kvm_util.c @@ -970,7 +970,7 @@ void vm_set_user_memory_region(struct kvm_vm *vm, u32 s= lot, u32 flags, =20 int __vm_set_user_memory_region2(struct kvm_vm *vm, u32 slot, u32 flags, gpa_t gpa, u64 size, void *hva, - u32 guest_memfd, u64 guest_memfd_offset) + u32 gmem_fd, u64 gmem_offset) { struct kvm_userspace_memory_region2 region =3D { .slot =3D slot, @@ -978,8 +978,8 @@ int __vm_set_user_memory_region2(struct kvm_vm *vm, u32= slot, u32 flags, .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(); @@ -989,10 +989,10 @@ int __vm_set_user_memory_region2(struct kvm_vm *vm, u= 32 slot, u32 flags, =20 void vm_set_user_memory_region2(struct kvm_vm *vm, u32 slot, u32 flags, gpa_t gpa, u64 size, void *hva, - u32 guest_memfd, u64 guest_memfd_offset) + u32 gmem_fd, u64 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)); @@ -1002,7 +1002,7 @@ void vm_set_user_memory_region2(struct kvm_vm *vm, u3= 2 slot, u32 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, gpa_t gpa, u32 slot, u64 npages, u32 flags, - int guest_memfd, u64 guest_memfd_offset) + int gmem_fd, u64 gmem_offset) { int ret; struct userspace_mem_region *region; @@ -1078,12 +1078,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) { - u32 guest_memfd_flags =3D 0; + if (gmem_fd < 0) { + u32 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 @@ -1091,11 +1091,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.55.0.887.g758fc8c411-goog From nobody Mon Sep 28 04:51:20 2026 Received: from mail-pj1-f72.google.com (mail-pj1-f72.google.com [209.85.216.72]) (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 6EB743DCDBD for ; Wed, 26 Aug 2026 09:18:57 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.216.72 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1787735943; cv=none; b=bORqPpOQ4XUEAkhpCJFcTCV1JFWdZdhnRodLrgxN/0SZgNnm+9BI94gJzNzG37nHcvOoTZrC14D10jx3gorsmzjAN/cE2mewPiuYNbyBwGJJrygmCuAH0kJ+c2j9fskYZlXcu+z5yxrjuGwR7VSHreBLEAeCFmdes0vXJw31KqE= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1787735943; c=relaxed/simple; bh=1jhPrkvLEI87GTgtEFv40H/xT+b1YJkMlotkTtRBsC0=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=MIwpUNyKeqgic8xV32mHU3bk2dksK3Fg7xmepkQycl3HCaEPCjhZ+2BaakRBNiFxpwDuq/TLGjAHTP4+Im3hVQS14J1flwPYKJba3nAl+xtb7nQ0r4iY96CKEhmUkW/6u5hdzzKRnF72ZRSdgvSnq9qP/IzfMU3f08CACViGTj0= 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=kCuuvQk4; arc=none smtp.client-ip=209.85.216.72 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="kCuuvQk4" Received: by mail-pj1-f72.google.com with SMTP id 98e67ed59e1d1-395543dc382so1091328a91.0 for ; Wed, 26 Aug 2026 02:18:56 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20251104; t=1787735934; x=1788340734; darn=vger.kernel.org; h=content-type:cc:to:from:subject:message-id:references:mime-version :in-reply-to:date:from:to:cc:subject:date:message-id:reply-to :content-type; bh=nW/Bx4P2jJT94oLQdzkm368Cs7uj0juF0EvPF05mG7A=; b=kCuuvQk4gXaplq2+15bUjFQq4Oz2ZVm7KJg4k2Zz5Xo13c5ezTsThybRrMVLExXIRI FBQW1gvVcSAjY67DrjF2MOpoUJPEUjqowcZ2hEy2KX/X4+aiW3MPmUy66RM0q+w4aE7N yaXrQM7rtBEMqepmnrlYK5y+Xpr3AQ87ilfhkH1U5PkI6j4gqXcm806PqGubjGnKJseq Yb9jvYeLdSQL566XRIFA3tWgaoWu1G0aGR5w9UzqxlSwaYolJzeLnYfEpWfmyKZKcoIQ tjr8oEYao+bi40/V7nWePUR0n3I97vyDOqqVL0XNr+kKp9F6CUTSHKagPKcf6in3qib9 CjTw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1787735934; x=1788340734; h=content-type: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:content-type; bh=nW/Bx4P2jJT94oLQdzkm368Cs7uj0juF0EvPF05mG7A=; b=B2L6mQAlZrerOQKjHVTcvcRjr/Uwgls84v2xF/49+PngHKf48bZxOJffN1eMCzWRxt Ee3jeFA+uJQWtqtY8K8Or2icbq3yQ0U9EIDFXnG+TtrfeHE6kc607LBLv2uJ2ueuYTda yl5CcjE0n/MAzDRkhE2SWF5ZXbZmZXv45etlngF4zTs0fGu91ueWDh3n6WAZQv4hyQBH fxgs9fNA9pdtehZrCr23rZ8IQLOqx8Ftd7t6naTbJhw6Q0dyCVJGMostuFPy91X+yflw pcFfas1zCL6SdmQY4KpCt5ptZH7rjA20AWjLrGcYThhO6LhZT3MQ2FDwZktpzXlD7+7L UBAw== X-Forwarded-Encrypted: i=1; AHgh+RrCL+A07Eat00UBycvz75VWvWx9Fo+FP0/JEr06tT0O/cAJAJ1qaA8ExvjI80Sx2TW0//wKyUsHgO8MtL4=@vger.kernel.org X-Gm-Message-State: AFuF++lFxIbVb3AlKsGITW329IC39TO+V5JgikvbsEVa/k5wO/4OveKF 4kmEBt/bJKS4JlUq4wVCKE45TIj/TBbZ+zyo2/euNyzJOoluJ3Iidkxln8NKbUItje62Y5Cc06U dQewx/aOglAV7Rb6UO7ZUYDGybw== X-Received: from plma15.prod.google.com ([2002:a17:902:7d8f:b0:2c7:f19d:bb15]) (user=ackerleytng job=prod-delivery.src-stubby-dispatcher) by 2002:a17:903:1104:b0:2d6:e401:9676 with SMTP id d9443c01a7336-2d707955aa3mr86624575ad.1.1787735933588; Wed, 26 Aug 2026 02:18:53 -0700 (PDT) Date: Wed, 26 Aug 2026 09:18:25 +0000 In-Reply-To: <20260826-gmem-inplace-conversion-v11-0-0a15d8a799aa@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20260826-gmem-inplace-conversion-v11-0-0a15d8a799aa@google.com> X-Developer-Key: i=ackerleytng@google.com; a=ed25519; pk=sAZDYXdm6Iz8FHitpHeFlCMXwabodTm7p8/3/8xUxuU= X-Developer-Signature: v=1; a=ed25519-sha256; t=1787735885; l=6306; i=ackerleytng@google.com; s=20260225; h=from:subject:message-id; bh=iH6mV6vz9nv+7yGhH2glpEiB5Axbc8NLNwkfFuGS8bc=; b=eeGISm57LUVrThy3WYFRGn0ADNhx8cOa1mhGNQcmpPGa+nPA+FZFKYI6zPgeud/R7Bz1UVu2i A8ITRzICJzPAmUnWNb5K4m8g1JY/EWxBUD1EWrzSGQgoaH1E6OTBAWA X-Mailer: b4 0.16.0 Message-ID: <20260826-gmem-inplace-conversion-v11-27-0a15d8a799aa@google.com> Subject: [PATCH v11 27/46] 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, jmattson@google.com, jthoughton@google.com, michael.roth@amd.com, oupton@kernel.org, pankaj.gupta@amd.com, qperret@google.com, rick.p.edgecombe@intel.com, rientjes@google.com, shivankg@amd.com, steven.price@arm.com, willy@infradead.org, wyihan@google.com, yan.y.zhao@intel.com, forkloop@google.com, pratyush@kernel.org, suzuki.poulose@arm.com, aneesh.kumar@kernel.org, liam@infradead.org, Paolo Bonzini , Sean Christopherson , Thomas Gleixner , Ingo Molnar , Borislav Petkov , Dave Hansen , x86@kernel.org, "H. Peter Anvin" , Steven Rostedt , Masami Hiramatsu , Mathieu Desnoyers , Jonathan Corbet , Shuah Khan , Shuah Khan , Vishal Annapurve , Andrew Morton , Chris Li , Kairui Song , Kemeng Shi , Nhat Pham , Barry Song , Axel Rasmussen , Yuanchu Xie , Wei Xu , Youngjun Park , Qi Zheng , Shakeel Butt , Kiryl Shutsemau , Baoquan He , Jason Gunthorpe , John Hubbard , Peter Xu , tarunsahu@google.com, Fuad Tabba , Vlastimil Babka Cc: kvm@vger.kernel.org, linux-kernel@vger.kernel.org, linux-trace-kernel@vger.kernel.org, linux-doc@vger.kernel.org, linux-kselftest@vger.kernel.org, linux-mm@kvack.org, linux-coco@lists.linux.dev, 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. For guest_memfds, mmap() using gmem_offset instead of 0 all the time. Always use MAP_SHARED if mmap-ing from guest_memfd instead of reading flag from the configured src_type, which doesn't include guest_memfd. 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 [mmap() with gmem_offset, and always with MAP_SHARED.] Reviewed-by: Fuad Tabba Tested-by: Shivank Garg Signed-off-by: Ackerley Tng --- tools/testing/selftests/kvm/include/kvm_util.h | 7 +++++- tools/testing/selftests/kvm/lib/kvm_util.c | 28 ++++++++++++------= ---- .../kvm/x86/private_mem_conversions_test.c | 2 +- 3 files changed, 23 insertions(+), 14 deletions(-) diff --git a/tools/testing/selftests/kvm/include/kvm_util.h b/tools/testing= /selftests/kvm/include/kvm_util.h index cf49a84de02e8..a091c495442a1 100644 --- a/tools/testing/selftests/kvm/include/kvm_util.h +++ b/tools/testing/selftests/kvm/include/kvm_util.h @@ -700,7 +700,7 @@ void vm_userspace_mem_region_add(struct kvm_vm *vm, gpa_t gpa, u32 slot, u64 npages, u32 flags); void vm_mem_add(struct kvm_vm *vm, enum vm_mem_backing_src_type src_type, gpa_t gpa, u32 slot, u64 npages, u32 flags, - int gmem_fd, u64 gmem_offset); + int gmem_fd, u64 gmem_offset, u64 gmem_flags); =20 #ifndef vm_arch_has_protected_memory static inline bool vm_arch_has_protected_memory(struct kvm_vm *vm) @@ -732,6 +732,11 @@ void *addr_gva2hva(struct kvm_vm *vm, gva_t gva); gpa_t addr_hva2gpa(struct kvm_vm *vm, void *hva); void *addr_gpa2alias(struct kvm_vm *vm, gpa_t gpa); =20 +static inline int kvm_slot_to_fd(struct kvm_vm *vm, u32 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 af501a27211a2..08d0bbcd421ea 100644 --- a/tools/testing/selftests/kvm/lib/kvm_util.c +++ b/tools/testing/selftests/kvm/lib/kvm_util.c @@ -1002,12 +1002,14 @@ void vm_set_user_memory_region2(struct kvm_vm *vm, = u32 slot, u32 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, gpa_t gpa, u32 slot, u64 npages, u32 flags, - int gmem_fd, u64 gmem_offset) + int gmem_fd, u64 gmem_offset, u64 gmem_flags) { int ret; struct userspace_mem_region *region; size_t backing_src_pagesz =3D get_backing_src_pagesz(src_type); + int mmap_flags =3D vm_mem_backing_src_alias(src_type)->flag; size_t mem_size =3D npages * vm->page_size; + off_t mmap_offset =3D 0; size_t alignment =3D 1; =20 TEST_REQUIRE_SET_USER_MEMORY_REGION2(); @@ -1079,8 +1081,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) { - u32 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); @@ -1101,13 +1101,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_flags =3D MAP_SHARED; + 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, + mmap_flags, 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), @@ -1153,10 +1157,10 @@ void vm_mem_add(struct kvm_vm *vm, enum vm_mem_back= ing_src_type src_type, =20 /* If shared memory, create an alias. */ if (region->fd >=3D 0) { - region->mmap_alias =3D kvm_mmap(region->mmap_size, - PROT_READ | PROT_WRITE, - vm_mem_backing_src_alias(src_type)->flag, - region->fd); + region->mmap_alias =3D __kvm_mmap(region->mmap_size, + PROT_READ | PROT_WRITE, + mmap_flags, region->fd, + mmap_offset); =20 /* Align host alias address */ region->host_alias =3D align_ptr_up(region->mmap_alias, alignment); @@ -1167,7 +1171,7 @@ void vm_userspace_mem_region_add(struct kvm_vm *vm, enum vm_mem_backing_src_type src_type, gpa_t gpa, u32 slot, u64 npages, u32 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 3aa0673f79f33..f3de2a4ab0551 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, u32 nr_v 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++) { gpa_t gpa =3D BASE_DATA_GPA + i * per_cpu_size; --=20 2.55.0.887.g758fc8c411-goog From nobody Mon Sep 28 04:51:20 2026 Received: from mail-pg1-f200.google.com (mail-pg1-f200.google.com [209.85.215.200]) (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 5BAED3EB81B for ; Wed, 26 Aug 2026 09:18:59 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.215.200 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1787735944; cv=none; b=DCCHdZCrW8uMkytYzy0YiaFUKIf+2ZeMry5ZGn5wkh3luejcGNwe6/18DtIvWYToLdSwwo+PzCDjlxBu20EGkeR4BOHc2RFSWCXJLJxt2R6LGUBLVdhedCKtrF1oc+SURXu3d2BJAqA7bmF503pqacMFH+YS7Xv5u6Ig84aM1ZA= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1787735944; c=relaxed/simple; bh=l73U6b9QMJm++wnVRVWmusR6Da3x6x6ObMPGHhXOFXY=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=ZENwLstIC/i96suEHilpdPnru/ti7r0Y63Hj9+a+8afZE5x/0PXv668fWsY4WAXPJ4dKnbWV/VkGl4BuRs/OrQ9zb3v+U0lxce6eRLf0+jZz2+lFPCzrwOidgqeR2283POfBgrhmwdrMeZdyom+IUIStTDp3zEO/PBx4548ZuWs= 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=Hp8PoZeN; arc=none smtp.client-ip=209.85.215.200 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="Hp8PoZeN" Received: by mail-pg1-f200.google.com with SMTP id 41be03b00d2f7-cbe77d6864dso1124350a12.2 for ; Wed, 26 Aug 2026 02:18:57 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20251104; t=1787735935; x=1788340735; darn=vger.kernel.org; h=content-type:cc:to:from:subject:message-id:references:mime-version :in-reply-to:date:from:to:cc:subject:date:message-id:reply-to :content-type; bh=BY70MMIKZKRKauwOTq9m7n2x1FHu0Xdv6rM2Gy5jXqw=; b=Hp8PoZeNoBVI2R9ac4X5p9AeLdrgcMNnDXIJ+q9GxagJee8Uy4jEH9f+CDWUuvIlHA oXW9KA0dyb/5ogzSoYxLNyWI9vSeWt7L1k7ALSU+DzcxsGqCASiMyOrFO7j7hN1wf3Fn bM+Gh53SDdURYczkvY594FRyIQJbo5NvSaOFNvoRH6ITWSgmNn++IWtlxmU3fswsHnLU kk+2Ww4OBpa8Zdvd/ilOBIHEGvn5ajbzBew/Xq7JZ5xUZWXl+rN+5oNH8AvWSXucM066 arYjqzDdded+sM4/DJ9Z2rzwbLWasI/EFr0saOCdxkbZqiXnQ+yGo3j5fEsYVMno/h/S 79Aw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1787735935; x=1788340735; h=content-type: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:content-type; bh=BY70MMIKZKRKauwOTq9m7n2x1FHu0Xdv6rM2Gy5jXqw=; b=b3L8ttBGSpKEp/klC/y0LBML7jnQ8Bep4JcNbMz5aa8cKExoSCzlpXSoTLOA115jtJ hqobav0F5mxFMZDnjwVA/Lub3oD899m0bro+vBh+35DEcw6yUejLZoko2+MtkL1MZkcV KsrxFAaf21tNT3vEZzt+aM+PB8iULwrsJ+skBZLFiK7UoHFPkBKgpW+DNuQGXwKlFCt1 RrvdByWgfwP5XCVkbjwjF39KpMCrE/Pj26TiTBPfJV/QOeGvafEbGIk9ruKBBh9b+kHS tHbpdF8PJKeAnYgSJdX3yjOTzENyXbxRsXUVyZi6HPsoAyIn2CfDrvJN8PaLy6o5zkMh xKdg== X-Forwarded-Encrypted: i=1; AHgh+RpKfNQt1CwBDyN+Xa6/VqnL1K3C9IieY+AcJJGO5xJ3zhlxbYXAbN0xAWlIzBWIwt24rl0Y/3gg5R9IwsI=@vger.kernel.org X-Gm-Message-State: AFuF++noCdb4gsSMIzqEFwSkAIRxutpHJUiNSq9VfcrykM89Te7Yp8sV BLX4KLUFDwdBrGjIp9rc1NzdCYVpbSRK+cUhxSbQKJmXVkI4tnP5L5RRlZmzCRB3ExJG/P2KFSm Lr7s6CRBvWMUXFcAH3M6SYjMsvg== X-Received: from pgnd15.prod.google.com ([2002:a63:734f:0:b0:cbe:6339:419b]) (user=ackerleytng job=prod-delivery.src-stubby-dispatcher) by 2002:a05:6a21:9202:b0:3c3:64cb:9b99 with SMTP id adf61e73a8af0-3cf76283ed6mr11221625637.6.1787735935314; Wed, 26 Aug 2026 02:18:55 -0700 (PDT) Date: Wed, 26 Aug 2026 09:18:26 +0000 In-Reply-To: <20260826-gmem-inplace-conversion-v11-0-0a15d8a799aa@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20260826-gmem-inplace-conversion-v11-0-0a15d8a799aa@google.com> X-Developer-Key: i=ackerleytng@google.com; a=ed25519; pk=sAZDYXdm6Iz8FHitpHeFlCMXwabodTm7p8/3/8xUxuU= X-Developer-Signature: v=1; a=ed25519-sha256; t=1787735885; l=2380; i=ackerleytng@google.com; s=20260225; h=from:subject:message-id; bh=Q/A6Dc0B0gRna9abP7QnB2WrkUxTYkjcUX3FbTtwMJI=; b=2YkTIc1SmD00N2MMdJmLmjlME4gtBWUYhIUyh7O71YGRuPDt2J8tpdmJsRGiLloiJb86kHa1e IiS094M8sscCQIJsw6CDHW3d9k4k2B+zvtFayWaStH6wkSP2zGMskI9 X-Mailer: b4 0.16.0 Message-ID: <20260826-gmem-inplace-conversion-v11-28-0a15d8a799aa@google.com> Subject: [PATCH v11 28/46] 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, jmattson@google.com, jthoughton@google.com, michael.roth@amd.com, oupton@kernel.org, pankaj.gupta@amd.com, qperret@google.com, rick.p.edgecombe@intel.com, rientjes@google.com, shivankg@amd.com, steven.price@arm.com, willy@infradead.org, wyihan@google.com, yan.y.zhao@intel.com, forkloop@google.com, pratyush@kernel.org, suzuki.poulose@arm.com, aneesh.kumar@kernel.org, liam@infradead.org, Paolo Bonzini , Sean Christopherson , Thomas Gleixner , Ingo Molnar , Borislav Petkov , Dave Hansen , x86@kernel.org, "H. Peter Anvin" , Steven Rostedt , Masami Hiramatsu , Mathieu Desnoyers , Jonathan Corbet , Shuah Khan , Shuah Khan , Vishal Annapurve , Andrew Morton , Chris Li , Kairui Song , Kemeng Shi , Nhat Pham , Barry Song , Axel Rasmussen , Yuanchu Xie , Wei Xu , Youngjun Park , Qi Zheng , Shakeel Butt , Kiryl Shutsemau , Baoquan He , Jason Gunthorpe , John Hubbard , Peter Xu , tarunsahu@google.com, Fuad Tabba , Vlastimil Babka Cc: kvm@vger.kernel.org, linux-kernel@vger.kernel.org, linux-trace-kernel@vger.kernel.org, linux-doc@vger.kernel.org, linux-kselftest@vger.kernel.org, linux-mm@kvack.org, linux-coco@lists.linux.dev, 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 Reviewed-by: Fuad Tabba Tested-by: Shivank Garg 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 a6a3e16578959..d5825211f2727 100644 --- a/tools/testing/selftests/kvm/include/test_util.h +++ b/tools/testing/selftests/kvm/include/test_util.h @@ -116,6 +116,8 @@ struct kvm_random_state { extern u32 kvm_random_seed; extern struct kvm_random_state kvm_rng; =20 +extern bool kvm_has_gmem_attributes; + struct kvm_random_state new_kvm_random_state(u32 seed); u32 kvm_random_u32(struct kvm_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 08d0bbcd421ea..cd468b2bb8343 100644 --- a/tools/testing/selftests/kvm/lib/kvm_util.c +++ b/tools/testing/selftests/kvm/lib/kvm_util.c @@ -32,6 +32,8 @@ static void kvm_seed_rng(u32 seed) kvm_rng =3D new_kvm_random_state(kvm_random_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) @@ -527,6 +529,7 @@ struct kvm_vm *__vm_create(struct vm_shape shape, u32 n= r_runnable_vcpus, kvm_seed_rng(kvm_random_seed); =20 sync_global_to_guest(vm, kvm_rng); + sync_global_to_guest(vm, kvm_has_gmem_attributes); =20 kvm_arch_vm_post_create(vm, nr_runnable_vcpus); =20 @@ -2311,6 +2314,8 @@ void __attribute((constructor)) kvm_selftest_init(voi= d) srandom(time(0)); kvm_seed_rng(random()); =20 + kvm_has_gmem_attributes =3D kvm_has_cap(KVM_CAP_GUEST_MEMFD_MEMORY_ATTRIB= UTES); + kvm_selftest_arch_init(); } =20 --=20 2.55.0.887.g758fc8c411-goog From nobody Mon Sep 28 04:51:20 2026 Received: from mail-pg1-f199.google.com (mail-pg1-f199.google.com [209.85.215.199]) (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 078643DCDBC for ; Wed, 26 Aug 2026 09:18:59 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.215.199 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1787735945; cv=none; b=e3UMeKVT1QH1bE1oUrErsGb+9m4BaewDZ2kgVEE5Nc6OvrSdxbt54LdOV7CTR6s6IwEyC/WYqKoV5otU6W0rLucT3RQAu/Yb4mB0A01ZSL4iQpmZTOPbXWDUQ24+M0vu8BzoWaNTRkboWDZp1WEk0CjzW4Z91ejg0WHQTFVo8OY= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1787735945; c=relaxed/simple; bh=RyMAmvMbBLSqvPJXc5WYL2mZUFTYUNVdM45fTpg7XpA=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=nutHuDyVuFr1jZxPegMXxOYliwlXAF5tALRdXzQKpDNoyRaGT6GgdAFhYeQIsn9qEt0AXWdfpHrxQjw98Vj226fC4GHnDo5AGyhvDl8WfyhI2ecuv2Lqyu8q/m1Fa61pcwySLh/0E+dylHayk1yW0mrWybB1X3KAi3cyKsZPIkU= 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=WtsM0H3u; arc=none smtp.client-ip=209.85.215.199 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="WtsM0H3u" Received: by mail-pg1-f199.google.com with SMTP id 41be03b00d2f7-cc1b8088203so1090065a12.3 for ; Wed, 26 Aug 2026 02:18:59 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20251104; t=1787735937; x=1788340737; darn=vger.kernel.org; h=content-type:cc:to:from:subject:message-id:references:mime-version :in-reply-to:date:from:to:cc:subject:date:message-id:reply-to :content-type; bh=/81lA0Cpz/oRFwzMFnP0lg485AVXtJOskviG9WvcA48=; b=WtsM0H3uBUODEnyH7cEzp6N0nypqIzs0G0gRNlWXNwtHuS8arnEZ5C8H2pjxPsOSRd hVU98cIlC8Qu5jRVw92Lw74JOR4/3fPDO+E+XxEpIaw4S7u4UbvFzeGBvjhX89HeOMlu 80j+dDNcuV0oCeMziWpJPdCJV4VrWVIIJndr+JDLAyueKMebxrP7BntmRZD6cFQ8haUd 9j/RfhOUiaUmFPsobz6vrWW7zXYHWm5Jyuf+kAMjJvMRt/Dm7ZuuHSwsivVaf83qs3PE 6TQK0vAey9vV2CaDgRo4x9YVHZhpOxedROOZiH4m16rDIbRc0DCsEzALgXp23Ap0SZSJ jC1A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1787735937; x=1788340737; h=content-type: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:content-type; bh=/81lA0Cpz/oRFwzMFnP0lg485AVXtJOskviG9WvcA48=; b=ZDKGXnb47xmFAQ+x571cZk7CLYpsFDOnuAfkolhF+xdVJ2oSBD0so9Cce91DwwWY96 LSKSo5fImW6cPxBwHZ+TgjlpZXqRxwE2+rz2drYXdPqvT2KFTm7OICKBugbvRfA/svxR r8qHStE4oICtCIOCxCXZ/tccrPzRkgf9y0oNsiuIjouy90TO0lrDVAYyRgw4peXTRW7x qP0AfUIIenu3T3BIms/pwsAJms/1JYoX5gQUAUz6nqH23Tk3dBQfmC/ZxiJcdkliTa9B nmvG19HoU8CKOkDpj5uLsNkVALOpe1rydWWnrmpPubjawPerJr9sQdVAgHSoy5KWBqDc VzDQ== X-Forwarded-Encrypted: i=1; AHgh+Ro3MJr6UqTl6iZVQJBAMjVJi/xoPb/bV331KZeleOPt8tHoPcbp0THqcPn80Z+k5BA8KS/G0pq9xrHaPdU=@vger.kernel.org X-Gm-Message-State: AFuF++nd2UmHQGjVxXP9Aw0lTQ8vdwCOgH+lL+xrLVGdiqFtrC7C/Wv0 4Rv5iOkHj3Dj7wxnqqodTsIeANIQX5NCEdAeyQE5H1ODjCf/LYR/OiPJfiE8TLptROJb5mFTXCy VhT0N0N10YGdAQZDBwUdRRlQLRg== X-Received: from plat5.prod.google.com ([2002:a17:902:e1c5:b0:2bc:ac01:8af8]) (user=ackerleytng job=prod-delivery.src-stubby-dispatcher) by 2002:a17:903:1b44:b0:2d6:ccc5:a3dd with SMTP id d9443c01a7336-2d707a71485mr102551555ad.4.1787735936967; Wed, 26 Aug 2026 02:18:56 -0700 (PDT) Date: Wed, 26 Aug 2026 09:18:27 +0000 In-Reply-To: <20260826-gmem-inplace-conversion-v11-0-0a15d8a799aa@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20260826-gmem-inplace-conversion-v11-0-0a15d8a799aa@google.com> X-Developer-Key: i=ackerleytng@google.com; a=ed25519; pk=sAZDYXdm6Iz8FHitpHeFlCMXwabodTm7p8/3/8xUxuU= X-Developer-Signature: v=1; a=ed25519-sha256; t=1787735885; l=5371; i=ackerleytng@google.com; s=20260225; h=from:subject:message-id; bh=de7l0dfCPRv0ZFRIHLiesqcC1gyIjIA61Ch8/0FC1RE=; b=+7oSxBwaRZkZFtViFndHGQONA/JOepFmLXygu7h6ctbFbnB5VS7rmsTcrycmZNVjQ7FxUAfj4 kY06XWKTQARCDaE9SZF9BosN9IpGYMriSQ4JP3/r0vanw2IF0zOZfuR X-Mailer: b4 0.16.0 Message-ID: <20260826-gmem-inplace-conversion-v11-29-0a15d8a799aa@google.com> Subject: [PATCH v11 29/46] 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, jmattson@google.com, jthoughton@google.com, michael.roth@amd.com, oupton@kernel.org, pankaj.gupta@amd.com, qperret@google.com, rick.p.edgecombe@intel.com, rientjes@google.com, shivankg@amd.com, steven.price@arm.com, willy@infradead.org, wyihan@google.com, yan.y.zhao@intel.com, forkloop@google.com, pratyush@kernel.org, suzuki.poulose@arm.com, aneesh.kumar@kernel.org, liam@infradead.org, Paolo Bonzini , Sean Christopherson , Thomas Gleixner , Ingo Molnar , Borislav Petkov , Dave Hansen , x86@kernel.org, "H. Peter Anvin" , Steven Rostedt , Masami Hiramatsu , Mathieu Desnoyers , Jonathan Corbet , Shuah Khan , Shuah Khan , Vishal Annapurve , Andrew Morton , Chris Li , Kairui Song , Kemeng Shi , Nhat Pham , Barry Song , Axel Rasmussen , Yuanchu Xie , Wei Xu , Youngjun Park , Qi Zheng , Shakeel Butt , Kiryl Shutsemau , Baoquan He , Jason Gunthorpe , John Hubbard , Peter Xu , tarunsahu@google.com, Fuad Tabba , Vlastimil Babka Cc: kvm@vger.kernel.org, linux-kernel@vger.kernel.org, linux-trace-kernel@vger.kernel.org, linux-doc@vger.kernel.org, linux-kselftest@vger.kernel.org, linux-mm@kvack.org, linux-coco@lists.linux.dev, 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 Reviewed-by: Fuad Tabba Tested-by: Shivank Garg Signed-off-by: Ackerley Tng --- tools/testing/selftests/kvm/include/kvm_util.h | 94 ++++++++++++++++++++++= +--- 1 file changed, 86 insertions(+), 8 deletions(-) diff --git a/tools/testing/selftests/kvm/include/kvm_util.h b/tools/testing= /selftests/kvm/include/kvm_util.h index a091c495442a1..575032e9791d2 100644 --- a/tools/testing/selftests/kvm/include/kvm_util.h +++ b/tools/testing/selftests/kvm/include/kvm_util.h @@ -392,6 +392,16 @@ static __always_inline void static_assert_is_vcpu(stru= ct kvm_vcpu *vcpu) { } __TEST_ASSERT_VM_VCPU_IOCTL(!ret, #cmd, ret, (vcpu)->vm); \ }) =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)); \ +}) + /* * Looks up and returns the value corresponding to the capability * (KVM_CAP_*) given by cap. @@ -418,8 +428,16 @@ static inline void vm_enable_cap(struct kvm_vm *vm, u3= 2 cap, u64 arg0) vm_ioctl(vm, KVM_ENABLE_CAP, &enable_cap); } =20 +/* + * KVM_SET_MEMORY_ATTRIBUTES{,2} 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_PRI= VATE, \ + "Update me to support multiple attributes!") + static inline void vm_set_memory_attributes(struct kvm_vm *vm, gpa_t gpa, - u64 size, u64 attributes) + size_t size, u64 attributes) { struct kvm_memory_attributes attr =3D { .attributes =3D attributes, @@ -428,17 +446,11 @@ static inline void vm_set_memory_attributes(struct kv= m_vm *vm, gpa_t gpa, .flags =3D 0, }; =20 - /* - * KVM_SET_MEMORY_ATTRIBUTES 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 vm_ioctl(vm, KVM_SET_MEMORY_ATTRIBUTES, &attr); } =20 - static inline void vm_mem_set_private(struct kvm_vm *vm, gpa_t gpa, u64 size) { @@ -451,6 +463,72 @@ static inline void vm_mem_set_shared(struct kvm_vm *vm= , gpa_t gpa, vm_set_memory_attributes(vm, gpa, size, 0); } =20 +static inline int __gmem_set_memory_attributes(int fd, u64 offset, + size_t size, u64 attributes, + u64 *error_offset) +{ + struct kvm_memory_attributes2 attr =3D { + .attributes =3D attributes, + .offset =3D offset, + .size =3D size, + .flags =3D 0, + .error_offset =3D 0, + }; + int r; + + r =3D __gmem_ioctl(fd, KVM_SET_MEMORY_ATTRIBUTES2, &attr); + + /* Copy error_offset regardless of r so caller can check. */ + if (error_offset) + *error_offset =3D attr.error_offset; + + return r; +} + +static inline int __gmem_set_private(int fd, u64 offset, size_t size, + u64 *error_offset) +{ + return __gmem_set_memory_attributes(fd, offset, size, + KVM_MEMORY_ATTRIBUTE_PRIVATE, + error_offset); +} + +static inline int __gmem_set_shared(int fd, u64 offset, size_t size, + u64 *error_offset) +{ + return __gmem_set_memory_attributes(fd, offset, size, 0, + error_offset); +} + +static inline void gmem_set_memory_attributes(int fd, u64 offset, + size_t size, u64 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, u64 offset, size_t size) +{ + gmem_set_memory_attributes(fd, offset, size, + KVM_MEMORY_ATTRIBUTE_PRIVATE); +} + +static inline void gmem_set_shared(int fd, u64 offset, size_t size) +{ + gmem_set_memory_attributes(fd, offset, size, 0); +} + void vm_guest_mem_fallocate(struct kvm_vm *vm, gpa_t gpa, u64 size, bool punch_hole); =20 --=20 2.55.0.887.g758fc8c411-goog From nobody Mon Sep 28 04:51:20 2026 Received: from mail-pg1-f197.google.com (mail-pg1-f197.google.com [209.85.215.197]) (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 4846A3C1086 for ; Wed, 26 Aug 2026 09:19:02 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.215.197 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1787735947; cv=none; b=F4crwWUAbRM30RicB8dTRXCCfoZR2VwhpdM4mFoCpxL/LE2+CXqnY9oVAH1JGWT1jqsDpbbeqXvR7DhQHPYDBnx9b0GeFfcnQa5y17Va/DR/H/sYgsVIyQDjf/gGaoLhcvjxwET0Q7l5dXborPgh6LnNwJX/7p5sJLJtAcd7EaA= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1787735947; c=relaxed/simple; bh=4q9bpvk0He9dlg1zIfuX1OzTZApDcwh7V89/D7oUpPc=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=ZBiLBHcYujbw2M1Yf+c1JP6o82Nl28kQt7ABmBpJ5qHPtxVFK7PVtBH+WaeaQ1N6tNxQUnrMNbPKRMSnZyTUCsNttfeGrPvkzfdDvCEv6h/eJ2KFuHAFKQUCQZohzUdshKWexFSi0uLKvPQyyz+wG22Dm3bs8FgGkTM0kw0vRdg= 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=U37Acl6P; arc=none smtp.client-ip=209.85.215.197 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="U37Acl6P" Received: by mail-pg1-f197.google.com with SMTP id 41be03b00d2f7-c85798977dcso1161422a12.0 for ; Wed, 26 Aug 2026 02:19:02 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20251104; t=1787735939; x=1788340739; darn=vger.kernel.org; h=content-type:cc:to:from:subject:message-id:references:mime-version :in-reply-to:date:from:to:cc:subject:date:message-id:reply-to :content-type; bh=LVBwWKg0mQrXO0O10YWfHe5lznyWgkfKGCMSeuSJr3I=; b=U37Acl6PsmPxZEcfjB17gqcndKWO07e1EBevE2L0T5CJD08ztKJJTuR2eqMl3uWofR Dm2iXHcfMabw+Q0JzM/9xavUWFcW11kqKD5RpC0cp2HUv3lhdhsYAXsyn9ve3RVTYZ9Y orl36KNuejH+Mxdop7NdIDgdqTADhlTw8RjpvW/xJtlHs6UNAwrfnz3NN/L54ZB3jtDQ sSJLOeT4gRwAe39BC55b2Eu04P8KVstL+GpmnjPVcLRO6VenLh9PqgnmpT2w9wH8ZpPD Lma/tTb3OYffvVfiZ2BVATOpTr+qWO6HoccnB3IEqE4khGppQITx4YIqsPVNRcQvhDtY Frtw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1787735939; x=1788340739; h=content-type: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:content-type; bh=LVBwWKg0mQrXO0O10YWfHe5lznyWgkfKGCMSeuSJr3I=; b=GbqHPYiavEwEprm6NDTZDOEeGgtTLntdc5xCzRrQ8SqV+VsI3/ISxY88Vox2dKwhgC KkD8zO+jt8wMJQm/A/xYyrhRskxbXiB5fjY9DMMcAKblMmEgH4MV/motNF12HUg1jZAV z8aJp+5B1g2EGVolb2Zw0igje75Wk+yhT37dQLZV3s/rKtXua9oWagyq+xR3fIDzYGz7 dsKByUMVhRABQrNipDfTeQuTZgOYds35mzFFurcqY810+WpsS78kpdwm6B0kvx+VNc3l CgZrZG/syexbK8XV/Ksh/lJqU5AQYd6+7d/hiHSI2B2XBReXCDTaICIJ2ZwzgG6OO50t 4ObQ== X-Forwarded-Encrypted: i=1; AHgh+RrKIETP7jUrUJhzYL8O9bkS4iB48+prgfmzJWOLYgTf+ZcK1ZrMhiWmqwGOkoFL4c1/M1yioEEixHFy2SE=@vger.kernel.org X-Gm-Message-State: AFuF++kdzRJn5t1P6ZQmJz9ladHF3B1Ie5hdnn59X9CIFL0ImTCJrGp4 M8W1z70c7zPTfdd4lYtKQTcd6YCjEaUTRZ20CucqIVKO+mn/jEqP+ZF9e3hmMiz0vrJNBP7/GW7 ziLr4ZYVDpOjovONzSX+UaMcA6A== X-Received: from pgbaz9.prod.google.com ([2002:a05:6a02:49:b0:c85:a528:228f]) (user=ackerleytng job=prod-delivery.src-stubby-dispatcher) by 2002:a05:6a20:b7aa:b0:3ce:d411:8120 with SMTP id adf61e73a8af0-3cf84e514a9mr11917462637.15.1787735938666; Wed, 26 Aug 2026 02:18:58 -0700 (PDT) Date: Wed, 26 Aug 2026 09:18:28 +0000 In-Reply-To: <20260826-gmem-inplace-conversion-v11-0-0a15d8a799aa@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20260826-gmem-inplace-conversion-v11-0-0a15d8a799aa@google.com> X-Developer-Key: i=ackerleytng@google.com; a=ed25519; pk=sAZDYXdm6Iz8FHitpHeFlCMXwabodTm7p8/3/8xUxuU= X-Developer-Signature: v=1; a=ed25519-sha256; t=1787735885; l=7821; i=ackerleytng@google.com; s=20260225; h=from:subject:message-id; bh=4q9bpvk0He9dlg1zIfuX1OzTZApDcwh7V89/D7oUpPc=; b=nyqc1iOPnm21bfxaup4U15mR1PPdqF8HZQY61MTVaf2kB9Xz/xKXwWrUm5V0Q9oK9FtOtdvcV EWZn+3RK37LDtybAneIdqnQHWLzzevvjPYAXQ+cyEUvkGhFhcxIrW/C X-Mailer: b4 0.16.0 Message-ID: <20260826-gmem-inplace-conversion-v11-30-0a15d8a799aa@google.com> Subject: [PATCH v11 30/46] 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, jmattson@google.com, jthoughton@google.com, michael.roth@amd.com, oupton@kernel.org, pankaj.gupta@amd.com, qperret@google.com, rick.p.edgecombe@intel.com, rientjes@google.com, shivankg@amd.com, steven.price@arm.com, willy@infradead.org, wyihan@google.com, yan.y.zhao@intel.com, forkloop@google.com, pratyush@kernel.org, suzuki.poulose@arm.com, aneesh.kumar@kernel.org, liam@infradead.org, Paolo Bonzini , Sean Christopherson , Thomas Gleixner , Ingo Molnar , Borislav Petkov , Dave Hansen , x86@kernel.org, "H. Peter Anvin" , Steven Rostedt , Masami Hiramatsu , Mathieu Desnoyers , Jonathan Corbet , Shuah Khan , Shuah Khan , Vishal Annapurve , Andrew Morton , Chris Li , Kairui Song , Kemeng Shi , Nhat Pham , Barry Song , Axel Rasmussen , Yuanchu Xie , Wei Xu , Youngjun Park , Qi Zheng , Shakeel Butt , Kiryl Shutsemau , Baoquan He , Jason Gunthorpe , John Hubbard , Peter Xu , tarunsahu@google.com, Fuad Tabba , Vlastimil Babka Cc: kvm@vger.kernel.org, linux-kernel@vger.kernel.org, linux-trace-kernel@vger.kernel.org, linux-doc@vger.kernel.org, linux-kselftest@vger.kernel.org, linux-mm@kvack.org, linux-coco@lists.linux.dev, 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. Add test as an x86-specific test since guest_memfd's testing vehicle (KVM_X86_SW_PROTECTED_VM) is x86-specific. Co-developed-by: Sean Christopherson Signed-off-by: Sean Christopherson Reviewed-by: Fuad Tabba Tested-by: Shivank Garg Signed-off-by: Ackerley Tng --- v10: Updated __GMEM_CONVERSION_TEST macro to avoid potential macro argument reuse --- tools/testing/selftests/kvm/Makefile.kvm | 1 + .../kvm/x86/guest_memfd_conversions_test.c | 200 +++++++++++++++++= ++++ 2 files changed, 201 insertions(+) diff --git a/tools/testing/selftests/kvm/Makefile.kvm b/tools/testing/selft= ests/kvm/Makefile.kvm index 96bab7002d39e..239bc61ea384f 100644 --- a/tools/testing/selftests/kvm/Makefile.kvm +++ b/tools/testing/selftests/kvm/Makefile.kvm @@ -155,6 +155,7 @@ TEST_GEN_PROGS_x86 +=3D x86/max_vcpuid_cap_test TEST_GEN_PROGS_x86 +=3D x86/triple_fault_event_test TEST_GEN_PROGS_x86 +=3D x86/recalc_apic_map_test TEST_GEN_PROGS_x86 +=3D x86/aperfmperf_test +TEST_GEN_PROGS_x86 +=3D x86/guest_memfd_conversions_test 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 diff --git a/tools/testing/selftests/kvm/x86/guest_memfd_conversions_test.c= b/tools/testing/selftests/kvm/x86/guest_memfd_conversions_test.c new file mode 100644 index 0000000000000..77f95d49349ce --- /dev/null +++ b/tools/testing/selftests/kvm/x86/guest_memfd_conversions_test.c @@ -0,0 +1,200 @@ +// 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 size_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 gpa_t gpa =3D SZ_4G; + const u32 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) \ +{ \ + const int nr =3D (__nr_pages); \ + \ + gmem_conversions_do_setup(self, nr, flags); \ + __gmem_conversions_##test(self, nr); \ +} \ +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, u64 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, u64 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, u64 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, u64 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, u64 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, u64 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.55.0.887.g758fc8c411-goog From nobody Mon Sep 28 04:51:20 2026 Received: from mail-pl1-f197.google.com (mail-pl1-f197.google.com [209.85.214.197]) (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 7127A3C1970 for ; Wed, 26 Aug 2026 09:19:04 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.197 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1787735950; cv=none; b=tMrnvBgahFsn2CtCQ+sHbHXCneNNymMXIYSa2AofWNCXg3D12ZGxJrdKqCixp/3vWpy5aDdW9RJPzjM35dLzJwJB2/uT8FZeuJu1K3QWLfPF9q2/NmGlAvZnoAGLiF/+YDDtCsH+T3XGac+X3FRP5jEoyuhI8uUwHDZ8x2tYaoA= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1787735950; c=relaxed/simple; bh=m1EnsponEK3ffE+S4viVcHUMFCcCRT7Oe+a5rZdir9o=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=byCvN5OuV7ssoJOWotgFNFkAV5VOcxnOlTWd1WoDe3cdtKp9xzOaSIxF96DwLsOnQVriFuBSg1VBMXoPuDd7yBJU2nCkCbX3aDPijXrg1IcRC24GkXGOFkWHNJDHRXVHTWw06VAs7KmpzRIfAlvV28oIs9F+jyU/v7w5PMvrZ34= 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=uaidFdF4; arc=none smtp.client-ip=209.85.214.197 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="uaidFdF4" Received: by mail-pl1-f197.google.com with SMTP id d9443c01a7336-2d63c16fc5bso18113665ad.1 for ; Wed, 26 Aug 2026 02:19:03 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20251104; t=1787735941; x=1788340741; darn=vger.kernel.org; h=content-type:cc:to:from:subject:message-id:references:mime-version :in-reply-to:date:from:to:cc:subject:date:message-id:reply-to :content-type; bh=mryHVYsFMw5QfnvdlFWfWH3DHg2cIJI/N7Q9jVqtsNo=; b=uaidFdF412pgYrjdMsmMBt+QQedqUONbIfRJfLb/gBTVMFDETtaoJuumosk78GeTDw rIBl5oMM0QU4NRdqWcqsMTkYsspTfvVWZgv5YcmAT025ttslDbsLGLyw6MobiIjO1mdi 6TKKzZu1LWKg+olvhzH6uxW9ELKiL4Ju+/9HI+WNk1AkjIaaYaORSlaFenv4IpqA1TS3 gu9+oHyaFyg8fKNqjdsfenm24fSSz0Ekx5tADTlrbhXE80xe3F9Z+6bQjtQCHFFWIR8z BY/wSYyURhaobEwicuyvyo3v2tphAkt63kzT4KcUNWch6OMzTtsWwVLaLGLYdkVn+8iS wfvg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1787735941; x=1788340741; h=content-type: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:content-type; bh=mryHVYsFMw5QfnvdlFWfWH3DHg2cIJI/N7Q9jVqtsNo=; b=dYrs/aZPbJtlnLNmX2oOnM/HP7kkJaF0S3qruapi9yLVJAexzkd1r4Jctmj1gbG0jj vXgYQWjOoFCBSrN9/6Rb9oH/KGlaJTpkE1xGFmeqrWaHKhTGHLjr2dsVrEOlrIoJ8/5T dKAaoCMXY5epYaCyIqHxjmJfo34lWVXUoJapaVcv9xs/yJ3jv6A6VBFol+lqnzNXEjke VUppdM/MeYidzuU/OxBGCQRmcPSKS3FpnBeBuLLwE32TvuYZ2U9q6XwPWZuG2CNJxO9Y j2XsLy9LxBurovrneWc7VCD/dLrg//XC96t3qZYaeHU7dDRx66zKasWVV+0sI5Betwyv ritA== X-Forwarded-Encrypted: i=1; AHgh+Rod2KRCdfxHi4WPXxJiAkb/I8Fod1/aeqm3bPoICcEQshNbz+E4/q0WT8TRocQWe/XIsmf/C4YKeUAkLX0=@vger.kernel.org X-Gm-Message-State: AFuF++nUAiw9byStHYIBkdafn1tKqYzECkTpwPi6BlbsRB/tGJj1QX6m gEC9OvQGGVL8PFdoIkpKKfsDk6OcbFtS5dsljcLc2hHDiaIBg4mqdHPIatOHL0307WvT5p6bhY+ SwuiXcsZH1QwTbnL6BiswGYWhYQ== X-Received: from plblf11.prod.google.com ([2002:a17:902:fb4b:b0:2d6:eae9:3470]) (user=ackerleytng job=prod-delivery.src-stubby-dispatcher) by 2002:a17:902:d548:b0:2d0:cc92:f7ae with SMTP id d9443c01a7336-2d707953a04mr97889795ad.3.1787735940315; Wed, 26 Aug 2026 02:19:00 -0700 (PDT) Date: Wed, 26 Aug 2026 09:18:29 +0000 In-Reply-To: <20260826-gmem-inplace-conversion-v11-0-0a15d8a799aa@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20260826-gmem-inplace-conversion-v11-0-0a15d8a799aa@google.com> X-Developer-Key: i=ackerleytng@google.com; a=ed25519; pk=sAZDYXdm6Iz8FHitpHeFlCMXwabodTm7p8/3/8xUxuU= X-Developer-Signature: v=1; a=ed25519-sha256; t=1787735885; l=1820; i=ackerleytng@google.com; s=20260225; h=from:subject:message-id; bh=m1EnsponEK3ffE+S4viVcHUMFCcCRT7Oe+a5rZdir9o=; b=qZJHVh35jrourMTzyQzc+m35d5hPzDRKD19154Bae8Nxq+4fEcdWMhoaHFA76qJd8wJSveiTc yd1CymUqKYyDI830woVD48JV9E21apI2rkTcg9PPgAYBmpucJvjTMcK X-Mailer: b4 0.16.0 Message-ID: <20260826-gmem-inplace-conversion-v11-31-0a15d8a799aa@google.com> Subject: [PATCH v11 31/46] 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, jmattson@google.com, jthoughton@google.com, michael.roth@amd.com, oupton@kernel.org, pankaj.gupta@amd.com, qperret@google.com, rick.p.edgecombe@intel.com, rientjes@google.com, shivankg@amd.com, steven.price@arm.com, willy@infradead.org, wyihan@google.com, yan.y.zhao@intel.com, forkloop@google.com, pratyush@kernel.org, suzuki.poulose@arm.com, aneesh.kumar@kernel.org, liam@infradead.org, Paolo Bonzini , Sean Christopherson , Thomas Gleixner , Ingo Molnar , Borislav Petkov , Dave Hansen , x86@kernel.org, "H. Peter Anvin" , Steven Rostedt , Masami Hiramatsu , Mathieu Desnoyers , Jonathan Corbet , Shuah Khan , Shuah Khan , Vishal Annapurve , Andrew Morton , Chris Li , Kairui Song , Kemeng Shi , Nhat Pham , Barry Song , Axel Rasmussen , Yuanchu Xie , Wei Xu , Youngjun Park , Qi Zheng , Shakeel Butt , Kiryl Shutsemau , Baoquan He , Jason Gunthorpe , John Hubbard , Peter Xu , tarunsahu@google.com, Fuad Tabba , Vlastimil Babka Cc: kvm@vger.kernel.org, linux-kernel@vger.kernel.org, linux-trace-kernel@vger.kernel.org, linux-doc@vger.kernel.org, linux-kselftest@vger.kernel.org, linux-mm@kvack.org, linux-coco@lists.linux.dev, 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. Co-developed-by: Sean Christopherson Signed-off-by: Sean Christopherson Reviewed-by: Fuad Tabba Tested-by: Shivank Garg Signed-off-by: Ackerley Tng --- .../selftests/kvm/x86/guest_memfd_conversions_test.c | 13 +++++++++= ++++ 1 file changed, 13 insertions(+) diff --git a/tools/testing/selftests/kvm/x86/guest_memfd_conversions_test.c= b/tools/testing/selftests/kvm/x86/guest_memfd_conversions_test.c index 77f95d49349ce..4c20d3d8e9349 100644 --- a/tools/testing/selftests/kvm/x86/guest_memfd_conversions_test.c +++ b/tools/testing/selftests/kvm/x86/guest_memfd_conversions_test.c @@ -97,6 +97,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; @@ -188,6 +194,13 @@ 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'); +} + int main(int argc, char *argv[]) { TEST_REQUIRE(kvm_check_cap(KVM_CAP_VM_TYPES) & BIT(KVM_X86_SW_PROTECTED_V= M)); --=20 2.55.0.887.g758fc8c411-goog From nobody Mon Sep 28 04:51:20 2026 Received: from mail-pl1-f199.google.com (mail-pl1-f199.google.com [209.85.214.199]) (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 481F63D9549 for ; Wed, 26 Aug 2026 09:19:05 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.199 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1787735950; cv=none; b=b17nUGImQUCqvn6U4pYhXJ404N79wfFL5NjyQgxi/RMnjDOD3RTiLzcf3zNcDfepb/DG5uOKbZ866oFlq0SwemabMD507KX2b4OiF2zDvgC9fN5LQOcy8EY2Vatk2OeT/nba2D2RCbxGs2L52s8ccpBmEEkBFWCS6zd1ucU1s6M= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1787735950; c=relaxed/simple; bh=7w+gDb7QtZnkDWq+h4HUO3ST/UY633rHaNS6m39pYVY=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=C7i1IlyM6ZCuCTv16HR1q1xP3sJg5reXXPpcu3V/0f3Q7P6orLbg0/2CXrIuCU6/BxTUuMLoqArooIfURHuGKA30+vsZj/ghsaFCBWy+Xp9z1z3xqjs1UUvSApkhKaNkQpqNMSqlOBxgFzag12lnUrF4NB+FDlizwlZnho39I+U= 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=HI67MDFJ; arc=none smtp.client-ip=209.85.214.199 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="HI67MDFJ" Received: by mail-pl1-f199.google.com with SMTP id d9443c01a7336-2cc7e86e7c5so13420265ad.3 for ; Wed, 26 Aug 2026 02:19:05 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20251104; t=1787735942; x=1788340742; darn=vger.kernel.org; h=content-type:cc:to:from:subject:message-id:references:mime-version :in-reply-to:date:from:to:cc:subject:date:message-id:reply-to :content-type; bh=89L7E0e7HlFcsWgm0DMydejmixwj8/yVJ5vfC8XlboE=; b=HI67MDFJqzLL4F6hahAQXqHB3Sfp3AyN1KlgnDqwQKk1FzC1C4d9J3t/iXw43SpzRy 0OX0hSJVh7OXV6mxwGHLMSzH5LZT/wUxnkn7wbBK6X28/wGkdWBBWfstIQW/kT4dM+4E M+1TDg4YSM/3LNhOx/XnnQx2snZTGpX9kQk4ZuqiRDMLO3uAjBDWeGdIvv3jRfayStom gImHyr9WHc6V78nlQHT2lehv62po81BQ9TJFUii4LDzoicgp6zwT59Eut2/N9lTCkLZv PQbCmjJYPb9b955votmeEYOMZ0TYdQjx3BCi15jM3tI0uZHn9tBkLuFCdN7f9Jf2Hpya p85g== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1787735942; x=1788340742; h=content-type: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:content-type; bh=89L7E0e7HlFcsWgm0DMydejmixwj8/yVJ5vfC8XlboE=; b=QUeK2s0xjLV3cgIuOiFIMGWKxbmDnsvCCJ64+7Ol+fZDo2duij1pwoNSEqImlezcba rv4VIq6Nf446+4yfwvhc2XkDt/Cuu7+39hZ1r/KxZmjYIvTWTQXoyBmUdK4R3ThIzLF2 mtCH2E41tMoi/XgZiwsQUV2OzpYo+0+5aWPYtSb4zZT2HfD/QwEWKAix6GOvFivGZpe7 +GEf5JgKhiI5ZWyw9lRROSnqu1xiis9uLPHQx2rEL6Qx608/3E6IYFpHCsFPonghSPy6 JKndIr66aevFS+3EONnIE2MG6GBfjjs0k8t3yyJDhI8CmX++RL+sdvq+2nm4lrfASoCz c0IA== X-Forwarded-Encrypted: i=1; AHgh+RpUW/HsBJ41jxca81mHAtKYcJXoNaQ6Y7uet5N4P1XEo3zCIsLcrkk/3v40HXbw/lrPtL1aOAAfOZpznsA=@vger.kernel.org X-Gm-Message-State: AFuF++nevkSSQD/IaoHyW0Ey5er7NH7jIN1q83LJchVa2qUJDdlIQbFM mMwRWLx4G72JU2jo0UD64E4VKAU2hkVJ7QDKv6GsXgOPOOoB/EvUN7Jc48vg+y/Mcctmk5dzzkb r8K43tZImbPi3jOEEkXX/EnIqTg== X-Received: from plwg14.prod.google.com ([2002:a17:902:f74e:b0:2d5:9dd2:5fc6]) (user=ackerleytng job=prod-delivery.src-stubby-dispatcher) by 2002:a17:903:2283:b0:2d6:fed1:7127 with SMTP id d9443c01a7336-2d70779678cmr89516245ad.0.1787735942070; Wed, 26 Aug 2026 02:19:02 -0700 (PDT) Date: Wed, 26 Aug 2026 09:18:30 +0000 In-Reply-To: <20260826-gmem-inplace-conversion-v11-0-0a15d8a799aa@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20260826-gmem-inplace-conversion-v11-0-0a15d8a799aa@google.com> X-Developer-Key: i=ackerleytng@google.com; a=ed25519; pk=sAZDYXdm6Iz8FHitpHeFlCMXwabodTm7p8/3/8xUxuU= X-Developer-Signature: v=1; a=ed25519-sha256; t=1787735885; l=4642; i=ackerleytng@google.com; s=20260225; h=from:subject:message-id; bh=7w+gDb7QtZnkDWq+h4HUO3ST/UY633rHaNS6m39pYVY=; b=r4t4S/JNI5hvSCE0TK199jmMLi6mPSfRkQixeoALxuEBJ2SPvehHkS7r4ESdRDawsAmTdhPMz yre4PD9BkhTCsEfVE6Y3A1ngu0fOF/kQZRDMogw2uXeBID6J4beusMe X-Mailer: b4 0.16.0 Message-ID: <20260826-gmem-inplace-conversion-v11-32-0a15d8a799aa@google.com> Subject: [PATCH v11 32/46] KVM: selftests: Test conversion precision in guest_memfd From: Ackerley Tng To: aik@amd.com, andrew.jones@linux.dev, binbin.wu@linux.intel.com, brauner@kernel.org, chao.p.peng@linux.intel.com, david@kernel.org, jmattson@google.com, jthoughton@google.com, michael.roth@amd.com, oupton@kernel.org, pankaj.gupta@amd.com, qperret@google.com, rick.p.edgecombe@intel.com, rientjes@google.com, shivankg@amd.com, steven.price@arm.com, willy@infradead.org, wyihan@google.com, yan.y.zhao@intel.com, forkloop@google.com, pratyush@kernel.org, suzuki.poulose@arm.com, aneesh.kumar@kernel.org, liam@infradead.org, Paolo Bonzini , Sean Christopherson , Thomas Gleixner , Ingo Molnar , Borislav Petkov , Dave Hansen , x86@kernel.org, "H. Peter Anvin" , Steven Rostedt , Masami Hiramatsu , Mathieu Desnoyers , Jonathan Corbet , Shuah Khan , Shuah Khan , Vishal Annapurve , Andrew Morton , Chris Li , Kairui Song , Kemeng Shi , Nhat Pham , Barry Song , Axel Rasmussen , Yuanchu Xie , Wei Xu , Youngjun Park , Qi Zheng , Shakeel Butt , Kiryl Shutsemau , Baoquan He , Jason Gunthorpe , John Hubbard , Peter Xu , tarunsahu@google.com, Fuad Tabba , Vlastimil Babka Cc: kvm@vger.kernel.org, linux-kernel@vger.kernel.org, linux-trace-kernel@vger.kernel.org, linux-doc@vger.kernel.org, linux-kselftest@vger.kernel.org, linux-mm@kvack.org, linux-coco@lists.linux.dev, Ackerley Tng Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable The existing guest_memfd conversion tests only use single-page memory regions. This provides no coverage for multi-page guest_memfd objects, specifically whether KVM correctly handles the page index for conversion operations. An incorrect implementation could, for example, always operate on the first page regardless of the index provided. Add a new test case to verify that conversions between private and shared memory correctly target the specified page within a multi-page guest_memfd. This test also verifies the precision of memory conversions by converting a single page and then iterating through all other pages to ensure they remain in their original state. To support this test, add a new GMEM_CONVERSION_MULTIPAGE_TEST_INIT_SHARED macro that handles setting up and tearing down the VM for each page iteration. The teardown logic is adjusted to prevent a double-free in this new scenario. Co-developed-by: Sean Christopherson Signed-off-by: Sean Christopherson Reviewed-by: Fuad Tabba Tested-by: Shivank Garg Signed-off-by: Ackerley Tng --- v10: Update macro GMEM_CONVERSION_MULTIPAGE_TEST_INIT_SHARED to avoid potential macro argument reuse --- .../kvm/x86/guest_memfd_conversions_test.c | 67 ++++++++++++++++++= ++++ 1 file changed, 67 insertions(+) diff --git a/tools/testing/selftests/kvm/x86/guest_memfd_conversions_test.c= b/tools/testing/selftests/kvm/x86/guest_memfd_conversions_test.c index 4c20d3d8e9349..a8d89df53e46d 100644 --- a/tools/testing/selftests/kvm/x86/guest_memfd_conversions_test.c +++ b/tools/testing/selftests/kvm/x86/guest_memfd_conversions_test.c @@ -61,8 +61,13 @@ static void gmem_conversions_do_setup(test_data_t *t, in= t nr_pages, =20 static void gmem_conversions_do_teardown(test_data_t *t) { + /* Use NULL to avoid second free in FIXTURE_TEARDOWN (multipage tests). */ + if (!t->vcpu) + return; + /* No need to close gmem_fd, it's owned by the VM structure. */ kvm_vm_free(t->vcpu->vm); + t->vcpu =3D NULL; } =20 FIXTURE_TEARDOWN(gmem_conversions) @@ -103,6 +108,30 @@ 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 u64 flags =3D GUEST_MEMFD_FLAG_MMAP | GUEST_MEMFD_FLAG_INIT_SHARED;= \ + const int nr =3D (__nr_pages); \ + int i; \ + \ + for (i =3D 0; i < nr; ++i) { \ + gmem_conversions_do_setup(self, nr, flags); \ + __gmem_conversions_multipage_##test(self, nr, 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; @@ -201,6 +230,44 @@ GMEM_CONVERSION_TEST_INIT_SHARED(init_shared) test_convert_to_shared(t, 0, 'C', 'D', 'E'); } =20 +GMEM_CONVERSION_MULTIPAGE_TEST_INIT_SHARED(indexing, 4) +{ + int i; + + /* Get a char that varies with both i and n. */ +#define combine(x, n) (((x) << 4) + (n)) +#define i_(n) (combine(i, n)) +#define t_(n) (combine(test_page, n)) + + /* + * 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_(0), i_(2)); + + test_convert_to_private(t, test_page, t_(2), t_(3)); + + for (i =3D 0; i < nr_pages; ++i) { + if (i =3D=3D test_page) + test_private(t, test_page, t_(3), t_(4)); + else + test_shared(t, i, i_(2), i_(3), i_(4)); + } + + test_convert_to_shared(t, test_page, t_(4), t_(5), t_(6)); + + for (i =3D 0; i < nr_pages; ++i) { + char expected =3D i =3D=3D test_page ? t_(6) : i_(4); + + test_shared(t, i, expected, i_(7), i_(8)); + } + +#undef t_ +#undef i_ +#undef combine +} + int main(int argc, char *argv[]) { TEST_REQUIRE(kvm_check_cap(KVM_CAP_VM_TYPES) & BIT(KVM_X86_SW_PROTECTED_V= M)); --=20 2.55.0.887.g758fc8c411-goog From nobody Mon Sep 28 04:51:20 2026 Received: from mail-pl1-f198.google.com (mail-pl1-f198.google.com [209.85.214.198]) (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 36AFC3C1091 for ; Wed, 26 Aug 2026 09:19:07 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.198 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1787735952; cv=none; b=kdZyXSL6URZT1MaW7FbJtqla5aBsOfzO3WQDXx80rs+/hFtMJTFLW+fR2vadgSJz0uF5yVsPvbdhBvtxXvjxxxoL9JzFyvCcuDGGCPSdoMOFbYGzUG0Vge+5azA1YhJixSo3HNSTUNjgh3TJg4PuqNk8+rNqS2IEmu65XwcibB8= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1787735952; c=relaxed/simple; bh=Z2UFei2SRBY3/wzto9IlHBrYtnnFhcb6Xe3JALubj7U=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=VQ02BA0KipdBrkd5uAKLE1jd20tkxGttpZUVvacjHBWH7iK572t75nfOjy14ypTqONuf2hai5JiSTVKaB/3L4cLwQ7xsIdEHwTjszzsh1zCm5Vvlrx7UzBfsimqzyt6RIiMWtJnSUdA7T+DfM6/zSo7BKmUQl1ImZRVPZx60rlw= 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=pKSvIGw4; arc=none smtp.client-ip=209.85.214.198 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="pKSvIGw4" Received: by mail-pl1-f198.google.com with SMTP id d9443c01a7336-2d6fb956002so11301895ad.1 for ; Wed, 26 Aug 2026 02:19:07 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20251104; t=1787735944; x=1788340744; darn=vger.kernel.org; h=content-type:cc:to:from:subject:message-id:references:mime-version :in-reply-to:date:from:to:cc:subject:date:message-id:reply-to :content-type; bh=U+QIStebluGuNMlcnL56N5FeU5gomqFB4kLU+1RXvFs=; b=pKSvIGw4gHzl277z2O9++u8ArJO7/iN+6GosdgORq6KqRqN3i8IQiNP+ayOReQ7A2b U2PBUNQO6GMcv0ZnyL7+wTEhOCmrjufb3sSvf/aM7+8hvNI0NzKaP8gaxqz3nlMOSenY yt6EYNUw1XCVP+RPGeYxakgo3h2OX/MJusHgSXY0GMLANeWsEd9Kmt//D2Bg8LyeNSjQ qlWsAJ2xTAFr9m2DtJccGyaDwauOI2CNEzN0UbI6jbGqG/GuR+fEIYks0k2xY1Y90zgo c7qads9jyIem1l+LaBns1sturFDi1YGCdH/okxckmVhd19e0vwEM7xs0a2J6SlhUvIvk R3QQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1787735944; x=1788340744; h=content-type: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:content-type; bh=U+QIStebluGuNMlcnL56N5FeU5gomqFB4kLU+1RXvFs=; b=GNvAauQspHnlq8+cWcv45jhYi9sEPGevNlU6G+5LJUZiGtO82GSgRFWgY3gLuXKEyj FwRQvi2I3QVXzlSSfuuNZ+6rB291bp9082q4ih5BSpsk7yp8FtEgmE7USmi73KShutnB GtsrYLmkTVcOAP8J+mbA/uTXbBU4hCELj8hSs5vbCE36+ZutYzqdNGam146p4rMtBOMx WashC1GUvv3CUKTvv76+k2oxdSKnLsgt7A/UbQ/juT7gLeJ9SyWV6xQSxTRjhvS5OLk/ BKQ8NKEQNHq0qVkaIpjRtaSodrrCH4IAbJ5vbL/ofpuT+7PfYp6HPzs92SGxWZ1x9icR SqJQ== X-Forwarded-Encrypted: i=1; AHgh+RqgQVlAxVt7t4hPF+8jmJnHP7pky2VITdL4pQTkl9H4B3gtXrN4/oc4/8U/fgbmYqdcBJRAYf40uxF7vtg=@vger.kernel.org X-Gm-Message-State: AFuF++n81sUWE47zuGIYu4znkDCmKSYUS/9VDhPpataJQgn8KbcMB/jr UMlh2261Y6QR7EAuHBUPPnFyExA7UfrzumuCIslU/OcHxu/eohFMxWLOFbvtimjFzxaHsUXuXCI Z8AyX37Rg0mV0M7MptIR75JTvmQ== X-Received: from plblb3.prod.google.com ([2002:a17:902:fa43:b0:2cf:75c1:ab87]) (user=ackerleytng job=prod-delivery.src-stubby-dispatcher) by 2002:a17:903:2283:b0:2d6:7409:7145 with SMTP id d9443c01a7336-2d707a2edd0mr90992585ad.1.1787735943792; Wed, 26 Aug 2026 02:19:03 -0700 (PDT) Date: Wed, 26 Aug 2026 09:18:31 +0000 In-Reply-To: <20260826-gmem-inplace-conversion-v11-0-0a15d8a799aa@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20260826-gmem-inplace-conversion-v11-0-0a15d8a799aa@google.com> X-Developer-Key: i=ackerleytng@google.com; a=ed25519; pk=sAZDYXdm6Iz8FHitpHeFlCMXwabodTm7p8/3/8xUxuU= X-Developer-Signature: v=1; a=ed25519-sha256; t=1787735885; l=1811; i=ackerleytng@google.com; s=20260225; h=from:subject:message-id; bh=Z2UFei2SRBY3/wzto9IlHBrYtnnFhcb6Xe3JALubj7U=; b=iF9oclctKMAmtq8/BXAmeziLVob0gwQiMxab9AP4cOna1dViC2KVb0DXsHietLlhMm4MmiLFx NG5IyiRqrCFAgls8o8R4aRa0shTBIbhH28LRiR+I6Ogpy3OSwNF8ZVo X-Mailer: b4 0.16.0 Message-ID: <20260826-gmem-inplace-conversion-v11-33-0a15d8a799aa@google.com> Subject: [PATCH v11 33/46] 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, jmattson@google.com, jthoughton@google.com, michael.roth@amd.com, oupton@kernel.org, pankaj.gupta@amd.com, qperret@google.com, rick.p.edgecombe@intel.com, rientjes@google.com, shivankg@amd.com, steven.price@arm.com, willy@infradead.org, wyihan@google.com, yan.y.zhao@intel.com, forkloop@google.com, pratyush@kernel.org, suzuki.poulose@arm.com, aneesh.kumar@kernel.org, liam@infradead.org, Paolo Bonzini , Sean Christopherson , Thomas Gleixner , Ingo Molnar , Borislav Petkov , Dave Hansen , x86@kernel.org, "H. Peter Anvin" , Steven Rostedt , Masami Hiramatsu , Mathieu Desnoyers , Jonathan Corbet , Shuah Khan , Shuah Khan , Vishal Annapurve , Andrew Morton , Chris Li , Kairui Song , Kemeng Shi , Nhat Pham , Barry Song , Axel Rasmussen , Yuanchu Xie , Wei Xu , Youngjun Park , Qi Zheng , Shakeel Butt , Kiryl Shutsemau , Baoquan He , Jason Gunthorpe , John Hubbard , Peter Xu , tarunsahu@google.com, Fuad Tabba , Vlastimil Babka Cc: kvm@vger.kernel.org, linux-kernel@vger.kernel.org, linux-trace-kernel@vger.kernel.org, linux-doc@vger.kernel.org, linux-kselftest@vger.kernel.org, linux-mm@kvack.org, linux-coco@lists.linux.dev, Ackerley Tng Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Add two test cases to the guest_memfd conversions selftest to cover the scenario where a conversion is requested before any memory has been allocated in the guest_memfd region. The KVM_SET_MEMORY_ATTRIBUTES2 ioctl can be called on a memory region at any time. If the guest had not yet faulted in any pages for that region, the kernel must record the conversion request and apply the requested state when the pages are eventually allocated. The new tests cover both conversion directions. Co-developed-by: Sean Christopherson Signed-off-by: Sean Christopherson Reviewed-by: Fuad Tabba Tested-by: Shivank Garg Signed-off-by: Ackerley Tng --- .../selftests/kvm/x86/guest_memfd_conversions_test.c | 14 ++++++++++= ++++ 1 file changed, 14 insertions(+) diff --git a/tools/testing/selftests/kvm/x86/guest_memfd_conversions_test.c= b/tools/testing/selftests/kvm/x86/guest_memfd_conversions_test.c index a8d89df53e46d..f46f1530a94b9 100644 --- a/tools/testing/selftests/kvm/x86/guest_memfd_conversions_test.c +++ b/tools/testing/selftests/kvm/x86/guest_memfd_conversions_test.c @@ -268,6 +268,20 @@ GMEM_CONVERSION_MULTIPAGE_TEST_INIT_SHARED(indexing, 4) #undef combine } =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.55.0.887.g758fc8c411-goog From nobody Mon Sep 28 04:51:20 2026 Received: from mail-pl1-f198.google.com (mail-pl1-f198.google.com [209.85.214.198]) (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 687533EB7F4 for ; Wed, 26 Aug 2026 09:19:08 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.198 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1787735953; cv=none; b=B5MxsxYQ407d0hKL0vzck3EBZ9SEBMoJKfS9uYW1gwfJBPVY6ZuiYkRG5swUxPzXUziUMump7eMVAtiNXWPM/YAgUS5ZFpYO8Ock9Mnf62H26ug89CyPRGBEwcZASluYAV0TIWKSa24bwVjws47QHD9CbPfV5ZrvwBPAO+1I8rQ= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1787735953; c=relaxed/simple; bh=7hWrOiBCNLWR4WmaZsIQ/WiJTqMaoqs3GPpOPxdsIrA=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=o0HlBIOeZb5If9RVoWuptq8Qtw40melQTw8l0dMY1JDQUQSbsSJLSjuoSxiv4im0b6Emh2rwSQkyw+f1puIqWimL7x4CuGFJzJKOssuyzR/RMA1yMFR8iRPECl1Aph3TwLGHbLItwmHoINx5xVMp7PF3eq14tkj9xL+V62YbSC0= 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=fI+o62L+; arc=none smtp.client-ip=209.85.214.198 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="fI+o62L+" Received: by mail-pl1-f198.google.com with SMTP id d9443c01a7336-2cc6dd43737so9657925ad.2 for ; Wed, 26 Aug 2026 02:19:07 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20251104; t=1787735946; x=1788340746; darn=vger.kernel.org; h=content-type:cc:to:from:subject:message-id:references:mime-version :in-reply-to:date:from:to:cc:subject:date:message-id:reply-to :content-type; bh=QanNPXruSQXVrF67aaQcoGfZbE9UbCtKaKkFHYTWC+U=; b=fI+o62L+xHzAyC5TxcOaA6RF4funXw5jug7vx0XmXD/igz8J++j+YQunJuREuXVsH/ n7JkKNNvab8IcvBPMIzwuJI1/t6HAvs0Rkhk5Bo+MxGXLyfl7TYlUQj62z/IPw/sXkhL HQhkHGO3vjUsSubdo+/32WNj6kLSP+xgO4DB89TF/NamBqZp9khGzXbEV6dH+g0JgwwE RRWxzkaI5La5INCay9YVQWnLz0x/C18niClVMJ3p8pvb9F7Nu/RIMhqAez7tnex6onIQ 2mKZqTMRnTR+7eXrkK+pudM9iWcrokbx073GohBo5/pPqqfbvMczrv1zdFBOF3huuPpX f4mA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1787735946; x=1788340746; h=content-type: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:content-type; bh=QanNPXruSQXVrF67aaQcoGfZbE9UbCtKaKkFHYTWC+U=; b=VFzvdm0zX1alff0GwFZite7e7uJuoXHk9n7ah57zl9iTe3cKQP6ByFR/Za0MRw15qe FvXwBuk4EqqAkNxuodeAM4sdT1WbBjnyg1g/YCDt3rQvcPbCStwIbIASNsCEMuTBNm74 Lse3nWlnDVFGjHTJkwqohe+GmJ7NANSfacEmhKI6oadOPOyiyKhK+c/pkXto84n/oWUh AUF2CgfAs+vd2tGgAlFkqT6l/18mXxRvHa1D6U6ZxgOBo8EkxsIXcz0pF4iP7BHhz+WR Sr2I9DWA3u6W1z0M1BSHKIF0ZWRH8+JE/8r/mfHGsgMHVRSx/TcrRFodeyRh6p+CnwzW MA9Q== X-Forwarded-Encrypted: i=1; AHgh+RrqyUNJbKOn9PJP63TLTrUJTDyd3kewm6XtT2Ygh4cn62jC8yj9xENGKqlsPsoLaiN2JF7bpgWUzIma8e0=@vger.kernel.org X-Gm-Message-State: AFuF++mmf4X7t49DHjZ9CadxMT2E9t57/UbiaoGCnMDLXCvkA3l3o1vy NBJzakKjctwepNQpNsDPGm9SdaKqqwl3Awd+fGCtBA7SLjgSvXL9vZthzycgz4V1i/1yRAvm50j 7WQD37dHxRoC7w0G3VEQOPa9vJw== X-Received: from plyw15.prod.google.com ([2002:a17:902:d70f:b0:2cc:6206:58ad]) (user=ackerleytng job=prod-delivery.src-stubby-dispatcher) by 2002:a17:902:f541:b0:2d3:716e:e2ae with SMTP id d9443c01a7336-2d707ab1407mr81866255ad.6.1787735945585; Wed, 26 Aug 2026 02:19:05 -0700 (PDT) Date: Wed, 26 Aug 2026 09:18:32 +0000 In-Reply-To: <20260826-gmem-inplace-conversion-v11-0-0a15d8a799aa@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20260826-gmem-inplace-conversion-v11-0-0a15d8a799aa@google.com> X-Developer-Key: i=ackerleytng@google.com; a=ed25519; pk=sAZDYXdm6Iz8FHitpHeFlCMXwabodTm7p8/3/8xUxuU= X-Developer-Signature: v=1; a=ed25519-sha256; t=1787735885; l=2317; i=ackerleytng@google.com; s=20260225; h=from:subject:message-id; bh=7hWrOiBCNLWR4WmaZsIQ/WiJTqMaoqs3GPpOPxdsIrA=; b=H4rkK1YLN75/OUClRsyrNGZ+v8Y0cZ9iPfybDQNGwCS1Lp8udQXVRcUWRxH/i7jKh5B1xjwbI /6yH7SDOMn/C3e0QrzREPxPxypHEsDepGeNaD2wcV8oKFQzOKNmrTyz X-Mailer: b4 0.16.0 Message-ID: <20260826-gmem-inplace-conversion-v11-34-0a15d8a799aa@google.com> Subject: [PATCH v11 34/46] 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, jmattson@google.com, jthoughton@google.com, michael.roth@amd.com, oupton@kernel.org, pankaj.gupta@amd.com, qperret@google.com, rick.p.edgecombe@intel.com, rientjes@google.com, shivankg@amd.com, steven.price@arm.com, willy@infradead.org, wyihan@google.com, yan.y.zhao@intel.com, forkloop@google.com, pratyush@kernel.org, suzuki.poulose@arm.com, aneesh.kumar@kernel.org, liam@infradead.org, Paolo Bonzini , Sean Christopherson , Thomas Gleixner , Ingo Molnar , Borislav Petkov , Dave Hansen , x86@kernel.org, "H. Peter Anvin" , Steven Rostedt , Masami Hiramatsu , Mathieu Desnoyers , Jonathan Corbet , Shuah Khan , Shuah Khan , Vishal Annapurve , Andrew Morton , Chris Li , Kairui Song , Kemeng Shi , Nhat Pham , Barry Song , Axel Rasmussen , Yuanchu Xie , Wei Xu , Youngjun Park , Qi Zheng , Shakeel Butt , Kiryl Shutsemau , Baoquan He , Jason Gunthorpe , John Hubbard , Peter Xu , tarunsahu@google.com, Fuad Tabba , Vlastimil Babka Cc: kvm@vger.kernel.org, linux-kernel@vger.kernel.org, linux-trace-kernel@vger.kernel.org, linux-doc@vger.kernel.org, linux-kselftest@vger.kernel.org, linux-mm@kvack.org, linux-coco@lists.linux.dev, 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. Co-developed-by: Sean Christopherson Signed-off-by: Sean Christopherson Reviewed-by: Fuad Tabba Tested-by: Shivank Garg Signed-off-by: Ackerley Tng --- .../kvm/x86/guest_memfd_conversions_test.c | 30 ++++++++++++++++++= ++++ 1 file changed, 30 insertions(+) diff --git a/tools/testing/selftests/kvm/x86/guest_memfd_conversions_test.c= b/tools/testing/selftests/kvm/x86/guest_memfd_conversions_test.c index f46f1530a94b9..acdff2d154046 100644 --- a/tools/testing/selftests/kvm/x86/guest_memfd_conversions_test.c +++ b/tools/testing/selftests/kvm/x86/guest_memfd_conversions_test.c @@ -282,6 +282,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.55.0.887.g758fc8c411-goog From nobody Mon Sep 28 04:51:20 2026 Received: from mail-pl1-f197.google.com (mail-pl1-f197.google.com [209.85.214.197]) (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 B27E23C1D4B for ; Wed, 26 Aug 2026 09:19:10 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.197 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1787735954; cv=none; b=gq7KlVYAT/XS8TFxfyUihc53cHUtzOHPmIpgyatgYGdyhsRZXs8XtCBtXGrPIzSx5BlDFt/G8P1MNbgeenL93sv+jXML6f14AfxL9F/tFd+jjiciyObJhCmSxaUCn12gyIOyv93HMW5R1787bWR4et+bpX3961TaE4WoKC6itMU= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1787735954; c=relaxed/simple; bh=hllAZwlWW+ih1BmS23q9euXZautp6FkTBIIgcqLkrqc=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=hOdv25ljBW8/xRAem9vwo2gWLfvA2K/r+v99EPJn3ZQpdY6vE3H7JNFPIPqduV/VYVcGNkubb640wmY/2Kt+5RW7j0X3iCmXMCPq/UcIpW/iD5Jdjkfs3eqDGWcaGGD5xxBVGgmcsm1krGZg+mVPhGbN9A7xTWSdMHyhfSXW3L8= 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=XezDbyoS; arc=none smtp.client-ip=209.85.214.197 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="XezDbyoS" Received: by mail-pl1-f197.google.com with SMTP id d9443c01a7336-2cfc52ddc55so11968945ad.3 for ; Wed, 26 Aug 2026 02:19:09 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20251104; t=1787735948; x=1788340748; darn=vger.kernel.org; h=content-type:cc:to:from:subject:message-id:references:mime-version :in-reply-to:date:from:to:cc:subject:date:message-id:reply-to :content-type; bh=ik/B5ZuTpzm8Db9Vos6QAKILR9bvsScWDRJqqgLCjsk=; b=XezDbyoS8BsoA5ii8KgTGJk3D7FGo+JqxNlvUzfBKq8EfMmTpxu2bEqmUKY0RkB8AE 6RXRvQ/8hdZ14thSEotb+95qPLhLwIdmr9PH67+Vpqx7csvPhghusamiT5qSIRgN522H fORt0xEa/C4aUgp4o//nmpeSowcY4RZd7r+e6mn6l8x4CJ3SYlKMkZxxGwD/7FVqDadd fFusWaZyvRIi7IRhRZsoe1sVVlHcS6dKc+ZVh9eHzeaKpvDjYR5TlM66j/OL0qLDVBnE iomIL0ChNJy3RI8ALSJ8dyboDe7SeouXq8+2uVUsNdQFB+8wWjQua8dFAt/s0+26UIOF NYuQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1787735948; x=1788340748; h=content-type: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:content-type; bh=ik/B5ZuTpzm8Db9Vos6QAKILR9bvsScWDRJqqgLCjsk=; b=ZZMy0Cl067LUVKVsWZtQfssFYK/rnGs5ZWAGSVcCG+fpuUgzgTaolP2Hewdmbjhlz9 ZTt5Eh5D0d1DIqEYrB6fylb3ph889JwwdQXZyXS0tZO0RhVh9nXyYeKUwq04EKKABaJU zmygFfxgCI3vL6u+62DVe6PgYn6yBMfBGzydrsH1MO294N+psUPzsCXMekXDOt+aiDyD xlt9ANSIxNqJu4Ea7xB4qcwwBLnSUBAmt4RabLxvZgnEQQ22vq8vEXOzzLqkfpM6HJD8 aywxkvS/HeTrWjDrWAaF03BnjGw+1VcfXPJogYhl7nNsnOI6UwO4Y2ewSsJ24L4ev2C6 DTrQ== X-Forwarded-Encrypted: i=1; AHgh+RryeLVmOMtO7ZnTPmxngFiKpwPFnpVaRp3ASxGoa+YQ0/Pl9EbWvgYbRvAqYc6+6a0lRNk5LdJFomiGEDg=@vger.kernel.org X-Gm-Message-State: AFuF++ko4CXLR283ex9wieyzotC+Q9+sKz/S2sJ6hPhGDTCuqTJnsCnh Mc0h0uYnYfVrPtLEtEiwXGnfXbjx56Tig6Q6V68o76z3p61NOb8Hm7PDwT1D5xCrGNjug3Yifs4 JWceGcu7dP/0LV5SHtRO1pC0yEA== X-Received: from plbkt4.prod.google.com ([2002:a17:903:884:b0:2d5:e7d8:3c3b]) (user=ackerleytng job=prod-delivery.src-stubby-dispatcher) by 2002:a17:902:d4c3:b0:2b2:67ca:5ff9 with SMTP id d9443c01a7336-2d707803e2bmr78547545ad.0.1787735947278; Wed, 26 Aug 2026 02:19:07 -0700 (PDT) Date: Wed, 26 Aug 2026 09:18:33 +0000 In-Reply-To: <20260826-gmem-inplace-conversion-v11-0-0a15d8a799aa@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20260826-gmem-inplace-conversion-v11-0-0a15d8a799aa@google.com> X-Developer-Key: i=ackerleytng@google.com; a=ed25519; pk=sAZDYXdm6Iz8FHitpHeFlCMXwabodTm7p8/3/8xUxuU= X-Developer-Signature: v=1; a=ed25519-sha256; t=1787735885; l=2066; i=ackerleytng@google.com; s=20260225; h=from:subject:message-id; bh=hllAZwlWW+ih1BmS23q9euXZautp6FkTBIIgcqLkrqc=; b=qsiVu/whfm9O8+e9PDF2qnZWi29DuDjd8KVnXJuUZNQ15/zioWZ2WGZ+Gc5d2n0THQKCtwyLF S93gEjTSxmiDnf4G6GH5/pNYzc3coo+pUgB7Mig8s+PQSoK8gbUsyxb X-Mailer: b4 0.16.0 Message-ID: <20260826-gmem-inplace-conversion-v11-35-0a15d8a799aa@google.com> Subject: [PATCH v11 35/46] 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, jmattson@google.com, jthoughton@google.com, michael.roth@amd.com, oupton@kernel.org, pankaj.gupta@amd.com, qperret@google.com, rick.p.edgecombe@intel.com, rientjes@google.com, shivankg@amd.com, steven.price@arm.com, willy@infradead.org, wyihan@google.com, yan.y.zhao@intel.com, forkloop@google.com, pratyush@kernel.org, suzuki.poulose@arm.com, aneesh.kumar@kernel.org, liam@infradead.org, Paolo Bonzini , Sean Christopherson , Thomas Gleixner , Ingo Molnar , Borislav Petkov , Dave Hansen , x86@kernel.org, "H. Peter Anvin" , Steven Rostedt , Masami Hiramatsu , Mathieu Desnoyers , Jonathan Corbet , Shuah Khan , Shuah Khan , Vishal Annapurve , Andrew Morton , Chris Li , Kairui Song , Kemeng Shi , Nhat Pham , Barry Song , Axel Rasmussen , Yuanchu Xie , Wei Xu , Youngjun Park , Qi Zheng , Shakeel Butt , Kiryl Shutsemau , Baoquan He , Jason Gunthorpe , John Hubbard , Peter Xu , tarunsahu@google.com, Fuad Tabba , Vlastimil Babka Cc: kvm@vger.kernel.org, linux-kernel@vger.kernel.org, linux-trace-kernel@vger.kernel.org, linux-doc@vger.kernel.org, linux-kselftest@vger.kernel.org, linux-mm@kvack.org, linux-coco@lists.linux.dev, 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. Co-developed-by: Sean Christopherson Signed-off-by: Sean Christopherson Reviewed-by: Fuad Tabba Tested-by: Shivank Garg Signed-off-by: Ackerley Tng --- .../selftests/kvm/x86/guest_memfd_conversions_test.c | 14 ++++++++++= ++++ 1 file changed, 14 insertions(+) diff --git a/tools/testing/selftests/kvm/x86/guest_memfd_conversions_test.c= b/tools/testing/selftests/kvm/x86/guest_memfd_conversions_test.c index acdff2d154046..b7a54d2a90928 100644 --- a/tools/testing/selftests/kvm/x86/guest_memfd_conversions_test.c +++ b/tools/testing/selftests/kvm/x86/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" @@ -312,6 +313,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.55.0.887.g758fc8c411-goog From nobody Mon Sep 28 04:51:20 2026 Received: from mail-pf1-f199.google.com (mail-pf1-f199.google.com [209.85.210.199]) (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 838723F9A13 for ; Wed, 26 Aug 2026 09:19:12 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.210.199 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1787735959; cv=none; b=IBipLs1EKYKypwFyuU9I47TbffXW8jjTzWm/NxvuAIcGrGgQfZHrDjwut5dd62G+JhUkoFWCWdHFnXg5MgYl52FhGAweV71nmW70ZvdqNvTxnV8XP8V/Pugs4D71hQJmuqI63eS+BsvEFFDtW7Rxwha0QJiWX1bTf9j0CNG3/yc= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1787735959; c=relaxed/simple; bh=bCBoNCNRCJeuLkIkQJRWsNkJ8uDQ/K6p9Vf7UpvmeSI=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=TRpSErk3wUO15EshtjLhKpflqJ69yKavdiTYtKELR22W9lki0y2Tg3psRiuiT1nq9rOXngVpTx8UIGb4ACIsh/mVzjRwUE/dA12DoIt7tSXIYGVvQM3Y2WAh0FkneQf8D1HEjwneCpA/8ednm2ygtWGZhYMzgBp4G9vrg5su3tY= 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=klBcK/NE; arc=none smtp.client-ip=209.85.210.199 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="klBcK/NE" Received: by mail-pf1-f199.google.com with SMTP id d2e1a72fcca58-8485d853b08so933740b3a.1 for ; Wed, 26 Aug 2026 02:19:11 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20251104; t=1787735950; x=1788340750; darn=vger.kernel.org; h=content-type:cc:to:from:subject:message-id:references:mime-version :in-reply-to:date:from:to:cc:subject:date:message-id:reply-to :content-type; bh=Ip4vM408PsiT+R6udna4cozvVeqGNG7oQO0VV4Lz3WE=; b=klBcK/NESLyEwUXHLj7KejEXevqeuJEEXgwKz5dqYBfYNKjcFMB257mx7WJ+vbE3XQ giW+DcyHUp1vaW7GCL4pu3sJsEoUIL+FVEgjg96awOsMayD2zIzRCidKidw5/I9S9Fsq yXltBBsImQRRVIG2WqKlnYEBzyTfMJZOJx5ZwVtyR3D9xPzWmX3nnqtsQL2mXkw2NTgy qzNOvmCfFpNlbQwHstfkqBFOfRkoG0NML0RBd7p7FtQ+oUY9x+UoF1ygjdg9Anup4UAE RowwSphBcXaiptd3gZJm6+5vcep5TQhadCx19hhNY4VO4iR2Wi+EuDJErYCUp/IqMFr9 DMPg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1787735950; x=1788340750; h=content-type: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:content-type; bh=Ip4vM408PsiT+R6udna4cozvVeqGNG7oQO0VV4Lz3WE=; b=e4yZOAsMwHasN0L87Rbt4NDJ9Ug6hbCeu1fUbbXKbDEaBFhdbbfKNQZQtC4Rz9jrT0 RDFb9aQzCYGkqbousabLLTeRiHRHRjQviLrDKb6DahKO1slhjjYv9oS57lHwEvr8QWS/ yg3ufu9iMjamDg3bTYOLquJW3OBUu3QVnwa7fcCB8sOXjEoKJ4SK6HCOftSsWnprIn9J mfMwgsaRYnIA+0herIIRI8Ou9zvlPgWF56VM0AslY2hBkWCa1OAqfgCfGmlxwfUxGDgP H2Aet0N3lnrQ8Uf3Nq2WX2258/vrj0tnp9PtyHFN781dO1LVe+xUd3C/4tCS4P+mkIGa ofXA== X-Forwarded-Encrypted: i=1; AHgh+RonVzieuYR4/X43JfwfWLAFR8c9mxWjCo2+863cf9+bcXo9Abj5Ae+ol4IU3aAwPJ655dHfJKgKl+wVfR8=@vger.kernel.org X-Gm-Message-State: AFuF++nmry3Z+wH3OfFJWN/VU8jABh8VtyTDIZ0BNDxy1QAphQEeIUR+ k85z+6AX28l5Jhr2Ug0KDjU8NTDkomMlwBlnwt5Ih/csC/fpjn6JHrVoeDZoq8wJnILcGbcoHqq kQCFaTeO/dmXz/IxxJTYJseuYRA== X-Received: from pgvm9.prod.google.com ([2002:a65:62c9:0:b0:c8b:6fd:f93f]) (user=ackerleytng job=prod-delivery.src-stubby-dispatcher) by 2002:a05:6a00:6c83:b0:84f:a82e:d32f with SMTP id d2e1a72fcca58-85371cb0dd6mr10170051b3a.3.1787735949013; Wed, 26 Aug 2026 02:19:09 -0700 (PDT) Date: Wed, 26 Aug 2026 09:18:34 +0000 In-Reply-To: <20260826-gmem-inplace-conversion-v11-0-0a15d8a799aa@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20260826-gmem-inplace-conversion-v11-0-0a15d8a799aa@google.com> X-Developer-Key: i=ackerleytng@google.com; a=ed25519; pk=sAZDYXdm6Iz8FHitpHeFlCMXwabodTm7p8/3/8xUxuU= X-Developer-Signature: v=1; a=ed25519-sha256; t=1787735885; l=5042; i=ackerleytng@google.com; s=20260225; h=from:subject:message-id; bh=mgO9cNUJjKY+AKFX9MzbbDfHmswDZG4pLv666WpGGk8=; b=4sXWR8XsmwnCwhSpArHLWN49pbbGfoT0AtcPlI36HRG/9GlMeMoVWb/i6RtUbq1xqd13MsZps yhnSFfxp2j3CfnwMrDrkdGOUO/3A2kREKcloGz8OlQCALrg5kqnLxLv X-Mailer: b4 0.16.0 Message-ID: <20260826-gmem-inplace-conversion-v11-36-0a15d8a799aa@google.com> Subject: [PATCH v11 36/46] 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, jmattson@google.com, jthoughton@google.com, michael.roth@amd.com, oupton@kernel.org, pankaj.gupta@amd.com, qperret@google.com, rick.p.edgecombe@intel.com, rientjes@google.com, shivankg@amd.com, steven.price@arm.com, willy@infradead.org, wyihan@google.com, yan.y.zhao@intel.com, forkloop@google.com, pratyush@kernel.org, suzuki.poulose@arm.com, aneesh.kumar@kernel.org, liam@infradead.org, Paolo Bonzini , Sean Christopherson , Thomas Gleixner , Ingo Molnar , Borislav Petkov , Dave Hansen , x86@kernel.org, "H. Peter Anvin" , Steven Rostedt , Masami Hiramatsu , Mathieu Desnoyers , Jonathan Corbet , Shuah Khan , Shuah Khan , Vishal Annapurve , Andrew Morton , Chris Li , Kairui Song , Kemeng Shi , Nhat Pham , Barry Song , Axel Rasmussen , Yuanchu Xie , Wei Xu , Youngjun Park , Qi Zheng , Shakeel Butt , Kiryl Shutsemau , Baoquan He , Jason Gunthorpe , John Hubbard , Peter Xu , tarunsahu@google.com, Fuad Tabba , Vlastimil Babka Cc: kvm@vger.kernel.org, linux-kernel@vger.kernel.org, linux-trace-kernel@vger.kernel.org, linux-doc@vger.kernel.org, linux-kselftest@vger.kernel.org, linux-mm@kvack.org, linux-coco@lists.linux.dev, 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 Reviewed-by: Fuad Tabba Tested-by: Shivank Garg Co-developed-by: Ackerley Tng Signed-off-by: Ackerley Tng --- .../kvm/x86/guest_memfd_conversions_test.c | 118 +++++++++++++++++= ++++ 1 file changed, 118 insertions(+) diff --git a/tools/testing/selftests/kvm/x86/guest_memfd_conversions_test.c= b/tools/testing/selftests/kvm/x86/guest_memfd_conversions_test.c index b7a54d2a90928..a972a09c5c6e5 100644 --- a/tools/testing/selftests/kvm/x86/guest_memfd_conversions_test.c +++ b/tools/testing/selftests/kvm/x86/guest_memfd_conversions_test.c @@ -2,7 +2,9 @@ /* * Copyright (c) 2024, Google LLC. */ +#include #include +#include #include =20 #include @@ -326,6 +328,122 @@ 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) +{ + enum test_state { + STATE_INIT, + STATE_CHECK_SHARED, + STATE_DONE_CHECKING_SHARED, + STATE_CHECK_PRIVATE, + STATE_DONE_CHECKING_PRIVATE, + }; + + struct sync_state { + pthread_mutex_t mutex; + pthread_cond_t cond; + enum test_state step; + } *sync; + + pthread_mutexattr_t mattr; + pthread_condattr_t cattr; + pid_t child_pid, parent_pid; + int status; + + sync =3D kvm_mmap(sizeof(*sync), PROT_READ | PROT_WRITE, + MAP_SHARED | MAP_ANONYMOUS, -1); + + pthread_mutexattr_init(&mattr); + pthread_mutexattr_setpshared(&mattr, PTHREAD_PROCESS_SHARED); + pthread_mutex_init(&sync->mutex, &mattr); + pthread_mutexattr_destroy(&mattr); + + pthread_condattr_init(&cattr); + pthread_condattr_setpshared(&cattr, PTHREAD_PROCESS_SHARED); + pthread_cond_init(&sync->cond, &cattr); + pthread_condattr_destroy(&cattr); + + sync->step =3D STATE_INIT; + +#define TEST_STATE_AWAIT(__state) \ + do { \ + pthread_mutex_lock(&sync->mutex); \ + while (sync->step !=3D (__state)) { \ + struct timespec ts, stop; \ + int ret; \ + \ + clock_gettime(CLOCK_REALTIME, &ts); \ + stop =3D timespec_add_ns(ts, 100 * 1000000UL); \ + \ + ret =3D pthread_cond_timedwait(&sync->cond, &sync->mutex, &stop); \ + if (ret =3D=3D ETIMEDOUT) { \ + bool alive =3D (child_pid =3D=3D 0) ? \ + (getppid() =3D=3D parent_pid) : \ + (waitpid(child_pid, NULL, WNOHANG) =3D=3D 0); \ + TEST_ASSERT(alive, "Other process exited prematurely"); \ + } else { \ + TEST_ASSERT(!ret, "pthread_cond_timedwait failed"); \ + } \ + } \ + pthread_mutex_unlock(&sync->mutex); \ + } while (0) + +#define TEST_STATE_SET(__state) \ + do { \ + pthread_mutex_lock(&sync->mutex); \ + sync->step =3D (__state); \ + pthread_cond_broadcast(&sync->cond); \ + pthread_mutex_unlock(&sync->mutex); \ + } while (0) + + parent_pid =3D getpid(); + 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); + + TEST_ASSERT_EQ(waitpid(child_pid, &status, 0), child_pid); + TEST_ASSERT(WIFEXITED(status) && WEXITSTATUS(status) =3D=3D 0, + "Child exited with unexpected status"); + + pthread_mutex_destroy(&sync->mutex); + pthread_cond_destroy(&sync->cond); + kvm_munmap(sync, sizeof(*sync)); + +#undef TEST_STATE_SET +#undef TEST_STATE_AWAIT +} + int main(int argc, char *argv[]) { TEST_REQUIRE(kvm_check_cap(KVM_CAP_VM_TYPES) & BIT(KVM_X86_SW_PROTECTED_V= M)); --=20 2.55.0.887.g758fc8c411-goog From nobody Mon Sep 28 04:51:20 2026 Received: from mail-pl1-f197.google.com (mail-pl1-f197.google.com [209.85.214.197]) (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 8B42E3F9F4D for ; Wed, 26 Aug 2026 09:19:13 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.197 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1787735957; cv=none; b=urcDbeysRv4lQNU2KX2dgs3W9dJTzBkhZwZMhXNm0xGfvtk22j3IvIpBmOJHd8dXkqpNyrOdIdFMOcesgQV/OOLYpWLe25+iGtLSDQNOeYgcHHyXyrebAAlavaJYj+X3ViSYyNRhEmFh4p2D7VhorXw5Tz65o6vYc265XfcgiUY= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1787735957; c=relaxed/simple; bh=oKhUk7AQ/XVnJUDFQGQ0T3PCQ/fs9vSttvSiNTvu8TA=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=rZZT9HzoHAmwO1ozemZyV6kBwtOC+a4gwaizabBKmNXWw8EfgbPWqQDZhQk/+20MpHD9Mi8lRgDEQQzYN6BVF5ZW7/jTz+FStZbA06UW5QcRx05e8/8e0nnjVsYJONd4w8qoevnTUQQn265BavndwEhPSV3RJw3UkWHigb3g5fE= 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=O3ifuuQ2; arc=none smtp.client-ip=209.85.214.197 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="O3ifuuQ2" Received: by mail-pl1-f197.google.com with SMTP id d9443c01a7336-2d04908139bso12136865ad.2 for ; Wed, 26 Aug 2026 02:19:13 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20251104; t=1787735951; x=1788340751; darn=vger.kernel.org; h=content-type:cc:to:from:subject:message-id:references:mime-version :in-reply-to:date:from:to:cc:subject:date:message-id:reply-to :content-type; bh=L7znZB4+fu5SSeJJtVXjdDiNwNEk+mtdzszQFSpw4D4=; b=O3ifuuQ2/RyPIwriTbi7ftfBmep7EjQrGC6UZD94k3IT4W+Dc3yqTf59gvdUQTa3QP RZGziMDwMJr3yvdBJF9MLRmAbl0ZsAIl3qrwzea6sNcYkZfldm4TOVobX359+srnLdE/ aK/2CLJ2lcrKOBQ7Kw1mPnlZVjbh0FTBCIR0IrUxTfrUWsEBO+H49CfRQQGTR/wuK32M lDFE+gnB/3GAzpwJ9cXw3lH2DDN0pN2NZ/3c/NBuwDeLh7J24//gOgKxGUnrZ2xwlh0f JjBJOLPDrlHOkBtsynSvqnyakRuWgrafyBmWr3M/zn3t5VtZIEsQ8c0kn3bv42YRnIA3 Kxww== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1787735951; x=1788340751; h=content-type: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:content-type; bh=L7znZB4+fu5SSeJJtVXjdDiNwNEk+mtdzszQFSpw4D4=; b=QGV38dfSMQAhLWkAP4eOEyalU1EqHICYo2/uFe+9lOUuW+vFdu36UWtT2TcyIZaZ13 OO53ZhCmRrj61BgbePA+F2XsYiEAkOUESMlydegxqOBJueR+Sz8hvNkAIH+Hpa/BqKK5 M7j5KPobZkTYr/qAzVflUyoy088561jzv94+vtqetBq4WxF7SlRFhMg/HUrJP0kYF089 G0ZAWFgSVtin3oak4ADSkgLUE2qum35AbfIfMZKFnb8om/TLvGTZePrbR/zSlbKg41WI 8uqTQX2SUMqFLGgQVj36PSmmAc55lH7EFhMaO9jris8JWAXG1paMGW3DX2bEpRVHhyhG R3Gw== X-Forwarded-Encrypted: i=1; AHgh+Ro8TF8PXlYBKuEji8Zuo1ihp4Bm9R1cN+BPMNqxUty1TEBzuhvKWttddC8A9SpFJ+Q15G0Ja6eC2grDdOM=@vger.kernel.org X-Gm-Message-State: AFuF++lnFEPQIIz8Td7cJLNIwjG+BAxy7qrtOJYTNBT8IZaPF8Nzhu/m EURlZAVN6fksONz5SScf+PyzGAYgd6CbwZsWpUhzRk4iXe4/V7OhkUNmjVImwrIiBZgd+mfn1zJ uHh4AbnejC913kvgLOWCSG7eq1A== X-Received: from plbkb13.prod.google.com ([2002:a17:903:338d:b0:2d3:768a:b66c]) (user=ackerleytng job=prod-delivery.src-stubby-dispatcher) by 2002:a17:902:e550:b0:2ca:1479:d9dc with SMTP id d9443c01a7336-2d707b64aecmr85060725ad.12.1787735950795; Wed, 26 Aug 2026 02:19:10 -0700 (PDT) Date: Wed, 26 Aug 2026 09:18:35 +0000 In-Reply-To: <20260826-gmem-inplace-conversion-v11-0-0a15d8a799aa@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20260826-gmem-inplace-conversion-v11-0-0a15d8a799aa@google.com> X-Developer-Key: i=ackerleytng@google.com; a=ed25519; pk=sAZDYXdm6Iz8FHitpHeFlCMXwabodTm7p8/3/8xUxuU= X-Developer-Signature: v=1; a=ed25519-sha256; t=1787735885; l=2738; i=ackerleytng@google.com; s=20260225; h=from:subject:message-id; bh=oKhUk7AQ/XVnJUDFQGQ0T3PCQ/fs9vSttvSiNTvu8TA=; b=E3s7CyKmuQ7u5Mqr0j0RmOVbgjxJwnqa6vu50TWR1xpcdjjO+0Nj9vghzwKHhtDd1aD8uPwMQ 5K1FBJ/M+TkCu5I+2+SMQWquWdJ3o1KIoWaNX0et7JTlybJ0RWLUVFk X-Mailer: b4 0.16.0 Message-ID: <20260826-gmem-inplace-conversion-v11-37-0a15d8a799aa@google.com> Subject: [PATCH v11 37/46] KVM: selftests: Add helpers to pin pages with CONFIG_GUP_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, jmattson@google.com, jthoughton@google.com, michael.roth@amd.com, oupton@kernel.org, pankaj.gupta@amd.com, qperret@google.com, rick.p.edgecombe@intel.com, rientjes@google.com, shivankg@amd.com, steven.price@arm.com, willy@infradead.org, wyihan@google.com, yan.y.zhao@intel.com, forkloop@google.com, pratyush@kernel.org, suzuki.poulose@arm.com, aneesh.kumar@kernel.org, liam@infradead.org, Paolo Bonzini , Sean Christopherson , Thomas Gleixner , Ingo Molnar , Borislav Petkov , Dave Hansen , x86@kernel.org, "H. Peter Anvin" , Steven Rostedt , Masami Hiramatsu , Mathieu Desnoyers , Jonathan Corbet , Shuah Khan , Shuah Khan , Vishal Annapurve , Andrew Morton , Chris Li , Kairui Song , Kemeng Shi , Nhat Pham , Barry Song , Axel Rasmussen , Yuanchu Xie , Wei Xu , Youngjun Park , Qi Zheng , Shakeel Butt , Kiryl Shutsemau , Baoquan He , Jason Gunthorpe , John Hubbard , Peter Xu , tarunsahu@google.com, Fuad Tabba , Vlastimil Babka Cc: kvm@vger.kernel.org, linux-kernel@vger.kernel.org, linux-trace-kernel@vger.kernel.org, linux-doc@vger.kernel.org, linux-kselftest@vger.kernel.org, linux-mm@kvack.org, linux-coco@lists.linux.dev, Ackerley Tng Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Add helper functions to allow KVM selftests to pin memory using CONFIG_GUP_TEST. This is useful for creating test scenarios where some page has an increased refcount, such as when testing guest_memfd in-place conversion. The helpers open /sys/kernel/debug/gup_test and invoke the PIN_LONGTERM_TEST_START and PIN_LONGTERM_TEST_STOP ioctls. Since this functionality depends on the kernel being built with CONFIG_GUP_TEST, provide stub implementations that trigger a test failure if the configuration is missing. Reviewed-by: Fuad Tabba Tested-by: Shivank Garg Signed-off-by: Ackerley Tng --- tools/testing/selftests/kvm/include/kvm_util.h | 3 +++ tools/testing/selftests/kvm/lib/kvm_util.c | 25 ++++++++++++++++++++++= +++ 2 files changed, 28 insertions(+) diff --git a/tools/testing/selftests/kvm/include/kvm_util.h b/tools/testing= /selftests/kvm/include/kvm_util.h index 575032e9791d2..3cfe243d7c8b0 100644 --- a/tools/testing/selftests/kvm/include/kvm_util.h +++ b/tools/testing/selftests/kvm/include/kvm_util.h @@ -1206,6 +1206,9 @@ static inline int pin_self_to_any_cpu(void) return pin_task_to_any_cpu(pthread_self()); } =20 +void pin_pages(void *vaddr, uint64_t size); +void unpin_pages(void); + void kvm_print_vcpu_pinning_help(void); void kvm_parse_vcpu_pinning(const char *pcpus_string, u32 vcpu_to_pcpu[], int nr_vcpus); diff --git a/tools/testing/selftests/kvm/lib/kvm_util.c b/tools/testing/sel= ftests/kvm/lib/kvm_util.c index cd468b2bb8343..b1456ed76e27e 100644 --- a/tools/testing/selftests/kvm/lib/kvm_util.c +++ b/tools/testing/selftests/kvm/lib/kvm_util.c @@ -19,6 +19,8 @@ #include #include =20 +#include "../../../../../mm/gup_test.h" + #define KVM_UTIL_MIN_PFN 2 =20 u32 kvm_random_seed; @@ -645,6 +647,29 @@ int __pin_task_to_cpu(pthread_t task, int cpu) return pthread_setaffinity_np(task, sizeof(cpuset), &cpuset); } =20 +static int gup_test_fd =3D -1; + +void pin_pages(void *vaddr, uint64_t size) +{ + const struct pin_longterm_test args =3D { + .addr =3D (uint64_t)vaddr, + .size =3D size, + .flags =3D PIN_LONGTERM_TEST_FLAG_USE_WRITE, + }; + + gup_test_fd =3D __open_path_or_exit("/sys/kernel/debug/gup_test", O_RDWR, + "Is CONFIG_GUP_TEST enabled?"); + + TEST_ASSERT_EQ(ioctl(gup_test_fd, PIN_LONGTERM_TEST_START, &args), 0); +} + +void unpin_pages(void) +{ + TEST_ASSERT_EQ(ioctl(gup_test_fd, PIN_LONGTERM_TEST_STOP), 0); + + kvm_free_fd(gup_test_fd); +} + static u32 parse_pcpu(const char *cpu_str, const cpu_set_t *allowed_mask) { u32 pcpu =3D atoi_non_negative("CPU number", cpu_str); --=20 2.55.0.887.g758fc8c411-goog From nobody Mon Sep 28 04:51:20 2026 Received: from mail-pf1-f199.google.com (mail-pf1-f199.google.com [209.85.210.199]) (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 1BAD63C0608 for ; Wed, 26 Aug 2026 09:19:15 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.210.199 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1787735962; cv=none; b=LauiG4Nn9bAMXkxH5cXMt1q3c/RGDXuSmRE7bUL2QFRhjx5193eTUxg0CmLHMdssdetyPqa+4VAbW9aA3RjxfmHfpPxAr60DzNl0GvuCeMQ2w4j9ED7egNQaF4MLk3t0e9T0BUNit/6lxJDOMkb4kEvgAg7LCxfJhuL5fNKAVpM= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1787735962; c=relaxed/simple; bh=D4kSZoQjn2evbYJeBPXvMiB6VpABDixLKIO9Wkc0q2Y=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=qv1kQHCSkuK9LMT22nVAxA/0gi3kkWiiC0FxjeB2dqhLHhgc8PP98Si2r4cN86QBsVQPXj12C38zSIAHI/8QUeQna/KDxA2/Cxcrh/bJwlOCvL7Qr5JW+JIhNQsut+upLjovZDzHbb3jqzwVvcE2ZQLSpLqVGufWu8Iz94cnO4I= 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=sUyb1mZ4; arc=none smtp.client-ip=209.85.210.199 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="sUyb1mZ4" Received: by mail-pf1-f199.google.com with SMTP id d2e1a72fcca58-848568a6f62so841498b3a.0 for ; Wed, 26 Aug 2026 02:19:15 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20251104; t=1787735953; x=1788340753; darn=vger.kernel.org; h=content-type:cc:to:from:subject:message-id:references:mime-version :in-reply-to:date:from:to:cc:subject:date:message-id:reply-to :content-type; bh=Jk/fFiPly+8t/f3A0x8GyZ4oVakKVeks0566IWo6DSM=; b=sUyb1mZ45IDQGZFDnfu0KZp+x/lkLxpn6SfR3ahvQLSzfFVtx4Dg190vxGd0YRrbed IczqGcI2KIGks3i6JjzFetnCyID0fO72BhHSfmShCyHMsmdJOmp2M4jRiILylXwbOexq faiaV8Xi0Mri9VZhC5Q7zbaDUa5dODzsf0XDTaM0KXGI5+5Ugzw13sEHIKDWnAoNCKzD DTDna7E/3rTDRaROGY1dbEkUHQ2gUG43ZWENN2xQr8+BBDhUsQSmvzdtOahqdq180if0 8yvyFwVICJsMBpRnnYJWRcsZ9+kiNJ4wQ4Q4juefDiYgooS4F3wEZQLdVc6buzlmcS6M RnZw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1787735953; x=1788340753; h=content-type: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:content-type; bh=Jk/fFiPly+8t/f3A0x8GyZ4oVakKVeks0566IWo6DSM=; b=RJf0kLeboxGcv5OW2/Ry0wLP8KxhzWJR3f2DF9kAzQpeHRXw6XOeC8r8SmfGVa9iZc SgBMtIoIo+jxJXZJTV3sD5KymrQHaWlouVHfvepjUlTc9tBA/q688oskofMnRX91m7jY bK17ckC/0t6peKm4khmhaelJi/kZ0FX+wTxQylNPI49nA+ecb3+w0lkTGtzoEESHxCyS T7etBxcJek//XhYaSKfmsPF5nv/Ip1xAe0EVYtLH98B/Fws/plqlioDxG2g6jdvjVzkd dEEmSNkU+A852sRg1m6YNWOoaxDARARivGC7MdJL0xx0GZ9EwJ02rUsa61ejy83x3G2v d5rQ== X-Forwarded-Encrypted: i=1; AHgh+RqkcAVgDXO53fdiXYmHpuTOXhMa52+6w4k014h3ZEFN7AG9ewBLbZoZmWhRgcNn1IO0+LvsbAWzeIy1oBA=@vger.kernel.org X-Gm-Message-State: AFuF++nqtPGK3LZxX1atcd+Il85Wuznm7IqY4A4ts78CYxOMaoYmCceB LYCrUkkLNkQYjPFt+mqlkzxIXQ3hptkd3JoFQAWARVpRRrIFuS6qYVRqXnwlXVCdI7WP5HrK7wI FH3KOf36SK9nfGTyyX7mBzjqYFg== X-Received: from pgcn16.prod.google.com ([2002:a63:7210:0:b0:cc1:c6f9:542e]) (user=ackerleytng job=prod-delivery.src-stubby-dispatcher) by 2002:a05:6a00:4289:b0:84e:2382:f4f0 with SMTP id d2e1a72fcca58-85372ea2586mr10262808b3a.4.1787735952477; Wed, 26 Aug 2026 02:19:12 -0700 (PDT) Date: Wed, 26 Aug 2026 09:18:36 +0000 In-Reply-To: <20260826-gmem-inplace-conversion-v11-0-0a15d8a799aa@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20260826-gmem-inplace-conversion-v11-0-0a15d8a799aa@google.com> X-Developer-Key: i=ackerleytng@google.com; a=ed25519; pk=sAZDYXdm6Iz8FHitpHeFlCMXwabodTm7p8/3/8xUxuU= X-Developer-Signature: v=1; a=ed25519-sha256; t=1787735885; l=3125; i=ackerleytng@google.com; s=20260225; h=from:subject:message-id; bh=D4kSZoQjn2evbYJeBPXvMiB6VpABDixLKIO9Wkc0q2Y=; b=0Xl+Ft2JNeFgHc72cKdPUmlWIaaUKrTcWNaCuE5l4p0QjHUf+PDqPvln09IV5z3p6JgNwwSEQ MgPrgGhkueuDsaZhj/coMGB3BJHJjWnz0bwzPjys8Q0r27VmXRxCpWH X-Mailer: b4 0.16.0 Message-ID: <20260826-gmem-inplace-conversion-v11-38-0a15d8a799aa@google.com> Subject: [PATCH v11 38/46] 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, jmattson@google.com, jthoughton@google.com, michael.roth@amd.com, oupton@kernel.org, pankaj.gupta@amd.com, qperret@google.com, rick.p.edgecombe@intel.com, rientjes@google.com, shivankg@amd.com, steven.price@arm.com, willy@infradead.org, wyihan@google.com, yan.y.zhao@intel.com, forkloop@google.com, pratyush@kernel.org, suzuki.poulose@arm.com, aneesh.kumar@kernel.org, liam@infradead.org, Paolo Bonzini , Sean Christopherson , Thomas Gleixner , Ingo Molnar , Borislav Petkov , Dave Hansen , x86@kernel.org, "H. Peter Anvin" , Steven Rostedt , Masami Hiramatsu , Mathieu Desnoyers , Jonathan Corbet , Shuah Khan , Shuah Khan , Vishal Annapurve , Andrew Morton , Chris Li , Kairui Song , Kemeng Shi , Nhat Pham , Barry Song , Axel Rasmussen , Yuanchu Xie , Wei Xu , Youngjun Park , Qi Zheng , Shakeel Butt , Kiryl Shutsemau , Baoquan He , Jason Gunthorpe , John Hubbard , Peter Xu , tarunsahu@google.com, Fuad Tabba , Vlastimil Babka Cc: kvm@vger.kernel.org, linux-kernel@vger.kernel.org, linux-trace-kernel@vger.kernel.org, linux-doc@vger.kernel.org, linux-kselftest@vger.kernel.org, linux-mm@kvack.org, linux-coco@lists.linux.dev, 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, the conversion must be aborted. 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. Co-developed-by: Sean Christopherson Signed-off-by: Sean Christopherson Reviewed-by: Fuad Tabba Tested-by: Shivank Garg Signed-off-by: Ackerley Tng --- .../kvm/x86/guest_memfd_conversions_test.c | 56 ++++++++++++++++++= ++++ 1 file changed, 56 insertions(+) diff --git a/tools/testing/selftests/kvm/x86/guest_memfd_conversions_test.c= b/tools/testing/selftests/kvm/x86/guest_memfd_conversions_test.c index a972a09c5c6e5..e1c84df0f0596 100644 --- a/tools/testing/selftests/kvm/x86/guest_memfd_conversions_test.c +++ b/tools/testing/selftests/kvm/x86/guest_memfd_conversions_test.c @@ -444,6 +444,62 @@ GMEM_CONVERSION_TEST_INIT_SHARED(forked_accesses) #undef TEST_STATE_AWAIT } =20 +static void test_convert_to_private_fails(test_data_t *t, u64 pgoff, + size_t nr_pages, + u64 expected_error_offset) +{ + /* +1 to make it anything but expected_error_offset. */ + u64 error_offset =3D expected_error_offset + 1; + u64 offset =3D pgoff * page_size; + 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.55.0.887.g758fc8c411-goog From nobody Mon Sep 28 04:51:20 2026 Received: from mail-pg1-f199.google.com (mail-pg1-f199.google.com [209.85.215.199]) (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 609BC40098A for ; Wed, 26 Aug 2026 09:19:17 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.215.199 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1787735962; cv=none; b=Hcraas0Up5VRWGNI/E9do6LY0kFpJOOv+adJA8ZzvlbCew3402fwqX+Ff8qHGcLn98B94CVyo1GTE7uq0wdm7kzxFgb4ObV1x9VTjklZa/GEiRhIOJ0WW6SDokG+AtwjI2nJSsWl0gLGApmhXu6z3Xnw83qLIiecxzHa67ZCeSQ= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1787735962; c=relaxed/simple; bh=Z2tr8qvCMQ6vCwWclEIKVEn4lsWDwgpi8MEvWzFtaCI=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=qergRvjpStgDqgRpCbSCpMUuWn2pyja+b8e8KOEfa4vg/3AK3yyNxgkTLBAnjbHKBZp2S6rWmuI6EYtGkqa2GZLjoqk8MlxFHblhH78AM0NfQVhCcIBk0HYG6PRlBUQEHKw8oUPq8krB9pQ2or0nzXEuLTGcF4ZtRSPH1tHjOKQ= 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=r11z5JKA; arc=none smtp.client-ip=209.85.215.199 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="r11z5JKA" Received: by mail-pg1-f199.google.com with SMTP id 41be03b00d2f7-cc1a439db36so897060a12.2 for ; Wed, 26 Aug 2026 02:19:16 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20251104; t=1787735955; x=1788340755; darn=vger.kernel.org; h=content-type:cc:to:from:subject:message-id:references:mime-version :in-reply-to:date:from:to:cc:subject:date:message-id:reply-to :content-type; bh=bLTz+QoAp4yNZ1r8wY9Xq6qZeJQ57AOaVsGWHTn9ANY=; b=r11z5JKAqRwK5SgW3du5wfI9Q8/jzJB0UWeBchf9XMDxcxNt08IbW9E5zf899fF62R DzjO3uqyIpPXoKCLbybYH7u1PkrFA20Y/wYg8sfprnqU8pc91Qyc54xmOhFDTtxyzrVH seH3E1Aq7bUPQY/fyaO+6sj/PKxUDdx0WgA3UrEklXsImF570s0NgRwuTyTfiozKoxWJ sD8ge0hTjbc6mtCMusU66k3sMn8JQwFLn5jWOwgVr69NREg5us3GxB19w1/j8G9Tm2Wc wBphtcHLwpZYud2UegLK/QYCUA/Bm7IbHpIndsIB7hAc1+35RuMqM2tLY5JXtzyvS77+ vpNw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1787735955; x=1788340755; h=content-type: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:content-type; bh=bLTz+QoAp4yNZ1r8wY9Xq6qZeJQ57AOaVsGWHTn9ANY=; b=S+er05M5VaahIJ3TNwLgXhdb5M+Bz28NTpezue63ylNphrwUNP5NFw87dJL7C45GxZ /rflf9pxCJwmeSJ8Z4PDtZCZbbFAumSCWmE5HtEA7kbc6e9oYHDiNTmA0OO7wwE/vD0/ kgtBTFlp20B6ZQD1Ks4fqW4+6/VvUhjOjET2vhjgTUOc+/KQYc+xxbv2EK2MmOTJU8jl WleQNWr/4LTGq/641ZbPyQsikKRl75gRnNkbrh0lugNK0IIni3ONn1RTnGfofEIRY5sP Y6v3GvC1wdflT68F8m6ryt4YKUFGGUmh8yJvMfhKH3rR5lnDcfe1ndKcMS+oih430I0y 07UQ== X-Forwarded-Encrypted: i=1; AHgh+RpGVs8vaqhe0akNWMC2zCNCKPxX5t/QeMpl9ba+INAjvrUbIcrkNxl16H8Nj8/0b7P2O61Aj8ELndSqY28=@vger.kernel.org X-Gm-Message-State: AFuF++kYG/KxpPha8xcQXVhCu4MvAfC0stC8rKiPvpTOct7V3ivP4j4P f/NKve+577U+dkOZ7z1Y17mvHtsyiUqMseml1aghlzqHjjCcindiaoDkn6ZE5VikyNMJ09G8UlA DQWY67KU4FW8m+dOJCEHueuv7Tw== X-Received: from pgcq30.prod.google.com ([2002:a63:751e:0:b0:c9b:2759:d240]) (user=ackerleytng job=prod-delivery.src-stubby-dispatcher) by 2002:a05:6300:6681:b0:3cc:9288:99aa with SMTP id adf61e73a8af0-3cf6673e199mr11680996637.0.1787735954249; Wed, 26 Aug 2026 02:19:14 -0700 (PDT) Date: Wed, 26 Aug 2026 09:18:37 +0000 In-Reply-To: <20260826-gmem-inplace-conversion-v11-0-0a15d8a799aa@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20260826-gmem-inplace-conversion-v11-0-0a15d8a799aa@google.com> X-Developer-Key: i=ackerleytng@google.com; a=ed25519; pk=sAZDYXdm6Iz8FHitpHeFlCMXwabodTm7p8/3/8xUxuU= X-Developer-Signature: v=1; a=ed25519-sha256; t=1787735885; l=2579; i=ackerleytng@google.com; s=20260225; h=from:subject:message-id; bh=Z2tr8qvCMQ6vCwWclEIKVEn4lsWDwgpi8MEvWzFtaCI=; b=uYPyckNcYtbmNIce6USQWE2ZQN3yzQ5s9PRlHn/kQiqauAVRj01fYWLdGSn4JUn4Y8ICRU4i5 SrOFy7IMtVFANbmMI9ps1KJiTpkrRcJ6bBbcMXjogb2zUhXxCkElfSO X-Mailer: b4 0.16.0 Message-ID: <20260826-gmem-inplace-conversion-v11-39-0a15d8a799aa@google.com> Subject: [PATCH v11 39/46] 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, jmattson@google.com, jthoughton@google.com, michael.roth@amd.com, oupton@kernel.org, pankaj.gupta@amd.com, qperret@google.com, rick.p.edgecombe@intel.com, rientjes@google.com, shivankg@amd.com, steven.price@arm.com, willy@infradead.org, wyihan@google.com, yan.y.zhao@intel.com, forkloop@google.com, pratyush@kernel.org, suzuki.poulose@arm.com, aneesh.kumar@kernel.org, liam@infradead.org, Paolo Bonzini , Sean Christopherson , Thomas Gleixner , Ingo Molnar , Borislav Petkov , Dave Hansen , x86@kernel.org, "H. Peter Anvin" , Steven Rostedt , Masami Hiramatsu , Mathieu Desnoyers , Jonathan Corbet , Shuah Khan , Shuah Khan , Vishal Annapurve , Andrew Morton , Chris Li , Kairui Song , Kemeng Shi , Nhat Pham , Barry Song , Axel Rasmussen , Yuanchu Xie , Wei Xu , Youngjun Park , Qi Zheng , Shakeel Butt , Kiryl Shutsemau , Baoquan He , Jason Gunthorpe , John Hubbard , Peter Xu , tarunsahu@google.com, Fuad Tabba , Vlastimil Babka Cc: kvm@vger.kernel.org, linux-kernel@vger.kernel.org, linux-trace-kernel@vger.kernel.org, linux-doc@vger.kernel.org, linux-kselftest@vger.kernel.org, linux-mm@kvack.org, linux-coco@lists.linux.dev, 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") Reviewed-by: Fuad Tabba Tested-by: Shivank Garg 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 f3de2a4ab0551..cf50e9a332c5b 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(u64 base_g= pa, 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.55.0.887.g758fc8c411-goog From nobody Mon Sep 28 04:51:20 2026 Received: from mail-pl1-f200.google.com (mail-pl1-f200.google.com [209.85.214.200]) (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 ABA754028CA for ; Wed, 26 Aug 2026 09:19:17 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.200 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1787735962; cv=none; b=eyVNs09+L96pIyXMNehsxzsQBM4/6RY8VYVd4EMrpjdCK7l1DNaevZyQdV6beCafV4BRpyIbdRli7rtf7UDhJFSfM0EGLTS88kP5NWOQa9pwjk5xhhr7koDodM/Jb7w/dLkQkeeyTTfEi8ijGo1izbHmxCQM+ZAr3j+ezUDFX0U= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1787735962; c=relaxed/simple; bh=/CEIwjSGNwWClY4nJ2gvXOUmsoNiPZonugede79K7VY=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=XhGy6kBt99QlXnGeE3cj44W3yl4vW0lqxWitVdmgdqD/NOgKiYjrqjSk+bN0qdgBzUWQlvxeU/d8omebVKSa7Jb4kthv0GnQIyhkW9IHIecGGLWZ/i1eKrVODhjbXWy/Ef08wj05Mv+RcRy25mQd+weG7J/ghSO+kak3JppBRvQ= 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=S0e96A8H; arc=none smtp.client-ip=209.85.214.200 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="S0e96A8H" Received: by mail-pl1-f200.google.com with SMTP id d9443c01a7336-2ce7dfd33ffso6580205ad.0 for ; Wed, 26 Aug 2026 02:19:17 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20251104; t=1787735956; x=1788340756; darn=vger.kernel.org; h=content-type:cc:to:from:subject:message-id:references:mime-version :in-reply-to:date:from:to:cc:subject:date:message-id:reply-to :content-type; bh=D76PmzCDeRV2p6N10w9hh+EAG0ujagtUtRrj7jnjsfc=; b=S0e96A8HqBK3LBCzJOnA/+yIWjNBqKpWigXfkwj3hXG+1hlRWMdo+dLQDSApkrA0Au W0GxzQrpu+uFv35nd7aYUNGKh1jeIhvEGSI0LEgW+wSZV4pNX61XFsyIiQhi1dWP7cpI D8JudCiYVXBiAYk4lF6Fnwtr3hLN3XjR5b+qiq3BSdq82WxIqtZxcKQ2BfLZb+EJuTb5 GSeLweKA3yp60N8FIjJVrOGsTDtR6TbXk1HeS2HY7+Ej7HJa58bl38i1B3B3zIEph8rR guy+rr/G2MU1qwsFhmzwb5gjRIcNChiMOt2JZnRuVQTCwDnDxMkyZfHO1LLffm848dx9 hdPA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1787735956; x=1788340756; h=content-type: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:content-type; bh=D76PmzCDeRV2p6N10w9hh+EAG0ujagtUtRrj7jnjsfc=; b=MbQvG/7kRkykxdMPCTNggumoRNshSE684Qe312IYIzU6K02/r6kxjmeSY2LtGWU/j/ ti1DWgHLDwtXzLpudo1+asI8jW0DHn8bGBWdWNvaiHPLj8ZO3z7NPmsroly0+lJo35mk FlCOtSO5yJBpEIuX0bMXi3JK9u2mnEQU19a/eXdrASD1VbO3AE2G/1Zj0PPhsuZxwaE9 QOsfHG7uIvxEHdSFPM605wgr0qmYo5QYC3IGxfb6hi26CgXOmUnoy3WDAuX2YsqWZIr4 6kMJB87ATg8MMdDqF+C8qIOlWhAFNVM5/pC0r3FzZWVA0p1xeACFUWWHr3xGR0OyTvBH m0QA== X-Forwarded-Encrypted: i=1; AHgh+RqchiP9FLaG3CI2IRhWhjpKyTmFr/WJSaPg3+rObiQydNFqn2EMXrrCDUHEeVUceOaTcNUQgWrOg+6H/nc=@vger.kernel.org X-Gm-Message-State: AFuF++mY5rcfdAsZQdzNGLbjmD7ShIDMKh3ta8qATlFbDaIQFECB0Td8 q0mErX60B/mS4Sq6TQt8JkM7hile9VNhfLMpk/+GVFD5jb/2XoWRCe47hSZKcktuoH/DbPKVsdr mObafqV61kdaw32TUuRl2A/2XKw== X-Received: from plbkx3.prod.google.com ([2002:a17:902:f943:b0:2cc:b904:3255]) (user=ackerleytng job=prod-delivery.src-stubby-dispatcher) by 2002:a17:903:8c5:b0:2d6:3c2f:69b with SMTP id d9443c01a7336-2d707aeb1b2mr107014985ad.8.1787735955894; Wed, 26 Aug 2026 02:19:15 -0700 (PDT) Date: Wed, 26 Aug 2026 09:18:38 +0000 In-Reply-To: <20260826-gmem-inplace-conversion-v11-0-0a15d8a799aa@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20260826-gmem-inplace-conversion-v11-0-0a15d8a799aa@google.com> X-Developer-Key: i=ackerleytng@google.com; a=ed25519; pk=sAZDYXdm6Iz8FHitpHeFlCMXwabodTm7p8/3/8xUxuU= X-Developer-Signature: v=1; a=ed25519-sha256; t=1787735885; l=3994; i=ackerleytng@google.com; s=20260225; h=from:subject:message-id; bh=/CEIwjSGNwWClY4nJ2gvXOUmsoNiPZonugede79K7VY=; b=VKI0jpmA2fGtPo3ALkYanD2hZxdvdB4CI9YcTqovPUoBOfqUWyj8zXw9hejtH2j8l1NI1Y3qO tqEtPmAd+YVCTNJdT2Dv6V42I0jNgs6umWAkWlD4JbtNbw1o73F37Lt X-Mailer: b4 0.16.0 Message-ID: <20260826-gmem-inplace-conversion-v11-40-0a15d8a799aa@google.com> Subject: [PATCH v11 40/46] 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, jmattson@google.com, jthoughton@google.com, michael.roth@amd.com, oupton@kernel.org, pankaj.gupta@amd.com, qperret@google.com, rick.p.edgecombe@intel.com, rientjes@google.com, shivankg@amd.com, steven.price@arm.com, willy@infradead.org, wyihan@google.com, yan.y.zhao@intel.com, forkloop@google.com, pratyush@kernel.org, suzuki.poulose@arm.com, aneesh.kumar@kernel.org, liam@infradead.org, Paolo Bonzini , Sean Christopherson , Thomas Gleixner , Ingo Molnar , Borislav Petkov , Dave Hansen , x86@kernel.org, "H. Peter Anvin" , Steven Rostedt , Masami Hiramatsu , Mathieu Desnoyers , Jonathan Corbet , Shuah Khan , Shuah Khan , Vishal Annapurve , Andrew Morton , Chris Li , Kairui Song , Kemeng Shi , Nhat Pham , Barry Song , Axel Rasmussen , Yuanchu Xie , Wei Xu , Youngjun Park , Qi Zheng , Shakeel Butt , Kiryl Shutsemau , Baoquan He , Jason Gunthorpe , John Hubbard , Peter Xu , tarunsahu@google.com, Fuad Tabba , Vlastimil Babka Cc: kvm@vger.kernel.org, linux-kernel@vger.kernel.org, linux-trace-kernel@vger.kernel.org, linux-doc@vger.kernel.org, linux-kselftest@vger.kernel.org, linux-mm@kvack.org, linux-coco@lists.linux.dev, 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. Co-developed-by: Sean Christopherson Signed-off-by: Sean Christopherson Reviewed-by: Fuad Tabba Tested-by: Shivank Garg Signed-off-by: Ackerley Tng --- tools/testing/selftests/kvm/include/kvm_util.h | 3 +++ tools/testing/selftests/kvm/lib/kvm_util.c | 37 ++++++++++++++++------= ---- 2 files changed, 26 insertions(+), 14 deletions(-) diff --git a/tools/testing/selftests/kvm/include/kvm_util.h b/tools/testing= /selftests/kvm/include/kvm_util.h index 3cfe243d7c8b0..795c9eb311071 100644 --- a/tools/testing/selftests/kvm/include/kvm_util.h +++ b/tools/testing/selftests/kvm/include/kvm_util.h @@ -428,6 +428,9 @@ static inline void vm_enable_cap(struct kvm_vm *vm, u32= cap, u64 arg0) vm_ioctl(vm, KVM_ENABLE_CAP, &enable_cap); } =20 +int kvm_gpa_to_guest_memfd(struct kvm_vm *vm, gpa_t gpa, off_t *fd_offset, + size_t *nr_bytes); + /* * KVM_SET_MEMORY_ATTRIBUTES{,2} 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 b1456ed76e27e..1188d0a6c0a5f 100644 --- a/tools/testing/selftests/kvm/lib/kvm_util.c +++ b/tools/testing/selftests/kvm/lib/kvm_util.c @@ -1332,27 +1332,20 @@ void vm_guest_mem_fallocate(struct kvm_vm *vm, u64 = base, u64 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; u64 end =3D base + size; - gpa_t gpa, len; off_t fd_offset; - int ret; + int fd, ret; + size_t len; + gpa_t gpa; =20 for (gpa =3D base; gpa < end; gpa +=3D len) { - u64 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(u64, 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 @@ -1689,6 +1682,22 @@ void *addr_gpa2alias(struct kvm_vm *vm, gpa_t gpa) return (void *) ((uintptr_t) region->host_alias + offset); } =20 +int kvm_gpa_to_guest_memfd(struct kvm_vm *vm, gpa_t gpa, off_t *fd_offset, + size_t *nr_bytes) +{ + struct userspace_mem_region *region; + gpa_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.55.0.887.g758fc8c411-goog From nobody Mon Sep 28 04:51:20 2026 Received: from mail-pl1-f199.google.com (mail-pl1-f199.google.com [209.85.214.199]) (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 5FAC23C0A1B for ; Wed, 26 Aug 2026 09:19:20 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.199 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1787735967; cv=none; b=lV/mCGIHMh+3gjA0vAhwdFxIHhoxFO8Yr/gQhkNnwvDzVJHu1u67XMq32tiI9lJ25QoB4oCKTAVecb1KdG+6WV965TgBfJSbPTawZxZSuQT5y3Z65zKryQ5EeqTTs1536f3aB9G3trVsLhYIWiLyo7tJIJGefIk3QjZYisTMrnU= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1787735967; c=relaxed/simple; bh=aNpKmkec8/mPoC6VqfSFdL89LVrYPgyUp4I7FMfqF28=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=cEfaaE0/HQU+VlzYVpDg/38NiePAyZOULgd99ojknuA16czUqU+aDDzBtDJ/QOZreZ9Wn8ZE3iE1c9QwV1ov1e+zhh+Kl8OeMZ+8eCUDpUFjIUeRJHfliRQ6U3kgOqb9+PUM2QLBVvISTDz8+/7eDlKqR9qRcvyB+Ue5oJymbkY= 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=OvUMdWSr; arc=none smtp.client-ip=209.85.214.199 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="OvUMdWSr" Received: by mail-pl1-f199.google.com with SMTP id d9443c01a7336-2d55d8cd938so15047555ad.1 for ; Wed, 26 Aug 2026 02:19:20 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20251104; t=1787735958; x=1788340758; darn=vger.kernel.org; h=content-type:cc:to:from:subject:message-id:references:mime-version :in-reply-to:date:from:to:cc:subject:date:message-id:reply-to :content-type; bh=PLqZOLBapggAgTh0v8ToB3YKqPPya91M3lrmoBKPLbM=; b=OvUMdWSrJxZAZziRu/qsQMKTWSNdMtvGBwpOvIg/PB/wV0gWFDV24TBTEmaifFaQVK xAVOu7uTIrVI5IjoXUYkGbV6zjvRP/MPZk/nH6Y5x6CPI1ZTHLY52BsEQwoLP9EnYM5g F6LReDdGzmKxqfFT5/4G9RJYZdB7Yd4nNcuEX/KhNN381bxgREA1XrE3Ezug8f2DRXTp isZnBA3JAE8ophsS9YcElutnuzEMGRvOVuULYtdUyefNf3i+oMXs67+3JL0OHSyg/Gzj nDxNsjPEeoLnHrhoz3o51iUlM8s4biiUuIA0fH3Ydq2MlqpN9U/GSDomDB+i1Pd9NhTi LSJQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1787735958; x=1788340758; h=content-type: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:content-type; bh=PLqZOLBapggAgTh0v8ToB3YKqPPya91M3lrmoBKPLbM=; b=HgP4MeVKz25V7oCtwwsupbdmuVZrCIppifIwrI7Yh/IfZwUgq0cH9+5BWV761KsYfC gBKryfbBd1Ah5Sg3cCEg+i0vGthsOk7VVOdZV7dTZjNYW2uXYoMPC8yc3WGlHBTxipGZ iOQRNsVRTmyUU/XsqE8C2i6IoiHaCzS3GNdeSYSxvMo1+sWxryLN6FY0OSyoa90+MGG1 e8Ch9kgydLVFzBb4mR3I39RrBpmPrU8DRsXLDUoXtUPn+P99y99NKuFB6SrJP0nAZwCD eTq4nWaPnr9e4696P1tE3weJbRDvQrSP+RxsJdxsNywdEkZcCfqvlHAf8Ou1vjIUZRe7 Icdg== X-Forwarded-Encrypted: i=1; AHgh+RoOEDvhkDNaqEe8zG31gn4bntukq/Dh6ntpsnTs4iOVbxF5bn0bzB6k94F6FoPt7RRC7Hkk0bnKzKld/vw=@vger.kernel.org X-Gm-Message-State: AFuF++l5PJ1X89U6FFlWQauWO6ftDhncDR5TRrKTaRpvtdWJB1oF75s/ bTBibjsush9u/kKT48/+MPD1OCsJqgY+Ct2yJOTxL4S4b8MS4qmuPk7TMGY2bJsAvvUeUjOrAl4 NOiG3J+Rch/EBkfwvti/tXvX/TA== X-Received: from plkh12.prod.google.com ([2002:a17:903:19ec:b0:2d6:e427:73fc]) (user=ackerleytng job=prod-delivery.src-stubby-dispatcher) by 2002:a17:903:1a45:b0:2cc:d6de:d597 with SMTP id d9443c01a7336-2d707a9fecbmr93482805ad.7.1787735957517; Wed, 26 Aug 2026 02:19:17 -0700 (PDT) Date: Wed, 26 Aug 2026 09:18:39 +0000 In-Reply-To: <20260826-gmem-inplace-conversion-v11-0-0a15d8a799aa@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20260826-gmem-inplace-conversion-v11-0-0a15d8a799aa@google.com> X-Developer-Key: i=ackerleytng@google.com; a=ed25519; pk=sAZDYXdm6Iz8FHitpHeFlCMXwabodTm7p8/3/8xUxuU= X-Developer-Signature: v=1; a=ed25519-sha256; t=1787735885; l=2853; i=ackerleytng@google.com; s=20260225; h=from:subject:message-id; bh=KrfHutYDID9ZpS/QrQgxXNh2ivfNp+DkdslA3yVHWOg=; b=AvojirCrTsfwdIbnWA5buIntUCOjUNcNGy9Bkh8lUDQsgnH2HyYawXH79uUJxeFFALY27Ytjx awXjeiPTATiBTlEnjkf3iDdDkOOiMl8oaR9xK+2t16BzXlg+JCNL7Kl X-Mailer: b4 0.16.0 Message-ID: <20260826-gmem-inplace-conversion-v11-41-0a15d8a799aa@google.com> Subject: [PATCH v11 41/46] 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, jmattson@google.com, jthoughton@google.com, michael.roth@amd.com, oupton@kernel.org, pankaj.gupta@amd.com, qperret@google.com, rick.p.edgecombe@intel.com, rientjes@google.com, shivankg@amd.com, steven.price@arm.com, willy@infradead.org, wyihan@google.com, yan.y.zhao@intel.com, forkloop@google.com, pratyush@kernel.org, suzuki.poulose@arm.com, aneesh.kumar@kernel.org, liam@infradead.org, Paolo Bonzini , Sean Christopherson , Thomas Gleixner , Ingo Molnar , Borislav Petkov , Dave Hansen , x86@kernel.org, "H. Peter Anvin" , Steven Rostedt , Masami Hiramatsu , Mathieu Desnoyers , Jonathan Corbet , Shuah Khan , Shuah Khan , Vishal Annapurve , Andrew Morton , Chris Li , Kairui Song , Kemeng Shi , Nhat Pham , Barry Song , Axel Rasmussen , Yuanchu Xie , Wei Xu , Youngjun Park , Qi Zheng , Shakeel Butt , Kiryl Shutsemau , Baoquan He , Jason Gunthorpe , John Hubbard , Peter Xu , tarunsahu@google.com, Fuad Tabba , Vlastimil Babka Cc: kvm@vger.kernel.org, linux-kernel@vger.kernel.org, linux-trace-kernel@vger.kernel.org, linux-doc@vger.kernel.org, linux-kselftest@vger.kernel.org, linux-mm@kvack.org, linux-coco@lists.linux.dev, 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. Opportunistically update the size parameter to use size_t instead of u64. Signed-off-by: Sean Christopherson Reviewed-by: Fuad Tabba Tested-by: Shivank Garg Co-developed-by: Ackerley Tng Signed-off-by: Ackerley Tng --- tools/testing/selftests/kvm/include/kvm_util.h | 46 +++++++++++++++++++---= ---- 1 file changed, 34 insertions(+), 12 deletions(-) diff --git a/tools/testing/selftests/kvm/include/kvm_util.h b/tools/testing= /selftests/kvm/include/kvm_util.h index 795c9eb311071..777fa3dbf88d6 100644 --- a/tools/testing/selftests/kvm/include/kvm_util.h +++ b/tools/testing/selftests/kvm/include/kvm_util.h @@ -454,18 +454,6 @@ static inline void vm_set_memory_attributes(struct kvm= _vm *vm, gpa_t gpa, vm_ioctl(vm, KVM_SET_MEMORY_ATTRIBUTES, &attr); } =20 -static inline void vm_mem_set_private(struct kvm_vm *vm, gpa_t gpa, - u64 size) -{ - vm_set_memory_attributes(vm, gpa, size, KVM_MEMORY_ATTRIBUTE_PRIVATE); -} - -static inline void vm_mem_set_shared(struct kvm_vm *vm, gpa_t gpa, - u64 size) -{ - vm_set_memory_attributes(vm, gpa, size, 0); -} - static inline int __gmem_set_memory_attributes(int fd, u64 offset, size_t size, u64 attributes, u64 *error_offset) @@ -532,6 +520,40 @@ static inline void gmem_set_shared(int fd, u64 offset,= size_t size) gmem_set_memory_attributes(fd, offset, size, 0); } =20 +static inline void vm_mem_set_memory_attributes(struct kvm_vm *vm, gpa_t g= pa, + size_t size, u64 attrs) +{ + if (kvm_has_gmem_attributes) { + gpa_t end =3D gpa + size; + off_t fd_offset; + gpa_t addr; + size_t len; + 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, gpa_t gpa, + size_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, gpa_t gpa, + size_t size) +{ + vm_mem_set_memory_attributes(vm, gpa, size, 0); +} + void vm_guest_mem_fallocate(struct kvm_vm *vm, gpa_t gpa, u64 size, bool punch_hole); =20 --=20 2.55.0.887.g758fc8c411-goog From nobody Mon Sep 28 04:51:20 2026 Received: from mail-pl1-f197.google.com (mail-pl1-f197.google.com [209.85.214.197]) (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 4FF423DB313 for ; Wed, 26 Aug 2026 09:19:22 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.197 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1787735966; cv=none; b=tU+yvc3yfM7OFUXw/PJDYzGDTkRyp54hgc4vwwKmxcYxJgtzASTHErWCC4vFtxdGKJRbo5paHHiaMKXyYKGCoCf23gIAZKftWrCP9JQam7CiQ4WvsTUQ0wizTTUyqE4uymzT5QgPjkNchhtuGW6MszVyx1KCTg0pSliY5j1mfsQ= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1787735966; c=relaxed/simple; bh=zBxULgvDHXazZ5SMZOlYLubW+VhR2VpJTUrx3o4CGAE=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=MFnwgjEkTtQoogt3tNOvegvJkskJFUy3itccfCE3tEYe5lG2KbNjRAr/CzetVEec+3HFn53VNk/WkK0faxFswrhvxv6Gj+qfWZlhTqnzN3l+BQGaKR+4g8unD33tMiEhOuhy4i2P3oI/JDSkBQzVRh+g7Fz2wL7CF+dsnex9AOY= 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=vZwFmzEW; arc=none smtp.client-ip=209.85.214.197 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="vZwFmzEW" Received: by mail-pl1-f197.google.com with SMTP id d9443c01a7336-2d63bad3d09so12881905ad.3 for ; Wed, 26 Aug 2026 02:19:21 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20251104; t=1787735960; x=1788340760; darn=vger.kernel.org; h=content-type:cc:to:from:subject:message-id:references:mime-version :in-reply-to:date:from:to:cc:subject:date:message-id:reply-to :content-type; bh=y+F0RPt2BIQhoyPunxbW8b7PnDA004/ENVxwXm2SdeA=; b=vZwFmzEWqfFY1KFRob6r8DClY0K1Tg65Oagb3gsz/2h/lczmMaVfVdc0Lux8OXsIRe V0ImJrnPvnlWb8yDAeJvcNMWWIvQeGbeDmD+1NBix24c4A9XbfPUrDonMnvfJ8shGILL eLyUgceTFuiM7gAxhBe46lyzvWMSAUyQvvikvFwRx0dlgq+TtnfkBj8CRGRzgEaNzX7M QPxcOaXzJ2oc6A7HxEvoRkbKbipQInibG8/hAO/+4NYkmSLZcZ+DZ0HE1tS8JmJtKLvL QUuB/tllsInA6u2hIKa7VaDazUzaTo9hmS8TMy7YrzsxIJJT5JA8WnEu+y4pcNJ2NstR vqVg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1787735960; x=1788340760; h=content-type: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:content-type; bh=y+F0RPt2BIQhoyPunxbW8b7PnDA004/ENVxwXm2SdeA=; b=q5PGyOsM0pzjBz2iBx7okthLg2dVHivhQrw1BbGL0HHGbXXUAhyoUj3ojRvPajC6MP aewVkwYSpiqs2ckQpgtZivXBZz+e0Fu0ehHBy63lUU98DmiE5L/Gk3gpv2PVK6wc4wHi 2ZMPv9EQ2DgGm15wRLYiTjJx2cWvXjB7dAXvf+b4elL/vNlSfuN9RG97TBhTkAT+oAur CYO/mFhONovE3HgCqsf8XpFy+JLSpYhV2PI9SC/y+wxZPzj2XbnMF048xesX88Jwj7cr 1tmo1hPfpG2F8f0EAJF15E84bdX3AGSBKa8sDZym+YLSTZzTXmHiaiKV1mPXWTh0hopC Weog== X-Forwarded-Encrypted: i=1; AHgh+RpBfIfZK9ve0ncQA4H9DNIMpmDs4/m63BBJP5MgHpSvrGLSywlMd0+BvODmOn68wutO0jr7Vjzskq4xO6Y=@vger.kernel.org X-Gm-Message-State: AFuF++kvykOL4ycVU6PLkQRpKzqUuEHjcWwX3UVbHJfol6EgOwvlgSZ6 vDUpxQPPyt4UAeKMc9bcw7rZdYpltFtG+L9z2GXWBzwK2WrXvWwN5hjR877ilwrXxPEsZl4ilUi fkxoWxPZojLY+uP/ZTcoog/3fSg== X-Received: from plbmo14.prod.google.com ([2002:a17:903:a8e:b0:2d7:ffd:f2e1]) (user=ackerleytng job=prod-delivery.src-stubby-dispatcher) by 2002:a17:903:2341:b0:2c7:ebfb:618f with SMTP id d9443c01a7336-2d707c1020emr84178295ad.14.1787735959205; Wed, 26 Aug 2026 02:19:19 -0700 (PDT) Date: Wed, 26 Aug 2026 09:18:40 +0000 In-Reply-To: <20260826-gmem-inplace-conversion-v11-0-0a15d8a799aa@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20260826-gmem-inplace-conversion-v11-0-0a15d8a799aa@google.com> X-Developer-Key: i=ackerleytng@google.com; a=ed25519; pk=sAZDYXdm6Iz8FHitpHeFlCMXwabodTm7p8/3/8xUxuU= X-Developer-Signature: v=1; a=ed25519-sha256; t=1787735885; l=5392; i=ackerleytng@google.com; s=20260225; h=from:subject:message-id; bh=zBxULgvDHXazZ5SMZOlYLubW+VhR2VpJTUrx3o4CGAE=; b=+mJZCtE3M/fpif61DFhZWRV1ZVlRrS/x8em+v7Rtj8f6DsVsyejLGAIvq4yHWa8TuuNUlbwVB Awqh72Q64bmCf7zIodrA5VJ3FcKFjlgLjcwCp6uM5anzbVnjZMTBAOM X-Mailer: b4 0.16.0 Message-ID: <20260826-gmem-inplace-conversion-v11-42-0a15d8a799aa@google.com> Subject: [PATCH v11 42/46] 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, jmattson@google.com, jthoughton@google.com, michael.roth@amd.com, oupton@kernel.org, pankaj.gupta@amd.com, qperret@google.com, rick.p.edgecombe@intel.com, rientjes@google.com, shivankg@amd.com, steven.price@arm.com, willy@infradead.org, wyihan@google.com, yan.y.zhao@intel.com, forkloop@google.com, pratyush@kernel.org, suzuki.poulose@arm.com, aneesh.kumar@kernel.org, liam@infradead.org, Paolo Bonzini , Sean Christopherson , Thomas Gleixner , Ingo Molnar , Borislav Petkov , Dave Hansen , x86@kernel.org, "H. Peter Anvin" , Steven Rostedt , Masami Hiramatsu , Mathieu Desnoyers , Jonathan Corbet , Shuah Khan , Shuah Khan , Vishal Annapurve , Andrew Morton , Chris Li , Kairui Song , Kemeng Shi , Nhat Pham , Barry Song , Axel Rasmussen , Yuanchu Xie , Wei Xu , Youngjun Park , Qi Zheng , Shakeel Butt , Kiryl Shutsemau , Baoquan He , Jason Gunthorpe , John Hubbard , Peter Xu , tarunsahu@google.com, Fuad Tabba , Vlastimil Babka Cc: kvm@vger.kernel.org, linux-kernel@vger.kernel.org, linux-trace-kernel@vger.kernel.org, linux-doc@vger.kernel.org, linux-kselftest@vger.kernel.org, linux-mm@kvack.org, linux-coco@lists.linux.dev, 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. Reviewed-by: Fuad Tabba Tested-by: Shivank Garg 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 d5825211f2727..75e98ec14107f 100644 --- a/tools/testing/selftests/kvm/include/test_util.h +++ b/tools/testing/selftests/kvm/include/test_util.h @@ -83,21 +83,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 volatile sig_atomic_t expecting_sigbus; +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 1188d0a6c0a5f..cac5624e99774 100644 --- a/tools/testing/selftests/kvm/lib/kvm_util.c +++ b/tools/testing/selftests/kvm/lib/kvm_util.c @@ -2316,13 +2316,20 @@ __weak void kvm_selftest_arch_init(void) { } =20 -static void report_unexpected_signal(int signum) +__thread sigjmp_buf expect_sigbus_jmpbuf; +__thread volatile sig_atomic_t expecting_sigbus; + +void catchall_signal_handler(int signum) { + switch (signum) { + case SIGBUS: { + if (expecting_sigbus) + siglongjmp(expect_sigbus_jmpbuf, 1); + + TEST_FAIL("Unexpected SIGBUS (%d)\n", signum); + } #define KVM_CASE_SIGNUM(sig) \ case sig: TEST_FAIL("Unexpected " #sig " (%d)\n", signum) - - switch (signum) { - KVM_CASE_SIGNUM(SIGBUS); KVM_CASE_SIGNUM(SIGSEGV); KVM_CASE_SIGNUM(SIGILL); KVM_CASE_SIGNUM(SIGFPE); @@ -2334,12 +2341,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 4dff72f6bd346..89d6d1b572959 100644 --- a/tools/testing/selftests/kvm/lib/test_util.c +++ b/tools/testing/selftests/kvm/lib/test_util.c @@ -19,13 +19,6 @@ #include "test_util.h" #include "kvm_syscalls.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.55.0.887.g758fc8c411-goog From nobody Mon Sep 28 04:51:20 2026 Received: from mail-pl1-f199.google.com (mail-pl1-f199.google.com [209.85.214.199]) (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 BE7AE3C1D6E for ; Wed, 26 Aug 2026 09:19:23 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.199 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1787735969; cv=none; b=Gi2eDYwzh+hdo3pTLoFx3f3XY+9oWBCFyEZklh6yHFPFng+cGVFRFj4DIUJumwgbO8XR+inV6JaFxBspPnKyccC9Ro+Rx+08QMBI5lzuP8kKRu9uVyGx9VGImoiT5Mwvmp3yKJro8iCdb4CnI5fm/OYDfnHcIIXLA1pVzI/GrOk= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1787735969; c=relaxed/simple; bh=Fuuvvm9TGdHzuyGqmCG/7y25PwPAioa9a5TcO7RLGpo=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=pBpHN+d2ZBAnSxs9/wrPrOxU4YoIbYI6YrZHwuVZCIRojmgvQDEUvn0X+mN1iSHIHx8+6+rzEJ7VIyFTxIJ3ZAkQcw7ADEnCoYxnU72VkfUSJ+rqCxJ3PMDYSG4+RZHOs/AFc3FhEYigptagxwZe4HoiU5+3imUeF+8ZP3BVfCg= 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=k0jJjNeF; arc=none smtp.client-ip=209.85.214.199 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="k0jJjNeF" Received: by mail-pl1-f199.google.com with SMTP id d9443c01a7336-2d6df0a1e18so9996035ad.1 for ; Wed, 26 Aug 2026 02:19:23 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20251104; t=1787735961; x=1788340761; darn=vger.kernel.org; h=content-type:cc:to:from:subject:message-id:references:mime-version :in-reply-to:date:from:to:cc:subject:date:message-id:reply-to :content-type; bh=AXWpWryZ0kD4G5nvWBMzBSxCtH4Le24D342gsqcLpvE=; b=k0jJjNeFLc2D82MWHL6TxpzlDdpQSBQrY+rxF+X/4IDQwLDdfAZ9gOmpPQmxwFWJr1 wnpmmMGiTtgv7H34zZwzpv/OnCV48K1S177DPll4DDMX3yk4eJU6ZfV7s2iWweghHJ+W Ne9rSyMaG+hlMVtQWP4hfT/XBPWxY7EOpDvxaWbH1L/8dT2ByxoNkN/EaPnM3SY2+J8c dcQ4WSYWdhDTTGr1xR6obzvrYhCVTZUCPetn6E78sj+YGaLoJ8YscvUfdFZzfuUnFK5H qG74jS5u17OEzGANXPkcFDBGvmHK5q0QFA6Ow/Z0o/lfhJO7ROTVj8PC5JnAPN7h15Y2 52XA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1787735961; x=1788340761; h=content-type: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:content-type; bh=AXWpWryZ0kD4G5nvWBMzBSxCtH4Le24D342gsqcLpvE=; b=SJzl+INCWyROfYlaVPkABHAUomxEs+XtvgyZGthJPRx0oeqybyyi7KV1lhF8zqc2WT l+w5myQTRQlkhAGJ9O6MOQYOlrVoejIReE7v88514vl+vXsAoVtz9sy691uoR7z1Ex7q vjd7Uwzwn3/3lybd9ho11KnIU1wqTurD8zTJSzGI5iFvyC/+rcbk1Ph6nXUHKSFaeyK1 F5b0lz2LmJ11jHdkgvVBIC5h7aE8e4Q7DBdEjTYBFw3YDNtnmDAv1uh+csq1anZz4KgK Ukm5F7p4YP1miLErxAIIPYMmg37sqNZio/XO/UMv8bEkZA6n8GOvHz2vP5GB91bfo8EB DwwQ== X-Forwarded-Encrypted: i=1; AHgh+RpF79ED3zAxHfg3pwxx7cBMdPdIeWHslu2GYz7cImrdcV+vm+1P0BqlITp9YeKjaQZ8lPczMnARR25NMqM=@vger.kernel.org X-Gm-Message-State: AFuF++kvQaajW3TtO1nPPqdjeMp9ew+NAfivZ8nTZv0G8dBjZ+Grn6Rg icKWJnQowRwcTV7n36Z9sVHT5T/QM71UDr4cj4Or0AlbrHeVSNI2LIY+ZPogk0q/EaVs5038y87 XwqT4EHrJ3pp0GpP0xU9SFfMNgg== X-Received: from plda6.prod.google.com ([2002:a17:902:ee86:b0:2d6:6745:22e7]) (user=ackerleytng job=prod-delivery.src-stubby-dispatcher) by 2002:a17:903:22ca:b0:2d6:fd55:3a9d with SMTP id d9443c01a7336-2d707a55a21mr87469675ad.3.1787735960956; Wed, 26 Aug 2026 02:19:20 -0700 (PDT) Date: Wed, 26 Aug 2026 09:18:41 +0000 In-Reply-To: <20260826-gmem-inplace-conversion-v11-0-0a15d8a799aa@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20260826-gmem-inplace-conversion-v11-0-0a15d8a799aa@google.com> X-Developer-Key: i=ackerleytng@google.com; a=ed25519; pk=sAZDYXdm6Iz8FHitpHeFlCMXwabodTm7p8/3/8xUxuU= X-Developer-Signature: v=1; a=ed25519-sha256; t=1787735885; l=2538; i=ackerleytng@google.com; s=20260225; h=from:subject:message-id; bh=Fuuvvm9TGdHzuyGqmCG/7y25PwPAioa9a5TcO7RLGpo=; b=+J4GD33/HdpdrEFr5MrH+KM1LHa2vckCr8RaWwO2SO5eEYH0A5e7TGCzVEy+C6S/XAfzoI+YF gewtvjSJTvnBccflyC8pq4jmTvD+cMIRcYwK2FB6Bp6gHJiHCOw27HK X-Mailer: b4 0.16.0 Message-ID: <20260826-gmem-inplace-conversion-v11-43-0a15d8a799aa@google.com> Subject: [PATCH v11 43/46] KVM: selftests: Support guest_memfd attributes in 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, jmattson@google.com, jthoughton@google.com, michael.roth@amd.com, oupton@kernel.org, pankaj.gupta@amd.com, qperret@google.com, rick.p.edgecombe@intel.com, rientjes@google.com, shivankg@amd.com, steven.price@arm.com, willy@infradead.org, wyihan@google.com, yan.y.zhao@intel.com, forkloop@google.com, pratyush@kernel.org, suzuki.poulose@arm.com, aneesh.kumar@kernel.org, liam@infradead.org, Paolo Bonzini , Sean Christopherson , Thomas Gleixner , Ingo Molnar , Borislav Petkov , Dave Hansen , x86@kernel.org, "H. Peter Anvin" , Steven Rostedt , Masami Hiramatsu , Mathieu Desnoyers , Jonathan Corbet , Shuah Khan , Shuah Khan , Vishal Annapurve , Andrew Morton , Chris Li , Kairui Song , Kemeng Shi , Nhat Pham , Barry Song , Axel Rasmussen , Yuanchu Xie , Wei Xu , Youngjun Park , Qi Zheng , Shakeel Butt , Kiryl Shutsemau , Baoquan He , Jason Gunthorpe , John Hubbard , Peter Xu , tarunsahu@google.com, Fuad Tabba , Vlastimil Babka Cc: kvm@vger.kernel.org, linux-kernel@vger.kernel.org, linux-trace-kernel@vger.kernel.org, linux-doc@vger.kernel.org, linux-kselftest@vger.kernel.org, linux-mm@kvack.org, linux-coco@lists.linux.dev, Ackerley Tng , Xiaoyao Li Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Update private_mem_conversions_test to support environments where guest_memfd tracks memory attributes. At guest_memfd setup time, initialize the guest_memfd as shared to align with how memory would default to shared when shared/private state was tracked at the VM level. When handling a hypercall to set attributes, use vm_mem_set_memory_attributes() to send the ioctl to the guest_memfd instead of the VM. Suggested-by: Xiaoyao Li Signed-off-by: Ackerley Tng --- .../selftests/kvm/x86/private_mem_conversions_test.c | 18 +++++++++++++-= ---- 1 file changed, 13 insertions(+), 5 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 cf50e9a332c5b..0c94e36575a5e 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,12 @@ static void handle_exit_hypercall(struct kvm_vcpu *vcp= u) if (do_fallocate) vm_guest_mem_fallocate(vm, gpa, size, map_shared); =20 - if (set_attributes) - vm_set_memory_attributes(vm, gpa, size, - map_shared ? 0 : KVM_MEMORY_ATTRIBUTE_PRIVATE); + if (set_attributes) { + u64 attrs =3D map_shared ? 0 : KVM_MEMORY_ATTRIBUTE_PRIVATE; + + vm_mem_set_memory_attributes(vm, gpa, size, attrs); + } + run->hypercall.ret =3D 0; } =20 @@ -383,6 +386,7 @@ static void test_mem_conversions(enum vm_mem_backing_sr= c_type src_type, u32 nr_v struct kvm_vcpu *vcpus[KVM_MAX_VCPUS]; pthread_t threads[KVM_MAX_VCPUS]; struct kvm_vm *vm; + u64 gmem_flags; int memfd, i; =20 const struct vm_shape shape =3D { @@ -397,12 +401,16 @@ static void test_mem_conversions(enum vm_mem_backing_= src_type src_type, u32 nr_v =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); + gmem_flags =3D 0; + if (kvm_has_gmem_attributes) + gmem_flags |=3D GUEST_MEMFD_FLAG_INIT_SHARED; + + 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++) { gpa_t gpa =3D BASE_DATA_GPA + i * per_cpu_size; --=20 2.55.0.887.g758fc8c411-goog From nobody Mon Sep 28 04:51:20 2026 Received: from mail-pg1-f198.google.com (mail-pg1-f198.google.com [209.85.215.198]) (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 5CFF640DB3F for ; Wed, 26 Aug 2026 09:19:25 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.215.198 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1787735969; cv=none; b=U2GI67CejMTcU/5mUo7V9U6oF46YzK1GFjyItXS2wHIjfWLbab17S+5dKAyYiVBCkr0J6ze3mct5PXKrPMXiJ3kA11Xeb7GxhJU4ZOwo6EyBXEMF0a3ve3wPb6xtKUDtX1RcCNQOmZOIczg7hL6AzuIqk6sbGYxQI0D4W0kpz5U= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1787735969; c=relaxed/simple; bh=sPZHu6CIw+fRiMalmPEts6Uh4jsHKlHCx6VuhBaSH7g=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=PpltTcW3hhFHjPMFQkpQHjQ1OTgAeo4Im6fMNlRiXu0KYxE3FL855GvXWvqBvg71Wk4tb/TW4m573Z6fKEIICNnJYaVo4UZGIJux2a9Imc2QmB6IlkIoJP8y6HMPr0QE4Gl4S5bhmkIAgJRjg0hZPtnZr8UCCvq6ZZhDKdjLhx4= 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=tufxxKrQ; arc=none smtp.client-ip=209.85.215.198 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="tufxxKrQ" Received: by mail-pg1-f198.google.com with SMTP id 41be03b00d2f7-cc1b6f65dacso1004324a12.1 for ; Wed, 26 Aug 2026 02:19:25 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20251104; t=1787735963; x=1788340763; darn=vger.kernel.org; h=content-type:cc:to:from:subject:message-id:references:mime-version :in-reply-to:date:from:to:cc:subject:date:message-id:reply-to :content-type; bh=jz7w3ahlJ2XXJ+zdKH+uz7IHVQmm2wlsntFHCBVHzEo=; b=tufxxKrQOTK6eS9XSEKIoVR0V1GOmYPXnim9uIvkRu5aS7HAt/ilPZy7sG/JlXG6RA gmi8xH9dbMtGU01AUffdkISLUMHAXZ44Pyn2QugUa0ucC3mMEwf6uNoTr8eM57ib2JYf YgNrWp7nNIXp844JTXyfm27wTlICKt0Urf3z0n7snBOLUatwQZ48oihPnNihdFNAOHEA 7AY9uAsb85M8duCv+hCMoet4TY08ocflV1D19OUDmw/89Imev/QUb6NhzNws2iiMdLQc qdY+mTe0EV5oSIwRrL0EoImWYVrmIamuw0DE73ThSlpa8T4NOvOGOWbFH95kXWPrmUt5 76YA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1787735963; x=1788340763; h=content-type: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:content-type; bh=jz7w3ahlJ2XXJ+zdKH+uz7IHVQmm2wlsntFHCBVHzEo=; b=lh5Tcf3NTddxZvglDJUz/1C41ittc/KzK8XLjux+Vs8rT+6Hox0qDdIEpruMGpnbY3 jZKcyy8TPDgJyze1hf/2+cg4ZCKu6WP59ZOjjuUg4BAMIT+WRvhCCYxaILSlznen2Ayr g06V6Xm8kNmD376b5+KotH8YJJxAz8BcpDY6obc0BwBS7wdb0ozsN/97zOaPVJ80v5Tv znLmPf34xPOGCvBVEkFmAGhCQEyEBiofynMlJXSsBUxYHXhH8ETmoQPpx8WoOLG66iVs sjXtuXtpj6MN7yl+ShPti4TAqs9+Ga9D1VKkhliIqzdFGIqLiBebfved8GYCWNXuF/KC 6NXA== X-Forwarded-Encrypted: i=1; AHgh+RqGkXjKDQ3BRzW2pcY79tygejioXxVnB+xL7yToSCJj+BRks4dg6YVimGAoWes6c57JReTkYRTCIlF27Nc=@vger.kernel.org X-Gm-Message-State: AFuF++mavD1ORELmig74mkOI/kblzuvJrKXbLrW1LZbFVdY1p88FPXgS dfyDUHXoOUCoRfACwB4khJSR6+3WpqhPHFcPzSc3SDB0x61Ayk94s5/n8vTOLSBV3c5Nj7zlR6L csWeZAfQ5fbqldBZxdmI7adOo1Q== X-Received: from pgbcr9.prod.google.com ([2002:a05:6a02:4109:b0:cbe:e120:3788]) (user=ackerleytng job=prod-delivery.src-stubby-dispatcher) by 2002:a05:6a00:bb0e:b0:847:8acd:747c with SMTP id d2e1a72fcca58-85374ebe486mr8878186b3a.13.1787735962670; Wed, 26 Aug 2026 02:19:22 -0700 (PDT) Date: Wed, 26 Aug 2026 09:18:42 +0000 In-Reply-To: <20260826-gmem-inplace-conversion-v11-0-0a15d8a799aa@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20260826-gmem-inplace-conversion-v11-0-0a15d8a799aa@google.com> X-Developer-Key: i=ackerleytng@google.com; a=ed25519; pk=sAZDYXdm6Iz8FHitpHeFlCMXwabodTm7p8/3/8xUxuU= X-Developer-Signature: v=1; a=ed25519-sha256; t=1787735885; l=5603; i=ackerleytng@google.com; s=20260225; h=from:subject:message-id; bh=sPZHu6CIw+fRiMalmPEts6Uh4jsHKlHCx6VuhBaSH7g=; b=bc/CQRB4ghM7RBxbU4UEgzRadqchF8JqcorHB5X+jTCT4Ow+7Y+I0O0F99fDiLd5s3UobJ854 7jfsBkZtDy0AJ7cv9qPJR7hlIRFbgTbM0OIMWLsXAcqj1brU61YZrtq X-Mailer: b4 0.16.0 Message-ID: <20260826-gmem-inplace-conversion-v11-44-0a15d8a799aa@google.com> Subject: [PATCH v11 44/46] KVM: selftests: Set up page size and alignment independently for 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, jmattson@google.com, jthoughton@google.com, michael.roth@amd.com, oupton@kernel.org, pankaj.gupta@amd.com, qperret@google.com, rick.p.edgecombe@intel.com, rientjes@google.com, shivankg@amd.com, steven.price@arm.com, willy@infradead.org, wyihan@google.com, yan.y.zhao@intel.com, forkloop@google.com, pratyush@kernel.org, suzuki.poulose@arm.com, aneesh.kumar@kernel.org, liam@infradead.org, Paolo Bonzini , Sean Christopherson , Thomas Gleixner , Ingo Molnar , Borislav Petkov , Dave Hansen , x86@kernel.org, "H. Peter Anvin" , Steven Rostedt , Masami Hiramatsu , Mathieu Desnoyers , Jonathan Corbet , Shuah Khan , Shuah Khan , Vishal Annapurve , Andrew Morton , Chris Li , Kairui Song , Kemeng Shi , Nhat Pham , Barry Song , Axel Rasmussen , Yuanchu Xie , Wei Xu , Youngjun Park , Qi Zheng , Shakeel Butt , Kiryl Shutsemau , Baoquan He , Jason Gunthorpe , John Hubbard , Peter Xu , tarunsahu@google.com, Fuad Tabba , Vlastimil Babka Cc: kvm@vger.kernel.org, linux-kernel@vger.kernel.org, linux-trace-kernel@vger.kernel.org, linux-doc@vger.kernel.org, linux-kselftest@vger.kernel.org, linux-mm@kvack.org, linux-coco@lists.linux.dev, Ackerley Tng Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Currently, vm_mem_add derives the backing source page size, alignment padding, and mmap size from the backing source type upfront before checking if guest_memfd is being mmapped. With shared memory also mmap()-ed from guest_memfd, the alignment of the mmap-ed address needs to respect guest_memfd's backing page size. Refactor the backing store setup to configure the backing source page size, alignment, mmap flags, and mmap offset directly for guest_memfd when it is mmapped, ignoring the backing source type. Skip hugepage validation and anonymous memory madvise calls when mmapping from guest_memfd, since those are not applicable when mmapping guest_memfd. Signed-off-by: Ackerley Tng --- tools/testing/selftests/kvm/lib/kvm_util.c | 74 ++++++++++++++++++--------= ---- 1 file changed, 45 insertions(+), 29 deletions(-) diff --git a/tools/testing/selftests/kvm/lib/kvm_util.c b/tools/testing/sel= ftests/kvm/lib/kvm_util.c index cac5624e99774..3f559f207408f 100644 --- a/tools/testing/selftests/kvm/lib/kvm_util.c +++ b/tools/testing/selftests/kvm/lib/kvm_util.c @@ -1034,11 +1034,12 @@ void vm_mem_add(struct kvm_vm *vm, enum vm_mem_back= ing_src_type src_type, { int ret; struct userspace_mem_region *region; - size_t backing_src_pagesz =3D get_backing_src_pagesz(src_type); - int mmap_flags =3D vm_mem_backing_src_alias(src_type)->flag; size_t mem_size =3D npages * vm->page_size; - off_t mmap_offset =3D 0; - size_t alignment =3D 1; + size_t backing_src_pagesz; + off_t mmap_offset; + bool is_gmem_mmap; + size_t alignment; + int mmap_flags; =20 TEST_REQUIRE_SET_USER_MEMORY_REGION2(); =20 @@ -1090,19 +1091,31 @@ void vm_mem_add(struct kvm_vm *vm, enum vm_mem_back= ing_src_type src_type, /* Allocate and initialize new mem region structure. */ region =3D calloc(1, sizeof(*region)); TEST_ASSERT(region !=3D NULL, "Insufficient Memory"); - region->mmap_size =3D mem_size; =20 - /* - * When using THP mmap is not guaranteed to returned a hugepage aligned - * address so we have to pad the mmap. Padding is not needed for HugeTLB - * because mmap will always return an address aligned to the HugeTLB - * page size. - */ - if (src_type =3D=3D VM_MEM_SRC_ANONYMOUS_THP) - alignment =3D max(backing_src_pagesz, alignment); + is_gmem_mmap =3D (flags & KVM_MEM_GUEST_MEMFD) && + (gmem_flags & GUEST_MEMFD_FLAG_MMAP); + + if (is_gmem_mmap) { + backing_src_pagesz =3D getpagesize(); + alignment =3D 1; + mmap_flags =3D MAP_SHARED; + mmap_offset =3D gmem_offset; + } else { + backing_src_pagesz =3D get_backing_src_pagesz(src_type); + /* + * When using THP mmap is not guaranteed to returned a hugepage aligned + * address so we have to pad the mmap. Padding is not needed for HugeTLB + * because mmap will always return an address aligned to the HugeTLB + * page size. + */ + alignment =3D src_type =3D=3D VM_MEM_SRC_ANONYMOUS_THP ? backing_src_pag= esz : 1; + mmap_flags =3D vm_mem_backing_src_alias(src_type)->flag; + mmap_offset =3D 0; + } =20 TEST_ASSERT_EQ(gpa, align_up(gpa, backing_src_pagesz)); =20 + region->mmap_size =3D mem_size; /* Add enough memory to align up if necessary */ if (alignment > 1) region->mmap_size +=3D alignment; @@ -1129,10 +1142,8 @@ void vm_mem_add(struct kvm_vm *vm, enum vm_mem_backi= ng_src_type src_type, } =20 region->fd =3D -1; - if (flags & KVM_MEM_GUEST_MEMFD && gmem_flags & GUEST_MEMFD_FLAG_MMAP) { + if (is_gmem_mmap) { region->fd =3D kvm_dup(gmem_fd); - mmap_flags =3D MAP_SHARED; - 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); @@ -1141,22 +1152,27 @@ void vm_mem_add(struct kvm_vm *vm, enum vm_mem_back= ing_src_type src_type, region->mmap_start =3D __kvm_mmap(region->mmap_size, PROT_READ | PROT_WRI= TE, mmap_flags, 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), - "mmap_start %p is not aligned to HugeTLB page size 0x%lx", - region->mmap_start, backing_src_pagesz); - /* Align host address */ region->host_mem =3D align_ptr_up(region->mmap_start, alignment); =20 - /* As needed perform madvise */ - if ((src_type =3D=3D VM_MEM_SRC_ANONYMOUS || - src_type =3D=3D VM_MEM_SRC_ANONYMOUS_THP) && thp_configured()) { - ret =3D madvise(region->host_mem, mem_size, - src_type =3D=3D VM_MEM_SRC_ANONYMOUS ? MADV_NOHUGEPAGE : MADV_HUG= EPAGE); - TEST_ASSERT(ret =3D=3D 0, "madvise failed, addr: %p length: 0x%lx src_ty= pe: %s", - region->host_mem, mem_size, - vm_mem_backing_src_alias(src_type)->name); + if (!is_gmem_mmap) { + TEST_ASSERT(!is_backing_src_hugetlb(src_type) || + region->mmap_start =3D=3D + align_ptr_up(region->mmap_start, backing_src_pagesz), + "mmap_start %p is not aligned to HugeTLB page size 0x%lx", + region->mmap_start, backing_src_pagesz); + + /* As needed perform madvise */ + if ((src_type =3D=3D VM_MEM_SRC_ANONYMOUS || + src_type =3D=3D VM_MEM_SRC_ANONYMOUS_THP) && thp_configured()) { + int advice =3D src_type =3D=3D VM_MEM_SRC_ANONYMOUS ? + MADV_NOHUGEPAGE : MADV_HUGEPAGE; + + ret =3D madvise(region->host_mem, mem_size, advice); + TEST_ASSERT(ret =3D=3D 0, "madvise failed, addr: %p length: 0x%lx src_t= ype: %s", + region->host_mem, mem_size, + vm_mem_backing_src_alias(src_type)->name); + } } =20 region->backing_src_type =3D src_type; --=20 2.55.0.887.g758fc8c411-goog From nobody Mon Sep 28 04:51:20 2026 Received: from mail-pl1-f199.google.com (mail-pl1-f199.google.com [209.85.214.199]) (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 2A6B14078CF for ; Wed, 26 Aug 2026 09:19:26 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.199 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1787735971; cv=none; b=FhSY0NMDIWJpWXl0YKZEKg1tAe4MenfugFMqnerU/CLwtOeqyaZIDpTeNM5jAwHAVMjaIjtaKbJHD15IQg4wWpLK0IXz222ZUZRlwiffUVcwdg9wryjLC16urEgN8sLUlHmui0fpWWqQpi4VuepoxaBM0yST71W/k2g0MJpM7Jg= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1787735971; c=relaxed/simple; bh=xH/AetAOiAVfkVCScjPegESZvTMnvecRQ5W1mdHVya8=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=nOZhy+PJoy+61LHWCWPrb0nMlwL+oHg/zeV23THW7rh28waLLG6i0nf1XoT0KvS/xZPT/dD/bVbSwoKwsOWAPOJuKTOhrFiEQgBS/P7Y/j2jBJ3qVVCu1WyzwJjFx8JqU1jbneqK0y9EsoQmxF/2EESG5YwTMPXmkLeKqOBflzQ= 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=MQh8jYum; arc=none smtp.client-ip=209.85.214.199 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="MQh8jYum" Received: by mail-pl1-f199.google.com with SMTP id d9443c01a7336-2d6fb956002so11304125ad.1 for ; Wed, 26 Aug 2026 02:19:26 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20251104; t=1787735965; x=1788340765; darn=vger.kernel.org; h=content-type:cc:to:from:subject:message-id:references:mime-version :in-reply-to:date:from:to:cc:subject:date:message-id:reply-to :content-type; bh=LbRUvfXufo/53FByarAgnrpLej2qb+vPYL1z/tXSG2A=; b=MQh8jYume8kgOW0PmRHAAPtFvC3oywCIURzp1pX9JsM3QXIYEOrxEreHL6jYEdlK5U AgbkXCy7kEp404NBpZuFPpqvfx+LeXrhOeUil4PZlM899c2iY7gRhNZNIZiK/+KLKQnf uR1yFC5z2xRLIgd5FmjdjMFhYa7zIBlP7ak1fmOv5uOQKF3W8ldMk1EUQnyG2it9XUCU Ta78NZ7qxFufeXZqGBsYyZzclGiDGcErwVcwp0K/aI9chXxzplJsSrSyzvPN0FhtUvmT S3giB5/FxOZNtIqkJ9v5ho86W0S8gMCk+vXbW9VuzEWoFSN/j/KnkiJOHhR3A7ORGh8J tNGA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1787735965; x=1788340765; h=content-type: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:content-type; bh=LbRUvfXufo/53FByarAgnrpLej2qb+vPYL1z/tXSG2A=; b=qNT3LSCoJbOM0LFFacufA+/Q2mMUZUDEO8l7lHGyEP/PjT+hzKrj9lg3u+9/+f8cdX nL85amKUqhGRnCYg2L2ZT8lfd0dgAIvF5KU2JOWR0vepujWNeiHsHUt1sGBY3ggWDCiM 7D/RP4Z1EdOI+frAxzabeowP2YaQY3h7jxoSTyrq+U1JT8xR0OM2Nb+342GHHSa5nN73 p3kHtlZWrRbz90yZAxB17CR0vWPzBzPFD74zDOB1yHN0WF1evmFEinC9fzLXuXYWAd+J k9VW/QLrl4gexOiYHVLxytvQf3eBVpbnePEN6j5yXTa5fBuvhTdbFdXwVPlah4p7Fm7v 0tXQ== X-Forwarded-Encrypted: i=1; AHgh+RoQ74Un8aV9rd2NsSED9FJm5dZn9KkK5/nEGfWfdWUMYCuGBXBn5tT34FQQJpCTRGatNuKZV63zcx3KJjA=@vger.kernel.org X-Gm-Message-State: AFuF++nr0g3IfBjxKtJz/9bZFlWkWsXx2Qca8YpLIpyGJVh6rfvoqflB ycqx3V4iSrLZas6vkef7vDXQhzgyUMF6sPf6PVMPhNpacdOOxeyWIiEuz+M782foiJ8EyaAf3+6 g5IlhLwWSt5y9mWzfTz72TL3cYA== X-Received: from plbmo15.prod.google.com ([2002:a17:903:a8f:b0:2cf:bf3e:41f0]) (user=ackerleytng job=prod-delivery.src-stubby-dispatcher) by 2002:a17:902:e54f:b0:2c0:a555:80d6 with SMTP id d9443c01a7336-2d707a2f08bmr89613835ad.2.1787735964425; Wed, 26 Aug 2026 02:19:24 -0700 (PDT) Date: Wed, 26 Aug 2026 09:18:43 +0000 In-Reply-To: <20260826-gmem-inplace-conversion-v11-0-0a15d8a799aa@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20260826-gmem-inplace-conversion-v11-0-0a15d8a799aa@google.com> X-Developer-Key: i=ackerleytng@google.com; a=ed25519; pk=sAZDYXdm6Iz8FHitpHeFlCMXwabodTm7p8/3/8xUxuU= X-Developer-Signature: v=1; a=ed25519-sha256; t=1787735885; l=5438; i=ackerleytng@google.com; s=20260225; h=from:subject:message-id; bh=xH/AetAOiAVfkVCScjPegESZvTMnvecRQ5W1mdHVya8=; b=rBjdK8/qbBIySb4GV8EG74eZYYgnmFDHuYJd/UqCRYD0UNnjEq1/oCm1vlkEqhjZzxSbXcN7L +83jZ96iK2MDTs6i5y0XZawZfieoRqtZqJPahiBUo5v1PNUnNYnk+8w X-Mailer: b4 0.16.0 Message-ID: <20260826-gmem-inplace-conversion-v11-45-0a15d8a799aa@google.com> Subject: [PATCH v11 45/46] KVM: selftests: Test in-place conversions in 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, jmattson@google.com, jthoughton@google.com, michael.roth@amd.com, oupton@kernel.org, pankaj.gupta@amd.com, qperret@google.com, rick.p.edgecombe@intel.com, rientjes@google.com, shivankg@amd.com, steven.price@arm.com, willy@infradead.org, wyihan@google.com, yan.y.zhao@intel.com, forkloop@google.com, pratyush@kernel.org, suzuki.poulose@arm.com, aneesh.kumar@kernel.org, liam@infradead.org, Paolo Bonzini , Sean Christopherson , Thomas Gleixner , Ingo Molnar , Borislav Petkov , Dave Hansen , x86@kernel.org, "H. Peter Anvin" , Steven Rostedt , Masami Hiramatsu , Mathieu Desnoyers , Jonathan Corbet , Shuah Khan , Shuah Khan , Vishal Annapurve , Andrew Morton , Chris Li , Kairui Song , Kemeng Shi , Nhat Pham , Barry Song , Axel Rasmussen , Yuanchu Xie , Wei Xu , Youngjun Park , Qi Zheng , Shakeel Butt , Kiryl Shutsemau , Baoquan He , Jason Gunthorpe , John Hubbard , Peter Xu , tarunsahu@google.com, Fuad Tabba , Vlastimil Babka Cc: kvm@vger.kernel.org, linux-kernel@vger.kernel.org, linux-trace-kernel@vger.kernel.org, linux-doc@vger.kernel.org, linux-kselftest@vger.kernel.org, linux-mm@kvack.org, linux-coco@lists.linux.dev, Ackerley Tng Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Test in-place conversions by setting up the guest with a single backing, using the same guest_memfd for both private and shared memory. Make testing single backing the default when per-guest_memfd memory attributes are supported (kvm_has_gmem_attributes). Continue to support testing of double-backing by accepting a -2 flag. When testing single-backing, don't use src_type to determine alignment for rounding up per-cpu test memory size, since guest_memfd's backing page size is always the system PAGE_SIZE. To test in-place conversions, set up guest_memfd with GUEST_MEMFD_FLAG_MMAP and GUEST_MEMFD_FLAG_INIT_SHARED so that both host and guest access the same backing physical memory. Co-developed-by: Sean Christopherson Signed-off-by: Sean Christopherson Signed-off-by: Ackerley Tng --- .../kvm/x86/private_mem_conversions_test.c | 55 +++++++++++++++++-= ---- 1 file changed, 44 insertions(+), 11 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 0c94e36575a5e..8f03eea9e2fb6 100644 --- a/tools/testing/selftests/kvm/x86/private_mem_conversions_test.c +++ b/tools/testing/selftests/kvm/x86/private_mem_conversions_test.c @@ -26,6 +26,8 @@ #define BASE_DATA_GPA ((u64)(1ull << 32)) #define PER_CPU_DATA_SIZE ((u64)(SZ_2M + PAGE_SIZE)) =20 +static bool use_double_backing; + /* Horrific macro so that the line info is captured accurately :-( */ #define memcmp_g(gpa, pattern, size) \ do { \ @@ -355,8 +357,15 @@ static void *__test_mem_conversions(void *__vcpu) size_t nr_bytes =3D min_t(size_t, vm->page_size, size - i); u8 *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 double backing, the host should + * always observe shared data, since the shared + * memory is a separate page. + */ + if (use_double_backing) + memcmp_h(hva, gpa + i, uc.args[3], nr_bytes); + else if (uc.args[0] =3D=3D SYNC_PRIVATE) + TEST_EXPECT_SIGBUS(READ_ONCE(*hva)); =20 /* For shared, write the new pattern to guest memory. */ if (uc.args[0] =3D=3D SYNC_SHARED) @@ -372,15 +381,23 @@ static void *__test_mem_conversions(void *__vcpu) } } =20 +/* Align each vCPU's chunk of memory naturally to the size of the backing = store. */ +static size_t compute_per_cpu_size(enum vm_mem_backing_src_type src_type) +{ + size_t alignment; + + if (use_double_backing) + alignment =3D get_backing_src_pagesz(src_type); + else + alignment =3D getpagesize(); + + return align_up(PER_CPU_DATA_SIZE, max_t(size_t, SZ_2M, alignment)); +} + static void test_mem_conversions(enum vm_mem_backing_src_type src_type, u3= 2 nr_vcpus, u32 nr_memslots) { - /* - * Allocate enough memory so that each vCPU's chunk of memory can be - * naturally aligned with respect to the size of the backing store. - */ - const size_t alignment =3D max_t(size_t, SZ_2M, get_backing_src_pagesz(sr= c_type)); - const size_t per_cpu_size =3D align_up(PER_CPU_DATA_SIZE, alignment); + const size_t per_cpu_size =3D compute_per_cpu_size(src_type); const size_t memfd_size =3D per_cpu_size * nr_vcpus; const size_t slot_size =3D memfd_size / nr_memslots; struct kvm_vcpu *vcpus[KVM_MAX_VCPUS]; @@ -404,6 +421,8 @@ static void test_mem_conversions(enum vm_mem_backing_sr= c_type src_type, u32 nr_v gmem_flags =3D 0; if (kvm_has_gmem_attributes) gmem_flags |=3D GUEST_MEMFD_FLAG_INIT_SHARED; + if (!use_double_backing) + gmem_flags |=3D GUEST_MEMFD_FLAG_MMAP; =20 memfd =3D vm_create_guest_memfd(vm, memfd_size, gmem_flags); =20 @@ -448,7 +467,9 @@ static void test_mem_conversions(enum vm_mem_backing_sr= c_type src_type, u32 nr_v static void usage(const char *cmd) { puts(""); - printf("usage: %s [-h] [-m nr_memslots] [-s mem_type] [-n nr_vcpus]\n", c= md); + printf("usage: %s [-2] [-h] [-m nr_memslots] [-s mem_type] [-n nr_vcpus]\= n", cmd); + puts(""); + puts(" -2: use double backing (guest_memfd for private, src_type for shar= ed)"); puts(""); backing_src_help("-s"); puts(""); @@ -461,16 +482,22 @@ static void usage(const char *cmd) int main(int argc, char *argv[]) { enum vm_mem_backing_src_type src_type =3D DEFAULT_VM_MEM_SRC; + const char *backing_src_str =3D NULL; u32 nr_memslots =3D 1; u32 nr_vcpus =3D 1; int opt; =20 TEST_REQUIRE(kvm_check_cap(KVM_CAP_VM_TYPES) & BIT(KVM_X86_SW_PROTECTED_V= M)); =20 - while ((opt =3D getopt(argc, argv, "hm:s:n:")) !=3D -1) { + use_double_backing =3D !kvm_has_gmem_attributes; + + while ((opt =3D getopt(argc, argv, "2hm:s:n:")) !=3D -1) { switch (opt) { + case '2': + use_double_backing =3D true; + break; case 's': - src_type =3D parse_backing_src_type(optarg); + backing_src_str =3D optarg; break; case 'n': nr_vcpus =3D atoi_positive("nr_vcpus", optarg); @@ -485,6 +512,12 @@ int main(int argc, char *argv[]) } } =20 + if (backing_src_str) { + TEST_ASSERT(use_double_backing, + "src_type is only configurable when testing using double backing."); + src_type =3D parse_backing_src_type(backing_src_str); + } + test_mem_conversions(src_type, nr_vcpus, nr_memslots); =20 return 0; --=20 2.55.0.887.g758fc8c411-goog From nobody Mon Sep 28 04:51:20 2026 Received: from mail-pl1-f200.google.com (mail-pl1-f200.google.com [209.85.214.200]) (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 A9A054052AE for ; Wed, 26 Aug 2026 09:19:28 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.200 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1787735973; cv=none; b=VABEbNhgzj0ifjSUf4g0tm4yPkocvrdD1uWXfeIPS0gUOCcyNz7ypBG7/tVXwWk5Ap9HxjUGAdeo6GtAN04cWO4/soOm6GLbF12ayb1ObWSLlOOqCu0kpO+sVZXXA+nP2Z3xuwVgD1LVkfEjqJvxsVJuIxVEXBNKzL5QK+u5JD4= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1787735973; c=relaxed/simple; bh=xmXonNwGKLAtUb2bwJBWmuOd5wwpGb2FmAnXuGqWg5Y=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=KinMr7r3ZRe4e+FuNNoKQSLUsMxauepT6/0NpqZuWgv1k5sO7ke/dNwip3h4RSODSbUofRTX20UFcU7735LRskQoYpHNELnOuHeGFxWzjEFjnPZxvX1gkC9ZulfNp8RHk2Ko5XkHT0d4yqX5UcwSxOGW/eW6m/eaNgr6ulHrBEM= 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=ce1QHuoh; arc=none smtp.client-ip=209.85.214.200 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="ce1QHuoh" Received: by mail-pl1-f200.google.com with SMTP id d9443c01a7336-2cfa4e4684bso18095355ad.2 for ; Wed, 26 Aug 2026 02:19:28 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20251104; t=1787735966; x=1788340766; darn=vger.kernel.org; h=content-type:cc:to:from:subject:message-id:references:mime-version :in-reply-to:date:from:to:cc:subject:date:message-id:reply-to :content-type; bh=zHYRx/PxkM4WDh18sJtaYTvnxr7wQel9FcKfTX+J+bs=; b=ce1QHuoh3KZCQv7YZFESQTYCF6vpFDBfCGmLwIGHil7Jq3mPgwQ9zJGfV+I9WXc/wg yjSLU39bTPXKOS2mRDArU89u0V3jBdpivBtjIGU/Au43bF7JOwebDELixIM3w6S3ElWI pM84VCj4jdku5wBZt6WnWBsuNDVV0bLsob1aecUg+IkfRO7DOMhOE0VECJDF5G9oyksb tNdVyTwc3Rourdv5mXN8sZX/evCaFG99BO2MDQtHxcQ8Qvn1riYiC++EuTjKA8N4KIEl 0QOHsWJPwVQX92G1MaJuAT/PnCMO8cIdQlRiqCvCfrEzioP8L+JOQxg+qJ2rzqjRw+hI jGTg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1787735966; x=1788340766; h=content-type: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:content-type; bh=zHYRx/PxkM4WDh18sJtaYTvnxr7wQel9FcKfTX+J+bs=; b=cY60p+4U1qReud9AetO+eJmIU2y/sHbC/oHCL26ob7xX8WpghK4xoQVuuRsrcXm8vT rQ0lnKj8DvsE1ZMZ1HJP+DvKuvcUPUBd6XB6O4aNj+wiqX/Lm+538bcc/Qa92cqy3mWn FbSEJkaXD8bFV2tL7E4epnxSN8Yy4cck1wv8SVx7H6f5YnL1nxzb5g7deE+xKyFmw3V3 1QIbH2gg+PMv8SV4MAz9ieTo7oq6UFM3O97tNiOZL4RHQUsff97OLZIdXarOndnB1pXk VD8dqh9TSCrhwqzmAXK9yM5znbDMsRkpy1yq65cPamTI0MsHz7L3Sndj0fBgxWvhVER0 0k4Q== X-Forwarded-Encrypted: i=1; AHgh+RoGmHjIrz7iYUsfU2z0HyoCTTzqeCmetfiTeRVF4v1VGShFSigqpJFqsPKA1OoAuDs7Jfk7I3wWeKvnOAY=@vger.kernel.org X-Gm-Message-State: AFuF++mFeCVv5cc/ZYiH1BJ3ZmavdWFeSzyRjXBwIaSevvxOcxQAIqCw dDnm17vHDiIQHxl0GV9U3HxhpM2cukk//80S7aZ+HgFDHnmSSSkWelujO4InbFF2ooQZuwXmqv8 YxunyypZtgq3n/DSEG1U4q1+3Mw== X-Received: from pliy16.prod.google.com ([2002:a17:903:3d10:b0:2d6:df8f:1c1e]) (user=ackerleytng job=prod-delivery.src-stubby-dispatcher) by 2002:a17:903:3c46:b0:2ca:4f33:e86f with SMTP id d9443c01a7336-2d707b416famr96063915ad.12.1787735966143; Wed, 26 Aug 2026 02:19:26 -0700 (PDT) Date: Wed, 26 Aug 2026 09:18:44 +0000 In-Reply-To: <20260826-gmem-inplace-conversion-v11-0-0a15d8a799aa@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20260826-gmem-inplace-conversion-v11-0-0a15d8a799aa@google.com> X-Developer-Key: i=ackerleytng@google.com; a=ed25519; pk=sAZDYXdm6Iz8FHitpHeFlCMXwabodTm7p8/3/8xUxuU= X-Developer-Signature: v=1; a=ed25519-sha256; t=1787735885; l=3875; i=ackerleytng@google.com; s=20260225; h=from:subject:message-id; bh=vQ9v01kvEacWoPdLuKsaPZxtunAeY0dQj48sYbjG7N4=; b=gbSXqT9glzhdzcG2yGJgFOkdSClBH/STykulhxs5pk8VoHTx7tcW5OXCdDyC3bBspy0Sm3l0M Smrl3PHW5YSBsLqrwOgzhnFVcWIiLWq5w/qaGmstHG1iOBhSjmBT/ar X-Mailer: b4 0.16.0 Message-ID: <20260826-gmem-inplace-conversion-v11-46-0a15d8a799aa@google.com> Subject: [PATCH v11 46/46] KVM: selftests: Update private memory exits test to work with per-gmem attributes From: Ackerley Tng To: aik@amd.com, andrew.jones@linux.dev, binbin.wu@linux.intel.com, brauner@kernel.org, chao.p.peng@linux.intel.com, david@kernel.org, jmattson@google.com, jthoughton@google.com, michael.roth@amd.com, oupton@kernel.org, pankaj.gupta@amd.com, qperret@google.com, rick.p.edgecombe@intel.com, rientjes@google.com, shivankg@amd.com, steven.price@arm.com, willy@infradead.org, wyihan@google.com, yan.y.zhao@intel.com, forkloop@google.com, pratyush@kernel.org, suzuki.poulose@arm.com, aneesh.kumar@kernel.org, liam@infradead.org, Paolo Bonzini , Sean Christopherson , Thomas Gleixner , Ingo Molnar , Borislav Petkov , Dave Hansen , x86@kernel.org, "H. Peter Anvin" , Steven Rostedt , Masami Hiramatsu , Mathieu Desnoyers , Jonathan Corbet , Shuah Khan , Shuah Khan , Vishal Annapurve , Andrew Morton , Chris Li , Kairui Song , Kemeng Shi , Nhat Pham , Barry Song , Axel Rasmussen , Yuanchu Xie , Wei Xu , Youngjun Park , Qi Zheng , Shakeel Butt , Kiryl Shutsemau , Baoquan He , Jason Gunthorpe , John Hubbard , Peter Xu , tarunsahu@google.com, Fuad Tabba , Vlastimil Babka Cc: kvm@vger.kernel.org, linux-kernel@vger.kernel.org, linux-trace-kernel@vger.kernel.org, linux-doc@vger.kernel.org, linux-kselftest@vger.kernel.org, linux-mm@kvack.org, linux-coco@lists.linux.dev, 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 Reviewed-by: Fuad Tabba Tested-by: Shivank Garg Signed-off-by: Ackerley Tng --- .../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 e6d16e9d61200..f7228e0f1ac61 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 kvm_pthread_create(&vm_thread, NULL, (pthread_fn_t)run_vcpu_get_exit_reason, (void *)vcpu); @@ -73,10 +74,26 @@ static void test_private_access_memslot_deleted(void) kvm_pthread_join(vm_thread, &thread_return); exit_reason =3D (u32)(u64)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(u64)); + 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); } @@ -87,6 +104,13 @@ static void test_private_access_memslot_not_private(voi= d) struct kvm_vcpu *vcpu; u32 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.55.0.887.g758fc8c411-goog