# IPI와 SMP call: SGI, APIC ICR와 SBI/IMSIC

v6.18.37 / arch/riscv/kernel/smp.c

한 CPU가 다른 CPU에 함수를 실행해 달라고 요청할 때 함수 포인터 전체를 인터럽트 회로로 보내는 것은 아닙니다. 요청은 메모리의 자료구조에 놓고 IPI로 확인하도록 알립니다. arm64는 SGI, x86은 APIC, RISC-V는 플랫폼에 따라 SBI 또는 IMSIC 등에 연결됩니다. 아래는 RISC-V의 공통 전송 입구입니다.

## send_ipi_mask / send_ipi_single

```c

static void send_ipi_mask(const struct cpumask *mask, enum ipi_message_type op)
{
	__ipi_send_mask(ipi_desc[op], mask);
}

static void send_ipi_single(int cpu, enum ipi_message_type op)
{
	__ipi_send_mask(ipi_desc[op], cpumask_of(cpu));
}

```

### 115행

```c

static void send_ipi_mask(const struct cpumask *mask, enum ipi_message_type op)

```

대상 CPU 집합 mask와 IPI의 작업 종류 op를 받는 내부 전송 함수입니다. 함수 포인터와 인수를 직접 하드웨어 패킷에 넣는 인터페이스가 아닙니다.

### 117행

```c

	__ipi_send_mask(ipi_desc[op], mask);

```

작업 종류에 대응하는 IRQ descriptor를 고른 뒤 공통 IPI 계층에 대상 CPU 집합을 넘깁니다. 실제 SBI 또는 irqchip 구현은 이 아래에서 선택됩니다.

### 120행

```c

static void send_ipi_single(int cpu, enum ipi_message_type op)

```

CPU 하나에 보낼 때 사용하는 보조 함수입니다. 작업 종류는 mask 버전과 같습니다.

### 122행

```c

	__ipi_send_mask(ipi_desc[op], cpumask_of(cpu));

```

cpumask_of(cpu)로 CPU 하나만 포함한 집합을 얻어 같은 __ipi_send_mask를 사용합니다. 별도의 단일 CPU 전송 프로토콜을 새로 만드는 것이 아닙니다.

