* [PATCH v3 0/2] Enhance SVM stats
@ 2025-06-03 23:34 Matthew Brost
2025-06-03 23:34 ` [PATCH v3 1/2] drm/xe: Add clear_stats GT debugfs Matthew Brost
` (4 more replies)
0 siblings, 5 replies; 11+ messages in thread
From: Matthew Brost @ 2025-06-03 23:34 UTC (permalink / raw)
To: intel-xe
Cc: michal.mrozek, francois.dugast, thomas.hellstrom,
himal.prasad.ghimiray
Add ability to clear GT stats and add more SVM stats for profiling.
Scripts should be able to be built on top of stats to breakdown time
spent in parts of the SVM page fault handler, bandwidth of copy engine,
etc... Will help showing concrete performance improvements when
implementing SVM optimizations.
Open suggestions of more stats. Prefetch not considered - can be done in
a follow up.
v2:
- Include local changes missed in first rev
v3:
- More stats after putting together script to parse
Matthew Brost (2):
drm/xe: Add clear_stats GT debugfs
drm/xe: Add more SVM GT stats
drivers/gpu/drm/xe/xe_gt_debugfs.c | 22 ++
drivers/gpu/drm/xe/xe_gt_stats.c | 47 +++++
drivers/gpu/drm/xe/xe_gt_stats.h | 1 +
drivers/gpu/drm/xe/xe_gt_stats_types.h | 33 +++
drivers/gpu/drm/xe/xe_svm.c | 274 ++++++++++++++++++++++++-
5 files changed, 369 insertions(+), 8 deletions(-)
--
2.34.1
^ permalink raw reply [flat|nested] 11+ messages in thread* [PATCH v3 1/2] drm/xe: Add clear_stats GT debugfs 2025-06-03 23:34 [PATCH v3 0/2] Enhance SVM stats Matthew Brost @ 2025-06-03 23:34 ` Matthew Brost 2025-06-27 16:24 ` Francois Dugast 2025-06-03 23:34 ` [PATCH v3 2/2] drm/xe: Add more SVM GT stats Matthew Brost ` (3 subsequent siblings) 4 siblings, 1 reply; 11+ messages in thread From: Matthew Brost @ 2025-06-03 23:34 UTC (permalink / raw) To: intel-xe Cc: michal.mrozek, francois.dugast, thomas.hellstrom, himal.prasad.ghimiray It helpful to clear GT stats, run a test cases which is being profiled, and look at the results of the stats from the individual test case. Add clear_stats GT debugfs entry whih allows the clearing of GT stats. Signed-off-by: Matthew Brost <matthew.brost@intel.com> --- drivers/gpu/drm/xe/xe_gt_debugfs.c | 22 ++++++++++++++++++++++ drivers/gpu/drm/xe/xe_gt_stats.c | 14 ++++++++++++++ drivers/gpu/drm/xe/xe_gt_stats.h | 1 + 3 files changed, 37 insertions(+) diff --git a/drivers/gpu/drm/xe/xe_gt_debugfs.c b/drivers/gpu/drm/xe/xe_gt_debugfs.c index 848618acdca8..a6888f03a4dd 100644 --- a/drivers/gpu/drm/xe/xe_gt_debugfs.c +++ b/drivers/gpu/drm/xe/xe_gt_debugfs.c @@ -328,6 +328,27 @@ static ssize_t write_to_gt_call(const char __user *userbuf, size_t count, loff_t return count; } +static void clear_stats(struct xe_gt *gt) +{ + xe_gt_stats_clear(gt); +} + +static ssize_t clear_stats_write(struct file *file, + const char __user *userbuf, + size_t count, loff_t *ppos) +{ + struct seq_file *s = file->private_data; + struct xe_gt *gt = s->private; + + return write_to_gt_call(userbuf, count, ppos, clear_stats, gt); +} + +static int clear_stats_show(struct seq_file *s, void *unused) +{ + return 0; +} +DEFINE_SHOW_STORE_ATTRIBUTE(clear_stats); + static void force_reset(struct xe_gt *gt) { struct xe_device *xe = gt_to_xe(gt); @@ -408,6 +429,7 @@ void xe_gt_debugfs_register(struct xe_gt *gt) root->d_inode->i_private = gt; /* VF safe */ + debugfs_create_file("clear_stats", 0600, root, gt, &clear_stats_fops); debugfs_create_file("force_reset", 0600, root, gt, &force_reset_fops); debugfs_create_file("force_reset_sync", 0600, root, gt, &force_reset_sync_fops); diff --git a/drivers/gpu/drm/xe/xe_gt_stats.c b/drivers/gpu/drm/xe/xe_gt_stats.c index 30f942671c2b..7e12fc3759e2 100644 --- a/drivers/gpu/drm/xe/xe_gt_stats.c +++ b/drivers/gpu/drm/xe/xe_gt_stats.c @@ -50,3 +50,17 @@ int xe_gt_stats_print_info(struct xe_gt *gt, struct drm_printer *p) return 0; } + +/** + * xe_gt_stats_clear - Clear the GT stats + * @gt: GT structure + * + * This clear (zeros) all the available GT stats. + */ +void xe_gt_stats_clear(struct xe_gt *gt) +{ + enum xe_gt_stats_id id; + + for (id = 0; id < __XE_GT_STATS_NUM_IDS; ++id) + atomic64_set(>->stats.counters[id], 0); +} diff --git a/drivers/gpu/drm/xe/xe_gt_stats.h b/drivers/gpu/drm/xe/xe_gt_stats.h index 38325ef53617..e8aea32bc971 100644 --- a/drivers/gpu/drm/xe/xe_gt_stats.h +++ b/drivers/gpu/drm/xe/xe_gt_stats.h @@ -13,6 +13,7 @@ struct drm_printer; #ifdef CONFIG_DEBUG_FS int xe_gt_stats_print_info(struct xe_gt *gt, struct drm_printer *p); +void xe_gt_stats_clear(struct xe_gt *gt); void xe_gt_stats_incr(struct xe_gt *gt, const enum xe_gt_stats_id id, int incr); #else static inline void -- 2.34.1 ^ permalink raw reply related [flat|nested] 11+ messages in thread
* Re: [PATCH v3 1/2] drm/xe: Add clear_stats GT debugfs 2025-06-03 23:34 ` [PATCH v3 1/2] drm/xe: Add clear_stats GT debugfs Matthew Brost @ 2025-06-27 16:24 ` Francois Dugast 0 siblings, 0 replies; 11+ messages in thread From: Francois Dugast @ 2025-06-27 16:24 UTC (permalink / raw) To: Matthew Brost Cc: intel-xe, michal.mrozek, thomas.hellstrom, himal.prasad.ghimiray On Tue, Jun 03, 2025 at 04:34:44PM -0700, Matthew Brost wrote: > It helpful to clear GT stats, run a test cases which is being profiled, > and look at the results of the stats from the individual test case. Add > clear_stats GT debugfs entry whih allows the clearing of GT stats. > > Signed-off-by: Matthew Brost <matthew.brost@intel.com> > --- > drivers/gpu/drm/xe/xe_gt_debugfs.c | 22 ++++++++++++++++++++++ > drivers/gpu/drm/xe/xe_gt_stats.c | 14 ++++++++++++++ > drivers/gpu/drm/xe/xe_gt_stats.h | 1 + > 3 files changed, 37 insertions(+) > > diff --git a/drivers/gpu/drm/xe/xe_gt_debugfs.c b/drivers/gpu/drm/xe/xe_gt_debugfs.c > index 848618acdca8..a6888f03a4dd 100644 > --- a/drivers/gpu/drm/xe/xe_gt_debugfs.c > +++ b/drivers/gpu/drm/xe/xe_gt_debugfs.c > @@ -328,6 +328,27 @@ static ssize_t write_to_gt_call(const char __user *userbuf, size_t count, loff_t > return count; > } > > +static void clear_stats(struct xe_gt *gt) > +{ > + xe_gt_stats_clear(gt); > +} > + > +static ssize_t clear_stats_write(struct file *file, > + const char __user *userbuf, > + size_t count, loff_t *ppos) > +{ > + struct seq_file *s = file->private_data; > + struct xe_gt *gt = s->private; > + > + return write_to_gt_call(userbuf, count, ppos, clear_stats, gt); > +} > + > +static int clear_stats_show(struct seq_file *s, void *unused) > +{ > + return 0; > +} > +DEFINE_SHOW_STORE_ATTRIBUTE(clear_stats); > + > static void force_reset(struct xe_gt *gt) > { > struct xe_device *xe = gt_to_xe(gt); > @@ -408,6 +429,7 @@ void xe_gt_debugfs_register(struct xe_gt *gt) > root->d_inode->i_private = gt; > > /* VF safe */ > + debugfs_create_file("clear_stats", 0600, root, gt, &clear_stats_fops); It seems Himal's comment on v2 regarding permission is not addressed in this version. Francois > debugfs_create_file("force_reset", 0600, root, gt, &force_reset_fops); > debugfs_create_file("force_reset_sync", 0600, root, gt, &force_reset_sync_fops); > > diff --git a/drivers/gpu/drm/xe/xe_gt_stats.c b/drivers/gpu/drm/xe/xe_gt_stats.c > index 30f942671c2b..7e12fc3759e2 100644 > --- a/drivers/gpu/drm/xe/xe_gt_stats.c > +++ b/drivers/gpu/drm/xe/xe_gt_stats.c > @@ -50,3 +50,17 @@ int xe_gt_stats_print_info(struct xe_gt *gt, struct drm_printer *p) > > return 0; > } > + > +/** > + * xe_gt_stats_clear - Clear the GT stats > + * @gt: GT structure > + * > + * This clear (zeros) all the available GT stats. > + */ > +void xe_gt_stats_clear(struct xe_gt *gt) > +{ > + enum xe_gt_stats_id id; > + > + for (id = 0; id < __XE_GT_STATS_NUM_IDS; ++id) > + atomic64_set(>->stats.counters[id], 0); > +} > diff --git a/drivers/gpu/drm/xe/xe_gt_stats.h b/drivers/gpu/drm/xe/xe_gt_stats.h > index 38325ef53617..e8aea32bc971 100644 > --- a/drivers/gpu/drm/xe/xe_gt_stats.h > +++ b/drivers/gpu/drm/xe/xe_gt_stats.h > @@ -13,6 +13,7 @@ struct drm_printer; > > #ifdef CONFIG_DEBUG_FS > int xe_gt_stats_print_info(struct xe_gt *gt, struct drm_printer *p); > +void xe_gt_stats_clear(struct xe_gt *gt); > void xe_gt_stats_incr(struct xe_gt *gt, const enum xe_gt_stats_id id, int incr); > #else > static inline void > -- > 2.34.1 > ^ permalink raw reply [flat|nested] 11+ messages in thread
* [PATCH v3 2/2] drm/xe: Add more SVM GT stats 2025-06-03 23:34 [PATCH v3 0/2] Enhance SVM stats Matthew Brost 2025-06-03 23:34 ` [PATCH v3 1/2] drm/xe: Add clear_stats GT debugfs Matthew Brost @ 2025-06-03 23:34 ` Matthew Brost 2025-06-04 10:24 ` Francois Dugast 2025-06-03 23:38 ` ✓ CI.Patch_applied: success for Enhance SVM stats Patchwork ` (2 subsequent siblings) 4 siblings, 1 reply; 11+ messages in thread From: Matthew Brost @ 2025-06-03 23:34 UTC (permalink / raw) To: intel-xe Cc: michal.mrozek, francois.dugast, thomas.hellstrom, himal.prasad.ghimiray Add more SVM GT stats which give visibility to where time is spent in the SVM page fault handler. Stats include number of faults at a given size, total SVM page fault time, migration time in us, copy time in us, copy kb, get pages time in us, and bind time in us. Will help in tuning SVM for performance. v2: - Include local changes v3: - Add tlb invalidation + valid page fault + per size copy size stats Signed-off-by: Matthew Brost <matthew.brost@intel.com> --- drivers/gpu/drm/xe/xe_gt_stats.c | 33 +++ drivers/gpu/drm/xe/xe_gt_stats_types.h | 33 +++ drivers/gpu/drm/xe/xe_svm.c | 274 ++++++++++++++++++++++++- 3 files changed, 332 insertions(+), 8 deletions(-) diff --git a/drivers/gpu/drm/xe/xe_gt_stats.c b/drivers/gpu/drm/xe/xe_gt_stats.c index 7e12fc3759e2..8fb43cbb2de4 100644 --- a/drivers/gpu/drm/xe/xe_gt_stats.c +++ b/drivers/gpu/drm/xe/xe_gt_stats.c @@ -29,8 +29,41 @@ void xe_gt_stats_incr(struct xe_gt *gt, const enum xe_gt_stats_id id, int incr) static const char *const stat_description[__XE_GT_STATS_NUM_IDS] = { "svm_pagefault_count", "tlb_inval_count", + "svm_tlb_inval_count", + "svm_tlb_inval_us", "vma_pagefault_count", "vma_pagefault_kb", + "svm_4K_pagefault_count", + "svm_64K_pagefault_count", + "svm_2M_pagefault_count", + "svm_4K_valid_pagefault_count", + "svm_64K_valid_pagefault_count", + "svm_2M_valid_pagefault_count", + "svm_4K_pagefault_us", + "svm_64K_pagefault_us", + "svm_2M_pagefault_us", + "svm_4K_device_copy_count", + "svm_64K_device_copy_count", + "svm_2M_device_copy_count", + "svm_4K_migrate_us", + "svm_64K_migrate_us", + "svm_2M_migrate_us", + "svm_device_copy_us", + "svm_device_2M_copy_us", + "svm_device_64K_copy_us", + "svm_device_4K_copy_us", + "svm_cpu_copy_us", + "svm_cpu_2M_copy_us", + "svm_cpu_64K_copy_us", + "svm_cpu_4K_copy_us", + "svm_device_copy_kb", + "svm_cpu_copy_kb", + "svm_4K_get_pages_us", + "svm_64K_get_pages_us", + "svm_2M_get_pages_us", + "svm_4K_bind_us", + "svm_64K_bind_us", + "svm_2M_bind_us", }; /** diff --git a/drivers/gpu/drm/xe/xe_gt_stats_types.h b/drivers/gpu/drm/xe/xe_gt_stats_types.h index be3244d7133c..5a92226ef033 100644 --- a/drivers/gpu/drm/xe/xe_gt_stats_types.h +++ b/drivers/gpu/drm/xe/xe_gt_stats_types.h @@ -9,8 +9,41 @@ enum xe_gt_stats_id { XE_GT_STATS_ID_SVM_PAGEFAULT_COUNT, XE_GT_STATS_ID_TLB_INVAL, + XE_GT_STATS_ID_SVM_TLB_INVAL_COUNT, + XE_GT_STATS_ID_SVM_TLB_INVAL_US, XE_GT_STATS_ID_VMA_PAGEFAULT_COUNT, XE_GT_STATS_ID_VMA_PAGEFAULT_KB, + XE_GT_STATS_ID_SVM_4K_PAGEFAULT_COUNT, + XE_GT_STATS_ID_SVM_64K_PAGEFAULT_COUNT, + XE_GT_STATS_ID_SVM_2M_PAGEFAULT_COUNT, + XE_GT_STATS_ID_SVM_4K_VALID_PAGEFAULT_COUNT, + XE_GT_STATS_ID_SVM_64K_VALID_PAGEFAULT_COUNT, + XE_GT_STATS_ID_SVM_2M_VALID_PAGEFAULT_COUNT, + XE_GT_STATS_ID_SVM_4K_PAGEFAULT_US, + XE_GT_STATS_ID_SVM_64K_PAGEFAULT_US, + XE_GT_STATS_ID_SVM_2M_PAGEFAULT_US, + XE_GT_STATS_ID_SVM_4K_DEVICE_COPY_COUNT, + XE_GT_STATS_ID_SVM_64K_DEVICE_COPY_COUNT, + XE_GT_STATS_ID_SVM_2M_DEVICE_COPY_COUNT, + XE_GT_STATS_ID_SVM_4K_MIGRATE_US, + XE_GT_STATS_ID_SVM_64K_MIGRATE_US, + XE_GT_STATS_ID_SVM_2M_MIGRATE_US, + XE_GT_STATS_ID_SVM_DEVICE_COPY_US, + XE_GT_STATS_ID_SVM_DEVICE_2M_COPY_US, + XE_GT_STATS_ID_SVM_DEVICE_64K_COPY_US, + XE_GT_STATS_ID_SVM_DEVICE_4K_COPY_US, + XE_GT_STATS_ID_SVM_CPU_COPY_US, + XE_GT_STATS_ID_SVM_CPU_2M_COPY_US, + XE_GT_STATS_ID_SVM_CPU_64K_COPY_US, + XE_GT_STATS_ID_SVM_CPU_4K_COPY_US, + XE_GT_STATS_ID_SVM_DEVICE_COPY_KB, + XE_GT_STATS_ID_SVM_CPU_COPY_KB, + XE_GT_STATS_ID_SVM_4K_GET_PAGES_US, + XE_GT_STATS_ID_SVM_64K_GET_PAGES_US, + XE_GT_STATS_ID_SVM_2M_GET_PAGES_US, + XE_GT_STATS_ID_SVM_4K_BIND_US, + XE_GT_STATS_ID_SVM_64K_BIND_US, + XE_GT_STATS_ID_SVM_2M_BIND_US, /* must be the last entry */ __XE_GT_STATS_NUM_IDS, }; diff --git a/drivers/gpu/drm/xe/xe_svm.c b/drivers/gpu/drm/xe/xe_svm.c index f27fb9b588de..cd7c391282a7 100644 --- a/drivers/gpu/drm/xe/xe_svm.c +++ b/drivers/gpu/drm/xe/xe_svm.c @@ -108,6 +108,11 @@ xe_svm_garbage_collector_add_range(struct xe_vm *vm, struct xe_svm_range *range, &vm->svm.garbage_collector.work); } +static void xe_svm_tlb_inval_count_stats_incr(struct xe_gt *gt) +{ + xe_gt_stats_incr(gt, XE_GT_STATS_ID_SVM_TLB_INVAL_COUNT, 1); +} + static u8 xe_svm_range_notifier_event_begin(struct xe_vm *vm, struct drm_gpusvm_range *r, const struct mmu_notifier_range *mmu_range, @@ -140,6 +145,11 @@ xe_svm_range_notifier_event_begin(struct xe_vm *vm, struct drm_gpusvm_range *r, */ for_each_tile(tile, xe, id) if (xe_pt_zap_ptes_range(tile, vm, range)) { + if (!(tile_mask & BIT(id))) { + xe_svm_tlb_inval_count_stats_incr(tile->primary_gt); + if (tile->media_gt) + xe_svm_tlb_inval_count_stats_incr(tile->media_gt); + } tile_mask |= BIT(id); range->tile_invalidated |= BIT(id); } @@ -161,6 +171,24 @@ xe_svm_range_notifier_event_end(struct xe_vm *vm, struct drm_gpusvm_range *r, mmu_range); } +static s64 xe_svm_stats_ktime_us_delta(ktime_t start) +{ + return IS_ENABLED(CONFIG_DEBUG_FS) ? + ktime_us_delta(ktime_get(), start) : 0; +} + +static void xe_svm_tlb_inval_us_stats_incr(struct xe_gt *gt, ktime_t start) +{ + s64 us_delta = xe_svm_stats_ktime_us_delta(start); + + xe_gt_stats_incr(gt, XE_GT_STATS_ID_SVM_TLB_INVAL_US, us_delta); +} + +static ktime_t xe_svm_stats_ktime_get(void) +{ + return IS_ENABLED(CONFIG_DEBUG_FS) ? ktime_get() : 0; +} + static void xe_svm_invalidate(struct drm_gpusvm *gpusvm, struct drm_gpusvm_notifier *notifier, const struct mmu_notifier_range *mmu_range) @@ -171,6 +199,7 @@ static void xe_svm_invalidate(struct drm_gpusvm *gpusvm, struct drm_gpusvm_range *r, *first; struct xe_gt_tlb_invalidation_fence fence[XE_MAX_TILES_PER_DEVICE * XE_MAX_GT_PER_TILE]; + ktime_t start = xe_svm_stats_ktime_get(); u64 adj_start = mmu_range->start, adj_end = mmu_range->end; u8 tile_mask = 0; u8 id; @@ -261,6 +290,13 @@ static void xe_svm_invalidate(struct drm_gpusvm *gpusvm, r = first; drm_gpusvm_for_each_range(r, notifier, adj_start, adj_end) xe_svm_range_notifier_event_end(vm, r, mmu_range); + for_each_tile(tile, xe, id) { + if (tile_mask & BIT(id)) { + xe_svm_tlb_inval_us_stats_incr(tile->primary_gt, start); + if (tile->media_gt) + xe_svm_tlb_inval_us_stats_incr(tile->media_gt, start); + } + } } static int __xe_svm_garbage_collector(struct xe_vm *vm, @@ -363,6 +399,60 @@ enum xe_svm_copy_dir { XE_SVM_COPY_TO_SRAM, }; +static void xe_svm_copy_kb_stats_incr(struct xe_gt *gt, + const enum xe_svm_copy_dir dir, + int kb) +{ + if (dir == XE_SVM_COPY_TO_VRAM) + xe_gt_stats_incr(gt, XE_GT_STATS_ID_SVM_DEVICE_COPY_KB, kb); + else + xe_gt_stats_incr(gt, XE_GT_STATS_ID_SVM_CPU_COPY_KB, kb); +} + +static void xe_svm_copy_us_stats_incr(struct xe_gt *gt, + const enum xe_svm_copy_dir dir, + unsigned long npages, + ktime_t start) +{ + s64 us_delta = xe_svm_stats_ktime_us_delta(start); + + if (dir == XE_SVM_COPY_TO_VRAM) { + switch (npages) { + case 1: + xe_gt_stats_incr(gt, XE_GT_STATS_ID_SVM_DEVICE_4K_COPY_US, + us_delta); + break; + case 16: + xe_gt_stats_incr(gt, XE_GT_STATS_ID_SVM_DEVICE_64K_COPY_US, + us_delta); + break; + case 512: + xe_gt_stats_incr(gt, XE_GT_STATS_ID_SVM_DEVICE_2M_COPY_US, + us_delta); + break; + } + xe_gt_stats_incr(gt, XE_GT_STATS_ID_SVM_DEVICE_COPY_US, + us_delta); + } else { + switch (npages) { + case 1: + xe_gt_stats_incr(gt, XE_GT_STATS_ID_SVM_CPU_4K_COPY_US, + us_delta); + break; + case 16: + xe_gt_stats_incr(gt, XE_GT_STATS_ID_SVM_CPU_64K_COPY_US, + us_delta); + break; + case 512: + xe_gt_stats_incr(gt, XE_GT_STATS_ID_SVM_CPU_2M_COPY_US, + us_delta); + break; + } + xe_gt_stats_incr(gt, XE_GT_STATS_ID_SVM_CPU_COPY_US, + us_delta); + } +} + static int xe_svm_copy(struct page **pages, dma_addr_t *dma_addr, unsigned long npages, const enum xe_svm_copy_dir dir) { @@ -374,6 +464,7 @@ static int xe_svm_copy(struct page **pages, dma_addr_t *dma_addr, u64 vram_addr = XE_VRAM_ADDR_INVALID; int err = 0, pos = 0; bool sram = dir == XE_SVM_COPY_TO_SRAM; + ktime_t start = xe_svm_stats_ktime_get(); /* * This flow is complex: it locates physically contiguous device pages, @@ -431,6 +522,9 @@ static int xe_svm_copy(struct page **pages, dma_addr_t *dma_addr, int incr = (match && last) ? 1 : 0; if (vram_addr != XE_VRAM_ADDR_INVALID) { + xe_svm_copy_kb_stats_incr(tile->primary_gt, + dir, (i - pos + incr) * + (PAGE_SIZE / SZ_1K)); if (sram) { vm_dbg(&tile->xe->drm, "COPY TO SRAM - 0x%016llx -> 0x%016llx, NPAGES=%ld", @@ -467,6 +561,8 @@ static int xe_svm_copy(struct page **pages, dma_addr_t *dma_addr, /* Extra mismatched device page, copy it */ if (!match && last && vram_addr != XE_VRAM_ADDR_INVALID) { + xe_svm_copy_kb_stats_incr(tile->primary_gt, + dir, (PAGE_SIZE / SZ_1K)); if (sram) { vm_dbg(&tile->xe->drm, "COPY TO SRAM - 0x%016llx -> 0x%016llx, NPAGES=%d", @@ -500,6 +596,13 @@ static int xe_svm_copy(struct page **pages, dma_addr_t *dma_addr, dma_fence_put(fence); } + /* + * XXX: We can't derive the GT here (or anywhere in this functions, but + * compute always uses the primary GT so accumlate stats on the likely + * GT of the fault. + */ + xe_svm_copy_us_stats_incr(tile->primary_gt, dir, npages, start); + return err; #undef XE_MIGRATE_CHUNK_SIZE #undef XE_VRAM_ADDR_INVALID @@ -828,6 +931,142 @@ bool xe_svm_range_needs_migrate_to_vram(struct xe_svm_range *range, struct xe_vm return true; } +static void xe_svm_range_fault_count_stats_incr(struct xe_gt *gt, + struct xe_svm_range *range) +{ + switch (xe_svm_range_size(range)) { + case SZ_4K: + xe_gt_stats_incr(gt, XE_GT_STATS_ID_SVM_4K_PAGEFAULT_COUNT, 1); + break; + case SZ_64K: + xe_gt_stats_incr(gt, XE_GT_STATS_ID_SVM_64K_PAGEFAULT_COUNT, 1); + break; + case SZ_2M: + xe_gt_stats_incr(gt, XE_GT_STATS_ID_SVM_2M_PAGEFAULT_COUNT, 1); + break; + } +} + +static void xe_svm_range_valid_fault_count_stats_incr(struct xe_gt *gt, + struct xe_svm_range *range) +{ + switch (xe_svm_range_size(range)) { + case SZ_4K: + xe_gt_stats_incr(gt, XE_GT_STATS_ID_SVM_4K_VALID_PAGEFAULT_COUNT, 1); + break; + case SZ_64K: + xe_gt_stats_incr(gt, XE_GT_STATS_ID_SVM_64K_VALID_PAGEFAULT_COUNT, 1); + break; + case SZ_2M: + xe_gt_stats_incr(gt, XE_GT_STATS_ID_SVM_2M_VALID_PAGEFAULT_COUNT, 1); + break; + } +} + +static void xe_svm_range_fault_copy_count_stats_incr(struct xe_gt *gt, + struct xe_svm_range *range) +{ + switch (xe_svm_range_size(range)) { + case SZ_4K: + xe_gt_stats_incr(gt, XE_GT_STATS_ID_SVM_4K_DEVICE_COPY_COUNT, 1); + break; + case SZ_64K: + xe_gt_stats_incr(gt, XE_GT_STATS_ID_SVM_64K_DEVICE_COPY_COUNT, 1); + break; + case SZ_2M: + xe_gt_stats_incr(gt, XE_GT_STATS_ID_SVM_2M_DEVICE_COPY_COUNT, 1); + break; + } +} + +static void xe_svm_range_migrate_us_stats_incr(struct xe_gt *gt, + struct xe_svm_range *range, + ktime_t start) +{ + s64 us_delta = xe_svm_stats_ktime_us_delta(start); + + switch (xe_svm_range_size(range)) { + case SZ_4K: + xe_gt_stats_incr(gt, XE_GT_STATS_ID_SVM_4K_MIGRATE_US, + us_delta); + break; + case SZ_64K: + xe_gt_stats_incr(gt, XE_GT_STATS_ID_SVM_64K_MIGRATE_US, + us_delta); + break; + case SZ_2M: + xe_gt_stats_incr(gt, XE_GT_STATS_ID_SVM_2M_MIGRATE_US, + us_delta); + break; + } +} + +static void xe_svm_range_get_pages_us_stats_incr(struct xe_gt *gt, + struct xe_svm_range *range, + ktime_t start) +{ + s64 us_delta = xe_svm_stats_ktime_us_delta(start); + + switch (xe_svm_range_size(range)) { + case SZ_4K: + xe_gt_stats_incr(gt, XE_GT_STATS_ID_SVM_4K_GET_PAGES_US, + us_delta); + break; + case SZ_64K: + xe_gt_stats_incr(gt, XE_GT_STATS_ID_SVM_64K_GET_PAGES_US, + us_delta); + break; + case SZ_2M: + xe_gt_stats_incr(gt, XE_GT_STATS_ID_SVM_2M_GET_PAGES_US, + us_delta); + break; + } +} + +static void xe_svm_range_bind_us_stats_incr(struct xe_gt *gt, + struct xe_svm_range *range, + ktime_t start) +{ + s64 us_delta = xe_svm_stats_ktime_us_delta(start); + + switch (xe_svm_range_size(range)) { + case SZ_4K: + xe_gt_stats_incr(gt, XE_GT_STATS_ID_SVM_4K_BIND_US, + us_delta); + break; + case SZ_64K: + xe_gt_stats_incr(gt, XE_GT_STATS_ID_SVM_64K_BIND_US, + us_delta); + break; + case SZ_2M: + xe_gt_stats_incr(gt, XE_GT_STATS_ID_SVM_2M_BIND_US, + us_delta); + break; + } +} + +static void xe_svm_range_fault_us_stats_incr(struct xe_gt *gt, + struct xe_svm_range *range, + ktime_t start) +{ + s64 us_delta = xe_svm_stats_ktime_us_delta(start); + + switch (xe_svm_range_size(range)) { + case SZ_4K: + xe_gt_stats_incr(gt, XE_GT_STATS_ID_SVM_4K_PAGEFAULT_US, + us_delta); + break; + case SZ_64K: + xe_gt_stats_incr(gt, XE_GT_STATS_ID_SVM_64K_PAGEFAULT_US, + us_delta); + break; + case SZ_2M: + xe_gt_stats_incr(gt, XE_GT_STATS_ID_SVM_2M_PAGEFAULT_US, + us_delta); + break; + } +} + /** * xe_svm_handle_pagefault() - SVM handle page fault * @vm: The VM. @@ -863,6 +1102,7 @@ int xe_svm_handle_pagefault(struct xe_vm *vm, struct xe_vma *vma, struct xe_tile *tile = gt_to_tile(gt); int migrate_try_count = ctx.devmem_only ? 3 : 1; ktime_t end = 0; + ktime_t start = xe_svm_stats_ktime_get(), bind_start, get_pages_start; int err; lockdep_assert_held_write(&vm->lock); @@ -881,17 +1121,29 @@ int xe_svm_handle_pagefault(struct xe_vm *vm, struct xe_vma *vma, if (IS_ERR(range)) return PTR_ERR(range); - if (ctx.devmem_only && !range->base.flags.migrate_devmem) - return -EACCES; + xe_svm_range_fault_count_stats_incr(gt, range); - if (xe_svm_range_is_valid(range, tile, ctx.devmem_only)) - return 0; + if (ctx.devmem_only && !range->base.flags.migrate_devmem) { + err = -EACCES; + goto out; + } + + if (xe_svm_range_is_valid(range, tile, ctx.devmem_only)) { + xe_svm_range_valid_fault_count_stats_incr(gt, range); + range_debug(range, "PAGE FAULT - VALID"); + goto out;; + } range_debug(range, "PAGE FAULT"); if (--migrate_try_count >= 0 && xe_svm_range_needs_migrate_to_vram(range, vma, IS_DGFX(vm->xe))) { + ktime_t migrate_start = xe_svm_stats_ktime_get(); + + xe_svm_range_fault_copy_count_stats_incr(gt, range); + err = xe_svm_alloc_vram(vm, tile, range, &ctx); + xe_svm_range_migrate_us_stats_incr(gt, range, migrate_start); ctx.timeslice_ms <<= 1; /* Double timeslice if we have to retry */ if (err) { if (migrate_try_count || !ctx.devmem_only) { @@ -908,6 +1160,8 @@ int xe_svm_handle_pagefault(struct xe_vm *vm, struct xe_vma *vma, } } + get_pages_start = xe_svm_stats_ktime_get(); + range_debug(range, "GET PAGES"); err = xe_svm_range_get_pages(vm, range, &ctx); /* Corner where CPU mappings have changed */ @@ -927,11 +1181,13 @@ int xe_svm_handle_pagefault(struct xe_vm *vm, struct xe_vma *vma, } if (err) { range_debug(range, "PAGE FAULT - FAIL PAGE COLLECT"); - goto err_out; + goto out; } + xe_svm_range_get_pages_us_stats_incr(gt, range, get_pages_start); range_debug(range, "PAGE FAULT - BIND"); + bind_start = xe_svm_stats_ktime_get(); retry_bind: drm_exec_init(&exec, 0, 0); drm_exec_until_all_locked(&exec) { @@ -939,7 +1195,7 @@ int xe_svm_handle_pagefault(struct xe_vm *vm, struct xe_vma *vma, drm_exec_retry_on_contention(&exec); if (err) { drm_exec_fini(&exec); - goto err_out; + goto out; } fence = xe_vm_range_rebind(vm, vma, range, BIT(tile->id)); @@ -953,15 +1209,17 @@ int xe_svm_handle_pagefault(struct xe_vm *vm, struct xe_vma *vma, } if (xe_vm_validate_should_retry(&exec, err, &end)) goto retry_bind; - goto err_out; + goto out; } } drm_exec_fini(&exec); dma_fence_wait(fence, false); dma_fence_put(fence); + xe_svm_range_bind_us_stats_incr(gt, range, bind_start); -err_out: +out: + xe_svm_range_fault_us_stats_incr(gt, range, start); return err; } -- 2.34.1 ^ permalink raw reply related [flat|nested] 11+ messages in thread
* Re: [PATCH v3 2/2] drm/xe: Add more SVM GT stats 2025-06-03 23:34 ` [PATCH v3 2/2] drm/xe: Add more SVM GT stats Matthew Brost @ 2025-06-04 10:24 ` Francois Dugast 2025-06-04 14:13 ` Matthew Brost 0 siblings, 1 reply; 11+ messages in thread From: Francois Dugast @ 2025-06-04 10:24 UTC (permalink / raw) To: Matthew Brost Cc: intel-xe, michal.mrozek, thomas.hellstrom, himal.prasad.ghimiray Hi, On Tue, Jun 03, 2025 at 04:34:45PM -0700, Matthew Brost wrote: > Add more SVM GT stats which give visibility to where time is spent in > the SVM page fault handler. Stats include number of faults at a given > size, total SVM page fault time, migration time in us, copy time in us, > copy kb, get pages time in us, and bind time in us. Will help in tuning > SVM for performance. Any idea about performance impact of collecting this data? Should we put more behind IS_ENABLED(CONFIG_DEBUG_FS) to limit function jumps? > > v2: > - Include local changes > v3: > - Add tlb invalidation + valid page fault + per size copy size stats > > Signed-off-by: Matthew Brost <matthew.brost@intel.com> > --- > drivers/gpu/drm/xe/xe_gt_stats.c | 33 +++ > drivers/gpu/drm/xe/xe_gt_stats_types.h | 33 +++ > drivers/gpu/drm/xe/xe_svm.c | 274 ++++++++++++++++++++++++- > 3 files changed, 332 insertions(+), 8 deletions(-) > > diff --git a/drivers/gpu/drm/xe/xe_gt_stats.c b/drivers/gpu/drm/xe/xe_gt_stats.c > index 7e12fc3759e2..8fb43cbb2de4 100644 > --- a/drivers/gpu/drm/xe/xe_gt_stats.c > +++ b/drivers/gpu/drm/xe/xe_gt_stats.c > @@ -29,8 +29,41 @@ void xe_gt_stats_incr(struct xe_gt *gt, const enum xe_gt_stats_id id, int incr) > static const char *const stat_description[__XE_GT_STATS_NUM_IDS] = { > "svm_pagefault_count", Maybe this one should be removed to prevent confusion with svm_*_pagefault_count entries below. Francois > "tlb_inval_count", > + "svm_tlb_inval_count", > + "svm_tlb_inval_us", > "vma_pagefault_count", > "vma_pagefault_kb", > + "svm_4K_pagefault_count", > + "svm_64K_pagefault_count", > + "svm_2M_pagefault_count", > + "svm_4K_valid_pagefault_count", > + "svm_64K_valid_pagefault_count", > + "svm_2M_valid_pagefault_count", > + "svm_4K_pagefault_us", > + "svm_64K_pagefault_us", > + "svm_2M_pagefault_us", > + "svm_4K_device_copy_count", > + "svm_64K_device_copy_count", > + "svm_2M_device_copy_count", > + "svm_4K_migrate_us", > + "svm_64K_migrate_us", > + "svm_2M_migrate_us", > + "svm_device_copy_us", > + "svm_device_2M_copy_us", > + "svm_device_64K_copy_us", > + "svm_device_4K_copy_us", > + "svm_cpu_copy_us", > + "svm_cpu_2M_copy_us", > + "svm_cpu_64K_copy_us", > + "svm_cpu_4K_copy_us", > + "svm_device_copy_kb", > + "svm_cpu_copy_kb", > + "svm_4K_get_pages_us", > + "svm_64K_get_pages_us", > + "svm_2M_get_pages_us", > + "svm_4K_bind_us", > + "svm_64K_bind_us", > + "svm_2M_bind_us", > }; > > /** > diff --git a/drivers/gpu/drm/xe/xe_gt_stats_types.h b/drivers/gpu/drm/xe/xe_gt_stats_types.h > index be3244d7133c..5a92226ef033 100644 > --- a/drivers/gpu/drm/xe/xe_gt_stats_types.h > +++ b/drivers/gpu/drm/xe/xe_gt_stats_types.h > @@ -9,8 +9,41 @@ > enum xe_gt_stats_id { > XE_GT_STATS_ID_SVM_PAGEFAULT_COUNT, > XE_GT_STATS_ID_TLB_INVAL, > + XE_GT_STATS_ID_SVM_TLB_INVAL_COUNT, > + XE_GT_STATS_ID_SVM_TLB_INVAL_US, > XE_GT_STATS_ID_VMA_PAGEFAULT_COUNT, > XE_GT_STATS_ID_VMA_PAGEFAULT_KB, > + XE_GT_STATS_ID_SVM_4K_PAGEFAULT_COUNT, > + XE_GT_STATS_ID_SVM_64K_PAGEFAULT_COUNT, > + XE_GT_STATS_ID_SVM_2M_PAGEFAULT_COUNT, > + XE_GT_STATS_ID_SVM_4K_VALID_PAGEFAULT_COUNT, > + XE_GT_STATS_ID_SVM_64K_VALID_PAGEFAULT_COUNT, > + XE_GT_STATS_ID_SVM_2M_VALID_PAGEFAULT_COUNT, > + XE_GT_STATS_ID_SVM_4K_PAGEFAULT_US, > + XE_GT_STATS_ID_SVM_64K_PAGEFAULT_US, > + XE_GT_STATS_ID_SVM_2M_PAGEFAULT_US, > + XE_GT_STATS_ID_SVM_4K_DEVICE_COPY_COUNT, > + XE_GT_STATS_ID_SVM_64K_DEVICE_COPY_COUNT, > + XE_GT_STATS_ID_SVM_2M_DEVICE_COPY_COUNT, > + XE_GT_STATS_ID_SVM_4K_MIGRATE_US, > + XE_GT_STATS_ID_SVM_64K_MIGRATE_US, > + XE_GT_STATS_ID_SVM_2M_MIGRATE_US, > + XE_GT_STATS_ID_SVM_DEVICE_COPY_US, > + XE_GT_STATS_ID_SVM_DEVICE_2M_COPY_US, > + XE_GT_STATS_ID_SVM_DEVICE_64K_COPY_US, > + XE_GT_STATS_ID_SVM_DEVICE_4K_COPY_US, > + XE_GT_STATS_ID_SVM_CPU_COPY_US, > + XE_GT_STATS_ID_SVM_CPU_2M_COPY_US, > + XE_GT_STATS_ID_SVM_CPU_64K_COPY_US, > + XE_GT_STATS_ID_SVM_CPU_4K_COPY_US, > + XE_GT_STATS_ID_SVM_DEVICE_COPY_KB, > + XE_GT_STATS_ID_SVM_CPU_COPY_KB, > + XE_GT_STATS_ID_SVM_4K_GET_PAGES_US, > + XE_GT_STATS_ID_SVM_64K_GET_PAGES_US, > + XE_GT_STATS_ID_SVM_2M_GET_PAGES_US, > + XE_GT_STATS_ID_SVM_4K_BIND_US, > + XE_GT_STATS_ID_SVM_64K_BIND_US, > + XE_GT_STATS_ID_SVM_2M_BIND_US, > /* must be the last entry */ > __XE_GT_STATS_NUM_IDS, > }; > diff --git a/drivers/gpu/drm/xe/xe_svm.c b/drivers/gpu/drm/xe/xe_svm.c > index f27fb9b588de..cd7c391282a7 100644 > --- a/drivers/gpu/drm/xe/xe_svm.c > +++ b/drivers/gpu/drm/xe/xe_svm.c > @@ -108,6 +108,11 @@ xe_svm_garbage_collector_add_range(struct xe_vm *vm, struct xe_svm_range *range, > &vm->svm.garbage_collector.work); > } > > +static void xe_svm_tlb_inval_count_stats_incr(struct xe_gt *gt) > +{ > + xe_gt_stats_incr(gt, XE_GT_STATS_ID_SVM_TLB_INVAL_COUNT, 1); > +} > + > static u8 > xe_svm_range_notifier_event_begin(struct xe_vm *vm, struct drm_gpusvm_range *r, > const struct mmu_notifier_range *mmu_range, > @@ -140,6 +145,11 @@ xe_svm_range_notifier_event_begin(struct xe_vm *vm, struct drm_gpusvm_range *r, > */ > for_each_tile(tile, xe, id) > if (xe_pt_zap_ptes_range(tile, vm, range)) { > + if (!(tile_mask & BIT(id))) { > + xe_svm_tlb_inval_count_stats_incr(tile->primary_gt); > + if (tile->media_gt) > + xe_svm_tlb_inval_count_stats_incr(tile->media_gt); > + } > tile_mask |= BIT(id); > range->tile_invalidated |= BIT(id); > } > @@ -161,6 +171,24 @@ xe_svm_range_notifier_event_end(struct xe_vm *vm, struct drm_gpusvm_range *r, > mmu_range); > } > > +static s64 xe_svm_stats_ktime_us_delta(ktime_t start) > +{ > + return IS_ENABLED(CONFIG_DEBUG_FS) ? > + ktime_us_delta(ktime_get(), start) : 0; > +} > + > +static void xe_svm_tlb_inval_us_stats_incr(struct xe_gt *gt, ktime_t start) > +{ > + s64 us_delta = xe_svm_stats_ktime_us_delta(start); > + > + xe_gt_stats_incr(gt, XE_GT_STATS_ID_SVM_TLB_INVAL_US, us_delta); > +} > + > +static ktime_t xe_svm_stats_ktime_get(void) > +{ > + return IS_ENABLED(CONFIG_DEBUG_FS) ? ktime_get() : 0; > +} > + > static void xe_svm_invalidate(struct drm_gpusvm *gpusvm, > struct drm_gpusvm_notifier *notifier, > const struct mmu_notifier_range *mmu_range) > @@ -171,6 +199,7 @@ static void xe_svm_invalidate(struct drm_gpusvm *gpusvm, > struct drm_gpusvm_range *r, *first; > struct xe_gt_tlb_invalidation_fence > fence[XE_MAX_TILES_PER_DEVICE * XE_MAX_GT_PER_TILE]; > + ktime_t start = xe_svm_stats_ktime_get(); > u64 adj_start = mmu_range->start, adj_end = mmu_range->end; > u8 tile_mask = 0; > u8 id; > @@ -261,6 +290,13 @@ static void xe_svm_invalidate(struct drm_gpusvm *gpusvm, > r = first; > drm_gpusvm_for_each_range(r, notifier, adj_start, adj_end) > xe_svm_range_notifier_event_end(vm, r, mmu_range); > + for_each_tile(tile, xe, id) { > + if (tile_mask & BIT(id)) { > + xe_svm_tlb_inval_us_stats_incr(tile->primary_gt, start); > + if (tile->media_gt) > + xe_svm_tlb_inval_us_stats_incr(tile->media_gt, start); > + } > + } > } > > static int __xe_svm_garbage_collector(struct xe_vm *vm, > @@ -363,6 +399,60 @@ enum xe_svm_copy_dir { > XE_SVM_COPY_TO_SRAM, > }; > > +static void xe_svm_copy_kb_stats_incr(struct xe_gt *gt, > + const enum xe_svm_copy_dir dir, > + int kb) > +{ > + if (dir == XE_SVM_COPY_TO_VRAM) > + xe_gt_stats_incr(gt, XE_GT_STATS_ID_SVM_DEVICE_COPY_KB, kb); > + else > + xe_gt_stats_incr(gt, XE_GT_STATS_ID_SVM_CPU_COPY_KB, kb); > +} > + > +static void xe_svm_copy_us_stats_incr(struct xe_gt *gt, > + const enum xe_svm_copy_dir dir, > + unsigned long npages, > + ktime_t start) > +{ > + s64 us_delta = xe_svm_stats_ktime_us_delta(start); > + > + if (dir == XE_SVM_COPY_TO_VRAM) { > + switch (npages) { > + case 1: > + xe_gt_stats_incr(gt, XE_GT_STATS_ID_SVM_DEVICE_4K_COPY_US, > + us_delta); > + break; > + case 16: > + xe_gt_stats_incr(gt, XE_GT_STATS_ID_SVM_DEVICE_64K_COPY_US, > + us_delta); > + break; > + case 512: > + xe_gt_stats_incr(gt, XE_GT_STATS_ID_SVM_DEVICE_2M_COPY_US, > + us_delta); > + break; > + } > + xe_gt_stats_incr(gt, XE_GT_STATS_ID_SVM_DEVICE_COPY_US, > + us_delta); > + } else { > + switch (npages) { > + case 1: > + xe_gt_stats_incr(gt, XE_GT_STATS_ID_SVM_CPU_4K_COPY_US, > + us_delta); > + break; > + case 16: > + xe_gt_stats_incr(gt, XE_GT_STATS_ID_SVM_CPU_64K_COPY_US, > + us_delta); > + break; > + case 512: > + xe_gt_stats_incr(gt, XE_GT_STATS_ID_SVM_CPU_2M_COPY_US, > + us_delta); > + break; > + } > + xe_gt_stats_incr(gt, XE_GT_STATS_ID_SVM_CPU_COPY_US, > + us_delta); > + } > +} > + > static int xe_svm_copy(struct page **pages, dma_addr_t *dma_addr, > unsigned long npages, const enum xe_svm_copy_dir dir) > { > @@ -374,6 +464,7 @@ static int xe_svm_copy(struct page **pages, dma_addr_t *dma_addr, > u64 vram_addr = XE_VRAM_ADDR_INVALID; > int err = 0, pos = 0; > bool sram = dir == XE_SVM_COPY_TO_SRAM; > + ktime_t start = xe_svm_stats_ktime_get(); > > /* > * This flow is complex: it locates physically contiguous device pages, > @@ -431,6 +522,9 @@ static int xe_svm_copy(struct page **pages, dma_addr_t *dma_addr, > int incr = (match && last) ? 1 : 0; > > if (vram_addr != XE_VRAM_ADDR_INVALID) { > + xe_svm_copy_kb_stats_incr(tile->primary_gt, > + dir, (i - pos + incr) * > + (PAGE_SIZE / SZ_1K)); > if (sram) { > vm_dbg(&tile->xe->drm, > "COPY TO SRAM - 0x%016llx -> 0x%016llx, NPAGES=%ld", > @@ -467,6 +561,8 @@ static int xe_svm_copy(struct page **pages, dma_addr_t *dma_addr, > > /* Extra mismatched device page, copy it */ > if (!match && last && vram_addr != XE_VRAM_ADDR_INVALID) { > + xe_svm_copy_kb_stats_incr(tile->primary_gt, > + dir, (PAGE_SIZE / SZ_1K)); > if (sram) { > vm_dbg(&tile->xe->drm, > "COPY TO SRAM - 0x%016llx -> 0x%016llx, NPAGES=%d", > @@ -500,6 +596,13 @@ static int xe_svm_copy(struct page **pages, dma_addr_t *dma_addr, > dma_fence_put(fence); > } > > + /* > + * XXX: We can't derive the GT here (or anywhere in this functions, but > + * compute always uses the primary GT so accumlate stats on the likely > + * GT of the fault. > + */ > + xe_svm_copy_us_stats_incr(tile->primary_gt, dir, npages, start); > + > return err; > #undef XE_MIGRATE_CHUNK_SIZE > #undef XE_VRAM_ADDR_INVALID > @@ -828,6 +931,142 @@ bool xe_svm_range_needs_migrate_to_vram(struct xe_svm_range *range, struct xe_vm > return true; > } > > +static void xe_svm_range_fault_count_stats_incr(struct xe_gt *gt, > + struct xe_svm_range *range) > +{ > + switch (xe_svm_range_size(range)) { > + case SZ_4K: > + xe_gt_stats_incr(gt, XE_GT_STATS_ID_SVM_4K_PAGEFAULT_COUNT, 1); > + break; > + case SZ_64K: > + xe_gt_stats_incr(gt, XE_GT_STATS_ID_SVM_64K_PAGEFAULT_COUNT, 1); > + break; > + case SZ_2M: > + xe_gt_stats_incr(gt, XE_GT_STATS_ID_SVM_2M_PAGEFAULT_COUNT, 1); > + break; > + } > +} > + > +static void xe_svm_range_valid_fault_count_stats_incr(struct xe_gt *gt, > + struct xe_svm_range *range) > +{ > + switch (xe_svm_range_size(range)) { > + case SZ_4K: > + xe_gt_stats_incr(gt, XE_GT_STATS_ID_SVM_4K_VALID_PAGEFAULT_COUNT, 1); > + break; > + case SZ_64K: > + xe_gt_stats_incr(gt, XE_GT_STATS_ID_SVM_64K_VALID_PAGEFAULT_COUNT, 1); > + break; > + case SZ_2M: > + xe_gt_stats_incr(gt, XE_GT_STATS_ID_SVM_2M_VALID_PAGEFAULT_COUNT, 1); > + break; > + } > +} > + > +static void xe_svm_range_fault_copy_count_stats_incr(struct xe_gt *gt, > + struct xe_svm_range *range) > +{ > + switch (xe_svm_range_size(range)) { > + case SZ_4K: > + xe_gt_stats_incr(gt, XE_GT_STATS_ID_SVM_4K_DEVICE_COPY_COUNT, 1); > + break; > + case SZ_64K: > + xe_gt_stats_incr(gt, XE_GT_STATS_ID_SVM_64K_DEVICE_COPY_COUNT, 1); > + break; > + case SZ_2M: > + xe_gt_stats_incr(gt, XE_GT_STATS_ID_SVM_2M_DEVICE_COPY_COUNT, 1); > + break; > + } > +} > + > +static void xe_svm_range_migrate_us_stats_incr(struct xe_gt *gt, > + struct xe_svm_range *range, > + ktime_t start) > +{ > + s64 us_delta = xe_svm_stats_ktime_us_delta(start); > + > + switch (xe_svm_range_size(range)) { > + case SZ_4K: > + xe_gt_stats_incr(gt, XE_GT_STATS_ID_SVM_4K_MIGRATE_US, > + us_delta); > + break; > + case SZ_64K: > + xe_gt_stats_incr(gt, XE_GT_STATS_ID_SVM_64K_MIGRATE_US, > + us_delta); > + break; > + case SZ_2M: > + xe_gt_stats_incr(gt, XE_GT_STATS_ID_SVM_2M_MIGRATE_US, > + us_delta); > + break; > + } > +} > + > +static void xe_svm_range_get_pages_us_stats_incr(struct xe_gt *gt, > + struct xe_svm_range *range, > + ktime_t start) > +{ > + s64 us_delta = xe_svm_stats_ktime_us_delta(start); > + > + switch (xe_svm_range_size(range)) { > + case SZ_4K: > + xe_gt_stats_incr(gt, XE_GT_STATS_ID_SVM_4K_GET_PAGES_US, > + us_delta); > + break; > + case SZ_64K: > + xe_gt_stats_incr(gt, XE_GT_STATS_ID_SVM_64K_GET_PAGES_US, > + us_delta); > + break; > + case SZ_2M: > + xe_gt_stats_incr(gt, XE_GT_STATS_ID_SVM_2M_GET_PAGES_US, > + us_delta); > + break; > + } > +} > + > +static void xe_svm_range_bind_us_stats_incr(struct xe_gt *gt, > + struct xe_svm_range *range, > + ktime_t start) > +{ > + s64 us_delta = xe_svm_stats_ktime_us_delta(start); > + > + switch (xe_svm_range_size(range)) { > + case SZ_4K: > + xe_gt_stats_incr(gt, XE_GT_STATS_ID_SVM_4K_BIND_US, > + us_delta); > + break; > + case SZ_64K: > + xe_gt_stats_incr(gt, XE_GT_STATS_ID_SVM_64K_BIND_US, > + us_delta); > + break; > + case SZ_2M: > + xe_gt_stats_incr(gt, XE_GT_STATS_ID_SVM_2M_BIND_US, > + us_delta); > + break; > + } > +} > + > +static void xe_svm_range_fault_us_stats_incr(struct xe_gt *gt, > + struct xe_svm_range *range, > + ktime_t start) > +{ > + s64 us_delta = xe_svm_stats_ktime_us_delta(start); > + > + switch (xe_svm_range_size(range)) { > + case SZ_4K: > + xe_gt_stats_incr(gt, XE_GT_STATS_ID_SVM_4K_PAGEFAULT_US, > + us_delta); > + break; > + case SZ_64K: > + xe_gt_stats_incr(gt, XE_GT_STATS_ID_SVM_64K_PAGEFAULT_US, > + us_delta); > + break; > + case SZ_2M: > + xe_gt_stats_incr(gt, XE_GT_STATS_ID_SVM_2M_PAGEFAULT_US, > + us_delta); > + break; > + } > +} > + > /** > * xe_svm_handle_pagefault() - SVM handle page fault > * @vm: The VM. > @@ -863,6 +1102,7 @@ int xe_svm_handle_pagefault(struct xe_vm *vm, struct xe_vma *vma, > struct xe_tile *tile = gt_to_tile(gt); > int migrate_try_count = ctx.devmem_only ? 3 : 1; > ktime_t end = 0; > + ktime_t start = xe_svm_stats_ktime_get(), bind_start, get_pages_start; > int err; > > lockdep_assert_held_write(&vm->lock); > @@ -881,17 +1121,29 @@ int xe_svm_handle_pagefault(struct xe_vm *vm, struct xe_vma *vma, > if (IS_ERR(range)) > return PTR_ERR(range); > > - if (ctx.devmem_only && !range->base.flags.migrate_devmem) > - return -EACCES; > + xe_svm_range_fault_count_stats_incr(gt, range); > > - if (xe_svm_range_is_valid(range, tile, ctx.devmem_only)) > - return 0; > + if (ctx.devmem_only && !range->base.flags.migrate_devmem) { > + err = -EACCES; > + goto out; > + } > + > + if (xe_svm_range_is_valid(range, tile, ctx.devmem_only)) { > + xe_svm_range_valid_fault_count_stats_incr(gt, range); > + range_debug(range, "PAGE FAULT - VALID"); > + goto out;; > + } > > range_debug(range, "PAGE FAULT"); > > if (--migrate_try_count >= 0 && > xe_svm_range_needs_migrate_to_vram(range, vma, IS_DGFX(vm->xe))) { > + ktime_t migrate_start = xe_svm_stats_ktime_get(); > + > + xe_svm_range_fault_copy_count_stats_incr(gt, range); > + > err = xe_svm_alloc_vram(vm, tile, range, &ctx); > + xe_svm_range_migrate_us_stats_incr(gt, range, migrate_start); > ctx.timeslice_ms <<= 1; /* Double timeslice if we have to retry */ > if (err) { > if (migrate_try_count || !ctx.devmem_only) { > @@ -908,6 +1160,8 @@ int xe_svm_handle_pagefault(struct xe_vm *vm, struct xe_vma *vma, > } > } > > + get_pages_start = xe_svm_stats_ktime_get(); > + > range_debug(range, "GET PAGES"); > err = xe_svm_range_get_pages(vm, range, &ctx); > /* Corner where CPU mappings have changed */ > @@ -927,11 +1181,13 @@ int xe_svm_handle_pagefault(struct xe_vm *vm, struct xe_vma *vma, > } > if (err) { > range_debug(range, "PAGE FAULT - FAIL PAGE COLLECT"); > - goto err_out; > + goto out; > } > > + xe_svm_range_get_pages_us_stats_incr(gt, range, get_pages_start); > range_debug(range, "PAGE FAULT - BIND"); > > + bind_start = xe_svm_stats_ktime_get(); > retry_bind: > drm_exec_init(&exec, 0, 0); > drm_exec_until_all_locked(&exec) { > @@ -939,7 +1195,7 @@ int xe_svm_handle_pagefault(struct xe_vm *vm, struct xe_vma *vma, > drm_exec_retry_on_contention(&exec); > if (err) { > drm_exec_fini(&exec); > - goto err_out; > + goto out; > } > > fence = xe_vm_range_rebind(vm, vma, range, BIT(tile->id)); > @@ -953,15 +1209,17 @@ int xe_svm_handle_pagefault(struct xe_vm *vm, struct xe_vma *vma, > } > if (xe_vm_validate_should_retry(&exec, err, &end)) > goto retry_bind; > - goto err_out; > + goto out; > } > } > drm_exec_fini(&exec); > > dma_fence_wait(fence, false); > dma_fence_put(fence); > + xe_svm_range_bind_us_stats_incr(gt, range, bind_start); > > -err_out: > +out: > + xe_svm_range_fault_us_stats_incr(gt, range, start); > > return err; > } > -- > 2.34.1 > ^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [PATCH v3 2/2] drm/xe: Add more SVM GT stats 2025-06-04 10:24 ` Francois Dugast @ 2025-06-04 14:13 ` Matthew Brost 2025-06-27 16:29 ` Francois Dugast 0 siblings, 1 reply; 11+ messages in thread From: Matthew Brost @ 2025-06-04 14:13 UTC (permalink / raw) To: Francois Dugast Cc: intel-xe, michal.mrozek, thomas.hellstrom, himal.prasad.ghimiray On Wed, Jun 04, 2025 at 12:24:41PM +0200, Francois Dugast wrote: > Hi, > > On Tue, Jun 03, 2025 at 04:34:45PM -0700, Matthew Brost wrote: > > Add more SVM GT stats which give visibility to where time is spent in > > the SVM page fault handler. Stats include number of faults at a given > > size, total SVM page fault time, migration time in us, copy time in us, > > copy kb, get pages time in us, and bind time in us. Will help in tuning > > SVM for performance. > > Any idea about performance impact of collecting this data? Should we put > more behind IS_ENABLED(CONFIG_DEBUG_FS) to limit function jumps? > I think the way I have this coded if CONFIG_DEBUG_FS is false everything related to stats should compile or at least that is the intent. Maybe should confirm this though. > > > > v2: > > - Include local changes > > v3: > > - Add tlb invalidation + valid page fault + per size copy size stats > > > > Signed-off-by: Matthew Brost <matthew.brost@intel.com> > > --- > > drivers/gpu/drm/xe/xe_gt_stats.c | 33 +++ > > drivers/gpu/drm/xe/xe_gt_stats_types.h | 33 +++ > > drivers/gpu/drm/xe/xe_svm.c | 274 ++++++++++++++++++++++++- > > 3 files changed, 332 insertions(+), 8 deletions(-) > > > > diff --git a/drivers/gpu/drm/xe/xe_gt_stats.c b/drivers/gpu/drm/xe/xe_gt_stats.c > > index 7e12fc3759e2..8fb43cbb2de4 100644 > > --- a/drivers/gpu/drm/xe/xe_gt_stats.c > > +++ b/drivers/gpu/drm/xe/xe_gt_stats.c > > @@ -29,8 +29,41 @@ void xe_gt_stats_incr(struct xe_gt *gt, const enum xe_gt_stats_id id, int incr) > > static const char *const stat_description[__XE_GT_STATS_NUM_IDS] = { > > "svm_pagefault_count", > > Maybe this one should be removed to prevent confusion with > svm_*_pagefault_count entries below. > I think this is ok - it total number of faults rather than the individual breakdown like some of the stats below. Matt > Francois > > > "tlb_inval_count", > > + "svm_tlb_inval_count", > > + "svm_tlb_inval_us", > > "vma_pagefault_count", > > "vma_pagefault_kb", > > + "svm_4K_pagefault_count", > > + "svm_64K_pagefault_count", > > + "svm_2M_pagefault_count", > > + "svm_4K_valid_pagefault_count", > > + "svm_64K_valid_pagefault_count", > > + "svm_2M_valid_pagefault_count", > > + "svm_4K_pagefault_us", > > + "svm_64K_pagefault_us", > > + "svm_2M_pagefault_us", > > + "svm_4K_device_copy_count", > > + "svm_64K_device_copy_count", > > + "svm_2M_device_copy_count", > > + "svm_4K_migrate_us", > > + "svm_64K_migrate_us", > > + "svm_2M_migrate_us", > > + "svm_device_copy_us", > > + "svm_device_2M_copy_us", > > + "svm_device_64K_copy_us", > > + "svm_device_4K_copy_us", > > + "svm_cpu_copy_us", > > + "svm_cpu_2M_copy_us", > > + "svm_cpu_64K_copy_us", > > + "svm_cpu_4K_copy_us", > > + "svm_device_copy_kb", > > + "svm_cpu_copy_kb", > > + "svm_4K_get_pages_us", > > + "svm_64K_get_pages_us", > > + "svm_2M_get_pages_us", > > + "svm_4K_bind_us", > > + "svm_64K_bind_us", > > + "svm_2M_bind_us", > > }; > > > > /** > > diff --git a/drivers/gpu/drm/xe/xe_gt_stats_types.h b/drivers/gpu/drm/xe/xe_gt_stats_types.h > > index be3244d7133c..5a92226ef033 100644 > > --- a/drivers/gpu/drm/xe/xe_gt_stats_types.h > > +++ b/drivers/gpu/drm/xe/xe_gt_stats_types.h > > @@ -9,8 +9,41 @@ > > enum xe_gt_stats_id { > > XE_GT_STATS_ID_SVM_PAGEFAULT_COUNT, > > XE_GT_STATS_ID_TLB_INVAL, > > + XE_GT_STATS_ID_SVM_TLB_INVAL_COUNT, > > + XE_GT_STATS_ID_SVM_TLB_INVAL_US, > > XE_GT_STATS_ID_VMA_PAGEFAULT_COUNT, > > XE_GT_STATS_ID_VMA_PAGEFAULT_KB, > > + XE_GT_STATS_ID_SVM_4K_PAGEFAULT_COUNT, > > + XE_GT_STATS_ID_SVM_64K_PAGEFAULT_COUNT, > > + XE_GT_STATS_ID_SVM_2M_PAGEFAULT_COUNT, > > + XE_GT_STATS_ID_SVM_4K_VALID_PAGEFAULT_COUNT, > > + XE_GT_STATS_ID_SVM_64K_VALID_PAGEFAULT_COUNT, > > + XE_GT_STATS_ID_SVM_2M_VALID_PAGEFAULT_COUNT, > > + XE_GT_STATS_ID_SVM_4K_PAGEFAULT_US, > > + XE_GT_STATS_ID_SVM_64K_PAGEFAULT_US, > > + XE_GT_STATS_ID_SVM_2M_PAGEFAULT_US, > > + XE_GT_STATS_ID_SVM_4K_DEVICE_COPY_COUNT, > > + XE_GT_STATS_ID_SVM_64K_DEVICE_COPY_COUNT, > > + XE_GT_STATS_ID_SVM_2M_DEVICE_COPY_COUNT, > > + XE_GT_STATS_ID_SVM_4K_MIGRATE_US, > > + XE_GT_STATS_ID_SVM_64K_MIGRATE_US, > > + XE_GT_STATS_ID_SVM_2M_MIGRATE_US, > > + XE_GT_STATS_ID_SVM_DEVICE_COPY_US, > > + XE_GT_STATS_ID_SVM_DEVICE_2M_COPY_US, > > + XE_GT_STATS_ID_SVM_DEVICE_64K_COPY_US, > > + XE_GT_STATS_ID_SVM_DEVICE_4K_COPY_US, > > + XE_GT_STATS_ID_SVM_CPU_COPY_US, > > + XE_GT_STATS_ID_SVM_CPU_2M_COPY_US, > > + XE_GT_STATS_ID_SVM_CPU_64K_COPY_US, > > + XE_GT_STATS_ID_SVM_CPU_4K_COPY_US, > > + XE_GT_STATS_ID_SVM_DEVICE_COPY_KB, > > + XE_GT_STATS_ID_SVM_CPU_COPY_KB, > > + XE_GT_STATS_ID_SVM_4K_GET_PAGES_US, > > + XE_GT_STATS_ID_SVM_64K_GET_PAGES_US, > > + XE_GT_STATS_ID_SVM_2M_GET_PAGES_US, > > + XE_GT_STATS_ID_SVM_4K_BIND_US, > > + XE_GT_STATS_ID_SVM_64K_BIND_US, > > + XE_GT_STATS_ID_SVM_2M_BIND_US, > > /* must be the last entry */ > > __XE_GT_STATS_NUM_IDS, > > }; > > diff --git a/drivers/gpu/drm/xe/xe_svm.c b/drivers/gpu/drm/xe/xe_svm.c > > index f27fb9b588de..cd7c391282a7 100644 > > --- a/drivers/gpu/drm/xe/xe_svm.c > > +++ b/drivers/gpu/drm/xe/xe_svm.c > > @@ -108,6 +108,11 @@ xe_svm_garbage_collector_add_range(struct xe_vm *vm, struct xe_svm_range *range, > > &vm->svm.garbage_collector.work); > > } > > > > +static void xe_svm_tlb_inval_count_stats_incr(struct xe_gt *gt) > > +{ > > + xe_gt_stats_incr(gt, XE_GT_STATS_ID_SVM_TLB_INVAL_COUNT, 1); > > +} > > + > > static u8 > > xe_svm_range_notifier_event_begin(struct xe_vm *vm, struct drm_gpusvm_range *r, > > const struct mmu_notifier_range *mmu_range, > > @@ -140,6 +145,11 @@ xe_svm_range_notifier_event_begin(struct xe_vm *vm, struct drm_gpusvm_range *r, > > */ > > for_each_tile(tile, xe, id) > > if (xe_pt_zap_ptes_range(tile, vm, range)) { > > + if (!(tile_mask & BIT(id))) { > > + xe_svm_tlb_inval_count_stats_incr(tile->primary_gt); > > + if (tile->media_gt) > > + xe_svm_tlb_inval_count_stats_incr(tile->media_gt); > > + } > > tile_mask |= BIT(id); > > range->tile_invalidated |= BIT(id); > > } > > @@ -161,6 +171,24 @@ xe_svm_range_notifier_event_end(struct xe_vm *vm, struct drm_gpusvm_range *r, > > mmu_range); > > } > > > > +static s64 xe_svm_stats_ktime_us_delta(ktime_t start) > > +{ > > + return IS_ENABLED(CONFIG_DEBUG_FS) ? > > + ktime_us_delta(ktime_get(), start) : 0; > > +} > > + > > +static void xe_svm_tlb_inval_us_stats_incr(struct xe_gt *gt, ktime_t start) > > +{ > > + s64 us_delta = xe_svm_stats_ktime_us_delta(start); > > + > > + xe_gt_stats_incr(gt, XE_GT_STATS_ID_SVM_TLB_INVAL_US, us_delta); > > +} > > + > > +static ktime_t xe_svm_stats_ktime_get(void) > > +{ > > + return IS_ENABLED(CONFIG_DEBUG_FS) ? ktime_get() : 0; > > +} > > + > > static void xe_svm_invalidate(struct drm_gpusvm *gpusvm, > > struct drm_gpusvm_notifier *notifier, > > const struct mmu_notifier_range *mmu_range) > > @@ -171,6 +199,7 @@ static void xe_svm_invalidate(struct drm_gpusvm *gpusvm, > > struct drm_gpusvm_range *r, *first; > > struct xe_gt_tlb_invalidation_fence > > fence[XE_MAX_TILES_PER_DEVICE * XE_MAX_GT_PER_TILE]; > > + ktime_t start = xe_svm_stats_ktime_get(); > > u64 adj_start = mmu_range->start, adj_end = mmu_range->end; > > u8 tile_mask = 0; > > u8 id; > > @@ -261,6 +290,13 @@ static void xe_svm_invalidate(struct drm_gpusvm *gpusvm, > > r = first; > > drm_gpusvm_for_each_range(r, notifier, adj_start, adj_end) > > xe_svm_range_notifier_event_end(vm, r, mmu_range); > > + for_each_tile(tile, xe, id) { > > + if (tile_mask & BIT(id)) { > > + xe_svm_tlb_inval_us_stats_incr(tile->primary_gt, start); > > + if (tile->media_gt) > > + xe_svm_tlb_inval_us_stats_incr(tile->media_gt, start); > > + } > > + } > > } > > > > static int __xe_svm_garbage_collector(struct xe_vm *vm, > > @@ -363,6 +399,60 @@ enum xe_svm_copy_dir { > > XE_SVM_COPY_TO_SRAM, > > }; > > > > +static void xe_svm_copy_kb_stats_incr(struct xe_gt *gt, > > + const enum xe_svm_copy_dir dir, > > + int kb) > > +{ > > + if (dir == XE_SVM_COPY_TO_VRAM) > > + xe_gt_stats_incr(gt, XE_GT_STATS_ID_SVM_DEVICE_COPY_KB, kb); > > + else > > + xe_gt_stats_incr(gt, XE_GT_STATS_ID_SVM_CPU_COPY_KB, kb); > > +} > > + > > +static void xe_svm_copy_us_stats_incr(struct xe_gt *gt, > > + const enum xe_svm_copy_dir dir, > > + unsigned long npages, > > + ktime_t start) > > +{ > > + s64 us_delta = xe_svm_stats_ktime_us_delta(start); > > + > > + if (dir == XE_SVM_COPY_TO_VRAM) { > > + switch (npages) { > > + case 1: > > + xe_gt_stats_incr(gt, XE_GT_STATS_ID_SVM_DEVICE_4K_COPY_US, > > + us_delta); > > + break; > > + case 16: > > + xe_gt_stats_incr(gt, XE_GT_STATS_ID_SVM_DEVICE_64K_COPY_US, > > + us_delta); > > + break; > > + case 512: > > + xe_gt_stats_incr(gt, XE_GT_STATS_ID_SVM_DEVICE_2M_COPY_US, > > + us_delta); > > + break; > > + } > > + xe_gt_stats_incr(gt, XE_GT_STATS_ID_SVM_DEVICE_COPY_US, > > + us_delta); > > + } else { > > + switch (npages) { > > + case 1: > > + xe_gt_stats_incr(gt, XE_GT_STATS_ID_SVM_CPU_4K_COPY_US, > > + us_delta); > > + break; > > + case 16: > > + xe_gt_stats_incr(gt, XE_GT_STATS_ID_SVM_CPU_64K_COPY_US, > > + us_delta); > > + break; > > + case 512: > > + xe_gt_stats_incr(gt, XE_GT_STATS_ID_SVM_CPU_2M_COPY_US, > > + us_delta); > > + break; > > + } > > + xe_gt_stats_incr(gt, XE_GT_STATS_ID_SVM_CPU_COPY_US, > > + us_delta); > > + } > > +} > > + > > static int xe_svm_copy(struct page **pages, dma_addr_t *dma_addr, > > unsigned long npages, const enum xe_svm_copy_dir dir) > > { > > @@ -374,6 +464,7 @@ static int xe_svm_copy(struct page **pages, dma_addr_t *dma_addr, > > u64 vram_addr = XE_VRAM_ADDR_INVALID; > > int err = 0, pos = 0; > > bool sram = dir == XE_SVM_COPY_TO_SRAM; > > + ktime_t start = xe_svm_stats_ktime_get(); > > > > /* > > * This flow is complex: it locates physically contiguous device pages, > > @@ -431,6 +522,9 @@ static int xe_svm_copy(struct page **pages, dma_addr_t *dma_addr, > > int incr = (match && last) ? 1 : 0; > > > > if (vram_addr != XE_VRAM_ADDR_INVALID) { > > + xe_svm_copy_kb_stats_incr(tile->primary_gt, > > + dir, (i - pos + incr) * > > + (PAGE_SIZE / SZ_1K)); > > if (sram) { > > vm_dbg(&tile->xe->drm, > > "COPY TO SRAM - 0x%016llx -> 0x%016llx, NPAGES=%ld", > > @@ -467,6 +561,8 @@ static int xe_svm_copy(struct page **pages, dma_addr_t *dma_addr, > > > > /* Extra mismatched device page, copy it */ > > if (!match && last && vram_addr != XE_VRAM_ADDR_INVALID) { > > + xe_svm_copy_kb_stats_incr(tile->primary_gt, > > + dir, (PAGE_SIZE / SZ_1K)); > > if (sram) { > > vm_dbg(&tile->xe->drm, > > "COPY TO SRAM - 0x%016llx -> 0x%016llx, NPAGES=%d", > > @@ -500,6 +596,13 @@ static int xe_svm_copy(struct page **pages, dma_addr_t *dma_addr, > > dma_fence_put(fence); > > } > > > > + /* > > + * XXX: We can't derive the GT here (or anywhere in this functions, but > > + * compute always uses the primary GT so accumlate stats on the likely > > + * GT of the fault. > > + */ > > + xe_svm_copy_us_stats_incr(tile->primary_gt, dir, npages, start); > > + > > return err; > > #undef XE_MIGRATE_CHUNK_SIZE > > #undef XE_VRAM_ADDR_INVALID > > @@ -828,6 +931,142 @@ bool xe_svm_range_needs_migrate_to_vram(struct xe_svm_range *range, struct xe_vm > > return true; > > } > > > > +static void xe_svm_range_fault_count_stats_incr(struct xe_gt *gt, > > + struct xe_svm_range *range) > > +{ > > + switch (xe_svm_range_size(range)) { > > + case SZ_4K: > > + xe_gt_stats_incr(gt, XE_GT_STATS_ID_SVM_4K_PAGEFAULT_COUNT, 1); > > + break; > > + case SZ_64K: > > + xe_gt_stats_incr(gt, XE_GT_STATS_ID_SVM_64K_PAGEFAULT_COUNT, 1); > > + break; > > + case SZ_2M: > > + xe_gt_stats_incr(gt, XE_GT_STATS_ID_SVM_2M_PAGEFAULT_COUNT, 1); > > + break; > > + } > > +} > > + > > +static void xe_svm_range_valid_fault_count_stats_incr(struct xe_gt *gt, > > + struct xe_svm_range *range) > > +{ > > + switch (xe_svm_range_size(range)) { > > + case SZ_4K: > > + xe_gt_stats_incr(gt, XE_GT_STATS_ID_SVM_4K_VALID_PAGEFAULT_COUNT, 1); > > + break; > > + case SZ_64K: > > + xe_gt_stats_incr(gt, XE_GT_STATS_ID_SVM_64K_VALID_PAGEFAULT_COUNT, 1); > > + break; > > + case SZ_2M: > > + xe_gt_stats_incr(gt, XE_GT_STATS_ID_SVM_2M_VALID_PAGEFAULT_COUNT, 1); > > + break; > > + } > > +} > > + > > +static void xe_svm_range_fault_copy_count_stats_incr(struct xe_gt *gt, > > + struct xe_svm_range *range) > > +{ > > + switch (xe_svm_range_size(range)) { > > + case SZ_4K: > > + xe_gt_stats_incr(gt, XE_GT_STATS_ID_SVM_4K_DEVICE_COPY_COUNT, 1); > > + break; > > + case SZ_64K: > > + xe_gt_stats_incr(gt, XE_GT_STATS_ID_SVM_64K_DEVICE_COPY_COUNT, 1); > > + break; > > + case SZ_2M: > > + xe_gt_stats_incr(gt, XE_GT_STATS_ID_SVM_2M_DEVICE_COPY_COUNT, 1); > > + break; > > + } > > +} > > + > > +static void xe_svm_range_migrate_us_stats_incr(struct xe_gt *gt, > > + struct xe_svm_range *range, > > + ktime_t start) > > +{ > > + s64 us_delta = xe_svm_stats_ktime_us_delta(start); > > + > > + switch (xe_svm_range_size(range)) { > > + case SZ_4K: > > + xe_gt_stats_incr(gt, XE_GT_STATS_ID_SVM_4K_MIGRATE_US, > > + us_delta); > > + break; > > + case SZ_64K: > > + xe_gt_stats_incr(gt, XE_GT_STATS_ID_SVM_64K_MIGRATE_US, > > + us_delta); > > + break; > > + case SZ_2M: > > + xe_gt_stats_incr(gt, XE_GT_STATS_ID_SVM_2M_MIGRATE_US, > > + us_delta); > > + break; > > + } > > +} > > + > > +static void xe_svm_range_get_pages_us_stats_incr(struct xe_gt *gt, > > + struct xe_svm_range *range, > > + ktime_t start) > > +{ > > + s64 us_delta = xe_svm_stats_ktime_us_delta(start); > > + > > + switch (xe_svm_range_size(range)) { > > + case SZ_4K: > > + xe_gt_stats_incr(gt, XE_GT_STATS_ID_SVM_4K_GET_PAGES_US, > > + us_delta); > > + break; > > + case SZ_64K: > > + xe_gt_stats_incr(gt, XE_GT_STATS_ID_SVM_64K_GET_PAGES_US, > > + us_delta); > > + break; > > + case SZ_2M: > > + xe_gt_stats_incr(gt, XE_GT_STATS_ID_SVM_2M_GET_PAGES_US, > > + us_delta); > > + break; > > + } > > +} > > + > > +static void xe_svm_range_bind_us_stats_incr(struct xe_gt *gt, > > + struct xe_svm_range *range, > > + ktime_t start) > > +{ > > + s64 us_delta = xe_svm_stats_ktime_us_delta(start); > > + > > + switch (xe_svm_range_size(range)) { > > + case SZ_4K: > > + xe_gt_stats_incr(gt, XE_GT_STATS_ID_SVM_4K_BIND_US, > > + us_delta); > > + break; > > + case SZ_64K: > > + xe_gt_stats_incr(gt, XE_GT_STATS_ID_SVM_64K_BIND_US, > > + us_delta); > > + break; > > + case SZ_2M: > > + xe_gt_stats_incr(gt, XE_GT_STATS_ID_SVM_2M_BIND_US, > > + us_delta); > > + break; > > + } > > +} > > + > > +static void xe_svm_range_fault_us_stats_incr(struct xe_gt *gt, > > + struct xe_svm_range *range, > > + ktime_t start) > > +{ > > + s64 us_delta = xe_svm_stats_ktime_us_delta(start); > > + > > + switch (xe_svm_range_size(range)) { > > + case SZ_4K: > > + xe_gt_stats_incr(gt, XE_GT_STATS_ID_SVM_4K_PAGEFAULT_US, > > + us_delta); > > + break; > > + case SZ_64K: > > + xe_gt_stats_incr(gt, XE_GT_STATS_ID_SVM_64K_PAGEFAULT_US, > > + us_delta); > > + break; > > + case SZ_2M: > > + xe_gt_stats_incr(gt, XE_GT_STATS_ID_SVM_2M_PAGEFAULT_US, > > + us_delta); > > + break; > > + } > > +} > > + > > /** > > * xe_svm_handle_pagefault() - SVM handle page fault > > * @vm: The VM. > > @@ -863,6 +1102,7 @@ int xe_svm_handle_pagefault(struct xe_vm *vm, struct xe_vma *vma, > > struct xe_tile *tile = gt_to_tile(gt); > > int migrate_try_count = ctx.devmem_only ? 3 : 1; > > ktime_t end = 0; > > + ktime_t start = xe_svm_stats_ktime_get(), bind_start, get_pages_start; > > int err; > > > > lockdep_assert_held_write(&vm->lock); > > @@ -881,17 +1121,29 @@ int xe_svm_handle_pagefault(struct xe_vm *vm, struct xe_vma *vma, > > if (IS_ERR(range)) > > return PTR_ERR(range); > > > > - if (ctx.devmem_only && !range->base.flags.migrate_devmem) > > - return -EACCES; > > + xe_svm_range_fault_count_stats_incr(gt, range); > > > > - if (xe_svm_range_is_valid(range, tile, ctx.devmem_only)) > > - return 0; > > + if (ctx.devmem_only && !range->base.flags.migrate_devmem) { > > + err = -EACCES; > > + goto out; > > + } > > + > > + if (xe_svm_range_is_valid(range, tile, ctx.devmem_only)) { > > + xe_svm_range_valid_fault_count_stats_incr(gt, range); > > + range_debug(range, "PAGE FAULT - VALID"); > > + goto out;; > > + } > > > > range_debug(range, "PAGE FAULT"); > > > > if (--migrate_try_count >= 0 && > > xe_svm_range_needs_migrate_to_vram(range, vma, IS_DGFX(vm->xe))) { > > + ktime_t migrate_start = xe_svm_stats_ktime_get(); > > + > > + xe_svm_range_fault_copy_count_stats_incr(gt, range); > > + > > err = xe_svm_alloc_vram(vm, tile, range, &ctx); > > + xe_svm_range_migrate_us_stats_incr(gt, range, migrate_start); > > ctx.timeslice_ms <<= 1; /* Double timeslice if we have to retry */ > > if (err) { > > if (migrate_try_count || !ctx.devmem_only) { > > @@ -908,6 +1160,8 @@ int xe_svm_handle_pagefault(struct xe_vm *vm, struct xe_vma *vma, > > } > > } > > > > + get_pages_start = xe_svm_stats_ktime_get(); > > + > > range_debug(range, "GET PAGES"); > > err = xe_svm_range_get_pages(vm, range, &ctx); > > /* Corner where CPU mappings have changed */ > > @@ -927,11 +1181,13 @@ int xe_svm_handle_pagefault(struct xe_vm *vm, struct xe_vma *vma, > > } > > if (err) { > > range_debug(range, "PAGE FAULT - FAIL PAGE COLLECT"); > > - goto err_out; > > + goto out; > > } > > > > + xe_svm_range_get_pages_us_stats_incr(gt, range, get_pages_start); > > range_debug(range, "PAGE FAULT - BIND"); > > > > + bind_start = xe_svm_stats_ktime_get(); > > retry_bind: > > drm_exec_init(&exec, 0, 0); > > drm_exec_until_all_locked(&exec) { > > @@ -939,7 +1195,7 @@ int xe_svm_handle_pagefault(struct xe_vm *vm, struct xe_vma *vma, > > drm_exec_retry_on_contention(&exec); > > if (err) { > > drm_exec_fini(&exec); > > - goto err_out; > > + goto out; > > } > > > > fence = xe_vm_range_rebind(vm, vma, range, BIT(tile->id)); > > @@ -953,15 +1209,17 @@ int xe_svm_handle_pagefault(struct xe_vm *vm, struct xe_vma *vma, > > } > > if (xe_vm_validate_should_retry(&exec, err, &end)) > > goto retry_bind; > > - goto err_out; > > + goto out; > > } > > } > > drm_exec_fini(&exec); > > > > dma_fence_wait(fence, false); > > dma_fence_put(fence); > > + xe_svm_range_bind_us_stats_incr(gt, range, bind_start); > > > > -err_out: > > +out: > > + xe_svm_range_fault_us_stats_incr(gt, range, start); > > > > return err; > > } > > -- > > 2.34.1 > > ^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [PATCH v3 2/2] drm/xe: Add more SVM GT stats 2025-06-04 14:13 ` Matthew Brost @ 2025-06-27 16:29 ` Francois Dugast 2025-06-27 17:37 ` Matthew Brost 0 siblings, 1 reply; 11+ messages in thread From: Francois Dugast @ 2025-06-27 16:29 UTC (permalink / raw) To: Matthew Brost Cc: intel-xe, michal.mrozek, thomas.hellstrom, himal.prasad.ghimiray On Wed, Jun 04, 2025 at 07:13:24AM -0700, Matthew Brost wrote: > On Wed, Jun 04, 2025 at 12:24:41PM +0200, Francois Dugast wrote: > > Hi, > > > > On Tue, Jun 03, 2025 at 04:34:45PM -0700, Matthew Brost wrote: > > > Add more SVM GT stats which give visibility to where time is spent in > > > the SVM page fault handler. Stats include number of faults at a given > > > size, total SVM page fault time, migration time in us, copy time in us, > > > copy kb, get pages time in us, and bind time in us. Will help in tuning > > > SVM for performance. After using it extensively for SVM profiling, I can confirm this is extremely helpful. The patch needs rebasing. Also, please see one nit below. With that, Reviewed-by: Francois Dugast <francois.dugast@intel.com> > > > > Any idea about performance impact of collecting this data? Should we put > > more behind IS_ENABLED(CONFIG_DEBUG_FS) to limit function jumps? > > > > I think the way I have this coded if CONFIG_DEBUG_FS is false everything > related to stats should compile or at least that is the intent. Maybe > should confirm this though. > > > > > > > v2: > > > - Include local changes > > > v3: > > > - Add tlb invalidation + valid page fault + per size copy size stats > > > > > > Signed-off-by: Matthew Brost <matthew.brost@intel.com> > > > --- > > > drivers/gpu/drm/xe/xe_gt_stats.c | 33 +++ > > > drivers/gpu/drm/xe/xe_gt_stats_types.h | 33 +++ > > > drivers/gpu/drm/xe/xe_svm.c | 274 ++++++++++++++++++++++++- > > > 3 files changed, 332 insertions(+), 8 deletions(-) > > > > > > diff --git a/drivers/gpu/drm/xe/xe_gt_stats.c b/drivers/gpu/drm/xe/xe_gt_stats.c > > > index 7e12fc3759e2..8fb43cbb2de4 100644 > > > --- a/drivers/gpu/drm/xe/xe_gt_stats.c > > > +++ b/drivers/gpu/drm/xe/xe_gt_stats.c > > > @@ -29,8 +29,41 @@ void xe_gt_stats_incr(struct xe_gt *gt, const enum xe_gt_stats_id id, int incr) > > > static const char *const stat_description[__XE_GT_STATS_NUM_IDS] = { > > > "svm_pagefault_count", > > > > Maybe this one should be removed to prevent confusion with > > svm_*_pagefault_count entries below. > > > > I think this is ok - it total number of faults rather than the > individual breakdown like some of the stats below. > > Matt > > > Francois > > > > > "tlb_inval_count", > > > + "svm_tlb_inval_count", > > > + "svm_tlb_inval_us", > > > "vma_pagefault_count", > > > "vma_pagefault_kb", > > > + "svm_4K_pagefault_count", > > > + "svm_64K_pagefault_count", > > > + "svm_2M_pagefault_count", > > > + "svm_4K_valid_pagefault_count", > > > + "svm_64K_valid_pagefault_count", > > > + "svm_2M_valid_pagefault_count", > > > + "svm_4K_pagefault_us", > > > + "svm_64K_pagefault_us", > > > + "svm_2M_pagefault_us", > > > + "svm_4K_device_copy_count", > > > + "svm_64K_device_copy_count", > > > + "svm_2M_device_copy_count", > > > + "svm_4K_migrate_us", > > > + "svm_64K_migrate_us", > > > + "svm_2M_migrate_us", > > > + "svm_device_copy_us", > > > + "svm_device_2M_copy_us", > > > + "svm_device_64K_copy_us", > > > + "svm_device_4K_copy_us", > > > + "svm_cpu_copy_us", > > > + "svm_cpu_2M_copy_us", > > > + "svm_cpu_64K_copy_us", > > > + "svm_cpu_4K_copy_us", > > > + "svm_device_copy_kb", > > > + "svm_cpu_copy_kb", > > > + "svm_4K_get_pages_us", > > > + "svm_64K_get_pages_us", > > > + "svm_2M_get_pages_us", > > > + "svm_4K_bind_us", > > > + "svm_64K_bind_us", > > > + "svm_2M_bind_us", > > > }; > > > > > > /** > > > diff --git a/drivers/gpu/drm/xe/xe_gt_stats_types.h b/drivers/gpu/drm/xe/xe_gt_stats_types.h > > > index be3244d7133c..5a92226ef033 100644 > > > --- a/drivers/gpu/drm/xe/xe_gt_stats_types.h > > > +++ b/drivers/gpu/drm/xe/xe_gt_stats_types.h > > > @@ -9,8 +9,41 @@ > > > enum xe_gt_stats_id { > > > XE_GT_STATS_ID_SVM_PAGEFAULT_COUNT, > > > XE_GT_STATS_ID_TLB_INVAL, > > > + XE_GT_STATS_ID_SVM_TLB_INVAL_COUNT, > > > + XE_GT_STATS_ID_SVM_TLB_INVAL_US, > > > XE_GT_STATS_ID_VMA_PAGEFAULT_COUNT, > > > XE_GT_STATS_ID_VMA_PAGEFAULT_KB, > > > + XE_GT_STATS_ID_SVM_4K_PAGEFAULT_COUNT, > > > + XE_GT_STATS_ID_SVM_64K_PAGEFAULT_COUNT, > > > + XE_GT_STATS_ID_SVM_2M_PAGEFAULT_COUNT, > > > + XE_GT_STATS_ID_SVM_4K_VALID_PAGEFAULT_COUNT, > > > + XE_GT_STATS_ID_SVM_64K_VALID_PAGEFAULT_COUNT, > > > + XE_GT_STATS_ID_SVM_2M_VALID_PAGEFAULT_COUNT, > > > + XE_GT_STATS_ID_SVM_4K_PAGEFAULT_US, > > > + XE_GT_STATS_ID_SVM_64K_PAGEFAULT_US, > > > + XE_GT_STATS_ID_SVM_2M_PAGEFAULT_US, > > > + XE_GT_STATS_ID_SVM_4K_DEVICE_COPY_COUNT, > > > + XE_GT_STATS_ID_SVM_64K_DEVICE_COPY_COUNT, > > > + XE_GT_STATS_ID_SVM_2M_DEVICE_COPY_COUNT, > > > + XE_GT_STATS_ID_SVM_4K_MIGRATE_US, > > > + XE_GT_STATS_ID_SVM_64K_MIGRATE_US, > > > + XE_GT_STATS_ID_SVM_2M_MIGRATE_US, > > > + XE_GT_STATS_ID_SVM_DEVICE_COPY_US, > > > + XE_GT_STATS_ID_SVM_DEVICE_2M_COPY_US, > > > + XE_GT_STATS_ID_SVM_DEVICE_64K_COPY_US, > > > + XE_GT_STATS_ID_SVM_DEVICE_4K_COPY_US, > > > + XE_GT_STATS_ID_SVM_CPU_COPY_US, > > > + XE_GT_STATS_ID_SVM_CPU_2M_COPY_US, > > > + XE_GT_STATS_ID_SVM_CPU_64K_COPY_US, > > > + XE_GT_STATS_ID_SVM_CPU_4K_COPY_US, > > > + XE_GT_STATS_ID_SVM_DEVICE_COPY_KB, > > > + XE_GT_STATS_ID_SVM_CPU_COPY_KB, > > > + XE_GT_STATS_ID_SVM_4K_GET_PAGES_US, > > > + XE_GT_STATS_ID_SVM_64K_GET_PAGES_US, > > > + XE_GT_STATS_ID_SVM_2M_GET_PAGES_US, > > > + XE_GT_STATS_ID_SVM_4K_BIND_US, > > > + XE_GT_STATS_ID_SVM_64K_BIND_US, > > > + XE_GT_STATS_ID_SVM_2M_BIND_US, > > > /* must be the last entry */ > > > __XE_GT_STATS_NUM_IDS, > > > }; > > > diff --git a/drivers/gpu/drm/xe/xe_svm.c b/drivers/gpu/drm/xe/xe_svm.c > > > index f27fb9b588de..cd7c391282a7 100644 > > > --- a/drivers/gpu/drm/xe/xe_svm.c > > > +++ b/drivers/gpu/drm/xe/xe_svm.c > > > @@ -108,6 +108,11 @@ xe_svm_garbage_collector_add_range(struct xe_vm *vm, struct xe_svm_range *range, > > > &vm->svm.garbage_collector.work); > > > } > > > > > > +static void xe_svm_tlb_inval_count_stats_incr(struct xe_gt *gt) > > > +{ > > > + xe_gt_stats_incr(gt, XE_GT_STATS_ID_SVM_TLB_INVAL_COUNT, 1); > > > +} > > > + > > > static u8 > > > xe_svm_range_notifier_event_begin(struct xe_vm *vm, struct drm_gpusvm_range *r, > > > const struct mmu_notifier_range *mmu_range, > > > @@ -140,6 +145,11 @@ xe_svm_range_notifier_event_begin(struct xe_vm *vm, struct drm_gpusvm_range *r, > > > */ > > > for_each_tile(tile, xe, id) > > > if (xe_pt_zap_ptes_range(tile, vm, range)) { > > > + if (!(tile_mask & BIT(id))) { > > > + xe_svm_tlb_inval_count_stats_incr(tile->primary_gt); > > > + if (tile->media_gt) > > > + xe_svm_tlb_inval_count_stats_incr(tile->media_gt); > > > + } > > > tile_mask |= BIT(id); > > > range->tile_invalidated |= BIT(id); > > > } > > > @@ -161,6 +171,24 @@ xe_svm_range_notifier_event_end(struct xe_vm *vm, struct drm_gpusvm_range *r, > > > mmu_range); > > > } > > > > > > +static s64 xe_svm_stats_ktime_us_delta(ktime_t start) > > > +{ > > > + return IS_ENABLED(CONFIG_DEBUG_FS) ? > > > + ktime_us_delta(ktime_get(), start) : 0; > > > +} > > > + > > > +static void xe_svm_tlb_inval_us_stats_incr(struct xe_gt *gt, ktime_t start) > > > +{ > > > + s64 us_delta = xe_svm_stats_ktime_us_delta(start); > > > + > > > + xe_gt_stats_incr(gt, XE_GT_STATS_ID_SVM_TLB_INVAL_US, us_delta); > > > +} > > > + > > > +static ktime_t xe_svm_stats_ktime_get(void) > > > +{ > > > + return IS_ENABLED(CONFIG_DEBUG_FS) ? ktime_get() : 0; > > > +} > > > + > > > static void xe_svm_invalidate(struct drm_gpusvm *gpusvm, > > > struct drm_gpusvm_notifier *notifier, > > > const struct mmu_notifier_range *mmu_range) > > > @@ -171,6 +199,7 @@ static void xe_svm_invalidate(struct drm_gpusvm *gpusvm, > > > struct drm_gpusvm_range *r, *first; > > > struct xe_gt_tlb_invalidation_fence > > > fence[XE_MAX_TILES_PER_DEVICE * XE_MAX_GT_PER_TILE]; > > > + ktime_t start = xe_svm_stats_ktime_get(); > > > u64 adj_start = mmu_range->start, adj_end = mmu_range->end; > > > u8 tile_mask = 0; > > > u8 id; > > > @@ -261,6 +290,13 @@ static void xe_svm_invalidate(struct drm_gpusvm *gpusvm, > > > r = first; > > > drm_gpusvm_for_each_range(r, notifier, adj_start, adj_end) > > > xe_svm_range_notifier_event_end(vm, r, mmu_range); > > > + for_each_tile(tile, xe, id) { > > > + if (tile_mask & BIT(id)) { > > > + xe_svm_tlb_inval_us_stats_incr(tile->primary_gt, start); > > > + if (tile->media_gt) > > > + xe_svm_tlb_inval_us_stats_incr(tile->media_gt, start); > > > + } > > > + } > > > } > > > > > > static int __xe_svm_garbage_collector(struct xe_vm *vm, > > > @@ -363,6 +399,60 @@ enum xe_svm_copy_dir { > > > XE_SVM_COPY_TO_SRAM, > > > }; > > > > > > +static void xe_svm_copy_kb_stats_incr(struct xe_gt *gt, > > > + const enum xe_svm_copy_dir dir, > > > + int kb) > > > +{ > > > + if (dir == XE_SVM_COPY_TO_VRAM) > > > + xe_gt_stats_incr(gt, XE_GT_STATS_ID_SVM_DEVICE_COPY_KB, kb); > > > + else > > > + xe_gt_stats_incr(gt, XE_GT_STATS_ID_SVM_CPU_COPY_KB, kb); > > > +} > > > + > > > +static void xe_svm_copy_us_stats_incr(struct xe_gt *gt, > > > + const enum xe_svm_copy_dir dir, > > > + unsigned long npages, > > > + ktime_t start) > > > +{ > > > + s64 us_delta = xe_svm_stats_ktime_us_delta(start); > > > + > > > + if (dir == XE_SVM_COPY_TO_VRAM) { > > > + switch (npages) { > > > + case 1: > > > + xe_gt_stats_incr(gt, XE_GT_STATS_ID_SVM_DEVICE_4K_COPY_US, > > > + us_delta); > > > + break; > > > + case 16: > > > + xe_gt_stats_incr(gt, XE_GT_STATS_ID_SVM_DEVICE_64K_COPY_US, > > > + us_delta); > > > + break; > > > + case 512: > > > + xe_gt_stats_incr(gt, XE_GT_STATS_ID_SVM_DEVICE_2M_COPY_US, > > > + us_delta); > > > + break; > > > + } > > > + xe_gt_stats_incr(gt, XE_GT_STATS_ID_SVM_DEVICE_COPY_US, > > > + us_delta); > > > + } else { > > > + switch (npages) { > > > + case 1: > > > + xe_gt_stats_incr(gt, XE_GT_STATS_ID_SVM_CPU_4K_COPY_US, > > > + us_delta); > > > + break; > > > + case 16: > > > + xe_gt_stats_incr(gt, XE_GT_STATS_ID_SVM_CPU_64K_COPY_US, > > > + us_delta); > > > + break; > > > + case 512: > > > + xe_gt_stats_incr(gt, XE_GT_STATS_ID_SVM_CPU_2M_COPY_US, > > > + us_delta); > > > + break; > > > + } > > > + xe_gt_stats_incr(gt, XE_GT_STATS_ID_SVM_CPU_COPY_US, > > > + us_delta); > > > + } > > > +} > > > + > > > static int xe_svm_copy(struct page **pages, dma_addr_t *dma_addr, > > > unsigned long npages, const enum xe_svm_copy_dir dir) > > > { > > > @@ -374,6 +464,7 @@ static int xe_svm_copy(struct page **pages, dma_addr_t *dma_addr, > > > u64 vram_addr = XE_VRAM_ADDR_INVALID; > > > int err = 0, pos = 0; > > > bool sram = dir == XE_SVM_COPY_TO_SRAM; > > > + ktime_t start = xe_svm_stats_ktime_get(); > > > > > > /* > > > * This flow is complex: it locates physically contiguous device pages, > > > @@ -431,6 +522,9 @@ static int xe_svm_copy(struct page **pages, dma_addr_t *dma_addr, > > > int incr = (match && last) ? 1 : 0; > > > > > > if (vram_addr != XE_VRAM_ADDR_INVALID) { > > > + xe_svm_copy_kb_stats_incr(tile->primary_gt, > > > + dir, (i - pos + incr) * > > > + (PAGE_SIZE / SZ_1K)); > > > if (sram) { > > > vm_dbg(&tile->xe->drm, > > > "COPY TO SRAM - 0x%016llx -> 0x%016llx, NPAGES=%ld", > > > @@ -467,6 +561,8 @@ static int xe_svm_copy(struct page **pages, dma_addr_t *dma_addr, > > > > > > /* Extra mismatched device page, copy it */ > > > if (!match && last && vram_addr != XE_VRAM_ADDR_INVALID) { > > > + xe_svm_copy_kb_stats_incr(tile->primary_gt, > > > + dir, (PAGE_SIZE / SZ_1K)); > > > if (sram) { > > > vm_dbg(&tile->xe->drm, > > > "COPY TO SRAM - 0x%016llx -> 0x%016llx, NPAGES=%d", > > > @@ -500,6 +596,13 @@ static int xe_svm_copy(struct page **pages, dma_addr_t *dma_addr, > > > dma_fence_put(fence); > > > } > > > > > > + /* > > > + * XXX: We can't derive the GT here (or anywhere in this functions, but > > > + * compute always uses the primary GT so accumlate stats on the likely > > > + * GT of the fault. > > > + */ To avoid NULL we need here: if (tile) Francois > > > + xe_svm_copy_us_stats_incr(tile->primary_gt, dir, npages, start); > > > + > > > return err; > > > #undef XE_MIGRATE_CHUNK_SIZE > > > #undef XE_VRAM_ADDR_INVALID > > > @@ -828,6 +931,142 @@ bool xe_svm_range_needs_migrate_to_vram(struct xe_svm_range *range, struct xe_vm > > > return true; > > > } > > > > > > +static void xe_svm_range_fault_count_stats_incr(struct xe_gt *gt, > > > + struct xe_svm_range *range) > > > +{ > > > + switch (xe_svm_range_size(range)) { > > > + case SZ_4K: > > > + xe_gt_stats_incr(gt, XE_GT_STATS_ID_SVM_4K_PAGEFAULT_COUNT, 1); > > > + break; > > > + case SZ_64K: > > > + xe_gt_stats_incr(gt, XE_GT_STATS_ID_SVM_64K_PAGEFAULT_COUNT, 1); > > > + break; > > > + case SZ_2M: > > > + xe_gt_stats_incr(gt, XE_GT_STATS_ID_SVM_2M_PAGEFAULT_COUNT, 1); > > > + break; > > > + } > > > +} > > > + > > > +static void xe_svm_range_valid_fault_count_stats_incr(struct xe_gt *gt, > > > + struct xe_svm_range *range) > > > +{ > > > + switch (xe_svm_range_size(range)) { > > > + case SZ_4K: > > > + xe_gt_stats_incr(gt, XE_GT_STATS_ID_SVM_4K_VALID_PAGEFAULT_COUNT, 1); > > > + break; > > > + case SZ_64K: > > > + xe_gt_stats_incr(gt, XE_GT_STATS_ID_SVM_64K_VALID_PAGEFAULT_COUNT, 1); > > > + break; > > > + case SZ_2M: > > > + xe_gt_stats_incr(gt, XE_GT_STATS_ID_SVM_2M_VALID_PAGEFAULT_COUNT, 1); > > > + break; > > > + } > > > +} > > > + > > > +static void xe_svm_range_fault_copy_count_stats_incr(struct xe_gt *gt, > > > + struct xe_svm_range *range) > > > +{ > > > + switch (xe_svm_range_size(range)) { > > > + case SZ_4K: > > > + xe_gt_stats_incr(gt, XE_GT_STATS_ID_SVM_4K_DEVICE_COPY_COUNT, 1); > > > + break; > > > + case SZ_64K: > > > + xe_gt_stats_incr(gt, XE_GT_STATS_ID_SVM_64K_DEVICE_COPY_COUNT, 1); > > > + break; > > > + case SZ_2M: > > > + xe_gt_stats_incr(gt, XE_GT_STATS_ID_SVM_2M_DEVICE_COPY_COUNT, 1); > > > + break; > > > + } > > > +} > > > + > > > +static void xe_svm_range_migrate_us_stats_incr(struct xe_gt *gt, > > > + struct xe_svm_range *range, > > > + ktime_t start) > > > +{ > > > + s64 us_delta = xe_svm_stats_ktime_us_delta(start); > > > + > > > + switch (xe_svm_range_size(range)) { > > > + case SZ_4K: > > > + xe_gt_stats_incr(gt, XE_GT_STATS_ID_SVM_4K_MIGRATE_US, > > > + us_delta); > > > + break; > > > + case SZ_64K: > > > + xe_gt_stats_incr(gt, XE_GT_STATS_ID_SVM_64K_MIGRATE_US, > > > + us_delta); > > > + break; > > > + case SZ_2M: > > > + xe_gt_stats_incr(gt, XE_GT_STATS_ID_SVM_2M_MIGRATE_US, > > > + us_delta); > > > + break; > > > + } > > > +} > > > + > > > +static void xe_svm_range_get_pages_us_stats_incr(struct xe_gt *gt, > > > + struct xe_svm_range *range, > > > + ktime_t start) > > > +{ > > > + s64 us_delta = xe_svm_stats_ktime_us_delta(start); > > > + > > > + switch (xe_svm_range_size(range)) { > > > + case SZ_4K: > > > + xe_gt_stats_incr(gt, XE_GT_STATS_ID_SVM_4K_GET_PAGES_US, > > > + us_delta); > > > + break; > > > + case SZ_64K: > > > + xe_gt_stats_incr(gt, XE_GT_STATS_ID_SVM_64K_GET_PAGES_US, > > > + us_delta); > > > + break; > > > + case SZ_2M: > > > + xe_gt_stats_incr(gt, XE_GT_STATS_ID_SVM_2M_GET_PAGES_US, > > > + us_delta); > > > + break; > > > + } > > > +} > > > + > > > +static void xe_svm_range_bind_us_stats_incr(struct xe_gt *gt, > > > + struct xe_svm_range *range, > > > + ktime_t start) > > > +{ > > > + s64 us_delta = xe_svm_stats_ktime_us_delta(start); > > > + > > > + switch (xe_svm_range_size(range)) { > > > + case SZ_4K: > > > + xe_gt_stats_incr(gt, XE_GT_STATS_ID_SVM_4K_BIND_US, > > > + us_delta); > > > + break; > > > + case SZ_64K: > > > + xe_gt_stats_incr(gt, XE_GT_STATS_ID_SVM_64K_BIND_US, > > > + us_delta); > > > + break; > > > + case SZ_2M: > > > + xe_gt_stats_incr(gt, XE_GT_STATS_ID_SVM_2M_BIND_US, > > > + us_delta); > > > + break; > > > + } > > > +} > > > + > > > +static void xe_svm_range_fault_us_stats_incr(struct xe_gt *gt, > > > + struct xe_svm_range *range, > > > + ktime_t start) > > > +{ > > > + s64 us_delta = xe_svm_stats_ktime_us_delta(start); > > > + > > > + switch (xe_svm_range_size(range)) { > > > + case SZ_4K: > > > + xe_gt_stats_incr(gt, XE_GT_STATS_ID_SVM_4K_PAGEFAULT_US, > > > + us_delta); > > > + break; > > > + case SZ_64K: > > > + xe_gt_stats_incr(gt, XE_GT_STATS_ID_SVM_64K_PAGEFAULT_US, > > > + us_delta); > > > + break; > > > + case SZ_2M: > > > + xe_gt_stats_incr(gt, XE_GT_STATS_ID_SVM_2M_PAGEFAULT_US, > > > + us_delta); > > > + break; > > > + } > > > +} > > > + > > > /** > > > * xe_svm_handle_pagefault() - SVM handle page fault > > > * @vm: The VM. > > > @@ -863,6 +1102,7 @@ int xe_svm_handle_pagefault(struct xe_vm *vm, struct xe_vma *vma, > > > struct xe_tile *tile = gt_to_tile(gt); > > > int migrate_try_count = ctx.devmem_only ? 3 : 1; > > > ktime_t end = 0; > > > + ktime_t start = xe_svm_stats_ktime_get(), bind_start, get_pages_start; > > > int err; > > > > > > lockdep_assert_held_write(&vm->lock); > > > @@ -881,17 +1121,29 @@ int xe_svm_handle_pagefault(struct xe_vm *vm, struct xe_vma *vma, > > > if (IS_ERR(range)) > > > return PTR_ERR(range); > > > > > > - if (ctx.devmem_only && !range->base.flags.migrate_devmem) > > > - return -EACCES; > > > + xe_svm_range_fault_count_stats_incr(gt, range); > > > > > > - if (xe_svm_range_is_valid(range, tile, ctx.devmem_only)) > > > - return 0; > > > + if (ctx.devmem_only && !range->base.flags.migrate_devmem) { > > > + err = -EACCES; > > > + goto out; > > > + } > > > + > > > + if (xe_svm_range_is_valid(range, tile, ctx.devmem_only)) { > > > + xe_svm_range_valid_fault_count_stats_incr(gt, range); > > > + range_debug(range, "PAGE FAULT - VALID"); > > > + goto out;; > > > + } > > > > > > range_debug(range, "PAGE FAULT"); > > > > > > if (--migrate_try_count >= 0 && > > > xe_svm_range_needs_migrate_to_vram(range, vma, IS_DGFX(vm->xe))) { > > > + ktime_t migrate_start = xe_svm_stats_ktime_get(); > > > + > > > + xe_svm_range_fault_copy_count_stats_incr(gt, range); > > > + > > > err = xe_svm_alloc_vram(vm, tile, range, &ctx); > > > + xe_svm_range_migrate_us_stats_incr(gt, range, migrate_start); > > > ctx.timeslice_ms <<= 1; /* Double timeslice if we have to retry */ > > > if (err) { > > > if (migrate_try_count || !ctx.devmem_only) { > > > @@ -908,6 +1160,8 @@ int xe_svm_handle_pagefault(struct xe_vm *vm, struct xe_vma *vma, > > > } > > > } > > > > > > + get_pages_start = xe_svm_stats_ktime_get(); > > > + > > > range_debug(range, "GET PAGES"); > > > err = xe_svm_range_get_pages(vm, range, &ctx); > > > /* Corner where CPU mappings have changed */ > > > @@ -927,11 +1181,13 @@ int xe_svm_handle_pagefault(struct xe_vm *vm, struct xe_vma *vma, > > > } > > > if (err) { > > > range_debug(range, "PAGE FAULT - FAIL PAGE COLLECT"); > > > - goto err_out; > > > + goto out; > > > } > > > > > > + xe_svm_range_get_pages_us_stats_incr(gt, range, get_pages_start); > > > range_debug(range, "PAGE FAULT - BIND"); > > > > > > + bind_start = xe_svm_stats_ktime_get(); > > > retry_bind: > > > drm_exec_init(&exec, 0, 0); > > > drm_exec_until_all_locked(&exec) { > > > @@ -939,7 +1195,7 @@ int xe_svm_handle_pagefault(struct xe_vm *vm, struct xe_vma *vma, > > > drm_exec_retry_on_contention(&exec); > > > if (err) { > > > drm_exec_fini(&exec); > > > - goto err_out; > > > + goto out; > > > } > > > > > > fence = xe_vm_range_rebind(vm, vma, range, BIT(tile->id)); > > > @@ -953,15 +1209,17 @@ int xe_svm_handle_pagefault(struct xe_vm *vm, struct xe_vma *vma, > > > } > > > if (xe_vm_validate_should_retry(&exec, err, &end)) > > > goto retry_bind; > > > - goto err_out; > > > + goto out; > > > } > > > } > > > drm_exec_fini(&exec); > > > > > > dma_fence_wait(fence, false); > > > dma_fence_put(fence); > > > + xe_svm_range_bind_us_stats_incr(gt, range, bind_start); > > > > > > -err_out: > > > +out: > > > + xe_svm_range_fault_us_stats_incr(gt, range, start); > > > > > > return err; > > > } > > > -- > > > 2.34.1 > > > ^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [PATCH v3 2/2] drm/xe: Add more SVM GT stats 2025-06-27 16:29 ` Francois Dugast @ 2025-06-27 17:37 ` Matthew Brost 0 siblings, 0 replies; 11+ messages in thread From: Matthew Brost @ 2025-06-27 17:37 UTC (permalink / raw) To: Francois Dugast Cc: intel-xe, michal.mrozek, thomas.hellstrom, himal.prasad.ghimiray On Fri, Jun 27, 2025 at 06:29:57PM +0200, Francois Dugast wrote: > On Wed, Jun 04, 2025 at 07:13:24AM -0700, Matthew Brost wrote: > > On Wed, Jun 04, 2025 at 12:24:41PM +0200, Francois Dugast wrote: > > > Hi, > > > > > > On Tue, Jun 03, 2025 at 04:34:45PM -0700, Matthew Brost wrote: > > > > Add more SVM GT stats which give visibility to where time is spent in > > > > the SVM page fault handler. Stats include number of faults at a given > > > > size, total SVM page fault time, migration time in us, copy time in us, > > > > copy kb, get pages time in us, and bind time in us. Will help in tuning > > > > SVM for performance. > > After using it extensively for SVM profiling, I can confirm this is extremely > helpful. The patch needs rebasing. Also, please see one nit below. With that, > > Reviewed-by: Francois Dugast <francois.dugast@intel.com> > Thanks, I have a couple of other local changes to help profling too. Will rebase and repost shortly. Matt > > > > > > Any idea about performance impact of collecting this data? Should we put > > > more behind IS_ENABLED(CONFIG_DEBUG_FS) to limit function jumps? > > > > > > > I think the way I have this coded if CONFIG_DEBUG_FS is false everything > > related to stats should compile or at least that is the intent. Maybe > > should confirm this though. > > > > > > > > > > v2: > > > > - Include local changes > > > > v3: > > > > - Add tlb invalidation + valid page fault + per size copy size stats > > > > > > > > Signed-off-by: Matthew Brost <matthew.brost@intel.com> > > > > --- > > > > drivers/gpu/drm/xe/xe_gt_stats.c | 33 +++ > > > > drivers/gpu/drm/xe/xe_gt_stats_types.h | 33 +++ > > > > drivers/gpu/drm/xe/xe_svm.c | 274 ++++++++++++++++++++++++- > > > > 3 files changed, 332 insertions(+), 8 deletions(-) > > > > > > > > diff --git a/drivers/gpu/drm/xe/xe_gt_stats.c b/drivers/gpu/drm/xe/xe_gt_stats.c > > > > index 7e12fc3759e2..8fb43cbb2de4 100644 > > > > --- a/drivers/gpu/drm/xe/xe_gt_stats.c > > > > +++ b/drivers/gpu/drm/xe/xe_gt_stats.c > > > > @@ -29,8 +29,41 @@ void xe_gt_stats_incr(struct xe_gt *gt, const enum xe_gt_stats_id id, int incr) > > > > static const char *const stat_description[__XE_GT_STATS_NUM_IDS] = { > > > > "svm_pagefault_count", > > > > > > Maybe this one should be removed to prevent confusion with > > > svm_*_pagefault_count entries below. > > > > > > > I think this is ok - it total number of faults rather than the > > individual breakdown like some of the stats below. > > > > Matt > > > > > Francois > > > > > > > "tlb_inval_count", > > > > + "svm_tlb_inval_count", > > > > + "svm_tlb_inval_us", > > > > "vma_pagefault_count", > > > > "vma_pagefault_kb", > > > > + "svm_4K_pagefault_count", > > > > + "svm_64K_pagefault_count", > > > > + "svm_2M_pagefault_count", > > > > + "svm_4K_valid_pagefault_count", > > > > + "svm_64K_valid_pagefault_count", > > > > + "svm_2M_valid_pagefault_count", > > > > + "svm_4K_pagefault_us", > > > > + "svm_64K_pagefault_us", > > > > + "svm_2M_pagefault_us", > > > > + "svm_4K_device_copy_count", > > > > + "svm_64K_device_copy_count", > > > > + "svm_2M_device_copy_count", > > > > + "svm_4K_migrate_us", > > > > + "svm_64K_migrate_us", > > > > + "svm_2M_migrate_us", > > > > + "svm_device_copy_us", > > > > + "svm_device_2M_copy_us", > > > > + "svm_device_64K_copy_us", > > > > + "svm_device_4K_copy_us", > > > > + "svm_cpu_copy_us", > > > > + "svm_cpu_2M_copy_us", > > > > + "svm_cpu_64K_copy_us", > > > > + "svm_cpu_4K_copy_us", > > > > + "svm_device_copy_kb", > > > > + "svm_cpu_copy_kb", > > > > + "svm_4K_get_pages_us", > > > > + "svm_64K_get_pages_us", > > > > + "svm_2M_get_pages_us", > > > > + "svm_4K_bind_us", > > > > + "svm_64K_bind_us", > > > > + "svm_2M_bind_us", > > > > }; > > > > > > > > /** > > > > diff --git a/drivers/gpu/drm/xe/xe_gt_stats_types.h b/drivers/gpu/drm/xe/xe_gt_stats_types.h > > > > index be3244d7133c..5a92226ef033 100644 > > > > --- a/drivers/gpu/drm/xe/xe_gt_stats_types.h > > > > +++ b/drivers/gpu/drm/xe/xe_gt_stats_types.h > > > > @@ -9,8 +9,41 @@ > > > > enum xe_gt_stats_id { > > > > XE_GT_STATS_ID_SVM_PAGEFAULT_COUNT, > > > > XE_GT_STATS_ID_TLB_INVAL, > > > > + XE_GT_STATS_ID_SVM_TLB_INVAL_COUNT, > > > > + XE_GT_STATS_ID_SVM_TLB_INVAL_US, > > > > XE_GT_STATS_ID_VMA_PAGEFAULT_COUNT, > > > > XE_GT_STATS_ID_VMA_PAGEFAULT_KB, > > > > + XE_GT_STATS_ID_SVM_4K_PAGEFAULT_COUNT, > > > > + XE_GT_STATS_ID_SVM_64K_PAGEFAULT_COUNT, > > > > + XE_GT_STATS_ID_SVM_2M_PAGEFAULT_COUNT, > > > > + XE_GT_STATS_ID_SVM_4K_VALID_PAGEFAULT_COUNT, > > > > + XE_GT_STATS_ID_SVM_64K_VALID_PAGEFAULT_COUNT, > > > > + XE_GT_STATS_ID_SVM_2M_VALID_PAGEFAULT_COUNT, > > > > + XE_GT_STATS_ID_SVM_4K_PAGEFAULT_US, > > > > + XE_GT_STATS_ID_SVM_64K_PAGEFAULT_US, > > > > + XE_GT_STATS_ID_SVM_2M_PAGEFAULT_US, > > > > + XE_GT_STATS_ID_SVM_4K_DEVICE_COPY_COUNT, > > > > + XE_GT_STATS_ID_SVM_64K_DEVICE_COPY_COUNT, > > > > + XE_GT_STATS_ID_SVM_2M_DEVICE_COPY_COUNT, > > > > + XE_GT_STATS_ID_SVM_4K_MIGRATE_US, > > > > + XE_GT_STATS_ID_SVM_64K_MIGRATE_US, > > > > + XE_GT_STATS_ID_SVM_2M_MIGRATE_US, > > > > + XE_GT_STATS_ID_SVM_DEVICE_COPY_US, > > > > + XE_GT_STATS_ID_SVM_DEVICE_2M_COPY_US, > > > > + XE_GT_STATS_ID_SVM_DEVICE_64K_COPY_US, > > > > + XE_GT_STATS_ID_SVM_DEVICE_4K_COPY_US, > > > > + XE_GT_STATS_ID_SVM_CPU_COPY_US, > > > > + XE_GT_STATS_ID_SVM_CPU_2M_COPY_US, > > > > + XE_GT_STATS_ID_SVM_CPU_64K_COPY_US, > > > > + XE_GT_STATS_ID_SVM_CPU_4K_COPY_US, > > > > + XE_GT_STATS_ID_SVM_DEVICE_COPY_KB, > > > > + XE_GT_STATS_ID_SVM_CPU_COPY_KB, > > > > + XE_GT_STATS_ID_SVM_4K_GET_PAGES_US, > > > > + XE_GT_STATS_ID_SVM_64K_GET_PAGES_US, > > > > + XE_GT_STATS_ID_SVM_2M_GET_PAGES_US, > > > > + XE_GT_STATS_ID_SVM_4K_BIND_US, > > > > + XE_GT_STATS_ID_SVM_64K_BIND_US, > > > > + XE_GT_STATS_ID_SVM_2M_BIND_US, > > > > /* must be the last entry */ > > > > __XE_GT_STATS_NUM_IDS, > > > > }; > > > > diff --git a/drivers/gpu/drm/xe/xe_svm.c b/drivers/gpu/drm/xe/xe_svm.c > > > > index f27fb9b588de..cd7c391282a7 100644 > > > > --- a/drivers/gpu/drm/xe/xe_svm.c > > > > +++ b/drivers/gpu/drm/xe/xe_svm.c > > > > @@ -108,6 +108,11 @@ xe_svm_garbage_collector_add_range(struct xe_vm *vm, struct xe_svm_range *range, > > > > &vm->svm.garbage_collector.work); > > > > } > > > > > > > > +static void xe_svm_tlb_inval_count_stats_incr(struct xe_gt *gt) > > > > +{ > > > > + xe_gt_stats_incr(gt, XE_GT_STATS_ID_SVM_TLB_INVAL_COUNT, 1); > > > > +} > > > > + > > > > static u8 > > > > xe_svm_range_notifier_event_begin(struct xe_vm *vm, struct drm_gpusvm_range *r, > > > > const struct mmu_notifier_range *mmu_range, > > > > @@ -140,6 +145,11 @@ xe_svm_range_notifier_event_begin(struct xe_vm *vm, struct drm_gpusvm_range *r, > > > > */ > > > > for_each_tile(tile, xe, id) > > > > if (xe_pt_zap_ptes_range(tile, vm, range)) { > > > > + if (!(tile_mask & BIT(id))) { > > > > + xe_svm_tlb_inval_count_stats_incr(tile->primary_gt); > > > > + if (tile->media_gt) > > > > + xe_svm_tlb_inval_count_stats_incr(tile->media_gt); > > > > + } > > > > tile_mask |= BIT(id); > > > > range->tile_invalidated |= BIT(id); > > > > } > > > > @@ -161,6 +171,24 @@ xe_svm_range_notifier_event_end(struct xe_vm *vm, struct drm_gpusvm_range *r, > > > > mmu_range); > > > > } > > > > > > > > +static s64 xe_svm_stats_ktime_us_delta(ktime_t start) > > > > +{ > > > > + return IS_ENABLED(CONFIG_DEBUG_FS) ? > > > > + ktime_us_delta(ktime_get(), start) : 0; > > > > +} > > > > + > > > > +static void xe_svm_tlb_inval_us_stats_incr(struct xe_gt *gt, ktime_t start) > > > > +{ > > > > + s64 us_delta = xe_svm_stats_ktime_us_delta(start); > > > > + > > > > + xe_gt_stats_incr(gt, XE_GT_STATS_ID_SVM_TLB_INVAL_US, us_delta); > > > > +} > > > > + > > > > +static ktime_t xe_svm_stats_ktime_get(void) > > > > +{ > > > > + return IS_ENABLED(CONFIG_DEBUG_FS) ? ktime_get() : 0; > > > > +} > > > > + > > > > static void xe_svm_invalidate(struct drm_gpusvm *gpusvm, > > > > struct drm_gpusvm_notifier *notifier, > > > > const struct mmu_notifier_range *mmu_range) > > > > @@ -171,6 +199,7 @@ static void xe_svm_invalidate(struct drm_gpusvm *gpusvm, > > > > struct drm_gpusvm_range *r, *first; > > > > struct xe_gt_tlb_invalidation_fence > > > > fence[XE_MAX_TILES_PER_DEVICE * XE_MAX_GT_PER_TILE]; > > > > + ktime_t start = xe_svm_stats_ktime_get(); > > > > u64 adj_start = mmu_range->start, adj_end = mmu_range->end; > > > > u8 tile_mask = 0; > > > > u8 id; > > > > @@ -261,6 +290,13 @@ static void xe_svm_invalidate(struct drm_gpusvm *gpusvm, > > > > r = first; > > > > drm_gpusvm_for_each_range(r, notifier, adj_start, adj_end) > > > > xe_svm_range_notifier_event_end(vm, r, mmu_range); > > > > + for_each_tile(tile, xe, id) { > > > > + if (tile_mask & BIT(id)) { > > > > + xe_svm_tlb_inval_us_stats_incr(tile->primary_gt, start); > > > > + if (tile->media_gt) > > > > + xe_svm_tlb_inval_us_stats_incr(tile->media_gt, start); > > > > + } > > > > + } > > > > } > > > > > > > > static int __xe_svm_garbage_collector(struct xe_vm *vm, > > > > @@ -363,6 +399,60 @@ enum xe_svm_copy_dir { > > > > XE_SVM_COPY_TO_SRAM, > > > > }; > > > > > > > > +static void xe_svm_copy_kb_stats_incr(struct xe_gt *gt, > > > > + const enum xe_svm_copy_dir dir, > > > > + int kb) > > > > +{ > > > > + if (dir == XE_SVM_COPY_TO_VRAM) > > > > + xe_gt_stats_incr(gt, XE_GT_STATS_ID_SVM_DEVICE_COPY_KB, kb); > > > > + else > > > > + xe_gt_stats_incr(gt, XE_GT_STATS_ID_SVM_CPU_COPY_KB, kb); > > > > +} > > > > + > > > > +static void xe_svm_copy_us_stats_incr(struct xe_gt *gt, > > > > + const enum xe_svm_copy_dir dir, > > > > + unsigned long npages, > > > > + ktime_t start) > > > > +{ > > > > + s64 us_delta = xe_svm_stats_ktime_us_delta(start); > > > > + > > > > + if (dir == XE_SVM_COPY_TO_VRAM) { > > > > + switch (npages) { > > > > + case 1: > > > > + xe_gt_stats_incr(gt, XE_GT_STATS_ID_SVM_DEVICE_4K_COPY_US, > > > > + us_delta); > > > > + break; > > > > + case 16: > > > > + xe_gt_stats_incr(gt, XE_GT_STATS_ID_SVM_DEVICE_64K_COPY_US, > > > > + us_delta); > > > > + break; > > > > + case 512: > > > > + xe_gt_stats_incr(gt, XE_GT_STATS_ID_SVM_DEVICE_2M_COPY_US, > > > > + us_delta); > > > > + break; > > > > + } > > > > + xe_gt_stats_incr(gt, XE_GT_STATS_ID_SVM_DEVICE_COPY_US, > > > > + us_delta); > > > > + } else { > > > > + switch (npages) { > > > > + case 1: > > > > + xe_gt_stats_incr(gt, XE_GT_STATS_ID_SVM_CPU_4K_COPY_US, > > > > + us_delta); > > > > + break; > > > > + case 16: > > > > + xe_gt_stats_incr(gt, XE_GT_STATS_ID_SVM_CPU_64K_COPY_US, > > > > + us_delta); > > > > + break; > > > > + case 512: > > > > + xe_gt_stats_incr(gt, XE_GT_STATS_ID_SVM_CPU_2M_COPY_US, > > > > + us_delta); > > > > + break; > > > > + } > > > > + xe_gt_stats_incr(gt, XE_GT_STATS_ID_SVM_CPU_COPY_US, > > > > + us_delta); > > > > + } > > > > +} > > > > + > > > > static int xe_svm_copy(struct page **pages, dma_addr_t *dma_addr, > > > > unsigned long npages, const enum xe_svm_copy_dir dir) > > > > { > > > > @@ -374,6 +464,7 @@ static int xe_svm_copy(struct page **pages, dma_addr_t *dma_addr, > > > > u64 vram_addr = XE_VRAM_ADDR_INVALID; > > > > int err = 0, pos = 0; > > > > bool sram = dir == XE_SVM_COPY_TO_SRAM; > > > > + ktime_t start = xe_svm_stats_ktime_get(); > > > > > > > > /* > > > > * This flow is complex: it locates physically contiguous device pages, > > > > @@ -431,6 +522,9 @@ static int xe_svm_copy(struct page **pages, dma_addr_t *dma_addr, > > > > int incr = (match && last) ? 1 : 0; > > > > > > > > if (vram_addr != XE_VRAM_ADDR_INVALID) { > > > > + xe_svm_copy_kb_stats_incr(tile->primary_gt, > > > > + dir, (i - pos + incr) * > > > > + (PAGE_SIZE / SZ_1K)); > > > > if (sram) { > > > > vm_dbg(&tile->xe->drm, > > > > "COPY TO SRAM - 0x%016llx -> 0x%016llx, NPAGES=%ld", > > > > @@ -467,6 +561,8 @@ static int xe_svm_copy(struct page **pages, dma_addr_t *dma_addr, > > > > > > > > /* Extra mismatched device page, copy it */ > > > > if (!match && last && vram_addr != XE_VRAM_ADDR_INVALID) { > > > > + xe_svm_copy_kb_stats_incr(tile->primary_gt, > > > > + dir, (PAGE_SIZE / SZ_1K)); > > > > if (sram) { > > > > vm_dbg(&tile->xe->drm, > > > > "COPY TO SRAM - 0x%016llx -> 0x%016llx, NPAGES=%d", > > > > @@ -500,6 +596,13 @@ static int xe_svm_copy(struct page **pages, dma_addr_t *dma_addr, > > > > dma_fence_put(fence); > > > > } > > > > > > > > + /* > > > > + * XXX: We can't derive the GT here (or anywhere in this functions, but > > > > + * compute always uses the primary GT so accumlate stats on the likely > > > > + * GT of the fault. > > > > + */ > > To avoid NULL we need here: > > if (tile) > > Francois > > > > > + xe_svm_copy_us_stats_incr(tile->primary_gt, dir, npages, start); > > > > + > > > > return err; > > > > #undef XE_MIGRATE_CHUNK_SIZE > > > > #undef XE_VRAM_ADDR_INVALID > > > > @@ -828,6 +931,142 @@ bool xe_svm_range_needs_migrate_to_vram(struct xe_svm_range *range, struct xe_vm > > > > return true; > > > > } > > > > > > > > +static void xe_svm_range_fault_count_stats_incr(struct xe_gt *gt, > > > > + struct xe_svm_range *range) > > > > +{ > > > > + switch (xe_svm_range_size(range)) { > > > > + case SZ_4K: > > > > + xe_gt_stats_incr(gt, XE_GT_STATS_ID_SVM_4K_PAGEFAULT_COUNT, 1); > > > > + break; > > > > + case SZ_64K: > > > > + xe_gt_stats_incr(gt, XE_GT_STATS_ID_SVM_64K_PAGEFAULT_COUNT, 1); > > > > + break; > > > > + case SZ_2M: > > > > + xe_gt_stats_incr(gt, XE_GT_STATS_ID_SVM_2M_PAGEFAULT_COUNT, 1); > > > > + break; > > > > + } > > > > +} > > > > + > > > > +static void xe_svm_range_valid_fault_count_stats_incr(struct xe_gt *gt, > > > > + struct xe_svm_range *range) > > > > +{ > > > > + switch (xe_svm_range_size(range)) { > > > > + case SZ_4K: > > > > + xe_gt_stats_incr(gt, XE_GT_STATS_ID_SVM_4K_VALID_PAGEFAULT_COUNT, 1); > > > > + break; > > > > + case SZ_64K: > > > > + xe_gt_stats_incr(gt, XE_GT_STATS_ID_SVM_64K_VALID_PAGEFAULT_COUNT, 1); > > > > + break; > > > > + case SZ_2M: > > > > + xe_gt_stats_incr(gt, XE_GT_STATS_ID_SVM_2M_VALID_PAGEFAULT_COUNT, 1); > > > > + break; > > > > + } > > > > +} > > > > + > > > > +static void xe_svm_range_fault_copy_count_stats_incr(struct xe_gt *gt, > > > > + struct xe_svm_range *range) > > > > +{ > > > > + switch (xe_svm_range_size(range)) { > > > > + case SZ_4K: > > > > + xe_gt_stats_incr(gt, XE_GT_STATS_ID_SVM_4K_DEVICE_COPY_COUNT, 1); > > > > + break; > > > > + case SZ_64K: > > > > + xe_gt_stats_incr(gt, XE_GT_STATS_ID_SVM_64K_DEVICE_COPY_COUNT, 1); > > > > + break; > > > > + case SZ_2M: > > > > + xe_gt_stats_incr(gt, XE_GT_STATS_ID_SVM_2M_DEVICE_COPY_COUNT, 1); > > > > + break; > > > > + } > > > > +} > > > > + > > > > +static void xe_svm_range_migrate_us_stats_incr(struct xe_gt *gt, > > > > + struct xe_svm_range *range, > > > > + ktime_t start) > > > > +{ > > > > + s64 us_delta = xe_svm_stats_ktime_us_delta(start); > > > > + > > > > + switch (xe_svm_range_size(range)) { > > > > + case SZ_4K: > > > > + xe_gt_stats_incr(gt, XE_GT_STATS_ID_SVM_4K_MIGRATE_US, > > > > + us_delta); > > > > + break; > > > > + case SZ_64K: > > > > + xe_gt_stats_incr(gt, XE_GT_STATS_ID_SVM_64K_MIGRATE_US, > > > > + us_delta); > > > > + break; > > > > + case SZ_2M: > > > > + xe_gt_stats_incr(gt, XE_GT_STATS_ID_SVM_2M_MIGRATE_US, > > > > + us_delta); > > > > + break; > > > > + } > > > > +} > > > > + > > > > +static void xe_svm_range_get_pages_us_stats_incr(struct xe_gt *gt, > > > > + struct xe_svm_range *range, > > > > + ktime_t start) > > > > +{ > > > > + s64 us_delta = xe_svm_stats_ktime_us_delta(start); > > > > + > > > > + switch (xe_svm_range_size(range)) { > > > > + case SZ_4K: > > > > + xe_gt_stats_incr(gt, XE_GT_STATS_ID_SVM_4K_GET_PAGES_US, > > > > + us_delta); > > > > + break; > > > > + case SZ_64K: > > > > + xe_gt_stats_incr(gt, XE_GT_STATS_ID_SVM_64K_GET_PAGES_US, > > > > + us_delta); > > > > + break; > > > > + case SZ_2M: > > > > + xe_gt_stats_incr(gt, XE_GT_STATS_ID_SVM_2M_GET_PAGES_US, > > > > + us_delta); > > > > + break; > > > > + } > > > > +} > > > > + > > > > +static void xe_svm_range_bind_us_stats_incr(struct xe_gt *gt, > > > > + struct xe_svm_range *range, > > > > + ktime_t start) > > > > +{ > > > > + s64 us_delta = xe_svm_stats_ktime_us_delta(start); > > > > + > > > > + switch (xe_svm_range_size(range)) { > > > > + case SZ_4K: > > > > + xe_gt_stats_incr(gt, XE_GT_STATS_ID_SVM_4K_BIND_US, > > > > + us_delta); > > > > + break; > > > > + case SZ_64K: > > > > + xe_gt_stats_incr(gt, XE_GT_STATS_ID_SVM_64K_BIND_US, > > > > + us_delta); > > > > + break; > > > > + case SZ_2M: > > > > + xe_gt_stats_incr(gt, XE_GT_STATS_ID_SVM_2M_BIND_US, > > > > + us_delta); > > > > + break; > > > > + } > > > > +} > > > > + > > > > +static void xe_svm_range_fault_us_stats_incr(struct xe_gt *gt, > > > > + struct xe_svm_range *range, > > > > + ktime_t start) > > > > +{ > > > > + s64 us_delta = xe_svm_stats_ktime_us_delta(start); > > > > + > > > > + switch (xe_svm_range_size(range)) { > > > > + case SZ_4K: > > > > + xe_gt_stats_incr(gt, XE_GT_STATS_ID_SVM_4K_PAGEFAULT_US, > > > > + us_delta); > > > > + break; > > > > + case SZ_64K: > > > > + xe_gt_stats_incr(gt, XE_GT_STATS_ID_SVM_64K_PAGEFAULT_US, > > > > + us_delta); > > > > + break; > > > > + case SZ_2M: > > > > + xe_gt_stats_incr(gt, XE_GT_STATS_ID_SVM_2M_PAGEFAULT_US, > > > > + us_delta); > > > > + break; > > > > + } > > > > +} > > > > + > > > > /** > > > > * xe_svm_handle_pagefault() - SVM handle page fault > > > > * @vm: The VM. > > > > @@ -863,6 +1102,7 @@ int xe_svm_handle_pagefault(struct xe_vm *vm, struct xe_vma *vma, > > > > struct xe_tile *tile = gt_to_tile(gt); > > > > int migrate_try_count = ctx.devmem_only ? 3 : 1; > > > > ktime_t end = 0; > > > > + ktime_t start = xe_svm_stats_ktime_get(), bind_start, get_pages_start; > > > > int err; > > > > > > > > lockdep_assert_held_write(&vm->lock); > > > > @@ -881,17 +1121,29 @@ int xe_svm_handle_pagefault(struct xe_vm *vm, struct xe_vma *vma, > > > > if (IS_ERR(range)) > > > > return PTR_ERR(range); > > > > > > > > - if (ctx.devmem_only && !range->base.flags.migrate_devmem) > > > > - return -EACCES; > > > > + xe_svm_range_fault_count_stats_incr(gt, range); > > > > > > > > - if (xe_svm_range_is_valid(range, tile, ctx.devmem_only)) > > > > - return 0; > > > > + if (ctx.devmem_only && !range->base.flags.migrate_devmem) { > > > > + err = -EACCES; > > > > + goto out; > > > > + } > > > > + > > > > + if (xe_svm_range_is_valid(range, tile, ctx.devmem_only)) { > > > > + xe_svm_range_valid_fault_count_stats_incr(gt, range); > > > > + range_debug(range, "PAGE FAULT - VALID"); > > > > + goto out;; > > > > + } > > > > > > > > range_debug(range, "PAGE FAULT"); > > > > > > > > if (--migrate_try_count >= 0 && > > > > xe_svm_range_needs_migrate_to_vram(range, vma, IS_DGFX(vm->xe))) { > > > > + ktime_t migrate_start = xe_svm_stats_ktime_get(); > > > > + > > > > + xe_svm_range_fault_copy_count_stats_incr(gt, range); > > > > + > > > > err = xe_svm_alloc_vram(vm, tile, range, &ctx); > > > > + xe_svm_range_migrate_us_stats_incr(gt, range, migrate_start); > > > > ctx.timeslice_ms <<= 1; /* Double timeslice if we have to retry */ > > > > if (err) { > > > > if (migrate_try_count || !ctx.devmem_only) { > > > > @@ -908,6 +1160,8 @@ int xe_svm_handle_pagefault(struct xe_vm *vm, struct xe_vma *vma, > > > > } > > > > } > > > > > > > > + get_pages_start = xe_svm_stats_ktime_get(); > > > > + > > > > range_debug(range, "GET PAGES"); > > > > err = xe_svm_range_get_pages(vm, range, &ctx); > > > > /* Corner where CPU mappings have changed */ > > > > @@ -927,11 +1181,13 @@ int xe_svm_handle_pagefault(struct xe_vm *vm, struct xe_vma *vma, > > > > } > > > > if (err) { > > > > range_debug(range, "PAGE FAULT - FAIL PAGE COLLECT"); > > > > - goto err_out; > > > > + goto out; > > > > } > > > > > > > > + xe_svm_range_get_pages_us_stats_incr(gt, range, get_pages_start); > > > > range_debug(range, "PAGE FAULT - BIND"); > > > > > > > > + bind_start = xe_svm_stats_ktime_get(); > > > > retry_bind: > > > > drm_exec_init(&exec, 0, 0); > > > > drm_exec_until_all_locked(&exec) { > > > > @@ -939,7 +1195,7 @@ int xe_svm_handle_pagefault(struct xe_vm *vm, struct xe_vma *vma, > > > > drm_exec_retry_on_contention(&exec); > > > > if (err) { > > > > drm_exec_fini(&exec); > > > > - goto err_out; > > > > + goto out; > > > > } > > > > > > > > fence = xe_vm_range_rebind(vm, vma, range, BIT(tile->id)); > > > > @@ -953,15 +1209,17 @@ int xe_svm_handle_pagefault(struct xe_vm *vm, struct xe_vma *vma, > > > > } > > > > if (xe_vm_validate_should_retry(&exec, err, &end)) > > > > goto retry_bind; > > > > - goto err_out; > > > > + goto out; > > > > } > > > > } > > > > drm_exec_fini(&exec); > > > > > > > > dma_fence_wait(fence, false); > > > > dma_fence_put(fence); > > > > + xe_svm_range_bind_us_stats_incr(gt, range, bind_start); > > > > > > > > -err_out: > > > > +out: > > > > + xe_svm_range_fault_us_stats_incr(gt, range, start); > > > > > > > > return err; > > > > } > > > > -- > > > > 2.34.1 > > > > ^ permalink raw reply [flat|nested] 11+ messages in thread
* ✓ CI.Patch_applied: success for Enhance SVM stats 2025-06-03 23:34 [PATCH v3 0/2] Enhance SVM stats Matthew Brost 2025-06-03 23:34 ` [PATCH v3 1/2] drm/xe: Add clear_stats GT debugfs Matthew Brost 2025-06-03 23:34 ` [PATCH v3 2/2] drm/xe: Add more SVM GT stats Matthew Brost @ 2025-06-03 23:38 ` Patchwork 2025-06-03 23:38 ` ✗ CI.checkpatch: warning " Patchwork 2025-06-03 23:39 ` ✗ CI.KUnit: failure " Patchwork 4 siblings, 0 replies; 11+ messages in thread From: Patchwork @ 2025-06-03 23:38 UTC (permalink / raw) To: Matthew Brost; +Cc: intel-xe == Series Details == Series: Enhance SVM stats URL : https://patchwork.freedesktop.org/series/149811/ State : success == Summary == === Applying kernel patches on branch 'drm-tip' with base: === Base commit: 2d51392d4559 drm-tip: 2025y-06m-03d-21h-58m-03s UTC integration manifest === git am output follows === Applying: drm/xe: Add clear_stats GT debugfs Applying: drm/xe: Add more SVM GT stats ^ permalink raw reply [flat|nested] 11+ messages in thread
* ✗ CI.checkpatch: warning for Enhance SVM stats 2025-06-03 23:34 [PATCH v3 0/2] Enhance SVM stats Matthew Brost ` (2 preceding siblings ...) 2025-06-03 23:38 ` ✓ CI.Patch_applied: success for Enhance SVM stats Patchwork @ 2025-06-03 23:38 ` Patchwork 2025-06-03 23:39 ` ✗ CI.KUnit: failure " Patchwork 4 siblings, 0 replies; 11+ messages in thread From: Patchwork @ 2025-06-03 23:38 UTC (permalink / raw) To: Matthew Brost; +Cc: intel-xe == Series Details == Series: Enhance SVM stats URL : https://patchwork.freedesktop.org/series/149811/ State : warning == Summary == + KERNEL=/kernel + git clone https://gitlab.freedesktop.org/drm/maintainer-tools mt Cloning into 'mt'... warning: redirecting to https://gitlab.freedesktop.org/drm/maintainer-tools.git/ + git -C mt rev-list -n1 origin/master 202708c00696422fd217223bb679a353a5936e23 + cd /kernel + git config --global --add safe.directory /kernel + git log -n1 commit 2cb8e85f88137dec34f8b1ac68fe87b9b6a4b57f Author: Matthew Brost <matthew.brost@intel.com> Date: Tue Jun 3 16:34:45 2025 -0700 drm/xe: Add more SVM GT stats Add more SVM GT stats which give visibility to where time is spent in the SVM page fault handler. Stats include number of faults at a given size, total SVM page fault time, migration time in us, copy time in us, copy kb, get pages time in us, and bind time in us. Will help in tuning SVM for performance. v2: - Include local changes v3: - Add tlb invalidation + valid page fault + per size copy size stats Signed-off-by: Matthew Brost <matthew.brost@intel.com> + /mt/dim checkpatch 2d51392d455943d0356d982902ce994f91996d3e drm-intel f3f1ace1d366 drm/xe: Add clear_stats GT debugfs 2cb8e85f8813 drm/xe: Add more SVM GT stats -:457: WARNING:ONE_SEMICOLON: Statements terminations use 1 semicolon #457: FILE: drivers/gpu/drm/xe/xe_svm.c:1134: + goto out;; total: 0 errors, 1 warnings, 0 checks, 476 lines checked ^ permalink raw reply [flat|nested] 11+ messages in thread
* ✗ CI.KUnit: failure for Enhance SVM stats 2025-06-03 23:34 [PATCH v3 0/2] Enhance SVM stats Matthew Brost ` (3 preceding siblings ...) 2025-06-03 23:38 ` ✗ CI.checkpatch: warning " Patchwork @ 2025-06-03 23:39 ` Patchwork 4 siblings, 0 replies; 11+ messages in thread From: Patchwork @ 2025-06-03 23:39 UTC (permalink / raw) To: Matthew Brost; +Cc: intel-xe == Series Details == Series: Enhance SVM stats URL : https://patchwork.freedesktop.org/series/149811/ State : failure == Summary == + trap cleanup EXIT + /kernel/tools/testing/kunit/kunit.py run --kunitconfig /kernel/drivers/gpu/drm/xe/.kunitconfig [23:38:43] Configuring KUnit Kernel ... Generating .config ... Populating config with: $ make ARCH=um O=.kunit olddefconfig [23:38:47] Building KUnit Kernel ... Populating config with: $ make ARCH=um O=.kunit olddefconfig Building with: $ make all compile_commands.json scripts_gdb ARCH=um O=.kunit --jobs=48 [23:39:14] Starting KUnit Kernel (1/1)... [23:39:14] ============================================================ Running tests with: $ .kunit/linux kunit.enable=1 mem=1G console=tty kunit_shutdown=halt [23:39:14] ================== guc_buf (11 subtests) =================== [23:39:14] [PASSED] test_smallest [23:39:14] [PASSED] test_largest [23:39:14] [PASSED] test_granular [23:39:14] [PASSED] test_unique [23:39:14] [PASSED] test_overlap [23:39:14] [PASSED] test_reusable [23:39:14] [PASSED] test_too_big [23:39:14] [PASSED] test_flush [23:39:14] [PASSED] test_lookup [23:39:14] [PASSED] test_data [23:39:14] [PASSED] test_class [23:39:14] ===================== [PASSED] guc_buf ===================== [23:39:14] =================== guc_dbm (7 subtests) =================== [23:39:14] [PASSED] test_empty [23:39:14] [PASSED] test_default [23:39:14] ======================== test_size ======================== [23:39:14] [PASSED] 4 [23:39:14] [PASSED] 8 [23:39:14] [PASSED] 32 [23:39:14] [PASSED] 256 [23:39:14] ==================== [PASSED] test_size ==================== [23:39:14] ======================= test_reuse ======================== [23:39:14] [PASSED] 4 [23:39:14] [PASSED] 8 [23:39:14] [PASSED] 32 [23:39:14] [PASSED] 256 [23:39:14] =================== [PASSED] test_reuse ==================== [23:39:14] =================== test_range_overlap ==================== [23:39:14] [PASSED] 4 [23:39:14] [PASSED] 8 [23:39:14] [PASSED] 32 [23:39:14] [PASSED] 256 [23:39:14] =============== [PASSED] test_range_overlap ================ [23:39:14] =================== test_range_compact ==================== [23:39:14] [PASSED] 4 [23:39:14] [PASSED] 8 [23:39:14] [PASSED] 32 [23:39:14] [PASSED] 256 [23:39:14] =============== [PASSED] test_range_compact ================ [23:39:14] ==================== test_range_spare ===================== [23:39:14] [PASSED] 4 [23:39:14] [PASSED] 8 [23:39:14] [PASSED] 32 [23:39:14] [PASSED] 256 [23:39:14] ================ [PASSED] test_range_spare ================= [23:39:14] ===================== [PASSED] guc_dbm ===================== [23:39:14] =================== guc_idm (6 subtests) =================== [23:39:14] [PASSED] bad_init [23:39:14] [PASSED] no_init [23:39:14] [PASSED] init_fini [23:39:14] [PASSED] check_used [23:39:14] [PASSED] check_quota [23:39:14] [PASSED] check_all [23:39:14] ===================== [PASSED] guc_idm ===================== [23:39:14] ================== no_relay (3 subtests) =================== [23:39:14] [PASSED] xe_drops_guc2pf_if_not_ready [23:39:14] [PASSED] xe_drops_guc2vf_if_not_ready [23:39:14] [PASSED] xe_rejects_send_if_not_ready [23:39:14] ==================== [PASSED] no_relay ===================== [23:39:14] ================== pf_relay (14 subtests) ================== [23:39:14] [PASSED] pf_rejects_guc2pf_too_short [23:39:14] [PASSED] pf_rejects_guc2pf_too_long [23:39:14] [PASSED] pf_rejects_guc2pf_no_payload [23:39:14] [PASSED] pf_fails_no_payload [23:39:14] [PASSED] pf_fails_bad_origin [23:39:14] [PASSED] pf_fails_bad_type [23:39:14] [PASSED] pf_txn_reports_error [23:39:14] [PASSED] pf_txn_sends_pf2guc [23:39:14] [PASSED] pf_sends_pf2guc [23:39:14] [SKIPPED] pf_loopback_nop [23:39:14] [SKIPPED] pf_loopback_echo [23:39:14] [SKIPPED] pf_loopback_fail [23:39:14] [SKIPPED] pf_loopback_busy [23:39:14] [SKIPPED] pf_loopback_retry [23:39:14] ==================== [PASSED] pf_relay ===================== [23:39:14] ================== vf_relay (3 subtests) =================== [23:39:14] [PASSED] vf_rejects_guc2vf_too_short [23:39:14] [PASSED] vf_rejects_guc2vf_too_long [23:39:14] [PASSED] vf_rejects_guc2vf_no_payload [23:39:14] ==================== [PASSED] vf_relay ===================== [23:39:14] ================= pf_service (11 subtests) ================= [23:39:14] [PASSED] pf_negotiate_any [23:39:14] [PASSED] pf_negotiate_base_match [23:39:14] [PASSED] pf_negotiate_base_newer [23:39:14] [PASSED] pf_negotiate_base_next [23:39:14] [SKIPPED] pf_negotiate_base_older [23:39:14] [PASSED] pf_negotiate_base_prev [23:39:14] [PASSED] pf_negotiate_latest_match [23:39:14] [PASSED] pf_negotiate_latest_newer [23:39:14] [PASSED] pf_negotiate_latest_next [23:39:14] [SKIPPED] pf_negotiate_latest_older [23:39:14] [SKIPPED] pf_negotiate_latest_prev [23:39:14] =================== [PASSED] pf_service ==================== [23:39:14] ===================== lmtt (1 subtest) ===================== [23:39:14] ======================== test_ops ========================= [23:39:14] [PASSED] 2-level [23:39:14] [PASSED] multi-level [23:39:14] ==================== [PASSED] test_ops ===================== [23:39:14] ====================== [PASSED] lmtt ======================= [23:39:14] =================== xe_mocs (2 subtests) =================== [23:39:14] ================ xe_live_mocs_kernel_kunit ================ [23:39:14] =========== [SKIPPED] xe_live_mocs_kernel_kunit ============ [23:39:14] ================ xe_live_mocs_reset_kunit ================= [23:39:14] ============ [SKIPPED] xe_live_mocs_reset_kunit ============ [23:39:14] ==================== [SKIPPED] xe_mocs ===================== [23:39:14] ================= xe_migrate (2 subtests) ================== [23:39:14] ================= xe_migrate_sanity_kunit ================= [23:39:14] ============ [SKIPPED] xe_migrate_sanity_kunit ============= [23:39:14] ================== xe_validate_ccs_kunit ================== [23:39:14] ============= [SKIPPED] xe_validate_ccs_kunit ============== [23:39:14] =================== [SKIPPED] xe_migrate =================== [23:39:14] ================== xe_dma_buf (1 subtest) ================== [23:39:14] ==================== xe_dma_buf_kunit ===================== [23:39:14] ================ [SKIPPED] xe_dma_buf_kunit ================ [23:39:14] =================== [SKIPPED] xe_dma_buf =================== [23:39:14] ================= xe_bo_shrink (1 subtest) ================= [23:39:14] =================== xe_bo_shrink_kunit ==================== [23:39:14] =============== [SKIPPED] xe_bo_shrink_kunit =============== [23:39:14] ================== [SKIPPED] xe_bo_shrink ================== [23:39:14] ==================== xe_bo (2 subtests) ==================== [23:39:14] ================== xe_ccs_migrate_kunit =================== [23:39:14] ============== [SKIPPED] xe_ccs_migrate_kunit ============== [23:39:14] ==================== xe_bo_evict_kunit ==================== [23:39:14] =============== [SKIPPED] xe_bo_evict_kunit ================ [23:39:14] ===================== [SKIPPED] xe_bo ====================== [23:39:14] ==================== args (11 subtests) ==================== [23:39:14] [PASSED] count_args_test [23:39:14] [PASSED] call_args_example [23:39:14] [PASSED] call_args_test [23:39:14] [PASSED] drop_first_arg_example [23:39:14] [PASSED] drop_first_arg_test [23:39:14] [PASSED] first_arg_example [23:39:14] [PASSED] first_arg_test [23:39:14] [PASSED] last_arg_example [23:39:14] [PASSED] last_arg_test [23:39:14] [PASSED] pick_arg_example [23:39:14] [PASSED] sep_comma_example [23:39:14] ====================== [PASSED] args ======================= [23:39:14] =================== xe_pci (2 subtests) ==================== [23:39:14] [PASSED] xe_gmdid_graphics_ip [23:39:14] [PASSED] xe_gmdid_media_ip [23:39:14] ===================== [PASSED] xe_pci ====================== [23:39:14] =================== xe_rtp (2 subtests) ==================== [23:39:14] =============== xe_rtp_process_to_sr_tests ================ [23:39:14] [PASSED] coalesce-same-reg [23:39:14] [PASSED] no-match-no-add [23:39:14] [PASSED] match-or [23:39:14] [PASSED] match-or-xfail [23:39:14] [PASSED] no-match-no-add-multiple-rules [23:39:14] [PASSED] two-regs-two-entries [23:39:14] [PASSED] clr-one-set-other [23:39:14] [PASSED] set-field [23:39:14] [PASSED] conflict-duplicate [23:39:14] [PASSED] conflict-not-disjoint stty: 'standard input': Inappropriate ioctl for device [23:39:14] [PASSED] conflict-reg-type [23:39:14] =========== [PASSED] xe_rtp_process_to_sr_tests ============ [23:39:14] ================== xe_rtp_process_tests =================== [23:39:14] [PASSED] active1 [23:39:14] [PASSED] active2 [23:39:14] [PASSED] active-inactive [23:39:14] [PASSED] inactive-active [23:39:14] [PASSED] inactive-1st_or_active-inactive [23:39:14] [PASSED] inactive-2nd_or_active-inactive [23:39:14] [PASSED] inactive-last_or_active-inactive [23:39:14] [PASSED] inactive-no_or_active-inactive [23:39:14] ============== [PASSED] xe_rtp_process_tests =============== [23:39:14] ===================== [PASSED] xe_rtp ====================== [23:39:14] ==================== xe_wa (1 subtest) ===================== [23:39:14] ======================== xe_wa_gt ========================= [23:39:14] [PASSED] TIGERLAKE (B0) [23:39:14] [PASSED] DG1 (A0) [23:39:14] [PASSED] DG1 (B0) [23:39:14] [PASSED] ALDERLAKE_S (A0) [23:39:14] [PASSED] ALDERLAKE_S (B0) [23:39:14] [PASSED] ALDERLAKE_S (C0) [23:39:14] [PASSED] ALDERLAKE_S (D0) [23:39:14] [PASSED] ALDERLAKE_P (A0) [23:39:14] [PASSED] ALDERLAKE_P (B0) [23:39:14] [PASSED] ALDERLAKE_P (C0) [23:39:14] [PASSED] ALDERLAKE_S_RPLS (D0) [23:39:14] [PASSED] ALDERLAKE_P_RPLU (E0) [23:39:14] [PASSED] DG2_G10 (C0) [23:39:14] [PASSED] DG2_G11 (B1) [23:39:14] [PASSED] DG2_G12 (A1) [23:39:14] [PASSED] METEORLAKE (g:A0, m:A0) [23:39:14] [PASSED] METEORLAKE (g:A0, m:A0) [23:39:14] [PASSED] METEORLAKE (g:A0, m:A0) [23:39:14] [PASSED] LUNARLAKE (g:A0, m:A0) [23:39:14] [PASSED] LUNARLAKE (g:B0, m:A0) [23:39:14] [PASSED] BATTLEMAGE (g:A0, m:A1) [23:39:14] ==================== [PASSED] xe_wa_gt ===================== [23:39:14] ====================== [PASSED] xe_wa ====================== [23:39:14] ============================================================ [23:39:14] Testing complete. Ran 133 tests: passed: 117, skipped: 16 [23:39:14] Elapsed time: 30.964s total, 4.238s configuring, 26.459s building, 0.253s running + /kernel/tools/testing/kunit/kunit.py run --kunitconfig /kernel/drivers/gpu/drm/tests/.kunitconfig [23:39:14] Configuring KUnit Kernel ... Regenerating .config ... Populating config with: $ make ARCH=um O=.kunit olddefconfig [23:39:16] Building KUnit Kernel ... Populating config with: $ make ARCH=um O=.kunit olddefconfig Building with: $ make all compile_commands.json scripts_gdb ARCH=um O=.kunit --jobs=48 [23:39:37] Starting KUnit Kernel (1/1)... [23:39:37] ============================================================ Running tests with: $ .kunit/linux kunit.enable=1 mem=1G console=tty kunit_shutdown=halt [23:39:37] == drm_test_atomic_get_connector_for_encoder (1 subtest) === [23:39:37] [PASSED] drm_test_drm_atomic_get_connector_for_encoder [23:39:37] ==== [PASSED] drm_test_atomic_get_connector_for_encoder ==== [23:39:37] =========== drm_validate_clone_mode (2 subtests) =========== [23:39:37] ============== drm_test_check_in_clone_mode =============== [23:39:37] [PASSED] in_clone_mode [23:39:37] [PASSED] not_in_clone_mode [23:39:37] ========== [PASSED] drm_test_check_in_clone_mode =========== [23:39:37] =============== drm_test_check_valid_clones =============== [23:39:37] [PASSED] not_in_clone_mode [23:39:37] [PASSED] valid_clone [23:39:37] [PASSED] invalid_clone [23:39:37] =========== [PASSED] drm_test_check_valid_clones =========== [23:39:37] ============= [PASSED] drm_validate_clone_mode ============= [23:39:37] ============= drm_validate_modeset (1 subtest) ============= [23:39:37] [PASSED] drm_test_check_connector_changed_modeset [23:39:37] ============== [PASSED] drm_validate_modeset =============== [23:39:37] ====== drm_test_bridge_get_current_state (2 subtests) ====== [23:39:37] [PASSED] drm_test_drm_bridge_get_current_state_atomic [23:39:37] [PASSED] drm_test_drm_bridge_get_current_state_legacy [23:39:37] ======== [PASSED] drm_test_bridge_get_current_state ======== [23:39:37] ====== drm_test_bridge_helper_reset_crtc (3 subtests) ====== [23:39:37] [PASSED] drm_test_drm_bridge_helper_reset_crtc_atomic [23:39:37] [PASSED] drm_test_drm_bridge_helper_reset_crtc_atomic_disabled [23:39:37] [PASSED] drm_test_drm_bridge_helper_reset_crtc_legacy [23:39:37] ======== [PASSED] drm_test_bridge_helper_reset_crtc ======== [23:39:37] ================== drm_buddy (7 subtests) ================== [23:39:37] [PASSED] drm_test_buddy_alloc_limit [23:39:37] [PASSED] drm_test_buddy_alloc_optimistic [23:39:37] [PASSED] drm_test_buddy_alloc_pessimistic [23:39:37] [PASSED] drm_test_buddy_alloc_pathological [23:39:37] [PASSED] drm_test_buddy_alloc_contiguous [23:39:37] [PASSED] drm_test_buddy_alloc_clear [23:39:37] [PASSED] drm_test_buddy_alloc_range_bias [23:39:37] ==================== [PASSED] drm_buddy ==================== [23:39:37] ============= drm_cmdline_parser (40 subtests) ============= [23:39:37] [PASSED] drm_test_cmdline_force_d_only [23:39:37] [PASSED] drm_test_cmdline_force_D_only_dvi [23:39:37] [PASSED] drm_test_cmdline_force_D_only_hdmi [23:39:37] [PASSED] drm_test_cmdline_force_D_only_not_digital [23:39:37] [PASSED] drm_test_cmdline_force_e_only [23:39:37] [PASSED] drm_test_cmdline_res [23:39:37] [PASSED] drm_test_cmdline_res_vesa [23:39:37] [PASSED] drm_test_cmdline_res_vesa_rblank [23:39:37] [PASSED] drm_test_cmdline_res_rblank [23:39:37] [PASSED] drm_test_cmdline_res_bpp [23:39:37] [PASSED] drm_test_cmdline_res_refresh [23:39:37] [PASSED] drm_test_cmdline_res_bpp_refresh [23:39:37] [PASSED] drm_test_cmdline_res_bpp_refresh_interlaced [23:39:37] [PASSED] drm_test_cmdline_res_bpp_refresh_margins [23:39:37] [PASSED] drm_test_cmdline_res_bpp_refresh_force_off [23:39:37] [PASSED] drm_test_cmdline_res_bpp_refresh_force_on [23:39:37] [PASSED] drm_test_cmdline_res_bpp_refresh_force_on_analog [23:39:37] [PASSED] drm_test_cmdline_res_bpp_refresh_force_on_digital [23:39:37] [PASSED] drm_test_cmdline_res_bpp_refresh_interlaced_margins_force_on [23:39:37] [PASSED] drm_test_cmdline_res_margins_force_on [23:39:37] [PASSED] drm_test_cmdline_res_vesa_margins [23:39:37] [PASSED] drm_test_cmdline_name [23:39:37] [PASSED] drm_test_cmdline_name_bpp [23:39:37] [PASSED] drm_test_cmdline_name_option [23:39:37] [PASSED] drm_test_cmdline_name_bpp_option [23:39:37] [PASSED] drm_test_cmdline_rotate_0 [23:39:37] [PASSED] drm_test_cmdline_rotate_90 [23:39:37] [PASSED] drm_test_cmdline_rotate_180 [23:39:37] [PASSED] drm_test_cmdline_rotate_270 [23:39:37] [PASSED] drm_test_cmdline_hmirror [23:39:37] [PASSED] drm_test_cmdline_vmirror [23:39:37] [PASSED] drm_test_cmdline_margin_options [23:39:37] [PASSED] drm_test_cmdline_multiple_options [23:39:37] [PASSED] drm_test_cmdline_bpp_extra_and_option [23:39:37] [PASSED] drm_test_cmdline_extra_and_option [23:39:37] [PASSED] drm_test_cmdline_freestanding_options [23:39:37] [PASSED] drm_test_cmdline_freestanding_force_e_and_options [23:39:37] [PASSED] drm_test_cmdline_panel_orientation [23:39:37] ================ drm_test_cmdline_invalid ================= [23:39:37] [PASSED] margin_only [23:39:37] [PASSED] interlace_only [23:39:37] [PASSED] res_missing_x [23:39:37] [PASSED] res_missing_y [23:39:37] [PASSED] res_bad_y [23:39:37] [PASSED] res_missing_y_bpp [23:39:37] [PASSED] res_bad_bpp [23:39:37] [PASSED] res_bad_refresh [23:39:37] [PASSED] res_bpp_refresh_force_on_off [23:39:37] [PASSED] res_invalid_mode [23:39:37] [PASSED] res_bpp_wrong_place_mode [23:39:37] [PASSED] name_bpp_refresh [23:39:37] [PASSED] name_refresh [23:39:37] [PASSED] name_refresh_wrong_mode [23:39:37] [PASSED] name_refresh_invalid_mode [23:39:37] [PASSED] rotate_multiple [23:39:37] [PASSED] rotate_invalid_val [23:39:37] [PASSED] rotate_truncated [23:39:37] [PASSED] invalid_option [23:39:37] [PASSED] invalid_tv_option [23:39:37] [PASSED] truncated_tv_option [23:39:37] ============ [PASSED] drm_test_cmdline_invalid ============= [23:39:37] =============== drm_test_cmdline_tv_options =============== [23:39:37] [PASSED] NTSC [23:39:37] [PASSED] NTSC_443 [23:39:37] [PASSED] NTSC_J [23:39:37] [PASSED] PAL [23:39:37] [PASSED] PAL_M [23:39:37] [PASSED] PAL_N [23:39:37] [PASSED] SECAM [23:39:37] [PASSED] MONO_525 [23:39:37] [PASSED] MONO_625 [23:39:37] =========== [PASSED] drm_test_cmdline_tv_options =========== [23:39:37] =============== [PASSED] drm_cmdline_parser ================ [23:39:37] ========== drmm_connector_hdmi_init (20 subtests) ========== [23:39:37] [PASSED] drm_test_connector_hdmi_init_valid [23:39:37] [PASSED] drm_test_connector_hdmi_init_bpc_8 [23:39:37] [PASSED] drm_test_connector_hdmi_init_bpc_10 [23:39:37] [PASSED] drm_test_connector_hdmi_init_bpc_12 [23:39:37] [PASSED] drm_test_connector_hdmi_init_bpc_invalid [23:39:37] [PASSED] drm_test_connector_hdmi_init_bpc_null [23:39:37] [PASSED] drm_test_connector_hdmi_init_formats_empty [23:39:37] [PASSED] drm_test_connector_hdmi_init_formats_no_rgb [23:39:37] === drm_test_connector_hdmi_init_formats_yuv420_allowed === [23:39:37] [PASSED] supported_formats=0x9 yuv420_allowed=1 [23:39:37] [PASSED] supported_formats=0x9 yuv420_allowed=0 [23:39:37] [PASSED] supported_formats=0x3 yuv420_allowed=1 [23:39:37] [PASSED] supported_formats=0x3 yuv420_allowed=0 [23:39:37] === [PASSED] drm_test_connector_hdmi_init_formats_yuv420_allowed === [23:39:37] [PASSED] drm_test_connector_hdmi_init_null_ddc [23:39:37] [PASSED] drm_test_connector_hdmi_init_null_product [23:39:37] [PASSED] drm_test_connector_hdmi_init_null_vendor [23:39:37] [PASSED] drm_test_connector_hdmi_init_product_length_exact [23:39:37] [PASSED] drm_test_connector_hdmi_init_product_length_too_long [23:39:37] [PASSED] drm_test_connector_hdmi_init_product_valid [23:39:37] [PASSED] drm_test_connector_hdmi_init_vendor_length_exact [23:39:37] [PASSED] drm_test_connector_hdmi_init_vendor_length_too_long [23:39:37] [PASSED] drm_test_connector_hdmi_init_vendor_valid [23:39:37] ========= drm_test_connector_hdmi_init_type_valid ========= [23:39:37] [PASSED] HDMI-A [23:39:37] [PASSED] HDMI-B [23:39:37] ===== [PASSED] drm_test_connector_hdmi_init_type_valid ===== [23:39:37] ======== drm_test_connector_hdmi_init_type_invalid ======== [23:39:37] [PASSED] Unknown [23:39:37] [PASSED] VGA [23:39:37] [PASSED] DVI-I [23:39:37] [PASSED] DVI-D [23:39:37] [PASSED] DVI-A [23:39:37] [PASSED] Composite [23:39:37] [PASSED] SVIDEO [23:39:37] [PASSED] LVDS [23:39:37] [PASSED] Component [23:39:37] [PASSED] DIN [23:39:37] [PASSED] DP [23:39:37] [PASSED] TV [23:39:37] [PASSED] eDP [23:39:37] [PASSED] Virtual [23:39:37] [PASSED] DSI [23:39:37] [PASSED] DPI [23:39:37] [PASSED] Writeback [23:39:37] [PASSED] SPI [23:39:37] [PASSED] USB [23:39:37] ==== [PASSED] drm_test_connector_hdmi_init_type_invalid ==== [23:39:37] ============ [PASSED] drmm_connector_hdmi_init ============= [23:39:37] ============= drmm_connector_init (3 subtests) ============= [23:39:37] [PASSED] drm_test_drmm_connector_init [23:39:37] [PASSED] drm_test_drmm_connector_init_null_ddc [23:39:37] ========= drm_test_drmm_connector_init_type_valid ========= [23:39:37] [PASSED] Unknown [23:39:37] [PASSED] VGA [23:39:37] [PASSED] DVI-I [23:39:37] [PASSED] DVI-D [23:39:37] [PASSED] DVI-A [23:39:37] [PASSED] Composite [23:39:37] [PASSED] SVIDEO [23:39:37] [PASSED] LVDS [23:39:37] [PASSED] Component [23:39:37] [PASSED] DIN [23:39:37] [PASSED] DP [23:39:37] [PASSED] HDMI-A [23:39:37] [PASSED] HDMI-B [23:39:37] [PASSED] TV [23:39:37] [PASSED] eDP [23:39:37] [PASSED] Virtual [23:39:37] [PASSED] DSI [23:39:37] [PASSED] DPI [23:39:37] [PASSED] Writeback [23:39:37] [PASSED] SPI [23:39:37] [PASSED] USB [23:39:37] ===== [PASSED] drm_test_drmm_connector_init_type_valid ===== [23:39:37] =============== [PASSED] drmm_connector_init =============== [23:39:37] ========= drm_connector_dynamic_init (6 subtests) ========== [23:39:37] [PASSED] drm_test_drm_connector_dynamic_init [23:39:37] [PASSED] drm_test_drm_connector_dynamic_init_null_ddc [23:39:37] [PASSED] drm_test_drm_connector_dynamic_init_not_added [23:39:37] [PASSED] drm_test_drm_connector_dynamic_init_properties [23:39:37] ===== drm_test_drm_connector_dynamic_init_type_valid ====== [23:39:37] [PASSED] Unknown [23:39:37] [PASSED] VGA [23:39:37] [PASSED] DVI-I [23:39:37] [PASSED] DVI-D [23:39:37] [PASSED] DVI-A [23:39:37] [PASSED] Composite [23:39:37] [PASSED] SVIDEO [23:39:37] [PASSED] LVDS [23:39:37] [PASSED] Component [23:39:37] [PASSED] DIN [23:39:37] [PASSED] DP [23:39:37] [PASSED] HDMI-A [23:39:37] [PASSED] HDMI-B [23:39:37] [PASSED] TV [23:39:37] [PASSED] eDP [23:39:37] [PASSED] Virtual [23:39:37] [PASSED] DSI [23:39:37] [PASSED] DPI [23:39:37] [PASSED] Writeback [23:39:37] [PASSED] SPI [23:39:37] [PASSED] USB [23:39:37] = [PASSED] drm_test_drm_connector_dynamic_init_type_valid == [23:39:37] ======== drm_test_drm_connector_dynamic_init_name ========= [23:39:37] [PASSED] Unknown [23:39:37] [PASSED] VGA [23:39:37] [PASSED] DVI-I [23:39:37] [PASSED] DVI-D [23:39:37] [PASSED] DVI-A [23:39:37] [PASSED] Composite [23:39:37] [PASSED] SVIDEO [23:39:37] [PASSED] LVDS [23:39:37] [PASSED] Component [23:39:37] [PASSED] DIN [23:39:37] [PASSED] DP [23:39:37] [PASSED] HDMI-A [23:39:37] [PASSED] HDMI-B [23:39:37] [PASSED] TV [23:39:37] [PASSED] eDP [23:39:37] [PASSED] Virtual [23:39:37] [PASSED] DSI [23:39:37] [PASSED] DPI [23:39:37] [PASSED] Writeback [23:39:37] [PASSED] SPI [23:39:37] [PASSED] USB [23:39:37] ==== [PASSED] drm_test_drm_connector_dynamic_init_name ===== [23:39:37] =========== [PASSED] drm_connector_dynamic_init ============ [23:39:37] ==== drm_connector_dynamic_register_early (4 subtests) ===== [23:39:37] [PASSED] drm_test_drm_connector_dynamic_register_early_on_list [23:39:37] [PASSED] drm_test_drm_connector_dynamic_register_early_defer [23:39:37] [PASSED] drm_test_drm_connector_dynamic_register_early_no_init [23:39:37] [PASSED] drm_test_drm_connector_dynamic_register_early_no_mode_object [23:39:37] ====== [PASSED] drm_connector_dynamic_register_early ======= [23:39:37] ======= drm_connector_dynamic_register (7 subtests) ======== [23:39:37] [PASSED] drm_test_drm_connector_dynamic_register_on_list [23:39:37] [PASSED] drm_test_drm_connector_dynamic_register_no_defer [23:39:37] [PASSED] drm_test_drm_connector_dynamic_register_no_init [23:39:37] [PASSED] drm_test_drm_connector_dynamic_register_mode_object [23:39:37] [PASSED] drm_test_drm_connector_dynamic_register_sysfs [23:39:37] [PASSED] drm_test_drm_connector_dynamic_register_sysfs_name [23:39:37] [PASSED] drm_test_drm_connector_dynamic_register_debugfs [23:39:37] ========= [PASSED] drm_connector_dynamic_register ========== [23:39:37] = drm_connector_attach_broadcast_rgb_property (2 subtests) = [23:39:37] [PASSED] drm_test_drm_connector_attach_broadcast_rgb_property [23:39:37] [PASSED] drm_test_drm_connector_attach_broadcast_rgb_property_hdmi_connector [23:39:37] === [PASSED] drm_connector_attach_broadcast_rgb_property === [23:39:37] ========== drm_get_tv_mode_from_name (2 subtests) ========== [23:39:37] ========== drm_test_get_tv_mode_from_name_valid =========== [23:39:37] [PASSED] NTSC [23:39:37] [PASSED] NTSC-443 [23:39:37] [PASSED] NTSC-J [23:39:37] [PASSED] PAL [23:39:37] [PASSED] PAL-M [23:39:37] [PASSED] PAL-N [23:39:37] [PASSED] SECAM [23:39:37] [PASSED] Mono [23:39:37] ====== [PASSED] drm_test_get_tv_mode_from_name_valid ======= [23:39:37] [PASSED] drm_test_get_tv_mode_from_name_truncated [23:39:37] ============ [PASSED] drm_get_tv_mode_from_name ============ [23:39:37] = drm_test_connector_hdmi_compute_mode_clock (12 subtests) = [23:39:37] [PASSED] drm_test_drm_hdmi_compute_mode_clock_rgb [23:39:37] [PASSED] drm_test_drm_hdmi_compute_mode_clock_rgb_10bpc [23:39:37] [PASSED] drm_test_drm_hdmi_compute_mode_clock_rgb_10bpc_vic_1 [23:39:37] [PASSED] drm_test_drm_hdmi_compute_mode_clock_rgb_12bpc [23:39:37] [PASSED] drm_test_drm_hdmi_compute_mode_clock_rgb_12bpc_vic_1 [23:39:37] [PASSED] drm_test_drm_hdmi_compute_mode_clock_rgb_double [23:39:37] = drm_test_connector_hdmi_compute_mode_clock_yuv420_valid = [23:39:37] [PASSED] VIC 96 [23:39:37] [PASSED] VIC 97 [23:39:37] [PASSED] VIC 101 [23:39:37] [PASSED] VIC 102 [23:39:37] [PASSED] VIC 106 [23:39:37] [PASSED] VIC 107 [23:39:37] === [PASSED] drm_test_connector_hdmi_compute_mode_clock_yuv420_valid === [23:39:37] [PASSED] drm_test_connector_hdmi_compute_mode_clock_yuv420_10_bpc [23:39:37] [PASSED] drm_test_connector_hdmi_compute_mode_clock_yuv420_12_bpc [23:39:37] [PASSED] drm_test_connector_hdmi_compute_mode_clock_yuv422_8_bpc [23:39:37] [PASSED] drm_test_connector_hdmi_compute_mode_clock_yuv422_10_bpc [23:39:37] [PASSED] drm_test_connector_hdmi_compute_mode_clock_yuv422_12_bpc [23:39:37] === [PASSED] drm_test_connector_hdmi_compute_mode_clock ==== [23:39:37] == drm_hdmi_connector_get_broadcast_rgb_name (2 subtests) == [23:39:37] === drm_test_drm_hdmi_connector_get_broadcast_rgb_name ==== [23:39:37] [PASSED] Automatic [23:39:37] [PASSED] Full [23:39:37] [PASSED] Limited 16:235 [23:39:37] === [PASSED] drm_test_drm_hdmi_connector_get_broadcast_rgb_name === [23:39:37] [PASSED] drm_test_drm_hdmi_connector_get_broadcast_rgb_name_invalid [23:39:37] ==== [PASSED] drm_hdmi_connector_get_broadcast_rgb_name ==== [23:39:37] == drm_hdmi_connector_get_output_format_name (2 subtests) == [23:39:37] === drm_test_drm_hdmi_connector_get_output_format_name ==== [23:39:37] [PASSED] RGB [23:39:37] [PASSED] YUV 4:2:0 [23:39:37] [PASSED] YUV 4:2:2 [23:39:37] [PASSED] YUV 4:4:4 [23:39:37] === [PASSED] drm_test_drm_hdmi_connector_get_output_format_name === [23:39:37] [PASSED] drm_test_drm_hdmi_connector_get_output_format_name_invalid [23:39:37] ==== [PASSED] drm_hdmi_connector_get_output_format_name ==== [23:39:37] ============= drm_damage_helper (21 subtests) ============== [23:39:37] [PASSED] drm_test_damage_iter_no_damage [23:39:37] [PASSED] drm_test_damage_iter_no_damage_fractional_src [23:39:37] [PASSED] drm_test_damage_iter_no_damage_src_moved [23:39:37] [PASSED] drm_test_damage_iter_no_damage_fractional_src_moved [23:39:37] [PASSED] drm_test_damage_iter_no_damage_not_visible [23:39:37] [PASSED] drm_test_damage_iter_no_damage_no_crtc [23:39:37] [PASSED] drm_test_damage_iter_no_damage_no_fb [23:39:37] [PASSED] drm_test_damage_iter_simple_damage [23:39:37] [PASSED] drm_test_damage_iter_single_damage [23:39:37] [PASSED] drm_test_damage_iter_single_damage_intersect_src [23:39:37] [PASSED] drm_test_damage_iter_single_damage_outside_src [23:39:37] [PASSED] drm_test_damage_iter_single_damage_fractional_src [23:39:37] [PASSED] drm_test_damage_iter_single_damage_intersect_fractional_src [23:39:37] [PASSED] drm_test_damage_iter_single_damage_outside_fractional_src [23:39:37] [PASSED] drm_test_damage_iter_single_damage_src_moved [23:39:37] [PASSED] drm_test_damage_iter_single_damage_fractional_src_moved [23:39:37] [PASSED] drm_test_damage_iter_damage [23:39:37] [PASSED] drm_test_damage_iter_damage_one_intersect [23:39:37] [PASSED] drm_test_damage_iter_damage_one_outside [23:39:37] [PASSED] drm_test_damage_iter_damage_src_moved [23:39:37] [PASSED] drm_test_damage_iter_damage_not_visible [23:39:37] ================ [PASSED] drm_damage_helper ================ [23:39:37] ============== drm_dp_mst_helper (3 subtests) ============== [23:39:37] ============== drm_test_dp_mst_calc_pbn_mode ============== [23:39:37] [PASSED] Clock 154000 BPP 30 DSC disabled [23:39:37] [PASSED] Clock 234000 BPP 30 DSC disabled [23:39:37] [PASSED] Clock 297000 BPP 24 DSC disabled [23:39:37] [PASSED] Clock 332880 BPP 24 DSC enabled [23:39:37] [PASSED] Clock 324540 BPP 24 DSC enabled [23:39:37] ========== [PASSED] drm_test_dp_mst_calc_pbn_mode ========== [23:39:37] ============== drm_test_dp_mst_calc_pbn_div =============== [23:39:37] [PASSED] Link rate 2000000 lane count 4 [23:39:37] [PASSED] Link rate 2000000 lane count 2 [23:39:37] [PASSED] Link rate 2000000 lane count 1 [23:39:37] [PASSED] Link rate 1350000 lane count 4 [23:39:37] [PASSED] Link rate 1350000 lane count 2 [23:39:37] [PASSED] Link rate 1350000 lane count 1 [23:39:37] [PASSED] Link rate 1000000 lane count 4 [23:39:37] [PASSED] Link rate 1000000 lane count 2 [23:39:37] [PASSED] Link rate 1000000 lane count 1 [23:39:37] [PASSED] Link rate 810000 lane count 4 [23:39:37] [PASSED] Link rate 810000 lane count 2 [23:39:37] [PASSED] Link rate 810000 lane count 1 [23:39:37] [PASSED] Link rate 540000 lane count 4 [23:39:37] [PASSED] Link rate 540000 lane count 2 [23:39:37] [PASSED] Link rate 540000 lane count 1 [23:39:37] [PASSED] Link rate 270000 lane count 4 [23:39:37] [PASSED] Link rate 270000 lane count 2 [23:39:37] [PASSED] Link rate 270000 lane count 1 [23:39:37] [PASSED] Link rate 162000 lane count 4 [23:39:37] [PASSED] Link rate 162000 lane count 2 [23:39:37] [PASSED] Link rate 162000 lane count 1 [23:39:37] ========== [PASSED] drm_test_dp_mst_calc_pbn_div =========== [23:39:37] ========= drm_test_dp_mst_sideband_msg_req_decode ========= [23:39:37] [PASSED] DP_ENUM_PATH_RESOURCES with port number [23:39:37] [PASSED] DP_POWER_UP_PHY with port number [23:39:37] [PASSED] DP_POWER_DOWN_PHY with port number [23:39:37] [PASSED] DP_ALLOCATE_PAYLOAD with SDP stream sinks [23:39:37] [PASSED] DP_ALLOCATE_PAYLOAD with port number [23:39:37] [PASSED] DP_ALLOCATE_PAYLOAD with VCPI [23:39:37] [PASSED] DP_ALLOCATE_PAYLOAD with PBN [23:39:37] [PASSED] DP_QUERY_PAYLOAD with port number [23:39:37] [PASSED] DP_QUERY_PAYLOAD with VCPI [23:39:37] [PASSED] DP_REMOTE_DPCD_READ with port number [23:39:37] [PASSED] DP_REMOTE_DPCD_READ with DPCD address [23:39:37] [PASSED] DP_REMOTE_DPCD_READ with max number of bytes [23:39:37] [PASSED] DP_REMOTE_DPCD_WRITE with port number [23:39:37] [PASSED] DP_REMOTE_DPCD_WRITE with DPCD address [23:39:37] [PASSED] DP_REMOTE_DPCD_WRITE with data array [23:39:37] [PASSED] DP_REMOTE_I2C_READ with port number [23:39:37] [PASSED] DP_REMOTE_I2C_READ with I2C device ID [23:39:37] [PASSED] DP_REMOTE_I2C_READ with transactions array [23:39:37] [PASSED] DP_REMOTE_I2C_WRITE with port number [23:39:37] [PASSED] DP_REMOTE_I2C_WRITE with I2C device ID [23:39:37] [PASSED] DP_REMOTE_I2C_WRITE with data array [23:39:37] [PASSED] DP_QUERY_STREAM_ENC_STATUS with stream ID [23:39:37] [PASSED] DP_QUERY_STREAM_ENC_STATUS with client ID [23:39:37] [PASSED] DP_QUERY_STREAM_ENC_STATUS with stream event [23:39:37] [PASSED] DP_QUERY_STREAM_ENC_STATUS with valid stream event [23:39:37] [PASSED] DP_QUERY_STREAM_ENC_STATUS with stream behavior [23:39:37] [PASSED] DP_QUERY_STREAM_ENC_STATUS with a valid stream behavior [23:39:37] ===== [PASSED] drm_test_dp_mst_sideband_msg_req_decode ===== [23:39:37] ================ [PASSED] drm_dp_mst_helper ================ [23:39:37] ================== drm_exec (7 subtests) =================== [23:39:37] [PASSED] sanitycheck [23:39:37] [PASSED] test_lock [23:39:37] [PASSED] test_lock_unlock [23:39:37] [PASSED] test_duplicates [23:39:37] [PASSED] test_prepare [23:39:37] [PASSED] test_prepare_array [23:39:37] [PASSED] test_multiple_loops [23:39:37] ==================== [PASSED] drm_exec ===================== [23:39:37] =========== drm_format_helper_test (18 subtests) =========== [23:39:37] ============== drm_test_fb_xrgb8888_to_gray8 ============== [23:39:37] [PASSED] single_pixel_source_buffer [23:39:37] [PASSED] single_pixel_clip_rectangle [23:39:37] [PASSED] well_known_colors [23:39:37] [PASSED] destination_pitch [23:39:37] ========== [PASSED] drm_test_fb_xrgb8888_to_gray8 ========== [23:39:37] ============= drm_test_fb_xrgb8888_to_rgb332 ============== [23:39:37] [PASSED] single_pixel_source_buffer [23:39:37] [PASSED] single_pixel_clip_rectangle [23:39:37] [PASSED] well_known_colors [23:39:37] [PASSED] destination_pitch [23:39:37] ========= [PASSED] drm_test_fb_xrgb8888_to_rgb332 ========== [23:39:37] ============= drm_test_fb_xrgb8888_to_rgb565 ============== [23:39:37] [PASSED] single_pixel_source_buffer [23:39:37] [PASSED] single_pixel_clip_rectangle [23:39:37] [PASSED] well_known_colors [23:39:37] [PASSED] destination_pitch [23:39:37] ========= [PASSED] drm_test_fb_xrgb8888_to_rgb565 ========== [23:39:37] ============ drm_test_fb_xrgb8888_to_xrgb1555 ============= [23:39:37] [PASSED] single_pixel_source_buffer [23:39:37] [PASSED] single_pixel_clip_rectangle [23:39:37] [PASSED] well_known_colors [23:39:37] [PASSED] destination_pitch [23:39:37] ======== [PASSED] drm_test_fb_xrgb8888_to_xrgb1555 ========= [23:39:37] ============ drm_test_fb_xrgb8888_to_argb1555 ============= [23:39:37] [PASSED] single_pixel_source_buffer [23:39:37] [PASSED] single_pixel_clip_rectangle [23:39:37] [PASSED] well_known_colors [23:39:37] [PASSED] destination_pitch [23:39:37] ======== [PASSED] drm_test_fb_xrgb8888_to_argb1555 ========= [23:39:37] ============ drm_test_fb_xrgb8888_to_rgba5551 ============= [23:39:37] [PASSED] single_pixel_source_buffer [23:39:37] [PASSED] single_pixel_clip_rectangle [23:39:37] [PASSED] well_known_colors [23:39:37] [PASSED] destination_pitch [23:39:37] ======== [PASSED] drm_test_fb_xrgb8888_to_rgba5551 ========= [23:39:37] ============= drm_test_fb_xrgb8888_to_rgb888 ============== [23:39:37] [PASSED] single_pixel_source_buffer [23:39:37] [PASSED] single_pixel_clip_rectangle [23:39:37] [PASSED] well_known_colors [23:39:37] [PASSED] destination_pitch [23:39:37] ========= [PASSED] drm_test_fb_xrgb8888_to_rgb888 ========== [23:39:37] ============= drm_test_fb_xrgb8888_to_bgr888 ============== [23:39:37] [PASSED] single_pixel_source_buffer [23:39:37] [PASSED] single_pixel_clip_rectangle [23:39:37] [PASSED] well_known_colors [23:39:37] [PASSED] destination_pitch [23:39:37] ========= [PASSED] drm_test_fb_xrgb8888_to_bgr888 ========== [23:39:37] ============ drm_test_fb_xrgb8888_to_argb8888 ============= [23:39:37] [PASSED] single_pixel_source_buffer [23:39:37] [PASSED] single_pixel_clip_rectangle [23:39:37] [PASSED] well_known_colors [23:39:37] [PASSED] destination_pitch [23:39:37] ======== [PASSED] drm_test_fb_xrgb8888_to_argb8888 ========= [23:39:37] =========== drm_test_fb_xrgb8888_to_xrgb2101010 =========== [23:39:37] [PASSED] single_pixel_source_buffer [23:39:37] [PASSED] single_pixel_clip_rectangle [23:39:37] [PASSED] well_known_colors [23:39:37] [PASSED] destination_pitch [23:39:37] ======= [PASSED] drm_test_fb_xrgb8888_to_xrgb2101010 ======= [23:39:37] =========== drm_test_fb_xrgb8888_to_argb2101010 =========== [23:39:37] [PASSED] single_pixel_source_buffer [23:39:37] [PASSED] single_pixel_clip_rectangle [23:39:37] [PASSED] well_known_colors [23:39:37] [PASSED] destination_pitch [23:39:37] ======= [PASSED] drm_test_fb_xrgb8888_to_argb2101010 ======= [23:39:37] ============== drm_test_fb_xrgb8888_to_mono =============== [23:39:37] [PASSED] single_pixel_source_buffer [23:39:37] [PASSED] single_pixel_clip_rectangle [23:39:37] [PASSED] well_known_colors [23:39:37] [PASSED] destination_pitch [23:39:37] ========== [PASSED] drm_test_fb_xrgb8888_to_mono =========== [23:39:37] ==================== drm_test_fb_swab ===================== [23:39:37] [PASSED] single_pixel_source_buffer [23:39:37] [PASSED] single_pixel_clip_rectangle [23:39:37] [PASSED] well_known_colors [23:39:37] [PASSED] destination_pitch [23:39:37] ================ [PASSED] drm_test_fb_swab ================= [23:39:37] ============ drm_test_fb_xrgb8888_to_xbgr8888 ============= [23:39:37] [PASSED] single_pixel_source_buffer [23:39:37] [PASSED] single_pixel_clip_rectangle [23:39:37] [PASSED] well_known_colors [23:39:37] [PASSED] destination_pitch [23:39:37] ======== [PASSED] drm_test_fb_xrgb8888_to_xbgr8888 ========= [23:39:37] ============ drm_test_fb_xrgb8888_to_abgr8888 ============= [23:39:37] [PASSED] single_pixel_source_buffer [23:39:37] [PASSED] single_pixel_clip_rectangle [23:39:37] [PASSED] well_known_colors [23:39:37] [PASSED] destination_pitch [23:39:37] ======== [PASSED] drm_test_fb_xrgb8888_to_abgr8888 ========= [23:39:37] ================= drm_test_fb_clip_offset ================= [23:39:37] [PASSED] pass through [23:39:37] [PASSED] horizontal offset [23:39:37] [PASSED] vertical offset [23:39:37] [PASSED] horizontal and vertical offset [23:39:37] [PASSED] horizontal offset (custom pitch) [23:39:37] [PASSED] vertical offset (custom pitch) [23:39:37] [PASSED] horizontal and vertical offset (custom pitch) [23:39:37] ============= [PASSED] drm_test_fb_clip_offset ============= [23:39:37] ============== drm_test_fb_build_fourcc_list ============== [23:39:37] [PASSED] no native formats [23:39:37] [PASSED] XRGB8888 as native format [23:39:37] [PASSED] remove duplicates [23:39:37] [PASSED] convert alpha formats [23:39:37] [PASSED] random formats [23:39:37] ========== [PASSED] drm_test_fb_build_fourcc_list ========== [23:39:37] =================== drm_test_fb_memcpy ==================== [23:39:37] [PASSED] single_pixel_source_buffer: XR24 little-endian (0x34325258) [23:39:37] [PASSED] single_pixel_source_buffer: XRA8 little-endian (0x38415258) [23:39:37] [PASSED] single_pixel_source_buffer: YU24 little-endian (0x34325559) [23:39:37] [PASSED] single_pixel_clip_rectangle: XB24 little-endian (0x34324258) [23:39:37] [PASSED] single_pixel_clip_rectangle: XRA8 little-endian (0x38415258) [23:39:37] [PASSED] single_pixel_clip_rectangle: YU24 little-endian (0x34325559) [23:39:37] [PASSED] well_known_colors: XB24 little-endian (0x34324258) [23:39:37] [PASSED] well_known_colors: XRA8 little-endian (0x38415258) [23:39:37] [PASSED] well_known_colors: YU24 little-endian (0x34325559) [23:39:37] [PASSED] destination_pitch: XB24 little-endian (0x34324258) [23:39:37] [PASSED] destination_pitch: XRA8 little-endian (0x38415258) [23:39:37] [PASSED] destination_pitch: YU24 little-endian (0x34325559) [23:39:37] =============== [PASSED] drm_test_fb_memcpy ================ [23:39:37] ============= [PASSED] drm_format_helper_test ============== [23:39:37] ================= drm_format (18 subtests) ================= [23:39:37] [PASSED] drm_test_format_block_width_invalid [23:39:37] [PASSED] drm_test_format_block_width_one_plane [23:39:37] [PASSED] drm_test_format_block_width_two_plane [23:39:37] [PASSED] drm_test_format_block_width_three_plane [23:39:37] [PASSED] drm_test_format_block_width_tiled [23:39:37] [PASSED] drm_test_format_block_height_invalid [23:39:37] [PASSED] drm_test_format_block_height_one_plane [23:39:37] [PASSED] drm_test_format_block_height_two_plane [23:39:37] [PASSED] drm_test_format_block_height_three_plane [23:39:37] [PASSED] drm_test_format_block_height_tiled [23:39:37] [PASSED] drm_test_format_min_pitch_invalid [23:39:37] [PASSED] drm_test_format_min_pitch_one_plane_8bpp [23:39:37] [PASSED] drm_test_format_min_pitch_one_plane_16bpp [23:39:37] [PASSED] drm_test_format_min_pitch_one_plane_24bpp [23:39:37] [PASSED] drm_test_format_min_pitch_one_plane_32bpp [23:39:37] [PASSED] drm_test_format_min_pitch_two_plane [23:39:37] [PASSED] drm_test_format_min_pitch_three_plane_8bpp [23:39:37] [PASSED] drm_test_format_min_pitch_tiled [23:39:37] =================== [PASSED] drm_format ==================== [23:39:37] ============== drm_framebuffer (10 subtests) =============== [23:39:37] ========== drm_test_framebuffer_check_src_coords ========== [23:39:37] [PASSED] Success: source fits into fb [23:39:37] [PASSED] Fail: overflowing fb with x-axis coordinate [23:39:37] [PASSED] Fail: overflowing fb with y-axis coordinate [23:39:37] [PASSED] Fail: overflowing fb with source width [23:39:37] [PASSED] Fail: overflowing fb with source height [23:39:37] ====== [PASSED] drm_test_framebuffer_check_src_coords ====== [23:39:37] [PASSED] drm_test_framebuffer_cleanup [23:39:37] =============== drm_test_framebuffer_create =============== [23:39:37] [PASSED] ABGR8888 normal sizes [23:39:37] [PASSED] ABGR8888 max sizes [23:39:37] [PASSED] ABGR8888 pitch greater than min required [23:39:37] [PASSED] ABGR8888 pitch less than min required [23:39:37] [PASSED] ABGR8888 Invalid width [23:39:37] [PASSED] ABGR8888 Invalid buffer handle [23:39:37] [PASSED] No pixel format [23:39:37] [PASSED] ABGR8888 Width 0 [23:39:37] [PASSED] ABGR8888 Height 0 [23:39:37] [PASSED] ABGR8888 Out of bound height * pitch combination [23:39:37] [PASSED] ABGR8888 Large buffer offset [23:39:37] [PASSED] ABGR8888 Buffer offset for inexistent plane [23:39:37] [PASSED] ABGR8888 Invalid flag [23:39:37] [PASSED] ABGR8888 Set DRM_MODE_FB_MODIFIERS without modifiers [23:39:37] [PASSED] ABGR8888 Valid buffer modifier [23:39:37] [PASSED] ABGR8888 Invalid buffer modifier(DRM_FORMAT_MOD_SAMSUNG_64_32_TILE) [23:39:37] [PASSED] ABGR8888 Extra pitches without DRM_MODE_FB_MODIFIERS [23:39:37] [PASSED] ABGR8888 Extra pitches with DRM_MODE_FB_MODIFIERS [23:39:37] [PASSED] NV12 Normal sizes [23:39:37] [PASSED] NV12 Max sizes [23:39:37] [PASSED] NV12 Invalid pitch [23:39:37] [PASSED] NV12 Invalid modifier/missing DRM_MODE_FB_MODIFIERS flag [23:39:37] [PASSED] NV12 different modifier per-plane [23:39:37] [PASSED] NV12 with DRM_FORMAT_MOD_SAMSUNG_64_32_TILE [23:39:37] [PASSED] NV12 Valid modifiers without DRM_MODE_FB_MODIFIERS [23:39:37] [PASSED] NV12 Modifier for inexistent plane [23:39:37] [PASSED] NV12 Handle for inexistent plane [23:39:37] [PASSED] NV12 Handle for inexistent plane without DRM_MODE_FB_MODIFIERS [23:39:37] [PASSED] YVU420 DRM_MODE_FB_MODIFIERS set without modifier [23:39:37] [PASSED] YVU420 Normal sizes [23:39:37] [PASSED] YVU420 Max sizes [23:39:37] [PASSED] YVU420 Invalid pitch [23:39:37] [PASSED] YVU420 Different pitches [23:39:37] [PASSED] YVU420 Different buffer offsets/pitches [23:39:37] [PASSED] YVU420 Modifier set just for plane 0, without DRM_MODE_FB_MODIFIERS [23:39:37] [PASSED] YVU420 Modifier set just for planes 0, 1, without DRM_MODE_FB_MODIFIERS [23:39:37] [PASSED] YVU420 Modifier set just for plane 0, 1, with DRM_MODE_FB_MODIFIERS [23:39:37] [PASSED] YVU420 Valid modifier [23:39:37] [PASSED] YVU420 Different modifiers per plane [23:39:37] [PASSED] YVU420 Modifier for inexistent plane [23:39:37] [PASSED] YUV420_10BIT Invalid modifier(DRM_FORMAT_MOD_LINEAR) [23:39:37] [PASSED] X0L2 Normal sizes [23:39:37] [PASSED] X0L2 Max sizes [23:39:37] [PASSED] X0L2 Invalid pitch [23:39:37] [PASSED] X0L2 Pitch greater than minimum required [23:39:37] [PASSED] X0L2 Handle for inexistent plane [23:39:37] [PASSED] X0L2 Offset for inexistent plane, without DRM_MODE_FB_MODIFIERS set [23:39:37] [PASSED] X0L2 Modifier without DRM_MODE_FB_MODIFIERS set [23:39:37] [PASSED] X0L2 Valid modifier [23:39:37] [PASSED] X0L2 Modifier for inexistent plane [23:39:37] =========== [PASSED] drm_test_framebuffer_create =========== [23:39:37] [PASSED] drm_test_framebuffer_free [23:39:37] [PASSED] drm_test_framebuffer_init [23:39:37] [PASSED] drm_test_framebuffer_init_bad_format [23:39:37] [PASSED] drm_test_framebuffer_init_dev_mismatch [23:39:37] [PASSED] drm_test_framebuffer_lookup [23:39:37] [PASSED] drm_test_framebuffer_lookup_inexistent [23:39:37] [PASSED] drm_test_framebuffer_modifiers_not_supported [23:39:37] ================= [PASSED] drm_framebuffer ================= [23:39:37] ================ drm_gem_shmem (8 subtests) ================ [23:39:37] [PASSED] drm_gem_shmem_test_obj_create [23:39:37] [PASSED] drm_gem_shmem_test_obj_create_private [23:39:37] [PASSED] drm_gem_shmem_test_pin_pages [23:39:37] [PASSED] drm_gem_shmem_test_vmap [23:39:37] [PASSED] drm_gem_shmem_test_get_pages_sgt [23:39:37] [PASSED] drm_gem_shmem_test_get_sg_table [23:39:37] [PASSED] drm_gem_shmem_test_madvise [23:39:37] [PASSED] drm_gem_shmem_test_purge [23:39:37] ================== [PASSED] drm_gem_shmem ================== [23:39:37] === drm_atomic_helper_connector_hdmi_check (27 subtests) === [23:39:37] [PASSED] drm_test_check_broadcast_rgb_auto_cea_mode [23:39:37] [PASSED] drm_test_check_broadcast_rgb_auto_cea_mode_vic_1 [23:39:37] [PASSED] drm_test_check_broadcast_rgb_full_cea_mode [23:39:37] [PASSED] drm_test_check_broadcast_rgb_full_cea_mode_vic_1 [23:39:37] [PASSED] drm_test_check_broadcast_rgb_limited_cea_mode [23:39:37] [PASSED] drm_test_check_broadcast_rgb_limited_cea_mode_vic_1 [23:39:37] ====== drm_test_check_broadcast_rgb_cea_mode_yuv420 ======= [23:39:37] [PASSED] Automatic [23:39:37] [PASSED] Full [23:39:37] [PASSED] Limited 16:235 [23:39:37] == [PASSED] drm_test_check_broadcast_rgb_cea_mode_yuv420 === [23:39:37] [PASSED] drm_test_check_broadcast_rgb_crtc_mode_changed [23:39:37] [PASSED] drm_test_check_broadcast_rgb_crtc_mode_not_changed [23:39:37] [PASSED] drm_test_check_disable_connector [23:39:37] [PASSED] drm_test_check_hdmi_funcs_reject_rate [23:39:37] [PASSED] drm_test_check_max_tmds_rate_bpc_fallback_rgb [23:39:37] [PASSED] drm_test_check_max_tmds_rate_bpc_fallback_yuv420 [23:39:37] [PASSED] drm_test_check_max_tmds_rate_bpc_fallback_ignore_yuv422 [23:39:37] [PASSED] drm_test_check_max_tmds_rate_bpc_fallback_ignore_yuv420 [23:39:37] [PASSED] drm_test_check_driver_unsupported_fallback_yuv420 [23:39:37] [PASSED] drm_test_check_output_bpc_crtc_mode_changed [23:39:37] [PASSED] drm_test_check_output_bpc_crtc_mode_not_changed [23:39:37] [PASSED] drm_test_check_output_bpc_dvi [23:39:37] [PASSED] drm_test_check_output_bpc_format_vic_1 [23:39:37] [PASSED] drm_test_check_output_bpc_format_display_8bpc_only [23:39:37] [PASSED] drm_test_check_output_bpc_format_display_rgb_only [23:39:37] [PASSED] drm_test_check_output_bpc_format_driver_8bpc_only [23:39:37] [PASSED] drm_test_check_output_bpc_format_driver_rgb_only [23:39:37] [PASSED] drm_test_check_tmds_char_rate_rgb_8bpc [23:39:37] [PASSED] drm_test_check_tmds_char_rate_rgb_10bpc [23:39:37] [PASSED] drm_test_check_tmds_char_rate_rgb_12bpc [23:39:37] ===== [PASSED] drm_atomic_helper_connector_hdmi_check ====== [23:39:37] === drm_atomic_helper_connector_hdmi_reset (6 subtests) ==== [23:39:37] [PASSED] drm_test_check_broadcast_rgb_value [23:39:37] [PASSED] drm_test_check_bpc_8_value [23:39:37] [PASSED] drm_test_check_bpc_10_value [23:39:37] [PASSED] drm_test_check_bpc_12_value [23:39:37] [PASSED] drm_test_check_format_value [23:39:37] [PASSED] drm_test_check_tmds_char_value [23:39:37] ===== [PASSED] drm_atomic_helper_connector_hdmi_reset ====== [23:39:37] = drm_atomic_helper_connector_hdmi_mode_valid (4 subtests) = [23:39:37] [PASSED] drm_test_check_mode_valid [23:39:37] [PASSED] drm_test_check_mode_valid_reject [23:39:37] [PASSED] drm_test_check_mode_valid_reject_rate [23:39:37] [PASSED] drm_test_check_mode_valid_reject_max_clock [23:39:37] === [PASSED] drm_atomic_helper_connector_hdmi_mode_valid === [23:39:37] ================= drm_managed (2 subtests) ================= [23:39:37] [PASSED] drm_test_managed_release_action [23:39:37] [PASSED] drm_test_managed_run_action [23:39:37] =================== [PASSED] drm_managed =================== [23:39:37] =================== drm_mm (6 subtests) ==================== [23:39:37] [PASSED] drm_test_mm_init [23:39:37] [PASSED] drm_test_mm_debug [23:39:37] [PASSED] drm_test_mm_align32 [23:39:37] [PASSED] drm_test_mm_align64 [23:39:37] [PASSED] drm_test_mm_lowest [23:39:37] [PASSED] drm_test_mm_highest [23:39:37] ===================== [PASSED] drm_mm ====================== [23:39:37] ============= drm_modes_analog_tv (5 subtests) ============= [23:39:37] [PASSED] drm_test_modes_analog_tv_mono_576i [23:39:37] [PASSED] drm_test_modes_analog_tv_ntsc_480i [23:39:37] [PASSED] drm_test_modes_analog_tv_ntsc_480i_inlined [23:39:37] [PASSED] drm_test_modes_analog_tv_pal_576i [23:39:37] [PASSED] drm_test_modes_analog_tv_pal_576i_inlined [23:39:37] =============== [PASSED] drm_modes_analog_tv =============== [23:39:37] ============== drm_plane_helper (2 subtests) =============== [23:39:37] =============== drm_test_check_plane_state ================ [23:39:37] [PASSED] clipping_simple [23:39:37] [PASSED] clipping_rotate_reflect [23:39:37] [PASSED] positioning_simple [23:39:37] [PASSED] upscaling [23:39:37] [PASSED] downscaling [23:39:37] [PASSED] rounding1 [23:39:37] [PASSED] rounding2 [23:39:37] [PASSED] rounding3 [23:39:37] [PASSED] rounding4 [23:39:37] =========== [PASSED] drm_test_check_plane_state ============ [23:39:37] =========== drm_test_check_invalid_plane_state ============ [23:39:37] [PASSED] positioning_invalid [23:39:37] [PASSED] upscaling_invalid [23:39:37] [PASSED] downscaling_invalid [23:39:37] ======= [PASSED] drm_test_check_invalid_plane_state ======== [23:39:37] ================ [PASSED] drm_plane_helper ================= [23:39:37] ====== drm_connector_helper_tv_get_modes (1 subtest) ======= [23:39:37] ====== drm_test_connector_helper_tv_get_modes_check ======= [23:39:37] [PASSED] None [23:39:37] [PASSED] PAL [23:39:37] [PASSED] NTSC [23:39:37] [PASSED] Both, NTSC Default [23:39:37] [PASSED] Both, PAL Default [23:39:37] [PASSED] Both, NTSC Default, with PAL on command-line [23:39:37] [PASSED] Both, PAL Default, with NTSC on command-line [23:39:37] == [PASSED] drm_test_connector_helper_tv_get_modes_check === [23:39:37] ======== [PASSED] drm_connector_helper_tv_get_modes ======== [23:39:37] ================== drm_rect (9 subtests) =================== [23:39:37] [PASSED] drm_test_rect_clip_scaled_div_by_zero [23:39:37] [PASSED] drm_test_rect_clip_scaled_not_clipped [23:39:37] [PASSED] drm_test_rect_clip_scaled_clipped [23:39:37] [PASSED] drm_test_rect_clip_scaled_signed_vs_unsigned [23:39:37] ================= drm_test_rect_intersect ================= [23:39:37] [PASSED] top-left x bottom-right: 2x2+1+1 x 2x2+0+0 [23:39:37] [PASSED] top-right x bottom-left: 2x2+0+0 x 2x2+1-1 [23:39:37] [PASSED] bottom-left x top-right: 2x2+1-1 x 2x2+0+0 [23:39:37] [PASSED] bottom-right x top-left: 2x2+0+0 x 2x2+1+1 [23:39:37] [PASSED] right x left: 2x1+0+0 x 3x1+1+0 [23:39:37] [PASSED] left x right: 3x1+1+0 x 2x1+0+0 [23:39:37] [PASSED] up x bottom: 1x2+0+0 x 1x3+0-1 [23:39:37] [PASSED] bottom x up: 1x3+0-1 x 1x2+0+0 [23:39:37] [PASSED] touching corner: 1x1+0+0 x 2x2+1+1 [23:39:37] [PASSED] touching side: 1x1+0+0 x 1x1+1+0 [23:39:37] [PASSED] equal rects: 2x2+0+0 x 2x2+0+0 [23:39:37] [PASSED] inside another: 2x2+0+0 x 1x1+1+1 [23:39:37] [PASSED] far away: 1x1+0+0 x 1x1+3+6 [23:39:37] [PASSED] points intersecting: 0x0+5+10 x 0x0+5+10 [23:39:37] [PASSED] points not intersecting: 0x0+0+0 x 0x0+5+10 [23:39:37] ============= [PASSED] drm_test_rect_intersect ============= [23:39:37] ================ drm_test_rect_calc_hscale ================ [23:39:37] [PASSED] normal use [23:39:37] [PASSED] out of max range [23:39:37] [PASSED] out of min range [23:39:37] [PASSED] zero dst [23:39:37] [PASSED] negative src [23:39:37] [PASSED] negative dst [23:39:37] ============ [PASSED] drm_test_rect_calc_hscale ============ [23:39:37] ================ drm_test_rect_calc_vscale ================ [23:39:37] [PASSED] normal use [23:39:37] [PASSED] out of max range [23:39:37] [PASSED] out of min range [23:39:37] [PASSED] zero dst [23:39:37] [PASSED] negative src [23:39:37] [PASSED] negative dst [23:39:37] ============ [PASSED] drm_test_rect_calc_vscale ============ [23:39:37] ================== drm_test_rect_rotate =================== [23:39:37] [PASSED] reflect-x [23:39:37] [PASSED] reflect-y [23:39:37] [PASSED] rotate-0 [23:39:37] [PASSED] rotate-90 [23:39:37] [PASSED] rotate-180 stty: 'standard input': Inappropriate ioctl for device [23:39:37] [PASSED] rotate-270 [23:39:37] ============== [PASSED] drm_test_rect_rotate =============== [23:39:37] ================ drm_test_rect_rotate_inv ================= [23:39:37] [PASSED] reflect-x [23:39:37] [PASSED] reflect-y [23:39:37] [PASSED] rotate-0 [23:39:37] [PASSED] rotate-90 [23:39:37] [PASSED] rotate-180 [23:39:37] [PASSED] rotate-270 [23:39:37] ============ [PASSED] drm_test_rect_rotate_inv ============= [23:39:37] ==================== [PASSED] drm_rect ===================== [23:39:37] ============================================================ [23:39:37] Testing complete. Ran 614 tests: passed: 614 [23:39:37] Elapsed time: 22.934s total, 1.655s configuring, 21.108s building, 0.147s running + /kernel/tools/testing/kunit/kunit.py run --kunitconfig /kernel/drivers/gpu/drm/ttm/tests/.kunitconfig ERROR:root:../drivers/gpu/drm/ttm/ttm_pool.c: In function ‘ttm_pool_mgr_init’: ../drivers/gpu/drm/ttm/ttm_pool.c:1340:30: error: ‘TTM_SHRINKER_BATCH’ undeclared (first use in this function) 1340 | mm_shrinker->batch = TTM_SHRINKER_BATCH; | ^~~~~~~~~~~~~~~~~~ ../drivers/gpu/drm/ttm/ttm_pool.c:1340:30: note: each undeclared identifier is reported only once for each function it appears in make[7]: *** [../scripts/Makefile.build:203: drivers/gpu/drm/ttm/ttm_pool.o] Error 1 make[7]: *** Waiting for unfinished jobs.... make[6]: *** [../scripts/Makefile.build:461: drivers/gpu/drm/ttm] Error 2 make[5]: *** [../scripts/Makefile.build:461: drivers/gpu/drm] Error 2 make[4]: *** [../scripts/Makefile.build:461: drivers/gpu] Error 2 make[3]: *** [../scripts/Makefile.build:461: drivers] Error 2 make[2]: *** [/kernel/Makefile:2003: .] Error 2 make[1]: *** [/kernel/Makefile:248: __sub-make] Error 2 make: *** [Makefile:248: __sub-make] Error 2 [23:39:37] Configuring KUnit Kernel ... Regenerating .config ... Populating config with: $ make ARCH=um O=.kunit olddefconfig [23:39:39] Building KUnit Kernel ... Populating config with: $ make ARCH=um O=.kunit olddefconfig Building with: $ make all compile_commands.json scripts_gdb ARCH=um O=.kunit --jobs=48 + cleanup ++ stat -c %u:%g /kernel + chown -R 1003:1003 /kernel ^ permalink raw reply [flat|nested] 11+ messages in thread
end of thread, other threads:[~2025-06-27 17:35 UTC | newest] Thread overview: 11+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2025-06-03 23:34 [PATCH v3 0/2] Enhance SVM stats Matthew Brost 2025-06-03 23:34 ` [PATCH v3 1/2] drm/xe: Add clear_stats GT debugfs Matthew Brost 2025-06-27 16:24 ` Francois Dugast 2025-06-03 23:34 ` [PATCH v3 2/2] drm/xe: Add more SVM GT stats Matthew Brost 2025-06-04 10:24 ` Francois Dugast 2025-06-04 14:13 ` Matthew Brost 2025-06-27 16:29 ` Francois Dugast 2025-06-27 17:37 ` Matthew Brost 2025-06-03 23:38 ` ✓ CI.Patch_applied: success for Enhance SVM stats Patchwork 2025-06-03 23:38 ` ✗ CI.checkpatch: warning " Patchwork 2025-06-03 23:39 ` ✗ CI.KUnit: failure " Patchwork
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox