]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
drm/xe: Add exec queue active vfunc
authorMatthew Brost <matthew.brost@intel.com>
Fri, 16 Jan 2026 22:17:30 +0000 (14:17 -0800)
committerMatthew Brost <matthew.brost@intel.com>
Sat, 17 Jan 2026 02:24:56 +0000 (18:24 -0800)
If an exec queue is inactive (e.g., not registered or scheduling is
disabled), TLB invalidations are not issued for that queue. Add a
virtual function to determine the active state, which TLB invalidation
logic can hook into.

v5:
 - Operate on primary in active function

Signed-off-by: Matthew Brost <matthew.brost@intel.com>
Tested-by: Stuart Summers <stuart.summers@intel.com>
Reviewed-by: Stuart Summers <stuart.summers@intel.com>
Link: https://patch.msgid.link/20260116221731.868657-11-matthew.brost@intel.com
drivers/gpu/drm/xe/xe_exec_queue_types.h
drivers/gpu/drm/xe/xe_execlist.c
drivers/gpu/drm/xe/xe_guc_submit.c

index e30d295aaaae9974f320fec2ef46c1d89c85992c..601e742c79fff002a49d0f0cd0ad74a7964802da 100644 (file)
@@ -300,6 +300,8 @@ struct xe_exec_queue_ops {
        void (*resume)(struct xe_exec_queue *q);
        /** @reset_status: check exec queue reset status */
        bool (*reset_status)(struct xe_exec_queue *q);
+       /** @active: check exec queue is active */
+       bool (*active)(struct xe_exec_queue *q);
 };
 
 #endif
index 8bf330aeaec0eb2d4f0e6ba7c66a18095affb814..005a5b2c36fe8d5144e20ed0d18744a83cfc9ceb 100644 (file)
@@ -468,6 +468,12 @@ static bool execlist_exec_queue_reset_status(struct xe_exec_queue *q)
        return false;
 }
 
+static bool execlist_exec_queue_active(struct xe_exec_queue *q)
+{
+       /* NIY */
+       return false;
+}
+
 static const struct xe_exec_queue_ops execlist_exec_queue_ops = {
        .init = execlist_exec_queue_init,
        .kill = execlist_exec_queue_kill,
@@ -480,6 +486,7 @@ static const struct xe_exec_queue_ops execlist_exec_queue_ops = {
        .suspend_wait = execlist_exec_queue_suspend_wait,
        .resume = execlist_exec_queue_resume,
        .reset_status = execlist_exec_queue_reset_status,
+       .active = execlist_exec_queue_active,
 };
 
 int xe_execlist_init(struct xe_gt *gt)
index dee0f900402477064d1aa9acdec2999a77494415..456f549c16f6f186ef6669c4619a02f8c61720cc 100644 (file)
@@ -2276,6 +2276,14 @@ static bool guc_exec_queue_reset_status(struct xe_exec_queue *q)
        return exec_queue_reset(q) || exec_queue_killed_or_banned_or_wedged(q);
 }
 
+static bool guc_exec_queue_active(struct xe_exec_queue *q)
+{
+       struct xe_exec_queue *primary = xe_exec_queue_multi_queue_primary(q);
+
+       return exec_queue_enabled(primary) &&
+               !exec_queue_pending_disable(primary);
+}
+
 /*
  * All of these functions are an abstraction layer which other parts of Xe can
  * use to trap into the GuC backend. All of these functions, aside from init,
@@ -2295,6 +2303,7 @@ static const struct xe_exec_queue_ops guc_exec_queue_ops = {
        .suspend_wait = guc_exec_queue_suspend_wait,
        .resume = guc_exec_queue_resume,
        .reset_status = guc_exec_queue_reset_status,
+       .active = guc_exec_queue_active,
 };
 
 static void guc_exec_queue_stop(struct xe_guc *guc, struct xe_exec_queue *q)