资源注册与 URING_CMD 机制与实现详解

资源注册与 URING_CMD 机制与实现详解

源码路径rk3588/kernel-6.1/io_uring/rsrc.cfiletable.ckbuf.curing_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 / BUFFERS2
  • struct io_uring_rsrc_register:支持 tag、范围更新
  • 上限:IORING_MAX_FIXED_FILES (1<<20)、IORING_MAX_REG_BUFFERS (1<<14)

filetable.cio_fixed_filefile*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
2
3
4
5
6
7
8
void io_uring_cmd_done(struct io_uring_cmd *ioucmd, ssize_t ret, ...)
{
io_req_set_res(req, ret, 0);
if (IOPOLL)
smp_store_release(&req->iopoll_completed, 1);
else
__io_req_complete(req, issue_flags);
}

驱动流程:

  1. issue 调用 file->f_op->uring_cmd(或块层桥接)
  2. 若异步完成,返回 -EIOCBQUEUED,之后 io_uring_cmd_doneio_uring_cmd_complete_in_task
  3. IORING_SETUP_SQE128 时 PDU 更大(uring_cmd_pdu_size

导出符号:供 NVMe、SCSI、自定义块驱动使用。


五、RK3588

  • eMMC/UFS/NVMe 若启用 blk-uring 或 NVMe passthrough,URING_CMD 可降低 ioctl 开销
  • 注册大块 DMA buffer 时注意 memlock ulimitCMA(见 linuxDoc/mm/09
  • 无平台专用 rsrc 代码

附录

限制
IO_RINGFD_REG_MAX 16(每任务注册 ring fd)
memlock __io_account_mem

相关01 register03 opdef

文章互动

阅读 --

留言

0 条留言

正在加载留言…