mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2025-12-27 08:45:26 -05:00
mshv: Use common "entry virt" APIs to do work in root before running guest
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 <seanjc@google.com> Tested-by: Nuno Das Neves <nunodasneves@linux.microsoft.com> Reviewed-by: Nuno Das Neves <nunodasneves@linux.microsoft.com> Signed-off-by: Wei Liu <wei.liu@kernel.org>
This commit is contained in:
committed by
Wei Liu
parent
9be7e1e320
commit
c5eebe075e
@@ -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
|
||||
|
||||
@@ -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(ulong th_flags);
|
||||
|
||||
#endif /* _MSHV_H */
|
||||
|
||||
@@ -138,25 +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.
|
||||
*/
|
||||
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;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(mshv_do_pre_guest_mode_work);
|
||||
|
||||
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user