Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 362c1055 authored by Yang Zhang's avatar Yang Zhang Committed by Avi Kivity
Browse files

KVM: ia64: enable external interrupt in vmm



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: default avatarYang Zhang <yang.zhang@intel.com>
Signed-off-by: default avatarAvi Kivity <avi@redhat.com>
parent a8b876b1
Loading
Loading
Loading
Loading
+5 −0
Original line number Diff line number Diff line
@@ -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;
		}
	}
+9 −9
Original line number Diff line number Diff line
@@ -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
+2 −1
Original line number Diff line number Diff line
@@ -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;