diff options
author | Greg Kroah-Hartman <gregkh@suse.de> | 2006-02-22 15:02:34 -0800 |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@suse.de> | 2006-02-22 15:02:34 -0800 |
commit | eb6b406dcc7096974eec722b436e0f05eca353a4 (patch) | |
tree | 0fa607d200cd276b6774f0f863e317a0741fc493 /i2c | |
parent | 4fffec22d6b7a52d17e144280ea226114c92e0a0 (diff) | |
download | patches-eb6b406dcc7096974eec722b436e0f05eca353a4.tar.gz |
usb, pci, and driver patches added
Diffstat (limited to 'i2c')
-rw-r--r-- | i2c/w1-use-kthread-api.patch | 273 |
1 files changed, 273 insertions, 0 deletions
diff --git a/i2c/w1-use-kthread-api.patch b/i2c/w1-use-kthread-api.patch new file mode 100644 index 0000000000000..1251fc035fa27 --- /dev/null +++ b/i2c/w1-use-kthread-api.patch @@ -0,0 +1,273 @@ +From johnpol@2ka.mipt.ru Mon Feb 20 00:15:43 2006 +Date: Mon, 20 Feb 2006 11:15:37 +0300 +From: Evgeniy Polyakov <johnpol@2ka.mipt.ru> +To: GregKH <greg@kroah.com> +Cc: Christoph Hellwig <hch@lst.de> +Subject: w1: use kthread api. +Message-ID: <20060220081537.GA17313@2ka.mipt.ru> +Content-Disposition: inline + +This patch removes old-style kernel thread initialization +and changes w1 to use kthread api. +It is based on Christoph Hellwig <hch@lst.de> work. + +Signed-off-by: Evgeniy Polyakov <johnpol@2ka.mipt.ru> +Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de> + +--- + drivers/w1/w1.c | 58 +++++++++++++++------------------------------------- + drivers/w1/w1.h | 3 -- + drivers/w1/w1_int.c | 34 +++++++++--------------------- + 3 files changed, 29 insertions(+), 66 deletions(-) + +--- gregkh-2.6.orig/drivers/w1/w1.c ++++ gregkh-2.6/drivers/w1/w1.c +@@ -30,6 +30,7 @@ + #include <linux/device.h> + #include <linux/slab.h> + #include <linux/sched.h> ++#include <linux/kthread.h> + + #include <asm/atomic.h> + +@@ -57,9 +58,7 @@ module_param_named(slave_ttl, w1_max_sla + DEFINE_SPINLOCK(w1_mlock); + LIST_HEAD(w1_masters); + +-static pid_t control_thread; +-static int control_needs_exit; +-static DECLARE_COMPLETION(w1_control_complete); ++static struct task_struct *w1_control_thread; + + static int w1_master_match(struct device *dev, struct device_driver *drv) + { +@@ -717,22 +716,16 @@ static int w1_control(void *data) + { + struct w1_slave *sl, *sln; + struct w1_master *dev, *n; +- int err, have_to_wait = 0; ++ int have_to_wait = 0; + +- daemonize("w1_control"); +- allow_signal(SIGTERM); +- +- while (!control_needs_exit || have_to_wait) { ++ while (!kthread_should_stop() || have_to_wait) { + have_to_wait = 0; + + try_to_freeze(); + msleep_interruptible(w1_control_timeout * 1000); + +- if (signal_pending(current)) +- flush_signals(current); +- + list_for_each_entry_safe(dev, n, &w1_masters, w1_master_entry) { +- if (!control_needs_exit && !dev->flags) ++ if (!kthread_should_stop() && !dev->flags) + continue; + /* + * Little race: we can create thread but not set the flag. +@@ -743,21 +736,12 @@ static int w1_control(void *data) + continue; + } + +- if (control_needs_exit) { ++ if (kthread_should_stop() || test_bit(W1_MASTER_NEED_EXIT, &dev->flags)) { + set_bit(W1_MASTER_NEED_EXIT, &dev->flags); + +- err = kill_proc(dev->kpid, SIGTERM, 1); +- if (err) +- dev_err(&dev->dev, +- "Failed to send signal to w1 kernel thread %d.\n", +- dev->kpid); +- } +- +- if (test_bit(W1_MASTER_NEED_EXIT, &dev->flags)) { +- wait_for_completion(&dev->dev_exited); +- spin_lock_bh(&w1_mlock); ++ spin_lock(&w1_mlock); + list_del(&dev->w1_master_entry); +- spin_unlock_bh(&w1_mlock); ++ spin_unlock(&w1_mlock); + + down(&dev->mutex); + list_for_each_entry_safe(sl, sln, &dev->slist, w1_slave_entry) { +@@ -789,7 +773,7 @@ static int w1_control(void *data) + } + } + +- complete_and_exit(&w1_control_complete, 0); ++ return 0; + } + + int w1_process(void *data) +@@ -797,17 +781,11 @@ int w1_process(void *data) + struct w1_master *dev = (struct w1_master *) data; + struct w1_slave *sl, *sln; + +- daemonize("%s", dev->name); +- allow_signal(SIGTERM); +- +- while (!test_bit(W1_MASTER_NEED_EXIT, &dev->flags)) { ++ while (!kthread_should_stop() && !test_bit(W1_MASTER_NEED_EXIT, &dev->flags)) { + try_to_freeze(); + msleep_interruptible(w1_timeout * 1000); + +- if (signal_pending(current)) +- flush_signals(current); +- +- if (test_bit(W1_MASTER_NEED_EXIT, &dev->flags)) ++ if (kthread_should_stop() || test_bit(W1_MASTER_NEED_EXIT, &dev->flags)) + break; + + if (!dev->initialized) +@@ -840,8 +818,7 @@ int w1_process(void *data) + } + + atomic_dec(&dev->refcnt); +- complete_and_exit(&dev->dev_exited, 0); +- ++ + return 0; + } + +@@ -873,11 +850,11 @@ static int w1_init(void) + goto err_out_master_unregister; + } + +- control_thread = kernel_thread(&w1_control, NULL, 0); +- if (control_thread < 0) { ++ w1_control_thread = kthread_run(w1_control, NULL, "w1_control"); ++ if (IS_ERR(w1_control_thread)) { ++ retval = PTR_ERR(w1_control_thread); + printk(KERN_ERR "Failed to create control thread. err=%d\n", +- control_thread); +- retval = control_thread; ++ retval); + goto err_out_slave_unregister; + } + +@@ -903,8 +880,7 @@ static void w1_fini(void) + list_for_each_entry(dev, &w1_masters, w1_master_entry) + __w1_remove_master_device(dev); + +- control_needs_exit = 1; +- wait_for_completion(&w1_control_complete); ++ kthread_stop(w1_control_thread); + + driver_unregister(&w1_slave_driver); + driver_unregister(&w1_master_driver); +--- gregkh-2.6.orig/drivers/w1/w1.h ++++ gregkh-2.6/drivers/w1/w1.h +@@ -172,12 +172,11 @@ struct w1_master + + long flags; + +- pid_t kpid; ++ struct task_struct *thread; + struct semaphore mutex; + + struct device_driver *driver; + struct device dev; +- struct completion dev_exited; + + struct w1_bus_master *bus_master; + +--- gregkh-2.6.orig/drivers/w1/w1_int.c ++++ gregkh-2.6/drivers/w1/w1_int.c +@@ -22,6 +22,7 @@ + #include <linux/kernel.h> + #include <linux/list.h> + #include <linux/delay.h> ++#include <linux/kthread.h> + + #include "w1.h" + #include "w1_log.h" +@@ -56,7 +57,6 @@ static struct w1_master * w1_alloc_dev(u + dev->max_slave_count = slave_count; + dev->slave_count = 0; + dev->attempts = 0; +- dev->kpid = -1; + dev->initialized = 0; + dev->id = id; + dev->slave_ttl = slave_ttl; +@@ -67,8 +67,6 @@ static struct w1_master * w1_alloc_dev(u + INIT_LIST_HEAD(&dev->slist); + init_MUTEX(&dev->mutex); + +- init_completion(&dev->dev_exited); +- + memcpy(&dev->dev, device, sizeof(struct device)); + snprintf(dev->dev.bus_id, sizeof(dev->dev.bus_id), + "w1_bus_master%u", dev->id); +@@ -116,12 +114,12 @@ int w1_add_master_device(struct w1_bus_m + if (!dev) + return -ENOMEM; + +- dev->kpid = kernel_thread(&w1_process, dev, 0); +- if (dev->kpid < 0) { ++ dev->thread = kthread_run(&w1_process, dev, "%s", dev->name); ++ if (IS_ERR(dev->thread)) { ++ retval = PTR_ERR(dev->thread); + dev_err(&dev->dev, + "Failed to create new kernel thread. err=%d\n", +- dev->kpid); +- retval = dev->kpid; ++ retval); + goto err_out_free_dev; + } + +@@ -138,20 +136,14 @@ int w1_add_master_device(struct w1_bus_m + spin_unlock(&w1_mlock); + + msg.id.mst.id = dev->id; +- msg.id.mst.pid = dev->kpid; ++ msg.id.mst.pid = dev->thread->pid; + msg.type = W1_MASTER_ADD; + w1_netlink_send(dev, &msg); + + return 0; + + err_out_kill_thread: +- set_bit(W1_MASTER_NEED_EXIT, &dev->flags); +- if (kill_proc(dev->kpid, SIGTERM, 1)) +- dev_err(&dev->dev, +- "Failed to send signal to w1 kernel thread %d.\n", +- dev->kpid); +- wait_for_completion(&dev->dev_exited); +- ++ kthread_stop(dev->thread); + err_out_free_dev: + w1_free_dev(dev); + +@@ -160,18 +152,14 @@ err_out_free_dev: + + void __w1_remove_master_device(struct w1_master *dev) + { +- int err; + struct w1_netlink_msg msg; ++ pid_t pid = dev->thread->pid; + + set_bit(W1_MASTER_NEED_EXIT, &dev->flags); +- err = kill_proc(dev->kpid, SIGTERM, 1); +- if (err) +- dev_err(&dev->dev, +- "%s: Failed to send signal to w1 kernel thread %d.\n", +- __func__, dev->kpid); ++ kthread_stop(dev->thread); + + while (atomic_read(&dev->refcnt)) { +- dev_dbg(&dev->dev, "Waiting for %s to become free: refcnt=%d.\n", ++ dev_info(&dev->dev, "Waiting for %s to become free: refcnt=%d.\n", + dev->name, atomic_read(&dev->refcnt)); + + if (msleep_interruptible(1000)) +@@ -179,7 +167,7 @@ void __w1_remove_master_device(struct w1 + } + + msg.id.mst.id = dev->id; +- msg.id.mst.pid = dev->kpid; ++ msg.id.mst.pid = pid; + msg.type = W1_MASTER_REMOVE; + w1_netlink_send(dev, &msg); + |