轮询、超时与取消机制与实现详解

轮询、超时与取消机制与实现详解

源码路径rk3588/kernel-6.1/io_uring/poll.ctimeout.ccancel.cepoll.c
文档目录linuxDoc/io_uring/


目录


一、原理

io_uring 把 等待就绪 也纳入环:应用提交 POLL_ADD 代替 poll() syscall;TIMEOUTLINK_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
  • multishotIORING_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_LTIMEOUTio_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.cIORING_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 完成路径

文章互动

阅读 --

留言

0 条留言

正在加载留言…