Received: from malur.postgresql.org ([217.196.149.56]) by arkaria.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.96) (envelope-from ) id 1vdhR7-003crT-0x for pgsql-bugs@arkaria.postgresql.org; Thu, 08 Jan 2026 04:15:50 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.96) (envelope-from ) id 1vdhR6-00HTdT-0e for pgsql-bugs@arkaria.postgresql.org; Thu, 08 Jan 2026 04:15:48 +0000 Received: from makus.postgresql.org ([2001:4800:3e1:1::229]) by malur.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.96) (envelope-from ) id 1vdhR5-00HTdL-2B for pgsql-bugs@lists.postgresql.org; Thu, 08 Jan 2026 04:15:48 +0000 Received: from mail-oo1-xc2d.google.com ([2607:f8b0:4864:20::c2d]) by makus.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 (Exim 4.96) (envelope-from ) id 1vdhR4-004pHZ-05 for pgsql-bugs@lists.postgresql.org; Thu, 08 Jan 2026 04:15:47 +0000 Received: by mail-oo1-xc2d.google.com with SMTP id 006d021491bc7-65b73eacdfcso679640eaf.2 for ; Wed, 07 Jan 2026 20:15:45 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1767845745; x=1768450545; darn=lists.postgresql.org; h=to:subject:message-id:date:from:in-reply-to:references:mime-version :from:to:cc:subject:date:message-id:reply-to; bh=WKo70JEoUW0rRfSGhX7uFCqrXgzD+XT5JPq3srHnWM8=; b=WHvqGpkVrV+XbL6olw8BQtTlxyXQPvTrNLNQX+l8z73jOhR4g9JIGikrcob5jZhcMQ VwrMNWTao4rET1Sk02XKDzUFW5chHFeAmg8niOEjOP2VIS+CAopGOABNB4acfrXKaHfI 5SulJWcraKpyEEMnnlBQY26d1+lqBLdqCrEa77LZAq0sNBSv2V0wcJj8He/UGzjoboCv ohJNsnyO+KlShPyDTBO64jJq3pYJNR1eMN8b5Mw06CUeQ8OckSp7NeJB1jQdC8NQGr2m 11iMvLqEy6zEtL+SlLAs4axT9YqsUrGd1AdnH7nFOAY4Ci0hA5FOGuNwEYwJc8E6C+VF 5ROQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1767845745; x=1768450545; h=to:subject:message-id:date:from:in-reply-to:references:mime-version :x-gm-gg:x-gm-message-state:from:to:cc:subject:date:message-id :reply-to; bh=WKo70JEoUW0rRfSGhX7uFCqrXgzD+XT5JPq3srHnWM8=; b=p1uH+KGFHshMwzm++M+9/107YHfI8RHLlnYPFMbOttdyY2m5+A+hsnx/5vDiE0WQQo MMGEMaQHGRWYoe5SUn576l1msZWguhE1uolA5e74krHd/tSgtOkbX0Mqy/LlVg1t4bLq wRQrCl/03YvI58/Q/Pq86STiPnun7YQgXA1dTs62I5k7p4jxdfpkRdD20U2KKgtjn/ZQ WIZpx/5Qt6yHxDmaiHGlWcvPW8lk6s7SBjkG+i073lWVbpyBjXsztoO97G8bXB5CDdWV FmY0h8kE1o2wkClVgw94AJjAgV+10JiQ4a6U2cmB/ncheNv96A4kpHhf9nGuSSdu2or6 /9tg== X-Forwarded-Encrypted: i=1; AJvYcCX1Rp9SXMm3H4R1odu8jx7qcRqAMPSr9vS7UXtCEN6J6UUwtfnLEOlDN7vRmKvaqJBG+cKVB9b6/Qe5@lists.postgresql.org X-Gm-Message-State: AOJu0YynNxxotGVj+Y/zHfZAjdEysSM8ACPG0QyLYgyb5AGDKF8/CR2k yrxS0+qFmFgHmaYxP1Vp6+XSzE5MfcCpJve4O1+9Kgh7mJ4YuZOJ/mtiqrPimb1PMWsRX75mR24 Ph17m0jVgGeCDQhzynpwKazB3DSF+7rGmRbgc X-Gm-Gg: AY/fxX6c2q3PVjCf9F9KqkSy92PljvCjqDR5piTnzEtT4iD0SHhDNWWK0cd3/5i7vys E/8zX7qWgQcHqmUzTLnoWMXwvBppkjfZQoBT4/uVu/yjpetJ3nD+aCvAYAJYhYEAZ7ooeAW2DfF NZAz/zYlv/OfpJjNmhJozzjxfFs//sF5zS6GLsas/Hust2t6UhVhwsq76+Q3SkAYlCPwKCCyWGD YM34ogTNgrGkoQVihHm3Bsl/jmae1+RMD32kcy0LQuPhGReba8HC0mxBEf9Qk5huTHYhORAEOvg H9kLGAkfvKYHtBFzqg== X-Google-Smtp-Source: AGHT+IHCVP39XrUPfH0bwwdA4EePt9aNb0n8s9OLug75gwR+ma8fvjxDO9XsgDh4lYCZuFmZ2Ye0woGDV+zixRAT9zQ= X-Received: by 2002:a05:6820:2f11:b0:65d:e58:503a with SMTP id 006d021491bc7-65f54ef18fbmr1502812eaf.26.1767845744634; Wed, 07 Jan 2026 20:15:44 -0800 (PST) MIME-Version: 1.0 References: <19369-aa853da20e970a89@postgresql.org> In-Reply-To: <19369-aa853da20e970a89@postgresql.org> From: surya poondla Date: Wed, 7 Jan 2026 20:15:33 -0800 X-Gm-Features: AQt7F2otnQ3modNIKSQlYfB_ZNS4yRB1xESkzagBqqVWC4bNIjdKzD4BO0wvROE Message-ID: Subject: Re: BUG #19369: Not documented that io_uring on kernel versions between 5.1 and below 5.6 does not work To: evsi@amazon.com, pgsql-bugs@lists.postgresql.org Content-Type: multipart/alternative; boundary="000000000000a06e910647d8a987" List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk --000000000000a06e910647d8a987 Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable Hi Evsi, I created a new Ubuntu server and am able to reproduce the same behavior you reported for Postgres 18.1 on aarch64 architecture. surya@surya:~/pgdata18/log$ uname -r 5.4.0-216-generic surya@surya:~/pgdata18/log$ uname -a Linux surya 5.4.0-216-generic #236-Ubuntu SMP Fri Apr 11 19:55:34 UTC 2025 aarch64 aarch64 aarch64 GNU/Linux I did some testing and see the below In the postgresql.conf if I put io_method =3D 'worker' or io_method =3D 'sync', postgres is able to restart with no errors. But if io_method =3D 'io_uring' then I see the below on my console surya@surya:~/postgresql-18.1$ vim ~/pgdata18/postgresql.conf surya@surya:~/postgresql-18.1$ ~/pg18/bin/pg_ctl -D ~/pgdata18 restart waiting for server to shut down....2026-01-08 04:06:07.081 UTC [44973] DEBUG: logger shutting down 2026-01-08 04:06:07.081 UTC [44973] DEBUG: shmem_exit(0): 0 before_shmem_exit callbacks to make 2026-01-08 04:06:07.081 UTC [44973] DEBUG: shmem_exit(0): 0 on_shmem_exit callbacks to make 2026-01-08 04:06:07.081 UTC [44973] DEBUG: proc_exit(0): 0 callbacks to make 2026-01-08 04:06:07.081 UTC [44973] DEBUG: exit(0) 2026-01-08 04:06:07.081 UTC [44973] DEBUG: shmem_exit(-1): 0 before_shmem_exit callbacks to make 2026-01-08 04:06:07.081 UTC [44973] DEBUG: shmem_exit(-1): 0 on_shmem_exit callbacks to make 2026-01-08 04:06:07.081 UTC [44973] DEBUG: proc_exit(-1): 0 callbacks to make done server stopped waiting for server to start....2026-01-08 04:06:07.172 GMT [44988] LOG: invalid value for parameter "io_method": "io_uring" 2026-01-08 04:06:07.172 GMT [44988] HINT: Available values: sync, worker. 2026-01-08 04:06:07.172 UTC [44988] FATAL: configuration file "/home/surya/pgdata18/postgresql.conf" contains errors 2026-01-08 04:06:07.172 UTC [44988] DEBUG: shmem_exit(1): 0 before_shmem_exit callbacks to make 2026-01-08 04:06:07.172 UTC [44988] DEBUG: shmem_exit(1): 0 on_shmem_exit callbacks to make 2026-01-08 04:06:07.172 UTC [44988] DEBUG: proc_exit(1): 0 callbacks to make 2026-01-08 04:06:07.172 UTC [44988] DEBUG: exit(1) stopped waiting pg_ctl: could not start server Examine the log output. From the above we can see that the stderr says that "*invalid value for parameter "io_method": "io_uring"*" And in the logs I see similar thing like you reported 2026-01-08 04:05:31.438 UTC [44972] DEBUG: starting background worker process "logical replication launcher" 2026-01-08 04:05:31.438 UTC [44981] DEBUG: autovacuum launcher started 2026-01-08 04:05:31.438 UTC [44981] DEBUG: InitPostgres 2026-01-08 04:05:31.438 UTC [44982] DEBUG: logical replication launcher started 2026-01-08 04:05:31.438 UTC [44982] DEBUG: InitPostgres 2026-01-08 04:05:31.438 UTC [44981] DEBUG: io 6400 |op invalid|target invalid|state HANDED_OUT : adding cb #1, id 2/aio_shared_buffer_readv_cb 2026-01-08 04:05:31.438 UTC [44981] DEBUG: io 6400 |op invalid|target smgr|state HANDED_OUT : adding cb #2, id 1/aio_md_readv_cb 2026-01-08 04:05:31.438 UTC [44981] DEBUG: io 6400 |op readv|target smgr|state DEFINED : calling cb #1 2/aio_shared_buffer_readv_cb->stage(0) 2026-01-08 04:05:31.438 UTC [44981] DEBUG: io 6400 |op readv|target smgr|state STAGED : staged (synchronous: 0, in_batch: 1) 2026-01-08 04:05:31.439 UTC [44974] DEBUG: io 6400 |op readv|target smgr|state COMPLETED_IO : after shared completion: distilled result: (status OK, id 0, error_data: 0, result 1), raw_result: 8192 2026-01-08 04:05:31.439 UTC [44981] DEBUG: io 6400 |op readv|target smgr|state COMPLETED_SHARED: after local completion: result: (status OK, id 0, error_data 0, result 1), raw_result: 8192 I am working on a patch and will fix the inconsistencies in documentation about io_uring. Best, Surya Poondla On Wed, Jan 7, 2026 at 7:54=E2=80=AFPM PG Bug reporting form wrote: > The following bug has been logged on the website: > > Bug reference: 19369 > Logged by: Evan Si > Email address: evsi@amazon.com > PostgreSQL version: 18.1 > Operating system: Amazon Linux 2 > Description: > > Hello, > > The documentation doesn't explicitly state a minimum kernel version for > io_uring, but in src/backend/storage/aio/README.md, it claims that: > > > io_method=3Dio_uring is available on Linux 5.1+. > > Attempting to set io_method to io_uring on versions without io_uring at a= ll > (below 5.1) causes the server to graciously report that "[the k]ernel doe= s > not support io_uring". > But setting io_uring on kernel versions between 5.1 and 5.6 sees the serv= er > start but connections failing with EINVAL. > > ``` > [ec2-user@ip-172-31-56-49 postgres]$ psql postgres > psql: error: connection to server on socket "/tmp/.s.PGSQL.5432" failed: > FATAL: could not read blocks 0..0 in file "global/1260": Invalid argumen= t > ``` > > It seems like the implementation in postgres leverages non-vectored I/O > (i.e. io_uring_prep_read and io_uring_prep_write) in > src/backend/storage/aio/method_io_uring.c. > > But, these opcodes aren't actually available until kernel 5.6 > (https://github.com/axboe/liburing/issues/44), > (https://man7.org/linux/man-pages/man2/io_uring_enter.2.html - under > IORING_OP_READ, IORING_OP_WRITE). > > It seems kernel 5.4 LTS ended last month, but this seems worth clarifying= , > I > think. > > -- > > Precise reproduction example: > > OS details > ``` > [ec2-user@ip-172-31-56-49 postgres]$ uname -a > Linux ip-172-31-56-49.us-west-2.compute.internal > 5.4.301-221.450.amzn2.x86_64 #1 SMP Tue Nov 18 16:40:04 UTC 2025 x86_64 > x86_64 x86_64 GNU/Linux > ``` > > Build postgres with liburing 2.8, set postgresql.conf with > io_method=3Dio_uring, log_min_messages =3D debug3. > > Postgres starts without complaint, but trying to connect will fail: > > ``` > [ec2-user@ip-172-31-56-49 postgres]$ psql postgres > psql: error: connection to server on socket "/tmp/.s.PGSQL.5432" failed: > FATAL: could not read blocks 0..0 in file "global/1260": Invalid argumen= t > ``` > Inside logfile: > ``` > 2026-01-02 22:35:43.862 UTC [8517] DEBUG: io 6400 |op invalid|targe= t > invalid|state HANDED_OUT : adding cb #1, id > 2/aio_shared_buffer_readv_cb > 2026-01-02 22:35:43.862 UTC [8517] DEBUG: io 6400 |op invalid|targe= t > smgr|state HANDED_OUT : adding cb #2, id 1/aio_md_readv_cb > 2026-01-02 22:35:43.863 UTC [8517] DEBUG: io 6400 |op readv|target > smgr|state DEFINED : calling cb #1 > 2/aio_shared_buffer_readv_cb->stage(0) > 2026-01-02 22:35:43.863 UTC [8517] DEBUG: io 6400 |op readv|target > smgr|state STAGED : staged (synchronous: 0, in_batch: 1) > 2026-01-02 22:35:43.863 UTC [8517] DEBUG: io 6400 |op readv|target > smgr|state SUBMITTED : wait_one io_gen: 3, ref_gen: 3, cycle 0 > 2026-01-02 22:35:43.863 UTC [8517] LOG: could not read blocks 0..0 in fi= le > "global/1262": Invalid argument > 2026-01-02 22:35:43.863 UTC [8517] DEBUG: io 6400 |op readv|target > smgr|state COMPLETED_IO : after shared completion: distilled result: > (status ERROR, id 1, error_data: 22, result 0), raw_result: -22 > 2026-01-02 22:35:43.863 UTC [8517] DEBUG: io 6400 |op readv|target > smgr|state COMPLETED_SHARED: after local completion: result: (status ERRO= R, > id 1, error_data 22, result 0), raw_result: -22 > 2026-01-02 22:35:43.863 UTC [8517] DEBUG: drained 1/1, now expecting 0 > 2026-01-02 22:35:43.863 UTC [8517] DEBUG: io 6400 |op invalid|targe= t > invalid|state IDLE : wait_one io_gen: 4, ref_gen: 3, cycle 0 > 2026-01-02 22:35:43.863 UTC [8517] DEBUG: wait_one with 0 sleeps > 2026-01-02 22:35:43.863 UTC [8517] ERROR: could not read blocks 0..0 in > file "global/1262": Invalid argument > 2026-01-02 22:35:44.057 UTC [8512] DEBUG: assigned pm child slot 1 for > backend > 2026-01-02 22:35:44.058 UTC [8512] DEBUG: forked new client backend, > pid=3D8521 socket=3D151 > 2026-01-02 22:35:44.058 UTC [8521] DEBUG: InitPostgres > 2026-01-02 22:35:44.059 UTC [8521] DEBUG: io 0 |op invalid|targe= t > invalid|state HANDED_OUT : adding cb #1, id > 2/aio_shared_buffer_readv_cb > 2026-01-02 22:35:44.059 UTC [8521] DEBUG: io 0 |op invalid|targe= t > smgr|state HANDED_OUT : adding cb #2, id 1/aio_md_readv_cb > 2026-01-02 22:35:44.059 UTC [8521] DEBUG: io 0 |op readv|target > smgr|state DEFINED : calling cb #1 > 2/aio_shared_buffer_readv_cb->stage(0) > 2026-01-02 22:35:44.059 UTC [8521] DEBUG: io 0 |op readv|target > smgr|state STAGED : staged (synchronous: 0, in_batch: 1) > 2026-01-02 22:35:44.059 UTC [8521] DEBUG: io 0 |op readv|target > smgr|state SUBMITTED : wait_one io_gen: 1, ref_gen: 1, cycle 0 > 2026-01-02 22:35:44.059 UTC [8521] LOG: could not read blocks 0..0 in fi= le > "global/1260": Invalid argument > 2026-01-02 22:35:44.059 UTC [8521] DEBUG: io 0 |op readv|target > smgr|state COMPLETED_IO : after shared completion: distilled result: > (status ERROR, id 1, error_data: 22, result 0), raw_result: -22 > 2026-01-02 22:35:44.059 UTC [8521] DEBUG: io 0 |op readv|target > smgr|state COMPLETED_SHARED: after local completion: result: (status ERRO= R, > id 1, error_data 22, result 0), raw_result: -22 > 2026-01-02 22:35:44.059 UTC [8521] DEBUG: drained 1/1, now expecting 0 > 2026-01-02 22:35:44.059 UTC [8521] DEBUG: io 0 |op invalid|targe= t > invalid|state IDLE : wait_one io_gen: 2, ref_gen: 1, cycle 0 > 2026-01-02 22:35:44.059 UTC [8521] DEBUG: wait_one with 0 sleeps > 2026-01-02 22:35:44.059 UTC [8521] FATAL: could not read blocks 0..0 in > file "global/1260": Invalid argument > 2026-01-02 22:35:44.059 UTC [8521] DEBUG: shmem_exit(1): 5 > before_shmem_exit callbacks to make > 2026-01-02 22:35:44.059 UTC [8521] DEBUG: shmem_exit(1): 7 on_shmem_exit > callbacks to make > 2026-01-02 22:35:44.059 UTC [8521] DEBUG: proc_exit(1): 2 callbacks to > make > 2026-01-02 22:35:44.059 UTC [8521] DEBUG: exit(1) > 2026-01-02 22:35:44.059 UTC [8521] DEBUG: shmem_exit(-1): 0 > before_shmem_exit callbacks to make > 2026-01-02 22:35:44.059 UTC [8521] DEBUG: shmem_exit(-1): 0 on_shmem_exi= t > callbacks to make > 2026-01-02 22:35:44.059 UTC [8521] DEBUG: proc_exit(-1): 0 callbacks to > make > 2026-01-02 22:35:44.060 UTC [8512] DEBUG: releasing pm child slot 1 > 2026-01-02 22:35:44.060 UTC [8512] DEBUG: client backend (PID 8521) exit= ed > with exit code 1 > 2026-01-02 22:35:44.863 UTC [8517] DEBUG: io 6400 |op invalid|targe= t > invalid|state HANDED_OUT : adding cb #1, id > 2/aio_shared_buffer_readv_cb > 2026-01-02 22:35:44.863 UTC [8517] DEBUG: io 6400 |op invalid|targe= t > smgr|state HANDED_OUT : adding cb #2, id 1/aio_md_readv_cb > 2026-01-02 22:35:44.863 UTC [8517] DEBUG: io 6400 |op readv|target > smgr|state DEFINED : calling cb #1 > 2/aio_shared_buffer_readv_cb->stage(0) > 2026-01-02 22:35:44.863 UTC [8517] DEBUG: io 6400 |op readv|target > smgr|state STAGED : staged (synchronous: 0, in_batch: 1) > 2026-01-02 22:35:44.863 UTC [8517] DEBUG: io 6400 |op readv|target > smgr|state SUBMITTED : wait_one io_gen: 4, ref_gen: 4, cycle 0 > 2026-01-02 22:35:44.863 UTC [8517] LOG: could not read blocks 0..0 in fi= le > "global/1262": Invalid argument > 2026-01-02 22:35:44.863 UTC [8517] DEBUG: io 6400 |op readv|target > smgr|state COMPLETED_IO : after shared completion: distilled result: > (status ERROR, id 1, error_data: 22, result 0), raw_result: -22 > 2026-01-02 22:35:44.863 UTC [8517] DEBUG: io 6400 |op readv|target > smgr|state COMPLETED_SHARED: after local completion: result: (status ERRO= R, > id 1, error_data 22, result 0), raw_result: -22 > 2026-01-02 22:35:44.863 UTC [8517] DEBUG: drained 1/1, now expecting 0 > 2026-01-02 22:35:44.863 UTC [8517] DEBUG: io 6400 |op invalid|targe= t > invalid|state IDLE : wait_one io_gen: 5, ref_gen: 4, cycle 0 > 2026-01-02 22:35:44.863 UTC [8517] DEBUG: wait_one with 0 sleeps > 2026-01-02 22:35:44.863 UTC [8517] ERROR: could not read blocks 0..0 in > file "global/1262": Invalid argument > ``` > > --000000000000a06e910647d8a987 Content-Type: text/html; charset="UTF-8" Content-Transfer-Encoding: quoted-printable
Hi Evsi,

I create= d a new Ubuntu server and=C2=A0am able to reproduce the same behavior you= =C2=A0reported for Postgres 18.1 on aarch64 architecture.

surya@sury= a:~/pgdata18/log$ uname -r
5.4.0-216-generic
surya@surya:~/pgdata18/l= og$ uname -a
Linux surya 5.4.0-216-generic #236-Ubuntu SMP Fri Apr 11 19= :55:34 UTC 2025 aarch64 aarch64 aarch64 GNU/Linux

I did some testing= and see the=C2=A0below
In the=C2=A0postgresql.conf if I put=C2=A0
io= _method =3D 'worker' or=C2=A0io_method =3D 'sync', postgres= is able to restart with no errors.
But if=C2=A0io_method =3D 'io_ur= ing' then I see the below on my console

surya@surya:~= /postgresql-18.1$ vim ~/pgdata18/postgresql.conf
surya@surya:~/postgre= sql-18.1$ ~/pg18/bin/pg_ctl -D ~/pgdata18 restart
waiting for server to = shut down....2026-01-08 04:06:07.081 UTC [44973] DEBUG: =C2=A0logger shutti= ng down
2026-01-08 04:06:07.081 UTC [44973] DEBUG: =C2=A0shmem_exit(0): = 0 before_shmem_exit callbacks to make
2026-01-08 04:06:07.081 UTC [44973= ] DEBUG: =C2=A0shmem_exit(0): 0 on_shmem_exit callbacks to make
2026-01-= 08 04:06:07.081 UTC [44973] DEBUG: =C2=A0proc_exit(0): 0 callbacks to make<= br>2026-01-08 04:06:07.081 UTC [44973] DEBUG: =C2=A0exit(0)
2026-01-08 0= 4:06:07.081 UTC [44973] DEBUG: =C2=A0shmem_exit(-1): 0 before_shmem_exit ca= llbacks to make
2026-01-08 04:06:07.081 UTC [44973] DEBUG: =C2=A0shmem_e= xit(-1): 0 on_shmem_exit callbacks to make
2026-01-08 04:06:07.081 UTC [= 44973] DEBUG: =C2=A0proc_exit(-1): 0 callbacks to make
=C2=A0done
ser= ver stopped
waiting for server to start....2026-01-08 04:06:07.172 GMT [= 44988] LOG: =C2=A0invalid value for parameter "io_method": "= io_uring"
2026-01-08 04:06:07.172 GMT [44988] HINT: =C2=A0Available= values: sync, worker.
2026-01-08 04:06:07.172 UTC [44988] FATAL: =C2=A0= configuration file "/home/surya/pgdata18/postgresql.conf" contain= s errors
2026-01-08 04:06:07.172 UTC [44988] DEBUG: =C2=A0shmem_exit(1):= 0 before_shmem_exit callbacks to make
2026-01-08 04:06:07.172 UTC [4498= 8] DEBUG: =C2=A0shmem_exit(1): 0 on_shmem_exit callbacks to make
2026-01= -08 04:06:07.172 UTC [44988] DEBUG: =C2=A0proc_exit(1): 0 callbacks to make=
2026-01-08 04:06:07.172 UTC [44988] DEBUG: =C2=A0exit(1)
=C2=A0stopp= ed waiting
pg_ctl: could not start server
Examine the log output.
=

From the above we can see that the stderr says that "inv= alid value for parameter "io_method": "io_uring""

And in the logs I see similar thing like you reported
202= 6-01-08 04:05:31.438 UTC [44972] DEBUG: =C2=A0starting background worker pr= ocess "logical replication launcher"
2026-01-08 04:05:31.438 U= TC [44981] DEBUG: =C2=A0autovacuum launcher started
2026-01-08 04:05:31.= 438 UTC [44981] DEBUG: =C2=A0InitPostgres
2026-01-08 04:05:31.438 UTC [4= 4982] DEBUG: =C2=A0logical replication launcher started
2026-01-08 04:05= :31.438 UTC [44982] DEBUG: =C2=A0InitPostgres
2026-01-08 04:05:31.438 UT= C [44981] DEBUG: =C2=A0io 6400 =C2=A0 =C2=A0 =C2=A0|op invalid|target inval= id|state HANDED_OUT =C2=A0 =C2=A0 =C2=A0: adding cb #1, id 2/aio_shared_buf= fer_readv_cb
2026-01-08 04:05:31.438 UTC [44981] DEBUG: =C2=A0io 6400 = =C2=A0 =C2=A0 =C2=A0|op invalid|target smgr|state HANDED_OUT =C2=A0 =C2=A0 = =C2=A0: adding cb #2, id 1/aio_md_readv_cb
2026-01-08 04:05:31.438 UTC [= 44981] DEBUG: =C2=A0io 6400 =C2=A0 =C2=A0 =C2=A0|op readv|target smgr|state= DEFINED =C2=A0 =C2=A0 =C2=A0 =C2=A0 : calling cb #1 2/aio_shared_buffer_re= adv_cb->stage(0)
2026-01-08 04:05:31.438 UTC [44981] DEBUG: =C2=A0io = 6400 =C2=A0 =C2=A0 =C2=A0|op readv|target smgr|state STAGED =C2=A0 =C2=A0 = =C2=A0 =C2=A0 =C2=A0: staged (synchronous: 0, in_batch: 1)
2026-01-08 04= :05:31.439 UTC [44974] DEBUG: =C2=A0io 6400 =C2=A0 =C2=A0 =C2=A0|op readv|t= arget smgr|state COMPLETED_IO =C2=A0 =C2=A0: after shared completion: disti= lled result: (status OK, id 0, error_data: 0, result 1), raw_result: 81922026-01-08 04:05:31.439 UTC [44981] DEBUG: =C2=A0io 6400 =C2=A0 =C2=A0 = =C2=A0|op readv|target smgr|state COMPLETED_SHARED: after local completion:= result: (status OK, id 0, error_data 0, result 1), raw_result: 8192
I am working on a patch=C2=A0and will fix the inconsistencies in documenta= tion about io_uring.

Best,
Surya Poondla

On Wed, Jan 7, 2026 at 7:54=E2=80=AFPM PG Bug reporting form <noreply@postgresql.org> wrote:
The following bug = has been logged on the website:

Bug reference:=C2=A0 =C2=A0 =C2=A0 19369
Logged by:=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 Evan Si
Email address:=C2=A0 =C2=A0 =C2=A0 evsi@amazon.com
PostgreSQL version: 18.1
Operating system:=C2=A0 =C2=A0Amazon Linux 2
Description:=C2=A0 =C2=A0 =C2=A0 =C2=A0

Hello,

The documentation doesn't explicitly state a minimum kernel version for=
io_uring, but in src/backend/storage/aio/README.md, it claims that:

> io_method=3Dio_uring is available on Linux 5.1+.

Attempting to set io_method to io_uring on versions without io_uring at all=
(below 5.1) causes the server to graciously report that "[the k]ernel = does
not support io_uring".
But setting io_uring on kernel versions between 5.1 and 5.6 sees the server=
start but connections failing with EINVAL.

```
[ec2-user@ip-172-31-56-49 postgres]$ psql postgres
psql: error: connection to server on socket "/tmp/.s.PGSQL.5432" = failed:
FATAL:=C2=A0 could not read blocks 0..0 in file "global/1260": In= valid argument
```

It seems like the implementation in postgres leverages non-vectored I/O
(i.e. io_uring_prep_read and io_uring_prep_write) in
src/backend/storage/aio/method_io_uring.c.

But, these opcodes aren't actually available until kernel 5.6
(https://github.com/axboe/liburing/issues/44),
(https://man7.org/linux/man-pages/man2/io= _uring_enter.2.html - under
IORING_OP_READ, IORING_OP_WRITE).

It seems kernel 5.4 LTS ended last month, but this seems worth clarifying, = I
think.

--

Precise reproduction example:

OS details
```
[ec2-user@ip-172-31-56-49 postgres]$ uname -a
Linux ip-172-31-56-49.us-west-2.compute.internal
5.4.301-221.450.amzn2.x86_64 #1 SMP Tue Nov 18 16:40:04 UTC 2025 x86_64
x86_64 x86_64 GNU/Linux
```

Build postgres with liburing 2.8, set postgresql.conf with
io_method=3Dio_uring, log_min_messages =3D debug3.

Postgres starts without complaint, but trying to connect will fail:

```
[ec2-user@ip-172-31-56-49 postgres]$ psql postgres
psql: error: connection to server on socket "/tmp/.s.PGSQL.5432" = failed:
FATAL:=C2=A0 could not read blocks 0..0 in file "global/1260": In= valid argument
```
Inside logfile:
```
2026-01-02 22:35:43.862 UTC [8517] DEBUG:=C2=A0 io 6400=C2=A0 =C2=A0 =C2=A0= |op invalid|target
invalid|state HANDED_OUT=C2=A0 =C2=A0 =C2=A0 : adding cb #1, id
2/aio_shared_buffer_readv_cb
2026-01-02 22:35:43.862 UTC [8517] DEBUG:=C2=A0 io 6400=C2=A0 =C2=A0 =C2=A0= |op invalid|target
smgr|state HANDED_OUT=C2=A0 =C2=A0 =C2=A0 : adding cb #2, id 1/aio_md_readv= _cb
2026-01-02 22:35:43.863 UTC [8517] DEBUG:=C2=A0 io 6400=C2=A0 =C2=A0 =C2=A0= |op readv|target
smgr|state DEFINED=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0: calling cb #1
2/aio_shared_buffer_readv_cb->stage(0)
2026-01-02 22:35:43.863 UTC [8517] DEBUG:=C2=A0 io 6400=C2=A0 =C2=A0 =C2=A0= |op readv|target
smgr|state STAGED=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 : staged (synchronous: = 0, in_batch: 1)
2026-01-02 22:35:43.863 UTC [8517] DEBUG:=C2=A0 io 6400=C2=A0 =C2=A0 =C2=A0= |op readv|target
smgr|state SUBMITTED=C2=A0 =C2=A0 =C2=A0 =C2=A0: wait_one io_gen: 3, ref_ge= n: 3, cycle 0
2026-01-02 22:35:43.863 UTC [8517] LOG:=C2=A0 could not read blocks 0..0 in= file
"global/1262": Invalid argument
2026-01-02 22:35:43.863 UTC [8517] DEBUG:=C2=A0 io 6400=C2=A0 =C2=A0 =C2=A0= |op readv|target
smgr|state COMPLETED_IO=C2=A0 =C2=A0 : after shared completion: distilled r= esult:
(status ERROR, id 1, error_data: 22, result 0), raw_result: -22
2026-01-02 22:35:43.863 UTC [8517] DEBUG:=C2=A0 io 6400=C2=A0 =C2=A0 =C2=A0= |op readv|target
smgr|state COMPLETED_SHARED: after local completion: result: (status ERROR,=
id 1, error_data 22, result 0), raw_result: -22
2026-01-02 22:35:43.863 UTC [8517] DEBUG:=C2=A0 drained 1/1, now expecting = 0
2026-01-02 22:35:43.863 UTC [8517] DEBUG:=C2=A0 io 6400=C2=A0 =C2=A0 =C2=A0= |op invalid|target
invalid|state IDLE=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 : wait_one io_g= en: 4, ref_gen: 3, cycle 0
2026-01-02 22:35:43.863 UTC [8517] DEBUG:=C2=A0 wait_one with 0 sleeps
2026-01-02 22:35:43.863 UTC [8517] ERROR:=C2=A0 could not read blocks 0..0 = in
file "global/1262": Invalid argument
2026-01-02 22:35:44.057 UTC [8512] DEBUG:=C2=A0 assigned pm child slot 1 fo= r
backend
2026-01-02 22:35:44.058 UTC [8512] DEBUG:=C2=A0 forked new client backend,<= br> pid=3D8521 socket=3D151
2026-01-02 22:35:44.058 UTC [8521] DEBUG:=C2=A0 InitPostgres
2026-01-02 22:35:44.059 UTC [8521] DEBUG:=C2=A0 io 0=C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0|op invalid|target
invalid|state HANDED_OUT=C2=A0 =C2=A0 =C2=A0 : adding cb #1, id
2/aio_shared_buffer_readv_cb
2026-01-02 22:35:44.059 UTC [8521] DEBUG:=C2=A0 io 0=C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0|op invalid|target
smgr|state HANDED_OUT=C2=A0 =C2=A0 =C2=A0 : adding cb #2, id 1/aio_md_readv= _cb
2026-01-02 22:35:44.059 UTC [8521] DEBUG:=C2=A0 io 0=C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0|op readv|target
smgr|state DEFINED=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0: calling cb #1
2/aio_shared_buffer_readv_cb->stage(0)
2026-01-02 22:35:44.059 UTC [8521] DEBUG:=C2=A0 io 0=C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0|op readv|target
smgr|state STAGED=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 : staged (synchronous: = 0, in_batch: 1)
2026-01-02 22:35:44.059 UTC [8521] DEBUG:=C2=A0 io 0=C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0|op readv|target
smgr|state SUBMITTED=C2=A0 =C2=A0 =C2=A0 =C2=A0: wait_one io_gen: 1, ref_ge= n: 1, cycle 0
2026-01-02 22:35:44.059 UTC [8521] LOG:=C2=A0 could not read blocks 0..0 in= file
"global/1260": Invalid argument
2026-01-02 22:35:44.059 UTC [8521] DEBUG:=C2=A0 io 0=C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0|op readv|target
smgr|state COMPLETED_IO=C2=A0 =C2=A0 : after shared completion: distilled r= esult:
(status ERROR, id 1, error_data: 22, result 0), raw_result: -22
2026-01-02 22:35:44.059 UTC [8521] DEBUG:=C2=A0 io 0=C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0|op readv|target
smgr|state COMPLETED_SHARED: after local completion: result: (status ERROR,=
id 1, error_data 22, result 0), raw_result: -22
2026-01-02 22:35:44.059 UTC [8521] DEBUG:=C2=A0 drained 1/1, now expecting = 0
2026-01-02 22:35:44.059 UTC [8521] DEBUG:=C2=A0 io 0=C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0|op invalid|target
invalid|state IDLE=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 : wait_one io_g= en: 2, ref_gen: 1, cycle 0
2026-01-02 22:35:44.059 UTC [8521] DEBUG:=C2=A0 wait_one with 0 sleeps
2026-01-02 22:35:44.059 UTC [8521] FATAL:=C2=A0 could not read blocks 0..0 = in
file "global/1260": Invalid argument
2026-01-02 22:35:44.059 UTC [8521] DEBUG:=C2=A0 shmem_exit(1): 5
before_shmem_exit callbacks to make
2026-01-02 22:35:44.059 UTC [8521] DEBUG:=C2=A0 shmem_exit(1): 7 on_shmem_e= xit
callbacks to make
2026-01-02 22:35:44.059 UTC [8521] DEBUG:=C2=A0 proc_exit(1): 2 callbacks t= o make
2026-01-02 22:35:44.059 UTC [8521] DEBUG:=C2=A0 exit(1)
2026-01-02 22:35:44.059 UTC [8521] DEBUG:=C2=A0 shmem_exit(-1): 0
before_shmem_exit callbacks to make
2026-01-02 22:35:44.059 UTC [8521] DEBUG:=C2=A0 shmem_exit(-1): 0 on_shmem_= exit
callbacks to make
2026-01-02 22:35:44.059 UTC [8521] DEBUG:=C2=A0 proc_exit(-1): 0 callbacks = to
make
2026-01-02 22:35:44.060 UTC [8512] DEBUG:=C2=A0 releasing pm child slot 1 2026-01-02 22:35:44.060 UTC [8512] DEBUG:=C2=A0 client backend (PID 8521) e= xited
with exit code 1
2026-01-02 22:35:44.863 UTC [8517] DEBUG:=C2=A0 io 6400=C2=A0 =C2=A0 =C2=A0= |op invalid|target
invalid|state HANDED_OUT=C2=A0 =C2=A0 =C2=A0 : adding cb #1, id
2/aio_shared_buffer_readv_cb
2026-01-02 22:35:44.863 UTC [8517] DEBUG:=C2=A0 io 6400=C2=A0 =C2=A0 =C2=A0= |op invalid|target
smgr|state HANDED_OUT=C2=A0 =C2=A0 =C2=A0 : adding cb #2, id 1/aio_md_readv= _cb
2026-01-02 22:35:44.863 UTC [8517] DEBUG:=C2=A0 io 6400=C2=A0 =C2=A0 =C2=A0= |op readv|target
smgr|state DEFINED=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0: calling cb #1
2/aio_shared_buffer_readv_cb->stage(0)
2026-01-02 22:35:44.863 UTC [8517] DEBUG:=C2=A0 io 6400=C2=A0 =C2=A0 =C2=A0= |op readv|target
smgr|state STAGED=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 : staged (synchronous: = 0, in_batch: 1)
2026-01-02 22:35:44.863 UTC [8517] DEBUG:=C2=A0 io 6400=C2=A0 =C2=A0 =C2=A0= |op readv|target
smgr|state SUBMITTED=C2=A0 =C2=A0 =C2=A0 =C2=A0: wait_one io_gen: 4, ref_ge= n: 4, cycle 0
2026-01-02 22:35:44.863 UTC [8517] LOG:=C2=A0 could not read blocks 0..0 in= file
"global/1262": Invalid argument
2026-01-02 22:35:44.863 UTC [8517] DEBUG:=C2=A0 io 6400=C2=A0 =C2=A0 =C2=A0= |op readv|target
smgr|state COMPLETED_IO=C2=A0 =C2=A0 : after shared completion: distilled r= esult:
(status ERROR, id 1, error_data: 22, result 0), raw_result: -22
2026-01-02 22:35:44.863 UTC [8517] DEBUG:=C2=A0 io 6400=C2=A0 =C2=A0 =C2=A0= |op readv|target
smgr|state COMPLETED_SHARED: after local completion: result: (status ERROR,=
id 1, error_data 22, result 0), raw_result: -22
2026-01-02 22:35:44.863 UTC [8517] DEBUG:=C2=A0 drained 1/1, now expecting = 0
2026-01-02 22:35:44.863 UTC [8517] DEBUG:=C2=A0 io 6400=C2=A0 =C2=A0 =C2=A0= |op invalid|target
invalid|state IDLE=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 : wait_one io_g= en: 5, ref_gen: 4, cycle 0
2026-01-02 22:35:44.863 UTC [8517] DEBUG:=C2=A0 wait_one with 0 sleeps
2026-01-02 22:35:44.863 UTC [8517] ERROR:=C2=A0 could not read blocks 0..0 = in
file "global/1262": Invalid argument
```

--000000000000a06e910647d8a987--