Skip to content

Commit cd3bddc

Browse files
committed
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
1 parent 67a6059 commit cd3bddc

File tree

1 file changed

+16
-16
lines changed

1 file changed

+16
-16
lines changed

library/std/src/io/copy.rs

Lines changed: 16 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -173,22 +173,6 @@ mod kernel_copy {
173173
)
174174
.map(|bytes_copied| bytes_copied + bytes_flushed)
175175
}
176-
(CopyParams(reader_meta, Some(readfd)), CopyParams(writer_meta, Some(writefd)))
177-
if reader_meta.is_fifo() || writer_meta.is_fifo() =>
178-
{
179-
// splice
180-
let bytes_flushed = flush()?;
181-
let max_write = reader.min_limit();
182-
let (mut reader, mut writer) =
183-
unsafe { (fd_as_file(readfd), fd_as_file(writefd)) };
184-
crate::sys::fs::sendfile_splice(
185-
crate::sys::fs::SpliceMode::Splice,
186-
&mut reader,
187-
&mut writer,
188-
max_write,
189-
)
190-
.map(|bytes_sent| bytes_sent + bytes_flushed)
191-
}
192176
(
193177
CopyParams(FdMeta::Metadata(reader_meta), Some(readfd)),
194178
CopyParams(_, Some(writefd)),
@@ -205,6 +189,22 @@ mod kernel_copy {
205189
&mut reader,
206190
&mut writer,
207191
min(len, max_write),
192+
)
193+
.map(|bytes_sent| bytes_sent + bytes_flushed)
194+
}
195+
(CopyParams(reader_meta, Some(readfd)), CopyParams(writer_meta, Some(writefd)))
196+
if reader_meta.is_fifo() || writer_meta.is_fifo() =>
197+
{
198+
// splice
199+
let bytes_flushed = flush()?;
200+
let max_write = reader.min_limit();
201+
let (mut reader, mut writer) =
202+
unsafe { (fd_as_file(readfd), fd_as_file(writefd)) };
203+
crate::sys::fs::sendfile_splice(
204+
crate::sys::fs::SpliceMode::Splice,
205+
&mut reader,
206+
&mut writer,
207+
max_write,
208208
)
209209
.map(|bytes_sent| bytes_sent + bytes_flushed)
210210
}

0 commit comments

Comments
 (0)