regulator: core: Reduce rdev locking region when releasing regulator
authorMark Brown <broonie@kernel.org>
Fri, 7 Aug 2015 20:19:26 +0000 (21:19 +0100)
committerMark Brown <broonie@kernel.org>
Wed, 12 Aug 2015 10:01:29 +0000 (11:01 +0100)
When we release a regulator we need to remove references to it from the
rdev which means locking the rdev.  Currently we also free resources
associated with the regulator inside the rdev lock but there is no need
to do this, we can reduce the region the lock is held by restricting it
to just actions that affect the rdev.

Signed-off-by: Mark Brown <broonie@kernel.org>
drivers/regulator/core.c

index 62e4f3bd57830b8b5b79b62c78ae8e600d3bcd83..89be8e28727522740c0fd8c2fced9a154a0b8f73 100644 (file)
@@ -1601,14 +1601,15 @@ static void _regulator_put(struct regulator *regulator)
        if (regulator->dev)
                sysfs_remove_link(&rdev->dev.kobj, regulator->supply_name);
        mutex_lock(&rdev->mutex);
-       kfree(regulator->supply_name);
        list_del(&regulator->list);
-       kfree(regulator);
 
        rdev->open_count--;
        rdev->exclusive = 0;
        mutex_unlock(&rdev->mutex);
 
+       kfree(regulator->supply_name);
+       kfree(regulator);
+
        module_put(rdev->owner);
 }