]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
drm/xe: Issue GGTT invalidation under lock in ggtt_node_remove
authorMatthew Brost <matthew.brost@intel.com>
Thu, 26 Mar 2026 01:12:07 +0000 (18:12 -0700)
committerMatthew Brost <matthew.brost@intel.com>
Thu, 26 Mar 2026 19:03:02 +0000 (12:03 -0700)
Async work (e.g., GuC queue teardowns) can call ggtt_node_remove, so the
operation must be performed under the GGTT lock to ensure the GGTT
online check remains stable. GGTT insertion and removal are heavyweight
operations (e.g., queue create/destroy), so the additional serialization
cost is negligible compared to ensuring correctness.

Fixes: 4f3a998a173b ("drm/xe: Open-code GGTT MMIO access protection")
Signed-off-by: Matthew Brost <matthew.brost@intel.com>
Reviewed-by: Dnyaneshwar Bhadane <dnyaneshwar.bhadane@intel.com>
Link: https://patch.msgid.link/20260326011207.62373-1-matthew.brost@intel.com
drivers/gpu/drm/xe/xe_ggtt.c

index 21071b64b09dfa5c9f8410d69a9a186537982b54..a848d1a41b9b988696f823c68c101ea620ec967f 100644 (file)
@@ -481,15 +481,10 @@ static void ggtt_node_remove(struct xe_ggtt_node *node)
                xe_ggtt_clear(ggtt, xe_ggtt_node_addr(node), xe_ggtt_node_size(node));
        drm_mm_remove_node(&node->base);
        node->base.size = 0;
-       mutex_unlock(&ggtt->lock);
-
-       if (!bound)
-               goto free_node;
-
-       if (node->invalidate_on_remove)
+       if (bound && node->invalidate_on_remove)
                xe_ggtt_invalidate(ggtt);
+       mutex_unlock(&ggtt->lock);
 
-free_node:
        ggtt_node_fini(node);
 }