ChangeSet 1.2054, 2005/03/09 15:39:09-08:00, [EMAIL PROTECTED]

[PATCH] sysdev: remove the rwsem usage from this subsystem.

If further finer grained locking is needed, we can add a lock to the 
sysdev_class to
lock the class drivers list.  But if you do that, remember the global list also 
is still
there and needs to be protected.  That's why I went with a simple lock for 
everything.

Signed-off-by: Greg Kroah-Hartman <[EMAIL PROTECTED]>


 drivers/base/sys.c |   21 +++++++++++----------
 1 files changed, 11 insertions(+), 10 deletions(-)


diff -Nru a/drivers/base/sys.c b/drivers/base/sys.c
--- a/drivers/base/sys.c        2005-03-09 16:28:10 -08:00
+++ b/drivers/base/sys.c        2005-03-09 16:28:10 -08:00
@@ -103,6 +103,7 @@
 
 
 static LIST_HEAD(sysdev_drivers);
+static DECLARE_MUTEX(sysdev_drivers_lock);
 
 /**
  *     sysdev_driver_register - Register auxillary driver
@@ -119,7 +120,7 @@
 int sysdev_driver_register(struct sysdev_class * cls,
                           struct sysdev_driver * drv)
 {
-       down_write(&system_subsys.rwsem);
+       down(&sysdev_drivers_lock);
        if (cls && kset_get(&cls->kset)) {
                list_add_tail(&drv->entry, &cls->drivers);
 
@@ -131,7 +132,7 @@
                }
        } else
                list_add_tail(&drv->entry, &sysdev_drivers);
-       up_write(&system_subsys.rwsem);
+       up(&sysdev_drivers_lock);
        return 0;
 }
 
@@ -144,7 +145,7 @@
 void sysdev_driver_unregister(struct sysdev_class * cls,
                              struct sysdev_driver * drv)
 {
-       down_write(&system_subsys.rwsem);
+       down(&sysdev_drivers_lock);
        list_del_init(&drv->entry);
        if (cls) {
                if (drv->remove) {
@@ -154,7 +155,7 @@
                }
                kset_put(&cls->kset);
        }
-       up_write(&system_subsys.rwsem);
+       up(&sysdev_drivers_lock);
 }
 
 EXPORT_SYMBOL_GPL(sysdev_driver_register);
@@ -193,7 +194,7 @@
        if (!error) {
                struct sysdev_driver * drv;
 
-               down_write(&system_subsys.rwsem);
+               down(&sysdev_drivers_lock);
                /* Generic notification is implicit, because it's that
                 * code that should have called us.
                 */
@@ -209,7 +210,7 @@
                        if (drv->add)
                                drv->add(sysdev);
                }
-               up_write(&system_subsys.rwsem);
+               up(&sysdev_drivers_lock);
        }
        return error;
 }
@@ -218,7 +219,7 @@
 {
        struct sysdev_driver * drv;
 
-       down_write(&system_subsys.rwsem);
+       down(&sysdev_drivers_lock);
        list_for_each_entry(drv, &sysdev_drivers, entry) {
                if (drv->remove)
                        drv->remove(sysdev);
@@ -228,7 +229,7 @@
                if (drv->remove)
                        drv->remove(sysdev);
        }
-       up_write(&system_subsys.rwsem);
+       up(&sysdev_drivers_lock);
 
        kobject_unregister(&sysdev->kobj);
 }
@@ -255,7 +256,7 @@
 
        pr_debug("Shutting Down System Devices\n");
 
-       down_write(&system_subsys.rwsem);
+       down(&sysdev_drivers_lock);
        list_for_each_entry_reverse(cls, &system_subsys.kset.list,
                                    kset.kobj.entry) {
                struct sys_device * sysdev;
@@ -284,7 +285,7 @@
                                cls->shutdown(sysdev);
                }
        }
-       up_write(&system_subsys.rwsem);
+       up(&sysdev_drivers_lock);
 }
 
 

-
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/

Reply via email to