diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h index 6a051381f535f32e4c795cdeba6290ffe4354490..d072f3369ee1c2bb6a8f35873306aefbc5fe4c6a 100644 --- a/drivers/gpu/drm/i915/i915_drv.h +++ b/drivers/gpu/drm/i915/i915_drv.h @@ -1977,7 +1977,7 @@ struct drm_i915_private { struct i915_gt_timelines { struct mutex mutex; /* protects list, tainted by GPU */ - struct list_head list; + struct list_head active_list; /* Pack multiple timelines' seqnos into the same page */ spinlock_t hwsp_lock; diff --git a/drivers/gpu/drm/i915/i915_gem.c b/drivers/gpu/drm/i915/i915_gem.c index 4e0de22f0166117d08dd65aaa045a15be56aaea1..9c499edb4c138eeabffb9cac8306b617ffb86968 100644 --- a/drivers/gpu/drm/i915/i915_gem.c +++ b/drivers/gpu/drm/i915/i915_gem.c @@ -3246,7 +3246,7 @@ wait_for_timelines(struct drm_i915_private *i915, return timeout; mutex_lock(>->mutex); - list_for_each_entry(tl, >->list, link) { + list_for_each_entry(tl, >->active_list, link) { struct i915_request *rq; rq = i915_gem_active_get_unlocked(&tl->last_request); @@ -3274,7 +3274,7 @@ wait_for_timelines(struct drm_i915_private *i915, /* restart after reacquiring the lock */ mutex_lock(>->mutex); - tl = list_entry(>->list, typeof(*tl), link); + tl = list_entry(>->active_list, typeof(*tl), link); } mutex_unlock(>->mutex); diff --git a/drivers/gpu/drm/i915/i915_reset.c b/drivers/gpu/drm/i915/i915_reset.c index bd82f9b1043ffb76bcd28dba2fe726c3ced30476..acf3c777e49d16b1f887c8677832519d6ffa7fc7 100644 --- a/drivers/gpu/drm/i915/i915_reset.c +++ b/drivers/gpu/drm/i915/i915_reset.c @@ -856,7 +856,7 @@ bool i915_gem_unset_wedged(struct drm_i915_private *i915) * No more can be submitted until we reset the wedged bit. */ mutex_lock(&i915->gt.timelines.mutex); - list_for_each_entry(tl, &i915->gt.timelines.list, link) { + list_for_each_entry(tl, &i915->gt.timelines.active_list, link) { struct i915_request *rq; long timeout; diff --git a/drivers/gpu/drm/i915/i915_timeline.c b/drivers/gpu/drm/i915/i915_timeline.c index e4c11414a824e0fe77d3a5d50a52659b10f0cbd5..79838d89bdb9405afe60f6eb716fa3bc21804e11 100644 --- a/drivers/gpu/drm/i915/i915_timeline.c +++ b/drivers/gpu/drm/i915/i915_timeline.c @@ -120,7 +120,6 @@ int i915_timeline_init(struct drm_i915_private *i915, const char *name, struct i915_vma *hwsp) { - struct i915_gt_timelines *gt = &i915->gt.timelines; void *vaddr; /* @@ -168,10 +167,6 @@ int i915_timeline_init(struct drm_i915_private *i915, i915_syncmap_init(&timeline->sync); - mutex_lock(>->mutex); - list_add(&timeline->link, >->list); - mutex_unlock(>->mutex); - return 0; } @@ -180,7 +175,7 @@ void i915_timelines_init(struct drm_i915_private *i915) struct i915_gt_timelines *gt = &i915->gt.timelines; mutex_init(>->mutex); - INIT_LIST_HEAD(>->list); + INIT_LIST_HEAD(>->active_list); spin_lock_init(>->hwsp_lock); INIT_LIST_HEAD(>->hwsp_free_list); @@ -189,6 +184,24 @@ void i915_timelines_init(struct drm_i915_private *i915) i915_gem_shrinker_taints_mutex(i915, >->mutex); } +static void timeline_add_to_active(struct i915_timeline *tl) +{ + struct i915_gt_timelines *gt = &tl->i915->gt.timelines; + + mutex_lock(>->mutex); + list_add(&tl->link, >->active_list); + mutex_unlock(>->mutex); +} + +static void timeline_remove_from_active(struct i915_timeline *tl) +{ + struct i915_gt_timelines *gt = &tl->i915->gt.timelines; + + mutex_lock(>->mutex); + list_del(&tl->link); + mutex_unlock(>->mutex); +} + /** * i915_timelines_park - called when the driver idles * @i915: the drm_i915_private device @@ -205,7 +218,7 @@ void i915_timelines_park(struct drm_i915_private *i915) struct i915_timeline *timeline; mutex_lock(>->mutex); - list_for_each_entry(timeline, >->list, link) { + list_for_each_entry(timeline, >->active_list, link) { /* * All known fences are completed so we can scrap * the current sync point tracking and start afresh, @@ -219,15 +232,9 @@ void i915_timelines_park(struct drm_i915_private *i915) void i915_timeline_fini(struct i915_timeline *timeline) { - struct i915_gt_timelines *gt = &timeline->i915->gt.timelines; - GEM_BUG_ON(timeline->pin_count); GEM_BUG_ON(!list_empty(&timeline->requests)); - mutex_lock(>->mutex); - list_del(&timeline->link); - mutex_unlock(>->mutex); - i915_syncmap_free(&timeline->sync); hwsp_free(timeline); @@ -274,6 +281,8 @@ int i915_timeline_pin(struct i915_timeline *tl) i915_ggtt_offset(tl->hwsp_ggtt) + offset_in_page(tl->hwsp_offset); + timeline_add_to_active(tl); + return 0; unpin: @@ -287,6 +296,8 @@ void i915_timeline_unpin(struct i915_timeline *tl) if (--tl->pin_count) return; + timeline_remove_from_active(tl); + /* * Since this timeline is idle, all bariers upon which we were waiting * must also be complete and so we can discard the last used barriers @@ -310,7 +321,7 @@ void i915_timelines_fini(struct drm_i915_private *i915) { struct i915_gt_timelines *gt = &i915->gt.timelines; - GEM_BUG_ON(!list_empty(>->list)); + GEM_BUG_ON(!list_empty(>->active_list)); GEM_BUG_ON(!list_empty(>->hwsp_free_list)); mutex_destroy(>->mutex);