On 2/10/23 2:14?PM, Andy Lutomirski wrote: > On Fri, Feb 10, 2023 at 12:50 PM Jens Axboe <axboe@xxxxxxxxx> wrote: >> >> On 2/10/23 1:44?PM, Linus Torvalds wrote: >>> On Fri, Feb 10, 2023 at 12:39 PM Jens Axboe <axboe@xxxxxxxxx> wrote: >>>> >>>> Right, I'm referencing doing zerocopy data sends with io_uring, using >>>> IORING_OP_SEND_ZC. This isn't from a file, it's from a memory location, >>>> but the important bit here is the split notifications and how you >>>> could wire up a OP_SENDFILE similarly to what Andy described. >>> >>> Sure, I think it's much more reasonable with io_uring than with splice itself. >>> >>> So I was mainly just reacting to the "strict-splice" thing where Andy >>> was talking about tracking the page refcounts. I don't think anything >>> like that can be done at a splice() level, but higher levels that >>> actually know about the whole IO might be able to do something like >>> that. >>> >>> Maybe we're just talking past each other. >> >> Maybe slightly, as I was not really intending to comment on the strict >> splice thing. But yeah I agree on splice, it would not be trivial to do >> there. At least with io_uring we have the communication channel we need. >> And tracking page refcounts seems iffy and fraught with potential >> issues. >> > > Hmm. > > Are there any real-world use cases for zero-copy splice() that > actually depend on splicing from a file to a pipe and then later from > the pipe to a socket (or file or whatever)? Or would everything > important be covered by a potential new io_uring operation that copies > from one fd directly to another fd? I think it makes sense. As Linus has referenced, the sex appeal of splice is the fact that it is dealing with pipes, and you can access these internal buffers through other means. But that is probably largely just something that is sexy design wise, nothing that _really_ matters in practice. And the pipes do get in the way, for example I had to add pipe resizing fcntl helpers to bump the size. If you're doing a plain sendfile, the pipes just kind of get in the way too imho. Another upside (from the io_uring) perspective is that splice isn't very efficient through io_uring, as it requires offload to io-wq. This could obviously be solved by some refactoring in terms of non-blocking, but it hasn't really been that relevant (and nobody has complained about it). A new sendfile op would nicely get around that too as it could be designed with async in nature, rather than the classic sync syscall model that splice follows. -- Jens Axboe