-
-
Notifications
You must be signed in to change notification settings - Fork 1.7k
dd: optimize O_DIRECT buffer alignment to reduce syscall overhead #9104
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: main
Are you sure you want to change the base?
Conversation
9f131bd to
fecebff
Compare
CodSpeed Performance ReportMerging #9104 will not alter performanceComparing Summary
Footnotes |
Implement page-aligned buffer allocation and optimize O_DIRECT flag handling to match GNU dd behavior. Key changes: - Add allocate_aligned_buffer() for page-aligned memory allocation - Update buffer allocation to use aligned buffers - Modify handle_o_direct_write() to only remove O_DIRECT for partial blocks - Add Output::write_with_o_direct_handling() for proper O_DIRECT handling - Add comprehensive unit and integration tests Fixes uutils#6078
fecebff to
2560240
Compare
…IRECT on ARM O_DIRECT requires page-aligned buffers and writes. The conv=sync flag pads output to block size, which may not be page-aligned, causing EINVAL errors on ARM systems. The core O_DIRECT functionality is already well-tested by: - test_o_direct_with_aligned_buffer_full_blocks - test_o_direct_with_partial_final_block - test_o_direct_various_block_sizes
|
GNU testsuite comparison: |
|
I need more dopamine when stuck on a bug, so new PRs might be good :)) |
|
GNU testsuite comparison: |
|
GNU testsuite comparison: |
cre4ture
left a comment
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
thanks
| /// Stub for non-Linux platforms - just return the original error. | ||
| #[cfg(not(any(target_os = "linux", target_os = "android")))] | ||
| #[allow(dead_code)] | ||
| fn handle_o_direct_write( |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
is this stub still needed? I guess its not called an non-linux anymore, right?
e.g. there is already a stub for "write_with_o_direct_handling" which doesn't call this helper anymore
| /// This function allocates a `Vec<u8>` with proper alignment to support O_DIRECT | ||
| /// without triggering EINVAL errors. | ||
| #[cfg(any(target_os = "linux", target_os = "android"))] | ||
| fn allocate_aligned_buffer(size: usize) -> Vec<u8> { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
@sylvestre is this something we could move to a more central location? Or is this the only place where we need aligned memory allocations?
Fixes #6078
page-aligned buffers + smarter O_DIRECT handling. Theory says 5x fewer syscalls. 🗿
Checklist: