mirror of
https://github.com/hardkernel/linux.git
synced 2026-06-09 20:32:04 +09:00
ARM: tegra: cpuquiet: make userspace governor actions synchronous
Userspace expects changes to happen synchronously. Implement this by waiting with a (configureable) timeout for the action to happen. Bug 1220065 Change-Id: I81301719707e4baf2b3aea62c38fc771ffe1205d Signed-off-by: Peter De Schrijver <pdeschrijver@nvidia.com> Reviewed-on: http://git-master/r/200013 Reviewed-by: Simone Willett <swillett@nvidia.com> Tested-by: Simone Willett <swillett@nvidia.com>
This commit is contained in:
committed by
Huang, Tao
parent
a0529ec18b
commit
92c4d8b6f0
@@ -106,12 +106,12 @@ static struct kobj_type ktype_cpu_stats = {
|
||||
};
|
||||
#endif
|
||||
|
||||
int cpuquiet_quiesence_cpu(unsigned int cpunumber)
|
||||
int cpuquiet_quiesence_cpu(unsigned int cpunumber, bool sync)
|
||||
{
|
||||
int err = -EPERM;
|
||||
|
||||
if (cpuquiet_curr_driver && cpuquiet_curr_driver->quiesence_cpu)
|
||||
err = cpuquiet_curr_driver->quiesence_cpu(cpunumber);
|
||||
err = cpuquiet_curr_driver->quiesence_cpu(cpunumber, sync);
|
||||
|
||||
#ifdef CONFIG_CPUQUIET_STATS
|
||||
if (!err)
|
||||
@@ -122,12 +122,12 @@ int cpuquiet_quiesence_cpu(unsigned int cpunumber)
|
||||
}
|
||||
EXPORT_SYMBOL(cpuquiet_quiesence_cpu);
|
||||
|
||||
int cpuquiet_wake_cpu(unsigned int cpunumber)
|
||||
int cpuquiet_wake_cpu(unsigned int cpunumber, bool sync)
|
||||
{
|
||||
int err = -EPERM;
|
||||
|
||||
if (cpuquiet_curr_driver && cpuquiet_curr_driver->wake_cpu)
|
||||
err = cpuquiet_curr_driver->wake_cpu(cpunumber);
|
||||
err = cpuquiet_curr_driver->wake_cpu(cpunumber, sync);
|
||||
|
||||
#ifdef CONFIG_CPUQUIET_STATS
|
||||
if (!err)
|
||||
|
||||
@@ -341,9 +341,9 @@ static void balanced_work_func(struct work_struct *work)
|
||||
if (cpu < nr_cpu_ids) {
|
||||
last_change_time = now;
|
||||
if (up)
|
||||
cpuquiet_wake_cpu(cpu);
|
||||
cpuquiet_wake_cpu(cpu, false);
|
||||
else
|
||||
cpuquiet_quiesence_cpu(cpu);
|
||||
cpuquiet_quiesence_cpu(cpu, false);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -190,11 +190,11 @@ static void runnables_work_func(struct work_struct *work)
|
||||
if (action > 0) {
|
||||
cpu = cpumask_next_zero(0, cpu_online_mask);
|
||||
if (cpu < nr_cpu_ids)
|
||||
cpuquiet_wake_cpu(cpu);
|
||||
cpuquiet_wake_cpu(cpu, false);
|
||||
} else if (action < 0) {
|
||||
cpu = get_lightest_loaded_cpu_n();
|
||||
if (cpu < nr_cpu_ids)
|
||||
cpuquiet_quiesence_cpu(cpu);
|
||||
cpuquiet_quiesence_cpu(cpu, false);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -25,14 +25,16 @@ static DEFINE_MUTEX(userspace_mutex);
|
||||
|
||||
static int governor_set(unsigned int cpu, bool active)
|
||||
{
|
||||
int err;
|
||||
|
||||
mutex_lock(&userspace_mutex);
|
||||
if (active)
|
||||
cpuquiet_wake_cpu(cpu);
|
||||
err = cpuquiet_wake_cpu(cpu, true);
|
||||
else
|
||||
cpuquiet_quiesence_cpu(cpu);
|
||||
err = cpuquiet_quiesence_cpu(cpu, true);
|
||||
mutex_unlock(&userspace_mutex);
|
||||
|
||||
return 0;
|
||||
return err;
|
||||
}
|
||||
|
||||
struct cpuquiet_governor userspace_governor = {
|
||||
|
||||
@@ -37,14 +37,14 @@ struct cpuquiet_governor {
|
||||
|
||||
struct cpuquiet_driver {
|
||||
char name[CPUQUIET_NAME_LEN];
|
||||
int (*quiesence_cpu) (unsigned int cpunumber);
|
||||
int (*wake_cpu) (unsigned int cpunumber);
|
||||
int (*quiesence_cpu) (unsigned int cpunumber, bool sync);
|
||||
int (*wake_cpu) (unsigned int cpunumber, bool sync);
|
||||
};
|
||||
|
||||
extern int cpuquiet_register_governor(struct cpuquiet_governor *gov);
|
||||
extern void cpuquiet_unregister_governor(struct cpuquiet_governor *gov);
|
||||
extern int cpuquiet_quiesence_cpu(unsigned int cpunumber);
|
||||
extern int cpuquiet_wake_cpu(unsigned int cpunumber);
|
||||
extern int cpuquiet_quiesence_cpu(unsigned int cpunumber, bool sync);
|
||||
extern int cpuquiet_wake_cpu(unsigned int cpunumber, bool sync);
|
||||
extern int cpuquiet_register_driver(struct cpuquiet_driver *drv);
|
||||
extern void cpuquiet_unregister_driver(struct cpuquiet_driver *drv);
|
||||
extern int cpuquiet_add_group(struct attribute_group *attrs);
|
||||
|
||||
Reference in New Issue
Block a user