Issue #15006 has been updated by byroot (Jean Boussier).


> That is incorrect, copy_file_range requires both source and
destination as regular files

Damn, I totally got mislead by that LWN article & the man page. I really searched for it but couldn't find an indication that only real files were accepted.

> Did you try running "make test-all" with your patch?

Unfortunately I don't have a Linux handy, but I should have used a VM, sorry about that.


In this case, how would you feel about another patch to add `splice` support to `IO.copy_file`?

My use case is that I need to efficiently write from a socket to a pipe, and sometimes the machine is CPU limited, so the performance tank when using `write(read())`.

Since IIRC you are the author of io_splice, you might have insights as of why `IO.copy_stream` doesn't try to use it?

----------------------------------------
Feature #15006: [PATCH] io.c: use copy_file_range with every types of files 
https://bugs.ruby-lang.org/issues/15006#change-73649

* Author: byroot (Jean Boussier)
* Status: Open
* Priority: Normal
* Assignee: 
* Target version: 
----------------------------------------
Ref: https://bugs.ruby-lang.org/issues/13867

`IO.copy_stream` only attempt to use `copy_file_range` if the source is a regular file.

However from my understanding, contrary to `sendfile` and `splice`, `copy_file_range` has no file type restriction, it should be able to copy from and to sockets and pipes just fine.

It does have very optimized paths for regular files on specific file systems, but for other `fd` types it will fallback to do the copy using the page cache:

https://lwn.net/Articles/659523/

> If the function is absent or returns failure, the kernel will, if the COPY_FR_COPY flag is set, fall back to copying through the page cache.

So if it's available, it's preferable to `nogvl_copy_stream_read_write`.


GitHub PR: https://github.com/ruby/ruby/pull/1932



---Files--------------------------------
copy-file-range.patch (1.56 KB)


-- 
https://bugs.ruby-lang.org/

Unsubscribe: <mailto:ruby-core-request / ruby-lang.org?subject=unsubscribe>
<http://lists.ruby-lang.org/cgi-bin/mailman/options/ruby-core>