|
@@ -296,6 +296,7 @@ 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 task_cputime *times;
|
|
|
struct signal_struct *sig;
|
|
|
|
|
|
/* tsk == current, ensure it is safe to use ->signal */
|
|
@@ -303,13 +304,11 @@ static inline void account_group_user_time(struct task_struct *tsk,
|
|
|
return;
|
|
|
|
|
|
sig = tsk->signal;
|
|
|
- if (sig->cputime.totals) {
|
|
|
- struct task_cputime *times;
|
|
|
+ times = &sig->cputime.totals;
|
|
|
|
|
|
- times = per_cpu_ptr(sig->cputime.totals, get_cpu());
|
|
|
- times->utime = cputime_add(times->utime, cputime);
|
|
|
- put_cpu_no_resched();
|
|
|
- }
|
|
|
+ spin_lock(×->lock);
|
|
|
+ times->utime = cputime_add(times->utime, cputime);
|
|
|
+ spin_unlock(×->lock);
|
|
|
}
|
|
|
|
|
|
/**
|
|
@@ -325,6 +324,7 @@ 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 task_cputime *times;
|
|
|
struct signal_struct *sig;
|
|
|
|
|
|
/* tsk == current, ensure it is safe to use ->signal */
|
|
@@ -332,13 +332,11 @@ static inline void account_group_system_time(struct task_struct *tsk,
|
|
|
return;
|
|
|
|
|
|
sig = tsk->signal;
|
|
|
- if (sig->cputime.totals) {
|
|
|
- struct task_cputime *times;
|
|
|
+ times = &sig->cputime.totals;
|
|
|
|
|
|
- times = per_cpu_ptr(sig->cputime.totals, get_cpu());
|
|
|
- times->stime = cputime_add(times->stime, cputime);
|
|
|
- put_cpu_no_resched();
|
|
|
- }
|
|
|
+ spin_lock(×->lock);
|
|
|
+ times->stime = cputime_add(times->stime, cputime);
|
|
|
+ spin_unlock(×->lock);
|
|
|
}
|
|
|
|
|
|
/**
|
|
@@ -354,6 +352,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 task_cputime *times;
|
|
|
struct signal_struct *sig;
|
|
|
|
|
|
sig = tsk->signal;
|
|
@@ -362,11 +361,9 @@ static inline void account_group_exec_runtime(struct task_struct *tsk,
|
|
|
if (unlikely(!sig))
|
|
|
return;
|
|
|
|
|
|
- if (sig->cputime.totals) {
|
|
|
- struct task_cputime *times;
|
|
|
+ times = &sig->cputime.totals;
|
|
|
|
|
|
- times = per_cpu_ptr(sig->cputime.totals, get_cpu());
|
|
|
- times->sum_exec_runtime += ns;
|
|
|
- put_cpu_no_resched();
|
|
|
- }
|
|
|
+ spin_lock(×->lock);
|
|
|
+ times->sum_exec_runtime += ns;
|
|
|
+ spin_unlock(×->lock);
|
|
|
}
|