Use the kernel's common "entry virt" APIs to handle pending work prior to
(re)entering guest mode, now that the virt APIs don't have a superfluous
dependency on KVM.

No functional change intended.

Signed-off-by: Sean Christopherson <sea...@google.com>
---
 drivers/hv/Kconfig          |  1 +
 drivers/hv/mshv_root_main.c | 32 ++++++--------------------------
 2 files changed, 7 insertions(+), 26 deletions(-)

diff --git a/drivers/hv/Kconfig b/drivers/hv/Kconfig
index 2e8df09db599..894037afcbf9 100644
--- a/drivers/hv/Kconfig
+++ b/drivers/hv/Kconfig
@@ -66,6 +66,7 @@ config MSHV_ROOT
        # no particular order, making it impossible to reassemble larger pages
        depends on PAGE_SIZE_4KB
        select EVENTFD
+       select VIRT_XFER_TO_GUEST_WORK
        default n
        help
          Select this option to enable support for booting and running as root
diff --git a/drivers/hv/mshv_root_main.c b/drivers/hv/mshv_root_main.c
index 0d849f09160a..7c83f656e071 100644
--- a/drivers/hv/mshv_root_main.c
+++ b/drivers/hv/mshv_root_main.c
@@ -8,6 +8,7 @@
  * Authors: Microsoft Linux virtualization team
  */
 
+#include <linux/entry-virt.h>
 #include <linux/kernel.h>
 #include <linux/module.h>
 #include <linux/fs.h>
@@ -481,29 +482,6 @@ mshv_vp_wait_for_hv_kick(struct mshv_vp *vp)
        return 0;
 }
 
-static int mshv_pre_guest_mode_work(struct mshv_vp *vp)
-{
-       const ulong work_flags = _TIF_NOTIFY_SIGNAL | _TIF_SIGPENDING |
-                                _TIF_NEED_RESCHED  | _TIF_NEED_RESCHED_LAZY |
-                                _TIF_NOTIFY_RESUME;
-       ulong th_flags;
-
-       th_flags = read_thread_flags();
-       while (th_flags & work_flags) {
-               int ret;
-
-               /* nb: following will call schedule */
-               ret = mshv_do_pre_guest_mode_work(th_flags);
-
-               if (ret)
-                       return ret;
-
-               th_flags = read_thread_flags();
-       }
-
-       return 0;
-}
-
 /* Must be called with interrupts enabled */
 static long mshv_run_vp_with_root_scheduler(struct mshv_vp *vp)
 {
@@ -524,9 +502,11 @@ static long mshv_run_vp_with_root_scheduler(struct mshv_vp 
*vp)
                u32 flags = 0;
                struct hv_output_dispatch_vp output;
 
-               ret = mshv_pre_guest_mode_work(vp);
-               if (ret)
-                       break;
+               if (__xfer_to_guest_mode_work_pending()) {
+                       ret = xfer_to_guest_mode_handle_work();
+                       if (ret)
+                               break;
+               }
 
                if (vp->run.flags.intercept_suspend)
                        flags |= HV_DISPATCH_VP_FLAG_CLEAR_INTERCEPT_SUSPEND;
-- 
2.51.0.268.g9569e192d0-goog


Reply via email to