Add observability for the page defragmentation worker. Introduce three primary-GT statistics counters: defrag_added_count (BOs queued onto the defrag list after being backed at a sub-optimal page order), defrag_success_count (BOs successfully re-backed at the beneficial order) and defrag_failed_count (attempts that failed and leave the BO on its original backing). The ineligible/already-removed fast path is intentionally not counted as either success or failure.
Cc: Carlos Santa <[email protected]> Cc: Ryan Neph <[email protected]> Cc: Christian Koenig <[email protected]> Cc: Huang Rui <[email protected]> Cc: Matthew Auld <[email protected]> Cc: Maarten Lankhorst <[email protected]> Cc: Maxime Ripard <[email protected]> Cc: Thomas Zimmermann <[email protected]> Cc: David Airlie <[email protected]> Cc: Simona Vetter <[email protected]> Cc: [email protected] Cc: [email protected] Cc: Thomas Hellström <[email protected]> Assisted-by: GitHub_Copilot:claude-opus-4.8 Signed-off-by: Matthew Brost <[email protected]> --- drivers/gpu/drm/xe/xe_bo.c | 7 +++++++ drivers/gpu/drm/xe/xe_gt_stats.c | 3 +++ drivers/gpu/drm/xe/xe_gt_stats_types.h | 10 ++++++++++ 3 files changed, 20 insertions(+) diff --git a/drivers/gpu/drm/xe/xe_bo.c b/drivers/gpu/drm/xe/xe_bo.c index 097cd2ad7c1a..1612e4ece1e1 100644 --- a/drivers/gpu/drm/xe/xe_bo.c +++ b/drivers/gpu/drm/xe/xe_bo.c @@ -26,6 +26,7 @@ #include "xe_dma_buf.h" #include "xe_drm_client.h" #include "xe_ggtt.h" +#include "xe_gt_stats.h" #include "xe_map.h" #include "xe_migrate.h" #include "xe_pat.h" @@ -1042,6 +1043,8 @@ static void xe_bo_defrag_add(struct xe_bo *bo) xe->mem.defrag.interval_ms = XE_BO_DEFRAG_INTERVAL_MS; list_add_tail(&bo->defrag_link, &xe->mem.defrag.list); atomic_inc(&xe->mem.defrag.count); + xe_gt_stats_incr(xe_root_mmio_gt(xe), + XE_GT_STATS_ID_DEFRAG_ADDED_COUNT, 1); } } @@ -1136,6 +1139,10 @@ static int xe_bo_defrag_one(struct xe_device *xe, struct xe_bo *bo) xe_dbg(xe, "Defrag attempt on BO size=%lu: ret=%pe\n", xe_bo_size(bo), ERR_PTR(ret)); + xe_gt_stats_incr(xe_root_mmio_gt(xe), + ret ? XE_GT_STATS_ID_DEFRAG_FAILED_COUNT : + XE_GT_STATS_ID_DEFRAG_SUCCESS_COUNT, 1); + unlock: xe_bo_unlock(bo); return ret; diff --git a/drivers/gpu/drm/xe/xe_gt_stats.c b/drivers/gpu/drm/xe/xe_gt_stats.c index 789397514f3e..08e79881f5e5 100644 --- a/drivers/gpu/drm/xe/xe_gt_stats.c +++ b/drivers/gpu/drm/xe/xe_gt_stats.c @@ -154,6 +154,9 @@ static const char *const stat_description[__XE_GT_STATS_NUM_IDS] = { DEF_STAT_STR(PRL_2M_ENTRY_COUNT, "prl_2m_entry_count"), DEF_STAT_STR(PRL_ISSUED_COUNT, "prl_issued_count"), DEF_STAT_STR(PRL_ABORTED_COUNT, "prl_aborted_count"), + DEF_STAT_STR(DEFRAG_ADDED_COUNT, "defrag_added_count"), + DEF_STAT_STR(DEFRAG_SUCCESS_COUNT, "defrag_success_count"), + DEF_STAT_STR(DEFRAG_FAILED_COUNT, "defrag_failed_count"), }; /** diff --git a/drivers/gpu/drm/xe/xe_gt_stats_types.h b/drivers/gpu/drm/xe/xe_gt_stats_types.h index 425491bed6c4..cc23fcc58c8b 100644 --- a/drivers/gpu/drm/xe/xe_gt_stats_types.h +++ b/drivers/gpu/drm/xe/xe_gt_stats_types.h @@ -122,6 +122,13 @@ * @XE_GT_STATS_ID_PRL_ABORTED_COUNT: Times the page reclaim process was * aborted. * + * @XE_GT_STATS_ID_DEFRAG_ADDED_COUNT: Times a buffer object was added to the + * page defragmentation list after being backed at a sub-optimal page order. + * @XE_GT_STATS_ID_DEFRAG_SUCCESS_COUNT: Times the defrag worker successfully + * re-backed a buffer object at the beneficial page order. + * @XE_GT_STATS_ID_DEFRAG_FAILED_COUNT: Times the defrag worker failed to + * re-back a buffer object at the beneficial page order. + * * @__XE_GT_STATS_NUM_IDS: Number of valid IDs; not a real counter. * * See Documentation/gpu/xe/xe_gt_stats.rst. @@ -181,6 +188,9 @@ enum xe_gt_stats_id { XE_GT_STATS_ID_PRL_2M_ENTRY_COUNT, XE_GT_STATS_ID_PRL_ISSUED_COUNT, XE_GT_STATS_ID_PRL_ABORTED_COUNT, + XE_GT_STATS_ID_DEFRAG_ADDED_COUNT, + XE_GT_STATS_ID_DEFRAG_SUCCESS_COUNT, + XE_GT_STATS_ID_DEFRAG_FAILED_COUNT, /* must be the last entry */ __XE_GT_STATS_NUM_IDS, }; -- 2.34.1
