From mboxrd@z Thu Jan 1 00:00:00 1970 From: Thomas Gleixner Subject: [patch 16/47] genirq: Implement sane enumeration Date: Thu, 30 Sep 2010 23:15:51 -0000 Message-ID: <20100930221740.055804558@linutronix.de> References: <20100930221351.682772535@linutronix.de> Return-path: Content-Disposition: inline; filename=genirq-implement-sane-enumeration.patch Sender: linux-kernel-owner@vger.kernel.org To: LKML Cc: linux-arch@vger.kernel.org, Linus Torvalds , Andrew Morton , x86@kernel.org, Peter Zijlstra , Benjamin Herrenschmidt , Paul Mundt , Russell King , David Woodhouse , Jesse Barnes , Yinghai Lu , Grant Likely , "Eric W. Biederman" List-Id: linux-arch.vger.kernel.org Use the allocator bitmap to lookup active interrupts. Signed-off-by: Thomas Gleixner --- include/linux/irqnr.h | 5 +++++ kernel/irq/irqdesc.c | 17 +++++++++++++++++ 2 files changed, 22 insertions(+) Index: linux-2.6-tip/include/linux/irqnr.h =================================================================== --- linux-2.6-tip.orig/include/linux/irqnr.h +++ linux-2.6-tip/include/linux/irqnr.h @@ -25,6 +25,7 @@ extern int nr_irqs; extern struct irq_desc *irq_to_desc(unsigned int irq); +unsigned int irq_get_next_irq(unsigned int offset); # define for_each_irq_desc(irq, desc) \ for (irq = 0, desc = irq_to_desc(irq); irq < nr_irqs; \ @@ -47,6 +48,10 @@ extern struct irq_desc *irq_to_desc(unsi #define irq_node(irq) 0 #endif +# define for_each_active_irq(irq) \ + for (irq = irq_get_next_irq(0); irq < nr_irqs; \ + irq = irq_get_next_irq(irq)) + #endif /* CONFIG_GENERIC_HARDIRQS */ #define for_each_irq_nr(irq) \ Index: linux-2.6-tip/kernel/irq/irqdesc.c =================================================================== --- linux-2.6-tip.orig/kernel/irq/irqdesc.c +++ linux-2.6-tip/kernel/irq/irqdesc.c @@ -470,6 +470,23 @@ err: return ret; } +/** + * irq_get_next_irq - get next allocated irq number + * @offset: where to start the search + * + * Returns next irq number after offset or nr_irqs if none is found. + */ +unsigned int irq_get_next_irq(unsigned int offset) +{ + unsigned long flags; + unsigned int res; + + raw_spin_lock_irqsave(&sparse_irq_lock, flags); + res = find_next_bit_set(allocated_irqs, nr_irqs, offset); + raw_spin_unlock_irqsave(&sparse_irq_lock, flags); + return res; +} + /* Statistics access */ void clear_kstat_irqs(struct irq_desc *desc) { From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from www.tglx.de ([62.245.132.106]:52627 "EHLO www.tglx.de" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1754573Ab0I3XQj (ORCPT ); Thu, 30 Sep 2010 19:16:39 -0400 Message-ID: <20100930221740.055804558@linutronix.de> Date: Thu, 30 Sep 2010 23:15:51 -0000 From: Thomas Gleixner Subject: [patch 16/47] genirq: Implement sane enumeration References: <20100930221351.682772535@linutronix.de> Content-Disposition: inline; filename=genirq-implement-sane-enumeration.patch Sender: linux-arch-owner@vger.kernel.org List-ID: To: LKML Cc: linux-arch@vger.kernel.org, Linus Torvalds , Andrew Morton , x86@kernel.org, Peter Zijlstra , Benjamin Herrenschmidt , Paul Mundt , Russell King , David Woodhouse , Jesse Barnes , Yinghai Lu , Grant Likely , "Eric W. Biederman" Message-ID: <20100930231551.uJzXPOi2r1jLbufkwhT36XbWTlwFIP2WSlHTFwX9CXk@z> Use the allocator bitmap to lookup active interrupts. Signed-off-by: Thomas Gleixner --- include/linux/irqnr.h | 5 +++++ kernel/irq/irqdesc.c | 17 +++++++++++++++++ 2 files changed, 22 insertions(+) Index: linux-2.6-tip/include/linux/irqnr.h =================================================================== --- linux-2.6-tip.orig/include/linux/irqnr.h +++ linux-2.6-tip/include/linux/irqnr.h @@ -25,6 +25,7 @@ extern int nr_irqs; extern struct irq_desc *irq_to_desc(unsigned int irq); +unsigned int irq_get_next_irq(unsigned int offset); # define for_each_irq_desc(irq, desc) \ for (irq = 0, desc = irq_to_desc(irq); irq < nr_irqs; \ @@ -47,6 +48,10 @@ extern struct irq_desc *irq_to_desc(unsi #define irq_node(irq) 0 #endif +# define for_each_active_irq(irq) \ + for (irq = irq_get_next_irq(0); irq < nr_irqs; \ + irq = irq_get_next_irq(irq)) + #endif /* CONFIG_GENERIC_HARDIRQS */ #define for_each_irq_nr(irq) \ Index: linux-2.6-tip/kernel/irq/irqdesc.c =================================================================== --- linux-2.6-tip.orig/kernel/irq/irqdesc.c +++ linux-2.6-tip/kernel/irq/irqdesc.c @@ -470,6 +470,23 @@ err: return ret; } +/** + * irq_get_next_irq - get next allocated irq number + * @offset: where to start the search + * + * Returns next irq number after offset or nr_irqs if none is found. + */ +unsigned int irq_get_next_irq(unsigned int offset) +{ + unsigned long flags; + unsigned int res; + + raw_spin_lock_irqsave(&sparse_irq_lock, flags); + res = find_next_bit_set(allocated_irqs, nr_irqs, offset); + raw_spin_unlock_irqsave(&sparse_irq_lock, flags); + return res; +} + /* Statistics access */ void clear_kstat_irqs(struct irq_desc *desc) {