gpt4 book ai didi

c - liburing/IORING_OP_PROVIDE_BUFFERS - 分配给读取操作的错误缓冲区

转载 作者:行者123 更新时间:2023-12-03 09:49:51 30 4
gpt4 key购买 nike

我在玩 liburing 和 io_uring,前者是从 master 分支构建的,而后者我使用的是内核 5.8.0-rc3。
我也面临着我将在内核的先前版本(5.7.6、5.8.0-rc1)上解释的问题。
使用提供缓冲区的测试看起来像预期的那样工作。
我正在尝试使用 实现网络 tcp/ip 服务器IORING_FEAT_FAST_POLL IORING_OP_PROVIDE_BUFFERS 我正在使用 https://github.com/frevib/io_uring-echo-server作为代码引用。
我面临的问题是缓冲区 id 总是设置为最后一个注册的缓冲区,但我可以看到内核使用的实际缓冲区不是那个。
我已将注册缓冲区的数量减少到 10 个并添加了一些调试信息,它现在正在打印所有缓冲区的内容
从服务器收到第一个 RECV 后,我进入 cqe->flags >> 16包含数据的缓冲区的 ID,它是列表的最后一个,我可以看到它包含数据,但在第二个 RECV 上,内核现在使用缓冲区 ID 0(第一个),但 cqe->flags >> 16仍然包含最后一个的ID。
造成这种情况的原因是对 io_uring_prep_provide_buffers 的调用。 ,事实上在第二次调用时就会出现问题。
出于好奇,我还尝试使用以下方法一一注册缓冲区

    for(uint16_t i = 0; i<MAX_CONNECTIONS; i++) {
sqe = io_uring_get_sqe(&ring);
io_uring_prep_provide_buffers(sqe, bufs, MAX_MESSAGE_LEN, 1, group_id, i);
}
代替
    io_uring_prep_provide_buffers(sqe, bufs, MAX_MESSAGE_LEN, MAX_CONNECTIONS, group_id, 0);
问题立即开始。
我还完全禁用了已释放缓冲区的重新注册,一切都按预期工作(我注释掉了函数 add_provide_buf 的调用)。
从文档看来,在选择缓冲区后,如果可以免费使用,则期望将其添加回来,但这显然是导致问题的原因。
任何提示?
谢谢!

最佳答案

重新注册缓冲区的代码中有一个错误:https://github.com/frevib/io_uring-echo-server/commit/aa6f2a09ca14c6aa17779a22343b9e7d4b3c7994
checkout 最新的主分支,它现在应该可以工作了:https://github.com/frevib/io_uring-echo-server

关于c - liburing/IORING_OP_PROVIDE_BUFFERS - 分配给读取操作的错误缓冲区,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62716631/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com