diff options
Diffstat (limited to 'kernel/sched_stats.h')
| -rw-r--r-- | kernel/sched_stats.h | 18 |
1 files changed, 13 insertions, 5 deletions
diff --git a/kernel/sched_stats.h b/kernel/sched_stats.h index ee71bec1da66..5fcf0e184586 100644 --- a/kernel/sched_stats.h +++ b/kernel/sched_stats.h | |||
| @@ -42,7 +42,8 @@ static int show_schedstat(struct seq_file *seq, void *v) | |||
| 42 | for_each_domain(cpu, sd) { | 42 | for_each_domain(cpu, sd) { |
| 43 | enum cpu_idle_type itype; | 43 | enum cpu_idle_type itype; |
| 44 | 44 | ||
| 45 | cpumask_scnprintf(mask_str, mask_len, sd->span); | 45 | cpumask_scnprintf(mask_str, mask_len, |
| 46 | sched_domain_span(sd)); | ||
| 46 | seq_printf(seq, "domain%d %s", dcount++, mask_str); | 47 | seq_printf(seq, "domain%d %s", dcount++, mask_str); |
| 47 | for (itype = CPU_IDLE; itype < CPU_MAX_IDLE_TYPES; | 48 | for (itype = CPU_IDLE; itype < CPU_MAX_IDLE_TYPES; |
| 48 | itype++) { | 49 | itype++) { |
| @@ -298,9 +299,11 @@ static inline void account_group_user_time(struct task_struct *tsk, | |||
| 298 | { | 299 | { |
| 299 | struct signal_struct *sig; | 300 | struct signal_struct *sig; |
| 300 | 301 | ||
| 301 | sig = tsk->signal; | 302 | /* tsk == current, ensure it is safe to use ->signal */ |
| 302 | if (unlikely(!sig)) | 303 | if (unlikely(tsk->exit_state)) |
| 303 | return; | 304 | return; |
| 305 | |||
| 306 | sig = tsk->signal; | ||
| 304 | if (sig->cputime.totals) { | 307 | if (sig->cputime.totals) { |
| 305 | struct task_cputime *times; | 308 | struct task_cputime *times; |
| 306 | 309 | ||
| @@ -325,9 +328,11 @@ static inline void account_group_system_time(struct task_struct *tsk, | |||
| 325 | { | 328 | { |
| 326 | struct signal_struct *sig; | 329 | struct signal_struct *sig; |
| 327 | 330 | ||
| 328 | sig = tsk->signal; | 331 | /* tsk == current, ensure it is safe to use ->signal */ |
| 329 | if (unlikely(!sig)) | 332 | if (unlikely(tsk->exit_state)) |
| 330 | return; | 333 | return; |
| 334 | |||
| 335 | sig = tsk->signal; | ||
| 331 | if (sig->cputime.totals) { | 336 | if (sig->cputime.totals) { |
| 332 | struct task_cputime *times; | 337 | struct task_cputime *times; |
| 333 | 338 | ||
| @@ -353,8 +358,11 @@ static inline void account_group_exec_runtime(struct task_struct *tsk, | |||
| 353 | struct signal_struct *sig; | 358 | struct signal_struct *sig; |
| 354 | 359 | ||
| 355 | sig = tsk->signal; | 360 | sig = tsk->signal; |
| 361 | /* see __exit_signal()->task_rq_unlock_wait() */ | ||
| 362 | barrier(); | ||
| 356 | if (unlikely(!sig)) | 363 | if (unlikely(!sig)) |
| 357 | return; | 364 | return; |
| 365 | |||
| 358 | if (sig->cputime.totals) { | 366 | if (sig->cputime.totals) { |
| 359 | struct task_cputime *times; | 367 | struct task_cputime *times; |
| 360 | 368 | ||
