pwm: Reduce time the pwm_lock mutex is held in pwmchip_add()
authorUwe Kleine-König <u.kleine-koenig@pengutronix.de>
Fri, 2 Dec 2022 18:35:10 +0000 (19:35 +0100)
committerThierry Reding <thierry.reding@gmail.com>
Tue, 6 Dec 2022 11:46:06 +0000 (12:46 +0100)
This simplifies error handling as the need for goto error handling goes
away and at the end of the function the code can be simplified as this
code isn't used in the error case any more.

Now memory allocation and the call to of_pwmchip_add() are done without
holding the lock. Both don't access the data structures protected by
&pwm_lock.

Reviewed-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
Link: https://lore.kernel.org/r/20221117211143.3817381-3-u.kleine-koenig@pengutronix.de
Signed-off-by: Uwe Kleine-König <u.kleine-koenig@pengutronix.de>
Signed-off-by: Thierry Reding <thierry.reding@gmail.com>
drivers/pwm/core.c

index ebe06efe9de52a39dfa16ecea49b7de10387f934..2338119a09d89c79af6cb0b40f4fa6b7a963b9d4 100644 (file)
@@ -272,20 +272,21 @@ int pwmchip_add(struct pwm_chip *chip)
        if (!pwm_ops_check(chip))
                return -EINVAL;
 
+       chip->pwms = kcalloc(chip->npwm, sizeof(*pwm), GFP_KERNEL);
+       if (!chip->pwms)
+               return -ENOMEM;
+
        mutex_lock(&pwm_lock);
 
        ret = alloc_pwms(chip->npwm);
-       if (ret < 0)
-               goto out;
+       if (ret < 0) {
+               mutex_unlock(&pwm_lock);
+               kfree(chip->pwms);
+               return ret;
+       }
 
        chip->base = ret;
 
-       chip->pwms = kcalloc(chip->npwm, sizeof(*pwm), GFP_KERNEL);
-       if (!chip->pwms) {
-               ret = -ENOMEM;
-               goto out;
-       }
-
        for (i = 0; i < chip->npwm; i++) {
                pwm = &chip->pwms[i];
 
@@ -301,18 +302,14 @@ int pwmchip_add(struct pwm_chip *chip)
        INIT_LIST_HEAD(&chip->list);
        list_add(&chip->list, &pwm_chips);
 
-       ret = 0;
+       mutex_unlock(&pwm_lock);
 
        if (IS_ENABLED(CONFIG_OF))
                of_pwmchip_add(chip);
 
-out:
-       mutex_unlock(&pwm_lock);
-
-       if (!ret)
-               pwmchip_sysfs_export(chip);
+       pwmchip_sysfs_export(chip);
 
-       return ret;
+       return 0;
 }
 EXPORT_SYMBOL_GPL(pwmchip_add);