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)); }