diff options
Diffstat (limited to 'kernel/sched.c')
-rw-r--r-- | kernel/sched.c | 55 |
1 files changed, 35 insertions, 20 deletions
diff --git a/kernel/sched.c b/kernel/sched.c index 315ba4059f93..475a6f2b7158 100644 --- a/kernel/sched.c +++ b/kernel/sched.c | |||
@@ -5191,6 +5191,14 @@ cputime_t task_stime(struct task_struct *p) | |||
5191 | { | 5191 | { |
5192 | return p->stime; | 5192 | return p->stime; |
5193 | } | 5193 | } |
5194 | |||
5195 | void task_times(struct task_struct *p, cputime_t *ut, cputime_t *st) | ||
5196 | { | ||
5197 | if (ut) | ||
5198 | *ut = task_utime(p); | ||
5199 | if (st) | ||
5200 | *st = task_stime(p); | ||
5201 | } | ||
5194 | #else | 5202 | #else |
5195 | 5203 | ||
5196 | #ifndef nsecs_to_cputime | 5204 | #ifndef nsecs_to_cputime |
@@ -5198,41 +5206,48 @@ cputime_t task_stime(struct task_struct *p) | |||
5198 | msecs_to_cputime(div_u64((__nsecs), NSEC_PER_MSEC)) | 5206 | msecs_to_cputime(div_u64((__nsecs), NSEC_PER_MSEC)) |
5199 | #endif | 5207 | #endif |
5200 | 5208 | ||
5201 | cputime_t task_utime(struct task_struct *p) | 5209 | void task_times(struct task_struct *p, cputime_t *ut, cputime_t *st) |
5202 | { | 5210 | { |
5203 | cputime_t utime = p->utime, total = utime + p->stime; | 5211 | cputime_t rtime, utime = p->utime, total = utime + p->stime; |
5204 | u64 temp; | ||
5205 | 5212 | ||
5206 | /* | 5213 | /* |
5207 | * Use CFS's precise accounting: | 5214 | * Use CFS's precise accounting: |
5208 | */ | 5215 | */ |
5209 | temp = (u64)nsecs_to_cputime(p->se.sum_exec_runtime); | 5216 | rtime = nsecs_to_cputime(p->se.sum_exec_runtime); |
5210 | 5217 | ||
5211 | if (total) { | 5218 | if (total) { |
5212 | temp *= utime; | 5219 | u64 temp; |
5220 | |||
5221 | temp = (u64)(rtime * utime); | ||
5213 | do_div(temp, total); | 5222 | do_div(temp, total); |
5214 | } | 5223 | utime = (cputime_t)temp; |
5215 | utime = (cputime_t)temp; | 5224 | } else |
5225 | utime = rtime; | ||
5216 | 5226 | ||
5227 | /* | ||
5228 | * Compare with previous values, to keep monotonicity: | ||
5229 | */ | ||
5217 | p->prev_utime = max(p->prev_utime, utime); | 5230 | p->prev_utime = max(p->prev_utime, utime); |
5218 | return p->prev_utime; | 5231 | p->prev_stime = max(p->prev_stime, rtime - p->prev_utime); |
5232 | |||
5233 | if (ut) | ||
5234 | *ut = p->prev_utime; | ||
5235 | if (st) | ||
5236 | *st = p->prev_stime; | ||
5237 | } | ||
5238 | |||
5239 | cputime_t task_utime(struct task_struct *p) | ||
5240 | { | ||
5241 | cputime_t utime; | ||
5242 | task_times(p, &utime, NULL); | ||
5243 | return utime; | ||
5219 | } | 5244 | } |
5220 | 5245 | ||
5221 | cputime_t task_stime(struct task_struct *p) | 5246 | cputime_t task_stime(struct task_struct *p) |
5222 | { | 5247 | { |
5223 | cputime_t stime; | 5248 | cputime_t stime; |
5224 | 5249 | task_times(p, NULL, &stime); | |
5225 | /* | 5250 | return stime; |
5226 | * Use CFS's precise accounting. (we subtract utime from | ||
5227 | * the total, to make sure the total observed by userspace | ||
5228 | * grows monotonically - apps rely on that): | ||
5229 | */ | ||
5230 | stime = nsecs_to_cputime(p->se.sum_exec_runtime) - task_utime(p); | ||
5231 | |||
5232 | if (stime >= 0) | ||
5233 | p->prev_stime = max(p->prev_stime, stime); | ||
5234 | |||
5235 | return p->prev_stime; | ||
5236 | } | 5251 | } |
5237 | #endif | 5252 | #endif |
5238 | 5253 | ||