From: Alan Stern <[email protected]> The klist utility routines currently call _put methods while holding a spinlock. This is of course illegal; a put routine could try to unregister a device and hence need to sleep. No problems have arisen until now because in many cases klist removals were done synchronously, so the _put methods were never actually used. In other cases we may simply have been lucky. This patch (as784) reworks the klist routines so that _put methods are called only _after_ the klist's spinlock has been released. Signed-off-by: Alan Stern <[email protected]> Signed-off-by: Greg Kroah-Hartman <[email protected]> --- lib/klist.c | 26 +++++++++++++++----------- 1 files changed, 15 insertions(+), 11 deletions(-) diff --git a/lib/klist.c b/lib/klist.c index 9c94f0b..120bd17 100644 --- a/lib/klist.c +++ b/lib/klist.c @@ -123,12 +123,10 @@ EXPORT_SYMBOL_GPL(klist_add_tail); static void klist_release(struct kref * kref) { struct klist_node * n = container_of(kref, struct klist_node, n_ref); - void (*put)(struct klist_node *) = n->n_klist->put; + list_del(&n->n_node); complete(&n->n_removed); n->n_klist = NULL; - if (put) - put(n); } static int klist_dec_and_del(struct klist_node * n) @@ -145,10 +143,14 @@ static int klist_dec_and_del(struct klis void klist_del(struct klist_node * n) { struct klist * k = n->n_klist; + void (*put)(struct klist_node *) = k->put; spin_lock(&k->k_lock); - klist_dec_and_del(n); + if (!klist_dec_and_del(n)) + put = NULL; spin_unlock(&k->k_lock); + if (put) + put(n); } EXPORT_SYMBOL_GPL(klist_del); @@ -161,10 +163,7 @@ EXPORT_SYMBOL_GPL(klist_del); void klist_remove(struct klist_node * n) { - struct klist * k = n->n_klist; - spin_lock(&k->k_lock); - klist_dec_and_del(n); - spin_unlock(&k->k_lock); + klist_del(n); wait_for_completion(&n->n_removed); } @@ -260,12 +259,15 @@ static struct klist_node * to_klist_node struct klist_node * klist_next(struct klist_iter * i) { struct list_head * next; + struct klist_node * lnode = i->i_cur; struct klist_node * knode = NULL; + void (*put)(struct klist_node *) = i->i_klist->put; spin_lock(&i->i_klist->k_lock); - if (i->i_cur) { - next = i->i_cur->n_node.next; - klist_dec_and_del(i->i_cur); + if (lnode) { + next = lnode->n_node.next; + if (!klist_dec_and_del(lnode)) + put = NULL; } else next = i->i_head->next; @@ -275,6 +277,8 @@ struct klist_node * klist_next(struct kl } i->i_cur = knode; spin_unlock(&i->i_klist->k_lock); + if (put && lnode) + put(lnode); return knode; } -- 1.4.2.1 - To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to [email protected] More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
- References:
- [GIT PATCH] Driver Core patches for 2.6.18
- From: Greg KH <[email protected]>
- [PATCH 1/47] Documentation/ABI: devfs is not obsolete, but removed!
- From: Greg KH <[email protected]>
- [PATCH 2/47] deprecate PHYSDEV* keys
- From: Greg KH <[email protected]>
- [PATCH 3/47] class_device_create(): make fmt argument 'const char *'
- From: Greg KH <[email protected]>
- [PATCH 4/47] device_create(): make fmt argument 'const char *'
- From: Greg KH <[email protected]>
- [PATCH 5/47] Driver core: add const to class_create
- From: Greg KH <[email protected]>
- [PATCH 6/47] sysfs: Make poll behaviour consistent
- From: Greg KH <[email protected]>
- [PATCH 7/47] Debugfs: kernel-doc fixes for debugfs
- From: Greg KH <[email protected]>
- [PATCH 8/47] SYSFS: allow sysfs_create_link to create symlinks in the root of sysfs
- From: Greg KH <[email protected]>
- [PATCH 9/47] Suspend infrastructure cleanup and extension
- From: Greg KH <[email protected]>
- [PATCH 10/47] Suspend changes for PCI core
- From: Greg KH <[email protected]>
- [PATCH 11/47] make suspend quieter
- From: Greg KH <[email protected]>
- [PATCH 12/47] fix broken/dubious driver suspend() methods
- From: Greg KH <[email protected]>
- [PATCH 13/47] PM: define PM_EVENT_PRETHAW
- From: Greg KH <[email protected]>
- [PATCH 14/47] PM: PCI and IDE handle PM_EVENT_PRETHAW
- From: Greg KH <[email protected]>
- [PATCH 15/47] PM: video drivers and PM_EVENT_PRETHAW
- From: Greg KH <[email protected]>
- [PATCH 16/47] PM: USB HCDs use PM_EVENT_PRETHAW
- From: Greg KH <[email protected]>
- [PATCH 17/47] PM: issue PM_EVENT_PRETHAW
- From: Greg KH <[email protected]>
- [PATCH 18/47] updated Documentation/power/devices.txt
- From: Greg KH <[email protected]>
- [PATCH 19/47] PM: update docs for writing .../power/state
- From: Greg KH <[email protected]>
- [PATCH 20/47] PM: add kconfig option for deprecated .../power/state files
- From: Greg KH <[email protected]>
- [PATCH 22/47] PM: no suspend_prepare() phase
- From: Greg KH <[email protected]>
- [PATCH 23/47] PM: add /sys/power documentation to Documentation/ABI
- From: Greg KH <[email protected]>
- [PATCH 24/47] PM: device_suspend/resume may sleep
- From: Greg KH <[email protected]>
- [PATCH 25/47] PM: platform_bus and late_suspend/early_resume
- From: Greg KH <[email protected]>
- [PATCH 26/47] Driver core: add groups support to struct device
- From: Greg KH <[email protected]>
- [PATCH 27/47] Driver core: allow devices in classes to have no parent
- From: Greg KH <[email protected]>
- [PATCH 28/47] Driver core: add ability for classes to handle devices properly
- From: Greg KH <[email protected]>
- [PATCH 29/47] Driver core: add device_rename function
- From: Greg KH <[email protected]>
- [PATCH 30/47] Driver core: create devices/virtual/ tree
- From: Greg KH <[email protected]>
- [PATCH 31/47] Class: add support for class interfaces for devices
- From: Greg KH <[email protected]>
- [PATCH 32/47] Driver core: add ability for devices to create and remove bin files
- From: Greg KH <[email protected]>
- [PATCH 33/47] kobject: must_check fixes
- From: Greg KH <[email protected]>
- [PATCH 34/47] sysfs_remove_bin_file: no return value, dump_stack on error
- From: Greg KH <[email protected]>
- [PATCH 35/47] Driver core: fix comments in drivers/base/power/resume.c
- From: Greg KH <[email protected]>
- [PATCH 36/47] Driver core: fixed add_bind_files() definition
- From: Greg KH <[email protected]>
- [PATCH 37/47] add __must_check to device management code
- From: Greg KH <[email protected]>
- [PATCH 38/47] add CONFIG_ENABLE_MUST_CHECK
- From: Greg KH <[email protected]>
- [PATCH 39/47] v4l-dev2: handle __must_check
- From: Greg KH <[email protected]>
- [PATCH 40/47] drivers/base: Platform notify needs to occur before drivers attach to the device
- From: Greg KH <[email protected]>
- [PATCH 41/47] drivers/base: check errors
- From: Greg KH <[email protected]>
- [PATCH 43/47] Driver Core: add ability for drivers to do a threaded probe
- From: Greg KH <[email protected]>
- [PATCH 44/47] PCI: enable driver multi-threaded probe
- From: Greg KH <[email protected]>
- [PATCH 45/47] Driver core: Fix potential deadlock in driver core
- From: Greg KH <[email protected]>
- [PATCH 46/47] Driver core: Remove unneeded routines from driver core
- From: Greg KH <[email protected]>
- [GIT PATCH] Driver Core patches for 2.6.18
- Prev by Date: [PATCH 45/47] Driver core: Fix potential deadlock in driver core
- Next by Date: [PATCH 28/47] Driver core: add ability for classes to handle devices properly
- Previous by thread: [PATCH 46/47] Driver core: Remove unneeded routines from driver core
- Next by thread: Re: [PATCH 44/47] PCI: enable driver multi-threaded probe
- Index(es):