Re: [PATCH v3 24/25] irq_domain: remove "hint" when allocating irqnumbers

From: Grant Likely
Date: Thu Feb 16 2012 - 00:32:46 EST


On Wed, Feb 15, 2012 at 01:50:02PM -0800, Shawn Guo wrote:
> On Wed, Feb 15, 2012 at 01:21:45PM -0700, Grant Likely wrote:
> > On Wed, Feb 15, 2012 at 04:04:28PM +0100, Nicolas Ferre wrote:
> > > On 02/07/2012 07:07 PM, Nicolas Ferre :
> > > > On 01/27/2012 10:36 PM, Grant Likely :
> > > >> The 'hint' used to try and line up irq numbers with hw irq numbers is
> > > >> rather a hack and not very useful. Now that /proc/interrupts also outputs
> > > >> the hwirq number, it is even less useful to keep around the 'hint' heuristic.
> > > >>
> > > >> This patch removes it.
> > > >
> > > > Grant,
> > > >
> > > > While trying your patch series in conjunction with Rob one, I do not
> > > > find this patch in your irqdomain/next branch (and a couple of others).
> > > > Can you tell me if this v3 series is available as a git tree?
> > >
> > > I am still interested by patch 24-25 of this series but still cannot
> > > find them in your irqdomain/next branch:
> > > Are they also expected to join the 3.4 merge window material?
> >
> > I've held off on putting them in irqdomain/next because they are a bit more
> > risky than the other patches, and I want an explicit ack from Ben for patches
> > 24 & 25. However, that shouldn't really cause any issues since the changes
> > in 24 & 25 don't impact the irq_domain functionality or API. They are just
> > optimizations.
> >
> I'm seeing that patch 24 does impact on irq_domain functionality
> a little bit. On next tree which has no this patch yet,
> irq_create_mapping can reasonably create virq in range 1..15, while
> irq_find_mapping will only try to find the virq from 16
> (NUM_ISA_INTERRUPTS). This will result in that any hwirq that is < 16
> gets multiple entries in the mapping table with different virq numbers
> mapped to the same one hwirq.

That's a bug then. The implementation should work without patch 24. Does
this patch fix it?

---

diff --git a/kernel/irq/irqdomain.c b/kernel/irq/irqdomain.c
index 2c1d6f8..2d3dfff 100644
--- a/kernel/irq/irqdomain.c
+++ b/kernel/irq/irqdomain.c
@@ -516,8 +516,8 @@ unsigned int irq_find_mapping(struct irq_domain *domain,
return irq_domain_legacy_revmap(domain, hwirq);

/* Slow path does a linear search of the map */
- if (hint < NUM_ISA_INTERRUPTS)
- hint = NUM_ISA_INTERRUPTS;
+ if (hint == 0)
+ hint = 1;
i = hint;
do {
struct irq_data *data = irq_get_irq_data(i);
@@ -525,7 +525,7 @@ unsigned int irq_find_mapping(struct irq_domain *domain,
return i;
i++;
if (i >= irq_virq_count)
- i = NUM_ISA_INTERRUPTS;
+ i = 1
} while(i != hint);
return 0;
}

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/