Skip to content

Commit 16e8745

Browse files
committed
drm/i915/gt: Move the batch buffer pool from the engine to the gt
Since the introduction of 'soft-rc6', we aim to park the device quickly and that results in frequent idling of the whole device. Currently upon idling we free the batch buffer pool, and so this renders the cache ineffective for many workloads. If we want to have an effective cache of recently allocated buffers available for reuse, we need to decouple that cache from the engine powermanagement and make it timer based. As there is no reason then to keep it within the engine (where it once made retirement order easier to track), we can move it up the hierarchy to the owner of the memory allocations. v2: Hook up to debugfs/drop_caches to clear the cache on demand. Signed-off-by: Chris Wilson <[email protected]> Cc: Maarten Lankhorst <[email protected]> Cc: Tvrtko Ursulin <[email protected]> Reviewed-by: Tvrtko Ursulin <[email protected]> Link: https://patchwork.freedesktop.org/patch/msgid/[email protected]
1 parent 230982d commit 16e8745

16 files changed

+160
-116
lines changed

drivers/gpu/drm/i915/Makefile

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -87,11 +87,11 @@ gt-y += \
8787
gt/intel_engine_cs.o \
8888
gt/intel_engine_heartbeat.o \
8989
gt/intel_engine_pm.o \
90-
gt/intel_engine_pool.o \
9190
gt/intel_engine_user.o \
9291
gt/intel_ggtt.o \
9392
gt/intel_ggtt_fencing.o \
9493
gt/intel_gt.o \
94+
gt/intel_gt_buffer_pool.o \
9595
gt/intel_gt_clock_utils.o \
9696
gt/intel_gt_irq.o \
9797
gt/intel_gt_pm.o \

drivers/gpu/drm/i915/gem/i915_gem_client_blt.c

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@
66
#include "i915_drv.h"
77
#include "gt/intel_context.h"
88
#include "gt/intel_engine_pm.h"
9-
#include "gt/intel_engine_pool.h"
109
#include "i915_gem_client_blt.h"
1110
#include "i915_gem_object_blt.h"
1211

drivers/gpu/drm/i915/gem/i915_gem_execbuffer.c

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -15,8 +15,8 @@
1515

1616
#include "gem/i915_gem_ioctls.h"
1717
#include "gt/intel_context.h"
18-
#include "gt/intel_engine_pool.h"
1918
#include "gt/intel_gt.h"
19+
#include "gt/intel_gt_buffer_pool.h"
2020
#include "gt/intel_gt_pm.h"
2121
#include "gt/intel_ring.h"
2222

@@ -1194,13 +1194,13 @@ static int __reloc_gpu_alloc(struct i915_execbuffer *eb,
11941194
unsigned int len)
11951195
{
11961196
struct reloc_cache *cache = &eb->reloc_cache;
1197-
struct intel_engine_pool_node *pool;
1197+
struct intel_gt_buffer_pool_node *pool;
11981198
struct i915_request *rq;
11991199
struct i915_vma *batch;
12001200
u32 *cmd;
12011201
int err;
12021202

1203-
pool = intel_engine_get_pool(eb->engine, PAGE_SIZE);
1203+
pool = intel_gt_get_buffer_pool(eb->engine->gt, PAGE_SIZE);
12041204
if (IS_ERR(pool))
12051205
return PTR_ERR(pool);
12061206

@@ -1229,7 +1229,7 @@ static int __reloc_gpu_alloc(struct i915_execbuffer *eb,
12291229
goto err_unpin;
12301230
}
12311231

1232-
err = intel_engine_pool_mark_active(pool, rq);
1232+
err = intel_gt_buffer_pool_mark_active(pool, rq);
12331233
if (err)
12341234
goto err_request;
12351235

@@ -1270,7 +1270,7 @@ static int __reloc_gpu_alloc(struct i915_execbuffer *eb,
12701270
err_unmap:
12711271
i915_gem_object_unpin_map(pool->obj);
12721272
out_pool:
1273-
intel_engine_pool_put(pool);
1273+
intel_gt_buffer_pool_put(pool);
12741274
return err;
12751275
}
12761276

@@ -1887,7 +1887,7 @@ static int eb_parse_pipeline(struct i915_execbuffer *eb,
18871887
static int eb_parse(struct i915_execbuffer *eb)
18881888
{
18891889
struct drm_i915_private *i915 = eb->i915;
1890-
struct intel_engine_pool_node *pool;
1890+
struct intel_gt_buffer_pool_node *pool;
18911891
struct i915_vma *shadow, *trampoline;
18921892
unsigned int len;
18931893
int err;
@@ -1910,7 +1910,7 @@ static int eb_parse(struct i915_execbuffer *eb)
19101910
len += I915_CMD_PARSER_TRAMPOLINE_SIZE;
19111911
}
19121912

1913-
pool = intel_engine_get_pool(eb->engine, len);
1913+
pool = intel_gt_get_buffer_pool(eb->engine->gt, len);
19141914
if (IS_ERR(pool))
19151915
return PTR_ERR(pool);
19161916

@@ -1958,7 +1958,7 @@ static int eb_parse(struct i915_execbuffer *eb)
19581958
err_shadow:
19591959
i915_vma_unpin(shadow);
19601960
err:
1961-
intel_engine_pool_put(pool);
1961+
intel_gt_buffer_pool_put(pool);
19621962
return err;
19631963
}
19641964

@@ -2643,7 +2643,7 @@ i915_gem_do_execbuffer(struct drm_device *dev,
26432643
*/
26442644
eb.request->batch = batch;
26452645
if (batch->private)
2646-
intel_engine_pool_mark_active(batch->private, eb.request);
2646+
intel_gt_buffer_pool_mark_active(batch->private, eb.request);
26472647

26482648
trace_i915_request_queue(eb.request, eb.batch_flags);
26492649
err = eb_submit(&eb, batch);
@@ -2672,7 +2672,7 @@ i915_gem_do_execbuffer(struct drm_device *dev,
26722672
i915_vma_unpin(batch);
26732673
err_parse:
26742674
if (batch->private)
2675-
intel_engine_pool_put(batch->private);
2675+
intel_gt_buffer_pool_put(batch->private);
26762676
err_vma:
26772677
if (eb.trampoline)
26782678
i915_vma_unpin(eb.trampoline);

drivers/gpu/drm/i915/gem/i915_gem_object_blt.c

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,8 @@
66
#include "i915_drv.h"
77
#include "gt/intel_context.h"
88
#include "gt/intel_engine_pm.h"
9-
#include "gt/intel_engine_pool.h"
109
#include "gt/intel_gt.h"
10+
#include "gt/intel_gt_buffer_pool.h"
1111
#include "gt/intel_ring.h"
1212
#include "i915_gem_clflush.h"
1313
#include "i915_gem_object_blt.h"
@@ -18,7 +18,7 @@ struct i915_vma *intel_emit_vma_fill_blt(struct intel_context *ce,
1818
{
1919
struct drm_i915_private *i915 = ce->vm->i915;
2020
const u32 block_size = SZ_8M; /* ~1ms at 8GiB/s preemption delay */
21-
struct intel_engine_pool_node *pool;
21+
struct intel_gt_buffer_pool_node *pool;
2222
struct i915_vma *batch;
2323
u64 offset;
2424
u64 count;
@@ -33,7 +33,7 @@ struct i915_vma *intel_emit_vma_fill_blt(struct intel_context *ce,
3333
count = div_u64(round_up(vma->size, block_size), block_size);
3434
size = (1 + 8 * count) * sizeof(u32);
3535
size = round_up(size, PAGE_SIZE);
36-
pool = intel_engine_get_pool(ce->engine, size);
36+
pool = intel_gt_get_buffer_pool(ce->engine->gt, size);
3737
if (IS_ERR(pool)) {
3838
err = PTR_ERR(pool);
3939
goto out_pm;
@@ -96,7 +96,7 @@ struct i915_vma *intel_emit_vma_fill_blt(struct intel_context *ce,
9696
return batch;
9797

9898
out_put:
99-
intel_engine_pool_put(pool);
99+
intel_gt_buffer_pool_put(pool);
100100
out_pm:
101101
intel_engine_pm_put(ce->engine);
102102
return ERR_PTR(err);
@@ -114,13 +114,13 @@ int intel_emit_vma_mark_active(struct i915_vma *vma, struct i915_request *rq)
114114
if (unlikely(err))
115115
return err;
116116

117-
return intel_engine_pool_mark_active(vma->private, rq);
117+
return intel_gt_buffer_pool_mark_active(vma->private, rq);
118118
}
119119

120120
void intel_emit_vma_release(struct intel_context *ce, struct i915_vma *vma)
121121
{
122122
i915_vma_unpin(vma);
123-
intel_engine_pool_put(vma->private);
123+
intel_gt_buffer_pool_put(vma->private);
124124
intel_engine_pm_put(ce->engine);
125125
}
126126

@@ -213,7 +213,7 @@ struct i915_vma *intel_emit_vma_copy_blt(struct intel_context *ce,
213213
{
214214
struct drm_i915_private *i915 = ce->vm->i915;
215215
const u32 block_size = SZ_8M; /* ~1ms at 8GiB/s preemption delay */
216-
struct intel_engine_pool_node *pool;
216+
struct intel_gt_buffer_pool_node *pool;
217217
struct i915_vma *batch;
218218
u64 src_offset, dst_offset;
219219
u64 count, rem;
@@ -228,7 +228,7 @@ struct i915_vma *intel_emit_vma_copy_blt(struct intel_context *ce,
228228
count = div_u64(round_up(dst->size, block_size), block_size);
229229
size = (1 + 11 * count) * sizeof(u32);
230230
size = round_up(size, PAGE_SIZE);
231-
pool = intel_engine_get_pool(ce->engine, size);
231+
pool = intel_gt_get_buffer_pool(ce->engine->gt, size);
232232
if (IS_ERR(pool)) {
233233
err = PTR_ERR(pool);
234234
goto out_pm;
@@ -307,7 +307,7 @@ struct i915_vma *intel_emit_vma_copy_blt(struct intel_context *ce,
307307
return batch;
308308

309309
out_put:
310-
intel_engine_pool_put(pool);
310+
intel_gt_buffer_pool_put(pool);
311311
out_pm:
312312
intel_engine_pm_put(ce->engine);
313313
return ERR_PTR(err);

drivers/gpu/drm/i915/gem/i915_gem_object_blt.h

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,6 @@
1010

1111
#include "gt/intel_context.h"
1212
#include "gt/intel_engine_pm.h"
13-
#include "gt/intel_engine_pool.h"
1413
#include "i915_vma.h"
1514

1615
struct drm_i915_gem_object;

drivers/gpu/drm/i915/gt/intel_engine_cs.c

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,6 @@
3131
#include "intel_context.h"
3232
#include "intel_engine.h"
3333
#include "intel_engine_pm.h"
34-
#include "intel_engine_pool.h"
3534
#include "intel_engine_user.h"
3635
#include "intel_gt.h"
3736
#include "intel_gt_requests.h"
@@ -631,8 +630,6 @@ static int engine_setup_common(struct intel_engine_cs *engine)
631630
intel_engine_init__pm(engine);
632631
intel_engine_init_retire(engine);
633632

634-
intel_engine_pool_init(&engine->pool);
635-
636633
/* Use the whole device by default */
637634
engine->sseu =
638635
intel_sseu_from_device_info(&RUNTIME_INFO(engine->i915)->sseu);
@@ -829,7 +826,6 @@ void intel_engine_cleanup_common(struct intel_engine_cs *engine)
829826
cleanup_status_page(engine);
830827

831828
intel_engine_fini_retire(engine);
832-
intel_engine_pool_fini(&engine->pool);
833829
intel_engine_fini_breadcrumbs(engine);
834830
intel_engine_cleanup_cmd_parser(engine);
835831

drivers/gpu/drm/i915/gt/intel_engine_pm.c

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,6 @@
1010
#include "intel_engine.h"
1111
#include "intel_engine_heartbeat.h"
1212
#include "intel_engine_pm.h"
13-
#include "intel_engine_pool.h"
1413
#include "intel_gt.h"
1514
#include "intel_gt_pm.h"
1615
#include "intel_rc6.h"
@@ -254,7 +253,6 @@ static int __engine_park(struct intel_wakeref *wf)
254253

255254
intel_engine_park_heartbeat(engine);
256255
intel_engine_disarm_breadcrumbs(engine);
257-
intel_engine_pool_park(&engine->pool);
258256

259257
/* Must be reset upon idling, or we may miss the busy wakeup. */
260258
GEM_BUG_ON(engine->execlists.queue_priority_hint != INT_MIN);

drivers/gpu/drm/i915/gt/intel_engine_pool.h

Lines changed: 0 additions & 34 deletions
This file was deleted.

drivers/gpu/drm/i915/gt/intel_engine_types.h

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,6 @@
2222
#include "i915_pmu.h"
2323
#include "i915_priolist_types.h"
2424
#include "i915_selftest.h"
25-
#include "intel_engine_pool_types.h"
2625
#include "intel_sseu.h"
2726
#include "intel_timeline_types.h"
2827
#include "intel_wakeref.h"
@@ -405,13 +404,6 @@ struct intel_engine_cs {
405404
struct i915_pmu_sample sample[I915_ENGINE_SAMPLE_COUNT];
406405
} pmu;
407406

408-
/*
409-
* A pool of objects to use as shadow copies of client batch buffers
410-
* when the command parser is enabled. Prevents the client from
411-
* modifying the batch contents after software parsing.
412-
*/
413-
struct intel_engine_pool pool;
414-
415407
struct intel_hw_status_page status_page;
416408
struct i915_ctx_workarounds wa_ctx;
417409
struct i915_wa_list ctx_wa_list;

drivers/gpu/drm/i915/gt/intel_gt.c

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
#include "i915_drv.h"
88
#include "intel_context.h"
99
#include "intel_gt.h"
10+
#include "intel_gt_buffer_pool.h"
1011
#include "intel_gt_clock_utils.h"
1112
#include "intel_gt_pm.h"
1213
#include "intel_gt_requests.h"
@@ -28,6 +29,7 @@ void intel_gt_init_early(struct intel_gt *gt, struct drm_i915_private *i915)
2829
INIT_LIST_HEAD(&gt->closed_vma);
2930
spin_lock_init(&gt->closed_lock);
3031

32+
intel_gt_init_buffer_pool(gt);
3133
intel_gt_init_reset(gt);
3234
intel_gt_init_requests(gt);
3335
intel_gt_init_timelines(gt);
@@ -621,6 +623,7 @@ void intel_gt_driver_release(struct intel_gt *gt)
621623

622624
intel_gt_pm_fini(gt);
623625
intel_gt_fini_scratch(gt);
626+
intel_gt_fini_buffer_pool(gt);
624627
}
625628

626629
void intel_gt_driver_late_release(struct intel_gt *gt)

0 commit comments

Comments
 (0)