From nobody Wed Oct 1 22:33:19 2025 Received: from mail-pg1-f201.google.com (mail-pg1-f201.google.com [209.85.215.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 57EFC271A94 for ; Fri, 26 Sep 2025 16:31:22 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.215.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1758904283; cv=none; b=Avq6VgQj2po3JpcuZeANVG/cF5UrcKB4VDuoESKehaPmvpkA5gF39YHKdHKbTVie0fWEjwKxEKLXReS9WxHO2YHhdFr6B1sOACWWlesgCTEq7misVIxaiHNJyHkx7uba6RxMwpq/arPEHbSCrxikvGKWcOdaHuSHBoEgrlIU8o0= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1758904283; c=relaxed/simple; bh=f+Tzy0yIQ24Esao6nanWArdkkZC4I5k9qXHHhYacdLw=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=BPDoU0UiQnhrw7wkjGaXswWT22RqghMZbIu2cpL3mdF3OB2R+WDptzQSOGnNNmoCvBduqFi7F9BYv5z9qPZuscQ5LjdUL664PSyYtYvlMaAzQeM9mjsf5Ga7fynARdj3z8Xd74WrM/jTrao44jAghGOd/S+vW/ZF8ofzTcdhgCo= 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=xqp9tppY; arc=none smtp.client-ip=209.85.215.201 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=flex--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="xqp9tppY" Received: by mail-pg1-f201.google.com with SMTP id 41be03b00d2f7-b5533921eb2so1713624a12.0 for ; Fri, 26 Sep 2025 09:31:22 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1758904282; x=1759509082; 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=Jrdnpe1IxxMyMBign8PA7N+60CNvizwtKgqYzwIpWS0=; b=xqp9tppY/tgF5Kzpbyy5g3EuX0w2c+RsaIeFMXzO1E4IPddG2rJfz2btGjFJHl2xZw v0N2wEGKOJFGMxgrV4nQ17wTyH15wnSRdLGnOp9yb87XrYGJVR67iK2IVKPlbsprBXDo zagWtSnIsYi0R/p+aOJtfYLa1memcTlmo3MtqpSkGwgzCqFP9IRilBUdmMWze+3VNYdO R7n7ukk6Vbqxf4Nvfm0cZLnRfYEOnnEePniJpe4f/q/7p182cGi7PgSlEDWO372iYei4 PlOwUstxeWPGpaKYMBvaJlJNVNJm8THcTuI8Vc3nG915GJZ0OUT535w2g7F1r6pF3rkP rJOw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1758904282; x=1759509082; 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=Jrdnpe1IxxMyMBign8PA7N+60CNvizwtKgqYzwIpWS0=; b=dI1Y2p8qD1p/4HNTa2NOaUpQJw8Z6qlJe9OtlnqvrKpsT8KqTdUuMD7DXoxi9joPcW pjCKHe6EPIDzJ9OL6o+I18VeVxctlRGFspyl6UmExj4K40BJr/W0HvajrKUpAf6Eg3VD 9Gs8A+6c8WmAPBha36h0k5W5jJpjrRVnIqGfMkAEoDtcRCHLIGu6L+m1rIKcwY5D+SE5 kO8JZ8kaiusrWm/2kYjbq0tn3Ak8xXz/DxacFKvq0Ogi9KHeRcaUw3RhQn2kRUQOqZzs 3N3oPec+ZxnaVSSGEMvqpk1leESQzyYYPAVatlXlNCle/Afi+9kP1qbCZ+Rmh+fj839T qfDg== X-Forwarded-Encrypted: i=1; AJvYcCWCobPkPrsecp36hAOlTxyDnq+cFzCVQvtD0Jla+x13+bgCYhGw6z5dAm5zSPQuEj9ZfWt58kON/fkXqdE=@vger.kernel.org X-Gm-Message-State: AOJu0YzY7tbtniwKX37gtFp85AllJFF8lCOYIDfECadf7DSlB8zohgpk ruZ/ZgVNSzCIpVnujXtQOjFlY8nND5NVwtOc89h4ap5tMw/Q+kYkbihzECBEfVuZkPWPLcJ8Lko mqDWoeA== X-Google-Smtp-Source: AGHT+IHc0b7Kqaw2BbwPa1bS0TvTYtZb38Jra84sBINy0Wb/nOM/BBhCMtxiLzzsk4lLq4tKiNYiFQlnTiA= X-Received: from pjbpg3.prod.google.com ([2002:a17:90b:1e03:b0:32d:69b3:b7b0]) (user=seanjc job=prod-delivery.src-stubby-dispatcher) by 2002:a17:90b:1e0a:b0:32e:4924:690f with SMTP id 98e67ed59e1d1-3342a2437c4mr9057691a91.6.1758904281735; Fri, 26 Sep 2025 09:31:21 -0700 (PDT) Reply-To: Sean Christopherson Date: Fri, 26 Sep 2025 09:31:02 -0700 In-Reply-To: <20250926163114.2626257-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: <20250926163114.2626257-1-seanjc@google.com> X-Mailer: git-send-email 2.51.0.536.g15c5d4f767-goog Message-ID: <20250926163114.2626257-2-seanjc@google.com> Subject: [PATCH 1/6] KVM: guest_memfd: Add DEFAULT_SHARED flag, reject user page faults if not set From: Sean Christopherson To: Paolo Bonzini , Christian Borntraeger , Janosch Frank , Claudio Imbrenda Cc: kvm@vger.kernel.org, linux-kernel@vger.kernel.org, David Hildenbrand , Fuad Tabba , Sean Christopherson , 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 shared by default, and reject user page faults if the guest_memfd instance's memory isn't shared by default. Because KVM doesn't yet support in-place private<=3D>shared conversions, all guest_memfd memory effectively follows the default state. Alternatively, KVM could deduce the default 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 Cc: Fuad Tabba Signed-off-by: Sean Christopherson Reviewed-by: Ackerley Tng Reviewed-by: Fuad Tabba Tested-by: Fuad Tabba --- Documentation/virt/kvm/api.rst | 10 ++++++++-- include/uapi/linux/kvm.h | 3 ++- tools/testing/selftests/kvm/guest_memfd_test.c | 5 +++-- virt/kvm/guest_memfd.c | 6 +++++- 4 files changed, 18 insertions(+), 6 deletions(-) diff --git a/Documentation/virt/kvm/api.rst b/Documentation/virt/kvm/api.rst index c17a87a0a5ac..4dfe156bbe3c 100644 --- a/Documentation/virt/kvm/api.rst +++ b/Documentation/virt/kvm/api.rst @@ -6415,8 +6415,14 @@ guest_memfd range is not allowed (any number of memo= ry regions can be bound 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. +supports GUEST_MEMFD_FLAG_MMAP and GUEST_MEMFD_FLAG_DEFAULT_SHARED. Sett= ing +the MMAP flag on guest_memfd creation enables mmap() and faulting of guest= _memfd +memory to host userspace (so long as the memory is currently shared). Set= ting +DEFAULT_SHARED makes all guest_memfd memory shared by default (versus priv= ate +by default). Note! Because KVM doesn't yet support in-place private<=3D>= shared +conversions, DEFAULT_SHARED must be specified in order to fault memory into +userspace page tables. This limitation will go away when in-place convers= ions +are supported. =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..38a2c083b6aa 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_DEFAULT_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 b3ca6737f304..81b11a958c7a 100644 --- a/tools/testing/selftests/kvm/guest_memfd_test.c +++ b/tools/testing/selftests/kvm/guest_memfd_test.c @@ -274,7 +274,7 @@ static void test_guest_memfd(unsigned long vm_type) vm =3D vm_create_barebones_type(vm_type); =20 if (vm_check_cap(vm, KVM_CAP_GUEST_MEMFD_MMAP)) - flags |=3D GUEST_MEMFD_FLAG_MMAP; + flags |=3D GUEST_MEMFD_FLAG_MMAP | GUEST_MEMFD_FLAG_DEFAULT_SHARED; =20 test_create_guest_memfd_multiple(vm); test_create_guest_memfd_invalid_sizes(vm, flags, page_size); @@ -337,7 +337,8 @@ static void test_guest_memfd_guest(void) "Default VM type should always support guest_memfd mmap()"); =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_DEFAULT_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 08a6bc7d25b6..19f05a45be04 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_DEFAULT_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_DEFAULT_SHARED; =20 if (flags & ~valid_flags) return -EINVAL; --=20 2.51.0.536.g15c5d4f767-goog From nobody Wed Oct 1 22:33:19 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 4CC402EB5A3 for ; Fri, 26 Sep 2025 16:31:24 +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=1758904285; cv=none; b=Lpswe9jwj8nhCQDyymvXoBdmVyj41h1c2PxfgNbvgoOdxm3cuvcUfRf+UX/gyJnmXS7t1MNO2y5FkuBmXWVyh8+MSTj9MysAtqlYe/Zwe4O8GUbiXPgfHgPyJC0ZVseXFpK2Iy9PaNeewmZRRi5ZcVsubqdVh+PYl7KPUQMeD58= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1758904285; c=relaxed/simple; bh=0SQATKFA5gi2ffa5TCQYKJ7IY8wK+LLtm/R1ws10kd0=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=hBiU5/I5HkA8L2XF0UDGlfl8vYs1DnV1B0x6no6psuSbhUp+jbmZeP2WGcEQYFzSn8DW8RcbMSVlwJ4Pej/KSDuYSK5o+qbY9e2GqtmZBuXaUT2tlaMGILkGTSaAl1jRtETAjI4rPHK5z/jRL3V3Qo9lkHvsWPMzhbI22ApSX/E= 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=XdgwTAyf; 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="XdgwTAyf" Received: by mail-pj1-f73.google.com with SMTP id 98e67ed59e1d1-3307af9b55eso2220244a91.2 for ; Fri, 26 Sep 2025 09:31:24 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1758904283; x=1759509083; 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=Sa4dCKWOiWX52uFMDDYKBgVjziPASjCyYcwrRWASNCs=; b=XdgwTAyfGLOQVsTPqGrCdq96jMfQAMg0sLbq++CckR+g19YmNI0CTWVIQT2V0GqYPY zVG7Thz4Jmsl7O8LpXh3yojrQ1zjgphoImNV3FK5FKCrn2INSVcLj0YWIkFUVCGjsve9 eToTAEOPy41tZ2g/8brKBlJL5amFPaXQAqbe2TyPmqa3IpdPeAoWZNTZME/WnHU/O3KC OSKwCYcvEjSqq+430W0HHDHO0x7KWhaWmnfM/wgmJc6Sy9OzoRZRuponJsCNQxnYZb8k JO44KTv/vLI3t0YpbhkEI99m2URifoCiuniJXclKLn0CQ2N0Q6BVqXUPACtMeI2vjUZD kwcA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1758904283; x=1759509083; 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=Sa4dCKWOiWX52uFMDDYKBgVjziPASjCyYcwrRWASNCs=; b=kPQsaYUhWO7esX+ZKUlMyZ6gxn4CmKMZsjHZlFa+3Ta45PjDMk9LIdJNtVQzk8PMKU O2MVCEtLRNKLgWzlF6ZRgS1EZSu6ZYUFSztaN7xaFlwVn2qrT6dQ75cS5PsnsFwcATlu paTh/PXwdJvlN7o1HoSxBliLy2M5DPF83qrO/sjEPo6cpXM2cGMMGA3HO8mAHe3SV/bu b1nHfbhkQLWVswoaDQLDjsWVVupaAtUH/qx/sIgAdcIs/HB94MppmAbo9qZFVRq5939k suT9DUzBiqXH3Zb3X8dKYtv/hqf7v1wa/EFw7dI6DNw7odYBmB/WDYAJrIkCg2uSFUwD K5uA== X-Forwarded-Encrypted: i=1; AJvYcCXyivCw2mrnpPjIqkW6cFrTqyDIsQU6DGZXbXYZuCx1i8Ohm4QrBHGWmXu7ZL8QHSsswJL8EZUAk8H8ZJs=@vger.kernel.org X-Gm-Message-State: AOJu0Yw9iFEbERZPUJJGKQg+3muZ6+APiSAUxEu8daPcOtDZmcgMqMab G64AM4OFboGjxm5xeHi/Jg0758zwdIffnb0UQPddwm47938Cir/w0YtT3E6aoy911n+8wdvGhzH Fb+uVcA== X-Google-Smtp-Source: AGHT+IHxkuYFJdCTH53s6GSi6lSMHFNJPOSAv81AidBatI33QbAC/pL6MnFbStGz6ZCbISY/uGwjnu+EBo8= X-Received: from pjdn93.prod.google.com ([2002:a17:90a:2ce6:b0:330:6513:c709]) (user=seanjc job=prod-delivery.src-stubby-dispatcher) by 2002:a17:90a:e7c1:b0:32b:d8af:b636 with SMTP id 98e67ed59e1d1-3342a2b9556mr8924156a91.19.1758904283515; Fri, 26 Sep 2025 09:31:23 -0700 (PDT) Reply-To: Sean Christopherson Date: Fri, 26 Sep 2025 09:31:03 -0700 In-Reply-To: <20250926163114.2626257-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: <20250926163114.2626257-1-seanjc@google.com> X-Mailer: git-send-email 2.51.0.536.g15c5d4f767-goog Message-ID: <20250926163114.2626257-3-seanjc@google.com> Subject: [PATCH 2/6] KVM: selftests: Stash the host page size in a global in the guest_memfd test From: Sean Christopherson To: Paolo Bonzini , Christian Borntraeger , Janosch Frank , Claudio Imbrenda Cc: kvm@vger.kernel.org, linux-kernel@vger.kernel.org, David Hildenbrand , Fuad Tabba , Sean Christopherson , 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. Signed-off-by: Sean Christopherson Reviewed-by: Ackerley Tng Reviewed-by: David Hildenbrand Reviewed-by: Fuad Tabba Tested-by: Fuad Tabba --- .../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 81b11a958c7a..8251d019206a 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"); @@ -241,7 +241,6 @@ static void test_create_guest_memfd_multiple(struct kvm= _vm *vm) =20 static void test_guest_memfd_flags(struct kvm_vm *vm, uint64_t valid_flags) { - size_t page_size =3D getpagesize(); uint64_t flag; int fd; =20 @@ -265,10 +264,8 @@ 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; int fd; =20 - page_size =3D getpagesize(); total_size =3D page_size * 4; =20 vm =3D vm_create_barebones_type(vm_type); @@ -277,22 +274,22 @@ static void test_guest_memfd(unsigned long vm_type) flags |=3D GUEST_MEMFD_FLAG_MMAP | GUEST_MEMFD_FLAG_DEFAULT_SHARED; =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, flags); =20 @@ -367,6 +364,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.536.g15c5d4f767-goog From nobody Wed Oct 1 22:33:19 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 56D392F6164 for ; Fri, 26 Sep 2025 16:31:26 +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=1758904287; cv=none; b=mRmn6Ng3SKN7KzjFOshEfxJeS3JbwtqLyiD/9JCX8SlDxQvncw6joDxCNPWpiLIlP5u956js0zXXuHO2h6IkkJ2aFNPnOh2lWzqrjMmEVyHMwl1hpsYwM2L+oDqUL9bhlZ1hCubBSKpQz2TiPh7gIoWs1WauedA5+ipZOlW6iLA= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1758904287; c=relaxed/simple; bh=MAGU8L12jB8wVEW47uqOWIWiTe/Qj22xQ0Pomduj5Gs=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=HH8sIFuDa3f9yN5Vw8jTc3MirHUc06C4w50aT2GLleVAOrqAzcMKPaDPPXunuY8+PZXHwr64EoEouBi0uEZpC1+337McgguZJ3/VvYKHFe15vAAqRC46rbxtRaCu+v1CAOXaz7EvRHnM0vwT4baaXmkJkf3Ef0Gh9yKrbHP8Uyo= 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=I+ZGRbUr; 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="I+ZGRbUr" Received: by mail-pj1-f74.google.com with SMTP id 98e67ed59e1d1-3307af9b55eso2220268a91.2 for ; Fri, 26 Sep 2025 09:31:26 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1758904286; x=1759509086; 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=mLOzX8BBzpvK79s3HUFrSzFihc7sYmH8hFEiPkJQUNg=; b=I+ZGRbUrVx/A1jacn3tdkiyIIkBFtLnTTfREBnJPyCx3tIRSPQZv+EYqXRFNE3EndM 7fwzXuzSSb7Q+C8crIMper7EvDGgJdY+LW1sW+bEwymc0KAhTYrCAvH5ITqrKP0lwPA/ OfOQ48E6nxiu+sM/xQPyMvfbKwxh4UXElPVUPflhOtiOFfVr/Y0R5gACtoBPDBMZvjcA bIXOWFSsdfZOzLkI90ALTHojzPMnrDsLRFzojsm3h5W6PD6mGb4wpHCJVLvacBc+++S6 zlRzPPzRGkWJhpgo+p0eXkbn5wBTR6h8Y8vp1X69hVp+ZHo0lYGs0+rV9TtorD+33g5J Ij8w== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1758904286; x=1759509086; 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=mLOzX8BBzpvK79s3HUFrSzFihc7sYmH8hFEiPkJQUNg=; b=kNjxsWNValA7BDtUr8BA3NXKX9NHNWmwjf/x6lH8R7/jJQwTlJsyQc5fNNjTwyFdKB GQMvLwsKW///+mhMzo0jwVicB+cicMdOVeaNWXxTP789fjjHIma6rgpWEs5HohR3GgXo Smkk/3KgUKhVjkIoNIMizBGcyFKORinqwAEbatj1XuE1PWmVCiaeL7OJ4HPrVx5Jai15 kR5YAHZk8fVOeicVeMAeDZ0DZGVVZ1oAJxm4TM9bHmG/TIJ0/XN02utIZ+zDch98fvti iw7VN+ovcQAzzioy0yvhTduJ9XLXwfOSoTekJGMPW0MIApG5Mknmy1Q0BkoXvaZ+ihjb jJ/w== X-Forwarded-Encrypted: i=1; AJvYcCWHaT+t4Pe+gbRT8AhfeZfddx2qxLWUD2wQVPEb9y1aId4mJenPX0nB+rf+tXU9Zw8yfVL9ipm9XiJOQS4=@vger.kernel.org X-Gm-Message-State: AOJu0Yy04wtyJ4oPjopgcKyCYwJusWKKeUJQ5oExcHV8QwO+1IEHJNx5 T6NdzEiKPv4lLxtgYW/IWzqJ9+tRXHcqfAvbDFkqYuyA6prbypswb+fwGTy4KOghhftnJfJ1dJT VFWPBbg== X-Google-Smtp-Source: AGHT+IHkMCOD5/dHxBWIFTEBy3wYtTT/yvxoDVojAwCUGYoSg7l/3kr2egBxNpTIWTnHjRUN0RtqQ3g60JM= X-Received: from pjyt11.prod.google.com ([2002:a17:90a:e50b:b0:32f:3fab:c9e7]) (user=seanjc job=prod-delivery.src-stubby-dispatcher) by 2002:a17:90b:4a4c:b0:32e:8c14:5d09 with SMTP id 98e67ed59e1d1-3342a23718dmr7605186a91.7.1758904285619; Fri, 26 Sep 2025 09:31:25 -0700 (PDT) Reply-To: Sean Christopherson Date: Fri, 26 Sep 2025 09:31:04 -0700 In-Reply-To: <20250926163114.2626257-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: <20250926163114.2626257-1-seanjc@google.com> X-Mailer: git-send-email 2.51.0.536.g15c5d4f767-goog Message-ID: <20250926163114.2626257-4-seanjc@google.com> Subject: [PATCH 3/6] KVM: selftests: Create a new guest_memfd for each testcase From: Sean Christopherson To: Paolo Bonzini , Christian Borntraeger , Janosch Frank , Claudio Imbrenda Cc: kvm@vger.kernel.org, linux-kernel@vger.kernel.org, David Hildenbrand , Fuad Tabba , Sean Christopherson , 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 Signed-off-by: Sean Christopherson Reviewed-by: Ackerley Tng Reviewed-by: David Hildenbrand Reviewed-by: Fuad Tabba Tested-by: Fuad Tabba --- .../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 8251d019206a..60c6dec63490 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 @@ -259,14 +259,18 @@ static void test_guest_memfd_flags(struct kvm_vm *vm,= uint64_t valid_flags) } } =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) { uint64_t flags =3D 0; struct kvm_vm *vm; - size_t total_size; - int fd; - - total_size =3D page_size * 4; =20 vm =3D vm_create_barebones_type(vm_type); =20 @@ -276,24 +280,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, flags); =20 - close(fd); kvm_vm_free(vm); } =20 --=20 2.51.0.536.g15c5d4f767-goog From nobody Wed Oct 1 22:33:19 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 5EB5B2FA0DF for ; Fri, 26 Sep 2025 16:31:28 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.216.73 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1758904290; cv=none; b=bVlZoBJv0n8wvaus9r6Cn/5H5ZXyZYZ9Eqg/P2MrlBSSRhIugpCK0WUxHziiE4XqmP1aEC95/TufonXvmhBVHnZLDJ9CUxvHjq9QJcLuf3JMwzevkVd+mHhFRYEVnIwpHFo2ndbD3Es3hgIFOQ7G5vwt7rHWFwHFbBp6yTyH7iE= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1758904290; c=relaxed/simple; bh=NwVBLzkycsIvNLZWFoTgP99Nti5Zw+TydW4zPHJYhTk=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=Z9QTtQUJKRuyz8ZPzCBIZJ9mNA6u5+x2SL4NSofBQDEMHaNlL39HfUSuA/bd5z+OL+QYgDZIiHvNgV3MBv6+w40N+o8Pmaug5hfeExnVzLb8NcqtvFvngj3KU7RD+3AFgAjGdq7zIm4CyPpvijtmuD3OIdy6dg7fSZGUJ3wm2mQ= 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=Yz8qgC59; 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="Yz8qgC59" Received: by mail-pj1-f73.google.com with SMTP id 98e67ed59e1d1-32eb18b5659so2258499a91.2 for ; Fri, 26 Sep 2025 09:31:28 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1758904287; x=1759509087; 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=l3zdqnz7hE8XrMpTHfpgLZMPiUOgmALQcu+ienriJT0=; b=Yz8qgC59ciQhaeKuG9m9SXxrgEFCkHrLvMHv05xxMPmuwtXliKFOyUEZ2OU94tWiDS UxtX5uN4/5P3DK3sb1zULpUUfR9j+aZl1xuPA2z3JaP1/d3IptAwQHa/SUdRBgMjv5Cg bCr1R5eFqyNjSY6hKaiHxGO2QBjTzoaLaC1C+wmSMCMu11uIRxxstAzyJ7lS8wNrXeWy kT8ulyHtDcBk840AxpHkp9uxEkHbzYRBnC4kQXxjZ5ISEVleMbvVNMjURBGnNNuRqvfT npt7TNmZbfj0Jjpb8d8wl8MHcUUajLm6GX0dQ2zAwubEKq5uU+AZDdbbUrnmgPL8knfa oZHA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1758904287; x=1759509087; 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=l3zdqnz7hE8XrMpTHfpgLZMPiUOgmALQcu+ienriJT0=; b=QeRZprQjIWfkLlgXgNWqWF8PiLTt/pI1oTWUdvvK9TUtDv/SEZ1ZjGf3Ja5TBSCAVD xdCC6L0NgXV3fpotEAXpRggUX3vZ7JbrYUWPt2ipJSGg8/a3aFdcq2a5i7mzD4iOxw79 iICmASgbbwDgr/8PWe2QKUlLkhxr8W+Mro4aZQh0UYBC1yjR9Xd2vdmt5+Hl2DJqsnfW VXn0RvxaADriAzdVkiLm7GhNGVsckOMSdG2WNSLXrO+jIC4CQ10x3NvwuHv6vZo8PO5S xlFtuIQjTJLuUjByfDEOQKn21BUuxjIksh00Aq1UOKeZl5sb+sxfgMWtYDt1id+pt1kz l8lA== X-Forwarded-Encrypted: i=1; AJvYcCX+JarF4fao+YgcEDMXRzCBGqFM78wP0+KFA4WbQq2ujQCtnb5LLqYjzdRLuOUh/MOu4oKQ5LR1/nFWq3s=@vger.kernel.org X-Gm-Message-State: AOJu0YxQH7O6OPzcpYuXrgcjgKxMOIamPBIOr46HDv6VWJ0ueDB3t5ol ACaAmfGD7rXD4DLb/56612Pky1KdhTA9NlwjrcVmQx8PX6F6Derh1UQZJKa/PurgxITEI423z4P voM8BZg== X-Google-Smtp-Source: AGHT+IFEYG6OnzBq2EM3fBSKkROXcSOcnJkIoTMS39B+6e4KnPVpK7mYOvt/GSiwhK61zdSwXPK5dS+XxSk= X-Received: from pjxu4.prod.google.com ([2002:a17:90a:db44:b0:32e:c813:df48]) (user=seanjc job=prod-delivery.src-stubby-dispatcher) by 2002:a17:90b:380e:b0:32e:7270:94aa with SMTP id 98e67ed59e1d1-3342a2c7d99mr9343719a91.19.1758904287630; Fri, 26 Sep 2025 09:31:27 -0700 (PDT) Reply-To: Sean Christopherson Date: Fri, 26 Sep 2025 09:31:05 -0700 In-Reply-To: <20250926163114.2626257-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: <20250926163114.2626257-1-seanjc@google.com> X-Mailer: git-send-email 2.51.0.536.g15c5d4f767-goog Message-ID: <20250926163114.2626257-5-seanjc@google.com> Subject: [PATCH 4/6] KVM: selftests: Add test coverage for guest_memfd without GUEST_MEMFD_FLAG_MMAP From: Sean Christopherson To: Paolo Bonzini , Christian Borntraeger , Janosch Frank , Claudio Imbrenda Cc: kvm@vger.kernel.org, linux-kernel@vger.kernel.org, David Hildenbrand , Fuad Tabba , Sean Christopherson , 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. test_guest_memfd_flags() tests valid flags, hence it can be run just once per VM type, and valid flag identification can be moved into the test function. Signed-off-by: Ackerley Tng [sean: use double-underscores for the inner helper] Signed-off-by: Sean Christopherson Reviewed-by: David Hildenbrand Reviewed-by: Fuad Tabba Tested-by: Fuad Tabba --- .../testing/selftests/kvm/guest_memfd_test.c | 30 ++++++++++++------- 1 file changed, 19 insertions(+), 11 deletions(-) diff --git a/tools/testing/selftests/kvm/guest_memfd_test.c b/tools/testing= /selftests/kvm/guest_memfd_test.c index 60c6dec63490..5a50a28ce1fa 100644 --- a/tools/testing/selftests/kvm/guest_memfd_test.c +++ b/tools/testing/selftests/kvm/guest_memfd_test.c @@ -239,11 +239,16 @@ static void test_create_guest_memfd_multiple(struct k= vm_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 0; uint64_t flag; int fd; =20 + if (vm_check_cap(vm, KVM_CAP_GUEST_MEMFD_MMAP)) + valid_flags |=3D GUEST_MEMFD_FLAG_MMAP | + GUEST_MEMFD_FLAG_DEFAULT_SHARED; + for (flag =3D BIT(0); flag; flag <<=3D 1) { fd =3D __vm_create_guest_memfd(vm, page_size, flag); if (flag & valid_flags) { @@ -267,16 +272,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) { - uint64_t flags =3D 0; - struct kvm_vm *vm; - - vm =3D vm_create_barebones_type(vm_type); - - if (vm_check_cap(vm, KVM_CAP_GUEST_MEMFD_MMAP)) - flags |=3D GUEST_MEMFD_FLAG_MMAP | GUEST_MEMFD_FLAG_DEFAULT_SHARED; - test_create_guest_memfd_multiple(vm); test_create_guest_memfd_invalid_sizes(vm, flags); =20 @@ -292,8 +289,19 @@ 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); +} =20 - test_guest_memfd_flags(vm, flags); +static void test_guest_memfd(unsigned long vm_type) +{ + struct kvm_vm *vm =3D vm_create_barebones_type(vm_type); + + test_guest_memfd_flags(vm); + + __test_guest_memfd(vm, 0); + + if (vm_check_cap(vm, KVM_CAP_GUEST_MEMFD_MMAP)) + __test_guest_memfd(vm, GUEST_MEMFD_FLAG_MMAP | + GUEST_MEMFD_FLAG_DEFAULT_SHARED); =20 kvm_vm_free(vm); } --=20 2.51.0.536.g15c5d4f767-goog From nobody Wed Oct 1 22:33:19 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 380B32FB095 for ; Fri, 26 Sep 2025 16:31:30 +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=1758904292; cv=none; b=lQq+tem1S1J2cblCjgGe6lhRUH3AYw2kDK15PtkHyb86nuuQCgg+dzSu9RJM43wNIIJDrs9V09eb8JBzj3isbUsQrrkszNr8zKx2RFr7vihhZEpCCr9BOwkBNXJ5GYCvCibR/AxQ54AvJ2yontSPYBDKlSldu8KA+u6JYsvC8RY= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1758904292; c=relaxed/simple; bh=5ouYU1x+vQV1xYY+5NwCFVJzXzcYqHiWXy2oOvLpX98=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=H2/mLJi/VA7aD8xxV7tOGc4+i59m11GMTXGloe6D2ngy86JHiOhW12YIBXqdA5ZgmHG9XRsAjqMKW1SZv/WymktjbQfX3uBGHwH+Vc9J9TPPQh2ujkW/MVGRJ56HfHtEuHaP/5gPhYWTDeJ2U9FBK1qx8MYRSCzti/kdOp/QUx0= 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=fQ9iZP5g; 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="fQ9iZP5g" Received: by mail-pf1-f201.google.com with SMTP id d2e1a72fcca58-780fb254938so2203690b3a.0 for ; Fri, 26 Sep 2025 09:31:30 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1758904289; x=1759509089; 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=mIE13y709YZSO3EgVozYTZXl0zOqNdqn4QytTeuNFKg=; b=fQ9iZP5gzRGLMEY/rRgdyNZt5Uynrkp6YTpOXf247aUNwhyX6FX257a8Z/sxTt7m9X sy/qBCbgTn8fAfjFxUhiqErANzVcjnsTzVdhPFtVw7UcP8gxMKp/1LiHpothfjG9/gvh UHN+qQ2TQLXBMIL6J3kZVqyqzYJ74i6qTR0RkGHijpP73wgV8cj/eX7uv0LERlI8L/Hg BDvYefRmdR94wNFp+KrivYkiOMv4ho7S9kEfnq//9ccGsY6zdcLoNJgPY+GA5CQJNrHQ 9HgccOkVeZ0ilUl4x/I/B+5DDeMrHvvNoGKNpaxzBKqPPhkO9hD8zwic1U4tkeN2nelN PXLw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1758904289; x=1759509089; 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=mIE13y709YZSO3EgVozYTZXl0zOqNdqn4QytTeuNFKg=; b=DHfrcEiIhj8hQpuhyteaegXPJQK2aRJsV5dr5DkNpGsGMvi4xovgubZvfWMWeIBqbv 32YMkiUK48lykFVw+Flr12cg6bo/pIA6DPvUeSUSu3Cpam1svNzCsH1EgswDWek3Ia+3 LpMsPfpYYFOJ8sgekWBkDigx0DzNS6FwfH5LFAXvkZTu43OZ7MQZrEvKDEsh9GtsZhhd wvOC75sjhej9KUoXPE64v/3L713Vc/Ikp14BTuOZLIKg4dJoc3FT+Sxdn3FeE1WL1WaI hi2ysbog8VitHrWhcjJGMpbrnzNUptzcZci/sKUzKeENY8mpsIJM05CvokvUxbMWP01z c68Q== X-Forwarded-Encrypted: i=1; AJvYcCXZXOx+kWzndgw/hB/lwP+Dnjn0p6eJfmtxhJAf6BN7AhJl/A7xyt6om8Gan05skksMFzNN60DtSIFhtDM=@vger.kernel.org X-Gm-Message-State: AOJu0YxuL8/NsrNMjAZHfRX3EOU60t7T8HngH/6PEo8+YJ3W6kWcAl0h 5fmL9DpOljlG/rU9xqd8g34wlXumvyM1KfjOzRfWnruhKK3/+bcQL9Suklhzj7XmQl/UkyMsiUl En4XfDA== X-Google-Smtp-Source: AGHT+IFN1uUFZT9ExHhwPSN+VNtPUBMVdasrIKeFnHFvRbqS+XCpsvXfl4j9c/yE1lvIbD2pbYso9Ki0qGU= X-Received: from pfde21.prod.google.com ([2002:aa7:8c55:0:b0:77c:b486:d17e]) (user=seanjc job=prod-delivery.src-stubby-dispatcher) by 2002:a05:6a00:3d14:b0:77c:556e:d6b1 with SMTP id d2e1a72fcca58-780fce99850mr9670473b3a.21.1758904289567; Fri, 26 Sep 2025 09:31:29 -0700 (PDT) Reply-To: Sean Christopherson Date: Fri, 26 Sep 2025 09:31:06 -0700 In-Reply-To: <20250926163114.2626257-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: <20250926163114.2626257-1-seanjc@google.com> X-Mailer: git-send-email 2.51.0.536.g15c5d4f767-goog Message-ID: <20250926163114.2626257-6-seanjc@google.com> Subject: [PATCH 5/6] KVM: selftests: Add wrappers for mmap() and munmap() to assert success From: Sean Christopherson To: Paolo Bonzini , Christian Borntraeger , Janosch Frank , Claudio Imbrenda Cc: kvm@vger.kernel.org, linux-kernel@vger.kernel.org, David Hildenbrand , Fuad Tabba , Sean Christopherson , 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. Signed-off-by: Sean Christopherson Reviewed-by: Ackerley Tng Reviewed-by: David Hildenbrand Reviewed-by: Fuad Tabba Tested-by: Fuad Tabba --- .../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 5a50a28ce1fa..5dd40b77dc07 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) @@ -347,10 +342,9 @@ static void test_guest_memfd_guest(void) GUEST_MEMFD_FLAG_DEFAULT_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); @@ -358,8 +352,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 23a506d7eca3..1c68ff0fb3fb 100644 --- a/tools/testing/selftests/kvm/include/kvm_util.h +++ b/tools/testing/selftests/kvm/include/kvm_util.h @@ -278,6 +278,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 c3f5142b0a54..da754b152c11 100644 --- a/tools/testing/selftests/kvm/lib/kvm_util.c +++ b/tools/testing/selftests/kvm/lib/kvm_util.c @@ -770,13 +770,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)); @@ -810,20 +808,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) @@ -1080,12 +1074,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), @@ -1156,12 +1147,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); @@ -1371,10 +1360,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: %i 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); @@ -1821,9 +1808,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.536.g15c5d4f767-goog From nobody Wed Oct 1 22:33:19 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 DD51C2FB97D for ; Fri, 26 Sep 2025 16:31:31 +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=1758904293; cv=none; b=PWomg7ZMWTyUaNvvK5puCU6J+kzugnfP/ljOPVGqYmsJSyVdUaDrGLx2p/Boan7ISoBgK/ssfk6FOnvMmsMPINYrU1keKuRBqJ+M0KoL6rnguhe18Mhs1eovEslmlBtsB26EGOpHwL0fw6z2xvK7Af+2SiTmwWW6qu1CorStX4M= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1758904293; c=relaxed/simple; bh=DenFYgCl3E/nB8eGrwdfhtBbP3Ex8K/c68ZGtk2IY8w=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=bpN5PBsa8M6JDicT6RDELrdSjJeQdGyDoWAly5qig8u2wgXCm0EUkOah3HwV+5AfTExX+w1xdZjTZPBe1snNBX032aHKnmhVAfEvclmB324THPfejj8ZpRM+sFOrVss8IwTzKzV9k18PPlm6V5UItLVS6KSFr+QgIHHyXa9knf0= 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=oj/3rMa7; 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="oj/3rMa7" Received: by mail-pj1-f73.google.com with SMTP id 98e67ed59e1d1-32df881dce2so2746370a91.2 for ; Fri, 26 Sep 2025 09:31:31 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1758904291; x=1759509091; 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=NCJm+oneDJ5rwsc/098MYrhburwn9yZWwqWNnrNvoPY=; b=oj/3rMa7BQsnZekp8ZYyQ4IjlQppnoRs6VjL7MEkqoMxXD1XnUsi74PjbgZFjC3W+2 kkZu5c3gTxXU8fZXlmYdQSOS9HSdpNG+YA0MeqVsi3KcVPe5mct8zuXkHMb3piybjUIf f/wSAs2yoYFadqO1h6KM57rhdgoXDKyASIslQlHaQPNZrMo1r6YRlAXSrxGB/xhfzP8y RJFBpivc/eZ+6Uj7No3pzMg306PzUjm4gSXjNyssGzcftAmW6MHzCsHjREKFNItT96K6 yHdXjcqfRrVAAZ3xdgvOti+cTvxodvgfwJP/N/OCEAk1i+UekrsOWYd79iaN+4+MCt84 c8Eg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1758904291; x=1759509091; 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=NCJm+oneDJ5rwsc/098MYrhburwn9yZWwqWNnrNvoPY=; b=uWYoKt/fWHnoPy3FPRIdyojAloJnEIAI06/EmAO9FdGQL1OvbYG/oXHQL0KQpUkLpJ YN6BNzCGhFvIFMRv2LIkZL5oDA+70MhEcU/NqripH6sDiR1I46QVGpylcTiiK9ZUb2er qhdS41aoRpBIRzs1k1S5kJt+lKH3YFR02oTSJzgLD+LFs0+FHijk8tGvAgI0UCHsEBib 5iDkxr1q4IH4QG9g28KBe+6fTnbbY2ucA1869vGz+/ruU5n2SUX6d7eNIgIJM3SbURIT izVYfe6+VqdVRq+oUSo+ByANlID5Sbkg2jKFKmEKnPvE9yz/TBwwEiRN0DMQlbtjAXJV sKgw== X-Forwarded-Encrypted: i=1; AJvYcCUgJzLcjyUdSj9t+NosLCMz5IMmD/UtWwy/kNfi5BT7Vo3SXliNTpnuKHjvbYTCIUis0oWvoRi5wmyLUGU=@vger.kernel.org X-Gm-Message-State: AOJu0Yx6vjqb7DXoyWzmiztfXdFL517gC3lOHbpZFYM/76hEe17VfQKH opDZPqyVtT/R+BZ0KKgU/tuWhnxf5BmwIQej45jXTRfQnTr/wKP+d4Y0asN90kmmpRsOPDQJNu+ wF9WEsg== X-Google-Smtp-Source: AGHT+IEcjS8XYUaIxvLwGVIG6V9ayVItEqtASIL24S1Lw4LUyDHuVM8ZHEEBRAHizK6NEBTV8/u3Tvd2yLk= X-Received: from pjhk88.prod.google.com ([2002:a17:90a:4ce1:b0:323:25d2:22db]) (user=seanjc job=prod-delivery.src-stubby-dispatcher) by 2002:a17:90b:38ca:b0:335:2a00:6836 with SMTP id 98e67ed59e1d1-3352a00692bmr4201028a91.18.1758904291403; Fri, 26 Sep 2025 09:31:31 -0700 (PDT) Reply-To: Sean Christopherson Date: Fri, 26 Sep 2025 09:31:07 -0700 In-Reply-To: <20250926163114.2626257-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: <20250926163114.2626257-1-seanjc@google.com> X-Mailer: git-send-email 2.51.0.536.g15c5d4f767-goog Message-ID: <20250926163114.2626257-7-seanjc@google.com> Subject: [PATCH 6/6] KVM: selftests: Verify that faulting in private guest_memfd memory fails From: Sean Christopherson To: Paolo Bonzini , Christian Borntraeger , Janosch Frank , Claudio Imbrenda Cc: kvm@vger.kernel.org, linux-kernel@vger.kernel.org, David Hildenbrand , Fuad Tabba , Sean Christopherson , 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. Cc: Ackerley Tng Signed-off-by: Sean Christopherson Reviewed-by: Ackerley Tng Reviewed-by: David Hildenbrand Reviewed-by: Fuad Tabba Tested-by: Fuad Tabba --- .../testing/selftests/kvm/guest_memfd_test.c | 62 ++++++++++++++----- 1 file changed, 46 insertions(+), 16 deletions(-) diff --git a/tools/testing/selftests/kvm/guest_memfd_test.c b/tools/testing= /selftests/kvm/guest_memfd_test.c index 5dd40b77dc07..b5a631aca933 100644 --- a/tools/testing/selftests/kvm/guest_memfd_test.c +++ b/tools/testing/selftests/kvm/guest_memfd_test.c @@ -40,17 +40,26 @@ 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_common(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."); =20 - mem =3D kvm_mmap(total_size, PROT_READ | PROT_WRITE, MAP_SHARED, fd); + mem =3D kvm_mmap(size, PROT_READ | PROT_WRITE, MAP_SHARED, fd); + + return mem; +} + +static void test_mmap_supported(int fd, size_t total_size) +{ + const char val =3D 0xaa; + char *mem; + size_t i; + int ret; + + mem =3D test_mmap_common(fd, total_size); =20 memset(mem, val, total_size); for (i =3D 0; i < total_size; i++) @@ -78,31 +87,47 @@ void fault_sigbus_handler(int signum) siglongjmp(jmpbuf, 1); } =20 -static void test_fault_overflow(int fd, size_t total_size) +static void *test_fault_sigbus(int fd, size_t 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; - size_t i; + void *mem; =20 - mem =3D kvm_mmap(map_size, PROT_READ | PROT_WRITE, MAP_SHARED, fd); + mem =3D test_mmap_common(fd, size); =20 sigaction(SIGBUS, &sa_new, &sa_old); if (sigsetjmp(jmpbuf, 1) =3D=3D 0) { - memset(mem, 0xaa, map_size); + memset(mem, 0xaa, size); TEST_ASSERT(false, "memset() should have triggered SIGBUS."); } sigaction(SIGBUS, &sa_old, NULL); =20 + return mem; +} + +static void test_fault_overflow(int fd, size_t total_size) +{ + size_t map_size =3D total_size * 4; + const char val =3D 0xaa; + char *mem; + size_t i; + + mem =3D test_fault_sigbus(fd, map_size); + for (i =3D 0; i < total_size; i++) TEST_ASSERT_EQ(READ_ONCE(mem[i]), val); =20 kvm_munmap(mem, map_size); } =20 +static void test_fault_private(int fd, size_t total_size) +{ + void *mem =3D test_fault_sigbus(fd, total_size); + + kvm_munmap(mem, total_size); +} + static void test_mmap_not_supported(int fd, size_t total_size) { char *mem; @@ -274,9 +299,12 @@ static void __test_guest_memfd(struct kvm_vm *vm, uint= 64_t flags) =20 gmem_test(file_read_write, vm, flags); =20 - if (flags & GUEST_MEMFD_FLAG_MMAP) { + if (flags & GUEST_MEMFD_FLAG_MMAP && + flags & GUEST_MEMFD_FLAG_DEFAULT_SHARED) { gmem_test(mmap_supported, vm, flags); gmem_test(fault_overflow, vm, flags); + } else if (flags & GUEST_MEMFD_FLAG_MMAP) { + gmem_test(fault_private, vm, flags); } else { gmem_test(mmap_not_supported, vm, flags); } @@ -294,9 +322,11 @@ static void test_guest_memfd(unsigned long vm_type) =20 __test_guest_memfd(vm, 0); =20 - if (vm_check_cap(vm, KVM_CAP_GUEST_MEMFD_MMAP)) + if (vm_check_cap(vm, KVM_CAP_GUEST_MEMFD_MMAP)) { + __test_guest_memfd(vm, GUEST_MEMFD_FLAG_MMAP); __test_guest_memfd(vm, GUEST_MEMFD_FLAG_MMAP | GUEST_MEMFD_FLAG_DEFAULT_SHARED); + } =20 kvm_vm_free(vm); } --=20 2.51.0.536.g15c5d4f767-goog