[PATCH] class: add a semaphore to struct class, and use that instead of the subsystem rwsem.

From: Greg KH
Date: Wed Mar 09 2005 - 22:30:36 EST


ChangeSet 1.2055, 2005/03/09 15:41:29-08:00, gregkh@xxxxxxx

[PATCH] class: add a semaphore to struct class, and use that instead of the subsystem rwsem.

This moves us away from using the rwsem, although recursive adds and removes of class devices
is not yet possible (nor is it really known if it even is needed.) So this simple change is
done instead.

Signed-off-by: Greg Kroah-Hartman <gregkh@xxxxxxx>


drivers/base/class.c | 23 +++++++++++------------
include/linux/device.h | 2 +-
2 files changed, 12 insertions(+), 13 deletions(-)


diff -Nru a/drivers/base/class.c b/drivers/base/class.c
--- a/drivers/base/class.c 2005-03-09 16:28:04 -08:00
+++ b/drivers/base/class.c 2005-03-09 16:28:04 -08:00
@@ -140,6 +140,7 @@

INIT_LIST_HEAD(&cls->children);
INIT_LIST_HEAD(&cls->interfaces);
+ init_MUTEX(&cls->sem);
error = kobject_set_name(&cls->subsys.kset.kobj, "%s", cls->name);
if (error)
return error;
@@ -413,12 +414,12 @@

/* now take care of our own registration */
if (parent) {
- down_write(&parent->subsys.rwsem);
+ down(&parent->sem);
list_add_tail(&class_dev->node, &parent->children);
list_for_each_entry(class_intf, &parent->interfaces, node)
if (class_intf->add)
class_intf->add(class_dev);
- up_write(&parent->subsys.rwsem);
+ up(&parent->sem);
}

if (MAJOR(class_dev->devt))
@@ -448,12 +449,12 @@
struct class_interface * class_intf;

if (parent) {
- down_write(&parent->subsys.rwsem);
+ down(&parent->sem);
list_del_init(&class_dev->node);
list_for_each_entry(class_intf, &parent->interfaces, node)
if (class_intf->remove)
class_intf->remove(class_dev);
- up_write(&parent->subsys.rwsem);
+ up(&parent->sem);
}

if (class_dev->dev)
@@ -509,8 +510,8 @@

int class_interface_register(struct class_interface *class_intf)
{
- struct class * parent;
- struct class_device * class_dev;
+ struct class *parent;
+ struct class_device *class_dev;

if (!class_intf || !class_intf->class)
return -ENODEV;
@@ -519,14 +520,13 @@
if (!parent)
return -EINVAL;

- down_write(&parent->subsys.rwsem);
+ down(&parent->sem);
list_add_tail(&class_intf->node, &parent->interfaces);
-
if (class_intf->add) {
list_for_each_entry(class_dev, &parent->children, node)
class_intf->add(class_dev);
}
- up_write(&parent->subsys.rwsem);
+ up(&parent->sem);

return 0;
}
@@ -539,14 +539,13 @@
if (!parent)
return;

- down_write(&parent->subsys.rwsem);
+ down(&parent->sem);
list_del_init(&class_intf->node);
-
if (class_intf->remove) {
list_for_each_entry(class_dev, &parent->children, node)
class_intf->remove(class_dev);
}
- up_write(&parent->subsys.rwsem);
+ up(&parent->sem);

class_put(parent);
}
diff -Nru a/include/linux/device.h b/include/linux/device.h
--- a/include/linux/device.h 2005-03-09 16:28:04 -08:00
+++ b/include/linux/device.h 2005-03-09 16:28:04 -08:00
@@ -15,7 +15,6 @@
#include <linux/ioport.h>
#include <linux/kobject.h>
#include <linux/list.h>
-#include <linux/spinlock.h>
#include <linux/types.h>
#include <linux/module.h>
#include <linux/pm.h>
@@ -148,6 +147,7 @@
struct subsystem subsys;
struct list_head children;
struct list_head interfaces;
+ struct semaphore sem; /* locks both the children and interfaces lists */

struct class_attribute * class_attrs;
struct class_device_attribute * class_dev_attrs;

-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/