Check for return to a lower VTL being cancelled separately from handling pending TIF-based work, as there is no need to immediately process pending work; the kernel will immediately exit to userspace (ignoring preemption) and handle the pending work at that time. Disentangling cancellation from the TIF-based work will allow switching to common virtualization APIs for detecting and processing pending work. Signed-off-by: Sean Christopherson --- drivers/hv/mshv_vtl_main.c | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/drivers/hv/mshv_vtl_main.c b/drivers/hv/mshv_vtl_main.c index 12f5e77b7095..aa09a76f0eff 100644 --- a/drivers/hv/mshv_vtl_main.c +++ b/drivers/hv/mshv_vtl_main.c @@ -731,19 +731,21 @@ static int mshv_vtl_ioctl_return_to_lower_vtl(void) _TIF_NOTIFY_RESUME | _TIF_NOTIFY_SIGNAL | _TIF_NEED_RESCHED_LAZY; unsigned long ti_work; - u32 cancel; unsigned long irq_flags; struct hv_vp_assist_page *hvp; int ret; local_irq_save(irq_flags); + if (READ_ONCE(mshv_vtl_this_run()->cancel)) { + local_irq_restore(irq_flags); + preempt_enable(); + return -EINTR; + } + ti_work = READ_ONCE(current_thread_info()->flags); - cancel = READ_ONCE(mshv_vtl_this_run()->cancel); - if (unlikely((ti_work & VTL0_WORK) || cancel)) { + if (unlikely(ti_work & VTL0_WORK)) { local_irq_restore(irq_flags); preempt_enable(); - if (cancel) - ti_work |= _TIF_SIGPENDING; ret = mshv_do_pre_guest_mode_work(ti_work); if (ret) return ret; -- 2.51.0.268.g9569e192d0-goog