mirror of
https://github.com/rust-lang/rust.git
synced 2025-02-02 18:12:51 +00:00
prioritize sendfile over splice since it results in fewer context switches when sending to pipes
splice returns to userspace when the pipe is full, sendfile just blocks until it's done, this can achieve much higher throughput
This commit is contained in:
parent
67a6059aa5
commit
cd3bddc044
@ -173,22 +173,6 @@ mod kernel_copy {
|
||||
)
|
||||
.map(|bytes_copied| bytes_copied + bytes_flushed)
|
||||
}
|
||||
(CopyParams(reader_meta, Some(readfd)), CopyParams(writer_meta, Some(writefd)))
|
||||
if reader_meta.is_fifo() || writer_meta.is_fifo() =>
|
||||
{
|
||||
// splice
|
||||
let bytes_flushed = flush()?;
|
||||
let max_write = reader.min_limit();
|
||||
let (mut reader, mut writer) =
|
||||
unsafe { (fd_as_file(readfd), fd_as_file(writefd)) };
|
||||
crate::sys::fs::sendfile_splice(
|
||||
crate::sys::fs::SpliceMode::Splice,
|
||||
&mut reader,
|
||||
&mut writer,
|
||||
max_write,
|
||||
)
|
||||
.map(|bytes_sent| bytes_sent + bytes_flushed)
|
||||
}
|
||||
(
|
||||
CopyParams(FdMeta::Metadata(reader_meta), Some(readfd)),
|
||||
CopyParams(_, Some(writefd)),
|
||||
@ -208,6 +192,22 @@ mod kernel_copy {
|
||||
)
|
||||
.map(|bytes_sent| bytes_sent + bytes_flushed)
|
||||
}
|
||||
(CopyParams(reader_meta, Some(readfd)), CopyParams(writer_meta, Some(writefd)))
|
||||
if reader_meta.is_fifo() || writer_meta.is_fifo() =>
|
||||
{
|
||||
// splice
|
||||
let bytes_flushed = flush()?;
|
||||
let max_write = reader.min_limit();
|
||||
let (mut reader, mut writer) =
|
||||
unsafe { (fd_as_file(readfd), fd_as_file(writefd)) };
|
||||
crate::sys::fs::sendfile_splice(
|
||||
crate::sys::fs::SpliceMode::Splice,
|
||||
&mut reader,
|
||||
&mut writer,
|
||||
max_write,
|
||||
)
|
||||
.map(|bytes_sent| bytes_sent + bytes_flushed)
|
||||
}
|
||||
_ => super::generic_copy(reader, writer),
|
||||
}
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user