Re: [PATCH v3 24/25] irq_domain: remove "hint" when allocating irq numbers
From: Grant Likely <hidden>
Date: 2012-02-16 05:32:48
Also in:
linux-arm-kernel, linux-devicetree, lkml
Subsystem:
irq domains (irq number mapping library), irq subsystem, the rest · Maintainers:
Thomas Gleixner, Linus Torvalds
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:quoted
On Wed, Feb 15, 2012 at 04:04:28PM +0100, Nicolas Ferre wrote:quoted
On 02/07/2012 07:07 PM, Nicolas Ferre :quoted
On 01/27/2012 10:36 PM, Grant Likely :quoted
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; }