drm/xe: Move xe_ggtt_invalidate out from ggtt->lock
authorMaarten Lankhorst <maarten.lankhorst@linux.intel.com>
Wed, 6 Mar 2024 05:20:02 +0000 (21:20 -0800)
committerMaarten Lankhorst <maarten.lankhorst@linux.intel.com>
Wed, 20 Mar 2024 09:49:14 +0000 (10:49 +0100)
Considering the caller of the GGTT functions should keep the
backing storage alive before the function completes, it's not
necessary to invalidate with the GGTT lock held. This just adds
latency for every user of the GGTT.

Signed-off-by: Matthew Brost <matthew.brost@intel.com>
Signed-off-by: Maarten Lankhorst <maarten.lankhorst@linux.intel.com>
Reviewed-by: Matthew Brost <matthew.brost@intel.com>
Reviewed-by: Rodrigo Vivi <rodrigo.vivi@intel.com>
Signed-off-by: Maarten Lankhorst <maarten.lankhorst@linux.intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20240306052002.311196-5-matthew.brost@intel.com
drivers/gpu/drm/xe/xe_ggtt.c

index 9947ded57cf11208beca3f4575f2dc2183e3e5fb..f54523d7d03c9b34afb0e4d7c1b92f8681c938d6 100644 (file)
@@ -389,9 +389,6 @@ void xe_ggtt_map_bo(struct xe_ggtt *ggtt, struct xe_bo *bo)
                pte = ggtt->pt_ops->pte_encode_bo(bo, offset, pat_index);
                xe_ggtt_set_pte(ggtt, start + offset, pte);
        }
-
-       if (bo->flags & XE_BO_GGTT_INVALIDATE)
-               xe_ggtt_invalidate(ggtt);
 }
 
 static int __xe_ggtt_insert_bo_at(struct xe_ggtt *ggtt, struct xe_bo *bo,
@@ -420,6 +417,9 @@ static int __xe_ggtt_insert_bo_at(struct xe_ggtt *ggtt, struct xe_bo *bo,
        if (!err)
                xe_ggtt_map_bo(ggtt, bo);
        mutex_unlock(&ggtt->lock);
+
+       if (!err && bo->flags & XE_BO_GGTT_INVALIDATE)
+               xe_ggtt_invalidate(ggtt);
        xe_device_mem_access_put(tile_to_xe(ggtt->tile));
 
        return err;
@@ -440,16 +440,16 @@ void xe_ggtt_remove_node(struct xe_ggtt *ggtt, struct drm_mm_node *node,
                         bool invalidate)
 {
        xe_device_mem_access_get(tile_to_xe(ggtt->tile));
-       mutex_lock(&ggtt->lock);
 
+       mutex_lock(&ggtt->lock);
        xe_ggtt_clear(ggtt, node->start, node->size);
        drm_mm_remove_node(node);
        node->size = 0;
+       mutex_unlock(&ggtt->lock);
 
        if (invalidate)
                xe_ggtt_invalidate(ggtt);
 
-       mutex_unlock(&ggtt->lock);
        xe_device_mem_access_put(tile_to_xe(ggtt->tile));
 }