Commit 0287ebed authored by Nishanth Aravamudan's avatar Nishanth Aravamudan Committed by Linus Torvalds

[PATCH] ppc64: replace schedule_timeout() with msleep_interruptible()

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: default avatarNishanth Aravamudan <nacc@us.ibm.com>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Benjamin Herrenschmidt <benh@kernel.crashing.org>
Signed-off-by: default avatarAndrew Morton <akpm@osdl.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@osdl.org>
parent 233ccd0d
...@@ -19,6 +19,7 @@ ...@@ -19,6 +19,7 @@
#include <linux/vmalloc.h> #include <linux/vmalloc.h>
#include <linux/spinlock.h> #include <linux/spinlock.h>
#include <linux/cpu.h> #include <linux/cpu.h>
#include <linux/delay.h>
#include <asm/uaccess.h> #include <asm/uaccess.h>
#include <asm/io.h> #include <asm/io.h>
...@@ -412,8 +413,7 @@ static void do_event_scan_all_cpus(long delay) ...@@ -412,8 +413,7 @@ static void do_event_scan_all_cpus(long delay)
/* Drop hotplug lock, and sleep for the specified delay */ /* Drop hotplug lock, and sleep for the specified delay */
unlock_cpu_hotplug(); unlock_cpu_hotplug();
set_current_state(TASK_INTERRUPTIBLE); msleep_interruptible(delay);
schedule_timeout(delay);
lock_cpu_hotplug(); lock_cpu_hotplug();
cpu = next_cpu(cpu, cpu_online_map); cpu = next_cpu(cpu, cpu_online_map);
...@@ -442,7 +442,7 @@ static int rtasd(void *unused) ...@@ -442,7 +442,7 @@ static int rtasd(void *unused)
printk(KERN_INFO "RTAS daemon started\n"); 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 */ /* See if we have any error stored in NVRAM */
memset(logdata, 0, rtas_error_log_max); memset(logdata, 0, rtas_error_log_max);
...@@ -459,7 +459,7 @@ static int rtasd(void *unused) ...@@ -459,7 +459,7 @@ static int rtasd(void *unused)
} }
/* First pass. */ /* First pass. */
do_event_scan_all_cpus(HZ); do_event_scan_all_cpus(1000);
if (surveillance_timeout != -1) { if (surveillance_timeout != -1) {
DEBUG("enabling surveillance\n"); DEBUG("enabling surveillance\n");
...@@ -471,7 +471,7 @@ static int rtasd(void *unused) ...@@ -471,7 +471,7 @@ static int rtasd(void *unused)
* machines have problems if we call event-scan too * machines have problems if we call event-scan too
* quickly. */ * quickly. */
for (;;) for (;;)
do_event_scan_all_cpus((HZ*60/rtas_event_scan_rate) / 2); do_event_scan_all_cpus(30000/rtas_event_scan_rate);
error: error:
/* Should delete proc entries */ /* Should delete proc entries */
......
...@@ -35,6 +35,7 @@ ...@@ -35,6 +35,7 @@
#include <linux/spinlock.h> #include <linux/spinlock.h>
#include <linux/bcd.h> #include <linux/bcd.h>
#include <linux/interrupt.h> #include <linux/interrupt.h>
#include <linux/delay.h>
#include <asm/io.h> #include <asm/io.h>
#include <asm/uaccess.h> #include <asm/uaccess.h>
...@@ -351,8 +352,7 @@ void rtas_get_rtc_time(struct rtc_time *rtc_tm) ...@@ -351,8 +352,7 @@ void rtas_get_rtc_time(struct rtc_time *rtc_tm)
return; /* delay not allowed */ return; /* delay not allowed */
} }
wait_time = rtas_extended_busy_delay_time(error); wait_time = rtas_extended_busy_delay_time(error);
set_current_state(TASK_INTERRUPTIBLE); msleep_interruptible(wait_time);
schedule_timeout(wait_time);
error = RTAS_CLOCK_BUSY; error = RTAS_CLOCK_BUSY;
} }
} while (error == RTAS_CLOCK_BUSY && (__get_tb() < max_wait_tb)); } while (error == RTAS_CLOCK_BUSY && (__get_tb() < max_wait_tb));
...@@ -386,8 +386,7 @@ int rtas_set_rtc_time(struct rtc_time *tm) ...@@ -386,8 +386,7 @@ int rtas_set_rtc_time(struct rtc_time *tm)
if (in_interrupt()) if (in_interrupt())
return 1; /* probably decrementer */ return 1; /* probably decrementer */
wait_time = rtas_extended_busy_delay_time(error); wait_time = rtas_extended_busy_delay_time(error);
set_current_state(TASK_INTERRUPTIBLE); msleep_interruptible(wait_time);
schedule_timeout(wait_time);
error = RTAS_CLOCK_BUSY; error = RTAS_CLOCK_BUSY;
} }
} while (error == RTAS_CLOCK_BUSY && (__get_tb() < max_wait_tb)); } while (error == RTAS_CLOCK_BUSY && (__get_tb() < max_wait_tb));
......
...@@ -25,6 +25,7 @@ ...@@ -25,6 +25,7 @@
#include <linux/errno.h> #include <linux/errno.h>
#include <linux/proc_fs.h> #include <linux/proc_fs.h>
#include <linux/init.h> #include <linux/init.h>
#include <linux/delay.h>
#include <asm/uaccess.h> #include <asm/uaccess.h>
#include <asm/rtas.h> #include <asm/rtas.h>
#include <asm/prom.h> #include <asm/prom.h>
...@@ -77,7 +78,7 @@ static ssize_t scanlog_read(struct file *file, char __user *buf, ...@@ -77,7 +78,7 @@ static ssize_t scanlog_read(struct file *file, char __user *buf,
return -EFAULT; return -EFAULT;
for (;;) { for (;;) {
wait_time = HZ/2; /* default wait if no data */ wait_time = 500; /* default wait if no data */
spin_lock(&rtas_data_buf_lock); spin_lock(&rtas_data_buf_lock);
memcpy(rtas_data_buf, data, RTAS_DATA_BUF_SIZE); memcpy(rtas_data_buf, data, RTAS_DATA_BUF_SIZE);
status = rtas_call(ibm_scan_log_dump, 2, 1, NULL, status = rtas_call(ibm_scan_log_dump, 2, 1, NULL,
...@@ -107,24 +108,14 @@ static ssize_t scanlog_read(struct file *file, char __user *buf, ...@@ -107,24 +108,14 @@ static ssize_t scanlog_read(struct file *file, char __user *buf,
break; break;
default: default:
if (status > 9900 && status <= 9905) { if (status > 9900 && status <= 9905) {
/* No data. RTAS is hinting at a delay required wait_time = rtas_extended_busy_delay_time(status);
* 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 */
} else { } else {
printk(KERN_ERR "scanlog: unknown error from rtas: %d\n", status); printk(KERN_ERR "scanlog: unknown error from rtas: %d\n", status);
return -EIO; return -EIO;
} }
} }
/* Apparently no data yet. Wait and try again. */ /* Apparently no data yet. Wait and try again. */
set_current_state(TASK_INTERRUPTIBLE); msleep_interruptible(wait_time);
schedule_timeout(wait_time);
} }
/*NOTREACHED*/ /*NOTREACHED*/
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment