-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
KVM: SVM: hyper-v: Remote TLB flush for SVM
Enable remote TLB flush for SVM. Signed-off-by: Vineeth Pillai <viremana@linux.microsoft.com> Message-Id: <1ee364e397e142aed662d2920d198cd03772f1a5.1622730232.git.viremana@linux.microsoft.com> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
- Loading branch information
Vineeth Pillai
authored and
Paolo Bonzini
committed
Jun 17, 2021
1 parent
59d21d6
commit 1e0c7d4
Showing
2 changed files
with
75 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,66 @@ | ||
/* SPDX-License-Identifier: GPL-2.0-only */ | ||
/* | ||
* KVM L1 hypervisor optimizations on Hyper-V for SVM. | ||
*/ | ||
|
||
#ifndef __ARCH_X86_KVM_SVM_ONHYPERV_H__ | ||
#define __ARCH_X86_KVM_SVM_ONHYPERV_H__ | ||
|
||
#if IS_ENABLED(CONFIG_HYPERV) | ||
#include <asm/mshyperv.h> | ||
|
||
#include "hyperv.h" | ||
#include "kvm_onhyperv.h" | ||
|
||
static struct kvm_x86_ops svm_x86_ops; | ||
|
||
/* | ||
* Hyper-V uses the software reserved 32 bytes in VMCB | ||
* control area to expose SVM enlightenments to guests. | ||
*/ | ||
struct hv_enlightenments { | ||
struct __packed hv_enlightenments_control { | ||
u32 nested_flush_hypercall:1; | ||
u32 msr_bitmap:1; | ||
u32 enlightened_npt_tlb: 1; | ||
u32 reserved:29; | ||
} __packed hv_enlightenments_control; | ||
u32 hv_vp_id; | ||
u64 hv_vm_id; | ||
u64 partition_assist_page; | ||
u64 reserved; | ||
} __packed; | ||
|
||
static inline void svm_hv_init_vmcb(struct vmcb *vmcb) | ||
{ | ||
struct hv_enlightenments *hve = | ||
(struct hv_enlightenments *)vmcb->control.reserved_sw; | ||
|
||
if (npt_enabled && | ||
ms_hyperv.nested_features & HV_X64_NESTED_ENLIGHTENED_TLB) | ||
hve->hv_enlightenments_control.enlightened_npt_tlb = 1; | ||
} | ||
|
||
static inline void svm_hv_hardware_setup(void) | ||
{ | ||
if (npt_enabled && | ||
ms_hyperv.nested_features & HV_X64_NESTED_ENLIGHTENED_TLB) { | ||
pr_info("kvm: Hyper-V enlightened NPT TLB flush enabled\n"); | ||
svm_x86_ops.tlb_remote_flush = hv_remote_flush_tlb; | ||
svm_x86_ops.tlb_remote_flush_with_range = | ||
hv_remote_flush_tlb_with_range; | ||
} | ||
} | ||
|
||
#else | ||
|
||
static inline void svm_hv_init_vmcb(struct vmcb *vmcb) | ||
{ | ||
} | ||
|
||
static inline void svm_hv_hardware_setup(void) | ||
{ | ||
} | ||
#endif /* CONFIG_HYPERV */ | ||
|
||
#endif /* __ARCH_X86_KVM_SVM_ONHYPERV_H__ */ |