[Intel-xe] [PATCH v2 7/8] drm/xe: Invalidate TLB on all affected GTs during GGTT updates

Matt Roper matthew.d.roper at intel.com
Wed Apr 12 22:52:47 UTC 2023


Platforms with a standalone media GT share a single GGTT between the
primary and media GTs.  However each of these GTs has its own TLBs
caching the page table, and each needs to be invalidated separately.
Convert ggtt->gt into a list of GTs so that we can iterate and
invalidate them all.

Signed-off-by: Matt Roper <matthew.d.roper at intel.com>
---
 drivers/gpu/drm/xe/xe_ggtt.c       | 15 +++++++++++----
 drivers/gpu/drm/xe/xe_ggtt_types.h |  2 +-
 drivers/gpu/drm/xe/xe_gt.c         |  4 ++++
 drivers/gpu/drm/xe/xe_gt_types.h   |  2 ++
 4 files changed, 18 insertions(+), 5 deletions(-)

diff --git a/drivers/gpu/drm/xe/xe_ggtt.c b/drivers/gpu/drm/xe/xe_ggtt.c
index 0ae373b604f6..374830a7a0cf 100644
--- a/drivers/gpu/drm/xe/xe_ggtt.c
+++ b/drivers/gpu/drm/xe/xe_ggtt.c
@@ -98,7 +98,7 @@ int xe_ggtt_init_noalloc(struct xe_gt *gt, struct xe_ggtt *ggtt)
 
 	XE_BUG_ON(xe_gt_is_media_type(gt));
 
-	ggtt->gt = gt;
+	list_add_tail(&gt->mem.ggtt_link, &ggtt->gt_list);
 
 	gsm_size = probe_gsm_size(pdev);
 	if (gsm_size == 0) {
@@ -139,6 +139,7 @@ int xe_ggtt_init_noalloc(struct xe_gt *gt, struct xe_ggtt *ggtt)
 static void xe_ggtt_initial_clear(struct xe_ggtt *ggtt)
 {
 	struct drm_mm_node *hole;
+	struct xe_gt *gt;
 	u64 start, end;
 
 	/* Display may have allocated inside ggtt, so be careful with clearing here */
@@ -146,7 +147,8 @@ static void xe_ggtt_initial_clear(struct xe_ggtt *ggtt)
 	drm_mm_for_each_hole(hole, &ggtt->mm, start, end)
 		xe_ggtt_clear(ggtt, start, end - start);
 
-	xe_ggtt_invalidate(ggtt->gt);
+	list_for_each_entry(gt, &ggtt->gt_list, mem.ggtt_link)
+		xe_ggtt_invalidate(gt);
 	mutex_unlock(&ggtt->lock);
 }
 
@@ -263,6 +265,7 @@ int xe_ggtt_insert_special_node(struct xe_ggtt *ggtt, struct drm_mm_node *node,
 
 void xe_ggtt_map_bo(struct xe_ggtt *ggtt, struct xe_bo *bo)
 {
+	struct xe_gt *gt;
 	u64 start = bo->ggtt_node.start;
 	u64 offset, pte;
 
@@ -271,7 +274,8 @@ void xe_ggtt_map_bo(struct xe_ggtt *ggtt, struct xe_bo *bo)
 		xe_ggtt_set_pte(ggtt, start + offset, pte);
 	}
 
-	xe_ggtt_invalidate(ggtt->gt);
+	list_for_each_entry(gt, &ggtt->gt_list, mem.ggtt_link)
+		xe_ggtt_invalidate(gt);
 }
 
 static int __xe_ggtt_insert_bo_at(struct xe_ggtt *ggtt, struct xe_bo *bo,
@@ -316,13 +320,16 @@ int xe_ggtt_insert_bo(struct xe_ggtt *ggtt, struct xe_bo *bo)
 
 void xe_ggtt_remove_node(struct xe_ggtt *ggtt, struct drm_mm_node *node)
 {
+	struct xe_gt *gt;
+
 	mutex_lock(&ggtt->lock);
 
 	xe_ggtt_clear(ggtt, node->start, node->size);
 	drm_mm_remove_node(node);
 	node->size = 0;
 
-	xe_ggtt_invalidate(ggtt->gt);
+	list_for_each_entry(gt, &ggtt->gt_list, mem.ggtt_link)
+		xe_ggtt_invalidate(gt);
 
 	mutex_unlock(&ggtt->lock);
 }
diff --git a/drivers/gpu/drm/xe/xe_ggtt_types.h b/drivers/gpu/drm/xe/xe_ggtt_types.h
index ea70aaef4b31..fd527179f81b 100644
--- a/drivers/gpu/drm/xe/xe_ggtt_types.h
+++ b/drivers/gpu/drm/xe/xe_ggtt_types.h
@@ -12,7 +12,7 @@ struct xe_bo;
 struct xe_gt;
 
 struct xe_ggtt {
-	struct xe_gt *gt;
+	struct list_head gt_list;
 
 	u64 size;
 
diff --git a/drivers/gpu/drm/xe/xe_gt.c b/drivers/gpu/drm/xe/xe_gt.c
index 4186f7f0d42f..a07d17af3db0 100644
--- a/drivers/gpu/drm/xe/xe_gt.c
+++ b/drivers/gpu/drm/xe/xe_gt.c
@@ -71,6 +71,8 @@ int xe_gt_alloc(struct xe_device *xe, struct xe_gt *gt)
 		if (!gt->mem.ggtt)
 			return -ENOMEM;
 
+		INIT_LIST_HEAD(&gt->mem.ggtt->gt_list);
+
 		gt->mem.vram_mgr = drmm_kzalloc(drm, sizeof(*gt->mem.vram_mgr),
 						GFP_KERNEL);
 		if (!gt->mem.vram_mgr)
@@ -81,6 +83,8 @@ int xe_gt_alloc(struct xe_device *xe, struct xe_gt *gt)
 
 		gt->mem.ggtt = full_gt->mem.ggtt;
 		gt->mem.vram_mgr = full_gt->mem.vram_mgr;
+
+		list_add_tail(&gt->mem.ggtt_link, &full_gt->mem.ggtt->gt_list);
 	}
 
 	gt->ordered_wq = alloc_ordered_workqueue("gt-ordered-wq", 0);
diff --git a/drivers/gpu/drm/xe/xe_gt_types.h b/drivers/gpu/drm/xe/xe_gt_types.h
index 7c47d67aa8be..1eff57f43731 100644
--- a/drivers/gpu/drm/xe/xe_gt_types.h
+++ b/drivers/gpu/drm/xe/xe_gt_types.h
@@ -164,6 +164,8 @@ struct xe_gt {
 		struct xe_ttm_vram_mgr *vram_mgr;
 		/** @ggtt: Global graphics translation table */
 		struct xe_ggtt *ggtt;
+		/** @ggtt_link: node in GGTT's GT list */
+		struct list_head ggtt_link;
 	} mem;
 
 	/** @reset: state for GT resets */
-- 
2.39.2



More information about the Intel-xe mailing list