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

v6.18.37 / arch/arm64/kernel/fpsimd.c

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

## fpsimd_flush_task_state

```c

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();
}

```

### 1853행

```c

void fpsimd_flush_task_state(struct task_struct *t)

```

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

### 1855행

```c

	t->thread.fpsimd_cpu = NR_CPUS;

```

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

### 1861행

```c

	if (!system_supports_fpsimd())

```

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

### 1862행

```c

		return;

```

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

### 1863행

```c

	barrier();

```

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

### 1864행

```c

	set_tsk_thread_flag(t, TIF_FOREIGN_FPSTATE);

```

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

### 1866행

```c

	barrier();

```

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

