IORING_OP_SEND_ZC提交后你拿到的第一个 CQE 只代表"send 调用返回了",不代表 buffer 可以释放。真正的释放信号是第二个带IORING_CQE_F_NOTIF标志的 CQE——它意味着网卡 DMA 已经完成、内核不再持有你的页面。这篇从内核io_uring/net.c的io_send_zc到ubuf_info的回调链,逐层拆解这个"双 CQE"协议的每一个环节:为什么必须是两个 CQE、notification 什么时候到、IOSQE_CQE_SKIP_SUCCESS跟它怎么配合、以及它比MSG_ZEROCOPY的MSG_ERRQUEUE方案到底好在哪。一个 buffer 的"死亡通知书"// Linux 6.x, io_uring userspacestructio_uring_sqe*sqe=
io_uring 零拷贝的致命陷阱:为什么 send 成功了,你却不能释放内存?
IORING_OP_SEND_ZC提交后你拿到的第一个 CQE 只代表"send 调用返回了",不代表 buffer 可以释放。真正的释放信号是第二个带IORING_CQE_F_NOTIF标志的 CQE——它意味着网卡 DMA 已经完成、内核不再持有你的页面。这篇从内核io_uring/net.c的io_send_zc到ubuf_info的回调链,逐层拆解这个"双 CQE"协议的每一个环节:为什么必须是两个 CQE、notification 什么时候到、IOSQE_CQE_SKIP_SUCCESS跟它怎么配合、以及它比MSG_ZEROCOPY的MSG_ERRQUEUE方案到底好在哪。一个 buffer 的"死亡通知书"// Linux 6.x, io_uring userspacestructio_uring_sqe*sqe=