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:
Peter De Schrijver
2013-02-12 17:51:26 +02:00
committed by Huang, Tao
parent a0529ec18b
commit 92c4d8b6f0
5 changed files with 17 additions and 15 deletions

View File

@@ -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)

View File

@@ -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);
}
}

View File

@@ -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);
}
}

View File

@@ -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 = {

View File

@@ -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);