From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1758623AbbLBO1F (ORCPT ); Wed, 2 Dec 2015 09:27:05 -0500 Received: from smtprelay0245.hostedemail.com ([216.40.44.245]:55635 "EHLO smtprelay.hostedemail.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1758028AbbLBO1D (ORCPT ); Wed, 2 Dec 2015 09:27:03 -0500 X-Session-Marker: 726F737465647440676F6F646D69732E6F7267 X-Spam-Summary: 2,0,0,,d41d8cd98f00b204,rostedt@goodmis.org,:::::::,RULES_HIT:41:355:379:541:599:800:960:973:988:989:1260:1277:1311:1313:1314:1345:1359:1437:1515:1516:1518:1534:1543:1593:1594:1711:1730:1747:1777:1792:2194:2199:2393:2553:2559:2562:2693:2897:3138:3139:3140:3141:3142:3355:3622:3865:3867:3868:3870:3872:3873:3874:4250:5007:6261:7875:7903:8660:9012:9038:9592:10004:10394:10400:10848:10967:11026:11232:11473:11658:11914:12043:12296:12438:12517:12519:12555:12740:13148:13230:13972:14096:14097:14659:21080:30054:30090:30091,0,RBL:none,CacheIP:none,Bayesian:0.5,0.5,0.5,Netcheck:none,DomainCache:0,MSF:not bulk,SPF:fn,MSBL:0,DNSBL:none,Custom_rules:0:0:0,LFtime:2,LUA_SUMMARY:none X-HE-Tag: cow65_3d5414caa874c X-Filterd-Recvd-Size: 4600 Date: Wed, 2 Dec 2015 09:27:00 -0500 From: Steven Rostedt To: Jiri Olsa Cc: LKML , Ingo Molnar , Peter Zijlstra Subject: Re: [PATCH] ftrace: Remove use of control list and ops Message-ID: <20151202092700.7021eda8@gandalf.local.home> In-Reply-To: <20151202085826.GA1068@krava.brq.redhat.com> References: <20151130173640.2c45b429@gandalf.local.home> <20151201134213.GA14155@krava.brq.redhat.com> <20151201095554.7b56bff7@gandalf.local.home> <20151201155744.GA24786@krava.local> <20151201115655.1b7e79e6@gandalf.local.home> <20151202085826.GA1068@krava.brq.redhat.com> X-Mailer: Claws Mail 3.13.0 (GTK+ 2.24.28; 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, 2 Dec 2015 09:58:26 +0100 Jiri Olsa wrote: > On Tue, Dec 01, 2015 at 11:56:55AM -0500, Steven Rostedt wrote: > > SNIP > > > -static void ftrace_ops_recurs_func(unsigned long ip, unsigned long parent_ip, > > +static void ftrace_ops_assist_func(unsigned long ip, unsigned long parent_ip, > > struct ftrace_ops *op, struct pt_regs *regs) > > { > > int bit; > > > > + if ((op->flags & FTRACE_OPS_FL_RCU) && !rcu_is_watching()) > > + return; > > + > > bit = trace_test_and_set_recursion(TRACE_LIST_START, TRACE_LIST_MAX); > > if (bit < 0) > > return; > > > > - op->func(ip, parent_ip, op, regs); > > + preempt_disable_notrace(); > > > > + if (!(op->flags & FTRACE_OPS_FL_PER_CPU) || > > + ftrace_function_local_disabled(op)) { > > should be !ftrace_function_local_disabled(op) in here, > I passed my test with attached patch > Can you retest with this patch: -- Steve diff --git a/kernel/trace/ftrace.c b/kernel/trace/ftrace.c index bc7f4eb6b4b0..e290a30f2d0b 100644 --- a/kernel/trace/ftrace.c +++ b/kernel/trace/ftrace.c @@ -115,9 +115,6 @@ static struct ftrace_ops *ftrace_ops_list __read_mostly = &ftrace_list_end; ftrace_func_t ftrace_trace_function __read_mostly = ftrace_stub; static struct ftrace_ops global_ops; -static void ftrace_ops_recurs_func(unsigned long ip, unsigned long parent_ip, - struct ftrace_ops *op, struct pt_regs *regs); - #if ARCH_SUPPORTS_FTRACE_OPS static void ftrace_ops_list_func(unsigned long ip, unsigned long parent_ip, struct ftrace_ops *op, struct pt_regs *regs); @@ -5231,20 +5228,29 @@ static void ftrace_ops_no_ops(unsigned long ip, unsigned long parent_ip) /* * If there's only one function registered but it does not support - * recursion, this function will be called by the mcount trampoline. - * This function will handle recursion protection. + * recursion, needs RCU protection and/or requires per cpu handling, then + * this function will be called by the mcount trampoline. */ -static void ftrace_ops_recurs_func(unsigned long ip, unsigned long parent_ip, +static void ftrace_ops_assist_func(unsigned long ip, unsigned long parent_ip, struct ftrace_ops *op, struct pt_regs *regs) { int bit; + if ((op->flags & FTRACE_OPS_FL_RCU) && !rcu_is_watching()) + return; + bit = trace_test_and_set_recursion(TRACE_LIST_START, TRACE_LIST_MAX); if (bit < 0) return; - op->func(ip, parent_ip, op, regs); + preempt_disable_notrace(); + if (!(op->flags & FTRACE_OPS_FL_PER_CPU) || + !ftrace_function_local_disabled(op)) { + op->func(ip, parent_ip, op, regs); + } + + preempt_enable_notrace(); trace_clear_recursion(bit); } @@ -5262,12 +5268,12 @@ static void ftrace_ops_recurs_func(unsigned long ip, unsigned long parent_ip, ftrace_func_t ftrace_ops_get_func(struct ftrace_ops *ops) { /* - * If the func handles its own recursion, call it directly. - * Otherwise call the recursion protected function that - * will call the ftrace ops function. + * If the function does not handle recursion, needs to be RCU safe, + * or does per cpu logic, then we need to call the assist handler. */ - if (!(ops->flags & FTRACE_OPS_FL_RECURSION_SAFE)) - return ftrace_ops_recurs_func; + if (!(ops->flags & FTRACE_OPS_FL_RECURSION_SAFE) || + ops->flags & (FTRACE_OPS_FL_RCU | FTRACE_OPS_FL_PER_CPU)) + return ftrace_ops_assist_func; return ops->func; }