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里被回调到的。

 

 

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