0001-test_aio-Skip-io_uring-tests-when-kernel-disables-it.patch
application/octet-stream
Filename: 0001-test_aio-Skip-io_uring-tests-when-kernel-disables-it.patch
Type: application/octet-stream
Part: 0
From 77c0e188720213f1a99eb6dc4502a152f72500d8 Mon Sep 17 00:00:00 2001
From: HyunSu Choi <assam258@gmail.com>
Date: Mon, 8 Dec 2025 09:58:49 +0900
Subject: [PATCH] test_aio: Skip io_uring tests when kernel disables it
The test_aio module fails on systems where io_uring is disabled at
the kernel level, despite PostgreSQL being compiled with io_uring
support. The existing have_io_uring() function only checks whether
PostgreSQL was compiled with io_uring support, but does not verify
that the kernel actually permits io_uring operations at runtime.
Many enterprise Linux distributions (e.g., RHEL 9) set
io_uring_disabled=2 by default due to security concerns. When
io_uring is kernel-disabled, initdb fails with EPERM, causing test
bailouts.
Add io_uring_enabled() to check /proc/sys/kernel/io_uring_disabled.
Tests only run when the value is 0 (fully enabled). We skip tests
for value 1 (requires CAP_SYS_ADMIN) as well, since checking for
that capability adds complexity and most test users lack it. When
the sysctl file doesn't exist (kernels < 5.1), we treat it as
disabled via "|| echo 2", which is the safest approach.
The implementation follows the existing pattern for have_io_uring(),
using a simple conditional to skip the entire test block when the
feature is unavailable. Diagnostic output is provided via note()
when tests are skipped.
This is a test-only change with no impact on server functionality.
---
src/test/modules/test_aio/t/001_aio.pl | 23 ++++++++++++++++++++++-
1 file changed, 22 insertions(+), 1 deletion(-)
diff --git a/src/test/modules/test_aio/t/001_aio.pl b/src/test/modules/test_aio/t/001_aio.pl
index 3f0453619e8..9a4ff86e78f 100644
--- a/src/test/modules/test_aio/t/001_aio.pl
+++ b/src/test/modules/test_aio/t/001_aio.pl
@@ -29,7 +29,7 @@ $node_worker->stop();
# Test io_method=io_uring
###
-if (have_io_uring())
+if (have_io_uring() and io_uring_enabled())
{
my $node_uring = create_node('io_uring');
$node_uring->start();
@@ -128,6 +128,27 @@ sub have_io_uring
return ($methods =~ m/io_uring/) ? 1 : 0;
}
+sub io_uring_enabled
+{
+ # Check if io_uring is disabled by the kernel
+ # 0 = enabled for all users
+ # 1 = disabled for unprivileged users (requires CAP_SYS_ADMIN)
+ # 2 = disabled for all users
+ # file not exists = very old kernel (< 5.1), treat as disabled
+
+ my $io_uring_disabled = `cat /proc/sys/kernel/io_uring_disabled 2>/dev/null || echo 2`;
+ chomp($io_uring_disabled);
+
+ # Only allow when fully enabled (value is 0)
+ if ($io_uring_disabled ne '0')
+ {
+ note "io_uring is restricted or disabled (io_uring_disabled=$io_uring_disabled)";
+ return 0;
+ }
+
+ return 1;
+}
+
sub psql_like
{
local $Test::Builder::Level = $Test::Builder::Level + 1;
--
2.34.1