Add a new entry in stats to for svm page faults. If CONFIG_DEBUG_FS is
enabled, the count can be viewed with per GT stat debugfs file.
This is similar to what is already in place for vma page faults.
Example output:
    cat /sys/kernel/debug/dri/0/gt0/stats
    svm_pagefault_count: 6
    tlb_inval_count: 78
    vma_pagefault_count: 0
    vma_pagefault_kb: 0
v2: Fix build with CONFIG_DRM_GPUSVM disabled
v3: Update argument in kernel doc
Reviewed-by: Rodrigo Vivi <rodrigo.vivi@intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20250312092749.164232-1-francois.dugast@intel.com
Signed-off-by: Francois Dugast <francois.dugast@intel.com>
        atomic = access_is_atomic(pf->access_type);
 
        if (xe_vma_is_cpu_addr_mirror(vma))
-               err = xe_svm_handle_pagefault(vm, vma, gt_to_tile(gt),
+               err = xe_svm_handle_pagefault(vm, vma, gt,
                                              pf->page_addr, atomic);
        else
                err = handle_vma_pagefault(gt, vma, atomic);
 
 }
 
 static const char *const stat_description[__XE_GT_STATS_NUM_IDS] = {
+       "svm_pagefault_count",
        "tlb_inval_count",
        "vma_pagefault_count",
        "vma_pagefault_kb",
 
 #define _XE_GT_STATS_TYPES_H_
 
 enum xe_gt_stats_id {
+       XE_GT_STATS_ID_SVM_PAGEFAULT_COUNT,
        XE_GT_STATS_ID_TLB_INVAL,
        XE_GT_STATS_ID_VMA_PAGEFAULT_COUNT,
        XE_GT_STATS_ID_VMA_PAGEFAULT_KB,
 
  */
 
 #include "xe_bo.h"
+#include "xe_gt_stats.h"
 #include "xe_gt_tlb_invalidation.h"
 #include "xe_migrate.h"
 #include "xe_module.h"
  * xe_svm_handle_pagefault() - SVM handle page fault
  * @vm: The VM.
  * @vma: The CPU address mirror VMA.
- * @tile: The tile upon the fault occurred.
+ * @gt: The gt upon the fault occurred.
  * @fault_addr: The GPU fault address.
  * @atomic: The fault atomic access bit.
  *
  * Return: 0 on success, negative error code on error.
  */
 int xe_svm_handle_pagefault(struct xe_vm *vm, struct xe_vma *vma,
-                           struct xe_tile *tile, u64 fault_addr,
+                           struct xe_gt *gt, u64 fault_addr,
                            bool atomic)
 {
        struct drm_gpusvm_ctx ctx = {
        struct drm_gpusvm_range *r;
        struct drm_exec exec;
        struct dma_fence *fence;
+       struct xe_tile *tile = gt_to_tile(gt);
        ktime_t end = 0;
        int err;
 
        lockdep_assert_held_write(&vm->lock);
        xe_assert(vm->xe, xe_vma_is_cpu_addr_mirror(vma));
 
+       xe_gt_stats_incr(gt, XE_GT_STATS_ID_SVM_PAGEFAULT_COUNT, 1);
+
 retry:
        /* Always process UNMAPs first so view SVM ranges is current */
        err = xe_svm_garbage_collector(vm);
 
 #define XE_INTERCONNECT_VRAM DRM_INTERCONNECT_DRIVER
 
 struct xe_bo;
-struct xe_vram_region;
+struct xe_gt;
 struct xe_tile;
 struct xe_vm;
 struct xe_vma;
+struct xe_vram_region;
 
 /** struct xe_svm_range - SVM range */
 struct xe_svm_range {
 void xe_svm_close(struct xe_vm *vm);
 
 int xe_svm_handle_pagefault(struct xe_vm *vm, struct xe_vma *vma,
-                           struct xe_tile *tile, u64 fault_addr,
+                           struct xe_gt *gt, u64 fault_addr,
                            bool atomic);
 
 bool xe_svm_has_mapping(struct xe_vm *vm, u64 start, u64 end);
 
 static inline
 int xe_svm_handle_pagefault(struct xe_vm *vm, struct xe_vma *vma,
-                           struct xe_tile *tile, u64 fault_addr,
+                           struct xe_gt *gt, u64 fault_addr,
                            bool atomic)
 {
        return 0;