uid_cputime: Avoids double accounting of process stime, utime and cpu_power in task exit.

This avoids the race where a particular process is terminating and we read the
show_uid_stats. At this time since the task_struct still exists and we will account
for the terminating process as one of the active task, where as the stats would have
been added in the task exit callback.

When the task is terminated, the cpu_power for that particular task is added to the
terminated tasks. It is possible that before the task releases all the resources, cpu
reschedules the task or a timer interrupt is fired. At this point we will try to add
the additional time to the process, which will cause the accounting to be skewed. This
avoids that race condition.

Bug: 22064385
Change-Id: Id2ae04b33fcd230eda9683a41b6019d4dd8f5d85
Signed-off-by: Jin Qian <jinqian@google.com>
Signed-off-by: Ruchi Kandoi <kandoiruchi@google.com>
Git-commit: 344377047daa5832ef798af697adee388e367d57
Git-repo: https://android.googlesource.com/kernel/msm/
Signed-off-by: Nirmal Abraham <nabrah@codeaurora.org>
This commit is contained in:
Ruchi Kandoi 2015-06-26 14:19:21 -07:00 committed by Avaneesh Kumar Dwivedi
parent bfcc15b97c
commit 6c77c407d3
2 changed files with 8 additions and 1 deletions

View File

@ -142,7 +142,8 @@ void acct_update_power(struct task_struct *task, cputime_t cputime)
return;
curr = powerstats->curr[stats->last_index];
task->cpu_power += curr * cputime_to_usecs(cputime);
if (task->cpu_power != ULLONG_MAX)
task->cpu_power += curr * cputime_to_usecs(cputime);
}
EXPORT_SYMBOL_GPL(acct_update_power);

View File

@ -100,6 +100,11 @@ static int uid_stat_show(struct seq_file *m, void *v)
task_uid(task)));
return -ENOMEM;
}
/* if this task is exiting, we have already accounted for the
* time and power.
*/
if (task->cpu_power == ULLONG_MAX)
continue;
task_cputime_adjusted(task, &utime, &stime);
uid_entry->active_utime += utime;
uid_entry->active_stime += stime;
@ -211,6 +216,7 @@ static int process_notifier(struct notifier_block *self,
uid_entry->utime += utime;
uid_entry->stime += stime;
uid_entry->power += task->cpu_power;
task->cpu_power = ULLONG_MAX;
exit:
mutex_unlock(&uid_lock);