[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-changelog] [xen-4.1-testing] xen: fix hvm_domain_use_pirq's behavior
# HG changeset patch # User Stefano Stabellini <stefano.stabellini@xxxxxxxxxxxxx> # Date 1314801144 -3600 # Node ID 50496ccde3c386b2bc34e290e61ae55fa9195d2d # Parent 1092a143ef9ddb370d12090784b62f5082f30a78 xen: fix hvm_domain_use_pirq's behavior hvm_domain_use_pirq should return true when the guest is using a certain pirq, no matter if the corresponding event channel is currently enabled or disabled. As an additional complication, qemu is going to request pirqs for passthrough devices even for Xen unaware HVM guests, so we need to wait for an event channel to be connected before considering the pirq of a passthrough device as "in use". Signed-off-by: Stefano Stabellini <stefano.stabellini@xxxxxxxxxxxxx> xen-unstable changeset: 23806:4226ea1785b5 xen-unstable date: Wed Aug 31 15:23:12 2011 +0100 --- diff -r 1092a143ef9d -r 50496ccde3c3 xen/arch/x86/irq.c --- a/xen/arch/x86/irq.c Wed Aug 31 15:31:22 2011 +0100 +++ b/xen/arch/x86/irq.c Wed Aug 31 15:32:24 2011 +0100 @@ -1879,7 +1879,7 @@ return 0; emuirq = domain_pirq_to_emuirq(d, pirq); - if ( emuirq != IRQ_UNBOUND && d->pirq_to_evtchn[pirq] != 0 ) + if ( emuirq != IRQ_UNBOUND ) return 1; else return 0; diff -r 1092a143ef9d -r 50496ccde3c3 xen/arch/x86/physdev.c --- a/xen/arch/x86/physdev.c Wed Aug 31 15:31:22 2011 +0100 +++ b/xen/arch/x86/physdev.c Wed Aug 31 15:32:24 2011 +0100 @@ -202,9 +202,6 @@ if ( ret == 0 ) map->pirq = pirq; - if ( !ret && is_hvm_domain(d) ) - map_domain_emuirq_pirq(d, pirq, IRQ_PT); - done: spin_unlock(&d->event_lock); spin_unlock(&pcidevs_lock); @@ -267,7 +264,7 @@ if ( v->domain->arch.pirq_eoi_map ) evtchn_unmask(v->domain->pirq_to_evtchn[eoi.irq]); if ( !is_hvm_domain(v->domain) || - domain_pirq_to_emuirq(v->domain, eoi.irq) == IRQ_PT ) + domain_pirq_to_irq(v->domain, eoi.irq) > 0 ) ret = pirq_guest_eoi(v->domain, eoi.irq); else ret = 0; @@ -326,7 +323,7 @@ break; irq_status_query.flags = 0; if ( is_hvm_domain(v->domain) && - domain_pirq_to_emuirq(v->domain, irq) != IRQ_PT ) + domain_pirq_to_irq(v->domain, irq) <= 0 ) { ret = copy_to_guest(arg, &irq_status_query, 1) ? -EFAULT : 0; break; diff -r 1092a143ef9d -r 50496ccde3c3 xen/common/event_channel.c --- a/xen/common/event_channel.c Wed Aug 31 15:31:22 2011 +0100 +++ b/xen/common/event_channel.c Wed Aug 31 15:32:24 2011 +0100 @@ -361,6 +361,9 @@ bind->port = port; + if ( is_hvm_domain(d) && domain_pirq_to_irq(d, pirq) > 0 ) + map_domain_emuirq_pirq(d, pirq, IRQ_PT); + out: spin_unlock(&d->event_lock); @@ -409,6 +412,8 @@ pirq_guest_unbind(d1, chn1->u.pirq.irq); d1->pirq_to_evtchn[chn1->u.pirq.irq] = 0; unlink_pirq_port(chn1, d1->vcpu[chn1->notify_vcpu_id]); + if ( is_hvm_domain(d1) && domain_pirq_to_irq(d1, chn1->u.pirq.irq) > 0 ) + unmap_domain_pirq_emuirq(d1, chn1->u.pirq.irq); break; case ECS_VIRQ: _______________________________________________ Xen-changelog mailing list Xen-changelog@xxxxxxxxxxxxxxxxxxx http://lists.xensource.com/xen-changelog
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |