diff mbox series

[RFT] Revert "lockdep: Enable PROVE_RAW_LOCK_NESTING with PROVE_LOCKING."

Message ID 20241209135602.2716023-1-luciano.coelho@intel.com (mailing list archive)
State New
Headers show
Series [RFT] Revert "lockdep: Enable PROVE_RAW_LOCK_NESTING with PROVE_LOCKING." | expand

Commit Message

Luca Coelho Dec. 9, 2024, 1:53 p.m. UTC
This reverts commit 560af5dc839eef08a273908f390cfefefb82aa04.

Signed-off-by: Luca Coelho <luciano.coelho@intel.com>
---

It seems that we have a few issues with this configuration in xe and
in i915.  Let's try to revert it to see if the problems we're seeing
go away.

Note, these are _real_ issues, but only if CONFIG_RT is enabled, so the actual issues need to be solved properly, but we can revert this change until then, to avoid regressions.


 lib/Kconfig.debug | 12 ++++++++++--
 1 file changed, 10 insertions(+), 2 deletions(-)

Comments

Luca Coelho Dec. 9, 2024, 1:58 p.m. UTC | #1
Oops, I intended to send this to trybot and intel-xe (not intel-gfx),
sorry.  But now it's too late and if I send it there, we will just use
more resources.

--
Cheers,
Luca.


On Mon, 2024-12-09 at 15:53 +0200, Luca Coelho wrote:
> This reverts commit 560af5dc839eef08a273908f390cfefefb82aa04.
> 
> Signed-off-by: Luca Coelho <luciano.coelho@intel.com>
> ---
> 
> It seems that we have a few issues with this configuration in xe and
> in i915.  Let's try to revert it to see if the problems we're seeing
> go away.
> 
> Note, these are _real_ issues, but only if CONFIG_RT is enabled, so the actual issues need to be solved properly, but we can revert this change until then, to avoid regressions.
> 
> 
>  lib/Kconfig.debug | 12 ++++++++++--
>  1 file changed, 10 insertions(+), 2 deletions(-)
> 
> diff --git a/lib/Kconfig.debug b/lib/Kconfig.debug
> index f3d723705879..de4ffe09323b 100644
> --- a/lib/Kconfig.debug
> +++ b/lib/Kconfig.debug
> @@ -1397,14 +1397,22 @@ config PROVE_LOCKING
>  	 For more details, see Documentation/locking/lockdep-design.rst.
>  
>  config PROVE_RAW_LOCK_NESTING
> -	bool
> +	bool "Enable raw_spinlock - spinlock nesting checks"
>  	depends on PROVE_LOCKING
> -	default y
> +	default n
>  	help
>  	 Enable the raw_spinlock vs. spinlock nesting checks which ensure
>  	 that the lock nesting rules for PREEMPT_RT enabled kernels are
>  	 not violated.
>  
> +	 NOTE: There are known nesting problems. So if you enable this
> +	 option expect lockdep splats until these problems have been fully
> +	 addressed which is work in progress. This config switch allows to
> +	 identify and analyze these problems. It will be removed and the
> +	 check permanently enabled once the main issues have been fixed.
> +
> +	 If unsure, select N.
> +
>  config LOCK_STAT
>  	bool "Lock usage statistics"
>  	depends on DEBUG_KERNEL && LOCK_DEBUGGING_SUPPORT
Lucas De Marchi Dec. 10, 2024, 5 p.m. UTC | #2
On Mon, Dec 09, 2024 at 03:53:51PM +0200, Luca Coelho wrote:
>This reverts commit 560af5dc839eef08a273908f390cfefefb82aa04.
>
>Signed-off-by: Luca Coelho <luciano.coelho@intel.com>
>---
>
>It seems that we have a few issues with this configuration in xe and
>in i915.  Let's try to revert it to see if the problems we're seeing
>go away.
>
>Note, these are _real_ issues, but only if CONFIG_RT is enabled, so the actual issues need to be solved properly, but we can revert this change until then, to avoid regressions.

+Jani Nikula, +Rodrigo

I'm thinking about landing this in topic/core-for-CI.  It seems we have
quite a few locks to revisit - we are taking spinlocks while holding
raw_spinlocks and until now there's no warning about this bug.

It's a real problem only for PREEMPT_RT since otherwise there's
no difference between the 2 lock types. However fixing this may involve
quite a few changes: if we convert the lock to raw we may need to
cascade the conversions to additional locks.  The ones I identified are:
pmu->lock, which would also need to have uncore->lock converted, which
would then probably cascade to quite a few others :-/. I'm not sure
converting uncore->lock will actually be a good thing.

I will keep digging.


Lucas De Marchi


>
>
> lib/Kconfig.debug | 12 ++++++++++--
> 1 file changed, 10 insertions(+), 2 deletions(-)
>
>diff --git a/lib/Kconfig.debug b/lib/Kconfig.debug
>index f3d723705879..de4ffe09323b 100644
>--- a/lib/Kconfig.debug
>+++ b/lib/Kconfig.debug
>@@ -1397,14 +1397,22 @@ config PROVE_LOCKING
> 	 For more details, see Documentation/locking/lockdep-design.rst.
>
> config PROVE_RAW_LOCK_NESTING
>-	bool
>+	bool "Enable raw_spinlock - spinlock nesting checks"
> 	depends on PROVE_LOCKING
>-	default y
>+	default n
> 	help
> 	 Enable the raw_spinlock vs. spinlock nesting checks which ensure
> 	 that the lock nesting rules for PREEMPT_RT enabled kernels are
> 	 not violated.
>
>+	 NOTE: There are known nesting problems. So if you enable this
>+	 option expect lockdep splats until these problems have been fully
>+	 addressed which is work in progress. This config switch allows to
>+	 identify and analyze these problems. It will be removed and the
>+	 check permanently enabled once the main issues have been fixed.
>+
>+	 If unsure, select N.
>+
> config LOCK_STAT
> 	bool "Lock usage statistics"
> 	depends on DEBUG_KERNEL && LOCK_DEBUGGING_SUPPORT
>-- 
>2.45.2
>
Rodrigo Vivi Dec. 10, 2024, 10:55 p.m. UTC | #3
On Tue, Dec 10, 2024 at 09:00:13AM -0800, Lucas De Marchi wrote:
> On Mon, Dec 09, 2024 at 03:53:51PM +0200, Luca Coelho wrote:
> > This reverts commit 560af5dc839eef08a273908f390cfefefb82aa04.
> > 
> > Signed-off-by: Luca Coelho <luciano.coelho@intel.com>
> > ---
> > 
> > It seems that we have a few issues with this configuration in xe and
> > in i915.  Let's try to revert it to see if the problems we're seeing
> > go away.
> > 
> > Note, these are _real_ issues, but only if CONFIG_RT is enabled, so the actual issues need to be solved properly, but we can revert this change until then, to avoid regressions.
> 
> +Jani Nikula, +Rodrigo
> 
> I'm thinking about landing this in topic/core-for-CI.  It seems we have
> quite a few locks to revisit - we are taking spinlocks while holding
> raw_spinlocks and until now there's no warning about this bug.

could you point to one case? I don't see us using the raw_spinlocks...

> 
> It's a real problem only for PREEMPT_RT since otherwise there's
> no difference between the 2 lock types. However fixing this may involve
> quite a few changes: if we convert the lock to raw we may need to
> cascade the conversions to additional locks.  The ones I identified are:
> pmu->lock, which would also need to have uncore->lock converted, which
> would then probably cascade to quite a few others :-/. I'm not sure
> converting uncore->lock will actually be a good thing.

hmm raw_spinlocks for the lowlevel might not be a bad idea, but perhaps
we need to convert the other way around the upper levels?

> 
> I will keep digging.

Ack on getting this to topic/core-for-CI so we don't block our
CI while we investigate and fix this.

Thanks,
Rodrigo.

> 
> 
> Lucas De Marchi
> 
> 
> > 
> > 
> > lib/Kconfig.debug | 12 ++++++++++--
> > 1 file changed, 10 insertions(+), 2 deletions(-)
> > 
> > diff --git a/lib/Kconfig.debug b/lib/Kconfig.debug
> > index f3d723705879..de4ffe09323b 100644
> > --- a/lib/Kconfig.debug
> > +++ b/lib/Kconfig.debug
> > @@ -1397,14 +1397,22 @@ config PROVE_LOCKING
> > 	 For more details, see Documentation/locking/lockdep-design.rst.
> > 
> > config PROVE_RAW_LOCK_NESTING
> > -	bool
> > +	bool "Enable raw_spinlock - spinlock nesting checks"
> > 	depends on PROVE_LOCKING
> > -	default y
> > +	default n
> > 	help
> > 	 Enable the raw_spinlock vs. spinlock nesting checks which ensure
> > 	 that the lock nesting rules for PREEMPT_RT enabled kernels are
> > 	 not violated.
> > 
> > +	 NOTE: There are known nesting problems. So if you enable this
> > +	 option expect lockdep splats until these problems have been fully
> > +	 addressed which is work in progress. This config switch allows to
> > +	 identify and analyze these problems. It will be removed and the
> > +	 check permanently enabled once the main issues have been fixed.
> > +
> > +	 If unsure, select N.
> > +
> > config LOCK_STAT
> > 	bool "Lock usage statistics"
> > 	depends on DEBUG_KERNEL && LOCK_DEBUGGING_SUPPORT
> > -- 
> > 2.45.2
> >
Lucas De Marchi Dec. 11, 2024, midnight UTC | #4
+Peter and Thomas, for question below about the use of raw_spinlock_t in perf

[ Note that the patch by itself is not proposing this revert to be merged in
   any tree going to Linus - that would just shoot the messenger - it's
   just a temporary stop gap to get our CI running again. Below I'm
   looking for a real solution... ]

On Tue, Dec 10, 2024 at 05:55:35PM -0500, Rodrigo Vivi wrote:
>On Tue, Dec 10, 2024 at 09:00:13AM -0800, Lucas De Marchi wrote:
>> On Mon, Dec 09, 2024 at 03:53:51PM +0200, Luca Coelho wrote:
>> > This reverts commit 560af5dc839eef08a273908f390cfefefb82aa04.
>> >
>> > Signed-off-by: Luca Coelho <luciano.coelho@intel.com>
>> > ---
>> >
>> > It seems that we have a few issues with this configuration in xe and
>> > in i915.  Let's try to revert it to see if the problems we're seeing
>> > go away.
>> >
>> > Note, these are _real_ issues, but only if CONFIG_RT is enabled, so the actual issues need to be solved properly, but we can revert this change until then, to avoid regressions.
>>
>> +Jani Nikula, +Rodrigo
>>
>> I'm thinking about landing this in topic/core-for-CI.  It seems we have
>> quite a few locks to revisit - we are taking spinlocks while holding
>> raw_spinlocks and until now there's no warning about this bug.
>
>could you point to one case? I don't see us using the raw_spinlocks...

main entrypoint is perf pmu. All these purple results:
https://intel-gfx-ci.01.org/tree/drm-tip/shards-all.html?testfilter=perf

Example:

<4> [96.732915] =============================
<4> [96.732950] [ BUG: Invalid wait context ]
<4> [96.732982] 6.13.0-rc2-CI_DRM_15816-g2223c2c738ec+ #1 Not tainted
<4> [96.733026] -----------------------------
<4> [96.733056] swapper/0/0 is trying to lock:
<4> [96.733088] ffff888129513910 (&pmu->lock){....}-{3:3}, at: i915_pmu_enable+0x48/0x3a0 [i915]
<4> [96.733485] other info that might help us debug this:
<4> [96.733536] context-{5:5}
<4> [96.733565] 1 lock held by swapper/0/0:
<4> [96.733606]  #0: ffff88885f432038 (&cpuctx_lock){....}-{2:2}, at: __perf_install_in_context+0x3f/0x360
<4> [96.733710] stack backtrace:
<4> [96.733742] CPU: 0 UID: 0 PID: 0 Comm: swapper/0 Not tainted 6.13.0-rc2-CI_DRM_15816-g2223c2c738ec+ #1
<4> [96.733841] Hardware name: Intel Corporation Meteor Lake Client Platform/MTL-P LP5x T3 RVP, BIOS MTLPFWI1.R00.3471.D91.2401310918 01/31/2024
<4> [96.733971] Call Trace:
<4> [96.734002]  <TASK>
<4> [96.734029]  dump_stack_lvl+0x91/0xf0
<4> [96.734078]  dump_stack+0x10/0x20
<4> [96.734118]  __lock_acquire+0x990/0x2820
<4> [96.734177]  lock_acquire+0xc9/0x300
<4> [96.734222]  ? i915_pmu_enable+0x48/0x3a0 [i915]
<4> [96.734533]  _raw_spin_lock_irqsave+0x49/0x80
<4> [96.734568]  ? i915_pmu_enable+0x48/0x3a0 [i915]
<4> [96.734800]  i915_pmu_enable+0x48/0x3a0 [i915]
<4> [96.735031]  i915_pmu_event_add+0x71/0x90 [i915]

I started converting the pmu->lock innside i915_pmu.c. I´t be great if
it was only that, but it's clear it's not sufficient. I tried to move a few locks
around to avoid having to convert uncore->lock, but ultimately couldn't avoid
it, which leads to converting a few more. So far:

	raw_spin_lock_init(&guc->timestamp.lock);
	raw_spin_lock_init(&pmu->lock);
	raw_spin_lock_init(&i915->mmio_debug.lock);
	raw_spin_lock_init(&uncore->lock);

And it's still not sufficient, because intel_ref_tracker tries to
allocate while holding one of those and I'm not confident on making that
pass GFP_ATOMIC. Maybe that allocation could be moved to init, but I ran out
of time for this and will try again later.

[  204.706501] swapper/0/0 is trying to lock:
[  204.710565] ffff88810005ead8 (&n->list_lock){-.-.}-{3:3}, at: get_partial_node.part.0+0x27/0x3a0
[  204.719278] other info that might help us debug this:
[  204.724285] context-{5:5}
[  204.726891] 2 locks held by swapper/0/0:
[  204.730785]  #0: ffff88888cc32038 (&cpuctx_lock){....}-{2:2}, at: __perf_install_in_context+0x3f/0x360
[  204.739995]  #1: ffff88815265cf40 (&guc->timestamp.lock){....}-{2:2}, at: guc_engine_busyness+0x45/0x2c0 [i915]
[  204.750171] stack backtrace:
[  204.753038] CPU: 0 UID: 0 PID: 0 Comm: swapper/0 Tainted: G     U             6.13.0-rc2-xe+ #13
[  204.761729] Tainted: [U]=USER
[  204.764678] Hardware name: Intel Corporation Raptor Lake Client Platform/RPL-S ADP-S DDR5 UDIMM CRB, BIOS RPLSFWI1.R00.5045.A00.2401260733 01/26/2024
[  204.777913] Call Trace:
[  204.780355]  <TASK>
[  204.782450]  dump_stack_lvl+0x91/0xf0
[  204.786090]  dump_stack+0x10/0x20
[  204.789383]  __lock_acquire+0x990/0x2820
[  204.793276]  ? lock_acquire+0x29c/0x300
[  204.797088]  lock_acquire+0xc9/0x300
[  204.800642]  ? get_partial_node.part.0+0x27/0x3a0
[  204.805310]  _raw_spin_lock_irqsave+0x49/0x80
[  204.809635]  ? get_partial_node.part.0+0x27/0x3a0
[  204.814302]  get_partial_node.part.0+0x27/0x3a0
[  204.818794]  ___slab_alloc+0x792/0x12f0
[  204.822600]  ? ref_tracker_alloc+0xd7/0x270
[  204.826754]  ? __lock_acquire+0x11a1/0x2820
[  204.830906]  ? ref_tracker_alloc+0xd7/0x270
[  204.835058]  __kmalloc_cache_noprof+0x277/0x480
[  204.839554]  ? __kmalloc_cache_noprof+0x277/0x480
[  204.844221]  ref_tracker_alloc+0xd7/0x270
[  204.848206]  ? ref_tracker_alloc+0xd7/0x270
[  204.852357]  guc_engine_busyness+0x122/0x2c0 [i915]


>
>>
>> It's a real problem only for PREEMPT_RT since otherwise there's
>> no difference between the 2 lock types. However fixing this may involve
>> quite a few changes: if we convert the lock to raw we may need to
>> cascade the conversions to additional locks.  The ones I identified are:
>> pmu->lock, which would also need to have uncore->lock converted, which
>> would then probably cascade to quite a few others :-/. I'm not sure
>> converting uncore->lock will actually be a good thing.
>
>hmm raw_spinlocks for the lowlevel might not be a bad idea, but perhaps
>we need to convert the other way around the upper levels?

that would mean:

<4> [96.733606]  #0: ffff88885f432038 (&cpuctx_lock){....}-{2:2}, at: __perf_install_in_context+0x3f/0x360

so inside the perf event infra, that has been using raw_spinlock_t
since forever. I'm surprised we got this only 10 years later :-/.
I don't think perf can sleep in that context, but Cc'ing a few people
and lkml for that question.

thanks
Lucas De Marchi

>
>>
>> I will keep digging.
>
>Ack on getting this to topic/core-for-CI so we don't block our
>CI while we investigate and fix this.
>
>Thanks,
>Rodrigo.
>
>>
>>
>> Lucas De Marchi
>>
>>
>> >
>> >
>> > lib/Kconfig.debug | 12 ++++++++++--
>> > 1 file changed, 10 insertions(+), 2 deletions(-)
>> >
>> > diff --git a/lib/Kconfig.debug b/lib/Kconfig.debug
>> > index f3d723705879..de4ffe09323b 100644
>> > --- a/lib/Kconfig.debug
>> > +++ b/lib/Kconfig.debug
>> > @@ -1397,14 +1397,22 @@ config PROVE_LOCKING
>> > 	 For more details, see Documentation/locking/lockdep-design.rst.
>> >
>> > config PROVE_RAW_LOCK_NESTING
>> > -	bool
>> > +	bool "Enable raw_spinlock - spinlock nesting checks"
>> > 	depends on PROVE_LOCKING
>> > -	default y
>> > +	default n
>> > 	help
>> > 	 Enable the raw_spinlock vs. spinlock nesting checks which ensure
>> > 	 that the lock nesting rules for PREEMPT_RT enabled kernels are
>> > 	 not violated.
>> >
>> > +	 NOTE: There are known nesting problems. So if you enable this
>> > +	 option expect lockdep splats until these problems have been fully
>> > +	 addressed which is work in progress. This config switch allows to
>> > +	 identify and analyze these problems. It will be removed and the
>> > +	 check permanently enabled once the main issues have been fixed.
>> > +
>> > +	 If unsure, select N.
>> > +
>> > config LOCK_STAT
>> > 	bool "Lock usage statistics"
>> > 	depends on DEBUG_KERNEL && LOCK_DEBUGGING_SUPPORT
>> > --
>> > 2.45.2
>> >
Peter Zijlstra Dec. 12, 2024, 9:31 a.m. UTC | #5
On Tue, Dec 10, 2024 at 06:00:33PM -0600, Lucas De Marchi wrote:

> 	raw_spin_lock_init(&guc->timestamp.lock);
> 	raw_spin_lock_init(&pmu->lock);
> 	raw_spin_lock_init(&i915->mmio_debug.lock);
> 	raw_spin_lock_init(&uncore->lock);
> 
> And it's still not sufficient, because intel_ref_tracker tries to
> allocate while holding one of those and I'm not confident on making that
> pass GFP_ATOMIC.

You cannot allocate memory under raw_spinlock_t at all, ever. Nor free
for that matter. The allocators use spinlock internally.


> [  204.835058]  __kmalloc_cache_noprof+0x277/0x480
> [  204.839554]  ? __kmalloc_cache_noprof+0x277/0x480
> [  204.844221]  ref_tracker_alloc+0xd7/0x270
> [  204.848206]  ? ref_tracker_alloc+0xd7/0x270
> [  204.852357]  guc_engine_busyness+0x122/0x2c0 [i915]
> 
> 
> > 
> > > 
> > > It's a real problem only for PREEMPT_RT since otherwise there's
> > > no difference between the 2 lock types. However fixing this may involve
> > > quite a few changes: if we convert the lock to raw we may need to
> > > cascade the conversions to additional locks.  The ones I identified are:
> > > pmu->lock, which would also need to have uncore->lock converted, which
> > > would then probably cascade to quite a few others :-/. I'm not sure
> > > converting uncore->lock will actually be a good thing.
> > 
> > hmm raw_spinlocks for the lowlevel might not be a bad idea, but perhaps
> > we need to convert the other way around the upper levels?
> 
> that would mean:
> 
> <4> [96.733606]  #0: ffff88885f432038 (&cpuctx_lock){....}-{2:2}, at: __perf_install_in_context+0x3f/0x360
> 
> so inside the perf event infra, that has been using raw_spinlock_t
> since forever. I'm surprised we got this only 10 years later :-/.
> I don't think perf can sleep in that context, but Cc'ing a few people
> and lkml for that question.

You very much cannot sleep here. This is hardirq context.
diff mbox series

Patch

diff --git a/lib/Kconfig.debug b/lib/Kconfig.debug
index f3d723705879..de4ffe09323b 100644
--- a/lib/Kconfig.debug
+++ b/lib/Kconfig.debug
@@ -1397,14 +1397,22 @@  config PROVE_LOCKING
 	 For more details, see Documentation/locking/lockdep-design.rst.
 
 config PROVE_RAW_LOCK_NESTING
-	bool
+	bool "Enable raw_spinlock - spinlock nesting checks"
 	depends on PROVE_LOCKING
-	default y
+	default n
 	help
 	 Enable the raw_spinlock vs. spinlock nesting checks which ensure
 	 that the lock nesting rules for PREEMPT_RT enabled kernels are
 	 not violated.
 
+	 NOTE: There are known nesting problems. So if you enable this
+	 option expect lockdep splats until these problems have been fully
+	 addressed which is work in progress. This config switch allows to
+	 identify and analyze these problems. It will be removed and the
+	 check permanently enabled once the main issues have been fixed.
+
+	 If unsure, select N.
+
 config LOCK_STAT
 	bool "Lock usage statistics"
 	depends on DEBUG_KERNEL && LOCK_DEBUGGING_SUPPORT