io-uring-registered-buffers · shipping · also io_uring fixed buffers

io_uring registered buffers

io_uring registered buffers are application-memory regions registered with a ring and selected by index for supported fixed-buffer operations.

Related Observatory article: io_uring registered buffers on hesela.com

Registration: io_uring_register_buffers registers an iovec array for later fixed-buffer operations. Reusing those regions can avoid repeated mapping and page-reference work, notably with O_DIRECT I/O; registration does not itself open a file with O_DIRECT or guarantee a workload speedup. [1]

Selection: io_uring_prep_read_fixed uses buf_index to choose a registered region. The requested address and byte length must lie within that region; a subrange is allowed. This index is not a provided-buffer group ID or a selected buffer ID returned in CQE flags. [2] [3]

Completion: choosing registered memory does not establish that a read transferred every requested byte. Inspect the operation result and keep in-flight payload memory valid. Registration, request completion and the application's decision to reuse the payload are separate responsibilities. [2] [4]

Memory cost: the liburing 2.8 registration manual describes locked buffers charged against RLIMIT_MEMLOCK. Registering only part of a huge page still pins the whole huge page. Ring teardown can complete asynchronously, so closing the ring is not evidence that its pages were immediately unpinned. Size and measure the registered pool separately from each request's byte count. [5]

Relations

related
io_uring, io_uring provided buffers, io_uring completion queue entry, Direct I/O

Limitations

  • A fixed-buffer request must stay within its selected registered region; registration does not relax other I/O requirements. [2]
  • Registering a provided-buffer ring does not register its payloads for fixed-buffer I/O; a group ID is not a fixed-buffer index. [7, 1]

Citations

  1. liburing 2.8: registration and fixed-buffer mapping (accessed 2026-11-08)
  2. liburing 2.8: registered index and permitted subranges (accessed 2026-11-08)
  3. liburing 2.8: buffer groups and selected IDs (accessed 2026-11-08)
  4. liburing 2.8: io_uring(7), payload-buffer lifetime (accessed 2026-11-08)
  5. liburing 2.8: io_uring_register(2), locked memory and asynchronous teardown (accessed 2026-11-08)
  6. liburing 2.8: provided-buffer descriptor-ring registration (accessed 2026-11-08)

Further reading

  1. Hesela: fixed buffers and provided-buffer ownership (accessed 2026-11-08)
Sources & caveats
  • Primary documentation and pinned Linux v6.16 ABI review; no native kernel execution, performance benchmark or durability experiment.

JSON: /data/terms/io-uring-registered-buffers.json

Published by Hesela team · Updated

Report a correction · Editorial standards · Reuse guidance

Cite this page
Hesela team. io_uring registered buffers. Hesela. 2026-11-08. https://hesela.dev/terms/io-uring-registered-buffers/