[PATCH v2 0/7] Drivers: hv: Fix NEED_RESCHED_LAZY and use common APIs

Sean Christopherson posted 7 patches 1 month ago
MAINTAINERS                                 |  2 +-
arch/arm64/kvm/Kconfig                      |  2 +-
arch/arm64/kvm/arm.c                        |  3 +-
arch/loongarch/kvm/Kconfig                  |  2 +-
arch/loongarch/kvm/vcpu.c                   |  3 +-
arch/riscv/kvm/Kconfig                      |  2 +-
arch/riscv/kvm/vcpu.c                       |  3 +-
arch/x86/kvm/Kconfig                        |  2 +-
arch/x86/kvm/vmx/vmx.c                      |  1 -
arch/x86/kvm/x86.c                          |  3 +-
drivers/hv/Kconfig                          |  2 ++
drivers/hv/mshv.h                           |  2 --
drivers/hv/mshv_common.c                    | 22 ---------------
drivers/hv/mshv_root_main.c                 | 31 ++++-----------------
drivers/hv/mshv_vtl_main.c                  | 23 +++++++--------
include/linux/{entry-kvm.h => entry-virt.h} | 19 +++++--------
include/linux/kvm_host.h                    | 17 +++++++++--
include/linux/rcupdate.h                    |  2 +-
kernel/entry/Makefile                       |  2 +-
kernel/entry/{kvm.c => virt.c}              | 15 ++++------
kernel/rcu/tree.c                           |  6 ++--
virt/kvm/Kconfig                            |  2 +-
22 files changed, 60 insertions(+), 106 deletions(-)
rename include/linux/{entry-kvm.h => entry-virt.h} (83%)
rename kernel/entry/{kvm.c => virt.c} (66%)
[PATCH v2 0/7] Drivers: hv: Fix NEED_RESCHED_LAZY and use common APIs
Posted by Sean Christopherson 1 month ago
Fix a bug where MSHV root partitions (and upper-level VTL code) don't honor
NEED_RESCHED_LAZY, and then deduplicate the TIF related MSHV code by turning
the "kvm" entry APIs into more generic "virt" APIs.

This version is based on

  git://git.kernel.org/pub/scm/linux/kernel/git/hyperv/linux.git hyperv-next

in order to pickup the VTL changes that are queued for 6.18.  I also
squashed the NEED_RESCHED_LAZY fixes for root and VTL modes into a single
patch, as it should be easy/straightforward to drop the VTL change as needed
if we want this in 6.17 or earlier.

That effectively means the full series is dependent on the VTL changes being
fully merged for 6.18.  But I think that's ok as it's really only the MSHV
changes that have any urgency whatsoever, and I assume that Microsoft is
the only user that truly cares about the MSHV root fix.  I.e. if the whole
thing gets delayed, I think it's only the Hyper-V folks that are impacted.

I have no preference what tree this goes through, or when, and can respin
and/or split as needed.

As with v1, the Hyper-V stuff and non-x86 architectures are compile-tested
only.

v2:
 - Rebase on hyperv-next.
 - Fix and converge the VTL code as well. [Peter, Nuno]

v1: https://lore.kernel.org/all/20250825200622.3759571-1-seanjc@google.com


Sean Christopherson (7):
  Drivers: hv: Handle NEED_RESCHED_LAZY before transferring to guest
  Drivers: hv: Disentangle VTL return cancellation from SIGPENDING
  Drivers: hv: Disable IRQs only after handling pending work before VTL
    return
  entry/kvm: KVM: Move KVM details related to signal/-EINTR into KVM
    proper
  entry: Rename "kvm" entry code assets to "virt" to genericize APIs
  Drivers: hv: Use common "entry virt" APIs to do work in root before
    running guest
  Drivers: hv: Use "entry virt" APIs to do work before returning to
    lower VTL

 MAINTAINERS                                 |  2 +-
 arch/arm64/kvm/Kconfig                      |  2 +-
 arch/arm64/kvm/arm.c                        |  3 +-
 arch/loongarch/kvm/Kconfig                  |  2 +-
 arch/loongarch/kvm/vcpu.c                   |  3 +-
 arch/riscv/kvm/Kconfig                      |  2 +-
 arch/riscv/kvm/vcpu.c                       |  3 +-
 arch/x86/kvm/Kconfig                        |  2 +-
 arch/x86/kvm/vmx/vmx.c                      |  1 -
 arch/x86/kvm/x86.c                          |  3 +-
 drivers/hv/Kconfig                          |  2 ++
 drivers/hv/mshv.h                           |  2 --
 drivers/hv/mshv_common.c                    | 22 ---------------
 drivers/hv/mshv_root_main.c                 | 31 ++++-----------------
 drivers/hv/mshv_vtl_main.c                  | 23 +++++++--------
 include/linux/{entry-kvm.h => entry-virt.h} | 19 +++++--------
 include/linux/kvm_host.h                    | 17 +++++++++--
 include/linux/rcupdate.h                    |  2 +-
 kernel/entry/Makefile                       |  2 +-
 kernel/entry/{kvm.c => virt.c}              | 15 ++++------
 kernel/rcu/tree.c                           |  6 ++--
 virt/kvm/Kconfig                            |  2 +-
 22 files changed, 60 insertions(+), 106 deletions(-)
 rename include/linux/{entry-kvm.h => entry-virt.h} (83%)
 rename kernel/entry/{kvm.c => virt.c} (66%)


base-commit: 03ac62a578566730ab3c320f289f7320798ee2e1
-- 
2.51.0.268.g9569e192d0-goog
Re: [PATCH v2 0/7] Drivers: hv: Fix NEED_RESCHED_LAZY and use common APIs
Posted by Wei Liu 4 weeks ago
On Wed, Aug 27, 2025 at 05:01:49PM -0700, Sean Christopherson wrote:
> Fix a bug where MSHV root partitions (and upper-level VTL code) don't honor
> NEED_RESCHED_LAZY, and then deduplicate the TIF related MSHV code by turning
> the "kvm" entry APIs into more generic "virt" APIs.
> 
> This version is based on
> 
>   git://git.kernel.org/pub/scm/linux/kernel/git/hyperv/linux.git hyperv-next
> 
> in order to pickup the VTL changes that are queued for 6.18.  I also
> squashed the NEED_RESCHED_LAZY fixes for root and VTL modes into a single
> patch, as it should be easy/straightforward to drop the VTL change as needed
> if we want this in 6.17 or earlier.
> 
> That effectively means the full series is dependent on the VTL changes being
> fully merged for 6.18.  But I think that's ok as it's really only the MSHV
> changes that have any urgency whatsoever, and I assume that Microsoft is
> the only user that truly cares about the MSHV root fix.  I.e. if the whole
> thing gets delayed, I think it's only the Hyper-V folks that are impacted.
> 
> I have no preference what tree this goes through, or when, and can respin
> and/or split as needed.
> 
> As with v1, the Hyper-V stuff and non-x86 architectures are compile-tested
> only.
> 
> v2:
>  - Rebase on hyperv-next.
>  - Fix and converge the VTL code as well. [Peter, Nuno]
> 
> v1: https://lore.kernel.org/all/20250825200622.3759571-1-seanjc@google.com
> 

I dropped the mshv_vtl changes in this series and applied the rest
(including the KVM changes) to hyperv-next.

Thanks,
Wei
Re: [PATCH v2 0/7] Drivers: hv: Fix NEED_RESCHED_LAZY and use common APIs
Posted by Sean Christopherson 4 weeks ago
On Thu, Sep 04, 2025, Wei Liu wrote:
> On Wed, Aug 27, 2025 at 05:01:49PM -0700, Sean Christopherson wrote:
> > Fix a bug where MSHV root partitions (and upper-level VTL code) don't honor
> > NEED_RESCHED_LAZY, and then deduplicate the TIF related MSHV code by turning
> > the "kvm" entry APIs into more generic "virt" APIs.
> > 
> > This version is based on
> > 
> >   git://git.kernel.org/pub/scm/linux/kernel/git/hyperv/linux.git hyperv-next
> > 
> > in order to pickup the VTL changes that are queued for 6.18.  I also
> > squashed the NEED_RESCHED_LAZY fixes for root and VTL modes into a single
> > patch, as it should be easy/straightforward to drop the VTL change as needed
> > if we want this in 6.17 or earlier.
> > 
> > That effectively means the full series is dependent on the VTL changes being
> > fully merged for 6.18.  But I think that's ok as it's really only the MSHV
> > changes that have any urgency whatsoever, and I assume that Microsoft is
> > the only user that truly cares about the MSHV root fix.  I.e. if the whole
> > thing gets delayed, I think it's only the Hyper-V folks that are impacted.
> > 
> > I have no preference what tree this goes through, or when, and can respin
> > and/or split as needed.
> > 
> > As with v1, the Hyper-V stuff and non-x86 architectures are compile-tested
> > only.
> > 
> > v2:
> >  - Rebase on hyperv-next.
> >  - Fix and converge the VTL code as well. [Peter, Nuno]
> > 
> > v1: https://lore.kernel.org/all/20250825200622.3759571-1-seanjc@google.com
> > 
> 
> I dropped the mshv_vtl changes in this series and applied the rest
> (including the KVM changes) to hyperv-next.

mshv_do_pre_guest_mode_work() ended up getting left behind since its removal was
in the last mshv_vtl patch.

  $ git grep mshv_do_pre_guest_mode_work
  drivers/hv/mshv.h:int mshv_do_pre_guest_mode_work(ulong th_flags);
  drivers/hv/mshv_common.c:int mshv_do_pre_guest_mode_work(ulong th_flags)
  drivers/hv/mshv_common.c:EXPORT_SYMBOL_GPL(mshv_do_pre_guest_mode_work);

Want to squash this into 3786d7d6b3c0 ("mshv: Use common "entry virt" APIs to do
work in root before running guest")?

---
 drivers/hv/mshv.h        |  2 --
 drivers/hv/mshv_common.c | 22 ----------------------
 2 files changed, 24 deletions(-)

diff --git a/drivers/hv/mshv.h b/drivers/hv/mshv.h
index 0340a67acd0a..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(ulong th_flags);
-
 #endif /* _MSHV_H */
diff --git a/drivers/hv/mshv_common.c b/drivers/hv/mshv_common.c
index eb3df3e296bb..aa2be51979fd 100644
--- a/drivers/hv/mshv_common.c
+++ b/drivers/hv/mshv_common.c
@@ -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);

base-commit: 3786d7d6b3c0a412ebe4439ba4a7d4b0e27d9a12
--
Re: [PATCH v2 0/7] Drivers: hv: Fix NEED_RESCHED_LAZY and use common APIs
Posted by Wei Liu 3 weeks, 2 days ago
On Thu, Sep 04, 2025 at 10:39:37PM -0700, Sean Christopherson wrote:
> On Thu, Sep 04, 2025, Wei Liu wrote:
> > On Wed, Aug 27, 2025 at 05:01:49PM -0700, Sean Christopherson wrote:
> > > Fix a bug where MSHV root partitions (and upper-level VTL code) don't honor
> > > NEED_RESCHED_LAZY, and then deduplicate the TIF related MSHV code by turning
> > > the "kvm" entry APIs into more generic "virt" APIs.
> > > 
> > > This version is based on
> > > 
> > >   git://git.kernel.org/pub/scm/linux/kernel/git/hyperv/linux.git hyperv-next
> > > 
> > > in order to pickup the VTL changes that are queued for 6.18.  I also
> > > squashed the NEED_RESCHED_LAZY fixes for root and VTL modes into a single
> > > patch, as it should be easy/straightforward to drop the VTL change as needed
> > > if we want this in 6.17 or earlier.
> > > 
> > > That effectively means the full series is dependent on the VTL changes being
> > > fully merged for 6.18.  But I think that's ok as it's really only the MSHV
> > > changes that have any urgency whatsoever, and I assume that Microsoft is
> > > the only user that truly cares about the MSHV root fix.  I.e. if the whole
> > > thing gets delayed, I think it's only the Hyper-V folks that are impacted.
> > > 
> > > I have no preference what tree this goes through, or when, and can respin
> > > and/or split as needed.
> > > 
> > > As with v1, the Hyper-V stuff and non-x86 architectures are compile-tested
> > > only.
> > > 
> > > v2:
> > >  - Rebase on hyperv-next.
> > >  - Fix and converge the VTL code as well. [Peter, Nuno]
> > > 
> > > v1: https://lore.kernel.org/all/20250825200622.3759571-1-seanjc@google.com
> > > 
> > 
> > I dropped the mshv_vtl changes in this series and applied the rest
> > (including the KVM changes) to hyperv-next.
> 
> mshv_do_pre_guest_mode_work() ended up getting left behind since its removal was
> in the last mshv_vtl patch.
> 
>   $ git grep mshv_do_pre_guest_mode_work
>   drivers/hv/mshv.h:int mshv_do_pre_guest_mode_work(ulong th_flags);
>   drivers/hv/mshv_common.c:int mshv_do_pre_guest_mode_work(ulong th_flags)
>   drivers/hv/mshv_common.c:EXPORT_SYMBOL_GPL(mshv_do_pre_guest_mode_work);
> 
> Want to squash this into 3786d7d6b3c0 ("mshv: Use common "entry virt" APIs to do
> work in root before running guest")?
> 

It's done. Thanks for pointing it out.

Wei