On Wed, 19 Jul 2023 at 12:44, Matthew Wilcox <willy@xxxxxxxxxxxxx> wrote: > > So what's the API that provides the semantics of _copying_? It's called "read()" and "write()". Seriously. The *ONLY* reason for splice() existing is for zero-copy. If you don't want zero-copy (aka "copy by reference"), don't use splice. Stop arguing against it. If you don't want zero-copy, you use read() and write(). It really is that simple. And no, we don't start some kind of crazy "versioned zero-copy with COW". That's a fundamental mistake. It's a mistake that has been done - several times - and made perhaps most famous by Hurd, that made that a big thing. And yes, this has been documented *forever*. It may not have been documented on the first line, because IT WAS SO OBVIOUS. The whole reason splice() is fast is because it avoids the actual copy, and does a copy-by-reference. That's still a copy. But a copy-by-reference is a special thing. If you don't know what copy-by-reference is, or don't want it, don't use splice(). I don't know how many different ways I can say the same thing. IF YOU DON'T WANT ZERO-COPY, DON'T USE SPLICE. IF YOU DON'T UNDERSTAND THE DIFFERENCE BETWEEN COPY-BY-VALUE AND COPY-BY-REFERENCE, DON'T USE SPLICE. IF YOU DON'T UNDERSTAND THE *POINT* OF SPLICE, DON'T USE SPLICE. It's kind of a bit like pointers in C: if you don't understand pointers but use them anyway, you're going to have a hard time. That's not the fault of the pointers. Pointers are very very powerful. But if you are used to languages that only do copy-by-value, you are going to think they are bad things. Linus