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

Reply via email to