Re: PATCH: Voyager, tty locking

From: Zach Brown
Date: Tue Aug 08 2006 - 14:36:15 EST



> 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(&current->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);