From: Vineeth Pillai <virem...@linux.microsoft.com> Similar to how user to kernel mode transitions are protected in earlier patches, protect the entry into kernel from guest mode as well.
Tested-by: Julien Desfossez <jdesfos...@digitalocean.com> Signed-off-by: Vineeth Pillai <virem...@linux.microsoft.com> --- arch/x86/kvm/x86.c | 3 +++ include/linux/entry-kvm.h | 12 ++++++++++++ kernel/entry/kvm.c | 13 +++++++++++++ 3 files changed, 28 insertions(+) diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c index ce856e0ece84..05a281f3ef28 100644 --- a/arch/x86/kvm/x86.c +++ b/arch/x86/kvm/x86.c @@ -8540,6 +8540,8 @@ static int vcpu_enter_guest(struct kvm_vcpu *vcpu) */ smp_mb__after_srcu_read_unlock(); + kvm_exit_to_guest_mode(vcpu); + /* * This handles the case where a posted interrupt was * notified with kvm_vcpu_kick. @@ -8633,6 +8635,7 @@ static int vcpu_enter_guest(struct kvm_vcpu *vcpu) } } + kvm_enter_from_guest_mode(vcpu); local_irq_enable(); preempt_enable(); diff --git a/include/linux/entry-kvm.h b/include/linux/entry-kvm.h index 0cef17afb41a..32aabb7f3e6d 100644 --- a/include/linux/entry-kvm.h +++ b/include/linux/entry-kvm.h @@ -77,4 +77,16 @@ static inline bool xfer_to_guest_mode_work_pending(void) } #endif /* CONFIG_KVM_XFER_TO_GUEST_WORK */ +/** + * kvm_enter_from_guest_mode - Hook called just after entering kernel from guest. + * @vcpu: Pointer to the current VCPU data + */ +void kvm_enter_from_guest_mode(struct kvm_vcpu *vcpu); + +/** + * kvm_exit_to_guest_mode - Hook called just before entering guest from kernel. + * @vcpu: Pointer to the current VCPU data + */ +void kvm_exit_to_guest_mode(struct kvm_vcpu *vcpu); + #endif diff --git a/kernel/entry/kvm.c b/kernel/entry/kvm.c index eb1a8a4c867c..b0b7facf4374 100644 --- a/kernel/entry/kvm.c +++ b/kernel/entry/kvm.c @@ -49,3 +49,16 @@ int xfer_to_guest_mode_handle_work(struct kvm_vcpu *vcpu) return xfer_to_guest_mode_work(vcpu, ti_work); } EXPORT_SYMBOL_GPL(xfer_to_guest_mode_handle_work); + +void kvm_enter_from_guest_mode(struct kvm_vcpu *vcpu) +{ + sched_core_unsafe_enter(); +} +EXPORT_SYMBOL_GPL(kvm_enter_from_guest_mode); + +void kvm_exit_to_guest_mode(struct kvm_vcpu *vcpu) +{ + sched_core_unsafe_exit(); + sched_core_wait_till_safe(XFER_TO_GUEST_MODE_WORK); +} +EXPORT_SYMBOL_GPL(kvm_exit_to_guest_mode); -- 2.29.0.rc1.297.gfa9743e501-goog