From: Yong Zhang <yong.zhang@windriver.com>
To: Thomas Gleixner <tglx@linutronix.de>
Cc: Lars-Peter Clausen <lars@metafoo.de>, Ingo Molnar <mingo@elte.hu>,
linux-kernel@vger.kernel.org
Subject: Re: [RFC][PATCH] IRQ: Fix oneshot irq race between irq_finalize_oneshot and handle_level_irq
Date: Thu, 11 Mar 2010 10:55:33 +0800 [thread overview]
Message-ID: <20100311025533.GB8389@windriver.com> (raw)
In-Reply-To: <alpine.LFD.2.00.1003100848380.22855@localhost.localdomain>
On Wed, Mar 10, 2010 at 08:56:22AM +0100, Thomas Gleixner wrote:
> > How about the following patch(maybe a little ugly). I think it will
> > resolve your concerns.
>
> No it does not, but you are right that it's ugly. And it is patently
> wrong as well.
>
> > diff --git a/kernel/irq/chip.c b/kernel/irq/chip.c
> > index d70394f..23b79c6 100644
> > --- a/kernel/irq/chip.c
> > +++ b/kernel/irq/chip.c
> > @@ -461,9 +461,24 @@ handle_level_irq(unsigned int irq, struct irq_desc *desc)
> > raw_spin_lock(&desc->lock);
> > mask_ack_irq(desc, irq);
I must say this patch isn't based on your previous one in which
mask_ack_irq() is modified to flag IRQ_MASKED.
I let IRQ_MASKED serialise interrupt-handler and irq-thread in oneshot
mode.
> >
> > - if (unlikely(desc->status & IRQ_INPROGRESS))
> > - goto out_unlock;
> > + /*
> > + * if we are in oneshot mode and the irq thread is running on
> > + * another cpu, just return because the irq thread will unmask
> > + * the irq
> > + */
> > + if (unlikely(desc->status & IRQ_ONESHOT)) {
> > + if (unlikely(desc->status & (IRQ_INPROGRESS | IRQ_MASKED)
> > + == IRQ_INPROGRESS | IRQ_MASKED))
> > + goto out_unlock;
> > + }
> > + else {
> > + if (unlikely(desc->status & IRQ_INPROGRESS))
> > + goto out_unlock;
> > + }
>
> In case of IRQ_SHOT and IRQ_INPROGRESS and the other CPU having
> unmasked the interrupt already you are reentering the handler which
> is a nono.
I have thought of that kind of reentering you point above,
if IRQ_MASKED is cleared by irq_finalize_oneshot(), the thread_fn()
is done as well as the hardware opration. If another irq comes in,
the reentering does happen, but I think it's harmless because at
this time we just set IRQTF_RUNTHREAD and IRQ_MASKED and wake
irq thread up and then the irq thread loops for another time.
So irq will not return unmask in case of oneshot.
If I miss something, correct me please.
Thanks,
Yong
next prev parent reply other threads:[~2010-03-11 2:56 UTC|newest]
Thread overview: 13+ messages / expand[flat|nested] mbox.gz Atom feed top
2010-03-08 23:57 [RFC][PATCH] IRQ: Fix oneshot irq race between irq_finalize_oneshot and handle_level_irq Lars-Peter Clausen
2010-03-09 7:58 ` Thomas Gleixner
2010-03-09 8:08 ` Yong Zhang
2010-03-09 16:59 ` Valdis.Kletnieks
2010-03-09 18:10 ` Thomas Gleixner
2010-03-09 22:48 ` Lars-Peter Clausen
2010-03-09 23:32 ` Thomas Gleixner
2010-03-09 23:22 ` Thomas Gleixner
2010-03-10 3:21 ` Yong Zhang
2010-03-10 7:56 ` Thomas Gleixner
2010-03-11 2:55 ` Yong Zhang [this message]
2010-03-11 8:41 ` Thomas Gleixner
2010-03-11 9:13 ` Yong Zhang
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=20100311025533.GB8389@windriver.com \
--to=yong.zhang@windriver.com \
--cc=lars@metafoo.de \
--cc=linux-kernel@vger.kernel.org \
--cc=mingo@elte.hu \
--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.