eventfd
virtio中,guest和vhost經過evnetfd通知對方,見(Virtio ring and virtio-net)。html
REF:linux
Qemu-kvm的ioeventfd建立與觸發的大體流程git
virtio的eventfd機制淺析 ( ioctl(KVM_IOEVENTFD, struct kvm_ioeventfd) )github
QEMU下的EVENTFD機制及源代碼分析 (huatong寫的,還寫了不少不錯的文章)api
代碼分析(Rng爲例)
1. Rng的activate會啓動一個thread,run RngEpollHandler app
queue_evts 會經過activate 傳給 RngEpollHandler函數
2. RngEpollHandler run, 實現了epool QUEUE_AVAIL_EVENT 和 KILL_EVENT, 進行處理。ui
queue處理完成後,還會通知signal_used_queuethis
3. write_bar的時候會 activateurl
4. rust-vmm/kvm-ioctls 的VmFd經過register_ioevent註冊event
/// Registers an event to be signaled whenever a certain address is written to.
///
/// See the documentation for `KVM_IOEVENTFD`.
5. ioeventfds 會遍歷queue_evts
6. vm初始化,add_virtio_pci_device 會register_ioevent
irqfd
VHOST經過irqfd通知guest。irqfd須要綁定一個eventfd.
rust-vmm/kvm-ioctls 的VmFd經過register_irqfd註冊irqfd
REF:
關於Linux虛擬化技術KVM的科普 科普二(KVM虛擬機代碼揭祕) (一共寫了5個科普)
KVM中斷虛擬化主要依賴於VT-x技術,VT-x主要提供了兩種中斷事件機制,分別是中斷退出>
和中斷注入。
中斷退出:指虛擬機發生中斷時,主動式的客戶機發生VM-Exit,這樣可以在主機中實現對>
客戶機中斷的注入。
中斷注入:是指將中斷寫入VMCS對應的中斷信息位,來實現中斷的注入,當中斷完成後經過
讀取中斷的返回信息來分析中斷是否正確。
中斷注入的標誌性函數kvm_set_irq,是中斷注入的最開始。
qemu-kvm 中斷虛擬化 (qemu-kvm 中斷虛擬化)
代碼分析(Rng爲例子)
1. VirtioPciDevice 有個 interrupt_cb field
2. assign_pin_irq 和 assign_msix 用來設置interrupt_cb
assign_msix 注入中斷 (msi_cb)(InterruptParameters { msix: Some(entry) })
// In case the vector control register associated with the entry
// has its first bit set, this means the vector is masked and the
// device should not inject the interrupt.
// Instead, the Pending Bit Array table is updated to reflect there
// is a pending interrupt for this specific vector.
3. vm初始化,add_virtio_pci_device 是會 assign_pin_irq 和 assign_msix ,register_irqfd
4. msi_cb 和 irq_cb 的參數都是 InterruptParameters 類型,就是一個MsixTableEntry
signal_msi返回msi_cb
irq_cb會調用service_irq來注入中斷
service_irq 調用rust-vmm/kvm-ioctls 的VmFd的signal_msi方法注入中斷
5. MsixConfig 實現了 read_table 和 write_table,
MsixConfig包括table_entries, pba_entries, interrupt_cb和masked字段。
write_table會調用inject_msix_and_clear_pba注入中斷
5.1 write_config_register 也會調用 set_msg_ctl 注入中斷
6. VirtioPciDevice new的時候會new msix_config
7. read_bar的時候會read_table, write_bar的時候會write_table
8. 對於VFIO來講,會設置中斷路由, update_msi_interrupt_routes(調用了set_kvm_routes)
Interrupt.update_msi -> VfioMsix.update -> set_msg_ctl -> inject_msix_and_clear_pba
vmm-sys-util
rust-vmm 的 vmm-sys-util 實現了不少utilities, 包括eventfd,ioctrl,poll,signal.
實現了eventfd的new, write, read, clone等基本操做。
https://github.com/rust-vmm/vmm-sys-util/tree/master/src
FYI:
PBA (Pending Bit Array)