diff options
Diffstat (limited to 'kernel/sched/stop_task.c')
| -rw-r--r-- | kernel/sched/stop_task.c | 22 | 
1 files changed, 21 insertions, 1 deletions
| diff --git a/kernel/sched/stop_task.c b/kernel/sched/stop_task.c index 7b386e86fd23..da5eb5bed84a 100644 --- a/kernel/sched/stop_task.c +++ b/kernel/sched/stop_task.c @@ -27,8 +27,10 @@ static struct task_struct *pick_next_task_stop(struct rq *rq)  {  	struct task_struct *stop = rq->stop; -	if (stop && stop->on_rq) +	if (stop && stop->on_rq) { +		stop->se.exec_start = rq->clock_task;  		return stop; +	}  	return NULL;  } @@ -52,6 +54,21 @@ static void yield_task_stop(struct rq *rq)  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 - 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);  }  static void task_tick_stop(struct rq *rq, struct task_struct *curr, int queued) @@ -60,6 +77,9 @@ static void task_tick_stop(struct rq *rq, struct task_struct *curr, int queued)  static void set_curr_task_stop(struct rq *rq)  { +	struct task_struct *stop = rq->stop; + +	stop->se.exec_start = rq->clock_task;  }  static void switched_to_stop(struct rq *rq, struct task_struct *p) |