ACPI: platform_profile: Use `scoped_cond_guard`
authorMario Limonciello <mario.limonciello@amd.com>
Fri, 6 Dec 2024 03:19:05 +0000 (21:19 -0600)
committerIlpo Järvinen <ilpo.jarvinen@linux.intel.com>
Tue, 10 Dec 2024 17:17:59 +0000 (19:17 +0200)
Migrate away from using an interruptible mutex to scoped_cond_guard
in all functions. While changing, move the sysfs notification
used in platform_profile_store() outside of mutex scope.

Reviewed-by: Armin Wolf <W_Armin@gmx.de>
Tested-by: Mark Pearson <mpearson-lenovo@squebb.ca>
Reviewed-by: Mark Pearson <mpearson-lenovo@squebb.ca>
Reviewed-by: Ilpo Järvinen <ilpo.jarvinen@linux.intel.com>
Signed-off-by: Mario Limonciello <mario.limonciello@amd.com>
Link: https://lore.kernel.org/r/20241206031918.1537-10-mario.limonciello@amd.com
Signed-off-by: Ilpo Järvinen <ilpo.jarvinen@linux.intel.com>
drivers/acpi/platform_profile.c

index 9729543df6333e48d09301f7d2bef55ac82c3fd0..a1f0378f15e625d28e0022be5c1ac8878afe6820 100644 (file)
@@ -27,25 +27,16 @@ static ssize_t platform_profile_choices_show(struct device *dev,
                                        char *buf)
 {
        int len = 0;
-       int err, i;
-
-       err = mutex_lock_interruptible(&profile_lock);
-       if (err)
-               return err;
+       int i;
 
-       if (!cur_profile) {
-               mutex_unlock(&profile_lock);
-               return -ENODEV;
-       }
-
-       for_each_set_bit(i, cur_profile->choices, PLATFORM_PROFILE_LAST) {
-               if (len == 0)
-                       len += sysfs_emit_at(buf, len, "%s", profile_names[i]);
-               else
-                       len += sysfs_emit_at(buf, len, " %s", profile_names[i]);
+       scoped_cond_guard(mutex_intr, return -ERESTARTSYS, &profile_lock) {
+               if (!cur_profile)
+                       return -ENODEV;
+               for_each_set_bit(i, cur_profile->choices, PLATFORM_PROFILE_LAST)
+                       len += sysfs_emit_at(buf, len, len ? " %s": "%s", profile_names[i]);
        }
        len += sysfs_emit_at(buf, len, "\n");
-       mutex_unlock(&profile_lock);
+
        return len;
 }
 
@@ -56,20 +47,15 @@ static ssize_t platform_profile_show(struct device *dev,
        enum platform_profile_option profile = PLATFORM_PROFILE_BALANCED;
        int err;
 
-       err = mutex_lock_interruptible(&profile_lock);
-       if (err)
-               return err;
+       scoped_cond_guard(mutex_intr, return -ERESTARTSYS, &profile_lock) {
+               if (!cur_profile)
+                       return -ENODEV;
 
-       if (!cur_profile) {
-               mutex_unlock(&profile_lock);
-               return -ENODEV;
+               err = cur_profile->profile_get(cur_profile, &profile);
+               if (err)
+                       return err;
        }
 
-       err = cur_profile->profile_get(cur_profile, &profile);
-       mutex_unlock(&profile_lock);
-       if (err)
-               return err;
-
        /* Check that profile is valid index */
        if (WARN_ON((profile < 0) || (profile >= ARRAY_SIZE(profile_names))))
                return -EIO;
@@ -88,28 +74,21 @@ static ssize_t platform_profile_store(struct device *dev,
        if (i < 0)
                return -EINVAL;
 
-       err = mutex_lock_interruptible(&profile_lock);
-       if (err)
-               return err;
+       scoped_cond_guard(mutex_intr, return -ERESTARTSYS, &profile_lock) {
+               if (!cur_profile)
+                       return -ENODEV;
 
-       if (!cur_profile) {
-               mutex_unlock(&profile_lock);
-               return -ENODEV;
-       }
+               /* Check that platform supports this profile choice */
+               if (!test_bit(i, cur_profile->choices))
+                       return -EOPNOTSUPP;
 
-       /* Check that platform supports this profile choice */
-       if (!test_bit(i, cur_profile->choices)) {
-               mutex_unlock(&profile_lock);
-               return -EOPNOTSUPP;
+               err = cur_profile->profile_set(cur_profile, i);
+               if (err)
+                       return err;
        }
 
-       err = cur_profile->profile_set(cur_profile, i);
-       if (!err)
-               sysfs_notify(acpi_kobj, NULL, "platform_profile");
+       sysfs_notify(acpi_kobj, NULL, "platform_profile");
 
-       mutex_unlock(&profile_lock);
-       if (err)
-               return err;
        return count;
 }
 
@@ -140,36 +119,28 @@ int platform_profile_cycle(void)
        enum platform_profile_option next;
        int err;
 
-       err = mutex_lock_interruptible(&profile_lock);
-       if (err)
-               return err;
+       scoped_cond_guard(mutex_intr, return -ERESTARTSYS, &profile_lock) {
+               if (!cur_profile)
+                       return -ENODEV;
 
-       if (!cur_profile) {
-               mutex_unlock(&profile_lock);
-               return -ENODEV;
-       }
+               err = cur_profile->profile_get(cur_profile, &profile);
+               if (err)
+                       return err;
 
-       err = cur_profile->profile_get(cur_profile, &profile);
-       if (err) {
-               mutex_unlock(&profile_lock);
-               return err;
-       }
+               next = find_next_bit_wrap(cur_profile->choices, PLATFORM_PROFILE_LAST,
+                                         profile + 1);
 
-       next = find_next_bit_wrap(cur_profile->choices, PLATFORM_PROFILE_LAST,
-                                 profile + 1);
+               if (WARN_ON(next == PLATFORM_PROFILE_LAST))
+                       return -EINVAL;
 
-       if (WARN_ON(next == PLATFORM_PROFILE_LAST)) {
-               mutex_unlock(&profile_lock);
-               return -EINVAL;
+               err = cur_profile->profile_set(cur_profile, next);
+               if (err)
+                       return err;
        }
 
-       err = cur_profile->profile_set(cur_profile, next);
-       mutex_unlock(&profile_lock);
-
-       if (!err)
-               sysfs_notify(acpi_kobj, NULL, "platform_profile");
+       sysfs_notify(acpi_kobj, NULL, "platform_profile");
 
-       return err;
+       return 0;
 }
 EXPORT_SYMBOL_GPL(platform_profile_cycle);