Skip to content

feat: Introduce interrupt remapping for vfio - #181

Merged
junyu0312 merged 1 commit into
mainfrom
vfio
Jun 23, 2026
Merged

feat: Introduce interrupt remapping for vfio#181
junyu0312 merged 1 commit into
mainfrom
vfio

Conversation

@junyu0312

@junyu0312 junyu0312 commented Jun 23, 2026

Copy link
Copy Markdown
Owner

Summary by CodeRabbit

Release Notes

  • New Features

    • Added interrupt file descriptor routing for improved VM interrupt handling
    • Added VFIO PCI device interrupt support (INTx, MSI, MSI-X capabilities)
    • Enhanced MSI capability structures with 64-bit and per-vector masking variants
    • Added PCI configuration space utilities for improved device management
  • Refactoring

    • Replaced raw PCI register constants with strongly-typed enums for improved type safety

@coderabbitai

coderabbitai Bot commented Jun 23, 2026

Copy link
Copy Markdown

Review Change Stack

Caution

Review failed

Pull request was closed or merged during review

📝 Walkthrough

Walkthrough

This PR wires VFIO PCI interrupt capability setup end-to-end. It adds set_irqfd/set_irqfd_with_resample to HypervisorVm (with KVM implementation), redesigns MSI/MSI-X PCI capability structs and introduces PciCommand bitflags, defines VfioInterruptManager with INTx/MSI/MSI-X data structures, implements setup_interrupt_capability in VfioPciDevice, and propagates HypervisorVm through DeviceManagerBuilder.

Changes

VFIO PCI interrupt capability setup

Layer / File(s) Summary
vmm-sys-util dependency and irqfd trait/KVM impl
Cargo.toml, crates/vm-core/Cargo.toml, crates/vm-vfio/Cargo.toml, crates/vm-core/src/virtualization/vm.rs, crates/vm-core/src/virtualization/kvm/vm.rs
Adds vmm-sys-util = "0.15.0" to the workspace and as a Linux-only dep in vm-core/vm-vfio, then extends HypervisorVm with Linux-only set_irqfd/set_irqfd_with_resample methods and implements them on KvmVm using vm_fd.register_irqfd*.
PciCommand bitflags, PciConfigurationSpace, and MSI/MSI-X capability structs
crates/vm-pci/Cargo.toml, crates/vm-pci/src/types/configuration_space/command.rs, crates/vm-pci/src/types/configuration_space/header.rs, crates/vm-pci/src/types/configuration_space/status.rs, crates/vm-pci/src/types/configuration_space.rs, crates/vm-pci/src/device/capability/msi.rs, crates/vm-pci/src/device/capability/msix.rs, crates/vm-pci/src/device/interrupt/legacy.rs
Introduces PciCommand as a bitflags type replacing removed raw constants, adds PciConfigurationSpace with find_cap, rewrites PciMsiCap and adds PciMsiCap64/PciMsiCapMask/PciMsiCap64Mask variants with From<...> for StandardCapability impls, adds MSI-X bitmask constants, and derives FromRepr on InterruptPin.
PciCommand adoption in type0, virtio, and VFIO function
crates/vm-pci/src/types/function/type0.rs, crates/vm-virtio/src/transport/pci/interrupt.rs, crates/vm-virtio/src/transport/pci/isr_handler.rs, crates/vm-vfio/src/vfio_pci/function.rs
Updates write_command and ISR read/notify paths in vm-pci, vm-virtio, and vm-vfio to use PciCommand::from_bits_retain(...).contains(...) and PciStatus::Interrupt as u16 instead of raw u16 bitmask comparisons and removed constants.
VFIO interrupt data structures and VfioDevice IRQ helpers
crates/vm-vfio/src/vfio_pci.rs, crates/vm-vfio/src/vfio_pci/interrupt.rs, crates/vm-vfio/src/vfio_pci/interrupt/intx.rs, crates/vm-vfio/src/vfio_pci/interrupt/msi.rs, crates/vm-vfio/src/vfio_pci/interrupt/msix.rs, crates/vm-vfio/src/vfio/device.rs
Adds VfioInterruptManager with Option<VfioIntx/VfioMsi/VfioMsix> fields, their backing structs, and VfioDevice pub(crate) methods for querying and enabling INTx/MSI/MSI-X IRQs via VFIO ioctl wrappers.
VfioPciDevice interrupt capability setup and constructor
crates/vm-vfio/src/vfio_pci/device.rs, crates/vm-vfio/src/error.rs, crates/vm-vfio/src/lib.rs
Adds setup_interrupt_capability to parse MSI/MSI-X/INTx from raw PCI config via PciConfigurationSpace::find_cap, allocate emulated capabilities, validate VFIO IRQ info, and register INTx eventfds via HypervisorVm::set_irqfd_with_resample. Updates VfioPciDevice::new to accept vm, normalize the emulated header, and store interrupt_manager.
HypervisorVm propagation through DeviceManagerBuilder
crates/vm-vmm/src/vm/device_builder.rs, crates/vm-vmm/src/vm/device_builder/vfio.rs, crates/vm-vmm/src/vm/config.rs, crates/vm-vmm/src/vm/snapshot.rs
Adds vm: &'a dyn HypervisorVm to DeviceManagerBuilder, threads it through init_vfio_device to VfioPciDevice::new, and updates call sites in Vm::from_config and Vm::from_snapshot.

Sequence Diagram

sequenceDiagram
  participant Vm as Vm::from_config
  participant DMB as DeviceManagerBuilder
  participant VfioPciDevice
  participant SIC as setup_interrupt_capability
  participant PciCfgSpc as PciConfigurationSpace
  participant VfioDevice
  participant HypervisorVm as KvmVm (HypervisorVm)

  Vm->>DMB: new(vm_instance.as_ref(), ...)
  DMB->>VfioPciDevice: new(name, vm, vfio_device, irq_allocator)
  VfioPciDevice->>PciCfgSpc: from_buf(raw_pci_config)
  VfioPciDevice->>SIC: setup_interrupt_capability(vm, vfio_device, config)
  SIC->>PciCfgSpc: find_cap(MSI-X)
  SIC->>PciCfgSpc: find_cap(MSI)
  SIC->>VfioDevice: get_msix_irq_info() / get_msi_irq_info()
  SIC->>PciCfgSpc: find_cap(INTx)
  SIC->>VfioDevice: get_intx_irq_info() / enable_intx(active_fd)
  SIC->>VfioDevice: set_intx_resample_fd(resample_fd)
  SIC->>HypervisorVm: set_irqfd_with_resample(active_fd, resample_fd, gsi)
  HypervisorVm-->>SIC: Ok(())
  SIC-->>VfioPciDevice: VfioInterruptManager { intx, msi, msix }
  VfioPciDevice-->>DMB: VfioPciDevice { name, function, interrupt_manager }
Loading

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~60 minutes

Possibly related PRs

  • junyu0312/rust-vm#73: Introduced StandardCapability/ExtendedCapability and changed ConfigurationSpace capability allocation APIs in the same vm-pci modules that this PR extends with MSI From<...> for StandardCapability impls and PciConfigurationSpace.
  • junyu0312/rust-vm#161: Also modifies VfioPciDevice::new constructor signature in crates/vm-vfio/src/vfio_pci/device.rs, directly overlapping with this PR's addition of the vm: &dyn HypervisorVm parameter and interrupt setup.
  • junyu0312/rust-vm#176: Both PRs modify VfioPciFunction::write_command in crates/vm-vfio/src/vfio_pci/function.rs at the PIO/MMIO router update logic.

Poem

🐇 Hoppity-hop through the IRQ lane,
EventFds bounce like drops of rain.
MSI, MSI-X, and INTx too—
All wired with bitflags, shiny and new!
The rabbit registers every gsi,
And resamples the world with a cheerful sigh. 🎉

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 0.00% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title 'feat: Introduce interrupt remapping for vfio' accurately summarizes the main objective of the pull request, which is to introduce interrupt remapping capabilities for VFIO devices.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch vfio

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@junyu0312
junyu0312 merged commit fc1c2b0 into main Jun 23, 2026
11 of 12 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant