diff --git a/src/ex/console.zig b/src/ex/console.zig index 8dcc739..8adf4b0 100644 --- a/src/ex/console.zig +++ b/src/ex/console.zig @@ -87,7 +87,7 @@ fn drain_from_all(seq: usize) usize { fn worker(_: ?*anyopaque) void { while (true) { - _ = ke.wait.wait_one(&ke.log.event.hdr, .{}) catch unreachable; + _ = ke.wait.wait_one(&ke.log.event.hdr, "console_worker", .{}) catch unreachable; ke.log.event.reset(); last_seq = drain_from_all(last_seq); diff --git a/src/ex/work.zig b/src/ex/work.zig index b6c9f99..94b04f9 100644 --- a/src/ex/work.zig +++ b/src/ex/work.zig @@ -257,7 +257,7 @@ pub fn enqueue(item: *WorkItem) void { fn pool_manager(_: ?*anyopaque) void { while (true) { - _ = ke.wait.wait_one(&pool_manager_event.hdr, .{}) catch unreachable; + _ = ke.wait.wait_one(&pool_manager_event.hdr, "work_pool_manager", .{}) catch unreachable; // We have been signaled, go through every pool and grow it if needed. // Failure to grow is ignored, it is only a latency problem and should be fixed diff --git a/src/kern/queue.zig b/src/kern/queue.zig index 1360cd5..a185dcc 100644 --- a/src/kern/queue.zig +++ b/src/kern/queue.zig @@ -75,7 +75,9 @@ pub const Queue = struct { self.hdr.lock.release(ipl); // Wait until the queue has something for us. - _ = try ke.wait.wait_one(&self.hdr, .{ .timeout = timeout }); + _ = try ke.wait.wait_one(&self.hdr, "queue", .{ + .timeout = timeout, + }); // Grab the queue item and set it to null. const ret = td.queue_item orelse unreachable; diff --git a/src/kern/thread.zig b/src/kern/thread.zig index 28cf897..6d06752 100644 --- a/src/kern/thread.zig +++ b/src/kern/thread.zig @@ -99,6 +99,8 @@ pub const Thread = struct { /// Current wait status. wait_status: std.atomic.Value(ki.wait.Status), waitblocks: [4]ki.wait.WaitBlock, + /// Reason for the wait, if any. + wait_reason: ?[]const u8, /// Timer used for timeouts. timer: ke.Timer, /// Turnstile. @@ -146,6 +148,7 @@ pub const Thread = struct { .runq_idx = 0, .wait_status = .init(.Satisfied), .waitblocks = undefined, + .wait_reason = null, .timer = undefined, .turnstile = undefined, .turnstile_waiter = null, diff --git a/src/kern/turnstile.zig b/src/kern/turnstile.zig index 1ab86cb..6fc8700 100644 --- a/src/kern/turnstile.zig +++ b/src/kern/turnstile.zig @@ -441,7 +441,7 @@ pub fn block(turnstile: ?*Turnstile, obj: *anyopaque, own: Ownership, queue: Que // Now block on the event. _ = ke.ipl.lower(.Passive); - _ = ke.wait.wait_one(&waiter.event.hdr, .{}) catch unreachable; + _ = ke.wait.wait_one(&waiter.event.hdr, "turnstile:waiter", .{}) catch unreachable; _ = ke.ipl.raise(ipl); } diff --git a/src/kern/wait.zig b/src/kern/wait.zig index 0a6a3b8..9089b6a 100644 --- a/src/kern/wait.zig +++ b/src/kern/wait.zig @@ -105,9 +105,9 @@ const Options = struct { /// Wait for the provided object to be signaled. /// This will only return an error if `timeout` is provided and /// the wait times out. -pub fn wait_one(object: *DispatchHeader, opts: Options) !usize { +pub fn wait_one(object: *DispatchHeader, reason: []const u8, opts: Options) !usize { var objects = [_]*DispatchHeader{object}; - return wait_any(&objects, opts); + return wait_any(&objects, reason, opts); } /// Wait for any of the provided objects to be signaled. @@ -116,7 +116,7 @@ pub fn wait_one(object: *DispatchHeader, opts: Options) !usize { /// If `timeout` is not provided, it will wait indefinitely. /// If `waitblocks` is specified, then the wait will use those waitblocks for the operation. /// Note that if `timeout` is provided, then one additional waitblock must be allocated. -pub fn wait_any(objects: []*DispatchHeader, opts: Options) !usize { +pub fn wait_any(objects: []*DispatchHeader, reason: []const u8, opts: Options) !usize { const ipl = ke.ipl.raise(.Dispatch); defer ke.ipl.lower(ipl); const curtd = ki.sched.percpu.local().current_thread.?; @@ -206,6 +206,7 @@ pub fn wait_any(objects: []*DispatchHeader, opts: Options) !usize { } } + curtd.wait_reason = reason; // We're good, now actually block. ki.sched.block_locked(curtd); } else { @@ -221,6 +222,8 @@ pub fn wait_any(objects: []*DispatchHeader, opts: Options) !usize { ke.timer.cancel(timer); } + curtd.wait_reason = null; + // Find the object that satisfied us. for (0..total_count) |i| { const is_timer = has_timeout and i == timer_i; diff --git a/src/mm/phys.zig b/src/mm/phys.zig index ef4937a..6e9580e 100644 --- a/src/mm/phys.zig +++ b/src/mm/phys.zig @@ -47,7 +47,7 @@ fn wait_for_pages(old_ipl: ke.Ipl) void { list_lock.release(ipl); - _ = ke.wait.wait_one(&free_page_event.hdr, .{}) catch unreachable; + _ = ke.wait.wait_one(&free_page_event.hdr, "wait_for_pages", .{}) catch unreachable; ipl = list_lock.acquire(); cnt = free_pages; diff --git a/src/tests/fireworks.zig b/src/tests/fireworks.zig index f4bdc9e..075fe97 100644 --- a/src/tests/fireworks.zig +++ b/src/tests/fireworks.zig @@ -101,7 +101,7 @@ fn perform_delay(ms: usize) void { var timer: ke.Timer = undefined; timer.init(); ke.timer.set(&timer, std.time.ns_per_ms * ms, .{}); - _ = ke.wait.wait_one(&timer.hdr, .{}) catch unreachable; + _ = ke.wait.wait_one(&timer.hdr, "sleep", .{}) catch unreachable; } fn particle(param: ?*anyopaque) void { diff --git a/src/tests/mutex.zig b/src/tests/mutex.zig index c424e76..16f2a1b 100644 --- a/src/tests/mutex.zig +++ b/src/tests/mutex.zig @@ -35,7 +35,7 @@ fn delay_ms(ms: usize) void { var timer: ke.Timer = undefined; timer.init(); ke.timer.set(&timer, std.time.ns_per_ms * ms, .{}); - _ = ke.wait.wait_one(&timer.hdr, .{}) catch unreachable; + _ = ke.wait.wait_one(&timer.hdr, "sleep", .{}) catch unreachable; } fn worker(param: ?*anyopaque) void { diff --git a/src/tests/smr.zig b/src/tests/smr.zig index f33ccc0..fb2b413 100644 --- a/src/tests/smr.zig +++ b/src/tests/smr.zig @@ -42,7 +42,7 @@ fn delay_ms(ms: usize) void { var timer: ke.Timer = undefined; timer.init(); ke.timer.set(&timer, std.time.ns_per_ms * ms, .{}); - _ = ke.wait.wait_one(&timer.hdr, .{}) catch unreachable; + _ = ke.wait.wait_one(&timer.hdr, "sleep", .{}) catch unreachable; } fn reader(param: ?*anyopaque) void { diff --git a/src/tests/smr_pi.zig b/src/tests/smr_pi.zig index 3543d2a..98ef543 100644 --- a/src/tests/smr_pi.zig +++ b/src/tests/smr_pi.zig @@ -64,7 +64,7 @@ fn delay_ms(ms: usize) void { var timer: ke.Timer = undefined; timer.init(); ke.timer.set(&timer, std.time.ns_per_ms * ms, .{}); - _ = ke.wait.wait_one(&timer.hdr, .{}) catch unreachable; + _ = ke.wait.wait_one(&timer.hdr, "sleep", .{}) catch unreachable; } /// Park here while the checker is verifying quiescence. Only ever called diff --git a/src/tests/turnstile.zig b/src/tests/turnstile.zig index 3d02f94..aa4cea9 100644 --- a/src/tests/turnstile.zig +++ b/src/tests/turnstile.zig @@ -46,7 +46,7 @@ fn delay_ms(ms: usize) void { var timer: ke.Timer = undefined; timer.init(); ke.timer.set(&timer, std.time.ns_per_ms * ms, .{}); - _ = ke.wait.wait_one(&timer.hdr, .{}) catch unreachable; + _ = ke.wait.wait_one(&timer.hdr, "sleep", .{}) catch unreachable; } fn wait_flag(flag: *std.atomic.Value(bool)) void {