[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: Nishanth Aravamudan <nacc@us.ibm.com> Cc: Paul Mackerras <paulus@samba.org> Cc: Benjamin Herrenschmidt <benh@kernel.crashing.org> Signed-off-by: Andrew Morton <akpm@osdl.org> Signed-off-by: Linus Torvalds <torvalds@osdl.org>
This commit is contained in:
parent
233ccd0d04
commit
0287ebedfa
|
@ -19,6 +19,7 @@
|
|||
#include <linux/vmalloc.h>
|
||||
#include <linux/spinlock.h>
|
||||
#include <linux/cpu.h>
|
||||
#include <linux/delay.h>
|
||||
|
||||
#include <asm/uaccess.h>
|
||||
#include <asm/io.h>
|
||||
|
@ -412,8 +413,7 @@ static void do_event_scan_all_cpus(long delay)
|
|||
|
||||
/* 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 */
|
||||
|
|
|
@ -35,6 +35,7 @@
|
|||
#include <linux/spinlock.h>
|
||||
#include <linux/bcd.h>
|
||||
#include <linux/interrupt.h>
|
||||
#include <linux/delay.h>
|
||||
|
||||
#include <asm/io.h>
|
||||
#include <asm/uaccess.h>
|
||||
|
@ -351,8 +352,7 @@ void rtas_get_rtc_time(struct rtc_time *rtc_tm)
|
|||
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 *tm)
|
|||
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));
|
||||
|
|
|
@ -25,6 +25,7 @@
|
|||
#include <linux/errno.h>
|
||||
#include <linux/proc_fs.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/delay.h>
|
||||
#include <asm/uaccess.h>
|
||||
#include <asm/rtas.h>
|
||||
#include <asm/prom.h>
|
||||
|
@ -77,7 +78,7 @@ static ssize_t scanlog_read(struct file *file, char __user *buf,
|
|||
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 *file, char __user *buf,
|
|||
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*/
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue