Re: [Qemu-ppc] pseries on qemu-system-ppc64le crashes in doorbell_core_ipi()

2019-12-20 Thread David? Gibson
On Fri, Dec 20, 2019 at 12:32:06PM +0100, Jason A. Donenfeld wrote:
> On Thu, Dec 19, 2019 at 2:08 PM Cédric Le Goater  wrote:>
> > There is a patch for msgsndp in my tree you could try :
> >
> >   https://github.com/legoater/qemu/tree/powernv-5.0
> >
> > Currently being reviewed. I have to address some remarks from David before
> > it can be merged.
> 
> Thanks. I've cherry-picked
> https://github.com/legoater/qemu/commit/910c9ea5ecc and can confirm
> that I no longer receive the crashes. QEMU 5.1 or 5.0.1 release, I
> guess?

Unless the revision takes much longer than I expect, I'd anticipate it
in 5.0.

-- 
David Gibson| I'll have my music baroque, and my code
david AT gibson.dropbear.id.au  | minimalist, thank you.  NOT _the_ _other_
| _way_ _around_!
http://www.ozlabs.org/~dgibson


signature.asc
Description: PGP signature


Re: [Qemu-ppc] pseries on qemu-system-ppc64le crashes in doorbell_core_ipi()

2019-12-20 Thread Cédric Le Goater
On 12/20/19 12:32 PM, Jason A. Donenfeld wrote:
> On Thu, Dec 19, 2019 at 2:08 PM Cédric Le Goater  wrote:>
>> There is a patch for msgsndp in my tree you could try :
>>
>>   https://github.com/legoater/qemu/tree/powernv-5.0
>>
>> Currently being reviewed. I have to address some remarks from David before
>> it can be merged.
> 
> Thanks. I've cherry-picked
> https://github.com/legoater/qemu/commit/910c9ea5ecc and can confirm
> that I no longer receive the crashes. QEMU 5.1 or 5.0.1 release, I
> guess?

QEMU 5.1 I would say. That's enough time to address the comments.

Michael's patch to drop self IPIs is also interesting for Linux. I wonder
how we can reach that point. 

Thanks,

C. 



Re: [Qemu-ppc] pseries on qemu-system-ppc64le crashes in doorbell_core_ipi()

2019-12-20 Thread Jason A. Donenfeld
On Thu, Dec 19, 2019 at 2:08 PM Cédric Le Goater  wrote:>
> There is a patch for msgsndp in my tree you could try :
>
>   https://github.com/legoater/qemu/tree/powernv-5.0
>
> Currently being reviewed. I have to address some remarks from David before
> it can be merged.

Thanks. I've cherry-picked
https://github.com/legoater/qemu/commit/910c9ea5ecc and can confirm
that I no longer receive the crashes. QEMU 5.1 or 5.0.1 release, I
guess?

Jason


Re: [Qemu-ppc] pseries on qemu-system-ppc64le crashes in doorbell_core_ipi()

2019-12-19 Thread Jason A. Donenfeld
On Thu, Dec 19, 2019 at 1:52 PM Michael Ellerman  wrote:
> diff --git a/arch/powerpc/kernel/dbell.c b/arch/powerpc/kernel/dbell.c
> index f17ff1200eaa..e45cb9bba193 100644
> --- a/arch/powerpc/kernel/dbell.c
> +++ b/arch/powerpc/kernel/dbell.c
> @@ -63,7 +63,7 @@ int doorbell_try_core_ipi(int cpu)
> int this_cpu = get_cpu();
> int ret = 0;
>
> -   if (cpumask_test_cpu(cpu, cpu_sibling_mask(this_cpu))) {
> +   if (cpu != this_cpu && cpumask_test_cpu(cpu, 
> cpu_sibling_mask(this_cpu))) {
> doorbell_core_ipi(cpu);
> ret = 1;
> }

I realize the best solution is that nice powernv branch that will
eventually be merged for qemu/tcg. But, maybe the above would be a
decent idea to upstream? It seems like that's a case of a superfluous
doorbell?

Jason


Re: [Qemu-ppc] pseries on qemu-system-ppc64le crashes in doorbell_core_ipi()

2019-12-19 Thread David? Gibson
On Thu, Dec 19, 2019 at 02:08:29PM +0100, Cédric Le Goater wrote:
> On 19/12/2019 13:45, Michael Ellerman wrote:
> > "Jason A. Donenfeld"  writes:
> >> Hi folks,
> >>
> >> I'm actually still experiencing this sporadically in the WireGuard test 
> >> suite, which you can see being run on https://build.wireguard.com/ . 
> > 
> > Fancy dashboard you got there :)
> > 
> >> About 50% of the time the powerpc64 build will fail at a place like this:
> >>
> >> [   65.147823] Oops: Exception in kernel mode, sig: 4 [#1]
> >> [   65.149198] LE PAGE_SIZE=4K MMU=Hash PREEMPT SMP NR_CPUS=4 NUMA pSeries
> >> [   65.149595] CPU: 0 PID: 0 Comm: swapper/0 Not tainted 5.5.0-rc1+ #1
> >> [   65.149745] NIP:  c000 LR: c007eda0 CTR: 
> >> c007ed80
> >> [   65.149934] REGS: c0a47970 TRAP: 0700   Not tainted  
> >> (5.5.0-rc1+)
> >> [   65.150032] MSR:  8288b033  > 
> >> CR: 48008288  XER: 
> >> [   65.150352] CFAR: c00332bc IRQMASK: 1
> >> [   65.150352] GPR00: c0036508 c0a47c00 c0a4c100 
> >> 0001
> >> [   65.150352] GPR04: c0a50998  c0a50908 
> >> 0f509000
> >> [   65.150352] GPR08: 2800   
> >> cff24f00
> >> [   65.150352] GPR12: c007ed80 c0ad9000  
> >> 
> >> [   65.150352] GPR16: 008c9190 008c94a8 008c92f8 
> >> 008c98b0
> >> [   65.150352] GPR20: 008f2f88 fffd 0014 
> >> 00e6c100
> >> [   65.150352] GPR24: 00e6c100 0001  
> >> c0a50998
> >> [   65.150352] GPR28: c0a9e280 c0a50aa4 0002 
> >> 
> >> [   65.151591] NIP [c000] doorbell_try_core_ipi+0xd0/0xf0
> >> [   65.151750] LR [c007eda0] smp_pseries_cause_ipi+0x20/0x70
> >> [   65.151913] Call Trace:
> >> [   65.152109] [c0a47c00] [c00c7c9c] 
> >> _nohz_idle_balance+0xbc/0x300 (unreliable)
> >> [   65.152370] [c0a47c30] [c0036508] 
> >> smp_send_reschedule+0x98/0xb0
> >> [   65.152711] [c0a47c50] [c00c1634] kick_ilb+0x114/0x140
> >> [   65.152962] [c0a47ca0] [c00c86d8] 
> >> newidle_balance+0x4e8/0x500
> >> [   65.153213] [c0a47d20] [c00c8788] 
> >> pick_next_task_fair+0x48/0x3a0
> >> [   65.153424] [c0a47d80] [c0466620] __schedule+0xf0/0x430
> >> [   65.153612] [c0a47de0] [c0466b04] 
> >> schedule_idle+0x34/0x70
> >> [   65.153786] [c0a47e10] [c00c0bc8] do_idle+0x1a8/0x220
> >> [   65.154121] [c0a47e70] [c00c0e94] 
> >> cpu_startup_entry+0x34/0x40
> >> [   65.154313] [c0a47ea0] [c000ef1c] rest_init+0x10c/0x124
> >> [   65.154414] [c0a47ee0] [c054] 
> >> start_kernel+0x568/0x594
> >> [   65.154585] [c0a47f90] [c000a7cc] 
> >> start_here_common+0x1c/0x330
> >> [   65.154854] Instruction dump:
> >> [   65.155191] 38210030 e8010010 7c0803a6 4e800020 3d220004 39295228 
> >> 8129 3929
> >> [   65.155498] 7d284038 7c0004ac 5508017e 65082800 <7c00411c> e94d0178 
> >> 812a 3929
> >   ^
> > Again the faulting instruction there is "msgsndp r8"
> > 
> >> [   65.156155] ---[ end trace 6180d12e268ffdaf ]---
> >> [   65.185452]
> >> [   66.187490] Kernel panic - not syncing: Fatal exception
> >>
> >> This is with "qemu-system-ppc64 -smp 4 -machine pseries" on QEMU 4.0.0.
> >>
> >> I'm not totally sure what's going on here. I'm emulating a pseries, and 
> >> using that with qemu's pseries model, and I see that selecting the 
> >> pseries forces the selection of 'config PPC_DOORBELL' (twice in the same 
> >> section, actually).
> > 
> > Noted.
> > 
> >> Then inside the kernel there appears to be some runtime CPU check for
> >> doorbell support.
> > 
> > Not really. The kernel looks at the CPU revision (PVR) and decides that
> > it has doorbell support.
> > 
> >> Is this a case in which QEMU is advertising doorbell support that TCG
> >> doesn't have? Or is something else happening here?
> > 
> > It's a gap in the emulation I guess. qemu doesn't emulate msgsndp, but
> > it really should because that's a supported instruction since Power8.
> 
> There is a patch for msgsndp in my tree you could try : 
> 
>   https://github.com/legoater/qemu/tree/powernv-5.0
> 
> Currently being reviewed. I have to address some remarks from David before
> it can be merged.

Right.  It needs some polish, but I expect we'll have this merged in
the not too distant future.

> > I suspect msgsndp wasn't implemented for TCG because TCG doesn't support
> > more than one thread per core, and you can only send doorbells to other
> > threads in the same core, and therefore there is no reason to ever use
> > msgsndp.
> 
> There is a need now with KVM 

Re: [Qemu-ppc] pseries on qemu-system-ppc64le crashes in doorbell_core_ipi()

2019-12-19 Thread Cédric Le Goater
On 19/12/2019 13:45, Michael Ellerman wrote:
> "Jason A. Donenfeld"  writes:
>> Hi folks,
>>
>> I'm actually still experiencing this sporadically in the WireGuard test 
>> suite, which you can see being run on https://build.wireguard.com/ . 
> 
> Fancy dashboard you got there :)
> 
>> About 50% of the time the powerpc64 build will fail at a place like this:
>>
>> [   65.147823] Oops: Exception in kernel mode, sig: 4 [#1]
>> [   65.149198] LE PAGE_SIZE=4K MMU=Hash PREEMPT SMP NR_CPUS=4 NUMA pSeries
>> [   65.149595] CPU: 0 PID: 0 Comm: swapper/0 Not tainted 5.5.0-rc1+ #1
>> [   65.149745] NIP:  c000 LR: c007eda0 CTR: 
>> c007ed80
>> [   65.149934] REGS: c0a47970 TRAP: 0700   Not tainted  (5.5.0-rc1+)
>> [   65.150032] MSR:  8288b033  > 
>> CR: 48008288  XER: 
>> [   65.150352] CFAR: c00332bc IRQMASK: 1
>> [   65.150352] GPR00: c0036508 c0a47c00 c0a4c100 
>> 0001
>> [   65.150352] GPR04: c0a50998  c0a50908 
>> 0f509000
>> [   65.150352] GPR08: 2800   
>> cff24f00
>> [   65.150352] GPR12: c007ed80 c0ad9000  
>> 
>> [   65.150352] GPR16: 008c9190 008c94a8 008c92f8 
>> 008c98b0
>> [   65.150352] GPR20: 008f2f88 fffd 0014 
>> 00e6c100
>> [   65.150352] GPR24: 00e6c100 0001  
>> c0a50998
>> [   65.150352] GPR28: c0a9e280 c0a50aa4 0002 
>> 
>> [   65.151591] NIP [c000] doorbell_try_core_ipi+0xd0/0xf0
>> [   65.151750] LR [c007eda0] smp_pseries_cause_ipi+0x20/0x70
>> [   65.151913] Call Trace:
>> [   65.152109] [c0a47c00] [c00c7c9c] 
>> _nohz_idle_balance+0xbc/0x300 (unreliable)
>> [   65.152370] [c0a47c30] [c0036508] 
>> smp_send_reschedule+0x98/0xb0
>> [   65.152711] [c0a47c50] [c00c1634] kick_ilb+0x114/0x140
>> [   65.152962] [c0a47ca0] [c00c86d8] 
>> newidle_balance+0x4e8/0x500
>> [   65.153213] [c0a47d20] [c00c8788] 
>> pick_next_task_fair+0x48/0x3a0
>> [   65.153424] [c0a47d80] [c0466620] __schedule+0xf0/0x430
>> [   65.153612] [c0a47de0] [c0466b04] schedule_idle+0x34/0x70
>> [   65.153786] [c0a47e10] [c00c0bc8] do_idle+0x1a8/0x220
>> [   65.154121] [c0a47e70] [c00c0e94] 
>> cpu_startup_entry+0x34/0x40
>> [   65.154313] [c0a47ea0] [c000ef1c] rest_init+0x10c/0x124
>> [   65.154414] [c0a47ee0] [c054] start_kernel+0x568/0x594
>> [   65.154585] [c0a47f90] [c000a7cc] 
>> start_here_common+0x1c/0x330
>> [   65.154854] Instruction dump:
>> [   65.155191] 38210030 e8010010 7c0803a6 4e800020 3d220004 39295228 
>> 8129 3929
>> [   65.155498] 7d284038 7c0004ac 5508017e 65082800 <7c00411c> e94d0178 
>> 812a 3929
>   ^
> Again the faulting instruction there is "msgsndp r8"
> 
>> [   65.156155] ---[ end trace 6180d12e268ffdaf ]---
>> [   65.185452]
>> [   66.187490] Kernel panic - not syncing: Fatal exception
>>
>> This is with "qemu-system-ppc64 -smp 4 -machine pseries" on QEMU 4.0.0.
>>
>> I'm not totally sure what's going on here. I'm emulating a pseries, and 
>> using that with qemu's pseries model, and I see that selecting the 
>> pseries forces the selection of 'config PPC_DOORBELL' (twice in the same 
>> section, actually).
> 
> Noted.
> 
>> Then inside the kernel there appears to be some runtime CPU check for
>> doorbell support.
> 
> Not really. The kernel looks at the CPU revision (PVR) and decides that
> it has doorbell support.
> 
>> Is this a case in which QEMU is advertising doorbell support that TCG
>> doesn't have? Or is something else happening here?
> 
> It's a gap in the emulation I guess. qemu doesn't emulate msgsndp, but
> it really should because that's a supported instruction since Power8.

There is a patch for msgsndp in my tree you could try : 

  https://github.com/legoater/qemu/tree/powernv-5.0

Currently being reviewed. I have to address some remarks from David before
it can be merged.

> I suspect msgsndp wasn't implemented for TCG because TCG doesn't support
> more than one thread per core, and you can only send doorbells to other
> threads in the same core, and therefore there is no reason to ever use
> msgsndp.

There is a need now with KVM emulation under TCG, but, yes, QEMU still lacks
SMT support.

> That's the message Suraj mentioned up thread, eg:
> 
>   $ qemu-system-ppc64 -nographic -vga none -M pseries -smp 2,threads=2 -cpu 
> POWER8 -kernel build~/vmlinux
>   qemu-system-ppc64: TCG cannot support more than 1 thread/core on a pseries 
> machine
> 
> 
> But I guess we've hit another case of a CPU sending itself an 

Re: [Qemu-ppc] pseries on qemu-system-ppc64le crashes in doorbell_core_ipi()

2019-12-19 Thread Michael Ellerman
"Jason A. Donenfeld"  writes:
> Hi folks,
>
> I'm actually still experiencing this sporadically in the WireGuard test 
> suite, which you can see being run on https://build.wireguard.com/ . 

Fancy dashboard you got there :)

> About 50% of the time the powerpc64 build will fail at a place like this:
>
> [   65.147823] Oops: Exception in kernel mode, sig: 4 [#1]
> [   65.149198] LE PAGE_SIZE=4K MMU=Hash PREEMPT SMP NR_CPUS=4 NUMA pSeries
> [   65.149595] CPU: 0 PID: 0 Comm: swapper/0 Not tainted 5.5.0-rc1+ #1
> [   65.149745] NIP:  c000 LR: c007eda0 CTR: 
> c007ed80
> [   65.149934] REGS: c0a47970 TRAP: 0700   Not tainted  (5.5.0-rc1+)
> [   65.150032] MSR:  8288b033  > CR: 
> 48008288  XER: 
> [   65.150352] CFAR: c00332bc IRQMASK: 1
> [   65.150352] GPR00: c0036508 c0a47c00 c0a4c100 
> 0001
> [   65.150352] GPR04: c0a50998  c0a50908 
> 0f509000
> [   65.150352] GPR08: 2800   
> cff24f00
> [   65.150352] GPR12: c007ed80 c0ad9000  
> 
> [   65.150352] GPR16: 008c9190 008c94a8 008c92f8 
> 008c98b0
> [   65.150352] GPR20: 008f2f88 fffd 0014 
> 00e6c100
> [   65.150352] GPR24: 00e6c100 0001  
> c0a50998
> [   65.150352] GPR28: c0a9e280 c0a50aa4 0002 
> 
> [   65.151591] NIP [c000] doorbell_try_core_ipi+0xd0/0xf0
> [   65.151750] LR [c007eda0] smp_pseries_cause_ipi+0x20/0x70
> [   65.151913] Call Trace:
> [   65.152109] [c0a47c00] [c00c7c9c] 
> _nohz_idle_balance+0xbc/0x300 (unreliable)
> [   65.152370] [c0a47c30] [c0036508] 
> smp_send_reschedule+0x98/0xb0
> [   65.152711] [c0a47c50] [c00c1634] kick_ilb+0x114/0x140
> [   65.152962] [c0a47ca0] [c00c86d8] 
> newidle_balance+0x4e8/0x500
> [   65.153213] [c0a47d20] [c00c8788] 
> pick_next_task_fair+0x48/0x3a0
> [   65.153424] [c0a47d80] [c0466620] __schedule+0xf0/0x430
> [   65.153612] [c0a47de0] [c0466b04] schedule_idle+0x34/0x70
> [   65.153786] [c0a47e10] [c00c0bc8] do_idle+0x1a8/0x220
> [   65.154121] [c0a47e70] [c00c0e94] 
> cpu_startup_entry+0x34/0x40
> [   65.154313] [c0a47ea0] [c000ef1c] rest_init+0x10c/0x124
> [   65.154414] [c0a47ee0] [c054] start_kernel+0x568/0x594
> [   65.154585] [c0a47f90] [c000a7cc] 
> start_here_common+0x1c/0x330
> [   65.154854] Instruction dump:
> [   65.155191] 38210030 e8010010 7c0803a6 4e800020 3d220004 39295228 8129 
> 3929
> [   65.155498] 7d284038 7c0004ac 5508017e 65082800 <7c00411c> e94d0178 
> 812a 3929
  ^
Again the faulting instruction there is "msgsndp r8"

> [   65.156155] ---[ end trace 6180d12e268ffdaf ]---
> [   65.185452]
> [   66.187490] Kernel panic - not syncing: Fatal exception
>
> This is with "qemu-system-ppc64 -smp 4 -machine pseries" on QEMU 4.0.0.
>
> I'm not totally sure what's going on here. I'm emulating a pseries, and 
> using that with qemu's pseries model, and I see that selecting the 
> pseries forces the selection of 'config PPC_DOORBELL' (twice in the same 
> section, actually).

Noted.

> Then inside the kernel there appears to be some runtime CPU check for
> doorbell support.

Not really. The kernel looks at the CPU revision (PVR) and decides that
it has doorbell support.

> Is this a case in which QEMU is advertising doorbell support that TCG
> doesn't have? Or is something else happening here?

It's a gap in the emulation I guess. qemu doesn't emulate msgsndp, but
it really should because that's a supported instruction since Power8.

I suspect msgsndp wasn't implemented for TCG because TCG doesn't support
more than one thread per core, and you can only send doorbells to other
threads in the same core, and therefore there is no reason to ever use
msgsndp.

That's the message Suraj mentioned up thread, eg:

  $ qemu-system-ppc64 -nographic -vga none -M pseries -smp 2,threads=2 -cpu 
POWER8 -kernel build~/vmlinux
  qemu-system-ppc64: TCG cannot support more than 1 thread/core on a pseries 
machine


But I guess we've hit another case of a CPU sending itself an IPI, and
the way the sibling masks are done, CPUs are siblings of themselves, so
the sibling test passes, eg:

int doorbell_try_core_ipi(int cpu)
{
int this_cpu = get_cpu();
int ret = 0;

if (cpumask_test_cpu(cpu, cpu_sibling_mask(this_cpu))) {
doorbell_core_ipi(cpu);



In which case this patch should fix it.

diff --git a/arch/powerpc/kernel/dbell.c b/arch/powerpc/kernel/dbell.c
index f17ff1200eaa..e45cb9bba193 100644
--- 

Re: [Qemu-ppc] pseries on qemu-system-ppc64le crashes in doorbell_core_ipi()

2019-12-19 Thread Jason A. Donenfeld
On Thu, Dec 19, 2019 at 12:13 PM Sebastian Andrzej Siewior
 wrote:
> Based on my understanding is that the doorbell feature is part of the
> architecture. It can be used to signal other siblings on the same CPU.
> qemu TCG doesn't support that and does not allow to announce multiple
> siblings on the same CPU. However, the kernel uses this interface if it
> tries to send an interrupt to itself (the same CPU) so everything
> matches.
> Last time I run into this, the interface was change so the kernel das
> not send an IPI to itself. This changed now for another function…

One way of fixing this is to just "not use the feature", as you seem
to be suggesting.

But actually shouldn't there be some CPU feature detection available?
Something like -- QEMU advertises to the kernel that it supports or
doesn't support doorbells, and the kernel then avoids those paths if
the CPU feature flag isn't present?

Jason


Re: [Qemu-ppc] pseries on qemu-system-ppc64le crashes in doorbell_core_ipi()

2019-12-19 Thread Sebastian Andrzej Siewior
On 2019-12-19 11:41:21 [+0100], Jason A. Donenfeld wrote:
> Hi folks,
Hi,

so this should duct tape it:

diff --git a/arch/powerpc/kernel/dbell.c b/arch/powerpc/kernel/dbell.c
index f17ff1200eaae..ec044bdf362a1 100644
--- a/arch/powerpc/kernel/dbell.c
+++ b/arch/powerpc/kernel/dbell.c
@@ -60,16 +60,8 @@ void doorbell_core_ipi(int cpu)
  */
 int doorbell_try_core_ipi(int cpu)
 {
-   int this_cpu = get_cpu();
int ret = 0;
 
-   if (cpumask_test_cpu(cpu, cpu_sibling_mask(this_cpu))) {
-   doorbell_core_ipi(cpu);
-   ret = 1;
-   }
-
-   put_cpu();
-
return ret;
 }
 

> This is with "qemu-system-ppc64 -smp 4 -machine pseries" on QEMU 4.0.0.

Interesting. I didn't get v5.4 to boot a while ago and didn't have the
time to look into it.

> I'm not totally sure what's going on here. I'm emulating a pseries, and
> using that with qemu's pseries model, and I see that selecting the pseries
> forces the selection of 'config PPC_DOORBELL' (twice in the same section,
> actually). Then inside the kernel there appears to be some runtime CPU check
> for doorbell support. Is this a case in which QEMU is advertising doorbell
> support that TCG doesn't have? Or is something else happening here?

Based on my understanding is that the doorbell feature is part of the
architecture. It can be used to signal other siblings on the same CPU.
qemu TCG doesn't support that and does not allow to announce multiple
siblings on the same CPU. However, the kernel uses this interface if it
tries to send an interrupt to itself (the same CPU) so everything
matches.
Last time I run into this, the interface was change so the kernel das
not send an IPI to itself. This changed now for another function…

> Thanks,
> Jason

Sebastian


Re: [Qemu-ppc] pseries on qemu-system-ppc64le crashes in doorbell_core_ipi()

2019-12-19 Thread Jason A. Donenfeld

Hi folks,

I'm actually still experiencing this sporadically in the WireGuard test 
suite, which you can see being run on https://build.wireguard.com/ . 
About 50% of the time the powerpc64 build will fail at a place like this:


[   65.147823] Oops: Exception in kernel mode, sig: 4 [#1]
[   65.149198] LE PAGE_SIZE=4K MMU=Hash PREEMPT SMP NR_CPUS=4 NUMA pSeries
[   65.149595] CPU: 0 PID: 0 Comm: swapper/0 Not tainted 5.5.0-rc1+ #1
[   65.149745] NIP:  c000 LR: c007eda0 CTR: 
c007ed80

[   65.149934] REGS: c0a47970 TRAP: 0700   Not tainted  (5.5.0-rc1+)
[   65.150032] MSR:  8288b033  
CR: 48008288  XER: 

[   65.150352] CFAR: c00332bc IRQMASK: 1
[   65.150352] GPR00: c0036508 c0a47c00 c0a4c100 
0001
[   65.150352] GPR04: c0a50998  c0a50908 
0f509000
[   65.150352] GPR08: 2800   
cff24f00
[   65.150352] GPR12: c007ed80 c0ad9000  

[   65.150352] GPR16: 008c9190 008c94a8 008c92f8 
008c98b0
[   65.150352] GPR20: 008f2f88 fffd 0014 
00e6c100
[   65.150352] GPR24: 00e6c100 0001  
c0a50998
[   65.150352] GPR28: c0a9e280 c0a50aa4 0002 


[   65.151591] NIP [c000] doorbell_try_core_ipi+0xd0/0xf0
[   65.151750] LR [c007eda0] smp_pseries_cause_ipi+0x20/0x70
[   65.151913] Call Trace:
[   65.152109] [c0a47c00] [c00c7c9c] 
_nohz_idle_balance+0xbc/0x300 (unreliable)
[   65.152370] [c0a47c30] [c0036508] 
smp_send_reschedule+0x98/0xb0

[   65.152711] [c0a47c50] [c00c1634] kick_ilb+0x114/0x140
[   65.152962] [c0a47ca0] [c00c86d8] 
newidle_balance+0x4e8/0x500
[   65.153213] [c0a47d20] [c00c8788] 
pick_next_task_fair+0x48/0x3a0

[   65.153424] [c0a47d80] [c0466620] __schedule+0xf0/0x430
[   65.153612] [c0a47de0] [c0466b04] schedule_idle+0x34/0x70
[   65.153786] [c0a47e10] [c00c0bc8] do_idle+0x1a8/0x220
[   65.154121] [c0a47e70] [c00c0e94] 
cpu_startup_entry+0x34/0x40

[   65.154313] [c0a47ea0] [c000ef1c] rest_init+0x10c/0x124
[   65.154414] [c0a47ee0] [c054] 
start_kernel+0x568/0x594
[   65.154585] [c0a47f90] [c000a7cc] 
start_here_common+0x1c/0x330

[   65.154854] Instruction dump:
[   65.155191] 38210030 e8010010 7c0803a6 4e800020 3d220004 39295228 
8129 3929
[   65.155498] 7d284038 7c0004ac 5508017e 65082800 <7c00411c> e94d0178 
812a 3929

[   65.156155] ---[ end trace 6180d12e268ffdaf ]---
[   65.185452]
[   66.187490] Kernel panic - not syncing: Fatal exception

This is with "qemu-system-ppc64 -smp 4 -machine pseries" on QEMU 4.0.0.

I'm not totally sure what's going on here. I'm emulating a pseries, and 
using that with qemu's pseries model, and I see that selecting the 
pseries forces the selection of 'config PPC_DOORBELL' (twice in the same 
section, actually). Then inside the kernel there appears to be some 
runtime CPU check for doorbell support. Is this a case in which QEMU is 
advertising doorbell support that TCG doesn't have? Or is something else 
happening here?


Thanks,
Jason


Re: [Qemu-ppc] pseries on qemu-system-ppc64le crashes in doorbell_core_ipi()

2019-04-09 Thread Nicholas Piggin
Frederic Weisbecker's on April 6, 2019 10:06 am:
> On Mon, Apr 01, 2019 at 10:38:27AM +0200, Peter Zijlstra wrote:
>> 
>> + fweisbec, who did the remote bits
>> 
>> On Sat, Mar 30, 2019 at 01:10:28PM +1000, Nicholas Piggin wrote:
>> > diff --git a/kernel/irq_work.c b/kernel/irq_work.c
>> > index 6b7cdf17ccf8..f0e539d0f879 100644
>> > --- a/kernel/irq_work.c
>> > +++ b/kernel/irq_work.c
>> > -/* Enqueue the irq work @work on the current CPU */
>> > -bool irq_work_queue(struct irq_work *work)
>> > +/*
>> > + * Enqueue the irq_work @work on @cpu unless it's already pending
>> > + * somewhere.
>> > + *
>> > + * Can be re-enqueued while the callback is still in progress.
>> > + */
>> > +bool irq_work_queue_on(struct irq_work *work, int cpu)
>> >  {
>> > +#ifndef CONFIG_SMP
>> > +  return irq_work_queue(work);
>> > +
> 
> I'd suggest to use "if (!IS_ENABLED(CONFIG_SMP))" here to avoid the large
> ifdeffery.

Sadly you can't do it because arch_send_call_function_single_ipi is
not defined for !SMP. I made your suggested name change though (with
the __ prefix because work needs to be claimed and preempt disabled).

Thanks,
Nick


Re: [Qemu-ppc] pseries on qemu-system-ppc64le crashes in doorbell_core_ipi()

2019-04-05 Thread Frederic Weisbecker
On Mon, Apr 01, 2019 at 10:38:27AM +0200, Peter Zijlstra wrote:
> 
> + fweisbec, who did the remote bits
> 
> On Sat, Mar 30, 2019 at 01:10:28PM +1000, Nicholas Piggin wrote:
> > diff --git a/kernel/irq_work.c b/kernel/irq_work.c
> > index 6b7cdf17ccf8..f0e539d0f879 100644
> > --- a/kernel/irq_work.c
> > +++ b/kernel/irq_work.c
> > -/* Enqueue the irq work @work on the current CPU */
> > -bool irq_work_queue(struct irq_work *work)
> > +/*
> > + * Enqueue the irq_work @work on @cpu unless it's already pending
> > + * somewhere.
> > + *
> > + * Can be re-enqueued while the callback is still in progress.
> > + */
> > +bool irq_work_queue_on(struct irq_work *work, int cpu)
> >  {
> > +#ifndef CONFIG_SMP
> > +   return irq_work_queue(work);
> > +

I'd suggest to use "if (!IS_ENABLED(CONFIG_SMP))" here to avoid the large
ifdeffery.

> > +#else /* #ifndef CONFIG_SMP */
> > +   /* All work should have been flushed before going offline */
> > +   WARN_ON_ONCE(cpu_is_offline(cpu));
> > +
> > /* Only queue if not already pending */
> > if (!irq_work_claim(work))
> > return false;
> >  
> > -   /* Queue the entry and raise the IPI if needed. */
> > preempt_disable();
> > -
> > -   /* If the work is "lazy", handle it from next tick if any */
> > -   if (work->flags & IRQ_WORK_LAZY) {
> > -   if (llist_add(>llnode, this_cpu_ptr(_list)) &&
> > -   tick_nohz_tick_stopped())
> > -   arch_irq_work_raise();
> > -   } else {
> > -   if (llist_add(>llnode, this_cpu_ptr(_list)))
> > -   arch_irq_work_raise();
> > -   }
> > -
> > +   if (cpu != smp_processor_id()) {
> > +   /* Arch remote IPI send/receive backend aren't NMI safe */
> > +   WARN_ON_ONCE(in_nmi());
> > +   if (llist_add(>llnode, _cpu(raised_list, cpu)))
> > +   arch_send_call_function_single_ipi(cpu);
> > +   } else
> > +   __irq_work_queue(work);

Also perhaps rename __irq_work_queue() to irq_work_queue_local() to make it
instantly clearer to reviewers.

Other than those cosmetic changes,

  Reviewed-by: Frederic Weisbecker 

Thanks.


Re: [Qemu-ppc] pseries on qemu-system-ppc64le crashes in doorbell_core_ipi()

2019-04-05 Thread Sebastian Andrzej Siewior
On 2019-04-05 02:25:44 [+1000], Nicholas Piggin wrote:
> Sebastian, are you able to test if this patch solves your problem?

yes, it does.

Tested-by: Sebastian Andrzej Siewior 

> Thanks,
> Nick

Sebastian


Re: [Qemu-ppc] pseries on qemu-system-ppc64le crashes in doorbell_core_ipi()

2019-04-04 Thread Nicholas Piggin
Peter Zijlstra's on April 1, 2019 6:38 pm:
> 
> + fweisbec, who did the remote bits
> 
> On Sat, Mar 30, 2019 at 01:10:28PM +1000, Nicholas Piggin wrote:
>> Something like this?
>> 
>> kernel/irq_work: Do not raise an IPI when queueing work on the local CPU
>> 
>> The QEMU powerpc/pseries machine model was not expecting a self-IPI,
>> and it may be a bit surprising thing to do, so have irq_work_queue_on
>> do local queueing when target is current CPU.
> 
> This seems OK to me.
> 
>> Suggested-by: Steven Rostedt 
>> Signed-off-by: Nicholas Piggin 
> 
> Acked-by: Peter Zijlstra (Intel) 

Thanks for taking a look.

Sebastian, are you able to test if this patch solves your problem?

Thanks,
Nick



Re: [Qemu-ppc] pseries on qemu-system-ppc64le crashes in doorbell_core_ipi()

2019-04-01 Thread Peter Zijlstra


+ fweisbec, who did the remote bits

On Sat, Mar 30, 2019 at 01:10:28PM +1000, Nicholas Piggin wrote:
> Something like this?
> 
> kernel/irq_work: Do not raise an IPI when queueing work on the local CPU
> 
> The QEMU powerpc/pseries machine model was not expecting a self-IPI,
> and it may be a bit surprising thing to do, so have irq_work_queue_on
> do local queueing when target is current CPU.

This seems OK to me.

> Suggested-by: Steven Rostedt 
> Signed-off-by: Nicholas Piggin 

Acked-by: Peter Zijlstra (Intel) 

> ---
>  kernel/irq_work.c | 78 ++-
>  1 file changed, 43 insertions(+), 35 deletions(-)
> 
> diff --git a/kernel/irq_work.c b/kernel/irq_work.c
> index 6b7cdf17ccf8..f0e539d0f879 100644
> --- a/kernel/irq_work.c
> +++ b/kernel/irq_work.c
> @@ -56,61 +56,69 @@ void __weak arch_irq_work_raise(void)
>*/
>  }
>  
> -/*
> - * Enqueue the irq_work @work on @cpu unless it's already pending
> - * somewhere.
> - *
> - * Can be re-enqueued while the callback is still in progress.
> - */
> -bool irq_work_queue_on(struct irq_work *work, int cpu)
> +/* Enqueue on current CPU, work must already be claimed and preempt disabled 
> */
> +static void __irq_work_queue(struct irq_work *work)
>  {
> - /* All work should have been flushed before going offline */
> - WARN_ON_ONCE(cpu_is_offline(cpu));
> -
> -#ifdef CONFIG_SMP
> -
> - /* Arch remote IPI send/receive backend aren't NMI safe */
> - WARN_ON_ONCE(in_nmi());
> + /* If the work is "lazy", handle it from next tick if any */
> + if (work->flags & IRQ_WORK_LAZY) {
> + if (llist_add(>llnode, this_cpu_ptr(_list)) &&
> + tick_nohz_tick_stopped())
> + arch_irq_work_raise();
> + } else {
> + if (llist_add(>llnode, this_cpu_ptr(_list)))
> + arch_irq_work_raise();
> + }
> +}
>  
> +/* Enqueue the irq work @work on the current CPU */
> +bool irq_work_queue(struct irq_work *work)
> +{
>   /* Only queue if not already pending */
>   if (!irq_work_claim(work))
>   return false;
>  
> - if (llist_add(>llnode, _cpu(raised_list, cpu)))
> - arch_send_call_function_single_ipi(cpu);
> -
> -#else /* #ifdef CONFIG_SMP */
> - irq_work_queue(work);
> -#endif /* #else #ifdef CONFIG_SMP */
> + /* Queue the entry and raise the IPI if needed. */
> + preempt_disable();
> + __irq_work_queue(work);
> + preempt_enable();
>  
>   return true;
>  }
> +EXPORT_SYMBOL_GPL(irq_work_queue);
>  
> -/* Enqueue the irq work @work on the current CPU */
> -bool irq_work_queue(struct irq_work *work)
> +/*
> + * Enqueue the irq_work @work on @cpu unless it's already pending
> + * somewhere.
> + *
> + * Can be re-enqueued while the callback is still in progress.
> + */
> +bool irq_work_queue_on(struct irq_work *work, int cpu)
>  {
> +#ifndef CONFIG_SMP
> + return irq_work_queue(work);
> +
> +#else /* #ifndef CONFIG_SMP */
> + /* All work should have been flushed before going offline */
> + WARN_ON_ONCE(cpu_is_offline(cpu));
> +
>   /* Only queue if not already pending */
>   if (!irq_work_claim(work))
>   return false;
>  
> - /* Queue the entry and raise the IPI if needed. */
>   preempt_disable();
> -
> - /* If the work is "lazy", handle it from next tick if any */
> - if (work->flags & IRQ_WORK_LAZY) {
> - if (llist_add(>llnode, this_cpu_ptr(_list)) &&
> - tick_nohz_tick_stopped())
> - arch_irq_work_raise();
> - } else {
> - if (llist_add(>llnode, this_cpu_ptr(_list)))
> - arch_irq_work_raise();
> - }
> -
> + if (cpu != smp_processor_id()) {
> + /* Arch remote IPI send/receive backend aren't NMI safe */
> + WARN_ON_ONCE(in_nmi());
> + if (llist_add(>llnode, _cpu(raised_list, cpu)))
> + arch_send_call_function_single_ipi(cpu);
> + } else
> + __irq_work_queue(work);
>   preempt_enable();
>  
>   return true;
> +#endif /* #else #ifndef CONFIG_SMP */
>  }
> -EXPORT_SYMBOL_GPL(irq_work_queue);
> +
>  
>  bool irq_work_needs_cpu(void)
>  {
> -- 
> 2.20.1
> 


Re: [Qemu-ppc] pseries on qemu-system-ppc64le crashes in doorbell_core_ipi()

2019-03-29 Thread Nicholas Piggin
Steven Rostedt's on March 30, 2019 1:31 am:
> [ Added Peter ]
> 
> On Fri, 29 Mar 2019 19:13:55 +1000
> Nicholas Piggin  wrote:
> 
>> Suraj Jitindar Singh's on March 29, 2019 3:20 pm:
>> > On Wed, 2019-03-27 at 17:51 +0100, Cédric Le Goater wrote:  
>> >> On 3/27/19 5:37 PM, Cédric Le Goater wrote:  
>> >> > On 3/27/19 1:36 PM, Sebastian Andrzej Siewior wrote:  
>> >> > > With qemu-system-ppc64le -machine pseries -smp 4 I get:
>> >> > >   
>> >> > > > #  chrt 1 hackbench
>> >> > > > Running in process mode with 10 groups using 40 file
>> >> > > > descriptors each (== 400 tasks)
>> >> > > > Each sender will pass 100 messages of 100 bytes
>> >> > > > Oops: Exception in kernel mode, sig: 4 [#1]
>> >> > > > LE PAGE_SIZE=64K MMU=Hash PREEMPT SMP NR_CPUS=2048 NUMA pSeries
>> >> > > > Modules linked in:
>> >> > > > CPU: 0 PID: 629 Comm: hackbench Not tainted 5.1.0-rc2 #71
>> >> > > > NIP:  c0046978 LR: c0046a38 CTR:
>> >> > > > c00b0150
>> >> > > > REGS: c001fffeb8e0 TRAP: 0700   Not tainted  (5.1.0-rc2)
>> >> > > > MSR:  80089033   CR:
>> >> > > > 42000874  XER: 
>> >> > > > CFAR: c0046a34 IRQMASK: 1
>> >> > > > GPR00: c00b0170 c001fffebb70 c0a6ba00
>> >> > > > 2800  
>> >> > > 
>> >> > > …  
>> >> > > > NIP [c0046978] doorbell_core_ipi+0x28/0x30
>> >> > > > LR [c0046a38] doorbell_try_core_ipi+0xb8/0xf0
>> >> > > > Call Trace:
>> >> > > > [c001fffebb70] [c001fffebba0] 0xc001fffebba0
>> >> > > > (unreliable)
>> >> > > > [c001fffebba0] [c00b0170]
>> >> > > > smp_pseries_cause_ipi+0x20/0x70
>> >> > > > [c001fffebbd0] [c004b02c]
>> >> > > > arch_send_call_function_single_ipi+0x8c/0xa0
>> >> > > > [c001fffebbf0] [c01de600]
>> >> > > > irq_work_queue_on+0xe0/0x130
>> >> > > > [c001fffebc30] [c01340c8]
>> >> > > > rto_push_irq_work_func+0xc8/0x120  
>> >> > > 
>> >> > > …  
>> >> > > > Instruction dump:
>> >> > > > 6000 6000 3c4c00a2 384250b0 3d220009 392949c8 8129
>> >> > > > 3929
>> >> > > > 7d231838 7c0004ac 5463017e 64632800 <7c00191c> 4e800020
>> >> > > > 3c4c00a2 38425080
>> >> > > > ---[ end trace eb842b544538cbdf ]---  
>> 
>> This is unusual and causing powerpc code to crash because the rt
>> scheduler is telling irq_work_queue_on to queue work on this CPU.
>> Is that something allowed? There's no warnings in there but it must
>> be a rarely tested path, would it be better to ban it?
>> 
>> Steven is this queue_work_on to self by design?
> 
> I just figured that a irq_work_queue_on() would default to just
> irq_work_queue() if cpu == smp_processor_id().

Yeah it actually doesn't, it raises a CALL_FUNCTION IPI on the
current CPU. Maybe it should do that.

> 
> I'm sure this case has been tested (on x86), as I stressed this quite a
> bit, and all it takes is to have an RT task queued on the CPU
> processing the current "push" logic when it's not holding the rq locks
> and read that the current CPU now has an overloaded RT task.
> 
> If calling irq_work_queue_on() is really bad to do to the same CPU,
> then we can work on changing the logic to do something different if the
> CPU returned from rto_next_cpu() is the current CPU.

I don't actually know that it is bad. It does seem to violate the
principle of least surprise for arch code though.

>From this bug report, I'm guessing it's pretty rare case to hit so
I would worry about subtle bugs. And I just cc'ed you in case your
code was actually not intending to do this.

> Or would it be possible to just change irq_work_queue_on() to call
> irq_work_queue() if cpu == smp_processor_id()?

Something like this?

kernel/irq_work: Do not raise an IPI when queueing work on the local CPU

The QEMU powerpc/pseries machine model was not expecting a self-IPI,
and it may be a bit surprising thing to do, so have irq_work_queue_on
do local queueing when target is current CPU.

Suggested-by: Steven Rostedt 
Signed-off-by: Nicholas Piggin 
---
 kernel/irq_work.c | 78 ++-
 1 file changed, 43 insertions(+), 35 deletions(-)

diff --git a/kernel/irq_work.c b/kernel/irq_work.c
index 6b7cdf17ccf8..f0e539d0f879 100644
--- a/kernel/irq_work.c
+++ b/kernel/irq_work.c
@@ -56,61 +56,69 @@ void __weak arch_irq_work_raise(void)
 */
 }
 
-/*
- * Enqueue the irq_work @work on @cpu unless it's already pending
- * somewhere.
- *
- * Can be re-enqueued while the callback is still in progress.
- */
-bool irq_work_queue_on(struct irq_work *work, int cpu)
+/* Enqueue on current CPU, work must already be claimed and preempt disabled */
+static void __irq_work_queue(struct irq_work *work)
 {
-   /* All work should have been flushed before going offline */
-   WARN_ON_ONCE(cpu_is_offline(cpu));
-
-#ifdef CONFIG_SMP
-
-   /* Arch remote IPI send/receive backend aren't NMI safe */
-   WARN_ON_ONCE(in_nmi());
+   /* If the work is "lazy", handle it from next 

Re: [Qemu-ppc] pseries on qemu-system-ppc64le crashes in doorbell_core_ipi()

2019-03-29 Thread Steven Rostedt
[ Added Peter ]

On Fri, 29 Mar 2019 19:13:55 +1000
Nicholas Piggin  wrote:

> Suraj Jitindar Singh's on March 29, 2019 3:20 pm:
> > On Wed, 2019-03-27 at 17:51 +0100, Cédric Le Goater wrote:  
> >> On 3/27/19 5:37 PM, Cédric Le Goater wrote:  
> >> > On 3/27/19 1:36 PM, Sebastian Andrzej Siewior wrote:  
> >> > > With qemu-system-ppc64le -machine pseries -smp 4 I get:
> >> > >   
> >> > > > #  chrt 1 hackbench
> >> > > > Running in process mode with 10 groups using 40 file
> >> > > > descriptors each (== 400 tasks)
> >> > > > Each sender will pass 100 messages of 100 bytes
> >> > > > Oops: Exception in kernel mode, sig: 4 [#1]
> >> > > > LE PAGE_SIZE=64K MMU=Hash PREEMPT SMP NR_CPUS=2048 NUMA pSeries
> >> > > > Modules linked in:
> >> > > > CPU: 0 PID: 629 Comm: hackbench Not tainted 5.1.0-rc2 #71
> >> > > > NIP:  c0046978 LR: c0046a38 CTR:
> >> > > > c00b0150
> >> > > > REGS: c001fffeb8e0 TRAP: 0700   Not tainted  (5.1.0-rc2)
> >> > > > MSR:  80089033   CR:
> >> > > > 42000874  XER: 
> >> > > > CFAR: c0046a34 IRQMASK: 1
> >> > > > GPR00: c00b0170 c001fffebb70 c0a6ba00
> >> > > > 2800  
> >> > > 
> >> > > …  
> >> > > > NIP [c0046978] doorbell_core_ipi+0x28/0x30
> >> > > > LR [c0046a38] doorbell_try_core_ipi+0xb8/0xf0
> >> > > > Call Trace:
> >> > > > [c001fffebb70] [c001fffebba0] 0xc001fffebba0
> >> > > > (unreliable)
> >> > > > [c001fffebba0] [c00b0170]
> >> > > > smp_pseries_cause_ipi+0x20/0x70
> >> > > > [c001fffebbd0] [c004b02c]
> >> > > > arch_send_call_function_single_ipi+0x8c/0xa0
> >> > > > [c001fffebbf0] [c01de600]
> >> > > > irq_work_queue_on+0xe0/0x130
> >> > > > [c001fffebc30] [c01340c8]
> >> > > > rto_push_irq_work_func+0xc8/0x120  
> >> > > 
> >> > > …  
> >> > > > Instruction dump:
> >> > > > 6000 6000 3c4c00a2 384250b0 3d220009 392949c8 8129
> >> > > > 3929
> >> > > > 7d231838 7c0004ac 5463017e 64632800 <7c00191c> 4e800020
> >> > > > 3c4c00a2 38425080
> >> > > > ---[ end trace eb842b544538cbdf ]---  
> 
> This is unusual and causing powerpc code to crash because the rt
> scheduler is telling irq_work_queue_on to queue work on this CPU.
> Is that something allowed? There's no warnings in there but it must
> be a rarely tested path, would it be better to ban it?
> 
> Steven is this queue_work_on to self by design?

I just figured that a irq_work_queue_on() would default to just
irq_work_queue() if cpu == smp_processor_id().

I'm sure this case has been tested (on x86), as I stressed this quite a
bit, and all it takes is to have an RT task queued on the CPU
processing the current "push" logic when it's not holding the rq locks
and read that the current CPU now has an overloaded RT task.

If calling irq_work_queue_on() is really bad to do to the same CPU,
then we can work on changing the logic to do something different if the
CPU returned from rto_next_cpu() is the current CPU.

Or would it be possible to just change irq_work_queue_on() to call
irq_work_queue() if cpu == smp_processor_id()?

-- Steve


> 
> >> > > 
> >> > > and I was wondering whether this is a qemu bug or the kernel is
> >> > > using an
> >> > > opcode it should rather not. If I skip doorbell_try_core_ipi() in
> >> > > smp_pseries_cause_ipi() then there is no crash. The comment says
> >> > > "POWER9
> >> > > should not use this handler" so…  
> >> > 
> >> > I would say Linux is using a msgsndp instruction which is not
> >> > implemented
> >> > in QEMU TCG. But why have we started using dbells in Linux ?   
> > 
> > Yeah the kernel must have used msgsndp which isn't implemented for TCG
> > yet. We use doorbells in linux but only for threads which are on the
> > same core.
> > And when I try to construct a situation with more than 1 thread per
> > core (e.g. -smp 4,threads=4), I get "TCG cannot support more than 1
> > thread/core on a pseries machine".
> > 
> > So I wonder why the guest thinks it can use msgsndp...  
> 
> IPI to self evidently. Under TCG it really should implement the
> instruction or remove the DBELL feature.
> 
> Thanks,
> Nick
> 



Re: [Qemu-ppc] pseries on qemu-system-ppc64le crashes in doorbell_core_ipi()

2019-03-29 Thread Nicholas Piggin
Suraj Jitindar Singh's on March 29, 2019 3:20 pm:
> On Wed, 2019-03-27 at 17:51 +0100, Cédric Le Goater wrote:
>> On 3/27/19 5:37 PM, Cédric Le Goater wrote:
>> > On 3/27/19 1:36 PM, Sebastian Andrzej Siewior wrote:
>> > > With qemu-system-ppc64le -machine pseries -smp 4 I get:
>> > > 
>> > > > #  chrt 1 hackbench
>> > > > Running in process mode with 10 groups using 40 file
>> > > > descriptors each (== 400 tasks)
>> > > > Each sender will pass 100 messages of 100 bytes
>> > > > Oops: Exception in kernel mode, sig: 4 [#1]
>> > > > LE PAGE_SIZE=64K MMU=Hash PREEMPT SMP NR_CPUS=2048 NUMA pSeries
>> > > > Modules linked in:
>> > > > CPU: 0 PID: 629 Comm: hackbench Not tainted 5.1.0-rc2 #71
>> > > > NIP:  c0046978 LR: c0046a38 CTR:
>> > > > c00b0150
>> > > > REGS: c001fffeb8e0 TRAP: 0700   Not tainted  (5.1.0-rc2)
>> > > > MSR:  80089033   CR:
>> > > > 42000874  XER: 
>> > > > CFAR: c0046a34 IRQMASK: 1
>> > > > GPR00: c00b0170 c001fffebb70 c0a6ba00
>> > > > 2800
>> > > 
>> > > …
>> > > > NIP [c0046978] doorbell_core_ipi+0x28/0x30
>> > > > LR [c0046a38] doorbell_try_core_ipi+0xb8/0xf0
>> > > > Call Trace:
>> > > > [c001fffebb70] [c001fffebba0] 0xc001fffebba0
>> > > > (unreliable)
>> > > > [c001fffebba0] [c00b0170]
>> > > > smp_pseries_cause_ipi+0x20/0x70
>> > > > [c001fffebbd0] [c004b02c]
>> > > > arch_send_call_function_single_ipi+0x8c/0xa0
>> > > > [c001fffebbf0] [c01de600]
>> > > > irq_work_queue_on+0xe0/0x130
>> > > > [c001fffebc30] [c01340c8]
>> > > > rto_push_irq_work_func+0xc8/0x120
>> > > 
>> > > …
>> > > > Instruction dump:
>> > > > 6000 6000 3c4c00a2 384250b0 3d220009 392949c8 8129
>> > > > 3929
>> > > > 7d231838 7c0004ac 5463017e 64632800 <7c00191c> 4e800020
>> > > > 3c4c00a2 38425080
>> > > > ---[ end trace eb842b544538cbdf ]---

This is unusual and causing powerpc code to crash because the rt
scheduler is telling irq_work_queue_on to queue work on this CPU.
Is that something allowed? There's no warnings in there but it must
be a rarely tested path, would it be better to ban it?

Steven is this queue_work_on to self by design?

>> > > 
>> > > and I was wondering whether this is a qemu bug or the kernel is
>> > > using an
>> > > opcode it should rather not. If I skip doorbell_try_core_ipi() in
>> > > smp_pseries_cause_ipi() then there is no crash. The comment says
>> > > "POWER9
>> > > should not use this handler" so…
>> > 
>> > I would say Linux is using a msgsndp instruction which is not
>> > implemented
>> > in QEMU TCG. But why have we started using dbells in Linux ? 
> 
> Yeah the kernel must have used msgsndp which isn't implemented for TCG
> yet. We use doorbells in linux but only for threads which are on the
> same core.
> And when I try to construct a situation with more than 1 thread per
> core (e.g. -smp 4,threads=4), I get "TCG cannot support more than 1
> thread/core on a pseries machine".
> 
> So I wonder why the guest thinks it can use msgsndp...

IPI to self evidently. Under TCG it really should implement the
instruction or remove the DBELL feature.

Thanks,
Nick



Re: [Qemu-ppc] pseries on qemu-system-ppc64le crashes in doorbell_core_ipi()

2019-03-29 Thread Sebastian Andrzej Siewior
On 2019-03-29 16:20:51 [+1100], Suraj Jitindar Singh wrote:
> 
> Yeah the kernel must have used msgsndp which isn't implemented for TCG
> yet. We use doorbells in linux but only for threads which are on the
> same core.

It is msgsndp as per instruction decode.

> And when I try to construct a situation with more than 1 thread per
> core (e.g. -smp 4,threads=4), I get "TCG cannot support more than 1
> thread/core on a pseries machine".
>
> So I wonder why the guest thinks it can use msgsndp...

I see
|# cat /sys/devices/system/cpu/cpu*/topology/thread_siblings_list
|0
|1
|2
|3

so this works all well. The problem is when a CPU sends an IPI to itself
then linux's doorbell_try_core_ipi() considers this as a valid sibling
and here we have the msgsndp.

Sebastian


Re: [Qemu-ppc] pseries on qemu-system-ppc64le crashes in doorbell_core_ipi()

2019-03-28 Thread Suraj Jitindar Singh
On Wed, 2019-03-27 at 17:51 +0100, Cédric Le Goater wrote:
> On 3/27/19 5:37 PM, Cédric Le Goater wrote:
> > On 3/27/19 1:36 PM, Sebastian Andrzej Siewior wrote:
> > > With qemu-system-ppc64le -machine pseries -smp 4 I get:
> > > 
> > > > #  chrt 1 hackbench
> > > > Running in process mode with 10 groups using 40 file
> > > > descriptors each (== 400 tasks)
> > > > Each sender will pass 100 messages of 100 bytes
> > > > Oops: Exception in kernel mode, sig: 4 [#1]
> > > > LE PAGE_SIZE=64K MMU=Hash PREEMPT SMP NR_CPUS=2048 NUMA pSeries
> > > > Modules linked in:
> > > > CPU: 0 PID: 629 Comm: hackbench Not tainted 5.1.0-rc2 #71
> > > > NIP:  c0046978 LR: c0046a38 CTR:
> > > > c00b0150
> > > > REGS: c001fffeb8e0 TRAP: 0700   Not tainted  (5.1.0-rc2)
> > > > MSR:  80089033   CR:
> > > > 42000874  XER: 
> > > > CFAR: c0046a34 IRQMASK: 1
> > > > GPR00: c00b0170 c001fffebb70 c0a6ba00
> > > > 2800
> > > 
> > > …
> > > > NIP [c0046978] doorbell_core_ipi+0x28/0x30
> > > > LR [c0046a38] doorbell_try_core_ipi+0xb8/0xf0
> > > > Call Trace:
> > > > [c001fffebb70] [c001fffebba0] 0xc001fffebba0
> > > > (unreliable)
> > > > [c001fffebba0] [c00b0170]
> > > > smp_pseries_cause_ipi+0x20/0x70
> > > > [c001fffebbd0] [c004b02c]
> > > > arch_send_call_function_single_ipi+0x8c/0xa0
> > > > [c001fffebbf0] [c01de600]
> > > > irq_work_queue_on+0xe0/0x130
> > > > [c001fffebc30] [c01340c8]
> > > > rto_push_irq_work_func+0xc8/0x120
> > > 
> > > …
> > > > Instruction dump:
> > > > 6000 6000 3c4c00a2 384250b0 3d220009 392949c8 8129
> > > > 3929
> > > > 7d231838 7c0004ac 5463017e 64632800 <7c00191c> 4e800020
> > > > 3c4c00a2 38425080
> > > > ---[ end trace eb842b544538cbdf ]---
> > > 
> > > and I was wondering whether this is a qemu bug or the kernel is
> > > using an
> > > opcode it should rather not. If I skip doorbell_try_core_ipi() in
> > > smp_pseries_cause_ipi() then there is no crash. The comment says
> > > "POWER9
> > > should not use this handler" so…
> > 
> > I would say Linux is using a msgsndp instruction which is not
> > implemented
> > in QEMU TCG. But why have we started using dbells in Linux ? 

Yeah the kernel must have used msgsndp which isn't implemented for TCG
yet. We use doorbells in linux but only for threads which are on the
same core.
And when I try to construct a situation with more than 1 thread per
core (e.g. -smp 4,threads=4), I get "TCG cannot support more than 1
thread/core on a pseries machine".

So I wonder why the guest thinks it can use msgsndp...

> 
> ah. It seems arch_local_irq_restore() / replay_interrupt() generated
> some interrupt.
> 
> C.
> 


Re: [Qemu-ppc] pseries on qemu-system-ppc64le crashes in doorbell_core_ipi()

2019-03-27 Thread Cédric Le Goater
On 3/27/19 5:37 PM, Cédric Le Goater wrote:
> On 3/27/19 1:36 PM, Sebastian Andrzej Siewior wrote:
>> With qemu-system-ppc64le -machine pseries -smp 4 I get:
>>
>> |#  chrt 1 hackbench
>> |Running in process mode with 10 groups using 40 file descriptors each (== 
>> 400 tasks)
>> |Each sender will pass 100 messages of 100 bytes
>> | Oops: Exception in kernel mode, sig: 4 [#1]
>> | LE PAGE_SIZE=64K MMU=Hash PREEMPT SMP NR_CPUS=2048 NUMA pSeries
>> | Modules linked in:
>> | CPU: 0 PID: 629 Comm: hackbench Not tainted 5.1.0-rc2 #71
>> | NIP:  c0046978 LR: c0046a38 CTR: c00b0150
>> | REGS: c001fffeb8e0 TRAP: 0700   Not tainted  (5.1.0-rc2)
>> | MSR:  80089033   CR: 42000874  XER: 
>> | CFAR: c0046a34 IRQMASK: 1
>> | GPR00: c00b0170 c001fffebb70 c0a6ba00 2800
>> …
>> | NIP [c0046978] doorbell_core_ipi+0x28/0x30
>> | LR [c0046a38] doorbell_try_core_ipi+0xb8/0xf0
>> | Call Trace:
>> | [c001fffebb70] [c001fffebba0] 0xc001fffebba0 (unreliable)
>> | [c001fffebba0] [c00b0170] smp_pseries_cause_ipi+0x20/0x70
>> | [c001fffebbd0] [c004b02c] 
>> arch_send_call_function_single_ipi+0x8c/0xa0
>> | [c001fffebbf0] [c01de600] irq_work_queue_on+0xe0/0x130
>> | [c001fffebc30] [c01340c8] rto_push_irq_work_func+0xc8/0x120
>> …
>> | Instruction dump:
>> | 6000 6000 3c4c00a2 384250b0 3d220009 392949c8 8129 3929
>> | 7d231838 7c0004ac 5463017e 64632800 <7c00191c> 4e800020 3c4c00a2 38425080
>> | ---[ end trace eb842b544538cbdf ]---
>>
>> and I was wondering whether this is a qemu bug or the kernel is using an
>> opcode it should rather not. If I skip doorbell_try_core_ipi() in
>> smp_pseries_cause_ipi() then there is no crash. The comment says "POWER9
>> should not use this handler" so…
> 
> I would say Linux is using a msgsndp instruction which is not implemented
> in QEMU TCG. But why have we started using dbells in Linux ? 

ah. It seems arch_local_irq_restore() / replay_interrupt() generated
some interrupt.

C.


Re: [Qemu-ppc] pseries on qemu-system-ppc64le crashes in doorbell_core_ipi()

2019-03-27 Thread Cédric Le Goater
On 3/27/19 1:36 PM, Sebastian Andrzej Siewior wrote:
> With qemu-system-ppc64le -machine pseries -smp 4 I get:
> 
> |#  chrt 1 hackbench
> |Running in process mode with 10 groups using 40 file descriptors each (== 
> 400 tasks)
> |Each sender will pass 100 messages of 100 bytes
> | Oops: Exception in kernel mode, sig: 4 [#1]
> | LE PAGE_SIZE=64K MMU=Hash PREEMPT SMP NR_CPUS=2048 NUMA pSeries
> | Modules linked in:
> | CPU: 0 PID: 629 Comm: hackbench Not tainted 5.1.0-rc2 #71
> | NIP:  c0046978 LR: c0046a38 CTR: c00b0150
> | REGS: c001fffeb8e0 TRAP: 0700   Not tainted  (5.1.0-rc2)
> | MSR:  80089033   CR: 42000874  XER: 
> | CFAR: c0046a34 IRQMASK: 1
> | GPR00: c00b0170 c001fffebb70 c0a6ba00 2800
> …
> | NIP [c0046978] doorbell_core_ipi+0x28/0x30
> | LR [c0046a38] doorbell_try_core_ipi+0xb8/0xf0
> | Call Trace:
> | [c001fffebb70] [c001fffebba0] 0xc001fffebba0 (unreliable)
> | [c001fffebba0] [c00b0170] smp_pseries_cause_ipi+0x20/0x70
> | [c001fffebbd0] [c004b02c] 
> arch_send_call_function_single_ipi+0x8c/0xa0
> | [c001fffebbf0] [c01de600] irq_work_queue_on+0xe0/0x130
> | [c001fffebc30] [c01340c8] rto_push_irq_work_func+0xc8/0x120
> …
> | Instruction dump:
> | 6000 6000 3c4c00a2 384250b0 3d220009 392949c8 8129 3929
> | 7d231838 7c0004ac 5463017e 64632800 <7c00191c> 4e800020 3c4c00a2 38425080
> | ---[ end trace eb842b544538cbdf ]---
> 
> and I was wondering whether this is a qemu bug or the kernel is using an
> opcode it should rather not. If I skip doorbell_try_core_ipi() in
> smp_pseries_cause_ipi() then there is no crash. The comment says "POWER9
> should not use this handler" so…

I would say Linux is using a msgsndp instruction which is not implemented
in QEMU TCG. But why have we started using dbells in Linux ? 

C.