轮询、超时与取消机制与实现详解
源码路径:
rk3588/kernel-6.1/io_uring/poll.c、timeout.c、cancel.c、epoll.c
文档目录:linuxDoc/io_uring/
目录
一、原理
io_uring 把 等待就绪 也纳入环:应用提交 POLL_ADD 代替 poll() syscall;TIMEOUT 与 LINK_TIMEOUT 控制链式请求截止时间;ASYNC_CANCEL 按 user_data/flags 取消 inflight。与 IOPOLL(块层忙等)不同,poll 面向 file->f_op->poll 语义。
二、Poll
2.1 核心(poll.c)
io_poll_table:嵌入poll_table_struct,在vfs_poll中登记 waitqueue- multishot:
IORING_OP_POLL_ADD+ multishot 标志可多次 CQ 而不注销 IO_POLL_REF_BIAS:引用计数防并发卸载io_poll_issue:multishot 就绪时从 task_work 调用io_issue_sqe
2.2 更新与删除
POLL_REMOVE:按user_data移除IORING_OP_POLL_UPDATE(若启用):io_poll_update结构更新 events/user_data
2.3 与 read/write 协作
io_wq_submit_work 在 -EAGAIN 时对 pollin/pollout op arm poll,就绪后重试 issue。
三、Timeout
timeout.c:
| 操作码 | 作用 |
|---|---|
TIMEOUT |
绝对/相对超时,可产生 CQE |
TIMEOUT_REMOVE |
按 user_data 删除 |
LINK_TIMEOUT |
链接序列的截止时间 |
与 REQ_F_ARM_LTIMEOUT、io_arm_ltimeout 配合,在 worker 或提交路径启动链接超时。
io_cqring_wait 比较 cq_timeouts 判断 wait 是否因超时唤醒。
四、Cancel
cancel.c + IORING_REGISTER_SYNC_CANCEL:
- 按 fd、user_data、opcode 过滤 inflight 请求
- 进程退出:
io_uring_cancel_generic清理 task 上所有 ring - 与
io_match_task_safe判断请求归属
五、Epoll
epoll.c:IORING_OP_EPOLL_CTL 将 epoll 管理纳入 io_uring(减少 epoll_ctl syscall),需 CONFIG_EPOLL。
六、调试
- multishot poll:确认应用处理 多次 CQE 且最终 REMOVE
- 超时链:检查
IOSQE_IO_LINK顺序
附录
| 文件 | 行级规模 |
|---|---|
poll.c |
~1060 |
timeout.c |
中等 |
cancel.c |
中等 |
相关:02 完成路径
正在加载留言…