uid_cputime: Avoids double accounting of process stime, utime and cpu_power in task...
authorRuchi Kandoi <kandoiruchi@google.com>
Fri, 26 Jun 2015 21:19:21 +0000 (14:19 -0700)
committerJohn Stultz <john.stultz@linaro.org>
Tue, 16 Feb 2016 21:53:53 +0000 (13:53 -0800)
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.

Bug: 22064385
Change-Id: Id2ae04b33fcd230eda9683a41b6019d4dd8f5d85
Signed-off-by: Jin Qian <jinqian@google.com>
Signed-off-by: Ruchi Kandoi <kandoiruchi@google.com>
drivers/misc/uid_cputime.c

index 89bfba6c5b6aa91bb4ed63560f65fce3f4134bfc..012bd3505ed58a0d210dd0805ef808c50a0ad9ec 100644 (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);