Linux v6.18.37 · 개념과 코드 읽기

ARM SVE·SME Linux 상태 관리 소스 분석

이 코드는 어떤 문제를 푸나요?

큰 벡터 상태를 다룰 때는 데이터를 복사하는 함수뿐 아니라 지금 CPU 레지스터의 소유자가 누구인지 나타내는 표식도 중요합니다. v6.18.37의 fpsimd_flush_task_state는 task의 CPU 연결을 무효로 표시합니다. 이름의 flush를 벡터 레지스터를 모두 0으로 만드는 동작으로 해석하지 않도록 읽습니다.

읽을 범위: v6.18.37 · arch/arm64/kernel/fpsimd.c · fpsimd_flush_task_state 1853–1867행입니다. 아래에 이 범위의 원문과 각 줄의 설명을 실었습니다. 주제 전체의 흐름과 다른 경로는 기존 분석에서 함께 읽으실 수 있습니다.

먼저 알아둘 개념

기본 FP와 가변 상태

FPSIMD는 기본 상태이고 SVE/SME는 더 큰 가변 크기의 상태를 추가합니다. 저장 형식과 사용 조건을 함께 관리합니다.

FOREIGN_FPSTATE

현재 CPU 레지스터를 해당 task의 유효한 상태로 그대로 믿지 말아야 한다는 표식입니다.

컴파일러 barrier

이 함수의 barrier는 컴파일러의 접근 재배치를 막습니다. DSB와 같은 CPU 장벽 명령이라고 설명하면 안 됩니다.

처음 읽을 때

task의 메모리 사본과 CPU 레지스터를 연결한 선을 끊는 그림으로 이해하십시오.

더 깊이 살펴볼 때

migration·ptrace 수정·시그널 복원 뒤 언제 이 소유 관계를 무효화해야 하는지 추적하십시오.

그림으로 보는 변화

ARM SVE·SME Linux 상태 관리 소스 분석의 단계별 개념 그림
각 단계에 화살표 의미와 생략 범위를 표시했습니다. 주소·숫자 예제는 실제 장치 값을 뜻하지 않습니다.
1단계 설명

1단계 고정

GIF 원본 열기

1. 연결 무효화

fpsimd_cpu를 유효 CPU가 아닌 NR_CPUS로 설정합니다.

화살표는 소유 정보 변경이며 실제 레지스터 내용 삭제가 아닙니다.

2. 기능 지원 확인

FP/SIMD 미지원 시스템이면 여기서 끝납니다.

조건부 경로를 통해 사용하지 않는 상태 처리를 피합니다.

3. 복원 필요 표시

FOREIGN_FPSTATE를 설정하고 컴파일러 순서를 제한합니다.

후속 사용 경로가 안전하게 복원 여부를 판단하게 합니다.

fpsimd_flush_task_state를 한 줄씩 읽기

줄 번호는 v6.18.37 원문 기준입니다. 주석·빈 줄을 포함한 함수 전체를 먼저 보고, 그 아래에서 각 줄을 설명합니다.

void fpsimd_flush_task_state(struct task_struct *t)
{
	t->thread.fpsimd_cpu = NR_CPUS;
	/*
	 * If we don't support fpsimd, bail out after we have
	 * reset the fpsimd_cpu for this task and clear the
	 * FPSTATE.
	 */
	if (!system_supports_fpsimd())
		return;
	barrier();
	set_tsk_thread_flag(t, TIF_FOREIGN_FPSTATE);

	barrier();
}
void fpsimd_flush_task_state(struct task_struct *t)

task의 FP 상태와 실제 CPU 레지스터의 기존 연결을 무효로 표시하는 함수입니다. 이름만 보고 데이터 저장 함수로 해석하지 않습니다.

	t->thread.fpsimd_cpu = NR_CPUS;

마지막 보유 CPU를 유효 CPU 번호가 아닌 NR_CPUS로 만듭니다. 이 task의 상태가 어느 CPU에 그대로 남았다고 믿지 않게 합니다.

	if (!system_supports_fpsimd())

시스템이 FP/SIMD 상태를 지원하지 않는 경우인지 확인합니다.

		return;

미지원 시스템에서는 CPU 연결 표시를 지운 것만으로 끝냅니다.

	barrier();

CPU 연결 정보 변경이 뒤의 플래그 설정과 컴파일러 수준에서 재배치되지 않도록 합니다. CPU DSB 명령이라고 부르지 않습니다.

	set_tsk_thread_flag(t, TIF_FOREIGN_FPSTATE);

task의 FP 레지스터가 현재 CPU에서 유효한 자체 상태라고 가정하지 않도록 FOREIGN_FPSTATE를 설정합니다.

	barrier();

뒤따르는 코드보다 앞서 플래그 변경이 보이도록 컴파일러 재배치를 제한합니다. 실제 FP 레지스터 내용을 지우거나 복사하지는 않습니다.

함께 생각해 볼 질문

flush라는 이름이면 항상 저장을 수행합니까?

아닙니다. 이 함수는 소유 정보와 플래그를 바꿉니다.

NR_CPUS는 현재 CPU 번호입니까?

여기서는 유효한 CPU 번호가 아닌 값으로 사용해 기존 연결을 무효화합니다.

SME ZA가 크면 어떤 비용이 늘어납니까?

사용 시 보존해야 할 메모리와 시그널·디버깅·전환 복사 비용이 늘어날 수 있습니다.

출처와 읽은 범위

Linux stable v6.18.37 · arch/arm64/kernel/fpsimd.c

해당 버전 원본 파일 · 기존 코드 분석 · 설명 원고

맨 위로 ↑