| ... | @@ -1613,7 +1613,7 @@ pub const BufferGroup = struct { | ... | @@ -1613,7 +1613,7 @@ pub const BufferGroup = struct { |
| 1613 | const heads = try allocator.alloc(u32, buffers_count); | 1613 | const heads = try allocator.alloc(u32, buffers_count); |
| 1614 | errdefer allocator.free(heads); | 1614 | errdefer allocator.free(heads); |
| 1615 | | 1615 | |
| 1616 | const br = try setup_buf_ring(ring.fd, buffers_count, group_id, linux.io_uring_buf_reg.FLAG.INC); | 1616 | const br = try setup_buf_ring(ring.fd, buffers_count, group_id, .{ .inc = true }); |
| 1617 | buf_ring_init(br); | 1617 | buf_ring_init(br); |
| 1618 | | 1618 | |
| 1619 | const mask = buf_ring_mask(buffers_count); | 1619 | const mask = buf_ring_mask(buffers_count); |
| ... | @@ -1698,7 +1698,12 @@ pub const BufferGroup = struct { | ... | @@ -1698,7 +1698,12 @@ pub const BufferGroup = struct { |
| 1698 | /// `fd` is IO_Uring.fd for which the provided buffer ring is being registered. | 1698 | /// `fd` is IO_Uring.fd for which the provided buffer ring is being registered. |
| 1699 | /// `entries` is the number of entries requested in the buffer ring, must be power of 2. | 1699 | /// `entries` is the number of entries requested in the buffer ring, must be power of 2. |
| 1700 | /// `group_id` is the chosen buffer group ID, unique in IO_Uring. | 1700 | /// `group_id` is the chosen buffer group ID, unique in IO_Uring. |
| 1701 | pub fn setup_buf_ring(fd: posix.fd_t, entries: u16, group_id: u16, flags: u16) !*align(page_size_min) linux.io_uring_buf_ring { | 1701 | pub fn setup_buf_ring( |
| | 1702 | fd: posix.fd_t, |
| | 1703 | entries: u16, |
| | 1704 | group_id: u16, |
| | 1705 | flags: linux.io_uring_buf_reg.Flags, |
| | 1706 | ) !*align(page_size_min) linux.io_uring_buf_ring { |
| 1702 | if (entries == 0 or entries > 1 << 15) return error.EntriesNotInRange; | 1707 | if (entries == 0 or entries > 1 << 15) return error.EntriesNotInRange; |
| 1703 | if (!std.math.isPowerOfTwo(entries)) return error.EntriesNotPowerOfTwo; | 1708 | if (!std.math.isPowerOfTwo(entries)) return error.EntriesNotPowerOfTwo; |
| 1704 | | 1709 | |
| ... | @@ -1719,7 +1724,13 @@ pub fn setup_buf_ring(fd: posix.fd_t, entries: u16, group_id: u16, flags: u16) ! | ... | @@ -1719,7 +1724,13 @@ pub fn setup_buf_ring(fd: posix.fd_t, entries: u16, group_id: u16, flags: u16) ! |
| 1719 | return br; | 1724 | return br; |
| 1720 | } | 1725 | } |
| 1721 | | 1726 | |
| 1722 | fn register_buf_ring(fd: posix.fd_t, addr: u64, entries: u32, group_id: u16, flags: u16) !void { | 1727 | fn register_buf_ring( |
| | 1728 | fd: posix.fd_t, |
| | 1729 | addr: u64, |
| | 1730 | entries: u32, |
| | 1731 | group_id: u16, |
| | 1732 | flags: linux.io_uring_buf_reg.Flags, |
| | 1733 | ) !void { |
| 1723 | var reg = mem.zeroInit(linux.io_uring_buf_reg, .{ | 1734 | var reg = mem.zeroInit(linux.io_uring_buf_reg, .{ |
| 1724 | .ring_addr = addr, | 1735 | .ring_addr = addr, |
| 1725 | .ring_entries = entries, | 1736 | .ring_entries = entries, |
| ... | @@ -1727,10 +1738,10 @@ fn register_buf_ring(fd: posix.fd_t, addr: u64, entries: u32, group_id: u16, fla | ... | @@ -1727,10 +1738,10 @@ fn register_buf_ring(fd: posix.fd_t, addr: u64, entries: u32, group_id: u16, fla |
| 1727 | .flags = flags, | 1738 | .flags = flags, |
| 1728 | }); | 1739 | }); |
| 1729 | var res = linux.io_uring_register(fd, .REGISTER_PBUF_RING, @as(*const anyopaque, @ptrCast(&reg)), 1); | 1740 | var res = linux.io_uring_register(fd, .REGISTER_PBUF_RING, @as(*const anyopaque, @ptrCast(&reg)), 1); |
| 1730 | if (linux.E.init(res) == .INVAL and reg.flags & linux.io_uring_buf_reg.FLAG.INC > 0) { | 1741 | if (linux.E.init(res) == .INVAL and reg.flags.inc) { |
| 1731 | // Retry without incremental buffer consumption. | 1742 | // Retry without incremental buffer consumption. |
| 1732 | // It is available since kernel 6.12. returns INVAL on older. | 1743 | // It is available since kernel 6.12. returns INVAL on older. |
| 1733 | reg.flags &= ~linux.io_uring_buf_reg.FLAG.INC; | 1744 | reg.flags.inc = false; |
| 1734 | res = linux.io_uring_register(fd, .REGISTER_PBUF_RING, @as(*const anyopaque, @ptrCast(&reg)), 1); | 1745 | res = linux.io_uring_register(fd, .REGISTER_PBUF_RING, @as(*const anyopaque, @ptrCast(&reg)), 1); |
| 1735 | } | 1746 | } |
| 1736 | try handle_register_buf_ring_result(res); | 1747 | try handle_register_buf_ring_result(res); |