diff --git a/include/trace/events/sched.h b/include/trace/events/sched.h index 1d758d18a1b7..433d3919ba00 100644 --- a/include/trace/events/sched.h +++ b/include/trace/events/sched.h @@ -638,14 +638,21 @@ TRACE_EVENT(sched_contrib_scale_f, #ifdef CONFIG_SMP +#ifdef CONFIG_SCHED_WALT +extern unsigned int sysctl_sched_use_walt_cpu_util; +extern unsigned int sysctl_sched_use_walt_task_util; +extern unsigned int walt_ravg_window; +extern unsigned int walt_disabled; +#endif + /* * Tracepoint for accounting sched averages for tasks. */ TRACE_EVENT(sched_load_avg_task, - TP_PROTO(struct task_struct *tsk, struct sched_avg *avg), + TP_PROTO(struct task_struct *tsk, struct sched_avg *avg, void *_ravg), - TP_ARGS(tsk, avg), + TP_ARGS(tsk, avg, _ravg), TP_STRUCT__entry( __array( char, comm, TASK_COMM_LEN ) @@ -653,6 +660,8 @@ TRACE_EVENT(sched_load_avg_task, __field( int, cpu ) __field( unsigned long, load_avg ) __field( unsigned long, util_avg ) + __field( unsigned long, util_avg_pelt ) + __field( unsigned long, util_avg_walt ) __field( u64, load_sum ) __field( u32, util_sum ) __field( u32, period_contrib ) @@ -667,15 +676,25 @@ TRACE_EVENT(sched_load_avg_task, __entry->load_sum = avg->load_sum; __entry->util_sum = avg->util_sum; __entry->period_contrib = avg->period_contrib; + __entry->util_avg_pelt = avg->util_avg; + __entry->util_avg_walt = 0; +#ifdef CONFIG_SCHED_WALT + __entry->util_avg_walt = (((unsigned long)((struct ravg*)_ravg)->demand) << SCHED_LOAD_SHIFT); + do_div(__entry->util_avg_walt, walt_ravg_window); + if (!walt_disabled && sysctl_sched_use_walt_task_util) + __entry->util_avg = __entry->util_avg_walt; +#endif ), - - TP_printk("comm=%s pid=%d cpu=%d load_avg=%lu util_avg=%lu load_sum=%llu" + TP_printk("comm=%s pid=%d cpu=%d load_avg=%lu util_avg=%lu " + "util_avg_pelt=%lu util_avg_walt=%lu load_sum=%llu" " util_sum=%u period_contrib=%u", __entry->comm, __entry->pid, __entry->cpu, __entry->load_avg, __entry->util_avg, + __entry->util_avg_pelt, + __entry->util_avg_walt, (u64)__entry->load_sum, (u32)__entry->util_sum, (u32)__entry->period_contrib) @@ -694,16 +713,29 @@ TRACE_EVENT(sched_load_avg_cpu, __field( int, cpu ) __field( unsigned long, load_avg ) __field( unsigned long, util_avg ) + __field( unsigned long, util_avg_pelt ) + __field( unsigned long, util_avg_walt ) ), TP_fast_assign( __entry->cpu = cpu; __entry->load_avg = cfs_rq->avg.load_avg; __entry->util_avg = cfs_rq->avg.util_avg; + __entry->util_avg_pelt = cfs_rq->avg.util_avg; + __entry->util_avg_walt = 0; +#ifdef CONFIG_SCHED_WALT + __entry->util_avg_walt = + cpu_rq(cpu)->prev_runnable_sum << SCHED_LOAD_SHIFT; + do_div(__entry->util_avg_walt, walt_ravg_window); + if (!walt_disabled && sysctl_sched_use_walt_cpu_util) + __entry->util_avg = __entry->util_avg_walt; +#endif ), - TP_printk("cpu=%d load_avg=%lu util_avg=%lu", - __entry->cpu, __entry->load_avg, __entry->util_avg) + TP_printk("cpu=%d load_avg=%lu util_avg=%lu " + "util_avg_pelt=%lu util_avg_walt=%lu", + __entry->cpu, __entry->load_avg, __entry->util_avg, + __entry->util_avg_pelt, __entry->util_avg_walt) ); /* diff --git a/kernel/sched/fair.c b/kernel/sched/fair.c index dfd150b02e63..f972df2115d7 100644 --- a/kernel/sched/fair.c +++ b/kernel/sched/fair.c @@ -3178,6 +3178,7 @@ static inline void update_load_avg(struct sched_entity *se, int flags) u64 now = cfs_rq_clock_task(cfs_rq); int cpu = cpu_of(rq_of(cfs_rq)); int decayed; + void *ptr = NULL; /* * Track task load average for carrying it to new CPU after migrated, and @@ -3195,8 +3196,12 @@ static inline void update_load_avg(struct sched_entity *se, int flags) if (decayed && (flags & UPDATE_TG)) update_tg_load_avg(cfs_rq, 0); - if (entity_is_task(se)) - trace_sched_load_avg_task(task_of(se), &se->avg); + if (entity_is_task(se)) { +#ifdef CONFIG_SCHED_WALT + ptr = (void *)&(task_of(se)->ravg); +#endif + trace_sched_load_avg_task(task_of(se), &se->avg, ptr); + } } /**