lkml.org 
[lkml]   [2006]   [Jan]   [8]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    /
    Date
    From
    SubjectRe: [rfc][patch] Avoid taking global tasklist_lock for single threadedprocess at getrusage()
    Sorry for delay,

    Ravikiran G Thirumalai wrote:
    >
    > static void k_getrusage(struct task_struct *p, int who, struct rusage *r)
    > @@ -1681,14 +1697,22 @@ static void k_getrusage(struct task_stru
    > struct task_struct *t;
    > unsigned long flags;
    > cputime_t utime, stime;
    > + int need_lock = 0;

    Unneeded initialization

    > memset((char *) r, 0, sizeof *r);
    > -
    > - if (unlikely(!p->signal))
    > - return;
    > -
    > utime = stime = cputime_zero;
    >
    > + need_lock = !(p == current && thread_group_empty(p));
    > + if (need_lock) {
    > + read_lock(&tasklist_lock);
    > + if (unlikely(!p->signal)) {
    > + read_unlock(&tasklist_lock);
    > + return;
    > + }
    > + } else
    > + /* See locking comments above */
    > + smp_rmb();

    This patch doesn't try to optimize ->sighand.siglock locking,
    and I think this is right. But this also means we don't need
    rmb() here. It was needed to protect against "another thread
    just exited, cpu can read ->c* values before thread_group_empty()
    without taking siglock" case, now it is not possible.

    Oleg.
    -
    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: 2006-01-08 11:35    [W:0.025 / U:1.088 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site