On 9/11/23 6:46 PM, Jens Axboe wrote: >>> + ret = __io_read(req, issue_flags); >>> + >>> + /* >>> + * If we get -EAGAIN, recycle our buffer and just let normal poll >>> + * handling arm it. >>> + */ >>> + if (ret == -EAGAIN) { >>> + io_kbuf_recycle(req, issue_flags); >>> + return -EAGAIN; >>> + } >>> + >>> + /* >>> + * Any error will terminate a multishot request >>> + */ >>> + if (ret <= 0) { >>> +finish: >>> + io_req_set_res(req, ret, cflags); >>> + if (issue_flags & IO_URING_F_MULTISHOT) >>> + return IOU_STOP_MULTISHOT; >>> + return IOU_OK; >> >> Just a style detail, but I'd prefer to unfold this on the end of the >> function instead of jumping backwards here.. > > Sure, that might look better. I'll make the edit. Actually we can just indent the next case and get rid of the goto completely: int io_read_mshot(struct io_kiocb *req, unsigned int issue_flags) { unsigned int cflags = 0; int ret; /* * Multishot MUST be used on a pollable file */ if (!file_can_poll(req->file)) return -EBADFD; ret = __io_read(req, issue_flags); /* * If we get -EAGAIN, recycle our buffer and just let normal poll * handling arm it. */ if (ret == -EAGAIN) { io_kbuf_recycle(req, issue_flags); return -EAGAIN; } /* * Any successful return value will keep the multishot read armed. */ if (ret > 0) { /* * Put our buffer and post a CQE. If we fail to post a CQE, then * jump to the termination path. This request is then done. */ cflags = io_put_kbuf(req, issue_flags); if (io_fill_cqe_req_aux(req, issue_flags & IO_URING_F_COMPLETE_DEFER, ret, cflags | IORING_CQE_F_MORE)) { if (issue_flags & IO_URING_F_MULTISHOT) return IOU_ISSUE_SKIP_COMPLETE; return -EAGAIN; } } /* * Either an error, or we've hit overflow posting the CQE. For any * multishot request, hitting overflow will terminate it. */ io_req_set_res(req, ret, cflags); if (issue_flags & IO_URING_F_MULTISHOT) return IOU_STOP_MULTISHOT; return IOU_OK; } -- Jens Axboe