From: Andrew Morton <akpm@linux-foundation.org>
To: "Uwe Kleine-König" <Uwe.Kleine-Koenig@digi.com>
Cc: <linux-kernel@vger.kernel.org>,
Thomas Gleixner <tglx@linutronix.de>, Ingo Molnar <mingo@elte.hu>
Subject: Re: [PATCH] handle failure of irqchip->set_type in setup_irq
Date: Wed, 2 Jul 2008 02:49:26 -0700 [thread overview]
Message-ID: <20080702024926.59488cc7.akpm@linux-foundation.org> (raw)
In-Reply-To: <20080702091757.GA1144@digi.com>
On Wed, 2 Jul 2008 11:17:57 +0200 Uwe Kleine-K__nig <Uwe.Kleine-Koenig@digi.com> wrote:
> Hello,
>
> [extending the Cc: list]
>
> Uwe Kleine-K__nig wrote:
> > set_type returns an int but currently setup_irq ignores that.
> >
> > To save me from undoing some changes setting the IRQ_NO_BALANCING bit in
> > desc->flags, setting IRQ_PER_CPU in desc->status and adding the new
> > action to desc is only done after set_type succeeded.
> >
> > Signed-off-by: Uwe Kleine-K__nig <Uwe.Kleine-Koenig@digi.com>
> > ---
> > Hello,
> >
> > in my case set_type returns an error because gpio-key tries to use
> > IRQF_TRIGGER_RISING | IRQF_TRIGGER_FALLING and my irq-chip can only do
> > one of these.
>
> up to now I didn't get any response for this patch. It addresses a real
> problem for my platform so I really like to have a fix in.
>
> In mmotm of 2008-07-01-21-57 kernel/irq/manage.c is touched[1],
> too, but git was able to automerge the change correctly when applying it
> on top of mmotm.
>
> For your convenience you can find the patch again at the end of this
> mail.
>
> Andrew: Do you can take this patch into mm?
>
>From a brief squint the patch seems to be reasonable. But the
changelog is a bit mangled. Perhaps you could have another go when
resending it. Explan more clearly under what circumststances your
->set_type() implementation can fail and why you require the core code
to handle this.
Perhaps we want a dump_stack() on the error path so we can see who
goofed. Or a print_symbol() of desc->chip->set_type. Or perhaps not.
Did you check that all the current ->set_type() implementations are
returning zero?
>
> [1] kernel/irq/manage.c is modified by linux-next patch. The relevant
> commit is:
> 1840475... genirq: Expose default irq affinity mask (take 3)
>
>
> > diff --git a/kernel/irq/manage.c b/kernel/irq/manage.c
> > index 46d6611..bc990a1 100644
> > --- a/kernel/irq/manage.c
> > +++ b/kernel/irq/manage.c
> > @@ -281,6 +281,7 @@ int setup_irq(unsigned int irq, struct irqaction *new)
> > const char *old_name = NULL;
> > unsigned long flags;
> > int shared = 0;
> > + int ret;
> >
> > if (irq >= NR_IRQS)
> > return -EINVAL;
> > @@ -338,26 +339,23 @@ int setup_irq(unsigned int irq, struct irqaction *new)
> > shared = 1;
> > }
> >
> > - *p = new;
> > -
> > - /* Exclude IRQ from balancing */
> > - if (new->flags & IRQF_NOBALANCING)
> > - desc->status |= IRQ_NO_BALANCING;
> > -
> > if (!shared) {
> > irq_chip_set_defaults(desc->chip);
> >
> > -#if defined(CONFIG_IRQ_PER_CPU)
> > - if (new->flags & IRQF_PERCPU)
> > - desc->status |= IRQ_PER_CPU;
> > -#endif
> > -
> > /* Setup the type (level, edge polarity) if configured: */
> > if (new->flags & IRQF_TRIGGER_MASK) {
> > - if (desc->chip && desc->chip->set_type)
> > - desc->chip->set_type(irq,
> > + if (desc->chip && desc->chip->set_type) {
> > + ret = desc->chip->set_type(irq,
> > new->flags & IRQF_TRIGGER_MASK);
> > - else
> > + if (ret) {
> > + pr_err("setting flow type for irq %u "
> > + "failed\n", irq);
> > + spin_unlock_irqrestore(&desc->lock,
> > + flags);
> > + return ret;
> > + }
> > +
> > + } else
> > /*
> > * IRQF_TRIGGER_* but the PIC does not support
> > * multiple flow-types?
> > @@ -369,6 +367,11 @@ int setup_irq(unsigned int irq, struct irqaction *new)
> > } else
> > compat_irq_chip_set_default_handler(desc);
> >
> > +#if defined(CONFIG_IRQ_PER_CPU)
> > + if (new->flags & IRQF_PERCPU)
> > + desc->status |= IRQ_PER_CPU;
> > +#endif
> > +
> > desc->status &= ~(IRQ_AUTODETECT | IRQ_WAITING |
> > IRQ_INPROGRESS | IRQ_SPURIOUS_DISABLED);
> >
> > @@ -383,6 +386,13 @@ int setup_irq(unsigned int irq, struct irqaction *new)
> > /* Undo nested disables: */
> > desc->depth = 1;
> > }
> > +
> > + *p = new;
> > +
> > + /* Exclude IRQ from balancing */
> > + if (new->flags & IRQF_NOBALANCING)
> > + desc->status |= IRQ_NO_BALANCING;
> > +
> > /* Reset broken irq detection when installing new handler */
> > desc->irq_count = 0;
> > desc->irqs_unhandled = 0;
next prev parent reply other threads:[~2008-07-02 9:50 UTC|newest]
Thread overview: 35+ messages / expand[flat|nested] mbox.gz Atom feed top
2008-06-25 13:11 [PATCH] handle failure of irqchip->set_type in setup_irq Uwe Kleine-König
2008-07-02 9:17 ` Uwe Kleine-König
2008-07-02 9:49 ` Andrew Morton [this message]
2008-07-02 10:09 ` Uwe Kleine-König
2008-07-04 10:46 ` [PATCH v2] " Uwe Kleine-König
2008-07-04 17:17 ` Andrew Morton
2008-07-04 18:43 ` Uwe Kleine-König
2008-07-04 19:08 ` Andrew Morton
2008-07-09 13:13 ` Uwe Kleine-König
2008-07-09 21:52 ` Andrew Morton
2008-07-10 8:23 ` Uwe Kleine-König
2008-07-10 8:28 ` Andrew Morton
[not found] ` <20080704111540.ddffd241.akpm@linux-foundation.org>
[not found] ` <alpine.LFD.1.10.0807041147450.2815@woody.linux-foundation.org>
[not found] ` <alpine.LFD.1.10.0807041250220.2815@woody.linux-foundation.org>
[not found] ` <20080704132716.f1e12554.akpm@linux-foundation.org>
[not found] ` <20080704204252.GM14894@parisc-linux.org>
2008-07-04 22:01 ` the printk problem Andrew Morton
2008-07-05 2:03 ` Matthew Wilcox
2008-07-22 10:05 ` [PATCH] Make u64 long long on all architectures (was: the printk problem) Andrew Morton
2008-07-22 10:36 ` Michael Ellerman
2008-07-22 10:53 ` Andrew Morton
2008-07-22 11:36 ` Benjamin Herrenschmidt
2008-07-22 11:35 ` Benjamin Herrenschmidt
2008-07-05 10:20 ` the printk problem Denys Vlasenko
2008-07-05 11:33 ` Jan Engelhardt
2008-07-05 12:52 ` Vegard Nossum
2008-07-05 13:24 ` Jan Engelhardt
2008-07-05 13:50 ` Vegard Nossum
2008-07-05 14:07 ` Jan Engelhardt
2008-07-05 17:56 ` Linus Torvalds
2008-07-05 18:40 ` Jan Engelhardt
2008-07-05 18:44 ` Linus Torvalds
2008-07-05 18:41 ` Vegard Nossum
2008-07-05 18:52 ` Matthew Wilcox
2008-07-06 0:02 ` Pekka Enberg
2008-07-06 5:17 ` Randy Dunlap
[not found] ` <1215212420.8970.8.camel@pasglop>
[not found] ` <alpine.LFD.1.10.0807041622270.2815@woody.linux-foundation.org>
[not found] ` <alpine.LFD.1.10.0807051523180.2847@woody.linux-foundation.org>
[not found] ` <20080706052741.GA18928@elte.hu>
2008-07-06 5:37 ` Linus Torvalds
2008-07-06 5:53 ` Ingo Molnar
2008-07-06 6:13 ` Ingo Molnar
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=20080702024926.59488cc7.akpm@linux-foundation.org \
--to=akpm@linux-foundation.org \
--cc=Uwe.Kleine-Koenig@digi.com \
--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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox