核心接口与环机制与实现详解
源码路径:
rk3588/kernel-6.1/io_uring/io_uring.c、include/linux/io_uring_types.h
文档目录:linuxDoc/io_uring/
目录
一、原理
1.1 共享环模型
| 环 | 生产者 | 消费者 | 内容 |
|---|---|---|---|
| SQ | 应用写 tail,内核读 | 内核更新 head | 索引 → SQE 数组 |
| CQ | 内核写 tail | 应用读 head | struct io_uring_cqe |
内核通过 mmap 把 struct io_rings 与 SQE 数组映射到用户空间,减少每次 I/O 的拷贝与 syscall。
1.2 请求对象 io_kiocb
每个 SQE 在提交时分配 io_kiocb(slab req_cachep),承载 opcode、file、链接关系、req->cqe 预填字段、async 数据等,完成后回收或链式触发下一个。
二、三个系统调用
2.1 io_uring_setup
1 | static long io_uring_setup(u32 entries, struct io_uring_params __user *params) |
entries:SQ 深度(向上取 2 幂,上限IORING_MAX_ENTRIES32768)- 返回 匿名文件 fd(
io_uring_fops),private_data指向io_ring_ctx - 可向用户写回实际
sq_entries、cq_entries(IORING_SETUP_CQSIZE可放大 CQ)
2.2 io_uring_enter
1 | SYSCALL_DEFINE6(io_uring_enter, ...) |
| flags | 行为 |
|---|---|
提交 to_submit |
非 SQPOLL:mutex + io_submit_sqes |
IORING_ENTER_GETEVENTS |
io_cqring_wait 或 io_iopoll_check |
IORING_ENTER_SQ_WAKEUP |
唤醒 SQPOLL 线程 |
IORING_ENTER_REGISTERED_RING |
使用 tctx->registered_rings[fd] 免 fdget |
IORING_SETUP_R_DISABLED 时 enter 返回 -EBADFD,需 IORING_REGISTER_ENABLE_RINGS 启用。
2.3 io_uring_register
__io_uring_register 处理缓冲区/文件/eventfd/probe/限制/IOWQ 亲和性/PBUF_RING 等(见 06)。
三、io_ring_ctx 与 mmap 布局
io_uring_types.h 中 struct io_rings 含 sq.head/tail、cq.head/tail、sq_ring_mask、cq_ring_mask、sq_dropped、sq_flags、cq_overflow 等。
struct io_ring_ctx(核心字段概念):
| 字段类 | 作用 |
|---|---|
rings、sq_array |
用户可见环与 SQE 索引表 |
uring_lock |
提交、注册、部分 poll 路径互斥 |
completion_lock |
CQ 写入 |
submit_state |
批量提交缓存 |
flags |
复制自 IORING_SETUP_* |
io_wq / sq_data |
异步池 / SQPOLL 共享数据 |
restrictions |
沙箱化环(限制 register/op) |
io_ring_ctx_alloc 初始化 refcount、hash table(inflight)、cqe 缓存指针等。
四、setup 标志
| 标志 | 含义 |
|---|---|
IORING_SETUP_IOPOLL |
内核轮询完成(块设备忙轮询) |
IORING_SETUP_SQPOLL |
内核线程提交 SQ |
IORING_SETUP_SQ_AFF |
SQPOLL 绑 CPU |
IORING_SETUP_CQSIZE |
自定义 CQ 长度 |
IORING_SETUP_SINGLE_ISSUER |
单提交者优化 |
IORING_SETUP_DEFER_TASKRUN |
延迟 task_work |
IORING_SETUP_SQE128 / CQE32 |
扩展 SQE/CQE |
IORING_SETUP_COOP_TASKRUN |
协作式 task run |
五、RK3588
无平台专用分支;绑核与 SQPOLL 对 大小核调度 敏感,生产环境建议实测 latency。
六、调试
1 | # 需 CONFIG_IO_URING 与 tracepoints |
fdinfo.c 导出环深度、内存注册量等。
附录
| 符号 | 文件 |
|---|---|
io_uring_create |
io_uring.c |
io_ring_ctx_alloc |
~260 |
io_uring_fops |
同文件 |
下一篇:02 提交与完成
正在加载留言…