mirror of
https://github.com/torvalds/linux.git
synced 2025-12-07 20:06:24 +00:00
Commit aefbab8e77
("arm64: fpsimd: Preserve/restore kernel mode NEON at context switch")
added a 'kernel_fpsimd_state' field to struct thread_struct, which is
the arch-specific portion of struct task_struct, and is allocated for
each task in the system. The size of this field is 528 bytes, resulting
in non-negligible bloat of task_struct, and the resulting memory
overhead may impact performance on systems with many processes.
This allocation is only used if the task is scheduled out or interrupted
by a softirq while using the FP/SIMD unit in kernel mode, and so it is
possible to transparently allocate this buffer on the caller's stack
instead.
So tweak the 'ksimd' scoped guard implementation so that a stack buffer
is allocated and passed to both kernel_neon_begin() and
kernel_neon_end(), and either record it in the task struct, or use it
directly to preserve the task mode kernel FP/SIMD when running in
softirq context. Passing the address to both functions, and checking the
addresses for consistency ensures that callers of the updated bare
begin/end API use it in a manner that is consistent with the new context
switch semantics.
Acked-by: Catalin Marinas <catalin.marinas@arm.com>
Signed-off-by: Ard Biesheuvel <ardb@kernel.org>
20 lines
429 B
C
20 lines
429 B
C
/* SPDX-License-Identifier: GPL-2.0-only */
|
|
/*
|
|
* linux/arch/arm64/include/asm/neon.h
|
|
*
|
|
* Copyright (C) 2013 Linaro Ltd <ard.biesheuvel@linaro.org>
|
|
*/
|
|
|
|
#ifndef __ASM_NEON_H
|
|
#define __ASM_NEON_H
|
|
|
|
#include <linux/types.h>
|
|
#include <asm/fpsimd.h>
|
|
|
|
#define cpu_has_neon() system_supports_fpsimd()
|
|
|
|
void kernel_neon_begin(struct user_fpsimd_state *);
|
|
void kernel_neon_end(struct user_fpsimd_state *);
|
|
|
|
#endif /* ! __ASM_NEON_H */
|