1 /* SPDX-License-Identifier: GPL-2.0-only */ 2 /* 3 * KVM L1 hypervisor optimizations on Hyper-V. 4 */ 5 6 #ifndef __ARCH_X86_KVM_KVM_ONHYPERV_H__ 7 #define __ARCH_X86_KVM_KVM_ONHYPERV_H__ 8 9 #if IS_ENABLED(CONFIG_HYPERV) 10 int hv_flush_remote_tlbs_range(struct kvm *kvm, gfn_t gfn, gfn_t nr_pages); 11 int hv_flush_remote_tlbs(struct kvm *kvm); 12 void hv_track_root_tdp(struct kvm_vcpu *vcpu, hpa_t root_tdp); hv_get_partition_assist_page(struct kvm_vcpu * vcpu)13static inline hpa_t hv_get_partition_assist_page(struct kvm_vcpu *vcpu) 14 { 15 /* 16 * Partition assist page is something which Hyper-V running in L0 17 * requires from KVM running in L1 before direct TLB flush for L2 18 * guests can be enabled. KVM doesn't currently use the page but to 19 * comply with TLFS it still needs to be allocated. For now, this 20 * is a single page shared among all vCPUs. 21 */ 22 struct hv_partition_assist_pg **p_hv_pa_pg = 23 &vcpu->kvm->arch.hv_pa_pg; 24 25 if (!*p_hv_pa_pg) 26 *p_hv_pa_pg = kzalloc(PAGE_SIZE, GFP_KERNEL_ACCOUNT); 27 28 if (!*p_hv_pa_pg) 29 return INVALID_PAGE; 30 31 return __pa(*p_hv_pa_pg); 32 } 33 #else /* !CONFIG_HYPERV */ hv_flush_remote_tlbs(struct kvm * kvm)34static inline int hv_flush_remote_tlbs(struct kvm *kvm) 35 { 36 return -EOPNOTSUPP; 37 } 38 hv_track_root_tdp(struct kvm_vcpu * vcpu,hpa_t root_tdp)39static inline void hv_track_root_tdp(struct kvm_vcpu *vcpu, hpa_t root_tdp) 40 { 41 } 42 #endif /* !CONFIG_HYPERV */ 43 44 #endif 45