Commit 74e4b909 authored by Jason Ekstrand's avatar Jason Ekstrand Committed by Daniel Vetter

drm/i915: Stop storing the ring size in the ring pointer (v3)

Previously, we were storing the ring size in the ring pointer before it
was actually allocated.  We would then guard setting the ring size on
checking for CONTEXT_ALLOC_BIT.  This is error-prone at best and really
only saves us a few bytes on something that already burns at least 4K.
Instead, this patch adds a new ring_size field and makes everything use
that.

v2 (Daniel Vetter):
 - Replace 512 * SZ_4K with SZ_2M

v2 (Jason Ekstrand):
 - Rebase on top of page migration code
Signed-off-by: default avatarJason Ekstrand <jason@jlekstrand.net>
Reviewed-by: default avatarDaniel Vetter <daniel.vetter@ffwll.ch>
Signed-off-by: default avatarDaniel Vetter <daniel.vetter@ffwll.ch>
Link: https://patchwork.freedesktop.org/patch/msgid/20210708154835.528166-3-jason@jlekstrand.net
parent fe4751c3
...@@ -211,8 +211,7 @@ static void intel_context_set_gem(struct intel_context *ce, ...@@ -211,8 +211,7 @@ static void intel_context_set_gem(struct intel_context *ce,
GEM_BUG_ON(rcu_access_pointer(ce->gem_context)); GEM_BUG_ON(rcu_access_pointer(ce->gem_context));
RCU_INIT_POINTER(ce->gem_context, ctx); RCU_INIT_POINTER(ce->gem_context, ctx);
if (!test_bit(CONTEXT_ALLOC_BIT, &ce->flags)) ce->ring_size = SZ_16K;
ce->ring = __intel_context_ring_size(SZ_16K);
if (rcu_access_pointer(ctx->vm)) { if (rcu_access_pointer(ctx->vm)) {
struct i915_address_space *vm; struct i915_address_space *vm;
......
...@@ -371,7 +371,8 @@ intel_context_init(struct intel_context *ce, struct intel_engine_cs *engine) ...@@ -371,7 +371,8 @@ intel_context_init(struct intel_context *ce, struct intel_engine_cs *engine)
ce->engine = engine; ce->engine = engine;
ce->ops = engine->cops; ce->ops = engine->cops;
ce->sseu = engine->sseu; ce->sseu = engine->sseu;
ce->ring = __intel_context_ring_size(SZ_4K); ce->ring = NULL;
ce->ring_size = SZ_4K;
ewma_runtime_init(&ce->runtime.avg); ewma_runtime_init(&ce->runtime.avg);
......
...@@ -175,11 +175,6 @@ int intel_context_prepare_remote_request(struct intel_context *ce, ...@@ -175,11 +175,6 @@ int intel_context_prepare_remote_request(struct intel_context *ce,
struct i915_request *intel_context_create_request(struct intel_context *ce); struct i915_request *intel_context_create_request(struct intel_context *ce);
static inline struct intel_ring *__intel_context_ring_size(u64 sz)
{
return u64_to_ptr(struct intel_ring, sz);
}
static inline bool intel_context_is_barrier(const struct intel_context *ce) static inline bool intel_context_is_barrier(const struct intel_context *ce)
{ {
return test_bit(CONTEXT_BARRIER_BIT, &ce->flags); return test_bit(CONTEXT_BARRIER_BIT, &ce->flags);
......
...@@ -82,6 +82,7 @@ struct intel_context { ...@@ -82,6 +82,7 @@ struct intel_context {
spinlock_t signal_lock; /* protects signals, the list of requests */ spinlock_t signal_lock; /* protects signals, the list of requests */
struct i915_vma *state; struct i915_vma *state;
u32 ring_size;
struct intel_ring *ring; struct intel_ring *ring;
struct intel_timeline *timeline; struct intel_timeline *timeline;
......
...@@ -807,7 +807,8 @@ intel_engine_create_pinned_context(struct intel_engine_cs *engine, ...@@ -807,7 +807,8 @@ intel_engine_create_pinned_context(struct intel_engine_cs *engine,
__set_bit(CONTEXT_BARRIER_BIT, &ce->flags); __set_bit(CONTEXT_BARRIER_BIT, &ce->flags);
ce->timeline = page_pack_bits(NULL, hwsp); ce->timeline = page_pack_bits(NULL, hwsp);
ce->ring = __intel_context_ring_size(ring_size); ce->ring = NULL;
ce->ring_size = ring_size;
i915_vm_put(ce->vm); i915_vm_put(ce->vm);
ce->vm = i915_vm_get(vm); ce->vm = i915_vm_get(vm);
......
...@@ -845,7 +845,7 @@ int lrc_alloc(struct intel_context *ce, struct intel_engine_cs *engine) ...@@ -845,7 +845,7 @@ int lrc_alloc(struct intel_context *ce, struct intel_engine_cs *engine)
if (IS_ERR(vma)) if (IS_ERR(vma))
return PTR_ERR(vma); return PTR_ERR(vma);
ring = intel_engine_create_ring(engine, (unsigned long)ce->ring); ring = intel_engine_create_ring(engine, ce->ring_size);
if (IS_ERR(ring)) { if (IS_ERR(ring)) {
err = PTR_ERR(ring); err = PTR_ERR(ring);
goto err_vma; goto err_vma;
......
...@@ -232,7 +232,8 @@ struct intel_context *intel_migrate_create_context(struct intel_migrate *m) ...@@ -232,7 +232,8 @@ struct intel_context *intel_migrate_create_context(struct intel_migrate *m)
if (IS_ERR(ce)) if (IS_ERR(ce))
return ce; return ce;
ce->ring = __intel_context_ring_size(SZ_256K); ce->ring = NULL;
ce->ring_size = SZ_256K;
i915_vm_put(ce->vm); i915_vm_put(ce->vm);
ce->vm = i915_vm_get(m->context->vm); ce->vm = i915_vm_get(m->context->vm);
......
...@@ -2810,7 +2810,7 @@ static int __live_preempt_ring(struct intel_engine_cs *engine, ...@@ -2810,7 +2810,7 @@ static int __live_preempt_ring(struct intel_engine_cs *engine,
goto err_ce; goto err_ce;
} }
tmp->ring = __intel_context_ring_size(ring_sz); tmp->ring_size = ring_sz;
err = intel_context_pin(tmp); err = intel_context_pin(tmp);
if (err) { if (err) {
......
...@@ -28,7 +28,7 @@ static struct intel_context *mocs_context_create(struct intel_engine_cs *engine) ...@@ -28,7 +28,7 @@ static struct intel_context *mocs_context_create(struct intel_engine_cs *engine)
return ce; return ce;
/* We build large requests to read the registers from the ring */ /* We build large requests to read the registers from the ring */
ce->ring = __intel_context_ring_size(SZ_16K); ce->ring_size = SZ_16K;
return ce; return ce;
} }
......
...@@ -874,7 +874,7 @@ static int create_watcher(struct hwsp_watcher *w, ...@@ -874,7 +874,7 @@ static int create_watcher(struct hwsp_watcher *w,
if (IS_ERR(ce)) if (IS_ERR(ce))
return PTR_ERR(ce); return PTR_ERR(ce);
ce->ring = __intel_context_ring_size(ringsz); ce->ring_size = ringsz;
w->rq = intel_context_create_request(ce); w->rq = intel_context_create_request(ce);
intel_context_put(ce); intel_context_put(ce);
if (IS_ERR(w->rq)) if (IS_ERR(w->rq))
......
...@@ -1409,11 +1409,8 @@ int intel_vgpu_setup_submission(struct intel_vgpu *vgpu) ...@@ -1409,11 +1409,8 @@ int intel_vgpu_setup_submission(struct intel_vgpu *vgpu)
intel_context_set_single_submission(ce); intel_context_set_single_submission(ce);
/* Max ring buffer size */ /* Max ring buffer size */
if (!intel_uc_wants_guc_submission(&engine->gt->uc)) { if (!intel_uc_wants_guc_submission(&engine->gt->uc))
const unsigned int ring_size = 512 * SZ_4K; ce->ring_size = SZ_2M;
ce->ring = __intel_context_ring_size(ring_size);
}
s->shadow[i] = ce; s->shadow[i] = ce;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment