]> asedeno.scripts.mit.edu Git - linux.git/commit
KVM: arm64/sve: Fix SVE trap restoration for non-current tasks
authorDave Martin <Dave.Martin@arm.com>
Fri, 15 Jun 2018 15:47:25 +0000 (16:47 +0100)
committerMarc Zyngier <marc.zyngier@arm.com>
Thu, 21 Jun 2018 08:14:44 +0000 (09:14 +0100)
commitb3eb56b629d1095dde56fa37f4d7bcd5f783c8b2
tree57f90c7c683d05c942e052acda2d3a37cabbfc78
parentb045e4d0f392cbdab2674b0aa78c8d2b187e4e27
KVM: arm64/sve: Fix SVE trap restoration for non-current tasks

Commit e6b673b ("KVM: arm64: Optimise FPSIMD handling to reduce
guest/host thrashing") attempts to restore the configuration of
userspace SVE trapping via a call to fpsimd_bind_task_to_cpu(), but
the logic for determining when to do this is not correct.

The patch makes the errnoenous assumption that the only task that
may try to enter userspace with the currently loaded FPSIMD/SVE
register content is current.  This may not be the case however:  if
some other user task T is scheduled on the CPU during the execution
of the KVM run loop, and the vcpu does not try to use the registers
in the meantime, then T's state may be left there intact.  If T
happens to be the next task to enter userspace on this CPU then the
hooks for reloading the register state and configuring traps will
be skipped.

(Also, current never has SVE state at this point anyway and should
always have the trap enabled, as a side-effect of the ioctl()
syscall needed to reach the KVM run loop in the first place.)

This patch instead restores the state of the EL0 trap from the
state observed at the most recent vcpu_load(), ensuring that the
trap is set correctly for the loaded context (if any).

Fixes: e6b673b741ea ("KVM: arm64: Optimise FPSIMD handling to reduce guest/host thrashing")
Signed-off-by: Dave Martin <Dave.Martin@arm.com>
Signed-off-by: Marc Zyngier <marc.zyngier@arm.com>
arch/arm64/include/asm/kvm_host.h
arch/arm64/kvm/fpsimd.c