• Yi Li's avatar
    Blackfin: SMP: don't start up core b until its state has been completely onlined · 578d36f5
    Yi Li authored
    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: default avatarYi Li <yi.li@analog.com>
    Signed-off-by: default avatarMike Frysinger <vapier@gentoo.org>
    578d36f5
smp.c 3.64 KB