> I'll add the kthread conversion to my list ... unless the suggestor also
> wants to become the implementor?
Well, here's a start that builds. I didn't want to get too close to the
nutty sem and timeout logic.
- z
[ apologies for the attachment ]
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 <linux/kmod.h>
#include <linux/completion.h>
#include <linux/sched.h>
+#include <linux/kthread.h>
#include <asm/desc.h>
#include <asm/voyager.h>
#include <asm/vic.h>
#include <asm/mtrr.h>
#include <asm/msr.h>
-#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);
[Index of Archives]
[Kernel Newbies]
[Netfilter]
[Bugtraq]
[Photo]
[Stuff]
[Gimp]
[Yosemite News]
[MIPS Linux]
[ARM Linux]
[Linux Security]
[Linux RAID]
[Video 4 Linux]
[Linux for the blind]
[Linux Resources]