Re: [PATCH v2 1/3] drm/fdinfo: Add "evicted" memory accounting

From: Steven Price

Date: Wed Apr 22 2026 - 09:40:43 EST


On 21/04/2026 11:45, Nicolas Frattaroli wrote:
> Currently, there's no way to know for certain how much GPU memory was
> swapped out. The difference between total and resident memory would
> include newly allocated pages, which are not resident, but also aren't
> swapped out.
>
> Add a new drm_gem_object_status so drivers can signal when an object has
> been evicted to swap, and add a new "evicted" counter to
> drm_memory_stats.
>
> Due to how the supported_flags bitmask is determined, the "evicted"
> count won't be printed to fdinfo if there's no swapped out pages.
>
> Signed-off-by: Nicolas Frattaroli <nicolas.frattaroli@xxxxxxxxxxxxx>

You should also update the documentation to include this new field
(Documentation/gpu/drm-usage-stats.rst).

Thanks,
Steve

> ---
> drivers/gpu/drm/drm_file.c | 8 ++++++++
> include/drm/drm_file.h | 2 ++
> include/drm/drm_gem.h | 2 ++
> 3 files changed, 12 insertions(+)
>
> diff --git a/drivers/gpu/drm/drm_file.c b/drivers/gpu/drm/drm_file.c
> index ec820686b302..5078172976c0 100644
> --- a/drivers/gpu/drm/drm_file.c
> +++ b/drivers/gpu/drm/drm_file.c
> @@ -868,6 +868,7 @@ int drm_memory_stats_is_zero(const struct drm_memory_stats *stats)
> stats->private == 0 &&
> stats->resident == 0 &&
> stats->purgeable == 0 &&
> + stats->evicted == 0 &&
> stats->active == 0);
> }
> EXPORT_SYMBOL(drm_memory_stats_is_zero);
> @@ -901,6 +902,10 @@ void drm_print_memory_stats(struct drm_printer *p,
> if (supported_status & DRM_GEM_OBJECT_PURGEABLE)
> drm_fdinfo_print_size(p, prefix, "purgeable", region,
> stats->purgeable);
> +
> + if (supported_status & DRM_GEM_OBJECT_EVICTED)
> + drm_fdinfo_print_size(p, prefix, "evicted", region,
> + stats->evicted);
> }
> EXPORT_SYMBOL(drm_print_memory_stats);
>
> @@ -954,6 +959,9 @@ void drm_show_memory_stats(struct drm_printer *p, struct drm_file *file)
>
> if (s & DRM_GEM_OBJECT_PURGEABLE)
> status.purgeable += add_size;
> +
> + if (s & DRM_GEM_OBJECT_EVICTED)
> + status.evicted += add_size;
> }
> spin_unlock(&file->table_lock);
>
> diff --git a/include/drm/drm_file.h b/include/drm/drm_file.h
> index 6ee70ad65e1f..213dfecac342 100644
> --- a/include/drm/drm_file.h
> +++ b/include/drm/drm_file.h
> @@ -500,6 +500,7 @@ void drm_send_event_timestamp_locked(struct drm_device *dev,
> * @resident: Total size of GEM objects backing pages
> * @purgeable: Total size of GEM objects that can be purged (resident and not active)
> * @active: Total size of GEM objects active on one or more engines
> + * @evicted: Total size of GEM objects that have been evicted to swap
> *
> * Used by drm_print_memory_stats()
> */
> @@ -509,6 +510,7 @@ struct drm_memory_stats {
> u64 resident;
> u64 purgeable;
> u64 active;
> + u64 evicted;
> };
>
> enum drm_gem_object_status;
> diff --git a/include/drm/drm_gem.h b/include/drm/drm_gem.h
> index 86f5846154f7..b42ea2e582cf 100644
> --- a/include/drm/drm_gem.h
> +++ b/include/drm/drm_gem.h
> @@ -53,6 +53,7 @@ struct drm_gem_object;
> * @DRM_GEM_OBJECT_RESIDENT: object is resident in memory (ie. not unpinned)
> * @DRM_GEM_OBJECT_PURGEABLE: object marked as purgeable by userspace
> * @DRM_GEM_OBJECT_ACTIVE: object is currently used by an active submission
> + * @DRM_GEM_OBJECT_EVICTED: object is evicted to swap
> *
> * Bitmask of status used for fdinfo memory stats, see &drm_gem_object_funcs.status
> * and drm_show_fdinfo(). Note that an object can report DRM_GEM_OBJECT_PURGEABLE
> @@ -67,6 +68,7 @@ enum drm_gem_object_status {
> DRM_GEM_OBJECT_RESIDENT = BIT(0),
> DRM_GEM_OBJECT_PURGEABLE = BIT(1),
> DRM_GEM_OBJECT_ACTIVE = BIT(2),
> + DRM_GEM_OBJECT_EVICTED = BIT(3),
> };
>
> /**
>