Merge branch 'acpi-pad' into release
This commit is contained in:
commit
9c6a6b3cbc
|
@ -208,7 +208,7 @@ static int power_saving_thread(void *data)
|
||||||
* the mechanism only works when all CPUs have RT task running,
|
* 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
|
* 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%
|
* 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)
|
if (do_sleep)
|
||||||
schedule_timeout_killable(HZ * idle_pct / 100);
|
schedule_timeout_killable(HZ * idle_pct / 100);
|
||||||
|
@ -222,14 +222,18 @@ static struct task_struct *ps_tsks[NR_CPUS];
|
||||||
static unsigned int ps_tsk_num;
|
static unsigned int ps_tsk_num;
|
||||||
static int create_power_saving_task(void)
|
static int create_power_saving_task(void)
|
||||||
{
|
{
|
||||||
|
int rc = -ENOMEM;
|
||||||
|
|
||||||
ps_tsks[ps_tsk_num] = kthread_run(power_saving_thread,
|
ps_tsks[ps_tsk_num] = kthread_run(power_saving_thread,
|
||||||
(void *)(unsigned long)ps_tsk_num,
|
(void *)(unsigned long)ps_tsk_num,
|
||||||
"power_saving/%d", 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++;
|
ps_tsk_num++;
|
||||||
return 0;
|
else
|
||||||
}
|
ps_tsks[ps_tsk_num] = NULL;
|
||||||
return -EINVAL;
|
|
||||||
|
return rc;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void destroy_power_saving_task(void)
|
static void destroy_power_saving_task(void)
|
||||||
|
@ -237,6 +241,7 @@ static void destroy_power_saving_task(void)
|
||||||
if (ps_tsk_num > 0) {
|
if (ps_tsk_num > 0) {
|
||||||
ps_tsk_num--;
|
ps_tsk_num--;
|
||||||
kthread_stop(ps_tsks[ps_tsk_num]);
|
kthread_stop(ps_tsks[ps_tsk_num]);
|
||||||
|
ps_tsks[ps_tsk_num] = NULL;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -253,7 +258,7 @@ static void set_power_saving_task_num(unsigned int num)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static int acpi_pad_idle_cpus(unsigned int num_cpus)
|
static void acpi_pad_idle_cpus(unsigned int num_cpus)
|
||||||
{
|
{
|
||||||
get_online_cpus();
|
get_online_cpus();
|
||||||
|
|
||||||
|
@ -261,7 +266,6 @@ static int acpi_pad_idle_cpus(unsigned int num_cpus)
|
||||||
set_power_saving_task_num(num_cpus);
|
set_power_saving_task_num(num_cpus);
|
||||||
|
|
||||||
put_online_cpus();
|
put_online_cpus();
|
||||||
return 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static uint32_t acpi_pad_idle_cpus_num(void)
|
static uint32_t acpi_pad_idle_cpus_num(void)
|
||||||
|
@ -369,19 +373,21 @@ static void acpi_pad_remove_sysfs(struct acpi_device *device)
|
||||||
static int acpi_pad_pur(acpi_handle handle, int *num_cpus)
|
static int acpi_pad_pur(acpi_handle handle, int *num_cpus)
|
||||||
{
|
{
|
||||||
struct acpi_buffer buffer = {ACPI_ALLOCATE_BUFFER, NULL};
|
struct acpi_buffer buffer = {ACPI_ALLOCATE_BUFFER, NULL};
|
||||||
acpi_status status;
|
|
||||||
union acpi_object *package;
|
union acpi_object *package;
|
||||||
int rev, num, ret = -EINVAL;
|
int rev, num, ret = -EINVAL;
|
||||||
|
|
||||||
status = acpi_evaluate_object(handle, "_PUR", NULL, &buffer);
|
if (ACPI_FAILURE(acpi_evaluate_object(handle, "_PUR", NULL, &buffer)))
|
||||||
if (ACPI_FAILURE(status))
|
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
|
||||||
|
if (!buffer.length || !buffer.pointer)
|
||||||
|
return -EINVAL;
|
||||||
|
|
||||||
package = buffer.pointer;
|
package = buffer.pointer;
|
||||||
if (package->type != ACPI_TYPE_PACKAGE || package->package.count != 2)
|
if (package->type != ACPI_TYPE_PACKAGE || package->package.count != 2)
|
||||||
goto out;
|
goto out;
|
||||||
rev = package->package.elements[0].integer.value;
|
rev = package->package.elements[0].integer.value;
|
||||||
num = package->package.elements[1].integer.value;
|
num = package->package.elements[1].integer.value;
|
||||||
if (rev != 1)
|
if (rev != 1 || num < 0)
|
||||||
goto out;
|
goto out;
|
||||||
*num_cpus = num;
|
*num_cpus = num;
|
||||||
ret = 0;
|
ret = 0;
|
||||||
|
@ -410,7 +416,7 @@ static void acpi_pad_ost(acpi_handle handle, int stat,
|
||||||
|
|
||||||
static void acpi_pad_handle_notify(acpi_handle handle)
|
static void acpi_pad_handle_notify(acpi_handle handle)
|
||||||
{
|
{
|
||||||
int num_cpus, ret;
|
int num_cpus;
|
||||||
uint32_t idle_cpus;
|
uint32_t idle_cpus;
|
||||||
|
|
||||||
mutex_lock(&isolated_cpus_lock);
|
mutex_lock(&isolated_cpus_lock);
|
||||||
|
@ -418,12 +424,9 @@ static void acpi_pad_handle_notify(acpi_handle handle)
|
||||||
mutex_unlock(&isolated_cpus_lock);
|
mutex_unlock(&isolated_cpus_lock);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
ret = acpi_pad_idle_cpus(num_cpus);
|
acpi_pad_idle_cpus(num_cpus);
|
||||||
idle_cpus = acpi_pad_idle_cpus_num();
|
idle_cpus = acpi_pad_idle_cpus_num();
|
||||||
if (!ret)
|
|
||||||
acpi_pad_ost(handle, 0, idle_cpus);
|
acpi_pad_ost(handle, 0, idle_cpus);
|
||||||
else
|
|
||||||
acpi_pad_ost(handle, 1, 0);
|
|
||||||
mutex_unlock(&isolated_cpus_lock);
|
mutex_unlock(&isolated_cpus_lock);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue