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 <[email protected]>
---
 drivers/hv/Kconfig          |  1 +
 drivers/hv/mshv.h           |  2 --
 drivers/hv/mshv_common.c    | 45 -------------------------------------
 drivers/hv/mshv_root_main.c |  9 +++++---
 4 files changed, 7 insertions(+), 50 deletions(-)

diff --git a/drivers/hv/Kconfig b/drivers/hv/Kconfig
index 57623ca7f350..cdb210cd3710 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.h b/drivers/hv/mshv.h
index db3aa3831c43..d4813df92b9c 100644
--- a/drivers/hv/mshv.h
+++ b/drivers/hv/mshv.h
@@ -25,6 +25,4 @@ int hv_call_set_vp_registers(u32 vp_index, u64 partition_id, 
u16 count,
 int hv_call_get_partition_property(u64 partition_id, u64 property_code,
                                   u64 *property_value);
 
-int mshv_do_pre_guest_mode_work(void);
-
 #endif /* _MSHV_H */
diff --git a/drivers/hv/mshv_common.c b/drivers/hv/mshv_common.c
index b953b5e21110..aa2be51979fd 100644
--- a/drivers/hv/mshv_common.c
+++ b/drivers/hv/mshv_common.c
@@ -138,48 +138,3 @@ int hv_call_get_partition_property(u64 partition_id,
        return 0;
 }
 EXPORT_SYMBOL_GPL(hv_call_get_partition_property);
-
-/*
- * Handle any pre-processing before going into the guest mode on this cpu, most
- * notably call schedule(). Must be invoked with both preemption and
- * interrupts enabled.
- *
- * Returns: 0 on success, -errno on error.
- */
-static 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 | _TIF_NEED_RESCHED_LAZY))
-               schedule();
-
-       if (th_flags & _TIF_NOTIFY_RESUME)
-               resume_user_mode_work(NULL);
-
-       return 0;
-}
-
-int mshv_do_pre_guest_mode_work(void)
-{
-       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;
-
-}
-EXPORT_SYMBOL_GPL(mshv_do_pre_guest_mode_work);
diff --git a/drivers/hv/mshv_root_main.c b/drivers/hv/mshv_root_main.c
index 6f677fb93af0..387491ca16d6 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>
@@ -507,9 +508,11 @@ static long mshv_run_vp_with_root_scheduler(struct mshv_vp 
*vp)
                u32 flags = 0;
                struct hv_output_dispatch_vp output;
 
-               ret = mshv_do_pre_guest_mode_work();
-               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.261.g7ce5a0a67e-goog


Reply via email to