lkml.org 
[lkml]   [2007]   [Sep]   [26]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 7/8] taskstats: fix stats->ac_exitcode to work on threads and use group_exit_code
    Date
    Threads also have an exit code on their own, so report it in
    TASKSTATS_CMD_ATTR_PID.

    For TASKSTATS_CMD_ATTR_TGID, instead of relying only on the exit code of the
    leader, we use task->signal->group_exit_code if not null as suggested by
    Oleg Nesterov.

    Also, document that as of this patch, fill_threadgroup_stats() must be called
    after add_tsk_stats() as it may overwrite some stats.

    Signed-off-by: Guillaume Chazarain <guichaz@yahoo.fr>
    Cc: Balbir Singh <balbir@in.ibm.com>
    Cc: Jay Lan <jlan@engr.sgi.com>
    Cc: Jonathan Lim <jlim@sgi.com>
    Cc: Oleg Nesterov <oleg@tv-sign.ru>
    ---

    kernel/taskstats.c | 2 ++
    kernel/tsacct.c | 12 +++++++-----
    2 files changed, 9 insertions(+), 5 deletions(-)

    diff --git a/kernel/taskstats.c b/kernel/taskstats.c
    index 59fe1d8..938c0b0 100644
    --- a/kernel/taskstats.c
    +++ b/kernel/taskstats.c
    @@ -208,6 +208,8 @@ static void add_tsk_stats(struct taskstats *stats, struct task_struct *task)
    *
    * Will be called on the thread group leader if requesting stats for the whole
    * thread group.
    + * fill_threadgroup_stats() may overwrite stats from add_tsk_stats(), so it
    + * must be called after add_tsk_stats().
    */
    static void fill_threadgroup_stats(struct taskstats *stats,
    struct task_struct *task, bool tg_stats)
    diff --git a/kernel/tsacct.c b/kernel/tsacct.c
    index 8c2f470..e83f53b 100644
    --- a/kernel/tsacct.c
    +++ b/kernel/tsacct.c
    @@ -65,13 +65,15 @@ void bacct_add_tsk(struct taskstats *stats, struct task_struct *tsk)
    void bacct_fill_threadgroup(struct taskstats *stats, struct task_struct *tsk,
    bool tg_stats)
    {
    + int group_exit_code;
    +
    fill_wall_times(stats, tsk);

    - if (thread_group_leader(tsk)) {
    - stats->ac_exitcode = tsk->exit_code;
    - if (tsk->flags & PF_FORKNOEXEC)
    - stats->ac_flag |= AFORK;
    - }
    + if (thread_group_leader(tsk) && ((tsk->flags & PF_FORKNOEXEC)))
    + stats->ac_flag |= AFORK;
    +
    + group_exit_code = tg_stats ? tsk->signal->group_exit_code : 0;
    + stats->ac_exitcode = group_exit_code ? : tsk->exit_code;

    stats->ac_nice = task_nice(tsk);
    stats->ac_sched = tsk->policy;
    -
    To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
    the body of a message to majordomo@vger.kernel.org
    More majordomo info at http://vger.kernel.org/majordomo-info.html
    Please read the FAQ at http://www.tux.org/lkml/
    \
     
     \ /
      Last update: 2007-09-26 18:43    [W:0.021 / U:89.628 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site