]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
cpuidle: sysfs: Accept governor name with 15 characters
authorHanjun Guo <guohanjun@huawei.com>
Tue, 19 May 2020 06:25:21 +0000 (14:25 +0800)
committerRafael J. Wysocki <rafael.j.wysocki@intel.com>
Tue, 19 May 2020 15:41:17 +0000 (17:41 +0200)
CPUIDLE_NAME_LEN is 16, so it's possible to accept governor name
with 15 characters, but now store_current_governor() rejects
governor name with 15 characters as it returns -EINVAL if count
equals CPUIDLE_NAME_LEN.

Refactor the code to accept such case and simplify the code.

Signed-off-by: Hanjun Guo <guohanjun@huawei.com>
Reviewed-by: Doug Smythies <dsmythies@telus.net>
Tested-by: Doug Smythies <dsmythies@telus.net>
Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
drivers/cpuidle/sysfs.c

index 477b05afaf8116204e18767c06b3301815611700..a57ad10bacccea0ba56fef7a5ce6cc548ca3c754 100644 (file)
@@ -85,34 +85,25 @@ static ssize_t store_current_governor(struct device *dev,
                                      struct device_attribute *attr,
                                      const char *buf, size_t count)
 {
-       char gov_name[CPUIDLE_NAME_LEN];
-       int ret = -EINVAL;
-       size_t len = count;
+       char gov_name[CPUIDLE_NAME_LEN + 1];
+       int ret;
        struct cpuidle_governor *gov;
 
-       if (!len || len >= sizeof(gov_name))
+       ret = sscanf(buf, "%" __stringify(CPUIDLE_NAME_LEN) "s", gov_name);
+       if (ret != 1)
                return -EINVAL;
 
-       memcpy(gov_name, buf, len);
-       gov_name[len] = '\0';
-       if (gov_name[len - 1] == '\n')
-               gov_name[--len] = '\0';
-
        mutex_lock(&cpuidle_lock);
-
+       ret = -EINVAL;
        list_for_each_entry(gov, &cpuidle_governors, governor_list) {
-               if (strlen(gov->name) == len && !strcmp(gov->name, gov_name)) {
+               if (!strncmp(gov->name, gov_name, CPUIDLE_NAME_LEN)) {
                        ret = cpuidle_switch_governor(gov);
                        break;
                }
        }
-
        mutex_unlock(&cpuidle_lock);
 
-       if (ret)
-               return ret;
-       else
-               return count;
+       return ret ? ret : count;
 }
 
 static DEVICE_ATTR(current_driver, 0444, show_current_driver, NULL);