From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752378AbdC2CTH (ORCPT ); Tue, 28 Mar 2017 22:19:07 -0400 Received: from smtprelay0107.hostedemail.com ([216.40.44.107]:57896 "EHLO smtprelay.hostedemail.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1751542AbdC2CTF (ORCPT ); Tue, 28 Mar 2017 22:19:05 -0400 X-Session-Marker: 726F737465647440676F6F646D69732E6F7267 X-Spam-Summary: 2,0,0,,d41d8cd98f00b204,rostedt@goodmis.org,:::::::::,RULES_HIT:2:41:355:379:541:599:800:960:968:973:982:988:989:1260:1277:1311:1313:1314:1345:1359:1437:1515:1516:1518:1535:1593:1594:1605:1606:1730:1747:1777:1792:2393:2553:2559:2562:2895:3138:3139:3140:3141:3142:3622:3865:3866:3867:3868:3871:3872:3873:3874:4321:4605:5007:6261:7875:10004:10848:10967:11026:11232:11233:11473:11658:11914:12043:12291:12296:12438:12555:12683:12740:12760:12895:13439:13972:14659:21063:21080:21324:21451:30012:30051:30054:30056:30070:30090:30091,0,RBL:none,CacheIP:none,Bayesian:0.5,0.5,0.5,Netcheck:none,DomainCache:0,MSF:not bulk,SPF:,MSBL:0,DNSBL:none,Custom_rules:0:0:0,LFtime:1,LUA_SUMMARY:none X-HE-Tag: glove18_87e81fd936856 X-Filterd-Recvd-Size: 5941 Date: Tue, 28 Mar 2017 22:18:52 -0400 From: Steven Rostedt To: Namhyung Kim Cc: Ingo Molnar , Masami Hiramatsu , LKML , kernel-team@lge.com Subject: Re: [PATCH 2/4] ftrace: Add 'function-fork' trace option Message-ID: <20170328221852.71367fd0@grimm.local.home> In-Reply-To: <20170329014625.19346-3-namhyung@kernel.org> References: <20170329014625.19346-1-namhyung@kernel.org> <20170329014625.19346-3-namhyung@kernel.org> X-Mailer: Claws Mail 3.14.1 (GTK+ 2.24.31; x86_64-pc-linux-gnu) MIME-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Wed, 29 Mar 2017 10:46:23 +0900 Namhyung Kim wrote: > The function-fork option is same as event-fork that it tracks task > fork/exit and set the pid filter properly. This can be useful if user > wants to trace selected tasks including their children only. Actually, I had every set, but it appears I stopped at this step. You just finished it ;-) Although, I think there was some issues with function tracing. I'll have to do some more testing an analysis tomorrow. But looking at this code, it currently appears fine. -- Steve > > Signed-off-by: Namhyung Kim > --- > kernel/trace/ftrace.c | 37 +++++++++++++++++++++++++++++++++++++ > kernel/trace/trace.c | 5 ++++- > kernel/trace/trace.h | 6 +++++- > 3 files changed, 46 insertions(+), 2 deletions(-) > > diff --git a/kernel/trace/ftrace.c b/kernel/trace/ftrace.c > index b451a860e885..7ca2ed8d0a48 100644 > --- a/kernel/trace/ftrace.c > +++ b/kernel/trace/ftrace.c > @@ -5575,6 +5575,43 @@ ftrace_filter_pid_sched_switch_probe(void *data, bool preempt, > trace_ignore_this_task(pid_list, next)); > } > > +static void > +ftrace_pid_follow_sched_process_fork(void *data, > + struct task_struct *self, > + struct task_struct *task) > +{ > + struct trace_pid_list *pid_list; > + struct trace_array *tr = data; > + > + pid_list = rcu_dereference_sched(tr->function_pids); > + trace_filter_add_remove_task(pid_list, self, task); > +} > + > +static void > +ftrace_pid_follow_sched_process_exit(void *data, struct task_struct *task) > +{ > + struct trace_pid_list *pid_list; > + struct trace_array *tr = data; > + > + pid_list = rcu_dereference_sched(tr->function_pids); > + trace_filter_add_remove_task(pid_list, NULL, task); > +} > + > +void ftrace_pid_follow_fork(struct trace_array *tr, bool enable) > +{ > + if (enable) { > + register_trace_sched_process_fork(ftrace_pid_follow_sched_process_fork, > + tr); > + register_trace_sched_process_exit(ftrace_pid_follow_sched_process_exit, > + tr); > + } else { > + unregister_trace_sched_process_fork(ftrace_pid_follow_sched_process_fork, > + tr); > + unregister_trace_sched_process_exit(ftrace_pid_follow_sched_process_exit, > + tr); > + } > +} > + > static void clear_ftrace_pids(struct trace_array *tr) > { > struct trace_pid_list *pid_list; > diff --git a/kernel/trace/trace.c b/kernel/trace/trace.c > index b92489dfa829..291d8fc9dc36 100644 > --- a/kernel/trace/trace.c > +++ b/kernel/trace/trace.c > @@ -257,7 +257,7 @@ unsigned long long ns2usecs(u64 nsec) > > /* trace_flags that are default zero for instances */ > #define ZEROED_TRACE_FLAGS \ > - TRACE_ITER_EVENT_FORK > + (TRACE_ITER_EVENT_FORK | TRACE_ITER_FUNC_FORK) > > /* > * The global_trace is the descriptor that holds the top-level tracing > @@ -4205,6 +4205,9 @@ int set_tracer_flag(struct trace_array *tr, unsigned int mask, int enabled) > if (mask == TRACE_ITER_EVENT_FORK) > trace_event_follow_fork(tr, enabled); > > + if (mask == TRACE_ITER_FUNC_FORK) > + ftrace_pid_follow_fork(tr, enabled); > + > if (mask == TRACE_ITER_OVERWRITE) { > ring_buffer_change_overwrite(tr->trace_buffer.buffer, enabled); > #ifdef CONFIG_TRACER_MAX_TRACE > diff --git a/kernel/trace/trace.h b/kernel/trace/trace.h > index 4d9804fd9a2d..bacf5e845c55 100644 > --- a/kernel/trace/trace.h > +++ b/kernel/trace/trace.h > @@ -898,6 +898,7 @@ void ftrace_init_tracefs_toplevel(struct trace_array *tr, > struct dentry *d_tracer); > int init_function_trace(void); > void ftrace_pid_reset(struct trace_array *tr, bool update); > +void ftrace_pid_follow_fork(struct trace_array *tr, bool enable); > #else > static inline int ftrace_trace_task(struct trace_array *tr) > { > @@ -918,6 +919,7 @@ static inline void ftrace_init_tracefs(struct trace_array *tr, struct dentry *d) > static inline void ftrace_init_tracefs_toplevel(struct trace_array *tr, struct dentry *d) { } > static inline int init_function_trace(void) { return 0; } > static inline void ftrace_pid_reset(struct trace_array *tr, bool update) { } > +static inline void ftrace_pid_follow_fork(struct trace_array *tr, bool enable) { } > /* ftace_func_t type is not defined, use macro instead of static inline */ > #define ftrace_init_array_ops(tr, func) do { } while (0) > #endif /* CONFIG_FUNCTION_TRACER */ > @@ -991,11 +993,13 @@ extern int trace_get_user(struct trace_parser *parser, const char __user *ubuf, > > #ifdef CONFIG_FUNCTION_TRACER > # define FUNCTION_FLAGS \ > - C(FUNCTION, "function-trace"), > + C(FUNCTION, "function-trace"), \ > + C(FUNC_FORK, "function-fork"), > # define FUNCTION_DEFAULT_FLAGS TRACE_ITER_FUNCTION > #else > # define FUNCTION_FLAGS > # define FUNCTION_DEFAULT_FLAGS 0UL > +# define TRACE_ITER_FUNC_FORK 0UL > #endif > > #ifdef CONFIG_STACKTRACE