mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2025-01-10 07:10:27 +00:00
a68de80f61
Invoke rseq_handle_notify_resume() from tracehook_notify_resume() now that the two function are always called back-to-back by architectures that have rseq. The rseq helper is stubbed out for architectures that don't support rseq, i.e. this is a nop across the board. Note, tracehook_notify_resume() is horribly named and arguably does not belong in tracehook.h as literally every line of code in it has nothing to do with tracing. But, that's been true since commit a42c6ded827d ("move key_repace_session_keyring() into tracehook_notify_resume()") first usurped tracehook_notify_resume() back in 2012. Punt cleaning that mess up to future patches. No functional change intended. Acked-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com> Signed-off-by: Sean Christopherson <seanjc@google.com> Message-Id: <20210901203030.1292304-3-seanjc@google.com> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
53 lines
1.2 KiB
C
53 lines
1.2 KiB
C
// SPDX-License-Identifier: GPL-2.0
|
|
|
|
#include <linux/entry-kvm.h>
|
|
#include <linux/kvm_host.h>
|
|
|
|
static int xfer_to_guest_mode_work(struct kvm_vcpu *vcpu, unsigned long ti_work)
|
|
{
|
|
do {
|
|
int ret;
|
|
|
|
if (ti_work & _TIF_NOTIFY_SIGNAL)
|
|
tracehook_notify_signal();
|
|
|
|
if (ti_work & _TIF_SIGPENDING) {
|
|
kvm_handle_signal_exit(vcpu);
|
|
return -EINTR;
|
|
}
|
|
|
|
if (ti_work & _TIF_NEED_RESCHED)
|
|
schedule();
|
|
|
|
if (ti_work & _TIF_NOTIFY_RESUME)
|
|
tracehook_notify_resume(NULL);
|
|
|
|
ret = arch_xfer_to_guest_mode_handle_work(vcpu, ti_work);
|
|
if (ret)
|
|
return ret;
|
|
|
|
ti_work = READ_ONCE(current_thread_info()->flags);
|
|
} while (ti_work & XFER_TO_GUEST_MODE_WORK || need_resched());
|
|
return 0;
|
|
}
|
|
|
|
int xfer_to_guest_mode_handle_work(struct kvm_vcpu *vcpu)
|
|
{
|
|
unsigned long ti_work;
|
|
|
|
/*
|
|
* This is invoked from the outer guest loop with interrupts and
|
|
* preemption enabled.
|
|
*
|
|
* KVM invokes xfer_to_guest_mode_work_pending() with interrupts
|
|
* disabled in the inner loop before going into guest mode. No need
|
|
* to disable interrupts here.
|
|
*/
|
|
ti_work = READ_ONCE(current_thread_info()->flags);
|
|
if (!(ti_work & XFER_TO_GUEST_MODE_WORK))
|
|
return 0;
|
|
|
|
return xfer_to_guest_mode_work(vcpu, ti_work);
|
|
}
|
|
EXPORT_SYMBOL_GPL(xfer_to_guest_mode_handle_work);
|