提交 62021cc3 编写于 作者: M Mark Brown 提交者: Will Deacon

arm64/fpsimd: Stop using TIF_SVE to manage register saving in KVM

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: NMark Brown <broonie@kernel.org>
Reviewed-by: NCatalin Marinas <catalin.marinas@arm.com>
Reviewed-by: NMarc Zyngier <maz@kernel.org>
Link: https://lore.kernel.org/r/20221115094640.112848-5-broonie@kernel.orgSigned-off-by: NWill Deacon <will@kernel.org>
上级 deeb8f9a
...@@ -439,8 +439,8 @@ static void task_fpsimd_load(void) ...@@ -439,8 +439,8 @@ static void task_fpsimd_load(void)
* last, if KVM is involved this may be the guest VM context rather * 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 * than the host thread for the VM pointed to by current. This means
* that we must always reference the state storage via last rather * that we must always reference the state storage via last rather
* than via current, other than the TIF_ flags which KVM will * than via current, if we are saving KVM state then it will have
* carefully maintain for us. * ensured that the type of registers to save is set in last->to_save.
*/ */
static void fpsimd_save(void) static void fpsimd_save(void)
{ {
...@@ -457,27 +457,13 @@ static void fpsimd_save(void) ...@@ -457,27 +457,13 @@ static void fpsimd_save(void)
if (test_thread_flag(TIF_FOREIGN_FPSTATE)) if (test_thread_flag(TIF_FOREIGN_FPSTATE))
return; 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_sve_regs = true;
save_ffr = true; save_ffr = true;
vl = last->sve_vl; 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()) { if (system_supports_sme()) {
u64 *svcr = last->svcr; u64 *svcr = last->svcr;
......
...@@ -151,7 +151,6 @@ void kvm_arch_vcpu_ctxsync_fp(struct kvm_vcpu *vcpu) ...@@ -151,7 +151,6 @@ void kvm_arch_vcpu_ctxsync_fp(struct kvm_vcpu *vcpu)
&vcpu->arch.fp_type, fp_type); &vcpu->arch.fp_type, fp_type);
clear_thread_flag(TIF_FOREIGN_FPSTATE); 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) ...@@ -208,7 +207,5 @@ void kvm_arch_vcpu_put_fp(struct kvm_vcpu *vcpu)
sysreg_clear_set(CPACR_EL1, CPACR_EL1_ZEN_EL0EN, 0); sysreg_clear_set(CPACR_EL1, CPACR_EL1_ZEN_EL0EN, 0);
} }
update_thread_flag(TIF_SVE, 0);
local_irq_restore(flags); local_irq_restore(flags);
} }
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册