All the specific taskstats fields should only be manipulated in {add_tsk,fill_threadgroup}_stats().
Signed-off-by: Guillaume Chazarain <[EMAIL PROTECTED]> Cc: Balbir Singh <[EMAIL PROTECTED]> Cc: Jay Lan <[EMAIL PROTECTED]> Cc: Jonathan Lim <[EMAIL PROTECTED]> Cc: Oleg Nesterov <[EMAIL PROTECTED]> --- kernel/taskstats.c | 21 ++++++++------------- kernel/tsacct.c | 3 +++ 2 files changed, 11 insertions(+), 13 deletions(-) diff --git a/kernel/taskstats.c b/kernel/taskstats.c index 972bbfa..f25bf03 100644 --- a/kernel/taskstats.c +++ b/kernel/taskstats.c @@ -218,6 +218,8 @@ static void fill_threadgroup_stats(struct taskstats *stats, * per-task-foo-fill_threadgroup(stats, task); */ + stats->version = TASKSTATS_VERSION; + /* fill in basic acct fields */ bacct_fill_threadgroup(stats, task); @@ -241,9 +243,6 @@ static int fill_pid(pid_t pid, struct task_struct *tsk, struct taskstats *stats) get_task_struct(tsk); memset(stats, 0, sizeof(*stats)); - stats->version = TASKSTATS_VERSION; - stats->nvcsw = tsk->nvcsw; - stats->nivcsw = tsk->nivcsw; add_tsk_stats(stats, tsk); fill_threadgroup_stats(stats, tsk); @@ -278,15 +277,12 @@ static int fill_tgid(pid_t tgid, struct task_struct *first, tsk = first; do { - if (tsk->exit_state) - continue; - /* - * This check is racy as a thread could exit just right - * now and have its statistics accounted twice. - */ - add_tsk_stats(stats, tsk); - stats->nvcsw += tsk->nvcsw; - stats->nivcsw += tsk->nivcsw; + if (!tsk->exit_state) + /* + * This check is racy as a thread could exit just right + * now and have its statistics accounted twice. + */ + add_tsk_stats(stats, tsk); } while_each_thread(first, tsk); fill_threadgroup_stats(stats, first->group_leader); @@ -294,7 +290,6 @@ static int fill_tgid(pid_t tgid, struct task_struct *first, rc = 0; out: rcu_read_unlock(); - stats->version = TASKSTATS_VERSION; return rc; } diff --git a/kernel/tsacct.c b/kernel/tsacct.c index 4caea73..73b4c69 100644 --- a/kernel/tsacct.c +++ b/kernel/tsacct.c @@ -57,6 +57,9 @@ void bacct_add_tsk(struct taskstats *stats, struct task_struct *tsk) cputime_to_msecs(tsk->stimescaled) * USEC_PER_MSEC; stats->ac_minflt += tsk->min_flt; stats->ac_majflt += tsk->maj_flt; + + stats->nvcsw += tsk->nvcsw; + stats->nivcsw += tsk->nivcsw; } void bacct_fill_threadgroup(struct taskstats *stats, struct task_struct *tsk) - To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to [EMAIL PROTECTED] More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/