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",