* Re: [PATCH] sparc64: Fix irqtrace warnings on Ultra-S
@ 2020-09-08 16:12 Guenter Roeck
0 siblings, 0 replies; 2+ messages in thread
From: Guenter Roeck @ 2020-09-08 16:12 UTC (permalink / raw)
To: peterz
Cc: linux-kernel, mingo, will, npiggin, elver, jgross, paulmck,
rostedt, rjw, joel, svens, tglx, davem
On Tue, Sep 08, 2020 at 05:41:57PM +0200, peterz@infradead.org wrote:
> On Tue, Sep 08, 2020 at 07:40:23AM -0700, Guenter Roeck wrote:
> > qemu-system-sparc64 -M sun4u -cpu "TI UltraSparc IIi" -m 512 \
> > -initrd rootfs.cpio \
> > -kernel arch/sparc/boot/image -no-reboot \
> > -append "panic=-1 slub_debug=FZPUA rdinit=/sbin/init console=ttyS0" \
> > -nographic -monitor none
>
> Thanks I got it. Also enabling DEBUG_LOCKDEP helps (-:
>
> ---
> Subject: sparc64: Fix irqtrace warnings on Ultra-S
>
> Recent changes in Lockdep's IRQTRACE broke Ultra-S.
>
> In order avoid redundant IRQ state changes, local_irq_restore() lost the
> ability to trace a disable. Change the code to use local_irq_save() to
> disable IRQs and then use arch_local_irq_restore() to further disable
> NMIs.
>
> This result in slightly suboptimal code, but given this code uses a
> global spinlock, performance cannot be its primary purpose.
>
> Fixes: 044d0d6de9f5 ("lockdep: Only trace IRQ edges")
> Reported-by: Guenter Roeck <linux@roeck-us.net>
> Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
Tested-by: Guenter Roeck <linux@roeck-us.net>
> ---
> A possible alternative would be:
>
> local_save_flags(flags);
> arch_local_irq_restore((unsigned long)PIL_NMI);
> if (IS_ENABLED(CONFIG_TRACE_IRQFLAGS))
> trace_hardirqs_off();
>
> which generates optimal code, but is more verbose.
>
> arch/sparc/prom/p1275.c | 7 +++----
> 1 file changed, 3 insertions(+), 4 deletions(-)
>
> diff --git a/arch/sparc/prom/p1275.c b/arch/sparc/prom/p1275.c
> index 889aa602f8d8..e22233fcf741 100644
> --- a/arch/sparc/prom/p1275.c
> +++ b/arch/sparc/prom/p1275.c
> @@ -37,16 +37,15 @@ void p1275_cmd_direct(unsigned long *args)
> {
> unsigned long flags;
>
> - local_save_flags(flags);
> - local_irq_restore((unsigned long)PIL_NMI);
> + local_irq_save(flags);
> + arch_local_irq_restore((unsigned long)PIL_NMI);
> raw_spin_lock(&prom_entry_lock);
>
> prom_world(1);
> prom_cif_direct(args);
> prom_world(0);
>
> - raw_spin_unlock(&prom_entry_lock);
> - local_irq_restore(flags);
> + raw_spin_unlock_irqrestore(&prom_entry_lock, flags);
> }
>
> void prom_cif_init(void *cif_handler, void *cif_stack)
^ permalink raw reply [flat|nested] 2+ messages in thread* [PATCH v2 00/11] TRACE_IRQFLAGS wreckage
@ 2020-08-21 8:47 Peter Zijlstra
2020-08-21 8:47 ` [PATCH v2 10/11] lockdep: Only trace IRQ edges Peter Zijlstra
0 siblings, 1 reply; 2+ messages in thread
From: Peter Zijlstra @ 2020-08-21 8:47 UTC (permalink / raw)
To: linux-kernel, mingo, will
Cc: npiggin, elver, jgross, paulmck, rostedt, rjw, joel, svens, tglx, peterz
TRACE_IRQFLAGS
local_irq_*() keeps a software state that mirrors the hardware state,
used for lockdep, includes tracepoints.
raw_local_irq_*() does not update the software state, no tracing.
---
Problem 1:
raw_local_irq_save(); // software state on
local_irq_save(); // software state off
...
local_irq_restore(); // software state still off, because we don't enable IRQs
raw_local_irq_restore(); // software state still off, *whoopsie*
existing instances:
- lock_acquire()
raw_local_irq_save()
__lock_acquire()
arch_spin_lock(&graph_lock)
pv_wait() := kvm_wait() (same or worse for Xen/HyperV)
local_irq_save()
- trace_clock_global()
raw_local_irq_save()
arch_spin_lock()
pv_wait() := kvm_wait()
local_irq_save()
- apic_retrigger_irq()
raw_local_irq_save()
apic->send_IPI() := default_send_IPI_single_phys()
local_irq_save()
Possible solutions:
A) make it work by enabling the tracing inside raw_*()
B) make it work by keeping tracing disabled inside raw_*()
C) call it broken and clean it up now
Now, given that the only reason to use the raw_* variant is because you don't
want tracing. Therefore A) seems like a weird option (although it can be done).
C) is tempting, but OTOH it ends up converting a _lot_ of code to raw just
because there is one raw user, this strips the validation/tracing off for all
the other users.
So we pick B) and declare any code that ends up doing:
raw_local_irq_save()
local_irq_save()
lockdep_assert_irqs_disabled();
broken. AFAICT this problem has existed forever, the only reason it came
up is because I changed IRQ tracing vs lockdep recursion and the first
instance is fairly common, the other cases hardly ever happen.
---
Problem 2:
raw_local_irq_save(); // software state on
trace_*()
...
perf_tp_event()
...
perf_callchain()
<#PF>
trace_hardirqs_off(); // software state off
...
if (regs_irqs_disabled(regs)) // false
trace_hardirqs_on();
</#PF>
raw_local_irq_restore(); // software state stays off, *whoopsie*
existing instances:
- lock_acquire() / lock_release()
raw_local_irq_save()
trace_lock_acquire() / trace_lock_release()
- function tracing
Possible solutions:
A) fix every architecture's entry code
B) only fix kernel/entry/common.c
C) fix lockdep tracepoints and pray
This series does C, AFAICT this problem has existed forever.
---
Problem 3:
raw_local_irq_save(); // software state on
<#NMI>
trace_hardirqs_off(); // software state off
...
if (regs_irqs_disabled(regs)) // false
trace_hardirqs_on();
</#NMI>
raw_local_irq_restore(); // software state stays off, *whoopsie*
Possible solutions:
This *should* not be a problem if an architecture has it's entry ordering
right. In particular we rely on the architecture doing nmi_enter() before
trace_hardirqs_off().
In that case, in_nmi() will be true, and lockdep_hardirqs_*() should NO-OP,
except if CONFIG_TRACE_IRQFLAGS_NMI (x86).
There might be a problem with using lockdep_assert_irqs_disabled() from NMI
context, if so, those needs a little TLC.
---
The patches in this series do (in reverse order):
- 2C
- 1B
- fix fallout in idle due to the trace_lock_*() tracepoints suddenly
being visible to rcu-lockdep.
---
Change since -v1:
- typo (rostedt)
- split WARN (rostedt)
- reorder start_critical_section / rcu_idle_enter (rostedt)
- added arm64 patch (kernel test robot)
---
arch/arm/mach-omap2/pm34xx.c | 4 --
arch/arm64/include/asm/irqflags.h | 5 ++
arch/arm64/kernel/process.c | 2 -
arch/nds32/include/asm/irqflags.h | 5 ++
arch/powerpc/include/asm/hw_irq.h | 11 ++---
arch/s390/kernel/idle.c | 3 -
arch/x86/entry/thunk_32.S | 5 --
arch/x86/include/asm/mmu.h | 1
arch/x86/kernel/process.c | 4 --
arch/x86/mm/tlb.c | 13 +-----
drivers/cpuidle/cpuidle.c | 19 +++++++--
drivers/idle/intel_idle.c | 16 --------
include/linux/cpuidle.h | 13 +++---
include/linux/irqflags.h | 73 ++++++++++++++++++++------------------
include/linux/lockdep.h | 18 ++++++---
include/linux/mmu_context.h | 5 ++
kernel/locking/lockdep.c | 18 +++++----
kernel/sched/idle.c | 25 +++++--------
18 files changed, 118 insertions(+), 122 deletions(-)
^ permalink raw reply [flat|nested] 2+ messages in thread* [PATCH v2 10/11] lockdep: Only trace IRQ edges
2020-08-21 8:47 [PATCH v2 00/11] TRACE_IRQFLAGS wreckage Peter Zijlstra
@ 2020-08-21 8:47 ` Peter Zijlstra
2020-09-02 4:21 ` Guenter Roeck
0 siblings, 1 reply; 2+ messages in thread
From: Peter Zijlstra @ 2020-08-21 8:47 UTC (permalink / raw)
To: linux-kernel, mingo, will
Cc: npiggin, elver, jgross, paulmck, rostedt, rjw, joel, svens, tglx, peterz
From: Nicholas Piggin <npiggin@gmail.com>
Problem:
raw_local_irq_save();
local_irq_save();
...
local_irq_restore();
raw_local_irq_restore();
existing instances:
- lock_acquire()
raw_local_irq_save()
__lock_acquire()
arch_spin_lock(&graph_lock)
pv_wait() := kvm_wait() (same or worse for Xen/HyperV)
local_irq_save()
- trace_clock_global()
raw_local_irq_save()
arch_spin_lock()
pv_wait() := kvm_wait()
local_irq_save()
- apic_retrigger_irq()
raw_local_irq_save()
apic->send_IPI() := default_send_IPI_single_phys()
local_irq_save()
Possible solutions:
A) make it work by enabling the tracing inside raw_*()
B) make it work by keeping tracing disabled inside raw_*()
Now, given that the only reason to use the raw_* variant is because you don't
want tracing, A) seems like a weird option (although it can be done), so we
pick B) and declare any code that ends up doing:
raw_local_irq_save()
local_irq_save()
lockdep_assert_irqs_disabled();
broken. AFAICT this problem has existed forever, the only reason it came
up is because I changed IRQ tracing vs lockdep recursion and the first
instance is fairly common, the other cases hardly ever happen.
Signed-off-by: Nicholas Piggin <npiggin@gmail.com>
[rewrote changelog]
Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
Reviewed-by: Steven Rostedt (VMware) <rostedt@goodmis.org>
Tested-by: Marco Elver <elver@google.com>
Link: https://lkml.kernel.org/r/20200723105615.1268126-1-npiggin@gmail.com
---
arch/powerpc/include/asm/hw_irq.h | 11 ++++-------
include/linux/irqflags.h | 15 +++++++--------
2 files changed, 11 insertions(+), 15 deletions(-)
--- a/arch/powerpc/include/asm/hw_irq.h
+++ b/arch/powerpc/include/asm/hw_irq.h
@@ -200,17 +200,14 @@ static inline bool arch_irqs_disabled(vo
#define powerpc_local_irq_pmu_save(flags) \
do { \
raw_local_irq_pmu_save(flags); \
- trace_hardirqs_off(); \
+ if (!raw_irqs_disabled_flags(flags)) \
+ trace_hardirqs_off(); \
} while(0)
#define powerpc_local_irq_pmu_restore(flags) \
do { \
- if (raw_irqs_disabled_flags(flags)) { \
- raw_local_irq_pmu_restore(flags); \
- trace_hardirqs_off(); \
- } else { \
+ if (!raw_irqs_disabled_flags(flags)) \
trace_hardirqs_on(); \
- raw_local_irq_pmu_restore(flags); \
- } \
+ raw_local_irq_pmu_restore(flags); \
} while(0)
#else
#define powerpc_local_irq_pmu_save(flags) \
--- a/include/linux/irqflags.h
+++ b/include/linux/irqflags.h
@@ -191,25 +191,24 @@ do { \
#define local_irq_disable() \
do { \
+ bool was_disabled = raw_irqs_disabled();\
raw_local_irq_disable(); \
- trace_hardirqs_off(); \
+ if (!was_disabled) \
+ trace_hardirqs_off(); \
} while (0)
#define local_irq_save(flags) \
do { \
raw_local_irq_save(flags); \
- trace_hardirqs_off(); \
+ if (!raw_irqs_disabled_flags(flags)) \
+ trace_hardirqs_off(); \
} while (0)
#define local_irq_restore(flags) \
do { \
- if (raw_irqs_disabled_flags(flags)) { \
- raw_local_irq_restore(flags); \
- trace_hardirqs_off(); \
- } else { \
+ if (!raw_irqs_disabled_flags(flags)) \
trace_hardirqs_on(); \
- raw_local_irq_restore(flags); \
- } \
+ raw_local_irq_restore(flags); \
} while (0)
#define safe_halt() \
^ permalink raw reply [flat|nested] 2+ messages in thread* Re: [PATCH v2 10/11] lockdep: Only trace IRQ edges
2020-08-21 8:47 ` [PATCH v2 10/11] lockdep: Only trace IRQ edges Peter Zijlstra
@ 2020-09-02 4:21 ` Guenter Roeck
2020-09-02 9:09 ` peterz
0 siblings, 1 reply; 2+ messages in thread
From: Guenter Roeck @ 2020-09-02 4:21 UTC (permalink / raw)
To: Peter Zijlstra
Cc: linux-kernel, mingo, will, npiggin, elver, jgross, paulmck,
rostedt, rjw, joel, svens, tglx
On Fri, Aug 21, 2020 at 10:47:48AM +0200, Peter Zijlstra wrote:
> From: Nicholas Piggin <npiggin@gmail.com>
>
> Problem:
>
> raw_local_irq_save();
> local_irq_save();
> ...
> local_irq_restore();
> raw_local_irq_restore();
>
> existing instances:
>
> - lock_acquire()
> raw_local_irq_save()
> __lock_acquire()
> arch_spin_lock(&graph_lock)
> pv_wait() := kvm_wait() (same or worse for Xen/HyperV)
> local_irq_save()
>
> - trace_clock_global()
> raw_local_irq_save()
> arch_spin_lock()
> pv_wait() := kvm_wait()
> local_irq_save()
>
> - apic_retrigger_irq()
> raw_local_irq_save()
> apic->send_IPI() := default_send_IPI_single_phys()
> local_irq_save()
>
> Possible solutions:
>
> A) make it work by enabling the tracing inside raw_*()
> B) make it work by keeping tracing disabled inside raw_*()
>
> Now, given that the only reason to use the raw_* variant is because you don't
> want tracing, A) seems like a weird option (although it can be done), so we
> pick B) and declare any code that ends up doing:
>
> raw_local_irq_save()
> local_irq_save()
> lockdep_assert_irqs_disabled();
>
> broken. AFAICT this problem has existed forever, the only reason it came
> up is because I changed IRQ tracing vs lockdep recursion and the first
> instance is fairly common, the other cases hardly ever happen.
>
On sparc64, this patch results in the traceback below. The traceback is gone
after reverting the patch.
Guenter
---
[ 0.000000] WARNING: CPU: 0 PID: 0 at kernel/locking/lockdep.c:4875 check_flags.part.39+0x280/0x2a0
[ 0.000000] DEBUG_LOCKS_WARN_ON(lockdep_hardirqs_enabled())
[ 0.000000] Modules linked in:
[ 0.000000] CPU: 0 PID: 0 Comm: swapper Not tainted 5.9.0-rc3 #1
[ 0.000000] Call Trace:
[ 0.000000] [<0000000000469890>] __warn+0xb0/0xe0
[ 0.000000] [<00000000004698fc>] warn_slowpath_fmt+0x3c/0x80
[ 0.000000] [<00000000004cfce0>] check_flags.part.39+0x280/0x2a0
[ 0.000000] [<00000000004cff18>] lock_acquire+0x218/0x4e0
[ 0.000000] [<0000000000d740c8>] _raw_spin_lock+0x28/0x40
[ 0.000000] [<00000000009870f4>] p1275_cmd_direct+0x14/0x60
[ 0.000000] [<00000000009872cc>] prom_getproplen+0x4c/0x60
[ 0.000000] [<0000000000987308>] prom_getproperty+0x8/0x80
[ 0.000000] [<0000000000987390>] prom_getint+0x10/0x40
[ 0.000000] [<00000000017df4b4>] prom_init+0x38/0x8c
[ 0.000000] [<0000000000d6b558>] tlb_fixup_done+0x44/0x6c
[ 0.000000] [<00000000ffd0e930>] 0xffd0e930
[ 0.000000] irq event stamp: 1
[ 0.000000] hardirqs last enabled at (1): [<0000000000987124>] p1275_cmd_direct+0x44/0x60
[ 0.000000] hardirqs last disabled at (0): [<0000000000000000>] 0x0
[ 0.000000] softirqs last enabled at (0): [<0000000000000000>] 0x0
[ 0.000000] softirqs last disabled at (0): [<0000000000000000>] 0x0
[ 0.000000] random: get_random_bytes called from print_oops_end_marker+0x30/0x60 with crng_init=0
[ 0.000000] ---[ end trace 0000000000000000 ]---
[ 0.000000] possible reason: unannotated irqs-off.
---
bisect log:
# bad: [f75aef392f869018f78cfedf3c320a6b3fcfda6b] Linux 5.9-rc3
# good: [1127b219ce9481c84edad9711626d856127d5e51] Merge tag 'fallthrough-fixes-5.9-rc3' of git://git.kernel.org/pub/scm/linux/kernel/git/gustavoars/linux
git bisect start 'f75aef392f86' '1127b219ce94'
# good: [8bb5021cc2ee5d5dd129a9f2f5ad2bb76eea297d] Merge tag 'powerpc-5.9-4' of git://git.kernel.org/pub/scm/linux/kernel/git/powerpc/linux
git bisect good 8bb5021cc2ee5d5dd129a9f2f5ad2bb76eea297d
# good: [ceb2465c51195967f11f6507538579816ac67cb8] Merge tag 'irqchip-fixes-5.9-2' of git://git.kernel.org/pub/scm/linux/kernel/git/maz/arm-platforms into irq/urgent
git bisect good ceb2465c51195967f11f6507538579816ac67cb8
# bad: [b69bea8a657b681442765b06be92a2607b1bd875] Merge tag 'locking-urgent-2020-08-30' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip
git bisect bad b69bea8a657b681442765b06be92a2607b1bd875
# good: [00b0ed2d4997af6d0a93edef820386951fd66d94] locking/lockdep: Cleanup
git bisect good 00b0ed2d4997af6d0a93edef820386951fd66d94
# bad: [044d0d6de9f50192f9697583504a382347ee95ca] lockdep: Only trace IRQ edges
git bisect bad 044d0d6de9f50192f9697583504a382347ee95ca
# good: [021c109330ebc1f54b546c63a078ea3c31356ecb] arm64: Implement arch_irqs_disabled()
git bisect good 021c109330ebc1f54b546c63a078ea3c31356ecb
# good: [99dc56feb7932020502d40107a712fa302b32082] mips: Implement arch_irqs_disabled()
git bisect good 99dc56feb7932020502d40107a712fa302b32082
# first bad commit: [044d0d6de9f50192f9697583504a382347ee95ca] lockdep: Only trace IRQ edges
^ permalink raw reply [flat|nested] 2+ messages in thread
* Re: [PATCH v2 10/11] lockdep: Only trace IRQ edges
2020-09-02 4:21 ` Guenter Roeck
@ 2020-09-02 9:09 ` peterz
2020-09-02 9:12 ` peterz
0 siblings, 1 reply; 2+ messages in thread
From: peterz @ 2020-09-02 9:09 UTC (permalink / raw)
To: Guenter Roeck
Cc: linux-kernel, mingo, will, npiggin, elver, jgross, paulmck,
rostedt, rjw, joel, svens, tglx
On Tue, Sep 01, 2020 at 09:21:37PM -0700, Guenter Roeck wrote:
> [ 0.000000] WARNING: CPU: 0 PID: 0 at kernel/locking/lockdep.c:4875 check_flags.part.39+0x280/0x2a0
> [ 0.000000] DEBUG_LOCKS_WARN_ON(lockdep_hardirqs_enabled())
> [ 0.000000] [<00000000004cff18>] lock_acquire+0x218/0x4e0
> [ 0.000000] [<0000000000d740c8>] _raw_spin_lock+0x28/0x40
> [ 0.000000] [<00000000009870f4>] p1275_cmd_direct+0x14/0x60
Lol! yes, I can see that going side-ways... let me poke at that.
^ permalink raw reply [flat|nested] 2+ messages in thread
* Re: [PATCH v2 10/11] lockdep: Only trace IRQ edges
2020-09-02 9:09 ` peterz
@ 2020-09-02 9:12 ` peterz
2020-09-02 13:48 ` Guenter Roeck
0 siblings, 1 reply; 2+ messages in thread
From: peterz @ 2020-09-02 9:12 UTC (permalink / raw)
To: Guenter Roeck
Cc: linux-kernel, mingo, will, npiggin, elver, jgross, paulmck,
rostedt, rjw, joel, svens, tglx, davem
On Wed, Sep 02, 2020 at 11:09:35AM +0200, peterz@infradead.org wrote:
> On Tue, Sep 01, 2020 at 09:21:37PM -0700, Guenter Roeck wrote:
> > [ 0.000000] WARNING: CPU: 0 PID: 0 at kernel/locking/lockdep.c:4875 check_flags.part.39+0x280/0x2a0
> > [ 0.000000] DEBUG_LOCKS_WARN_ON(lockdep_hardirqs_enabled())
>
> > [ 0.000000] [<00000000004cff18>] lock_acquire+0x218/0x4e0
> > [ 0.000000] [<0000000000d740c8>] _raw_spin_lock+0x28/0x40
> > [ 0.000000] [<00000000009870f4>] p1275_cmd_direct+0x14/0x60
>
> Lol! yes, I can see that going side-ways... let me poke at that.
I suspect this will do.
diff --git a/arch/sparc/prom/p1275.c b/arch/sparc/prom/p1275.c
index 889aa602f8d8..7cfe88e30b52 100644
--- a/arch/sparc/prom/p1275.c
+++ b/arch/sparc/prom/p1275.c
@@ -38,7 +38,7 @@ void p1275_cmd_direct(unsigned long *args)
unsigned long flags;
local_save_flags(flags);
- local_irq_restore((unsigned long)PIL_NMI);
+ arch_local_irq_restore((unsigned long)PIL_NMI);
raw_spin_lock(&prom_entry_lock);
prom_world(1);
^ permalink raw reply [flat|nested] 2+ messages in thread
* Re: [PATCH v2 10/11] lockdep: Only trace IRQ edges
2020-09-02 9:12 ` peterz
@ 2020-09-02 13:48 ` Guenter Roeck
2020-09-08 14:22 ` peterz
0 siblings, 1 reply; 2+ messages in thread
From: Guenter Roeck @ 2020-09-02 13:48 UTC (permalink / raw)
To: peterz
Cc: linux-kernel, mingo, will, npiggin, elver, jgross, paulmck,
rostedt, rjw, joel, svens, tglx, davem
On 9/2/20 2:12 AM, peterz@infradead.org wrote:
> On Wed, Sep 02, 2020 at 11:09:35AM +0200, peterz@infradead.org wrote:
>> On Tue, Sep 01, 2020 at 09:21:37PM -0700, Guenter Roeck wrote:
>>> [ 0.000000] WARNING: CPU: 0 PID: 0 at kernel/locking/lockdep.c:4875 check_flags.part.39+0x280/0x2a0
>>> [ 0.000000] DEBUG_LOCKS_WARN_ON(lockdep_hardirqs_enabled())
>>
>>> [ 0.000000] [<00000000004cff18>] lock_acquire+0x218/0x4e0
>>> [ 0.000000] [<0000000000d740c8>] _raw_spin_lock+0x28/0x40
>>> [ 0.000000] [<00000000009870f4>] p1275_cmd_direct+0x14/0x60
>>
>> Lol! yes, I can see that going side-ways... let me poke at that.
>
> I suspect this will do.
>
> diff --git a/arch/sparc/prom/p1275.c b/arch/sparc/prom/p1275.c
> index 889aa602f8d8..7cfe88e30b52 100644
> --- a/arch/sparc/prom/p1275.c
> +++ b/arch/sparc/prom/p1275.c
> @@ -38,7 +38,7 @@ void p1275_cmd_direct(unsigned long *args)
> unsigned long flags;
>
> local_save_flags(flags);
> - local_irq_restore((unsigned long)PIL_NMI);
> + arch_local_irq_restore((unsigned long)PIL_NMI);
> raw_spin_lock(&prom_entry_lock);
>
> prom_world(1);
>
No, that doesn't help. Even removing that line entirely doesn't help.
The problem seems to be that interrupts are not enabled in the first
place. But why wasn't this a problem before ?
Guenter
^ permalink raw reply [flat|nested] 2+ messages in thread
* Re: [PATCH v2 10/11] lockdep: Only trace IRQ edges
2020-09-02 13:48 ` Guenter Roeck
@ 2020-09-08 14:22 ` peterz
2020-09-08 14:40 ` Guenter Roeck
0 siblings, 1 reply; 2+ messages in thread
From: peterz @ 2020-09-08 14:22 UTC (permalink / raw)
To: Guenter Roeck
Cc: linux-kernel, mingo, will, npiggin, elver, jgross, paulmck,
rostedt, rjw, joel, svens, tglx, davem
On Wed, Sep 02, 2020 at 06:48:30AM -0700, Guenter Roeck wrote:
> On 9/2/20 2:12 AM, peterz@infradead.org wrote:
> > On Wed, Sep 02, 2020 at 11:09:35AM +0200, peterz@infradead.org wrote:
> >> On Tue, Sep 01, 2020 at 09:21:37PM -0700, Guenter Roeck wrote:
> >>> [ 0.000000] WARNING: CPU: 0 PID: 0 at kernel/locking/lockdep.c:4875 check_flags.part.39+0x280/0x2a0
> >>> [ 0.000000] DEBUG_LOCKS_WARN_ON(lockdep_hardirqs_enabled())
> >>
> >>> [ 0.000000] [<00000000004cff18>] lock_acquire+0x218/0x4e0
> >>> [ 0.000000] [<0000000000d740c8>] _raw_spin_lock+0x28/0x40
> >>> [ 0.000000] [<00000000009870f4>] p1275_cmd_direct+0x14/0x60
> >>
> >> Lol! yes, I can see that going side-ways... let me poke at that.
> >
> > I suspect this will do.
> >
> > diff --git a/arch/sparc/prom/p1275.c b/arch/sparc/prom/p1275.c
> > index 889aa602f8d8..7cfe88e30b52 100644
> > --- a/arch/sparc/prom/p1275.c
> > +++ b/arch/sparc/prom/p1275.c
> > @@ -38,7 +38,7 @@ void p1275_cmd_direct(unsigned long *args)
> > unsigned long flags;
> >
> > local_save_flags(flags);
> > - local_irq_restore((unsigned long)PIL_NMI);
> > + arch_local_irq_restore((unsigned long)PIL_NMI);
> > raw_spin_lock(&prom_entry_lock);
> >
> > prom_world(1);
> >
> No, that doesn't help. Even removing that line entirely doesn't help.
> The problem seems to be that interrupts are not enabled in the first
> place. But why wasn't this a problem before ?
Previously every interrupt opt would disable/enable things, now we only
update state when something actually changes.
Anyway, I'm struggling with qemu-system-sparc64, I've got a sparc64
cross booting to mount, but I'm not seeing this, could you get me your
specific qemu cmdline please?
^ permalink raw reply [flat|nested] 2+ messages in thread
* Re: [PATCH v2 10/11] lockdep: Only trace IRQ edges
2020-09-08 14:22 ` peterz
@ 2020-09-08 14:40 ` Guenter Roeck
2020-09-08 15:41 ` [PATCH] sparc64: Fix irqtrace warnings on Ultra-S peterz
0 siblings, 1 reply; 2+ messages in thread
From: Guenter Roeck @ 2020-09-08 14:40 UTC (permalink / raw)
To: peterz
Cc: linux-kernel, mingo, will, npiggin, elver, jgross, paulmck,
rostedt, rjw, joel, svens, tglx, davem
On 9/8/20 7:22 AM, peterz@infradead.org wrote:
> On Wed, Sep 02, 2020 at 06:48:30AM -0700, Guenter Roeck wrote:
>> On 9/2/20 2:12 AM, peterz@infradead.org wrote:
>>> On Wed, Sep 02, 2020 at 11:09:35AM +0200, peterz@infradead.org wrote:
>>>> On Tue, Sep 01, 2020 at 09:21:37PM -0700, Guenter Roeck wrote:
>>>>> [ 0.000000] WARNING: CPU: 0 PID: 0 at kernel/locking/lockdep.c:4875 check_flags.part.39+0x280/0x2a0
>>>>> [ 0.000000] DEBUG_LOCKS_WARN_ON(lockdep_hardirqs_enabled())
>>>>
>>>>> [ 0.000000] [<00000000004cff18>] lock_acquire+0x218/0x4e0
>>>>> [ 0.000000] [<0000000000d740c8>] _raw_spin_lock+0x28/0x40
>>>>> [ 0.000000] [<00000000009870f4>] p1275_cmd_direct+0x14/0x60
>>>>
>>>> Lol! yes, I can see that going side-ways... let me poke at that.
>>>
>>> I suspect this will do.
>>>
>>> diff --git a/arch/sparc/prom/p1275.c b/arch/sparc/prom/p1275.c
>>> index 889aa602f8d8..7cfe88e30b52 100644
>>> --- a/arch/sparc/prom/p1275.c
>>> +++ b/arch/sparc/prom/p1275.c
>>> @@ -38,7 +38,7 @@ void p1275_cmd_direct(unsigned long *args)
>>> unsigned long flags;
>>>
>>> local_save_flags(flags);
>>> - local_irq_restore((unsigned long)PIL_NMI);
>>> + arch_local_irq_restore((unsigned long)PIL_NMI);
>>> raw_spin_lock(&prom_entry_lock);
>>>
>>> prom_world(1);
>>>
>> No, that doesn't help. Even removing that line entirely doesn't help.
>> The problem seems to be that interrupts are not enabled in the first
>> place. But why wasn't this a problem before ?
>
> Previously every interrupt opt would disable/enable things, now we only
> update state when something actually changes.
>
> Anyway, I'm struggling with qemu-system-sparc64, I've got a sparc64
> cross booting to mount, but I'm not seeing this, could you get me your
> specific qemu cmdline please?
>
initrd:
qemu-system-sparc64 -M sun4u -cpu "TI UltraSparc IIi" -m 512 \
-initrd rootfs.cpio \
-kernel arch/sparc/boot/image -no-reboot \
-append "panic=-1 slub_debug=FZPUA rdinit=/sbin/init console=ttyS0" \
-nographic -monitor none
root file system:
qemu-system-sparc64 -M sun4u -cpu "TI UltraSparc IIi" -m 512 \
-snapshot =drive file=rootfs.ext2,format=raw,if=ide \
-kernel arch/sparc/boot/image -no-reboot \
-append "panic=-1 slub_debug=FZPUA root=/dev/sda rootwait console=ttyS0" \
-nographic -monitor none
Some of it, like the CPU, should not be needed. qemu version is v5.1,
but v5.0 should do as well. Some older qemu versions won't accept the
kernel from the command line.
Did you enable lockdep debugging ? In my configuration I enable lots
of debug options on top of defconfig. See [1], function __setup_fragment(),
for details.
Some root file systems are at [2] if needed. The complete script used
to build and run the code is at [3].
Guenter
---
[1] https://github.com/groeck/linux-build-test/blob/master/rootfs/scripts/common.sh
[2] https://github.com/groeck/linux-build-test/tree/master/rootfs/sparc64
[3] https://github.com/groeck/linux-build-test/blob/master/rootfs/sparc64/run-qemu-sparc64.sh
^ permalink raw reply [flat|nested] 2+ messages in thread* [PATCH] sparc64: Fix irqtrace warnings on Ultra-S
2020-09-08 14:40 ` Guenter Roeck
@ 2020-09-08 15:41 ` peterz
0 siblings, 0 replies; 2+ messages in thread
From: peterz @ 2020-09-08 15:41 UTC (permalink / raw)
To: Guenter Roeck
Cc: linux-kernel, mingo, will, npiggin, elver, jgross, paulmck,
rostedt, rjw, joel, svens, tglx, davem
On Tue, Sep 08, 2020 at 07:40:23AM -0700, Guenter Roeck wrote:
> qemu-system-sparc64 -M sun4u -cpu "TI UltraSparc IIi" -m 512 \
> -initrd rootfs.cpio \
> -kernel arch/sparc/boot/image -no-reboot \
> -append "panic=-1 slub_debug=FZPUA rdinit=/sbin/init console=ttyS0" \
> -nographic -monitor none
Thanks I got it. Also enabling DEBUG_LOCKDEP helps (-:
---
Subject: sparc64: Fix irqtrace warnings on Ultra-S
Recent changes in Lockdep's IRQTRACE broke Ultra-S.
In order avoid redundant IRQ state changes, local_irq_restore() lost the
ability to trace a disable. Change the code to use local_irq_save() to
disable IRQs and then use arch_local_irq_restore() to further disable
NMIs.
This result in slightly suboptimal code, but given this code uses a
global spinlock, performance cannot be its primary purpose.
Fixes: 044d0d6de9f5 ("lockdep: Only trace IRQ edges")
Reported-by: Guenter Roeck <linux@roeck-us.net>
Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
---
A possible alternative would be:
local_save_flags(flags);
arch_local_irq_restore((unsigned long)PIL_NMI);
if (IS_ENABLED(CONFIG_TRACE_IRQFLAGS))
trace_hardirqs_off();
which generates optimal code, but is more verbose.
arch/sparc/prom/p1275.c | 7 +++----
1 file changed, 3 insertions(+), 4 deletions(-)
diff --git a/arch/sparc/prom/p1275.c b/arch/sparc/prom/p1275.c
index 889aa602f8d8..e22233fcf741 100644
--- a/arch/sparc/prom/p1275.c
+++ b/arch/sparc/prom/p1275.c
@@ -37,16 +37,15 @@ void p1275_cmd_direct(unsigned long *args)
{
unsigned long flags;
- local_save_flags(flags);
- local_irq_restore((unsigned long)PIL_NMI);
+ local_irq_save(flags);
+ arch_local_irq_restore((unsigned long)PIL_NMI);
raw_spin_lock(&prom_entry_lock);
prom_world(1);
prom_cif_direct(args);
prom_world(0);
- raw_spin_unlock(&prom_entry_lock);
- local_irq_restore(flags);
+ raw_spin_unlock_irqrestore(&prom_entry_lock, flags);
}
void prom_cif_init(void *cif_handler, void *cif_stack)
^ permalink raw reply [flat|nested] 2+ messages in thread
end of thread, other threads:[~2020-09-08 19:43 UTC | newest]
Thread overview: 2+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2020-09-08 16:12 [PATCH] sparc64: Fix irqtrace warnings on Ultra-S Guenter Roeck
-- strict thread matches above, loose matches on Subject: below --
2020-08-21 8:47 [PATCH v2 00/11] TRACE_IRQFLAGS wreckage Peter Zijlstra
2020-08-21 8:47 ` [PATCH v2 10/11] lockdep: Only trace IRQ edges Peter Zijlstra
2020-09-02 4:21 ` Guenter Roeck
2020-09-02 9:09 ` peterz
2020-09-02 9:12 ` peterz
2020-09-02 13:48 ` Guenter Roeck
2020-09-08 14:22 ` peterz
2020-09-08 14:40 ` Guenter Roeck
2020-09-08 15:41 ` [PATCH] sparc64: Fix irqtrace warnings on Ultra-S peterz
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
all inboxes | Powered by JetHome®