diff options
Diffstat (limited to 'kernel/sched.c')
-rw-r--r-- | kernel/sched.c | 17 |
1 files changed, 14 insertions, 3 deletions
diff --git a/kernel/sched.c b/kernel/sched.c index b309027bf9e8..56b285cd5350 100644 --- a/kernel/sched.c +++ b/kernel/sched.c | |||
@@ -7906,14 +7906,25 @@ int arch_reinit_sched_domains(void) | |||
7906 | static ssize_t sched_power_savings_store(const char *buf, size_t count, int smt) | 7906 | static ssize_t sched_power_savings_store(const char *buf, size_t count, int smt) |
7907 | { | 7907 | { |
7908 | int ret; | 7908 | int ret; |
7909 | unsigned int level = 0; | ||
7909 | 7910 | ||
7910 | if (buf[0] != '0' && buf[0] != '1') | 7911 | if (sscanf(buf, "%u", &level) != 1) |
7912 | return -EINVAL; | ||
7913 | |||
7914 | /* | ||
7915 | * level is always be positive so don't check for | ||
7916 | * level < POWERSAVINGS_BALANCE_NONE which is 0 | ||
7917 | * What happens on 0 or 1 byte write, | ||
7918 | * need to check for count as well? | ||
7919 | */ | ||
7920 | |||
7921 | if (level >= MAX_POWERSAVINGS_BALANCE_LEVELS) | ||
7911 | return -EINVAL; | 7922 | return -EINVAL; |
7912 | 7923 | ||
7913 | if (smt) | 7924 | if (smt) |
7914 | sched_smt_power_savings = (buf[0] == '1'); | 7925 | sched_smt_power_savings = level; |
7915 | else | 7926 | else |
7916 | sched_mc_power_savings = (buf[0] == '1'); | 7927 | sched_mc_power_savings = level; |
7917 | 7928 | ||
7918 | ret = arch_reinit_sched_domains(); | 7929 | ret = arch_reinit_sched_domains(); |
7919 | 7930 | ||