On 2/1/20 2:18 AM, Andres Freund wrote: > Hi, > > Reading the manpage from liburing I read: > IOSQE_IO_LINK > When this flag is specified, it forms a link with the next SQE in the submission ring. That next SQE > will not be started before this one completes. This, in effect, forms a chain of SQEs, which can be > arbitrarily long. The tail of the chain is denoted by the first SQE that does not have this flag set. > This flag has no effect on previous SQE submissions, nor does it impact SQEs that are outside of the > chain tail. This means that multiple chains can be executing in parallel, or chains and individual > SQEs. Only members inside the chain are serialized. Available since 5.3. > > IOSQE_IO_HARDLINK > Like IOSQE_IO_LINK, but it doesn't sever regardless of the completion result. Note that the link will > still sever if we fail submitting the parent request, hard links are only resilient in the presence of > completion results for requests that did submit correctly. IOSQE_IO_HARDLINK implies IOSQE_IO_LINK. > Available since 5.5. > > I can make some sense out of that description of IOSQE_IO_LINK without > looking at kernel code. But I don't think it's possible to understand > what happens when an earlier chain member fails, and what denotes an > error. IOSQE_IO_HARDLINK's description kind of implies that > IOSQE_IO_LINK will not start the next request if there was a failure, > but doesn't define failure either. I won't touch on the rest since Pavel already did, but I did expand the explanation of when a normal link will sever, and how: https://git.kernel.dk/cgit/liburing/commit/?id=9416351377f04211f859667f39a58d2a223cbd21 LSFMM will have a session on BPF with io_uring, which we'll need to have full control of links outside of the basic use cases. -- Jens Axboe