drm/xe/bo: Add purgeable bo state tracking and field madv to xe_bo

Add infrastructure for tracking purgeable state of buffer objects.
This includes:

Introduce enum xe_madv_purgeable_state with three states:
   - XE_MADV_PURGEABLE_WILLNEED (0): BO is needed and should not be
     purged. This is the default state for all BOs.

   - XE_MADV_PURGEABLE_DONTNEED (1): BO is not currently needed and
     can be purged by the kernel under memory pressure to reclaim
     resources. Only non-shared BOs can be marked as DONTNEED.

   - XE_MADV_PURGEABLE_PURGED (2): BO has been purged by the kernel.
     Accessing a purged BO results in error. Follows i915 semantics
     where once purged, the BO remains permanently invalid ("once
     purged, always purged").

Add madv_purgeable field to struct xe_bo for state tracking
  of purgeable state across concurrent access paths

Cc: Thomas Hellström <thomas.hellstrom@linux.intel.com>
Cc: Himal Prasad Ghimiray <himal.prasad.ghimiray@intel.com>
Reviewed-by: Matthew Brost <matthew.brost@intel.com>
Signed-off-by: Arvind Yadav <arvind.yadav@intel.com>
Signed-off-by: Matthew Brost <matthew.brost@intel.com>
Link: https://patch.msgid.link/20260326130843.3545241-3-arvind.yadav@intel.com
This commit is contained in:
Arvind Yadav 2026-03-26 18:38:28 +05:30 committed by Matthew Brost
parent f99a05cc0b
commit b67427f939
2 changed files with 62 additions and 0 deletions

View File

@ -87,6 +87,28 @@
#define XE_PCI_BARRIER_MMAP_OFFSET (0x50 << XE_PTE_SHIFT)
/**
* enum xe_madv_purgeable_state - Buffer object purgeable state enumeration
*
* This enum defines the possible purgeable states for a buffer object,
* allowing userspace to provide memory usage hints to the kernel for
* better memory management under pressure.
*
* @XE_MADV_PURGEABLE_WILLNEED: The buffer object is needed and should not be purged.
* This is the default state.
* @XE_MADV_PURGEABLE_DONTNEED: The buffer object is not currently needed and can be
* purged by the kernel under memory pressure.
* @XE_MADV_PURGEABLE_PURGED: The buffer object has been purged by the kernel.
*
* Accessing a purged buffer will result in an error. Per i915 semantics,
* once purged, a BO remains permanently invalid and must be destroyed and recreated.
*/
enum xe_madv_purgeable_state {
XE_MADV_PURGEABLE_WILLNEED,
XE_MADV_PURGEABLE_DONTNEED,
XE_MADV_PURGEABLE_PURGED,
};
struct sg_table;
struct xe_bo *xe_bo_alloc(void);
@ -215,6 +237,40 @@ static inline bool xe_bo_is_protected(const struct xe_bo *bo)
return bo->pxp_key_instance;
}
/**
* xe_bo_is_purged() - Check if buffer object has been purged
* @bo: The buffer object to check
*
* Checks if the buffer object's backing store has been discarded by the
* kernel due to memory pressure after being marked as purgeable (DONTNEED).
* Once purged, the BO cannot be restored and any attempt to use it will fail.
*
* Context: Caller must hold the BO's dma-resv lock
* Return: true if the BO has been purged, false otherwise
*/
static inline bool xe_bo_is_purged(struct xe_bo *bo)
{
xe_bo_assert_held(bo);
return bo->madv_purgeable == XE_MADV_PURGEABLE_PURGED;
}
/**
* xe_bo_madv_is_dontneed() - Check if BO is marked as DONTNEED
* @bo: The buffer object to check
*
* Checks if userspace has marked this BO as DONTNEED (i.e., its contents
* are not currently needed and can be discarded under memory pressure).
* This is used internally to decide whether a BO is eligible for purging.
*
* Context: Caller must hold the BO's dma-resv lock
* Return: true if the BO is marked DONTNEED, false otherwise
*/
static inline bool xe_bo_madv_is_dontneed(struct xe_bo *bo)
{
xe_bo_assert_held(bo);
return bo->madv_purgeable == XE_MADV_PURGEABLE_DONTNEED;
}
static inline void xe_bo_unpin_map_no_vm(struct xe_bo *bo)
{
if (likely(bo)) {

View File

@ -108,6 +108,12 @@ struct xe_bo {
* from default
*/
u64 min_align;
/**
* @madv_purgeable: user space advise on BO purgeability, protected
* by BO's dma-resv lock.
*/
u32 madv_purgeable;
};
#endif