From: Ingo Molnar <mingo@elte.hu>
To: Andrew Morton <akpm@osdl.org>
Cc: vatsa@in.ibm.com, Bjorn Helgaas <bjorn.helgaas@hp.com>,
linux-kernel@vger.kernel.org, Myron Stowe <myron.stowe@hp.com>,
Jens Axboe <axboe@kernel.dk>, Dipankar <dipankar@in.ibm.com>,
Gautham shenoy <ego@in.ibm.com>
Subject: Re: workqueue deadlock
Date: Sun, 10 Dec 2006 12:49:43 +0100 [thread overview]
Message-ID: <20061210114943.GA14749@elte.hu> (raw)
In-Reply-To: <20061210004318.8e1ef324.akpm@osdl.org>
* Andrew Morton <akpm@osdl.org> wrote:
> > > > not a naked preempt_disable()! The concurrency rules for data
> > > > structures changed via preempt_disable() are quite hard to sort out
> > > > after the fact. (preempt_disable() is too opaque,
> > >
> > > preempt_disable() is the preferred way of holding off cpu hotplug.
> >
> > well, preempt_disable() is the scheduler's internal mechanism to keep
> > tasks from being preempted. It is fast but it also has non-nice
> > side-effect:
> >
> > 1) nothing tells us what the connection between preempt-disable and data
> > structure is. If we let preempt_disable() spread then we'll end up
> > with a situation like the BKL: all preempt_disable() sections become
> > one big blob of code with hard-to-define specifications, and if we
> > take out code from that blob stuff mysteriously breaks.
>
> Well we can add some suitably-named wrapper around preempt_disable()
> to make it obvious why we're calling it. But I haven't noticed any
> such problem with existing usages.
ok, as long as there's a separate API for it (which just maps to
disable_preempt(), or whatever), i'm fine with it. The complications
with preempt_disable()/preempt_enable() and local_irq_disable()/enable()
come when someone tries to implement something like a fully preemptible
kernel :-)
it was quite some work to sort the irqs on/off + per-cpu assumptions out
in the slab allocator and in the page allocator:
$ diffstat patches/rt-slab.patch
mm/slab.c | 460 +++++++++++++++++++++++++++++++++++++++++------------------------
1 file changed, 296 insertions(+), 164 deletions(-)
$ diffstat patches/rt-page_alloc.patch
mm/page_alloc.c | 125 ++++++++++++++++++++++++++++++++++++++++++-----------------
1 file changed, 90 insertions(+), 35 deletions(-)
> > void cpu_hotplug_lock(void)
> > {
> > int cpu = raw_smp_processor_id();
> > /*
> > * Interrupts/softirqs are hotplug-safe:
> > */
> > if (in_interrupt())
> > return;
> > if (current->hotplug_depth++)
> > return;
> > current->hotplug_lock = &per_cpu(hotplug_lock, cpu);
> > mutex_lock(current->hotplug_lock);
> > }
>
> That's functionally equivalent to what we have now, and it isn't
> working too well.
hm, i thought the main reason of not using cpu_hotplug_lock() in a
widespread manner was not related to its functionality but to its
scalability - but i could be wrong. The one above is scalable and we
could use it as /the/ method to control CPU hotplug. All the flux i
remember related to cpu_hotplug_lock() use from the fork path and from
other scheduler hotpaths related to its scalability bottleneck, not to
its locking efficiency.
Ingo
next prev parent reply other threads:[~2006-12-10 11:51 UTC|newest]
Thread overview: 23+ messages / expand[flat|nested] mbox.gz Atom feed top
2006-12-07 0:26 workqueue deadlock Bjorn Helgaas
2006-12-07 6:17 ` Srivatsa Vaddagiri
2006-12-07 6:45 ` Srivatsa Vaddagiri
2006-12-07 18:51 ` Andrew Morton
2006-12-07 19:37 ` Andrew Morton
2006-12-08 2:53 ` Srivatsa Vaddagiri
2006-12-08 4:54 ` Andrew Morton
2006-12-08 7:58 ` Srivatsa Vaddagiri
2006-12-09 10:26 ` Ingo Molnar
2006-12-09 19:47 ` Andrew Morton
2006-12-10 8:26 ` Ingo Molnar
2006-12-10 8:43 ` Andrew Morton
2006-12-10 11:49 ` Ingo Molnar [this message]
2006-12-10 12:16 ` Andrew Morton
2006-12-10 12:19 ` Ingo Molnar
2006-12-10 12:34 ` Andrew Morton
2006-12-11 6:09 ` Ingo Molnar
2006-12-10 14:18 ` Rafael J. Wysocki
2006-12-11 6:52 ` Dipankar Sarma
2006-12-11 16:34 ` Rafael J. Wysocki
2006-12-11 5:45 ` Srivatsa Vaddagiri
2006-12-11 6:03 ` Andrew Morton
2006-12-11 4:58 ` Srivatsa Vaddagiri
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=20061210114943.GA14749@elte.hu \
--to=mingo@elte.hu \
--cc=akpm@osdl.org \
--cc=axboe@kernel.dk \
--cc=bjorn.helgaas@hp.com \
--cc=dipankar@in.ibm.com \
--cc=ego@in.ibm.com \
--cc=linux-kernel@vger.kernel.org \
--cc=myron.stowe@hp.com \
--cc=vatsa@in.ibm.com \
/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.