summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChris Wilson <chris@chris-wilson.co.uk>2020-07-29 12:07:56 +0100
committerJoonas Lahtinen <joonas.lahtinen@linux.intel.com>2020-09-03 15:24:05 +0300
commit7976559b9d28002a8842c0d31ae9bfef4d7caca0 (patch)
treeddbdf88901dae8fcd92fdcd7c6291a8e384b302b
parent1712bdb54c6519f2009946ac5bcf2fdd0ca747e1 (diff)
drm/i915/gt: Fix termination condition for freeing all buffer objects
A last minute change, that unfortunately broke CI so badly it declared SUCCESS, was to refactor the debug free all buffer pool code to reuse the normal worker, inverted the termination condition so that it instead of discarding the nodes, they were all declared young enough and eligible for reuse. Fixes: bed4ce6f50aa ("drm/i915/gt: Delay taking the spinlock for grabbing from the buffer pool") Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> Reviewed-by: Matthew Auld <matthew.auld@intel.com> Link: https://patchwork.freedesktop.org/patch/msgid/20200729110756.2344-1-chris@chris-wilson.co.uk Signed-off-by: Rodrigo Vivi <rodrigo.vivi@intel.com> [Joonas: Updating Fixes: link after rebasing and reordering into drm-intel-gt-next] Signed-off-by: Joonas Lahtinen <joonas.lahtinen@linux.intel.com>
-rw-r--r--drivers/gpu/drm/i915/gt/intel_gt_buffer_pool.c13
1 files changed, 8 insertions, 5 deletions
diff --git a/drivers/gpu/drm/i915/gt/intel_gt_buffer_pool.c b/drivers/gpu/drm/i915/gt/intel_gt_buffer_pool.c
index 16dbf5436179..9e938d4f6bfe 100644
--- a/drivers/gpu/drm/i915/gt/intel_gt_buffer_pool.c
+++ b/drivers/gpu/drm/i915/gt/intel_gt_buffer_pool.c
@@ -38,8 +38,7 @@ static void node_free(struct intel_gt_buffer_pool_node *node)
kfree_rcu(node, rcu);
}
-static bool
-pool_free_older_than(struct intel_gt_buffer_pool *pool, unsigned long old)
+static bool pool_free_older_than(struct intel_gt_buffer_pool *pool, long keep)
{
struct intel_gt_buffer_pool_node *node, *stale = NULL;
bool active = false;
@@ -57,8 +56,12 @@ pool_free_older_than(struct intel_gt_buffer_pool *pool, unsigned long old)
/* Most recent at head; oldest at tail */
list_for_each_prev(pos, list) {
+ unsigned long age;
+
node = list_entry(pos, typeof(*node), link);
- if (time_before(node->age, old))
+
+ age = READ_ONCE(node->age);
+ if (!age || jiffies - age < keep)
break;
/* Check we are the first to claim this node */
@@ -90,7 +93,7 @@ static void pool_free_work(struct work_struct *wrk)
struct intel_gt_buffer_pool *pool =
container_of(wrk, typeof(*pool), work.work);
- if (pool_free_older_than(pool, jiffies - HZ))
+ if (pool_free_older_than(pool, HZ))
schedule_delayed_work(&pool->work,
round_jiffies_up_relative(HZ));
}
@@ -230,7 +233,7 @@ void intel_gt_flush_buffer_pool(struct intel_gt *gt)
struct intel_gt_buffer_pool *pool = &gt->buffer_pool;
do {
- while (pool_free_older_than(pool, jiffies + 1))
+ while (pool_free_older_than(pool, 0))
;
} while (cancel_delayed_work_sync(&pool->work));
}