diff options
author | Peter De Schrijver <pdeschrijver@nvidia.com> | 2013-02-12 17:51:26 +0200 |
---|---|---|
committer | Dan Willemsen <dwillemsen@nvidia.com> | 2013-09-14 12:57:36 -0700 |
commit | 80d549976e2bd357d257a901f5f66c187e1638ff (patch) | |
tree | 92acf74bb575b20459970f69abd1ef7cb52e5962 /drivers | |
parent | d441f9f24415dcc9f0134297e01014d260d22025 (diff) |
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>
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/cpuquiet/driver.c | 8 | ||||
-rw-r--r-- | drivers/cpuquiet/governors/balanced.c | 4 | ||||
-rw-r--r-- | drivers/cpuquiet/governors/runnable_threads.c | 4 | ||||
-rw-r--r-- | drivers/cpuquiet/governors/userspace.c | 8 |
4 files changed, 13 insertions, 11 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 = { |