On 8/27/2025 5:01 PM, Sean Christopherson wrote: > Check for NEED_RESCHED_LAZY, not just NEED_RESCHED, prior to transferring > control to a guest. Failure to check for lazy resched can unnecessarily > delay rescheduling until the next tick when using a lazy preemption model. > > Note, ideally both the checking and processing of TIF bits would be handled > in common code, to avoid having to keep three separate paths synchronized, > but defer such cleanups to the future to keep the fix as standalone as > possible. > > Cc: Nuno Das Neves <nunodasne...@linux.microsoft.com> > Cc: Mukesh R <mrat...@linux.microsoft.com> > Fixes: 621191d709b1 ("Drivers: hv: Introduce mshv_root module to expose > /dev/mshv to VMMs") > Fixes: 64503b4f4468 ("Drivers: hv: Introduce mshv_vtl driver") > Signed-off-by: Sean Christopherson <sea...@google.com> > --- > drivers/hv/mshv_common.c | 2 +- > drivers/hv/mshv_root_main.c | 3 ++- > drivers/hv/mshv_vtl_main.c | 3 ++- > 3 files changed, 5 insertions(+), 3 deletions(-) > > diff --git a/drivers/hv/mshv_common.c b/drivers/hv/mshv_common.c > index 6f227a8a5af7..eb3df3e296bb 100644 > --- a/drivers/hv/mshv_common.c > +++ b/drivers/hv/mshv_common.c > @@ -151,7 +151,7 @@ int mshv_do_pre_guest_mode_work(ulong th_flags) > if (th_flags & (_TIF_SIGPENDING | _TIF_NOTIFY_SIGNAL)) > return -EINTR; > > - if (th_flags & _TIF_NEED_RESCHED) > + if (th_flags & (_TIF_NEED_RESCHED | _TIF_NEED_RESCHED_LAZY)) > schedule(); > > if (th_flags & _TIF_NOTIFY_RESUME) > diff --git a/drivers/hv/mshv_root_main.c b/drivers/hv/mshv_root_main.c > index 932932cb91ea..0d849f09160a 100644 > --- a/drivers/hv/mshv_root_main.c > +++ b/drivers/hv/mshv_root_main.c > @@ -484,7 +484,8 @@ mshv_vp_wait_for_hv_kick(struct mshv_vp *vp) > static int mshv_pre_guest_mode_work(struct mshv_vp *vp) > { > const ulong work_flags = _TIF_NOTIFY_SIGNAL | _TIF_SIGPENDING | > - _TIF_NEED_RESCHED | _TIF_NOTIFY_RESUME; > + _TIF_NEED_RESCHED | _TIF_NEED_RESCHED_LAZY | > + _TIF_NOTIFY_RESUME; > ulong th_flags; > > th_flags = read_thread_flags(); > diff --git a/drivers/hv/mshv_vtl_main.c b/drivers/hv/mshv_vtl_main.c > index dc6594ae03ad..12f5e77b7095 100644 > --- a/drivers/hv/mshv_vtl_main.c > +++ b/drivers/hv/mshv_vtl_main.c > @@ -728,7 +728,8 @@ static int mshv_vtl_ioctl_return_to_lower_vtl(void) > preempt_disable(); > for (;;) { > const unsigned long VTL0_WORK = _TIF_SIGPENDING | > _TIF_NEED_RESCHED | > - _TIF_NOTIFY_RESUME | > _TIF_NOTIFY_SIGNAL; > + _TIF_NOTIFY_RESUME | > _TIF_NOTIFY_SIGNAL | > + _TIF_NEED_RESCHED_LAZY; > unsigned long ti_work; > u32 cancel; > unsigned long irq_flags;
Tested by compiling with CONFIG_PREEMPT_LAZY=y and booting a guest. For the test I added a check to confirm _TIF_NEED_RESCHED_LAZY was set and honored. Looks good, thanks. Tested-by: Nuno Das Neves <nunodasne...@linux.microsoft.com> Reviewed-by: Nuno Das Neves <nunodasne...@linux.microsoft.com>