diff options
| author | Ingo Molnar <mingo@elte.hu> | 2009-03-03 00:08:56 +0300 |
|---|---|---|
| committer | Ingo Molnar <mingo@elte.hu> | 2009-03-03 00:08:56 +0300 |
| commit | c02368a9d059322f913a58111eade87a656fefd5 (patch) | |
| tree | 2f02dbbe69b86535f58d2010d9adfb20a9c16fb9 /kernel/sched_stats.h | |
| parent | f17c75453b2d195eba0a90d9f16a3ba88c85b3b4 (diff) | |
| parent | 778ef1e6cbb049c9bcbf405936ee6f2b6e451892 (diff) | |
| download | linux-c02368a9d059322f913a58111eade87a656fefd5.tar.xz | |
Merge branch 'linus' into irq/genirq
Diffstat (limited to 'kernel/sched_stats.h')
| -rw-r--r-- | kernel/sched_stats.h | 48 |
1 files changed, 26 insertions, 22 deletions
diff --git a/kernel/sched_stats.h b/kernel/sched_stats.h index f2773b5d1226..a8f93dd374e1 100644 --- a/kernel/sched_stats.h +++ b/kernel/sched_stats.h @@ -296,20 +296,21 @@ sched_info_switch(struct task_struct *prev, struct task_struct *next) static inline void account_group_user_time(struct task_struct *tsk, cputime_t cputime) { - struct signal_struct *sig; + struct thread_group_cputimer *cputimer; /* tsk == current, ensure it is safe to use ->signal */ if (unlikely(tsk->exit_state)) return; - sig = tsk->signal; - if (sig->cputime.totals) { - struct task_cputime *times; + cputimer = &tsk->signal->cputimer; - times = per_cpu_ptr(sig->cputime.totals, get_cpu()); - times->utime = cputime_add(times->utime, cputime); - put_cpu_no_resched(); - } + if (!cputimer->running) + return; + + spin_lock(&cputimer->lock); + cputimer->cputime.utime = + cputime_add(cputimer->cputime.utime, cputime); + spin_unlock(&cputimer->lock); } /** @@ -325,20 +326,21 @@ static inline void account_group_user_time(struct task_struct *tsk, static inline void account_group_system_time(struct task_struct *tsk, cputime_t cputime) { - struct signal_struct *sig; + struct thread_group_cputimer *cputimer; /* tsk == current, ensure it is safe to use ->signal */ if (unlikely(tsk->exit_state)) return; - sig = tsk->signal; - if (sig->cputime.totals) { - struct task_cputime *times; + cputimer = &tsk->signal->cputimer; - times = per_cpu_ptr(sig->cputime.totals, get_cpu()); - times->stime = cputime_add(times->stime, cputime); - put_cpu_no_resched(); - } + if (!cputimer->running) + return; + + spin_lock(&cputimer->lock); + cputimer->cputime.stime = + cputime_add(cputimer->cputime.stime, cputime); + spin_unlock(&cputimer->lock); } /** @@ -354,6 +356,7 @@ static inline void account_group_system_time(struct task_struct *tsk, static inline void account_group_exec_runtime(struct task_struct *tsk, unsigned long long ns) { + struct thread_group_cputimer *cputimer; struct signal_struct *sig; sig = tsk->signal; @@ -362,11 +365,12 @@ static inline void account_group_exec_runtime(struct task_struct *tsk, if (unlikely(!sig)) return; - if (sig->cputime.totals) { - struct task_cputime *times; + cputimer = &sig->cputimer; - times = per_cpu_ptr(sig->cputime.totals, get_cpu()); - times->sum_exec_runtime += ns; - put_cpu_no_resched(); - } + if (!cputimer->running) + return; + + spin_lock(&cputimer->lock); + cputimer->cputime.sum_exec_runtime += ns; + spin_unlock(&cputimer->lock); } |
