Skip to content

Commit d46e012

Browse files
committed
IoUring: refactor probing code
1 parent cd846ed commit d46e012

File tree

1 file changed

+18
-13
lines changed

1 file changed

+18
-13
lines changed

src/aio/IoUring.zig

Lines changed: 18 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -328,34 +328,39 @@ pub fn immediate(pairs: anytype) aio.Error!u16 {
328328
return num_errors;
329329
}
330330

331-
const ProbeOpsBuffer = [@sizeOf(std.os.linux.io_uring_probe) + 256 * @sizeOf(std.os.linux.io_uring_probe_op)]u8;
332-
333331
const ProbeOpsResult = struct {
334332
last_op: IORING_OP,
335333
ops: []align(1) std.os.linux.io_uring_probe_op,
336334
};
337335

338-
fn uring_probe_ops(mem: *ProbeOpsBuffer) !ProbeOpsResult {
336+
const io_uring_probe = extern struct {
337+
/// Last opcode supported
338+
last_op: IORING_OP,
339+
/// Length of ops[] array below
340+
ops_len: u8,
341+
resv: u16,
342+
resv2: [3]u32,
343+
ops: [256]std.os.linux.io_uring_probe_op,
344+
345+
const empty = std.mem.zeroInit(@This(), .{});
346+
};
347+
348+
fn uring_probe_ops(probe: *io_uring_probe) !ProbeOpsResult {
339349
var io = try uring_init(2);
340350
defer io.deinit();
341-
var fba = std.heap.FixedBufferAllocator.init(mem);
342-
var pbuf = fba.allocator().alloc(u8, @sizeOf(std.os.linux.io_uring_probe) + 256 * @sizeOf(std.os.linux.io_uring_probe_op)) catch unreachable;
343-
@memset(pbuf, 0);
344-
const res = std.os.linux.io_uring_register(io.fd, .REGISTER_PROBE, pbuf.ptr, 256);
351+
const res = std.os.linux.io_uring_register(io.fd, .REGISTER_PROBE, probe, probe.ops.len);
345352
if (std.os.linux.E.init(res) != .SUCCESS) return error.Unexpected;
346-
const probe = std.mem.bytesAsValue(std.os.linux.io_uring_probe, pbuf[0..@sizeOf(std.os.linux.io_uring_probe)]);
347-
const ops = std.mem.bytesAsSlice(std.os.linux.io_uring_probe_op, pbuf[@sizeOf(std.os.linux.io_uring_probe)..]);
348-
return .{ .last_op = .fromStd(probe.last_op), .ops = ops[0..probe.ops_len] };
353+
return .{ .last_op = probe.last_op, .ops = probe.ops[0..probe.ops_len] };
349354
}
350355

351356
fn uring_is_supported(ops: []const IORING_OP) bool {
352-
var buf: ProbeOpsBuffer = undefined;
357+
var buf = io_uring_probe.empty;
353358
const probe = uring_probe_ops(&buf) catch return false;
354359
for (ops) |op| {
355360
const supported = blk: {
356361
if (@intFromEnum(op) > @intFromEnum(probe.last_op)) break :blk false;
357-
if (probe.ops[@intFromEnum(op)].flags & std.os.linux.IO_URING_OP_SUPPORTED == 0) break :blk false;
358-
break :blk true;
362+
if (@intFromEnum(op) > probe.ops.len) break :blk false;
363+
break :blk probe.ops[@intFromEnum(op)].is_supported();
359364
};
360365
if (!supported) {
361366
log.warn("unsupported OP: {s}", .{@tagName(op)});

0 commit comments

Comments
 (0)