核心接口与环机制与实现详解

核心接口与环机制与实现详解

源码路径rk3588/kernel-6.1/io_uring/io_uring.cinclude/linux/io_uring_types.h
文档目录linuxDoc/io_uring/


目录


一、原理

1.1 共享环模型

生产者 消费者 内容
SQ 应用写 tail,内核读 内核更新 head 索引 → SQE 数组
CQ 内核写 tail 应用读 head struct io_uring_cqe

内核通过 mmapstruct 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
2
3
4
5
static long io_uring_setup(u32 entries, struct io_uring_params __user *params)
{
// 校验 p.flags、p.resv
return io_uring_create(entries, &p, params);
}
  • entries:SQ 深度(向上取 2 幂,上限 IORING_MAX_ENTRIES 32768)
  • 返回 匿名文件 fdio_uring_fops),private_data 指向 io_ring_ctx
  • 可向用户写回实际 sq_entriescq_entriesIORING_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_waitio_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.hstruct io_ringssq.head/tailcq.head/tailsq_ring_maskcq_ring_masksq_droppedsq_flagscq_overflow 等。

struct io_ring_ctx(核心字段概念):

字段类 作用
ringssq_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
2
3
# 需 CONFIG_IO_URING 与 tracepoints
perf trace -e io_uring:*
cat /proc/<pid>/fdinfo/<ring_fd>

fdinfo.c 导出环深度、内存注册量等。


附录

符号 文件
io_uring_create io_uring.c
io_ring_ctx_alloc ~260
io_uring_fops 同文件

下一篇02 提交与完成

文章互动

阅读 --

留言

0 条留言

正在加载留言…