Skip to content

Commit

Permalink
Merge master.kernel.org:/pub/scm/linux/kernel/git/davem/sparc-2.6
Browse files Browse the repository at this point in the history
  • Loading branch information
Linus Torvalds committed Aug 9, 2005
2 parents 25f1305 + 38c1844 commit 68e681e
Show file tree
Hide file tree
Showing 2 changed files with 20 additions and 64 deletions.
39 changes: 10 additions & 29 deletions drivers/sbus/char/bbc_envctrl.c
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
#define __KERNEL_SYSCALLS__

#include <linux/kernel.h>
#include <linux/kthread.h>
#include <linux/sched.h>
#include <linux/slab.h>
#include <linux/delay.h>
Expand Down Expand Up @@ -459,18 +460,14 @@ static struct task_struct *kenvctrld_task;

static int kenvctrld(void *__unused)
{
daemonize("kenvctrld");
allow_signal(SIGKILL);
kenvctrld_task = current;

printk(KERN_INFO "bbc_envctrl: kenvctrld starting...\n");
last_warning_jiffies = jiffies - WARN_INTERVAL;
for (;;) {
struct bbc_cpu_temperature *tp;
struct bbc_fan_control *fp;

msleep_interruptible(POLL_INTERVAL);
if (signal_pending(current))
if (kthread_should_stop())
break;

for (tp = all_bbc_temps; tp; tp = tp->next) {
Expand Down Expand Up @@ -577,17 +574,20 @@ int bbc_envctrl_init(void)
int temp_index = 0;
int fan_index = 0;
int devidx = 0;
int err = 0;

while ((echild = bbc_i2c_getdev(devidx++)) != NULL) {
if (!strcmp(echild->prom_name, "temperature"))
attach_one_temp(echild, temp_index++);
if (!strcmp(echild->prom_name, "fan-control"))
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)
Expand All @@ -607,26 +607,7 @@ void bbc_envctrl_cleanup(void)
struct bbc_cpu_temperature *tp;
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;
while (tp != NULL) {
Expand Down
45 changes: 10 additions & 35 deletions drivers/sbus/char/envctrl.c
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@
#include <linux/config.h>
#include <linux/module.h>
#include <linux/sched.h>
#include <linux/kthread.h>
#include <linux/errno.h>
#include <linux/delay.h>
#include <linux/ioport.h>
Expand Down Expand Up @@ -1010,16 +1011,13 @@ static int kenvctrld(void *__unused)

poll_interval = 5000; /* TODO env_mon_interval */

daemonize("kenvctrld");
allow_signal(SIGKILL);

kenvctrld_task = current;

printk(KERN_INFO "envctrl: %s starting...\n", current->comm);
for (;;) {
if(msleep_interruptible(poll_interval))
break;
msleep_interruptible(poll_interval);

if (kthread_should_stop())
break;

for (whichcpu = 0; whichcpu < ENVCTRL_MAX_CPU; ++whichcpu) {
if (0 < envctrl_read_cpu_info(whichcpu, cputemp,
ENVCTRL_CPUTEMP_MON,
Expand All @@ -1041,7 +1039,6 @@ static int kenvctrld(void *__unused)

static int __init envctrl_init(void)
{
#ifdef CONFIG_PCI
struct linux_ebus *ebus = NULL;
struct linux_ebus_device *edev = NULL;
struct linux_ebus_child *edev_child = NULL;
Expand Down Expand Up @@ -1118,9 +1115,11 @@ static int __init envctrl_init(void)
i2c_childlist[i].addr, (0 == i) ? ("\n") : (" "));
}

err = kernel_thread(kenvctrld, NULL, CLONE_FS | CLONE_FILES);
if (err < 0)
kenvctrld_task = kthread_run(kenvctrld, NULL, "kenvctrld");
if (IS_ERR(kenvctrld_task)) {
err = PTR_ERR(kenvctrld_task);
goto out_deregister;
}

return 0;

Expand All @@ -1133,37 +1132,13 @@ static int __init envctrl_init(void)
kfree(i2c_childlist[i].tables);
}
return err;
#else
return -ENODEV;
#endif
}

static void __exit envctrl_cleanup(void)
{
int i;

if (NULL != 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;
}
kthread_stop(kenvctrld_task);

iounmap(i2c);
misc_deregister(&envctrl_dev);
Expand Down

0 comments on commit 68e681e

Please sign in to comment.