diff options
| author | Yang Zhang <yang.z.zhang@Intel.com> | 2013-04-11 19:25:16 +0800 | 
|---|---|---|
| committer | Marcelo Tosatti <mtosatti@redhat.com> | 2013-04-16 16:32:41 -0300 | 
| commit | 5a71785dde307f6ac80e83c0ad3fd694912010a1 (patch) | |
| tree | cb765262ff74e583d314ef3f14b4f41a506b2cb2 | |
| parent | a20ed54d6e470bf0d28921b7aadb6ca0da0ff0c3 (diff) | |
| download | olio-linux-3.10-5a71785dde307f6ac80e83c0ad3fd694912010a1.tar.xz olio-linux-3.10-5a71785dde307f6ac80e83c0ad3fd694912010a1.zip  | |
KVM: VMX: Use posted interrupt to deliver virtual interrupt
If posted interrupt is avaliable, then uses it to inject virtual
interrupt to guest.
Signed-off-by: Yang Zhang <yang.z.zhang@Intel.com>
Reviewed-by: Gleb Natapov <gleb@redhat.com>
Signed-off-by: Marcelo Tosatti <mtosatti@redhat.com>
| -rw-r--r-- | arch/x86/kvm/lapic.c | 30 | ||||
| -rw-r--r-- | arch/x86/kvm/vmx.c | 2 | ||||
| -rw-r--r-- | arch/x86/kvm/x86.c | 1 | 
3 files changed, 21 insertions, 12 deletions
diff --git a/arch/x86/kvm/lapic.c b/arch/x86/kvm/lapic.c index dbf74c922aa..e29883c604f 100644 --- a/arch/x86/kvm/lapic.c +++ b/arch/x86/kvm/lapic.c @@ -353,6 +353,7 @@ static inline int apic_find_highest_irr(struct kvm_lapic *apic)  	if (!apic->irr_pending)  		return -1; +	kvm_x86_ops->sync_pir_to_irr(apic->vcpu);  	result = apic_search_irr(apic);  	ASSERT(result == -1 || result >= 16); @@ -683,18 +684,25 @@ static int __apic_accept_irq(struct kvm_lapic *apic, int delivery_mode,  		if (dest_map)  			__set_bit(vcpu->vcpu_id, dest_map); -		result = !apic_test_and_set_irr(vector, apic); -		trace_kvm_apic_accept_irq(vcpu->vcpu_id, delivery_mode, -					  trig_mode, vector, !result); -		if (!result) { -			if (trig_mode) -				apic_debug("level trig mode repeatedly for " -						"vector %d", vector); -			break; -		} +		if (kvm_x86_ops->deliver_posted_interrupt) { +			result = 1; +			kvm_x86_ops->deliver_posted_interrupt(vcpu, vector); +		} else { +			result = !apic_test_and_set_irr(vector, apic); -		kvm_make_request(KVM_REQ_EVENT, vcpu); -		kvm_vcpu_kick(vcpu); +			if (!result) { +				if (trig_mode) +					apic_debug("level trig mode repeatedly " +						"for vector %d", vector); +				goto out; +			} + +			kvm_make_request(KVM_REQ_EVENT, vcpu); +			kvm_vcpu_kick(vcpu); +		} +out: +		trace_kvm_apic_accept_irq(vcpu->vcpu_id, delivery_mode, +				trig_mode, vector, !result);  		break;  	case APIC_DM_REMRD: diff --git a/arch/x86/kvm/vmx.c b/arch/x86/kvm/vmx.c index 3a14d8a0ee4..5a87a58af49 100644 --- a/arch/x86/kvm/vmx.c +++ b/arch/x86/kvm/vmx.c @@ -84,7 +84,7 @@ module_param(vmm_exclusive, bool, S_IRUGO);  static bool __read_mostly fasteoi = 1;  module_param(fasteoi, bool, S_IRUGO); -static bool __read_mostly enable_apicv; +static bool __read_mostly enable_apicv = 1;  module_param(enable_apicv, bool, S_IRUGO);  /* diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c index 276b4a9a560..50e2e10b804 100644 --- a/arch/x86/kvm/x86.c +++ b/arch/x86/kvm/x86.c @@ -2692,6 +2692,7 @@ void kvm_arch_vcpu_put(struct kvm_vcpu *vcpu)  static int kvm_vcpu_ioctl_get_lapic(struct kvm_vcpu *vcpu,  				    struct kvm_lapic_state *s)  { +	kvm_x86_ops->sync_pir_to_irr(vcpu);  	memcpy(s->regs, vcpu->arch.apic->regs, sizeof *s);  	return 0;  |