From: Ackerley Tng <ackerleytng@google.com>
To: Sean Christopherson <seanjc@google.com>,
Paolo Bonzini <pbonzini@redhat.com>,
Christian Borntraeger <borntraeger@linux.ibm.com>,
Janosch Frank <frankja@linux.ibm.com>,
Claudio Imbrenda <imbrenda@linux.ibm.com>
Cc: kvm@vger.kernel.org, linux-kernel@vger.kernel.org,
David Hildenbrand <david@redhat.com>,
Fuad Tabba <tabba@google.com>
Subject: Re: [PATCH v2 11/13] KVM: selftests: Add wrapper macro to handle and assert on expected SIGBUS
Date: Mon, 06 Oct 2025 11:21:33 -0700 [thread overview]
Message-ID: <diqz8qhngac2.fsf@google.com> (raw)
In-Reply-To: <20251003232606.4070510-12-seanjc@google.com>
Sean Christopherson <seanjc@google.com> writes:
> 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
terrible => terribly
> 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.
>
Adding TEST_FAIL() after action on behalf of the developer (easily
forgotten/left out) helps ensure that test runs don't falsely pass if
there was no SIGBUS.
> Explicitly mark the SIGBUS handler as "used", as gcc-14 at least likes to
> discard the function before linking.
>
I think you also meant to talk about opportunistically using TEST_FAIL()
instead of TEST_ASSERT(false, ...) here.
> Suggested-by: Ackerley Tng <ackerleytng@google.com>
Not sure if these still apply after the Suggested-by tag, but anyway:
Reviewed-by: Ackerley Tng <ackerleytng@google.com>
Tested-by: Ackerley Tng <ackerleytng@google.com>
> Signed-off-by: Sean Christopherson <seanjc@google.com>
> ---
> .../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 <linux/bitmap.h>
> #include <linux/falloc.h>
> #include <linux/sizes.h>
> -#include <setjmp.h>
> -#include <signal.h>
> #include <sys/mman.h>
> #include <sys/types.h>
> #include <sys/stat.h>
> @@ -77,17 +75,8 @@ static void test_mmap_supported(int fd, size_t total_size)
> kvm_munmap(mem, total_size);
> }
>
> -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 = {
> - .sa_handler = fault_sigbus_handler,
> - };
> size_t map_size = total_size * 4;
> const char val = 0xaa;
> char *mem;
> @@ -95,12 +84,7 @@ static void test_fault_overflow(int fd, size_t total_size)
>
> mem = kvm_mmap(map_size, PROT_READ | PROT_WRITE, MAP_SHARED, fd);
>
> - sigaction(SIGBUS, &sa_new, &sa_old);
> - if (sigsetjmp(jmpbuf, 1) == 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));
>
> for (i = 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/testing/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
>
> +#include <setjmp.h>
> +#include <signal.h>
> #include <stdlib.h>
> #include <stdarg.h>
> #include <stdbool.h>
> @@ -78,6 +80,23 @@ do { \
> __builtin_unreachable(); \
> } while (0)
>
> +extern sigjmp_buf expect_sigbus_jmpbuf;
> +void expect_sigbus_handler(int signum);
> +
> +#define TEST_EXPECT_SIGBUS(action) \
> +do { \
> + struct sigaction sa_old, sa_new = { \
> + .sa_handler = expect_sigbus_handler, \
> + }; \
> + \
> + sigaction(SIGBUS, &sa_new, &sa_old); \
> + if (sigsetjmp(expect_sigbus_jmpbuf, 1) == 0) { \
> + action; \
> + TEST_FAIL("'%s' should have triggered SIGBUS", #action); \
> + } \
> + sigaction(SIGBUS, &sa_old, NULL); \
> +} while (0)
> +
> size_t parse_size(const char *size);
>
> int64_t timespec_to_ns(struct timespec ts);
> diff --git a/tools/testing/selftests/kvm/lib/test_util.c b/tools/testing/selftests/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 @@
>
> #include "test_util.h"
>
> +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.
> --
> 2.51.0.618.g983fd99d29-goog
next prev parent reply other threads:[~2025-10-06 18:21 UTC|newest]
Thread overview: 39+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-10-03 23:25 [PATCH v2 00/13] KVM: guest_memfd: MMAP and related fixes Sean Christopherson
2025-10-03 23:25 ` [PATCH v2 01/13] KVM: Rework KVM_CAP_GUEST_MEMFD_MMAP into KVM_CAP_GUEST_MEMFD_FLAGS Sean Christopherson
2025-10-06 19:16 ` Ackerley Tng
2025-10-06 20:19 ` Sean Christopherson
2025-10-07 16:09 ` Ackerley Tng
2025-10-07 16:13 ` Sean Christopherson
2025-10-10 14:07 ` David Hildenbrand
2025-10-03 23:25 ` [PATCH v2 02/13] KVM: guest_memfd: Add INIT_SHARED flag, reject user page faults if not set Sean Christopherson
2025-10-07 16:14 ` Ackerley Tng
2025-10-10 14:08 ` David Hildenbrand
2025-10-03 23:25 ` [PATCH v2 03/13] KVM: guest_memfd: Invalidate SHARED GPAs if gmem supports INIT_SHARED Sean Christopherson
2025-10-07 16:31 ` Ackerley Tng
2025-10-10 14:09 ` David Hildenbrand
2025-10-03 23:25 ` [PATCH v2 04/13] KVM: Explicitly mark KVM_GUEST_MEMFD as depending on KVM_GENERIC_MMU_NOTIFIER Sean Christopherson
2025-10-10 14:10 ` David Hildenbrand
2025-10-03 23:25 ` [PATCH v2 05/13] KVM: guest_memfd: Allow mmap() on guest_memfd for x86 VMs with private memory Sean Christopherson
2025-10-07 16:43 ` Ackerley Tng
2025-10-10 14:11 ` David Hildenbrand
2025-10-03 23:25 ` [PATCH v2 06/13] KVM: selftests: Stash the host page size in a global in the guest_memfd test Sean Christopherson
2025-10-06 18:30 ` Ackerley Tng
2025-10-03 23:26 ` [PATCH v2 07/13] KVM: selftests: Create a new guest_memfd for each testcase Sean Christopherson
2025-10-06 18:29 ` Ackerley Tng
2025-10-07 22:54 ` Lisa Wang
2025-10-10 15:04 ` David Hildenbrand
2025-10-10 20:12 ` Sean Christopherson
2025-10-03 23:26 ` [PATCH v2 08/13] KVM: selftests: Add test coverage for guest_memfd without GUEST_MEMFD_FLAG_MMAP Sean Christopherson
2025-10-03 23:26 ` [PATCH v2 09/13] KVM: selftests: Add wrappers for mmap() and munmap() to assert success Sean Christopherson
2025-10-03 23:26 ` [PATCH v2 10/13] KVM: selftests: Isolate the guest_memfd Copy-on-Write negative testcase Sean Christopherson
2025-10-06 18:28 ` Ackerley Tng
2025-10-03 23:26 ` [PATCH v2 11/13] KVM: selftests: Add wrapper macro to handle and assert on expected SIGBUS Sean Christopherson
2025-10-06 18:21 ` Ackerley Tng [this message]
2025-10-07 21:16 ` Lisa Wang
2025-10-03 23:26 ` [PATCH v2 12/13] KVM: selftests: Verify that faulting in private guest_memfd memory fails Sean Christopherson
2025-10-06 18:26 ` Ackerley Tng
2025-10-03 23:26 ` [PATCH v2 13/13] KVM: selftests: Verify that reads to inaccessible guest_memfd VMAs SIGBUS Sean Christopherson
2025-10-06 18:22 ` Ackerley Tng
2025-10-06 19:24 ` Sean Christopherson
2025-10-07 18:06 ` Lisa Wang
2025-10-10 21:30 ` [PATCH v2 00/13] KVM: guest_memfd: MMAP and related fixes Sean Christopherson
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=diqz8qhngac2.fsf@google.com \
--to=ackerleytng@google.com \
--cc=borntraeger@linux.ibm.com \
--cc=david@redhat.com \
--cc=frankja@linux.ibm.com \
--cc=imbrenda@linux.ibm.com \
--cc=kvm@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=pbonzini@redhat.com \
--cc=seanjc@google.com \
--cc=tabba@google.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.