From: Tvrtko Ursulin <tvrtko.ursulin@linux.intel.com>
To: Chris Wilson <chris@chris-wilson.co.uk>, intel-gfx@lists.freedesktop.org
Subject: Re: [PATCH 08/10] drm/i915: Move the irq_counter inside the spinlock
Date: Wed, 17 Jan 2018 12:12:04 +0000 [thread overview]
Message-ID: <7766d39f-e066-1ada-1e27-189646672d34@linux.intel.com> (raw)
In-Reply-To: <20180115212455.24046-9-chris@chris-wilson.co.uk>
On 15/01/2018 21:24, Chris Wilson wrote:
> Rather than have multiple locked instructions inside the notify_ring()
> irq handler, move them inside the spinlock and reduce their intrinsic
> locking.
>
> Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
> ---
> drivers/gpu/drm/i915/i915_gem_request.c | 4 ++--
> drivers/gpu/drm/i915/i915_irq.c | 6 +++---
> drivers/gpu/drm/i915/intel_breadcrumbs.c | 13 ++++++++-----
> drivers/gpu/drm/i915/intel_ringbuffer.h | 2 +-
> 4 files changed, 14 insertions(+), 11 deletions(-)
>
> diff --git a/drivers/gpu/drm/i915/i915_gem_request.c b/drivers/gpu/drm/i915/i915_gem_request.c
> index 836db90ef81b..08bbd56277e5 100644
> --- a/drivers/gpu/drm/i915/i915_gem_request.c
> +++ b/drivers/gpu/drm/i915/i915_gem_request.c
> @@ -1128,7 +1128,7 @@ static bool __i915_spin_request(const struct drm_i915_gem_request *req,
> * takes to sleep on a request, on the order of a microsecond.
> */
>
> - irq = atomic_read(&engine->irq_count);
> + irq = READ_ONCE(engine->breadcrumbs.irq_count);
> timeout_us += local_clock_us(&cpu);
> do {
> if (i915_seqno_passed(intel_engine_get_seqno(engine), seqno))
> @@ -1139,7 +1139,7 @@ static bool __i915_spin_request(const struct drm_i915_gem_request *req,
> * assume we won't see one in the near future but require
> * the engine->seqno_barrier() to fixup coherency.
> */
> - if (atomic_read(&engine->irq_count) != irq)
> + if (READ_ONCE(engine->breadcrumbs.irq_count) != irq)
> break;
>
> if (signal_pending_state(state, current))
> diff --git a/drivers/gpu/drm/i915/i915_irq.c b/drivers/gpu/drm/i915/i915_irq.c
> index 0b272501b738..e5f76d580010 100644
> --- a/drivers/gpu/drm/i915/i915_irq.c
> +++ b/drivers/gpu/drm/i915/i915_irq.c
> @@ -1073,9 +1073,6 @@ static void notify_ring(struct intel_engine_cs *engine)
> if (unlikely(!engine->breadcrumbs.irq_armed))
> return;
>
> - atomic_inc(&engine->irq_count);
> - set_bit(ENGINE_IRQ_BREADCRUMB, &engine->irq_posted);
> -
> rcu_read_lock();
>
> spin_lock(&engine->breadcrumbs.irq_lock);
> @@ -1107,6 +1104,9 @@ static void notify_ring(struct intel_engine_cs *engine)
> i915_seqno_passed(seqno, wait->seqno - 1))
> tsk = wait->tsk;
> }
> +
> + engine->breadcrumbs.irq_count++;
> + __set_bit(ENGINE_IRQ_BREADCRUMB, &engine->irq_posted);
I'm nervous about moving the ENGINE_IRQ_BREADCRUMB setting to be
conditional. __i915_request_irq_complete documents the ordering of these
things is crucial so I worry we don't miss a wakeup. Once bitten twice
shy? Don't know..
irq_count change looks safe, so can I, once again, suggest to split into
two patches? :/
Regards,
Tvrtko
> } else {
> if (engine->breadcrumbs.irq_armed)
> __intel_engine_disarm_breadcrumbs(engine);
> diff --git a/drivers/gpu/drm/i915/intel_breadcrumbs.c b/drivers/gpu/drm/i915/intel_breadcrumbs.c
> index e3667dc1e96d..7c82cfe23922 100644
> --- a/drivers/gpu/drm/i915/intel_breadcrumbs.c
> +++ b/drivers/gpu/drm/i915/intel_breadcrumbs.c
> @@ -98,12 +98,14 @@ static void intel_breadcrumbs_hangcheck(struct timer_list *t)
> struct intel_engine_cs *engine =
> from_timer(engine, t, breadcrumbs.hangcheck);
> struct intel_breadcrumbs *b = &engine->breadcrumbs;
> + unsigned int irq_count;
>
> if (!b->irq_armed)
> return;
>
> - if (b->hangcheck_interrupts != atomic_read(&engine->irq_count)) {
> - b->hangcheck_interrupts = atomic_read(&engine->irq_count);
> + irq_count = READ_ONCE(b->irq_count);
> + if (b->hangcheck_interrupts != irq_count) {
> + b->hangcheck_interrupts = irq_count;
> mod_timer(&b->hangcheck, wait_timeout());
> return;
> }
> @@ -176,7 +178,7 @@ static void irq_enable(struct intel_engine_cs *engine)
> * we still need to force the barrier before reading the seqno,
> * just in case.
> */
> - set_bit(ENGINE_IRQ_BREADCRUMB, &engine->irq_posted);
> + __set_bit(ENGINE_IRQ_BREADCRUMB, &engine->irq_posted);
>
> /* Caller disables interrupts */
> spin_lock(&engine->i915->irq_lock);
> @@ -270,13 +272,14 @@ static bool use_fake_irq(const struct intel_breadcrumbs *b)
> if (!test_bit(engine->id, &engine->i915->gpu_error.missed_irq_rings))
> return false;
>
> - /* Only start with the heavy weight fake irq timer if we have not
> + /*
> + * Only start with the heavy weight fake irq timer if we have not
> * seen any interrupts since enabling it the first time. If the
> * interrupts are still arriving, it means we made a mistake in our
> * engine->seqno_barrier(), a timing error that should be transient
> * and unlikely to reoccur.
> */
> - return atomic_read(&engine->irq_count) == b->hangcheck_interrupts;
> + return READ_ONCE(b->irq_count) == b->hangcheck_interrupts;
> }
>
> static void enable_fake_irq(struct intel_breadcrumbs *b)
> diff --git a/drivers/gpu/drm/i915/intel_ringbuffer.h b/drivers/gpu/drm/i915/intel_ringbuffer.h
> index c5ff203e42d6..f406d0ff4612 100644
> --- a/drivers/gpu/drm/i915/intel_ringbuffer.h
> +++ b/drivers/gpu/drm/i915/intel_ringbuffer.h
> @@ -305,7 +305,6 @@ struct intel_engine_cs {
>
> struct drm_i915_gem_object *default_state;
>
> - atomic_t irq_count;
> unsigned long irq_posted;
> #define ENGINE_IRQ_BREADCRUMB 0
> #define ENGINE_IRQ_EXECLIST 1
> @@ -340,6 +339,7 @@ struct intel_engine_cs {
>
> unsigned int hangcheck_interrupts;
> unsigned int irq_enabled;
> + unsigned int irq_count;
>
> bool irq_armed : 1;
> I915_SELFTEST_DECLARE(bool mock : 1);
>
_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/intel-gfx
next prev parent reply other threads:[~2018-01-17 12:12 UTC|newest]
Thread overview: 47+ messages / expand[flat|nested] mbox.gz Atom feed top
2018-01-15 21:24 Prevent trivial oom from gem_exec_nop/sequential Chris Wilson
2018-01-15 21:24 ` [PATCH 01/10] drm/i915: Only attempt to scan the requested number of shrinker slabs Chris Wilson
2018-01-17 10:29 ` Tvrtko Ursulin
2018-01-18 9:16 ` Chris Wilson
2018-01-18 9:19 ` Chris Wilson
2018-01-15 21:24 ` [PATCH 02/10] drm/i915: Move i915_gem_retire_work_handler Chris Wilson
2018-01-17 10:33 ` Tvrtko Ursulin
2018-01-15 21:24 ` [PATCH 03/10] drm/i915: Shrink the GEM kmem_caches upon idling Chris Wilson
2018-01-16 10:00 ` Tvrtko Ursulin
2018-01-16 10:19 ` Chris Wilson
2018-01-16 13:05 ` [PATCH v2] " Chris Wilson
2018-01-16 15:12 ` Tvrtko Ursulin
2018-01-16 15:16 ` Tvrtko Ursulin
2018-01-16 15:21 ` Chris Wilson
2018-01-16 17:25 ` Tvrtko Ursulin
2018-01-16 17:36 ` Chris Wilson
2018-01-17 10:18 ` Tvrtko Ursulin
2018-01-18 18:06 ` Chris Wilson
2018-01-15 21:24 ` [PATCH 04/10] drm/i915: Shrink the request kmem_cache on allocation error Chris Wilson
2018-01-16 10:10 ` Tvrtko Ursulin
2018-01-16 10:26 ` Chris Wilson
2018-01-16 13:15 ` [PATCH v2] " Chris Wilson
2018-01-16 15:19 ` Tvrtko Ursulin
2018-01-15 21:24 ` [PATCH 05/10] drm/i915: Trim the retired request queue after submitting Chris Wilson
2018-01-16 10:18 ` Tvrtko Ursulin
2018-01-16 10:32 ` Chris Wilson
2018-01-17 10:23 ` Tvrtko Ursulin
2018-01-16 13:30 ` [PATCH v2] " Chris Wilson
2018-01-15 21:24 ` [PATCH 06/10] drm/i915/breadcrumbs: Drop request reference for the signaler thread Chris Wilson
2018-01-15 21:24 ` [PATCH 07/10] drm/i915: Reduce spinlock hold time during notify_ring() interrupt Chris Wilson
2018-01-17 10:45 ` Tvrtko Ursulin
2018-01-18 18:08 ` Chris Wilson
2018-01-18 18:10 ` Chris Wilson
2018-01-15 21:24 ` [PATCH 08/10] drm/i915: Move the irq_counter inside the spinlock Chris Wilson
2018-01-17 12:12 ` Tvrtko Ursulin [this message]
2018-01-15 21:24 ` [PATCH 09/10] drm/i915: Only signal from interrupt when requested Chris Wilson
2018-01-17 12:22 ` Tvrtko Ursulin
2018-01-18 18:12 ` Chris Wilson
2018-01-15 21:24 ` [PATCH 10/10] drm/i915/breadcrumbs: Reduce signaler rbtree to a sorted list Chris Wilson
2018-01-15 22:04 ` ✓ Fi.CI.BAT: success for series starting with [01/10] drm/i915: Only attempt to scan the requested number of shrinker slabs Patchwork
2018-01-16 9:21 ` ✓ Fi.CI.IGT: " Patchwork
2018-01-16 9:52 ` Prevent trivial oom from gem_exec_nop/sequential Tvrtko Ursulin
2018-01-16 10:02 ` Chris Wilson
2018-01-16 13:10 ` Chris Wilson
2018-01-16 13:42 ` ✓ Fi.CI.BAT: success for series starting with [01/10] drm/i915: Only attempt to scan the requested number of shrinker slabs (rev3) Patchwork
2018-01-16 14:02 ` ✓ Fi.CI.BAT: success for series starting with [01/10] drm/i915: Only attempt to scan the requested number of shrinker slabs (rev4) Patchwork
2018-01-16 15:29 ` ✓ Fi.CI.IGT: " Patchwork
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=7766d39f-e066-1ada-1e27-189646672d34@linux.intel.com \
--to=tvrtko.ursulin@linux.intel.com \
--cc=chris@chris-wilson.co.uk \
--cc=intel-gfx@lists.freedesktop.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox