Messages in this thread Patch in this message | | | Date | Thu, 05 Jan 2006 22:17:01 +0300 | From | Oleg Nesterov <> | Subject | Re: [rfc][patch] Avoid taking global tasklist_lock for single threadedprocess at getrusage() |
| |
Ravikiran G Thirumalai wrote: > > + need_lock = (p == current && thread_group_empty(p));
This should be
need_lock = !(p == current && thread_group_empty(p));
I think we should cleanup k_getrusage() first, see the patch below.
Do you agree with that patch? If yes, could you make the new one on top of it? (please send them both to Andrew).
Note that after this cleanup we don't have code duplication.
[PATCH] simplify k_getrusage()
Factor out common code for different RUSAGE_xxx cases.
Don't take ->sighand->siglock in RUSAGE_SELF case, suggested by Ravikiran G Thirumalai.
Signed-off-by: Oleg Nesterov <oleg@tv-sign.ru>
--- K/kernel/sys.c~ 2006-01-03 21:15:58.000000000 +0300 +++ K/kernel/sys.c 2006-01-06 00:40:34.000000000 +0300 @@ -1687,7 +1687,10 @@ static void k_getrusage(struct task_stru if (unlikely(!p->signal)) return; + utime = stime = cputime_zero; + switch (who) { + case RUSAGE_BOTH: case RUSAGE_CHILDREN: spin_lock_irqsave(&p->sighand->siglock, flags); utime = p->signal->cutime; @@ -1697,22 +1700,11 @@ static void k_getrusage(struct task_stru r->ru_minflt = p->signal->cmin_flt; r->ru_majflt = p->signal->cmaj_flt; spin_unlock_irqrestore(&p->sighand->siglock, flags); - cputime_to_timeval(utime, &r->ru_utime); - cputime_to_timeval(stime, &r->ru_stime); - break; + + if (who == RUSAGE_CHILDREN) + break; + case RUSAGE_SELF: - spin_lock_irqsave(&p->sighand->siglock, flags); - utime = stime = cputime_zero; - goto sum_group; - case RUSAGE_BOTH: - spin_lock_irqsave(&p->sighand->siglock, flags); - utime = p->signal->cutime; - stime = p->signal->cstime; - r->ru_nvcsw = p->signal->cnvcsw; - r->ru_nivcsw = p->signal->cnivcsw; - r->ru_minflt = p->signal->cmin_flt; - r->ru_majflt = p->signal->cmaj_flt; - sum_group: utime = cputime_add(utime, p->signal->utime); stime = cputime_add(stime, p->signal->stime); r->ru_nvcsw += p->signal->nvcsw; @@ -1729,13 +1721,14 @@ static void k_getrusage(struct task_stru r->ru_majflt += t->maj_flt; t = next_thread(t); } while (t != p); - spin_unlock_irqrestore(&p->sighand->siglock, flags); - cputime_to_timeval(utime, &r->ru_utime); - cputime_to_timeval(stime, &r->ru_stime); break; + default: BUG(); } + + cputime_to_timeval(utime, &r->ru_utime); + cputime_to_timeval(stime, &r->ru_stime); } int getrusage(struct task_struct *p, int who, struct rusage __user *ru) - 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/
| |