QEMU通过virtio接收报文处理流程(QEMU2.0.0)

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/leoufung/article/details/48781141
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 //产生中断

展开阅读全文

没有更多推荐了,返回首页