Re: [ANNOUNCE] v5.4.17-rt9

From: Fernando Lopez-Lezcano
Date: Fri Feb 07 2020 - 01:14:31 EST


On 2/6/20 10:11 PM, Mike Galbraith wrote:
On Thu, 2020-02-06 at 15:59 -0800, Fernando Lopez-Lezcano wrote:
On 2/4/20 8:58 AM, Sebastian Andrzej Siewior wrote:
Dear RT folks!

I'm pleased to announce the v5.4.17-rt9 patch set.

Thanks!
I see a continuous stream of these:

(snips gripage)

Yup, d67739268cf0 annoys RT locking if lockdep is enabled. The below
shut it up for my i915 equipped lappy.

Wow, Mike, thanks!, will try it out and report...
(might take me a couple of days)

-- Fernando


drm/i915/gt: use a LOCAL_IRQ_LOCK in __timeline_mark_lock()

Quoting drm/i915/gt: Mark up the nested engine-pm timeline lock as irqsafe

We use a fake timeline->mutex lock to reassure lockdep that the timeline
is always locked when emitting requests. However, the use inside
__engine_park() may be inside hardirq and so lockdep now complains about
the mixed irq-state of the nested locked. Disable irqs around the
lockdep tracking to keep it happy.

This lockdep appeasement breaks RT because we take sleeping locks between
__timeline_mark_lock()/unlock(). Use a LOCAL_IRQ_LOCK instead.

Signed-off-by: Mike Galbraith <efaukt@xxxxxx>
---
drivers/gpu/drm/i915/gt/intel_engine_pm.c | 7 +++++--
1 file changed, 5 insertions(+), 2 deletions(-)

--- a/drivers/gpu/drm/i915/gt/intel_engine_pm.c
+++ b/drivers/gpu/drm/i915/gt/intel_engine_pm.c
@@ -38,12 +38,15 @@ static int __engine_unpark(struct intel_
}

#if IS_ENABLED(CONFIG_LOCKDEP)
+#include <linux/locallock.h>
+
+static DEFINE_LOCAL_IRQ_LOCK(timeline_lock);

static inline unsigned long __timeline_mark_lock(struct intel_context *ce)
{
unsigned long flags;

- local_irq_save(flags);
+ local_lock_irqsave(timeline_lock, flags);
mutex_acquire(&ce->timeline->mutex.dep_map, 2, 0, _THIS_IP_);

return flags;
@@ -53,7 +56,7 @@ static inline void __timeline_mark_unloc
unsigned long flags)
{
mutex_release(&ce->timeline->mutex.dep_map, 0, _THIS_IP_);
- local_irq_restore(flags);
+ local_unlock_irqrestore(timeline_lock, flags);
}

#else