eventfd閱讀筆記

eventfd變種有兩個,都會調用到do_eventfd。do_eventfd裏分配了eventfd_ctx。eventfd_ctx裏重要的東東有waitqueuehead,一個count計數器。然後調用anon_inode_getfd分配file結構,fd,並將fd,file,dentry與匿名inode做一個綁定。

之後的eventfd_read與eventfd_write代碼類似,eventfd_read檢查count是否非0,非0表示有數據可讀,讀取並清0,或讀取返回1並把count減1,最後檢查waitqueuehead是否有東西在等,有就調用它們waitqueueentry裏的回調函數,對於eventfd來說就是default_wait_function,它會把進程喚醒。這裏的代碼還有優化的餘地,eventfd_read會喚醒所有的等待進程,如果eventfd_read只讀了一個值的話,eventfd_write可能只有一個能成功,而這個eventfd_write可能被最後執行,之前的eventfd_write寫的值大的雖然被喚醒但是寫不進去繼續進入睡眠狀態。如果eventfd_write先執行成功,又會把所有其他eventfd_write再喚醒一次,出現了eventfd_write喚醒eventfd_write的情況。原因就是waitqueueentry的回調函數裏沒有判斷poll的key值直接做喚醒。

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