irqfd內核代碼閱讀筆記

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的一個新框架僅僅是爲了這麼點優化嗎?

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章