packages: xen/xen-4.1-testing.23190.patch (NEW)=?UTF-8?Q?=20?=- don't loose level interru...

baggins baggins at pld-linux.org
Wed Feb 29 22:00:31 CET 2012


Author: baggins                      Date: Wed Feb 29 21:00:31 2012 GMT
Module: packages                      Tag: HEAD
---- Log message:
- don't loose level interrupts on HVM guests

---- Files affected:
packages/xen:
   xen-4.1-testing.23190.patch (NONE -> 1.1)  (NEW)

---- Diffs:

================================================================
Index: packages/xen/xen-4.1-testing.23190.patch
diff -u /dev/null packages/xen/xen-4.1-testing.23190.patch:1.1
--- /dev/null	Wed Feb 29 22:00:31 2012
+++ packages/xen/xen-4.1-testing.23190.patch	Wed Feb 29 22:00:26 2012
@@ -0,0 +1,64 @@
+
+# HG changeset patch
+# User Stefano Stabellini <stefano.stabellini at eu.citrix.com>
+# Date 1321623485 0
+# Node ID 5a00ccfc63915650b8e1a262c2cad8e8d8670612
+# Parent  e73ada19a69daf821aa7d80323f1bd76239b9bae
+x86: re-inject emulated level pirqs in PV on HVM guests if still asserted
+
+PV on HVM guests can loose level interrupts coming from emulated
+devices if they have been remapped onto event channels.  The reason is
+that we are missing the code to inject a pirq again in the guest when
+the guest EOIs it, if it corresponds to an emulated level interrupt
+and the interrupt is still asserted.
+
+Fix this issue and also return error when the guest tries to get the
+irq_status of a non-existing pirq.
+
+
+Changes in this backport:
+ - move the spinlock afterward to cover the new code only.
+
+Signed-off-by: Stefano Stabellini <stefano.stabellini at eu.citrix.com>
+Committed-by: Keir Fraser <keir at xen.org>
+xen-unstable changeset:   24007:0526644ad2a6
+xen-unstable date:        Thu Oct 27 16:07:18 2011 +0100
+
+diff -r e73ada19a69d -r 5a00ccfc6391 xen/arch/x86/physdev.c
+--- a/xen/arch/x86/physdev.c	Thu Nov 17 09:13:25 2011 +0000
++++ b/xen/arch/x86/physdev.c	Fri Nov 18 13:38:05 2011 +0000
+@@ -268,6 +268,20 @@
+             ret = pirq_guest_eoi(v->domain, eoi.irq);
+         else
+             ret = 0;
++        spin_lock(&v->domain->event_lock);
++        if ( is_hvm_domain(v->domain) &&
++                domain_pirq_to_emuirq(v->domain, eoi.irq) > 0 )
++        {
++            struct hvm_irq *hvm_irq = &v->domain->arch.hvm_domain.irq;
++            int gsi = domain_pirq_to_emuirq(v->domain, eoi.irq);
++
++            /* if this is a level irq and count > 0, send another
++             * notification */ 
++            if ( gsi >= NR_ISAIRQS /* ISA irqs are edge triggered */
++                    && hvm_irq->gsi_assert_count[gsi] )
++                send_guest_pirq(v->domain, eoi.irq);
++        }
++        spin_unlock(&v->domain->event_lock);
+         break;
+     }
+ 
+@@ -323,9 +337,10 @@
+             break;
+         irq_status_query.flags = 0;
+         if ( is_hvm_domain(v->domain) &&
+-             domain_pirq_to_irq(v->domain, irq) <= 0 )
++                domain_pirq_to_irq(v->domain, irq) <= 0 &&
++                domain_pirq_to_emuirq(v->domain, irq) == IRQ_UNBOUND )
+         {
+-            ret = copy_to_guest(arg, &irq_status_query, 1) ? -EFAULT : 0;
++            ret = -EINVAL;
+             break;
+         }
+ 
+
================================================================


More information about the pld-cvs-commit mailing list