From: Len Brown Date: Wed, 20 Jan 2010 06:14:30 +0000 (-0500) Subject: Merge branch 'acpi-pad' into release X-Git-Tag: v2.6.33-rc5~9^2~9 X-Git-Url: http://git.samba.org/samba.git/?p=sfrench%2Fcifs-2.6.git;a=commitdiff_plain;h=9c6a6b3cbcbbe39a018aba7f1b2b76e67cba0e9f;hp=-c Merge branch 'acpi-pad' into release --- 9c6a6b3cbcbbe39a018aba7f1b2b76e67cba0e9f diff --combined drivers/acpi/acpi_pad.c index 97991ac6f5fc,a7bd49f0f01f..7e52295f1ecc --- a/drivers/acpi/acpi_pad.c +++ b/drivers/acpi/acpi_pad.c @@@ -100,8 -100,7 +100,8 @@@ static void round_robin_cpu(unsigned in struct cpumask *pad_busy_cpus = to_cpumask(pad_busy_cpus_bits); cpumask_var_t tmp; int cpu; - unsigned long min_weight = -1, preferred_cpu; + unsigned long min_weight = -1; + unsigned long uninitialized_var(preferred_cpu); if (!alloc_cpumask_var(&tmp, GFP_KERNEL)) return; @@@ -208,7 -207,7 +208,7 @@@ static int power_saving_thread(void *da * the mechanism only works when all CPUs have RT task running, * as if one CPU hasn't RT task, RT task from other CPUs will * borrow CPU time from this CPU and cause RT task use > 95% - * CPU time. To make 'avoid staration' work, takes a nap here. + * CPU time. To make 'avoid starvation' work, takes a nap here. */ if (do_sleep) schedule_timeout_killable(HZ * idle_pct / 100); @@@ -222,14 -221,18 +222,18 @@@ static struct task_struct *ps_tsks[NR_C static unsigned int ps_tsk_num; static int create_power_saving_task(void) { + int rc = -ENOMEM; + ps_tsks[ps_tsk_num] = kthread_run(power_saving_thread, (void *)(unsigned long)ps_tsk_num, "power_saving/%d", ps_tsk_num); - if (ps_tsks[ps_tsk_num]) { + rc = IS_ERR(ps_tsks[ps_tsk_num]) ? PTR_ERR(ps_tsks[ps_tsk_num]) : 0; + if (!rc) ps_tsk_num++; - return 0; - } - return -EINVAL; + else + ps_tsks[ps_tsk_num] = NULL; + + return rc; } static void destroy_power_saving_task(void) @@@ -237,6 -240,7 +241,7 @@@ if (ps_tsk_num > 0) { ps_tsk_num--; kthread_stop(ps_tsks[ps_tsk_num]); + ps_tsks[ps_tsk_num] = NULL; } } @@@ -253,7 -257,7 +258,7 @@@ static void set_power_saving_task_num(u } } - static int acpi_pad_idle_cpus(unsigned int num_cpus) + static void acpi_pad_idle_cpus(unsigned int num_cpus) { get_online_cpus(); @@@ -261,7 -265,6 +266,6 @@@ set_power_saving_task_num(num_cpus); put_online_cpus(); - return 0; } static uint32_t acpi_pad_idle_cpus_num(void) @@@ -369,19 -372,21 +373,21 @@@ static void acpi_pad_remove_sysfs(struc static int acpi_pad_pur(acpi_handle handle, int *num_cpus) { struct acpi_buffer buffer = {ACPI_ALLOCATE_BUFFER, NULL}; - acpi_status status; union acpi_object *package; int rev, num, ret = -EINVAL; - status = acpi_evaluate_object(handle, "_PUR", NULL, &buffer); - if (ACPI_FAILURE(status)) + if (ACPI_FAILURE(acpi_evaluate_object(handle, "_PUR", NULL, &buffer))) return -EINVAL; + + if (!buffer.length || !buffer.pointer) + return -EINVAL; + package = buffer.pointer; if (package->type != ACPI_TYPE_PACKAGE || package->package.count != 2) goto out; rev = package->package.elements[0].integer.value; num = package->package.elements[1].integer.value; - if (rev != 1) + if (rev != 1 || num < 0) goto out; *num_cpus = num; ret = 0; @@@ -410,7 -415,7 +416,7 @@@ static void acpi_pad_ost(acpi_handle ha static void acpi_pad_handle_notify(acpi_handle handle) { - int num_cpus, ret; + int num_cpus; uint32_t idle_cpus; mutex_lock(&isolated_cpus_lock); @@@ -418,12 -423,9 +424,9 @@@ mutex_unlock(&isolated_cpus_lock); return; } - ret = acpi_pad_idle_cpus(num_cpus); + acpi_pad_idle_cpus(num_cpus); idle_cpus = acpi_pad_idle_cpus_num(); - if (!ret) - acpi_pad_ost(handle, 0, idle_cpus); - else - acpi_pad_ost(handle, 1, 0); + acpi_pad_ost(handle, 0, idle_cpus); mutex_unlock(&isolated_cpus_lock); }