From nobody Thu Apr 2 11:20:07 2026 Received: from mail-pl1-f202.google.com (mail-pl1-f202.google.com [209.85.214.202]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id E13593DEAF5 for ; Thu, 26 Mar 2026 22:25:42 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.202 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1774563944; cv=none; b=pq9rAc9126lZ/mXtbM+sfLYE5pst9lo/vVOGJbl405fFKa2+AbgzBnMxjcJY4Ze+Nvi2GZM69bjFhL3BxVFhN1wr9rEBAQZNV0FYyu5FBQiVXKwnqy+AGLtrMVsmdVKWvtlunIfRAzqgsx4Aea8vpJlOboWd3YfW5GXe/bw35MA= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1774563944; c=relaxed/simple; bh=cIqWAq5WjkT3kwr//fCKAzdxhjaZz9Zb7L+/dQP6WPc=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=J07haQrowYpoRldQk1/X8vEDexw3i9EjqyrTeMtW8353Agt4MWzyqTD1d55noQsTgO0kuHS4/cyuoli/1lVGqVk3Gf/I0+KeMU0nnoYJDPZS8u3xgTqS0j2zrEihYYtDsdKZC5CfzTRspchE+YmsPmPOw8JKNSIIyP8o2snCouE= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com; spf=pass smtp.mailfrom=flex--ackerleytng.bounces.google.com; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b=FzHk6KOK; arc=none smtp.client-ip=209.85.214.202 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=flex--ackerleytng.bounces.google.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="FzHk6KOK" Received: by mail-pl1-f202.google.com with SMTP id d9443c01a7336-2b0be865f19so17698615ad.1 for ; Thu, 26 Mar 2026 15:25:42 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20251104; t=1774563942; x=1775168742; darn=vger.kernel.org; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:from:to:cc:subject:date:message-id:reply-to; bh=NdTzJ2knx/A8nF/dOxU4yhfVKOq5sU9Aj61j8WPVqZE=; b=FzHk6KOKfWR1X/mjgGxGGc8To4iKG3hnhbURyPmyY48d/LfDxtD1tG5GNOnaftdQOQ 6i1JJY04FnIgpzR0xmzOmkW/8K8WmNPpov8DgCJSNmOozAH70CiIE6gpHGjqP1Y1ZMvT C5nG4XGk3UapfOM6289GsbBnpcAIHLLPWvWzFwVYjSbLHVNwFrx3Lmf2xQjLjlRcHCmh xusFYLPWV9CsO0WwNDlkZijXc5wLDDGasEPiH8lD3EimtJNI9w1GjEVGR5C2KyOOMzcI g1A/OJGj0bxFoMEw8YDcroHKYMoTZ+GfZ32ThN/uPbxXwhI+/qDwXRR6qEzy1QEqz002 eylQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1774563942; x=1775168742; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=NdTzJ2knx/A8nF/dOxU4yhfVKOq5sU9Aj61j8WPVqZE=; b=fEUFO13n0dN5bTygGMH3oEUEtHRQ0N3qzNy9Cg3cZy9FS1CzaqGQL4MXI/HYw1eY5e rNhEF6E833gLfllWhC825XQul1slTtq3D1p/YB6iQsoqHQAmyPKg/goapj9q5IUYhpoj wITZJe0KGYY3MoTDXry15zaMxPFiDSJSAMIbh8JuGBQ8yNfRZng2SzaL/tXwpulnDQeS nRPAtn5clXi3rDVMT+3RIyc4yNG10G7PEf0TIirMEuwkERCk0DeDzGBXUCuOEywI36jp /IJZhMcZ0q/YIJqBqL7IcN/KNt1WMnTbRyEup0w6fgFTFJ3wS1WOiwifLZ6Ceu9Qeru1 SLXg== X-Forwarded-Encrypted: i=1; AJvYcCXkQbk/x9Ev1QbwSYhOXbhrRtIGGgXU1QraCTqze/K128JbZMXQV9ls09bm3DeuzrjlSU4tpllwaAZehJo=@vger.kernel.org X-Gm-Message-State: AOJu0Yz9O26R3CZvsd/ZcxSCuhxKypDqay9EIQ8hFUbhvZ2q2BdpxJn7 RKK/lrI9BfjcpCxMvwbT7Ol6xHy0ztrKqcUB8Cy57mb3ZxQF9FVxpGS2J1v7ZxfTaKhflZtwn8N GAQ70DtUh0pB+1hX8f/mjLf2x0A== X-Received: from pgmc18.prod.google.com ([2002:a63:1c52:0:b0:c62:b045:9c6]) (user=ackerleytng job=prod-delivery.src-stubby-dispatcher) by 2002:a05:6a21:a613:b0:39b:8dcb:f36d with SMTP id adf61e73a8af0-39c87b62ed8mr216909637.35.1774563941902; Thu, 26 Mar 2026 15:25:41 -0700 (PDT) Date: Thu, 26 Mar 2026 15:24:47 -0700 In-Reply-To: <20260326-gmem-inplace-conversion-v4-0-e202fe950ffd@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20260326-gmem-inplace-conversion-v4-0-e202fe950ffd@google.com> X-Developer-Key: i=ackerleytng@google.com; a=ed25519; pk=sAZDYXdm6Iz8FHitpHeFlCMXwabodTm7p8/3/8xUxuU= X-Developer-Signature: v=1; a=ed25519-sha256; t=1774563861; l=6049; i=ackerleytng@google.com; s=20260225; h=from:subject:message-id; bh=HTZEVC19RcC53M2zFJOXKx3E4yoW/HTjTM3xN8ow870=; b=uEc48GV8on+0fQ8uBTGhWcrb0PLgSO+WOxNKaWbY/+7Aqk0ReLt7gB+ydu3HEXGauVkuxE5ig nsML4IvRgkLAnNEduyZAUtxVKvwTGuIvP0C83uzA53a/ilyROx1iLj0 X-Mailer: b4 0.14.3 Message-ID: <20260326-gmem-inplace-conversion-v4-38-e202fe950ffd@google.com> Subject: [PATCH RFC v4 38/44] KVM: selftests: Provide common function to set memory attributes From: Ackerley Tng To: aik@amd.com, andrew.jones@linux.dev, binbin.wu@linux.intel.com, brauner@kernel.org, chao.p.peng@linux.intel.com, david@kernel.org, ira.weiny@intel.com, jmattson@google.com, jroedel@suse.de, jthoughton@google.com, michael.roth@amd.com, oupton@kernel.org, pankaj.gupta@amd.com, qperret@google.com, rick.p.edgecombe@intel.com, rientjes@google.com, shivankg@amd.com, steven.price@arm.com, tabba@google.com, willy@infradead.org, wyihan@google.com, yan.y.zhao@intel.com, forkloop@google.com, pratyush@kernel.org, suzuki.poulose@arm.com, aneesh.kumar@kernel.org, Paolo Bonzini , Sean Christopherson , Thomas Gleixner , Ingo Molnar , Borislav Petkov , Dave Hansen , x86@kernel.org, "H. Peter Anvin" , Steven Rostedt , Masami Hiramatsu , Mathieu Desnoyers , Jonathan Corbet , Shuah Khan , Shuah Khan , Vishal Annapurve , Andrew Morton , Chris Li , Kairui Song , Kemeng Shi , Nhat Pham , Baoquan He , Barry Song , Axel Rasmussen , Yuanchu Xie , Wei Xu , Jason Gunthorpe , Vlastimil Babka Cc: kvm@vger.kernel.org, linux-kernel@vger.kernel.org, linux-trace-kernel@vger.kernel.org, linux-doc@vger.kernel.org, linux-kselftest@vger.kernel.org, linux-mm@kvack.org, Ackerley Tng Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable From: Sean Christopherson Introduce vm_mem_set_memory_attributes(), which handles setting of memory attributes for a range of guest physical addresses, regardless of whether the attributes should be set via guest_memfd or via the memory attributes at the VM level. Refactor existing vm_mem_set_{shared,private} functions to use the new function. Update existing caller of vm_mem_set_private(). Signed-off-by: Sean Christopherson Co-developed-by: Ackerley Tng Signed-off-by: Ackerley Tng --- tools/testing/selftests/kvm/guest_memfd_test.c | 2 +- tools/testing/selftests/kvm/include/kvm_util.h | 47 ++++++++++++++++--= ---- tools/testing/selftests/kvm/lib/x86/sev.c | 2 +- .../testing/selftests/kvm/pre_fault_memory_test.c | 2 +- .../selftests/kvm/x86/private_mem_kvm_exits_test.c | 4 +- 5 files changed, 40 insertions(+), 17 deletions(-) diff --git a/tools/testing/selftests/kvm/guest_memfd_test.c b/tools/testing= /selftests/kvm/guest_memfd_test.c index 10b57fd4fa9ba..ff8c0c56399dd 100644 --- a/tools/testing/selftests/kvm/guest_memfd_test.c +++ b/tools/testing/selftests/kvm/guest_memfd_test.c @@ -506,7 +506,7 @@ static void test_guest_private_mem(void) fd, 0, 0); =20 virt_map(vm, gpa, gpa, npages); - vm_mem_set_private(vm, gpa, page_size); + vm_mem_set_private(vm, gpa, page_size, 0); =20 vcpu_args_set(vcpu, 1, gpa); vcpu_run(vcpu); diff --git a/tools/testing/selftests/kvm/include/kvm_util.h b/tools/testing= /selftests/kvm/include/kvm_util.h index 3434f3df028b0..d975cc3047a2d 100644 --- a/tools/testing/selftests/kvm/include/kvm_util.h +++ b/tools/testing/selftests/kvm/include/kvm_util.h @@ -456,18 +456,6 @@ static inline void vm_set_memory_attributes(struct kvm= _vm *vm, uint64_t gpa, vm_ioctl(vm, KVM_SET_MEMORY_ATTRIBUTES2, &attr); } =20 -static inline void vm_mem_set_private(struct kvm_vm *vm, uint64_t gpa, - uint64_t size) -{ - vm_set_memory_attributes(vm, gpa, size, KVM_MEMORY_ATTRIBUTE_PRIVATE); -} - -static inline void vm_mem_set_shared(struct kvm_vm *vm, uint64_t gpa, - uint64_t size) -{ - vm_set_memory_attributes(vm, gpa, size, 0); -} - static inline int __gmem_set_memory_attributes(int fd, loff_t offset, uint64_t size, uint64_t attributes, @@ -536,6 +524,41 @@ static inline void gmem_set_shared(int fd, loff_t offs= et, uint64_t size, u64 fla gmem_set_memory_attributes(fd, offset, size, 0, flags); } =20 +static inline void vm_mem_set_memory_attributes(struct kvm_vm *vm, uint64_= t gpa, + uint64_t size, uint64_t attrs, + u64 flags) +{ + if (kvm_has_gmem_attributes) { + uint64_t end =3D gpa + size; + uint64_t addr, len; + off_t fd_offset; + int fd; + + for (addr =3D gpa; addr < end; addr +=3D len) { + fd =3D kvm_gpa_to_guest_memfd(vm, addr, &fd_offset, &len); + len =3D min(end - addr, len); + + gmem_set_memory_attributes(fd, fd_offset, len, attrs, flags); + } + } else { + TEST_ASSERT(!flags, "Flags are not supported."); + vm_set_memory_attributes(vm, gpa, size, attrs); + } +} + +static inline void vm_mem_set_private(struct kvm_vm *vm, uint64_t gpa, + uint64_t size, u64 flags) +{ + vm_mem_set_memory_attributes(vm, gpa, size, + KVM_MEMORY_ATTRIBUTE_PRIVATE, flags); +} + +static inline void vm_mem_set_shared(struct kvm_vm *vm, uint64_t gpa, + uint64_t size, u64 flags) +{ + vm_mem_set_memory_attributes(vm, gpa, size, 0, flags); +} + void vm_guest_mem_fallocate(struct kvm_vm *vm, uint64_t gpa, uint64_t size, bool punch_hole); =20 diff --git a/tools/testing/selftests/kvm/lib/x86/sev.c b/tools/testing/self= tests/kvm/lib/x86/sev.c index c3a9838f4806a..d3a7241e5fc13 100644 --- a/tools/testing/selftests/kvm/lib/x86/sev.c +++ b/tools/testing/selftests/kvm/lib/x86/sev.c @@ -33,7 +33,7 @@ static void encrypt_region(struct kvm_vm *vm, struct user= space_mem_region *regio const uint64_t offset =3D (i - lowest_page_in_region) * vm->page_size; =20 if (private) - vm_mem_set_private(vm, gpa_base + offset, size); + vm_mem_set_private(vm, gpa_base + offset, size, 0); =20 if (is_sev_snp_vm(vm)) snp_launch_update_data(vm, gpa_base + offset, diff --git a/tools/testing/selftests/kvm/pre_fault_memory_test.c b/tools/te= sting/selftests/kvm/pre_fault_memory_test.c index 93e603d91311c..3b2c4179d42ee 100644 --- a/tools/testing/selftests/kvm/pre_fault_memory_test.c +++ b/tools/testing/selftests/kvm/pre_fault_memory_test.c @@ -188,7 +188,7 @@ static void __test_pre_fault_memory(unsigned long vm_ty= pe, bool private) virt_map(vm, gva, gpa, TEST_NPAGES); =20 if (private) - vm_mem_set_private(vm, gpa, TEST_SIZE); + vm_mem_set_private(vm, gpa, TEST_SIZE, 0); =20 pre_fault_memory(vcpu, gpa, 0, SZ_2M, 0, private); pre_fault_memory(vcpu, gpa, SZ_2M, PAGE_SIZE * 2, PAGE_SIZE, private); diff --git a/tools/testing/selftests/kvm/x86/private_mem_kvm_exits_test.c b= /tools/testing/selftests/kvm/x86/private_mem_kvm_exits_test.c index 13e72fcec8dd2..cbcb5d6d04436 100644 --- a/tools/testing/selftests/kvm/x86/private_mem_kvm_exits_test.c +++ b/tools/testing/selftests/kvm/x86/private_mem_kvm_exits_test.c @@ -63,7 +63,7 @@ static void test_private_access_memslot_deleted(void) virt_map(vm, EXITS_TEST_GVA, EXITS_TEST_GPA, EXITS_TEST_NPAGES); =20 /* Request to access page privately */ - vm_mem_set_private(vm, EXITS_TEST_GPA, EXITS_TEST_SIZE); + vm_mem_set_private(vm, EXITS_TEST_GPA, EXITS_TEST_SIZE, 0); =20 pthread_create(&vm_thread, NULL, (void *(*)(void *))run_vcpu_get_exit_reason, @@ -99,7 +99,7 @@ static void test_private_access_memslot_not_private(void) virt_map(vm, EXITS_TEST_GVA, EXITS_TEST_GPA, EXITS_TEST_NPAGES); =20 /* Request to access page privately */ - vm_mem_set_private(vm, EXITS_TEST_GPA, EXITS_TEST_SIZE); + vm_mem_set_private(vm, EXITS_TEST_GPA, EXITS_TEST_SIZE, 0); =20 exit_reason =3D run_vcpu_get_exit_reason(vcpu); =20 --=20 2.53.0.1018.g2bb0e51243-goog