From 251d166e5a91c3f92f838f8ceeb6364b98745c6a Mon Sep 17 00:00:00 2001 From: Evgeniy Polyakov Date: Wed, 29 Sep 2004 02:14:12 -0700 Subject: [PATCH] [PATCH] w1: schedule_timeout() issues. Need to set current state and check signals. Signed-off-by: Evgeniy Polyakov Signed-off-by: Greg Kroah-Hartman --- drivers/w1/dscore.c | 13 ++++++++++--- drivers/w1/w1.c | 20 +++++++++++++++----- drivers/w1/w1_family.c | 11 +++++++++-- drivers/w1/w1_int.c | 11 +++++++++-- 4 files changed, 43 insertions(+), 12 deletions(-) diff --git a/drivers/w1/dscore.c b/drivers/w1/dscore.c index f0f26a438c977..f86d0d4b600c7 100644 --- a/drivers/w1/dscore.c +++ b/drivers/w1/dscore.c @@ -727,12 +727,19 @@ void ds_disconnect(struct usb_interface *intf) { struct ds_device *dev; - dev = usb_get_intfdata (intf); - usb_set_intfdata (intf, NULL); + dev = usb_get_intfdata(intf); + usb_set_intfdata(intf, NULL); - while(atomic_read(&dev->refcnt)) + while (atomic_read(&dev->refcnt)) { + printk(KERN_INFO "Waiting for DS to become free: refcnt=%d.\n", + atomic_read(&dev->refcnt)); + set_current_state(TASK_INTERRUPTIBLE); schedule_timeout(HZ); + if (signal_pending(current)) + flush_signals(current); + } + usb_put_dev(dev->udev); kfree(dev); ds_dev = NULL; diff --git a/drivers/w1/w1.c b/drivers/w1/w1.c index 849a833ce8614..53045dd84cf4c 100644 --- a/drivers/w1/w1.c +++ b/drivers/w1/w1.c @@ -449,8 +449,15 @@ static void w1_slave_detach(struct w1_slave *sl) dev_info(&sl->dev, "%s: detaching %s.\n", __func__, sl->name); - while (atomic_read(&sl->refcnt)) - schedule_timeout(10); + while (atomic_read(&sl->refcnt)) { + printk(KERN_INFO "Waiting for %s to become free: refcnt=%d.\n", + sl->name, atomic_read(&sl->refcnt)); + set_current_state(TASK_INTERRUPTIBLE); + schedule_timeout(HZ); + + if (signal_pending(current)) + flush_signals(current); + } sysfs_remove_bin_file (&sl->dev.kobj, &sl->attr_bin); device_remove_file(&sl->dev, &sl->attr_name); @@ -507,8 +514,8 @@ static void w1_search(struct w1_master *dev) * All who don't sleep must send ID bit and COMPLEMENT ID bit. * They actually are ANDed between all senders. */ - id_bit = w1_read_bit(dev); - comp_bit = w1_read_bit(dev); + id_bit = w1_touch_bit(dev, 1); + comp_bit = w1_touch_bit(dev, 1); if (id_bit && comp_bit) break; @@ -539,7 +546,10 @@ static void w1_search(struct w1_master *dev) * and make all who don't have "search_bit" in "i"'th position * in it's registration number sleep. */ - w1_write_bit(dev, search_bit); + if (dev->bus_master->touch_bit) + w1_touch_bit(dev, search_bit); + else + w1_write_bit(dev, search_bit); } #endif diff --git a/drivers/w1/w1_family.c b/drivers/w1/w1_family.c index 6a62d2adb9d18..78ee9a50247a8 100644 --- a/drivers/w1/w1_family.c +++ b/drivers/w1/w1_family.c @@ -84,8 +84,15 @@ void w1_unregister_family(struct w1_family *fent) spin_unlock(&w1_flock); - while (atomic_read(&fent->refcnt)) - schedule_timeout(10); + while (atomic_read(&fent->refcnt)) { + printk(KERN_INFO "Waiting for family %u to become free: refcnt=%d.\n", + fent->fid, atomic_read(&fent->refcnt)); + set_current_state(TASK_INTERRUPTIBLE); + schedule_timeout(HZ); + + if (signal_pending(current)) + flush_signals(current); + } } /* diff --git a/drivers/w1/w1_int.c b/drivers/w1/w1_int.c index 2572487ddea1e..5d1915a976beb 100644 --- a/drivers/w1/w1_int.c +++ b/drivers/w1/w1_int.c @@ -181,8 +181,15 @@ void __w1_remove_master_device(struct w1_master *dev) "%s: Failed to send signal to w1 kernel thread %d.\n", __func__, dev->kpid); - while (atomic_read(&dev->refcnt)) - schedule_timeout(10); + while (atomic_read(&dev->refcnt)) { + printk(KERN_INFO "Waiting for %s to become free: refcnt=%d.\n", + dev->name, atomic_read(&dev->refcnt)); + set_current_state(TASK_INTERRUPTIBLE); + schedule_timeout(HZ); + + if (signal_pending(current)) + flush_signals(current); + } msg.id.mst.id = dev->id; msg.id.mst.pid = dev->kpid; -- 2.53.0