linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH 0/3] KVM: arm64: Use generic guest entry infrastructure
@ 2021-07-29 19:56 Oliver Upton
  2021-07-29 19:56 ` [PATCH 1/3] KVM: arm64: Record number of signal exits as a vCPU stat Oliver Upton
                   ` (2 more replies)
  0 siblings, 3 replies; 6+ messages in thread
From: Oliver Upton @ 2021-07-29 19:56 UTC (permalink / raw)
  To: kvmarm
  Cc: kvm, linux-kernel, Paolo Bonzini, Marc Zyngier, James Morse,
	Alexandru Elisei, Suzuki K Poulose, Catalin Marinas, Will Deacon,
	Thomas Gleixner, Peter Zijlstra, Andy Lutomirski,
	linux-arm-kernel, Peter Shier, Shakeel Butt, Guangyu Shi,
	Oliver Upton

The arm64 kernel doesn't yet support the full generic entry
infrastructure. That being said, KVM/arm64 doesn't properly handle
TIF_NOTIFY_RESUME and could pick this up by switching to the generic
guest entry infrasturture.

Patch 1 adds a missing vCPU stat to ARM64 to record the number of signal
exits to userspace.

Patch 2 unhitches entry-kvm from entry-generic, as ARM64 doesn't
currently support the generic infrastructure.

Patch 3 replaces the open-coded entry handling with the generic xfer
function.

This series was tested on an Ampere Mt. Jade reference system. The
series cleanly applies to kvm/queue (note that this is deliberate as the
generic kvm stats patches have not yet propagated to kvm-arm/queue) at
the following commit:

8ad5e63649ff ("KVM: Don't take mmu_lock for range invalidation unless necessary")

Oliver Upton (3):
  KVM: arm64: Record number of signal exits as a vCPU stat
  entry: KVM: Allow use of generic KVM entry w/o full generic support
  KVM: arm64: Use generic KVM xfer to guest work function

 arch/arm64/include/asm/kvm_host.h |  1 +
 arch/arm64/kvm/Kconfig            |  1 +
 arch/arm64/kvm/arm.c              | 26 ++++++++++++++------------
 arch/arm64/kvm/guest.c            |  3 ++-
 include/linux/entry-kvm.h         |  6 +++++-
 5 files changed, 23 insertions(+), 14 deletions(-)

-- 
2.32.0.554.ge1b32706d8-goog


^ permalink raw reply	[flat|nested] 6+ messages in thread

* [PATCH 1/3] KVM: arm64: Record number of signal exits as a vCPU stat
  2021-07-29 19:56 [PATCH 0/3] KVM: arm64: Use generic guest entry infrastructure Oliver Upton
@ 2021-07-29 19:56 ` Oliver Upton
  2021-07-29 20:07   ` Jing Zhang
  2021-07-29 19:56 ` [PATCH 2/3] entry: KVM: Allow use of generic KVM entry w/o full generic support Oliver Upton
  2021-07-29 19:56 ` [PATCH 3/3] KVM: arm64: Use generic KVM xfer to guest work function Oliver Upton
  2 siblings, 1 reply; 6+ messages in thread
From: Oliver Upton @ 2021-07-29 19:56 UTC (permalink / raw)
  To: kvmarm
  Cc: kvm, linux-kernel, Paolo Bonzini, Marc Zyngier, James Morse,
	Alexandru Elisei, Suzuki K Poulose, Catalin Marinas, Will Deacon,
	Thomas Gleixner, Peter Zijlstra, Andy Lutomirski,
	linux-arm-kernel, Peter Shier, Shakeel Butt, Guangyu Shi,
	Oliver Upton, Jing Zhang

Most other architectures that implement KVM record a statistic
indicating the number of times a vCPU has exited due to a pending
signal. Add support for that stat to arm64.

Cc: Jing Zhang <jingzhangos@google.com>
Signed-off-by: Oliver Upton <oupton@google.com>
---
 arch/arm64/include/asm/kvm_host.h | 1 +
 arch/arm64/kvm/arm.c              | 1 +
 arch/arm64/kvm/guest.c            | 3 ++-
 3 files changed, 4 insertions(+), 1 deletion(-)

diff --git a/arch/arm64/include/asm/kvm_host.h b/arch/arm64/include/asm/kvm_host.h
index 41911585ae0c..70e129f2b574 100644
--- a/arch/arm64/include/asm/kvm_host.h
+++ b/arch/arm64/include/asm/kvm_host.h
@@ -576,6 +576,7 @@ struct kvm_vcpu_stat {
 	u64 wfi_exit_stat;
 	u64 mmio_exit_user;
 	u64 mmio_exit_kernel;
+	u64 signal_exits;
 	u64 exits;
 };
 
diff --git a/arch/arm64/kvm/arm.c b/arch/arm64/kvm/arm.c
index e9a2b8f27792..60d0a546d7fd 100644
--- a/arch/arm64/kvm/arm.c
+++ b/arch/arm64/kvm/arm.c
@@ -783,6 +783,7 @@ int kvm_arch_vcpu_ioctl_run(struct kvm_vcpu *vcpu)
 		if (signal_pending(current)) {
 			ret = -EINTR;
 			run->exit_reason = KVM_EXIT_INTR;
+			++vcpu->stat.signal_exits;
 		}
 
 		/*
diff --git a/arch/arm64/kvm/guest.c b/arch/arm64/kvm/guest.c
index 1dfb83578277..50fc16ad872f 100644
--- a/arch/arm64/kvm/guest.c
+++ b/arch/arm64/kvm/guest.c
@@ -50,7 +50,8 @@ const struct _kvm_stats_desc kvm_vcpu_stats_desc[] = {
 	STATS_DESC_COUNTER(VCPU, wfi_exit_stat),
 	STATS_DESC_COUNTER(VCPU, mmio_exit_user),
 	STATS_DESC_COUNTER(VCPU, mmio_exit_kernel),
-	STATS_DESC_COUNTER(VCPU, exits)
+	STATS_DESC_COUNTER(VCPU, exits),
+	STATS_DESC_COUNTER(VCPU, signal_exits),
 };
 static_assert(ARRAY_SIZE(kvm_vcpu_stats_desc) ==
 		sizeof(struct kvm_vcpu_stat) / sizeof(u64));
-- 
2.32.0.554.ge1b32706d8-goog


^ permalink raw reply	[flat|nested] 6+ messages in thread

* [PATCH 2/3] entry: KVM: Allow use of generic KVM entry w/o full generic support
  2021-07-29 19:56 [PATCH 0/3] KVM: arm64: Use generic guest entry infrastructure Oliver Upton
  2021-07-29 19:56 ` [PATCH 1/3] KVM: arm64: Record number of signal exits as a vCPU stat Oliver Upton
@ 2021-07-29 19:56 ` Oliver Upton
  2021-07-29 19:56 ` [PATCH 3/3] KVM: arm64: Use generic KVM xfer to guest work function Oliver Upton
  2 siblings, 0 replies; 6+ messages in thread
From: Oliver Upton @ 2021-07-29 19:56 UTC (permalink / raw)
  To: kvmarm
  Cc: kvm, linux-kernel, Paolo Bonzini, Marc Zyngier, James Morse,
	Alexandru Elisei, Suzuki K Poulose, Catalin Marinas, Will Deacon,
	Thomas Gleixner, Peter Zijlstra, Andy Lutomirski,
	linux-arm-kernel, Peter Shier, Shakeel Butt, Guangyu Shi,
	Oliver Upton

Some architectures (e.g. arm64) have yet to adopt the generic entry
infrastructure. Despite that, it would be nice to use some common
plumbing for guest entry/exit handling. For example, KVM/arm64 currently
does not handle TIF_NOTIFY_PENDING correctly.

Allow use of only the generic KVM entry code by tightening up the
include list. No functional change intended.

Signed-off-by: Oliver Upton <oupton@google.com>
---
 include/linux/entry-kvm.h | 6 +++++-
 1 file changed, 5 insertions(+), 1 deletion(-)

diff --git a/include/linux/entry-kvm.h b/include/linux/entry-kvm.h
index 136b8d97d8c0..0d7865a0731c 100644
--- a/include/linux/entry-kvm.h
+++ b/include/linux/entry-kvm.h
@@ -2,7 +2,11 @@
 #ifndef __LINUX_ENTRYKVM_H
 #define __LINUX_ENTRYKVM_H
 
-#include <linux/entry-common.h>
+#include <linux/static_call_types.h>
+#include <linux/tracehook.h>
+#include <linux/syscalls.h>
+#include <linux/seccomp.h>
+#include <linux/sched.h>
 #include <linux/tick.h>
 
 /* Transfer to guest mode work */
-- 
2.32.0.554.ge1b32706d8-goog


^ permalink raw reply	[flat|nested] 6+ messages in thread

* [PATCH 3/3] KVM: arm64: Use generic KVM xfer to guest work function
  2021-07-29 19:56 [PATCH 0/3] KVM: arm64: Use generic guest entry infrastructure Oliver Upton
  2021-07-29 19:56 ` [PATCH 1/3] KVM: arm64: Record number of signal exits as a vCPU stat Oliver Upton
  2021-07-29 19:56 ` [PATCH 2/3] entry: KVM: Allow use of generic KVM entry w/o full generic support Oliver Upton
@ 2021-07-29 19:56 ` Oliver Upton
  2 siblings, 0 replies; 6+ messages in thread
From: Oliver Upton @ 2021-07-29 19:56 UTC (permalink / raw)
  To: kvmarm
  Cc: kvm, linux-kernel, Paolo Bonzini, Marc Zyngier, James Morse,
	Alexandru Elisei, Suzuki K Poulose, Catalin Marinas, Will Deacon,
	Thomas Gleixner, Peter Zijlstra, Andy Lutomirski,
	linux-arm-kernel, Peter Shier, Shakeel Butt, Guangyu Shi,
	Oliver Upton

Clean up handling of checks for pending work by switching to the generic
infrastructure to do so.

We pick up handling for TIF_NOTIFY_RESUME from this switch, meaning that
task work will be correctly handled.

Signed-off-by: Oliver Upton <oupton@google.com>
---
 arch/arm64/kvm/Kconfig |  1 +
 arch/arm64/kvm/arm.c   | 27 ++++++++++++++-------------
 2 files changed, 15 insertions(+), 13 deletions(-)

diff --git a/arch/arm64/kvm/Kconfig b/arch/arm64/kvm/Kconfig
index a4eba0908bfa..8bc1fac5fa26 100644
--- a/arch/arm64/kvm/Kconfig
+++ b/arch/arm64/kvm/Kconfig
@@ -26,6 +26,7 @@ menuconfig KVM
 	select HAVE_KVM_ARCH_TLB_FLUSH_ALL
 	select KVM_MMIO
 	select KVM_GENERIC_DIRTYLOG_READ_PROTECT
+	select KVM_XFER_TO_GUEST_WORK
 	select SRCU
 	select KVM_VFIO
 	select HAVE_KVM_EVENTFD
diff --git a/arch/arm64/kvm/arm.c b/arch/arm64/kvm/arm.c
index 60d0a546d7fd..9762e2129813 100644
--- a/arch/arm64/kvm/arm.c
+++ b/arch/arm64/kvm/arm.c
@@ -6,6 +6,7 @@
 
 #include <linux/bug.h>
 #include <linux/cpu_pm.h>
+#include <linux/entry-kvm.h>
 #include <linux/errno.h>
 #include <linux/err.h>
 #include <linux/kvm_host.h>
@@ -714,6 +715,13 @@ static bool vcpu_mode_is_bad_32bit(struct kvm_vcpu *vcpu)
 		static_branch_unlikely(&arm64_mismatched_32bit_el0);
 }
 
+static bool kvm_vcpu_exit_request(struct kvm_vcpu *vcpu)
+{
+	return kvm_request_pending(vcpu) ||
+			need_new_vmid_gen(&vcpu->arch.hw_mmu->vmid) ||
+			xfer_to_guest_mode_work_pending();
+}
+
 /**
  * kvm_arch_vcpu_ioctl_run - the main VCPU run function to execute guest code
  * @vcpu:	The VCPU pointer
@@ -757,7 +765,11 @@ int kvm_arch_vcpu_ioctl_run(struct kvm_vcpu *vcpu)
 		/*
 		 * Check conditions before entering the guest
 		 */
-		cond_resched();
+		if (__xfer_to_guest_mode_work_pending()) {
+			ret = xfer_to_guest_mode_handle_work(vcpu);
+			if (!ret)
+				ret = 1;
+		}
 
 		update_vmid(&vcpu->arch.hw_mmu->vmid);
 
@@ -776,16 +788,6 @@ int kvm_arch_vcpu_ioctl_run(struct kvm_vcpu *vcpu)
 
 		kvm_vgic_flush_hwstate(vcpu);
 
-		/*
-		 * Exit if we have a signal pending so that we can deliver the
-		 * signal to user space.
-		 */
-		if (signal_pending(current)) {
-			ret = -EINTR;
-			run->exit_reason = KVM_EXIT_INTR;
-			++vcpu->stat.signal_exits;
-		}
-
 		/*
 		 * If we're using a userspace irqchip, then check if we need
 		 * to tell a userspace irqchip about timer or PMU level
@@ -809,8 +811,7 @@ int kvm_arch_vcpu_ioctl_run(struct kvm_vcpu *vcpu)
 		 */
 		smp_store_mb(vcpu->mode, IN_GUEST_MODE);
 
-		if (ret <= 0 || need_new_vmid_gen(&vcpu->arch.hw_mmu->vmid) ||
-		    kvm_request_pending(vcpu)) {
+		if (ret <= 0 || kvm_vcpu_exit_request(vcpu)) {
 			vcpu->mode = OUTSIDE_GUEST_MODE;
 			isb(); /* Ensure work in x_flush_hwstate is committed */
 			kvm_pmu_sync_hwstate(vcpu);
-- 
2.32.0.554.ge1b32706d8-goog


^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [PATCH 1/3] KVM: arm64: Record number of signal exits as a vCPU stat
  2021-07-29 19:56 ` [PATCH 1/3] KVM: arm64: Record number of signal exits as a vCPU stat Oliver Upton
@ 2021-07-29 20:07   ` Jing Zhang
  2021-07-29 20:23     ` Oliver Upton
  0 siblings, 1 reply; 6+ messages in thread
From: Jing Zhang @ 2021-07-29 20:07 UTC (permalink / raw)
  To: Oliver Upton
  Cc: KVM ARM, KVM, linux-kernel, Paolo Bonzini, Marc Zyngier,
	James Morse, Alexandru Elisei, Suzuki K Poulose, Catalin Marinas,
	Will Deacon, Thomas Gleixner, Peter Zijlstra, Andy Lutomirski,
	linux-arm-kernel, Peter Shier, Shakeel Butt, Guangyu Shi

On Thu, Jul 29, 2021 at 12:56 PM Oliver Upton <oupton@google.com> wrote:
>
> Most other architectures that implement KVM record a statistic
> indicating the number of times a vCPU has exited due to a pending
> signal. Add support for that stat to arm64.
>
> Cc: Jing Zhang <jingzhangos@google.com>
> Signed-off-by: Oliver Upton <oupton@google.com>
> ---
>  arch/arm64/include/asm/kvm_host.h | 1 +
>  arch/arm64/kvm/arm.c              | 1 +
>  arch/arm64/kvm/guest.c            | 3 ++-
>  3 files changed, 4 insertions(+), 1 deletion(-)
>
> diff --git a/arch/arm64/include/asm/kvm_host.h b/arch/arm64/include/asm/kvm_host.h
> index 41911585ae0c..70e129f2b574 100644
> --- a/arch/arm64/include/asm/kvm_host.h
> +++ b/arch/arm64/include/asm/kvm_host.h
> @@ -576,6 +576,7 @@ struct kvm_vcpu_stat {
>         u64 wfi_exit_stat;
>         u64 mmio_exit_user;
>         u64 mmio_exit_kernel;
> +       u64 signal_exits;
>         u64 exits;
>  };
>
> diff --git a/arch/arm64/kvm/arm.c b/arch/arm64/kvm/arm.c
> index e9a2b8f27792..60d0a546d7fd 100644
> --- a/arch/arm64/kvm/arm.c
> +++ b/arch/arm64/kvm/arm.c
> @@ -783,6 +783,7 @@ int kvm_arch_vcpu_ioctl_run(struct kvm_vcpu *vcpu)
>                 if (signal_pending(current)) {
>                         ret = -EINTR;
>                         run->exit_reason = KVM_EXIT_INTR;
> +                       ++vcpu->stat.signal_exits;
>                 }
>
>                 /*
> diff --git a/arch/arm64/kvm/guest.c b/arch/arm64/kvm/guest.c
> index 1dfb83578277..50fc16ad872f 100644
> --- a/arch/arm64/kvm/guest.c
> +++ b/arch/arm64/kvm/guest.c
> @@ -50,7 +50,8 @@ const struct _kvm_stats_desc kvm_vcpu_stats_desc[] = {
>         STATS_DESC_COUNTER(VCPU, wfi_exit_stat),
>         STATS_DESC_COUNTER(VCPU, mmio_exit_user),
>         STATS_DESC_COUNTER(VCPU, mmio_exit_kernel),
> -       STATS_DESC_COUNTER(VCPU, exits)
> +       STATS_DESC_COUNTER(VCPU, exits),
> +       STATS_DESC_COUNTER(VCPU, signal_exits),
How about put signal_exits before exits as the same order in
kvm_vcpu_stat just for readability?
>  };
>  static_assert(ARRAY_SIZE(kvm_vcpu_stats_desc) ==
>                 sizeof(struct kvm_vcpu_stat) / sizeof(u64));
> --
> 2.32.0.554.ge1b32706d8-goog
>
Reviewed-by: Jing Zhang <jingzhangos@google.com>

Thanks,
Jing

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [PATCH 1/3] KVM: arm64: Record number of signal exits as a vCPU stat
  2021-07-29 20:07   ` Jing Zhang
@ 2021-07-29 20:23     ` Oliver Upton
  0 siblings, 0 replies; 6+ messages in thread
From: Oliver Upton @ 2021-07-29 20:23 UTC (permalink / raw)
  To: Jing Zhang
  Cc: KVM ARM, KVM, linux-kernel, Paolo Bonzini, Marc Zyngier,
	James Morse, Alexandru Elisei, Suzuki K Poulose, Catalin Marinas,
	Will Deacon, Thomas Gleixner, Peter Zijlstra, Andy Lutomirski,
	linux-arm-kernel, Peter Shier, Shakeel Butt, Guangyu Shi

On Thu, Jul 29, 2021 at 1:07 PM Jing Zhang <jingzhangos@google.com> wrote:
>
> On Thu, Jul 29, 2021 at 12:56 PM Oliver Upton <oupton@google.com> wrote:
> >
> > Most other architectures that implement KVM record a statistic
> > indicating the number of times a vCPU has exited due to a pending
> > signal. Add support for that stat to arm64.
> >
> > Cc: Jing Zhang <jingzhangos@google.com>
> > Signed-off-by: Oliver Upton <oupton@google.com>
> > ---
> >  arch/arm64/include/asm/kvm_host.h | 1 +
> >  arch/arm64/kvm/arm.c              | 1 +
> >  arch/arm64/kvm/guest.c            | 3 ++-
> >  3 files changed, 4 insertions(+), 1 deletion(-)
> >
> > diff --git a/arch/arm64/include/asm/kvm_host.h b/arch/arm64/include/asm/kvm_host.h
> > index 41911585ae0c..70e129f2b574 100644
> > --- a/arch/arm64/include/asm/kvm_host.h
> > +++ b/arch/arm64/include/asm/kvm_host.h
> > @@ -576,6 +576,7 @@ struct kvm_vcpu_stat {
> >         u64 wfi_exit_stat;
> >         u64 mmio_exit_user;
> >         u64 mmio_exit_kernel;
> > +       u64 signal_exits;
> >         u64 exits;
> >  };
> >
> > diff --git a/arch/arm64/kvm/arm.c b/arch/arm64/kvm/arm.c
> > index e9a2b8f27792..60d0a546d7fd 100644
> > --- a/arch/arm64/kvm/arm.c
> > +++ b/arch/arm64/kvm/arm.c
> > @@ -783,6 +783,7 @@ int kvm_arch_vcpu_ioctl_run(struct kvm_vcpu *vcpu)
> >                 if (signal_pending(current)) {
> >                         ret = -EINTR;
> >                         run->exit_reason = KVM_EXIT_INTR;
> > +                       ++vcpu->stat.signal_exits;
> >                 }
> >
> >                 /*
> > diff --git a/arch/arm64/kvm/guest.c b/arch/arm64/kvm/guest.c
> > index 1dfb83578277..50fc16ad872f 100644
> > --- a/arch/arm64/kvm/guest.c
> > +++ b/arch/arm64/kvm/guest.c
> > @@ -50,7 +50,8 @@ const struct _kvm_stats_desc kvm_vcpu_stats_desc[] = {
> >         STATS_DESC_COUNTER(VCPU, wfi_exit_stat),
> >         STATS_DESC_COUNTER(VCPU, mmio_exit_user),
> >         STATS_DESC_COUNTER(VCPU, mmio_exit_kernel),
> > -       STATS_DESC_COUNTER(VCPU, exits)
> > +       STATS_DESC_COUNTER(VCPU, exits),
> > +       STATS_DESC_COUNTER(VCPU, signal_exits),
> How about put signal_exits before exits as the same order in
> kvm_vcpu_stat just for readability?

Definitely.

> >  };
> >  static_assert(ARRAY_SIZE(kvm_vcpu_stats_desc) ==
> >                 sizeof(struct kvm_vcpu_stat) / sizeof(u64));
> > --
> > 2.32.0.554.ge1b32706d8-goog
> >
> Reviewed-by: Jing Zhang <jingzhangos@google.com>

Thanks Jing!

^ permalink raw reply	[flat|nested] 6+ messages in thread

end of thread, other threads:[~2021-07-29 20:24 UTC | newest]

Thread overview: 6+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2021-07-29 19:56 [PATCH 0/3] KVM: arm64: Use generic guest entry infrastructure Oliver Upton
2021-07-29 19:56 ` [PATCH 1/3] KVM: arm64: Record number of signal exits as a vCPU stat Oliver Upton
2021-07-29 20:07   ` Jing Zhang
2021-07-29 20:23     ` Oliver Upton
2021-07-29 19:56 ` [PATCH 2/3] entry: KVM: Allow use of generic KVM entry w/o full generic support Oliver Upton
2021-07-29 19:56 ` [PATCH 3/3] KVM: arm64: Use generic KVM xfer to guest work function Oliver Upton

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).