操作码与 opdef 分派机制与实现详解

操作码与 opdef 分派机制与实现详解

源码路径rk3588/kernel-6.1/io_uring/opdef.copdef.h、各 *.c 处理器
文档目录linuxDoc/io_uring/


目录


一、原理

所有 IORING_OP_*io_op_defs[] 中注册元数据与函数指针;io_issue_sqe 仅通过 req->opcode 索引,实现 表驱动分派,新增 opcode 主要改 opdef.c 与对应 *.c

io_uring_optable_init()(initcall)校验表长等于 IORING_OP_LAST 且每项有 prep/issue


二、io_op_def 结构

1
2
3
4
5
6
7
8
9
10
11
12
13
14
struct io_op_def {
unsigned needs_file : 1;
unsigned plug : 1;
unsigned hash_reg_file : 1; // 常规文件 hash 到 io-wq
unsigned unbound_nonreg_file : 1;
unsigned pollin / pollout / poll_exclusive;
unsigned buffer_select : 1;
unsigned iopoll / iopoll_queue : 1;
unsigned async_size;
const char *name;
int (*prep)(struct io_kiocb *, const struct io_uring_sqe *);
int (*issue)(struct io_kiocb *, unsigned int);
...
};

issue_flags 常见位:IO_URING_F_NONBLOCKIO_URING_F_UNLOCKEDIO_URING_F_MULTISHOTIO_URING_F_COMPLETE_DEFER


三、操作码分类

类别 操作码示例 源文件
基础 NOP nop.c
读写 READVWRITEVREADWRITEREAD_FIXEDWRITE_FIXEDREADV_FIXEDWRITEV_FIXED rw.c
向量扩展 READ_MULTISHOTWRITE_MULTISHOT 等(若 6.1 已启用) rw.c
同步元数据 FSYNCSYNC_FILE_RANGE sync.c
结构 STATXOPENATCLOSERENAMEATMKDIRAT statx.copenclose.cfs.c
管道/切分 SPLICETEE splice.c
建议 FADVISEMADVISE advise.c
扩展属性 GETXATTRSETXATTR xattr.c
网络 SENDRECVACCEPTCONNECTSENDMSGRECVMSGSEND_ZC net.cCONFIG_NET
轮询 POLL_ADDPOLL_REMOVE poll.c
超时 TIMEOUTTIMEOUT_REMOVELINK_TIMEOUT timeout.c
epoll EPOLL_CTL epoll.c
取消 ASYNC_CANCEL cancel.c
环间 MSG_RING msg_ring.c
驱动命令 URING_CMD uring_cmd.c
不支持 not_supportedio_eopnotsupp_prep

IORING_REGISTER_PROBE:遍历 io_op_defsIO_URING_OP_SUPPORTED


四、实现文件映射

SQE opcodeio_op_defsprepissuerw.cnet.curing_cmd.cpoll.c

读写路径 rw.c

  • 使用内嵌 struct io_rw(含 kiocb
  • 支持 fixed bufferbuffer selectnowaitioprio
  • 块文件可走 io_read/io_writecall_read_iter / 直 IO

五、RK3588

  • 编解码场景常用:文件 READ/WRITE(码流落盘)、SOCKET(RTSP/私有协议)、URING_CMD(若存储栈支持)
  • 裁剪内核时关闭 CONFIG_NET 将导致网络 opcode 在 probe 中不可用

附录

API 作用
io_uring_get_opcode 根据 opcode 返回名称字符串
io_prep_rw 通用读写 prep

相关06 URING_CMD

文章互动

阅读 --

留言

0 条留言

正在加载留言…