[PATCH v2 1/7] Drivers: hv: Handle NEED_RESCHED_LAZY before transferring to guest
Sean Christopherson
seanjc at google.com
Wed Aug 27 17:01:50 PDT 2025
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 <nunodasneves at linux.microsoft.com>
Cc: Mukesh R <mrathor at 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 <seanjc at 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;
--
2.51.0.268.g9569e192d0-goog
More information about the linux-riscv
mailing list