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 <rohgup@codeaurora.org>
This commit is contained in:
Rohit Gupta 2014-06-12 17:32:08 -07:00 committed by David Keitel
parent 449517019b
commit 03b71555db

View file

@ -62,6 +62,11 @@ module_param(migration_load_threshold, uint, 0644);
static bool load_based_syncs; static bool load_based_syncs;
module_param(load_based_syncs, bool, 0644); 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 struct delayed_work input_boost_rem;
static u64 last_input_time; static u64 last_input_time;
#define MIN_INPUT_INTERVAL (150 * USEC_PER_MSEC) #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) static void do_input_boost_rem(struct work_struct *work)
{ {
unsigned int i; unsigned int i, ret;
struct cpu_sync *i_sync_info; struct cpu_sync *i_sync_info;
/* Reset the input_boost_min for all CPUs in the system */ /* 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 policies for all online CPUs */
update_policy_online(); 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) 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) static void do_input_boost(struct work_struct *work)
{ {
unsigned int i; unsigned int i, ret;
struct cpu_sync *i_sync_info; struct cpu_sync *i_sync_info;
cancel_delayed_work_sync(&input_boost_rem); 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 */ /* Set the input_boost_min for all CPUs in the system */
pr_debug("Setting input boost min for all CPUs\n"); 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 policies for all online CPUs */
update_policy_online(); 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, queue_delayed_work(cpu_boost_wq, &input_boost_rem,
msecs_to_jiffies(input_boost_ms)); msecs_to_jiffies(input_boost_ms));
} }