1. set_guest_notifiers初始化流程
static void virtio_pci_bus_class_init(ObjectClass *klass, void *data){
k->set_guest_notifiers = virtio_pci_set_guest_notifiers;
}
2. guest_notifier的fdread函数初始化为virtio_queue_guest_notifier_read流程:
vhost_net_start
-> r = k->set_guest_notifiers(qbus->parent, total_queues * 2, true); //调用virtio_pci_set_guest_notifiers
-> virtio_pci_set_guest_notifiers
-> virtio_pci_set_guest_notifier
-> virtio_queue_set_guest_notifier_fd_handler
void virtio_queue_set_guest_notifier_fd_handler(VirtQueue *vq, bool assign, bool with_irqfd){
if (assign && !with_irqfd) {
event_notifier_set_handler(&vq->guest_notifier,virtio_queue_guest_notifier_read);
}
}
-> qemu_set_fd_handler
-> qemu_set_fd_handler2 (将virtio_queue_guest_notifier_read设置为guest_notifier的fdread函数,并加入到iohandlers中)
3. PCI的中断处理函数初始化
PCIBus *i440fx_init(){
pci_bus_irqs(b, piix3_set_irq, pci_slot_get_pirq, piix3, PIIX_NUM_PIRQS); //设定bus->set_irq为piix3_set_irq
}
4. notify初始化流程
virtio_pci_bus_class_init(){
k->notify = virtio_pci_notify;
/*notify注册为virtio_pci_notify*/
}
5. 监听事件FD的过程
在vhost_net_start中,已经将guest_notifier加入到了iohandlers中
main
-> main_loop
-> main_loop_wait
-> qemu_iohandler_fill() //将iohandlers中所有的fd和处理函数加入到监听集合中
-> os_host_main_loop_wait
-> qemu_poll_ns //开始阻塞监听,返回时候说明有监听事件发生
6. Guest收包中断过程
os_host_main_loop_wait
-> qemu_poll_ns返回
-> qemu_iohandler_poll 遍历iohandlers对时间进行处理
-> 遍历iohandlers,处理所有的event
-> ioh->fd_read(ioh->opaque); //调用fdread函数,也就是virtio_queue_guest_notifier_read
-> virtio_queue_guest_notifier_read
-> virtio_irq
-> virtio_notify_vector
-> k->notify(qbus->parent, vector); //调用virtio_pci_notify
-> virtio_pci_notify
-> pci_set_irq
-> pci_irq_handler
-> pci_change_irq_level
-> bus->set_irq //调用的是piix3_set_irq
-> piix3_set_irq
-> piix3_set_irq_level
-> piix3_set_irq_pic
-> qemu_set_irq //产生中断