From: Ravikiran G Thirumalai <kiran@scalex86.org>
To: Oleg Nesterov <oleg@tv-sign.ru>
Cc: Christoph Lameter <clameter@engr.sgi.com>,
Shai Fultheim <shai@scalex86.org>,
Nippun Goel <nippung@calsoftinc.com>,
linux-kernel@vger.kernel.org, Andrew Morton <akpm@osdl.org>,
dipankar@in.ibm.com
Subject: Re: [rfc][patch] Avoid taking global tasklist_lock for single threadedprocess at getrusage()
Date: Mon, 16 Jan 2006 12:56:18 -0800 [thread overview]
Message-ID: <20060116205618.GA5313@localhost.localdomain> (raw)
In-Reply-To: <43C40507.D1A85679@tv-sign.ru>
Sorry for the delay..
On Tue, Jan 10, 2006 at 10:03:35PM +0300, Oleg Nesterov wrote:
> Ravikiran G Thirumalai wrote:
> >
> > > >
> > > > Don't we still need rmb for the RUSAGE_SELF case? we do not take the
> > > > siglock for rusage self and the non c* signal fields are written to
> > > > at __exit_signal...
> > >
> > > I think it is unneeded because RUSAGE_SELF case is "racy" anyway even
> > > if we held both locks, task_struct->xxx counters can change at any
> > > moment.
> > >
> > > But may be you are right.
> >
> > Hmm...access to task_struct->xxx has been racy, but accessing the
> > signal->* counters were not. What if read of the signal->utime was a
> > hoisted read and signal->stime was a read after the counter is updated?
> > This was not a possibility earlier no?
>
> Sorry, I can't undestand. Could you please be more verbose ?
What I meant to say was, if a thread has just exited, since we do not use
locks anymore in ST case, the read of signal->utime may happen out of order,
(excuse long lines)
Last thread (RUSAGE_SELF) Exiting thread
k_getrusage() __exit_signal()
. .
load sig->utime (hoisted read) .
. sig->utime = cputime_add(sig->utime, tsk->utime);
. sig->stime = cputime_add(sig->stime, tsk->stime);
.
.
spin_unlock(&sighand->siglock); --> (A)
.
__unhash_process()
.
detach_pid(p, PIDTYPE_PGID);
if (!thread_group_empty()) .
.
don't take any lock based on if --> (B)
.
.
utime = cputime_add(utime, p->signal->utime); /* use cached load above */
stime = cputime_add(stime, p->signal->stime); /* load from memory */
So although writes happen in order due to (A) above, there is no guarantee
interms of read order when we do not take locks,(as far as my understanding
goes) so I think a rmb() is needed at (B), else as in this example, some
counters may have values before the exiting thread updated the sig-> fields
and some after the thread updated the sig-> fields. This might have a
significant effect than the task_struct->xxx inaccuracies. Of course
this is theoretical. This was not a possibility earlier because
__exit_signal and k_getrusage() could not run at the same time due to the
exiting thread taking tasklist lock for write and k_getrusage thread taking
the lock for read.
I am also cc'ing experts in memory re-ordering issues to check if I am
missing something :)
I think we need a rmb() at sys_times too based on the above. I will make a
patch for that.
>
> > >
> > > > What is wrong with optimizing by not taking the siglock in RUSAGE_BOTH
> > > > and RUSAGE_CHILDREN? I would like to add that in too unless I am
> > > > missing something and the optimization is incorrect.
> > >
> > > We can't have contention on ->siglock when need_lock == 0, so why should
> > > we optimize this case?
> >
> > We would be saving 1 buslocked operation in that case (on some arches), a
> > cacheline fetch for exclusive (since signal and sighand are on different memory
> > locations), and disabling/enabling onchip interrupts. But yes, this would be a
> > smaller optimization....Unless you have strong objections this can also
> > go in?
>
> I don't have strong objections, but I am not a maintainer.
>
> However, do you have any numbers or thoughts why this optimization
> can make any _visible_ effect?
We know we don't need locks there, so I do not understand why we
should keep them. Locks are always serializing and expensive operations. I
believe on some arches disabling on-chip interrupts is also an expensive
operation...some arches might use hypervisor calls to do that which I guess
will have its own overhead...so why have it when we know we don't need it?
Thanks,
Kiran
next prev parent reply other threads:[~2006-01-16 20:56 UTC|newest]
Thread overview: 25+ messages / expand[flat|nested] mbox.gz Atom feed top
2005-12-24 17:52 [rfc][patch] Avoid taking global tasklist_lock for single threaded process at getrusage() Oleg Nesterov
2005-12-27 20:21 ` Christoph Lameter
2005-12-28 12:38 ` [rfc][patch] Avoid taking global tasklist_lock for single threadedprocess " Oleg Nesterov
2005-12-28 18:33 ` Ravikiran G Thirumalai
2005-12-28 22:57 ` Ravikiran G Thirumalai
2005-12-30 17:57 ` Oleg Nesterov
2006-01-04 23:16 ` Ravikiran G Thirumalai
2006-01-05 19:17 ` Oleg Nesterov
2006-01-06 9:46 ` Ravikiran G Thirumalai
2006-01-06 17:23 ` Christoph Lameter
2006-01-06 19:46 ` Ravikiran G Thirumalai
2006-03-20 18:04 ` Oleg Nesterov
2006-03-22 22:18 ` Ravikiran G Thirumalai
2006-03-23 18:18 ` Oleg Nesterov
2006-01-06 23:52 ` Andrew Morton
2006-01-08 11:49 ` Oleg Nesterov
2006-01-08 19:58 ` Ravikiran G Thirumalai
2006-01-09 18:55 ` Oleg Nesterov
2006-01-09 20:54 ` Ravikiran G Thirumalai
2006-01-10 19:03 ` Oleg Nesterov
2006-01-16 20:56 ` Ravikiran G Thirumalai [this message]
2006-01-17 19:59 ` Oleg Nesterov
2006-01-17 19:52 ` Ravikiran G Thirumalai
2006-01-18 9:17 ` Oleg Nesterov
2006-01-03 18:18 ` Christoph Lameter
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20060116205618.GA5313@localhost.localdomain \
--to=kiran@scalex86.org \
--cc=akpm@osdl.org \
--cc=clameter@engr.sgi.com \
--cc=dipankar@in.ibm.com \
--cc=linux-kernel@vger.kernel.org \
--cc=nippung@calsoftinc.com \
--cc=oleg@tv-sign.ru \
--cc=shai@scalex86.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.