From ede1bb58231ad8014f8795e5f1c833dbffcee8af Mon Sep 17 00:00:00 2001 From: Douglas Raillard Date: Mon, 2 Aug 2021 11:54:11 +0100 Subject: [PATCH] tools/kmodules: Update sched_tp kernel module * Add sched_cpu_capacity event * update_time field to sched_pelt_cfs * Remove sched_update_nr_running --- tools/kmodules/sched_tp/sched_events.h | 79 ++++++++++++++------------ tools/kmodules/sched_tp/sched_tp.c | 54 +++++++++--------- 2 files changed, 71 insertions(+), 62 deletions(-) diff --git a/tools/kmodules/sched_tp/sched_events.h b/tools/kmodules/sched_tp/sched_events.h index d2179b8a7..af0ee3788 100644 --- a/tools/kmodules/sched_tp/sched_events.h +++ b/tools/kmodules/sched_tp/sched_events.h @@ -11,12 +11,9 @@ #define __SPAN_SIZE (round_up(NR_CPUS, 4)/4) #define SPAN_SIZE (__SPAN_SIZE > MAX_SPAN_SIZE ? MAX_SPAN_SIZE : __SPAN_SIZE) -#include #include #include -#include "sched_tp_helpers.h" - #if LINUX_VERSION_CODE <= KERNEL_VERSION(5,6,0) #define RBL_LOAD_ENTRY rbl_load #define RBL_LOAD_MEMBER runnable_load_avg @@ -39,6 +36,7 @@ TRACE_EVENT(sched_pelt_cfs, __field( unsigned long, load ) __field( unsigned long, RBL_LOAD_ENTRY ) __field( unsigned long, util ) + __field( unsigned long long, update_time ) ), TP_fast_assign( @@ -47,11 +45,12 @@ TRACE_EVENT(sched_pelt_cfs, __entry->load = avg->load_avg; __entry->RBL_LOAD_ENTRY = avg->RBL_LOAD_MEMBER; __entry->util = avg->util_avg; + __entry->update_time = avg->last_update_time; ), - TP_printk("cpu=%d path=%s load=%lu " RBL_LOAD_STR "=%lu util=%lu", + TP_printk("cpu=%d path=%s load=%lu " RBL_LOAD_STR "=%lu util=%lu update_time=%llu", __entry->cpu, __entry->path, __entry->load, - __entry->RBL_LOAD_ENTRY,__entry->util) + __entry->RBL_LOAD_ENTRY,__entry->util, __entry->update_time) ); DECLARE_EVENT_CLASS(sched_pelt_rq_template, @@ -65,6 +64,7 @@ DECLARE_EVENT_CLASS(sched_pelt_rq_template, __field( unsigned long, load ) __field( unsigned long, RBL_LOAD_ENTRY ) __field( unsigned long, util ) + __field( unsigned long long, update_time ) ), TP_fast_assign( @@ -72,11 +72,12 @@ DECLARE_EVENT_CLASS(sched_pelt_rq_template, __entry->load = avg->load_avg; __entry->RBL_LOAD_ENTRY = avg->RBL_LOAD_MEMBER; __entry->util = avg->util_avg; + __entry->update_time = avg->last_update_time; ), - TP_printk("cpu=%d load=%lu " RBL_LOAD_STR "=%lu util=%lu", + TP_printk("cpu=%d load=%lu " RBL_LOAD_STR "=%lu util=%lu update_time=%llu", __entry->cpu, __entry->load, - __entry->RBL_LOAD_ENTRY,__entry->util) + __entry->RBL_LOAD_ENTRY,__entry->util, __entry->update_time) ); DEFINE_EVENT(sched_pelt_rq_template, sched_pelt_rt, @@ -144,27 +145,6 @@ TRACE_EVENT(sched_overutilized, __entry->overutilized, __entry->span) ); -TRACE_EVENT(sched_update_nr_running, - - TP_PROTO(int cpu, int change, unsigned int nr_running), - - TP_ARGS(cpu, change, nr_running), - - TP_STRUCT__entry( - __field( int, cpu ) - __field( int, change ) - __field(unsigned int, nr_running ) - ), - - TP_fast_assign( - __entry->cpu = cpu; - __entry->change = change; - __entry->nr_running = nr_running; - ), - - TP_printk("cpu=%d change=%d nr_running=%d", __entry->cpu, __entry->change, __entry->nr_running) - ); - TRACE_EVENT(sched_util_est_se, TP_PROTO(int cpu, char *path, char *comm, int pid, @@ -226,6 +206,8 @@ TRACE_EVENT(sched_util_est_cfs, #ifdef CONFIG_UCLAMP_TASK +struct rq; + TRACE_EVENT_CONDITION(uclamp_util_se, TP_PROTO(bool is_task, struct task_struct *p, struct rq *rq), @@ -247,7 +229,7 @@ TRACE_EVENT_CONDITION(uclamp_util_se, TP_fast_assign( __entry->pid = p->pid; memcpy(__entry->comm, p->comm, TASK_COMM_LEN); - __entry->cpu = sched_tp_rq_cpu(rq); + __entry->cpu = rq->cpu; __entry->util_avg = p->se.avg.util_avg; __entry->uclamp_avg = uclamp_rq_util_with(rq, p->se.avg.util_avg, NULL); __entry->uclamp_min = rq->uclamp[UCLAMP_MIN].value; @@ -263,9 +245,9 @@ TRACE_EVENT_CONDITION(uclamp_util_se, TRACE_EVENT_CONDITION(uclamp_util_cfs, - TP_PROTO(bool is_root, struct rq *rq, struct cfs_rq *cfs_rq), + TP_PROTO(bool is_root, int cpu, struct cfs_rq *cfs_rq), - TP_ARGS(is_root, rq, cfs_rq), + TP_ARGS(is_root, cpu, cfs_rq), TP_CONDITION(is_root), @@ -278,11 +260,11 @@ TRACE_EVENT_CONDITION(uclamp_util_cfs, ), TP_fast_assign( - __entry->cpu = sched_tp_rq_cpu(rq); + __entry->cpu = cpu; __entry->util_avg = cfs_rq->avg.util_avg; - __entry->uclamp_avg = uclamp_rq_util_with(rq, cfs_rq->avg.util_avg, NULL); - __entry->uclamp_min = rq->uclamp[UCLAMP_MIN].value; - __entry->uclamp_max = rq->uclamp[UCLAMP_MAX].value; + __entry->uclamp_avg = uclamp_rq_util_with(rq_of(cfs_rq), cfs_rq->avg.util_avg, NULL); + __entry->uclamp_min = rq_of(cfs_rq)->uclamp[UCLAMP_MIN].value; + __entry->uclamp_max = rq_of(cfs_rq)->uclamp[UCLAMP_MAX].value; ), TP_printk("cpu=%d util_avg=%lu uclamp_avg=%lu " @@ -297,6 +279,33 @@ TRACE_EVENT_CONDITION(uclamp_util_cfs, #define trace_uclamp_util_cfs_enabled() false #endif /* CONFIG_UCLAMP_TASK */ +TRACE_EVENT(sched_cpu_capacity, + + TP_PROTO(struct rq *rq), + + TP_ARGS(rq), + + TP_STRUCT__entry( + __field( int, cpu ) + __field( unsigned long, capacity ) + __field( unsigned long, capacity_orig ) + __field( unsigned long, capacity_curr ) + ), + + unsigned long scale_cpu = arch_scale_cpu_capacity(rq->cpu); + unsigned long scale_freq = arch_scale_freq_capacity(rq->cpu); + + TP_fast_assign( + __entry->cpu = rq->cpu; + __entry->capacity = rq->cpu_capacity; + __entry->capacity_orig = scale_cpu; + __entry->capacity_curr = cap_scale(scale_cpu, scale_freq); + ), + + TP_printk("cpu=%d capacity=%lu capacity_orig=%lu capacity_curr=%lu", + __entry->cpu, __entry->capacity, __entry->capacity_orig, __entry->capacity_curr) +); + #endif /* _SCHED_EVENTS_H */ /* This part must be outside protection */ diff --git a/tools/kmodules/sched_tp/sched_tp.c b/tools/kmodules/sched_tp/sched_tp.c index c9aceae2f..16840c5f6 100644 --- a/tools/kmodules/sched_tp/sched_tp.c +++ b/tools/kmodules/sched_tp/sched_tp.c @@ -4,6 +4,8 @@ #include #include +#include "sched.h" + #define CREATE_TRACE_POINTS #include "sched_events.h" @@ -33,9 +35,9 @@ static inline void _trace_cfs(struct cfs_rq *cfs_rq, char path[PATH_SIZE]; int cpu; - avg = sched_tp_cfs_rq_avg(cfs_rq); - sched_tp_cfs_rq_path(cfs_rq, path, PATH_SIZE); - cpu = sched_tp_cfs_rq_cpu(cfs_rq); + avg = sched_trace_cfs_rq_avg(cfs_rq); + sched_trace_cfs_rq_path(cfs_rq, path, PATH_SIZE); + cpu = sched_trace_cfs_rq_cpu(cfs_rq); trace_event(cpu, path, avg); } @@ -52,8 +54,8 @@ static inline void _trace_se(struct sched_entity *se, pid_t pid; int cpu; - sched_tp_cfs_rq_path(gcfs_rq, path, PATH_SIZE); - cpu = sched_tp_cfs_rq_cpu(cfs_rq); + sched_trace_cfs_rq_path(gcfs_rq, path, PATH_SIZE); + cpu = sched_trace_cfs_rq_cpu(cfs_rq); p = gcfs_rq ? NULL : container_of(se, struct task_struct, se); comm = p ? p->comm : "(null)"; @@ -68,17 +70,18 @@ static void sched_pelt_cfs(void *data, struct cfs_rq *cfs_rq) _trace_cfs(cfs_rq, trace_sched_pelt_cfs); if (trace_uclamp_util_cfs_enabled()) { + unsigned int cpu = sched_trace_cfs_rq_cpu(cfs_rq); bool __maybe_unused is_root_rq = (&rq_of(cfs_rq)->cfs == cfs_rq); - trace_uclamp_util_cfs(is_root_rq, rq_of(cfs_rq), cfs_rq); + trace_uclamp_util_cfs(is_root_rq, cpu, cfs_rq); } } static void sched_pelt_rt(void *data, struct rq *rq) { if (trace_sched_pelt_rt_enabled()) { - const struct sched_avg *avg = sched_tp_rq_avg_rt(rq); - int cpu = sched_tp_rq_cpu(rq); + const struct sched_avg *avg = sched_trace_rq_avg_rt(rq); + int cpu = sched_trace_rq_cpu(rq); if (!avg) return; @@ -90,8 +93,8 @@ static void sched_pelt_rt(void *data, struct rq *rq) static void sched_pelt_dl(void *data, struct rq *rq) { if (trace_sched_pelt_dl_enabled()) { - const struct sched_avg *avg = sched_tp_rq_avg_dl(rq); - int cpu = sched_tp_rq_cpu(rq); + const struct sched_avg *avg = sched_trace_rq_avg_dl(rq); + int cpu = sched_trace_rq_cpu(rq); if (!avg) return; @@ -103,8 +106,8 @@ static void sched_pelt_dl(void *data, struct rq *rq) static void sched_pelt_irq(void *data, struct rq *rq) { if (trace_sched_pelt_irq_enabled()){ - const struct sched_avg *avg = sched_tp_rq_avg_irq(rq); - int cpu = sched_tp_rq_cpu(rq); + const struct sched_avg *avg = sched_trace_rq_avg_irq(rq); + int cpu = sched_trace_rq_cpu(rq); if (!avg) return; @@ -115,11 +118,12 @@ static void sched_pelt_irq(void *data, struct rq *rq) static void sched_pelt_se(void *data, struct sched_entity *se) { - if (trace_sched_pelt_se_enabled()) + if (trace_sched_pelt_se_enabled()) { _trace_se(se, trace_sched_pelt_se); + } if (trace_uclamp_util_se_enabled()) { - struct cfs_rq __maybe_unused *cfs_rq = get_se_cfs_rq(se); + void __maybe_unused *cfs_rq = get_se_cfs_rq(se); trace_uclamp_util_se(entity_is_task(se), container_of(se, struct task_struct, se), @@ -132,22 +136,12 @@ static void sched_overutilized(void *data, struct root_domain *rd, bool overutil if (trace_sched_overutilized_enabled()) { char span[SPAN_SIZE]; - cpumap_print_to_pagebuf(false, span, sched_tp_rd_span(rd)); + cpumap_print_to_pagebuf(false, span, sched_trace_rd_span(rd)); trace_sched_overutilized(overutilized, span); } } -static void sched_update_nr_running(void *data, struct rq *rq, int change) -{ - if (trace_sched_update_nr_running_enabled()) { - int cpu = sched_tp_rq_cpu(rq); - int nr_running = sched_tp_rq_nr_running(rq); - - trace_sched_update_nr_running(cpu, change, nr_running); - } -} - static void sched_util_est_cfs(void *data, struct cfs_rq *cfs_rq) { if (trace_sched_util_est_cfs_enabled()) @@ -160,6 +154,12 @@ static void sched_util_est_se(void *data, struct sched_entity *se) _trace_se(se, trace_sched_util_est_se); } +static void sched_cpu_capacity(void *data, struct rq *rq) +{ + if (trace_sched_cpu_capacity_enabled()) + trace_sched_cpu_capacity(rq); +} + static int sched_tp_init(void) { register_trace_pelt_cfs_tp(sched_pelt_cfs, NULL); @@ -168,9 +168,9 @@ static int sched_tp_init(void) register_trace_pelt_irq_tp(sched_pelt_irq, NULL); register_trace_pelt_se_tp(sched_pelt_se, NULL); register_trace_sched_overutilized_tp(sched_overutilized, NULL); - register_trace_sched_update_nr_running_tp(sched_update_nr_running, NULL); register_trace_sched_util_est_cfs_tp(sched_util_est_cfs, NULL); register_trace_sched_util_est_se_tp(sched_util_est_se, NULL); + register_trace_sched_cpu_capacity_tp(sched_cpu_capacity, NULL); return 0; } @@ -183,9 +183,9 @@ static void sched_tp_finish(void) unregister_trace_pelt_irq_tp(sched_pelt_irq, NULL); unregister_trace_pelt_se_tp(sched_pelt_se, NULL); unregister_trace_sched_overutilized_tp(sched_overutilized, NULL); - unregister_trace_sched_update_nr_running_tp(sched_update_nr_running, NULL); unregister_trace_sched_util_est_cfs_tp(sched_util_est_cfs, NULL); unregister_trace_sched_util_est_se_tp(sched_util_est_se, NULL); + unregister_trace_sched_cpu_capacity_tp(sched_cpu_capacity, NULL); } -- GitLab