irqfd的入口是一個ioctl,kvm_irqfd->kvm_irqfd_assign。
kvm_irqfd_assign裏其實是對poll功能的一個簡單應用,poll可能poll多個文件,而irqfd只poll一個文件就是eventfd。
首先分配一個kvm_kernel_irqfd結構類似於poll_table_entry,裏面有一個waitqueue_entry, 用來掛載到eventfd的waitqueue_head。
然後初始化一些變量重要的有gsi,eventctx的指針,waitqueue_entry的回調函數,poll_wait的回調函數,然後調用vsf_poll一次其實就是eventfd的poll,用來建立irqfd與eventfd的關聯,此後eventfd一但有事件到來,irqfd_wakeup會被觸發,它主要工作就是注入中斷。這裏沒有對eventfd的計數器count做改動,倒也不是問題因爲中斷頻率沒那麼快,不會導致溢出。
問題:irqfd對比KVM_IRQ_LINE的ioctl的優勢在哪裏,如果qemu虛擬出來的外設發出中斷,這兩種方式都需要陷入到內核,一個是write,一個是ioctl,irqfd用一個work來延後中斷的注入,但是對於快速中斷的情況沒起作用。弄irqfd的一個新框架僅僅是爲了這麼點優化嗎?