Commit 68e681e8 authored by Linus Torvalds's avatar Linus Torvalds

Merge master.kernel.org:/pub/scm/linux/kernel/git/davem/sparc-2.6

parents 25f13053 38c1844b
...@@ -7,6 +7,7 @@ ...@@ -7,6 +7,7 @@
#define __KERNEL_SYSCALLS__ #define __KERNEL_SYSCALLS__
#include <linux/kernel.h> #include <linux/kernel.h>
#include <linux/kthread.h>
#include <linux/sched.h> #include <linux/sched.h>
#include <linux/slab.h> #include <linux/slab.h>
#include <linux/delay.h> #include <linux/delay.h>
...@@ -459,10 +460,6 @@ static struct task_struct *kenvctrld_task; ...@@ -459,10 +460,6 @@ static struct task_struct *kenvctrld_task;
static int kenvctrld(void *__unused) static int kenvctrld(void *__unused)
{ {
daemonize("kenvctrld");
allow_signal(SIGKILL);
kenvctrld_task = current;
printk(KERN_INFO "bbc_envctrl: kenvctrld starting...\n"); printk(KERN_INFO "bbc_envctrl: kenvctrld starting...\n");
last_warning_jiffies = jiffies - WARN_INTERVAL; last_warning_jiffies = jiffies - WARN_INTERVAL;
for (;;) { for (;;) {
...@@ -470,7 +467,7 @@ static int kenvctrld(void *__unused) ...@@ -470,7 +467,7 @@ static int kenvctrld(void *__unused)
struct bbc_fan_control *fp; struct bbc_fan_control *fp;
msleep_interruptible(POLL_INTERVAL); msleep_interruptible(POLL_INTERVAL);
if (signal_pending(current)) if (kthread_should_stop())
break; break;
for (tp = all_bbc_temps; tp; tp = tp->next) { for (tp = all_bbc_temps; tp; tp = tp->next) {
...@@ -577,7 +574,6 @@ int bbc_envctrl_init(void) ...@@ -577,7 +574,6 @@ int bbc_envctrl_init(void)
int temp_index = 0; int temp_index = 0;
int fan_index = 0; int fan_index = 0;
int devidx = 0; int devidx = 0;
int err = 0;
while ((echild = bbc_i2c_getdev(devidx++)) != NULL) { while ((echild = bbc_i2c_getdev(devidx++)) != NULL) {
if (!strcmp(echild->prom_name, "temperature")) if (!strcmp(echild->prom_name, "temperature"))
...@@ -585,9 +581,13 @@ int bbc_envctrl_init(void) ...@@ -585,9 +581,13 @@ int bbc_envctrl_init(void)
if (!strcmp(echild->prom_name, "fan-control")) if (!strcmp(echild->prom_name, "fan-control"))
attach_one_fan(echild, fan_index++); attach_one_fan(echild, fan_index++);
} }
if (temp_index != 0 && fan_index != 0) if (temp_index != 0 && fan_index != 0) {
err = kernel_thread(kenvctrld, NULL, CLONE_FS | CLONE_FILES); kenvctrld_task = kthread_run(kenvctrld, NULL, "kenvctrld");
return err; if (IS_ERR(kenvctrld_task))
return PTR_ERR(kenvctrld_task);
}
return 0;
} }
static void destroy_one_temp(struct bbc_cpu_temperature *tp) static void destroy_one_temp(struct bbc_cpu_temperature *tp)
...@@ -607,26 +607,7 @@ void bbc_envctrl_cleanup(void) ...@@ -607,26 +607,7 @@ void bbc_envctrl_cleanup(void)
struct bbc_cpu_temperature *tp; struct bbc_cpu_temperature *tp;
struct bbc_fan_control *fp; struct bbc_fan_control *fp;
if (kenvctrld_task != NULL) { kthread_stop(kenvctrld_task);
force_sig(SIGKILL, kenvctrld_task);
for (;;) {
struct task_struct *p;
int found = 0;
read_lock(&tasklist_lock);
for_each_process(p) {
if (p == kenvctrld_task) {
found = 1;
break;
}
}
read_unlock(&tasklist_lock);
if (!found)
break;
msleep(1000);
}
kenvctrld_task = NULL;
}
tp = all_bbc_temps; tp = all_bbc_temps;
while (tp != NULL) { while (tp != NULL) {
......
...@@ -24,6 +24,7 @@ ...@@ -24,6 +24,7 @@
#include <linux/config.h> #include <linux/config.h>
#include <linux/module.h> #include <linux/module.h>
#include <linux/sched.h> #include <linux/sched.h>
#include <linux/kthread.h>
#include <linux/errno.h> #include <linux/errno.h>
#include <linux/delay.h> #include <linux/delay.h>
#include <linux/ioport.h> #include <linux/ioport.h>
...@@ -1010,14 +1011,11 @@ static int kenvctrld(void *__unused) ...@@ -1010,14 +1011,11 @@ static int kenvctrld(void *__unused)
poll_interval = 5000; /* TODO env_mon_interval */ poll_interval = 5000; /* TODO env_mon_interval */
daemonize("kenvctrld");
allow_signal(SIGKILL);
kenvctrld_task = current;
printk(KERN_INFO "envctrl: %s starting...\n", current->comm); printk(KERN_INFO "envctrl: %s starting...\n", current->comm);
for (;;) { for (;;) {
if(msleep_interruptible(poll_interval)) msleep_interruptible(poll_interval);
if (kthread_should_stop())
break; break;
for (whichcpu = 0; whichcpu < ENVCTRL_MAX_CPU; ++whichcpu) { for (whichcpu = 0; whichcpu < ENVCTRL_MAX_CPU; ++whichcpu) {
...@@ -1041,7 +1039,6 @@ static int kenvctrld(void *__unused) ...@@ -1041,7 +1039,6 @@ static int kenvctrld(void *__unused)
static int __init envctrl_init(void) static int __init envctrl_init(void)
{ {
#ifdef CONFIG_PCI
struct linux_ebus *ebus = NULL; struct linux_ebus *ebus = NULL;
struct linux_ebus_device *edev = NULL; struct linux_ebus_device *edev = NULL;
struct linux_ebus_child *edev_child = NULL; struct linux_ebus_child *edev_child = NULL;
...@@ -1118,9 +1115,11 @@ done: ...@@ -1118,9 +1115,11 @@ done:
i2c_childlist[i].addr, (0 == i) ? ("\n") : (" ")); i2c_childlist[i].addr, (0 == i) ? ("\n") : (" "));
} }
err = kernel_thread(kenvctrld, NULL, CLONE_FS | CLONE_FILES); kenvctrld_task = kthread_run(kenvctrld, NULL, "kenvctrld");
if (err < 0) if (IS_ERR(kenvctrld_task)) {
err = PTR_ERR(kenvctrld_task);
goto out_deregister; goto out_deregister;
}
return 0; return 0;
...@@ -1133,37 +1132,13 @@ out_iounmap: ...@@ -1133,37 +1132,13 @@ out_iounmap:
kfree(i2c_childlist[i].tables); kfree(i2c_childlist[i].tables);
} }
return err; return err;
#else
return -ENODEV;
#endif
} }
static void __exit envctrl_cleanup(void) static void __exit envctrl_cleanup(void)
{ {
int i; int i;
if (NULL != kenvctrld_task) { kthread_stop(kenvctrld_task);
force_sig(SIGKILL, kenvctrld_task);
for (;;) {
struct task_struct *p;
int found = 0;
read_lock(&tasklist_lock);
for_each_process(p) {
if (p == kenvctrld_task) {
found = 1;
break;
}
}
read_unlock(&tasklist_lock);
if (!found)
break;
msleep(1000);
}
kenvctrld_task = NULL;
}
iounmap(i2c); iounmap(i2c);
misc_deregister(&envctrl_dev); misc_deregister(&envctrl_dev);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment