Messages in this thread | | | Date | Sun, 08 Jan 2006 14:49:31 +0300 | From | Oleg Nesterov <> | Subject | Re: [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/
| |