[kernel/rawhide/user/myoung/xendom0: 4/4] IRQ fixes from stable/bug-fixes branch
myoung
myoung at fedoraproject.org
Wed Jan 5 18:57:24 UTC 2011
commit fcb3c76eb589822eba41ef505f025de8ac8bb16d
Author: Michael Young <m.a.young at durham.ac.uk>
Date: Wed Jan 5 18:56:34 2011 +0000
IRQ fixes from stable/bug-fixes branch
kernel.spec | 3 +
xen.pcifront.fixes.patch | 222 ++++++++++++++++++++++++++++++++++++++++-----
2 files changed, 200 insertions(+), 25 deletions(-)
---
diff --git a/kernel.spec b/kernel.spec
index cf6b15e..97513a4 100644
--- a/kernel.spec
+++ b/kernel.spec
@@ -1968,6 +1968,9 @@ fi
# || ||
%changelog
+* Wed Jan 05 2011 Michael Young <m.a.young at durham.ac.uk>
+- update xen.pcifront.fixes.patch with IRQ fixes from stable/bug-fixes branch
+
* Tue Jan 04 2011 Kyle McMartin <kyle at redhat.com> 2.6.37-1
- Track release of 2.6.37
diff --git a/xen.pcifront.fixes.patch b/xen.pcifront.fixes.patch
index 8698700..fef3372 100644
--- a/xen.pcifront.fixes.patch
+++ b/xen.pcifront.fixes.patch
@@ -1,42 +1,214 @@
-commit be72548ffe8618c3141c050400306b93f40a107a
-Author: Konrad Rzeszutek Wilk <konrad.wilk at oracle.com>
-Date: Tue Dec 14 11:43:40 2010 -0500
-
- Revert "xen: Find an unbound irq number in reverse order (high to low)."
-
- This reverts commit 482839e7b96098f678d0404ec4dd321419ab3ea7.
-
- Conflicts:
-
- drivers/xen/events.c
+From d1b758ebc2a82d738092cb42e742470f9d0ea53e Mon Sep 17 00:00:00 2001
+From: Konrad Rzeszutek Wilk <konrad.wilk at oracle.com>
+Date: Thu, 9 Dec 2010 14:53:29 -0500
+Subject: [PATCH 1/4] xen/irq: Cleanup the find_unbound_irq
+
+The "find_unbound_irq" is a bit unusual - it allocates
+virtual IRQ (event channels) in reverse order. This means
+starting at the "top" of the available IRQs (nr_irqs) down
+to the GSI/MSI IRQs (nr_irqs_gsi). Lets document this and
+also make the variables easier to understand.
+
+Signed-off-by: Konrad Rzeszutek Wilk <konrad.wilk at oracle.com>
+---
+ drivers/xen/events.c | 18 ++++++++++++------
+ 1 files changed, 12 insertions(+), 6 deletions(-)
diff --git a/drivers/xen/events.c b/drivers/xen/events.c
-index 0380664..8889e7f 100644
+index 31af0ac..4d4a23d 100644
--- a/drivers/xen/events.c
+++ b/drivers/xen/events.c
-@@ -401,11 +401,9 @@ static int find_unbound_irq(void)
+@@ -405,15 +405,21 @@ static int find_unbound_irq(void)
+ {
+ struct irq_data *data;
int irq, res;
- int start = get_nr_hw_irqs();
+- int start = get_nr_hw_irqs();
++ int bottom = get_nr_hw_irqs();
++ int top = nr_irqs-1;
- if (start == nr_irqs)
-- goto no_irqs;
++ if (bottom == nr_irqs)
+ goto no_irqs;
- /* nr_irqs is a magic value. Must not use it.*/
+- /* nr_irqs is a magic value. Must not use it.*/
- for (irq = nr_irqs-1; irq > start; irq--) {
-+ for (irq = start; irq < nr_irqs; irq++) {
++ /* This loop starts from the top of IRQ space and goes down.
++ * We need this b/c if we have a PCI device in a Xen PV guest
++ * we do not have an IO-APIC (though the backend might have them)
++ * mapped in. To not have a collision of physical IRQs with the Xen
++ * event channels start at the top of the IRQ space for virtual IRQs.
++ */
++ for (irq = top; irq > bottom; irq--) {
data = irq_get_irq_data(irq);
- /* only 0->15 have init'd desc; handle irq > 16 */
+- /* only 0->15 have init'd desc; handle irq > 16 */
++ /* only 15->0 have init'd desc; handle irq > 16 */
if (!data)
-@@ -414,11 +412,8 @@ static int find_unbound_irq(void)
break;
- if (data->chip != &xen_dynamic_chip)
- continue;
-- if (irq_info[irq].type == IRQT_UNBOUND)
-- return irq;
+ if (data->chip == &no_irq_chip)
+@@ -424,7 +430,7 @@ static int find_unbound_irq(void)
+ return irq;
}
--
+
- if (irq == start)
-+ if (irq == nr_irqs)
++ if (irq == bottom)
+ goto no_irqs;
+
+ res = irq_alloc_desc_at(irq, -1);
+--
+1.7.3.4
+
+
+From 67b0ea2bdcd781c17bb2d7949b42059c13c8bfb1 Mon Sep 17 00:00:00 2001
+From: Konrad Rzeszutek Wilk <konrad.wilk at oracle.com>
+Date: Thu, 9 Dec 2010 15:01:11 -0500
+Subject: [PATCH 2/4] xen/irq: Don't fall over when nr_irqs_gsi > nr_irqs.
+
+This scenario where the nr_irq_gsi is greater than nr_irqs
+is rather strange but lets still try to survive. Make sure
+to print a warning so the user wouldn't be surprised in case
+things don't work.
+
+Solves a bootup-crash when booting Xen and Linux under QEMU.
+
+Signed-off-by: Konrad Rzeszutek Wilk <konrad.wilk at oracle.com>
+---
+ drivers/xen/events.c | 9 +++++++++
+ 1 files changed, 9 insertions(+), 0 deletions(-)
+
+diff --git a/drivers/xen/events.c b/drivers/xen/events.c
+index 4d4a23d..98b7220 100644
+--- a/drivers/xen/events.c
++++ b/drivers/xen/events.c
+@@ -411,6 +411,7 @@ static int find_unbound_irq(void)
+ if (bottom == nr_irqs)
+ goto no_irqs;
+
++retry:
+ /* This loop starts from the top of IRQ space and goes down.
+ * We need this b/c if we have a PCI device in a Xen PV guest
+ * we do not have an IO-APIC (though the backend might have them)
+@@ -434,6 +435,14 @@ static int find_unbound_irq(void)
goto no_irqs;
res = irq_alloc_desc_at(irq, -1);
++ if (res == -EEXIST) {
++ top--;
++ if (bottom > top)
++ printk(KERN_ERR "Eating in GSI/MSI space (%d)!" \
++ " Your PCI device might not work!\n", top);
++ if (top > NR_IRQS_LEGACY)
++ goto retry;
++ }
+
+ if (WARN_ON(res != irq))
+ return -1;
+--
+1.7.3.4
+
+
+From 2e9876d91d05d8d76c260b9e525d88ce6216dedd Mon Sep 17 00:00:00 2001
+From: Kenji Wakamiya <wkenji at jp.fujitsu.com>
+Date: Tue, 14 Dec 2010 14:31:36 +0900
+Subject: [PATCH 3/4] xen/manage: fix "xm save -c" issue
+
+When using 'xm save -c' (which checkpoints the guest) on PV
+guests, the dpms_resume_end() should be surpressed. It is OK
+to make this call when doing 'xm save'.
+
+Signed-off-by: Kenji Wakamiya <wkenji at jp.fujitsu.com>
+Signed-off-by: Kazuhiro Suzuki <kaz at jp.fujitsu.com>
+Signed-off-by: Konrad Rzeszutek Wilk <konrad.wilk at oracle.com>
+---
+ drivers/xen/manage.c | 3 +--
+ 1 files changed, 1 insertions(+), 2 deletions(-)
+
+diff --git a/drivers/xen/manage.c b/drivers/xen/manage.c
+index db8c4c4..e32b9c0 100644
+--- a/drivers/xen/manage.c
++++ b/drivers/xen/manage.c
+@@ -145,11 +145,10 @@ out_resume:
+ if (!cancelled) {
+ xen_arch_resume();
+ xs_resume();
++ dpm_resume_end(PMSG_RESUME);
+ } else
+ xs_suspend_cancel();
+
+- dpm_resume_end(PMSG_RESUME);
+-
+ /* Make sure timer events get retriggered on all CPUs */
+ clock_was_set();
+
+--
+1.7.3.4
+
+
+From f4ae15846ee57116dcddfd71094e211e5cdefecf Mon Sep 17 00:00:00 2001
+From: Sheng Yang <sheng at linux.intel.com>
+Date: Tue, 21 Dec 2010 14:18:48 +0800
+Subject: [PATCH 4/4] apic: Move hypervisor detection of x2apic to hypervisor.h
+
+Then we can reuse it for Xen later.
+
+Acked-by: Jeremy Fitzhardinge <jeremy.fitzhardinge at citrix.com>
+Acked-by: Avi Kivity <avi at redhat.com>
+Acked-by: Ingo Molnar <mingo at elte.hu>
+Signed-off-by: Sheng Yang <sheng at linux.intel.com>
+Signed-off-by: Konrad Rzeszutek Wilk <konrad.wilk at oracle.com>
+---
+ arch/x86/include/asm/hypervisor.h | 9 +++++++++
+ arch/x86/kernel/apic/apic.c | 5 +++--
+ 2 files changed, 12 insertions(+), 2 deletions(-)
+
+diff --git a/arch/x86/include/asm/hypervisor.h b/arch/x86/include/asm/hypervisor.h
+index ff2546c..0c6f7af 100644
+--- a/arch/x86/include/asm/hypervisor.h
++++ b/arch/x86/include/asm/hypervisor.h
+@@ -20,6 +20,8 @@
+ #ifndef _ASM_X86_HYPERVISOR_H
+ #define _ASM_X86_HYPERVISOR_H
+
++#include <asm/kvm_para.h>
++
+ extern void init_hypervisor(struct cpuinfo_x86 *c);
+ extern void init_hypervisor_platform(void);
+
+@@ -47,4 +49,11 @@ extern const struct hypervisor_x86 x86_hyper_vmware;
+ extern const struct hypervisor_x86 x86_hyper_ms_hyperv;
+ extern const struct hypervisor_x86 x86_hyper_xen_hvm;
+
++static inline bool hypervisor_x2apic_available(void)
++{
++ if (kvm_para_available())
++ return true;
++ return false;
++}
++
+ #endif
+diff --git a/arch/x86/kernel/apic/apic.c b/arch/x86/kernel/apic/apic.c
+index 3f838d5..8408f2d 100644
+--- a/arch/x86/kernel/apic/apic.c
++++ b/arch/x86/kernel/apic/apic.c
+@@ -50,8 +50,8 @@
+ #include <asm/mtrr.h>
+ #include <asm/smp.h>
+ #include <asm/mce.h>
+-#include <asm/kvm_para.h>
+ #include <asm/tsc.h>
++#include <asm/hypervisor.h>
+
+ unsigned int num_processors;
+
+@@ -1476,7 +1476,8 @@ void __init enable_IR_x2apic(void)
+ /* IR is required if there is APIC ID > 255 even when running
+ * under KVM
+ */
+- if (max_physical_apicid > 255 || !kvm_para_available())
++ if (max_physical_apicid > 255 ||
++ !hypervisor_x2apic_available())
+ goto nox2apic;
+ /*
+ * without IR all CPUs can be addressed by IOAPIC/MSI
+--
+1.7.3.4
+
More information about the scm-commits
mailing list