RE: [PATCH i-g-t v3 4/8] tests/intel/xe_madvise: Add dontneed-after-mmap subtest

Gurram, Pravalika
2026-02-23T05:10:10Z

> -----Original Message-----
> From: Yadav, Arvind <arvind.yadav@intel.com>
> Sent: Tuesday, 17 February, 2026 08:04 AM
> To: igt-dev@lists.freedesktop.org
> Cc: Brost, Matthew <matthew.brost@intel.com>; Ghimiray, Himal Prasad
> <himal.prasad.ghimiray@intel.com>; thomas.hellstrom@linux.intel.com;
> Sharma, Nishit <nishit.sharma@intel.com>; Gurram, Pravalika
> <pravalika.gurram@intel.com>
> Subject: [PATCH i-g-t v3 4/8] tests/intel/xe_madvise: Add dontneed-after-
> mmap subtest
>
> This test verifies that an existing mmap becomes invalid after the BO is marked
> as purgeable and purged. The test creates a BO, maps it, writes data, then
> marks it DONTNEED and triggers memory pressure.
> Accessing the previously valid mapping should now trigger SIGBUS or SIGSEGV,
> confirming that existing mappings are correctly invalidated when the backing
> store is purged.
>
> Cc: Nishit Sharma <nishit.sharma@intel.com>
> Cc: Pravalika Gurram <pravalika.gurram@intel.com>
> Cc: Matthew Brost <matthew.brost@intel.com>
> Cc: Thomas Hellström <thomas.hellstrom@linux.intel.com>
> Cc: Himal Prasad Ghimiray <himal.prasad.ghimiray@intel.com>
> Signed-off-by: Arvind Yadav <arvind.yadav@intel.com>
> ---
> tests/intel/xe_madvise.c | 54
> ++++++++++++++++++++++++++++++++++++++++
> 1 file changed, 54 insertions(+)
>
> diff --git a/tests/intel/xe_madvise.c b/tests/intel/xe_madvise.c index
> 7dbe70f42..5c6a24553 100644
> --- a/tests/intel/xe_madvise.c
> +++ b/tests/intel/xe_madvise.c
> @@ -196,6 +196,54 @@ static void test_dontneed_before_mmap(int fd,
> struct drm_xe_engine_class_instanc
> xe_vm_destroy(fd, vm);
> }
>
> +/**
> + * SUBTEST: dontneed-after-mmap
> + * Description: Mark BO as DONTNEED after mmap, verify SIGBUS on
> +accessing purged mapping
> + * Test category: functionality test
> + */
> +static void test_dontneed_after_mmap(int fd, struct
> +drm_xe_engine_class_instance *hwe) {
> + uint32_t bo, vm;
> + uint64_t addr = PURGEABLE_ADDR;
> + size_t bo_size = PURGEABLE_BO_SIZE;
> + void *map;
> +
> + purgeable_setup_simple_bo(fd, &vm, &bo, addr, bo_size, true);
> +
> + map = xe_bo_map(fd, bo, bo_size);
> + memset(map, 0xAB, bo_size);
> +
> + if (!purgeable_mark_and_verify_purged(fd, vm, addr, bo_size))
> + igt_skip("Unable to induce purge on this platform/config");
> +
> + /* Access purged mapping - should trigger SIGBUS/SIGSEGV */
> + {
> + sighandler_t old_sigsegv, old_sigbus;
> + char *ptr = (char *)map;
> + int sig;
> +
> + old_sigsegv = signal(SIGSEGV, (__sighandler_t)sigtrap);
> + old_sigbus = signal(SIGBUS, (__sighandler_t)sigtrap);
> +
> + sig = sigsetjmp(jmp, SIGBUS | SIGSEGV);
> + if (sig == SIGBUS || sig == SIGSEGV) {
> + /* Expected - purged mapping access failed */
> + } else if (sig == 0) {
> + *ptr = 0;
> + igt_assert_f(false, "Access to purged mapping should
> trigger signal\n");
> + } else {
> + igt_assert_f(false, "unexpected signal %d\n", sig);
> + }
> +
> + signal(SIGBUS, old_sigbus);
> + signal(SIGSEGV, old_sigsegv);
> + }
> +
> + munmap(map, bo_size);
> + gem_close(fd, bo);
> + xe_vm_destroy(fd, vm);
> +}
> +
Reviewed-by: Pravalika Gurram <pravalika.gurram@intel.com>
> int igt_main()
> {
> struct drm_xe_engine_class_instance *hwe; @@ -212,6 +260,12 @@
> int igt_main()
> break;
> }
>
> + igt_subtest("dontneed-after-mmap")
> + xe_for_each_engine(fd, hwe) {
> + test_dontneed_after_mmap(fd, hwe);
> + break;
> + }
> +
> igt_fixture() {
> xe_device_put(fd);
> drm_close_driver(fd);
> --
> 2.43.0