Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

[PATCH] w1: use kthread api.

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>

authored by

Evgeniy Polyakov and committed by
Greg Kroah-Hartman
674a396c f73b5e79

+28 -65
+16 -40
drivers/w1/w1.c
··· 30 30 #include <linux/device.h> 31 31 #include <linux/slab.h> 32 32 #include <linux/sched.h> 33 + #include <linux/kthread.h> 33 34 34 35 #include <asm/atomic.h> 35 36 ··· 58 57 DEFINE_SPINLOCK(w1_mlock); 59 58 LIST_HEAD(w1_masters); 60 59 61 - static pid_t control_thread; 62 - static int control_needs_exit; 63 - static DECLARE_COMPLETION(w1_control_complete); 60 + static struct task_struct *w1_control_thread; 64 61 65 62 static int w1_master_match(struct device *dev, struct device_driver *drv) 66 63 { ··· 716 717 { 717 718 struct w1_slave *sl, *sln; 718 719 struct w1_master *dev, *n; 719 - int err, have_to_wait = 0; 720 + int have_to_wait = 0; 720 721 721 - daemonize("w1_control"); 722 - allow_signal(SIGTERM); 723 - 724 - while (!control_needs_exit || have_to_wait) { 722 + while (!kthread_should_stop() || have_to_wait) { 725 723 have_to_wait = 0; 726 724 727 725 try_to_freeze(); 728 726 msleep_interruptible(w1_control_timeout * 1000); 729 727 730 - if (signal_pending(current)) 731 - flush_signals(current); 732 - 733 728 list_for_each_entry_safe(dev, n, &w1_masters, w1_master_entry) { 734 - if (!control_needs_exit && !dev->flags) 729 + if (!kthread_should_stop() && !dev->flags) 735 730 continue; 736 731 /* 737 732 * Little race: we can create thread but not set the flag. ··· 736 743 continue; 737 744 } 738 745 739 - if (control_needs_exit) { 746 + if (kthread_should_stop() || test_bit(W1_MASTER_NEED_EXIT, &dev->flags)) { 740 747 set_bit(W1_MASTER_NEED_EXIT, &dev->flags); 741 748 742 - err = kill_proc(dev->kpid, SIGTERM, 1); 743 - if (err) 744 - dev_err(&dev->dev, 745 - "Failed to send signal to w1 kernel thread %d.\n", 746 - dev->kpid); 747 - } 748 - 749 - if (test_bit(W1_MASTER_NEED_EXIT, &dev->flags)) { 750 - wait_for_completion(&dev->dev_exited); 751 - spin_lock_bh(&w1_mlock); 749 + spin_lock(&w1_mlock); 752 750 list_del(&dev->w1_master_entry); 753 - spin_unlock_bh(&w1_mlock); 751 + spin_unlock(&w1_mlock); 754 752 755 753 down(&dev->mutex); 756 754 list_for_each_entry_safe(sl, sln, &dev->slist, w1_slave_entry) { ··· 773 789 } 774 790 } 775 791 776 - complete_and_exit(&w1_control_complete, 0); 792 + return 0; 777 793 } 778 794 779 795 int w1_process(void *data) ··· 781 797 struct w1_master *dev = (struct w1_master *) data; 782 798 struct w1_slave *sl, *sln; 783 799 784 - daemonize("%s", dev->name); 785 - allow_signal(SIGTERM); 786 - 787 - while (!test_bit(W1_MASTER_NEED_EXIT, &dev->flags)) { 800 + while (!kthread_should_stop() && !test_bit(W1_MASTER_NEED_EXIT, &dev->flags)) { 788 801 try_to_freeze(); 789 802 msleep_interruptible(w1_timeout * 1000); 790 803 791 - if (signal_pending(current)) 792 - flush_signals(current); 793 - 794 - if (test_bit(W1_MASTER_NEED_EXIT, &dev->flags)) 804 + if (kthread_should_stop() || test_bit(W1_MASTER_NEED_EXIT, &dev->flags)) 795 805 break; 796 806 797 807 if (!dev->initialized) ··· 818 840 } 819 841 820 842 atomic_dec(&dev->refcnt); 821 - complete_and_exit(&dev->dev_exited, 0); 822 843 823 844 return 0; 824 845 } ··· 850 873 goto err_out_master_unregister; 851 874 } 852 875 853 - control_thread = kernel_thread(&w1_control, NULL, 0); 854 - if (control_thread < 0) { 876 + w1_control_thread = kthread_run(w1_control, NULL, "w1_control"); 877 + if (IS_ERR(w1_control_thread)) { 878 + retval = PTR_ERR(w1_control_thread); 855 879 printk(KERN_ERR "Failed to create control thread. err=%d\n", 856 - control_thread); 857 - retval = control_thread; 880 + retval); 858 881 goto err_out_slave_unregister; 859 882 } 860 883 ··· 880 903 list_for_each_entry(dev, &w1_masters, w1_master_entry) 881 904 __w1_remove_master_device(dev); 882 905 883 - control_needs_exit = 1; 884 - wait_for_completion(&w1_control_complete); 906 + kthread_stop(w1_control_thread); 885 907 886 908 driver_unregister(&w1_slave_driver); 887 909 driver_unregister(&w1_master_driver);
+1 -2
drivers/w1/w1.h
··· 172 172 173 173 long flags; 174 174 175 - pid_t kpid; 175 + struct task_struct *thread; 176 176 struct semaphore mutex; 177 177 178 178 struct device_driver *driver; 179 179 struct device dev; 180 - struct completion dev_exited; 181 180 182 181 struct w1_bus_master *bus_master; 183 182
+11 -23
drivers/w1/w1_int.c
··· 22 22 #include <linux/kernel.h> 23 23 #include <linux/list.h> 24 24 #include <linux/delay.h> 25 + #include <linux/kthread.h> 25 26 26 27 #include "w1.h" 27 28 #include "w1_log.h" ··· 57 56 dev->max_slave_count = slave_count; 58 57 dev->slave_count = 0; 59 58 dev->attempts = 0; 60 - dev->kpid = -1; 61 59 dev->initialized = 0; 62 60 dev->id = id; 63 61 dev->slave_ttl = slave_ttl; ··· 66 66 67 67 INIT_LIST_HEAD(&dev->slist); 68 68 init_MUTEX(&dev->mutex); 69 - 70 - init_completion(&dev->dev_exited); 71 69 72 70 memcpy(&dev->dev, device, sizeof(struct device)); 73 71 snprintf(dev->dev.bus_id, sizeof(dev->dev.bus_id), ··· 114 116 if (!dev) 115 117 return -ENOMEM; 116 118 117 - dev->kpid = kernel_thread(&w1_process, dev, 0); 118 - if (dev->kpid < 0) { 119 + dev->thread = kthread_run(&w1_process, dev, "%s", dev->name); 120 + if (IS_ERR(dev->thread)) { 121 + retval = PTR_ERR(dev->thread); 119 122 dev_err(&dev->dev, 120 123 "Failed to create new kernel thread. err=%d\n", 121 - dev->kpid); 122 - retval = dev->kpid; 124 + retval); 123 125 goto err_out_free_dev; 124 126 } 125 127 ··· 136 138 spin_unlock(&w1_mlock); 137 139 138 140 msg.id.mst.id = dev->id; 139 - msg.id.mst.pid = dev->kpid; 141 + msg.id.mst.pid = dev->thread->pid; 140 142 msg.type = W1_MASTER_ADD; 141 143 w1_netlink_send(dev, &msg); 142 144 143 145 return 0; 144 146 145 147 err_out_kill_thread: 146 - set_bit(W1_MASTER_NEED_EXIT, &dev->flags); 147 - if (kill_proc(dev->kpid, SIGTERM, 1)) 148 - dev_err(&dev->dev, 149 - "Failed to send signal to w1 kernel thread %d.\n", 150 - dev->kpid); 151 - wait_for_completion(&dev->dev_exited); 152 - 148 + kthread_stop(dev->thread); 153 149 err_out_free_dev: 154 150 w1_free_dev(dev); 155 151 ··· 152 160 153 161 void __w1_remove_master_device(struct w1_master *dev) 154 162 { 155 - int err; 156 163 struct w1_netlink_msg msg; 164 + pid_t pid = dev->thread->pid; 157 165 158 166 set_bit(W1_MASTER_NEED_EXIT, &dev->flags); 159 - err = kill_proc(dev->kpid, SIGTERM, 1); 160 - if (err) 161 - dev_err(&dev->dev, 162 - "%s: Failed to send signal to w1 kernel thread %d.\n", 163 - __func__, dev->kpid); 167 + kthread_stop(dev->thread); 164 168 165 169 while (atomic_read(&dev->refcnt)) { 166 - dev_dbg(&dev->dev, "Waiting for %s to become free: refcnt=%d.\n", 170 + dev_info(&dev->dev, "Waiting for %s to become free: refcnt=%d.\n", 167 171 dev->name, atomic_read(&dev->refcnt)); 168 172 169 173 if (msleep_interruptible(1000)) ··· 167 179 } 168 180 169 181 msg.id.mst.id = dev->id; 170 - msg.id.mst.pid = dev->kpid; 182 + msg.id.mst.pid = pid; 171 183 msg.type = W1_MASTER_REMOVE; 172 184 w1_netlink_send(dev, &msg); 173 185