diff options
| author | Yang Zhang <yang.z.zhang@Intel.com> | 2013-04-11 19:25:13 +0800 | 
|---|---|---|
| committer | Marcelo Tosatti <mtosatti@redhat.com> | 2013-04-16 16:32:40 -0300 | 
| commit | 3d81bc7e96d6bca0b8f8b7d1bf6ea72caa3aac57 (patch) | |
| tree | 3e8d83b8d80c87c38cc0bb1d3caef6286ad9dd48 /virt | |
| parent | 01e439be7753c163932538276f04f95cb1b66697 (diff) | |
| download | linux-3d81bc7e96d6bca0b8f8b7d1bf6ea72caa3aac57.tar.bz2 | |
KVM: Call common update function when ioapic entry changed.
Both TMR and EOI exit bitmap need to be updated when ioapic changed
or vcpu's id/ldr/dfr changed. So use common function instead eoi exit
bitmap specific function.
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>
Diffstat (limited to 'virt')
| -rw-r--r-- | virt/kvm/ioapic.c | 22 | ||||
| -rw-r--r-- | virt/kvm/ioapic.h | 6 | ||||
| -rw-r--r-- | virt/kvm/irq_comm.c | 4 | ||||
| -rw-r--r-- | virt/kvm/kvm_main.c | 4 | 
4 files changed, 19 insertions, 17 deletions
| diff --git a/virt/kvm/ioapic.c b/virt/kvm/ioapic.c index 97c67a50f904..f2157a985a1f 100644 --- a/virt/kvm/ioapic.c +++ b/virt/kvm/ioapic.c @@ -193,15 +193,13 @@ static void update_handled_vectors(struct kvm_ioapic *ioapic)  	smp_wmb();  } -void kvm_ioapic_calculate_eoi_exitmap(struct kvm_vcpu *vcpu, -					u64 *eoi_exit_bitmap) +void kvm_ioapic_scan_entry(struct kvm_vcpu *vcpu, u64 *eoi_exit_bitmap)  {  	struct kvm_ioapic *ioapic = vcpu->kvm->arch.vioapic;  	union kvm_ioapic_redirect_entry *e;  	int index;  	spin_lock(&ioapic->lock); -	/* traverse ioapic entry to set eoi exit bitmap*/  	for (index = 0; index < IOAPIC_NUM_PINS; index++) {  		e = &ioapic->redirtbl[index];  		if (!e->fields.mask && @@ -215,16 +213,22 @@ void kvm_ioapic_calculate_eoi_exitmap(struct kvm_vcpu *vcpu,  	}  	spin_unlock(&ioapic->lock);  } -EXPORT_SYMBOL_GPL(kvm_ioapic_calculate_eoi_exitmap); -void kvm_ioapic_make_eoibitmap_request(struct kvm *kvm) +#ifdef CONFIG_X86 +void kvm_vcpu_request_scan_ioapic(struct kvm *kvm)  {  	struct kvm_ioapic *ioapic = kvm->arch.vioapic; -	if (!kvm_apic_vid_enabled(kvm) || !ioapic) +	if (!ioapic)  		return; -	kvm_make_update_eoibitmap_request(kvm); +	kvm_make_scan_ioapic_request(kvm);  } +#else +void kvm_vcpu_request_scan_ioapic(struct kvm *kvm) +{ +	return; +} +#endif  static void ioapic_write_indirect(struct kvm_ioapic *ioapic, u32 val)  { @@ -267,7 +271,7 @@ static void ioapic_write_indirect(struct kvm_ioapic *ioapic, u32 val)  		if (e->fields.trig_mode == IOAPIC_LEVEL_TRIG  		    && ioapic->irr & (1 << index))  			ioapic_service(ioapic, index, false); -		kvm_ioapic_make_eoibitmap_request(ioapic->kvm); +		kvm_vcpu_request_scan_ioapic(ioapic->kvm);  		break;  	}  } @@ -586,7 +590,7 @@ int kvm_set_ioapic(struct kvm *kvm, struct kvm_ioapic_state *state)  	spin_lock(&ioapic->lock);  	memcpy(ioapic, state, sizeof(struct kvm_ioapic_state));  	update_handled_vectors(ioapic); -	kvm_ioapic_make_eoibitmap_request(kvm); +	kvm_vcpu_request_scan_ioapic(kvm);  	kvm_rtc_eoi_tracking_restore_all(ioapic);  	spin_unlock(&ioapic->lock);  	return 0; diff --git a/virt/kvm/ioapic.h b/virt/kvm/ioapic.h index 554157bbb586..674a388612b4 100644 --- a/virt/kvm/ioapic.h +++ b/virt/kvm/ioapic.h @@ -96,9 +96,7 @@ int kvm_irq_delivery_to_apic(struct kvm *kvm, struct kvm_lapic *src,  		struct kvm_lapic_irq *irq, unsigned long *dest_map);  int kvm_get_ioapic(struct kvm *kvm, struct kvm_ioapic_state *state);  int kvm_set_ioapic(struct kvm *kvm, struct kvm_ioapic_state *state); -void kvm_ioapic_make_eoibitmap_request(struct kvm *kvm); -void kvm_ioapic_calculate_eoi_exitmap(struct kvm_vcpu *vcpu, -					u64 *eoi_exit_bitmap); - +void kvm_vcpu_request_scan_ioapic(struct kvm *kvm); +void kvm_ioapic_scan_entry(struct kvm_vcpu *vcpu, u64 *eoi_exit_bitmap);  #endif diff --git a/virt/kvm/irq_comm.c b/virt/kvm/irq_comm.c index 8efb580edfef..25ab48007adb 100644 --- a/virt/kvm/irq_comm.c +++ b/virt/kvm/irq_comm.c @@ -285,7 +285,7 @@ void kvm_register_irq_ack_notifier(struct kvm *kvm,  	mutex_lock(&kvm->irq_lock);  	hlist_add_head_rcu(&kian->link, &kvm->irq_ack_notifier_list);  	mutex_unlock(&kvm->irq_lock); -	kvm_ioapic_make_eoibitmap_request(kvm); +	kvm_vcpu_request_scan_ioapic(kvm);  }  void kvm_unregister_irq_ack_notifier(struct kvm *kvm, @@ -295,7 +295,7 @@ void kvm_unregister_irq_ack_notifier(struct kvm *kvm,  	hlist_del_init_rcu(&kian->link);  	mutex_unlock(&kvm->irq_lock);  	synchronize_rcu(); -	kvm_ioapic_make_eoibitmap_request(kvm); +	kvm_vcpu_request_scan_ioapic(kvm);  }  int kvm_request_irq_source_id(struct kvm *kvm) diff --git a/virt/kvm/kvm_main.c b/virt/kvm/kvm_main.c index ac3182eed462..65a9e0716a8d 100644 --- a/virt/kvm/kvm_main.c +++ b/virt/kvm/kvm_main.c @@ -217,9 +217,9 @@ void kvm_make_mclock_inprogress_request(struct kvm *kvm)  	make_all_cpus_request(kvm, KVM_REQ_MCLOCK_INPROGRESS);  } -void kvm_make_update_eoibitmap_request(struct kvm *kvm) +void kvm_make_scan_ioapic_request(struct kvm *kvm)  { -	make_all_cpus_request(kvm, KVM_REQ_EOIBITMAP); +	make_all_cpus_request(kvm, KVM_REQ_SCAN_IOAPIC);  }  int kvm_vcpu_init(struct kvm_vcpu *vcpu, struct kvm *kvm, unsigned id) |