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

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

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

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

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

먼저 알아둘 개념

CPU 마스크

요청을 받을 CPU의 집합입니다. CPU 번호 목록과 논리적 작업 종류를 분리합니다.

IPI descriptor

작업 종류 op에 대응하는 인터럽트 서술자입니다. 아래 코드의 ipi_desc[op]는 함수 인수 자체를 담은 메시지가 아닙니다.

완료 대기

인터럽트를 보냈다는 사실과 대상 CPU가 요청 함수를 마쳤다는 사실은 다릅니다. 동기 호출은 별도 완료 규칙이 필요합니다.

처음 읽을 때

공유 메모리의 요청과 CPU에 도착하는 알림을 두 화살표로 나누어 그리십시오.

더 깊이 살펴볼 때

요청 공개 전에 필요한 메모리 순서와 대상 CPU의 IRQ 차단 시간이 완료 지연에 미치는 영향을 검토해 보십시오.

그림으로 보는 변화

IPI와 SMP call: SGI, APIC ICR와 SBI/IMSIC의 단계별 개념 그림
각 단계에 화살표 의미와 생략 범위를 표시했습니다. 주소·숫자 예제는 실제 장치 값을 뜻하지 않습니다.
1단계 설명

1단계 고정

GIF 원본 열기

1. 요청 준비

공통 SMP 경로가 작업 자료를 준비합니다.

첫 화살표는 공유 메모리의 데이터 공개입니다.

2. 알림 전송

작업 종류의 descriptor와 대상 mask를 irq 계층에 넘깁니다.

둘째 화살표는 인터럽트 알림이며 함수 본문의 전송이 아닙니다.

3. 대상 CPU 실행

대상 CPU가 요청을 꺼내 처리하고 필요한 완료 상태를 남깁니다.

마지막 화살표는 요청 소비와 완료의 순서입니다.

send_ipi_mask / send_ipi_single를 한 줄씩 읽기

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

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));
}
static void send_ipi_mask(const struct cpumask *mask, enum ipi_message_type op)

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

	__ipi_send_mask(ipi_desc[op], mask);

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

static void send_ipi_single(int cpu, enum ipi_message_type op)

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

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

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

함께 생각해 볼 질문

IPI를 보내면 즉시 실행됩니까?

대상 CPU의 마스크 상태와 현재 처리 중인 작업에 따라 지연될 수 있습니다.

모든 RISC-V 시스템이 SBI IPI를 씁니까?

아닙니다. irqchip 구성에 따라 다른 구현으로 연결될 수 있습니다.

CPU 한 개에 보내는 함수와 mask 함수는 무엇이 다릅니까?

단일 CPU 함수는 cpumask_of로 한 CPU의 집합을 만들어 같은 전송 계층을 이용합니다.

출처와 읽은 범위

Linux stable v6.18.37 · arch/riscv/kernel/smp.c

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

맨 위로 ↑