From: "Yadav, Arvind" <arvind.yadav@intel.com>
To: Kamil Konieczny <kamil.konieczny@linux.intel.com>,
<igt-dev@lists.freedesktop.org>, <matthew.brost@intel.com>,
<himal.prasad.ghimiray@intel.com>,
<thomas.hellstrom@linux.intel.com>, <nishit.sharma@intel.com>,
<pravalika.gurram@intel.com>
Subject: Re: [PATCH i-g-t v7 1/9] drm-uapi/xe_drm: Sync with Add UAPI support for purgeable buffer objects
Date: Fri, 10 Apr 2026 11:05:56 +0530 [thread overview]
Message-ID: <22ce481a-7936-4b2a-bf76-3caa60ec1927@intel.com> (raw)
In-Reply-To: <20260409154216.7how4uzxrkeroxp5@kamilkon-DESK.igk.intel.com>
On 09-04-2026 21:12, Kamil Konieczny wrote:
> Hi Arvind,
> On 2026-04-09 at 12:31:10 +0530, Arvind Yadav wrote:
>> From: Himal Prasad Ghimiray <himal.prasad.ghimiray@intel.com>
>>
>> Extend the DRM_XE_MADVISE ioctl to support purgeable buffer object
>> management by adding DRM_XE_VMA_ATTR_PURGEABLE_STATE attribute type.
>>
>> This allows userspace applications to provide memory usage hints to
>> the kernel for better memory management under pressure:
>>
>> - WILLNEED: Buffer is needed and should not be purged. If the BO was
>> previously purged, retained field returns 0 indicating backing store
>> was lost (once purged, always purged semantics matching i915).
>>
>> - DONTNEED: Buffer is not currently needed and may be purged by the
>> kernel under memory pressure to free resources. Only applies to
>> non-shared BOs.
>>
>> To prevent undefined behavior, the following operations are blocked
>> while a BO is in DONTNEED state:
>> - New mmap() operations return -EBUSY
>> - VM_BIND operations return -EBUSY
>> - New dma-buf exports return -EBUSY
>> - CPU/GPU page faults return SIGBUS
>>
>> This ensures applications cannot use a BO while marked as DONTNEED,
>> preventing erratic behavior when the kernel purges the backing store.
>>
>> The implementation includes a 'retained' output field (matching i915's
>> drm_i915_gem_madvise.retained) that indicates whether the BO's backing
>> store still exists (1) or has been purged (0).
>>
>> Added DRM_XE_QUERY_CONFIG_FLAG_HAS_PURGING_SUPPORT flag to allow
>> userspace to detect kernel support for purgeable buffer objects
>> before attempting to use the feature.
>>
>> Align with kernel 'commit f99a05cc0b85 ("drm/xe/uapi: Add UAPI support
>> for purgeable buffer objects")'
>>
>> v2:
>> - Update UAPI documentation to clarify retained must be initialized
>> to 0(Thomas)
>>
>> v5:
>> - Document DONTNEED BO access blocking behavior to prevent undefined
>> behavior and clarify uAPI contract (Thomas, Matt)
>> - Add query flag DRM_XE_QUERY_CONFIG_FLAG_HAS_PURGING_SUPPORT for
>> feature detection. (Jose)
>> - Renamed retained to retained_ptr. (Jose)
>>
>> v6:
>> - Updated UAPI documentation as suggested. (Jose)
>>
>> v7:
>> - Commit message updated with kernel UAPI details. (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: Pravalika Gurram <pravalika.gurram@intel.com>
>> Signed-off-by: Himal Prasad Ghimiray <himal.prasad.ghimiray@intel.com>
>> Signed-off-by: Arvind Yadav <arvind.yadav@intel.com>
> Looks like this commit is already in igt so you could drop first
> patch and resend. For example:
>
> grep DRM_XE_VMA_ATTR_PURGEABLE_STATE include/drm-uapi/xe_drm.h
>
> * - DRM_XE_VMA_ATTR_PURGEABLE_STATE: Set purgeable state for BOs.
> #define DRM_XE_VMA_ATTR_PURGEABLE_STATE 3
> * Used when @type == DRM_XE_VMA_ATTR_PURGEABLE_STATE.
> /** @purge_state_val.val: value for DRM_XE_VMA_ATTR_PURGEABLE_STATE */
>
> grep purge_state_val include/drm-uapi/xe_drm.h
>
> * @purge_state_val: Purgeable state configuration
> * Supported values for @purge_state_val.val:
> /** @purge_state_val.val: value for DRM_XE_VMA_ATTR_PURGEABLE_STATE */
> /** @purge_state_val.pad: MBZ */
> * @purge_state_val.retained_ptr: Pointer to a __u32 output
> } purge_state_val;
Noted, I will drop this patch.
Thanks,
Arvind
>
> Regards,
> Kamil
>
>> ---
>> include/drm-uapi/xe_drm.h | 69 +++++++++++++++++++++++++++++++++++++++
>> 1 file changed, 69 insertions(+)
>>
>> diff --git a/include/drm-uapi/xe_drm.h b/include/drm-uapi/xe_drm.h
>> index 077e66a68..cf0eb3f99 100644
>> --- a/include/drm-uapi/xe_drm.h
>> +++ b/include/drm-uapi/xe_drm.h
>> @@ -431,6 +431,7 @@ struct drm_xe_query_config {
>> #define DRM_XE_QUERY_CONFIG_FLAG_HAS_LOW_LATENCY (1 << 1)
>> #define DRM_XE_QUERY_CONFIG_FLAG_HAS_CPU_ADDR_MIRROR (1 << 2)
>> #define DRM_XE_QUERY_CONFIG_FLAG_HAS_NO_COMPRESSION_HINT (1 << 3)
>> + #define DRM_XE_QUERY_CONFIG_FLAG_HAS_PURGING_SUPPORT (1 << 5)
>> #define DRM_XE_QUERY_CONFIG_MIN_ALIGNMENT 2
>> #define DRM_XE_QUERY_CONFIG_VA_BITS 3
>> #define DRM_XE_QUERY_CONFIG_MAX_EXEC_QUEUE_PRIORITY 4
>> @@ -2067,6 +2068,7 @@ struct drm_xe_query_eu_stall {
>> * - DRM_XE_MEM_RANGE_ATTR_PREFERRED_LOC: Set preferred memory location.
>> * - DRM_XE_MEM_RANGE_ATTR_ATOMIC: Set atomic access policy.
>> * - DRM_XE_MEM_RANGE_ATTR_PAT: Set page attribute table index.
>> + * - DRM_XE_VMA_ATTR_PURGEABLE_STATE: Set purgeable state for BOs.
>> *
>> * Example:
>> *
>> @@ -2099,6 +2101,7 @@ struct drm_xe_madvise {
>> #define DRM_XE_MEM_RANGE_ATTR_PREFERRED_LOC 0
>> #define DRM_XE_MEM_RANGE_ATTR_ATOMIC 1
>> #define DRM_XE_MEM_RANGE_ATTR_PAT 2
>> +#define DRM_XE_VMA_ATTR_PURGEABLE_STATE 3
>> /** @type: type of attribute */
>> __u32 type;
>>
>> @@ -2189,6 +2192,72 @@ struct drm_xe_madvise {
>> /** @pat_index.reserved: Reserved */
>> __u64 reserved;
>> } pat_index;
>> +
>> + /**
>> + * @purge_state_val: Purgeable state configuration
>> + *
>> + * Used when @type == DRM_XE_VMA_ATTR_PURGEABLE_STATE.
>> + *
>> + * Configures the purgeable state of buffer objects in the specified
>> + * virtual address range. This allows applications to hint to the kernel
>> + * about bo's usage patterns for better memory management.
>> + *
>> + * By default all VMAs are in WILLNEED state.
>> + *
>> + * Supported values for @purge_state_val.val:
>> + * - DRM_XE_VMA_PURGEABLE_STATE_WILLNEED (0): Marks BO as needed.
>> + * If the BO was previously purged, the kernel sets the __u32 at
>> + * @retained_ptr to 0 (backing store lost) so the application knows
>> + * it must recreate the BO.
>> + *
>> + * - DRM_XE_VMA_PURGEABLE_STATE_DONTNEED (1): Marks BO as not currently
>> + * needed. Kernel may purge it under memory pressure to reclaim memory.
>> + * Only applies to non-shared BOs. The kernel sets the __u32 at
>> + * @retained_ptr to 1 if the backing store still exists (not yet purged),
>> + * or 0 if it was already purged.
>> + *
>> + * Important: Once marked as DONTNEED, touching the BO's memory
>> + * is undefined behavior. It may succeed temporarily (before the
>> + * kernel purges the backing store) but will suddenly fail once
>> + * the BO transitions to PURGED state.
>> + *
>> + * To transition back: use WILLNEED and check @retained_ptr —
>> + * if 0, backing store was lost and the BO must be recreated.
>> + *
>> + * The following operations are blocked in DONTNEED state to
>> + * prevent the BO from being re-mapped after madvise:
>> + * - New mmap() calls: Fail with -EBUSY
>> + * - VM_BIND operations: Fail with -EBUSY
>> + * - New dma-buf exports: Fail with -EBUSY
>> + * - CPU page faults (existing mmap): Fail with SIGBUS
>> + * - GPU page faults (fault-mode VMs): Fail with -EACCES
>> + */
>> + struct {
>> +#define DRM_XE_VMA_PURGEABLE_STATE_WILLNEED 0
>> +#define DRM_XE_VMA_PURGEABLE_STATE_DONTNEED 1
>> + /** @purge_state_val.val: value for DRM_XE_VMA_ATTR_PURGEABLE_STATE */
>> + __u32 val;
>> +
>> + /** @purge_state_val.pad: MBZ */
>> + __u32 pad;
>> + /**
>> + * @purge_state_val.retained_ptr: Pointer to a __u32 output
>> + * field for backing store status.
>> + *
>> + * Userspace must initialize the __u32 value at this address
>> + * to 0 before the ioctl. Kernel writes a __u32 after the
>> + * operation:
>> + * - 1 if backing store exists (not purged)
>> + * - 0 if backing store was purged
>> + *
>> + * If userspace fails to initialize to 0, ioctl returns -EINVAL.
>> + * This ensures a safe default (0 = assume purged) if kernel
>> + * cannot write the result.
>> + *
>> + * Similar to i915's drm_i915_gem_madvise.retained field.
>> + */
>> + __u64 retained_ptr;
>> + } purge_state_val;
>> };
>>
>> /** @reserved: Reserved */
>> --
>> 2.43.0
>>
next prev parent reply other threads:[~2026-04-10 5:36 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 [this message]
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
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=22ce481a-7936-4b2a-bf76-3caa60ec1927@intel.com \
--to=arvind.yadav@intel.com \
--cc=himal.prasad.ghimiray@intel.com \
--cc=igt-dev@lists.freedesktop.org \
--cc=kamil.konieczny@linux.intel.com \
--cc=matthew.brost@intel.com \
--cc=nishit.sharma@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.