drm/xe/pmu: Get/put runtime pm on event init
authorLucas De Marchi <lucas.demarchi@intel.com>
Fri, 24 Jan 2025 05:04:09 +0000 (21:04 -0800)
committerLucas De Marchi <lucas.demarchi@intel.com>
Mon, 27 Jan 2025 16:55:03 +0000 (08:55 -0800)
When the event is created, make sure runtime pm is taken and later put:
in order to read an event counter the GPU needs to remain accessible and
doing a get/put during perf's read is not possible it's holding a
raw_spinlock.

Suggested-by: Rodrigo Vivi <rodrigo.vivi@intel.com>
Reviewed-by: Rodrigo Vivi <rodrigo.vivi@intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20250124050411.2189060-4-lucas.demarchi@intel.com
Signed-off-by: Lucas De Marchi <lucas.demarchi@intel.com>
drivers/gpu/drm/xe/xe_pmu.c

index 33598272db6aa64e917093e30e0d3d33383bc8b7..6678340d6195bc5333285b8a4102526a528e5d2b 100644 (file)
@@ -7,6 +7,7 @@
 #include <linux/device.h>
 
 #include "xe_device.h"
+#include "xe_pm.h"
 #include "xe_pmu.h"
 
 /**
@@ -68,6 +69,7 @@ static void xe_pmu_event_destroy(struct perf_event *event)
        struct xe_device *xe = container_of(event->pmu, typeof(*xe), pmu.base);
 
        drm_WARN_ON(&xe->drm, event->parent);
+       xe_pm_runtime_put(xe);
        drm_dev_put(&xe->drm);
 }
 
@@ -100,6 +102,7 @@ static int xe_pmu_event_init(struct perf_event *event)
 
        if (!event->parent) {
                drm_dev_get(&xe->drm);
+               xe_pm_runtime_get(xe);
                event->destroy = xe_pmu_event_destroy;
        }