From: Daniel Vetter <daniel@ffwll.ch>
To: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
Cc: David Airlie <airlied@linux.ie>,
intel-gfx@lists.freedesktop.org,
Peter Zijlstra <peterz@infradead.org>,
dri-devel@lists.freedesktop.org,
Thomas Gleixner <tglx@linutronix.de>
Subject: Re: [Intel-gfx] [PATCH] drm/i915: Don't disable interrupts and pretend a lock as been acquired in __timeline_mark_lock().
Date: Fri, 19 Nov 2021 17:04:00 +0100 [thread overview]
Message-ID: <YZfK8LDcGzQEchel@phenom.ffwll.local> (raw)
In-Reply-To: <20211118165914.pckik75emivsilek@linutronix.de>
On Thu, Nov 18, 2021 at 05:59:14PM +0100, Sebastian Andrzej Siewior wrote:
> This is a revert of commits
> d67739268cf0e ("drm/i915/gt: Mark up the nested engine-pm timeline lock as irqsafe")
> 6c69a45445af9 ("drm/i915/gt: Mark context->active_count as protected by timeline->mutex")
>
> The existing code leads to a different behaviour depending on whether
> lockdep is enabled or not. Any following lock that is acquired without
> disabling interrupts (but needs to) will not be noticed by lockdep.
>
> This it not just a lockdep annotation but is used but an actual mutex_t
> that is properly used as a lock but in case of __timeline_mark_lock()
> lockdep is only told that it is acquired but no lock has been acquired.
>
> It appears that its purpose is just satisfy the lockdep_assert_held()
> check in intel_context_mark_active(). The other problem with disabling
> interrupts is that on PREEMPT_RT interrupts are also disabled which
> leads to problems for instance later during memory allocation.
>
> Add a CONTEXT_IS_PARKED bit to intel_engine_cs and set_bit/clear_bit it
> instead of mutex_acquire/mutex_release. Use test_bit in the two
> identified spots which relied on the lockdep annotation.
>
> Cc: Peter Zijlstra <peterz@infradead.org>
> Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
Yeah if we can simplify this with reverts then I'm all for this.
Acked-by: Daniel Vetter <daniel.vetter@ffwll.ch>
I've asked drm/i915 maintainers to check&merge.
-Daniel
> ---
> drivers/gpu/drm/i915/gt/intel_context.h | 3 +-
> drivers/gpu/drm/i915/gt/intel_context_types.h | 1
> drivers/gpu/drm/i915/gt/intel_engine_pm.c | 38 +-------------------------
> drivers/gpu/drm/i915/i915_request.h | 3 +-
> 4 files changed, 7 insertions(+), 38 deletions(-)
>
> --- a/drivers/gpu/drm/i915/gt/intel_context.h
> +++ b/drivers/gpu/drm/i915/gt/intel_context.h
> @@ -211,7 +211,8 @@ static inline void intel_context_enter(s
>
> static inline void intel_context_mark_active(struct intel_context *ce)
> {
> - lockdep_assert_held(&ce->timeline->mutex);
> + lockdep_assert(lockdep_is_held(&ce->timeline->mutex) ||
> + test_bit(CONTEXT_IS_PARKED, &ce->flags));
> ++ce->active_count;
> }
>
> --- a/drivers/gpu/drm/i915/gt/intel_context_types.h
> +++ b/drivers/gpu/drm/i915/gt/intel_context_types.h
> @@ -118,6 +118,7 @@ struct intel_context {
> #define CONTEXT_LRCA_DIRTY 9
> #define CONTEXT_GUC_INIT 10
> #define CONTEXT_PERMA_PIN 11
> +#define CONTEXT_IS_PARKED 12
>
> struct {
> u64 timeout_us;
> --- a/drivers/gpu/drm/i915/gt/intel_engine_pm.c
> +++ b/drivers/gpu/drm/i915/gt/intel_engine_pm.c
> @@ -80,39 +80,6 @@ static int __engine_unpark(struct intel_
> return 0;
> }
>
> -#if IS_ENABLED(CONFIG_LOCKDEP)
> -
> -static unsigned long __timeline_mark_lock(struct intel_context *ce)
> -{
> - unsigned long flags;
> -
> - local_irq_save(flags);
> - mutex_acquire(&ce->timeline->mutex.dep_map, 2, 0, _THIS_IP_);
> -
> - return flags;
> -}
> -
> -static void __timeline_mark_unlock(struct intel_context *ce,
> - unsigned long flags)
> -{
> - mutex_release(&ce->timeline->mutex.dep_map, _THIS_IP_);
> - local_irq_restore(flags);
> -}
> -
> -#else
> -
> -static unsigned long __timeline_mark_lock(struct intel_context *ce)
> -{
> - return 0;
> -}
> -
> -static void __timeline_mark_unlock(struct intel_context *ce,
> - unsigned long flags)
> -{
> -}
> -
> -#endif /* !IS_ENABLED(CONFIG_LOCKDEP) */
> -
> static void duration(struct dma_fence *fence, struct dma_fence_cb *cb)
> {
> struct i915_request *rq = to_request(fence);
> @@ -159,7 +126,6 @@ static bool switch_to_kernel_context(str
> {
> struct intel_context *ce = engine->kernel_context;
> struct i915_request *rq;
> - unsigned long flags;
> bool result = true;
>
> /*
> @@ -214,7 +180,7 @@ static bool switch_to_kernel_context(str
> * engine->wakeref.count, we may see the request completion and retire
> * it causing an underflow of the engine->wakeref.
> */
> - flags = __timeline_mark_lock(ce);
> + set_bit(CONTEXT_IS_PARKED, &ce->flags);
> GEM_BUG_ON(atomic_read(&ce->timeline->active_count) < 0);
>
> rq = __i915_request_create(ce, GFP_NOWAIT);
> @@ -246,7 +212,7 @@ static bool switch_to_kernel_context(str
>
> result = false;
> out_unlock:
> - __timeline_mark_unlock(ce, flags);
> + clear_bit(CONTEXT_IS_PARKED, &ce->flags);
> return result;
> }
>
> --- a/drivers/gpu/drm/i915/i915_request.h
> +++ b/drivers/gpu/drm/i915/i915_request.h
> @@ -642,7 +642,8 @@ i915_request_timeline(const struct i915_
> {
> /* Valid only while the request is being constructed (or retired). */
> return rcu_dereference_protected(rq->timeline,
> - lockdep_is_held(&rcu_access_pointer(rq->timeline)->mutex));
> + lockdep_is_held(&rcu_access_pointer(rq->timeline)->mutex) ||
> + test_bit(CONTEXT_IS_PARKED, &rq->context->flags));
> }
>
> static inline struct i915_gem_context *
--
Daniel Vetter
Software Engineer, Intel Corporation
http://blog.ffwll.ch
WARNING: multiple messages have this Message-ID (diff)
From: Daniel Vetter <daniel@ffwll.ch>
To: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
Cc: David Airlie <airlied@linux.ie>,
intel-gfx@lists.freedesktop.org,
Peter Zijlstra <peterz@infradead.org>,
dri-devel@lists.freedesktop.org,
Rodrigo Vivi <rodrigo.vivi@intel.com>,
Thomas Gleixner <tglx@linutronix.de>
Subject: Re: [PATCH] drm/i915: Don't disable interrupts and pretend a lock as been acquired in __timeline_mark_lock().
Date: Fri, 19 Nov 2021 17:04:00 +0100 [thread overview]
Message-ID: <YZfK8LDcGzQEchel@phenom.ffwll.local> (raw)
In-Reply-To: <20211118165914.pckik75emivsilek@linutronix.de>
On Thu, Nov 18, 2021 at 05:59:14PM +0100, Sebastian Andrzej Siewior wrote:
> This is a revert of commits
> d67739268cf0e ("drm/i915/gt: Mark up the nested engine-pm timeline lock as irqsafe")
> 6c69a45445af9 ("drm/i915/gt: Mark context->active_count as protected by timeline->mutex")
>
> The existing code leads to a different behaviour depending on whether
> lockdep is enabled or not. Any following lock that is acquired without
> disabling interrupts (but needs to) will not be noticed by lockdep.
>
> This it not just a lockdep annotation but is used but an actual mutex_t
> that is properly used as a lock but in case of __timeline_mark_lock()
> lockdep is only told that it is acquired but no lock has been acquired.
>
> It appears that its purpose is just satisfy the lockdep_assert_held()
> check in intel_context_mark_active(). The other problem with disabling
> interrupts is that on PREEMPT_RT interrupts are also disabled which
> leads to problems for instance later during memory allocation.
>
> Add a CONTEXT_IS_PARKED bit to intel_engine_cs and set_bit/clear_bit it
> instead of mutex_acquire/mutex_release. Use test_bit in the two
> identified spots which relied on the lockdep annotation.
>
> Cc: Peter Zijlstra <peterz@infradead.org>
> Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
Yeah if we can simplify this with reverts then I'm all for this.
Acked-by: Daniel Vetter <daniel.vetter@ffwll.ch>
I've asked drm/i915 maintainers to check&merge.
-Daniel
> ---
> drivers/gpu/drm/i915/gt/intel_context.h | 3 +-
> drivers/gpu/drm/i915/gt/intel_context_types.h | 1
> drivers/gpu/drm/i915/gt/intel_engine_pm.c | 38 +-------------------------
> drivers/gpu/drm/i915/i915_request.h | 3 +-
> 4 files changed, 7 insertions(+), 38 deletions(-)
>
> --- a/drivers/gpu/drm/i915/gt/intel_context.h
> +++ b/drivers/gpu/drm/i915/gt/intel_context.h
> @@ -211,7 +211,8 @@ static inline void intel_context_enter(s
>
> static inline void intel_context_mark_active(struct intel_context *ce)
> {
> - lockdep_assert_held(&ce->timeline->mutex);
> + lockdep_assert(lockdep_is_held(&ce->timeline->mutex) ||
> + test_bit(CONTEXT_IS_PARKED, &ce->flags));
> ++ce->active_count;
> }
>
> --- a/drivers/gpu/drm/i915/gt/intel_context_types.h
> +++ b/drivers/gpu/drm/i915/gt/intel_context_types.h
> @@ -118,6 +118,7 @@ struct intel_context {
> #define CONTEXT_LRCA_DIRTY 9
> #define CONTEXT_GUC_INIT 10
> #define CONTEXT_PERMA_PIN 11
> +#define CONTEXT_IS_PARKED 12
>
> struct {
> u64 timeout_us;
> --- a/drivers/gpu/drm/i915/gt/intel_engine_pm.c
> +++ b/drivers/gpu/drm/i915/gt/intel_engine_pm.c
> @@ -80,39 +80,6 @@ static int __engine_unpark(struct intel_
> return 0;
> }
>
> -#if IS_ENABLED(CONFIG_LOCKDEP)
> -
> -static unsigned long __timeline_mark_lock(struct intel_context *ce)
> -{
> - unsigned long flags;
> -
> - local_irq_save(flags);
> - mutex_acquire(&ce->timeline->mutex.dep_map, 2, 0, _THIS_IP_);
> -
> - return flags;
> -}
> -
> -static void __timeline_mark_unlock(struct intel_context *ce,
> - unsigned long flags)
> -{
> - mutex_release(&ce->timeline->mutex.dep_map, _THIS_IP_);
> - local_irq_restore(flags);
> -}
> -
> -#else
> -
> -static unsigned long __timeline_mark_lock(struct intel_context *ce)
> -{
> - return 0;
> -}
> -
> -static void __timeline_mark_unlock(struct intel_context *ce,
> - unsigned long flags)
> -{
> -}
> -
> -#endif /* !IS_ENABLED(CONFIG_LOCKDEP) */
> -
> static void duration(struct dma_fence *fence, struct dma_fence_cb *cb)
> {
> struct i915_request *rq = to_request(fence);
> @@ -159,7 +126,6 @@ static bool switch_to_kernel_context(str
> {
> struct intel_context *ce = engine->kernel_context;
> struct i915_request *rq;
> - unsigned long flags;
> bool result = true;
>
> /*
> @@ -214,7 +180,7 @@ static bool switch_to_kernel_context(str
> * engine->wakeref.count, we may see the request completion and retire
> * it causing an underflow of the engine->wakeref.
> */
> - flags = __timeline_mark_lock(ce);
> + set_bit(CONTEXT_IS_PARKED, &ce->flags);
> GEM_BUG_ON(atomic_read(&ce->timeline->active_count) < 0);
>
> rq = __i915_request_create(ce, GFP_NOWAIT);
> @@ -246,7 +212,7 @@ static bool switch_to_kernel_context(str
>
> result = false;
> out_unlock:
> - __timeline_mark_unlock(ce, flags);
> + clear_bit(CONTEXT_IS_PARKED, &ce->flags);
> return result;
> }
>
> --- a/drivers/gpu/drm/i915/i915_request.h
> +++ b/drivers/gpu/drm/i915/i915_request.h
> @@ -642,7 +642,8 @@ i915_request_timeline(const struct i915_
> {
> /* Valid only while the request is being constructed (or retired). */
> return rcu_dereference_protected(rq->timeline,
> - lockdep_is_held(&rcu_access_pointer(rq->timeline)->mutex));
> + lockdep_is_held(&rcu_access_pointer(rq->timeline)->mutex) ||
> + test_bit(CONTEXT_IS_PARKED, &rq->context->flags));
> }
>
> static inline struct i915_gem_context *
--
Daniel Vetter
Software Engineer, Intel Corporation
http://blog.ffwll.ch
next prev parent reply other threads:[~2021-11-19 16:04 UTC|newest]
Thread overview: 22+ messages / expand[flat|nested] mbox.gz Atom feed top
2021-11-18 16:59 [Intel-gfx] [PATCH] drm/i915: Don't disable interrupts and pretend a lock as been acquired in __timeline_mark_lock() Sebastian Andrzej Siewior
2021-11-18 16:59 ` Sebastian Andrzej Siewior
2021-11-18 17:14 ` [Intel-gfx] ✗ Fi.CI.CHECKPATCH: warning for " Patchwork
2021-11-18 17:16 ` [Intel-gfx] ✗ Fi.CI.SPARSE: " Patchwork
2021-11-18 17:44 ` [Intel-gfx] ✓ Fi.CI.BAT: success " Patchwork
2021-11-19 8:47 ` [Intel-gfx] ✗ Fi.CI.IGT: failure " Patchwork
2021-11-19 14:58 ` Sebastian Andrzej Siewior
2021-11-19 16:04 ` Daniel Vetter [this message]
2021-11-19 16:04 ` [PATCH] " Daniel Vetter
2021-11-30 16:33 ` [Intel-gfx] " Sebastian Andrzej Siewior
2021-11-30 16:33 ` Sebastian Andrzej Siewior
2021-12-07 18:00 ` [Intel-gfx] " Daniel Vetter
2021-12-07 18:00 ` Daniel Vetter
2021-12-08 9:10 ` [Intel-gfx] " Tvrtko Ursulin
2021-12-10 20:44 ` [Intel-gfx] [PATCH v2] " Sebastian Andrzej Siewior
2021-12-10 20:44 ` Sebastian Andrzej Siewior
2021-12-13 9:25 ` [Intel-gfx] " Tvrtko Ursulin
2021-12-13 9:25 ` Tvrtko Ursulin
2021-12-10 21:37 ` [Intel-gfx] ✗ Fi.CI.CHECKPATCH: warning for drm/i915: Don't disable interrupts and pretend a lock as been acquired in __timeline_mark_lock(). (rev2) Patchwork
2021-12-10 21:38 ` [Intel-gfx] ✗ Fi.CI.SPARSE: " Patchwork
2021-12-10 22:10 ` [Intel-gfx] ✓ Fi.CI.BAT: success " Patchwork
2021-12-11 20:58 ` [Intel-gfx] ✓ 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=YZfK8LDcGzQEchel@phenom.ffwll.local \
--to=daniel@ffwll.ch \
--cc=airlied@linux.ie \
--cc=bigeasy@linutronix.de \
--cc=dri-devel@lists.freedesktop.org \
--cc=intel-gfx@lists.freedesktop.org \
--cc=peterz@infradead.org \
--cc=tglx@linutronix.de \
/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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.