• KVM irqfd and ioeventfd


    In previous article vhost architecture we mentioned that vhost and the guest signal each other by irqfd and ioeventfd mechanism.

    So let us see how irqfd and ioeventfd mechanism can take this role. We can find the patches in linus tree which implement them:

    KVM irqfd support patch: http://git.kernel.org/linus/721eecbf4fe995ca94a9edec0c9843b1cc0eaaf3
    KVM ioeventfd support patch: http://git.kernel.org/linus/d34e6b175e61821026893ec5298cc8e7558df43a


    irqfd

    irqfd is a mechanism to inject a specific interrupt to a guest using a decoupled eventfd mechanism: Any legal signal on the irqfd (using eventfd semantics from either userspace or kernel) will translate into an injected interrupt in the guest at the next interrupt window.

    One line description is:

    irqfd: Allows an fd to be used to inject an interrupt to the guest

    Go into the patch, we can see details:

    Hook the irq inject wakeup function to a wait queue, and the wait queue will be added by the eventfd polling callback.

    ioeventfd

    While ioeventfd is a mechanism to register PIO/MMIO regions to trigger an eventfd signal when written to by a guest. The purpose of this mechanism is to make guest notify host in a lightweight way. This is lightweight because it will not cause a VMX/SVM exit back to userspace, serviced by qemu then returning control back to the vcpu. Why we need this mechanism because this kind of heavy-weight IO sync mechanism is not necessary for the triggers, these triggers only want to transmit a notify asynchronously and return as quickly as possible. It is expansive for them to use the normal IO.

    Look into the implementation, it accepts the eventfd and io address from args, then register a kvm_io_device with them. And the write operation of the registered kvm_io_device is sending an eventfd signal. The signal function is eventfd_siganl().

    So, this mechanism is:

    ioeventfd: Allow an fd to be used to receive a signal from the guest

    conclusion

    A very simple conclusion of these two mechanism can be the following picture:

    +-----------------------------------------+
    |                                  Host   |
    |   +--------------------------+          |
    |   |                QEMU      |          |
    |   |                          |          |
    |   |      +---------------+   |          |
    |   |      |      Guest    |   |          |
    |   |      |               |   |          |
    |   |      |   +-------- ioeventfd------> |
    |   |      |               |   |          |
    |   |      |               |   |          |
    |   |      |               |   |          |
    |   |      |   <-----------irqfd--------+ |
    |   |      |               |   |          |
    |   |      +---------------+   |          |
    |   |                          |          |
    |   |                          |          |
    |   +--------------------------+          |
    |                                         |
    +-----------------------------------------+
  • 相关阅读:
    HDU 3911 Black And White 分段树 题解
    Haskell 差点儿无痛苦上手指南
    CFileDialog的使用方法简单介绍
    对 dpif_class 结构体的一点认识
    三层架构之基础知识
    五类常见算法小记 (递归与分治,动态规划,贪心,回溯,分支界限法)
    AlertDialog具体解释
    delphi tcp/ip IdTCPServer1实例一
    23种设计模式(15):备忘录模式
    Android APK反编译具体解释(附图)
  • 原文地址:https://www.cnblogs.com/allcloud/p/7814952.html
Copyright © 2020-2023  润新知