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>
};
#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)
}
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)
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);
}
}
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);
}
}
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 = {
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);