[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Xen-devel] [PATCH 4/4] VMX: Use posted interrupt to deliver virutal interrupt



From: Yang Zhang <yang.z.zhang@xxxxxxxxx>

Deliver virtual interrupt through posted way if posted interrupt
is enabled.

Signed-off-by: Yang Zhang <yang.z.zhang@xxxxxxxxx>
Reviewed-by: Jun Nakajima <jun.nakajima@xxxxxxxxx>
---
 xen/arch/x86/hvm/vioapic.c        |    4 +++-
 xen/arch/x86/hvm/vlapic.c         |   13 ++++++++++---
 xen/arch/x86/hvm/vmsi.c           |    5 ++++-
 xen/arch/x86/hvm/vmx/vpmu_core2.c |    5 ++++-
 xen/arch/x86/hvm/vpt.c            |   10 +++++++---
 5 files changed, 28 insertions(+), 9 deletions(-)

diff --git a/xen/arch/x86/hvm/vioapic.c b/xen/arch/x86/hvm/vioapic.c
index d3de695..b543e55 100644
--- a/xen/arch/x86/hvm/vioapic.c
+++ b/xen/arch/x86/hvm/vioapic.c
@@ -263,7 +263,9 @@ static void ioapic_inj_irq(
     ASSERT((delivery_mode == dest_Fixed) ||
            (delivery_mode == dest_LowestPrio));
 
-    if ( vlapic_set_irq(target, vector, trig_mode) )
+    if ( hvm_funcs.deliver_posted_intr )
+        hvm_funcs.deliver_posted_intr(vlapic_vcpu(target), vector, trig_mode);
+    else if ( vlapic_set_irq(target, vector, trig_mode) )
         vcpu_kick(vlapic_vcpu(target));
 }
 
diff --git a/xen/arch/x86/hvm/vlapic.c b/xen/arch/x86/hvm/vlapic.c
index 128745c..a8af47a 100644
--- a/xen/arch/x86/hvm/vlapic.c
+++ b/xen/arch/x86/hvm/vlapic.c
@@ -137,6 +137,9 @@ static void vlapic_clear_irr(int vector, struct vlapic 
*vlapic)
 
 static int vlapic_find_highest_irr(struct vlapic *vlapic)
 {
+    if ( hvm_funcs.sync_pir_to_irr )
+        hvm_funcs.sync_pir_to_irr(vlapic_vcpu(vlapic));
+
     return vlapic_find_highest_vector(&vlapic->regs->data[APIC_IRR]);
 }
 
@@ -315,9 +318,13 @@ static void vlapic_accept_irq(struct vcpu *v, uint32_t 
icr_low)
     {
     case APIC_DM_FIXED:
     case APIC_DM_LOWEST:
-        if ( vlapic_enabled(vlapic) &&
-             !vlapic_test_and_set_irr(vector, vlapic) )
-            vcpu_kick(v);
+        if ( vlapic_enabled(vlapic) )
+        {
+            if ( hvm_funcs.deliver_posted_intr )
+                hvm_funcs.deliver_posted_intr(v, vector, 0);
+            else if ( !vlapic_test_and_set_irr(vector, vlapic) )
+                vcpu_kick(v);
+        }
         break;
 
     case APIC_DM_REMRD:
diff --git a/xen/arch/x86/hvm/vmsi.c b/xen/arch/x86/hvm/vmsi.c
index cfc7c80..0ac14d1 100644
--- a/xen/arch/x86/hvm/vmsi.c
+++ b/xen/arch/x86/hvm/vmsi.c
@@ -57,7 +57,10 @@ static void vmsi_inj_irq(
     {
     case dest_Fixed:
     case dest_LowestPrio:
-        if ( vlapic_set_irq(target, vector, trig_mode) )
+        if ( hvm_funcs.deliver_posted_intr )
+            hvm_funcs.deliver_posted_intr(vlapic_vcpu(target), vector,
+                                        trig_mode);
+        else if ( vlapic_set_irq(target, vector, trig_mode) )
             vcpu_kick(vlapic_vcpu(target));
         break;
     default:
diff --git a/xen/arch/x86/hvm/vmx/vpmu_core2.c 
b/xen/arch/x86/hvm/vmx/vpmu_core2.c
index 2313e39..dc152f7 100644
--- a/xen/arch/x86/hvm/vmx/vpmu_core2.c
+++ b/xen/arch/x86/hvm/vmx/vpmu_core2.c
@@ -737,7 +737,10 @@ static int core2_vpmu_do_interrupt(struct cpu_user_regs 
*regs)
     int_vec = vlapic_lvtpc & APIC_VECTOR_MASK;
     vlapic_set_reg(vlapic, APIC_LVTPC, vlapic_lvtpc | APIC_LVT_MASKED);
     if ( GET_APIC_DELIVERY_MODE(vlapic_lvtpc) == APIC_MODE_FIXED )
-        vlapic_set_irq(vcpu_vlapic(v), int_vec, 0);
+        if ( hvm_funcs.deliver_posted_intr )
+            hvm_funcs.deliver_posted_intr(v, int_vec, 0);
+        else 
+            vlapic_set_irq(vcpu_vlapic(v), int_vec, 0);
     else
         v->nmi_pending = 1;
     return 1;
diff --git a/xen/arch/x86/hvm/vpt.c b/xen/arch/x86/hvm/vpt.c
index 46d3ec6..7c3f2ba 100644
--- a/xen/arch/x86/hvm/vpt.c
+++ b/xen/arch/x86/hvm/vpt.c
@@ -257,9 +257,13 @@ int pt_update_irq(struct vcpu *v)
 
     spin_unlock(&v->arch.hvm_vcpu.tm_lock);
 
-    if ( is_lapic )
-        vlapic_set_irq(vcpu_vlapic(v), irq, 0);
-    else if ( irq == RTC_IRQ && pt_priv )
+    if ( is_lapic ) 
+    {
+        if ( hvm_funcs.deliver_posted_intr )
+            hvm_funcs.deliver_posted_intr(v, irq, 0);
+        else
+            vlapic_set_irq(vcpu_vlapic(v), irq, 0);
+    } else if ( irq == RTC_IRQ && pt_priv )
         rtc_periodic_interrupt(pt_priv);
     else
     {
-- 
1.7.1


_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
http://lists.xen.org/xen-devel


 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.