Commit 1c48f7ab authored by Yaxiong Tian's avatar Yaxiong Tian Committed by Steven Rostedt (Google)
Browse files

tracing: Rename `eval_map_wq` and allow other parts of tracing use it

The eval_map_work_func() function, though queued in eval_map_wq,
holds the trace_event_sem read-write lock for a long time during
kernel boot. This causes blocking issues for other functions.

Rename eval_map_wq to trace_init_wq and make it global, thereby
allowing other parts of tracing to schedule work on this queue
asynchronously and avoiding blockage of the main boot thread.

Link: https://patch.msgid.link/20260204015344.162818-1-tianyaxiong@kylinos.cn


Suggested-by: default avatarSteven Rostedt <rostedt@goodmis.org>
Acked-by: default avatarMasami Hiramatsu (Google) <mhiramat@kernel.org>
Signed-off-by: default avatarYaxiong Tian <tianyaxiong@kylinos.cn>
Signed-off-by: default avatarSteven Rostedt (Google) <rostedt@goodmis.org>
parent 02b75ece
Loading
Loading
Loading
Loading
+9 −9
Original line number Diff line number Diff line
@@ -10785,7 +10785,7 @@ int tracing_init_dentry(void)
extern struct trace_eval_map *__start_ftrace_eval_maps[];
extern struct trace_eval_map *__stop_ftrace_eval_maps[];

static struct workqueue_struct *eval_map_wq __initdata;
struct workqueue_struct *trace_init_wq __initdata;
static struct work_struct eval_map_work __initdata;
static struct work_struct tracerfs_init_work __initdata;

@@ -10801,15 +10801,15 @@ static int __init trace_eval_init(void)
{
	INIT_WORK(&eval_map_work, eval_map_work_func);

	eval_map_wq = alloc_workqueue("eval_map_wq", WQ_UNBOUND, 0);
	if (!eval_map_wq) {
		pr_err("Unable to allocate eval_map_wq\n");
	trace_init_wq = alloc_workqueue("trace_init_wq", WQ_UNBOUND, 0);
	if (!trace_init_wq) {
		pr_err("Unable to allocate trace_init_wq\n");
		/* Do work here */
		eval_map_work_func(&eval_map_work);
		return -ENOMEM;
	}

	queue_work(eval_map_wq, &eval_map_work);
	queue_work(trace_init_wq, &eval_map_work);
	return 0;
}

@@ -10818,8 +10818,8 @@ subsys_initcall(trace_eval_init);
static int __init trace_eval_sync(void)
{
	/* Make sure the eval map updates are finished */
	if (eval_map_wq)
		destroy_workqueue(eval_map_wq);
	if (trace_init_wq)
		destroy_workqueue(trace_init_wq);
	return 0;
}

@@ -10980,9 +10980,9 @@ static __init int tracer_init_tracefs(void)
	if (ret)
		return 0;

	if (eval_map_wq) {
	if (trace_init_wq) {
		INIT_WORK(&tracerfs_init_work, tracer_init_tracefs_work_func);
		queue_work(eval_map_wq, &tracerfs_init_work);
		queue_work(trace_init_wq, &tracerfs_init_work);
	} else {
		tracer_init_tracefs_work_func(NULL);
	}
+1 −0
Original line number Diff line number Diff line
@@ -769,6 +769,7 @@ extern cpumask_var_t __read_mostly tracing_buffer_mask;
extern unsigned long nsecs_to_usecs(unsigned long nsecs);

extern unsigned long tracing_thresh;
extern struct workqueue_struct *trace_init_wq __initdata;

/* PID filtering */