/* * Copyright (C) 2017 MediaTek Inc. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 as * published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * See http://www.gnu.org/licenses/gpl-2.0.html for more details. */ #ifdef CONFIG_MTK_SCHED_TRACE #define sched_trace(event) \ TRACE_EVENT(event, \ TP_PROTO(char *strings), \ TP_ARGS(strings), \ TP_STRUCT__entry( \ __array(char, strings, 128) \ ), \ TP_fast_assign( \ memcpy(__entry->strings, strings, 128); \ ), \ TP_printk("%s", __entry->strings)) sched_trace(sched_eas_energy_calc); sched_trace(sched_log); #endif /* * MT: Tracepoint for system overutilized indicator */ TRACE_EVENT(sched_system_overutilized, TP_PROTO(bool overutilized), TP_ARGS(overutilized), TP_STRUCT__entry( __field(bool, overutilized) ), TP_fast_assign( __entry->overutilized = overutilized; ), TP_printk("system overutilized=%d", __entry->overutilized ? 1 : 0) ); #ifdef CONFIG_MTK_SCHED_EAS_POWER_SUPPORT /* * Tracepoint for share buck calculation */ TRACE_EVENT(group_norm_util, TP_PROTO(int cpu_idx, int cpu, int cid, unsigned long util_sum, unsigned long norm_util, unsigned long delta, unsigned long util, unsigned long capacity), TP_ARGS(cpu_idx, cpu, cid, util_sum, norm_util, delta, util, capacity), TP_STRUCT__entry( __field(int, cpu_idx) __field(int, cpu) __field(int, cid) __field(unsigned long, util_sum) __field(unsigned long, norm_util) __field(unsigned long, delta) __field(unsigned long, util) __field(unsigned long, capacity) ), TP_fast_assign( __entry->cpu_idx = cpu_idx; __entry->cpu = cpu; __entry->cid = cid; __entry->util_sum = util_sum; __entry->norm_util = norm_util; __entry->delta = delta; __entry->util = util; __entry->capacity = capacity; ), TP_printk("cpu_idx=%d cpu=%d cid=%d util_sum=%lu norm_util=%lu delta=%lu util=%lu capacity=%lu", __entry->cpu_idx, __entry->cpu, __entry->cid, __entry->util_sum, __entry->norm_util, __entry->delta, __entry->util, __entry->capacity) ); /* * Tracepoint for share buck calculation */ TRACE_EVENT(sched_share_buck, TP_PROTO(int cpu_idx, int cid, int cap_idx, int co_buck_cid, int co_buck_cap_idx, unsigned long co_buck_volt), TP_ARGS(cpu_idx, cid, cap_idx, co_buck_cid, co_buck_cap_idx, co_buck_volt), TP_STRUCT__entry( __field(int, cpu_idx) __field(int, cid) __field(int, cap_idx) __field(int, co_buck_cid) __field(int, co_buck_cap_idx) __field(unsigned long, co_buck_volt) ), TP_fast_assign( __entry->cpu_idx = cpu_idx; __entry->cid = cid; __entry->cap_idx = cap_idx; __entry->co_buck_cid = co_buck_cid; __entry->co_buck_cap_idx = co_buck_cap_idx; __entry->co_buck_volt = co_buck_volt; ), TP_printk("cpu_idx=%d cid%d=%d co_cid%d=%d co_volt=%lu", __entry->cpu_idx, __entry->cid, __entry->cap_idx, __entry->co_buck_cid, __entry->co_buck_cap_idx, __entry->co_buck_volt) ); /* * Tracepoint for idle power calculation */ TRACE_EVENT(sched_idle_power, TP_PROTO(int sd_level, int cap_idx, int leak_pwr, int energy_cost), TP_ARGS(sd_level, cap_idx, leak_pwr, energy_cost), TP_STRUCT__entry( __field(int, sd_level) __field(int, cap_idx) __field(int, leak_pwr) __field(int, energy_cost) ), TP_fast_assign( __entry->sd_level = sd_level; __entry->cap_idx = cap_idx; __entry->leak_pwr = leak_pwr; __entry->energy_cost = energy_cost; ), TP_printk("lv=%d tlb[%d].leak=(%d) total=%d", __entry->sd_level, __entry->cap_idx, __entry->leak_pwr, __entry->energy_cost) ); /* * Tracepoint for busy_power calculation */ TRACE_EVENT(sched_busy_power, TP_PROTO(int sd_level, int cap_idx, unsigned long dyn_pwr, unsigned long volt_f, unsigned long buck_pwr, int co_cap_idx, int leak_pwr, int energy_cost), TP_ARGS(sd_level, cap_idx, dyn_pwr, volt_f, buck_pwr, co_cap_idx, leak_pwr, energy_cost), TP_STRUCT__entry( __field(int, sd_level) __field(int, cap_idx) __field(unsigned long, dyn_pwr) __field(unsigned long, volt_f) __field(unsigned long, buck_pwr) __field(int, co_cap_idx) __field(unsigned long, leak_pwr) __field(int, energy_cost) ), TP_fast_assign( __entry->sd_level = sd_level; __entry->cap_idx = cap_idx; __entry->dyn_pwr = dyn_pwr; __entry->volt_f = volt_f; __entry->buck_pwr = buck_pwr; __entry->co_cap_idx = co_cap_idx; __entry->leak_pwr = leak_pwr; __entry->energy_cost = energy_cost; ), TP_printk("lv=%d tlb[%d].pwr=%ld volt_f=%ld buck.pwr=%ld tlb[%d].leak=(%ld) total=%d", __entry->sd_level, __entry->cap_idx, __entry->dyn_pwr, __entry->volt_f, __entry->buck_pwr, __entry->co_cap_idx, __entry->leak_pwr, __entry->energy_cost) ); #endif /* * Tracepoint for HMP (CONFIG_SCHED_HMP) task migrations. */ TRACE_EVENT(sched_hmp_migrate, TP_PROTO(struct task_struct *tsk, int dest, int force), TP_ARGS(tsk, dest, force), TP_STRUCT__entry( __array(char, comm, TASK_COMM_LEN) __field(pid_t, pid) __field(int, dest) __field(int, force) ), TP_fast_assign( memcpy(__entry->comm, tsk->comm, TASK_COMM_LEN); __entry->pid = tsk->pid; __entry->dest = dest; __entry->force = force; ), TP_printk("comm=%s pid=%d dest=%d force=%d", __entry->comm, __entry->pid, __entry->dest, __entry->force) ); /* * Tracepoint for accounting sched group energy */ TRACE_EVENT(sched_energy_diff, TP_PROTO(struct task_struct *tsk, int scpu, int dcpu, int udelta, int nrgb, int nrga, int nrgd), TP_ARGS(tsk, scpu, dcpu, udelta, nrgb, nrga, nrgd), TP_STRUCT__entry( __array(char, comm, TASK_COMM_LEN) __field(pid_t, pid) __field(int, scpu) __field(int, dcpu) __field(int, udelta) __field(int, nrgb) __field(int, nrga) __field(int, nrgd) ), TP_fast_assign( memcpy(__entry->comm, tsk->comm, TASK_COMM_LEN); __entry->pid = tsk->pid; __entry->scpu = scpu; __entry->dcpu = dcpu; __entry->udelta = udelta; __entry->nrgb = nrgb; __entry->nrga = nrga; __entry->nrgd = nrgd; ), TP_printk("pid=%d comm=%s src_cpu=%d dst_cpu=%d usage_delta=%d nrg_before=%d nrg_after=%d nrg_diff=%d", __entry->pid, __entry->comm, __entry->scpu, __entry->dcpu, __entry->udelta, __entry->nrgb, __entry->nrga, __entry->nrgd) ); /* * Tracepoint for showing tracked cfs runqueue runnable load. */ TRACE_EVENT(sched_cfs_runnable_load, TP_PROTO(int cpu_id, int cpu_load, int cpu_ntask), TP_ARGS(cpu_id, cpu_load, cpu_ntask), TP_STRUCT__entry( __field(int, cpu_id) __field(int, cpu_load) __field(int, cpu_ntask) ), TP_fast_assign( __entry->cpu_id = cpu_id; __entry->cpu_load = cpu_load; __entry->cpu_ntask = cpu_ntask; ), TP_printk("cpu-id=%d cfs-load=%4d, cfs-ntask=%2d", __entry->cpu_id, __entry->cpu_load, __entry->cpu_ntask) ); #ifdef CONFIG_SCHED_HMP /* * Tracepoint for showing cluster statistics in HMP */ TRACE_EVENT(sched_cluster_stats, TP_PROTO(int target, unsigned long loadwop_avg, unsigned int h_nr_running, unsigned long cluster_mask, int nr_task, int load_avg, int capacity, int acap, int scaled_acap, int threshold), TP_ARGS(target, loadwop_avg, h_nr_running, cluster_mask, nr_task, load_avg, capacity, acap, scaled_acap, threshold), TP_STRUCT__entry( __field(int, target) __field(unsigned long, loadwop_avg) __field(unsigned int, h_nr_running) __field(unsigned long, cluster_mask) __field(int, nr_task) __field(int, load_avg) __field(int, capacity) __field(int, acap) __field(int, scaled_acap) __field(int, threshold) ), TP_fast_assign( __entry->target = target; __entry->loadwop_avg = loadwop_avg; __entry->h_nr_running = h_nr_running; __entry->cluster_mask = cluster_mask; __entry->nr_task = nr_task; __entry->load_avg = load_avg; __entry->capacity = capacity; __entry->acap = acap; __entry->scaled_acap = scaled_acap; __entry->threshold = threshold; ), TP_printk("cpu[%d]:load=%lu len=%u, cluster[%lx]: nr_task=%d load_avg=%d capacity=%d acap=%d scaled_acap=%d threshold=%d", __entry->target, __entry->loadwop_avg, __entry->h_nr_running, __entry->cluster_mask, __entry->nr_task, __entry->load_avg, __entry->capacity, __entry->acap, __entry->scaled_acap, __entry->threshold) ); /* * Tracepoint for showing adjusted threshold in HMP */ TRACE_EVENT(sched_adj_threshold, TP_PROTO(int b_threshold, int l_threshold, int l_target, int l_cap, int b_target, int b_cap), TP_ARGS(b_threshold, l_threshold, l_target, l_cap, b_target, b_cap), TP_STRUCT__entry( __field(int, b_threshold) __field(int, l_threshold) __field(int, l_target) __field(int, l_cap) __field(int, b_target) __field(int, b_cap) ), TP_fast_assign( __entry->b_threshold = b_threshold; __entry->l_threshold = l_threshold; __entry->l_target = l_target; __entry->l_cap = l_cap; __entry->b_target = b_target; __entry->b_cap = b_cap; ), TP_printk("up=%4d down=%4d L_cpu=%d(%4u) B_cpu=%d(%4u)", __entry->b_threshold, __entry->l_threshold, __entry->l_target, __entry->l_cap, __entry->b_target, __entry->b_cap) ); /* * Tracepoint for dumping hmp cluster load ratio */ TRACE_EVENT(sched_hmp_load, TP_PROTO(int step, int B_load_avg, int L_load_avg), TP_ARGS(step, B_load_avg, L_load_avg), TP_STRUCT__entry( __field(int, step) __field(int, B_load_avg) __field(int, L_load_avg) ), TP_fast_assign( __entry->step = step; __entry->B_load_avg = B_load_avg; __entry->L_load_avg = L_load_avg; ), TP_printk("[%d]: B-load-avg=%4d L-load-avg=%4d", __entry->step, __entry->B_load_avg, __entry->L_load_avg) ); /* * Tracepoint for dumping hmp statistics */ TRACE_EVENT(sched_hmp_stats, TP_PROTO(struct hmp_statisic *hmp_stats), TP_ARGS(hmp_stats), TP_STRUCT__entry( __field(unsigned int, nr_force_up) __field(unsigned int, nr_force_down) ), TP_fast_assign( __entry->nr_force_up = hmp_stats->nr_force_up; __entry->nr_force_down = hmp_stats->nr_force_down; ), TP_printk("nr-force-up=%d nr-force-down=%2d", __entry->nr_force_up, __entry->nr_force_down) ); /* * Tracepoint for showing tracked migration information */ TRACE_EVENT(sched_dynamic_threshold, TP_PROTO(struct task_struct *tsk, unsigned int threshold, unsigned int status, int curr_cpu, int target_cpu, int task_load, struct clb_stats *B, struct clb_stats *L), TP_ARGS(tsk, threshold, status, curr_cpu, target_cpu, task_load, B, L), TP_STRUCT__entry( __array(char, comm, TASK_COMM_LEN) __field(pid_t, pid) __field(int, prio) __field(unsigned int, threshold) __field(unsigned int, status) __field(int, curr_cpu) __field(int, target_cpu) __field(int, curr_load) __field(int, target_load) __field(int, task_load) __field(int, B_load_avg) __field(int, L_load_avg) ), TP_fast_assign( memcpy(__entry->comm, tsk->comm, TASK_COMM_LEN); __entry->pid = tsk->pid; __entry->prio = tsk->prio; __entry->threshold = threshold; __entry->status = status; __entry->curr_cpu = curr_cpu; __entry->target_cpu = target_cpu; __entry->curr_load = cpu_rq(curr_cpu)->cfs.avg.loadwop_avg; __entry->target_load = cpu_rq(target_cpu)->cfs.avg.loadwop_avg; __entry->task_load = task_load; __entry->B_load_avg = B->load_avg; __entry->L_load_avg = L->load_avg; ), TP_printk( "pid=%4d prio=%d status=0x%4x dyn=%4u task-load=%4d curr-cpu=%d(%4d) target=%d(%4d) L-load-avg=%4d B-load-avg=%4d comm=%s", __entry->pid, __entry->prio, __entry->status, __entry->threshold, __entry->task_load, __entry->curr_cpu, __entry->curr_load, __entry->target_cpu, __entry->target_load, __entry->L_load_avg, __entry->B_load_avg, __entry->comm) ); TRACE_EVENT(sched_dynamic_threshold_draw, TP_PROTO(unsigned int B_threshold, unsigned int L_threshold), TP_ARGS(B_threshold, L_threshold), TP_STRUCT__entry( __field(unsigned int, up_threshold) __field(unsigned int, down_threshold) ), TP_fast_assign( __entry->up_threshold = B_threshold; __entry->down_threshold = L_threshold; ), TP_printk( "%4u, %4u", __entry->up_threshold, __entry->down_threshold) ); /* * Tracepoint for cfs task enqueue event */ TRACE_EVENT(sched_cfs_enqueue_task, TP_PROTO(struct task_struct *tsk, int tsk_load, int cpu_id), TP_ARGS(tsk, tsk_load, cpu_id), TP_STRUCT__entry( __array(char, comm, TASK_COMM_LEN) __field(pid_t, tsk_pid) __field(int, tsk_load) __field(int, cpu_id) ), TP_fast_assign( memcpy(__entry->comm, tsk->comm, TASK_COMM_LEN); __entry->tsk_pid = tsk->pid; __entry->tsk_load = tsk_load; __entry->cpu_id = cpu_id; ), TP_printk("cpu-id=%d task-pid=%4d task-load=%4d comm=%s", __entry->cpu_id, __entry->tsk_pid, __entry->tsk_load, __entry->comm) ); /* * Tracepoint for cfs task dequeue event */ TRACE_EVENT(sched_cfs_dequeue_task, TP_PROTO(struct task_struct *tsk, int tsk_load, int cpu_id), TP_ARGS(tsk, tsk_load, cpu_id), TP_STRUCT__entry( __array(char, comm, TASK_COMM_LEN) __field(pid_t, tsk_pid) __field(int, tsk_load) __field(int, cpu_id) ), TP_fast_assign( memcpy(__entry->comm, tsk->comm, TASK_COMM_LEN); __entry->tsk_pid = tsk->pid; __entry->tsk_load = tsk_load; __entry->cpu_id = cpu_id; ), TP_printk("cpu-id=%d task-pid=%4d task-load=%4d comm=%s", __entry->cpu_id, __entry->tsk_pid, __entry->tsk_load, __entry->comm) ); #endif /* CONFIG_SCHED_HMP */ #ifdef CONFIG_MTK_SCHED_BOOST /* * Tracepoint for set task cpu prefer */ TRACE_EVENT(sched_set_cpuprefer, TP_PROTO(struct task_struct *tsk), TP_ARGS(tsk), TP_STRUCT__entry( __array(char, comm, TASK_COMM_LEN) __field(pid_t, pid) __field(int, cpu_prefer) ), TP_fast_assign( memcpy(__entry->comm, tsk->comm, TASK_COMM_LEN); __entry->pid = tsk->pid; __entry->cpu_prefer = tsk->cpu_prefer; ), TP_printk("pid=%d comm=%s cpu_prefer=%d", __entry->pid, __entry->comm, __entry->cpu_prefer) ); #endif #ifdef CONFIG_MTK_SCHED_INTEROP TRACE_EVENT(sched_interop, TP_PROTO(int cpu, unsigned long lowest_bits), TP_ARGS(cpu, lowest_bits), TP_STRUCT__entry( __field(int, cpu) __field(unsigned long, lowest_bits) ), TP_fast_assign( __entry->cpu = cpu; __entry->lowest_bits = lowest_bits; ), TP_printk("current cpu=%d, find idle cpu from cpumask 0x%lx", __entry->cpu, __entry->lowest_bits) ); TRACE_EVENT(sched_interop_lb, TP_PROTO(int cpu, int rt_nr_running), TP_ARGS(cpu, rt_nr_running), TP_STRUCT__entry( __field(int, cpu) __field(int, rt_nr_running) ), TP_fast_assign( __entry->cpu = cpu; __entry->rt_nr_running = rt_nr_running; ), TP_printk("cpu=%d, rq->rt.rt_nr_running=%d", __entry->cpu, __entry->rt_nr_running) ); TRACE_EVENT(sched_interop_best_cpu, TP_PROTO(int cpu), TP_ARGS(cpu), TP_STRUCT__entry( __field(int, cpu) ), TP_fast_assign( __entry->cpu = cpu; ), TP_printk("find_idle_cpu=%d", __entry->cpu) ); #endif /* * Tracepoint for load balance sched group calculation */ TRACE_EVENT(sched_update_lb_sg, TP_PROTO(unsigned long avg_load, unsigned long group_load, unsigned long group_capacity, int group_no_capacity, int group_type), TP_ARGS(avg_load, group_load, group_capacity, group_no_capacity, group_type), TP_STRUCT__entry( __field(unsigned long, avg_load) __field(unsigned long, group_load) __field(unsigned long, group_capacity) __field(int, group_no_capacity) __field(int, group_type) ), TP_fast_assign( __entry->avg_load = avg_load; __entry->group_load = group_load; __entry->group_capacity = group_capacity; __entry->group_no_capacity = group_no_capacity; __entry->group_type = group_type; ), TP_printk("avg_load=%lu group_load=%lu group_capacity=%lu group_no_capacity=%d group_type=%d", __entry->avg_load, __entry->group_load, __entry->group_capacity, __entry->group_no_capacity, __entry->group_type) ); TRACE_EVENT(sched_select_task_rq, TP_PROTO(struct task_struct *tsk, int policy, int prev_cpu, int target_cpu, int task_util, int boost, bool prefer, int wake_flags), TP_ARGS(tsk, policy, prev_cpu, target_cpu, task_util, boost, prefer, wake_flags), TP_STRUCT__entry( __field(pid_t, pid) __field(int, policy) __field(int, prev_cpu) __field(int, target_cpu) __field(int, task_util) __field(int, boost) __field(long, task_mask) __field(bool, prefer) #ifdef CONFIG_MTK_SCHED_BOOST __field(int, cpu_prefer) #endif __field(int, wake_flags) ), TP_fast_assign( __entry->pid = tsk->pid; __entry->policy = policy; __entry->prev_cpu = prev_cpu; __entry->target_cpu = target_cpu; __entry->task_util = task_util; __entry->boost = boost; __entry->task_mask = tsk->cpus_allowed.bits[0]; __entry->prefer = prefer; #ifdef CONFIG_MTK_SCHED_BOOST __entry->cpu_prefer = tsk->cpu_prefer; #endif __entry->wake_flags = wake_flags; ), TP_printk("pid=%4d policy=0x%08x pre-cpu=%d target=%d util=%d boost=%d mask=0x%lx prefer=%d cpu_prefer=%d flags=%d", __entry->pid, __entry->policy, __entry->prev_cpu, __entry->target_cpu, __entry->task_util, __entry->boost, __entry->task_mask, __entry->prefer, #ifdef CONFIG_MTK_SCHED_BOOST __entry->cpu_prefer, #else 0, #endif __entry->wake_flags) ); /* * Tracepoint for big task rotation */ TRACE_EVENT(sched_big_task_rotation, TP_PROTO(int src_cpu, int dst_cpu, int src_pid, int dst_pid, int fin, int set_uclamp), TP_ARGS(src_cpu, dst_cpu, src_pid, dst_pid, fin, set_uclamp), TP_STRUCT__entry( __field(int, src_cpu) __field(int, dst_cpu) __field(int, src_pid) __field(int, dst_pid) __field(int, fin) __field(int, set_uclamp) ), TP_fast_assign( __entry->src_cpu = src_cpu; __entry->dst_cpu = dst_cpu; __entry->src_pid = src_pid; __entry->dst_pid = dst_pid; __entry->fin = fin; __entry->set_uclamp = set_uclamp; ), TP_printk("src_cpu=%d dst_cpu=%d src_pid=%d dst_pid=%d fin=%d set=%d", __entry->src_cpu, __entry->dst_cpu, __entry->src_pid, __entry->dst_pid, __entry->fin, __entry->set_uclamp) ); TRACE_EVENT(sched_big_task_rotation_reset, TP_PROTO(int set_uclamp), TP_ARGS(set_uclamp), TP_STRUCT__entry( __field(int, set_uclamp) ), TP_fast_assign( __entry->set_uclamp = set_uclamp; ), TP_printk("set_uclamp=%d", __entry->set_uclamp) ); #ifdef CONFIG_MTK_TASK_TURBO TRACE_EVENT(sched_set_user_nice, TP_PROTO(struct task_struct *task, int prio, int is_turbo), TP_ARGS(task, prio, is_turbo), TP_STRUCT__entry( __field(int, pid) __array(char, comm, TASK_COMM_LEN) __field(int, prio) __field(int, is_turbo) ), TP_fast_assign( memcpy(__entry->comm, task->comm, TASK_COMM_LEN); __entry->pid = task->pid; __entry->prio = prio; __entry->is_turbo = is_turbo; ), TP_printk("comm=%s pid=%d prio=%d is_turbo=%d", __entry->comm, __entry->pid, __entry->prio, __entry->is_turbo) ) #endif