From: Nishanth Aravamudan Use msleep_interruptible() instead of schedule_timeout() in ppc64-specific code to cleanup/simplify the sleeping logic. Change the units of the parameter of do_event_scan_all_cpus() to milliseconds from jiffies. The return value of rtas_extended_busy_delay_time() was incorrectly being used as a jiffies value (it is actually milliseconds), which is fixed by using the value as a parameter to msleep_interruptible(). Also, use rtas_extended_busy_delay_time() in another case where similar logic is duplicated. Signed-off-by: Nishanth Aravamudan Cc: Paul Mackerras Cc: Benjamin Herrenschmidt Signed-off-by: Andrew Morton --- arch/ppc64/kernel/rtasd.c | 10 +++++----- arch/ppc64/kernel/rtc.c | 7 +++---- arch/ppc64/kernel/scanlog.c | 17 ++++------------- 3 files changed, 12 insertions(+), 22 deletions(-) diff -puN arch/ppc64/kernel/rtasd.c~ppc64-replace-schedule_timeout-with-msleep_interruptible arch/ppc64/kernel/rtasd.c --- devel/arch/ppc64/kernel/rtasd.c~ppc64-replace-schedule_timeout-with-msleep_interruptible 2005-08-17 21:35:13.000000000 -0700 +++ devel-akpm/arch/ppc64/kernel/rtasd.c 2005-08-17 21:35:13.000000000 -0700 @@ -19,6 +19,7 @@ #include #include #include +#include #include #include @@ -412,8 +413,7 @@ static void do_event_scan_all_cpus(long /* Drop hotplug lock, and sleep for the specified delay */ unlock_cpu_hotplug(); - set_current_state(TASK_INTERRUPTIBLE); - schedule_timeout(delay); + msleep_interruptible(delay); lock_cpu_hotplug(); cpu = next_cpu(cpu, cpu_online_map); @@ -442,7 +442,7 @@ static int rtasd(void *unused) printk(KERN_INFO "RTAS daemon started\n"); - DEBUG("will sleep for %d jiffies\n", (HZ*60/rtas_event_scan_rate) / 2); + DEBUG("will sleep for %d milliseconds\n", (30000/rtas_event_scan_rate)); /* See if we have any error stored in NVRAM */ memset(logdata, 0, rtas_error_log_max); @@ -459,7 +459,7 @@ static int rtasd(void *unused) } /* First pass. */ - do_event_scan_all_cpus(HZ); + do_event_scan_all_cpus(1000); if (surveillance_timeout != -1) { DEBUG("enabling surveillance\n"); @@ -471,7 +471,7 @@ static int rtasd(void *unused) * machines have problems if we call event-scan too * quickly. */ for (;;) - do_event_scan_all_cpus((HZ*60/rtas_event_scan_rate) / 2); + do_event_scan_all_cpus(30000/rtas_event_scan_rate); error: /* Should delete proc entries */ diff -puN arch/ppc64/kernel/rtc.c~ppc64-replace-schedule_timeout-with-msleep_interruptible arch/ppc64/kernel/rtc.c --- devel/arch/ppc64/kernel/rtc.c~ppc64-replace-schedule_timeout-with-msleep_interruptible 2005-08-17 21:35:13.000000000 -0700 +++ devel-akpm/arch/ppc64/kernel/rtc.c 2005-08-17 21:35:13.000000000 -0700 @@ -35,6 +35,7 @@ #include #include #include +#include #include #include @@ -351,8 +352,7 @@ void rtas_get_rtc_time(struct rtc_time * return; /* delay not allowed */ } wait_time = rtas_extended_busy_delay_time(error); - set_current_state(TASK_INTERRUPTIBLE); - schedule_timeout(wait_time); + msleep_interruptible(wait_time); error = RTAS_CLOCK_BUSY; } } while (error == RTAS_CLOCK_BUSY && (__get_tb() < max_wait_tb)); @@ -386,8 +386,7 @@ int rtas_set_rtc_time(struct rtc_time *t if (in_interrupt()) return 1; /* probably decrementer */ wait_time = rtas_extended_busy_delay_time(error); - set_current_state(TASK_INTERRUPTIBLE); - schedule_timeout(wait_time); + msleep_interruptible(wait_time); error = RTAS_CLOCK_BUSY; } } while (error == RTAS_CLOCK_BUSY && (__get_tb() < max_wait_tb)); diff -puN arch/ppc64/kernel/scanlog.c~ppc64-replace-schedule_timeout-with-msleep_interruptible arch/ppc64/kernel/scanlog.c --- devel/arch/ppc64/kernel/scanlog.c~ppc64-replace-schedule_timeout-with-msleep_interruptible 2005-08-17 21:35:13.000000000 -0700 +++ devel-akpm/arch/ppc64/kernel/scanlog.c 2005-08-17 21:35:13.000000000 -0700 @@ -25,6 +25,7 @@ #include #include #include +#include #include #include #include @@ -77,7 +78,7 @@ static ssize_t scanlog_read(struct file return -EFAULT; for (;;) { - wait_time = HZ/2; /* default wait if no data */ + wait_time = 500; /* default wait if no data */ spin_lock(&rtas_data_buf_lock); memcpy(rtas_data_buf, data, RTAS_DATA_BUF_SIZE); status = rtas_call(ibm_scan_log_dump, 2, 1, NULL, @@ -107,24 +108,14 @@ static ssize_t scanlog_read(struct file break; default: if (status > 9900 && status <= 9905) { - /* No data. RTAS is hinting at a delay required - * between 1-100000 milliseconds - */ - int ms = 1; - for (; status > 9900; status--) - ms = ms * 10; - /* Use microseconds for reasonable accuracy */ - ms *= 1000; - wait_time = ms / (1000000/HZ); /* round down is fine */ - /* Fall through to sleep */ + wait_time = rtas_extended_busy_delay_time(status); } else { printk(KERN_ERR "scanlog: unknown error from rtas: %d\n", status); return -EIO; } } /* Apparently no data yet. Wait and try again. */ - set_current_state(TASK_INTERRUPTIBLE); - schedule_timeout(wait_time); + msleep_interruptible(wait_time); } /*NOTREACHED*/ } _