diff options
author | Chris Wilson <chris@chris-wilson.co.uk> | 2016-07-06 12:39:02 +0100 |
---|---|---|
committer | Chris Wilson <chris@chris-wilson.co.uk> | 2016-07-06 12:47:39 +0100 |
commit | aca34b6e1ca909ba15f6c1c1dc89bea8f455403f (patch) | |
tree | a2951a0be74a87f21e6170674dc39f4dbc301a2b /drivers/gpu/drm/i915/intel_breadcrumbs.c | |
parent | 99fe4a5f7383559ee120492124365e708a587130 (diff) |
drm/i915: Group the irq breadcrumb variables into the same cacheline
As we inspect both the tasklet (to check for an active bottom-half) and
set the irq-posted flag at the same time (both in the interrupt handler
and then in the bottom-halt), group those two together into the same
cacheline. (Not having total control over placement of the struct means
we can't guarantee the cacheline boundary, we need to align the kmalloc
and then each struct, but the grouping should help.)
v2: Try a couple of different names for the state touched by the user
interrupt handler.
Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
Reviewed-by: Tvrtko Ursulin <tvrtko.ursulin@intel.com>
Link: http://patchwork.freedesktop.org/patch/msgid/1467805142-22219-3-git-send-email-chris@chris-wilson.co.uk
Diffstat (limited to 'drivers/gpu/drm/i915/intel_breadcrumbs.c')
-rw-r--r-- | drivers/gpu/drm/i915/intel_breadcrumbs.c | 28 |
1 files changed, 14 insertions, 14 deletions
diff --git a/drivers/gpu/drm/i915/intel_breadcrumbs.c b/drivers/gpu/drm/i915/intel_breadcrumbs.c index 6fcbb52e50fb..d89b2c963618 100644 --- a/drivers/gpu/drm/i915/intel_breadcrumbs.c +++ b/drivers/gpu/drm/i915/intel_breadcrumbs.c @@ -49,7 +49,7 @@ static void irq_enable(struct intel_engine_cs *engine) * we still need to force the barrier before reading the seqno, * just in case. */ - engine->irq_posted = true; + engine->breadcrumbs.irq_posted = true; spin_lock_irq(&engine->i915->irq_lock); engine->irq_enable(engine); @@ -62,7 +62,7 @@ static void irq_disable(struct intel_engine_cs *engine) engine->irq_disable(engine); spin_unlock_irq(&engine->i915->irq_lock); - engine->irq_posted = false; + engine->breadcrumbs.irq_posted = false; } static void __intel_breadcrumbs_enable_irq(struct intel_breadcrumbs *b) @@ -195,7 +195,7 @@ static bool __intel_engine_add_wait(struct intel_engine_cs *engine, } rb_link_node(&wait->node, parent, p); rb_insert_color(&wait->node, &b->waiters); - GEM_BUG_ON(!first && !b->tasklet); + GEM_BUG_ON(!first && !b->irq_seqno_bh); if (completed) { struct rb_node *next = rb_next(completed); @@ -204,7 +204,7 @@ static bool __intel_engine_add_wait(struct intel_engine_cs *engine, if (next && next != &wait->node) { GEM_BUG_ON(first); b->first_wait = to_wait(next); - smp_store_mb(b->tasklet, b->first_wait->tsk); + smp_store_mb(b->irq_seqno_bh, b->first_wait->tsk); /* As there is a delay between reading the current * seqno, processing the completed tasks and selecting * the next waiter, we may have missed the interrupt @@ -216,7 +216,7 @@ static bool __intel_engine_add_wait(struct intel_engine_cs *engine, * in case the seqno passed. */ __intel_breadcrumbs_enable_irq(b); - if (READ_ONCE(engine->irq_posted)) + if (READ_ONCE(b->irq_posted)) wake_up_process(to_wait(next)->tsk); } @@ -230,18 +230,18 @@ static bool __intel_engine_add_wait(struct intel_engine_cs *engine, if (first) { GEM_BUG_ON(rb_first(&b->waiters) != &wait->node); b->first_wait = wait; - smp_store_mb(b->tasklet, wait->tsk); + smp_store_mb(b->irq_seqno_bh, wait->tsk); /* After assigning ourselves as the new bottom-half, we must * perform a cursory check to prevent a missed interrupt. * Either we miss the interrupt whilst programming the hardware, * or if there was a previous waiter (for a later seqno) they * may be woken instead of us (due to the inherent race - * in the unlocked read of b->tasklet in the irq handler) and - * so we miss the wake up. + * in the unlocked read of b->irq_seqno_bh in the irq handler) + * and so we miss the wake up. */ __intel_breadcrumbs_enable_irq(b); } - GEM_BUG_ON(!b->tasklet); + GEM_BUG_ON(!b->irq_seqno_bh); GEM_BUG_ON(!b->first_wait); GEM_BUG_ON(rb_first(&b->waiters) != &b->first_wait->node); @@ -301,7 +301,7 @@ void intel_engine_remove_wait(struct intel_engine_cs *engine, const int priority = wakeup_priority(b, wait->tsk); struct rb_node *next; - GEM_BUG_ON(b->tasklet != wait->tsk); + GEM_BUG_ON(b->irq_seqno_bh != wait->tsk); /* We are the current bottom-half. Find the next candidate, * the first waiter in the queue on the remaining oldest @@ -344,13 +344,13 @@ void intel_engine_remove_wait(struct intel_engine_cs *engine, * exception rather than a seqno completion. */ b->first_wait = to_wait(next); - smp_store_mb(b->tasklet, b->first_wait->tsk); + smp_store_mb(b->irq_seqno_bh, b->first_wait->tsk); if (b->first_wait->seqno != wait->seqno) __intel_breadcrumbs_enable_irq(b); - wake_up_process(b->tasklet); + wake_up_process(b->irq_seqno_bh); } else { b->first_wait = NULL; - WRITE_ONCE(b->tasklet, NULL); + WRITE_ONCE(b->irq_seqno_bh, NULL); __intel_breadcrumbs_disable_irq(b); } } else { @@ -364,7 +364,7 @@ out_unlock: GEM_BUG_ON(b->first_wait == wait); GEM_BUG_ON(rb_first(&b->waiters) != (b->first_wait ? &b->first_wait->node : NULL)); - GEM_BUG_ON(!b->tasklet ^ RB_EMPTY_ROOT(&b->waiters)); + GEM_BUG_ON(!b->irq_seqno_bh ^ RB_EMPTY_ROOT(&b->waiters)); spin_unlock(&b->lock); } |