KVM: ia64: enable external interrupt in vmm
authorYang Zhang <yang.zhang@intel.com>
Mon, 23 Mar 2009 07:31:04 +0000 (03:31 -0400)
committerAvi Kivity <avi@redhat.com>
Wed, 10 Jun 2009 08:48:34 +0000 (11:48 +0300)
Currently, the interrupt enable bit is cleared when in
the vmm.  This patch sets the bit and the external interrupts can
be dealt with when in the vmm.  This improves the I/O performance.

Signed-off-by: Yang Zhang <yang.zhang@intel.com>
Signed-off-by: Avi Kivity <avi@redhat.com>
arch/ia64/kvm/process.c
arch/ia64/kvm/vmm_ivt.S
arch/ia64/kvm/vtlb.c

index b1dc809..a8f84da 100644 (file)
@@ -652,20 +652,25 @@ void  kvm_ia64_handle_break(unsigned long ifa, struct kvm_pt_regs *regs,
                unsigned long isr, unsigned long iim)
 {
        struct kvm_vcpu *v = current_vcpu;
+       long psr;
 
        if (ia64_psr(regs)->cpl == 0) {
                /* Allow hypercalls only when cpl = 0.  */
                if (iim == DOMN_PAL_REQUEST) {
+                       local_irq_save(psr);
                        set_pal_call_data(v);
                        vmm_transition(v);
                        get_pal_call_result(v);
                        vcpu_increment_iip(v);
+                       local_irq_restore(psr);
                        return;
                } else if (iim == DOMN_SAL_REQUEST) {
+                       local_irq_save(psr);
                        set_sal_call_data(v);
                        vmm_transition(v);
                        get_sal_call_result(v);
                        vcpu_increment_iip(v);
+                       local_irq_restore(psr);
                        return;
                }
        }
index 3ef1a01..40920c6 100644 (file)
@@ -95,7 +95,7 @@ GLOBAL_ENTRY(kvm_vmm_panic)
        ;;
        srlz.i    // guarantee that interruption collection is on
        ;;
-       //(p15) ssm psr.i               // restore psr.i
+       (p15) ssm psr.i               // restore psr.
        addl r14=@gprel(ia64_leave_hypervisor),gp
        ;;
        KVM_SAVE_REST
@@ -249,7 +249,7 @@ ENTRY(kvm_break_fault)
        ;;
        srlz.i         // guarantee that interruption collection is on
        ;;
-       //(p15)ssm psr.i               // restore psr.i
+       (p15)ssm psr.i               // restore psr.i
        addl r14=@gprel(ia64_leave_hypervisor),gp
        ;;
        KVM_SAVE_REST
@@ -439,7 +439,7 @@ kvm_dispatch_vexirq:
        ;;
        srlz.i // guarantee that interruption collection is on
        ;;
-       //(p15) ssm psr.i               // restore psr.i
+       (p15) ssm psr.i               // restore psr.i
        adds r3=8,r2                // set up second base pointer
        ;;
        KVM_SAVE_REST
@@ -819,7 +819,7 @@ ENTRY(kvm_dtlb_miss_dispatch)
        ;;
        srlz.i     // guarantee that interruption collection is on
        ;;
-       //(p15) ssm psr.i               // restore psr.i
+       (p15) ssm psr.i               // restore psr.i
        addl r14=@gprel(ia64_leave_hypervisor_prepare),gp
        ;;
        KVM_SAVE_REST
@@ -842,7 +842,7 @@ ENTRY(kvm_itlb_miss_dispatch)
        ;;
        srlz.i   // guarantee that interruption collection is on
        ;;
-       //(p15) ssm psr.i               // restore psr.i
+       (p15) ssm psr.i               // restore psr.i
        addl r14=@gprel(ia64_leave_hypervisor),gp
        ;;
        KVM_SAVE_REST
@@ -871,7 +871,7 @@ ENTRY(kvm_dispatch_reflection)
        ;;
        srlz.i   // guarantee that interruption collection is on
        ;;
-       //(p15) ssm psr.i               // restore psr.i
+       (p15) ssm psr.i               // restore psr.i
        addl r14=@gprel(ia64_leave_hypervisor),gp
        ;;
        KVM_SAVE_REST
@@ -898,7 +898,7 @@ ENTRY(kvm_dispatch_virtualization_fault)
        ;;
        srlz.i    // guarantee that interruption collection is on
        ;;
-       //(p15) ssm psr.i               // restore psr.i
+       (p15) ssm psr.i               // restore psr.i
        addl r14=@gprel(ia64_leave_hypervisor_prepare),gp
        ;;
        KVM_SAVE_REST
@@ -920,7 +920,7 @@ ENTRY(kvm_dispatch_interrupt)
        ;;
        srlz.i
        ;;
-       //(p15) ssm psr.i
+       (p15) ssm psr.i
        addl r14=@gprel(ia64_leave_hypervisor),gp
        ;;
        KVM_SAVE_REST
@@ -1333,7 +1333,7 @@ hostret =   r24
        ;;
 (p7)    srlz.i
        ;;
-//(p6)    ssm psr.i
+(p6)    ssm psr.i
        ;;
        mov rp=rpsave
        mov ar.pfs=pfssave
index 2c2501f..4290a42 100644 (file)
@@ -254,7 +254,8 @@ u64 guest_vhpt_lookup(u64 iha, u64 *pte)
                        "(p7) st8 [%2]=r9;;"
                        "ssm psr.ic;;"
                        "srlz.d;;"
-                       /* "ssm psr.i;;" Once interrupts in vmm open, need fix*/
+                       "ssm psr.i;;"
+                       "srlz.d;;"
                        : "=r"(ret) : "r"(iha), "r"(pte):"memory");
 
        return ret;