Commit b67427f9 authored by Arvind Yadav's avatar Arvind Yadav Committed by Matthew Brost
Browse files

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: default avatarMatthew Brost <matthew.brost@intel.com>
Signed-off-by: default avatarArvind Yadav <arvind.yadav@intel.com>
Signed-off-by: default avatarMatthew Brost <matthew.brost@intel.com>
Link: https://patch.msgid.link/20260326130843.3545241-3-arvind.yadav@intel.com
parent f99a05cc
Loading
Loading
Loading
Loading
+56 −0
Original line number Diff line number Diff line
@@ -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)) {
+6 −0
Original line number Diff line number Diff line
@@ -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