Signed-off-by: Yuyang Du <yuyang...@intel.com> --- kernel/sched/Makefile | 1 + kernel/sched/concurrency.c | 22 ++++++++++++++++++++++ kernel/sched/core.c | 5 +++++ kernel/sched/sched.h | 21 +++++++++++++++++++++ 4 files changed, 49 insertions(+) create mode 100644 kernel/sched/concurrency.c
diff --git a/kernel/sched/Makefile b/kernel/sched/Makefile index ab32b7b..e67f7e3 100644 --- a/kernel/sched/Makefile +++ b/kernel/sched/Makefile @@ -19,3 +19,4 @@ obj-$(CONFIG_SCHED_AUTOGROUP) += auto_group.o obj-$(CONFIG_SCHEDSTATS) += stats.o obj-$(CONFIG_SCHED_DEBUG) += debug.o obj-$(CONFIG_CGROUP_CPUACCT) += cpuacct.o +obj-$(CONFIG_CPU_CONCURRENCY) += concurrency.o diff --git a/kernel/sched/concurrency.c b/kernel/sched/concurrency.c new file mode 100644 index 0000000..195bcf5 --- /dev/null +++ b/kernel/sched/concurrency.c @@ -0,0 +1,22 @@ +/* + * CPU ConCurrency (CC) is measures the CPU load by averaging + * the number of running tasks. Using CC, the scheduler can + * evaluate the load of CPUs to improve load balance for power + * efficiency without sacrificing performance. + * + */ + +#ifdef CONFIG_CPU_CONCURRENCY + +#include "sched.h" + +void init_cpu_concurrency(struct rq *rq) +{ + rq->concurrency.sum = 0; + rq->concurrency.sum_now = 0; + rq->concurrency.contrib = 0; + rq->concurrency.nr_running = 0; + rq->concurrency.sum_timestamp = ULLONG_MAX; + rq->concurrency.contrib_timestamp = ULLONG_MAX; +} +#endif diff --git a/kernel/sched/core.c b/kernel/sched/core.c index 268a45e..ff990f9 100644 --- a/kernel/sched/core.c +++ b/kernel/sched/core.c @@ -6884,6 +6884,11 @@ void __init sched_init(void) #endif init_rq_hrtick(rq); atomic_set(&rq->nr_iowait, 0); + + /* + * cpu concurrency init + */ + init_cpu_concurrency(rq); } set_load_weight(&init_task); diff --git a/kernel/sched/sched.h b/kernel/sched/sched.h index 456e492..0cf9bf0 100644 --- a/kernel/sched/sched.h +++ b/kernel/sched/sched.h @@ -508,6 +508,17 @@ extern struct root_domain def_root_domain; #endif /* CONFIG_SMP */ +#ifdef CONFIG_CPU_CONCURRENCY +struct cpu_concurrency_t { + u64 sum; + u64 sum_now; + u64 contrib; + u64 sum_timestamp; + u64 contrib_timestamp; + unsigned long nr_running; +}; +#endif + /* * This is the main, per-CPU runqueue data structure. * @@ -643,6 +654,10 @@ struct rq { #ifdef CONFIG_SMP struct llist_head wake_list; #endif + +#ifdef CONFIG_CPU_CONCURRENCY + struct cpu_concurrency_t concurrency; +#endif }; static inline int cpu_of(struct rq *rq) @@ -1203,6 +1218,12 @@ extern void init_sched_dl_class(void); extern void resched_task(struct task_struct *p); extern void resched_cpu(int cpu); +#ifdef CONFIG_CPU_CONCURRENCY +extern void init_cpu_concurrency(struct rq *rq); +#else +static inline void init_cpu_concurrency(struct rq *rq) {} +#endif + extern struct rt_bandwidth def_rt_bandwidth; extern void init_rt_bandwidth(struct rt_bandwidth *rt_b, u64 period, u64 runtime); -- 1.7.9.5 -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/