[PATCH 1/6] drm/msm/gem: Add helper to check if resident

From: Rob Clark

Date: Sat Sep 26 2026 - 14:33:04 EST


Mostly we don't care about the page array, mapping/etc works in terms of
the sgt. Add a helper to prepare for allowing the page array to be NULL
for imported dma-bufs.

Signed-off-by: Rob Clark <robin.clark@xxxxxxxxxxxxxxxx>
---
drivers/gpu/drm/msm/msm_gem.c | 8 ++++----
drivers/gpu/drm/msm/msm_gem.h | 6 ++++++
2 files changed, 10 insertions(+), 4 deletions(-)

diff --git a/drivers/gpu/drm/msm/msm_gem.c b/drivers/gpu/drm/msm/msm_gem.c
index c4cff3d53d81..e8390ebd5dd5 100644
--- a/drivers/gpu/drm/msm/msm_gem.c
+++ b/drivers/gpu/drm/msm/msm_gem.c
@@ -147,7 +147,7 @@ static void update_lru_active(struct drm_gem_object *obj)
struct msm_drm_private *priv = obj->dev->dev_private;
struct msm_gem_object *msm_obj = to_msm_bo(obj);

- GEM_WARN_ON(!msm_obj->pages);
+ GEM_WARN_ON(!is_resident(msm_obj));

if (msm_obj->pin_count) {
drm_gem_lru_move_tail_locked(&priv->lru.pinned, obj);
@@ -167,7 +167,7 @@ static void update_lru_locked(struct drm_gem_object *obj)

msm_gem_assert_locked(&msm_obj->base);

- if (!msm_obj->pages) {
+ if (!is_resident(msm_obj)) {
GEM_WARN_ON(msm_obj->pin_count);

drm_gem_lru_move_tail_locked(&priv->lru.unbacked, obj);
@@ -949,7 +949,7 @@ void msm_gem_describe(struct drm_gem_object *obj, struct seq_file *m,
stats->active.size += obj->size;
}

- if (msm_obj->pages) {
+ if (is_resident(msm_obj)) {
stats->resident.count++;
stats->resident.size += obj->size;
}
@@ -1172,7 +1172,7 @@ static enum drm_gem_object_status msm_gem_status(struct drm_gem_object *obj)
struct msm_gem_object *msm_obj = to_msm_bo(obj);
enum drm_gem_object_status status = 0;

- if (msm_obj->pages)
+ if (is_resident(msm_obj))
status |= DRM_GEM_OBJECT_RESIDENT;

if (msm_obj->madv == MSM_MADV_DONTNEED)
diff --git a/drivers/gpu/drm/msm/msm_gem.h b/drivers/gpu/drm/msm/msm_gem.h
index dff60cbc9d95..73dafe080bfd 100644
--- a/drivers/gpu/drm/msm/msm_gem.h
+++ b/drivers/gpu/drm/msm/msm_gem.h
@@ -419,6 +419,12 @@ static inline bool is_unevictable(struct msm_gem_object *msm_obj)
return is_unpurgeable(msm_obj) || msm_obj->vaddr;
}

+/* Are backing pages/sgt allocated? */
+static inline bool is_resident(struct msm_gem_object *msm_obj)
+{
+ return !!msm_obj->pages;
+}
+
void msm_gem_purge(struct drm_gem_object *obj);
void msm_gem_evict(struct drm_gem_object *obj);
void msm_gem_vunmap(struct drm_gem_object *obj);
--
2.55.0