From: "Sharma, Nishit" <nishit.sharma@intel.com>
To: Arvind Yadav <arvind.yadav@intel.com>, <igt-dev@lists.freedesktop.org>
Cc: <matthew.brost@intel.com>, <himal.prasad.ghimiray@intel.com>,
<thomas.hellstrom@linux.intel.com>, <pravalika.gurram@intel.com>
Subject: Re: [PATCH i-g-t v7 3/9] tests/intel/xe_madvise: Add dontneed-before-mmap subtest
Date: Fri, 10 Apr 2026 12:40:38 +0530 [thread overview]
Message-ID: <a46aa6ce-4b64-47ae-993e-e2fc03e70871@intel.com> (raw)
In-Reply-To: <20260409070118.2211602-4-arvind.yadav@intel.com>
On 4/9/2026 12:31 PM, Arvind Yadav wrote:
> This test validates that mmap() fails with -EBUSY when attempting to
> map a BO marked DONTNEED. The mmap offset ioctl succeeds (it just
> returns the pre-allocated offset); the purgeable check happens in
> xe_gem_object_mmap() at mmap() time.
>
> - DONTNEED BOs: return -EBUSY (temporary purgeable state, BO still
> has backing store but can be purged at any time)
> - Purged BOs: return -EINVAL (permanent, backing store discarded)
>
> v4:
> - Move unmap outside the block. (Pravalika)
> - Added proper resource cleanup before calling igt_skip(). (Nishit)
> - Added assertion for xe_bo_map. (Nishit)
>
> v5:
> - Add kernel capability check *_FLAG_HAS_PURGING_SUPPORT for
> purgeable support. (Jose)
> - Drop memory pressure trigger path; mark DONTNEED directly and
> assert -EBUSY from mmap offset ioctl; restore WILLNEED before
> cleanup.
>
> v6:
> - Support iGPU by using total system RAM as the pressure baseline
> instead of VRAM size (which is 0 on iGPU).
> - Raise overpressure from 25% to 50% of the baseline to ensure the
> kernel shrinker is forced to reclaim on systems with large free RAM.
> - The DONTNEED enforcement point is mmap() itself, not the
> DRM_IOCTL_XE_GEM_MMAP_OFFSET ioctl. Update the test to mark DONTNEED
> first, then verify DRM_IOCTL_XE_GEM_MMAP_OFFSET still succeeds, and
> finally verify that mmap() fails with -EBUSY
>
> v7:
> - Move unused functions: trigger_memory_pressure(), sigtrap and
> purgeable_mark_and_verify_purged. (Nishit)
>
> Cc: Nishit Sharma <nishit.sharma@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>
> Cc: Pravalika Gurram <pravalika.gurram@intel.com>
> Signed-off-by: Arvind Yadav <arvind.yadav@intel.com>
> ---
> tests/intel/xe_madvise.c | 122 +++++++++++++++++++++++++++++++++++++++
> tests/meson.build | 1 +
> 2 files changed, 123 insertions(+)
> create mode 100644 tests/intel/xe_madvise.c
>
> diff --git a/tests/intel/xe_madvise.c b/tests/intel/xe_madvise.c
> new file mode 100644
> index 000000000..2c8c27fa9
> --- /dev/null
> +++ b/tests/intel/xe_madvise.c
> @@ -0,0 +1,122 @@
> +// SPDX-License-Identifier: MIT
> +/*
> + * Copyright © 2025 Intel Corporation
> + */
> +
> +/**
> + * TEST: Validate purgeable BO madvise functionality
> + * Category: Core
> + * Mega feature: General Core features
> + * Sub-category: Memory management tests
> + * Functionality: madvise, purgeable
> + */
> +
> +#include "igt.h"
> +#include "xe_drm.h"
> +
> +#include "xe/xe_ioctl.h"
> +#include "xe/xe_query.h"
> +
> +/* Purgeable test constants */
> +#define PURGEABLE_ADDR 0x1a0000
> +#define PURGEABLE_BO_SIZE 4096
> +
> +static bool xe_has_purgeable_support(int fd)
> +{
> + struct drm_xe_query_config *config = xe_config(fd);
> +
> + return config->info[DRM_XE_QUERY_CONFIG_FLAGS] &
> + DRM_XE_QUERY_CONFIG_FLAG_HAS_PURGING_SUPPORT;
> +}
> +
> +/**
> + * purgeable_setup_simple_bo - Setup VM and bind a single BO
> + * @fd: DRM file descriptor
> + * @vm: Output VM handle
> + * @bo: Output BO handle
> + * @addr: Virtual address to bind at
> + * @size: Size of the BO
> + * @use_scratch: Whether to use scratch page flag
> + *
> + * Helper to create VM, BO, and bind it at the specified address.
> + */
> +static void purgeable_setup_simple_bo(int fd, uint32_t *vm, uint32_t *bo,
> + uint64_t addr, size_t size, bool use_scratch)
> +{
> + struct drm_xe_sync sync = {
> + .type = DRM_XE_SYNC_TYPE_USER_FENCE,
> + .flags = DRM_XE_SYNC_FLAG_SIGNAL,
> + .timeline_value = 1,
> + };
> + uint64_t sync_val = 0;
> +
> + *vm = xe_vm_create(fd, use_scratch ? DRM_XE_VM_CREATE_FLAG_SCRATCH_PAGE : 0, 0);
> + *bo = xe_bo_create(fd, *vm, size, vram_if_possible(fd, 0),
> + DRM_XE_GEM_CREATE_FLAG_NEEDS_VISIBLE_VRAM);
> +
> + sync.addr = to_user_pointer(&sync_val);
> + xe_vm_bind_async(fd, *vm, 0, *bo, 0, addr, size, &sync, 1);
> + xe_wait_ufence(fd, &sync_val, 1, 0, NSEC_PER_SEC);
> +}
> +
> +/**
> + * SUBTEST: dontneed-before-mmap
> + * Description: Mark BO as DONTNEED before mmap, verify mmap() fails with -EBUSY
> + * Test category: functionality test
> + */
> +static void test_dontneed_before_mmap(int fd)
> +{
> + uint32_t bo, vm;
> + uint64_t addr = PURGEABLE_ADDR;
> + size_t bo_size = PURGEABLE_BO_SIZE;
> + struct drm_xe_gem_mmap_offset mmo = {};
> + uint32_t retained;
> + void *ptr;
> +
> + purgeable_setup_simple_bo(fd, &vm, &bo, addr, bo_size, false);
> +
> + /* Mark BO as DONTNEED - new mmap operations must be blocked */
> + retained = xe_vm_madvise_purgeable(fd, vm, addr, bo_size,
> + DRM_XE_VMA_PURGEABLE_STATE_DONTNEED);
> + igt_assert_eq(retained, 1);
> +
> + /* Ioctl succeeds even for DONTNEED BO; blocking happens at mmap() time. */
> + mmo.handle = bo;
> + igt_assert_eq(igt_ioctl(fd, DRM_IOCTL_XE_GEM_MMAP_OFFSET, &mmo), 0);
> +
> + /* mmap() on a DONTNEED BO must fail with EBUSY. */
> + ptr = mmap(NULL, bo_size, PROT_READ | PROT_WRITE, MAP_SHARED, fd, mmo.offset);
> + igt_assert_eq_u64((uint64_t)ptr, (uint64_t)MAP_FAILED);
> + igt_assert_eq(errno, EBUSY);
> +
> + /* Restore to WILLNEED before cleanup */
> + xe_vm_madvise_purgeable(fd, vm, addr, bo_size,
> + DRM_XE_VMA_PURGEABLE_STATE_WILLNEED);
> +
> + gem_close(fd, bo);
> + xe_vm_destroy(fd, vm);
> +}
> +
> +int igt_main()
> +{
> + struct drm_xe_engine_class_instance *hwe;
> + int fd;
> +
> + igt_fixture() {
> + fd = drm_open_driver(DRIVER_XE);
> + xe_device_get(fd);
> + igt_require_f(xe_has_purgeable_support(fd),
> + "Kernel does not support purgeable buffer objects\n");
> + }
> +
> + igt_subtest("dontneed-before-mmap")
> + xe_for_each_engine(fd, hwe) {
> + test_dontneed_before_mmap(fd);
> + break;
> + }
> +
> + igt_fixture() {
> + xe_device_put(fd);
> + drm_close_driver(fd);
> + }
> +}
> diff --git a/tests/meson.build b/tests/meson.build
> index cecb4a8ae..a6370b685 100644
> --- a/tests/meson.build
> +++ b/tests/meson.build
> @@ -314,6 +314,7 @@ intel_xe_progs = [
> 'xe_huc_copy',
> 'xe_intel_bb',
> 'xe_live_ktest',
> + 'xe_madvise',
> 'xe_media_fill',
> 'xe_mmap',
> 'xe_module_load',
LGTM:
Reviewed-by: Nishit Sharma <nishit.sharma@intel.com>
next prev parent reply other threads:[~2026-04-10 7:11 UTC|newest]
Thread overview: 19+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-04-09 7:01 [PATCH i-g-t v7 0/9] tests/xe: Add purgeable memory madvise tests for system allocator Arvind Yadav
2026-04-09 7:01 ` [PATCH i-g-t v7 1/9] drm-uapi/xe_drm: Sync with Add UAPI support for purgeable buffer objects Arvind Yadav
2026-04-09 15:42 ` Kamil Konieczny
2026-04-10 5:35 ` Yadav, Arvind
2026-04-09 7:01 ` [PATCH i-g-t v7 2/9] lib/xe: Add purgeable memory ioctl support Arvind Yadav
2026-04-09 7:01 ` [PATCH i-g-t v7 3/9] tests/intel/xe_madvise: Add dontneed-before-mmap subtest Arvind Yadav
2026-04-10 7:10 ` Sharma, Nishit [this message]
2026-04-09 7:01 ` [PATCH i-g-t v7 4/9] tests/intel/xe_madvise: Add purged-mmap-blocked subtest Arvind Yadav
2026-04-10 8:06 ` Sharma, Nishit
2026-04-09 7:01 ` [PATCH i-g-t v7 5/9] tests/intel/xe_madvise: Add dontneed-after-mmap subtest Arvind Yadav
2026-04-10 8:22 ` Sharma, Nishit
2026-04-10 8:59 ` Yadav, Arvind
2026-04-09 7:01 ` [PATCH i-g-t v7 6/9] tests/intel/xe_madvise: Add dontneed-before-exec subtest Arvind Yadav
2026-04-10 8:32 ` Sharma, Nishit
2026-04-09 7:01 ` [PATCH i-g-t v7 7/9] tests/intel/xe_madvise: Add dontneed-after-exec subtest Arvind Yadav
2026-04-09 7:01 ` [PATCH i-g-t v7 8/9] tests/intel/xe_madvise: Add per-vma-tracking subtest Arvind Yadav
2026-04-10 8:41 ` Sharma, Nishit
2026-04-09 7:01 ` [PATCH i-g-t v7 9/9] tests/intel/xe_madvise: Add per-vma-protection subtest Arvind Yadav
2026-04-10 1:08 ` ✗ Fi.CI.BUILD: failure for tests/xe: Add purgeable memory madvise tests for system allocator (rev7) Patchwork
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=a46aa6ce-4b64-47ae-993e-e2fc03e70871@intel.com \
--to=nishit.sharma@intel.com \
--cc=arvind.yadav@intel.com \
--cc=himal.prasad.ghimiray@intel.com \
--cc=igt-dev@lists.freedesktop.org \
--cc=matthew.brost@intel.com \
--cc=pravalika.gurram@intel.com \
--cc=thomas.hellstrom@linux.intel.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.