[VOYAGER] Convert the monitor thread to use the kthread API
full kthread conversion on the voyager power switch handling thread. Signed-off-by: Christoph Hellwig <hch@lst.de> Signed-off-by: James Bottomley <James.Bottomley@HansenPartnership.com>
This commit is contained in:
committed by
James Bottomley
parent
9f483519be
commit
f3402a4e52
@@ -1111,7 +1111,7 @@ voyager_cat_do_common_interrupt(void)
|
|||||||
printk(KERN_ERR "Voyager front panel switch turned off\n");
|
printk(KERN_ERR "Voyager front panel switch turned off\n");
|
||||||
voyager_status.switch_off = 1;
|
voyager_status.switch_off = 1;
|
||||||
voyager_status.request_from_kernel = 1;
|
voyager_status.request_from_kernel = 1;
|
||||||
up(&kvoyagerd_sem);
|
wake_up_process(voyager_thread);
|
||||||
}
|
}
|
||||||
/* Tell the hardware we're taking care of the
|
/* Tell the hardware we're taking care of the
|
||||||
* shutdown, otherwise it will power the box off
|
* shutdown, otherwise it will power the box off
|
||||||
@@ -1157,7 +1157,7 @@ voyager_cat_do_common_interrupt(void)
|
|||||||
outb(VOYAGER_CAT_END, CAT_CMD);
|
outb(VOYAGER_CAT_END, CAT_CMD);
|
||||||
voyager_status.power_fail = 1;
|
voyager_status.power_fail = 1;
|
||||||
voyager_status.request_from_kernel = 1;
|
voyager_status.request_from_kernel = 1;
|
||||||
up(&kvoyagerd_sem);
|
wake_up_process(voyager_thread);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@@ -24,33 +24,16 @@
|
|||||||
#include <linux/kmod.h>
|
#include <linux/kmod.h>
|
||||||
#include <linux/completion.h>
|
#include <linux/completion.h>
|
||||||
#include <linux/sched.h>
|
#include <linux/sched.h>
|
||||||
|
#include <linux/kthread.h>
|
||||||
#include <asm/desc.h>
|
#include <asm/desc.h>
|
||||||
#include <asm/voyager.h>
|
#include <asm/voyager.h>
|
||||||
#include <asm/vic.h>
|
#include <asm/vic.h>
|
||||||
#include <asm/mtrr.h>
|
#include <asm/mtrr.h>
|
||||||
#include <asm/msr.h>
|
#include <asm/msr.h>
|
||||||
|
|
||||||
#define THREAD_NAME "kvoyagerd"
|
|
||||||
|
|
||||||
/* external variables */
|
struct task_struct *voyager_thread;
|
||||||
int kvoyagerd_running = 0;
|
static __u8 set_timeout;
|
||||||
DECLARE_MUTEX_LOCKED(kvoyagerd_sem);
|
|
||||||
|
|
||||||
static int thread(void *);
|
|
||||||
|
|
||||||
static __u8 set_timeout = 0;
|
|
||||||
|
|
||||||
/* Start the machine monitor thread. Return 1 if OK, 0 if fail */
|
|
||||||
static int __init
|
|
||||||
voyager_thread_start(void)
|
|
||||||
{
|
|
||||||
if(kernel_thread(thread, NULL, CLONE_KERNEL) < 0) {
|
|
||||||
/* This is serious, but not fatal */
|
|
||||||
printk(KERN_ERR "Voyager: Failed to create system monitor thread!!!\n");
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int
|
static int
|
||||||
execute(const char *string)
|
execute(const char *string)
|
||||||
@@ -110,31 +93,15 @@ check_continuing_condition(void)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
|
||||||
wakeup(unsigned long unused)
|
|
||||||
{
|
|
||||||
up(&kvoyagerd_sem);
|
|
||||||
}
|
|
||||||
|
|
||||||
static int
|
static int
|
||||||
thread(void *unused)
|
thread(void *unused)
|
||||||
{
|
{
|
||||||
struct timer_list wakeup_timer;
|
|
||||||
|
|
||||||
kvoyagerd_running = 1;
|
|
||||||
|
|
||||||
daemonize(THREAD_NAME);
|
|
||||||
|
|
||||||
set_timeout = 0;
|
|
||||||
|
|
||||||
init_timer(&wakeup_timer);
|
|
||||||
|
|
||||||
sigfillset(¤t->blocked);
|
|
||||||
|
|
||||||
printk(KERN_NOTICE "Voyager starting monitor thread\n");
|
printk(KERN_NOTICE "Voyager starting monitor thread\n");
|
||||||
|
|
||||||
for(;;) {
|
for (;;) {
|
||||||
down_interruptible(&kvoyagerd_sem);
|
set_current_state(TASK_INTERRUPTIBLE);
|
||||||
|
schedule_timeout(set_timeout ? HZ : MAX_SCHEDULE_TIMEOUT);
|
||||||
|
|
||||||
VDEBUG(("Voyager Daemon awoken\n"));
|
VDEBUG(("Voyager Daemon awoken\n"));
|
||||||
if(voyager_status.request_from_kernel == 0) {
|
if(voyager_status.request_from_kernel == 0) {
|
||||||
/* probably awoken from timeout */
|
/* probably awoken from timeout */
|
||||||
@@ -143,20 +110,26 @@ thread(void *unused)
|
|||||||
check_from_kernel();
|
check_from_kernel();
|
||||||
voyager_status.request_from_kernel = 0;
|
voyager_status.request_from_kernel = 0;
|
||||||
}
|
}
|
||||||
if(set_timeout) {
|
|
||||||
del_timer(&wakeup_timer);
|
|
||||||
wakeup_timer.expires = HZ + jiffies;
|
|
||||||
wakeup_timer.function = wakeup;
|
|
||||||
add_timer(&wakeup_timer);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int __init
|
||||||
|
voyager_thread_start(void)
|
||||||
|
{
|
||||||
|
voyager_thread = kthread_run(thread, NULL, "kvoyagerd");
|
||||||
|
if (IS_ERR(voyager_thread)) {
|
||||||
|
printk(KERN_ERR "Voyager: Failed to create system monitor thread.\n");
|
||||||
|
return PTR_ERR(voyager_thread);
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
static void __exit
|
static void __exit
|
||||||
voyager_thread_stop(void)
|
voyager_thread_stop(void)
|
||||||
{
|
{
|
||||||
/* FIXME: do nothing at the moment */
|
kthread_stop(voyager_thread);
|
||||||
}
|
}
|
||||||
|
|
||||||
module_init(voyager_thread_start);
|
module_init(voyager_thread_start);
|
||||||
//module_exit(voyager_thread_stop);
|
module_exit(voyager_thread_stop);
|
||||||
|
@@ -487,15 +487,11 @@ extern struct voyager_qic_cpi *voyager_quad_cpi_addr[NR_CPUS];
|
|||||||
extern struct voyager_SUS *voyager_SUS;
|
extern struct voyager_SUS *voyager_SUS;
|
||||||
|
|
||||||
/* variables exported always */
|
/* variables exported always */
|
||||||
|
extern struct task_struct *voyager_thread;
|
||||||
extern int voyager_level;
|
extern int voyager_level;
|
||||||
extern int kvoyagerd_running;
|
|
||||||
extern struct semaphore kvoyagerd_sem;
|
|
||||||
extern struct voyager_status voyager_status;
|
extern struct voyager_status voyager_status;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/* functions exported by the voyager and voyager_smp modules */
|
/* functions exported by the voyager and voyager_smp modules */
|
||||||
|
|
||||||
extern int voyager_cat_readb(__u8 module, __u8 asic, int reg);
|
extern int voyager_cat_readb(__u8 module, __u8 asic, int reg);
|
||||||
extern void voyager_cat_init(void);
|
extern void voyager_cat_init(void);
|
||||||
extern void voyager_detect(struct voyager_bios_info *);
|
extern void voyager_detect(struct voyager_bios_info *);
|
||||||
|
Reference in New Issue
Block a user