|
@@ -251,6 +251,7 @@ static ssize_t w1_master_attribute_store_search(struct device * dev,
|
|
|
mutex_lock(&md->mutex);
|
|
|
md->search_count = simple_strtol(buf, NULL, 0);
|
|
|
mutex_unlock(&md->mutex);
|
|
|
+ wake_up_process(md->thread);
|
|
|
|
|
|
return count;
|
|
|
}
|
|
@@ -773,7 +774,7 @@ void w1_search(struct w1_master *dev, u8 search_type, w1_slave_found_callback cb
|
|
|
tmp64 = (triplet_ret >> 2);
|
|
|
rn |= (tmp64 << i);
|
|
|
|
|
|
- if (test_bit(W1_MASTER_NEED_EXIT, &dev->flags)) {
|
|
|
+ if (kthread_should_stop()) {
|
|
|
printk(KERN_INFO "Abort w1_search (exiting)\n");
|
|
|
return;
|
|
|
}
|
|
@@ -811,8 +812,12 @@ void w1_search_process(struct w1_master *dev, u8 search_type)
|
|
|
int w1_process(void *data)
|
|
|
{
|
|
|
struct w1_master *dev = (struct w1_master *) data;
|
|
|
+ /* As long as w1_timeout is only set by a module parameter the sleep
|
|
|
+ * time can be calculated in jiffies once.
|
|
|
+ */
|
|
|
+ const unsigned long jtime = msecs_to_jiffies(w1_timeout * 1000);
|
|
|
|
|
|
- while (!kthread_should_stop() && !test_bit(W1_MASTER_NEED_EXIT, &dev->flags)) {
|
|
|
+ while (!kthread_should_stop()) {
|
|
|
if (dev->search_count) {
|
|
|
mutex_lock(&dev->mutex);
|
|
|
w1_search_process(dev, W1_SEARCH);
|
|
@@ -820,7 +825,16 @@ int w1_process(void *data)
|
|
|
}
|
|
|
|
|
|
try_to_freeze();
|
|
|
- msleep_interruptible(w1_timeout * 1000);
|
|
|
+ __set_current_state(TASK_INTERRUPTIBLE);
|
|
|
+
|
|
|
+ if (kthread_should_stop())
|
|
|
+ break;
|
|
|
+
|
|
|
+ /* Only sleep when the search is active. */
|
|
|
+ if (dev->search_count)
|
|
|
+ schedule_timeout(jtime);
|
|
|
+ else
|
|
|
+ schedule();
|
|
|
}
|
|
|
|
|
|
atomic_dec(&dev->refcnt);
|