# PCIe MSI/MSI-X와 interrupt remapping

v6.18.37 / arch/x86/kernel/apic/msi.c

MSI는 장치가 정해진 주소에 데이터를 쓰면 인터럽트로 해석되는 방식입니다. arm64 ITS는 DeviceID·EventID를, x86은 APIC 목적지·벡터와 remapping을, RISC-V IMSIC는 인터럽트 파일을 이용합니다. 여기서는 x86이 장치에 전달할 메시지를 갱신하는 helper를 읽습니다.

## irq_msi_update_msg

```c

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

```

### 26행

```c

static void irq_msi_update_msg(struct irq_data *irqd, struct irq_cfg *cfg)

```

Linux IRQ 자료와 새 APIC 라우팅 설정을 받아 MSI 메시지를 실제로 갱신하는 내부 함수입니다.

### 28행

```c

	struct msi_msg msg[2] = { [1] = { }, };

```

메시지 두 개의 공간을 초기화합니다. 두 번째 항목을 빈 값으로 명시하고 나머지도 초기화 규칙에 따라 0이 됩니다. 두 번의 인터럽트를 지금 보낸다는 뜻은 아닙니다.

### 30행

```c

	__irq_msi_compose_msg(cfg, msg, false);

```

cfg의 목적지·벡터를 기반으로 MSI address/data 표현을 만듭니다. false 인수로 이 호출이 DMAR 전용 구성 경로가 아님을 전달합니다.

### 31행

```c

	irq_data_get_irq_chip(irqd)->irq_write_msi_msg(irqd, msg);

```

irq_chip이 제공한 irq_write_msi_msg 콜백으로 메시지를 기록합니다. 공통 계산과 실제 장치/IRQ 계층의 쓰기 구현을 연결하는 지점입니다.

