diff options
Diffstat (limited to 'arch/x86/kvm/kvm_onhyperv.c')
| -rw-r--r-- | arch/x86/kvm/kvm_onhyperv.c | 33 | 
1 files changed, 24 insertions, 9 deletions
diff --git a/arch/x86/kvm/kvm_onhyperv.c b/arch/x86/kvm/kvm_onhyperv.c index 482d6639ef88..ded0bd688c65 100644 --- a/arch/x86/kvm/kvm_onhyperv.c +++ b/arch/x86/kvm/kvm_onhyperv.c @@ -10,17 +10,22 @@  #include "hyperv.h"  #include "kvm_onhyperv.h" +struct kvm_hv_tlb_range { +	u64 start_gfn; +	u64 pages; +}; +  static int kvm_fill_hv_flush_list_func(struct hv_guest_mapping_flush_list *flush,  		void *data)  { -	struct kvm_tlb_range *range = data; +	struct kvm_hv_tlb_range *range = data;  	return hyperv_fill_flush_guest_mapping_list(flush, range->start_gfn,  			range->pages);  }  static inline int hv_remote_flush_root_tdp(hpa_t root_tdp, -					   struct kvm_tlb_range *range) +					   struct kvm_hv_tlb_range *range)  {  	if (range)  		return hyperv_flush_guest_mapping_range(root_tdp, @@ -29,8 +34,8 @@ static inline int hv_remote_flush_root_tdp(hpa_t root_tdp,  		return hyperv_flush_guest_mapping(root_tdp);  } -int hv_remote_flush_tlb_with_range(struct kvm *kvm, -		struct kvm_tlb_range *range) +static int __hv_flush_remote_tlbs_range(struct kvm *kvm, +					struct kvm_hv_tlb_range *range)  {  	struct kvm_arch *kvm_arch = &kvm->arch;  	struct kvm_vcpu *vcpu; @@ -86,19 +91,29 @@ int hv_remote_flush_tlb_with_range(struct kvm *kvm,  	spin_unlock(&kvm_arch->hv_root_tdp_lock);  	return ret;  } -EXPORT_SYMBOL_GPL(hv_remote_flush_tlb_with_range); -int hv_remote_flush_tlb(struct kvm *kvm) +int hv_flush_remote_tlbs_range(struct kvm *kvm, gfn_t start_gfn, gfn_t nr_pages) +{ +	struct kvm_hv_tlb_range range = { +		.start_gfn = start_gfn, +		.pages = nr_pages, +	}; + +	return __hv_flush_remote_tlbs_range(kvm, &range); +} +EXPORT_SYMBOL_GPL(hv_flush_remote_tlbs_range); + +int hv_flush_remote_tlbs(struct kvm *kvm)  { -	return hv_remote_flush_tlb_with_range(kvm, NULL); +	return __hv_flush_remote_tlbs_range(kvm, NULL);  } -EXPORT_SYMBOL_GPL(hv_remote_flush_tlb); +EXPORT_SYMBOL_GPL(hv_flush_remote_tlbs);  void hv_track_root_tdp(struct kvm_vcpu *vcpu, hpa_t root_tdp)  {  	struct kvm_arch *kvm_arch = &vcpu->kvm->arch; -	if (kvm_x86_ops.tlb_remote_flush == hv_remote_flush_tlb) { +	if (kvm_x86_ops.flush_remote_tlbs == hv_flush_remote_tlbs) {  		spin_lock(&kvm_arch->hv_root_tdp_lock);  		vcpu->arch.hv_root_tdp = root_tdp;  		if (root_tdp != kvm_arch->hv_root_tdp)  |