From: David Fries <david@fries.net>
To: linux-kernel@vger.kernel.org
Cc: Evgeniy Polyakov <johnpol@2ka.mipt.ru>
Subject: [PATCH 3/35] W1: don't delay search start
Date: Fri, 28 Mar 2008 07:24:10 -0500 [thread overview]
Message-ID: <20080328122410.GD3613@spacedout.fries.net> (raw)
In-Reply-To: <200803272343.m2RNhDac017650@SpacedOut.fries.net>
[-- Attachment #1: Type: text/plain, Size: 3223 bytes --]
w1.c 1.6
w1_int.c 1.4
Move the creation of the w1_process thread to after the device has
been initialized. This way w1_process doesn't have to check to see if
it has been initialized and the bus search can proceed without
sleeping. That also eliminates two checks in the w1_process loop.
The sleep now happens at the end of the loop not the beginning.
Also added a comment for why the atomic_set was 2.
Signed-off-by: David Fries <david@fries.net>
---
drivers/w1/w1.c | 19 ++++++-------------
drivers/w1/w1_int.c | 26 +++++++++++++++++---------
2 files changed, 23 insertions(+), 22 deletions(-)
diff --git a/drivers/w1/w1.c b/drivers/w1/w1.c
index 6fb4110..9a09f3a 100644
--- a/drivers/w1/w1.c
+++ b/drivers/w1/w1.c
@@ -812,21 +812,14 @@ int w1_process(void *data)
struct w1_master *dev = (struct w1_master *) data;
while (!kthread_should_stop() && !test_bit(W1_MASTER_NEED_EXIT, &dev->flags)) {
+ if(dev->search_count) {
+ mutex_lock(&dev->mutex);
+ w1_search_process(dev, W1_SEARCH);
+ mutex_unlock(&dev->mutex);
+ }
+
try_to_freeze();
msleep_interruptible(w1_timeout * 1000);
-
- if (kthread_should_stop() || test_bit(W1_MASTER_NEED_EXIT, &dev->flags))
- break;
-
- if (!dev->initialized)
- continue;
-
- if (dev->search_count == 0)
- continue;
-
- mutex_lock(&dev->mutex);
- w1_search_process(dev, W1_SEARCH);
- mutex_unlock(&dev->mutex);
}
atomic_dec(&dev->refcnt);
diff --git a/drivers/w1/w1_int.c b/drivers/w1/w1_int.c
index 15a798f..bb6cbbe 100644
--- a/drivers/w1/w1_int.c
+++ b/drivers/w1/w1_int.c
@@ -61,6 +61,9 @@ static struct w1_master * w1_alloc_dev(u32 id, int slave_count, int slave_ttl,
dev->slave_ttl = slave_ttl;
dev->search_count = -1; /* continual scan */
+ /* 1 for w1_process to decrement
+ * 1 for __w1_remove_master_device to decrement
+ */
atomic_set(&dev->refcnt, 2);
INIT_LIST_HEAD(&dev->slist);
@@ -109,23 +112,23 @@ int w1_add_master_device(struct w1_bus_master *master)
if (!dev)
return -ENOMEM;
+ retval = w1_create_master_attributes(dev);
+ if (retval)
+ goto err_out_free_dev;
+
+ memcpy(dev->bus_master, master, sizeof(struct w1_bus_master));
+
+ dev->initialized = 1;
+
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",
retval);
- goto err_out_free_dev;
+ goto err_out_rm_attr;
}
- retval = w1_create_master_attributes(dev);
- if (retval)
- goto err_out_kill_thread;
-
- memcpy(dev->bus_master, master, sizeof(struct w1_bus_master));
-
- dev->initialized = 1;
-
mutex_lock(&w1_mlock);
list_add(&dev->w1_master_entry, &w1_masters);
mutex_unlock(&w1_mlock);
@@ -137,8 +140,13 @@ int w1_add_master_device(struct w1_bus_master *master)
return 0;
+#if 0 /* Thread cleanup code, not required currently. */
err_out_kill_thread:
+ set_bit(W1_MASTER_NEED_EXIT, &dev->flags);
kthread_stop(dev->thread);
+#endif
+err_out_rm_attr:
+ w1_destroy_master_attributes(dev);
err_out_free_dev:
w1_free_dev(dev);
--
1.4.4.4
[-- Attachment #2: Type: application/pgp-signature, Size: 189 bytes --]
next prev parent reply other threads:[~2008-03-28 12:55 UTC|newest]
Thread overview: 48+ messages / expand[flat|nested] mbox.gz Atom feed top
[not found] <200803272343.m2RNhDac017650@SpacedOut.fries.net>
2008-03-28 12:23 ` [PATCH 1/35] W1: fix deadlocks and remove w1_control_thread David Fries
2008-03-28 12:24 ` [PATCH 2/35] W1: abort search early on on exit David Fries
2008-03-28 12:24 ` David Fries [this message]
2008-03-28 12:24 ` [PATCH 4/35] W1: w1_process, allow wakeup in sleep David Fries
2008-03-28 12:24 ` [PATCH 5/35] W1: w1_process, remove W1_MASTER_NEED_EXIT, it is redundant David Fries
2008-03-28 12:24 ` [PATCH 6/35] W1: w1_process, block when there's nothing to do David Fries
2008-03-30 11:28 ` Evgeniy Polyakov
2008-03-28 12:25 ` [PATCH 7/35] W1: feature, enable hardware strong pullup David Fries
2008-03-30 11:31 ` Evgeniy Polyakov
2008-03-28 12:25 ` [PATCH 8/35] W1: feature, w1_therm.c use " David Fries
2008-03-30 11:30 ` Evgeniy Polyakov
2008-03-28 12:25 ` [PATCH 9/35] W1: create documentation for the w1_therm slave device David Fries
2008-03-30 11:32 ` Evgeniy Polyakov
2008-03-28 12:25 ` [PATCH 10/35] W1: be able to manually add and remove slaves David Fries
2008-03-30 11:33 ` Evgeniy Polyakov
2008-03-28 12:25 ` [PATCH 11/35] W1: recode w1_slave_found logic David Fries
2008-03-28 12:25 ` [PATCH 12/35] W1: new module parameter search_count David Fries
2008-03-28 12:25 ` [PATCH 13/35] W1: Document add, remove, and search_count David Fries
2008-03-30 11:33 ` Evgeniy Polyakov
2008-03-28 12:25 ` [PATCH 14/35] W1: w1_slave_read_id multiple short read bug David Fries
2008-03-28 12:26 ` [PATCH 15/35] W1: w1_slave_read_id from bin_attribute to device_attribute David Fries
2008-03-28 12:26 ` [PATCH 16/35] W1: w1_therm fix user buffer overflow and cat David Fries
2008-03-30 11:34 ` Evgeniy Polyakov
2008-03-28 12:26 ` [PATCH 17/35] W1: w1_family, remove unused variable need_exit David Fries
2008-03-28 12:26 ` [PATCH 18/35] W1: w1_therm consistent mutex access code cleanup David Fries
2008-03-28 12:26 ` [PATCH 19/35] W1: w1_int.c use first available master number David Fries
2008-03-28 12:26 ` [PATCH 20/35] W1: w1.c s/printk/dev_dbg/ David Fries
2008-03-30 11:35 ` Evgeniy Polyakov
2008-03-28 12:26 ` [PATCH 21/35] W1: w1_io.c reset comments and msleep David Fries
2008-03-30 11:36 ` Evgeniy Polyakov
2008-03-28 12:27 ` [PATCH 22/35] W1: ds1wm.c msleep for reset David Fries
2008-03-30 11:38 ` Evgeniy Polyakov
2008-03-30 13:43 ` David Fries
2008-03-28 12:27 ` [PATCH 23/35] W1: ds2490.c correct print message David Fries
2008-03-28 12:27 ` [PATCH 24/35] W1: ds2490.c add support for strong pullup David Fries
2008-03-28 12:27 ` [PATCH 25/35] W1: ds2490.c fix grouping error in ds_write_bit David Fries
2008-03-28 12:27 ` [PATCH 26/35] W1: ds2490.c ds_write_bit disable readback David Fries
2008-03-28 12:27 ` [PATCH 27/35] W1: ds2490.c disable bit read and write David Fries
2008-03-28 12:27 ` [PATCH 28/35] W1: ds2490.c simplify and fix ds_touch_bit David Fries
2008-03-28 12:27 ` [PATCH 29/35] W1: ds2490.c ds_dump_status rework David Fries
2008-03-28 12:27 ` [PATCH 30/35] W1: ds2490.c ds_reset remove ds_wait_status David Fries
2008-03-28 12:27 ` [PATCH 31/35] W1: ds2490.c reset ds2490 in init David Fries
2008-03-28 12:27 ` [PATCH 32/35] W1: ds2490.c magic number work David Fries
2008-03-28 12:27 ` [PATCH 33/35] W1: ds2490.c ds_write_block remove extra ds_wait_status David Fries
2008-03-28 12:27 ` [PATCH 34/35] W1: Documentation/w1/masters/ds2490 update David Fries
2008-03-30 11:43 ` Evgeniy Polyakov
2008-04-13 23:09 ` David Fries
2008-03-28 12:28 ` [PATCH 35/35] W1: ds2490.c optimize ds_set_pullup David Fries
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20080328122410.GD3613@spacedout.fries.net \
--to=david@fries.net \
--cc=johnpol@2ka.mipt.ru \
--cc=linux-kernel@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.