• Ard Biesheuvel's avatar
    arm64/fpsimd: Avoid erroneous elide of user state reload · e92bee9f
    Ard Biesheuvel authored
    TIF_FOREIGN_FPSTATE is a 'convenience' flag that should reflect whether
    the current CPU holds the most recent user mode FP/SIMD state of the
    current task. It combines two conditions:
    - whether the current CPU's FP/SIMD state belongs to the task;
    - whether that state is the most recent associated with the task (as a
      task may have executed on other CPUs as well).
    
    When a task is scheduled in and TIF_KERNEL_FPSTATE is set, it means the
    task was in a kernel mode NEON section when it was scheduled out, and so
    the kernel mode FP/SIMD state is restored. Since this implies that the
    current CPU is *not* holding the most recent user mode FP/SIMD state of
    the current task, the TIF_FOREIGN_FPSTATE flag is set too, so that the
    user mode FP/SIMD state is reloaded from memory when returning to
    userland.
    
    However, the task may be scheduled out after completing the kernel mode
    NEON section, but before returning to userland. When this happens, the
    TIF_FOREIGN_FPSTATE flag will not be preserved, but will be set as usual
    the next time the task is scheduled in, and will be based on the above
    conditions.
    
    This means that, rather than setting TIF_FOREIGN_FPSTATE when scheduling
    in a task with TIF_KERNEL_FPSTATE set, the underlying state should be
    updated so that TIF_FOREIGN_FPSTATE will assume the expected value as a
    result.
    
    So instead, call fpsimd_flush_cpu_state(), which takes care of this.
    
    Closes: https://lore.kernel.org/all/cb8822182231850108fa43e0446a4c7f@kernel.orgReported-by: default avatarJohannes Nixdorf <mixi@shadowice.org>
    Fixes: aefbab8e ("arm64: fpsimd: Preserve/restore kernel mode NEON at context switch")
    Cc: Mark Brown <broonie@kernel.org>
    Cc: Dave Martin <Dave.Martin@arm.com>
    Cc: Janne Grunau <j@jannau.net>
    Cc: stable@vger.kernel.org
    Signed-off-by: default avatarArd Biesheuvel <ardb@kernel.org>
    Tested-by: default avatarJanne Grunau <j@jannau.net>
    Tested-by: default avatarJohannes Nixdorf <mixi@shadowice.org>
    Reviewed-by: default avatarMark Brown <broonie@kernel.org>
    Link: https://lore.kernel.org/r/20240522091335.335346-2-ardb+git@google.comSigned-off-by: default avatarWill Deacon <will@kernel.org>
    e92bee9f
fpsimd.c 58.8 KB