From: Ingo Molnar <mingo@elte.hu>
To: Jeremy Fitzhardinge <jeremy@goop.org>
Cc: "Eric W. Biederman" <ebiederm@xmission.com>,
Thomas Gleixner <tglx@linutronix.de>,
Linux Kernel Mailing List <linux-kernel@vger.kernel.org>
Subject: Re: Should irq_chip->mask disable percpu interrupts to all cpus, or just to this cpu?
Date: Wed, 24 Sep 2008 10:45:58 +0200 [thread overview]
Message-ID: <20080924084558.GD5576@elte.hu> (raw)
In-Reply-To: <48D94B64.3070004@goop.org>
* Jeremy Fitzhardinge <jeremy@goop.org> wrote:
> Hi,
>
> I'm reworking Xen's interrupt handling to isolate it a bit from the
> workings of the apic-based code, as Eric suggested a while back.
>
> As I've mentioned before, Xen represents interrupts as event channels.
> There are two major classes of event channels: per-cpu and, erm, not
> percpu. Per-cpu event channels are for things like timers and IPI
> function calls which are inherently per-cpu; it's meaningless to
> consider, for example, migrating them from cpu to cpu. I guess
> they're analogous to the the local apic vectors.
>
> (Non-percpu event channels can be bound to a particular cpu, and
> rebound at will; I'm not worried about them here.)
>
> Previously I allocated an irq per percpu event channel per cpu. This
> was pretty wasteful, since I need about 5-6 of them per cpu, so the
> number of interrupts increases quite quickly as cpus does. There's no
> deep problem with that, but it gets fairly ugly in /proc/interrupts,
> and there's some tricky corners to manage in suspend/resume.
>
> This time around I'm allocating a single irq for each percpu interrupt
> source (so one for timers, one for IPI, etc), and mapping each per-cpu
> event channel to each. But I'm wondering what the correct behaviour
> of irq_chip->mask/unmask should be in this case. Each event channel
> is individually maskable, so when ->mask gets called, I can either
> mask all the event channels associated with that irq, or just the one
> for this cpu. The latter makes most sense for me, but I don't quite
> understand the irq infrastructure enough to know if it will have bad
> effects globally.
>
> When I request the irq, I pass IRQF_PERCPU in the flags, but aside
> from preventing migration, this only seems to have an effect on
> __do_IRQ(), which looks like a legacy path anyway. It seems to me
> that by setting it that I'm giving the interrupt subsystem fair
> warning that ->mask() is only going to disable the interrupt on this
> cpu.
>
> Are there any other ill-effects of sharing an irq across all cpus like
> this? I guess there's some risk of contention on the irq_desc lock.
You should be a pretty special case: both the producer and consumer of
those IRQs. So if you change the semantics of ->mask()/->unmask() you'll
only affect your own drivers: you might get irqs even after you
disable_irq_nosync(). [but the genirq layer wont pass them down]
The genirq layer should be robust enough all across - as stray IRQs are
commonplace on real hw anyway. Sometimes we have ->unmask() methods that
opportunistically do not unmask the hw itself (but hope for an irq to
not occur) - edge handlers for example. And you probably wont use
disable_irq_nosync() anyway, you just want genirq to prevent irq handler
self-reentry, right?
So i _think_ in theory with your scheme you should get enough
concurrency and no arbitrary limitations/serialization/etc. - but you
should check whether Miss Practice agrees with that ;)
Ingo
next prev parent reply other threads:[~2008-09-24 8:46 UTC|newest]
Thread overview: 8+ messages / expand[flat|nested] mbox.gz Atom feed top
2008-09-23 20:02 Should irq_chip->mask disable percpu interrupts to all cpus, or just to this cpu? Jeremy Fitzhardinge
2008-09-24 8:45 ` Ingo Molnar [this message]
2008-09-24 9:54 ` Eric W. Biederman
2008-09-24 10:18 ` Ingo Molnar
2008-09-24 18:33 ` Jeremy Fitzhardinge
2008-09-24 19:34 ` Eric W. Biederman
2008-09-27 19:44 ` Ingo Molnar
2008-09-28 4:58 ` Jeremy Fitzhardinge
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=20080924084558.GD5576@elte.hu \
--to=mingo@elte.hu \
--cc=ebiederm@xmission.com \
--cc=jeremy@goop.org \
--cc=linux-kernel@vger.kernel.org \
--cc=tglx@linutronix.de \
/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.