Re: [PATCH v4 5/5] blktrace: Make init_blk_tracer() asynchronous when trace_async_init set
From: Steven Rostedt <rostedt@goodmis.org>
Date: 2026-01-29 00:40:58
Also in:
linux-block, linux-doc, lkml
Jens, Can you give me an acked-by on this patch and I can take the series through my tree. Or perhaps this doesn't even need to test the trace_async_init flag and can always do the work queue? Does blk_trace ever do tracing at boot up? That is, before user space starts? Thanks, -- Steve On Wed, 28 Jan 2026 20:55:54 +0800 Yaxiong Tian [off-list ref] wrote:
quoted hunk ↗ jump to hunk
The init_blk_tracer() function causes significant boot delay as it waits for the trace_event_sem lock held by trace_event_update_all(). Specifically, its child function register_trace_event() requires this lock, which is occupied for an extended period during boot. To resolve this, when the trace_async_init parameter is enabled, the execution of primary init_blk_tracer() is moved to the trace_init_wq workqueue, allowing it to run asynchronously. and prevent blocking the main boot thread. Signed-off-by: Yaxiong Tian <redacted> --- kernel/trace/blktrace.c | 23 ++++++++++++++++++++++- 1 file changed, 22 insertions(+), 1 deletion(-)diff --git a/kernel/trace/blktrace.c b/kernel/trace/blktrace.c index d031c8d80be4..56c7270ec447 100644 --- a/kernel/trace/blktrace.c +++ b/kernel/trace/blktrace.c@@ -1832,7 +1832,9 @@ static struct trace_event trace_blk_event = { .funcs = &trace_blk_event_funcs, }; -static int __init init_blk_tracer(void) +static struct work_struct blktrace_works __initdata; + +static int __init __init_blk_tracer(void) { if (!register_trace_event(&trace_blk_event)) { pr_warn("Warning: could not register block events\n");@@ -1852,6 +1854,25 @@ static int __init init_blk_tracer(void) return 0; } +static void __init blktrace_works_func(struct work_struct *work) +{ + __init_blk_tracer(); +} + +static int __init init_blk_tracer(void) +{ + int ret = 0; + + if (trace_init_wq && trace_async_init) { + INIT_WORK(&blktrace_works, blktrace_works_func); + queue_work(trace_init_wq, &blktrace_works); + } else { + ret = __init_blk_tracer(); + } + + return ret; +} + device_initcall(init_blk_tracer); static int blk_trace_remove_queue(struct request_queue *q)