From mboxrd@z Thu Jan 1 00:00:00 1970 From: pjohn@mvista.com (Philby John) Date: Sat, 17 Apr 2010 15:21:56 +0530 Subject: [PATCH v2] ARM: Fix "BUG: scheduling while atomic: swapper/0/0x00000002 In-Reply-To: <1271492144-26995-1-git-send-email-santosh.shilimkar@ti.com> References: <1271492144-26995-1-git-send-email-santosh.shilimkar@ti.com> Message-ID: <4BC984BC.2060800@mvista.com> To: linux-arm-kernel@lists.infradead.org List-Id: linux-arm-kernel.lists.infradead.org Hello Santosh, On 04/17/2010 01:45 PM, Santosh Shilimkar wrote: > This patch fixes the preempt leak in the cpuidle path invoked from > cpu-hotplug. The fix is suggested by Russell King and is based > on x86 idea of calling init_idle() on the idle task when it's > re-used which also resets the preempt count amongst other things > > dump: > BUG: scheduling while atomic: swapper/0/0x00000002 > Modules linked in: > Backtrace: > [] (dump_backtrace+0x0/0x110) from [] (dump_stack+0x18/0x1c) > r7:c02149e4 r6:c033df00 r5:c7836000 r4:00000000 > [] (dump_stack+0x0/0x1c) from [] (__schedule_bug+0x60/0x70) > [] (__schedule_bug+0x0/0x70) from [] (schedule+0x98/0x7b8) > r5:c7836000 r4:c7836000 > [] (schedule+0x0/0x7b8) from [] (cpu_idle+0xb4/0xd4) > # [] (cpu_idle+0x0/0xd4) from [] (secondary_start_kernel+0xe0/0xf0) > r5:c7836000 r4:c0205f40 > [] (secondary_start_kernel+0x0/0xf0) from [] (prm_rmw_mod_reg_bits+0x88/0xa4) > r7:c02149e4 r6:00000001 r5:00000001 r4:c7836000 > Backtrace aborted due to bad frame pointer > > Signed-off-by: Santosh Shilimkar > Cc: Russell King > Cc: Catalin Marinas > Cc: Sundar R IYER > --- > arch/arm/kernel/smp.c | 8 +++++++- > 1 files changed, 7 insertions(+), 1 deletions(-) > > diff --git a/arch/arm/kernel/smp.c b/arch/arm/kernel/smp.c > index 57162af..3e14629 100644 > --- a/arch/arm/kernel/smp.c > +++ b/arch/arm/kernel/smp.c > @@ -86,8 +86,14 @@ int __cpuinit __cpu_up(unsigned int cpu) > return PTR_ERR(idle); > } > ci->idle = idle; > + } else { > + /* > + * Since idle thread getting re-used, call > + * init_idle() to set up the idle thread for given > + * CPU. Additionally it also resets the preempt count > + */ > + init_idle(idle, cpu); Since Sundar was the first to suggest this fix, shouldn't his SOB be included as well instead of CC ? Or did I miss a mail thread ? Regards, Philby