이 코드는 어떤 문제를 푸나요?
MSI는 장치가 정해진 주소에 데이터를 쓰면 인터럽트로 해석되는 방식입니다. arm64 ITS는 DeviceID·EventID를, x86은 APIC 목적지·벡터와 remapping을, RISC-V IMSIC는 인터럽트 파일을 이용합니다. 여기서는 x86이 장치에 전달할 메시지를 갱신하는 helper를 읽습니다.
읽을 범위: v6.18.37 · arch/x86/kernel/apic/msi.c · irq_msi_update_msg 26–32행입니다. 아래에 이 범위의 원문과 각 줄의 설명을 실었습니다. 주제 전체의 흐름과 다른 경로는 기존 분석에서 함께 읽으실 수 있습니다.
먼저 알아둘 개념
address/data
MSI를 발생시키는 쓰기 트랜잭션의 주소와 값입니다. 일반적인 데이터 버퍼의 주소와 내용으로 해석하면 안 됩니다.
affinity
인터럽트를 어느 CPU로 보낼지 정한 배치입니다. 목적지가 바뀌면 메시지나 remapping 상태도 바뀝니다.
irq_chip 콜백
공통 IRQ 계층이 실제 장치 또는 컨트롤러 구현에 작업을 위임하는 함수 포인터입니다.
처음 읽을 때
장치의 MSI 설정, 인터럽트 변환, CPU의 벡터를 세 단계로 그려 보십시오.
더 깊이 살펴볼 때
address/data가 한 번에 원자적으로 바뀌지 않을 때 affinity 이동이 왜 까다로운지 살펴보십시오.
그림으로 보는 변화

1. 목적지 설정 확보
irq_cfg가 대상 APIC ID와 벡터 등을 제공합니다.
화살표는 라우팅 설정의 전달입니다.
2. MSI 메시지 구성
__irq_msi_compose_msg가 address/data를 만듭니다.
아직 장치가 인터럽트를 발생시킨 것이 아닙니다.
3. 장치 측 갱신
irq_write_msi_msg 콜백으로 메시지를 기록합니다.
이후 장치가 사용할 인터럽트 목적지를 설치합니다.
irq_msi_update_msg를 한 줄씩 읽기
줄 번호는 v6.18.37 원문 기준입니다. 주석·빈 줄을 포함한 함수 전체를 먼저 보고, 그 아래에서 각 줄을 설명합니다.
static void irq_msi_update_msg(struct irq_data *irqd, struct irq_cfg *cfg)
{
struct msi_msg msg[2] = { [1] = { }, };
__irq_msi_compose_msg(cfg, msg, false);
irq_data_get_irq_chip(irqd)->irq_write_msi_msg(irqd, msg);
}static void irq_msi_update_msg(struct irq_data *irqd, struct irq_cfg *cfg)Linux IRQ 자료와 새 APIC 라우팅 설정을 받아 MSI 메시지를 실제로 갱신하는 내부 함수입니다.
struct msi_msg msg[2] = { [1] = { }, };메시지 두 개의 공간을 초기화합니다. 두 번째 항목을 빈 값으로 명시하고 나머지도 초기화 규칙에 따라 0이 됩니다. 두 번의 인터럽트를 지금 보낸다는 뜻은 아닙니다.
__irq_msi_compose_msg(cfg, msg, false);cfg의 목적지·벡터를 기반으로 MSI address/data 표현을 만듭니다. false 인수로 이 호출이 DMAR 전용 구성 경로가 아님을 전달합니다.
irq_data_get_irq_chip(irqd)->irq_write_msi_msg(irqd, msg);irq_chip이 제공한 irq_write_msi_msg 콜백으로 메시지를 기록합니다. 공통 계산과 실제 장치/IRQ 계층의 쓰기 구현을 연결하는 지점입니다.
함께 생각해 볼 질문
MSI 메시지를 설정하면 인터럽트가 바로 발생합니까?
설정과 발생은 다릅니다. 장치가 해당 메시지 쓰기를 실행할 때 인터럽트가 전달됩니다.
ITS EventID와 Linux IRQ는 같은 번호입니까?
같다고 가정하면 안 됩니다. irqdomain 계층의 변환을 확인해야 합니다.
affinity는 데이터 DMA 주소를 바꿉니까?
인터럽트 목적지를 바꾸는 기능이며 데이터 DMA 버퍼 매핑과는 별개입니다.
출처와 읽은 범위
Linux stable v6.18.37 · arch/x86/kernel/apic/msi.c
해당 버전 원본 파일 · 기존 코드 분석 · 설명 원고
