From 92c4d8b6f07963bd276dd7b1ecea4e9729491056 Mon Sep 17 00:00:00 2001 From: Peter De Schrijver Date: Tue, 12 Feb 2013 17:51:26 +0200 Subject: [PATCH] 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 Reviewed-on: http://git-master/r/200013 Reviewed-by: Simone Willett Tested-by: Simone Willett --- drivers/cpuquiet/driver.c | 8 ++++---- drivers/cpuquiet/governors/balanced.c | 4 ++-- drivers/cpuquiet/governors/runnable_threads.c | 4 ++-- drivers/cpuquiet/governors/userspace.c | 8 +++++--- include/linux/cpuquiet.h | 8 ++++---- 5 files changed, 17 insertions(+), 15 deletions(-) diff --git a/drivers/cpuquiet/driver.c b/drivers/cpuquiet/driver.c index fc83fa8cd022..fb9912b86e5e 100644 --- a/drivers/cpuquiet/driver.c +++ b/drivers/cpuquiet/driver.c @@ -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) diff --git a/drivers/cpuquiet/governors/balanced.c b/drivers/cpuquiet/governors/balanced.c index f187206ef1c4..794ef1e7e24c 100644 --- a/drivers/cpuquiet/governors/balanced.c +++ b/drivers/cpuquiet/governors/balanced.c @@ -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); } } diff --git a/drivers/cpuquiet/governors/runnable_threads.c b/drivers/cpuquiet/governors/runnable_threads.c index c91d4566a47d..79ba69d8057a 100644 --- a/drivers/cpuquiet/governors/runnable_threads.c +++ b/drivers/cpuquiet/governors/runnable_threads.c @@ -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); } } diff --git a/drivers/cpuquiet/governors/userspace.c b/drivers/cpuquiet/governors/userspace.c index 664594d68d8c..12a3d86228ed 100644 --- a/drivers/cpuquiet/governors/userspace.c +++ b/drivers/cpuquiet/governors/userspace.c @@ -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 = { diff --git a/include/linux/cpuquiet.h b/include/linux/cpuquiet.h index 5558c015bb50..1bcfecce3a28 100644 --- a/include/linux/cpuquiet.h +++ b/include/linux/cpuquiet.h @@ -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); -- 2.34.1