[PATCH] drm/xe/bo: add GPU memory trace points
Juston Li
justonli at chromium.org
Wed May 21 22:38:46 UTC 2025
On Wed, 2025-05-21 at 08:49 +0100, Tvrtko Ursulin wrote:
>
> On 20/05/2025 18:16, Juston Li wrote:
> > Add tracepoints behind CONFIG_DRM_XE_GPU_MEM_TRACEPOINTS for
> > tracking
> > global and per-process GPU memory usage.
> >
> > These are required by VSR on Android 12+ for reporting GPU driver
> > memory
> > allocations.
>
> + Maintainers
>
> For reference, this is equivalent to 204226de27c3 ("drm/msm: Add GPU
> memory traces") and uses the same shared tracepoints and format.
>
> Two small details below, with which fixed:
>
> Reviewed-by: Tvrtko Ursulin <tvrtko.ursulin at igalia.com>
Thanks Tvrtko! Sending v2.
>
> > Signed-off-by: Juston Li <justonli at chromium.org>
> > ---
> > drivers/gpu/drm/xe/Kconfig.debug | 12 +++++++
> > drivers/gpu/drm/xe/xe_bo.c | 47
> > ++++++++++++++++++++++++++++
> > drivers/gpu/drm/xe/xe_device_types.h | 15 +++++++++
> > 3 files changed, 74 insertions(+)
> >
> > diff --git a/drivers/gpu/drm/xe/Kconfig.debug
> > b/drivers/gpu/drm/xe/Kconfig.debug
> > index 01735c6ece8ba..e2ecc6df954ce 100644
> > --- a/drivers/gpu/drm/xe/Kconfig.debug
> > +++ b/drivers/gpu/drm/xe/Kconfig.debug
> > @@ -111,3 +111,15 @@ config DRM_XE_USERPTR_INVAL_INJECT
> >
> > Recommended for driver developers only.
> > If in doubt, say "N".
> > +
> > +config CONFIG_DRM_XE_GPU_MEM_TRACEPOINTS
Derp, the CONFIG_ is redundant here...
> > + bool "Enable Xe GPU memory usage tracepoints"
> > + default n
> > + select TRACE_GPU_MEM
> > + help
> > + Choose this option to enable tracepoints for tracking
> > + and per-process GPU memory usage.
>
> Missing word:
>
> ..*global* and per-process..
>
> > + Intended for performance profiling and required for
> > + Android.
> > +
> > + If in doubt, say "N".
> > diff --git a/drivers/gpu/drm/xe/xe_bo.c
> > b/drivers/gpu/drm/xe/xe_bo.c
> > index d99d91fe8aa98..f137d6ec5357d 100644
> > --- a/drivers/gpu/drm/xe/xe_bo.c
> > +++ b/drivers/gpu/drm/xe/xe_bo.c
> > @@ -19,6 +19,8 @@
> >
> > #include <kunit/static_stub.h>
> >
> > +#include <trace/events/gpu_mem.h>
> > +
> > #include "xe_device.h"
> > #include "xe_dma_buf.h"
> > #include "xe_drm_client.h"
> > @@ -420,6 +422,35 @@ static void xe_ttm_tt_account_subtract(struct
> > ttm_tt *tt)
> > xe_shrinker_mod_pages(xe_tt->xe->mem.shrinker, -
> > (long)tt->num_pages, 0);
> > }
> >
> > +#if IS_ENABLED(CONFIG_DRM_XE_GPU_MEM_TRACEPOINTS)
> > +static void update_global_total_pages(struct ttm_device *ttm_dev,
> > long num_pages)
> > +{
> > + struct xe_device *xe = ttm_to_xe_device(ttm_dev);
> > + uint64_t global_total_pages =
> > + atomic64_add_return(num_pages, &xe-
> > >global_total_pages);
>
> Checkpatch reminds kernel should use u64 type. Here and one more just
> below.
>
> Regards,
>
> Tvrtko
>
> > +
> > + trace_gpu_mem_total(0, 0, global_total_pages <<
> > PAGE_SHIFT);
> > +}
> > +
> > +static void update_process_mem(struct drm_file *file, ssize_t
> > size)
> > +{
> > + struct xe_file *xef = to_xe_file(file);
> > + uint64_t process_mem = atomic64_add_return(size, &xef-
> > >process_mem);
> > +
> > + rcu_read_lock(); /* Locks file->pid! */
> > + trace_gpu_mem_total(0, pid_nr(rcu_dereference(file->pid)),
> > process_mem);
> > + rcu_read_unlock();
> > +}
> > +#else
> > +static inline void update_global_total_pages(struct ttm_device
> > *ttm_dev, long num_pages)
> > +{
> > +}
> > +
> > +static inline void update_process_mem(struct drm_file *file,
> > ssize_t size)
> > +{
> > +}
> > +#endif
> > +
> > static struct ttm_tt *xe_ttm_tt_create(struct ttm_buffer_object
> > *ttm_bo,
> > u32 page_flags)
> > {
> > @@ -528,6 +559,7 @@ static int xe_ttm_tt_populate(struct ttm_device
> > *ttm_dev, struct ttm_tt *tt,
> >
> > xe_tt->purgeable = false;
> > xe_ttm_tt_account_add(tt);
> > + update_global_total_pages(ttm_dev, tt->num_pages);
> >
> > return 0;
> > }
> > @@ -542,6 +574,7 @@ static void xe_ttm_tt_unpopulate(struct
> > ttm_device *ttm_dev, struct ttm_tt *tt)
> >
> > ttm_pool_free(&ttm_dev->pool, tt);
> > xe_ttm_tt_account_subtract(tt);
> > + update_global_total_pages(ttm_dev, -(long)tt->num_pages);
> > }
> >
> > static void xe_ttm_tt_destroy(struct ttm_device *ttm_dev, struct
> > ttm_tt *tt)
> > @@ -1648,6 +1681,15 @@ static void xe_gem_object_free(struct
> > drm_gem_object *obj)
> > ttm_bo_put(container_of(obj, struct ttm_buffer_object,
> > base));
> > }
> >
> > +#if IS_ENABLED(CONFIG_DRM_XE_GPU_MEM_TRACEPOINTS)
> > +static int xe_gem_object_open(struct drm_gem_object *obj,
> > + struct drm_file *file_priv)
> > +{
> > + update_process_mem(file_priv, obj->size);
> > + return 0;
> > +}
> > +#endif
> > +
> > static void xe_gem_object_close(struct drm_gem_object *obj,
> > struct drm_file *file_priv)
> > {
> > @@ -1660,6 +1702,8 @@ static void xe_gem_object_close(struct
> > drm_gem_object *obj,
> > ttm_bo_set_bulk_move(&bo->ttm, NULL);
> > xe_bo_unlock(bo);
> > }
> > +
> > + update_process_mem(file_priv, -obj->size);
> > }
> >
> > static vm_fault_t xe_gem_fault(struct vm_fault *vmf)
> > @@ -1757,6 +1801,9 @@ static const struct vm_operations_struct
> > xe_gem_vm_ops = {
> >
> > static const struct drm_gem_object_funcs xe_gem_object_funcs = {
> > .free = xe_gem_object_free,
> > +#if IS_ENABLED(CONFIG_DRM_XE_GPU_MEM_TRACEPOINTS)
> > + .open = xe_gem_object_open,
> > +#endif
> > .close = xe_gem_object_close,
> > .mmap = drm_gem_ttm_mmap,
> > .export = xe_gem_prime_export,
> > diff --git a/drivers/gpu/drm/xe/xe_device_types.h
> > b/drivers/gpu/drm/xe/xe_device_types.h
> > index f81be293b260e..5fb65f1c64cd6 100644
> > --- a/drivers/gpu/drm/xe/xe_device_types.h
> > +++ b/drivers/gpu/drm/xe/xe_device_types.h
> > @@ -639,6 +639,13 @@ struct xe_device {
> > unsigned int fsb_freq, mem_freq, is_ddr3;
> > };
> > #endif
> > +
> > +#if IS_ENABLED(CONFIG_DRM_XE_GPU_MEM_TRACEPOINTS)
> > + /**
> > + * @global_mem: global GPU pages usage tracked for gpu_mem
> > tracepoints
> > + */
> > + atomic64_t global_total_pages;
> > +#endif
> > };
> >
> > /**
> > @@ -700,6 +707,14 @@ struct xe_file {
> >
> > /** @refcount: ref count of this xe file */
> > struct kref refcount;
> > +
> > +#if IS_ENABLED(CONFIG_DRM_XE_GPU_MEM_TRACEPOINTS)
> > + /**
> > + * @process_mem: per-process GPU memory usage tracked for
> > gpu_mem
> > + * tracepoints
> > + */
> > + atomic64_t process_mem;
> > +#endif
> > };
> >
> > #endif
>
More information about the Intel-xe
mailing list