From: Nathan Lynch The rtasd thread should not hold the cpucontrol semaphore while sleeping between event scans in its first pass; it needlessly delays boot by one second per cpu when CONFIG_HOTPLUG_CPU=y. Signed-off-by: Nathan Lynch Signed-off-by: Paul Mackerras Signed-off-by: Andrew Morton --- 25-akpm/arch/ppc64/kernel/rtasd.c | 61 ++++++++++++++++++-------------------- 1 files changed, 30 insertions(+), 31 deletions(-) diff -puN arch/ppc64/kernel/rtasd.c~ppc64-rtasd-shouldnt-hold-cpucontrol-while-sleeping arch/ppc64/kernel/rtasd.c --- 25/arch/ppc64/kernel/rtasd.c~ppc64-rtasd-shouldnt-hold-cpucontrol-while-sleeping 2005-03-16 00:37:26.000000000 -0800 +++ 25-akpm/arch/ppc64/kernel/rtasd.c 2005-03-16 00:37:26.000000000 -0800 @@ -399,10 +399,33 @@ static void do_event_scan(int event_scan } while(error == 0); } +static void do_event_scan_all_cpus(long delay) +{ + int cpu; + + lock_cpu_hotplug(); + cpu = first_cpu(cpu_online_map); + for (;;) { + set_cpus_allowed(current, cpumask_of_cpu(cpu)); + do_event_scan(rtas_token("event-scan")); + set_cpus_allowed(current, CPU_MASK_ALL); + + /* Drop hotplug lock, and sleep for the specified delay */ + unlock_cpu_hotplug(); + set_current_state(TASK_INTERRUPTIBLE); + schedule_timeout(delay); + lock_cpu_hotplug(); + + cpu = next_cpu(cpu, cpu_online_map); + if (cpu == NR_CPUS) + break; + } + unlock_cpu_hotplug(); +} + static int rtasd(void *unused) { unsigned int err_type; - int cpu = 0; int event_scan = rtas_token("event-scan"); int rc; @@ -436,17 +459,7 @@ static int rtasd(void *unused) } /* First pass. */ - lock_cpu_hotplug(); - for_each_online_cpu(cpu) { - DEBUG("scheduling on %d\n", cpu); - set_cpus_allowed(current, cpumask_of_cpu(cpu)); - DEBUG("watchdog scheduled on cpu %d\n", smp_processor_id()); - - do_event_scan(event_scan); - set_current_state(TASK_INTERRUPTIBLE); - schedule_timeout(HZ); - } - unlock_cpu_hotplug(); + do_event_scan_all_cpus(HZ); if (surveillance_timeout != -1) { DEBUG("enabling surveillance\n"); @@ -454,25 +467,11 @@ static int rtasd(void *unused) DEBUG("surveillance enabled\n"); } - lock_cpu_hotplug(); - cpu = first_cpu(cpu_online_map); - for (;;) { - set_cpus_allowed(current, cpumask_of_cpu(cpu)); - do_event_scan(event_scan); - set_cpus_allowed(current, CPU_MASK_ALL); - - /* Drop hotplug lock, and sleep for a bit (at least - * one second since some machines have problems if we - * call event-scan too quickly). */ - unlock_cpu_hotplug(); - set_current_state(TASK_INTERRUPTIBLE); - schedule_timeout((HZ*60/rtas_event_scan_rate) / 2); - lock_cpu_hotplug(); - - cpu = next_cpu(cpu, cpu_online_map); - if (cpu == NR_CPUS) - cpu = first_cpu(cpu_online_map); - } + /* Delay should be at least one second since some + * machines have problems if we call event-scan too + * quickly. */ + for (;;) + do_event_scan_all_cpus((HZ*60/rtas_event_scan_rate) / 2); error: /* Should delete proc entries */ _