/* * Update the current task's statistics (provided it is still * a -rtws task and has not been removed from the rtws_rq). */ static void update_curr_rtws(struct rq *rq) { struct task_struct *curr = rq->curr; struct sched_rtws_entity *rtws_se = &curr->rtws; u64 delta_exec; if (!task_has_rtws_policy(curr)) return; delta_exec = rq->clock - curr->se.exec_start; if (unlikely((s64)delta_exec < 0)) delta_exec = 0; schedstat_set(curr->se.statistics.exec_max, max(curr->se.statistics.exec_max, delta_exec)); curr->se.sum_exec_runtime += delta_exec; schedstat_add(&rq->rtws, exec_clock, delta_exec); /* Maintain exec runtime for a thread group. @sched_stats.h */ account_group_exec_runtime(curr, delta_exec); curr->se.exec_start = rq->clock; /* Charge this task's execution time to its accounting group. @sched.c */ cpuacct_charge(curr, delta_exec); sched_rt_avg_update(rq, delta_exec); rtws_se->stats.tot_runtime += delta_exec; }
static void update_curr(struct cfs_rq *cfs_rq) { struct sched_entity *curr = cfs_rq->curr; u64 now = rq_of(cfs_rq)->clock; unsigned long delta_exec; if (unlikely(!curr)) return; /* * Get the amount of time the current task was running * since the last time we changed load (this cannot * overflow on 32 bits): */ delta_exec = (unsigned long)(now - curr->exec_start); if (!delta_exec) return; __update_curr(cfs_rq, curr, delta_exec); curr->exec_start = now; if (entity_is_task(curr)) { struct task_struct *curtask = task_of(curr); trace_sched_stat_runtime(curtask, delta_exec, curr->vruntime); cpuacct_charge(curtask, delta_exec); account_group_exec_runtime(curtask, delta_exec); } }
static void put_prev_task_stop(struct rq *rq, struct task_struct *prev) { struct task_struct *curr = rq->curr; u64 delta_exec; delta_exec = rq_clock_task(rq) - curr->se.exec_start; if (unlikely((s64)delta_exec < 0)) delta_exec = 0; schedstat_set(curr->se.statistics.exec_max, max(curr->se.statistics.exec_max, delta_exec)); curr->se.sum_exec_runtime += delta_exec; account_group_exec_runtime(curr, delta_exec); curr->se.exec_start = rq_clock_task(rq); cpuacct_charge(curr, delta_exec); }
static void update_curr_rms(struct rq *rq) { struct task_struct *curr = rq->curr; u64 delta_exec; if (!task_has_rms_policy(curr)) return; delta_exec = rq->clock - curr->se.exec_start; if (unlikely((s64)delta_exec < 0)) delta_exec = 0; schedstat_set(curr->se.exec_max, max(curr->se.exec_max, delta_exec)); curr->se.sum_exec_runtime += delta_exec; curr->se.exec_start = rq->clock; cpuacct_charge(curr, delta_exec); }
static void update_curr_wrr(struct rq *rq) { struct task_struct *curr = rq->curr; u64 delta_exec; if (curr->sched_class != &wrr_sched_class) return; delta_exec = rq->clock_task - curr->se.exec_start; if (unlikely((s64)delta_exec < 0)) delta_exec = 0; schedstat_set(curr->se.statistics.exec_max, max(curr->se.statistics.exec_max, delta_exec)); curr->se.sum_exec_runtime += delta_exec; account_group_exec_runtime(curr, delta_exec); curr->se.exec_start = rq->clock_task; cpuacct_charge(curr, delta_exec); }