Qemu-kvm的ioeventfd创建与触发的大致流程
2015-04-18 11:43
2715 查看
在使用virtio-blk的情况时,virtio notify使用的ioeventfd机制,原因是为了提高性能,能够较快速的回到guest中运行。具体是如何建立这个ioeventfd的呢?流程理出来了,细节没看:
- 在guest中,virtio-blk的初始化或者说是在探测virtio-blk之前
这里就产生VM exit到Qemu中了,而在Qemu中有如下的处理:
- Qemu中建立ioeventfd的处理流程:
最后这一步就切换到kvm内核模块中来通过KVM_IOEVENT来建立ioeventfd:
- kvm内核模块中建立ioeventfd:
在这个流程中为某段区域建立了一个ioeventfd,这样的话guest在操作这块区域的时候就会触发ioeventfd(这是fs的eventfd机制),从而通知到Qemu,Qemu的main loop原先是阻塞的,现在有ioevent发生之后就可以得到运行了,也就可以做对virtio-blk相应的处理了。
那么当guest对该块区域内存区域进行写的时候,势必会先exit到kvm内核模块中,kvm内核模块又是怎么知道这块区域是注册了event的呢?是怎么个流程呢?
只使用EPT的情况下,guest对一块属于MMIO的区域进行读写操作引起的exit在kvm中对应的处理函数是handle_ept_misconfig,下面就看下具体的流程:
在ioeventfd_write函数中会调用文件系统eventfd机制的eventfd_signal函数来触发相应的事件。
上述就是整个ioeventfd从创建到触发的流程!!!!
- 在guest中,virtio-blk的初始化或者说是在探测virtio-blk之前
virtio_dev_probe |-->add_status |-->dev->config->set_status[vp_set_status] |-->iowrite8(status, vp_dev->ioaddr + VIRTIO_PCI_STATUS)
这里就产生VM exit到Qemu中了,而在Qemu中有如下的处理:
- Qemu中建立ioeventfd的处理流程:
virtio_pci_config_write |-->virtio_ioport_write |-->virtio_pci_start_ioeventfd |-->virtio_pci_set_host_notifier_internal |-->virtio_queue_set_host_notifier_fd_handler |-->memory_region_add_eventfd |-->memory_region_transaction_commit |-->address_space_update_ioeventfds |-->address_space_add_del_ioeventfds |-->eventfd_add[kvm_mem_ioeventfd_add] |-->kvm_set_ioeventfd_mmio |-->kvm_vm_ioctl(...,KVM_IOEVENTFD,...)
最后这一步就切换到kvm内核模块中来通过KVM_IOEVENT来建立ioeventfd:
- kvm内核模块中建立ioeventfd:
kvm_ioeventfd |-->kvm_assign_ioeventfd
在这个流程中为某段区域建立了一个ioeventfd,这样的话guest在操作这块区域的时候就会触发ioeventfd(这是fs的eventfd机制),从而通知到Qemu,Qemu的main loop原先是阻塞的,现在有ioevent发生之后就可以得到运行了,也就可以做对virtio-blk相应的处理了。
那么当guest对该块区域内存区域进行写的时候,势必会先exit到kvm内核模块中,kvm内核模块又是怎么知道这块区域是注册了event的呢?是怎么个流程呢?
只使用EPT的情况下,guest对一块属于MMIO的区域进行读写操作引起的exit在kvm中对应的处理函数是handle_ept_misconfig,下面就看下具体的流程:
handle_ept_misconfig |-->x86_emulate_instruction |-->x86_emulate_insn |-->writeback |-->segmented_write |-->write_emulated[emulator_write_emulated] |-->emulator_read_write |-->emulator_read_write_onepage |-->ops->read_write_mmio[write_mmio] |-->vcpu_mmio_write |-->kvm_io_bus_write |-->__kvm_io_bus_write |-->kvm_iodevice_write |-->ops->write[ioeventfd_write]
在ioeventfd_write函数中会调用文件系统eventfd机制的eventfd_signal函数来触发相应的事件。
上述就是整个ioeventfd从创建到触发的流程!!!!
相关文章推荐
- KVM Run Process之Qemu核心流程
- Kvm/qemu-img创建qcow2镜像
- QEMU命令创建KVM Guest(bridge桥接)
- Guest OS, Qemu, KVM工作流程 kvm_vmx_exit_handlers kvm_vcpu_ioctl kvm_x86_ops->handle_exit
- QEMU-KVM创建虚拟机的入口
- 创建虚拟机-qemu-kvm和openvswitch原型环境部署和基本测试 (2)
- android qemu-kvm内存管理和IO映射
- 【QEMU-KVM代码分析之三】IO thread源码浅析之main loop
- JavaIO流程--创建文件和目录的实例
- 7.2 Qemu/KVM 直接IO框架
- Guest OS, Qemu, KVM工作流程
- Qemu&KVM 创建虚拟机之第一篇(4) qemu 网络问题
- 内核虚拟化KVM/QEMU——guest os,qemu,kvm的运行流程
- KVM虚拟化技术之使用Qemu-kvm创建和管理虚拟机的方法
- Qemu&KVM 创建虚拟机之第一篇(5)QEMU Machine Protocol
- KVM虚拟机IO处理过程(二) ----QEMU/KVM I/O 处理过程
- kvm创建虚拟机流程(3)
- qemu-kvm之映像格式及快照创建
- Qemu&KVM第三篇之使用Ubuntu-vm-builder 创建虚拟机
- QEMU-KVM live migration流程分析