diff --git a/include/linux/sched/sysctl.h b/include/linux/sched/sysctl.h index cee67458c4e41f3c4c750a26ba210901bc247a94..0e341af58ed1c94ed9c9eb8923a3343684ac8f0d 100644 --- a/include/linux/sched/sysctl.h +++ b/include/linux/sched/sysctl.h @@ -37,6 +37,7 @@ extern unsigned int sysctl_sched_wakeup_granularity; extern unsigned int sysctl_sched_child_runs_first; extern unsigned int sysctl_sched_wake_to_idle; extern unsigned int sysctl_sched_ravg_window; +extern unsigned int sysctl_sched_wakeup_load_threshold; enum sched_tunable_scaling { SCHED_TUNABLESCALING_NONE, diff --git a/kernel/sched/core.c b/kernel/sched/core.c index 76754b30f4fb62f5f5126db577f803b287cbfc46..bc705072e80e414debcbb1c25ee953e319cc3651 100644 --- a/kernel/sched/core.c +++ b/kernel/sched/core.c @@ -1592,6 +1592,7 @@ static void ttwu_queue(struct task_struct *p, int cpu) raw_spin_unlock(&rq->lock); } +__read_mostly unsigned int sysctl_sched_wakeup_load_threshold = 60; /** * try_to_wake_up - wake up a thread * @p: the thread to be awakened @@ -1658,7 +1659,7 @@ stat: out: raw_spin_unlock_irqrestore(&p->pi_lock, flags); - if (src_cpu != cpu && task_notify_on_migrate(p)) { + if (task_notify_on_migrate(p)) { struct migration_notify_data mnd; mnd.src_cpu = src_cpu; @@ -1668,7 +1669,16 @@ out: (u64)(sysctl_sched_ravg_window)); else mnd.load = 0; - atomic_notifier_call_chain(&migration_notifier_head, + /* + * Call the migration notifier with mnd for foreground task + * migrations as well as for wakeups if their load is above + * sysctl_sched_wakeup_load_threshold. This would prompt the + * cpu-boost to boost the CPU frequency on wake up of a heavy + * weight foreground task + */ + if ((src_cpu != cpu) || (mnd.load > + sysctl_sched_wakeup_load_threshold)) + atomic_notifier_call_chain(&migration_notifier_head, 0, (void *)&mnd); } return success; diff --git a/kernel/sysctl.c b/kernel/sysctl.c index f133e28e193b32a596b7699d4f161152bd2aab32..2e387e6c40678a2cdc9995aaeb761c2cbe8cf6ff 100644 --- a/kernel/sysctl.c +++ b/kernel/sysctl.c @@ -296,6 +296,13 @@ static struct ctl_table kern_table[] = { .mode = 0644, .proc_handler = proc_dointvec, }, + { + .procname = "sched_wakeup_load_threshold", + .data = &sysctl_sched_wakeup_load_threshold, + .maxlen = sizeof(unsigned int), + .mode = 0644, + .proc_handler = proc_dointvec, + }, #ifdef CONFIG_SCHED_DEBUG { .procname = "sched_min_granularity_ns",