From nobody Wed Dec 17 19:21:06 2025 Received: from mail-pl1-f201.google.com (mail-pl1-f201.google.com [209.85.214.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id CA7FC27B330 for ; Fri, 3 Oct 2025 23:26:15 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1759533977; cv=none; b=PKO7xLQ9kLUvzdf+E8rcYjkKK/ISIMRlIupNxPZuFDdV3RfbgGr/bP8XUSPJLijTwjhVixeZ6DnbpLYxMp/y9j/yMZbF2zoRSWBpz+kOjidD9SGnjq/ym+F/6PnsRqFJhLNls/MLFV+FZ/Vcc5l1pTOCpEOlkD7VsRsqrvbny2s= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1759533977; c=relaxed/simple; bh=cBSCbLGuyu0i+pnnFJtW9XyUg/AWI2CO30mF/qWuptw=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=FaU1vSwzSxhABh7viB+qw+KstGB39OxOEFbHPRj43x6lSr31x0oTMMOT5YX3CnFfjgJb5ghIMM7cUhWLQZ++8fTLyH8KT7uMXM35T+orrIxFK5+TqOvy0WYsKHdrIMI+jDP7Z7gg9EThkQgdlwj5Nt/tnklz+anYLFfuNQpaBqM= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com; spf=pass smtp.mailfrom=flex--seanjc.bounces.google.com; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b=CHQYf0Tq; arc=none smtp.client-ip=209.85.214.201 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=flex--seanjc.bounces.google.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="CHQYf0Tq" Received: by mail-pl1-f201.google.com with SMTP id d9443c01a7336-2699ebc0319so28791565ad.3 for ; Fri, 03 Oct 2025 16:26:15 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1759533975; x=1760138775; darn=vger.kernel.org; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:reply-to:from:to:cc:subject:date:message-id:reply-to; bh=a+1Sii0G7hC5FMVOBHLi5jl/sMVLEnhBfdq+sbGC028=; b=CHQYf0TqTZQI5I5kXp73C2fng2vjg6GDQWfALKXP3ep2AQFKRw2kyzO/NHnd3B4m09 DlOye0CDH5hs/q2W17YvzWiWhChvjdU0JCxXOxIhMKVxO9afzmribIgthk4+5P1L3wiY 7ifN7TctI6y+IfV5/25DarjHo24bi+CuGkgsG4lb7w35ZlZQf0ima8Ls0al0U1fjqVYt 2Y+kBO1Bu1PpAu3Vv4AOKLnrHe03SeSoo+TZjU5pZ0JzoYqyPQRsAEdF56q9AglFD16A s/jTJXZrpFSur5GgmNWjQxQPPmq+xKO1Ws+3RICoky7g/eMExOIxC84ydURmOZ4z2eU6 gOgw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1759533975; x=1760138775; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:reply-to:x-gm-message-state:from:to:cc:subject:date:message-id :reply-to; bh=a+1Sii0G7hC5FMVOBHLi5jl/sMVLEnhBfdq+sbGC028=; b=mtzD661e5euJwMUxO1Oxa0/CAV9Ilk/K+9Dzd8o6JZXBehiOh+boNQ8gfCUH71SbmC ZhQWBCsEsLnjUysAe6IxPDT3j3yDXbora45p9NCnfg7PfgmMNu4HW+3ncJji6SLezPT+ unKpWpYy+USITwrQIufXHO82sV8yC3BC1JO2zWhmLOGKhpq5jnh2J/fckOL1y3w6RGFa /MrZwggm5GGoXfoETi6oaaevzfgbZWufu0hdez73KRs6/EWzCGtusePdOO+IhRihy1JB 3C4so5hEz/xK9aEM5+2yzhy1f0tItAptiUldLT+sMD5lB52HqJm6qaA0gOf4TnwztgPp 6tJw== X-Forwarded-Encrypted: i=1; AJvYcCXVtW/2EzJKl0mgeqLx59BVE48GarqV0e7Wh+mxbkk0Xa2QhquKzWvDaDRgP+DTqCSXMfUyo1wdrrnaHMs=@vger.kernel.org X-Gm-Message-State: AOJu0YwzniFqBZSs+u/bjjDq7CL81a2BENP59+BHH1zgLW6V+BlnXR/M 8DpkCA4VArDi8ZhTiREPnjwyov8lsuLGcxJXE4no+rw37QJ7gHNjhNERFe8gpYrDbYOfyXqIjas aClPeSg== X-Google-Smtp-Source: AGHT+IG79/9POvgYVBzEf8BKcEg3XVerQtIRac7iIPaoy9Au32zTuew6jnYHjJjthe8oCk/nymcslvQyqis= X-Received: from plpj14.prod.google.com ([2002:a17:903:3d8e:b0:269:7d7a:40c4]) (user=seanjc job=prod-delivery.src-stubby-dispatcher) by 2002:a17:903:2c0c:b0:269:8edf:67f8 with SMTP id d9443c01a7336-28e9a6646dbmr53564545ad.52.1759533974981; Fri, 03 Oct 2025 16:26:14 -0700 (PDT) Reply-To: Sean Christopherson Date: Fri, 3 Oct 2025 16:25:54 -0700 In-Reply-To: <20251003232606.4070510-1-seanjc@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20251003232606.4070510-1-seanjc@google.com> X-Mailer: git-send-email 2.51.0.618.g983fd99d29-goog Message-ID: <20251003232606.4070510-2-seanjc@google.com> Subject: [PATCH v2 01/13] KVM: Rework KVM_CAP_GUEST_MEMFD_MMAP into KVM_CAP_GUEST_MEMFD_FLAGS From: Sean Christopherson To: Paolo Bonzini , Sean Christopherson , Christian Borntraeger , Janosch Frank , Claudio Imbrenda Cc: kvm@vger.kernel.org, linux-kernel@vger.kernel.org, David Hildenbrand , Fuad Tabba , Ackerley Tng Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Rework the not-yet-released KVM_CAP_GUEST_MEMFD_MMAP into a more generic KVM_CAP_GUEST_MEMFD_FLAGS capability so that adding new flags doesn't require a new capability, and so that developers aren't tempted to bundle multiple flags into a single capability. Note, kvm_vm_ioctl_check_extension_generic() can only return a 32-bit value, but that limitation can be easily circumvented by adding e.g. KVM_CAP_GUEST_MEMFD_FLAGS2 in the unlikely event guest_memfd supports more than 32 flags. Signed-off-by: Sean Christopherson Reviewed-by: Ackerley Tng Reviewed-by: David Hildenbrand Tested-by: Ackerley Tng --- Documentation/virt/kvm/api.rst | 10 +++++++--- include/uapi/linux/kvm.h | 2 +- tools/testing/selftests/kvm/guest_memfd_test.c | 13 ++++++------- virt/kvm/kvm_main.c | 7 +++++-- 4 files changed, 19 insertions(+), 13 deletions(-) diff --git a/Documentation/virt/kvm/api.rst b/Documentation/virt/kvm/api.rst index 6ae24c5ca559..7ba92f2ced38 100644 --- a/Documentation/virt/kvm/api.rst +++ b/Documentation/virt/kvm/api.rst @@ -6432,9 +6432,13 @@ most one mapping per page, i.e. binding multiple mem= ory regions to a single guest_memfd range is not allowed (any number of memory regions can be boun= d to a single guest_memfd file, but the bound ranges must not overlap). =20 -When the capability KVM_CAP_GUEST_MEMFD_MMAP is supported, the 'flags' fie= ld -supports GUEST_MEMFD_FLAG_MMAP. Setting this flag on guest_memfd creation -enables mmap() and faulting of guest_memfd memory to host userspace. +The capability KVM_CAP_GUEST_MEMFD_FLAGS enumerates the `flags` that can be +specified via KVM_CREATE_GUEST_MEMFD. Currently defined flags: + + =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D + GUEST_MEMFD_FLAG_MMAP Enable using mmap() on the guest_memfd file + descriptor. + =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=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 When the KVM MMU performs a PFN lookup to service a guest fault and the ba= cking guest_memfd has the GUEST_MEMFD_FLAG_MMAP set, then the fault will always = be diff --git a/include/uapi/linux/kvm.h b/include/uapi/linux/kvm.h index 6efa98a57ec1..b1d52d0c56ec 100644 --- a/include/uapi/linux/kvm.h +++ b/include/uapi/linux/kvm.h @@ -962,7 +962,7 @@ struct kvm_enable_cap { #define KVM_CAP_ARM_EL2_E2H0 241 #define KVM_CAP_RISCV_MP_STATE_RESET 242 #define KVM_CAP_ARM_CACHEABLE_PFNMAP_SUPPORTED 243 -#define KVM_CAP_GUEST_MEMFD_MMAP 244 +#define KVM_CAP_GUEST_MEMFD_FLAGS 244 =20 struct kvm_irq_routing_irqchip { __u32 irqchip; diff --git a/tools/testing/selftests/kvm/guest_memfd_test.c b/tools/testing= /selftests/kvm/guest_memfd_test.c index b3ca6737f304..3e58bd496104 100644 --- a/tools/testing/selftests/kvm/guest_memfd_test.c +++ b/tools/testing/selftests/kvm/guest_memfd_test.c @@ -262,19 +262,17 @@ static void test_guest_memfd_flags(struct kvm_vm *vm,= uint64_t valid_flags) =20 static void test_guest_memfd(unsigned long vm_type) { - uint64_t flags =3D 0; struct kvm_vm *vm; size_t total_size; size_t page_size; + uint64_t flags; int fd; =20 page_size =3D getpagesize(); total_size =3D page_size * 4; =20 vm =3D vm_create_barebones_type(vm_type); - - if (vm_check_cap(vm, KVM_CAP_GUEST_MEMFD_MMAP)) - flags |=3D GUEST_MEMFD_FLAG_MMAP; + flags =3D vm_check_cap(vm, KVM_CAP_GUEST_MEMFD_FLAGS); =20 test_create_guest_memfd_multiple(vm); test_create_guest_memfd_invalid_sizes(vm, flags, page_size); @@ -328,13 +326,14 @@ static void test_guest_memfd_guest(void) size_t size; int fd, i; =20 - if (!kvm_has_cap(KVM_CAP_GUEST_MEMFD_MMAP)) + if (!kvm_check_cap(KVM_CAP_GUEST_MEMFD_FLAGS)) return; =20 vm =3D __vm_create_shape_with_one_vcpu(VM_SHAPE_DEFAULT, &vcpu, 1, guest_= code); =20 - TEST_ASSERT(vm_check_cap(vm, KVM_CAP_GUEST_MEMFD_MMAP), - "Default VM type should always support guest_memfd mmap()"); + TEST_ASSERT(vm_check_cap(vm, KVM_CAP_GUEST_MEMFD_FLAGS) & GUEST_MEMFD_FLA= G_MMAP, + "Default VM type should support MMAP, supported flags =3D 0x%x", + vm_check_cap(vm, KVM_CAP_GUEST_MEMFD_FLAGS)); =20 size =3D vm->page_size; fd =3D vm_create_guest_memfd(vm, size, GUEST_MEMFD_FLAG_MMAP); diff --git a/virt/kvm/kvm_main.c b/virt/kvm/kvm_main.c index 226faeaa8e56..e3a268757621 100644 --- a/virt/kvm/kvm_main.c +++ b/virt/kvm/kvm_main.c @@ -4928,8 +4928,11 @@ static int kvm_vm_ioctl_check_extension_generic(stru= ct kvm *kvm, long arg) #ifdef CONFIG_KVM_GUEST_MEMFD case KVM_CAP_GUEST_MEMFD: return 1; - case KVM_CAP_GUEST_MEMFD_MMAP: - return !kvm || kvm_arch_supports_gmem_mmap(kvm); + case KVM_CAP_GUEST_MEMFD_FLAGS: + if (!kvm || kvm_arch_supports_gmem_mmap(kvm)) + return GUEST_MEMFD_FLAG_MMAP; + + return 0; #endif default: break; --=20 2.51.0.618.g983fd99d29-goog From nobody Wed Dec 17 19:21:06 2025 Received: from mail-pj1-f73.google.com (mail-pj1-f73.google.com [209.85.216.73]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 7FF7828030E for ; Fri, 3 Oct 2025 23:26:17 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.216.73 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1759533979; cv=none; b=KZ80vYu1fvWNSP+UW9p25vrKUintb6K7kt9iiVfrn3xgesDYljZPBfsBO9RhkBlwoS4Whnu1jKssMTtEgA0hTmw1nK7bB3AHbo/41Cdnv2ipQAuMlJv4yFWo2JxOqUsYxwzJZl0+OoZr1ziOFpLbjGVI0z5JFrG+MveZuuTGLQc= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1759533979; c=relaxed/simple; bh=1v/mhrPlVxJZgZzeIdRHd4nNgyUm+aJgX/qajFTMclY=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=By3mb2U1uuWN7voNAMY5KTu3Ow+tCBdZ5B45yIj8N8P2iyfqoOJAXXuXGxsKp3iUy88IiTCObCNJafOR9Cz1b4aqEI/LYlpN4Ac5iPQ+3CNpboYFUEGtpuP3s6aZHFSM4oNPwPKRNkHYCPYpVUZv5imWOJVJVKImqpcCQuHq5tc= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com; spf=pass smtp.mailfrom=flex--seanjc.bounces.google.com; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b=tsq0v68m; arc=none smtp.client-ip=209.85.216.73 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=flex--seanjc.bounces.google.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="tsq0v68m" Received: by mail-pj1-f73.google.com with SMTP id 98e67ed59e1d1-32ea7fcddd8so5688334a91.3 for ; Fri, 03 Oct 2025 16:26:17 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1759533977; x=1760138777; darn=vger.kernel.org; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:reply-to:from:to:cc:subject:date:message-id:reply-to; bh=dErpNYwkBnA4Ms/9JY48CCyGK42f8PnH4KojDbSi2ZQ=; b=tsq0v68m4Q8XGsb36fvGYMi0BmWqSAWgyjx2B6us0aGKI1lYzxpJUViqjBzXiwAziy IrK+w5fzKOOKT0MEOmY8SkjKHlfVogX8AjvvVl84ALxwHyMiMtOv94KTZ3v3lVqcM1nv gZZA1OWzgLW1PBptxXVwGL5Sl4RkLIfoB18befV+F/vHPnq3KVdhmnrgRvLkiOiuhtWi r3K9wgwtmXwJpVpqy2h08m05TW3v5Gp/6lcXQftwqrY7jQi5RdDnDUO3sjAoYuRKm4PG cCQLRXKrAYN23LAiDRVCwjF+Z+X9S7SIiSgklhuFog6RqM4R69XAKLtxhEahKAeJISBS r/Jg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1759533977; x=1760138777; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:reply-to:x-gm-message-state:from:to:cc:subject:date:message-id :reply-to; bh=dErpNYwkBnA4Ms/9JY48CCyGK42f8PnH4KojDbSi2ZQ=; b=Q294VM+hDLB3jWL1alPcrUF8Dm8g0owPmG5hLjndZ+x52WTJj09uzqd0E2N6D9qAaR WWRQnJM8tKn+2I1dV7dgUmURuzd3wTFhb38MUphx7/SrHq3/b3BVmoVhHhPXA09R+DQn 9ZP+seXQU+2yAgRHIG/Jd0wFqwLoACVLDfHJ6FKoT6RnuIjmzQENHKA0HK50GlZoy6+t qom3XxxctIG107/+cBFLQZYZYbtYcBPMiQYr9UGOoPiY3GIM/WockbxOzHKNKG3hx4xJ kt1gBuYa545ifXcntxhPqr57dC5gAuDwV4PxbYxNqgEuC7TBJPGqt11+Uc8gHkh+DC/8 7Pug== X-Forwarded-Encrypted: i=1; AJvYcCUMdS26Vw4SO+3YyiwfWOGS6CY7naaIQTHwe44DAcPHXD2W1swkk+w1Mnm+fN9wvbu8W0FfRqtcU4yPM9Q=@vger.kernel.org X-Gm-Message-State: AOJu0Ywxh9kNGBmkQryJwNh9ClmoBgXeoLIIO+2U39hYeLxK7F/UXY+c W2q+YLFN4rpnmW5SC7gr3dMIlmnFDjz51NYpcIhwXrApZ1iXNaprMoklE/r262mpEe0yX8S6LW3 u0f/o7A== X-Google-Smtp-Source: AGHT+IGmLnipcJ89n+6tzffsI8k91zXGxgNt382krjG/YtWM7Ua8ai7tDSt5Ju3IqqrXrgiSZn6heHHqOuc= X-Received: from pjbnn13.prod.google.com ([2002:a17:90b:38cd:b0:32e:3830:65f2]) (user=seanjc job=prod-delivery.src-stubby-dispatcher) by 2002:a17:90b:38d0:b0:330:6c5a:4af4 with SMTP id 98e67ed59e1d1-339c27cf614mr5247147a91.35.1759533976769; Fri, 03 Oct 2025 16:26:16 -0700 (PDT) Reply-To: Sean Christopherson Date: Fri, 3 Oct 2025 16:25:55 -0700 In-Reply-To: <20251003232606.4070510-1-seanjc@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20251003232606.4070510-1-seanjc@google.com> X-Mailer: git-send-email 2.51.0.618.g983fd99d29-goog Message-ID: <20251003232606.4070510-3-seanjc@google.com> Subject: [PATCH v2 02/13] KVM: guest_memfd: Add INIT_SHARED flag, reject user page faults if not set From: Sean Christopherson To: Paolo Bonzini , Sean Christopherson , Christian Borntraeger , Janosch Frank , Claudio Imbrenda Cc: kvm@vger.kernel.org, linux-kernel@vger.kernel.org, David Hildenbrand , Fuad Tabba , Ackerley Tng Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Add a guest_memfd flag to allow userspace to state that the underlying memory should be configured to be initialized as shared, and reject user page faults if the guest_memfd instance's memory isn't shared. Because KVM doesn't yet support in-place private<=3D>shared conversions, all guest_memfd memory effectively follows the initial state. Alternatively, KVM could deduce the initial state based on MMAP, which for all intents and purposes is what KVM currently does. However, implicitly deriving the default state based on MMAP will result in a messy ABI when support for in-place conversions is added. For x86 CoCo VMs, which don't yet support MMAP, memory is currently private by default (otherwise the memory would be unusable). If MMAP implies memory is shared by default, then the default state for CoCo VMs will vary based on MMAP, and from userspace's perspective, will change when in-place conversion support is added. I.e. to maintain guest<=3D>host ABI, userspace would need to immediately convert all memory from shared=3D>private, which is both ugly and inefficient. The inefficiency could be avoided by adding a flag to state that memory is _private_ by default, irrespective of MMAP, but that would lead to an equally messy and hard to document ABI. Bite the bullet and immediately add a flag to control the default state so that the effective behavior is explicit and straightforward. Fixes: 3d3a04fad25a ("KVM: Allow and advertise support for host mmap() on g= uest_memfd files") Cc: David Hildenbrand Reviewed-by: Fuad Tabba Tested-by: Fuad Tabba Reviewed-by: Ackerley Tng Signed-off-by: Sean Christopherson Reviewed-by: David Hildenbrand Tested-by: Ackerley Tng --- Documentation/virt/kvm/api.rst | 5 +++++ include/uapi/linux/kvm.h | 3 ++- tools/testing/selftests/kvm/guest_memfd_test.c | 15 ++++++++++++--- virt/kvm/guest_memfd.c | 6 +++++- virt/kvm/kvm_main.c | 3 ++- 5 files changed, 26 insertions(+), 6 deletions(-) diff --git a/Documentation/virt/kvm/api.rst b/Documentation/virt/kvm/api.rst index 7ba92f2ced38..754b662a453c 100644 --- a/Documentation/virt/kvm/api.rst +++ b/Documentation/virt/kvm/api.rst @@ -6438,6 +6438,11 @@ specified via KVM_CREATE_GUEST_MEMFD. Currently def= ined flags: =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D GUEST_MEMFD_FLAG_MMAP Enable using mmap() on the guest_memfd file descriptor. + GUEST_MEMFD_FLAG_INIT_SHARED Make all memory in the file shared during + KVM_CREATE_GUEST_MEMFD (memory files created + without INIT_SHARED will be marked private). + Shared memory can be faulted into host user= space + page tables. Private memory cannot. =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=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 When the KVM MMU performs a PFN lookup to service a guest fault and the ba= cking diff --git a/include/uapi/linux/kvm.h b/include/uapi/linux/kvm.h index b1d52d0c56ec..52f6000ab020 100644 --- a/include/uapi/linux/kvm.h +++ b/include/uapi/linux/kvm.h @@ -1599,7 +1599,8 @@ struct kvm_memory_attributes { #define KVM_MEMORY_ATTRIBUTE_PRIVATE (1ULL << 3) =20 #define KVM_CREATE_GUEST_MEMFD _IOWR(KVMIO, 0xd4, struct kvm_create_guest= _memfd) -#define GUEST_MEMFD_FLAG_MMAP (1ULL << 0) +#define GUEST_MEMFD_FLAG_MMAP (1ULL << 0) +#define GUEST_MEMFD_FLAG_INIT_SHARED (1ULL << 1) =20 struct kvm_create_guest_memfd { __u64 size; diff --git a/tools/testing/selftests/kvm/guest_memfd_test.c b/tools/testing= /selftests/kvm/guest_memfd_test.c index 3e58bd496104..0de56ce3c4e2 100644 --- a/tools/testing/selftests/kvm/guest_memfd_test.c +++ b/tools/testing/selftests/kvm/guest_memfd_test.c @@ -239,8 +239,9 @@ static void test_create_guest_memfd_multiple(struct kvm= _vm *vm) close(fd1); } =20 -static void test_guest_memfd_flags(struct kvm_vm *vm, uint64_t valid_flags) +static void test_guest_memfd_flags(struct kvm_vm *vm) { + uint64_t valid_flags =3D vm_check_cap(vm, KVM_CAP_GUEST_MEMFD_FLAGS); size_t page_size =3D getpagesize(); uint64_t flag; int fd; @@ -274,6 +275,10 @@ static void test_guest_memfd(unsigned long vm_type) vm =3D vm_create_barebones_type(vm_type); flags =3D vm_check_cap(vm, KVM_CAP_GUEST_MEMFD_FLAGS); =20 + /* This test doesn't yet support testing mmap() on private memory. */ + if (!(flags & GUEST_MEMFD_FLAG_INIT_SHARED)) + flags &=3D ~GUEST_MEMFD_FLAG_MMAP; + test_create_guest_memfd_multiple(vm); test_create_guest_memfd_invalid_sizes(vm, flags, page_size); =20 @@ -292,7 +297,7 @@ static void test_guest_memfd(unsigned long vm_type) test_fallocate(fd, page_size, total_size); test_invalid_punch_hole(fd, page_size, total_size); =20 - test_guest_memfd_flags(vm, flags); + test_guest_memfd_flags(vm); =20 close(fd); kvm_vm_free(vm); @@ -334,9 +339,13 @@ static void test_guest_memfd_guest(void) TEST_ASSERT(vm_check_cap(vm, KVM_CAP_GUEST_MEMFD_FLAGS) & GUEST_MEMFD_FLA= G_MMAP, "Default VM type should support MMAP, supported flags =3D 0x%x", vm_check_cap(vm, KVM_CAP_GUEST_MEMFD_FLAGS)); + TEST_ASSERT(vm_check_cap(vm, KVM_CAP_GUEST_MEMFD_FLAGS) & GUEST_MEMFD_FLA= G_INIT_SHARED, + "Default VM type should support INIT_SHARED, supported flags =3D 0x%= x", + vm_check_cap(vm, KVM_CAP_GUEST_MEMFD_FLAGS)); =20 size =3D vm->page_size; - fd =3D vm_create_guest_memfd(vm, size, GUEST_MEMFD_FLAG_MMAP); + fd =3D vm_create_guest_memfd(vm, size, GUEST_MEMFD_FLAG_MMAP | + GUEST_MEMFD_FLAG_INIT_SHARED); vm_set_user_memory_region2(vm, slot, KVM_MEM_GUEST_MEMFD, gpa, size, NULL= , fd, 0); =20 mem =3D mmap(NULL, size, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0); diff --git a/virt/kvm/guest_memfd.c b/virt/kvm/guest_memfd.c index 94bafd6c558c..cf3afba23a6b 100644 --- a/virt/kvm/guest_memfd.c +++ b/virt/kvm/guest_memfd.c @@ -328,6 +328,9 @@ 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 (!((u64)inode->i_private & GUEST_MEMFD_FLAG_INIT_SHARED)) + return VM_FAULT_SIGBUS; + folio =3D kvm_gmem_get_folio(inode, vmf->pgoff); if (IS_ERR(folio)) { int err =3D PTR_ERR(folio); @@ -525,7 +528,8 @@ int kvm_gmem_create(struct kvm *kvm, struct kvm_create_= guest_memfd *args) u64 valid_flags =3D 0; =20 if (kvm_arch_supports_gmem_mmap(kvm)) - valid_flags |=3D GUEST_MEMFD_FLAG_MMAP; + valid_flags |=3D GUEST_MEMFD_FLAG_MMAP | + GUEST_MEMFD_FLAG_INIT_SHARED; =20 if (flags & ~valid_flags) return -EINVAL; diff --git a/virt/kvm/kvm_main.c b/virt/kvm/kvm_main.c index e3a268757621..5f644ca54af3 100644 --- a/virt/kvm/kvm_main.c +++ b/virt/kvm/kvm_main.c @@ -4930,7 +4930,8 @@ static int kvm_vm_ioctl_check_extension_generic(struc= t kvm *kvm, long arg) return 1; case KVM_CAP_GUEST_MEMFD_FLAGS: if (!kvm || kvm_arch_supports_gmem_mmap(kvm)) - return GUEST_MEMFD_FLAG_MMAP; + return GUEST_MEMFD_FLAG_MMAP | + GUEST_MEMFD_FLAG_INIT_SHARED; =20 return 0; #endif --=20 2.51.0.618.g983fd99d29-goog From nobody Wed Dec 17 19:21:06 2025 Received: from mail-pj1-f73.google.com (mail-pj1-f73.google.com [209.85.216.73]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id E7226284884 for ; Fri, 3 Oct 2025 23:26:18 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.216.73 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1759533980; cv=none; b=dFVJAAgO8uFCOa05g9CVyE0Duue1bakZpLyldWRIjDieDHAVIsRt5jsXvNZgDZ7C++ryU661V/JJwMz5A1g1W/Pomc3jq5ourr1eEdIWor/IZIMgUj+Y9GTocgIlW7sVBK8dXyAIZ9RR8UpZTZ5SnTfoVC/Od/K9rJvVKUr+DPw= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1759533980; c=relaxed/simple; bh=JgwH0hhK2IifgJKiBLx6g54yKAN8QI8WbPcCajKH/V4=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=O/1yq+fvplHK1ikuNQT4RhfDs0ApsjW95ILCBCF2Njej78ockZGKNeGDskL1JBCNtnRJA/LP7KKtStTjVYO0xENsXYm1eUi5YYlYpV9AtnDJRUfWIjcfFJ7rwCWzVrmFJMZhVluqXy6roi2r1+NS/AlwZaDt9cGwjYEsl3nQIUE= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com; spf=pass smtp.mailfrom=flex--seanjc.bounces.google.com; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b=SZjAlzG2; arc=none smtp.client-ip=209.85.216.73 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=flex--seanjc.bounces.google.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="SZjAlzG2" Received: by mail-pj1-f73.google.com with SMTP id 98e67ed59e1d1-330a4d5c4efso2480244a91.0 for ; Fri, 03 Oct 2025 16:26:18 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1759533978; x=1760138778; darn=vger.kernel.org; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:reply-to:from:to:cc:subject:date:message-id:reply-to; bh=q3IgVVV1CLaiYzreC9VyBw/7/0EpP82vzJ1yumnTCCo=; b=SZjAlzG2W+bLG6As50V1PFG8uQlnKbeDcov/xbx3DC0cp0L8JEUk+sM9F8EG+nPuxu GKbpTPgAMvpFpoP+FffR/Wey2WHX7dRDIJtOA5UrqDm2DJDy9mRNh1NTwxSxcMEn1QYX ZmlfKBE0TzBpvxpjjs911Y59YKDyEQ6ERJe5lyMMln8vlMIlXBM7BQdBH8ZTtrw9xHLD MPObWDCO0cJMTZyzqfwdIlnLmG4QfaiIXdycYHV8L9At1d2FokHlvZ43QCZ7k2hEEP65 VLSV4w/NaRm2YT9DGp8hv1MtpHvW6ZRZVpGEq3UA0pBtQsAeu1Jv9/hqjqcBULJIP8Ko xqug== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1759533978; x=1760138778; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:reply-to:x-gm-message-state:from:to:cc:subject:date:message-id :reply-to; bh=q3IgVVV1CLaiYzreC9VyBw/7/0EpP82vzJ1yumnTCCo=; b=dzu8k6NJbQNojY9sr1qlxkAzlytT2Tk5r8JLZqdYMDxeIZSuPI1HB9ymn640PTLCk0 vwPP05NfYis/MjwYtatctYx5ez8w68PMUA3Hw40kTpD2uA5EjG4WusybX1J1Q25yWdDC ctIcsadEhU2DoBRXm27dkrnU9HnVIRFi4bMiGA/Bs+QtyY5xm7Mdb49yipg65ROzhPzv 37MnJOH7MdBvAkIjtvpeTk7v/uGm65sADsYGjmji4K82QQ8sQf3QlEhZk1hamXp/XHqp +URUohy+NmvWVwW8fwoc72hW66rgiNbmUyqzhAGULIHTDita14wUqbNYuaGz1o/JPKZk AyoQ== X-Forwarded-Encrypted: i=1; AJvYcCUBmUDlTOJsRdj5qiY6n2hJ+fUgBDq69TyWKiio88PWK64f2xdCexJMYiBgiworC+UREJ3+pRszBrklEPc=@vger.kernel.org X-Gm-Message-State: AOJu0YzKobpvrq69C25IW8OJny2gGAYtzhtvfE2exufxAyVKcaE2wAg+ H7hAzFuXKGXwLnqBYV9ez7XfRcdBkPOkUR0noReTP3oLfKjTLoxHS4RFNuBFsiQ52FJT0bMGxJF RgNGAcw== X-Google-Smtp-Source: AGHT+IEdnj/mdwvT2YHCE2J52BB93ym2M0LRhBZ2QTLnlqPMuHTXLV4zwanffN79lJZAvxv4138mpDLAJ3U= X-Received: from pjbkb13.prod.google.com ([2002:a17:90a:e7cd:b0:330:604a:1028]) (user=seanjc job=prod-delivery.src-stubby-dispatcher) by 2002:a17:90b:388b:b0:32e:24cf:e658 with SMTP id 98e67ed59e1d1-339c2716d84mr5349640a91.3.1759533978267; Fri, 03 Oct 2025 16:26:18 -0700 (PDT) Reply-To: Sean Christopherson Date: Fri, 3 Oct 2025 16:25:56 -0700 In-Reply-To: <20251003232606.4070510-1-seanjc@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20251003232606.4070510-1-seanjc@google.com> X-Mailer: git-send-email 2.51.0.618.g983fd99d29-goog Message-ID: <20251003232606.4070510-4-seanjc@google.com> Subject: [PATCH v2 03/13] KVM: guest_memfd: Invalidate SHARED GPAs if gmem supports INIT_SHARED From: Sean Christopherson To: Paolo Bonzini , Sean Christopherson , Christian Borntraeger , Janosch Frank , Claudio Imbrenda Cc: kvm@vger.kernel.org, linux-kernel@vger.kernel.org, David Hildenbrand , Fuad Tabba , Ackerley Tng Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" When invalidating gmem ranges, e.g. in response to PUNCH_HOLE, process all possible range types (PRIVATE vs. SHARED) for the gmem instance. Since since guest_memfd doesn't yet support in-place conversions, simply pivot on INIT_SHARED as a gmem instance can currently only have private or shared memory, not both. Failure to mark shared GPAs for invalidation is benign in the current code base, as only x86's TDX consumes KVM_FILTER_{PRIVATE,SHARED}, and TDX doesn't yet support INIT_SHARED with guest_memfd. However, invalidating only private GPAs is conceptually wrong and a lurking bug, e.g. could result in missed invalidations if ARM starts filtering invalidations based on attributes. Fixes: 3d3a04fad25a ("KVM: Allow and advertise support for host mmap() on g= uest_memfd files") Signed-off-by: Sean Christopherson Reviewed-by: Ackerley Tng Reviewed-by: David Hildenbrand --- virt/kvm/guest_memfd.c | 64 +++++++++++++++++++++++++++++------------- 1 file changed, 44 insertions(+), 20 deletions(-) diff --git a/virt/kvm/guest_memfd.c b/virt/kvm/guest_memfd.c index cf3afba23a6b..e10d2c71e78c 100644 --- a/virt/kvm/guest_memfd.c +++ b/virt/kvm/guest_memfd.c @@ -102,8 +102,17 @@ static struct folio *kvm_gmem_get_folio(struct inode *= inode, pgoff_t index) return filemap_grab_folio(inode->i_mapping, index); } =20 -static void kvm_gmem_invalidate_begin(struct kvm_gmem *gmem, pgoff_t start, - pgoff_t end) +static enum kvm_gfn_range_filter kvm_gmem_get_invalidate_filter(struct ino= de *inode) +{ + if ((u64)inode->i_private & GUEST_MEMFD_FLAG_INIT_SHARED) + return KVM_FILTER_SHARED; + + return KVM_FILTER_PRIVATE; +} + +static void __kvm_gmem_invalidate_begin(struct kvm_gmem *gmem, pgoff_t sta= rt, + pgoff_t end, + enum kvm_gfn_range_filter attr_filter) { bool flush =3D false, found_memslot =3D false; struct kvm_memory_slot *slot; @@ -118,8 +127,7 @@ static void kvm_gmem_invalidate_begin(struct kvm_gmem *= gmem, pgoff_t start, .end =3D slot->base_gfn + min(pgoff + slot->npages, end) - pgoff, .slot =3D slot, .may_block =3D true, - /* guest memfd is relevant to only private mappings. */ - .attr_filter =3D KVM_FILTER_PRIVATE, + .attr_filter =3D attr_filter, }; =20 if (!found_memslot) { @@ -139,8 +147,21 @@ static void kvm_gmem_invalidate_begin(struct kvm_gmem = *gmem, pgoff_t start, KVM_MMU_UNLOCK(kvm); } =20 -static void kvm_gmem_invalidate_end(struct kvm_gmem *gmem, pgoff_t start, - pgoff_t end) +static void kvm_gmem_invalidate_begin(struct inode *inode, pgoff_t start, + pgoff_t end) +{ + struct list_head *gmem_list =3D &inode->i_mapping->i_private_list; + enum kvm_gfn_range_filter attr_filter; + struct kvm_gmem *gmem; + + attr_filter =3D kvm_gmem_get_invalidate_filter(inode); + + list_for_each_entry(gmem, gmem_list, entry) + __kvm_gmem_invalidate_begin(gmem, start, end, attr_filter); +} + +static void __kvm_gmem_invalidate_end(struct kvm_gmem *gmem, pgoff_t start, + pgoff_t end) { struct kvm *kvm =3D gmem->kvm; =20 @@ -151,12 +172,20 @@ static void kvm_gmem_invalidate_end(struct kvm_gmem *= gmem, pgoff_t start, } } =20 +static void kvm_gmem_invalidate_end(struct inode *inode, pgoff_t start, + pgoff_t end) +{ + struct list_head *gmem_list =3D &inode->i_mapping->i_private_list; + struct kvm_gmem *gmem; + + list_for_each_entry(gmem, gmem_list, entry) + __kvm_gmem_invalidate_end(gmem, start, end); +} + static long kvm_gmem_punch_hole(struct inode *inode, loff_t offset, loff_t= len) { - struct list_head *gmem_list =3D &inode->i_mapping->i_private_list; pgoff_t start =3D offset >> PAGE_SHIFT; pgoff_t end =3D (offset + len) >> PAGE_SHIFT; - struct kvm_gmem *gmem; =20 /* * Bindings must be stable across invalidation to ensure the start+end @@ -164,13 +193,11 @@ static long kvm_gmem_punch_hole(struct inode *inode, = loff_t offset, loff_t len) */ filemap_invalidate_lock(inode->i_mapping); =20 - list_for_each_entry(gmem, gmem_list, entry) - kvm_gmem_invalidate_begin(gmem, start, end); + kvm_gmem_invalidate_begin(inode, start, end); =20 truncate_inode_pages_range(inode->i_mapping, offset, offset + len - 1); =20 - list_for_each_entry(gmem, gmem_list, entry) - kvm_gmem_invalidate_end(gmem, start, end); + kvm_gmem_invalidate_end(inode, start, end); =20 filemap_invalidate_unlock(inode->i_mapping); =20 @@ -280,8 +307,9 @@ static int kvm_gmem_release(struct inode *inode, struct= file *file) * Zap all SPTEs pointed at by this file. Do not free the backing * memory, as its lifetime is associated with the inode, not the file. */ - kvm_gmem_invalidate_begin(gmem, 0, -1ul); - kvm_gmem_invalidate_end(gmem, 0, -1ul); + __kvm_gmem_invalidate_begin(gmem, 0, -1ul, + kvm_gmem_get_invalidate_filter(inode)); + __kvm_gmem_invalidate_end(gmem, 0, -1ul); =20 list_del(&gmem->entry); =20 @@ -403,8 +431,6 @@ 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 list_head *gmem_list =3D &mapping->i_private_list; - struct kvm_gmem *gmem; pgoff_t start, end; =20 filemap_invalidate_lock_shared(mapping); @@ -412,8 +438,7 @@ 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 - list_for_each_entry(gmem, gmem_list, entry) - kvm_gmem_invalidate_begin(gmem, start, end); + kvm_gmem_invalidate_begin(mapping->host, start, end); =20 /* * Do not truncate the range, what action is taken in response to the @@ -424,8 +449,7 @@ static int kvm_gmem_error_folio(struct address_space *m= apping, struct folio *fol * error to userspace. */ =20 - list_for_each_entry(gmem, gmem_list, entry) - kvm_gmem_invalidate_end(gmem, start, end); + kvm_gmem_invalidate_end(mapping->host, start, end); =20 filemap_invalidate_unlock_shared(mapping); =20 --=20 2.51.0.618.g983fd99d29-goog From nobody Wed Dec 17 19:21:06 2025 Received: from mail-pf1-f201.google.com (mail-pf1-f201.google.com [209.85.210.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id C6DC228BAA6 for ; Fri, 3 Oct 2025 23:26:20 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.210.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1759533982; cv=none; b=nq4pob0cDjzabP56hMRP+EunpKCDdpjDV1FRQV1bU1NYZnHwac4TwHhaUzqqOEKCoEmNXLI1QRO2u/ka1ONbmRBzITVqcg1yNOBcPoZkK7CgzNMiyI2OmAnIqlnx7H3I9UuWr5m/Y41G/O1m5vKeJUBUgHsehpMInv6JS8TUE64= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1759533982; c=relaxed/simple; bh=eekP/dx3x8jqekvGeoDTkRGaGODTC4nEEgFN30UFNN8=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=JHuBP1IhpvXJZKbn4vbQCGAURRp6ccgiMbFFGp8baxglxsrmBceOekS8JNOilbyfpuG/tVkdNQaoqE+cWD/yXKMcRQBuLTkx3UCECB57uvH3tiV08ySXM5GLq9wWPqwQJ0pEz+wGj6BkiyK71lK4KT/AQukp+YUv9fsVOFReZTs= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com; spf=pass smtp.mailfrom=flex--seanjc.bounces.google.com; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b=XzJmGkOR; arc=none smtp.client-ip=209.85.210.201 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=flex--seanjc.bounces.google.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="XzJmGkOR" Received: by mail-pf1-f201.google.com with SMTP id d2e1a72fcca58-78106e63bc9so3136385b3a.0 for ; Fri, 03 Oct 2025 16:26:20 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1759533980; x=1760138780; darn=vger.kernel.org; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:reply-to:from:to:cc:subject:date:message-id:reply-to; bh=9k0A/wIlTiMIkK4NIRv5JkCn3UX2zyXw07XNqkpaasU=; b=XzJmGkORhOa6aGhus8ckD2NNPUfKdrr0e2j3SKKb2cmjpFPxwTl4MamyXKLRuNHWbf 5lx97KFvPjtCSG7NNcfEc2Ds04NafrD6nahjKY0ZaU7kkzw18spJaVwLzef2OQRxOsSn nB969vqE54rrwI9DBIPuifITsglVZnGOI3AsGK4g0KPOMbAQOPpEOz9dble5HTBTmKHl VpNYS/RNQWOdgRQDBVUOoSRsSQFbI5Ofwgfa/aME+h6yO2nNzL82eke8HsUL3Lkyg0PK LUJR9DOCTxuTpUQ60h3+YB6wH8uBWJ0sItG2YQrjg9zrNR3ktcWITcOG+zAzEnWjRWdQ Y0WQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1759533980; x=1760138780; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:reply-to:x-gm-message-state:from:to:cc:subject:date:message-id :reply-to; bh=9k0A/wIlTiMIkK4NIRv5JkCn3UX2zyXw07XNqkpaasU=; b=Rs+qb4+bJCmYz5cDxCmQwYxjhzZE0jp95UK0JaFQpDG+8kxggNY97Rg0W2Ct0u+ndy tyX85RrJueudWnFg+dBWw+IkF9SK5YTH2is46kNxpqzR9ktFSIfAnFO352crZIFjdabo DU4Z+qFpsi0cq/EL78U+Ta41iDnpU19f6LwkHa4z+YJCpoqU8OEKtFo90WocHty3shEJ 1krRNYsUJXzrORLzx+myFd98DcKXqLwY2W5EgmAvdRLXMi87tlwmk4Gq+dUnn4U6kFnl 0MeMsU45eYI40lgYMjuZbbkuXTxP40c716H2XemwkeFniTwyFLNfhbsoAVUVcm2WZjS2 P6Og== X-Forwarded-Encrypted: i=1; AJvYcCVygg0q63dKZFTvIRK8hDr3bW2oPDSuxbUrk+1C2xuvAHdJmUoXUBCz3jQZnSSWaT8e4D04AtYL05gSaBA=@vger.kernel.org X-Gm-Message-State: AOJu0Yz4NQ3d/JwdY5d3zZU81aIVEmffEBpBIr16Oz9r2bkj82Q6LHk0 M9lyzoasWfRZ/aH0nmK5pc48BFdAiKTZT05fON63DG9ELJGA7FgyTALNH5ykx2+mS6dJBeLyxhi Ivhu+fQ== X-Google-Smtp-Source: AGHT+IH4nZpvTnjztjJocS+gtKNwmiitFnPO1cCK3pCOnqgiERq2oUPG+XolQgX15umxzn7SATNJ8PGMQ+s= X-Received: from pfux39.prod.google.com ([2002:a05:6a00:be7:b0:77f:6432:dc09]) (user=seanjc job=prod-delivery.src-stubby-dispatcher) by 2002:a05:6a00:3d51:b0:781:2320:5a33 with SMTP id d2e1a72fcca58-78c98d5d5a9mr5435952b3a.9.1759533980009; Fri, 03 Oct 2025 16:26:20 -0700 (PDT) Reply-To: Sean Christopherson Date: Fri, 3 Oct 2025 16:25:57 -0700 In-Reply-To: <20251003232606.4070510-1-seanjc@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20251003232606.4070510-1-seanjc@google.com> X-Mailer: git-send-email 2.51.0.618.g983fd99d29-goog Message-ID: <20251003232606.4070510-5-seanjc@google.com> Subject: [PATCH v2 04/13] KVM: Explicitly mark KVM_GUEST_MEMFD as depending on KVM_GENERIC_MMU_NOTIFIER From: Sean Christopherson To: Paolo Bonzini , Sean Christopherson , Christian Borntraeger , Janosch Frank , Claudio Imbrenda Cc: kvm@vger.kernel.org, linux-kernel@vger.kernel.org, David Hildenbrand , Fuad Tabba , Ackerley Tng Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Add KVM_GENERIC_MMU_NOTIFIER as a dependency for selecting KVM_GUEST_MEMFD, as guest_memfd relies on kvm_mmu_invalidate_{begin,end}(), which are defined if and only if the generic mmu_notifier implementation is enabled. The missing dependency is currently benign as s390 is the only KVM arch that doesn't utilize the generic mmu_notifier infrastructure, and s390 doesn't currently support guest_memfd. Fixes: a7800aa80ea4 ("KVM: Add KVM_CREATE_GUEST_MEMFD ioctl() for guest-spe= cific backing memory") Signed-off-by: Sean Christopherson Reviewed-by: David Hildenbrand --- virt/kvm/Kconfig | 1 + 1 file changed, 1 insertion(+) diff --git a/virt/kvm/Kconfig b/virt/kvm/Kconfig index 1b7d5be0b6c4..a01cc5743137 100644 --- a/virt/kvm/Kconfig +++ b/virt/kvm/Kconfig @@ -113,6 +113,7 @@ config KVM_GENERIC_MEMORY_ATTRIBUTES bool =20 config KVM_GUEST_MEMFD + depends on KVM_GENERIC_MMU_NOTIFIER select XARRAY_MULTI bool =20 --=20 2.51.0.618.g983fd99d29-goog From nobody Wed Dec 17 19:21:06 2025 Received: from mail-pj1-f73.google.com (mail-pj1-f73.google.com [209.85.216.73]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 4B5082C21CF for ; Fri, 3 Oct 2025 23:26:22 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.216.73 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1759533983; cv=none; b=Pk8LBTuwxJpBBdaeJ5qKnOMsObEFp/+HJU0NDW2GKDMc/v+d9N9lu2C596tuxddHpIrwibXU+OGapMGk7C+cAmEwEMYmG0DVIwlKjeh4l8dt4MNo/QhHuWrG5UIdELkTJzkdXtyDy6iMYEvSP86gbnDKKI5MqKxzhkp0p4YD9Go= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1759533983; c=relaxed/simple; bh=hVeXdPDZE/s1WX7ZLbBu0X7hAQNL0mbXw0X5RRQ5iC8=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=p9TQyvoYpEuHChlaGUpMYtejD3LRK5LzelfhZIJDJuupXmPURMur1xzjNNWrj40XFAwbnJF/LD54E/b3yI9U2NaDpILvrDshRDezH0QjPDQKfa+/4dx4FhDFF8qSrKMQeTZTxZm5rUuT/obYRc6Kdu9LBWHlTafPh0Jn9a7S6uU= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com; spf=pass smtp.mailfrom=flex--seanjc.bounces.google.com; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b=ukO/mnIG; arc=none smtp.client-ip=209.85.216.73 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=flex--seanjc.bounces.google.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="ukO/mnIG" Received: by mail-pj1-f73.google.com with SMTP id 98e67ed59e1d1-339a6d9defdso5349006a91.3 for ; Fri, 03 Oct 2025 16:26:22 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1759533981; x=1760138781; darn=vger.kernel.org; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:reply-to:from:to:cc:subject:date:message-id:reply-to; bh=BnqXgrEp0BrPyyaZOXVty/y9QlyaxhKDq3CIvXTV4iM=; b=ukO/mnIGy2dKTJi3jwXdjP2nc9GSoCSHg3uOvnTexie7b0yD1MOBnrmU/eA8sVo2bq fetoFRc2e7LithDaJF7TlgFvZYKY9magod11xraysn5s8J9me08OxMm+3v+SaysdFvQE nvut5sSC4/g/wucZBTIlrIGSgJQOFs8jFhrnsM2cdCB9PEwQgznnZ/u/FXOchVpwy1N+ 7kfk50KYrrsX9hhYtl5Lxy9GqLM1iuhx8IHYCTj6+MEGLFQikqF/rODH74HwoWbx/J/Q S4txcqlR0Rm/1nMfiuaBdOnA7dfzYPMx1QSkZOguCvqZFKKnKPJYekqRsNvHooRm+eXn CYZw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1759533981; x=1760138781; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:reply-to:x-gm-message-state:from:to:cc:subject:date:message-id :reply-to; bh=BnqXgrEp0BrPyyaZOXVty/y9QlyaxhKDq3CIvXTV4iM=; b=txZyq2TMPWWNsE0Y3SH4d6ZR+4bXBM4wfaI71GPqb+CLy31QRRdwDCfD7VG2dQpdPD 3LgaruxapaQsAAQ85SsCEjm3PiXIVCAQeh7j0E/TxyE6td4qF+9iH/+vI4hsvDolnvhU 0VqYGZrYVAhclShretsKoqsM+RZqS6XDnI56EyioOMp9ejDdqHOznIkEMQa4+kJ3XjY1 3i2UMYVcj2won/wnSbM1wZOBOwmboW1SbOCM1kqJyf5+XODfS1eztwyxw1XQAP7gPbfO L2iw4Am+ah7o4TV+7qK+OIaN3Zmf9CaQEVkztsfYa8kXBDWUc0EmeG39fi18ADa7c9+V nSXw== X-Forwarded-Encrypted: i=1; AJvYcCWJ1TlRe2dhn2eL0XjHUI8ooqEytqKZfq4Q6n3cINIycw94/FMgpnwflh6Nd5KNm0JsUIurIblBchX8d98=@vger.kernel.org X-Gm-Message-State: AOJu0YzaGNeC9KBMo8eQ5W+CP9rN6W5M8qE7LCikNgIHSiDuimA5M9Ew UnykbZBFQS8zks4A721vVANoTfLnMfoN/XYyWPeZ8hTpSdMs2sXukWqAE7Of5bg6WXXB+yaUzOK +Oc9jZQ== X-Google-Smtp-Source: AGHT+IHCp+k6bhpHyajHgY7Z2md8cqG1GHHJ3a+LGG8538QDAIuyMFLtajpOAADKCcS+hN7/x3QuGCcmmiM= X-Received: from pjvh15.prod.google.com ([2002:a17:90a:db8f:b0:330:6eb8:6ae4]) (user=seanjc job=prod-delivery.src-stubby-dispatcher) by 2002:a17:90b:4d8d:b0:32b:c9c0:2a11 with SMTP id 98e67ed59e1d1-339c2707c2emr5796988a91.4.1759533981554; Fri, 03 Oct 2025 16:26:21 -0700 (PDT) Reply-To: Sean Christopherson Date: Fri, 3 Oct 2025 16:25:58 -0700 In-Reply-To: <20251003232606.4070510-1-seanjc@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20251003232606.4070510-1-seanjc@google.com> X-Mailer: git-send-email 2.51.0.618.g983fd99d29-goog Message-ID: <20251003232606.4070510-6-seanjc@google.com> Subject: [PATCH v2 05/13] KVM: guest_memfd: Allow mmap() on guest_memfd for x86 VMs with private memory From: Sean Christopherson To: Paolo Bonzini , Sean Christopherson , Christian Borntraeger , Janosch Frank , Claudio Imbrenda Cc: kvm@vger.kernel.org, linux-kernel@vger.kernel.org, David Hildenbrand , Fuad Tabba , Ackerley Tng Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Allow mmap() on guest_memfd instances for x86 VMs with private memory as the need to track private vs. shared state in the guest_memfd instance is only pertinent to INIT_SHARED. Doing mmap() on private memory isn't terrible useful (yet!), but it's now possible, and will be desirable when guest_memfd gains support for other VMA-based syscalls, e.g. mbind() to set NUMA policy. Lift the restriction now, before MMAP support is officially released, so that KVM doesn't need to add another capability to enumerate support for mmap() on private memory. Fixes: 3d3a04fad25a ("KVM: Allow and advertise support for host mmap() on g= uest_memfd files") Signed-off-by: Sean Christopherson Reviewed-by: Ackerley Tng Reviewed-by: David Hildenbrand Tested-by: Ackerley Tng --- arch/x86/kvm/x86.c | 7 ++++--- include/linux/kvm_host.h | 12 +++++++++++- virt/kvm/guest_memfd.c | 9 ++------- virt/kvm/kvm_main.c | 6 +----- 4 files changed, 18 insertions(+), 16 deletions(-) diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c index 4b8138bd4857..fe3dc3eb4331 100644 --- a/arch/x86/kvm/x86.c +++ b/arch/x86/kvm/x86.c @@ -13942,10 +13942,11 @@ bool kvm_arch_no_poll(struct kvm_vcpu *vcpu) =20 #ifdef CONFIG_KVM_GUEST_MEMFD /* - * KVM doesn't yet support mmap() on guest_memfd for VMs with private memo= ry - * (the private vs. shared tracking needs to be moved into 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_mmap(struct kvm *kvm) +bool kvm_arch_supports_gmem_init_shared(struct kvm *kvm) { return !kvm_arch_has_private_mem(kvm); } diff --git a/include/linux/kvm_host.h b/include/linux/kvm_host.h index 19b8c4bebb9c..680ca838f018 100644 --- a/include/linux/kvm_host.h +++ b/include/linux/kvm_host.h @@ -729,7 +729,17 @@ static inline bool kvm_arch_has_private_mem(struct kvm= *kvm) #endif =20 #ifdef CONFIG_KVM_GUEST_MEMFD -bool kvm_arch_supports_gmem_mmap(struct kvm *kvm); +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 =20 #ifndef kvm_arch_has_readonly_mem diff --git a/virt/kvm/guest_memfd.c b/virt/kvm/guest_memfd.c index e10d2c71e78c..fbca8c0972da 100644 --- a/virt/kvm/guest_memfd.c +++ b/virt/kvm/guest_memfd.c @@ -485,7 +485,7 @@ static const struct inode_operations kvm_gmem_iops =3D { .setattr =3D kvm_gmem_setattr, }; =20 -bool __weak kvm_arch_supports_gmem_mmap(struct kvm *kvm) +bool __weak kvm_arch_supports_gmem_init_shared(struct kvm *kvm) { return true; } @@ -549,13 +549,8 @@ int kvm_gmem_create(struct kvm *kvm, struct kvm_create= _guest_memfd *args) { loff_t size =3D args->size; u64 flags =3D args->flags; - u64 valid_flags =3D 0; =20 - if (kvm_arch_supports_gmem_mmap(kvm)) - valid_flags |=3D GUEST_MEMFD_FLAG_MMAP | - GUEST_MEMFD_FLAG_INIT_SHARED; - - if (flags & ~valid_flags) + if (flags & ~kvm_gmem_get_supported_flags(kvm)) return -EINVAL; =20 if (size <=3D 0 || !PAGE_ALIGNED(size)) diff --git a/virt/kvm/kvm_main.c b/virt/kvm/kvm_main.c index 5f644ca54af3..b7a0ae2a7b20 100644 --- a/virt/kvm/kvm_main.c +++ b/virt/kvm/kvm_main.c @@ -4929,11 +4929,7 @@ static int kvm_vm_ioctl_check_extension_generic(stru= ct kvm *kvm, long arg) case KVM_CAP_GUEST_MEMFD: return 1; case KVM_CAP_GUEST_MEMFD_FLAGS: - if (!kvm || kvm_arch_supports_gmem_mmap(kvm)) - return GUEST_MEMFD_FLAG_MMAP | - GUEST_MEMFD_FLAG_INIT_SHARED; - - return 0; + return kvm_gmem_get_supported_flags(kvm); #endif default: break; --=20 2.51.0.618.g983fd99d29-goog From nobody Wed Dec 17 19:21:06 2025 Received: from mail-pl1-f201.google.com (mail-pl1-f201.google.com [209.85.214.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 09C4B28030E for ; Fri, 3 Oct 2025 23:26:23 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1759533985; cv=none; b=EUWS5a6usARlmyxASD4oECnGmtQpKJpr4REC7vuBkmiDnZipJIodS2J3rx4ko+Lj/HlMC/fwT/8OJs0s+Q+5xGyb+T2kBrXbVQkrGNqeL9px3PbBO+jVrpLs9OlIqhBj430RQhhKLBd9OSK1DIom4TRgExNBjGBdDtO2vci85Xc= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1759533985; c=relaxed/simple; bh=YbkbnjJu+36n5SbpfKPqSJITnPmgozv3ZgDZF5G6CM8=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=SkucAUCgcDP5w3QW4hRBcHndAGf/aUei9U3MpLd82cAaTbXpwSHc7wyJ2kXbQnAZSakGD8g6ySbLK8X19IGPCz0P5YFkf9tfdAOkgVwu/pBZnflR8iYzignro4ySqfUC6NT8aZc7bZAxbX5/7dG9GfWukd/KdgJHfC/wsT8j1S8= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com; spf=pass smtp.mailfrom=flex--seanjc.bounces.google.com; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b=AiXfxIJP; arc=none smtp.client-ip=209.85.214.201 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=flex--seanjc.bounces.google.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="AiXfxIJP" Received: by mail-pl1-f201.google.com with SMTP id d9443c01a7336-2681623f927so25886275ad.0 for ; Fri, 03 Oct 2025 16:26:23 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1759533983; x=1760138783; darn=vger.kernel.org; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:reply-to:from:to:cc:subject:date:message-id:reply-to; bh=zcRpiMHDbu4Skkpi+qu52sLrguB0NGA5sLQ3sxPzJBs=; b=AiXfxIJPl2GCkMGlcI81DP5jcIa49jw5o2V0mPBLugW1RAO++8xASAPCQqQtDqiWh2 Ng0+BYodObkU9XD8MVEy9iwX7RS1qH8dqdKuXBhDw42LPu1jg8tuYsqV2mfJVuwPKH5t fL3FjC2MJE1IX7eGbAmm167VU2c/gL+8Va4UV4EzOKPQMnuh2pkGD3vE8CoilkLcv85G uagYYy+d4F4thc/4PsqpsZdJ2M4xUCwXw0dcR4iWur4AZcfIGOAAin0uJFsrio8Edb21 p3O23cjH9KjUh3ztzvIHN79rbLB7S3tcQzj6A6Yktg8BE21r8FBni0kig2xhWzVRuF5u paAw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1759533983; x=1760138783; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:reply-to:x-gm-message-state:from:to:cc:subject:date:message-id :reply-to; bh=zcRpiMHDbu4Skkpi+qu52sLrguB0NGA5sLQ3sxPzJBs=; b=IT+6Dc3cupuTrtKWF7uzssZT8G5I9dTG7eNb+u5dwNK5UcyOd1xeCllreXv3doqUp/ fVTimlq5qTyxPwBRNdRwls1hMGLa8QaZYz9NBzvg7TwQue45LMnuyfUpuYcmvghAhTwU x+uTAqWmaVAT+sGLXd1GUwVzy+Re3KOhlnxCLMwrvcUO/KYJEdyKfF6cMWJgtRnYzsh+ d5AaPh3Ox9+Ci/Jz7VpdyvTX2dXmjxcllQn+3d5DamksycFXeAnVTN6G7h83XsOA5ehv yYUsCpKbxqEfF1XoP439lIjaZr/3A3zMYnUxDgR2PyiqlBrbw26KjIahU8N6uiVkff9e /dMw== X-Forwarded-Encrypted: i=1; AJvYcCW+7UosQxYUmcW5aAUKkO1a1+vOVjCVFO5h99l+VIVRbWq4Jj/SkZEGmE/1d3DSgswlbLZujho9OB4nqhw=@vger.kernel.org X-Gm-Message-State: AOJu0YyytDlnvQ/2xs0eXfUl83WNoDY3KzqQAvAD6176k15FNx6ou8qt LFx5dBdUQFg5i1+Zo9n+u+rt12BMy/yDjjga0Tj/DHkQERupBPMpTlwcuVth2vSfM6aw8qBaxaX rwdLCbQ== X-Google-Smtp-Source: AGHT+IGWmXdxDD7fXZQjTHS0JUXz4LfC+NEFLqX200bITrSDJCTeu7CuxDV5nElaqxoRNwxo8qlmJi5xu9U= X-Received: from pjbnh7.prod.google.com ([2002:a17:90b:3647:b0:32b:95bb:dbc]) (user=seanjc job=prod-delivery.src-stubby-dispatcher) by 2002:a17:903:384d:b0:246:cfc4:9a30 with SMTP id d9443c01a7336-28e9a61a7c2mr50968355ad.35.1759533983322; Fri, 03 Oct 2025 16:26:23 -0700 (PDT) Reply-To: Sean Christopherson Date: Fri, 3 Oct 2025 16:25:59 -0700 In-Reply-To: <20251003232606.4070510-1-seanjc@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20251003232606.4070510-1-seanjc@google.com> X-Mailer: git-send-email 2.51.0.618.g983fd99d29-goog Message-ID: <20251003232606.4070510-7-seanjc@google.com> Subject: [PATCH v2 06/13] KVM: selftests: Stash the host page size in a global in the guest_memfd test From: Sean Christopherson To: Paolo Bonzini , Sean Christopherson , Christian Borntraeger , Janosch Frank , Claudio Imbrenda Cc: kvm@vger.kernel.org, linux-kernel@vger.kernel.org, David Hildenbrand , Fuad Tabba , Ackerley Tng Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Use a global variable to track the host page size in the guest_memfd test so that the information doesn't need to be constantly passed around. The state is purely a reflection of the underlying system, i.e. can't be set by the test and is constant for a given invocation of the test, and thus explicitly passing the host page size to individual testcases adds no value, e.g. doesn't allow testing different combinations. Making page_size a global will simplify an upcoming change to create a new guest_memfd instance per testcase. No functional change intended. Reviewed-by: Fuad Tabba Tested-by: Fuad Tabba Reviewed-by: David Hildenbrand Reviewed-by: Ackerley Tng Signed-off-by: Sean Christopherson Tested-by: Ackerley Tng --- .../testing/selftests/kvm/guest_memfd_test.c | 37 +++++++++---------- 1 file changed, 18 insertions(+), 19 deletions(-) diff --git a/tools/testing/selftests/kvm/guest_memfd_test.c b/tools/testing= /selftests/kvm/guest_memfd_test.c index 0de56ce3c4e2..a7c9601bd31e 100644 --- a/tools/testing/selftests/kvm/guest_memfd_test.c +++ b/tools/testing/selftests/kvm/guest_memfd_test.c @@ -24,6 +24,8 @@ #include "test_util.h" #include "ucall_common.h" =20 +static size_t page_size; + static void test_file_read_write(int fd) { char buf[64]; @@ -38,7 +40,7 @@ static void test_file_read_write(int fd) "pwrite on a guest_mem fd should fail"); } =20 -static void test_mmap_supported(int fd, size_t page_size, size_t total_siz= e) +static void test_mmap_supported(int fd, size_t total_size) { const char val =3D 0xaa; char *mem; @@ -78,7 +80,7 @@ void fault_sigbus_handler(int signum) siglongjmp(jmpbuf, 1); } =20 -static void test_fault_overflow(int fd, size_t page_size, size_t total_siz= e) +static void test_fault_overflow(int fd, size_t total_size) { struct sigaction sa_old, sa_new =3D { .sa_handler =3D fault_sigbus_handler, @@ -106,7 +108,7 @@ static void test_fault_overflow(int fd, size_t page_siz= e, size_t total_size) TEST_ASSERT(!ret, "munmap() should succeed."); } =20 -static void test_mmap_not_supported(int fd, size_t page_size, size_t total= _size) +static void test_mmap_not_supported(int fd, size_t total_size) { char *mem; =20 @@ -117,7 +119,7 @@ static void test_mmap_not_supported(int fd, size_t page= _size, size_t total_size) TEST_ASSERT_EQ(mem, MAP_FAILED); } =20 -static void test_file_size(int fd, size_t page_size, size_t total_size) +static void test_file_size(int fd, size_t total_size) { struct stat sb; int ret; @@ -128,7 +130,7 @@ static void test_file_size(int fd, size_t page_size, si= ze_t total_size) TEST_ASSERT_EQ(sb.st_blksize, page_size); } =20 -static void test_fallocate(int fd, size_t page_size, size_t total_size) +static void test_fallocate(int fd, size_t total_size) { int ret; =20 @@ -165,7 +167,7 @@ static void test_fallocate(int fd, size_t page_size, si= ze_t total_size) TEST_ASSERT(!ret, "fallocate to restore punched hole should succeed"); } =20 -static void test_invalid_punch_hole(int fd, size_t page_size, size_t total= _size) +static void test_invalid_punch_hole(int fd, size_t total_size) { struct { off_t offset; @@ -196,8 +198,7 @@ static void test_invalid_punch_hole(int fd, size_t page= _size, size_t total_size) } =20 static void test_create_guest_memfd_invalid_sizes(struct kvm_vm *vm, - uint64_t guest_memfd_flags, - size_t page_size) + uint64_t guest_memfd_flags) { size_t size; int fd; @@ -214,7 +215,6 @@ static void test_create_guest_memfd_multiple(struct kvm= _vm *vm) { int fd1, fd2, ret; struct stat st1, st2; - size_t page_size =3D getpagesize(); =20 fd1 =3D __vm_create_guest_memfd(vm, page_size, 0); TEST_ASSERT(fd1 !=3D -1, "memfd creation should succeed"); @@ -242,7 +242,6 @@ static void test_create_guest_memfd_multiple(struct kvm= _vm *vm) static void test_guest_memfd_flags(struct kvm_vm *vm) { uint64_t valid_flags =3D vm_check_cap(vm, KVM_CAP_GUEST_MEMFD_FLAGS); - size_t page_size =3D getpagesize(); uint64_t flag; int fd; =20 @@ -265,11 +264,9 @@ static void test_guest_memfd(unsigned long vm_type) { struct kvm_vm *vm; size_t total_size; - size_t page_size; uint64_t flags; int fd; =20 - page_size =3D getpagesize(); total_size =3D page_size * 4; =20 vm =3D vm_create_barebones_type(vm_type); @@ -280,22 +277,22 @@ static void test_guest_memfd(unsigned long vm_type) flags &=3D ~GUEST_MEMFD_FLAG_MMAP; =20 test_create_guest_memfd_multiple(vm); - test_create_guest_memfd_invalid_sizes(vm, flags, page_size); + test_create_guest_memfd_invalid_sizes(vm, flags); =20 fd =3D vm_create_guest_memfd(vm, total_size, flags); =20 test_file_read_write(fd); =20 if (flags & GUEST_MEMFD_FLAG_MMAP) { - test_mmap_supported(fd, page_size, total_size); - test_fault_overflow(fd, page_size, total_size); + test_mmap_supported(fd, total_size); + test_fault_overflow(fd, total_size); } else { - test_mmap_not_supported(fd, page_size, total_size); + test_mmap_not_supported(fd, total_size); } =20 - test_file_size(fd, page_size, total_size); - test_fallocate(fd, page_size, total_size); - test_invalid_punch_hole(fd, page_size, total_size); + test_file_size(fd, total_size); + test_fallocate(fd, total_size); + test_invalid_punch_hole(fd, total_size); =20 test_guest_memfd_flags(vm); =20 @@ -374,6 +371,8 @@ int main(int argc, char *argv[]) =20 TEST_REQUIRE(kvm_has_cap(KVM_CAP_GUEST_MEMFD)); =20 + page_size =3D getpagesize(); + /* * Not all architectures support KVM_CAP_VM_TYPES. However, those that * support guest_memfd have that support for the default VM type. --=20 2.51.0.618.g983fd99d29-goog From nobody Wed Dec 17 19:21:06 2025 Received: from mail-pg1-f202.google.com (mail-pg1-f202.google.com [209.85.215.202]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id C99072DCBFC for ; Fri, 3 Oct 2025 23:26:25 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.215.202 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1759533987; cv=none; b=eza6NpjoDQXV+d5vz0Z28e5gM/4BUvEkHnUHBDll1WB0MwPD6ezgZFDlYqkWtuS0uXkk4kLP+p1Yb+3+1AmFzI/YHepiTsn6JjsROJVtp4sIYt7UmefbkmxX/S4HtXAW59oAivwsQM8sSBlYoHsmdLQdijEuxcIESstu5Xav/v8= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1759533987; c=relaxed/simple; bh=nd69QGguznpeI4Gza41p4mzVL4UTWq4dJdc3g2IHnok=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=oTVftcYkrQDn/nr1RsZR2iwZIGOI1Dmqd4sK7bE+6ElwNah4qTULRxLPCK2yjXBjbiczPF6UanapnQc4FZvRbC/vXqdiheq6qoKBPBuX317Gc9JZvsijCCA0rVFvKP3VNKzEsItpqSbSEzjy6I40daEIgcV3ZVHYW3RVebWT1vE= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com; spf=pass smtp.mailfrom=flex--seanjc.bounces.google.com; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b=s/Emx9Fb; arc=none smtp.client-ip=209.85.215.202 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=flex--seanjc.bounces.google.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="s/Emx9Fb" Received: by mail-pg1-f202.google.com with SMTP id 41be03b00d2f7-b57c2371182so2436121a12.1 for ; Fri, 03 Oct 2025 16:26:25 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1759533985; x=1760138785; darn=vger.kernel.org; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:reply-to:from:to:cc:subject:date:message-id:reply-to; bh=hM+LzD7qISlGD7ztSYqO8+LflSdSs8OWf9vFP02fQiE=; b=s/Emx9FbbZG1KzOSxuPfyM/RCIAqYSOSGnD22ZBN97BOq5J2oMdmawgcdVHPwPW262 wMw3UQsK4PFpFOnUdEujITnwZmd+/eWwsMd7gfr1yZy+xQOFEfku5Pz9xqi2ZQT2kydF 8cGeuO71QAGS8UCLnWes+89xtd7SboEaffrEyI9rFnQajsYhhfAK1Azvjj/kgIbkbok6 yGfqyo1ex8OPdhser0YewxAlQB+fzaANGAyanAcr8MEoF49/nfm04zHMIJgL1HnDPaeK CN34/EsWHBDG0T8fRglDCDBZxmGNKxsdhEicVKiCCbEep9XmKc9C9LiCdnIUyjVsLpvG RUXA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1759533985; x=1760138785; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:reply-to:x-gm-message-state:from:to:cc:subject:date:message-id :reply-to; bh=hM+LzD7qISlGD7ztSYqO8+LflSdSs8OWf9vFP02fQiE=; b=Mi9SF/bRw25RpOtYxFOrLNXa3R3v2mRqHWsrphsKuBKDsiO4QOpzBV4vS/1iZi47Ey 2NQH8O9tZo9MHnQj8YumqN/3EOOirxjpKEd+AZibkIYjdEBRsq2oH4s8NoEnbB3i9V33 2JFBjkRI9O6JJPPRNDqeyrfQMR1+aWCMYkhbQMxiCni7GIG7rcgsAy93+xfEa/eTILmu yPNOWB/QADGhbDsq8x9SNPZ3jZDn8kEHyacHDr6fb0y1Fb7jocwF3A5BRS6V78vzAbCO KrVd7ErrJD1KAgFriTCROiz9r03IwJzk8qA6e2sHj1Hn6Q3pl4JUbjxuCHnnG7QItPj8 fbNA== X-Forwarded-Encrypted: i=1; AJvYcCX1Qp/4R4ZuK3nYI/1c2HKFp0W3d+aFm2fATvykkyKZk3c7myt5Dra4rADkDyj7qxM7NKT9Yg0qkAtHu5E=@vger.kernel.org X-Gm-Message-State: AOJu0YxlJa2mOMxceDTItLGoiW9aKxbXCCavBTVwjigIO9PZXeBBviyp otwJZANAdEujVhZNIU80C/7nUQCi5/L8iHFT++sesmVcav82/QZnlMUk2/smaU2L919SS7a6YoD a/M3Thg== X-Google-Smtp-Source: AGHT+IHsxzQkcr7acPMKC6TgIDvgzhS52pHNU7hj+C6RgZKPwBmYvzlpWGHgGFZ/bj1NAjYqXQWlzBxmdKs= X-Received: from pfun4.prod.google.com ([2002:a05:6a00:7c4:b0:782:3712:63e4]) (user=seanjc job=prod-delivery.src-stubby-dispatcher) by 2002:a05:6a21:6d84:b0:2f8:b535:7931 with SMTP id adf61e73a8af0-32b61dfb366mr4895140637.9.1759533985043; Fri, 03 Oct 2025 16:26:25 -0700 (PDT) Reply-To: Sean Christopherson Date: Fri, 3 Oct 2025 16:26:00 -0700 In-Reply-To: <20251003232606.4070510-1-seanjc@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20251003232606.4070510-1-seanjc@google.com> X-Mailer: git-send-email 2.51.0.618.g983fd99d29-goog Message-ID: <20251003232606.4070510-8-seanjc@google.com> Subject: [PATCH v2 07/13] KVM: selftests: Create a new guest_memfd for each testcase From: Sean Christopherson To: Paolo Bonzini , Sean Christopherson , Christian Borntraeger , Janosch Frank , Claudio Imbrenda Cc: kvm@vger.kernel.org, linux-kernel@vger.kernel.org, David Hildenbrand , Fuad Tabba , Ackerley Tng Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Refactor the guest_memfd selftest to improve test isolation by creating a a new guest_memfd for each testcase. Currently, the test reuses a single guest_memfd instance for all testcases, and thus creates dependencies between tests, e.g. not truncating folios from the guest_memfd instance at the end of a test could lead to unexpected results (see the PUNCH_HOLE purging that needs to done by in-flight the NUMA testcases[1]). Invoke each test via a macro wrapper to create and close a guest_memfd to cut down on the boilerplate copy+paste needed to create a test. Link: https://lore.kernel.org/all/20250827175247.83322-10-shivankg@amd.com Reported-by: Ackerley Tng Reviewed-by: Fuad Tabba Tested-by: Fuad Tabba Reviewed-by: David Hildenbrand Signed-off-by: Sean Christopherson Reviewed-by: Ackerley Tng Reviewed-by: Lisa Wang Tested-by: Ackerley Tng Tested-by: Lisa Wang --- .../testing/selftests/kvm/guest_memfd_test.c | 31 ++++++++++--------- 1 file changed, 16 insertions(+), 15 deletions(-) diff --git a/tools/testing/selftests/kvm/guest_memfd_test.c b/tools/testing= /selftests/kvm/guest_memfd_test.c index a7c9601bd31e..afdc4d3a956d 100644 --- a/tools/testing/selftests/kvm/guest_memfd_test.c +++ b/tools/testing/selftests/kvm/guest_memfd_test.c @@ -26,7 +26,7 @@ =20 static size_t page_size; =20 -static void test_file_read_write(int fd) +static void test_file_read_write(int fd, size_t total_size) { char buf[64]; =20 @@ -260,14 +260,18 @@ static void test_guest_memfd_flags(struct kvm_vm *vm) } } =20 +#define gmem_test(__test, __vm, __flags) \ +do { \ + int fd =3D vm_create_guest_memfd(__vm, page_size * 4, __flags); \ + \ + test_##__test(fd, page_size * 4); \ + close(fd); \ +} while (0) + static void test_guest_memfd(unsigned long vm_type) { struct kvm_vm *vm; - size_t total_size; uint64_t flags; - int fd; - - total_size =3D page_size * 4; =20 vm =3D vm_create_barebones_type(vm_type); flags =3D vm_check_cap(vm, KVM_CAP_GUEST_MEMFD_FLAGS); @@ -279,24 +283,21 @@ static void test_guest_memfd(unsigned long vm_type) test_create_guest_memfd_multiple(vm); test_create_guest_memfd_invalid_sizes(vm, flags); =20 - fd =3D vm_create_guest_memfd(vm, total_size, flags); - - test_file_read_write(fd); + gmem_test(file_read_write, vm, flags); =20 if (flags & GUEST_MEMFD_FLAG_MMAP) { - test_mmap_supported(fd, total_size); - test_fault_overflow(fd, total_size); + gmem_test(mmap_supported, vm, flags); + gmem_test(fault_overflow, vm, flags); } else { - test_mmap_not_supported(fd, total_size); + gmem_test(mmap_not_supported, vm, flags); } =20 - test_file_size(fd, total_size); - test_fallocate(fd, total_size); - test_invalid_punch_hole(fd, total_size); + gmem_test(file_size, vm, flags); + gmem_test(fallocate, vm, flags); + gmem_test(invalid_punch_hole, vm, flags); =20 test_guest_memfd_flags(vm); =20 - close(fd); kvm_vm_free(vm); } =20 --=20 2.51.0.618.g983fd99d29-goog From nobody Wed Dec 17 19:21:06 2025 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 22F0F2DCBEB for ; Fri, 3 Oct 2025 23:26:26 +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=1759533988; cv=none; b=U0UP9q+TjSDvY3xlBPbTH50InN8L+ml8CMDJuuFnWwiI3KE6PDNkwjOddCBeBw+BkVHw9dQhooByRvTqtBmMRv5VrnSh+wqjuTe8CqTd4JZH91uIfqPXos8ZZOYFlK7YPxJ2A02lGfsns1UEe8Y4s0CZa81UncsJr4mbRB2tQi8= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1759533988; c=relaxed/simple; bh=BhNjeYFnokF+ua1tIz2LPgXh7HZumKowhDkAoR9n5/Y=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=hWKpEZpsZukUqn3H/MG3MrySmtTPmVR4g6+6rHUflGY+fALvNFA6MxfyvepSTjebf9modF/6rVdpkLeoyZLwKdjJlWf/fGvFuNU1O1j1rTOePmT12/vCxA1WBeZs46qntGlrnr41oEd6nYJ85bRGyDBG+Dv227jhmFeRh9LgWio= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com; spf=pass smtp.mailfrom=flex--seanjc.bounces.google.com; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b=cRQCnXHj; 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--seanjc.bounces.google.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="cRQCnXHj" Received: by mail-pl1-f202.google.com with SMTP id d9443c01a7336-2698b5fbe5bso30670135ad.0 for ; Fri, 03 Oct 2025 16:26:26 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1759533986; x=1760138786; darn=vger.kernel.org; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:reply-to:from:to:cc:subject:date:message-id:reply-to; bh=xXKfxRFAWdW67r2vJNGKUvHwEwOyssnfYlc7e1a1sls=; b=cRQCnXHjIMiSJBqC7T4VhxM9qBrTFH1xG439IsB2THbwDY4JYU69VJMqGEUMwY9aJ6 xjA/vB5Zgjk6GacmAMQcy4Lj0AhV7NsXQIeEXayJI/t5vqaiO+1kmBffCt85zCwDVhcr B/Lqy0KbW4a3xIK37bZL2APzHmQTdSu6sLDzhaUVbGZqsrvel2tgzMQzfeKU6Mv59V24 kj2NY7EQ9KpJmO2MDmTziWcYj5JpxdXN1hoA1L0459wbHnPJe2UDA9eSXZjyUFGoUWEF TjykEUgHL07e2W1L9e4cvhCXPHpLzvA2u0gp710Qih7O4G7iO448FVwKKBlrRCWNi1uG km9A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1759533986; x=1760138786; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:reply-to:x-gm-message-state:from:to:cc:subject:date:message-id :reply-to; bh=xXKfxRFAWdW67r2vJNGKUvHwEwOyssnfYlc7e1a1sls=; b=FhaL1GGPhACqsjUlpKlpDFHyDbY3Bp5qHLlFMYNtaOvfH2D00CVfry9YhiPvKe7xsm lRR4WzCCBHYYPJ0K+C6Q9xFyXuWj8abfz9fde+ZKVPVsxwhMoNAloT/As9UHit1F155g XWIMtj+vpHrJY2EqmDGglB9JsivM4j97PYBg3OaDNVOQoSyNVTIJ3exC5wPBlKxYEcQa Y2WMn8h721bRTmXueA3k1rXBRfcixw95vnnA56zQxtnPcvE8EvjzOjaKjKtJucUf9xVv m/3RYy7lBK0FzGAbrDAUnepL9ihEvNG2GAJOkfAUBrmcU+N90LaICCY0kGkNpURFS09W 6zFg== X-Forwarded-Encrypted: i=1; AJvYcCWT6JG0kfpnlJY5+1F0/9VBwMfixAPAxN9iXiM8evws8SZlqiiom0p70nTIPhvY6o9KcribALx9LVmeFD8=@vger.kernel.org X-Gm-Message-State: AOJu0YxnlzbpcpPvLqGsHd0+5MfCZ6xiQQPQCI/UE89s/UqN8sosnrGC 8i9ozWIObB0sVemGY3tGSVlgxyi6cNZi+n8lbuzluCkh+FEBM2URuL5md1NCQHivxBqP7UcYipu CUzVVLw== X-Google-Smtp-Source: AGHT+IHbwSDrgPwwBMoC86LZ0150nH47BB8TTUv2JzYBTbBocZiPvWuMmbMAGYRM+VW0iAgrepLc0aq8W/A= X-Received: from pjvh15.prod.google.com ([2002:a17:90a:db8f:b0:330:6eb8:6ae4]) (user=seanjc job=prod-delivery.src-stubby-dispatcher) by 2002:a17:903:3845:b0:267:af07:6526 with SMTP id d9443c01a7336-28e9a693c63mr53558535ad.55.1759533986435; Fri, 03 Oct 2025 16:26:26 -0700 (PDT) Reply-To: Sean Christopherson Date: Fri, 3 Oct 2025 16:26:01 -0700 In-Reply-To: <20251003232606.4070510-1-seanjc@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20251003232606.4070510-1-seanjc@google.com> X-Mailer: git-send-email 2.51.0.618.g983fd99d29-goog Message-ID: <20251003232606.4070510-9-seanjc@google.com> Subject: [PATCH v2 08/13] KVM: selftests: Add test coverage for guest_memfd without GUEST_MEMFD_FLAG_MMAP From: Sean Christopherson To: Paolo Bonzini , Sean Christopherson , Christian Borntraeger , Janosch Frank , Claudio Imbrenda Cc: kvm@vger.kernel.org, linux-kernel@vger.kernel.org, David Hildenbrand , Fuad Tabba , Ackerley Tng Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" From: Ackerley Tng If a VM type supports KVM_CAP_GUEST_MEMFD_MMAP, the guest_memfd test will run all test cases with GUEST_MEMFD_FLAG_MMAP set. This leaves the code path for creating a non-mmap()-able guest_memfd on a VM that supports mappable guest memfds untested. Refactor the test to run the main test suite with a given set of flags. Then, for VM types that support the mappable capability, invoke the test suite twice: once with no flags, and once with GUEST_MEMFD_FLAG_MMAP set. This ensures both creation paths are properly exercised on capable VMs. Run test_guest_memfd_flags() only once per VM type since it depends only on the set of valid/supported flags, i.e. iterating over an arbitrary set of flags is both unnecessary and wrong. Signed-off-by: Ackerley Tng [sean: use double-underscores for the inner helper] Reviewed-by: Fuad Tabba Tested-by: Fuad Tabba Reviewed-by: David Hildenbrand Signed-off-by: Sean Christopherson --- .../testing/selftests/kvm/guest_memfd_test.c | 27 +++++++++++-------- 1 file changed, 16 insertions(+), 11 deletions(-) diff --git a/tools/testing/selftests/kvm/guest_memfd_test.c b/tools/testing= /selftests/kvm/guest_memfd_test.c index afdc4d3a956d..9f98a067ab51 100644 --- a/tools/testing/selftests/kvm/guest_memfd_test.c +++ b/tools/testing/selftests/kvm/guest_memfd_test.c @@ -268,18 +268,8 @@ do { \ close(fd); \ } while (0) =20 -static void test_guest_memfd(unsigned long vm_type) +static void __test_guest_memfd(struct kvm_vm *vm, uint64_t flags) { - struct kvm_vm *vm; - uint64_t flags; - - vm =3D vm_create_barebones_type(vm_type); - flags =3D vm_check_cap(vm, KVM_CAP_GUEST_MEMFD_FLAGS); - - /* This test doesn't yet support testing mmap() on private memory. */ - if (!(flags & GUEST_MEMFD_FLAG_INIT_SHARED)) - flags &=3D ~GUEST_MEMFD_FLAG_MMAP; - test_create_guest_memfd_multiple(vm); test_create_guest_memfd_invalid_sizes(vm, flags); =20 @@ -295,9 +285,24 @@ static void test_guest_memfd(unsigned long vm_type) gmem_test(file_size, vm, flags); gmem_test(fallocate, vm, flags); gmem_test(invalid_punch_hole, vm, flags); +} + +static void test_guest_memfd(unsigned long vm_type) +{ + struct kvm_vm *vm =3D vm_create_barebones_type(vm_type); + uint64_t flags; =20 test_guest_memfd_flags(vm); =20 + __test_guest_memfd(vm, 0); + + flags =3D vm_check_cap(vm, KVM_CAP_GUEST_MEMFD_FLAGS); + + /* MMAP should always be supported if INIT_SHARED is supported. */ + if (flags & GUEST_MEMFD_FLAG_INIT_SHARED) + __test_guest_memfd(vm, GUEST_MEMFD_FLAG_MMAP | + GUEST_MEMFD_FLAG_INIT_SHARED); + kvm_vm_free(vm); } =20 --=20 2.51.0.618.g983fd99d29-goog From nobody Wed Dec 17 19:21:06 2025 Received: from mail-pj1-f74.google.com (mail-pj1-f74.google.com [209.85.216.74]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 7F21A2DF128 for ; Fri, 3 Oct 2025 23:26:28 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.216.74 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1759533992; cv=none; b=KEa9GirXrEgdz5byOmUx6MRL3/PqmAPSXT8zbiyl7jKViGHM8I4Ke67K9YcVETASd/o9OfLk5H/qtP4zhjI2xLltJ0NcUcZjxkg0+I+Dx0i5RA7w8DumWQnVAOVSGBOnem97jj+sW9Py2rBYRsJb3qS7NddmBpnojCBWDfvZDZ0= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1759533992; c=relaxed/simple; bh=6A3rm7M0SNfn/DEmaJmZ8IQYVrrLiungr00EjqUjHk8=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=KVJo3t7o/GCi1MqMIMwZcB+tSHfw1p7mHxOhI/RK3gKe2T9sRxLQMNLblbiXh7+uPO/flH/r0pRGU1UDsAyT/lsSFC+lwrSZAotp5oDq55GY0D5wX6Penc4HhS1nur2J1kfMJOK/NslVQRBRFAqv3prp1j/Sl32yZFco2H3SefM= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com; spf=pass smtp.mailfrom=flex--seanjc.bounces.google.com; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b=COnD2lko; arc=none smtp.client-ip=209.85.216.74 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=flex--seanjc.bounces.google.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="COnD2lko" Received: by mail-pj1-f74.google.com with SMTP id 98e67ed59e1d1-330a4d5c4efso2480303a91.0 for ; Fri, 03 Oct 2025 16:26:28 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1759533988; x=1760138788; darn=vger.kernel.org; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:reply-to:from:to:cc:subject:date:message-id:reply-to; bh=oWL2l0x7QCaxAl9nbpgRZwNGP+fn2GN1l9LXkO0Ve1g=; b=COnD2lkoyYsSsZCfwPv5+pNhDTJBAIW3j9nOnhl8IaTyFIItBQIogwmmhQSZrScvXB OJeLwW0XM8DJwaObXScixN1o95eNJ2BwWm74MIuduFYGP0v3zZJzJL2auGon2lC3XIK+ E2MFFaACpbvlir97nIr3imtbvsB5qnP1pZEoYRd8iDUiM2m5hSeUzuCQBTVnfTOP9MIN /b21VUJ5SkSscz1++qL/t2EaY/k3pGtxKjA+SD9zfD43b9i7ui4aFGD5tTgqDkZxiGMr KpsIipLDmt0Y87PKDVV/8RGGz5aKqSrWw8zIJdUfSlVq4Bex20pP7qjdSO2rIGXtT9oT NAQg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1759533988; x=1760138788; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:reply-to:x-gm-message-state:from:to:cc:subject:date:message-id :reply-to; bh=oWL2l0x7QCaxAl9nbpgRZwNGP+fn2GN1l9LXkO0Ve1g=; b=wQ2Uu1aD7F2wkMXguko4rEDqLGMksE/Zs8/ZUuizxPsYjynU59y6X+G531atNhkSzj VPA268S7GHkIZ+f8vHJe5qiLv0muaGFhv3l25j0qJbNDJPsk74jJBoTu9BqShdCTp0sP z6Wsk+LOLv7nyK7jVp4KGC1RDzJE74DQWo12sDeUJWEocKnIts9hA3gL1xSn/3u0r4qi 5HpEufQPWpDpw8cqo9OCUHfvcUaWy/llK5BRe3r6qk4haOp/ki8fxgok31QqsV7fqjl1 W9s0s5zOAaNSFhpHfBjOkQcgn8bIFQTOe3LqUWv+g+uLRcypaMtLexXaRciLQq3fCzjY q5BA== X-Forwarded-Encrypted: i=1; AJvYcCWBqOwNnBB4Z8o+s/RM+6hvZaDeE7MpSPyPtBWsuu5S2iqEYJ+iUCv/xfeVIwr0569hTx+iUsucUa7NIBM=@vger.kernel.org X-Gm-Message-State: AOJu0Yy4PsVpWspvj7kZkGv5soa/qUfvLb/AY4qzIL+ZWpbHogReYEca ItCOZy5pW7a3Y9PhSWCrY3IFNA9UtolPND3tKBkoeCye9tvkcL5tC9Pb4KyFHn/tXOfm96qr1BB yObtK3g== X-Google-Smtp-Source: AGHT+IG6jhNH5LLVuE/VonOGTqxAkXKOoCKJ+ViZFBmtyFsLnGr4P81Fp/FlqkwNWy4JKdDWCIbTFL0NooA= X-Received: from pjbsd7.prod.google.com ([2002:a17:90b:5147:b0:338:3770:a496]) (user=seanjc job=prod-delivery.src-stubby-dispatcher) by 2002:a17:90b:1b07:b0:32b:cb15:5fdc with SMTP id 98e67ed59e1d1-339c27af443mr5341457a91.30.1759533987905; Fri, 03 Oct 2025 16:26:27 -0700 (PDT) Reply-To: Sean Christopherson Date: Fri, 3 Oct 2025 16:26:02 -0700 In-Reply-To: <20251003232606.4070510-1-seanjc@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20251003232606.4070510-1-seanjc@google.com> X-Mailer: git-send-email 2.51.0.618.g983fd99d29-goog Message-ID: <20251003232606.4070510-10-seanjc@google.com> Subject: [PATCH v2 09/13] KVM: selftests: Add wrappers for mmap() and munmap() to assert success From: Sean Christopherson To: Paolo Bonzini , Sean Christopherson , Christian Borntraeger , Janosch Frank , Claudio Imbrenda Cc: kvm@vger.kernel.org, linux-kernel@vger.kernel.org, David Hildenbrand , Fuad Tabba , Ackerley Tng Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Add and use wrappers for mmap() and munmap() that assert success to reduce a significant amount of boilerplate code, to ensure all tests assert on failure, and to provide consistent error messages on failure. No functional change intended. Reviewed-by: Fuad Tabba Tested-by: Fuad Tabba Reviewed-by: David Hildenbrand Reviewed-by: Ackerley Tng Signed-off-by: Sean Christopherson --- .../testing/selftests/kvm/guest_memfd_test.c | 21 +++------ .../testing/selftests/kvm/include/kvm_util.h | 25 +++++++++++ tools/testing/selftests/kvm/lib/kvm_util.c | 44 +++++++------------ tools/testing/selftests/kvm/mmu_stress_test.c | 5 +-- .../selftests/kvm/s390/ucontrol_test.c | 16 +++---- .../selftests/kvm/set_memory_region_test.c | 17 ++++--- 6 files changed, 64 insertions(+), 64 deletions(-) diff --git a/tools/testing/selftests/kvm/guest_memfd_test.c b/tools/testing= /selftests/kvm/guest_memfd_test.c index 9f98a067ab51..319fda4f5d53 100644 --- a/tools/testing/selftests/kvm/guest_memfd_test.c +++ b/tools/testing/selftests/kvm/guest_memfd_test.c @@ -50,8 +50,7 @@ static void test_mmap_supported(int fd, size_t total_size) mem =3D mmap(NULL, total_size, PROT_READ | PROT_WRITE, MAP_PRIVATE, fd, 0= ); TEST_ASSERT(mem =3D=3D MAP_FAILED, "Copy-on-write not allowed by guest_me= mfd."); =20 - mem =3D mmap(NULL, total_size, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0); - TEST_ASSERT(mem !=3D MAP_FAILED, "mmap() for guest_memfd should succeed."= ); + mem =3D kvm_mmap(total_size, PROT_READ | PROT_WRITE, MAP_SHARED, fd); =20 memset(mem, val, total_size); for (i =3D 0; i < total_size; i++) @@ -70,8 +69,7 @@ static void test_mmap_supported(int fd, size_t total_size) for (i =3D 0; i < total_size; i++) TEST_ASSERT_EQ(READ_ONCE(mem[i]), val); =20 - ret =3D munmap(mem, total_size); - TEST_ASSERT(!ret, "munmap() should succeed."); + kvm_munmap(mem, total_size); } =20 static sigjmp_buf jmpbuf; @@ -89,10 +87,8 @@ static void test_fault_overflow(int fd, size_t total_siz= e) const char val =3D 0xaa; char *mem; size_t i; - int ret; =20 - mem =3D mmap(NULL, map_size, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0); - TEST_ASSERT(mem !=3D MAP_FAILED, "mmap() for guest_memfd should succeed."= ); + mem =3D kvm_mmap(map_size, PROT_READ | PROT_WRITE, MAP_SHARED, fd); =20 sigaction(SIGBUS, &sa_new, &sa_old); if (sigsetjmp(jmpbuf, 1) =3D=3D 0) { @@ -104,8 +100,7 @@ static void test_fault_overflow(int fd, size_t total_si= ze) for (i =3D 0; i < total_size; i++) TEST_ASSERT_EQ(READ_ONCE(mem[i]), val); =20 - ret =3D munmap(mem, map_size); - TEST_ASSERT(!ret, "munmap() should succeed."); + kvm_munmap(mem, map_size); } =20 static void test_mmap_not_supported(int fd, size_t total_size) @@ -351,10 +346,9 @@ static void test_guest_memfd_guest(void) GUEST_MEMFD_FLAG_INIT_SHARED); vm_set_user_memory_region2(vm, slot, KVM_MEM_GUEST_MEMFD, gpa, size, NULL= , fd, 0); =20 - mem =3D mmap(NULL, size, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0); - TEST_ASSERT(mem !=3D MAP_FAILED, "mmap() on guest_memfd failed"); + mem =3D kvm_mmap(size, PROT_READ | PROT_WRITE, MAP_SHARED, fd); memset(mem, 0xaa, size); - munmap(mem, size); + kvm_munmap(mem, size); =20 virt_pg_map(vm, gpa, gpa); vcpu_args_set(vcpu, 2, gpa, size); @@ -362,8 +356,7 @@ static void test_guest_memfd_guest(void) =20 TEST_ASSERT_EQ(get_ucall(vcpu, NULL), UCALL_DONE); =20 - mem =3D mmap(NULL, size, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0); - TEST_ASSERT(mem !=3D MAP_FAILED, "mmap() on guest_memfd failed"); + mem =3D kvm_mmap(size, PROT_READ | PROT_WRITE, MAP_SHARED, fd); for (i =3D 0; i < size; i++) TEST_ASSERT_EQ(mem[i], 0xff); =20 diff --git a/tools/testing/selftests/kvm/include/kvm_util.h b/tools/testing= /selftests/kvm/include/kvm_util.h index 26cc30290e76..ee60dbf5208a 100644 --- a/tools/testing/selftests/kvm/include/kvm_util.h +++ b/tools/testing/selftests/kvm/include/kvm_util.h @@ -286,6 +286,31 @@ static inline bool kvm_has_cap(long cap) #define __KVM_SYSCALL_ERROR(_name, _ret) \ "%s failed, rc: %i errno: %i (%s)", (_name), (_ret), errno, strerror(errn= o) =20 +static inline void *__kvm_mmap(size_t size, int prot, int flags, int fd, + off_t offset) +{ + void *mem; + + mem =3D mmap(NULL, size, prot, flags, fd, offset); + TEST_ASSERT(mem !=3D MAP_FAILED, __KVM_SYSCALL_ERROR("mmap()", + (int)(unsigned long)MAP_FAILED)); + + return mem; +} + +static inline void *kvm_mmap(size_t size, int prot, int flags, int fd) +{ + return __kvm_mmap(size, prot, flags, fd, 0); +} + +static inline void kvm_munmap(void *mem, size_t size) +{ + int ret; + + ret =3D munmap(mem, size); + TEST_ASSERT(!ret, __KVM_SYSCALL_ERROR("munmap()", ret)); +} + /* * Use the "inner", double-underscore macro when reporting errors from wit= hin * other macros so that the name of ioctl() and not its literal numeric va= lue diff --git a/tools/testing/selftests/kvm/lib/kvm_util.c b/tools/testing/sel= ftests/kvm/lib/kvm_util.c index 6743fbd9bd67..83a721be7ec5 100644 --- a/tools/testing/selftests/kvm/lib/kvm_util.c +++ b/tools/testing/selftests/kvm/lib/kvm_util.c @@ -741,13 +741,11 @@ static void vm_vcpu_rm(struct kvm_vm *vm, struct kvm_= vcpu *vcpu) int ret; =20 if (vcpu->dirty_gfns) { - ret =3D munmap(vcpu->dirty_gfns, vm->dirty_ring_size); - TEST_ASSERT(!ret, __KVM_SYSCALL_ERROR("munmap()", ret)); + kvm_munmap(vcpu->dirty_gfns, vm->dirty_ring_size); vcpu->dirty_gfns =3D NULL; } =20 - ret =3D munmap(vcpu->run, vcpu_mmap_sz()); - TEST_ASSERT(!ret, __KVM_SYSCALL_ERROR("munmap()", ret)); + kvm_munmap(vcpu->run, vcpu_mmap_sz()); =20 ret =3D close(vcpu->fd); TEST_ASSERT(!ret, __KVM_SYSCALL_ERROR("close()", ret)); @@ -783,20 +781,16 @@ void kvm_vm_release(struct kvm_vm *vmp) static void __vm_mem_region_delete(struct kvm_vm *vm, struct userspace_mem_region *region) { - int ret; - rb_erase(®ion->gpa_node, &vm->regions.gpa_tree); rb_erase(®ion->hva_node, &vm->regions.hva_tree); hash_del(®ion->slot_node); =20 sparsebit_free(®ion->unused_phy_pages); sparsebit_free(®ion->protected_phy_pages); - ret =3D munmap(region->mmap_start, region->mmap_size); - TEST_ASSERT(!ret, __KVM_SYSCALL_ERROR("munmap()", ret)); + kvm_munmap(region->mmap_start, region->mmap_size); if (region->fd >=3D 0) { /* There's an extra map when using shared memory. */ - ret =3D munmap(region->mmap_alias, region->mmap_size); - TEST_ASSERT(!ret, __KVM_SYSCALL_ERROR("munmap()", ret)); + kvm_munmap(region->mmap_alias, region->mmap_size); close(region->fd); } if (region->region.guest_memfd >=3D 0) @@ -1053,12 +1047,9 @@ void vm_mem_add(struct kvm_vm *vm, enum vm_mem_backi= ng_src_type 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 mmap(NULL, region->mmap_size, - PROT_READ | PROT_WRITE, - vm_mem_backing_src_alias(src_type)->flag, - region->fd, 0); - TEST_ASSERT(region->mmap_start !=3D MAP_FAILED, - __KVM_SYSCALL_ERROR("mmap()", (int)(unsigned long)MAP_FAILED)); + region->mmap_start =3D kvm_mmap(region->mmap_size, PROT_READ | PROT_WRITE, + vm_mem_backing_src_alias(src_type)->flag, + region->fd); =20 TEST_ASSERT(!is_backing_src_hugetlb(src_type) || region->mmap_start =3D=3D align_ptr_up(region->mmap_start, backing_s= rc_pagesz), @@ -1129,12 +1120,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 mmap(NULL, region->mmap_size, - PROT_READ | PROT_WRITE, - vm_mem_backing_src_alias(src_type)->flag, - region->fd, 0); - TEST_ASSERT(region->mmap_alias !=3D MAP_FAILED, - __KVM_SYSCALL_ERROR("mmap()", (int)(unsigned long)MAP_FAILED)); + region->mmap_alias =3D kvm_mmap(region->mmap_size, + PROT_READ | PROT_WRITE, + vm_mem_backing_src_alias(src_type)->flag, + region->fd); =20 /* Align host alias address */ region->host_alias =3D align_ptr_up(region->mmap_alias, alignment); @@ -1344,10 +1333,8 @@ struct kvm_vcpu *__vm_vcpu_add(struct kvm_vm *vm, ui= nt32_t vcpu_id) TEST_ASSERT(vcpu_mmap_sz() >=3D sizeof(*vcpu->run), "vcpu mmap size " "smaller than expected, vcpu_mmap_sz: %zi expected_min: %zi", vcpu_mmap_sz(), sizeof(*vcpu->run)); - vcpu->run =3D (struct kvm_run *) mmap(NULL, vcpu_mmap_sz(), - PROT_READ | PROT_WRITE, MAP_SHARED, vcpu->fd, 0); - TEST_ASSERT(vcpu->run !=3D MAP_FAILED, - __KVM_SYSCALL_ERROR("mmap()", (int)(unsigned long)MAP_FAILED)); + vcpu->run =3D kvm_mmap(vcpu_mmap_sz(), PROT_READ | PROT_WRITE, + MAP_SHARED, vcpu->fd); =20 if (kvm_has_cap(KVM_CAP_BINARY_STATS_FD)) vcpu->stats.fd =3D vcpu_get_stats_fd(vcpu); @@ -1794,9 +1781,8 @@ void *vcpu_map_dirty_ring(struct kvm_vcpu *vcpu) page_size * KVM_DIRTY_LOG_PAGE_OFFSET); TEST_ASSERT(addr =3D=3D MAP_FAILED, "Dirty ring mapped exec"); =20 - addr =3D mmap(NULL, size, PROT_READ | PROT_WRITE, MAP_SHARED, vcpu->fd, - page_size * KVM_DIRTY_LOG_PAGE_OFFSET); - TEST_ASSERT(addr !=3D MAP_FAILED, "Dirty ring map failed"); + addr =3D __kvm_mmap(size, PROT_READ | PROT_WRITE, MAP_SHARED, vcpu->fd, + page_size * KVM_DIRTY_LOG_PAGE_OFFSET); =20 vcpu->dirty_gfns =3D addr; vcpu->dirty_gfns_count =3D size / sizeof(struct kvm_dirty_gfn); diff --git a/tools/testing/selftests/kvm/mmu_stress_test.c b/tools/testing/= selftests/kvm/mmu_stress_test.c index 6a437d2be9fa..37b7e6524533 100644 --- a/tools/testing/selftests/kvm/mmu_stress_test.c +++ b/tools/testing/selftests/kvm/mmu_stress_test.c @@ -339,8 +339,7 @@ int main(int argc, char *argv[]) TEST_ASSERT(max_gpa > (4 * slot_size), "MAXPHYADDR <4gb "); =20 fd =3D kvm_memfd_alloc(slot_size, hugepages); - mem =3D mmap(NULL, slot_size, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0); - TEST_ASSERT(mem !=3D MAP_FAILED, "mmap() failed"); + mem =3D kvm_mmap(slot_size, PROT_READ | PROT_WRITE, MAP_SHARED, fd); =20 TEST_ASSERT(!madvise(mem, slot_size, MADV_NOHUGEPAGE), "madvise() failed"= ); =20 @@ -413,7 +412,7 @@ int main(int argc, char *argv[]) for (slot =3D (slot - 1) & ~1ull; slot >=3D first_slot; slot -=3D 2) vm_set_user_memory_region(vm, slot, 0, 0, 0, NULL); =20 - munmap(mem, slot_size / 2); + kvm_munmap(mem, slot_size / 2); =20 /* Sanity check that the vCPUs actually ran. */ for (i =3D 0; i < nr_vcpus; i++) diff --git a/tools/testing/selftests/kvm/s390/ucontrol_test.c b/tools/testi= ng/selftests/kvm/s390/ucontrol_test.c index d265b34c54be..50bc1c38225a 100644 --- a/tools/testing/selftests/kvm/s390/ucontrol_test.c +++ b/tools/testing/selftests/kvm/s390/ucontrol_test.c @@ -142,19 +142,17 @@ FIXTURE_SETUP(uc_kvm) self->kvm_run_size =3D ioctl(self->kvm_fd, KVM_GET_VCPU_MMAP_SIZE, NULL); ASSERT_GE(self->kvm_run_size, sizeof(struct kvm_run)) TH_LOG(KVM_IOCTL_ERROR(KVM_GET_VCPU_MMAP_SIZE, self->kvm_run_size)); - self->run =3D (struct kvm_run *)mmap(NULL, self->kvm_run_size, - PROT_READ | PROT_WRITE, MAP_SHARED, self->vcpu_fd, 0); - ASSERT_NE(self->run, MAP_FAILED); + self->run =3D kvm_mmap(self->kvm_run_size, PROT_READ | PROT_WRITE, + MAP_SHARED, self->vcpu_fd); /** * For virtual cpus that have been created with S390 user controlled * virtual machines, the resulting vcpu fd can be memory mapped at page * offset KVM_S390_SIE_PAGE_OFFSET in order to obtain a memory map of * the virtual cpu's hardware control block. */ - self->sie_block =3D (struct kvm_s390_sie_block *)mmap(NULL, PAGE_SIZE, - PROT_READ | PROT_WRITE, MAP_SHARED, - self->vcpu_fd, KVM_S390_SIE_PAGE_OFFSET << PAGE_SHIFT); - ASSERT_NE(self->sie_block, MAP_FAILED); + self->sie_block =3D __kvm_mmap(PAGE_SIZE, PROT_READ | PROT_WRITE, + MAP_SHARED, self->vcpu_fd, + KVM_S390_SIE_PAGE_OFFSET << PAGE_SHIFT); =20 TH_LOG("VM created %p %p", self->run, self->sie_block); =20 @@ -186,8 +184,8 @@ FIXTURE_SETUP(uc_kvm) =20 FIXTURE_TEARDOWN(uc_kvm) { - munmap(self->sie_block, PAGE_SIZE); - munmap(self->run, self->kvm_run_size); + kvm_munmap(self->sie_block, PAGE_SIZE); + kvm_munmap(self->run, self->kvm_run_size); close(self->vcpu_fd); close(self->vm_fd); close(self->kvm_fd); diff --git a/tools/testing/selftests/kvm/set_memory_region_test.c b/tools/t= esting/selftests/kvm/set_memory_region_test.c index ce3ac0fd6dfb..7fe427ff9b38 100644 --- a/tools/testing/selftests/kvm/set_memory_region_test.c +++ b/tools/testing/selftests/kvm/set_memory_region_test.c @@ -433,10 +433,10 @@ static void test_add_max_memory_regions(void) pr_info("Adding slots 0..%i, each memory region with %dK size\n", (max_mem_slots - 1), MEM_REGION_SIZE >> 10); =20 - mem =3D mmap(NULL, (size_t)max_mem_slots * MEM_REGION_SIZE + alignment, - PROT_READ | PROT_WRITE, - MAP_PRIVATE | MAP_ANONYMOUS | MAP_NORESERVE, -1, 0); - TEST_ASSERT(mem !=3D MAP_FAILED, "Failed to mmap() host"); + + mem =3D kvm_mmap((size_t)max_mem_slots * MEM_REGION_SIZE + alignment, + PROT_READ | PROT_WRITE, + MAP_PRIVATE | MAP_ANONYMOUS | MAP_NORESERVE, -1); mem_aligned =3D (void *)(((size_t) mem + alignment - 1) & ~(alignment - 1= )); =20 for (slot =3D 0; slot < max_mem_slots; slot++) @@ -446,9 +446,8 @@ static void test_add_max_memory_regions(void) mem_aligned + (uint64_t)slot * MEM_REGION_SIZE); =20 /* Check it cannot be added memory slots beyond the limit */ - mem_extra =3D mmap(NULL, MEM_REGION_SIZE, PROT_READ | PROT_WRITE, - MAP_PRIVATE | MAP_ANONYMOUS, -1, 0); - TEST_ASSERT(mem_extra !=3D MAP_FAILED, "Failed to mmap() host"); + mem_extra =3D kvm_mmap(MEM_REGION_SIZE, PROT_READ | PROT_WRITE, + MAP_PRIVATE | MAP_ANONYMOUS, -1); =20 ret =3D __vm_set_user_memory_region(vm, max_mem_slots, 0, (uint64_t)max_mem_slots * MEM_REGION_SIZE, @@ -456,8 +455,8 @@ static void test_add_max_memory_regions(void) TEST_ASSERT(ret =3D=3D -1 && errno =3D=3D EINVAL, "Adding one more memory slot should fail with EINVAL"); =20 - munmap(mem, (size_t)max_mem_slots * MEM_REGION_SIZE + alignment); - munmap(mem_extra, MEM_REGION_SIZE); + kvm_munmap(mem, (size_t)max_mem_slots * MEM_REGION_SIZE + alignment); + kvm_munmap(mem_extra, MEM_REGION_SIZE); kvm_vm_free(vm); } =20 --=20 2.51.0.618.g983fd99d29-goog From nobody Wed Dec 17 19:21:06 2025 Received: from mail-pl1-f201.google.com (mail-pl1-f201.google.com [209.85.214.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 14A8C2DF710 for ; Fri, 3 Oct 2025 23:26:29 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1759533991; cv=none; b=jTIgYs5Gw4nDX6FAV48DBjAzCckWRBLaU+oFLg3+QoCHEwntI10syw6QI7xbZKMIl/Loa1SRvU4xGxyY6nycAXOTTWfUhmA2y0DVXuqI1+pMONZ0+dKPDavRxI5egkuKD06IMZ0yBR5+8rIqpTVL69+Au5bwczJtrMQAQcBr47w= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1759533991; c=relaxed/simple; bh=0xeumNRu0bdu/oLbIMPmUD2rrS5rFLO2H9kNKTpm7Eg=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=lA0j6yMXzAnTqkfC0AcbM9xFpYNI2yMl3VgXrAGbrLz/law1bbH0eSVn6VroNdHbPqDdSDK0GUPX8u5Ed5fMcWSTsRj+tXbXU2IBFyrhdvFomDbRCvtQ/dVqnifFBow9nIDwxM0fA5nZ7pSJK4uX7KhTC20C3zCFvAbWuP4RUNg= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com; spf=pass smtp.mailfrom=flex--seanjc.bounces.google.com; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b=zen6oU47; arc=none smtp.client-ip=209.85.214.201 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=flex--seanjc.bounces.google.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="zen6oU47" Received: by mail-pl1-f201.google.com with SMTP id d9443c01a7336-269939bfccbso31731555ad.1 for ; Fri, 03 Oct 2025 16:26:29 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1759533989; x=1760138789; darn=vger.kernel.org; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:reply-to:from:to:cc:subject:date:message-id:reply-to; bh=qrTDG0acHPOPKJ3AVdBdofNeaQKfhOMghQNh09nNQB8=; b=zen6oU47fV/1SDB+LIeNzFsLd35ERNRIYcyID8yvAuvb793VqKD8bIrIPqoSE2YNFC yY7ish9Upr3nxIb3LGMX79ZSmf8Wb6FnLCIkPVLARK+wLDpKI1EWFjanWAs4/Zi6WVD5 VmEIb+T8fEJQh4aP6z1EsMJfPRIYOF8JQtj7PafnJL3bUB0GE5iIFiUmtLnFRSANyNeH a9FNoMGOLtCEEuONSkUBGsWNOMcFl9GFR0Bo0UmrBpWBa5c+lRHR5uBQeEo1aRzjXZp0 2JHtzbGUWtIySbaydOn5MFPvtfdoVLVc9p1q00/ORWFC+fu2nlulS9UfMkd0o67tdZWw UtDg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1759533989; x=1760138789; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:reply-to:x-gm-message-state:from:to:cc:subject:date:message-id :reply-to; bh=qrTDG0acHPOPKJ3AVdBdofNeaQKfhOMghQNh09nNQB8=; b=omELrXoWKkXQi+hgwlPH77HIoQ/hBExq5JdY6h4YqCauNVyHEAAfrLLNbe1+t9UdXG Th1egtFq1Pv7rmAfNpJvUk5OHpe2Xr4RMFo+xViuZ7hULjTubW/UqE1W0tXQ0qliWfbz V21niCONkA4k9VS+x+gF9jFbwXebBspzJlw2UpzDfsJE1tJ35NSXBluAI8xPQ1rX19Az CWRV7RukqOQrJ7wwJp6jGNDRN0eMYv7dVCndVWnLDrFO/FA9UBg775aNPltSxfD8CLLF ufnEpeVh65PNf2TyoTFJWbTPn4HKivJpXcSL9Hb8tKKVQlvmyPdmdK5FMbuGTefulCRr 8/Mw== X-Forwarded-Encrypted: i=1; AJvYcCWWvd+GvQicQxbQ/i3JLPImErivBEUPIrFa91QK54R7xHol74uY+uQibykdSc+xrG8kP0p4JEXCU7RMLNY=@vger.kernel.org X-Gm-Message-State: AOJu0Ywd9BAkwivEMIJsSl9g4ci/L2JeWJ89rtQ8OuPx7zEXIcv/zUjO IrVuPvN1vAeAheXDT5XEe12HMPnTHDF5r0Ptg+qRpB9kdgKHbPyPQQGPj6OYyJ85aXEfRgHXfQB fXVM3cA== X-Google-Smtp-Source: AGHT+IGTaO3/D04Td+DbjpLaoUihiDB5eETO+E+bVM2wQesLhDsp0vKrjYvnc7RvC0OhiVRi6XrR4kqXyXQ= X-Received: from plot3.prod.google.com ([2002:a17:902:8c83:b0:27e:4187:b4d3]) (user=seanjc job=prod-delivery.src-stubby-dispatcher) by 2002:a17:903:4b50:b0:24e:3cf2:2453 with SMTP id d9443c01a7336-28e9a7031c4mr52954735ad.61.1759533989354; Fri, 03 Oct 2025 16:26:29 -0700 (PDT) Reply-To: Sean Christopherson Date: Fri, 3 Oct 2025 16:26:03 -0700 In-Reply-To: <20251003232606.4070510-1-seanjc@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20251003232606.4070510-1-seanjc@google.com> X-Mailer: git-send-email 2.51.0.618.g983fd99d29-goog Message-ID: <20251003232606.4070510-11-seanjc@google.com> Subject: [PATCH v2 10/13] KVM: selftests: Isolate the guest_memfd Copy-on-Write negative testcase From: Sean Christopherson To: Paolo Bonzini , Sean Christopherson , Christian Borntraeger , Janosch Frank , Claudio Imbrenda Cc: kvm@vger.kernel.org, linux-kernel@vger.kernel.org, David Hildenbrand , Fuad Tabba , Ackerley Tng Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Move the guest_memfd Copy-on-Write (CoW) testcase to its own function to better separate positive testcases from negative testcases. No functional change intended. Suggested-by: Ackerley Tng Signed-off-by: Sean Christopherson Reviewed-by: Ackerley Tng Tested-by: Ackerley Tng --- tools/testing/selftests/kvm/guest_memfd_test.c | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/tools/testing/selftests/kvm/guest_memfd_test.c b/tools/testing= /selftests/kvm/guest_memfd_test.c index 319fda4f5d53..640636c76eb9 100644 --- a/tools/testing/selftests/kvm/guest_memfd_test.c +++ b/tools/testing/selftests/kvm/guest_memfd_test.c @@ -40,15 +40,20 @@ static void test_file_read_write(int fd, size_t total_s= ize) "pwrite on a guest_mem fd should fail"); } =20 -static void test_mmap_supported(int fd, size_t total_size) +static void test_mmap_cow(int fd, size_t size) { - const char val =3D 0xaa; - char *mem; - size_t i; - int ret; + void *mem; =20 - mem =3D mmap(NULL, total_size, PROT_READ | PROT_WRITE, MAP_PRIVATE, fd, 0= ); + mem =3D mmap(NULL, size, PROT_READ | PROT_WRITE, MAP_PRIVATE, fd, 0); TEST_ASSERT(mem =3D=3D MAP_FAILED, "Copy-on-write not allowed by guest_me= mfd."); +} + +static void test_mmap_supported(int fd, size_t total_size) +{ + const char val =3D 0xaa; + char *mem; + size_t i; + int ret; =20 mem =3D kvm_mmap(total_size, PROT_READ | PROT_WRITE, MAP_SHARED, fd); =20 @@ -272,6 +277,7 @@ static void __test_guest_memfd(struct kvm_vm *vm, uint6= 4_t flags) =20 if (flags & GUEST_MEMFD_FLAG_MMAP) { gmem_test(mmap_supported, vm, flags); + gmem_test(mmap_cow, vm, flags); gmem_test(fault_overflow, vm, flags); } else { gmem_test(mmap_not_supported, vm, flags); --=20 2.51.0.618.g983fd99d29-goog From nobody Wed Dec 17 19:21:06 2025 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 4A4962E0402 for ; Fri, 3 Oct 2025 23:26:32 +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=1759533993; cv=none; b=lsjsydoexQ9i1towXkMd2z8iwF4F1B4BZcT6BHjUacbhogONz/EYUJOSr5wQddBsAMpih0m/RyOuKrlxWHJYQVAqGspEeAev6E8xL6FOag4pOj0PEopp+uV1GQGi1qMx3ACHZdwfHPMNOCWuM2FWtn4gL0GJ+jRLBr/5OhDRgmE= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1759533993; c=relaxed/simple; bh=T5q/Pstt8Hv+p0rfhTZOtrB7/+T9mv44yI3DvCahIdQ=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=jm5HoOTLAEmQ97uTpgD0g4ujzORe87FfGBtIHk/HRga9rfBxz8vPLFjLUvxwjzrgiMKhdVNkljae8b4LMLnUU1tARPMph6CQ0+2h2+N7AYGCww7oXY5vfjbB5rnP+KtzF6zIMRBj7XHHwHX+jRrk4s8Mb8hDzlIxFgRfjtYBSaw= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com; spf=pass smtp.mailfrom=flex--seanjc.bounces.google.com; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b=2tvIZou5; 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--seanjc.bounces.google.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="2tvIZou5" Received: by mail-pl1-f202.google.com with SMTP id d9443c01a7336-277f0ea6fc6so61831045ad.2 for ; Fri, 03 Oct 2025 16:26:32 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1759533991; x=1760138791; darn=vger.kernel.org; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:reply-to:from:to:cc:subject:date:message-id:reply-to; bh=XjUM2sV954KpwJC6RI6Tq+jgNrfIi8qlx+Hwldv2z30=; b=2tvIZou5Veo7nHVtnbAFD1W3q2qrxgaAD+0H80e7snVMglQcH9TkK4IO7DtRZsK8Xj k9ssSA0okiB5vYYv3yEsTvoWxDr/rH9WSllVoOMpEDKP643lDSwHvT0mDqsFAX1xFwnU jCMrMxWFwBb0GtmOLiMgDUu+Mi+ELl5tfR8WOXL2JoZSRN7NmuvUlz5r5awaXFDmMAv4 pLX8Xb0zRhvOYpts2MaSe9j8I6owTD8+s4Mo9sq1liRkFiMygoYPKWyrvKw/QX5z0mTs 1XrITDqkFSSYjTiWDXEFdZW7jQGywxqOOSm3XSDMO/fR2xPzbXi8pdJ5QMOR2j0rEBUE EbbA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1759533991; x=1760138791; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:reply-to:x-gm-message-state:from:to:cc:subject:date:message-id :reply-to; bh=XjUM2sV954KpwJC6RI6Tq+jgNrfIi8qlx+Hwldv2z30=; b=qdLlUf9jY4p6/QjGF8xPhs+ZFUUbB+f30stYGMh9k1xWlAMx8yU/1M6Brp/jtppxLk w1DVRe96WCea4bO+J84Q9SDtEUEm1Rg79BwsjpiDVXEuCAptVGFvH+7x/9WeQKxFGTCL WxtsdpB3l4A6ZMJB/0RYkqZtXQsKLYnC3M2K+sHwV8jk++Ibr8aJh4jtTFJTCLVRiAAz HH02GNgztBWKSL0AAXcxw4LAd3gDRlUn2WYqWzDZd7sZUDSM1iHSbRKTe4ieiwo2nJ1S t5ysJwSN+6BBorKOIRor+JTYM7H4mnnfKiM5is6wx7KSDqH8Bdxc1D/W/9xpeZuk3dvG eIbQ== X-Forwarded-Encrypted: i=1; AJvYcCUQaXiClrDMyxgg3WWLkCeCzEzL6NCD4chBevtcOX8LiD/eo8wqPvhASc/A8SIr/eX+5qQYU1ukGDLtBWs=@vger.kernel.org X-Gm-Message-State: AOJu0Yy9bogt6zAcs+z4kWsktopm6enu4h9IB+tlOmKz/4ry1Nl5Uhbt Mv1/Z3XYQBmyBZz0aMeJeZATiiM4Yoh9VliJC6jcp4pt//Ecm5MUdyEYu1FPV2EXs3PzsBVHoE8 LyiL8LA== X-Google-Smtp-Source: AGHT+IG19O7ZXl8Fqd0uSmvKGqwgXKh9WcLOSUacVFErRjkEmb6o30mwo4Gc5YaiZFYjkErDhhmG9M5dZaM= X-Received: from plde13.prod.google.com ([2002:a17:902:d38d:b0:27e:ea91:acb6]) (user=seanjc job=prod-delivery.src-stubby-dispatcher) by 2002:a17:903:2f84:b0:267:d2f9:2327 with SMTP id d9443c01a7336-28e9a60cf7dmr61383055ad.27.1759533991556; Fri, 03 Oct 2025 16:26:31 -0700 (PDT) Reply-To: Sean Christopherson Date: Fri, 3 Oct 2025 16:26:04 -0700 In-Reply-To: <20251003232606.4070510-1-seanjc@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20251003232606.4070510-1-seanjc@google.com> X-Mailer: git-send-email 2.51.0.618.g983fd99d29-goog Message-ID: <20251003232606.4070510-12-seanjc@google.com> Subject: [PATCH v2 11/13] KVM: selftests: Add wrapper macro to handle and assert on expected SIGBUS From: Sean Christopherson To: Paolo Bonzini , Sean Christopherson , Christian Borntraeger , Janosch Frank , Claudio Imbrenda Cc: kvm@vger.kernel.org, linux-kernel@vger.kernel.org, David Hildenbrand , Fuad Tabba , Ackerley Tng Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Extract the guest_memfd test's SIGBUS handling functionality into a common TEST_EXPECT_SIGBUS() macro in anticipation of adding more SIGBUS testcases. Eating a SIGBUS isn't terrible difficult, but it requires a non-trivial amount of boilerplate code, and using a macro allows selftests to print out the exact action that failed to generate a SIGBUS without the developer needing to remember to add a useful error message. Explicitly mark the SIGBUS handler as "used", as gcc-14 at least likes to discard the function before linking. Suggested-by: Ackerley Tng Signed-off-by: Sean Christopherson Reviewed-by: Ackerley Tng Reviewed-by: Lisa Wang Tested-by: Ackerley Tng Tested-by: Lisa Wang --- .../testing/selftests/kvm/guest_memfd_test.c | 18 +----------------- .../testing/selftests/kvm/include/test_util.h | 19 +++++++++++++++++++ tools/testing/selftests/kvm/lib/test_util.c | 7 +++++++ 3 files changed, 27 insertions(+), 17 deletions(-) diff --git a/tools/testing/selftests/kvm/guest_memfd_test.c b/tools/testing= /selftests/kvm/guest_memfd_test.c index 640636c76eb9..73c2e54e7297 100644 --- a/tools/testing/selftests/kvm/guest_memfd_test.c +++ b/tools/testing/selftests/kvm/guest_memfd_test.c @@ -14,8 +14,6 @@ #include #include #include -#include -#include #include #include #include @@ -77,17 +75,8 @@ static void test_mmap_supported(int fd, size_t total_siz= e) kvm_munmap(mem, total_size); } =20 -static sigjmp_buf jmpbuf; -void fault_sigbus_handler(int signum) -{ - siglongjmp(jmpbuf, 1); -} - static void test_fault_overflow(int fd, size_t total_size) { - struct sigaction sa_old, sa_new =3D { - .sa_handler =3D fault_sigbus_handler, - }; size_t map_size =3D total_size * 4; const char val =3D 0xaa; char *mem; @@ -95,12 +84,7 @@ static void test_fault_overflow(int fd, size_t total_siz= e) =20 mem =3D kvm_mmap(map_size, PROT_READ | PROT_WRITE, MAP_SHARED, fd); =20 - sigaction(SIGBUS, &sa_new, &sa_old); - if (sigsetjmp(jmpbuf, 1) =3D=3D 0) { - memset(mem, 0xaa, map_size); - TEST_ASSERT(false, "memset() should have triggered SIGBUS."); - } - sigaction(SIGBUS, &sa_old, NULL); + TEST_EXPECT_SIGBUS(memset(mem, val, map_size)); =20 for (i =3D 0; i < total_size; i++) TEST_ASSERT_EQ(READ_ONCE(mem[i]), val); diff --git a/tools/testing/selftests/kvm/include/test_util.h b/tools/testin= g/selftests/kvm/include/test_util.h index c6ef895fbd9a..b4872ba8ed12 100644 --- a/tools/testing/selftests/kvm/include/test_util.h +++ b/tools/testing/selftests/kvm/include/test_util.h @@ -8,6 +8,8 @@ #ifndef SELFTEST_KVM_TEST_UTIL_H #define SELFTEST_KVM_TEST_UTIL_H =20 +#include +#include #include #include #include @@ -78,6 +80,23 @@ do { \ __builtin_unreachable(); \ } while (0) =20 +extern sigjmp_buf expect_sigbus_jmpbuf; +void expect_sigbus_handler(int signum); + +#define TEST_EXPECT_SIGBUS(action) \ +do { \ + struct sigaction sa_old, sa_new =3D { \ + .sa_handler =3D expect_sigbus_handler, \ + }; \ + \ + sigaction(SIGBUS, &sa_new, &sa_old); \ + if (sigsetjmp(expect_sigbus_jmpbuf, 1) =3D=3D 0) { \ + action; \ + TEST_FAIL("'%s' should have triggered SIGBUS", #action); \ + } \ + sigaction(SIGBUS, &sa_old, NULL); \ +} while (0) + size_t parse_size(const char *size); =20 int64_t timespec_to_ns(struct timespec ts); diff --git a/tools/testing/selftests/kvm/lib/test_util.c b/tools/testing/se= lftests/kvm/lib/test_util.c index 03eb99af9b8d..8a1848586a85 100644 --- a/tools/testing/selftests/kvm/lib/test_util.c +++ b/tools/testing/selftests/kvm/lib/test_util.c @@ -18,6 +18,13 @@ =20 #include "test_util.h" =20 +sigjmp_buf expect_sigbus_jmpbuf; + +void __attribute__((used)) expect_sigbus_handler(int signum) +{ + siglongjmp(expect_sigbus_jmpbuf, 1); +} + /* * Random number generator that is usable from guest code. This is the * Park-Miller LCG using standard constants. --=20 2.51.0.618.g983fd99d29-goog From nobody Wed Dec 17 19:21:06 2025 Received: from mail-pj1-f73.google.com (mail-pj1-f73.google.com [209.85.216.73]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 0400B2E090B for ; Fri, 3 Oct 2025 23:26:33 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.216.73 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1759533995; cv=none; b=MhZWdtmiJRKirBDL7JJaU/DpEovMT/NAJzHEElhVVDieL3v6xQSfDhoJXYc2HbSFaZjxqj4PutV3TVJtkAvg/8mSTXuxBfdFDdA9cjNuJfIuJ2gn/N6U1u88ESO5F3RrDHE2zaCmqppH6ZaQ6cwVnv+CZyPCV2R64LQEFhJDFKM= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1759533995; c=relaxed/simple; bh=6uqrO3Vhg7mkad1zptZdqvbuIbBUIta4UqDjm7wBzuk=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=dRS92feCJpsSa49cAazQxZPGcPKi0S+VlFJdqA5et+BCc6fjvZbJTVAjTyJm0m6gZdYXvm3tfJ1B9GC4xERVasT2kfewCc+s+4jkaqSfi/625LVEf87wuTm2012fgYBJI/nexBQQxGUj3+sEww/NP+iUzBHi5PJNmrXe/Tf2MlM= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com; spf=pass smtp.mailfrom=flex--seanjc.bounces.google.com; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b=sS5C0DtV; arc=none smtp.client-ip=209.85.216.73 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=flex--seanjc.bounces.google.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="sS5C0DtV" Received: by mail-pj1-f73.google.com with SMTP id 98e67ed59e1d1-33274f8ff7cso4259843a91.0 for ; Fri, 03 Oct 2025 16:26:33 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1759533993; x=1760138793; darn=vger.kernel.org; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:reply-to:from:to:cc:subject:date:message-id:reply-to; bh=Yy7lp5RaPXPHpRWe5+i+QNM7MtRBx8dgxw3nVvMM/XM=; b=sS5C0DtV91YaNxs/8pEmZ2mzemHL3T/GI879dnRQnvd1nEWLcOqbkIS+ylDPAUnz26 DmeF6JgGlGrJXyp0WdCKHwFfP4Y7EbFPR8PSnTxgWgrd21wx7nETs9C8JnBMnYLHOWBZ aQL0o+M7wiBV2NroiOLev9FoJ0rUBtctkT+CmJQ14qAUFD/TgoOi22W98otLpejTtXG6 sh96O8pHTEv+WGokHF8aMGQgSBK7EP2HwAyj3OV9u6FVrWwz9bNkJ2u0STu0aBgCgm1o 2jyzebq1Asy20UDPnWTP8Ttzdw0JJIGqRNVarvAfhPj0fknBoW++6Hckbu5Jm/WRwalZ 8vaw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1759533993; x=1760138793; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:reply-to:x-gm-message-state:from:to:cc:subject:date:message-id :reply-to; bh=Yy7lp5RaPXPHpRWe5+i+QNM7MtRBx8dgxw3nVvMM/XM=; b=TDvo0Dngl5M3/Hvg83X06ct3PIbwFzKM8EITYGltZ3iLXDa+Bhgdn80c6qLufJARWw Nkkn8AicBHWN27rmWqI5XS1ApHxZX8yNoPDduVYeMHpBKf0OwkAgDWxvhsN/j/pyAHzE ibLkDkxBOGnIB6uaZpeX9h3dJgrSqvAh12gf0aVBUsv9CtLFLYS2xLCUB++nqj1aUCVj jl/cJHuFHs7CKZLK+sk/kgX0DJVdjyW3EZx0hRiiI4J8UP8dPB58RdcFrB1RWoeiYCf+ rxdH8cYiT3023nNktJUB6CEB5ElJTzpxikAiIw1AssOUSWvdhu1MA38+ojibNYmBU2cd XIsA== X-Forwarded-Encrypted: i=1; AJvYcCXMK4383LQ/67btPYxjnVJTal0F0vLvy5/1dLbVf/VgKusOf+YECSlSxH+Lbkfl/I0HzblviIsffjQjiGE=@vger.kernel.org X-Gm-Message-State: AOJu0YwkLJUl5HBmCPguE6NgB4ufXIeFJeWT11VOmdOfcOnjTruG8q35 UQkapP5HCPsYYel8Sy5mS83iN5+sr5CG/iU0CJZAMP3BPbqbaNMNcCcSKFIHHgCAtwIKoRFxfrQ oL0pFZw== X-Google-Smtp-Source: AGHT+IFfuiPoH8pmTuIAcORqENRGSyiyZ9lFDpHEhjjXbL3pcNCiLYlIibeSuvn2z0Bbu9yPs03FzDZbrjI= X-Received: from pjzh12.prod.google.com ([2002:a17:90a:ea8c:b0:329:7261:93b6]) (user=seanjc job=prod-delivery.src-stubby-dispatcher) by 2002:a17:90b:4a8e:b0:32b:96fa:5f46 with SMTP id 98e67ed59e1d1-339c272481emr4895352a91.5.1759533993262; Fri, 03 Oct 2025 16:26:33 -0700 (PDT) Reply-To: Sean Christopherson Date: Fri, 3 Oct 2025 16:26:05 -0700 In-Reply-To: <20251003232606.4070510-1-seanjc@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20251003232606.4070510-1-seanjc@google.com> X-Mailer: git-send-email 2.51.0.618.g983fd99d29-goog Message-ID: <20251003232606.4070510-13-seanjc@google.com> Subject: [PATCH v2 12/13] KVM: selftests: Verify that faulting in private guest_memfd memory fails From: Sean Christopherson To: Paolo Bonzini , Sean Christopherson , Christian Borntraeger , Janosch Frank , Claudio Imbrenda Cc: kvm@vger.kernel.org, linux-kernel@vger.kernel.org, David Hildenbrand , Fuad Tabba , Ackerley Tng Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Add a guest_memfd testcase to verify that faulting in private memory gets a SIGBUS. For now, test only the case where memory is private by default since KVM doesn't yet support in-place conversion. Deliberately run the CoW test with and without INIT_SHARED set as KVM should disallow MAP_PRIVATE regardless of whether the memory itself is private from a CoCo perspective. Cc: Ackerley Tng Reviewed-by: Fuad Tabba Tested-by: Fuad Tabba Reviewed-by: David Hildenbrand Reviewed-by: Ackerley Tng Signed-off-by: Sean Christopherson Tested-by: Ackerley Tng --- .../testing/selftests/kvm/guest_memfd_test.c | 26 +++++++++++++++---- 1 file changed, 21 insertions(+), 5 deletions(-) diff --git a/tools/testing/selftests/kvm/guest_memfd_test.c b/tools/testing= /selftests/kvm/guest_memfd_test.c index 73c2e54e7297..f5372fdf096d 100644 --- a/tools/testing/selftests/kvm/guest_memfd_test.c +++ b/tools/testing/selftests/kvm/guest_memfd_test.c @@ -75,9 +75,8 @@ static void test_mmap_supported(int fd, size_t total_size) kvm_munmap(mem, total_size); } =20 -static void test_fault_overflow(int fd, size_t total_size) +static void test_fault_sigbus(int fd, size_t accessible_size, size_t map_s= ize) { - size_t map_size =3D total_size * 4; const char val =3D 0xaa; char *mem; size_t i; @@ -86,12 +85,22 @@ static void test_fault_overflow(int fd, size_t total_si= ze) =20 TEST_EXPECT_SIGBUS(memset(mem, val, map_size)); =20 - for (i =3D 0; i < total_size; i++) + for (i =3D 0; i < accessible_size; i++) TEST_ASSERT_EQ(READ_ONCE(mem[i]), val); =20 kvm_munmap(mem, map_size); } =20 +static void test_fault_overflow(int fd, size_t total_size) +{ + test_fault_sigbus(fd, total_size, total_size * 4); +} + +static void test_fault_private(int fd, size_t total_size) +{ + test_fault_sigbus(fd, 0, total_size); +} + static void test_mmap_not_supported(int fd, size_t total_size) { char *mem; @@ -260,9 +269,14 @@ static void __test_guest_memfd(struct kvm_vm *vm, uint= 64_t flags) gmem_test(file_read_write, vm, flags); =20 if (flags & GUEST_MEMFD_FLAG_MMAP) { - gmem_test(mmap_supported, vm, flags); + if (flags & GUEST_MEMFD_FLAG_INIT_SHARED) { + gmem_test(mmap_supported, vm, flags); + gmem_test(fault_overflow, vm, flags); + } else { + gmem_test(fault_private, vm, flags); + } + gmem_test(mmap_cow, vm, flags); - gmem_test(fault_overflow, vm, flags); } else { gmem_test(mmap_not_supported, vm, flags); } @@ -282,6 +296,8 @@ static void test_guest_memfd(unsigned long vm_type) __test_guest_memfd(vm, 0); =20 flags =3D vm_check_cap(vm, KVM_CAP_GUEST_MEMFD_FLAGS); + if (flags & GUEST_MEMFD_FLAG_MMAP) + __test_guest_memfd(vm, GUEST_MEMFD_FLAG_MMAP); =20 /* MMAP should always be supported if INIT_SHARED is supported. */ if (flags & GUEST_MEMFD_FLAG_INIT_SHARED) --=20 2.51.0.618.g983fd99d29-goog From nobody Wed Dec 17 19:21:06 2025 Received: from mail-pf1-f201.google.com (mail-pf1-f201.google.com [209.85.210.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 912262E0B6D for ; Fri, 3 Oct 2025 23:26:35 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.210.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1759533997; cv=none; b=HlTKc6fGUqWrv97qGsdmQY5hi9cK82Q34vVfX17mPEpV+0I+0PyhpHgCtmilyo3xBmgIWlrhC7O3JXFhbjKJn22HDFmf9Qgii4BK9XXZFkG4TZoPqzcyxisd2XRw1+pJDiGYkuA6IkZvqI02ROMxO6Y27OXI1nHWfcNitv0f7II= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1759533997; c=relaxed/simple; bh=A35jNQC/Y3RxjqGBQN1sEn/RRSyfIzES/2AECjIpxI0=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=oq3v6pdW7PSH3Abr+EWKwuEYlN+Xftatz8DyOrWnUZsU+Te3heMxnYBkPJicW1hx82BCfgV44nsw3sAHKVrtCdi42O3xy3VlKJXfpvfL8LuZ3R3sBgWjYFD/6GUY3q0z5DBrdMgSndyO6RWITgaSp5si/BEAxg25kge5eFDsnUg= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com; spf=pass smtp.mailfrom=flex--seanjc.bounces.google.com; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b=o0OPp5Rg; arc=none smtp.client-ip=209.85.210.201 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=flex--seanjc.bounces.google.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="o0OPp5Rg" Received: by mail-pf1-f201.google.com with SMTP id d2e1a72fcca58-77f5e6a324fso4425762b3a.0 for ; Fri, 03 Oct 2025 16:26:35 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1759533995; x=1760138795; darn=vger.kernel.org; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:reply-to:from:to:cc:subject:date:message-id:reply-to; bh=ZziZ37GNo1v+A7DeH1fg1jRwXSNmJJcf2TnA0oS/lkM=; b=o0OPp5Rg6ks8tA1BePwlhBcQ6fU1NJh63XbxX3KeDdCKHstkPfuDmTI1mXqXdMeSd7 BQtqvjd5vqhb0waGIdR3gBuADdZC4diam2Sjp4UbOV/7H6JDwjNRi6fj1Lf8uY5xtfz/ 6H/EDQTF2i8EHVBOqnNVLSr0xNHwxCCoiC2jv/iRa7qx4FSZ1FMj1ne69VyAcws8eY2Q Z5/pqhNwS9jyqKQZNSSz/UnZVDMwNP4s1H0cNsrA2SmHbzd5Q+1nDHVNQQ07d0ZmTsm+ /jS/h3XkPHsICCK3MWFIA/rmlVjo7EwZxT8cCyr4tCzqleBtKtVh6nO2f/dF/NgWlt41 QIuA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1759533995; x=1760138795; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:reply-to:x-gm-message-state:from:to:cc:subject:date:message-id :reply-to; bh=ZziZ37GNo1v+A7DeH1fg1jRwXSNmJJcf2TnA0oS/lkM=; b=UtA6Aj9ERDYyju0Zt1B0OH/QTpO27YYz6JW/quXb4EyfiAql0dtyypA6FOKNnIBoC7 wjz6CNGVuQ//X1mv7L4gI6pDSmPX1PFuztFVCx6jZnA4E321U/Ex+x1dnjCUObn1FeD5 dpVIlGa1KmO2A2HCJhbAu3kzIQn6KRmOJbuUcPemtiUdea94+Bowjx9Q873wQi6EdFHv t8EPFF3Cj+KX6zpXMsHfEBwQPu0gZiCIyCoHe96wgC+xcMHEvHAmqOxUgc0FYjPmKsM/ FEZ9EVPR8B8wlmA+n50YW3uwsLHtUO9FdhDyYszRXLvcLiyHvtcdOVYWTNKoxDW29sut d8FA== X-Forwarded-Encrypted: i=1; AJvYcCVPyiuDKkOzZEv8JxNcB6NDoQg/g40ml0OfaV0ctWavtGxi/iEXuVHLeWx2RzsgE7DpM9/ahTum+6GTFAU=@vger.kernel.org X-Gm-Message-State: AOJu0Yx8GbIttRM9hPLXEg6rCel+et7moU47GOzgTwI3Uv+1TOsHuiNQ IZli76bIb17HAf591gFfAbDdfhpSjHToB52joyfNijREso37ucuxnV8zWhx/vLCg6fbDEFnEFTD gcJnXBg== X-Google-Smtp-Source: AGHT+IGI45fASbGk78+EH7g4G06WAQxAWAI94Pfy4l7ikWrEGD/iRpekgctqMyc+R3oC7uyXtSz62tBnv3w= X-Received: from pfjd14.prod.google.com ([2002:a05:6a00:244e:b0:781:1b2a:49c9]) (user=seanjc job=prod-delivery.src-stubby-dispatcher) by 2002:a05:6a00:1301:b0:781:19e1:c4c8 with SMTP id d2e1a72fcca58-78c98a6a5e1mr5790329b3a.9.1759533994969; Fri, 03 Oct 2025 16:26:34 -0700 (PDT) Reply-To: Sean Christopherson Date: Fri, 3 Oct 2025 16:26:06 -0700 In-Reply-To: <20251003232606.4070510-1-seanjc@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20251003232606.4070510-1-seanjc@google.com> X-Mailer: git-send-email 2.51.0.618.g983fd99d29-goog Message-ID: <20251003232606.4070510-14-seanjc@google.com> Subject: [PATCH v2 13/13] KVM: selftests: Verify that reads to inaccessible guest_memfd VMAs SIGBUS From: Sean Christopherson To: Paolo Bonzini , Sean Christopherson , Christian Borntraeger , Janosch Frank , Claudio Imbrenda Cc: kvm@vger.kernel.org, linux-kernel@vger.kernel.org, David Hildenbrand , Fuad Tabba , Ackerley Tng Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Expand the guest_memfd negative testcases for overflow and MAP_PRIVATE to verify that reads to inaccessible memory also get a SIGBUS. Opportunistically fix the write path to use the "val" instead of hardcoding the literal value a second time, and to use TEST_FAIL(...) instead of TEST_ASSERT(false, ...). Signed-off-by: Sean Christopherson Reviewed-by: Ackerley Tng Reviewed-by: Lisa Wang Tested-by: Ackerley Tng Tested-by: Lisa Wang --- tools/testing/selftests/kvm/guest_memfd_test.c | 1 + 1 file changed, 1 insertion(+) diff --git a/tools/testing/selftests/kvm/guest_memfd_test.c b/tools/testing= /selftests/kvm/guest_memfd_test.c index f5372fdf096d..e7d9aeb418d3 100644 --- a/tools/testing/selftests/kvm/guest_memfd_test.c +++ b/tools/testing/selftests/kvm/guest_memfd_test.c @@ -84,6 +84,7 @@ static void test_fault_sigbus(int fd, size_t accessible_s= ize, size_t map_size) mem =3D kvm_mmap(map_size, PROT_READ | PROT_WRITE, MAP_SHARED, fd); =20 TEST_EXPECT_SIGBUS(memset(mem, val, map_size)); + TEST_EXPECT_SIGBUS((void)READ_ONCE(mem[accessible_size])); =20 for (i =3D 0; i < accessible_size; i++) TEST_ASSERT_EQ(READ_ONCE(mem[i]), val); --=20 2.51.0.618.g983fd99d29-goog