linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Benjamin Herrenschmidt <benh@kernel.crashing.org>
To: Andreas Schwab <schwab@linux-m68k.org>
Cc: Russell King - ARM Linux <linux@arm.linux.org.uk>,
	Grant Likely <grant.likely@secretlab.ca>,
	devicetree-discuss@lists.ozlabs.org,
	linux-kernel@vger.kernel.org, Milton Miller <miltonm@bga.com>,
	Rob Herring <rob.herring@calxeda.com>,
	Thomas Gleixner <tglx@linutronix.de>,
	linuxppc-dev@lists.ozlabs.org,
	linux-arm-kernel@lists.infradead.org
Subject: Re: [PATCH v5 06/27] irq_domain/powerpc: eliminate irq_map; use irq_alloc_desc() instead
Date: Wed, 11 Apr 2012 15:29:42 +1000	[thread overview]
Message-ID: <1334122182.2984.33.camel@pasglop> (raw)
In-Reply-To: <1334107996.2984.20.camel@pasglop>

On Wed, 2012-04-11 at 11:33 +1000, Benjamin Herrenschmidt wrote:
> On Wed, 2012-04-11 at 11:13 +1000, Benjamin Herrenschmidt wrote:
> > On Sat, 2012-04-07 at 14:27 +0200, Andreas Schwab wrote:
> > > Benjamin Herrenschmidt <benh@kernel.crashing.org> writes:
> > > 
> > > > It's arguable that this irq_set_irq_type(,NONE) shouln't be there but
> > > > still ... it's been around for ever and things worked :-) So something
> > > > -else- is causing the problem and I'd like to understand what exactly.
> > > 
> > > AFAICS before a09b659cd68c10ec6a30cb91ebd2c327fcd5bfe5
> > > irq_set_irq_type(,NONE) was actually a no-op.
> > 
> > So I'm still a bit baffled... ie, I understand some of what's happening
> > but not why it breaks things, I haven't yet managed to reproduce but I
> > haven't tried too hard just yet (was away from the HW) :
> 
> Allright, I have a repro-case, I'll dig.

Ok, so it's Grant's fault :-)

So basically, it's quite subtle and I'm only 99% sure of the details but
I believe what happens is:

 - The audio interrupts get virq 64 and 65 (so above NR_IRQS)

 - The reverse map isn't pre-filled at map time (we should probably do
it nowadays), we do it lazily so ...

 - The audio interrupt happens, it tries to pre-fill the reverse map
and ... fails (see below)

 - This cause irq_linear_revmap() to returns 0

 - This hits another bug in mpic where when that happens it doesn't EOI
the interrupt, which means the priority remains stuck high and we don't
get any other interrupt.

There's thus two bugs here:

 - We don't properly establish the reverse mapping for 64 and 65 (well,
not always, again see below)

 - We don't EOI an interrupt we can't reverse map (we should warn & EOI,
I'll send a patch for that).

The second problem is a bug we shouldn't hit if the first one didn't
happen, the first one comes from way irq_find_mapping() works. Basically
when the revmap entry is 0, we call it to find the mapping & populate
the revmap... and that fails.

That fails because it will only search up to irq_virq_count which is
statically initialized to NR_IRQS, which in our case is 64 so it won't
find our interrupts 64 and 65... 

The reason it works if you don't do the set_type(NONE) is a fluke, it
will crash as soon as you actually do audio:

The set_type(NONE) has the effect in mpic to configure the interrupt to
level low (default). This is also the idle state of the audio interrupt
(which is positive edge), and the MPIC appears to be latching it (yeah
odd, it does seem to latch level interrupts).

So as soon as the audio driver enables it, it fires, triggering the bug.
Without the set_type(NONE) the occurence of the bug is delayed to the
fist time you get a real audio interrupt.

Now what is the solution ? Well, there's several things I think we need
to do:

 - MPIC should properly EOI interrupts it can't revmap (I'll fix that)

 - MPIC should probably not do the set_type(NONE) on map, it's not
useful

 - However, we do have a risk of discrepency between the default trigger
type in the irq_desc vs. the default HW value at startup/map time, so we
do need to do something to reconcile them (that was the intend of NONE I
think)... without that, we risk having irq_create_of_mapping() not
setting the trigger because it thinks it thinks it's right... What do
you think is best here ? We can probably read the HW config and sync the
irq desc appropriately ...

 - The whole business with irq_virq_count needs fixing. Basically the
default value shouldn't be NR_IRQ. I suggest making it 0 and have all
the use sites do something like:

	max = irq_virq_count ? irq_virq_count : nr_irqs;

(Grant, can you take care of that ?)

 - We still need to clear up all the NR_IRQS occurences in arch/powerpc

Cheers,
Ben.



  reply	other threads:[~2012-04-11  5:30 UTC|newest]

Thread overview: 76+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2012-02-16  9:09 [PATCH v5 00/27] irq_domain generalization and rework Grant Likely
2012-02-16  9:09 ` [PATCH v5 01/27] irq_domain: add documentation and MAINTAINERS entry Grant Likely
2012-02-16  9:09 ` [PATCH v5 02/27] irq_domain: Be less verbose Grant Likely
2012-02-16  9:09 ` [PATCH v5 03/27] irq_domain: Make irq_domain structure match powerpc's irq_host Grant Likely
2012-02-16  9:09 ` [PATCH v5 04/27] irq_domain: convert microblaze from irq_host to irq_domain Grant Likely
2012-02-16  9:09 ` [PATCH v5 05/27] irq_domain/powerpc: Use common irq_domain structure instead of irq_host Grant Likely
2012-02-16  9:09 ` [PATCH v5 06/27] irq_domain/powerpc: eliminate irq_map; use irq_alloc_desc() instead Grant Likely
2012-04-01 21:27   ` Andreas Schwab
2012-04-02  4:21     ` Benjamin Herrenschmidt
2012-04-02 16:29     ` Andreas Schwab
2012-04-02 20:28       ` Grant Likely
2012-04-02 21:55         ` Russell King - ARM Linux
2012-04-02 22:33           ` Benjamin Herrenschmidt
2012-04-02 22:52             ` Russell King - ARM Linux
2012-04-02 23:38               ` Benjamin Herrenschmidt
2012-04-06 11:51                 ` Andreas Schwab
2012-04-06 23:37                   ` Benjamin Herrenschmidt
2012-04-07 12:27                     ` Andreas Schwab
2012-04-11  1:13                       ` Benjamin Herrenschmidt
2012-04-11  1:33                         ` Benjamin Herrenschmidt
2012-04-11  5:29                           ` Benjamin Herrenschmidt [this message]
2012-04-11 20:57                             ` Grant Likely
2012-04-11 21:37                               ` Benjamin Herrenschmidt
2012-04-11 21:47                                 ` Thomas Gleixner
2012-04-19 18:42                                 ` Grant Likely
2012-04-03  8:23               ` Thomas Gleixner
2012-04-03  8:20             ` Thomas Gleixner
2012-04-03 12:11         ` Andreas Schwab
2012-04-03 21:43           ` Benjamin Herrenschmidt
2012-04-04 12:51             ` Andreas Schwab
2012-04-04 15:40           ` Grant Likely
2012-04-05 10:51             ` Andreas Schwab
2012-04-06 11:12               ` Thomas Gleixner
2012-04-05 22:10             ` Andreas Schwab
2012-04-06 11:17               ` Thomas Gleixner
2012-04-06 11:25                 ` Andreas Schwab
2012-04-06 11:28                   ` Thomas Gleixner
2012-04-07  1:29                 ` Grant Likely
2012-04-02 20:52       ` Thomas Gleixner
2012-04-02 21:20         ` Benjamin Herrenschmidt
2012-04-02 21:27           ` Thomas Gleixner
2012-04-02 22:32             ` Benjamin Herrenschmidt
2012-04-02 21:22         ` Andreas Schwab
2012-04-03  0:37       ` Benjamin Herrenschmidt
2012-02-16  9:09 ` [PATCH v5 07/27] irq_domain/powerpc: Eliminate virq_is_host() Grant Likely
2012-02-16  9:09 ` [PATCH v5 08/27] irq_domain: Move irq_domain code from powerpc to kernel/irq Grant Likely
2012-02-16 13:23   ` Grant Likely
2012-02-16 17:38   ` Cousson, Benoit
2012-02-16 17:52     ` Cousson, Benoit
2012-02-16  9:09 ` [PATCH v5 09/27] irq_domain: remove NO_IRQ from irq domain code Grant Likely
2012-02-16  9:09 ` [PATCH v5 10/27] irq_domain: Remove references to old irq_host names Grant Likely
2012-02-16  9:09 ` [PATCH v5 11/27] irq_domain: Replace irq_alloc_host() with revmap-specific initializers Grant Likely
2012-02-16  9:09 ` [PATCH v5 12/27] irq_domain: Add support for base irq and hwirq in legacy mappings Grant Likely
2012-02-16  9:09 ` [PATCH v5 13/27] of/address: add empty static inlines for !CONFIG_OF Grant Likely
2012-02-16  9:09 ` [PATCH v5 14/27] mfd: twl-core.c: Fix the number of interrupts managed by twl4030 Grant Likely
2012-02-16  9:09 ` [PATCH v5 15/27] irq_domain: Remove 'new' irq_domain in favour of the ppc one Grant Likely
2012-02-16  9:09 ` [PATCH v5 16/27] irq_domain: Remove irq_domain_add_simple() Grant Likely
2012-02-16  9:09 ` [PATCH v5 17/27] irq_domain: Create common xlate functions that device drivers can use Grant Likely
2012-02-16  9:09 ` [PATCH v5 18/27] irq_domain: constify irq_domain_ops Grant Likely
2012-02-16  9:09 ` [PATCH v5 19/27] irq_domain/c6x: Convert c6x to use generic irq_domain support Grant Likely
2012-02-16  9:09 ` [PATCH v5 20/27] irq_domain/c6x: constify irq_domain structures Grant Likely
2012-02-21 15:47   ` Mark Salter
2012-02-16  9:09 ` [PATCH v5 21/27] irq_domain/c6x: Use library of xlate functions Grant Likely
2012-02-21 15:48   ` Mark Salter
2012-02-16  9:09 ` [PATCH v5 22/27] irq_domain/powerpc: constify irq_domain_ops Grant Likely
2012-02-16  9:09 ` [PATCH v5 23/27] irq_domain/powerpc: Replace custom xlate functions with library functions Grant Likely
2012-02-16  9:09 ` [PATCH v5 24/27] irq_domain/microblaze: Convert microblaze to use irq_domains Grant Likely
2012-02-16  9:09 ` [PATCH v5 25/27] irq_domain: remove "hint" when allocating irq numbers Grant Likely
2012-02-16  9:09 ` [PATCH v5 26/27] irq_domain: mostly eliminate slow-path revmap lookups Grant Likely
2012-02-16  9:09 ` [PATCH v5 27/27] irq_domain: For NOMAP revmap, allow users to specify the largest usable virq Grant Likely
2012-02-16 22:52 ` [PATCH v5 00/27] irq_domain generalization and rework Andrew Morton
2012-02-16 23:26   ` Russell King - ARM Linux
2012-02-17 18:05     ` Sam Ravnborg
2012-02-17 17:42   ` Cousson, Benoit
2012-02-17 17:55     ` Russell King - ARM Linux
2012-02-21 14:51       ` Cousson, Benoit

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=1334122182.2984.33.camel@pasglop \
    --to=benh@kernel.crashing.org \
    --cc=devicetree-discuss@lists.ozlabs.org \
    --cc=grant.likely@secretlab.ca \
    --cc=linux-arm-kernel@lists.infradead.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux@arm.linux.org.uk \
    --cc=linuxppc-dev@lists.ozlabs.org \
    --cc=miltonm@bga.com \
    --cc=rob.herring@calxeda.com \
    --cc=schwab@linux-m68k.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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).