shawn wang
shawn wang
I'm not sure about the results of golangci-lint. any help?
uhhh, if support disable cache mode, maybe use some one like ctx, and it will cost more performance, from 1400 ns/op up to 1700 ns/op in. and there is a...
> As stated in the title, `io_uring_prep_recv_multishot` must be initiated again to continue receiving data Hi. 你的问题可能没设置好`BUFFER AND RING`,在`io_uring_setup_buf_ring`时,其中`nentries`的值与之后使用`io_uring_buf_ring_add`添加BUFFER的次数必须一致,即setup中`nentries`是几,那么必须调用`nentries`次数的`io_uring_buf_ring_add`进行添加,且`io_uring_buf_ring_advance`的值也必须是`nentries`。这样填满后,才能在之后的使用中进行循环起来。 如果没填满,那么`ENOBUF`则无法处理。 如果是满的。`ENOBUF`出现时,可以不用担心,因为只是没有空余的,只要其它占用的进行`io_uring_buf_ring_advance`交还后,整个`BUFFER AND RING`还是可以用的。 `IORING_RECVSEND_BUNDLE` 当这个设置了,我这边是正常的,它会连续的使用buffer,从而减少CQE的数量。 ~~然后,见你也有用WSL,WSL是不安全的。 因为我的WSL内核版本是`6.13.6-microsoft-standard-WSL2`,遇到很多问题,在使用`RECV MULTI`进行`ECHO`时,当数据大于3072时,发过去A,它给我一个B,特别无语。还有 direct alloc...
补充几个关于`io_uring_prep_recv_multishot`使用心得。 目前一个`CONN`独享一个`BUFFER AND RING`的情况是完全没有问题的。 多个`CONN`共享一个`BUFFER AND RING`,这比较难以控制,不同内核版本会出现不一样的情况,而且和BR的大小有强关系,难以确定多少个共享多大的是绝对安全且不浪费的。 注意,是不使用`IOU_PBUF_RING_INC`,不想处理这个,这个和`IOURING_RECVSEND_BUNDLE`貌似不合。 关于 `BUFFER AND RING`的设置如上述,要设置满。 关于`CQE`的处理。 1. 关于错误,即`RES`小于0。 判断是否需要重新提交任务,如`ENOBUF`,这是需要重新提交任务的。其它基本上是断开了。 2. 关于正确的,即`RES`大于-1。 此时`IORING_CQE_F_BUFFER`肯定存在的,如果不存在,也得不到`BID`,确保`BID`的正确,需要判断其存在。 处理`RES`,即是否有数据收到,有就处理数据,找出`BID`与`RES`所对应的`BUFFER`组。 是的,`BID`只是起始,而`RES`才是决定有几个`BUFFER`。然后`io_uring_buf_ring_advance`进行交回几个所用的。 同时注意如果有`BID`但`RES`为0,也是需要交回一个。 这时不要返回函数,否则会错过任务的重新提交。 接着判断`FLAGS`,因为即使`RES`大于0,也会有 `FLAGS`。 判断是否存在`IORING_CQE_F_MORE`,如果存在,则返回,任务还在继续中。 如果不存在,判断`RES`是否为0,为0可视为`EOF`,不为0,需要重新提交任务,如同`ENOBUF`的处理。 因为可能BR用光了,对的,用光了不一定是`ENOBUF`,还有其它的可能,如果共享BR的话。
> [@wamshawn](https://github.com/wamshawn) I ignored it yesterday, but let's not make a habit of using non-english here. Please translate and post instead. OOPS... @axboe I was just communicating with [AomaYple](https://github.com/AomaYple), so...