linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH v4] trace: Move trace event enable from fs_initcall to core_initcall
@ 2012-09-12 14:47 Ezequiel Garcia
  2012-09-24 17:23 ` Ezequiel Garcia
  2012-09-27  5:49 ` [tip:perf/core] " tip-bot for Ezequiel Garcia
  0 siblings, 2 replies; 6+ messages in thread
From: Ezequiel Garcia @ 2012-09-12 14:47 UTC (permalink / raw)
  To: Steven Rostedt, linux-kernel
  Cc: Tim Bird, Pekka Enberg, Ingo Molnar, Ezequiel Garcia

This patch splits trace event initialization in two stages:
 * ftrace enable
 * sysfs event entry creation

This allows to capture trace events from an earlier point
by using 'trace_event' kernel parameter and is important
to trace boot-up allocations.

Note that, in order to enable events at core_initcall,
it's necessary to move init_ftrace_syscalls() from
core_initcall to early_initcall.

Cc: Steven Rostedt <rostedt@goodmis.org>
Signed-off-by: Ezequiel Garcia <elezegarcia@gmail.com>
---
Changes from v1:
  * Rework code as requested by Steven.

Changes from v2:
   * Move init_ftrace_syscalls() to early_initcall,
     so syscalls self-test pass.

Changes from v3:
   * Fix issue reported by Steven:
     event_trace_init() now iterates on added events (instead of full array).
     This way we don't create an event dir for events that failed to enable.

 kernel/trace/trace_events.c   |  108 +++++++++++++++++++++++++++--------------
 kernel/trace/trace_syscalls.c |    2 +-
 2 files changed, 73 insertions(+), 37 deletions(-)

diff --git a/kernel/trace/trace_events.c b/kernel/trace/trace_events.c
index 29111da..437202d 100644
--- a/kernel/trace/trace_events.c
+++ b/kernel/trace/trace_events.c
@@ -1199,6 +1199,31 @@ event_create_dir(struct ftrace_event_call *call, struct dentry *d_events,
 	return 0;
 }
 
+static void event_remove(struct ftrace_event_call *call)
+{
+	ftrace_event_enable_disable(call, 0);
+	if (call->event.funcs)
+		__unregister_ftrace_event(&call->event);
+	list_del(&call->list);
+}
+
+static int event_init(struct ftrace_event_call *call)
+{
+	int ret = 0;
+
+	if (WARN_ON(!call->name))
+		return -EINVAL;
+
+	if (call->class->raw_init) {
+		ret = call->class->raw_init(call);
+		if (ret < 0 && ret != -ENOSYS)
+			pr_warn("Could not initialize trace events/%s\n",
+				call->name);
+	}
+
+	return ret;
+}
+
 static int
 __trace_add_event_call(struct ftrace_event_call *call, struct module *mod,
 		       const struct file_operations *id,
@@ -1209,19 +1234,9 @@ __trace_add_event_call(struct ftrace_event_call *call, struct module *mod,
 	struct dentry *d_events;
 	int ret;
 
-	/* The linker may leave blanks */
-	if (!call->name)
-		return -EINVAL;
-
-	if (call->class->raw_init) {
-		ret = call->class->raw_init(call);
-		if (ret < 0) {
-			if (ret != -ENOSYS)
-				pr_warning("Could not initialize trace events/%s\n",
-					   call->name);
-			return ret;
-		}
-	}
+	ret = event_init(call);
+	if (ret < 0)
+		return ret;
 
 	d_events = event_trace_events_dir();
 	if (!d_events)
@@ -1272,13 +1287,10 @@ static void remove_subsystem_dir(const char *name)
  */
 static void __trace_remove_event_call(struct ftrace_event_call *call)
 {
-	ftrace_event_enable_disable(call, 0);
-	if (call->event.funcs)
-		__unregister_ftrace_event(&call->event);
-	debugfs_remove_recursive(call->dir);
-	list_del(&call->list);
+	event_remove(call);
 	trace_destroy_fields(call);
 	destroy_preds(call);
+	debugfs_remove_recursive(call->dir);
 	remove_subsystem_dir(call->class->system);
 }
 
@@ -1450,15 +1462,43 @@ static __init int setup_trace_event(char *str)
 }
 __setup("trace_event=", setup_trace_event);
 
+static __init int event_trace_enable(void)
+{
+	struct ftrace_event_call **iter, *call;
+	char *buf = bootup_event_buf;
+	char *token;
+	int ret;
+
+	for_each_event(iter, __start_ftrace_events, __stop_ftrace_events) {
+
+		call = *iter;
+		ret = event_init(call);
+		if (!ret)
+			list_add(&call->list, &ftrace_events);
+	}
+
+	while (true) {
+		token = strsep(&buf, ",");
+
+		if (!token)
+			break;
+		if (!*token)
+			continue;
+
+		ret = ftrace_set_clr_event(token, 1);
+		if (ret)
+			pr_warn("Failed to enable trace event: %s\n", token);
+	}
+	return 0;
+}
+
 static __init int event_trace_init(void)
 {
-	struct ftrace_event_call **call;
+	struct ftrace_event_call *call;
 	struct dentry *d_tracer;
 	struct dentry *entry;
 	struct dentry *d_events;
 	int ret;
-	char *buf = bootup_event_buf;
-	char *token;
 
 	d_tracer = tracing_init_dentry();
 	if (!d_tracer)
@@ -1497,24 +1537,19 @@ static __init int event_trace_init(void)
 	if (trace_define_common_fields())
 		pr_warning("tracing: Failed to allocate common fields");
 
-	for_each_event(call, __start_ftrace_events, __stop_ftrace_events) {
-		__trace_add_event_call(*call, NULL, &ftrace_event_id_fops,
+	/*
+	 * Early initialization already enabled ftrace event.
+	 * Now it's only necessary to create the event directory.
+	 */
+	list_for_each_entry(call, &ftrace_events, list) {
+
+		ret = event_create_dir(call, d_events,
+				       &ftrace_event_id_fops,
 				       &ftrace_enable_fops,
 				       &ftrace_event_filter_fops,
 				       &ftrace_event_format_fops);
-	}
-
-	while (true) {
-		token = strsep(&buf, ",");
-
-		if (!token)
-			break;
-		if (!*token)
-			continue;
-
-		ret = ftrace_set_clr_event(token, 1);
-		if (ret)
-			pr_warning("Failed to enable trace event: %s\n", token);
+		if (ret < 0)
+			event_remove(call);
 	}
 
 	ret = register_module_notifier(&trace_module_nb);
@@ -1523,6 +1558,7 @@ static __init int event_trace_init(void)
 
 	return 0;
 }
+core_initcall(event_trace_enable);
 fs_initcall(event_trace_init);
 
 #ifdef CONFIG_FTRACE_STARTUP_TEST
diff --git a/kernel/trace/trace_syscalls.c b/kernel/trace/trace_syscalls.c
index 96fc733..07b4e5a 100644
--- a/kernel/trace/trace_syscalls.c
+++ b/kernel/trace/trace_syscalls.c
@@ -487,7 +487,7 @@ int __init init_ftrace_syscalls(void)
 
 	return 0;
 }
-core_initcall(init_ftrace_syscalls);
+early_initcall(init_ftrace_syscalls);
 
 #ifdef CONFIG_PERF_EVENTS
 
-- 
1.7.8.6


^ permalink raw reply related	[flat|nested] 6+ messages in thread

* Re: [PATCH v4] trace: Move trace event enable from fs_initcall to core_initcall
  2012-09-12 14:47 [PATCH v4] trace: Move trace event enable from fs_initcall to core_initcall Ezequiel Garcia
@ 2012-09-24 17:23 ` Ezequiel Garcia
  2012-09-24 23:47   ` Steven Rostedt
  2012-09-27  5:49 ` [tip:perf/core] " tip-bot for Ezequiel Garcia
  1 sibling, 1 reply; 6+ messages in thread
From: Ezequiel Garcia @ 2012-09-24 17:23 UTC (permalink / raw)
  To: Steven Rostedt, linux-kernel; +Cc: Tim Bird, Pekka Enberg, Ingo Molnar

Steven,

On Wed, Sep 12, 2012 at 11:47 AM, Ezequiel Garcia <elezegarcia@gmail.com> wrote:
> This patch splits trace event initialization in two stages:
>  * ftrace enable
>  * sysfs event entry creation
>
> This allows to capture trace events from an earlier point
> by using 'trace_event' kernel parameter and is important
> to trace boot-up allocations.
>
> Note that, in order to enable events at core_initcall,
> it's necessary to move init_ftrace_syscalls() from
> core_initcall to early_initcall.
>
> Cc: Steven Rostedt <rostedt@goodmis.org>
> Signed-off-by: Ezequiel Garcia <elezegarcia@gmail.com>
> ---
> Changes from v1:
>   * Rework code as requested by Steven.
>
> Changes from v2:
>    * Move init_ftrace_syscalls() to early_initcall,
>      so syscalls self-test pass.
>
> Changes from v3:
>    * Fix issue reported by Steven:
>      event_trace_init() now iterates on added events (instead of full array).
>      This way we don't create an event dir for events that failed to enable.
>
>  kernel/trace/trace_events.c   |  108 +++++++++++++++++++++++++++--------------
>  kernel/trace/trace_syscalls.c |    2 +-
>  2 files changed, 73 insertions(+), 37 deletions(-)
>
> diff --git a/kernel/trace/trace_events.c b/kernel/trace/trace_events.c
> index 29111da..437202d 100644
> --- a/kernel/trace/trace_events.c
> +++ b/kernel/trace/trace_events.c
> @@ -1199,6 +1199,31 @@ event_create_dir(struct ftrace_event_call *call, struct dentry *d_events,
>         return 0;
>  }
>
> +static void event_remove(struct ftrace_event_call *call)
> +{
> +       ftrace_event_enable_disable(call, 0);
> +       if (call->event.funcs)
> +               __unregister_ftrace_event(&call->event);
> +       list_del(&call->list);
> +}
> +
> +static int event_init(struct ftrace_event_call *call)
> +{
> +       int ret = 0;
> +
> +       if (WARN_ON(!call->name))
> +               return -EINVAL;
> +
> +       if (call->class->raw_init) {
> +               ret = call->class->raw_init(call);
> +               if (ret < 0 && ret != -ENOSYS)
> +                       pr_warn("Could not initialize trace events/%s\n",
> +                               call->name);
> +       }
> +
> +       return ret;
> +}
> +
>  static int
>  __trace_add_event_call(struct ftrace_event_call *call, struct module *mod,
>                        const struct file_operations *id,
> @@ -1209,19 +1234,9 @@ __trace_add_event_call(struct ftrace_event_call *call, struct module *mod,
>         struct dentry *d_events;
>         int ret;
>
> -       /* The linker may leave blanks */
> -       if (!call->name)
> -               return -EINVAL;
> -
> -       if (call->class->raw_init) {
> -               ret = call->class->raw_init(call);
> -               if (ret < 0) {
> -                       if (ret != -ENOSYS)
> -                               pr_warning("Could not initialize trace events/%s\n",
> -                                          call->name);
> -                       return ret;
> -               }
> -       }
> +       ret = event_init(call);
> +       if (ret < 0)
> +               return ret;
>
>         d_events = event_trace_events_dir();
>         if (!d_events)
> @@ -1272,13 +1287,10 @@ static void remove_subsystem_dir(const char *name)
>   */
>  static void __trace_remove_event_call(struct ftrace_event_call *call)
>  {
> -       ftrace_event_enable_disable(call, 0);
> -       if (call->event.funcs)
> -               __unregister_ftrace_event(&call->event);
> -       debugfs_remove_recursive(call->dir);
> -       list_del(&call->list);
> +       event_remove(call);
>         trace_destroy_fields(call);
>         destroy_preds(call);
> +       debugfs_remove_recursive(call->dir);
>         remove_subsystem_dir(call->class->system);
>  }
>
> @@ -1450,15 +1462,43 @@ static __init int setup_trace_event(char *str)
>  }
>  __setup("trace_event=", setup_trace_event);
>
> +static __init int event_trace_enable(void)
> +{
> +       struct ftrace_event_call **iter, *call;
> +       char *buf = bootup_event_buf;
> +       char *token;
> +       int ret;
> +
> +       for_each_event(iter, __start_ftrace_events, __stop_ftrace_events) {
> +
> +               call = *iter;
> +               ret = event_init(call);
> +               if (!ret)
> +                       list_add(&call->list, &ftrace_events);
> +       }
> +
> +       while (true) {
> +               token = strsep(&buf, ",");
> +
> +               if (!token)
> +                       break;
> +               if (!*token)
> +                       continue;
> +
> +               ret = ftrace_set_clr_event(token, 1);
> +               if (ret)
> +                       pr_warn("Failed to enable trace event: %s\n", token);
> +       }
> +       return 0;
> +}
> +
>  static __init int event_trace_init(void)
>  {
> -       struct ftrace_event_call **call;
> +       struct ftrace_event_call *call;
>         struct dentry *d_tracer;
>         struct dentry *entry;
>         struct dentry *d_events;
>         int ret;
> -       char *buf = bootup_event_buf;
> -       char *token;
>
>         d_tracer = tracing_init_dentry();
>         if (!d_tracer)
> @@ -1497,24 +1537,19 @@ static __init int event_trace_init(void)
>         if (trace_define_common_fields())
>                 pr_warning("tracing: Failed to allocate common fields");
>
> -       for_each_event(call, __start_ftrace_events, __stop_ftrace_events) {
> -               __trace_add_event_call(*call, NULL, &ftrace_event_id_fops,
> +       /*
> +        * Early initialization already enabled ftrace event.
> +        * Now it's only necessary to create the event directory.
> +        */
> +       list_for_each_entry(call, &ftrace_events, list) {
> +
> +               ret = event_create_dir(call, d_events,
> +                                      &ftrace_event_id_fops,
>                                        &ftrace_enable_fops,
>                                        &ftrace_event_filter_fops,
>                                        &ftrace_event_format_fops);
> -       }
> -
> -       while (true) {
> -               token = strsep(&buf, ",");
> -
> -               if (!token)
> -                       break;
> -               if (!*token)
> -                       continue;
> -
> -               ret = ftrace_set_clr_event(token, 1);
> -               if (ret)
> -                       pr_warning("Failed to enable trace event: %s\n", token);
> +               if (ret < 0)
> +                       event_remove(call);
>         }
>
>         ret = register_module_notifier(&trace_module_nb);
> @@ -1523,6 +1558,7 @@ static __init int event_trace_init(void)
>
>         return 0;
>  }
> +core_initcall(event_trace_enable);
>  fs_initcall(event_trace_init);
>
>  #ifdef CONFIG_FTRACE_STARTUP_TEST
> diff --git a/kernel/trace/trace_syscalls.c b/kernel/trace/trace_syscalls.c
> index 96fc733..07b4e5a 100644
> --- a/kernel/trace/trace_syscalls.c
> +++ b/kernel/trace/trace_syscalls.c
> @@ -487,7 +487,7 @@ int __init init_ftrace_syscalls(void)
>
>         return 0;
>  }
> -core_initcall(init_ftrace_syscalls);
> +early_initcall(init_ftrace_syscalls);
>
>  #ifdef CONFIG_PERF_EVENTS
>
> --
> 1.7.8.6
>

Did you have time to take a look into this?
Will you be able to add it for your v3.7 pull request?
Let me know if there's something I should redo.

Thanks,
Ezequiel.

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [PATCH v4] trace: Move trace event enable from fs_initcall to core_initcall
  2012-09-24 17:23 ` Ezequiel Garcia
@ 2012-09-24 23:47   ` Steven Rostedt
  0 siblings, 0 replies; 6+ messages in thread
From: Steven Rostedt @ 2012-09-24 23:47 UTC (permalink / raw)
  To: Ezequiel Garcia; +Cc: linux-kernel, Tim Bird, Pekka Enberg, Ingo Molnar

On Mon, 2012-09-24 at 14:23 -0300, Ezequiel Garcia wrote:

> Did you have time to take a look into this?
> Will you be able to add it for your v3.7 pull request?
> Let me know if there's something I should redo.

Yeah, I have it queued up for my test set of tests. If it passes, I'll
push it towards Ingo. Maybe it's not too late for 3.7.

-- Steve



^ permalink raw reply	[flat|nested] 6+ messages in thread

* [tip:perf/core] trace: Move trace event enable from fs_initcall to core_initcall
  2012-09-12 14:47 [PATCH v4] trace: Move trace event enable from fs_initcall to core_initcall Ezequiel Garcia
  2012-09-24 17:23 ` Ezequiel Garcia
@ 2012-09-27  5:49 ` tip-bot for Ezequiel Garcia
  2012-10-31  7:04   ` Pekka Enberg
  1 sibling, 1 reply; 6+ messages in thread
From: tip-bot for Ezequiel Garcia @ 2012-09-27  5:49 UTC (permalink / raw)
  To: linux-tip-commits; +Cc: linux-kernel, hpa, mingo, rostedt, elezegarcia, tglx

Commit-ID:  8781915ad2716adcd8cd5cc52cee791fc8b00fdf
Gitweb:     http://git.kernel.org/tip/8781915ad2716adcd8cd5cc52cee791fc8b00fdf
Author:     Ezequiel Garcia <elezegarcia@gmail.com>
AuthorDate: Wed, 12 Sep 2012 11:47:57 -0300
Committer:  Steven Rostedt <rostedt@goodmis.org>
CommitDate: Mon, 24 Sep 2012 14:13:02 -0400

trace: Move trace event enable from fs_initcall to core_initcall

This patch splits trace event initialization in two stages:
 * ftrace enable
 * sysfs event entry creation

This allows to capture trace events from an earlier point
by using 'trace_event' kernel parameter and is important
to trace boot-up allocations.

Note that, in order to enable events at core_initcall,
it's necessary to move init_ftrace_syscalls() from
core_initcall to early_initcall.

Link: http://lkml.kernel.org/r/1347461277-25302-1-git-send-email-elezegarcia@gmail.com

Signed-off-by: Ezequiel Garcia <elezegarcia@gmail.com>
Signed-off-by: Steven Rostedt <rostedt@goodmis.org>
---
 kernel/trace/trace_events.c   |  108 +++++++++++++++++++++++++++--------------
 kernel/trace/trace_syscalls.c |    2 +-
 2 files changed, 73 insertions(+), 37 deletions(-)

diff --git a/kernel/trace/trace_events.c b/kernel/trace/trace_events.c
index bbb0e63..d608d09 100644
--- a/kernel/trace/trace_events.c
+++ b/kernel/trace/trace_events.c
@@ -1199,6 +1199,31 @@ event_create_dir(struct ftrace_event_call *call, struct dentry *d_events,
 	return 0;
 }
 
+static void event_remove(struct ftrace_event_call *call)
+{
+	ftrace_event_enable_disable(call, 0);
+	if (call->event.funcs)
+		__unregister_ftrace_event(&call->event);
+	list_del(&call->list);
+}
+
+static int event_init(struct ftrace_event_call *call)
+{
+	int ret = 0;
+
+	if (WARN_ON(!call->name))
+		return -EINVAL;
+
+	if (call->class->raw_init) {
+		ret = call->class->raw_init(call);
+		if (ret < 0 && ret != -ENOSYS)
+			pr_warn("Could not initialize trace events/%s\n",
+				call->name);
+	}
+
+	return ret;
+}
+
 static int
 __trace_add_event_call(struct ftrace_event_call *call, struct module *mod,
 		       const struct file_operations *id,
@@ -1209,19 +1234,9 @@ __trace_add_event_call(struct ftrace_event_call *call, struct module *mod,
 	struct dentry *d_events;
 	int ret;
 
-	/* The linker may leave blanks */
-	if (!call->name)
-		return -EINVAL;
-
-	if (call->class->raw_init) {
-		ret = call->class->raw_init(call);
-		if (ret < 0) {
-			if (ret != -ENOSYS)
-				pr_warning("Could not initialize trace events/%s\n",
-					   call->name);
-			return ret;
-		}
-	}
+	ret = event_init(call);
+	if (ret < 0)
+		return ret;
 
 	d_events = event_trace_events_dir();
 	if (!d_events)
@@ -1272,13 +1287,10 @@ static void remove_subsystem_dir(const char *name)
  */
 static void __trace_remove_event_call(struct ftrace_event_call *call)
 {
-	ftrace_event_enable_disable(call, 0);
-	if (call->event.funcs)
-		__unregister_ftrace_event(&call->event);
-	debugfs_remove_recursive(call->dir);
-	list_del(&call->list);
+	event_remove(call);
 	trace_destroy_fields(call);
 	destroy_preds(call);
+	debugfs_remove_recursive(call->dir);
 	remove_subsystem_dir(call->class->system);
 }
 
@@ -1450,15 +1462,43 @@ static __init int setup_trace_event(char *str)
 }
 __setup("trace_event=", setup_trace_event);
 
+static __init int event_trace_enable(void)
+{
+	struct ftrace_event_call **iter, *call;
+	char *buf = bootup_event_buf;
+	char *token;
+	int ret;
+
+	for_each_event(iter, __start_ftrace_events, __stop_ftrace_events) {
+
+		call = *iter;
+		ret = event_init(call);
+		if (!ret)
+			list_add(&call->list, &ftrace_events);
+	}
+
+	while (true) {
+		token = strsep(&buf, ",");
+
+		if (!token)
+			break;
+		if (!*token)
+			continue;
+
+		ret = ftrace_set_clr_event(token, 1);
+		if (ret)
+			pr_warn("Failed to enable trace event: %s\n", token);
+	}
+	return 0;
+}
+
 static __init int event_trace_init(void)
 {
-	struct ftrace_event_call **call;
+	struct ftrace_event_call *call;
 	struct dentry *d_tracer;
 	struct dentry *entry;
 	struct dentry *d_events;
 	int ret;
-	char *buf = bootup_event_buf;
-	char *token;
 
 	d_tracer = tracing_init_dentry();
 	if (!d_tracer)
@@ -1497,24 +1537,19 @@ static __init int event_trace_init(void)
 	if (trace_define_common_fields())
 		pr_warning("tracing: Failed to allocate common fields");
 
-	for_each_event(call, __start_ftrace_events, __stop_ftrace_events) {
-		__trace_add_event_call(*call, NULL, &ftrace_event_id_fops,
+	/*
+	 * Early initialization already enabled ftrace event.
+	 * Now it's only necessary to create the event directory.
+	 */
+	list_for_each_entry(call, &ftrace_events, list) {
+
+		ret = event_create_dir(call, d_events,
+				       &ftrace_event_id_fops,
 				       &ftrace_enable_fops,
 				       &ftrace_event_filter_fops,
 				       &ftrace_event_format_fops);
-	}
-
-	while (true) {
-		token = strsep(&buf, ",");
-
-		if (!token)
-			break;
-		if (!*token)
-			continue;
-
-		ret = ftrace_set_clr_event(token, 1);
-		if (ret)
-			pr_warning("Failed to enable trace event: %s\n", token);
+		if (ret < 0)
+			event_remove(call);
 	}
 
 	ret = register_module_notifier(&trace_module_nb);
@@ -1523,6 +1558,7 @@ static __init int event_trace_init(void)
 
 	return 0;
 }
+core_initcall(event_trace_enable);
 fs_initcall(event_trace_init);
 
 #ifdef CONFIG_FTRACE_STARTUP_TEST
diff --git a/kernel/trace/trace_syscalls.c b/kernel/trace/trace_syscalls.c
index 6b245f64..2485a7d 100644
--- a/kernel/trace/trace_syscalls.c
+++ b/kernel/trace/trace_syscalls.c
@@ -487,7 +487,7 @@ int __init init_ftrace_syscalls(void)
 
 	return 0;
 }
-core_initcall(init_ftrace_syscalls);
+early_initcall(init_ftrace_syscalls);
 
 #ifdef CONFIG_PERF_EVENTS
 

^ permalink raw reply related	[flat|nested] 6+ messages in thread

* Re: [tip:perf/core] trace: Move trace event enable from fs_initcall to core_initcall
  2012-09-27  5:49 ` [tip:perf/core] " tip-bot for Ezequiel Garcia
@ 2012-10-31  7:04   ` Pekka Enberg
  2012-10-31 11:19     ` Ezequiel Garcia
  0 siblings, 1 reply; 6+ messages in thread
From: Pekka Enberg @ 2012-10-31  7:04 UTC (permalink / raw)
  To: mingo, hpa, linux-kernel, elezegarcia, rostedt, tglx; +Cc: linux-tip-commits

Hi Ezequiel,

On Thu, Sep 27, 2012 at 8:49 AM, tip-bot for Ezequiel Garcia
<elezegarcia@gmail.com> wrote:
> Commit-ID:  8781915ad2716adcd8cd5cc52cee791fc8b00fdf
> Gitweb:     http://git.kernel.org/tip/8781915ad2716adcd8cd5cc52cee791fc8b00fdf
> Author:     Ezequiel Garcia <elezegarcia@gmail.com>
> AuthorDate: Wed, 12 Sep 2012 11:47:57 -0300
> Committer:  Steven Rostedt <rostedt@goodmis.org>
> CommitDate: Mon, 24 Sep 2012 14:13:02 -0400
>
> trace: Move trace event enable from fs_initcall to core_initcall
>
> This patch splits trace event initialization in two stages:
>  * ftrace enable
>  * sysfs event entry creation
>
> This allows to capture trace events from an earlier point
> by using 'trace_event' kernel parameter and is important
> to trace boot-up allocations.
>
> Note that, in order to enable events at core_initcall,
> it's necessary to move init_ftrace_syscalls() from
> core_initcall to early_initcall.
>
> Link: http://lkml.kernel.org/r/1347461277-25302-1-git-send-email-elezegarcia@gmail.com
>
> Signed-off-by: Ezequiel Garcia <elezegarcia@gmail.com>
> Signed-off-by: Steven Rostedt <rostedt@goodmis.org>

So what's still needed for perf to be able to trace early boot slab
allocations like kmemtrace used to be able to do?

                        Pekka

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [tip:perf/core] trace: Move trace event enable from fs_initcall to core_initcall
  2012-10-31  7:04   ` Pekka Enberg
@ 2012-10-31 11:19     ` Ezequiel Garcia
  0 siblings, 0 replies; 6+ messages in thread
From: Ezequiel Garcia @ 2012-10-31 11:19 UTC (permalink / raw)
  To: Pekka Enberg
  Cc: mingo, hpa, linux-kernel, rostedt, tglx, linux-tip-commits, Tim Bird

Hi Pekka,

On Wed, Oct 31, 2012 at 4:04 AM, Pekka Enberg <penberg@kernel.org> wrote:
> Hi Ezequiel,
>
> On Thu, Sep 27, 2012 at 8:49 AM, tip-bot for Ezequiel Garcia
> <elezegarcia@gmail.com> wrote:
>> Commit-ID:  8781915ad2716adcd8cd5cc52cee791fc8b00fdf
>> Gitweb:     http://git.kernel.org/tip/8781915ad2716adcd8cd5cc52cee791fc8b00fdf
>> Author:     Ezequiel Garcia <elezegarcia@gmail.com>
>> AuthorDate: Wed, 12 Sep 2012 11:47:57 -0300
>> Committer:  Steven Rostedt <rostedt@goodmis.org>
>> CommitDate: Mon, 24 Sep 2012 14:13:02 -0400
>>
>> trace: Move trace event enable from fs_initcall to core_initcall
>>
>> This patch splits trace event initialization in two stages:
>>  * ftrace enable
>>  * sysfs event entry creation
>>
>> This allows to capture trace events from an earlier point
>> by using 'trace_event' kernel parameter and is important
>> to trace boot-up allocations.
>>
>> Note that, in order to enable events at core_initcall,
>> it's necessary to move init_ftrace_syscalls() from
>> core_initcall to early_initcall.
>>
>> Link: http://lkml.kernel.org/r/1347461277-25302-1-git-send-email-elezegarcia@gmail.com
>>
>> Signed-off-by: Ezequiel Garcia <elezegarcia@gmail.com>
>> Signed-off-by: Steven Rostedt <rostedt@goodmis.org>
>
> So what's still needed for perf to be able to trace early boot slab
> allocations like kmemtrace used to be able to do?
>

Steven suggested [1] it would be possible to create some sort
of static ring buffer, and use it to trace early events.
Later on, this static buffer should be copied into the "real" one.

Since this patch, ftrace is enabled at core_initcall.
It's an improvement, but we still loose events.
For instance, in a probe kernel we loose 800k bytes,
and 20k allocations, compared to accounting from boot up.

To be able to use ftrace (and therefore perf) for long run tracing,
you need to consider ring buffer overrun.
In my tests, I had to set a bigger buffer,
which severely impacts performance.

IMHO, this makes ftrace unsuitable for very long run tests
with "verbose" events; unless you put an user daemon
or something popping events, preventing overrun.

    Ezequiel

[1] https://lkml.org/lkml/2012/8/17/253

^ permalink raw reply	[flat|nested] 6+ messages in thread

end of thread, other threads:[~2012-10-31 11:20 UTC | newest]

Thread overview: 6+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2012-09-12 14:47 [PATCH v4] trace: Move trace event enable from fs_initcall to core_initcall Ezequiel Garcia
2012-09-24 17:23 ` Ezequiel Garcia
2012-09-24 23:47   ` Steven Rostedt
2012-09-27  5:49 ` [tip:perf/core] " tip-bot for Ezequiel Garcia
2012-10-31  7:04   ` Pekka Enberg
2012-10-31 11:19     ` Ezequiel Garcia

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).