Sophie

Sophie

distrib > Scientific%20Linux > 5x > x86_64 > by-pkgid > 27922b4260f65d317aabda37e42bbbff > files > 1542

kernel-2.6.18-238.el5.src.rpm

From: Luming Yu <luyu@redhat.com>
Date: Fri, 25 Jul 2008 16:19:14 +0800
Subject: [ia64] xen: handle ipi case IA64_TIMER_VECTOR
Message-id: 48898C82.2040104@redhat.com
O-Subject: [RHEL 5.3 PATCH 1/1] bz 451745: Fix boot failure on ia64-xen
Bugzilla: 451745

BZ 451745

Description of problem:
1.
Without this patch applied,  the kernel with back port patches  of bz
451745 (for 3463a93def55c309f3c0d0a8aaf216be3be42d64  and
fa1d19e5d9a94120f31e5783ab44758f46892d94  and
2826f8c0f4c97b7db33e2a680f184d828eb7a785 ) would  boot hang on ia64-xen.

2.
In function: ia64_send_ipi (arch/ia64/kernel/irq_64.c 2.6.18-94.el5),
IA64_TIMER_VECTOR is actually NOT supported by current rhel 5 xen code.
The patch "[RHEL 5.3 PATCH 1/2] bz 451745: Update check_sal_cache_flush
to use platform_send_ipi" would cause ia64 xen kernel boot
hang because this patch assumes platform_send_ipi   IA64_TIMER_VECTOR
work, and has a loop waiting for the arrival of IA64_TIMER ipi to break it.

Upstream status:

http://xen.markmail.org/message/2xwp64qu3e7k4545

Note:
Please apply the patche series for bz 451745 in this order:
1.[RHEL 5.3 PATCH 1/2]  bz 451745:  Update check_sal_cache_flush to use
platform_send_ipi
2.[RHEL 5.3 PATCH 2/2]  bz 451745:  move SAL_CACHE_FLUSH check later in
boot
3.[RHEL 5.3 PATCH 1/1]  bz 451745: Fix boot failure on ia64/sn2
4.[RHEL 5.3 PATCH 1/1]  bz 451745: Fix boot failure on ia64-xen

Testing status:
Boot fine on tiger4 with ia64-xen kernel , and nothing unusual found.

Please review and ACK.

Thanks,
Luming

diff --git a/arch/ia64/kernel/irq_ia64.c b/arch/ia64/kernel/irq_ia64.c
index 25a0e8f..4056dd6 100644
--- a/arch/ia64/kernel/irq_ia64.c
+++ b/arch/ia64/kernel/irq_ia64.c
@@ -586,6 +586,7 @@ ia64_send_ipi (int cpu, int vector, int delivery_mode, int redirect)
 	void __iomem *ipi_addr;
 	unsigned long ipi_data;
 	unsigned long phys_cpu_id;
+	extern void xen_send_ipi (int cpu, int vec);
 
 #ifdef CONFIG_XEN
         if (is_running_on_xen()) {
@@ -594,7 +595,6 @@ ia64_send_ipi (int cpu, int vector, int delivery_mode, int redirect)
 #ifdef CONFIG_SMP
 		/* TODO: we need to call vcpu_up here */
 		if (unlikely(vector == ap_wakeup_vector)) {
-			extern void xen_send_ipi (int cpu, int vec);
 			xen_send_ipi (cpu, vector);
 			//vcpu_prepare_and_up(cpu);
 			return;
@@ -614,6 +614,9 @@ ia64_send_ipi (int cpu, int vector, int delivery_mode, int redirect)
 		case IA64_CPEP_VECTOR:
 			irq = per_cpu(ipi_to_irq, cpu)[CPEP_VECTOR];
 			break;
+		case IA64_TIMER_VECTOR:
+			xen_send_ipi(cpu,vector);
+			return;
 		default:
 			printk(KERN_WARNING "Unsupported IPI type 0x%x\n",
 			       vector);