Index: 2.6.18-rc4-removing-foot-from-mouth/arch/i386/mach-voyager/voyager_thread.c =================================================================== --- 2.6.18-rc4-removing-foot-from-mouth.orig/arch/i386/mach-voyager/voyager_thread.c +++ 2.6.18-rc4-removing-foot-from-mouth/arch/i386/mach-voyager/voyager_thread.c @@ -24,34 +24,21 @@ #include #include #include +#include #include #include #include #include #include -#define THREAD_NAME "kvoyagerd" - /* external variables */ int kvoyagerd_running = 0; DECLARE_MUTEX_LOCKED(kvoyagerd_sem); -static int thread(void *); +static struct task_struct *voyager_task; 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 execute(const char *string) { @@ -116,25 +103,19 @@ wakeup(unsigned long unused) up(&kvoyagerd_sem); } -static int -thread(void *unused) +static int voyager_thread(void *unused) { struct timer_list wakeup_timer; kvoyagerd_running = 1; - daemonize(THREAD_NAME); - set_timeout = 0; init_timer(&wakeup_timer); - sigfillset(¤t->blocked); - current->signal->tty = NULL; - printk(KERN_NOTICE "Voyager starting monitor thread\n"); - for(;;) { + while(!kthread_should_stop()) { down_interruptible(&kvoyagerd_sem); VDEBUG(("Voyager Daemon awoken\n")); if(voyager_status.request_from_kernel == 0) { @@ -151,13 +132,28 @@ thread(void *unused) add_timer(&wakeup_timer); } } + + return 0; +} + +/* Start the machine monitor thread. Return 1 if OK, 0 if fail */ +static int __init voyager_thread_init(void) +{ + voyager_task = kthread_run(voyager_thread, NULL, "kvoyagerd"); + if (IS_ERR(voyager_task)) { + /* This is serious, but not fatal */ + printk(KERN_ERR "Voyager: Failed to create system monitor thread! error %ld\n", PTR_ERR(voyager_task)); + return PTR_ERR(voyager_task); + } + + return 0; } +module_init(voyager_thread_init); -static void __exit -voyager_thread_stop(void) +static void __exit voyager_thread_exit(void) { - /* FIXME: do nothing at the moment */ + if (voyager_task && !IS_ERR(voyager_task)) + kthread_stop(voyager_task); } +module_exit(voyager_thread_exit); -module_init(voyager_thread_start); -//module_exit(voyager_thread_stop);