uid_cputime: Avoids double accounting of process stime, utime and cpu_power in
authorRuchi Kandoi <kandoiruchi@google.com>
Fri, 26 Jun 2015 21:19:21 +0000 (14:19 -0700)
committerHuang, Tao <huangtao@rock-chips.com>
Tue, 27 Oct 2015 08:27:50 +0000 (16:27 +0800)
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.

Bug: 22064385
Change-Id: Id2ae04b33fcd230eda9683a41b6019d4dd8f5d85
Signed-off-by: Jin Qian <jinqian@google.com>
Signed-off-by: Ruchi Kandoi <kandoiruchi@google.com>
(cherry picked from commit ddd9aac59e0aea3d5a4df485173115e8ecb3e17d)

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);