mirror of
https://github.com/AuxXxilium/linux_dsm_epyc7002.git
synced 2024-12-26 09:05:03 +07:00
e6b673b741
This patch refactors KVM to align the host and guest FPSIMD save/restore logic with each other for arm64. This reduces the number of redundant save/restore operations that must occur, and reduces the common-case IRQ blackout time during guest exit storms by saving the host state lazily and optimising away the need to restore the host state before returning to the run loop. Four hooks are defined in order to enable this: * kvm_arch_vcpu_run_map_fp(): Called on PID change to map necessary bits of current to Hyp. * kvm_arch_vcpu_load_fp(): Set up FP/SIMD for entering the KVM run loop (parse as "vcpu_load fp"). * kvm_arch_vcpu_ctxsync_fp(): Get FP/SIMD into a safe state for re-enabling interrupts after a guest exit back to the run loop. For arm64 specifically, this involves updating the host kernel's FPSIMD context tracking metadata so that kernel-mode NEON use will cause the vcpu's FPSIMD state to be saved back correctly into the vcpu struct. This must be done before re-enabling interrupts because kernel-mode NEON may be used by softirqs. * kvm_arch_vcpu_put_fp(): Save guest FP/SIMD state back to memory and dissociate from the CPU ("vcpu_put fp"). Also, the arm64 FPSIMD context switch code is updated to enable it to save back FPSIMD state for a vcpu, not just current. A few helpers drive this: * fpsimd_bind_state_to_cpu(struct user_fpsimd_state *fp): mark this CPU as having context fp (which may belong to a vcpu) currently loaded in its registers. This is the non-task equivalent of the static function fpsimd_bind_to_cpu() in fpsimd.c. * task_fpsimd_save(): exported to allow KVM to save the guest's FPSIMD state back to memory on exit from the run loop. * fpsimd_flush_state(): invalidate any context's FPSIMD state that is currently loaded. Used to disassociate the vcpu from the CPU regs on run loop exit. These changes allow the run loop to enable interrupts (and thus softirqs that may use kernel-mode NEON) without having to save the guest's FPSIMD state eagerly. Some new vcpu_arch fields are added to make all this work. Because host FPSIMD state can now be saved back directly into current's thread_struct as appropriate, host_cpu_context is no longer used for preserving the FPSIMD state. However, it is still needed for preserving other things such as the host's system registers. To avoid ABI churn, the redundant storage space in host_cpu_context is not removed for now. arch/arm is not addressed by this patch and continues to use its current save/restore logic. It could provide implementations of the helpers later if desired. Signed-off-by: Dave Martin <Dave.Martin@arm.com> Reviewed-by: Marc Zyngier <marc.zyngier@arm.com> Reviewed-by: Christoffer Dall <christoffer.dall@arm.com> Reviewed-by: Alex Bennée <alex.bennee@linaro.org> Acked-by: Catalin Marinas <catalin.marinas@arm.com> Signed-off-by: Marc Zyngier <marc.zyngier@arm.com>
67 lines
1.5 KiB
Plaintext
67 lines
1.5 KiB
Plaintext
# SPDX-License-Identifier: GPL-2.0
|
|
#
|
|
# KVM configuration
|
|
#
|
|
|
|
source "virt/kvm/Kconfig"
|
|
source "virt/lib/Kconfig"
|
|
|
|
menuconfig VIRTUALIZATION
|
|
bool "Virtualization"
|
|
---help---
|
|
Say Y here to get to see options for using your Linux host to run
|
|
other operating systems inside virtual machines (guests).
|
|
This option alone does not add any kernel code.
|
|
|
|
If you say N, all options in this submenu will be skipped and
|
|
disabled.
|
|
|
|
if VIRTUALIZATION
|
|
|
|
config KVM
|
|
bool "Kernel-based Virtual Machine (KVM) support"
|
|
depends on OF
|
|
select MMU_NOTIFIER
|
|
select PREEMPT_NOTIFIERS
|
|
select ANON_INODES
|
|
select HAVE_KVM_CPU_RELAX_INTERCEPT
|
|
select HAVE_KVM_ARCH_TLB_FLUSH_ALL
|
|
select KVM_MMIO
|
|
select KVM_ARM_HOST
|
|
select KVM_GENERIC_DIRTYLOG_READ_PROTECT
|
|
select SRCU
|
|
select KVM_VFIO
|
|
select HAVE_KVM_EVENTFD
|
|
select HAVE_KVM_IRQFD
|
|
select KVM_ARM_PMU if HW_PERF_EVENTS
|
|
select HAVE_KVM_MSI
|
|
select HAVE_KVM_IRQCHIP
|
|
select HAVE_KVM_IRQ_ROUTING
|
|
select IRQ_BYPASS_MANAGER
|
|
select HAVE_KVM_IRQ_BYPASS
|
|
select HAVE_KVM_VCPU_RUN_PID_CHANGE
|
|
---help---
|
|
Support hosting virtualized guest machines.
|
|
We don't support KVM with 16K page tables yet, due to the multiple
|
|
levels of fake page tables.
|
|
|
|
If unsure, say N.
|
|
|
|
config KVM_ARM_HOST
|
|
bool
|
|
---help---
|
|
Provides host support for ARM processors.
|
|
|
|
config KVM_ARM_PMU
|
|
bool
|
|
---help---
|
|
Adds support for a virtual Performance Monitoring Unit (PMU) in
|
|
virtual machines.
|
|
|
|
config KVM_INDIRECT_VECTORS
|
|
def_bool KVM && (HARDEN_BRANCH_PREDICTOR || HARDEN_EL2_VECTORS)
|
|
|
|
source drivers/vhost/Kconfig
|
|
|
|
endif # VIRTUALIZATION
|