From nobody Sun Sep 22 07:39:18 2024 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id E7E97C433F5 for ; Fri, 11 Mar 2022 11:27:11 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1348229AbiCKL2N (ORCPT ); Fri, 11 Mar 2022 06:28:13 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:40374 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S244539AbiCKL2K (ORCPT ); Fri, 11 Mar 2022 06:28:10 -0500 Received: from mailgw01.mediatek.com (unknown [60.244.123.138]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 3BE751B71AC for ; Fri, 11 Mar 2022 03:27:07 -0800 (PST) X-UUID: efc33294d8ba406990cda7df0c0a72b7-20220311 X-UUID: efc33294d8ba406990cda7df0c0a72b7-20220311 Received: from mtkcas10.mediatek.inc [(172.21.101.39)] by mailgw01.mediatek.com (envelope-from ) (Generic MTA with TLSv1.2 ECDHE-RSA-AES256-SHA384 256/256) with ESMTP id 1195719023; Fri, 11 Mar 2022 19:26:59 +0800 Received: from mtkexhb01.mediatek.inc (172.21.101.102) by mtkmbs07n2.mediatek.inc (172.21.101.141) with Microsoft SMTP Server (TLS) id 15.0.1497.2; Fri, 11 Mar 2022 19:26:59 +0800 Received: from mtkcas11.mediatek.inc (172.21.101.40) by mtkexhb01.mediatek.inc (172.21.101.102) with Microsoft SMTP Server (TLS) id 15.0.1497.2; Fri, 11 Mar 2022 19:26:59 +0800 Received: from mtksdccf07.mediatek.inc (172.21.84.99) by mtkcas11.mediatek.inc (172.21.101.73) with Microsoft SMTP Server id 15.0.1497.2 via Frontend Transport; Fri, 11 Mar 2022 19:26:59 +0800 From: Mark-PK Tsai To: , CC: , , , , , Subject: [PATCH] tracing: make tracer_init_tracefs initcall asynchronous Date: Fri, 11 Mar 2022 19:26:56 +0800 Message-ID: <20220311112656.25348-1-mark-pk.tsai@mediatek.com> X-Mailer: git-send-email 2.18.0 MIME-Version: 1.0 X-MTK: N Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" tracer_init_tracefs() is slow especially when there are lots of trace events. Create a kthread to do tracer_init_tracefs() asynchronously to speed up the initialization of kernel and move the related functions and variables out of init section. Signed-off-by: Mark-PK Tsai Reported-by: kernel test robot Reported-by: kernel test robot --- fs/tracefs/inode.c | 8 ++++---- kernel/trace/ftrace.c | 12 ++++++------ kernel/trace/trace.c | 21 ++++++++++++++++----- kernel/trace/trace_events.c | 2 +- 4 files changed, 27 insertions(+), 16 deletions(-) diff --git a/fs/tracefs/inode.c b/fs/tracefs/inode.c index de7252715b12..9a713d6bcb7e 100644 --- a/fs/tracefs/inode.c +++ b/fs/tracefs/inode.c @@ -561,10 +561,10 @@ struct dentry *tracefs_create_dir(const char *name, s= truct dentry *parent) * * Returns the dentry of the instances directory. */ -__init struct dentry *tracefs_create_instance_dir(const char *name, - struct dentry *parent, - int (*mkdir)(const char *name), - int (*rmdir)(const char *name)) +struct dentry *tracefs_create_instance_dir(const char *name, + struct dentry *parent, + int (*mkdir)(const char *name), + int (*rmdir)(const char *name)) { struct dentry *dentry; =20 diff --git a/kernel/trace/ftrace.c b/kernel/trace/ftrace.c index a4b462b6f944..197630cbd5dd 100644 --- a/kernel/trace/ftrace.c +++ b/kernel/trace/ftrace.c @@ -940,7 +940,7 @@ static const struct file_operations ftrace_profile_fops= =3D { }; =20 /* used to initialize the real stat files */ -static struct tracer_stat function_stats __initdata =3D { +static struct tracer_stat function_stats =3D { .name =3D "functions", .stat_start =3D function_stat_start, .stat_next =3D function_stat_next, @@ -949,7 +949,7 @@ static struct tracer_stat function_stats __initdata =3D= { .stat_show =3D function_stat_show }; =20 -static __init void ftrace_profile_tracefs(struct dentry *d_tracer) +static void ftrace_profile_tracefs(struct dentry *d_tracer) { struct ftrace_profile_stat *stat; struct dentry *entry; @@ -991,7 +991,7 @@ static __init void ftrace_profile_tracefs(struct dentry= *d_tracer) } =20 #else /* CONFIG_FUNCTION_PROFILER */ -static __init void ftrace_profile_tracefs(struct dentry *d_tracer) +static void ftrace_profile_tracefs(struct dentry *d_tracer) { } #endif /* CONFIG_FUNCTION_PROFILER */ @@ -6359,7 +6359,7 @@ void ftrace_destroy_filter_files(struct ftrace_ops *o= ps) mutex_unlock(&ftrace_lock); } =20 -static __init int ftrace_init_dyn_tracefs(struct dentry *d_tracer) +static int ftrace_init_dyn_tracefs(struct dentry *d_tracer) { =20 trace_create_file("available_filter_functions", TRACE_MODE_READ, @@ -7754,8 +7754,8 @@ void ftrace_init_tracefs(struct trace_array *tr, stru= ct dentry *d_tracer) d_tracer, tr, &ftrace_no_pid_fops); } =20 -void __init ftrace_init_tracefs_toplevel(struct trace_array *tr, - struct dentry *d_tracer) +void ftrace_init_tracefs_toplevel(struct trace_array *tr, + struct dentry *d_tracer) { /* Only the top level directory has the dyn_tracefs and profile */ WARN_ON(!(tr->flags & TRACE_ARRAY_FL_GLOBAL)); diff --git a/kernel/trace/trace.c b/kernel/trace/trace.c index eb44418574f9..f55da82060e2 100644 --- a/kernel/trace/trace.c +++ b/kernel/trace/trace.c @@ -9562,10 +9562,10 @@ int tracing_init_dentry(void) extern struct trace_eval_map *__start_ftrace_eval_maps[]; extern struct trace_eval_map *__stop_ftrace_eval_maps[]; =20 -static struct workqueue_struct *eval_map_wq __initdata; -static struct work_struct eval_map_work __initdata; +static struct workqueue_struct *eval_map_wq; +static struct work_struct eval_map_work; =20 -static void __init eval_map_work_func(struct work_struct *work) +static void eval_map_work_func(struct work_struct *work) { int len; =20 @@ -9573,7 +9573,7 @@ static void __init eval_map_work_func(struct work_str= uct *work) trace_insert_eval_map(NULL, __start_ftrace_eval_maps, len); } =20 -static int __init trace_eval_init(void) +static int trace_eval_init(void) { INIT_WORK(&eval_map_work, eval_map_work_func); =20 @@ -9671,7 +9671,7 @@ static struct notifier_block trace_module_nb =3D { }; #endif /* CONFIG_MODULES */ =20 -static __init int tracer_init_tracefs(void) +static int tracefs_init(void *data) { int ret; =20 @@ -9721,6 +9721,17 @@ static __init int tracer_init_tracefs(void) return 0; } =20 +static __init int tracer_init_tracefs(void) +{ + struct task_struct *thread; + + thread =3D kthread_run(tracefs_init, NULL, "tracefs_init"); + if (IS_ERR(thread)) + return PTR_ERR(thread); + + return 0; +} + fs_initcall(tracer_init_tracefs); =20 static int trace_panic_handler(struct notifier_block *this, diff --git a/kernel/trace/trace_events.c b/kernel/trace/trace_events.c index 3147614c1812..fe055bef1e8f 100644 --- a/kernel/trace/trace_events.c +++ b/kernel/trace/trace_events.c @@ -3687,7 +3687,7 @@ static __init int event_trace_init_fields(void) return 0; } =20 -__init int event_trace_init(void) +int event_trace_init(void) { struct trace_array *tr; struct dentry *entry; --=20 2.18.0