WARNING - OLD ARCHIVES

This is an archived copy of the Xen.org mailing list, which we have preserved to ensure that existing links to archives are not broken. The live archive, which contains the latest emails, can be found at http://lists.xen.org/
   
 
 
Xen 
 
Home Products Support Community News
 
   
 

xen-devel

[Xen-devel] xen: fix hvm_domain_use_pirq's behavior

To: xen-devel@xxxxxxxxxxxxxxxxxxx
Subject: [Xen-devel] xen: fix hvm_domain_use_pirq's behavior
From: <stefano.stabellini@xxxxxxxxxxxxx>
Date: Wed, 31 Aug 2011 11:24:04 +0100
Cc: Stefano Stabellini <stefano.stabellini@xxxxxxxxxxxxx>
Delivery-date: Wed, 31 Aug 2011 03:17:54 -0700
Envelope-to: www-data@xxxxxxxxxxxxxxxxxxx
List-help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-id: Xen developer discussion <xen-devel.lists.xensource.com>
List-post: <mailto:xen-devel@lists.xensource.com>
List-subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>, <mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
List-unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>, <mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
Sender: xen-devel-bounces@xxxxxxxxxxxxxxxxxxx
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>

diff -r 1515138fbd7b xen/arch/x86/irq.c
--- a/xen/arch/x86/irq.c        Wed Aug 24 09:33:10 2011 +0100
+++ b/xen/arch/x86/irq.c        Tue Aug 30 11:56:21 2011 +0000
@@ -2024,6 +2024,5 @@ int unmap_domain_pirq_emuirq(struct doma
 bool_t hvm_domain_use_pirq(const struct domain *d, const struct pirq *pirq)
 {
     return is_hvm_domain(d) && pirq &&
-           pirq->arch.hvm.emuirq != IRQ_UNBOUND &&
-           pirq->evtchn != 0;
+           pirq->arch.hvm.emuirq != IRQ_UNBOUND; 
 }
diff -r 1515138fbd7b xen/arch/x86/physdev.c
--- a/xen/arch/x86/physdev.c    Wed Aug 24 09:33:10 2011 +0100
+++ b/xen/arch/x86/physdev.c    Tue Aug 30 11:56:21 2011 +0000
@@ -196,9 +196,6 @@ int physdev_map_pirq(domid_t domid, int 
     if ( ret == 0 )
         *pirq_p = 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);
@@ -271,7 +268,7 @@ ret_t do_physdev_op(int cmd, XEN_GUEST_H
              v->domain->arch.pv_domain.pirq_eoi_map )
             evtchn_unmask(pirq->evtchn);
         if ( !is_hvm_domain(v->domain) ||
-             pirq->arch.hvm.emuirq == IRQ_PT )
+             domain_pirq_to_irq(v->domain, eoi.irq) > 0 )
             pirq_guest_eoi(pirq);
         spin_unlock(&v->domain->event_lock);
         ret = 0;
@@ -331,7 +328,7 @@ ret_t do_physdev_op(int cmd, XEN_GUEST_H
             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 1515138fbd7b xen/common/event_channel.c
--- a/xen/common/event_channel.c        Wed Aug 24 09:33:10 2011 +0100
+++ b/xen/common/event_channel.c        Tue Aug 30 11:56:21 2011 +0000
@@ -366,6 +366,9 @@ static long evtchn_bind_pirq(evtchn_bind
 
     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);
 
@@ -419,6 +422,8 @@ static long __evtchn_close(struct domain
         pirq->evtchn = 0;
         pirq_cleanup_check(pirq, d1);
         unlink_pirq_port(chn1, d1->vcpu[chn1->notify_vcpu_id]);
+        if ( is_hvm_domain(d1) && domain_pirq_to_irq(d1, pirq->pirq) > 0 )
+            unmap_domain_pirq_emuirq(d1, pirq->pirq);
         break;
     }
 

_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-devel