Message ID | 20200722220520.159112003@linutronix.de (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | entry, x86, kvm: Generic entry/exit functionality for host and guest | expand |
On Thu, Jul 23, 2020 at 12:00:02AM +0200, Thomas Gleixner wrote: > From: Thomas Gleixner <tglx@linutronix.de> > > Guests and user space share certain MSRs. KVM sets these MSRs to guest > values once and does not set them back to user space values on every VM > exit to spare the costly MSR operations. > > User return notifiers ensure that these MSRs are set back to the correct > values before returning to user space in exit_to_usermode_loop(). > > There is no reason to evaluate the TIF flag indicating that user return > notifiers need to be invoked in the loop. The important point is that they > are invoked before returning to user space. > > Move the invocation out of the loop into the section which does the last > preperatory steps before returning to user space. That section is not > preemptible and runs with interrupts disabled until the actual return. > > Signed-off-by: Thomas Gleixner <tglx@linutronix.de> Reviewed-and-tested-by: Sean Christopherson <sean.j.christopherson@intel.com>
--- a/arch/x86/entry/common.c +++ b/arch/x86/entry/common.c @@ -208,7 +208,7 @@ static long syscall_trace_enter(struct p #define EXIT_TO_USERMODE_LOOP_FLAGS \ (_TIF_SIGPENDING | _TIF_NOTIFY_RESUME | _TIF_UPROBE | \ - _TIF_NEED_RESCHED | _TIF_USER_RETURN_NOTIFY | _TIF_PATCH_PENDING) + _TIF_NEED_RESCHED | _TIF_PATCH_PENDING) static void exit_to_usermode_loop(struct pt_regs *regs, u32 cached_flags) { @@ -242,9 +242,6 @@ static void exit_to_usermode_loop(struct rseq_handle_notify_resume(NULL, regs); } - if (cached_flags & _TIF_USER_RETURN_NOTIFY) - fire_user_return_notifiers(); - /* Disable IRQs and retry */ local_irq_disable(); @@ -273,6 +270,9 @@ static void __prepare_exit_to_usermode(s /* Reload ti->flags; we may have rescheduled above. */ cached_flags = READ_ONCE(ti->flags); + if (cached_flags & _TIF_USER_RETURN_NOTIFY) + fire_user_return_notifiers(); + if (unlikely(cached_flags & _TIF_IO_BITMAP)) tss_update_io_bitmap();