From: Dave.Martin@arm.com (Dave Martin)
To: linux-arm-kernel@lists.infradead.org
Subject: [PATCH v5 03/14] KVM: arm/arm64: Introduce kvm_arch_vcpu_run_pid_change
Date: Fri, 4 May 2018 17:05:24 +0100 [thread overview]
Message-ID: <1525449935-31424-4-git-send-email-Dave.Martin@arm.com> (raw)
In-Reply-To: <1525449935-31424-1-git-send-email-Dave.Martin@arm.com>
From: Christoffer Dall <christoffer.dall@linaro.org>
KVM/ARM differs from other architectures in having to maintain an
additional virtual address space from that of the host and the
guest, because we split the execution of KVM across both EL1 and
EL2.
This results in a need to explicitly map data structures into EL2
(hyp) which are accessed from the hyp code. As we are about to be
more clever with our FPSIMD handling on arm64, which stores data in
the task struct and uses thread_info flags, we will have to map
parts of the currently executing task struct into the EL2 virtual
address space.
However, we don't want to do this on every KVM_RUN, because it is a
fairly expensive operation to walk the page tables, and the common
execution mode is to map a single thread to a VCPU. By introducing
a hook that architectures can select with
HAVE_KVM_VCPU_RUN_PID_CHANGE, we do not introduce overhead for
other architectures, but have a simple way to only map the data we
need when required for arm64.
This patch introduces the framework only, and wires it up in the
arm/arm64 KVM common code.
No functional change.
Signed-off-by: Christoffer Dall <christoffer.dall@linaro.org>
Signed-off-by: Dave Martin <Dave.Martin@arm.com>
---
Changes since RFCv4:
Back out the arm64 implementation of the new hook, which is
replaced by a subsequent patch (and not useful before that patch).
---
include/linux/kvm_host.h | 9 +++++++++
virt/kvm/Kconfig | 3 +++
virt/kvm/kvm_main.c | 7 ++++++-
3 files changed, 18 insertions(+), 1 deletion(-)
diff --git a/include/linux/kvm_host.h b/include/linux/kvm_host.h
index 6930c63..4268ace 100644
--- a/include/linux/kvm_host.h
+++ b/include/linux/kvm_host.h
@@ -1276,4 +1276,13 @@ static inline long kvm_arch_vcpu_async_ioctl(struct file *filp,
void kvm_arch_mmu_notifier_invalidate_range(struct kvm *kvm,
unsigned long start, unsigned long end);
+#ifdef CONFIG_HAVE_KVM_VCPU_RUN_PID_CHANGE
+int kvm_arch_vcpu_run_pid_change(struct kvm_vcpu *vcpu);
+#else
+static inline int kvm_arch_vcpu_run_pid_change(struct kvm_vcpu *vcpu)
+{
+ return 0;
+}
+#endif /* CONFIG_HAVE_KVM_VCPU_RUN_PID_CHANGE */
+
#endif
diff --git a/virt/kvm/Kconfig b/virt/kvm/Kconfig
index cca7e06..72143cf 100644
--- a/virt/kvm/Kconfig
+++ b/virt/kvm/Kconfig
@@ -54,3 +54,6 @@ config HAVE_KVM_IRQ_BYPASS
config HAVE_KVM_VCPU_ASYNC_IOCTL
bool
+
+config HAVE_KVM_VCPU_RUN_PID_CHANGE
+ bool
diff --git a/virt/kvm/kvm_main.c b/virt/kvm/kvm_main.c
index c7b2e92..c32e240 100644
--- a/virt/kvm/kvm_main.c
+++ b/virt/kvm/kvm_main.c
@@ -2550,8 +2550,13 @@ static long kvm_vcpu_ioctl(struct file *filp,
oldpid = rcu_access_pointer(vcpu->pid);
if (unlikely(oldpid != current->pids[PIDTYPE_PID].pid)) {
/* The thread running this VCPU changed. */
- struct pid *newpid = get_task_pid(current, PIDTYPE_PID);
+ struct pid *newpid;
+ r = kvm_arch_vcpu_run_pid_change(vcpu);
+ if (r)
+ break;
+
+ newpid = get_task_pid(current, PIDTYPE_PID);
rcu_assign_pointer(vcpu->pid, newpid);
if (oldpid)
synchronize_rcu();
--
2.1.4
next prev parent reply other threads:[~2018-05-04 16:05 UTC|newest]
Thread overview: 30+ messages / expand[flat|nested] mbox.gz Atom feed top
2018-05-04 16:05 [PATCH v5 00/14] KVM: arm64: Optimise FPSIMD context switching Dave Martin
2018-05-04 16:05 ` [PATCH v5 01/14] thread_info: Add update_thread_flag() helpers Dave Martin
2018-05-04 16:05 ` [PATCH v5 02/14] arm64: Use update{,_tsk}_thread_flag() Dave Martin
2018-05-04 16:05 ` Dave Martin [this message]
2018-05-08 8:56 ` [PATCH v5 03/14] KVM: arm/arm64: Introduce kvm_arch_vcpu_run_pid_change Marc Zyngier
2018-05-04 16:05 ` [PATCH v5 04/14] KVM: arm64: Convert lazy FPSIMD context switch trap to C Dave Martin
2018-05-08 9:10 ` Marc Zyngier
2018-05-04 16:05 ` [PATCH v5 05/14] arm64: fpsimd: Generalise context saving for non-task contexts Dave Martin
2018-05-08 9:20 ` Marc Zyngier
2018-05-04 16:05 ` [PATCH v5 06/14] KVM: arm64: Optimise FPSIMD handling to reduce guest/host thrashing Dave Martin
2018-05-08 9:58 ` Marc Zyngier
2018-05-08 10:14 ` Dave Martin
2018-05-04 16:05 ` [PATCH v5 07/14] arm64/sve: Move read_zcr_features() out of cpufeature.h Dave Martin
2018-05-04 16:05 ` [PATCH v5 08/14] arm64/sve: Switch sve_pffr() argument from task to thread Dave Martin
2018-05-04 16:05 ` [PATCH v5 09/14] arm64/sve: Move sve_pffr() to fpsimd.h and make inline Dave Martin
2018-05-04 16:05 ` [PATCH v5 10/14] KVM: arm64: Save host SVE context as appropriate Dave Martin
2018-05-08 10:38 ` Marc Zyngier
2018-05-08 11:25 ` Dave Martin
2018-05-08 11:57 ` Marc Zyngier
2018-05-08 12:40 ` Dave Martin
2018-05-04 16:05 ` [PATCH v5 11/14] KVM: arm64: Remove eager host SVE state saving Dave Martin
2018-05-04 16:05 ` [PATCH v5 12/14] KVM: arm64: Remove redundant *exit_code changes in fpsimd_guest_exit() Dave Martin
2018-05-08 10:51 ` Marc Zyngier
2018-05-04 16:05 ` [PATCH v5 13/14] KVM: arm64: Fold redundant exit code checks out of fixup_guest_exit() Dave Martin
2018-05-08 10:59 ` Marc Zyngier
2018-05-08 11:30 ` Dave Martin
2018-05-08 11:59 ` Marc Zyngier
2018-05-08 12:30 ` Dave Martin
2018-05-04 16:05 ` [PATCH v5 14/14] KVM: arm64: Invoke FPSIMD context switch trap from C Dave Martin
2018-05-08 11:03 ` Marc Zyngier
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1525449935-31424-4-git-send-email-Dave.Martin@arm.com \
--to=dave.martin@arm.com \
--cc=linux-arm-kernel@lists.infradead.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
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).