Sophie

Sophie

distrib > Scientific%20Linux > 5x > x86_64 > by-pkgid > fc11cd6e1c513a17304da94a5390f3cd > files > 4299

kernel-2.6.18-194.11.1.el5.src.rpm

From: Kei Tokunaga <ktokunag@redhat.com>
Subject: [RHEL5.1 PATCH 12/21] Set IRQ_PER_CPU status on percpu IRQs
Date: Thu, 07 Jun 2007 03:42:10 -0400
Bugzilla: 242136
Message-Id: <4667B6D2.6040608@redhat.com>
Changelog: [xen] ia64: Set IRQ_PER_CPU status on percpu IRQs


bz242136
https://bugzilla.redhat.com/bugzilla/show_bug.cgi?id=242136

Backport of cset#13851.

This is for cpu hotplug feature.  Need to prevent percpu
IRQs from being triggered when CPUs are offlined.  Also
need to remove some extraneous printks and rename variables.

Thanks,
Kei


rh bug 242136

# HG changeset patch
# User awilliam@xenbuild2.aw
# Date 1169761245 25200
# Node ID 730e24a1594ac13e8a5a0bde7cd2530dc40b7d7b
# Parent  b4df7de0cbf7530c3248956243bc9c520db2d609
[IA64] Set IRQ_PER_CPU status on percpu IRQs

   This is necessary to prevent percpu IRQs from being triggered
when CPUs are offlined.  Also remove some extraneous printks and
rename variables.

Signed-off-by: Alex Williamson <alex.williamson@hp.com>


---

 linux-2.6.18-21.el5-gerd-order-kei/arch/ia64/kernel/irq_ia64.c |   69 +++++-----
 1 file changed, 37 insertions(+), 32 deletions(-)

diff -puN arch/ia64/kernel/irq_ia64.c~13851-IA64_Set_IRQ_PER_CPU_status_on_percpu_IRQs arch/ia64/kernel/irq_ia64.c
--- linux-2.6.18-21.el5-gerd-order/arch/ia64/kernel/irq_ia64.c~13851-IA64_Set_IRQ_PER_CPU_status_on_percpu_IRQs	2007-06-07 02:44:32.000000000 -0400
+++ linux-2.6.18-21.el5-gerd-order-kei/arch/ia64/kernel/irq_ia64.c	2007-06-07 02:44:32.000000000 -0400
@@ -312,81 +312,85 @@ static struct irqaction resched_irqactio
  * required.
  */
 static void
-xen_register_percpu_irq (unsigned int irq, struct irqaction *action, int save)
+xen_register_percpu_irq (unsigned int vec, struct irqaction *action, int save)
 {
 	unsigned int cpu = smp_processor_id();
-	int ret = 0;
+	irq_desc_t *desc;
+	int irq = 0;
 
 	if (xen_slab_ready) {
-		switch (irq) {
+		switch (vec) {
 		case IA64_TIMER_VECTOR:
 			sprintf(timer_name[cpu], "%s%d", action->name, cpu);
-			ret = bind_virq_to_irqhandler(VIRQ_ITC, cpu,
+			irq = bind_virq_to_irqhandler(VIRQ_ITC, cpu,
 				action->handler, action->flags,
 				timer_name[cpu], action->dev_id);
-			per_cpu(timer_irq,cpu) = ret;
-			printk(KERN_INFO "register VIRQ_ITC (%s) to xen irq (%d)\n", timer_name[cpu], ret);
+			per_cpu(timer_irq,cpu) = irq;
 			break;
 		case IA64_IPI_RESCHEDULE:
 			sprintf(resched_name[cpu], "%s%d", action->name, cpu);
-			ret = bind_ipi_to_irqhandler(RESCHEDULE_VECTOR, cpu,
+			irq = bind_ipi_to_irqhandler(RESCHEDULE_VECTOR, cpu,
 				action->handler, action->flags,
 				resched_name[cpu], action->dev_id);
-			per_cpu(resched_irq,cpu) = ret;
-			printk(KERN_INFO "register RESCHEDULE_VECTOR (%s) to xen irq (%d)\n", resched_name[cpu], ret);
+			per_cpu(resched_irq,cpu) = irq;
 			break;
 		case IA64_IPI_VECTOR:
 			sprintf(ipi_name[cpu], "%s%d", action->name, cpu);
-			ret = bind_ipi_to_irqhandler(IPI_VECTOR, cpu,
+			irq = bind_ipi_to_irqhandler(IPI_VECTOR, cpu,
 				action->handler, action->flags,
 				ipi_name[cpu], action->dev_id);
-			per_cpu(ipi_irq,cpu) = ret;
-			printk(KERN_INFO "register IPI_VECTOR (%s) to xen irq (%d)\n", ipi_name[cpu], ret);
-			break;
-		case IA64_SPURIOUS_INT_VECTOR:
+			per_cpu(ipi_irq,cpu) = irq;
 			break;
 		case IA64_CMC_VECTOR:
 			sprintf(cmc_name[cpu], "%s%d", action->name, cpu);
-			ret = bind_virq_to_irqhandler(VIRQ_MCA_CMC, cpu,
+			irq = bind_virq_to_irqhandler(VIRQ_MCA_CMC, cpu,
 			                              action->handler,
 			                              action->flags,
 			                              cmc_name[cpu],
 			                              action->dev_id);
-			per_cpu(cmc_irq,cpu) = ret;
-			printk(KERN_INFO "register VIRQ_MCA_CMC (%s) to xen "
-			       "irq (%d)\n", cmc_name[cpu], ret);
+			per_cpu(cmc_irq,cpu) = irq;
 			break;
 		case IA64_CMCP_VECTOR:
 			sprintf(cmcp_name[cpu], "%s%d", action->name, cpu);
-			ret = bind_ipi_to_irqhandler(CMCP_VECTOR, cpu,
+			irq = bind_ipi_to_irqhandler(CMCP_VECTOR, cpu,
 			                             action->handler,
 			                             action->flags,
 			                             cmcp_name[cpu],
 			                             action->dev_id);
-			per_cpu(cmcp_irq,cpu) = ret;
-			printk(KERN_INFO "register CMCP_VECTOR (%s) to xen "
-			       "irq (%d)\n", cmcp_name[cpu], ret);
+			per_cpu(cmcp_irq,cpu) = irq;
 			break;
 		case IA64_CPEP_VECTOR:
 			sprintf(cpep_name[cpu], "%s%d", action->name, cpu);
-			ret = bind_ipi_to_irqhandler(CPEP_VECTOR, cpu,
+			irq = bind_ipi_to_irqhandler(CPEP_VECTOR, cpu,
 			                             action->handler,
 			                             action->flags,
 			                             cpep_name[cpu],
 			                             action->dev_id);
-			per_cpu(cpep_irq,cpu) = ret;
-			printk(KERN_INFO "register CPEP_VECTOR (%s) to xen "
-			       "irq (%d)\n", cpep_name[cpu], ret);
+			per_cpu(cpep_irq,cpu) = irq;
 			break;
 		case IA64_CPE_VECTOR:
-			printk(KERN_WARNING "register IA64_CPE_VECTOR "
-			       "IGNORED\n");
+		case IA64_MCA_RENDEZ_VECTOR:
+		case IA64_PERFMON_VECTOR:
+		case IA64_MCA_WAKEUP_VECTOR:
+		case IA64_SPURIOUS_INT_VECTOR:
+			/* No need to complain, these aren't supported. */
 			break;
 		default:
-			printk(KERN_WARNING "Percpu irq %d is unsupported by xen!\n", irq);
+			printk(KERN_WARNING "Percpu irq %d is unsupported "
+			       "by xen!\n", vec);
 			break;
 		}
-		BUG_ON(ret < 0);
+		BUG_ON(irq < 0);
+
+		if (irq > 0) {
+			/*
+			 * Mark percpu.  Without this, migrate_irqs() will
+			 * mark the interrupt for migrations and trigger it
+			 * on cpu hotplug.
+			 */
+			desc = irq_descp(irq);
+			desc->status |= IRQ_PER_CPU;
+		}
 	} 
 
 	/* For BSP, we cache registered percpu irqs, and then re-walk
@@ -394,7 +398,7 @@ xen_register_percpu_irq (unsigned int ir
 	 */
 	if (!cpu && save) {
 		BUG_ON(saved_irq_cnt == MAX_LATE_IRQ);
-		saved_percpu_irqs[saved_irq_cnt].irq = irq;
+		saved_percpu_irqs[saved_irq_cnt].irq = vec;
 		saved_percpu_irqs[saved_irq_cnt].action = action;
 		saved_irq_cnt++;
 		if (!xen_slab_ready)
@@ -585,7 +589,8 @@ ia64_send_ipi (int cpu, int vector, int 
 			irq = per_cpu(ipi_to_irq, cpu)[CPEP_VECTOR];
 			break;
 		default:
-			printk(KERN_WARNING"Unsupported IPI type 0x%x\n", vector);
+			printk(KERN_WARNING "Unsupported IPI type 0x%x\n",
+			       vector);
 			irq = 0;
 			break;
 		}		

_