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值直接做唤醒。

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