poll內核代碼閱讀筆記

最近開始切入GPU虛擬化,先看直通的GPU,看vfio又涉及到irqfd,irqfd又牽扯到eventfd,然後poll。發現對poll的理解還不夠深入,那就深入一下!

poll的入口函數其實是sys_poll,sys_poll裏先計算mono time,monotime通過xtime加偏移轉換而來,mono是絕對時間。然後執行do_sys_poll(),執行完了有可能是超時,有可能是文件準備好,有可能是被打斷,被打斷要重新啓動一次poll,不會進入用戶態。

do_sys_poll先把pollfd數組拷貝到內核的緩衝區,緩衝區可擴展,初始部分用的堆棧,不夠用會用空白頁擴展。

然後poll_initwait(&table);

do_poll(head,)

poll_freewait(&table);

poll_initwait()裏有個關鍵的地方是會建立poll_table裏的一個回調函數。

do_poll首先對超時時間進一步處理,主要是針對slack的處理。然後對每一個poll_fd調用do_pollfd,do_pollfd就會深入到文件具體的poll callback,文件的回調函數通常會檢查文件的狀態,並提供一個wait_queue_head_t。然後poll_wait會被調用,poll_wait是個內聯會調用__pollwait,它又是之前poll_initwait建立好的回調。__pollwait會調用poll_get_entry(pwq)分配一個poll_table_entry,類似於pollfd,poll_table_entry有一部分是在堆棧上的,超出了就動態分配。poll_table_entry裏有wait_queue_entry可以掛載到wait_queue_head_t上。__pollwait有個關鍵的地方是設置好喚醒用的pollwake。這部分代碼又從文件層上升到了通用poll層。返回的文件狀態在do_pollfd裏會回饋給pollfd。

poll_freewait做回撤操作,把之前掛載的所有waitqueue卸載,釋放文件引用釋放polltable。

poll_wait實在wake_up裏被回調到的。

 

 

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