linuxppc-dev.lists.ozlabs.org archive mirror
 help / color / mirror / Atom feed
* [PATCH 1/6] powerpc: Make NR_IRQS a CONFIG option
@ 2009-10-14  5:44 Michael Ellerman
  2009-10-14  5:44 ` [PATCH 2/6] powerpc/pseries: Use irq_has_action() in eeh_disable_irq() Michael Ellerman
                   ` (5 more replies)
  0 siblings, 6 replies; 15+ messages in thread
From: Michael Ellerman @ 2009-10-14  5:44 UTC (permalink / raw)
  To: linuxppc-dev

The irq_desc array consumes quite a lot of space, and for systems
that don't need or can't have 512 irqs it's just wasted space.

The first 16 are reserved for ISA, so the minimum of 32 is really
16 - and no one has asked for more than 512 so leave that as the
maximum.

Signed-off-by: Michael Ellerman <michael@ellerman.id.au>
---
 arch/powerpc/Kconfig           |   10 ++++++++++
 arch/powerpc/include/asm/irq.h |    4 ++--
 2 files changed, 12 insertions(+), 2 deletions(-)

diff --git a/arch/powerpc/Kconfig b/arch/powerpc/Kconfig
index 10a0a54..2230e75 100644
--- a/arch/powerpc/Kconfig
+++ b/arch/powerpc/Kconfig
@@ -56,6 +56,16 @@ config IRQ_PER_CPU
 	bool
 	default y
 
+config NR_IRQS
+	int "Number of virtual interrupt numbers"
+	range 32 512
+	default "512"
+	help
+	  This defines the number of virtual interrupt numbers the kernel
+	  can manage. Virtual interrupt numbers are what you see in
+	  /proc/interrupts. If you configure your system to have too few,
+	  drivers will fail to load or worse - handle with care.
+
 config STACKTRACE_SUPPORT
 	bool
 	default y
diff --git a/arch/powerpc/include/asm/irq.h b/arch/powerpc/include/asm/irq.h
index bbcd1aa..b83fcc8 100644
--- a/arch/powerpc/include/asm/irq.h
+++ b/arch/powerpc/include/asm/irq.h
@@ -34,8 +34,8 @@ extern atomic_t ppc_n_lost_interrupts;
  */
 #define NO_IRQ_IGNORE		((unsigned int)-1)
 
-/* Total number of virq in the platform (make it a CONFIG_* option ? */
-#define NR_IRQS		512
+/* Total number of virq in the platform */
+#define NR_IRQS		CONFIG_NR_IRQS
 
 /* Number of irqs reserved for the legacy controller */
 #define NUM_ISA_INTERRUPTS	16
-- 
1.6.2.1

^ permalink raw reply related	[flat|nested] 15+ messages in thread

* [PATCH 2/6] powerpc/pseries: Use irq_has_action() in eeh_disable_irq()
  2009-10-14  5:44 [PATCH 1/6] powerpc: Make NR_IRQS a CONFIG option Michael Ellerman
@ 2009-10-14  5:44 ` Michael Ellerman
  2009-10-14 18:33   ` Grant Likely
  2009-10-14  5:44 ` [PATCH 3/6] powerpc: Remove get_irq_desc() Michael Ellerman
                   ` (4 subsequent siblings)
  5 siblings, 1 reply; 15+ messages in thread
From: Michael Ellerman @ 2009-10-14  5:44 UTC (permalink / raw)
  To: linuxppc-dev

Rather than open-coding our own check, use irq_has_action()
to check if an irq has an action - ie. is "in use".

irq_has_action() doesn't take the descriptor lock, but it
shouldn't matter - we're just using it as an indicator
that the irq is in use. disable_irq_nosync() will take
the descriptor lock before doing anything also.

Signed-off-by: Michael Ellerman <michael@ellerman.id.au>
---
 arch/powerpc/platforms/pseries/eeh_driver.c |   18 +-----------------
 1 files changed, 1 insertions(+), 17 deletions(-)

diff --git a/arch/powerpc/platforms/pseries/eeh_driver.c b/arch/powerpc/platforms/pseries/eeh_driver.c
index 0e8db67..ef8e454 100644
--- a/arch/powerpc/platforms/pseries/eeh_driver.c
+++ b/arch/powerpc/platforms/pseries/eeh_driver.c
@@ -63,22 +63,6 @@ static void print_device_node_tree(struct pci_dn *pdn, int dent)
 }
 #endif
 
-/** 
- * irq_in_use - return true if this irq is being used 
- */
-static int irq_in_use(unsigned int irq)
-{
-	int rc = 0;
-	unsigned long flags;
-   struct irq_desc *desc = irq_desc + irq;
-
-	spin_lock_irqsave(&desc->lock, flags);
-	if (desc->action)
-		rc = 1;
-	spin_unlock_irqrestore(&desc->lock, flags);
-	return rc;
-}
-
 /**
  * eeh_disable_irq - disable interrupt for the recovering device
  */
@@ -93,7 +77,7 @@ static void eeh_disable_irq(struct pci_dev *dev)
 	if (dev->msi_enabled || dev->msix_enabled)
 		return;
 
-	if (!irq_in_use(dev->irq))
+	if (!irq_has_action(dev->irq))
 		return;
 
 	PCI_DN(dn)->eeh_mode |= EEH_MODE_IRQ_DISABLED;
-- 
1.6.2.1

^ permalink raw reply related	[flat|nested] 15+ messages in thread

* [PATCH 3/6] powerpc: Remove get_irq_desc()
  2009-10-14  5:44 [PATCH 1/6] powerpc: Make NR_IRQS a CONFIG option Michael Ellerman
  2009-10-14  5:44 ` [PATCH 2/6] powerpc/pseries: Use irq_has_action() in eeh_disable_irq() Michael Ellerman
@ 2009-10-14  5:44 ` Michael Ellerman
  2009-10-14 19:02   ` Grant Likely
  2009-10-14  5:44 ` [PATCH 4/6] powerpc: Make virq_debug_show() cope with sparse irq_descs Michael Ellerman
                   ` (3 subsequent siblings)
  5 siblings, 1 reply; 15+ messages in thread
From: Michael Ellerman @ 2009-10-14  5:44 UTC (permalink / raw)
  To: linuxppc-dev

get_irq_desc() is a powerpc-specific version of irq_to_desc(). That
is reason enough to remove it, but it also doesn't know about sparse
irq_desc support which irq_to_desc() does (when we enable it).

Signed-off-by: Michael Ellerman <michael@ellerman.id.au>
---
 arch/powerpc/include/asm/irq.h                  |    2 -
 arch/powerpc/kernel/crash.c                     |    2 +-
 arch/powerpc/kernel/irq.c                       |   28 ++++++++++++----------
 arch/powerpc/platforms/512x/mpc5121_ads_cpld.c  |    2 +-
 arch/powerpc/platforms/52xx/media5200.c         |    2 +-
 arch/powerpc/platforms/82xx/pq2ads-pci-pic.c    |    2 +-
 arch/powerpc/platforms/85xx/socrates_fpga_pic.c |    2 +-
 arch/powerpc/platforms/86xx/gef_pic.c           |    2 +-
 arch/powerpc/platforms/cell/beat_interrupt.c    |    2 +-
 arch/powerpc/platforms/cell/spider-pic.c        |    4 +-
 arch/powerpc/platforms/iseries/irq.c            |    2 +-
 arch/powerpc/platforms/powermac/pic.c           |    8 +++---
 arch/powerpc/platforms/pseries/xics.c           |    8 +++---
 arch/powerpc/sysdev/cpm1.c                      |    2 +-
 arch/powerpc/sysdev/cpm2_pic.c                  |   10 +++++---
 arch/powerpc/sysdev/fsl_msi.c                   |    2 +-
 arch/powerpc/sysdev/i8259.c                     |    4 +-
 arch/powerpc/sysdev/ipic.c                      |    2 +-
 arch/powerpc/sysdev/mpc8xx_pic.c                |    2 +-
 arch/powerpc/sysdev/mpic.c                      |   18 +++++++-------
 arch/powerpc/sysdev/mv64x60_pic.c               |    2 +-
 arch/powerpc/sysdev/qe_lib/qe_ic.c              |    4 +-
 arch/powerpc/sysdev/tsi108_pci.c                |    2 +-
 arch/powerpc/sysdev/uic.c                       |    6 ++--
 arch/powerpc/sysdev/xilinx_intc.c               |    2 +-
 25 files changed, 62 insertions(+), 60 deletions(-)

diff --git a/arch/powerpc/include/asm/irq.h b/arch/powerpc/include/asm/irq.h
index b83fcc8..03dc28c 100644
--- a/arch/powerpc/include/asm/irq.h
+++ b/arch/powerpc/include/asm/irq.h
@@ -17,8 +17,6 @@
 #include <asm/atomic.h>
 
 
-#define get_irq_desc(irq) (&irq_desc[(irq)])
-
 /* Define a way to iterate across irqs. */
 #define for_each_irq(i) \
 	for ((i) = 0; (i) < NR_IRQS; ++(i))
diff --git a/arch/powerpc/kernel/crash.c b/arch/powerpc/kernel/crash.c
index 0a8439a..6f4613d 100644
--- a/arch/powerpc/kernel/crash.c
+++ b/arch/powerpc/kernel/crash.c
@@ -373,7 +373,7 @@ void default_machine_crash_shutdown(struct pt_regs *regs)
 	hard_irq_disable();
 
 	for_each_irq(i) {
-		struct irq_desc *desc = irq_desc + i;
+		struct irq_desc *desc = irq_to_desc(i);
 
 		if (desc->status & IRQ_INPROGRESS)
 			desc->chip->eoi(i);
diff --git a/arch/powerpc/kernel/irq.c b/arch/powerpc/kernel/irq.c
index e5d1211..6563221 100644
--- a/arch/powerpc/kernel/irq.c
+++ b/arch/powerpc/kernel/irq.c
@@ -190,7 +190,7 @@ int show_interrupts(struct seq_file *p, void *v)
 	}
 
 	if (i < NR_IRQS) {
-		desc = get_irq_desc(i);
+		desc = irq_to_desc(i);
 		spin_lock_irqsave(&desc->lock, flags);
 		action = desc->action;
 		if (!action || !action->handler)
@@ -230,23 +230,25 @@ skip:
 #ifdef CONFIG_HOTPLUG_CPU
 void fixup_irqs(cpumask_t map)
 {
+	struct irq_desc *desc;
 	unsigned int irq;
 	static int warned;
 
 	for_each_irq(irq) {
 		cpumask_t mask;
 
-		if (irq_desc[irq].status & IRQ_PER_CPU)
+		desc = irq_to_desc(irq);
+		if (desc && desc->status & IRQ_PER_CPU)
 			continue;
 
-		cpumask_and(&mask, irq_desc[irq].affinity, &map);
+		cpumask_and(&mask, desc->affinity, &map);
 		if (any_online_cpu(mask) == NR_CPUS) {
 			printk("Breaking affinity for irq %i\n", irq);
 			mask = map;
 		}
-		if (irq_desc[irq].chip->set_affinity)
-			irq_desc[irq].chip->set_affinity(irq, &mask);
-		else if (irq_desc[irq].action && !(warned++))
+		if (desc->chip->set_affinity)
+			desc->chip->set_affinity(irq, &mask);
+		else if (desc->action && !(warned++))
 			printk("Cannot set affinity for irq %i\n", irq);
 	}
 
@@ -273,7 +275,7 @@ static inline void handle_one_irq(unsigned int irq)
 		return;
 	}
 
-	desc = irq_desc + irq;
+	desc = irq_to_desc(irq);
 	saved_sp_limit = current->thread.ksp_limit;
 
 	irqtp->task = curtp->task;
@@ -535,7 +537,7 @@ struct irq_host *irq_alloc_host(struct device_node *of_node,
 			smp_wmb();
 
 			/* Clear norequest flags */
-			get_irq_desc(i)->status &= ~IRQ_NOREQUEST;
+			irq_to_desc(i)->status &= ~IRQ_NOREQUEST;
 
 			/* Legacy flags are left to default at this point,
 			 * one can then use irq_create_mapping() to
@@ -602,7 +604,7 @@ static int irq_setup_virq(struct irq_host *host, unsigned int virq,
 			    irq_hw_number_t hwirq)
 {
 	/* Clear IRQ_NOREQUEST flag */
-	get_irq_desc(virq)->status &= ~IRQ_NOREQUEST;
+	irq_to_desc(virq)->status &= ~IRQ_NOREQUEST;
 
 	/* map it */
 	smp_wmb();
@@ -732,7 +734,7 @@ unsigned int irq_create_of_mapping(struct device_node *controller,
 
 	/* Set type if specified and different than the current one */
 	if (type != IRQ_TYPE_NONE &&
-	    type != (get_irq_desc(virq)->status & IRQF_TRIGGER_MASK))
+	    type != (irq_to_desc(virq)->status & IRQF_TRIGGER_MASK))
 		set_irq_type(virq, type);
 	return virq;
 }
@@ -804,7 +806,7 @@ void irq_dispose_mapping(unsigned int virq)
 	irq_map[virq].hwirq = host->inval_irq;
 
 	/* Set some flags */
-	get_irq_desc(virq)->status |= IRQ_NOREQUEST;
+	irq_to_desc(virq)->status |= IRQ_NOREQUEST;
 
 	/* Free it */
 	irq_free_virt(virq, 1);
@@ -1001,7 +1003,7 @@ void irq_early_init(void)
 	unsigned int i;
 
 	for (i = 0; i < NR_IRQS; i++)
-		get_irq_desc(i)->status |= IRQ_NOREQUEST;
+		irq_to_desc(i)->status |= IRQ_NOREQUEST;
 }
 
 /* We need to create the radix trees late */
@@ -1064,7 +1066,7 @@ static int virq_debug_show(struct seq_file *m, void *private)
 		      "chip name", "host name");
 
 	for (i = 1; i < NR_IRQS; i++) {
-		desc = get_irq_desc(i);
+		desc = irq_to_desc(i);
 		spin_lock_irqsave(&desc->lock, flags);
 
 		if (desc->action && desc->action->handler) {
diff --git a/arch/powerpc/platforms/512x/mpc5121_ads_cpld.c b/arch/powerpc/platforms/512x/mpc5121_ads_cpld.c
index a6ce805..cd70ee1 100644
--- a/arch/powerpc/platforms/512x/mpc5121_ads_cpld.c
+++ b/arch/powerpc/platforms/512x/mpc5121_ads_cpld.c
@@ -132,7 +132,7 @@ static int
 cpld_pic_host_map(struct irq_host *h, unsigned int virq,
 			     irq_hw_number_t hw)
 {
-	get_irq_desc(virq)->status |= IRQ_LEVEL;
+	irq_to_desc(virq)->status |= IRQ_LEVEL;
 	set_irq_chip_and_handler(virq, &cpld_pic, handle_level_irq);
 	return 0;
 }
diff --git a/arch/powerpc/platforms/52xx/media5200.c b/arch/powerpc/platforms/52xx/media5200.c
index 68e4f16..4780203 100644
--- a/arch/powerpc/platforms/52xx/media5200.c
+++ b/arch/powerpc/platforms/52xx/media5200.c
@@ -114,7 +114,7 @@ void media5200_irq_cascade(unsigned int virq, struct irq_desc *desc)
 static int media5200_irq_map(struct irq_host *h, unsigned int virq,
 			     irq_hw_number_t hw)
 {
-	struct irq_desc *desc = get_irq_desc(virq);
+	struct irq_desc *desc = irq_to_desc(virq);
 
 	pr_debug("%s: h=%p, virq=%i, hwirq=%i\n", __func__, h, virq, (int)hw);
 	set_irq_chip_data(virq, &media5200_irq);
diff --git a/arch/powerpc/platforms/82xx/pq2ads-pci-pic.c b/arch/powerpc/platforms/82xx/pq2ads-pci-pic.c
index 7ee979f..a682331 100644
--- a/arch/powerpc/platforms/82xx/pq2ads-pci-pic.c
+++ b/arch/powerpc/platforms/82xx/pq2ads-pci-pic.c
@@ -107,7 +107,7 @@ static void pq2ads_pci_irq_demux(unsigned int irq, struct irq_desc *desc)
 static int pci_pic_host_map(struct irq_host *h, unsigned int virq,
 			    irq_hw_number_t hw)
 {
-	get_irq_desc(virq)->status |= IRQ_LEVEL;
+	irq_to_desc(virq)->status |= IRQ_LEVEL;
 	set_irq_chip_data(virq, h->host_data);
 	set_irq_chip_and_handler(virq, &pq2ads_pci_ic, handle_level_irq);
 	return 0;
diff --git a/arch/powerpc/platforms/85xx/socrates_fpga_pic.c b/arch/powerpc/platforms/85xx/socrates_fpga_pic.c
index 60edf63..e59920a 100644
--- a/arch/powerpc/platforms/85xx/socrates_fpga_pic.c
+++ b/arch/powerpc/platforms/85xx/socrates_fpga_pic.c
@@ -245,7 +245,7 @@ static int socrates_fpga_pic_host_map(struct irq_host *h, unsigned int virq,
 		irq_hw_number_t hwirq)
 {
 	/* All interrupts are LEVEL sensitive */
-	get_irq_desc(virq)->status |= IRQ_LEVEL;
+	irq_to_desc(virq)->status |= IRQ_LEVEL;
 	set_irq_chip_and_handler(virq, &socrates_fpga_pic_chip,
 			handle_fasteoi_irq);
 
diff --git a/arch/powerpc/platforms/86xx/gef_pic.c b/arch/powerpc/platforms/86xx/gef_pic.c
index 50d0a2b..978d6cb 100644
--- a/arch/powerpc/platforms/86xx/gef_pic.c
+++ b/arch/powerpc/platforms/86xx/gef_pic.c
@@ -163,7 +163,7 @@ static int gef_pic_host_map(struct irq_host *h, unsigned int virq,
 			  irq_hw_number_t hwirq)
 {
 	/* All interrupts are LEVEL sensitive */
-	get_irq_desc(virq)->status |= IRQ_LEVEL;
+	irq_to_desc(virq)->status |= IRQ_LEVEL;
 	set_irq_chip_and_handler(virq, &gef_pic_chip, handle_level_irq);
 
 	return 0;
diff --git a/arch/powerpc/platforms/cell/beat_interrupt.c b/arch/powerpc/platforms/cell/beat_interrupt.c
index 7225484..4a2bbff 100644
--- a/arch/powerpc/platforms/cell/beat_interrupt.c
+++ b/arch/powerpc/platforms/cell/beat_interrupt.c
@@ -136,7 +136,7 @@ static void beatic_pic_host_unmap(struct irq_host *h, unsigned int virq)
 static int beatic_pic_host_map(struct irq_host *h, unsigned int virq,
 			       irq_hw_number_t hw)
 {
-	struct irq_desc *desc = get_irq_desc(virq);
+	struct irq_desc *desc = irq_to_desc(virq);
 	int64_t	err;
 
 	err = beat_construct_and_connect_irq_plug(virq, hw);
diff --git a/arch/powerpc/platforms/cell/spider-pic.c b/arch/powerpc/platforms/cell/spider-pic.c
index 4e56556..9dd63c5 100644
--- a/arch/powerpc/platforms/cell/spider-pic.c
+++ b/arch/powerpc/platforms/cell/spider-pic.c
@@ -102,7 +102,7 @@ static void spider_ack_irq(unsigned int virq)
 
 	/* Reset edge detection logic if necessary
 	 */
-	if (get_irq_desc(virq)->status & IRQ_LEVEL)
+	if (irq_to_desc(virq)->status & IRQ_LEVEL)
 		return;
 
 	/* Only interrupts 47 to 50 can be set to edge */
@@ -119,7 +119,7 @@ static int spider_set_irq_type(unsigned int virq, unsigned int type)
 	struct spider_pic *pic = spider_virq_to_pic(virq);
 	unsigned int hw = irq_map[virq].hwirq;
 	void __iomem *cfg = spider_get_irq_config(pic, hw);
-	struct irq_desc *desc = get_irq_desc(virq);
+	struct irq_desc *desc = irq_to_desc(virq);
 	u32 old_mask;
 	u32 ic;
 
diff --git a/arch/powerpc/platforms/iseries/irq.c b/arch/powerpc/platforms/iseries/irq.c
index 94f4447..f8446ea 100644
--- a/arch/powerpc/platforms/iseries/irq.c
+++ b/arch/powerpc/platforms/iseries/irq.c
@@ -214,7 +214,7 @@ void __init iSeries_activate_IRQs()
 	unsigned long flags;
 
 	for_each_irq (irq) {
-		struct irq_desc *desc = get_irq_desc(irq);
+		struct irq_desc *desc = irq_to_desc(irq);
 
 		if (desc && desc->chip && desc->chip->startup) {
 			spin_lock_irqsave(&desc->lock, flags);
diff --git a/arch/powerpc/platforms/powermac/pic.c b/arch/powerpc/platforms/powermac/pic.c
index d212006..484d21e 100644
--- a/arch/powerpc/platforms/powermac/pic.c
+++ b/arch/powerpc/platforms/powermac/pic.c
@@ -152,12 +152,12 @@ static unsigned int pmac_startup_irq(unsigned int virq)
         unsigned long bit = 1UL << (src & 0x1f);
         int i = src >> 5;
 
-  	spin_lock_irqsave(&pmac_pic_lock, flags);
-	if ((irq_desc[virq].status & IRQ_LEVEL) == 0)
+	spin_lock_irqsave(&pmac_pic_lock, flags);
+	if ((irq_to_desc(virq)->status & IRQ_LEVEL) == 0)
 		out_le32(&pmac_irq_hw[i]->ack, bit);
         __set_bit(src, ppc_cached_irq_mask);
         __pmac_set_irq_mask(src, 0);
-  	spin_unlock_irqrestore(&pmac_pic_lock, flags);
+	spin_unlock_irqrestore(&pmac_pic_lock, flags);
 
 	return 0;
 }
@@ -285,7 +285,7 @@ static int pmac_pic_host_match(struct irq_host *h, struct device_node *node)
 static int pmac_pic_host_map(struct irq_host *h, unsigned int virq,
 			     irq_hw_number_t hw)
 {
-	struct irq_desc *desc = get_irq_desc(virq);
+	struct irq_desc *desc = irq_to_desc(virq);
 	int level;
 
 	if (hw >= max_irqs)
diff --git a/arch/powerpc/platforms/pseries/xics.c b/arch/powerpc/platforms/pseries/xics.c
index 419f8a6..75935ae 100644
--- a/arch/powerpc/platforms/pseries/xics.c
+++ b/arch/powerpc/platforms/pseries/xics.c
@@ -156,7 +156,7 @@ static int get_irq_server(unsigned int virq, unsigned int strict_check)
 	cpumask_t cpumask;
 	cpumask_t tmp = CPU_MASK_NONE;
 
-	cpumask_copy(&cpumask, irq_desc[virq].affinity);
+	cpumask_copy(&cpumask, irq_to_desc(virq)->affinity);
 	if (!distribute_irqs)
 		return default_server;
 
@@ -419,7 +419,7 @@ static int xics_host_map(struct irq_host *h, unsigned int virq,
 	/* Insert the interrupt mapping into the radix tree for fast lookup */
 	irq_radix_revmap_insert(xics_host, virq, hw);
 
-	get_irq_desc(virq)->status |= IRQ_LEVEL;
+	irq_to_desc(virq)->status |= IRQ_LEVEL;
 	set_irq_chip_and_handler(virq, xics_irq_chip, handle_fasteoi_irq);
 	return 0;
 }
@@ -843,7 +843,7 @@ void xics_migrate_irqs_away(void)
 		/* We need to get IPIs still. */
 		if (irq == XICS_IPI || irq == XICS_IRQ_SPURIOUS)
 			continue;
-		desc = get_irq_desc(virq);
+		desc = irq_to_desc(virq);
 
 		/* We only need to migrate enabled IRQS */
 		if (desc == NULL || desc->chip == NULL
@@ -872,7 +872,7 @@ void xics_migrate_irqs_away(void)
 		       virq, cpu);
 
 		/* Reset affinity to all cpus */
-		cpumask_setall(irq_desc[virq].affinity);
+		cpumask_setall(irq_to_desc(virq)->affinity);
 		desc->chip->set_affinity(virq, cpu_all_mask);
 unlock:
 		spin_unlock_irqrestore(&desc->lock, flags);
diff --git a/arch/powerpc/sysdev/cpm1.c b/arch/powerpc/sysdev/cpm1.c
index 82424cd..5235373 100644
--- a/arch/powerpc/sysdev/cpm1.c
+++ b/arch/powerpc/sysdev/cpm1.c
@@ -102,7 +102,7 @@ static int cpm_pic_host_map(struct irq_host *h, unsigned int virq,
 {
 	pr_debug("cpm_pic_host_map(%d, 0x%lx)\n", virq, hw);
 
-	get_irq_desc(virq)->status |= IRQ_LEVEL;
+	irq_to_desc(virq)->status |= IRQ_LEVEL;
 	set_irq_chip_and_handler(virq, &cpm_pic, handle_fasteoi_irq);
 	return 0;
 }
diff --git a/arch/powerpc/sysdev/cpm2_pic.c b/arch/powerpc/sysdev/cpm2_pic.c
index 78f1f7c..722cf72 100644
--- a/arch/powerpc/sysdev/cpm2_pic.c
+++ b/arch/powerpc/sysdev/cpm2_pic.c
@@ -115,11 +115,13 @@ static void cpm2_ack(unsigned int virq)
 
 static void cpm2_end_irq(unsigned int virq)
 {
+	struct irq_desc *desc;
 	int	bit, word;
 	unsigned int irq_nr = virq_to_hw(virq);
 
-	if (!(irq_desc[irq_nr].status & (IRQ_DISABLED|IRQ_INPROGRESS))
-			&& irq_desc[irq_nr].action) {
+	desc = irq_to_desc(irq_nr);
+	if (!(desc->status & (IRQ_DISABLED|IRQ_INPROGRESS))
+			&& desc->action) {
 
 		bit = irq_to_siubit[irq_nr];
 		word = irq_to_siureg[irq_nr];
@@ -138,7 +140,7 @@ static void cpm2_end_irq(unsigned int virq)
 static int cpm2_set_irq_type(unsigned int virq, unsigned int flow_type)
 {
 	unsigned int src = virq_to_hw(virq);
-	struct irq_desc *desc = get_irq_desc(virq);
+	struct irq_desc *desc = irq_to_desc(virq);
 	unsigned int vold, vnew, edibit;
 
 	if (flow_type == IRQ_TYPE_NONE)
@@ -210,7 +212,7 @@ static int cpm2_pic_host_map(struct irq_host *h, unsigned int virq,
 {
 	pr_debug("cpm2_pic_host_map(%d, 0x%lx)\n", virq, hw);
 
-	get_irq_desc(virq)->status |= IRQ_LEVEL;
+	irq_to_desc(virq)->status |= IRQ_LEVEL;
 	set_irq_chip_and_handler(virq, &cpm2_pic, handle_level_irq);
 	return 0;
 }
diff --git a/arch/powerpc/sysdev/fsl_msi.c b/arch/powerpc/sysdev/fsl_msi.c
index da38a1f..7174374 100644
--- a/arch/powerpc/sysdev/fsl_msi.c
+++ b/arch/powerpc/sysdev/fsl_msi.c
@@ -55,7 +55,7 @@ static int fsl_msi_host_map(struct irq_host *h, unsigned int virq,
 {
 	struct irq_chip *chip = &fsl_msi_chip;
 
-	get_irq_desc(virq)->status |= IRQ_TYPE_EDGE_FALLING;
+	irq_to_desc(virq)->status |= IRQ_TYPE_EDGE_FALLING;
 
 	set_irq_chip_and_handler(virq, chip, handle_edge_irq);
 
diff --git a/arch/powerpc/sysdev/i8259.c b/arch/powerpc/sysdev/i8259.c
index a96584a..78ed945 100644
--- a/arch/powerpc/sysdev/i8259.c
+++ b/arch/powerpc/sysdev/i8259.c
@@ -175,12 +175,12 @@ static int i8259_host_map(struct irq_host *h, unsigned int virq,
 
 	/* We block the internal cascade */
 	if (hw == 2)
-		get_irq_desc(virq)->status |= IRQ_NOREQUEST;
+		irq_to_desc(virq)->status |= IRQ_NOREQUEST;
 
 	/* We use the level handler only for now, we might want to
 	 * be more cautious here but that works for now
 	 */
-	get_irq_desc(virq)->status |= IRQ_LEVEL;
+	irq_to_desc(virq)->status |= IRQ_LEVEL;
 	set_irq_chip_and_handler(virq, &i8259_pic, handle_level_irq);
 	return 0;
 }
diff --git a/arch/powerpc/sysdev/ipic.c b/arch/powerpc/sysdev/ipic.c
index cb7689c..f042c1d 100644
--- a/arch/powerpc/sysdev/ipic.c
+++ b/arch/powerpc/sysdev/ipic.c
@@ -605,7 +605,7 @@ static int ipic_set_irq_type(unsigned int virq, unsigned int flow_type)
 {
 	struct ipic *ipic = ipic_from_irq(virq);
 	unsigned int src = ipic_irq_to_hw(virq);
-	struct irq_desc *desc = get_irq_desc(virq);
+	struct irq_desc *desc = irq_to_desc(virq);
 	unsigned int vold, vnew, edibit;
 
 	if (flow_type == IRQ_TYPE_NONE)
diff --git a/arch/powerpc/sysdev/mpc8xx_pic.c b/arch/powerpc/sysdev/mpc8xx_pic.c
index 5d2d552..0117958 100644
--- a/arch/powerpc/sysdev/mpc8xx_pic.c
+++ b/arch/powerpc/sysdev/mpc8xx_pic.c
@@ -72,7 +72,7 @@ static void mpc8xx_end_irq(unsigned int virq)
 
 static int mpc8xx_set_irq_type(unsigned int virq, unsigned int flow_type)
 {
-	struct irq_desc *desc = get_irq_desc(virq);
+	struct irq_desc *desc = irq_to_desc(virq);
 
 	desc->status &= ~(IRQ_TYPE_SENSE_MASK | IRQ_LEVEL);
 	desc->status |= flow_type & IRQ_TYPE_SENSE_MASK;
diff --git a/arch/powerpc/sysdev/mpic.c b/arch/powerpc/sysdev/mpic.c
index 30c44e6..4fd57ab 100644
--- a/arch/powerpc/sysdev/mpic.c
+++ b/arch/powerpc/sysdev/mpic.c
@@ -572,7 +572,7 @@ static int irq_choose_cpu(unsigned int virt_irq)
 	cpumask_t mask;
 	int cpuid;
 
-	cpumask_copy(&mask, irq_desc[virt_irq].affinity);
+	cpumask_copy(&mask, irq_to_desc(virt_irq)->affinity);
 	if (cpus_equal(mask, CPU_MASK_ALL)) {
 		static int irq_rover;
 		static DEFINE_SPINLOCK(irq_rover_lock);
@@ -621,7 +621,7 @@ static struct mpic *mpic_find(unsigned int irq)
 	if (irq < NUM_ISA_INTERRUPTS)
 		return NULL;
 
-	return irq_desc[irq].chip_data;
+	return irq_to_desc(irq)->chip_data;
 }
 
 /* Determine if the linux irq is an IPI */
@@ -648,14 +648,14 @@ static inline u32 mpic_physmask(u32 cpumask)
 /* Get the mpic structure from the IPI number */
 static inline struct mpic * mpic_from_ipi(unsigned int ipi)
 {
-	return irq_desc[ipi].chip_data;
+	return irq_to_desc(ipi)->chip_data;
 }
 #endif
 
 /* Get the mpic structure from the irq number */
 static inline struct mpic * mpic_from_irq(unsigned int irq)
 {
-	return irq_desc[irq].chip_data;
+	return irq_to_desc(irq)->chip_data;
 }
 
 /* Send an EOI */
@@ -735,7 +735,7 @@ static void mpic_unmask_ht_irq(unsigned int irq)
 
 	mpic_unmask_irq(irq);
 
-	if (irq_desc[irq].status & IRQ_LEVEL)
+	if (irq_to_desc(irq)->status & IRQ_LEVEL)
 		mpic_ht_end_irq(mpic, src);
 }
 
@@ -745,7 +745,7 @@ static unsigned int mpic_startup_ht_irq(unsigned int irq)
 	unsigned int src = mpic_irq_to_hw(irq);
 
 	mpic_unmask_irq(irq);
-	mpic_startup_ht_interrupt(mpic, src, irq_desc[irq].status);
+	mpic_startup_ht_interrupt(mpic, src, irq_to_desc(irq)->status);
 
 	return 0;
 }
@@ -755,7 +755,7 @@ static void mpic_shutdown_ht_irq(unsigned int irq)
 	struct mpic *mpic = mpic_from_irq(irq);
 	unsigned int src = mpic_irq_to_hw(irq);
 
-	mpic_shutdown_ht_interrupt(mpic, src, irq_desc[irq].status);
+	mpic_shutdown_ht_interrupt(mpic, src, irq_to_desc(irq)->status);
 	mpic_mask_irq(irq);
 }
 
@@ -772,7 +772,7 @@ static void mpic_end_ht_irq(unsigned int irq)
 	 * latched another edge interrupt coming in anyway
 	 */
 
-	if (irq_desc[irq].status & IRQ_LEVEL)
+	if (irq_to_desc(irq)->status & IRQ_LEVEL)
 		mpic_ht_end_irq(mpic, src);
 	mpic_eoi(mpic);
 }
@@ -856,7 +856,7 @@ int mpic_set_irq_type(unsigned int virq, unsigned int flow_type)
 {
 	struct mpic *mpic = mpic_from_irq(virq);
 	unsigned int src = mpic_irq_to_hw(virq);
-	struct irq_desc *desc = get_irq_desc(virq);
+	struct irq_desc *desc = irq_to_desc(virq);
 	unsigned int vecpri, vold, vnew;
 
 	DBG("mpic: set_irq_type(mpic:@%p,virq:%d,src:0x%x,type:0x%x)\n",
diff --git a/arch/powerpc/sysdev/mv64x60_pic.c b/arch/powerpc/sysdev/mv64x60_pic.c
index 2aa4ed0..485b924 100644
--- a/arch/powerpc/sysdev/mv64x60_pic.c
+++ b/arch/powerpc/sysdev/mv64x60_pic.c
@@ -213,7 +213,7 @@ static int mv64x60_host_map(struct irq_host *h, unsigned int virq,
 {
 	int level1;
 
-	get_irq_desc(virq)->status |= IRQ_LEVEL;
+	irq_to_desc(virq)->status |= IRQ_LEVEL;
 
 	level1 = (hwirq & MV64x60_LEVEL1_MASK) >> MV64x60_LEVEL1_OFFSET;
 	BUG_ON(level1 > MV64x60_LEVEL1_GPP);
diff --git a/arch/powerpc/sysdev/qe_lib/qe_ic.c b/arch/powerpc/sysdev/qe_lib/qe_ic.c
index 3faa42e..fc09874 100644
--- a/arch/powerpc/sysdev/qe_lib/qe_ic.c
+++ b/arch/powerpc/sysdev/qe_lib/qe_ic.c
@@ -189,7 +189,7 @@ static inline void qe_ic_write(volatile __be32  __iomem * base, unsigned int reg
 
 static inline struct qe_ic *qe_ic_from_irq(unsigned int virq)
 {
-	return irq_desc[virq].chip_data;
+	return irq_to_desc(virq)->chip_data;
 }
 
 #define virq_to_hw(virq)	((unsigned int)irq_map[virq].hwirq)
@@ -263,7 +263,7 @@ static int qe_ic_host_map(struct irq_host *h, unsigned int virq,
 	chip = &qe_ic->hc_irq;
 
 	set_irq_chip_data(virq, qe_ic);
-	get_irq_desc(virq)->status |= IRQ_LEVEL;
+	irq_to_desc(virq)->status |= IRQ_LEVEL;
 
 	set_irq_chip_and_handler(virq, chip, handle_level_irq);
 
diff --git a/arch/powerpc/sysdev/tsi108_pci.c b/arch/powerpc/sysdev/tsi108_pci.c
index cf244a4..02f6009 100644
--- a/arch/powerpc/sysdev/tsi108_pci.c
+++ b/arch/powerpc/sysdev/tsi108_pci.c
@@ -398,7 +398,7 @@ static int pci_irq_host_map(struct irq_host *h, unsigned int virq,
 	DBG("%s(%d, 0x%lx)\n", __func__, virq, hw);
 	if ((virq >= 1) && (virq <= 4)){
 		irq = virq + IRQ_PCI_INTAD_BASE - 1;
-		get_irq_desc(irq)->status |= IRQ_LEVEL;
+		irq_to_desc(irq)->status |= IRQ_LEVEL;
 		set_irq_chip(irq, &tsi108_pci_irq);
 	}
 	return 0;
diff --git a/arch/powerpc/sysdev/uic.c b/arch/powerpc/sysdev/uic.c
index 466ce9a..cf97935 100644
--- a/arch/powerpc/sysdev/uic.c
+++ b/arch/powerpc/sysdev/uic.c
@@ -57,7 +57,7 @@ struct uic {
 
 static void uic_unmask_irq(unsigned int virq)
 {
-	struct irq_desc *desc = get_irq_desc(virq);
+	struct irq_desc *desc = irq_to_desc(virq);
 	struct uic *uic = get_irq_chip_data(virq);
 	unsigned int src = uic_irq_to_hw(virq);
 	unsigned long flags;
@@ -101,7 +101,7 @@ static void uic_ack_irq(unsigned int virq)
 
 static void uic_mask_ack_irq(unsigned int virq)
 {
-	struct irq_desc *desc = get_irq_desc(virq);
+	struct irq_desc *desc = irq_to_desc(virq);
 	struct uic *uic = get_irq_chip_data(virq);
 	unsigned int src = uic_irq_to_hw(virq);
 	unsigned long flags;
@@ -129,7 +129,7 @@ static int uic_set_irq_type(unsigned int virq, unsigned int flow_type)
 {
 	struct uic *uic = get_irq_chip_data(virq);
 	unsigned int src = uic_irq_to_hw(virq);
-	struct irq_desc *desc = get_irq_desc(virq);
+	struct irq_desc *desc = irq_to_desc(virq);
 	unsigned long flags;
 	int trigger, polarity;
 	u32 tr, pr, mask;
diff --git a/arch/powerpc/sysdev/xilinx_intc.c b/arch/powerpc/sysdev/xilinx_intc.c
index 40edad5..ab74371 100644
--- a/arch/powerpc/sysdev/xilinx_intc.c
+++ b/arch/powerpc/sysdev/xilinx_intc.c
@@ -79,7 +79,7 @@ static void xilinx_intc_mask(unsigned int virq)
 
 static int xilinx_intc_set_type(unsigned int virq, unsigned int flow_type)
 {
-	struct irq_desc *desc = get_irq_desc(virq);
+	struct irq_desc *desc = irq_to_desc(virq);
 
 	desc->status &= ~(IRQ_TYPE_SENSE_MASK | IRQ_LEVEL);
 	desc->status |= flow_type & IRQ_TYPE_SENSE_MASK;
-- 
1.6.2.1

^ permalink raw reply related	[flat|nested] 15+ messages in thread

* [PATCH 4/6] powerpc: Make virq_debug_show() cope with sparse irq_descs
  2009-10-14  5:44 [PATCH 1/6] powerpc: Make NR_IRQS a CONFIG option Michael Ellerman
  2009-10-14  5:44 ` [PATCH 2/6] powerpc/pseries: Use irq_has_action() in eeh_disable_irq() Michael Ellerman
  2009-10-14  5:44 ` [PATCH 3/6] powerpc: Remove get_irq_desc() Michael Ellerman
@ 2009-10-14  5:44 ` Michael Ellerman
  2009-10-14 18:34   ` Grant Likely
  2009-10-14  5:45 ` [PATCH 5/6] powerpc: Rearrange and fix show_interrupts() for " Michael Ellerman
                   ` (2 subsequent siblings)
  5 siblings, 1 reply; 15+ messages in thread
From: Michael Ellerman @ 2009-10-14  5:44 UTC (permalink / raw)
  To: linuxppc-dev

Signed-off-by: Michael Ellerman <michael@ellerman.id.au>
---
 arch/powerpc/kernel/irq.c |    5 ++++-
 1 files changed, 4 insertions(+), 1 deletions(-)

diff --git a/arch/powerpc/kernel/irq.c b/arch/powerpc/kernel/irq.c
index 6563221..baa49eb 100644
--- a/arch/powerpc/kernel/irq.c
+++ b/arch/powerpc/kernel/irq.c
@@ -1065,8 +1065,11 @@ static int virq_debug_show(struct seq_file *m, void *private)
 	seq_printf(m, "%-5s  %-7s  %-15s  %s\n", "virq", "hwirq",
 		      "chip name", "host name");
 
-	for (i = 1; i < NR_IRQS; i++) {
+	for (i = 1; i < nr_irqs; i++) {
 		desc = irq_to_desc(i);
+		if (!desc)
+			continue;
+
 		spin_lock_irqsave(&desc->lock, flags);
 
 		if (desc->action && desc->action->handler) {
-- 
1.6.2.1

^ permalink raw reply related	[flat|nested] 15+ messages in thread

* [PATCH 5/6] powerpc: Rearrange and fix show_interrupts() for sparse irq_descs
  2009-10-14  5:44 [PATCH 1/6] powerpc: Make NR_IRQS a CONFIG option Michael Ellerman
                   ` (2 preceding siblings ...)
  2009-10-14  5:44 ` [PATCH 4/6] powerpc: Make virq_debug_show() cope with sparse irq_descs Michael Ellerman
@ 2009-10-14  5:45 ` Michael Ellerman
  2009-10-14 18:37   ` Grant Likely
  2009-10-14  5:45 ` [PATCH 6/6] powerpc: Enable sparse irq_descs on powerpc Michael Ellerman
  2009-10-14 18:59 ` [PATCH 1/6] powerpc: Make NR_IRQS a CONFIG option Grant Likely
  5 siblings, 1 reply; 15+ messages in thread
From: Michael Ellerman @ 2009-10-14  5:45 UTC (permalink / raw)
  To: linuxppc-dev

Move the default case out of the if, ie. when we're just displaying
an irq. And consolidate all the odd cases at the top, ie. printing
the header and footer.

And in the process cope with sparse irq_descs.

Signed-off-by: Michael Ellerman <michael@ellerman.id.au>
---
 arch/powerpc/kernel/irq.c |   64 ++++++++++++++++++++++++++-------------------
 1 files changed, 37 insertions(+), 27 deletions(-)

diff --git a/arch/powerpc/kernel/irq.c b/arch/powerpc/kernel/irq.c
index baa49eb..63e27d5 100644
--- a/arch/powerpc/kernel/irq.c
+++ b/arch/powerpc/kernel/irq.c
@@ -187,33 +187,7 @@ int show_interrupts(struct seq_file *p, void *v)
 		for_each_online_cpu(j)
 			seq_printf(p, "CPU%d       ", j);
 		seq_putc(p, '\n');
-	}
-
-	if (i < NR_IRQS) {
-		desc = irq_to_desc(i);
-		spin_lock_irqsave(&desc->lock, flags);
-		action = desc->action;
-		if (!action || !action->handler)
-			goto skip;
-		seq_printf(p, "%3d: ", i);
-#ifdef CONFIG_SMP
-		for_each_online_cpu(j)
-			seq_printf(p, "%10u ", kstat_irqs_cpu(i, j));
-#else
-		seq_printf(p, "%10u ", kstat_irqs(i));
-#endif /* CONFIG_SMP */
-		if (desc->chip)
-			seq_printf(p, " %s ", desc->chip->typename);
-		else
-			seq_puts(p, "  None      ");
-		seq_printf(p, "%s", (desc->status & IRQ_LEVEL) ? "Level " : "Edge  ");
-		seq_printf(p, "    %s", action->name);
-		for (action = action->next; action; action = action->next)
-			seq_printf(p, ", %s", action->name);
-		seq_putc(p, '\n');
-skip:
-		spin_unlock_irqrestore(&desc->lock, flags);
-	} else if (i == NR_IRQS) {
+	} else if (i == nr_irqs) {
 #if defined(CONFIG_PPC32) && defined(CONFIG_TAU_INT)
 		if (tau_initialized){
 			seq_puts(p, "TAU: ");
@@ -223,7 +197,43 @@ skip:
 		}
 #endif /* CONFIG_PPC32 && CONFIG_TAU_INT*/
 		seq_printf(p, "BAD: %10u\n", ppc_spurious_interrupts);
+
+		return 0;
 	}
+
+	desc = irq_to_desc(i);
+	if (!desc)
+		return 0;
+
+	spin_lock_irqsave(&desc->lock, flags);
+
+	action = desc->action;
+	if (!action || !action->handler)
+		goto skip;
+
+	seq_printf(p, "%3d: ", i);
+#ifdef CONFIG_SMP
+	for_each_online_cpu(j)
+		seq_printf(p, "%10u ", kstat_irqs_cpu(i, j));
+#else
+	seq_printf(p, "%10u ", kstat_irqs(i));
+#endif /* CONFIG_SMP */
+
+	if (desc->chip)
+		seq_printf(p, " %s ", desc->chip->typename);
+	else
+		seq_puts(p, "  None      ");
+
+	seq_printf(p, "%s", (desc->status & IRQ_LEVEL) ? "Level " : "Edge  ");
+	seq_printf(p, "    %s", action->name);
+
+	for (action = action->next; action; action = action->next)
+		seq_printf(p, ", %s", action->name);
+	seq_putc(p, '\n');
+
+skip:
+	spin_unlock_irqrestore(&desc->lock, flags);
+
 	return 0;
 }
 
-- 
1.6.2.1

^ permalink raw reply related	[flat|nested] 15+ messages in thread

* [PATCH 6/6] powerpc: Enable sparse irq_descs on powerpc
  2009-10-14  5:44 [PATCH 1/6] powerpc: Make NR_IRQS a CONFIG option Michael Ellerman
                   ` (3 preceding siblings ...)
  2009-10-14  5:45 ` [PATCH 5/6] powerpc: Rearrange and fix show_interrupts() for " Michael Ellerman
@ 2009-10-14  5:45 ` Michael Ellerman
  2009-10-14 18:44   ` Grant Likely
  2009-10-14 18:59 ` [PATCH 1/6] powerpc: Make NR_IRQS a CONFIG option Grant Likely
  5 siblings, 1 reply; 15+ messages in thread
From: Michael Ellerman @ 2009-10-14  5:45 UTC (permalink / raw)
  To: linuxppc-dev

Defining CONFIG_SPARSE_IRQ enables generic code that gets rid of the
static irq_desc array, and replaces it with an array of pointers to
irq_descs.

It also allows node local allocation of irq_descs, however we
currently don't have the information available to do that, so we just
allocate them on all on node 0.

Signed-off-by: Michael Ellerman <michael@ellerman.id.au>
---
 arch/powerpc/Kconfig            |   13 ++++++++++++
 arch/powerpc/include/asm/irq.h  |    3 ++
 arch/powerpc/kernel/irq.c       |   40 ++++++++++++++++++++++++++++++++------
 arch/powerpc/kernel/ppc_ksyms.c |    1 -
 arch/powerpc/kernel/setup_64.c  |    5 ----
 5 files changed, 49 insertions(+), 13 deletions(-)

diff --git a/arch/powerpc/Kconfig b/arch/powerpc/Kconfig
index 2230e75..825d889 100644
--- a/arch/powerpc/Kconfig
+++ b/arch/powerpc/Kconfig
@@ -388,6 +388,19 @@ config IRQ_ALL_CPUS
 	  CPU.  Generally saying Y is safe, although some problems have been
 	  reported with SMP Power Macintoshes with this option enabled.
 
+config SPARSE_IRQ
+	bool "Support sparse irq numbering"
+	default y
+	help
+	  This enables support for sparse irqs. This is useful for distro
+	  kernels that want to define a high CONFIG_NR_CPUS value but still
+	  want to have low kernel memory footprint on smaller machines.
+
+	  ( Sparse IRQs can also be beneficial on NUMA boxes, as they spread
+	    out the irq_desc[] array in a more NUMA-friendly way. )
+
+	  If you don't know what to do here, say Y.
+
 config NUMA
 	bool "NUMA support"
 	depends on PPC64
diff --git a/arch/powerpc/include/asm/irq.h b/arch/powerpc/include/asm/irq.h
index 03dc28c..c85a32f 100644
--- a/arch/powerpc/include/asm/irq.h
+++ b/arch/powerpc/include/asm/irq.h
@@ -38,6 +38,9 @@ extern atomic_t ppc_n_lost_interrupts;
 /* Number of irqs reserved for the legacy controller */
 #define NUM_ISA_INTERRUPTS	16
 
+/* Same thing, used by the generic IRQ code */
+#define NR_IRQS_LEGACY		NUM_ISA_INTERRUPTS
+
 /* This type is the placeholder for a hardware interrupt number. It has to
  * be big enough to enclose whatever representation is used by a given
  * platform.
diff --git a/arch/powerpc/kernel/irq.c b/arch/powerpc/kernel/irq.c
index 63e27d5..eba5392 100644
--- a/arch/powerpc/kernel/irq.c
+++ b/arch/powerpc/kernel/irq.c
@@ -85,7 +85,10 @@ extern int tau_interrupts(int);
 #endif /* CONFIG_PPC32 */
 
 #ifdef CONFIG_PPC64
+
+#ifndef CONFIG_SPARSE_IRQ
 EXPORT_SYMBOL(irq_desc);
+#endif
 
 int distribute_irqs = 1;
 
@@ -613,8 +616,16 @@ void irq_set_virq_count(unsigned int count)
 static int irq_setup_virq(struct irq_host *host, unsigned int virq,
 			    irq_hw_number_t hwirq)
 {
+	struct irq_desc *desc;
+
+	desc = irq_to_desc_alloc_node(virq, 0);
+	if (!desc) {
+		pr_debug("irq: -> allocating desc failed\n");
+		goto error;
+	}
+
 	/* Clear IRQ_NOREQUEST flag */
-	irq_to_desc(virq)->status &= ~IRQ_NOREQUEST;
+	desc->status &= ~IRQ_NOREQUEST;
 
 	/* map it */
 	smp_wmb();
@@ -623,11 +634,14 @@ static int irq_setup_virq(struct irq_host *host, unsigned int virq,
 
 	if (host->ops->map(host, virq, hwirq)) {
 		pr_debug("irq: -> mapping failed, freeing\n");
-		irq_free_virt(virq, 1);
-		return -1;
+		goto error;
 	}
 
 	return 0;
+
+error:
+	irq_free_virt(virq, 1);
+	return -1;
 }
 
 unsigned int irq_create_direct_mapping(struct irq_host *host)
@@ -1008,12 +1022,24 @@ void irq_free_virt(unsigned int virq, unsigned int count)
 	spin_unlock_irqrestore(&irq_big_lock, flags);
 }
 
-void irq_early_init(void)
+int arch_early_irq_init(void)
 {
-	unsigned int i;
+	struct irq_desc *desc;
+	int i;
 
-	for (i = 0; i < NR_IRQS; i++)
-		irq_to_desc(i)->status |= IRQ_NOREQUEST;
+	for (i = 0; i < NR_IRQS; i++) {
+		desc = irq_to_desc(i);
+		if (desc)
+			desc->status |= IRQ_NOREQUEST;
+	}
+
+	return 0;
+}
+
+int arch_init_chip_data(struct irq_desc *desc, int node)
+{
+	desc->status |= IRQ_NOREQUEST;
+	return 0;
 }
 
 /* We need to create the radix trees late */
diff --git a/arch/powerpc/kernel/ppc_ksyms.c b/arch/powerpc/kernel/ppc_ksyms.c
index c8b27bb..07115d6 100644
--- a/arch/powerpc/kernel/ppc_ksyms.c
+++ b/arch/powerpc/kernel/ppc_ksyms.c
@@ -162,7 +162,6 @@ EXPORT_SYMBOL(screen_info);
 
 #ifdef CONFIG_PPC32
 EXPORT_SYMBOL(timer_interrupt);
-EXPORT_SYMBOL(irq_desc);
 EXPORT_SYMBOL(tb_ticks_per_jiffy);
 EXPORT_SYMBOL(cacheable_memcpy);
 EXPORT_SYMBOL(cacheable_memzero);
diff --git a/arch/powerpc/kernel/setup_64.c b/arch/powerpc/kernel/setup_64.c
index 797ea95..8e5ec92 100644
--- a/arch/powerpc/kernel/setup_64.c
+++ b/arch/powerpc/kernel/setup_64.c
@@ -357,11 +357,6 @@ void __init setup_system(void)
 	 */
 	initialize_cache_info();
 
-	/*
-	 * Initialize irq remapping subsystem
-	 */
-	irq_early_init();
-
 #ifdef CONFIG_PPC_RTAS
 	/*
 	 * Initialize RTAS if available
-- 
1.6.2.1

^ permalink raw reply related	[flat|nested] 15+ messages in thread

* Re: [PATCH 2/6] powerpc/pseries: Use irq_has_action() in eeh_disable_irq()
  2009-10-14  5:44 ` [PATCH 2/6] powerpc/pseries: Use irq_has_action() in eeh_disable_irq() Michael Ellerman
@ 2009-10-14 18:33   ` Grant Likely
  0 siblings, 0 replies; 15+ messages in thread
From: Grant Likely @ 2009-10-14 18:33 UTC (permalink / raw)
  To: Michael Ellerman; +Cc: linuxppc-dev

On Tue, Oct 13, 2009 at 11:44 PM, Michael Ellerman
<michael@ellerman.id.au> wrote:
> Rather than open-coding our own check, use irq_has_action()
> to check if an irq has an action - ie. is "in use".
>
> irq_has_action() doesn't take the descriptor lock, but it
> shouldn't matter - we're just using it as an indicator
> that the irq is in use. disable_irq_nosync() will take
> the descriptor lock before doing anything also.
>
> Signed-off-by: Michael Ellerman <michael@ellerman.id.au>

Looks good to me
Acked-by: Grant Likely <grant.likely@secretlab.ca>

> ---
> =A0arch/powerpc/platforms/pseries/eeh_driver.c | =A0 18 +----------------=
-
> =A01 files changed, 1 insertions(+), 17 deletions(-)
>
> diff --git a/arch/powerpc/platforms/pseries/eeh_driver.c b/arch/powerpc/p=
latforms/pseries/eeh_driver.c
> index 0e8db67..ef8e454 100644
> --- a/arch/powerpc/platforms/pseries/eeh_driver.c
> +++ b/arch/powerpc/platforms/pseries/eeh_driver.c
> @@ -63,22 +63,6 @@ static void print_device_node_tree(struct pci_dn *pdn,=
 int dent)
> =A0}
> =A0#endif
>
> -/**
> - * irq_in_use - return true if this irq is being used
> - */
> -static int irq_in_use(unsigned int irq)
> -{
> - =A0 =A0 =A0 int rc =3D 0;
> - =A0 =A0 =A0 unsigned long flags;
> - =A0 struct irq_desc *desc =3D irq_desc + irq;
> -
> - =A0 =A0 =A0 spin_lock_irqsave(&desc->lock, flags);
> - =A0 =A0 =A0 if (desc->action)
> - =A0 =A0 =A0 =A0 =A0 =A0 =A0 rc =3D 1;
> - =A0 =A0 =A0 spin_unlock_irqrestore(&desc->lock, flags);
> - =A0 =A0 =A0 return rc;
> -}
> -
> =A0/**
> =A0* eeh_disable_irq - disable interrupt for the recovering device
> =A0*/
> @@ -93,7 +77,7 @@ static void eeh_disable_irq(struct pci_dev *dev)
> =A0 =A0 =A0 =A0if (dev->msi_enabled || dev->msix_enabled)
> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0return;
>
> - =A0 =A0 =A0 if (!irq_in_use(dev->irq))
> + =A0 =A0 =A0 if (!irq_has_action(dev->irq))
> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0return;
>
> =A0 =A0 =A0 =A0PCI_DN(dn)->eeh_mode |=3D EEH_MODE_IRQ_DISABLED;
> --
> 1.6.2.1
>
> _______________________________________________
> Linuxppc-dev mailing list
> Linuxppc-dev@lists.ozlabs.org
> https://lists.ozlabs.org/listinfo/linuxppc-dev
>



--=20
Grant Likely, B.Sc., P.Eng.
Secret Lab Technologies Ltd.

^ permalink raw reply	[flat|nested] 15+ messages in thread

* Re: [PATCH 4/6] powerpc: Make virq_debug_show() cope with sparse irq_descs
  2009-10-14  5:44 ` [PATCH 4/6] powerpc: Make virq_debug_show() cope with sparse irq_descs Michael Ellerman
@ 2009-10-14 18:34   ` Grant Likely
  0 siblings, 0 replies; 15+ messages in thread
From: Grant Likely @ 2009-10-14 18:34 UTC (permalink / raw)
  To: Michael Ellerman; +Cc: linuxppc-dev

On Tue, Oct 13, 2009 at 11:44 PM, Michael Ellerman
<michael@ellerman.id.au> wrote:
> Signed-off-by: Michael Ellerman <michael@ellerman.id.au>

Acked-by: Grant Likely <grant.likely@secretlab.ca>

> ---
> =A0arch/powerpc/kernel/irq.c | =A0 =A05 ++++-
> =A01 files changed, 4 insertions(+), 1 deletions(-)
>
> diff --git a/arch/powerpc/kernel/irq.c b/arch/powerpc/kernel/irq.c
> index 6563221..baa49eb 100644
> --- a/arch/powerpc/kernel/irq.c
> +++ b/arch/powerpc/kernel/irq.c
> @@ -1065,8 +1065,11 @@ static int virq_debug_show(struct seq_file *m, voi=
d *private)
> =A0 =A0 =A0 =A0seq_printf(m, "%-5s =A0%-7s =A0%-15s =A0%s\n", "virq", "hw=
irq",
> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0"chip name", "host name");
>
> - =A0 =A0 =A0 for (i =3D 1; i < NR_IRQS; i++) {
> + =A0 =A0 =A0 for (i =3D 1; i < nr_irqs; i++) {
> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0desc =3D irq_to_desc(i);
> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 if (!desc)
> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 continue;
> +
> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0spin_lock_irqsave(&desc->lock, flags);
>
> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0if (desc->action && desc->action->handler)=
 {
> --
> 1.6.2.1
>
> _______________________________________________
> Linuxppc-dev mailing list
> Linuxppc-dev@lists.ozlabs.org
> https://lists.ozlabs.org/listinfo/linuxppc-dev
>



--=20
Grant Likely, B.Sc., P.Eng.
Secret Lab Technologies Ltd.

^ permalink raw reply	[flat|nested] 15+ messages in thread

* Re: [PATCH 5/6] powerpc: Rearrange and fix show_interrupts() for sparse irq_descs
  2009-10-14  5:45 ` [PATCH 5/6] powerpc: Rearrange and fix show_interrupts() for " Michael Ellerman
@ 2009-10-14 18:37   ` Grant Likely
  0 siblings, 0 replies; 15+ messages in thread
From: Grant Likely @ 2009-10-14 18:37 UTC (permalink / raw)
  To: Michael Ellerman; +Cc: linuxppc-dev

On Tue, Oct 13, 2009 at 11:45 PM, Michael Ellerman
<michael@ellerman.id.au> wrote:
> Move the default case out of the if, ie. when we're just displaying
> an irq. And consolidate all the odd cases at the top, ie. printing
> the header and footer.
>
> And in the process cope with sparse irq_descs.
>
> Signed-off-by: Michael Ellerman <michael@ellerman.id.au>

Looks reasonable to me
Acked-by: Grant Likely <grant.likely@secretlab.ca>

> ---
> =A0arch/powerpc/kernel/irq.c | =A0 64 ++++++++++++++++++++++++++---------=
----------
> =A01 files changed, 37 insertions(+), 27 deletions(-)
>
> diff --git a/arch/powerpc/kernel/irq.c b/arch/powerpc/kernel/irq.c
> index baa49eb..63e27d5 100644
> --- a/arch/powerpc/kernel/irq.c
> +++ b/arch/powerpc/kernel/irq.c
> @@ -187,33 +187,7 @@ int show_interrupts(struct seq_file *p, void *v)
> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0for_each_online_cpu(j)
> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0seq_printf(p, "CPU%d =A0 =
=A0 =A0 ", j);
> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0seq_putc(p, '\n');
> - =A0 =A0 =A0 }
> -
> - =A0 =A0 =A0 if (i < NR_IRQS) {
> - =A0 =A0 =A0 =A0 =A0 =A0 =A0 desc =3D irq_to_desc(i);
> - =A0 =A0 =A0 =A0 =A0 =A0 =A0 spin_lock_irqsave(&desc->lock, flags);
> - =A0 =A0 =A0 =A0 =A0 =A0 =A0 action =3D desc->action;
> - =A0 =A0 =A0 =A0 =A0 =A0 =A0 if (!action || !action->handler)
> - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 goto skip;
> - =A0 =A0 =A0 =A0 =A0 =A0 =A0 seq_printf(p, "%3d: ", i);
> -#ifdef CONFIG_SMP
> - =A0 =A0 =A0 =A0 =A0 =A0 =A0 for_each_online_cpu(j)
> - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 seq_printf(p, "%10u ", ksta=
t_irqs_cpu(i, j));
> -#else
> - =A0 =A0 =A0 =A0 =A0 =A0 =A0 seq_printf(p, "%10u ", kstat_irqs(i));
> -#endif /* CONFIG_SMP */
> - =A0 =A0 =A0 =A0 =A0 =A0 =A0 if (desc->chip)
> - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 seq_printf(p, " %s ", desc-=
>chip->typename);
> - =A0 =A0 =A0 =A0 =A0 =A0 =A0 else
> - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 seq_puts(p, " =A0None =A0 =
=A0 =A0");
> - =A0 =A0 =A0 =A0 =A0 =A0 =A0 seq_printf(p, "%s", (desc->status & IRQ_LEV=
EL) ? "Level " : "Edge =A0");
> - =A0 =A0 =A0 =A0 =A0 =A0 =A0 seq_printf(p, " =A0 =A0%s", action->name);
> - =A0 =A0 =A0 =A0 =A0 =A0 =A0 for (action =3D action->next; action; actio=
n =3D action->next)
> - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 seq_printf(p, ", %s", actio=
n->name);
> - =A0 =A0 =A0 =A0 =A0 =A0 =A0 seq_putc(p, '\n');
> -skip:
> - =A0 =A0 =A0 =A0 =A0 =A0 =A0 spin_unlock_irqrestore(&desc->lock, flags);
> - =A0 =A0 =A0 } else if (i =3D=3D NR_IRQS) {
> + =A0 =A0 =A0 } else if (i =3D=3D nr_irqs) {
> =A0#if defined(CONFIG_PPC32) && defined(CONFIG_TAU_INT)
> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0if (tau_initialized){
> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0seq_puts(p, "TAU: ");
> @@ -223,7 +197,43 @@ skip:
> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0}
> =A0#endif /* CONFIG_PPC32 && CONFIG_TAU_INT*/
> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0seq_printf(p, "BAD: %10u\n", ppc_spurious_=
interrupts);
> +
> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 return 0;
> =A0 =A0 =A0 =A0}
> +
> + =A0 =A0 =A0 desc =3D irq_to_desc(i);
> + =A0 =A0 =A0 if (!desc)
> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 return 0;
> +
> + =A0 =A0 =A0 spin_lock_irqsave(&desc->lock, flags);
> +
> + =A0 =A0 =A0 action =3D desc->action;
> + =A0 =A0 =A0 if (!action || !action->handler)
> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 goto skip;
> +
> + =A0 =A0 =A0 seq_printf(p, "%3d: ", i);
> +#ifdef CONFIG_SMP
> + =A0 =A0 =A0 for_each_online_cpu(j)
> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 seq_printf(p, "%10u ", kstat_irqs_cpu(i, j)=
);
> +#else
> + =A0 =A0 =A0 seq_printf(p, "%10u ", kstat_irqs(i));
> +#endif /* CONFIG_SMP */
> +
> + =A0 =A0 =A0 if (desc->chip)
> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 seq_printf(p, " %s ", desc->chip->typename)=
;
> + =A0 =A0 =A0 else
> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 seq_puts(p, " =A0None =A0 =A0 =A0");
> +
> + =A0 =A0 =A0 seq_printf(p, "%s", (desc->status & IRQ_LEVEL) ? "Level " :=
 "Edge =A0");
> + =A0 =A0 =A0 seq_printf(p, " =A0 =A0%s", action->name);
> +
> + =A0 =A0 =A0 for (action =3D action->next; action; action =3D action->ne=
xt)
> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 seq_printf(p, ", %s", action->name);
> + =A0 =A0 =A0 seq_putc(p, '\n');
> +
> +skip:
> + =A0 =A0 =A0 spin_unlock_irqrestore(&desc->lock, flags);
> +
> =A0 =A0 =A0 =A0return 0;
> =A0}
>
> --
> 1.6.2.1
>
> _______________________________________________
> Linuxppc-dev mailing list
> Linuxppc-dev@lists.ozlabs.org
> https://lists.ozlabs.org/listinfo/linuxppc-dev
>



--=20
Grant Likely, B.Sc., P.Eng.
Secret Lab Technologies Ltd.

^ permalink raw reply	[flat|nested] 15+ messages in thread

* Re: [PATCH 6/6] powerpc: Enable sparse irq_descs on powerpc
  2009-10-14  5:45 ` [PATCH 6/6] powerpc: Enable sparse irq_descs on powerpc Michael Ellerman
@ 2009-10-14 18:44   ` Grant Likely
  2009-10-14 23:51     ` Michael Ellerman
  0 siblings, 1 reply; 15+ messages in thread
From: Grant Likely @ 2009-10-14 18:44 UTC (permalink / raw)
  To: Michael Ellerman; +Cc: linuxppc-dev

On Tue, Oct 13, 2009 at 11:45 PM, Michael Ellerman
<michael@ellerman.id.au> wrote:
> Defining CONFIG_SPARSE_IRQ enables generic code that gets rid of the
> static irq_desc array, and replaces it with an array of pointers to
> irq_descs.
>
> It also allows node local allocation of irq_descs, however we
> currently don't have the information available to do that, so we just
> allocate them on all on node 0.
>
> Signed-off-by: Michael Ellerman <michael@ellerman.id.au>

Why not make sparse IRQs manditory for all platforms?  Is there a
performance concern with doing so?  From a maintenance perspective,
I'd rather see IRQ descs manged in one way only to keep the code
simple.

Cheers,
g.

> ---
> =A0arch/powerpc/Kconfig =A0 =A0 =A0 =A0 =A0 =A0| =A0 13 ++++++++++++
> =A0arch/powerpc/include/asm/irq.h =A0| =A0 =A03 ++
> =A0arch/powerpc/kernel/irq.c =A0 =A0 =A0 | =A0 40 +++++++++++++++++++++++=
+++++++++------
> =A0arch/powerpc/kernel/ppc_ksyms.c | =A0 =A01 -
> =A0arch/powerpc/kernel/setup_64.c =A0| =A0 =A05 ----
> =A05 files changed, 49 insertions(+), 13 deletions(-)
>
> diff --git a/arch/powerpc/Kconfig b/arch/powerpc/Kconfig
> index 2230e75..825d889 100644
> --- a/arch/powerpc/Kconfig
> +++ b/arch/powerpc/Kconfig
> @@ -388,6 +388,19 @@ config IRQ_ALL_CPUS
> =A0 =A0 =A0 =A0 =A0CPU. =A0Generally saying Y is safe, although some prob=
lems have been
> =A0 =A0 =A0 =A0 =A0reported with SMP Power Macintoshes with this option e=
nabled.
>
> +config SPARSE_IRQ
> + =A0 =A0 =A0 bool "Support sparse irq numbering"
> + =A0 =A0 =A0 default y
> + =A0 =A0 =A0 help
> + =A0 =A0 =A0 =A0 This enables support for sparse irqs. This is useful fo=
r distro
> + =A0 =A0 =A0 =A0 kernels that want to define a high CONFIG_NR_CPUS value=
 but still
> + =A0 =A0 =A0 =A0 want to have low kernel memory footprint on smaller mac=
hines.
> +
> + =A0 =A0 =A0 =A0 ( Sparse IRQs can also be beneficial on NUMA boxes, as =
they spread
> + =A0 =A0 =A0 =A0 =A0 out the irq_desc[] array in a more NUMA-friendly wa=
y. )
> +
> + =A0 =A0 =A0 =A0 If you don't know what to do here, say Y.
> +
> =A0config NUMA
> =A0 =A0 =A0 =A0bool "NUMA support"
> =A0 =A0 =A0 =A0depends on PPC64
> diff --git a/arch/powerpc/include/asm/irq.h b/arch/powerpc/include/asm/ir=
q.h
> index 03dc28c..c85a32f 100644
> --- a/arch/powerpc/include/asm/irq.h
> +++ b/arch/powerpc/include/asm/irq.h
> @@ -38,6 +38,9 @@ extern atomic_t ppc_n_lost_interrupts;
> =A0/* Number of irqs reserved for the legacy controller */
> =A0#define NUM_ISA_INTERRUPTS =A0 =A0 16
>
> +/* Same thing, used by the generic IRQ code */
> +#define NR_IRQS_LEGACY =A0 =A0 =A0 =A0 NUM_ISA_INTERRUPTS
> +
> =A0/* This type is the placeholder for a hardware interrupt number. It ha=
s to
> =A0* be big enough to enclose whatever representation is used by a given
> =A0* platform.
> diff --git a/arch/powerpc/kernel/irq.c b/arch/powerpc/kernel/irq.c
> index 63e27d5..eba5392 100644
> --- a/arch/powerpc/kernel/irq.c
> +++ b/arch/powerpc/kernel/irq.c
> @@ -85,7 +85,10 @@ extern int tau_interrupts(int);
> =A0#endif /* CONFIG_PPC32 */
>
> =A0#ifdef CONFIG_PPC64
> +
> +#ifndef CONFIG_SPARSE_IRQ
> =A0EXPORT_SYMBOL(irq_desc);
> +#endif
>
> =A0int distribute_irqs =3D 1;
>
> @@ -613,8 +616,16 @@ void irq_set_virq_count(unsigned int count)
> =A0static int irq_setup_virq(struct irq_host *host, unsigned int virq,
> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0irq_hw_number_t hw=
irq)
> =A0{
> + =A0 =A0 =A0 struct irq_desc *desc;
> +
> + =A0 =A0 =A0 desc =3D irq_to_desc_alloc_node(virq, 0);
> + =A0 =A0 =A0 if (!desc) {
> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 pr_debug("irq: -> allocating desc failed\n"=
);
> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 goto error;
> + =A0 =A0 =A0 }
> +
> =A0 =A0 =A0 =A0/* Clear IRQ_NOREQUEST flag */
> - =A0 =A0 =A0 irq_to_desc(virq)->status &=3D ~IRQ_NOREQUEST;
> + =A0 =A0 =A0 desc->status &=3D ~IRQ_NOREQUEST;
>
> =A0 =A0 =A0 =A0/* map it */
> =A0 =A0 =A0 =A0smp_wmb();
> @@ -623,11 +634,14 @@ static int irq_setup_virq(struct irq_host *host, un=
signed int virq,
>
> =A0 =A0 =A0 =A0if (host->ops->map(host, virq, hwirq)) {
> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0pr_debug("irq: -> mapping failed, freeing\=
n");
> - =A0 =A0 =A0 =A0 =A0 =A0 =A0 irq_free_virt(virq, 1);
> - =A0 =A0 =A0 =A0 =A0 =A0 =A0 return -1;
> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 goto error;
> =A0 =A0 =A0 =A0}
>
> =A0 =A0 =A0 =A0return 0;
> +
> +error:
> + =A0 =A0 =A0 irq_free_virt(virq, 1);
> + =A0 =A0 =A0 return -1;
> =A0}
>
> =A0unsigned int irq_create_direct_mapping(struct irq_host *host)
> @@ -1008,12 +1022,24 @@ void irq_free_virt(unsigned int virq, unsigned in=
t count)
> =A0 =A0 =A0 =A0spin_unlock_irqrestore(&irq_big_lock, flags);
> =A0}
>
> -void irq_early_init(void)
> +int arch_early_irq_init(void)
> =A0{
> - =A0 =A0 =A0 unsigned int i;
> + =A0 =A0 =A0 struct irq_desc *desc;
> + =A0 =A0 =A0 int i;
>
> - =A0 =A0 =A0 for (i =3D 0; i < NR_IRQS; i++)
> - =A0 =A0 =A0 =A0 =A0 =A0 =A0 irq_to_desc(i)->status |=3D IRQ_NOREQUEST;
> + =A0 =A0 =A0 for (i =3D 0; i < NR_IRQS; i++) {
> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 desc =3D irq_to_desc(i);
> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 if (desc)
> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 desc->status |=3D IRQ_NOREQ=
UEST;
> + =A0 =A0 =A0 }
> +
> + =A0 =A0 =A0 return 0;
> +}
> +
> +int arch_init_chip_data(struct irq_desc *desc, int node)
> +{
> + =A0 =A0 =A0 desc->status |=3D IRQ_NOREQUEST;
> + =A0 =A0 =A0 return 0;
> =A0}
>
> =A0/* We need to create the radix trees late */
> diff --git a/arch/powerpc/kernel/ppc_ksyms.c b/arch/powerpc/kernel/ppc_ks=
yms.c
> index c8b27bb..07115d6 100644
> --- a/arch/powerpc/kernel/ppc_ksyms.c
> +++ b/arch/powerpc/kernel/ppc_ksyms.c
> @@ -162,7 +162,6 @@ EXPORT_SYMBOL(screen_info);
>
> =A0#ifdef CONFIG_PPC32
> =A0EXPORT_SYMBOL(timer_interrupt);
> -EXPORT_SYMBOL(irq_desc);
> =A0EXPORT_SYMBOL(tb_ticks_per_jiffy);
> =A0EXPORT_SYMBOL(cacheable_memcpy);
> =A0EXPORT_SYMBOL(cacheable_memzero);
> diff --git a/arch/powerpc/kernel/setup_64.c b/arch/powerpc/kernel/setup_6=
4.c
> index 797ea95..8e5ec92 100644
> --- a/arch/powerpc/kernel/setup_64.c
> +++ b/arch/powerpc/kernel/setup_64.c
> @@ -357,11 +357,6 @@ void __init setup_system(void)
> =A0 =A0 =A0 =A0 */
> =A0 =A0 =A0 =A0initialize_cache_info();
>
> - =A0 =A0 =A0 /*
> - =A0 =A0 =A0 =A0* Initialize irq remapping subsystem
> - =A0 =A0 =A0 =A0*/
> - =A0 =A0 =A0 irq_early_init();
> -
> =A0#ifdef CONFIG_PPC_RTAS
> =A0 =A0 =A0 =A0/*
> =A0 =A0 =A0 =A0 * Initialize RTAS if available
> --
> 1.6.2.1
>
> _______________________________________________
> Linuxppc-dev mailing list
> Linuxppc-dev@lists.ozlabs.org
> https://lists.ozlabs.org/listinfo/linuxppc-dev
>



--=20
Grant Likely, B.Sc., P.Eng.
Secret Lab Technologies Ltd.

^ permalink raw reply	[flat|nested] 15+ messages in thread

* Re: [PATCH 1/6] powerpc: Make NR_IRQS a CONFIG option
  2009-10-14  5:44 [PATCH 1/6] powerpc: Make NR_IRQS a CONFIG option Michael Ellerman
                   ` (4 preceding siblings ...)
  2009-10-14  5:45 ` [PATCH 6/6] powerpc: Enable sparse irq_descs on powerpc Michael Ellerman
@ 2009-10-14 18:59 ` Grant Likely
  2009-10-14 23:47   ` Michael Ellerman
  5 siblings, 1 reply; 15+ messages in thread
From: Grant Likely @ 2009-10-14 18:59 UTC (permalink / raw)
  To: Michael Ellerman; +Cc: linuxppc-dev

On Tue, Oct 13, 2009 at 11:44 PM, Michael Ellerman
<michael@ellerman.id.au> wrote:
> The irq_desc array consumes quite a lot of space, and for systems
> that don't need or can't have 512 irqs it's just wasted space.
>
> The first 16 are reserved for ISA, so the minimum of 32 is really
> 16 - and no one has asked for more than 512 so leave that as the
> maximum.

Does it really make sense to have this as a user twiddlable value?
Especially when many users just don't have the background to know what
an appropriate value is here and will get it wrong?  I believe your
sparse IRQ patch has a bigger impact anyway on systems where memory is
tight.

g.

>
> Signed-off-by: Michael Ellerman <michael@ellerman.id.au>
> ---
> =A0arch/powerpc/Kconfig =A0 =A0 =A0 =A0 =A0 | =A0 10 ++++++++++
> =A0arch/powerpc/include/asm/irq.h | =A0 =A04 ++--
> =A02 files changed, 12 insertions(+), 2 deletions(-)
>
> diff --git a/arch/powerpc/Kconfig b/arch/powerpc/Kconfig
> index 10a0a54..2230e75 100644
> --- a/arch/powerpc/Kconfig
> +++ b/arch/powerpc/Kconfig
> @@ -56,6 +56,16 @@ config IRQ_PER_CPU
> =A0 =A0 =A0 =A0bool
> =A0 =A0 =A0 =A0default y
>
> +config NR_IRQS
> + =A0 =A0 =A0 int "Number of virtual interrupt numbers"
> + =A0 =A0 =A0 range 32 512
> + =A0 =A0 =A0 default "512"
> + =A0 =A0 =A0 help
> + =A0 =A0 =A0 =A0 This defines the number of virtual interrupt numbers th=
e kernel
> + =A0 =A0 =A0 =A0 can manage. Virtual interrupt numbers are what you see =
in
> + =A0 =A0 =A0 =A0 /proc/interrupts. If you configure your system to have =
too few,
> + =A0 =A0 =A0 =A0 drivers will fail to load or worse - handle with care.
> +
> =A0config STACKTRACE_SUPPORT
> =A0 =A0 =A0 =A0bool
> =A0 =A0 =A0 =A0default y
> diff --git a/arch/powerpc/include/asm/irq.h b/arch/powerpc/include/asm/ir=
q.h
> index bbcd1aa..b83fcc8 100644
> --- a/arch/powerpc/include/asm/irq.h
> +++ b/arch/powerpc/include/asm/irq.h
> @@ -34,8 +34,8 @@ extern atomic_t ppc_n_lost_interrupts;
> =A0*/
> =A0#define NO_IRQ_IGNORE =A0 =A0 =A0 =A0 =A0((unsigned int)-1)
>
> -/* Total number of virq in the platform (make it a CONFIG_* option ? */
> -#define NR_IRQS =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0512
> +/* Total number of virq in the platform */
> +#define NR_IRQS =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0CONFIG_NR_IRQS
>
> =A0/* Number of irqs reserved for the legacy controller */
> =A0#define NUM_ISA_INTERRUPTS =A0 =A0 16
> --
> 1.6.2.1
>
> _______________________________________________
> Linuxppc-dev mailing list
> Linuxppc-dev@lists.ozlabs.org
> https://lists.ozlabs.org/listinfo/linuxppc-dev
>



--=20
Grant Likely, B.Sc., P.Eng.
Secret Lab Technologies Ltd.

^ permalink raw reply	[flat|nested] 15+ messages in thread

* Re: [PATCH 3/6] powerpc: Remove get_irq_desc()
  2009-10-14  5:44 ` [PATCH 3/6] powerpc: Remove get_irq_desc() Michael Ellerman
@ 2009-10-14 19:02   ` Grant Likely
  0 siblings, 0 replies; 15+ messages in thread
From: Grant Likely @ 2009-10-14 19:02 UTC (permalink / raw)
  To: Michael Ellerman; +Cc: linuxppc-dev

On Tue, Oct 13, 2009 at 11:44 PM, Michael Ellerman
<michael@ellerman.id.au> wrote:
> get_irq_desc() is a powerpc-specific version of irq_to_desc(). That
> is reason enough to remove it, but it also doesn't know about sparse
> irq_desc support which irq_to_desc() does (when we enable it).
>
> Signed-off-by: Michael Ellerman <michael@ellerman.id.au>
Acked-by: Grant Likely <grant.likely@secretlab.ca>

> ---
> =A0arch/powerpc/include/asm/irq.h =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0| =
=A0 =A02 -
> =A0arch/powerpc/kernel/crash.c =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 | =
=A0 =A02 +-
> =A0arch/powerpc/kernel/irq.c =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =
| =A0 28 ++++++++++++----------
> =A0arch/powerpc/platforms/512x/mpc5121_ads_cpld.c =A0| =A0 =A02 +-
> =A0arch/powerpc/platforms/52xx/media5200.c =A0 =A0 =A0 =A0 | =A0 =A02 +-
> =A0arch/powerpc/platforms/82xx/pq2ads-pci-pic.c =A0 =A0| =A0 =A02 +-
> =A0arch/powerpc/platforms/85xx/socrates_fpga_pic.c | =A0 =A02 +-
> =A0arch/powerpc/platforms/86xx/gef_pic.c =A0 =A0 =A0 =A0 =A0 | =A0 =A02 +=
-
> =A0arch/powerpc/platforms/cell/beat_interrupt.c =A0 =A0| =A0 =A02 +-
> =A0arch/powerpc/platforms/cell/spider-pic.c =A0 =A0 =A0 =A0| =A0 =A04 +-
> =A0arch/powerpc/platforms/iseries/irq.c =A0 =A0 =A0 =A0 =A0 =A0| =A0 =A02=
 +-
> =A0arch/powerpc/platforms/powermac/pic.c =A0 =A0 =A0 =A0 =A0 | =A0 =A08 +=
++---
> =A0arch/powerpc/platforms/pseries/xics.c =A0 =A0 =A0 =A0 =A0 | =A0 =A08 +=
++---
> =A0arch/powerpc/sysdev/cpm1.c =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0=
| =A0 =A02 +-
> =A0arch/powerpc/sysdev/cpm2_pic.c =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0| =
=A0 10 +++++---
> =A0arch/powerpc/sysdev/fsl_msi.c =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 | =
=A0 =A02 +-
> =A0arch/powerpc/sysdev/i8259.c =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 | =
=A0 =A04 +-
> =A0arch/powerpc/sysdev/ipic.c =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0=
| =A0 =A02 +-
> =A0arch/powerpc/sysdev/mpc8xx_pic.c =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0| =A0 =
=A02 +-
> =A0arch/powerpc/sysdev/mpic.c =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0=
| =A0 18 +++++++-------
> =A0arch/powerpc/sysdev/mv64x60_pic.c =A0 =A0 =A0 =A0 =A0 =A0 =A0 | =A0 =
=A02 +-
> =A0arch/powerpc/sysdev/qe_lib/qe_ic.c =A0 =A0 =A0 =A0 =A0 =A0 =A0| =A0 =
=A04 +-
> =A0arch/powerpc/sysdev/tsi108_pci.c =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0| =A0 =
=A02 +-
> =A0arch/powerpc/sysdev/uic.c =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =
| =A0 =A06 ++--
> =A0arch/powerpc/sysdev/xilinx_intc.c =A0 =A0 =A0 =A0 =A0 =A0 =A0 | =A0 =
=A02 +-
> =A025 files changed, 62 insertions(+), 60 deletions(-)
>
> diff --git a/arch/powerpc/include/asm/irq.h b/arch/powerpc/include/asm/ir=
q.h
> index b83fcc8..03dc28c 100644
> --- a/arch/powerpc/include/asm/irq.h
> +++ b/arch/powerpc/include/asm/irq.h
> @@ -17,8 +17,6 @@
> =A0#include <asm/atomic.h>
>
>
> -#define get_irq_desc(irq) (&irq_desc[(irq)])
> -
> =A0/* Define a way to iterate across irqs. */
> =A0#define for_each_irq(i) \
> =A0 =A0 =A0 =A0for ((i) =3D 0; (i) < NR_IRQS; ++(i))
> diff --git a/arch/powerpc/kernel/crash.c b/arch/powerpc/kernel/crash.c
> index 0a8439a..6f4613d 100644
> --- a/arch/powerpc/kernel/crash.c
> +++ b/arch/powerpc/kernel/crash.c
> @@ -373,7 +373,7 @@ void default_machine_crash_shutdown(struct pt_regs *r=
egs)
> =A0 =A0 =A0 =A0hard_irq_disable();
>
> =A0 =A0 =A0 =A0for_each_irq(i) {
> - =A0 =A0 =A0 =A0 =A0 =A0 =A0 struct irq_desc *desc =3D irq_desc + i;
> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 struct irq_desc *desc =3D irq_to_desc(i);
>
> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0if (desc->status & IRQ_INPROGRESS)
> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0desc->chip->eoi(i);
> diff --git a/arch/powerpc/kernel/irq.c b/arch/powerpc/kernel/irq.c
> index e5d1211..6563221 100644
> --- a/arch/powerpc/kernel/irq.c
> +++ b/arch/powerpc/kernel/irq.c
> @@ -190,7 +190,7 @@ int show_interrupts(struct seq_file *p, void *v)
> =A0 =A0 =A0 =A0}
>
> =A0 =A0 =A0 =A0if (i < NR_IRQS) {
> - =A0 =A0 =A0 =A0 =A0 =A0 =A0 desc =3D get_irq_desc(i);
> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 desc =3D irq_to_desc(i);
> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0spin_lock_irqsave(&desc->lock, flags);
> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0action =3D desc->action;
> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0if (!action || !action->handler)
> @@ -230,23 +230,25 @@ skip:
> =A0#ifdef CONFIG_HOTPLUG_CPU
> =A0void fixup_irqs(cpumask_t map)
> =A0{
> + =A0 =A0 =A0 struct irq_desc *desc;
> =A0 =A0 =A0 =A0unsigned int irq;
> =A0 =A0 =A0 =A0static int warned;
>
> =A0 =A0 =A0 =A0for_each_irq(irq) {
> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0cpumask_t mask;
>
> - =A0 =A0 =A0 =A0 =A0 =A0 =A0 if (irq_desc[irq].status & IRQ_PER_CPU)
> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 desc =3D irq_to_desc(irq);
> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 if (desc && desc->status & IRQ_PER_CPU)
> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0continue;
>
> - =A0 =A0 =A0 =A0 =A0 =A0 =A0 cpumask_and(&mask, irq_desc[irq].affinity, =
&map);
> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 cpumask_and(&mask, desc->affinity, &map);
> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0if (any_online_cpu(mask) =3D=3D NR_CPUS) {
> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0printk("Breaking affinity =
for irq %i\n", irq);
> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0mask =3D map;
> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0}
> - =A0 =A0 =A0 =A0 =A0 =A0 =A0 if (irq_desc[irq].chip->set_affinity)
> - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 irq_desc[irq].chip->set_aff=
inity(irq, &mask);
> - =A0 =A0 =A0 =A0 =A0 =A0 =A0 else if (irq_desc[irq].action && !(warned++=
))
> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 if (desc->chip->set_affinity)
> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 desc->chip->set_affinity(ir=
q, &mask);
> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 else if (desc->action && !(warned++))
> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0printk("Cannot set affinit=
y for irq %i\n", irq);
> =A0 =A0 =A0 =A0}
>
> @@ -273,7 +275,7 @@ static inline void handle_one_irq(unsigned int irq)
> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0return;
> =A0 =A0 =A0 =A0}
>
> - =A0 =A0 =A0 desc =3D irq_desc + irq;
> + =A0 =A0 =A0 desc =3D irq_to_desc(irq);
> =A0 =A0 =A0 =A0saved_sp_limit =3D current->thread.ksp_limit;
>
> =A0 =A0 =A0 =A0irqtp->task =3D curtp->task;
> @@ -535,7 +537,7 @@ struct irq_host *irq_alloc_host(struct device_node *o=
f_node,
> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0smp_wmb();
>
> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0/* Clear norequest flags *=
/
> - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 get_irq_desc(i)->status &=
=3D ~IRQ_NOREQUEST;
> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 irq_to_desc(i)->status &=3D=
 ~IRQ_NOREQUEST;
>
> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0/* Legacy flags are left t=
o default at this point,
> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 * one can then use irq_cr=
eate_mapping() to
> @@ -602,7 +604,7 @@ static int irq_setup_virq(struct irq_host *host, unsi=
gned int virq,
> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0irq_hw_number_t hw=
irq)
> =A0{
> =A0 =A0 =A0 =A0/* Clear IRQ_NOREQUEST flag */
> - =A0 =A0 =A0 get_irq_desc(virq)->status &=3D ~IRQ_NOREQUEST;
> + =A0 =A0 =A0 irq_to_desc(virq)->status &=3D ~IRQ_NOREQUEST;
>
> =A0 =A0 =A0 =A0/* map it */
> =A0 =A0 =A0 =A0smp_wmb();
> @@ -732,7 +734,7 @@ unsigned int irq_create_of_mapping(struct device_node=
 *controller,
>
> =A0 =A0 =A0 =A0/* Set type if specified and different than the current on=
e */
> =A0 =A0 =A0 =A0if (type !=3D IRQ_TYPE_NONE &&
> - =A0 =A0 =A0 =A0 =A0 type !=3D (get_irq_desc(virq)->status & IRQF_TRIGGE=
R_MASK))
> + =A0 =A0 =A0 =A0 =A0 type !=3D (irq_to_desc(virq)->status & IRQF_TRIGGER=
_MASK))
> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0set_irq_type(virq, type);
> =A0 =A0 =A0 =A0return virq;
> =A0}
> @@ -804,7 +806,7 @@ void irq_dispose_mapping(unsigned int virq)
> =A0 =A0 =A0 =A0irq_map[virq].hwirq =3D host->inval_irq;
>
> =A0 =A0 =A0 =A0/* Set some flags */
> - =A0 =A0 =A0 get_irq_desc(virq)->status |=3D IRQ_NOREQUEST;
> + =A0 =A0 =A0 irq_to_desc(virq)->status |=3D IRQ_NOREQUEST;
>
> =A0 =A0 =A0 =A0/* Free it */
> =A0 =A0 =A0 =A0irq_free_virt(virq, 1);
> @@ -1001,7 +1003,7 @@ void irq_early_init(void)
> =A0 =A0 =A0 =A0unsigned int i;
>
> =A0 =A0 =A0 =A0for (i =3D 0; i < NR_IRQS; i++)
> - =A0 =A0 =A0 =A0 =A0 =A0 =A0 get_irq_desc(i)->status |=3D IRQ_NOREQUEST;
> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 irq_to_desc(i)->status |=3D IRQ_NOREQUEST;
> =A0}
>
> =A0/* We need to create the radix trees late */
> @@ -1064,7 +1066,7 @@ static int virq_debug_show(struct seq_file *m, void=
 *private)
> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0"chip name", "host name");
>
> =A0 =A0 =A0 =A0for (i =3D 1; i < NR_IRQS; i++) {
> - =A0 =A0 =A0 =A0 =A0 =A0 =A0 desc =3D get_irq_desc(i);
> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 desc =3D irq_to_desc(i);
> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0spin_lock_irqsave(&desc->lock, flags);
>
> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0if (desc->action && desc->action->handler)=
 {
> diff --git a/arch/powerpc/platforms/512x/mpc5121_ads_cpld.c b/arch/powerp=
c/platforms/512x/mpc5121_ads_cpld.c
> index a6ce805..cd70ee1 100644
> --- a/arch/powerpc/platforms/512x/mpc5121_ads_cpld.c
> +++ b/arch/powerpc/platforms/512x/mpc5121_ads_cpld.c
> @@ -132,7 +132,7 @@ static int
> =A0cpld_pic_host_map(struct irq_host *h, unsigned int virq,
> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 irq_hw_number_t h=
w)
> =A0{
> - =A0 =A0 =A0 get_irq_desc(virq)->status |=3D IRQ_LEVEL;
> + =A0 =A0 =A0 irq_to_desc(virq)->status |=3D IRQ_LEVEL;
> =A0 =A0 =A0 =A0set_irq_chip_and_handler(virq, &cpld_pic, handle_level_irq=
);
> =A0 =A0 =A0 =A0return 0;
> =A0}
> diff --git a/arch/powerpc/platforms/52xx/media5200.c b/arch/powerpc/platf=
orms/52xx/media5200.c
> index 68e4f16..4780203 100644
> --- a/arch/powerpc/platforms/52xx/media5200.c
> +++ b/arch/powerpc/platforms/52xx/media5200.c
> @@ -114,7 +114,7 @@ void media5200_irq_cascade(unsigned int virq, struct =
irq_desc *desc)
> =A0static int media5200_irq_map(struct irq_host *h, unsigned int virq,
> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 irq_hw_number_t h=
w)
> =A0{
> - =A0 =A0 =A0 struct irq_desc *desc =3D get_irq_desc(virq);
> + =A0 =A0 =A0 struct irq_desc *desc =3D irq_to_desc(virq);
>
> =A0 =A0 =A0 =A0pr_debug("%s: h=3D%p, virq=3D%i, hwirq=3D%i\n", __func__, =
h, virq, (int)hw);
> =A0 =A0 =A0 =A0set_irq_chip_data(virq, &media5200_irq);
> diff --git a/arch/powerpc/platforms/82xx/pq2ads-pci-pic.c b/arch/powerpc/=
platforms/82xx/pq2ads-pci-pic.c
> index 7ee979f..a682331 100644
> --- a/arch/powerpc/platforms/82xx/pq2ads-pci-pic.c
> +++ b/arch/powerpc/platforms/82xx/pq2ads-pci-pic.c
> @@ -107,7 +107,7 @@ static void pq2ads_pci_irq_demux(unsigned int irq, st=
ruct irq_desc *desc)
> =A0static int pci_pic_host_map(struct irq_host *h, unsigned int virq,
> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0irq_hw_number_t hw=
)
> =A0{
> - =A0 =A0 =A0 get_irq_desc(virq)->status |=3D IRQ_LEVEL;
> + =A0 =A0 =A0 irq_to_desc(virq)->status |=3D IRQ_LEVEL;
> =A0 =A0 =A0 =A0set_irq_chip_data(virq, h->host_data);
> =A0 =A0 =A0 =A0set_irq_chip_and_handler(virq, &pq2ads_pci_ic, handle_leve=
l_irq);
> =A0 =A0 =A0 =A0return 0;
> diff --git a/arch/powerpc/platforms/85xx/socrates_fpga_pic.c b/arch/power=
pc/platforms/85xx/socrates_fpga_pic.c
> index 60edf63..e59920a 100644
> --- a/arch/powerpc/platforms/85xx/socrates_fpga_pic.c
> +++ b/arch/powerpc/platforms/85xx/socrates_fpga_pic.c
> @@ -245,7 +245,7 @@ static int socrates_fpga_pic_host_map(struct irq_host=
 *h, unsigned int virq,
> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0irq_hw_number_t hwirq)
> =A0{
> =A0 =A0 =A0 =A0/* All interrupts are LEVEL sensitive */
> - =A0 =A0 =A0 get_irq_desc(virq)->status |=3D IRQ_LEVEL;
> + =A0 =A0 =A0 irq_to_desc(virq)->status |=3D IRQ_LEVEL;
> =A0 =A0 =A0 =A0set_irq_chip_and_handler(virq, &socrates_fpga_pic_chip,
> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0handle_fasteoi_irq);
>
> diff --git a/arch/powerpc/platforms/86xx/gef_pic.c b/arch/powerpc/platfor=
ms/86xx/gef_pic.c
> index 50d0a2b..978d6cb 100644
> --- a/arch/powerpc/platforms/86xx/gef_pic.c
> +++ b/arch/powerpc/platforms/86xx/gef_pic.c
> @@ -163,7 +163,7 @@ static int gef_pic_host_map(struct irq_host *h, unsig=
ned int virq,
> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0irq_hw_number_t hwirq)
> =A0{
> =A0 =A0 =A0 =A0/* All interrupts are LEVEL sensitive */
> - =A0 =A0 =A0 get_irq_desc(virq)->status |=3D IRQ_LEVEL;
> + =A0 =A0 =A0 irq_to_desc(virq)->status |=3D IRQ_LEVEL;
> =A0 =A0 =A0 =A0set_irq_chip_and_handler(virq, &gef_pic_chip, handle_level=
_irq);
>
> =A0 =A0 =A0 =A0return 0;
> diff --git a/arch/powerpc/platforms/cell/beat_interrupt.c b/arch/powerpc/=
platforms/cell/beat_interrupt.c
> index 7225484..4a2bbff 100644
> --- a/arch/powerpc/platforms/cell/beat_interrupt.c
> +++ b/arch/powerpc/platforms/cell/beat_interrupt.c
> @@ -136,7 +136,7 @@ static void beatic_pic_host_unmap(struct irq_host *h,=
 unsigned int virq)
> =A0static int beatic_pic_host_map(struct irq_host *h, unsigned int virq,
> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 irq_hw_number=
_t hw)
> =A0{
> - =A0 =A0 =A0 struct irq_desc *desc =3D get_irq_desc(virq);
> + =A0 =A0 =A0 struct irq_desc *desc =3D irq_to_desc(virq);
> =A0 =A0 =A0 =A0int64_t err;
>
> =A0 =A0 =A0 =A0err =3D beat_construct_and_connect_irq_plug(virq, hw);
> diff --git a/arch/powerpc/platforms/cell/spider-pic.c b/arch/powerpc/plat=
forms/cell/spider-pic.c
> index 4e56556..9dd63c5 100644
> --- a/arch/powerpc/platforms/cell/spider-pic.c
> +++ b/arch/powerpc/platforms/cell/spider-pic.c
> @@ -102,7 +102,7 @@ static void spider_ack_irq(unsigned int virq)
>
> =A0 =A0 =A0 =A0/* Reset edge detection logic if necessary
> =A0 =A0 =A0 =A0 */
> - =A0 =A0 =A0 if (get_irq_desc(virq)->status & IRQ_LEVEL)
> + =A0 =A0 =A0 if (irq_to_desc(virq)->status & IRQ_LEVEL)
> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0return;
>
> =A0 =A0 =A0 =A0/* Only interrupts 47 to 50 can be set to edge */
> @@ -119,7 +119,7 @@ static int spider_set_irq_type(unsigned int virq, uns=
igned int type)
> =A0 =A0 =A0 =A0struct spider_pic *pic =3D spider_virq_to_pic(virq);
> =A0 =A0 =A0 =A0unsigned int hw =3D irq_map[virq].hwirq;
> =A0 =A0 =A0 =A0void __iomem *cfg =3D spider_get_irq_config(pic, hw);
> - =A0 =A0 =A0 struct irq_desc *desc =3D get_irq_desc(virq);
> + =A0 =A0 =A0 struct irq_desc *desc =3D irq_to_desc(virq);
> =A0 =A0 =A0 =A0u32 old_mask;
> =A0 =A0 =A0 =A0u32 ic;
>
> diff --git a/arch/powerpc/platforms/iseries/irq.c b/arch/powerpc/platform=
s/iseries/irq.c
> index 94f4447..f8446ea 100644
> --- a/arch/powerpc/platforms/iseries/irq.c
> +++ b/arch/powerpc/platforms/iseries/irq.c
> @@ -214,7 +214,7 @@ void __init iSeries_activate_IRQs()
> =A0 =A0 =A0 =A0unsigned long flags;
>
> =A0 =A0 =A0 =A0for_each_irq (irq) {
> - =A0 =A0 =A0 =A0 =A0 =A0 =A0 struct irq_desc *desc =3D get_irq_desc(irq)=
;
> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 struct irq_desc *desc =3D irq_to_desc(irq);
>
> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0if (desc && desc->chip && desc->chip->star=
tup) {
> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0spin_lock_irqsave(&desc->l=
ock, flags);
> diff --git a/arch/powerpc/platforms/powermac/pic.c b/arch/powerpc/platfor=
ms/powermac/pic.c
> index d212006..484d21e 100644
> --- a/arch/powerpc/platforms/powermac/pic.c
> +++ b/arch/powerpc/platforms/powermac/pic.c
> @@ -152,12 +152,12 @@ static unsigned int pmac_startup_irq(unsigned int v=
irq)
> =A0 =A0 =A0 =A0 unsigned long bit =3D 1UL << (src & 0x1f);
> =A0 =A0 =A0 =A0 int i =3D src >> 5;
>
> - =A0 =A0 =A0 spin_lock_irqsave(&pmac_pic_lock, flags);
> - =A0 =A0 =A0 if ((irq_desc[virq].status & IRQ_LEVEL) =3D=3D 0)
> + =A0 =A0 =A0 spin_lock_irqsave(&pmac_pic_lock, flags);
> + =A0 =A0 =A0 if ((irq_to_desc(virq)->status & IRQ_LEVEL) =3D=3D 0)
> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0out_le32(&pmac_irq_hw[i]->ack, bit);
> =A0 =A0 =A0 =A0 __set_bit(src, ppc_cached_irq_mask);
> =A0 =A0 =A0 =A0 __pmac_set_irq_mask(src, 0);
> - =A0 =A0 =A0 spin_unlock_irqrestore(&pmac_pic_lock, flags);
> + =A0 =A0 =A0 spin_unlock_irqrestore(&pmac_pic_lock, flags);
>
> =A0 =A0 =A0 =A0return 0;
> =A0}
> @@ -285,7 +285,7 @@ static int pmac_pic_host_match(struct irq_host *h, st=
ruct device_node *node)
> =A0static int pmac_pic_host_map(struct irq_host *h, unsigned int virq,
> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 irq_hw_number_t h=
w)
> =A0{
> - =A0 =A0 =A0 struct irq_desc *desc =3D get_irq_desc(virq);
> + =A0 =A0 =A0 struct irq_desc *desc =3D irq_to_desc(virq);
> =A0 =A0 =A0 =A0int level;
>
> =A0 =A0 =A0 =A0if (hw >=3D max_irqs)
> diff --git a/arch/powerpc/platforms/pseries/xics.c b/arch/powerpc/platfor=
ms/pseries/xics.c
> index 419f8a6..75935ae 100644
> --- a/arch/powerpc/platforms/pseries/xics.c
> +++ b/arch/powerpc/platforms/pseries/xics.c
> @@ -156,7 +156,7 @@ static int get_irq_server(unsigned int virq, unsigned=
 int strict_check)
> =A0 =A0 =A0 =A0cpumask_t cpumask;
> =A0 =A0 =A0 =A0cpumask_t tmp =3D CPU_MASK_NONE;
>
> - =A0 =A0 =A0 cpumask_copy(&cpumask, irq_desc[virq].affinity);
> + =A0 =A0 =A0 cpumask_copy(&cpumask, irq_to_desc(virq)->affinity);
> =A0 =A0 =A0 =A0if (!distribute_irqs)
> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0return default_server;
>
> @@ -419,7 +419,7 @@ static int xics_host_map(struct irq_host *h, unsigned=
 int virq,
> =A0 =A0 =A0 =A0/* Insert the interrupt mapping into the radix tree for fa=
st lookup */
> =A0 =A0 =A0 =A0irq_radix_revmap_insert(xics_host, virq, hw);
>
> - =A0 =A0 =A0 get_irq_desc(virq)->status |=3D IRQ_LEVEL;
> + =A0 =A0 =A0 irq_to_desc(virq)->status |=3D IRQ_LEVEL;
> =A0 =A0 =A0 =A0set_irq_chip_and_handler(virq, xics_irq_chip, handle_faste=
oi_irq);
> =A0 =A0 =A0 =A0return 0;
> =A0}
> @@ -843,7 +843,7 @@ void xics_migrate_irqs_away(void)
> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0/* We need to get IPIs still. */
> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0if (irq =3D=3D XICS_IPI || irq =3D=3D XICS=
_IRQ_SPURIOUS)
> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0continue;
> - =A0 =A0 =A0 =A0 =A0 =A0 =A0 desc =3D get_irq_desc(virq);
> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 desc =3D irq_to_desc(virq);
>
> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0/* We only need to migrate enabled IRQS */
> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0if (desc =3D=3D NULL || desc->chip =3D=3D =
NULL
> @@ -872,7 +872,7 @@ void xics_migrate_irqs_away(void)
> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 virq, cpu);
>
> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0/* Reset affinity to all cpus */
> - =A0 =A0 =A0 =A0 =A0 =A0 =A0 cpumask_setall(irq_desc[virq].affinity);
> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 cpumask_setall(irq_to_desc(virq)->affinity)=
;
> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0desc->chip->set_affinity(virq, cpu_all_mas=
k);
> =A0unlock:
> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0spin_unlock_irqrestore(&desc->lock, flags)=
;
> diff --git a/arch/powerpc/sysdev/cpm1.c b/arch/powerpc/sysdev/cpm1.c
> index 82424cd..5235373 100644
> --- a/arch/powerpc/sysdev/cpm1.c
> +++ b/arch/powerpc/sysdev/cpm1.c
> @@ -102,7 +102,7 @@ static int cpm_pic_host_map(struct irq_host *h, unsig=
ned int virq,
> =A0{
> =A0 =A0 =A0 =A0pr_debug("cpm_pic_host_map(%d, 0x%lx)\n", virq, hw);
>
> - =A0 =A0 =A0 get_irq_desc(virq)->status |=3D IRQ_LEVEL;
> + =A0 =A0 =A0 irq_to_desc(virq)->status |=3D IRQ_LEVEL;
> =A0 =A0 =A0 =A0set_irq_chip_and_handler(virq, &cpm_pic, handle_fasteoi_ir=
q);
> =A0 =A0 =A0 =A0return 0;
> =A0}
> diff --git a/arch/powerpc/sysdev/cpm2_pic.c b/arch/powerpc/sysdev/cpm2_pi=
c.c
> index 78f1f7c..722cf72 100644
> --- a/arch/powerpc/sysdev/cpm2_pic.c
> +++ b/arch/powerpc/sysdev/cpm2_pic.c
> @@ -115,11 +115,13 @@ static void cpm2_ack(unsigned int virq)
>
> =A0static void cpm2_end_irq(unsigned int virq)
> =A0{
> + =A0 =A0 =A0 struct irq_desc *desc;
> =A0 =A0 =A0 =A0int =A0 =A0 bit, word;
> =A0 =A0 =A0 =A0unsigned int irq_nr =3D virq_to_hw(virq);
>
> - =A0 =A0 =A0 if (!(irq_desc[irq_nr].status & (IRQ_DISABLED|IRQ_INPROGRES=
S))
> - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 && irq_desc[irq_nr].action)=
 {
> + =A0 =A0 =A0 desc =3D irq_to_desc(irq_nr);
> + =A0 =A0 =A0 if (!(desc->status & (IRQ_DISABLED|IRQ_INPROGRESS))
> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 && desc->action) {
>
> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0bit =3D irq_to_siubit[irq_nr];
> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0word =3D irq_to_siureg[irq_nr];
> @@ -138,7 +140,7 @@ static void cpm2_end_irq(unsigned int virq)
> =A0static int cpm2_set_irq_type(unsigned int virq, unsigned int flow_type=
)
> =A0{
> =A0 =A0 =A0 =A0unsigned int src =3D virq_to_hw(virq);
> - =A0 =A0 =A0 struct irq_desc *desc =3D get_irq_desc(virq);
> + =A0 =A0 =A0 struct irq_desc *desc =3D irq_to_desc(virq);
> =A0 =A0 =A0 =A0unsigned int vold, vnew, edibit;
>
> =A0 =A0 =A0 =A0if (flow_type =3D=3D IRQ_TYPE_NONE)
> @@ -210,7 +212,7 @@ static int cpm2_pic_host_map(struct irq_host *h, unsi=
gned int virq,
> =A0{
> =A0 =A0 =A0 =A0pr_debug("cpm2_pic_host_map(%d, 0x%lx)\n", virq, hw);
>
> - =A0 =A0 =A0 get_irq_desc(virq)->status |=3D IRQ_LEVEL;
> + =A0 =A0 =A0 irq_to_desc(virq)->status |=3D IRQ_LEVEL;
> =A0 =A0 =A0 =A0set_irq_chip_and_handler(virq, &cpm2_pic, handle_level_irq=
);
> =A0 =A0 =A0 =A0return 0;
> =A0}
> diff --git a/arch/powerpc/sysdev/fsl_msi.c b/arch/powerpc/sysdev/fsl_msi.=
c
> index da38a1f..7174374 100644
> --- a/arch/powerpc/sysdev/fsl_msi.c
> +++ b/arch/powerpc/sysdev/fsl_msi.c
> @@ -55,7 +55,7 @@ static int fsl_msi_host_map(struct irq_host *h, unsigne=
d int virq,
> =A0{
> =A0 =A0 =A0 =A0struct irq_chip *chip =3D &fsl_msi_chip;
>
> - =A0 =A0 =A0 get_irq_desc(virq)->status |=3D IRQ_TYPE_EDGE_FALLING;
> + =A0 =A0 =A0 irq_to_desc(virq)->status |=3D IRQ_TYPE_EDGE_FALLING;
>
> =A0 =A0 =A0 =A0set_irq_chip_and_handler(virq, chip, handle_edge_irq);
>
> diff --git a/arch/powerpc/sysdev/i8259.c b/arch/powerpc/sysdev/i8259.c
> index a96584a..78ed945 100644
> --- a/arch/powerpc/sysdev/i8259.c
> +++ b/arch/powerpc/sysdev/i8259.c
> @@ -175,12 +175,12 @@ static int i8259_host_map(struct irq_host *h, unsig=
ned int virq,
>
> =A0 =A0 =A0 =A0/* We block the internal cascade */
> =A0 =A0 =A0 =A0if (hw =3D=3D 2)
> - =A0 =A0 =A0 =A0 =A0 =A0 =A0 get_irq_desc(virq)->status |=3D IRQ_NOREQUE=
ST;
> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 irq_to_desc(virq)->status |=3D IRQ_NOREQUES=
T;
>
> =A0 =A0 =A0 =A0/* We use the level handler only for now, we might want to
> =A0 =A0 =A0 =A0 * be more cautious here but that works for now
> =A0 =A0 =A0 =A0 */
> - =A0 =A0 =A0 get_irq_desc(virq)->status |=3D IRQ_LEVEL;
> + =A0 =A0 =A0 irq_to_desc(virq)->status |=3D IRQ_LEVEL;
> =A0 =A0 =A0 =A0set_irq_chip_and_handler(virq, &i8259_pic, handle_level_ir=
q);
> =A0 =A0 =A0 =A0return 0;
> =A0}
> diff --git a/arch/powerpc/sysdev/ipic.c b/arch/powerpc/sysdev/ipic.c
> index cb7689c..f042c1d 100644
> --- a/arch/powerpc/sysdev/ipic.c
> +++ b/arch/powerpc/sysdev/ipic.c
> @@ -605,7 +605,7 @@ static int ipic_set_irq_type(unsigned int virq, unsig=
ned int flow_type)
> =A0{
> =A0 =A0 =A0 =A0struct ipic *ipic =3D ipic_from_irq(virq);
> =A0 =A0 =A0 =A0unsigned int src =3D ipic_irq_to_hw(virq);
> - =A0 =A0 =A0 struct irq_desc *desc =3D get_irq_desc(virq);
> + =A0 =A0 =A0 struct irq_desc *desc =3D irq_to_desc(virq);
> =A0 =A0 =A0 =A0unsigned int vold, vnew, edibit;
>
> =A0 =A0 =A0 =A0if (flow_type =3D=3D IRQ_TYPE_NONE)
> diff --git a/arch/powerpc/sysdev/mpc8xx_pic.c b/arch/powerpc/sysdev/mpc8x=
x_pic.c
> index 5d2d552..0117958 100644
> --- a/arch/powerpc/sysdev/mpc8xx_pic.c
> +++ b/arch/powerpc/sysdev/mpc8xx_pic.c
> @@ -72,7 +72,7 @@ static void mpc8xx_end_irq(unsigned int virq)
>
> =A0static int mpc8xx_set_irq_type(unsigned int virq, unsigned int flow_ty=
pe)
> =A0{
> - =A0 =A0 =A0 struct irq_desc *desc =3D get_irq_desc(virq);
> + =A0 =A0 =A0 struct irq_desc *desc =3D irq_to_desc(virq);
>
> =A0 =A0 =A0 =A0desc->status &=3D ~(IRQ_TYPE_SENSE_MASK | IRQ_LEVEL);
> =A0 =A0 =A0 =A0desc->status |=3D flow_type & IRQ_TYPE_SENSE_MASK;
> diff --git a/arch/powerpc/sysdev/mpic.c b/arch/powerpc/sysdev/mpic.c
> index 30c44e6..4fd57ab 100644
> --- a/arch/powerpc/sysdev/mpic.c
> +++ b/arch/powerpc/sysdev/mpic.c
> @@ -572,7 +572,7 @@ static int irq_choose_cpu(unsigned int virt_irq)
> =A0 =A0 =A0 =A0cpumask_t mask;
> =A0 =A0 =A0 =A0int cpuid;
>
> - =A0 =A0 =A0 cpumask_copy(&mask, irq_desc[virt_irq].affinity);
> + =A0 =A0 =A0 cpumask_copy(&mask, irq_to_desc(virt_irq)->affinity);
> =A0 =A0 =A0 =A0if (cpus_equal(mask, CPU_MASK_ALL)) {
> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0static int irq_rover;
> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0static DEFINE_SPINLOCK(irq_rover_lock);
> @@ -621,7 +621,7 @@ static struct mpic *mpic_find(unsigned int irq)
> =A0 =A0 =A0 =A0if (irq < NUM_ISA_INTERRUPTS)
> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0return NULL;
>
> - =A0 =A0 =A0 return irq_desc[irq].chip_data;
> + =A0 =A0 =A0 return irq_to_desc(irq)->chip_data;
> =A0}
>
> =A0/* Determine if the linux irq is an IPI */
> @@ -648,14 +648,14 @@ static inline u32 mpic_physmask(u32 cpumask)
> =A0/* Get the mpic structure from the IPI number */
> =A0static inline struct mpic * mpic_from_ipi(unsigned int ipi)
> =A0{
> - =A0 =A0 =A0 return irq_desc[ipi].chip_data;
> + =A0 =A0 =A0 return irq_to_desc(ipi)->chip_data;
> =A0}
> =A0#endif
>
> =A0/* Get the mpic structure from the irq number */
> =A0static inline struct mpic * mpic_from_irq(unsigned int irq)
> =A0{
> - =A0 =A0 =A0 return irq_desc[irq].chip_data;
> + =A0 =A0 =A0 return irq_to_desc(irq)->chip_data;
> =A0}
>
> =A0/* Send an EOI */
> @@ -735,7 +735,7 @@ static void mpic_unmask_ht_irq(unsigned int irq)
>
> =A0 =A0 =A0 =A0mpic_unmask_irq(irq);
>
> - =A0 =A0 =A0 if (irq_desc[irq].status & IRQ_LEVEL)
> + =A0 =A0 =A0 if (irq_to_desc(irq)->status & IRQ_LEVEL)
> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0mpic_ht_end_irq(mpic, src);
> =A0}
>
> @@ -745,7 +745,7 @@ static unsigned int mpic_startup_ht_irq(unsigned int =
irq)
> =A0 =A0 =A0 =A0unsigned int src =3D mpic_irq_to_hw(irq);
>
> =A0 =A0 =A0 =A0mpic_unmask_irq(irq);
> - =A0 =A0 =A0 mpic_startup_ht_interrupt(mpic, src, irq_desc[irq].status);
> + =A0 =A0 =A0 mpic_startup_ht_interrupt(mpic, src, irq_to_desc(irq)->stat=
us);
>
> =A0 =A0 =A0 =A0return 0;
> =A0}
> @@ -755,7 +755,7 @@ static void mpic_shutdown_ht_irq(unsigned int irq)
> =A0 =A0 =A0 =A0struct mpic *mpic =3D mpic_from_irq(irq);
> =A0 =A0 =A0 =A0unsigned int src =3D mpic_irq_to_hw(irq);
>
> - =A0 =A0 =A0 mpic_shutdown_ht_interrupt(mpic, src, irq_desc[irq].status)=
;
> + =A0 =A0 =A0 mpic_shutdown_ht_interrupt(mpic, src, irq_to_desc(irq)->sta=
tus);
> =A0 =A0 =A0 =A0mpic_mask_irq(irq);
> =A0}
>
> @@ -772,7 +772,7 @@ static void mpic_end_ht_irq(unsigned int irq)
> =A0 =A0 =A0 =A0 * latched another edge interrupt coming in anyway
> =A0 =A0 =A0 =A0 */
>
> - =A0 =A0 =A0 if (irq_desc[irq].status & IRQ_LEVEL)
> + =A0 =A0 =A0 if (irq_to_desc(irq)->status & IRQ_LEVEL)
> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0mpic_ht_end_irq(mpic, src);
> =A0 =A0 =A0 =A0mpic_eoi(mpic);
> =A0}
> @@ -856,7 +856,7 @@ int mpic_set_irq_type(unsigned int virq, unsigned int=
 flow_type)
> =A0{
> =A0 =A0 =A0 =A0struct mpic *mpic =3D mpic_from_irq(virq);
> =A0 =A0 =A0 =A0unsigned int src =3D mpic_irq_to_hw(virq);
> - =A0 =A0 =A0 struct irq_desc *desc =3D get_irq_desc(virq);
> + =A0 =A0 =A0 struct irq_desc *desc =3D irq_to_desc(virq);
> =A0 =A0 =A0 =A0unsigned int vecpri, vold, vnew;
>
> =A0 =A0 =A0 =A0DBG("mpic: set_irq_type(mpic:@%p,virq:%d,src:0x%x,type:0x%=
x)\n",
> diff --git a/arch/powerpc/sysdev/mv64x60_pic.c b/arch/powerpc/sysdev/mv64=
x60_pic.c
> index 2aa4ed0..485b924 100644
> --- a/arch/powerpc/sysdev/mv64x60_pic.c
> +++ b/arch/powerpc/sysdev/mv64x60_pic.c
> @@ -213,7 +213,7 @@ static int mv64x60_host_map(struct irq_host *h, unsig=
ned int virq,
> =A0{
> =A0 =A0 =A0 =A0int level1;
>
> - =A0 =A0 =A0 get_irq_desc(virq)->status |=3D IRQ_LEVEL;
> + =A0 =A0 =A0 irq_to_desc(virq)->status |=3D IRQ_LEVEL;
>
> =A0 =A0 =A0 =A0level1 =3D (hwirq & MV64x60_LEVEL1_MASK) >> MV64x60_LEVEL1=
_OFFSET;
> =A0 =A0 =A0 =A0BUG_ON(level1 > MV64x60_LEVEL1_GPP);
> diff --git a/arch/powerpc/sysdev/qe_lib/qe_ic.c b/arch/powerpc/sysdev/qe_=
lib/qe_ic.c
> index 3faa42e..fc09874 100644
> --- a/arch/powerpc/sysdev/qe_lib/qe_ic.c
> +++ b/arch/powerpc/sysdev/qe_lib/qe_ic.c
> @@ -189,7 +189,7 @@ static inline void qe_ic_write(volatile __be32 =A0__i=
omem * base, unsigned int reg
>
> =A0static inline struct qe_ic *qe_ic_from_irq(unsigned int virq)
> =A0{
> - =A0 =A0 =A0 return irq_desc[virq].chip_data;
> + =A0 =A0 =A0 return irq_to_desc(virq)->chip_data;
> =A0}
>
> =A0#define virq_to_hw(virq) =A0 =A0 =A0 ((unsigned int)irq_map[virq].hwir=
q)
> @@ -263,7 +263,7 @@ static int qe_ic_host_map(struct irq_host *h, unsigne=
d int virq,
> =A0 =A0 =A0 =A0chip =3D &qe_ic->hc_irq;
>
> =A0 =A0 =A0 =A0set_irq_chip_data(virq, qe_ic);
> - =A0 =A0 =A0 get_irq_desc(virq)->status |=3D IRQ_LEVEL;
> + =A0 =A0 =A0 irq_to_desc(virq)->status |=3D IRQ_LEVEL;
>
> =A0 =A0 =A0 =A0set_irq_chip_and_handler(virq, chip, handle_level_irq);
>
> diff --git a/arch/powerpc/sysdev/tsi108_pci.c b/arch/powerpc/sysdev/tsi10=
8_pci.c
> index cf244a4..02f6009 100644
> --- a/arch/powerpc/sysdev/tsi108_pci.c
> +++ b/arch/powerpc/sysdev/tsi108_pci.c
> @@ -398,7 +398,7 @@ static int pci_irq_host_map(struct irq_host *h, unsig=
ned int virq,
> =A0 =A0 =A0 =A0DBG("%s(%d, 0x%lx)\n", __func__, virq, hw);
> =A0 =A0 =A0 =A0if ((virq >=3D 1) && (virq <=3D 4)){
> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0irq =3D virq + IRQ_PCI_INTAD_BASE - 1;
> - =A0 =A0 =A0 =A0 =A0 =A0 =A0 get_irq_desc(irq)->status |=3D IRQ_LEVEL;
> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 irq_to_desc(irq)->status |=3D IRQ_LEVEL;
> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0set_irq_chip(irq, &tsi108_pci_irq);
> =A0 =A0 =A0 =A0}
> =A0 =A0 =A0 =A0return 0;
> diff --git a/arch/powerpc/sysdev/uic.c b/arch/powerpc/sysdev/uic.c
> index 466ce9a..cf97935 100644
> --- a/arch/powerpc/sysdev/uic.c
> +++ b/arch/powerpc/sysdev/uic.c
> @@ -57,7 +57,7 @@ struct uic {
>
> =A0static void uic_unmask_irq(unsigned int virq)
> =A0{
> - =A0 =A0 =A0 struct irq_desc *desc =3D get_irq_desc(virq);
> + =A0 =A0 =A0 struct irq_desc *desc =3D irq_to_desc(virq);
> =A0 =A0 =A0 =A0struct uic *uic =3D get_irq_chip_data(virq);
> =A0 =A0 =A0 =A0unsigned int src =3D uic_irq_to_hw(virq);
> =A0 =A0 =A0 =A0unsigned long flags;
> @@ -101,7 +101,7 @@ static void uic_ack_irq(unsigned int virq)
>
> =A0static void uic_mask_ack_irq(unsigned int virq)
> =A0{
> - =A0 =A0 =A0 struct irq_desc *desc =3D get_irq_desc(virq);
> + =A0 =A0 =A0 struct irq_desc *desc =3D irq_to_desc(virq);
> =A0 =A0 =A0 =A0struct uic *uic =3D get_irq_chip_data(virq);
> =A0 =A0 =A0 =A0unsigned int src =3D uic_irq_to_hw(virq);
> =A0 =A0 =A0 =A0unsigned long flags;
> @@ -129,7 +129,7 @@ static int uic_set_irq_type(unsigned int virq, unsign=
ed int flow_type)
> =A0{
> =A0 =A0 =A0 =A0struct uic *uic =3D get_irq_chip_data(virq);
> =A0 =A0 =A0 =A0unsigned int src =3D uic_irq_to_hw(virq);
> - =A0 =A0 =A0 struct irq_desc *desc =3D get_irq_desc(virq);
> + =A0 =A0 =A0 struct irq_desc *desc =3D irq_to_desc(virq);
> =A0 =A0 =A0 =A0unsigned long flags;
> =A0 =A0 =A0 =A0int trigger, polarity;
> =A0 =A0 =A0 =A0u32 tr, pr, mask;
> diff --git a/arch/powerpc/sysdev/xilinx_intc.c b/arch/powerpc/sysdev/xili=
nx_intc.c
> index 40edad5..ab74371 100644
> --- a/arch/powerpc/sysdev/xilinx_intc.c
> +++ b/arch/powerpc/sysdev/xilinx_intc.c
> @@ -79,7 +79,7 @@ static void xilinx_intc_mask(unsigned int virq)
>
> =A0static int xilinx_intc_set_type(unsigned int virq, unsigned int flow_t=
ype)
> =A0{
> - =A0 =A0 =A0 struct irq_desc *desc =3D get_irq_desc(virq);
> + =A0 =A0 =A0 struct irq_desc *desc =3D irq_to_desc(virq);
>
> =A0 =A0 =A0 =A0desc->status &=3D ~(IRQ_TYPE_SENSE_MASK | IRQ_LEVEL);
> =A0 =A0 =A0 =A0desc->status |=3D flow_type & IRQ_TYPE_SENSE_MASK;
> --
> 1.6.2.1
>
> _______________________________________________
> Linuxppc-dev mailing list
> Linuxppc-dev@lists.ozlabs.org
> https://lists.ozlabs.org/listinfo/linuxppc-dev
>



--=20
Grant Likely, B.Sc., P.Eng.
Secret Lab Technologies Ltd.

^ permalink raw reply	[flat|nested] 15+ messages in thread

* Re: [PATCH 1/6] powerpc: Make NR_IRQS a CONFIG option
  2009-10-14 18:59 ` [PATCH 1/6] powerpc: Make NR_IRQS a CONFIG option Grant Likely
@ 2009-10-14 23:47   ` Michael Ellerman
  0 siblings, 0 replies; 15+ messages in thread
From: Michael Ellerman @ 2009-10-14 23:47 UTC (permalink / raw)
  To: Grant Likely; +Cc: linuxppc-dev

[-- Attachment #1: Type: text/plain, Size: 1328 bytes --]

On Wed, 2009-10-14 at 12:59 -0600, Grant Likely wrote:
> On Tue, Oct 13, 2009 at 11:44 PM, Michael Ellerman
> <michael@ellerman.id.au> wrote:
> > The irq_desc array consumes quite a lot of space, and for systems
> > that don't need or can't have 512 irqs it's just wasted space.
> >
> > The first 16 are reserved for ISA, so the minimum of 32 is really
> > 16 - and no one has asked for more than 512 so leave that as the
> > maximum.
> 
> Does it really make sense to have this as a user twiddlable value?
> Especially when many users just don't have the background to know what
> an appropriate value is here and will get it wrong?  I believe your
> sparse IRQ patch has a bigger impact anyway on systems where memory is
> tight.

We have users? But yes I think it's reasonable, there's a million other
options people can fiddle with and break their kernel, I don't see that
this is much different.

The sparse IRQ patch has a bigger difference on the size of the irq_desc
array, but there are still other things that are statically sized based
on NR_IRQs. So if you're building an machine-specific kernel and you
know you're only going to have N interrupts, then this will give you a
bigger saving.

But I'm not super fussed, if other people think it's too dangerous we
can drop it.

cheers



[-- Attachment #2: This is a digitally signed message part --]
[-- Type: application/pgp-signature, Size: 197 bytes --]

^ permalink raw reply	[flat|nested] 15+ messages in thread

* Re: [PATCH 6/6] powerpc: Enable sparse irq_descs on powerpc
  2009-10-14 18:44   ` Grant Likely
@ 2009-10-14 23:51     ` Michael Ellerman
  2009-10-15  0:33       ` Grant Likely
  0 siblings, 1 reply; 15+ messages in thread
From: Michael Ellerman @ 2009-10-14 23:51 UTC (permalink / raw)
  To: Grant Likely; +Cc: linuxppc-dev

[-- Attachment #1: Type: text/plain, Size: 1262 bytes --]

On Wed, 2009-10-14 at 12:44 -0600, Grant Likely wrote:
> On Tue, Oct 13, 2009 at 11:45 PM, Michael Ellerman
> <michael@ellerman.id.au> wrote:
> > Defining CONFIG_SPARSE_IRQ enables generic code that gets rid of the
> > static irq_desc array, and replaces it with an array of pointers to
> > irq_descs.
> >
> > It also allows node local allocation of irq_descs, however we
> > currently don't have the information available to do that, so we just
> > allocate them on all on node 0.
> >
> > Signed-off-by: Michael Ellerman <michael@ellerman.id.au>
> 
> Why not make sparse IRQs manditory for all platforms?  Is there a
> performance concern with doing so?  From a maintenance perspective,
> I'd rather see IRQ descs manged in one way only to keep the code
> simple.

I agree on the maintenance angle. My thinking was we'd run with it
optional but default y for a release or two, and if no one complains we
can make it mandatory.

It does make some code paths bigger, and looking up an irq_desc is going
to take slightly more cycles. I don't think it's a big issue, but I
thought we should try it for a while before making it mandatory. The
code has only been tested on x86 and sh as far as I know.

cheers

ps. thanks for the review

[-- Attachment #2: This is a digitally signed message part --]
[-- Type: application/pgp-signature, Size: 197 bytes --]

^ permalink raw reply	[flat|nested] 15+ messages in thread

* Re: [PATCH 6/6] powerpc: Enable sparse irq_descs on powerpc
  2009-10-14 23:51     ` Michael Ellerman
@ 2009-10-15  0:33       ` Grant Likely
  0 siblings, 0 replies; 15+ messages in thread
From: Grant Likely @ 2009-10-15  0:33 UTC (permalink / raw)
  To: michael; +Cc: linuxppc-dev

On Wed, Oct 14, 2009 at 5:51 PM, Michael Ellerman
<michael@ellerman.id.au> wrote:
> On Wed, 2009-10-14 at 12:44 -0600, Grant Likely wrote:
>> Why not make sparse IRQs manditory for all platforms? =A0Is there a
>> performance concern with doing so? =A0From a maintenance perspective,
>> I'd rather see IRQ descs manged in one way only to keep the code
>> simple.
>
> I agree on the maintenance angle. My thinking was we'd run with it
> optional but default y for a release or two, and if no one complains we
> can make it mandatory.
>
> It does make some code paths bigger, and looking up an irq_desc is going
> to take slightly more cycles. I don't think it's a big issue, but I
> thought we should try it for a while before making it mandatory. The
> code has only been tested on x86 and sh as far as I know.

No guts, no glory.  I say throw it into linux-next to give it some
time before the next merge window.  I don't think you'll get any
better results by having it optional for a few releases (in fact, I
suspect that people who do have problems will just end up turning it
off and waiting for someone else to report/fix the problems).  If this
is the direction IRQ handling is going, then just make the change and
force any bugs to be dealt with before the next release.

> ps. thanks for the review

You're welcome.

g.

--=20
Grant Likely, B.Sc., P.Eng.
Secret Lab Technologies Ltd.

^ permalink raw reply	[flat|nested] 15+ messages in thread

end of thread, other threads:[~2009-10-15  0:33 UTC | newest]

Thread overview: 15+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2009-10-14  5:44 [PATCH 1/6] powerpc: Make NR_IRQS a CONFIG option Michael Ellerman
2009-10-14  5:44 ` [PATCH 2/6] powerpc/pseries: Use irq_has_action() in eeh_disable_irq() Michael Ellerman
2009-10-14 18:33   ` Grant Likely
2009-10-14  5:44 ` [PATCH 3/6] powerpc: Remove get_irq_desc() Michael Ellerman
2009-10-14 19:02   ` Grant Likely
2009-10-14  5:44 ` [PATCH 4/6] powerpc: Make virq_debug_show() cope with sparse irq_descs Michael Ellerman
2009-10-14 18:34   ` Grant Likely
2009-10-14  5:45 ` [PATCH 5/6] powerpc: Rearrange and fix show_interrupts() for " Michael Ellerman
2009-10-14 18:37   ` Grant Likely
2009-10-14  5:45 ` [PATCH 6/6] powerpc: Enable sparse irq_descs on powerpc Michael Ellerman
2009-10-14 18:44   ` Grant Likely
2009-10-14 23:51     ` Michael Ellerman
2009-10-15  0:33       ` Grant Likely
2009-10-14 18:59 ` [PATCH 1/6] powerpc: Make NR_IRQS a CONFIG option Grant Likely
2009-10-14 23:47   ` Michael Ellerman

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).