Blackfin: SMP: don't start up core b until its state has been completely onlined
authorYi Li <yi.li@analog.com>
Wed, 2 Dec 2009 07:58:12 +0000 (07:58 +0000)
committerMike Frysinger <vapier@gentoo.org>
Tue, 15 Dec 2009 05:16:09 +0000 (00:16 -0500)
commit578d36f5e160208821e8f51037ac1038e065ecaf
tree6b1da0d6e7108c0bd217b132e165f2d06007fef8
parentad774b7cb0604d02c3596b79921fcb812df4dc71
Blackfin: SMP: don't start up core b until its state has been completely onlined

When testing PREEMPT_RT kernel on BF561-EZKit, the kernel blocks while
booting.  When the kernel initializes the ethernet driver, it sleeps and
never wakes up.

The issue happens when the kernel waits for a timer for Core B to timeout
(the timers are per-cpu based: static DEFINE_PER_CPU(struct tvec_base *,
tvec_bases) = &boot_tvec_bases).

However, the ksoftirqd thread for Core B (note, the ksoftirqd thread is
also per-cpu based) cannot work properly, and the timers for Core B never
times out.

When ksoftirqd() for the first time runs on core B, it is possible core A
is still initializing core B (see smp_init() -> cpu_up() -> __cpu_up()).
So the "cpu_is_offline()" check may return true and ksoftirqd moves to
"wait_to_die".

So delay the core b start up until the per-cpu timers have been set up
fully.

Signed-off-by: Yi Li <yi.li@analog.com>
Signed-off-by: Mike Frysinger <vapier@gentoo.org>
arch/blackfin/mach-bf561/smp.c
arch/blackfin/mach-common/smp.c