[PATCH 1/2] drm/i915: Remove sharing of hwsp cachelines between timelines

Maarten Lankhorst maarten.lankhorst at linux.intel.com
Wed Oct 21 07:58:11 UTC 2020


With ww locking, we have to lock the hwsp as well. Remove support
for sharing hwsp pages between separate timelines to achieve isolation.

Signed-off-by: Maarten Lankhorst <maarten.lankhorst at linux.intel.com>
---
 drivers/gpu/drm/i915/gt/intel_gt_types.h |  4 ---
 drivers/gpu/drm/i915/gt/intel_timeline.c | 34 ++++--------------------
 2 files changed, 5 insertions(+), 33 deletions(-)

diff --git a/drivers/gpu/drm/i915/gt/intel_gt_types.h b/drivers/gpu/drm/i915/gt/intel_gt_types.h
index 6d39a4a11bf3..7aff8350c364 100644
--- a/drivers/gpu/drm/i915/gt/intel_gt_types.h
+++ b/drivers/gpu/drm/i915/gt/intel_gt_types.h
@@ -39,10 +39,6 @@ struct intel_gt {
 	struct intel_gt_timelines {
 		spinlock_t lock; /* protects active_list */
 		struct list_head active_list;
-
-		/* Pack multiple timelines' seqnos into the same page */
-		spinlock_t hwsp_lock;
-		struct list_head hwsp_free_list;
 	} timelines;
 
 	struct intel_gt_requests {
diff --git a/drivers/gpu/drm/i915/gt/intel_timeline.c b/drivers/gpu/drm/i915/gt/intel_timeline.c
index a2f74cefe4c3..2f49551c43bc 100644
--- a/drivers/gpu/drm/i915/gt/intel_timeline.c
+++ b/drivers/gpu/drm/i915/gt/intel_timeline.c
@@ -21,7 +21,6 @@
 struct intel_timeline_hwsp {
 	struct intel_gt *gt;
 	struct intel_gt_timelines *gt_timelines;
-	struct list_head free_link;
 	struct i915_vma *vma;
 	u64 free_bitmap;
 };
@@ -49,19 +48,16 @@ static struct i915_vma *
 hwsp_alloc(struct intel_timeline *timeline, unsigned int *cacheline)
 {
 	struct intel_gt_timelines *gt = &timeline->gt->timelines;
-	struct intel_timeline_hwsp *hwsp;
+	struct intel_timeline_hwsp *hwsp = NULL;
 
 	BUILD_BUG_ON(BITS_PER_TYPE(u64) * CACHELINE_BYTES > PAGE_SIZE);
 
-	spin_lock_irq(&gt->hwsp_lock);
-
 	/* hwsp_free_list only contains HWSP that have available cachelines */
-	hwsp = list_first_entry_or_null(&gt->hwsp_free_list,
-					typeof(*hwsp), free_link);
-	if (!hwsp) {
-		struct i915_vma *vma;
+	if (timeline->hwsp_cacheline)
+		hwsp = timeline->hwsp_cacheline->hwsp;
 
-		spin_unlock_irq(&gt->hwsp_lock);
+	if (!hwsp || !hwsp->free_bitmap) {
+		struct i915_vma *vma;
 
 		hwsp = kmalloc(sizeof(*hwsp), GFP_KERNEL);
 		if (!hwsp)
@@ -81,17 +77,11 @@ hwsp_alloc(struct intel_timeline *timeline, unsigned int *cacheline)
 		hwsp->free_bitmap = ~0ull;
 		hwsp->gt_timelines = gt;
 
-		spin_lock_irq(&gt->hwsp_lock);
-		list_add(&hwsp->free_link, &gt->hwsp_free_list);
 	}
 
 	GEM_BUG_ON(!hwsp->free_bitmap);
 	*cacheline = __ffs64(hwsp->free_bitmap);
 	hwsp->free_bitmap &= ~BIT_ULL(*cacheline);
-	if (!hwsp->free_bitmap)
-		list_del(&hwsp->free_link);
-
-	spin_unlock_irq(&gt->hwsp_lock);
 
 	GEM_BUG_ON(hwsp->vma->private != hwsp);
 	return hwsp->vma;
@@ -99,14 +89,7 @@ hwsp_alloc(struct intel_timeline *timeline, unsigned int *cacheline)
 
 static void __idle_hwsp_free(struct intel_timeline_hwsp *hwsp, int cacheline)
 {
-	struct intel_gt_timelines *gt = hwsp->gt_timelines;
-	unsigned long flags;
-
-	spin_lock_irqsave(&gt->hwsp_lock, flags);
-
 	/* As a cacheline becomes available, publish the HWSP on the freelist */
-	if (!hwsp->free_bitmap)
-		list_add_tail(&hwsp->free_link, &gt->hwsp_free_list);
 
 	GEM_BUG_ON(cacheline >= BITS_PER_TYPE(hwsp->free_bitmap));
 	hwsp->free_bitmap |= BIT_ULL(cacheline);
@@ -114,11 +97,8 @@ static void __idle_hwsp_free(struct intel_timeline_hwsp *hwsp, int cacheline)
 	/* And if no one is left using it, give the page back to the system */
 	if (hwsp->free_bitmap == ~0ull) {
 		i915_vma_put(hwsp->vma);
-		list_del(&hwsp->free_link);
 		kfree(hwsp);
 	}
-
-	spin_unlock_irqrestore(&gt->hwsp_lock, flags);
 }
 
 static void __rcu_cacheline_free(struct rcu_head *rcu)
@@ -277,9 +257,6 @@ void intel_gt_init_timelines(struct intel_gt *gt)
 
 	spin_lock_init(&timelines->lock);
 	INIT_LIST_HEAD(&timelines->active_list);
-
-	spin_lock_init(&timelines->hwsp_lock);
-	INIT_LIST_HEAD(&timelines->hwsp_free_list);
 }
 
 static void intel_timeline_fini(struct intel_timeline *timeline)
@@ -612,7 +589,6 @@ void intel_gt_fini_timelines(struct intel_gt *gt)
 	struct intel_gt_timelines *timelines = &gt->timelines;
 
 	GEM_BUG_ON(!list_empty(&timelines->active_list));
-	GEM_BUG_ON(!list_empty(&timelines->hwsp_free_list));
 }
 
 #if IS_ENABLED(CONFIG_DRM_I915_SELFTEST)

base-commit: 3097f591191858ca793911eff49eec2cfd0c2faf
-- 
2.28.0



More information about the Intel-gfx-trybot mailing list