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 <[email protected]> +# 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 <[email protected]> +Committed-by: Keir Fraser <[email protected]> +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; + } + + ================================================================ _______________________________________________ pld-cvs-commit mailing list [email protected] http://lists.pld-linux.org/mailman/listinfo/pld-cvs-commit
