driver-core: use klist for class device list and implement iterator
Iterating over entries using callback usually isn't too fun especially when the entry being iterated over can't be manipulated freely. This patch converts class->p->class_devices to klist and implements class device iterator so that the users can freely build their own control structure. The users are also free to call back into class code without worrying about locking. class_for_each_device() and class_find_device() are converted to use the new iterators, so their users don't have to worry about locking anymore either. Note: This depends on klist-dont-iterate-over-deleted-entries patch because class_intf->add/remove_dev() depends on proper synchronization with device removal. Signed-off-by: Tejun Heo <tj@kernel.org> Cc: Greg Kroah-Hartman <gregkh@suse.de> Cc: Jens Axboe <jens.axboe@oracle.com> Signed-off-by: Jens Axboe <jens.axboe@oracle.com>
This commit is contained in:
@@ -536,7 +536,6 @@ void device_initialize(struct device *dev)
|
||||
klist_init(&dev->klist_children, klist_children_get,
|
||||
klist_children_put);
|
||||
INIT_LIST_HEAD(&dev->dma_pools);
|
||||
INIT_LIST_HEAD(&dev->node);
|
||||
init_MUTEX(&dev->sem);
|
||||
spin_lock_init(&dev->devres_lock);
|
||||
INIT_LIST_HEAD(&dev->devres_head);
|
||||
@@ -916,7 +915,8 @@ int device_add(struct device *dev)
|
||||
if (dev->class) {
|
||||
mutex_lock(&dev->class->p->class_mutex);
|
||||
/* tie the class to the device */
|
||||
list_add_tail(&dev->node, &dev->class->p->class_devices);
|
||||
klist_add_tail(&dev->knode_class,
|
||||
&dev->class->p->class_devices);
|
||||
|
||||
/* notify any interfaces that the device is here */
|
||||
list_for_each_entry(class_intf,
|
||||
@@ -1032,7 +1032,7 @@ void device_del(struct device *dev)
|
||||
if (class_intf->remove_dev)
|
||||
class_intf->remove_dev(dev, class_intf);
|
||||
/* remove the device from the class list */
|
||||
list_del_init(&dev->node);
|
||||
klist_del(&dev->knode_class);
|
||||
mutex_unlock(&dev->class->p->class_mutex);
|
||||
}
|
||||
device_remove_file(dev, &uevent_attr);
|
||||
|
Reference in New Issue
Block a user