Subject: ACPI: fix processor throttling set error
From: Yi Yang <[EMAIL PROTECTED]>

When echo some invalid values to /proc/acpi/processor/*/throttling,
there isn't any error info returned, on the contray, it sets
throttling value to some T* successfully, obviously, this is incorrect,
a correct way should be to let it fail and return error info.

This patch fixed the aforementioned issue, it also enables
/proc/acpi/processor/*/throttling to accept such values as 't0' and 'T0',
it also strictly limits /proc/acpi/processor/*/throttling only to accept
 "*", "t*" and "T*", "*" is the throttling state value the processor can
support, current, it is 0 - 7.

Before applying this patch, the test result is below:

[EMAIL PROTECTED] acpi]# cat /proc/acpi/processor/CPU0/throttling
state count:             8
active state:            T1
state available: T0 to T7
states:
    T0:                  100%
   *T1:                  87%
    T2:                  75%
    T3:                  62%
    T4:                  50%
    T5:                  37%
    T6:                  25%
    T7:                  12%
[EMAIL PROTECTED] acpi]# echo "1xxxxxx" > /proc/acpi/processor/CPU0/throttling
[EMAIL PROTECTED] acpi]# cat /proc/acpi/processor/CPU0/throttling
state count:             8
active state:            T1
state available: T0 to T7
states:
    T0:                  100%
   *T1:                  87%
    T2:                  75%
    T3:                  62%
    T4:                  50%
    T5:                  37%
    T6:                  25%
    T7:                  12%
[EMAIL PROTECTED] acpi]# echo "0" > /proc/acpi/processor/CPU0/throttling
[EMAIL PROTECTED] acpi]# cat /proc/acpi/processor/CPU0/throttling
state count:             8
active state:            T0
state available: T0 to T7
states:
   *T0:                  100%
    T1:                  87%
    T2:                  75%
    T3:                  62%
    T4:                  50%
    T5:                  37%
    T6:                  25%
    T7:                  12%
[EMAIL PROTECTED] acpi]# cd /
[EMAIL PROTECTED] /]# cat /proc/acpi/processor/CPU0/throttling
state count:             8
active state:            T0
state available: T0 to T7
states:
   *T0:                  100%
    T1:                  87%
    T2:                  75%
    T3:                  62%
    T4:                  50%
    T5:                  37%
    T6:                  25%
    T7:                  12%
[EMAIL PROTECTED] /]# echo "T0" > /proc/acpi/processor/CPU0/throttling
[EMAIL PROTECTED] /]# cat /proc/acpi/processor/CPU0/throttling
state count:             8
active state:            T0
state available: T0 to T7
states:
   *T0:                  100%
    T1:                  87%
    T2:                  75%
    T3:                  62%
    T4:                  50%
    T5:                  37%
    T6:                  25%
    T7:                  12%
[EMAIL PROTECTED] /]# echo "T7" > /proc/acpi/processor/CPU0/throttling
[EMAIL PROTECTED] /]# cat /proc/acpi/processor/CPU0/throttling
state count:             8
active state:            T0
state available: T0 to T7
states:
   *T0:                  100%
    T1:                  87%
    T2:                  75%
    T3:                  62%
    T4:                  50%
    T5:                  37%
    T6:                  25%
    T7:                  12%
[EMAIL PROTECTED] /]# echo "T100" > /proc/acpi/processor/CPU0/throttling
[EMAIL PROTECTED] /]# cat /proc/acpi/processor/CPU0/throttling
state count:             8
active state:            T0
state available: T0 to T7
states:
   *T0:                  100%
    T1:                  87%
    T2:                  75%
    T3:                  62%
    T4:                  50%
    T5:                  37%
    T6:                  25%
    T7:                  12%
[EMAIL PROTECTED] /]# echo "xxx" > /proc/acpi/processor/CPU0/throttling
[EMAIL PROTECTED] /]# cat /proc/acpi/processor/CPU0/throttling
state count:             8
active state:            T0
state available: T0 to T7
states:
   *T0:                  100%
    T1:                  87%
    T2:                  75%
    T3:                  62%
    T4:                  50%
    T5:                  37%
    T6:                  25%
    T7:                  12%
[EMAIL PROTECTED] /]# echo "2xxxx" > /proc/acpi/processor/CPU0/throttling
[EMAIL PROTECTED] /]# cat /proc/acpi/processor/CPU0/throttling
state count:             8
active state:            T2
state available: T0 to T7
states:
    T0:                  100%
    T1:                  87%
   *T2:                  75%
    T3:                  62%
    T4:                  50%
    T5:                  37%
    T6:                  25%
    T7:                  12%
[EMAIL PROTECTED] /]# echo "" > /proc/acpi/processor/CPU0/throttling
[EMAIL PROTECTED] /]# cat /proc/acpi/processor/CPU0/throttling
state count:             8
active state:            T0
state available: T0 to T7
states:
   *T0:                  100%
    T1:                  87%
    T2:                  75%
    T3:                  62%
    T4:                  50%
    T5:                  37%
    T6:                  25%
    T7:                  12%
[EMAIL PROTECTED] /]# echo "7777" > /proc/acpi/processor/CPU0/throttling
-bash: echo: write error: Invalid argument
[EMAIL PROTECTED] /]# echo "7xxx" > /proc/acpi/processor/CPU0/throttling
[EMAIL PROTECTED] /]# cat /proc/acpi/processor/CPU0/throttling
state count:             8
active state:            T7
state available: T0 to T7
states:
    T0:                  100%
    T1:                  87%
    T2:                  75%
    T3:                  62%
    T4:                  50%
    T5:                  37%
    T6:                  25%
   *T7:                  12%
[EMAIL PROTECTED] /]#


After applying this patch, the test result is below:

[EMAIL PROTECTED] linux-2.6.24-rc6]# echo > /proc/acpi/processor/CPU0/throttling
-bash: echo: write error: Invalid argument
[EMAIL PROTECTED] linux-2.6.24-rc6]# echo "" > 
/proc/acpi/processor/CPU0/throttling
-bash: echo: write error: Invalid argument
[EMAIL PROTECTED] linux-2.6.24-rc6]# echo "0" > 
/proc/acpi/processor/CPU0/throttling
[EMAIL PROTECTED] linux-2.6.24-rc6]# echo "t0" > 
/proc/acpi/processor/CPU0/throttling
[EMAIL PROTECTED] linux-2.6.24-rc6]# echo "T0" > 
/proc/acpi/processor/CPU0/throttling
[EMAIL PROTECTED] linux-2.6.24-rc6]# cat /proc/acpi/processor/CPU0/throttling
state count:             8
active state:            T0
state available: T0 to T7
states:
   *T0:                  100%
    T1:                  87%
    T2:                  75%
    T3:                  62%
    T4:                  50%
    T5:                  37%
    T6:                  25%
    T7:                  12%
[EMAIL PROTECTED] linux-2.6.24-rc6]# echo "T7" > 
/proc/acpi/processor/CPU0/throttling
[EMAIL PROTECTED] linux-2.6.24-rc6]# cat /proc/acpi/processor/CPU0/throttling
state count:             8
active state:            T7
state available: T0 to T7
states:
    T0:                  100%
    T1:                  87%
    T2:                  75%
    T3:                  62%
    T4:                  50%
    T5:                  37%
    T6:                  25%
   *T7:                  12%
[EMAIL PROTECTED] linux-2.6.24-rc6]# echo "T8" > 
/proc/acpi/processor/CPU0/throttling
-bash: echo: write error: Invalid argument
[EMAIL PROTECTED] linux-2.6.24-rc6]# vi drivers/acpi/processor_throttling.c
[EMAIL PROTECTED] linux-2.6.24-rc6]# echo "T8" > 
/proc/acpi/processor/CPU0/throttling
-bash: echo: write error: Invalid argument
[EMAIL PROTECTED] linux-2.6.24-rc6]# echo "t7" > 
/proc/acpi/processor/CPU0/throttling
[EMAIL PROTECTED] linux-2.6.24-rc6]# echo "t70" > 
/proc/acpi/processor/CPU0/throttling
-bash: echo: write error: Invalid argument
[EMAIL PROTECTED] linux-2.6.24-rc6]# echo "70" > 
/proc/acpi/processor/CPU0/throttling
-bash: echo: write error: Invalid argument
[EMAIL PROTECTED] linux-2.6.24-rc6]# echo "7000" > 
/proc/acpi/processor/CPU0/throttling
-bash: echo: write error: Invalid argument
[EMAIL PROTECTED] linux-2.6.24-rc6]# echo "70" > 
/proc/acpi/processor/CPU0/throttling
-bash: echo: write error: Invalid argument
[EMAIL PROTECTED] linux-2.6.24-rc6]# echo "xxx" > 
/proc/acpi/processor/CPU0/throttling
-bash: echo: write error: Invalid argument
[EMAIL PROTECTED] linux-2.6.24-rc6]# echo > /proc/acpi/processor/CPU0/throttling
-bash: echo: write error: Invalid argument
[EMAIL PROTECTED] linux-2.6.24-rc6]# echo -n > 
/proc/acpi/processor/CPU0/throttling
[EMAIL PROTECTED] linux-2.6.24-rc6]# echo -n "" > 
/proc/acpi/processor/CPU0/throttling
[EMAIL PROTECTED] linux-2.6.24-rc6]# echo $?
0
[EMAIL PROTECTED] linux-2.6.24-rc6]# echo -n "" > 
/proc/acpi/processor/CPU0/throttling
[EMAIL PROTECTED] linux-2.6.24-rc6]# cat /proc/acpi/processor/CPU0/throttling
state count:             8
active state:            T7
state available: T0 to T7
states:
    T0:                  100%
    T1:                  87%
    T2:                  75%
    T3:                  62%
    T4:                  50%
    T5:                  37%
    T6:                  25%
   *T7:                  12%
[EMAIL PROTECTED] linux-2.6.24-rc6]# echo -n "" > 
/proc/acpi/processor/CPU0/throttling
[EMAIL PROTECTED] linux-2.6.24-rc6]# cat /proc/acpi/processor/CPU0/throttling
state count:             8
active state:            T7
state available: T0 to T7
states:
    T0:                  100%
    T1:                  87%
    T2:                  75%
    T3:                  62%
    T4:                  50%
    T5:                  37%
    T6:                  25%
   *T7:                  12%
[EMAIL PROTECTED] linux-2.6.24-rc6]# echo t0 > 
/proc/acpi/processor/CPU0/throttling
[EMAIL PROTECTED] linux-2.6.24-rc6]# echo T0 > 
/proc/acpi/processor/CPU0/throttling
[EMAIL PROTECTED] linux-2.6.24-rc6]# echo Tt0 > 
/proc/acpi/processor/CPU0/throttling
-bash: echo: write error: Invalid argument
[EMAIL PROTECTED] linux-2.6.24-rc6]# echo T > 
/proc/acpi/processor/CPU0/throttling
-bash: echo: write error: Invalid argument
[EMAIL PROTECTED] linux-2.6.24-rc6]#

Signed-off-by: Yi Yang <[EMAIL PROTECTED]>
---
 processor_throttling.c |   24 ++++++++++++++++++++----
 1 file changed, 20 insertions(+), 4 deletions(-)

diff --git a/drivers/acpi/processor_throttling.c 
b/drivers/acpi/processor_throttling.c
index 6742d7b..10035a6 100644
--- a/drivers/acpi/processor_throttling.c
+++ b/drivers/acpi/processor_throttling.c
@@ -898,7 +898,10 @@ static ssize_t acpi_processor_write_throttling(struct file 
*file,
        int result = 0;
        struct seq_file *m = file->private_data;
        struct acpi_processor *pr = m->private;
-       char state_string[12] = { '\0' };
+       char state_string[5] = "";
+       char *charp = NULL;
+       size_t state_val = 0;
+       char tmpbuf[5] = "";
 
        if (!pr || (count > sizeof(state_string) - 1))
                return -EINVAL;
@@ -907,10 +910,23 @@ static ssize_t acpi_processor_write_throttling(struct 
file *file,
                return -EFAULT;
 
        state_string[count] = '\0';
+       if ((count > 0) && (state_string[count-1] == '\n'))
+               state_string[count-1] = '\0';
 
-       result = acpi_processor_set_throttling(pr,
-                                              simple_strtoul(state_string,
-                                                             NULL, 0));
+       charp = state_string;
+       if ((state_string[0] == 't') || (state_string[0] == 'T'))
+               charp++;
+
+       state_val = simple_strtoul(charp, NULL, 0);
+       if (state_val >= pr->throttling.state_count)
+               return -EINVAL;
+
+       snprintf(tmpbuf, 5, "%d", state_val);
+
+       if (strcmp(tmpbuf, charp) != 0)
+               return -EINVAL;
+
+       result = acpi_processor_set_throttling(pr, state_val);
        if (result)
                return result;
 


--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

Reply via email to