Re: Sleep in preempt_disable on powernv with 'cat /proc/cpuinfo' on v4.15
Benjamin Herrenschmidtwrites: > 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
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
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