在virtio中,为什么guest notifier和host notifier分别使用ioeventfd和irqfd?

时间:2017-09-26 05:01:12

标签: linux linux-kernel virtual-machine linux-device-driver kvm

我知道在virtio中,当guest虚拟机尝试通知主机时,它会写入设备io地址,这会导致vm-exit并被虚拟机管理程序捕获。写操作将向eventfd结构发出信号,然后唤醒睡眠的vhost_worker线程以处理virtqueue中的数据包。

当主机尝试通知guest虚拟机时,它还使用eventfd来触发中断注入,并需要一个vm-exit。

我的问题是:这两个过程是否必须如此复杂?为什么我们不将eventfd结构放入virtio前端和后端之间的共享内存中。然后,如果guest虚拟机尝试通知主机,它会向eventfd发出信号,然后唤醒vhost_worker线程,这似乎我们不需要vm-exit。对于来宾通知,它可以以相同的方式完成。 为什么我们不能以这种简单的方式通知?

1 个答案:

答案 0 :(得分:2)

  

我的问题是:这两个过程是否必须如此复杂?

简短回答:因为虚拟机很复杂。 :)

  

为什么我们不将eventfd结构放入virtio前端和后端之间的共享内存中。

顺便说一句,eventfd不是一个结构。它只是一个整数,就像任何其他文件描述符一样。

  

然后,如果访客尝试通知主机,它会向eventfd发出信号......

它不能那样做。写入eventfd将要求guest虚拟机内核在主机系统上进行系统调用,这不是它能够做的事情。同样,主机无法向guest虚拟机内核创建的eventfd发送信号,因为主机系统上不存在eventfd。

请记住,guest虚拟机系统可能没有运行Linux内核! virtio接口不是特定于内核的;它适用于任何虚拟化操作系统。