From 8c64ea536cc93e6a15b22d668d6f98b68a277cb8 Mon Sep 17 00:00:00 2001 From: Mohit Agrawal Date: Fri, 16 Jan 2026 18:58:27 +0530 Subject: [PATCH] crimson: Support io_uring as reactor backend option Provide a bootable option to configure reactor backend option. Fixes: https://tracker.ceph.com/issues/69057 Signed-off-by: Mohit Agrawal --- src/CMakeLists.txt | 2 +- src/common/options/crimson.yaml.in | 14 +++++++++++ .../osd/main_config_bootstrap_helpers.cc | 24 ++++++++++++++++++- src/vstart.sh | 9 +++++++ 4 files changed, 47 insertions(+), 2 deletions(-) diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 51842026837..60eea154dc1 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -463,7 +463,7 @@ if(WITH_CRIMSON) endif() endmacro () set(Seastar_API_LEVEL "6" CACHE STRING "" FORCE) - set(Seastar_IO_URING OFF CACHE BOOL "" FORCE) + set(Seastar_IO_URING OFF CACHE BOOL "") set(Seastar_DEPRECATED_OSTREAM_FORMATTERS OFF CACHE BOOL "" FORCE) if(Seastar_DPDK) find_package(dpdk QUIET) diff --git a/src/common/options/crimson.yaml.in b/src/common/options/crimson.yaml.in index ab4c5bcc33d..cda3e47d345 100644 --- a/src/common/options/crimson.yaml.in +++ b/src/common/options/crimson.yaml.in @@ -28,6 +28,20 @@ options: min: 0 max: 32 +- name: crimson_reactor_backend + type: str + level: advanced + default: linux-aio + enum_values: + - linux-aio + - io_uring + - epoll + desc: Select the seastar reactor IO backend to use for the crimson + long_desc: The backend is chosen during OSD bootup and determines how asynchrnous disk I/O + is performed. + flags: + - startup + # Reactor options: - name: crimson_reactor_task_quota_ms diff --git a/src/crimson/osd/main_config_bootstrap_helpers.cc b/src/crimson/osd/main_config_bootstrap_helpers.cc index 090c54ee495..1781fd978aa 100644 --- a/src/crimson/osd/main_config_bootstrap_helpers.cc +++ b/src/crimson/osd/main_config_bootstrap_helpers.cc @@ -96,7 +96,8 @@ const std::vector seastar_options = { {"--task-quota-ms", "crimson_reactor_task_quota_ms", Option::TYPE_FLOAT}, {"--io-latency-goal-ms", "crimson_reactor_io_latency_goal_ms", Option::TYPE_FLOAT}, {"--idle-poll-time-us", "crimson_reactor_idle_poll_time_us", Option::TYPE_UINT}, - {"--poll-mode", "crimson_poll_mode", Option::TYPE_BOOL} + {"--poll-mode", "crimson_poll_mode", Option::TYPE_BOOL}, + {"--reactor-backend", "crimson_reactor_backend", Option::TYPE_STR} }; // Function to get the option value as a string @@ -120,6 +121,13 @@ std::optional get_option_value(const SeastarOption& option) { } break; } + case Option::TYPE_STR: { + auto value = crimson::common::get_conf(option.config_key); + if (!value.empty()) { + return value; + } + break; + } default: logger().warn("get_option_value --option_name {} encountered unknown type", option.config_key); return std::nullopt; @@ -196,6 +204,20 @@ _get_early_config(int argc, const char *argv[]) } } } + if (auto found = std::find_if( + std::begin(ret.early_args), + std::end(ret.early_args), + [](auto& arg) { return arg == "--reactor-backend"; }); + found == std::end(ret.early_args)) { + auto backend = crimson::common::get_conf("crimson_reactor_backend"); + #ifndef SEASTAR_IO_URING + if (backend == "io_uring") { + ceph_abort_msgf("reactor_backend=io_uring requested but build " + "does not support io_uring"); + } + #endif + } + if (auto found = std::find_if( std::begin(early_args), std::end(early_args), diff --git a/src/vstart.sh b/src/vstart.sh index 41becb09d22..2d7b702cfb6 100755 --- a/src/vstart.sh +++ b/src/vstart.sh @@ -281,6 +281,7 @@ options: --osds-per-host: populate crush_location as each host holds the specified number of osds if set --require-osd-and-client-version: if supplied, do set-require-min-compat-client and require-osd-release to specified value --use-crush-tunables: if supplied, set tunables to specified value + --reactor-backend: configre seastar reactor backend options like io_uring or linux-aio \n EOF @@ -616,6 +617,10 @@ case $1 in crimson_smp=$2 shift ;; + --reactor-backend) + crimson_reactor_backend=$2 + shift + ;; --crimson-alien-num-threads) crimson_alien_num_threads=$2 shift @@ -1256,6 +1261,10 @@ start_osd() { echo "$CEPH_BIN/ceph -c $conf_fn config set osd.$osd crimson_poll_mode true" $CEPH_BIN/ceph -c $conf_fn config set "osd.$osd" crimson_poll_mode true fi + if [ -n "$crimson_reactor_backend" ]; then + echo "$CEPH_BIN/ceph -c $conf_fn config set osd.$osd crimson_reactor_backend $crimson_reactor_backend" + $CEPH_BIN/ceph -c $conf_fn config set osd.$osd crimson_reactor_backend $crimson_reactor_backend + fi fi if [ "$new" -eq 1 -o $inc_osd_num -gt 0 ]; then wconf <