mirror of
https://github.com/hardkernel/linux.git
synced 2026-06-05 02:21:52 +09:00
arm64/fpsimd: Stop using TIF_SVE to manage register saving in KVM
[ Upstream commit 62021cc36a ]
Now that we are explicitly telling the host FP code which register state
it needs to save we can remove the manipulation of TIF_SVE from the KVM
code, simplifying it and allowing us to optimise our handling of normal
tasks. Remove the manipulation of TIF_SVE from KVM and instead rely on
to_save to ensure we save the correct data for it.
There should be no functional or performance impact from this change.
Signed-off-by: Mark Brown <broonie@kernel.org>
Reviewed-by: Catalin Marinas <catalin.marinas@arm.com>
Reviewed-by: Marc Zyngier <maz@kernel.org>
Link: https://lore.kernel.org/r/20221115094640.112848-5-broonie@kernel.org
Signed-off-by: Will Deacon <will@kernel.org>
[ Mark: trivial backport ]
Signed-off-by: Mark Rutland <mark.rutland@arm.com>
Signed-off-by: Mark Brown <broonie@kernel.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
committed by
Greg Kroah-Hartman
parent
254fe3a162
commit
2fb8365017
@@ -439,8 +439,8 @@ static void task_fpsimd_load(void)
|
||||
* last, if KVM is involved this may be the guest VM context rather
|
||||
* than the host thread for the VM pointed to by current. This means
|
||||
* that we must always reference the state storage via last rather
|
||||
* than via current, other than the TIF_ flags which KVM will
|
||||
* carefully maintain for us.
|
||||
* than via current, if we are saving KVM state then it will have
|
||||
* ensured that the type of registers to save is set in last->to_save.
|
||||
*/
|
||||
static void fpsimd_save(void)
|
||||
{
|
||||
@@ -457,27 +457,13 @@ static void fpsimd_save(void)
|
||||
if (test_thread_flag(TIF_FOREIGN_FPSTATE))
|
||||
return;
|
||||
|
||||
if (test_thread_flag(TIF_SVE)) {
|
||||
if ((last->to_save == FP_STATE_CURRENT && test_thread_flag(TIF_SVE)) ||
|
||||
last->to_save == FP_STATE_SVE) {
|
||||
save_sve_regs = true;
|
||||
save_ffr = true;
|
||||
vl = last->sve_vl;
|
||||
}
|
||||
|
||||
/*
|
||||
* Validate that an explicitly specified state to save is
|
||||
* consistent with the task state.
|
||||
*/
|
||||
switch (last->to_save) {
|
||||
case FP_STATE_CURRENT:
|
||||
break;
|
||||
case FP_STATE_FPSIMD:
|
||||
WARN_ON_ONCE(save_sve_regs);
|
||||
break;
|
||||
case FP_STATE_SVE:
|
||||
WARN_ON_ONCE(!save_sve_regs);
|
||||
break;
|
||||
}
|
||||
|
||||
if (system_supports_sme()) {
|
||||
u64 *svcr = last->svcr;
|
||||
|
||||
|
||||
@@ -151,7 +151,6 @@ void kvm_arch_vcpu_ctxsync_fp(struct kvm_vcpu *vcpu)
|
||||
&vcpu->arch.fp_type, fp_type);
|
||||
|
||||
clear_thread_flag(TIF_FOREIGN_FPSTATE);
|
||||
update_thread_flag(TIF_SVE, vcpu_has_sve(vcpu));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -208,7 +207,5 @@ void kvm_arch_vcpu_put_fp(struct kvm_vcpu *vcpu)
|
||||
sysreg_clear_set(CPACR_EL1, CPACR_EL1_ZEN_EL0EN, 0);
|
||||
}
|
||||
|
||||
update_thread_flag(TIF_SVE, 0);
|
||||
|
||||
local_irq_restore(flags);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user