Re: Sleep in preempt_disable on powernv with 'cat /proc/cpuinfo' on v4.15

2018-01-09 Thread Michael Ellerman
Benjamin Herrenschmidt  writes:

> On Mon, 2018-01-08 at 21:30 -0800, John Sperbeck wrote:
>> The pnv_get_proc_freq() function was recently changed to call
>> cpufreq_get(), instead of cpufreq_quick_get(), in order to fetch
>> a more up-to-date value for the CPU frequency:
>> 
>>cd77b5ce208c153260ed7882d8910f2395bfaabd
>>powerpc/powernv/cpufreq: Fix the frequency read by /proc/cpuinfo
>> 
>> Unfortunately, this function is called from show_cpuinfo() in
>> arch/powerpc/kernel/setup-common.c with preemption disabled.  The
>> cpufreq_get() function might do a down_read(), which can sleep.
>> 
>> With CONFIG_DEBUG_KERNEL and CONFIG_DEBUG_ATOMIC_SLEEP set, a warning
>> like the following is generated when running 'cat /proc/cpuinfo':

This was reported by Nick back in November just a few days after the
patch went in, so it's a little disappointing that it's still broken.

> We could just either remove the preempt_disable completely like
> x86 and keep it racy, or stick a cpus_read_lock around it. I dont think
> we need that preempt_disable, it's definitely overkill.
>
> Michael, what do you think ? I'm keen on sync'ing with x86 here...

Yeah I think we can drop it. The cpufreq seems to have some locking that
looks like it'll probably work - famous last words.

Who's writing the patch?

cheers


Re: Sleep in preempt_disable on powernv with 'cat /proc/cpuinfo' on v4.15

2018-01-08 Thread Benjamin Herrenschmidt
On Mon, 2018-01-08 at 21:30 -0800, John Sperbeck wrote:
> The pnv_get_proc_freq() function was recently changed to call
> cpufreq_get(), instead of cpufreq_quick_get(), in order to fetch
> a more up-to-date value for the CPU frequency:
> 
>cd77b5ce208c153260ed7882d8910f2395bfaabd
>powerpc/powernv/cpufreq: Fix the frequency read by /proc/cpuinfo
> 
> Unfortunately, this function is called from show_cpuinfo() in
> arch/powerpc/kernel/setup-common.c with preemption disabled.  The
> cpufreq_get() function might do a down_read(), which can sleep.
> 
> With CONFIG_DEBUG_KERNEL and CONFIG_DEBUG_ATOMIC_SLEEP set, a warning
> like the following is generated when running 'cat /proc/cpuinfo':

We could just either remove the preempt_disable completely like
x86 and keep it racy, or stick a cpus_read_lock around it. I dont think
we need that preempt_disable, it's definitely overkill.

Michael, what do you think ? I'm keen on sync'ing with x86 here...

Cheers,
Ben.

> BUG: sleeping function called from invalid context at 
> kernel/locking/rwsem.c:23
> in_atomic(): 1, irqs_disabled(): 0, pid: 16939, name: cat
> CPU: 33 PID: 16939 Comm: cat Tainted: GW4.15.0-smp-DEV #1
> Call Trace:
> [c00fef07bab0] [c0a32c30] dump_stack+0xb0/0xf0 (unreliable)
> [c00fef07baf0] [c01343a8] ___might_sleep+0x178/0x1b0
> [c00fef07bb70] [c0a50f58] down_read+0x38/0x90
> [c00fef07bba0] [c08287d0] cpufreq_get+0x50/0xc0
> [c00fef07bbf0] [c0097a08] pnv_get_proc_freq+0x28/0x60
> [c00fef07bc20] [c002c554] show_cpuinfo+0x194/0x450
> [c00fef07bcb0] [c039c848] seq_read+0x1f8/0x590
> [c00fef07bd40] [c040d1d4] proc_reg_read+0xb4/0x180
> [c00fef07bd90] [c035d6a0] vfs_read+0x100/0x220
> [c00fef07bde0] [c035dc6c] SyS_read+0x6c/0x110
> [c00fef07be30] [c000b220] system_call+0x58/0x6c
> 


Sleep in preempt_disable on powernv with 'cat /proc/cpuinfo' on v4.15

2018-01-08 Thread John Sperbeck
The pnv_get_proc_freq() function was recently changed to call
cpufreq_get(), instead of cpufreq_quick_get(), in order to fetch
a more up-to-date value for the CPU frequency:

   cd77b5ce208c153260ed7882d8910f2395bfaabd
   powerpc/powernv/cpufreq: Fix the frequency read by /proc/cpuinfo

Unfortunately, this function is called from show_cpuinfo() in
arch/powerpc/kernel/setup-common.c with preemption disabled.  The
cpufreq_get() function might do a down_read(), which can sleep.

With CONFIG_DEBUG_KERNEL and CONFIG_DEBUG_ATOMIC_SLEEP set, a warning
like the following is generated when running 'cat /proc/cpuinfo':

BUG: sleeping function called from invalid context at
kernel/locking/rwsem.c:23
in_atomic(): 1, irqs_disabled(): 0, pid: 16939, name: cat
CPU: 33 PID: 16939 Comm: cat Tainted: GW4.15.0-smp-DEV
#1
Call Trace:
[c00fef07bab0] [c0a32c30] dump_stack+0xb0/0xf0 (unreliable)
[c00fef07baf0] [c01343a8] ___might_sleep+0x178/0x1b0
[c00fef07bb70] [c0a50f58] down_read+0x38/0x90
[c00fef07bba0] [c08287d0] cpufreq_get+0x50/0xc0
[c00fef07bbf0] [c0097a08] pnv_get_proc_freq+0x28/0x60
[c00fef07bc20] [c002c554] show_cpuinfo+0x194/0x450
[c00fef07bcb0] [c039c848] seq_read+0x1f8/0x590
[c00fef07bd40] [c040d1d4] proc_reg_read+0xb4/0x180
[c00fef07bd90] [c035d6a0] vfs_read+0x100/0x220
[c00fef07bde0] [c035dc6c] SyS_read+0x6c/0x110
[c00fef07be30] [c000b220] system_call+0x58/0x6c