mirror of
https://github.com/torvalds/linux.git
synced 2026-01-24 23:16:46 +00:00
rseq, virt: Retrigger RSEQ after vcpu_run()
Hypervisors invoke resume_user_mode_work() before entering the guest, which clears TIF_NOTIFY_RESUME. The @regs argument is NULL as there is no user space context available to them, so the rseq notify handler skips inspecting the critical section, but updates the CPU/MM CID values unconditionally so that the eventual pending rseq event is not lost on the way to user space. This is a pointless exercise as the task might be rescheduled before actually returning to user space and it creates unnecessary work in the vcpu_run() loops. It's way more efficient to ignore that invocation based on @regs == NULL and let the hypervisors re-raise TIF_NOTIFY_RESUME after returning from the vcpu_run() loop before returning from the ioctl(). This ensures that a pending RSEQ update is not lost and the IDs are updated before returning to user space. Once the RSEQ handling is decoupled from TIF_NOTIFY_RESUME, this turns into a NOOP. Signed-off-by: Thomas Gleixner <tglx@linutronix.de> Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org> Signed-off-by: Ingo Molnar <mingo@kernel.org> Reviewed-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com> Acked-by: Sean Christopherson <seanjc@google.com> Link: https://patch.msgid.link/20251027084306.399495855@linutronix.de
This commit is contained in:
committed by
Ingo Molnar
parent
d923739e2e
commit
83409986f4
@@ -49,6 +49,7 @@
|
||||
#include <linux/lockdep.h>
|
||||
#include <linux/kthread.h>
|
||||
#include <linux/suspend.h>
|
||||
#include <linux/rseq.h>
|
||||
|
||||
#include <asm/processor.h>
|
||||
#include <asm/ioctl.h>
|
||||
@@ -4476,6 +4477,12 @@ static long kvm_vcpu_ioctl(struct file *filp,
|
||||
r = kvm_arch_vcpu_ioctl_run(vcpu);
|
||||
vcpu->wants_to_run = false;
|
||||
|
||||
/*
|
||||
* FIXME: Remove this hack once all KVM architectures
|
||||
* support the generic TIF bits, i.e. a dedicated TIF_RSEQ.
|
||||
*/
|
||||
rseq_virt_userspace_exit();
|
||||
|
||||
trace_kvm_userspace_exit(vcpu->run->exit_reason, r);
|
||||
break;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user