diff -Naur a/include/linux/sched/sysctl.h b/include/linux/sched/sysctl.h
--- a/include/linux/sched/sysctl.h 2016-08-20 09:09:38.000000000 -0700
+++ b/include/linux/sched/sysctl.h 2016-09-01 14:52:39.335459615 -0700
@@ -39,6 +39,7 @@
extern unsigned int sysctl_sched_min_granularity;
extern unsigned int sysctl_sched_wakeup_granularity;
extern unsigned int sysctl_sched_child_runs_first;
+extern unsigned int sysctl_sched_weighted_cpuload_uses_rla;
enum sched_tunable_scaling {
SCHED_TUNABLESCALING_NONE,
diff -Naur a/kernel/sched/fair.c b/kernel/sched/fair.c
--- a/kernel/sched/fair.c 2016-08-20 09:09:38.000000000 -0700
+++ b/kernel/sched/fair.c 2016-09-01 14:52:39.339459615 -0700
@@ -35,6 +35,10 @@
#include "sched.h"
+#ifdef CONFIG_SMP
+unsigned int sysctl_sched_weighted_cpuload_uses_rla = 1;
+#endif
+
/*
* Targeted preemption latency for CPU-bound tasks:
* (default: 6ms * (1 + ilog(ncpus)), units: nanoseconds)
@@ -4360,7 +4364,9 @@
/* Used instead of source_load when we know the type == 0 */
static unsigned long weighted_cpuload(const int cpu)
{
- return cfs_rq_runnable_load_avg(&cpu_rq(cpu)->cfs);
+ if (sysctl_sched_weighted_cpuload_uses_rla)
+ return cfs_rq_runnable_load_avg(&cpu_rq(cpu)->cfs);
+ return cpu_rq(cpu)->load.weight;
}
#ifdef CONFIG_NO_HZ_COMMON
diff -Naur a/kernel/sysctl.c b/kernel/sysctl.c
--- a/kernel/sysctl.c 2016-08-20 09:09:38.000000000 -0700
+++ b/kernel/sysctl.c 2016-09-01 14:52:39.339459615 -0700
@@ -350,6 +350,13 @@
.mode = 0644,
.proc_handler = proc_dointvec,
},
+ {
+ .procname = "sched_weighted_cpuload_uses_rla",
+ .data = &sysctl_sched_weighted_cpuload_uses_rla,
+ .maxlen = sizeof(unsigned int),
+ .mode = 0644,
+ .proc_handler = proc_dointvec,
+ },
#endif /* CONFIG_SMP */
#ifdef CONFIG_NUMA_BALANCING
{