Subject: [PATCH v2] ARM: OMAP: clocks: Delay clk inits atleast until slab is initialized

From: [email-masked] (Mike Turquette)
Date: Thu, 21 Mar 2013 10:59:32 -0700

Quoting Santosh Shilimkar (2013-03-21 04:18:08)
> On Thursday 21 March 2013 04:34 PM, Rajendra Nayak wrote:
> > clk inits on OMAP happen quite early, even before slab is available.
> > The dependency comes from the fact that the timer init code starts to
> > use clocks and hwmod and we need clocks to be initialized by then.
> > 
> > There are various problems doing clk inits this early, one is,
> > not being able to do dynamic clk registrations and hence the
> > dependency on clk-private.h. The other is, inability to debug
> > early kernel crashes without enabling DEBUG_LL and earlyprintk.
> > 
> > Doing early clk init also exposed another instance of a kernel
> > panic due to a BUG() when CONFIG_DEBUG_SLAB is enabled.
> > 
> > [    0.000000] Kernel BUG at c01174f8 [verbose debug info unavailable]
> > [    0.000000] Internal error: Oops - BUG: 0 [#1] SMP ARM
> > [    0.000000] Modules linked in:
> > [    0.000000] CPU: 0    Not tainted  (3.9.0-rc1-12179-g72d48f9 #6)
> > [    0.000000] PC is at __kmalloc+0x1d4/0x248
> > [    0.000000] LR is at __clk_init+0x2e0/0x364
> > [    0.000000] pc : [<c01174f8>]    lr : [<c0441f54>]    psr: 600001d3
> > [    0.000000] sp : c076ff28  ip : c065cefc  fp : c0441f54
> > [    0.000000] r10: 0000001c  r9 : 000080d0  r8 : c076ffd4
> > [    0.000000] r7 : c074b578  r6 : c0794d88  r5 : 00000040  r4 : 00000000
> > [    0.000000] r3 : 00000000  r2 : c07cac70  r1 : 000080d0  r0 : 0000001c
> > [    0.000000] Flags: nZCv  IRQs off  FIQs off  Mode SVC_32  ISA ARM  Segment kernel
> > [    0.000000] Control: 10c53c7d  Table: 8000404a  DAC: 00000017
> > [    0.000000] Process swapper (pid: 0, stack limit = 0xc076e240)
> > [    0.000000] Stack: (0xc076ff28 to 0xc0770000)
> > [    0.000000] ff20:                   22222222 c0794ec8 c06546e8 00000000 00000040 c0794d88
> > [    0.000000] ff40: c074b578 c076ffd4 c07951c8 c076e000 00000000 c0441f54 c074b578 c076ffd4
> > [    0.000000] ff60: c0793828 00000040 c0794d88 c074b578 c076ffd4 c0776900 c076e000 c07272ac
> > [    0.000000] ff80: 2f800000 c074c968 c07f93d0 c0719780 c076ffa0 c076ff98 00000000 00000000
> > [    0.000000] ffa0: 00000000 00000000 00000000 00000001 c074cd6c c077b1ec 8000406a c0715724
> > [    0.000000] ffc0: 00000000 00000000 00000000 00000000 00000000 c074c968 10c53c7d c0776974
> > [    0.000000] ffe0: c074cd6c c077b1ec 8000406a 411fc092 00000000 80008074 00000000 00000000
> > [    0.000000] [<c01174f8>] (__kmalloc+0x1d4/0x248) from [<c0441f54>] (__clk_init+0x2e0/0x364)
> > [    0.000000] [<c0441f54>] (__clk_init+0x2e0/0x364) from [<c07272ac>] (omap4xxx_clk_init+0xbc/0x140)
> > [    0.000000] [<c07272ac>] (omap4xxx_clk_init+0xbc/0x140) from [<c0719780>] (setup_arch+0x15c/0x284)
> > [    0.000000] [<c0719780>] (setup_arch+0x15c/0x284) from [<c0715724>] (start_kernel+0x7c/0x334)
> > [    0.000000] [<c0715724>] (start_kernel+0x7c/0x334) from [<80008074>] (0x80008074)
> > [    0.000000] Code: e5883004 e1a00006 e28dd00c e8bd8ff0 (e7f001f2)
> > [    0.000000] ---[ end trace 1b75b31a2719ed1c ]---
> > [    0.000000] Kernel panic - not syncing: Attempted to kill the idle task!
> > 
> > It was a know issue, that slab allocations would fail when common
> > clock core tries to cache parent pointers for mux clocks on OMAP,
> > and hence a patch 'clk: Allow late cache allocation for clk->parents,
> > commit 7975059d' was added to work this problem around.
> > A BUG() within kmalloc() with CONFIG_DEBUG_SLAB enabled was completely
> > overlooked causing this regression.
> > 
> > More details on the issue reported can be found here,
> > http://www.mail-archive.com/linux-omap at vger.kernel.org/msg85932.html
> > 
> > With all these issues around clk inits happening way too early, it
> > makes sense to atleast move them to a point where dynamic memory
> > allocations are possible. So move them to a point just before the
> > timer code starts using clocks and hwmod.
> > 
> > This should atleast pave way for clk inits on OMAP moving to dynamic
> > clock registrations instead of using the static macros defined in
> > clk-private.h.
> > 
> > The issue with kernel panic while CONFIG_DEBUG_SLAB is enabled
> > was reported by Piotr Haber and Tony Lindgren and this patch
> > fixes the reported issue as well.
> > 
> > Reported-by: Piotr Haber <[email-masked]>
> > Reported-by: Tony Lindgren <[email-masked]>
> > Signed-off-by: Rajendra Nayak <[email-masked]>
> > ---
> > applies on 3.9-rc3 and tested on omap4 pandaES, omap3 beagle XM,
> > and am335x bone.
> > 
> Acked-by: Santosh Shilimkar <[email-masked]>

This is nice :)

Reviewed-by: Mike Turquette <[email-masked]>

Regards,
Mike