资源注册与 URING_CMD 机制与实现详解
源码路径:
rk3588/kernel-6.1/io_uring/rsrc.c、filetable.c、kbuf.c、uring_cmd.c
文档目录:linuxDoc/io_uring/
目录
一、原理
高频 I/O 避免每次 fdget 与用户指针 copy_from_user:
- 固定文件表:SQE 中
IOSQE_FIXED_FILE+ index - 固定缓冲区:pin 用户页,
READ_FIXED/WRITE_FIXED直 DMA 友好 - URING_CMD:块设备/NVMe 等驱动自定义命令,类似 ioctl 但纳入环
注册通过 io_uring_register,受 RLIMIT_MEMLOCK 约束(__io_account_mem)。
二、文件与缓冲区注册
2.1 经典接口
| opcode | 函数 |
|---|---|
IORING_REGISTER_FILES |
io_sqe_files_register |
IORING_REGISTER_BUFFERS |
io_sqe_buffers_register |
IORING_REGISTER_FILES_UPDATE |
增量更新 |
2.2 v2(rsrc.c)
IORING_REGISTER_FILES2/BUFFERS2struct io_uring_rsrc_register:支持 tag、范围更新- 上限:
IORING_MAX_FIXED_FILES(1<<20)、IORING_MAX_REG_BUFFERS(1<<14)
filetable.c:io_fixed_file 存 file* 与 FFS_* 标志。
三、Provide buffer 与 PBUF_RING
kbuf.c:
| 机制 | 说明 |
|---|---|
PROVIDE_BUFFERS |
应用提交缓冲区池,读路径 IOSQE_BUFFER_SELECT 由内核选 bid |
IORING_REGISTER_PBUF_RING |
内核与用户共享 buffer ring(更新式提供缓冲) |
io_kbuf_recycle_legacy |
完成后回收 buffer 供下次使用 |
bgid(buffer group id)索引 io_buffer_list。
四、IORING_OP_URING_CMD
uring_cmd.c:
1 | void io_uring_cmd_done(struct io_uring_cmd *ioucmd, ssize_t ret, ...) |
驱动流程:
issue调用file->f_op->uring_cmd(或块层桥接)- 若异步完成,返回
-EIOCBQUEUED,之后io_uring_cmd_done或io_uring_cmd_complete_in_task IORING_SETUP_SQE128时 PDU 更大(uring_cmd_pdu_size)
导出符号:供 NVMe、SCSI、自定义块驱动使用。
五、RK3588
- eMMC/UFS/NVMe 若启用 blk-uring 或 NVMe passthrough,URING_CMD 可降低 ioctl 开销
- 注册大块 DMA buffer 时注意 memlock ulimit 与 CMA(见
linuxDoc/mm/09) - 无平台专用 rsrc 代码
附录
| 限制 | 值 |
|---|---|
IO_RINGFD_REG_MAX |
16(每任务注册 ring fd) |
| memlock | __io_account_mem |
正在加载留言…