@@ -328,34 +328,39 @@ pub fn immediate(pairs: anytype) aio.Error!u16 {
328
328
return num_errors ;
329
329
}
330
330
331
- const ProbeOpsBuffer = [@sizeOf (std .os .linux .io_uring_probe ) + 256 * @sizeOf (std .os .linux .io_uring_probe_op )]u8 ;
332
-
333
331
const ProbeOpsResult = struct {
334
332
last_op : IORING_OP ,
335
333
ops : []align (1 ) std.os.linux.io_uring_probe_op ,
336
334
};
337
335
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 {
339
349
var io = try uring_init (2 );
340
350
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 );
345
352
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 ] };
349
354
}
350
355
351
356
fn uring_is_supported (ops : []const IORING_OP ) bool {
352
- var buf : ProbeOpsBuffer = undefined ;
357
+ var buf = io_uring_probe . empty ;
353
358
const probe = uring_probe_ops (& buf ) catch return false ;
354
359
for (ops ) | op | {
355
360
const supported = blk : {
356
361
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 () ;
359
364
};
360
365
if (! supported ) {
361
366
log .warn ("unsupported OP: {s}" , .{@tagName (op )});
0 commit comments