From 25195ba1e77df8297b3361b275f5e4430e2729d8 Mon Sep 17 00:00:00 2001 From: Willy Tarreau Date: Tue, 9 Sep 2025 07:26:55 +0200 Subject: [PATCH] MINOR: debug: report the time since last wakeup and call When task profiling is enabled, the current thread knows when the currently running task was woken up and called, so we can calculate how long ago it was woken up and called. This is convenient to figure whether or not a warning or panic is caused by this task or by a previous one, so let's report this info in thread outputs when known. It would be useful to backport this to 3.2. --- src/debug.c | 12 ++++++++++++ src/task.c | 1 + 2 files changed, 13 insertions(+) diff --git a/src/debug.c b/src/debug.c index 19acb0ed1..381831c9d 100644 --- a/src/debug.c +++ b/src/debug.c @@ -352,6 +352,18 @@ void ha_thread_dump_one(struct buffer *buf, int is_caller) chunk_appendf(buf, "\n"); chunk_appendf(buf, " cpu_ns: poll=%llu now=%llu diff=%llu\n", p, n, n-p); + /* also try to indicate for how long we've entered the current task. + * Note that the task's wake date only contains the 32 lower bits of + * the current time. + */ + if (th_ctx->current && tick_isset(th_ctx->sched_wake_date)) { + unsigned long long now = now_mono_time(); + + chunk_appendf(buf, " current call: wake=%u ns ago, call=%llu ns ago\n", + (uint)(now - th_ctx->sched_wake_date), + (now - th_ctx->sched_call_date)); + } + /* this is the end of what we can dump from outside the current thread */ chunk_appendf(buf, " curr_task="); diff --git a/src/task.c b/src/task.c index 11b5e635e..72be355f0 100644 --- a/src/task.c +++ b/src/task.c @@ -682,6 +682,7 @@ unsigned int run_tasks_from_lists(unsigned int budgets[]) HA_ATOMIC_ADD(&profile_entry->cpu_time, (uint32_t)(now_mono_time() - th_ctx->sched_call_date)); } th_ctx->current_queue = -1; + th_ctx->sched_wake_date = TICK_ETERNITY; return done; }