|
@@ -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;
|
|
|
|
|
|
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)
|
|
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)
|
|
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)
|
|
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)
|
|
|
|
- err = kernel_thread(kenvctrld, NULL, CLONE_FS | CLONE_FILES);
|
|
|
|
- return err;
|
|
|
|
|
|
+ if (temp_index != 0 && fan_index != 0) {
|
|
|
|
+ kenvctrld_task = kthread_run(kenvctrld, NULL, "kenvctrld");
|
|
|
|
+ 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)
|
|
struct bbc_cpu_temperature *tp;
|
|
struct bbc_cpu_temperature *tp;
|
|
struct bbc_fan_control *fp;
|
|
struct bbc_fan_control *fp;
|
|
|
|
|
|
- if (kenvctrld_task != NULL) {
|
|
|
|
- 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;
|
|
|
|
- }
|
|
|
|
|
|
+ kthread_stop(kenvctrld_task);
|
|
|
|
|
|
tp = all_bbc_temps;
|
|
tp = all_bbc_temps;
|
|
while (tp != NULL) {
|
|
while (tp != NULL) {
|