Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
27 commits
Select commit Hold shift + click to select a range
bd7d3f9
Support Direct I/O for posix I/O
kingcrimsontianyu Oct 31, 2025
6b3dedd
Update
kingcrimsontianyu Nov 1, 2025
aec8738
Fix a use-after-free bug
kingcrimsontianyu Nov 1, 2025
cfc5a81
Update
kingcrimsontianyu Nov 2, 2025
e1dce77
Cleanup
kingcrimsontianyu Nov 2, 2025
6881a5d
Update
kingcrimsontianyu Nov 2, 2025
592081e
Add a lot of comments to improve clarity
kingcrimsontianyu Nov 7, 2025
e59f750
Fix header include form
kingcrimsontianyu Nov 7, 2025
abd2cd1
Add further comments for clarity
kingcrimsontianyu Nov 7, 2025
f932a48
Add Python API and add Python doc
kingcrimsontianyu Nov 7, 2025
e1557b2
Update doc
kingcrimsontianyu Nov 7, 2025
64b34a1
Small fix
kingcrimsontianyu Nov 7, 2025
513f84e
Change name from posix_direct_io to auto_direct_io
kingcrimsontianyu Nov 10, 2025
aae8369
Update
kingcrimsontianyu Nov 10, 2025
7c43de7
Add unit tests
kingcrimsontianyu Nov 11, 2025
f1117e5
Add comments
kingcrimsontianyu Nov 11, 2025
9f4a23c
Fix test failure
kingcrimsontianyu Nov 12, 2025
50ac35c
Implement io_uring-based backend
kingcrimsontianyu Nov 12, 2025
443ea3c
Add device read support
kingcrimsontianyu Nov 12, 2025
b3d7b1f
Improve implementation. Fix test error
kingcrimsontianyu Nov 13, 2025
2ddb86e
Update
kingcrimsontianyu Nov 13, 2025
43226b2
Merge branch 'main' into simple-io-uring
kingcrimsontianyu Nov 16, 2025
e3a2dc1
Merge branch 'main' into simple-io-uring
kingcrimsontianyu Nov 20, 2025
23d6d58
Merge branch 'main' into simple-io-uring
kingcrimsontianyu Nov 24, 2025
b4cff0d
Merge branch 'main' into simple-io-uring
kingcrimsontianyu Dec 17, 2025
fdc3998
Update
kingcrimsontianyu Dec 17, 2025
bca5023
Merge remote-tracking branch 'origin/simple-io-uring' into simple-io-…
kingcrimsontianyu Dec 17, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion cpp/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -153,6 +153,7 @@ set(SOURCES
"src/file_utils.cpp"
"src/mmap.cpp"
"src/detail/env.cpp"
"src/detail/io_uring.cpp"
"src/detail/nvtx.cpp"
"src/detail/posix_io.cpp"
"src/shim/cuda.cpp"
Expand Down Expand Up @@ -189,7 +190,7 @@ target_include_directories(
target_link_libraries(
kvikio
PUBLIC Threads::Threads BS::thread_pool ${CMAKE_DL_LIBS} $<TARGET_NAME_IF_EXISTS:nvtx3::nvtx3-cpp>
PRIVATE $<TARGET_NAME_IF_EXISTS:CURL::libcurl>
PRIVATE $<TARGET_NAME_IF_EXISTS:CURL::libcurl> uring
)

target_compile_definitions(
Expand Down
9 changes: 9 additions & 0 deletions cpp/include/kvikio/defaults.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -121,6 +121,8 @@ class defaults {
std::vector<int> _http_status_codes;
bool _auto_direct_io_read;
bool _auto_direct_io_write;
bool _io_uring_enabled;
unsigned int _io_uring_queue_depth;
bool _thread_pool_per_block_device;

static unsigned int get_num_threads_from_env();
Expand Down Expand Up @@ -396,6 +398,13 @@ class defaults {
*/
static void set_auto_direct_io_write(bool flag);

static bool io_uring_enabled();

static void set_io_uring_enabled(bool flag);

static unsigned int io_uring_queue_depth();

static void set_io_uring_queue_depth(unsigned int io_uring_queue_depth);
/**
* @brief Check if per-block-device thread pools are enabled.
*
Expand Down
42 changes: 42 additions & 0 deletions cpp/include/kvikio/detail/io_uring.hpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
/*
* SPDX-FileCopyrightText: Copyright (c) 2022-2025, NVIDIA CORPORATION.
* SPDX-License-Identifier: Apache-2.0
*/
#pragma once

#include <liburing.h>
#include <linux/io_uring.h>

#include <kvikio/shim/cuda.hpp>

namespace kvikio::detail {

class IoUringManager {
private:
IoUringManager();
io_uring _ring{};
unsigned int _queue_depth{};
std::size_t _task_size{};

public:
static IoUringManager& get();
~IoUringManager() noexcept;

IoUringManager(IoUringManager const&) = delete;
IoUringManager& operator=(IoUringManager const&) = delete;
IoUringManager(IoUringManager&&) = delete;
IoUringManager& operator=(IoUringManager&&) = delete;

io_uring* ring() noexcept;
unsigned int queue_depth() noexcept;
std::size_t task_size() noexcept;
};

bool is_io_uring_supported() noexcept;

std::size_t io_uring_read_host(int fd, void* buf, std::size_t size, std::size_t file_offset);

std::size_t io_uring_read_device(
int fd, void* buf, std::size_t size, std::size_t file_offset, CUstream stream);

} // namespace kvikio::detail
16 changes: 16 additions & 0 deletions cpp/src/defaults.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -142,6 +142,11 @@ defaults::defaults()
_auto_direct_io_write = getenv_or("KVIKIO_AUTO_DIRECT_IO_WRITE", true);
}

{
_io_uring_enabled = getenv_or("KVIKIO_IO_URING_ENABLED", false);
_io_uring_queue_depth = getenv_or("KVIKIO_IO_URING_QUEUE_DEPTH", 32U);
}

// Determine the default value of `thread_pool_per_block_device`
{
_thread_pool_per_block_device = getenv_or("KVIKIO_THREAD_POOL_PER_BLOCK_DEVICE", false);
Expand Down Expand Up @@ -244,6 +249,17 @@ bool defaults::auto_direct_io_write() { return instance()->_auto_direct_io_write

void defaults::set_auto_direct_io_write(bool flag) { instance()->_auto_direct_io_write = flag; }

bool defaults::io_uring_enabled() { return instance()->_io_uring_enabled; }

void defaults::set_io_uring_enabled(bool flag) { instance()->_io_uring_enabled = flag; }

unsigned int defaults::io_uring_queue_depth() { return instance()->_io_uring_queue_depth; }

void defaults::set_io_uring_queue_depth(unsigned int io_uring_queue_depth)
{
instance()->_io_uring_queue_depth = io_uring_queue_depth;
}

bool defaults::thread_pool_per_block_device() { return instance()->_thread_pool_per_block_device; }

void defaults::set_thread_pool_per_block_device(bool flag)
Expand Down
Loading