From 03b71555db71b4be8a6b7f192287ab4ce2e4794a Mon Sep 17 00:00:00 2001 From: Rohit Gupta Date: Thu, 12 Jun 2014 17:32:08 -0700 Subject: [PATCH] cpufreq: cpu-boost: Force most/all tasks to big cluster on input event Scheduler provides an API to force tasks to the big cluster. To improve performance, use this API to move most/all tasks to the big cluster for short duration on an input event. On the removal of frequency boost (after input_boost_ms), this scheduler boost is also deactivated. Change-Id: I9d643914ebc75266478cc22260a45862faad6236 Signed-off-by: Rohit Gupta --- drivers/cpufreq/cpu-boost.c | 29 +++++++++++++++++++++++++++-- 1 file changed, 27 insertions(+), 2 deletions(-) diff --git a/drivers/cpufreq/cpu-boost.c b/drivers/cpufreq/cpu-boost.c index a963c1f0b774..54e5025eca94 100644 --- a/drivers/cpufreq/cpu-boost.c +++ b/drivers/cpufreq/cpu-boost.c @@ -62,6 +62,11 @@ module_param(migration_load_threshold, uint, 0644); static bool load_based_syncs; module_param(load_based_syncs, bool, 0644); +static bool sched_boost_on_input; +module_param(sched_boost_on_input, bool, 0644); + +static bool sched_boost_active; + static struct delayed_work input_boost_rem; static u64 last_input_time; #define MIN_INPUT_INTERVAL (150 * USEC_PER_MSEC) @@ -209,7 +214,7 @@ static void update_policy_online(void) static void do_input_boost_rem(struct work_struct *work) { - unsigned int i; + unsigned int i, ret; struct cpu_sync *i_sync_info; /* Reset the input_boost_min for all CPUs in the system */ @@ -221,6 +226,13 @@ static void do_input_boost_rem(struct work_struct *work) /* Update policies for all online CPUs */ update_policy_online(); + + if (sched_boost_active) { + ret = sched_set_boost(0); + if (ret) + pr_err("cpu-boost: HMP boost disable failed\n"); + sched_boost_active = false; + } } static int boost_mig_sync_thread(void *data) @@ -326,10 +338,14 @@ static struct notifier_block boost_migration_nb = { static void do_input_boost(struct work_struct *work) { - unsigned int i; + unsigned int i, ret; struct cpu_sync *i_sync_info; cancel_delayed_work_sync(&input_boost_rem); + if (sched_boost_active) { + sched_set_boost(0); + sched_boost_active = false; + } /* Set the input_boost_min for all CPUs in the system */ pr_debug("Setting input boost min for all CPUs\n"); @@ -341,6 +357,15 @@ static void do_input_boost(struct work_struct *work) /* Update policies for all online CPUs */ update_policy_online(); + /* Enable scheduler boost to migrate tasks to big cluster */ + if (sched_boost_on_input) { + ret = sched_set_boost(1); + if (ret) + pr_err("cpu-boost: HMP boost enable failed\n"); + else + sched_boost_active = true; + } + queue_delayed_work(cpu_boost_wq, &input_boost_rem, msecs_to_jiffies(input_boost_ms)); }