Add a xe_gem_create_ioctl tracepoint to help profile GEM creation, in particular the cost of populating a BO while holding the dma-resv lock versus the total IOCTL cost. This is useful for evaluating the out-of-lock preallocation path, which aims to shrink the time spent under the lock.
The tracepoint records the BO size, the requested placement mask, the CPU caching mode, the VM asid (0 when no VM is bound), the total time spent in the IOCTL, and the time spent under the dma-resv lock (the xe_validation_guard region where the lock is held). The asid is captured at VM lookup time rather than at trace emission, since the VM reference is dropped before the tracepoint fires. Cc: Carlos Santa <[email protected]> Cc: Ryan Neph <[email protected]> Cc: Christian Koenig <[email protected]> Cc: Huang Rui <[email protected]> Cc: Matthew Auld <[email protected]> Cc: Maarten Lankhorst <[email protected]> Cc: Maxime Ripard <[email protected]> Cc: Thomas Zimmermann <[email protected]> Cc: David Airlie <[email protected]> Cc: Simona Vetter <[email protected]> Cc: [email protected] Cc: [email protected] Cc: Thomas Hellström <[email protected]> Assisted-by: GitHub_Copilot:claude-opus-4.8 Signed-off-by: Matthew Brost <[email protected]> --- drivers/gpu/drm/xe/xe_bo.c | 16 ++++++++++++++++ drivers/gpu/drm/xe/xe_trace_bo.h | 31 +++++++++++++++++++++++++++++++ 2 files changed, 47 insertions(+) diff --git a/drivers/gpu/drm/xe/xe_bo.c b/drivers/gpu/drm/xe/xe_bo.c index d9226a3995fe..c096f3dbd528 100644 --- a/drivers/gpu/drm/xe/xe_bo.c +++ b/drivers/gpu/drm/xe/xe_bo.c @@ -3929,6 +3929,10 @@ int xe_gem_create_ioctl(struct drm_device *dev, void *data, bool have_prealloc = false; unsigned int bo_flags; u32 handle; + ktime_t ioctl_start = ktime_get(); + ktime_t lock_start = ktime_set(0, 0); + u64 lock_ns = 0; + u32 asid = 0; int err; if (XE_IOCTL_DBG(xe, args->pad[0] || args->pad[1] || args->pad[2]) || @@ -4007,6 +4011,7 @@ int xe_gem_create_ioctl(struct drm_device *dev, void *data, vm = xe_vm_lookup(xef, args->vm_id); if (XE_IOCTL_DBG(xe, !vm)) return -ENOENT; + asid = vm->usm.asid; } /* @@ -4057,6 +4062,10 @@ int xe_gem_create_ioctl(struct drm_device *dev, void *data, if (err) break; } + + if (lock_start == ktime_set(0, 0)) + lock_start = ktime_get(); + bo = xe_bo_create_user(xe, vm, args->size, args->cpu_caching, bo_flags, have_prealloc ? &prealloc : NULL, &exec); @@ -4067,6 +4076,7 @@ int xe_gem_create_ioctl(struct drm_device *dev, void *data, break; } } + lock_ns = ktime_to_ns(ktime_sub(ktime_get(), lock_start)); if (have_prealloc) ttm_pool_prealloc_fini(&xe->ttm.pool, &prealloc); if (err) @@ -4097,6 +4107,12 @@ int xe_gem_create_ioctl(struct drm_device *dev, void *data, if (vm) xe_vm_put(vm); + trace_xe_gem_create_ioctl(xe, args->size, args->placement, + args->cpu_caching, asid, + ktime_to_ns(ktime_sub(ktime_get(), + ioctl_start)) / 1000, + lock_ns / 1000); + return err; } diff --git a/drivers/gpu/drm/xe/xe_trace_bo.h b/drivers/gpu/drm/xe/xe_trace_bo.h index a169a322464b..b2dacb5fa3f7 100644 --- a/drivers/gpu/drm/xe/xe_trace_bo.h +++ b/drivers/gpu/drm/xe/xe_trace_bo.h @@ -144,6 +144,37 @@ TRACE_EVENT(xe_bo_defrag_one, __entry->ret) ); +TRACE_EVENT(xe_gem_create_ioctl, + TP_PROTO(struct xe_device *xe, u64 size, u32 placement, + u16 caching, u32 asid, u64 ioctl_us, u64 lock_us), + TP_ARGS(xe, size, placement, caching, asid, ioctl_us, lock_us), + + TP_STRUCT__entry( + __string(dev, dev_name(xe->drm.dev)) + __field(u64, size) + __field(u32, placement) + __field(u16, caching) + __field(u32, asid) + __field(u64, ioctl_us) + __field(u64, lock_us) + ), + + TP_fast_assign( + __assign_str(dev); + __entry->size = size; + __entry->placement = placement; + __entry->caching = caching; + __entry->asid = asid; + __entry->ioctl_us = ioctl_us; + __entry->lock_us = lock_us; + ), + + TP_printk("dev=%s, size=%llu, placement=0x%x, caching=%u, asid=%u, ioctl_us=%llu, lock_us=%llu", + __get_str(dev), __entry->size, __entry->placement, + __entry->caching, __entry->asid, __entry->ioctl_us, + __entry->lock_us) +); + DECLARE_EVENT_CLASS(xe_vma, TP_PROTO(struct xe_vma *vma), TP_ARGS(vma), -- 2.34.1
