Received: by 10.192.165.148 with SMTP id m20csp1294074imm; Wed, 25 Apr 2018 16:15:02 -0700 (PDT) X-Google-Smtp-Source: AIpwx4/n9jtSiUwBLYgyWfPnFvHJBCuuqAMNDE/ArQ+VnmefKyLnd5QFxxBhaoOa9egtQbq0Df0T X-Received: by 10.99.117.71 with SMTP id f7mr16223134pgn.204.1524698102529; Wed, 25 Apr 2018 16:15:02 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1524698102; cv=none; d=google.com; s=arc-20160816; b=Cp8TOJHN2y+nSSdjvS76BV+BzopLdjbVZvDXwgulbDJKWBIyZ0cFPq54AOBEsMvq7u AnW8XG4k52IATrE8VEZgMsZOjaQ/FiPTEo281lc4iA0QFaFw2yppnXTXxJC/xo5SVCoY 3ZTPdjntyX5ys/y5JC/TI+XOzMyKF/iLCdESyhyq+yMpW8718BcZ2RW+kVwl+aZy6l+F npzgSTZwA3TWianQZ9OMQkV1xT22t9bNG6y0KMIT/jb2l9Rh/YmPrWqeW2mmxA2cE85/ SIbqvh6Jr4GlSBR5yo4mNu90Eg9auhuGtT0s9OpJD+BZvfLp4iaKYdfd7U+MzyidzprC NX9w== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:cc:to:subject:message-id:date:from :references:in-reply-to:mime-version:dkim-signature :arc-authentication-results; bh=YNMYRlyr+ctb/qSrw80gUHJipU8yfxU+NjAjWEyC2KU=; b=gH/tc/xBmx6YQExMYopL5YeIXHB0pUMMXQF+InIDSRszTagJLGEFpBwFJCIFx7Hi21 0xs/v27dXrBUByA0FIx4rwC3LtM89UQn7qUbrkciU6ACh1uDHPhow5wFCWa/owLRujG/ FfsCH/3kwNHe2uRgfyKI/OT86LI6QVm5+Ri2u6I5yHUp+UbtEe3uLysuCrbji6vOMGn+ FGqbaCSlLQwQxGIJKEGxLPxcLiCzQo5Px/eJ61q/NeGUJGdXsqM1gyu/TfiFANigq9Gc HdJYCsXMn3MXajzrF/tBvfGSsv4bn1JWbNyZmADXapYOtRfAqxC77hAq3c6y+bjV/e+T 8bnQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@google.com header.s=20161025 header.b=dV4TNbQG; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=REJECT sp=REJECT dis=NONE) header.from=google.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id g3si16635812pfc.237.2018.04.25.16.14.47; Wed, 25 Apr 2018 16:15:02 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; dkim=pass header.i=@google.com header.s=20161025 header.b=dV4TNbQG; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=REJECT sp=REJECT dis=NONE) header.from=google.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1753892AbeDYXNl (ORCPT + 99 others); Wed, 25 Apr 2018 19:13:41 -0400 Received: from mail-it0-f42.google.com ([209.85.214.42]:34128 "EHLO mail-it0-f42.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752958AbeDYXNh (ORCPT ); Wed, 25 Apr 2018 19:13:37 -0400 Received: by mail-it0-f42.google.com with SMTP id t192-v6so16596109itc.1 for ; Wed, 25 Apr 2018 16:13:37 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20161025; h=mime-version:in-reply-to:references:from:date:message-id:subject:to :cc; bh=YNMYRlyr+ctb/qSrw80gUHJipU8yfxU+NjAjWEyC2KU=; b=dV4TNbQGW/IToeI/WZzG7JGLY7WiseQBsY+NNYb70hzH/TKl7eCkvEFDjgjci2DiJF c4RS/WCV8ZS5X9Lrwq5GYLdoKxgnqRPzcX2hbEPG3LQxuuhQDN3oV9bOviojBLoWtBya 3i8qlXuR0y4njVzZa6TScCiheh4BWwpHt4+vyTan2WBns0cujU4yfy7h0CF9QrbhPdsm oppWFiE31bnsHaOTg2VsdJP2IKs3kv6tgXErIhakM0m7o7YWYlZFxETXVodRBmcWaKfI XwRR10BMJdfaInI2NkMTj5DD9XmZUzoiHj7c9yRLhFc3FcBy7kRP95qdOJM3YB5wt70/ NTKg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:mime-version:in-reply-to:references:from:date :message-id:subject:to:cc; bh=YNMYRlyr+ctb/qSrw80gUHJipU8yfxU+NjAjWEyC2KU=; b=LlVhbj1rZwuLabbbGHRXCiIoOoaMhqKVNEV29/L1Dyv0dyqyXwt6hwFWn651dnLqgs z+TxYTjLwW5d4FkFJN6cAkTekviD1RybCmnLXcs7nLjGWsmJgi+AOUpxHj9Raox9SlzV YOuYwcywGTujSRR1FeK9TD+STRhbxBdh6ebVWAvXZoWOPfLjVMuTY4jgd7OeQIqnf0uW Vqcae3C+qV0e2x85Bma3XSmszj+BSBYdHMbO4xTOc9HqnQRQjhGXhkhbc1ttwHFi9HnD X5/ShWu+jNV/OmreywxkaH4C/FWlajkI3tlkwqfWpO2bJJdxHf3be707IKpwUJoPuXf7 YspA== X-Gm-Message-State: ALQs6tDjrpmJh8P/uZ+QqQzDYttkNkJP3ZhvEVr43gTxnBv0RqZptRoE 3WoF6R0AnnyyA4h+QQYtdf7cd/grgh8IwHbYIVvzBET2uEo= X-Received: by 2002:a24:6d5:: with SMTP id 204-v6mr15631800itv.47.1524698016449; Wed, 25 Apr 2018 16:13:36 -0700 (PDT) MIME-Version: 1.0 Received: by 10.107.181.213 with HTTP; Wed, 25 Apr 2018 16:13:35 -0700 (PDT) In-Reply-To: <1267842641.1791.1524692456344.JavaMail.zimbra@efficios.com> References: <20180423172244.694dbc9d@gandalf.local.home> <20180424182623.GA1357@linux.vnet.ibm.com> <849066633.939.1524612064698.JavaMail.zimbra@efficios.com> <68e4c123-a223-5e26-e57a-da2515041bf3@google.com> <20180425001049.GX26088@linux.vnet.ibm.com> <20180425042056.GA21412@linux.vnet.ibm.com> <1267842641.1791.1524692456344.JavaMail.zimbra@efficios.com> From: Joel Fernandes Date: Wed, 25 Apr 2018 16:13:35 -0700 Message-ID: Subject: Re: [RFC v4 3/4] irqflags: Avoid unnecessary calls to trace_ if you can To: Mathieu Desnoyers Cc: "Paul E. McKenney" , rostedt , Namhyung Kim , Masami Hiramatsu , linux-kernel , linux-rt-users , Peter Zijlstra , Ingo Molnar , Tom Zanussi , Thomas Gleixner , Boqun Feng , fweisbec , Randy Dunlap , kbuild test robot , baohong liu , vedang patel , kernel-team Content-Type: text/plain; charset="UTF-8" Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Hi Mathieu, On Wed, Apr 25, 2018 at 2:40 PM, Mathieu Desnoyers wrote: > ----- On Apr 25, 2018, at 5:27 PM, Joel Fernandes joelaf@google.com wrote: > >> On Tue, Apr 24, 2018 at 9:20 PM, Paul E. McKenney >> wrote: >> [..] >>>> > >>>> > Sounds good, thanks. >>>> > >>>> > Also I found the reason for my boot issue. It was because the >>>> > init_srcu_struct in the prototype was being done in an initcall. >>>> > Instead if I do it in start_kernel before the tracepoint is used, it >>>> > fixes it (although I don't know if this is dangerous to do like this >>>> > but I can get it to boot atleast.. Let me know if this isn't the >>>> > right way to do it, or if something else could go wrong) >>>> > >>>> > diff --git a/init/main.c b/init/main.c >>>> > index 34823072ef9e..ecc88319c6da 100644 >>>> > --- a/init/main.c >>>> > +++ b/init/main.c >>>> > @@ -631,6 +631,7 @@ asmlinkage __visible void __init start_kernel(void) >>>> > WARN(!irqs_disabled(), "Interrupts were enabled early\n"); >>>> > early_boot_irqs_disabled = false; >>>> > >>>> > + init_srcu_struct(&tracepoint_srcu); >>>> > lockdep_init_early(); >>>> > >>>> > local_irq_enable(); >>>> > -- >>>> > >>>> > I benchmarked it and the performance also looks quite good compared >>>> > to the rcu tracepoint version. >>>> > >>>> > If you, Paul and other think doing the init_srcu_struct like this >>>> > should be Ok, then I can try to work more on your srcu prototype and >>>> > roll into my series and post them in the next RFC series (or let me >>>> > know if you wanted to work your srcu stuff in a separate series..). >>>> >>>> That is definitely not what I was expecting, but let's see if it works >>>> anyway... ;-) >>>> >>>> But first, I was instead expecting something like this: >>>> >>>> DEFINE_SRCU(tracepoint_srcu); >>>> >>>> With this approach, some of the initialization happens at compile time >>>> and the rest happens at the first call_srcu(). >>>> >>>> This will work -only- if the first call_srcu() doesn't happen until after >>>> workqueue_init_early() has been invoked. Which I believe must have been >>>> the case in your testing, because otherwise it looks like __call_srcu() >>>> would have complained bitterly. >>>> >>>> On the other hand, if you need to invoke call_srcu() before the call >>>> to workqueue_init_early(), then you need the patch that I am beating >>>> into shape. Plus you would need to use DEFINE_SRCU() and to avoid >>>> invoking init_srcu_struct(). >>> >>> And here is the patch. I do not intend to send it upstream unless it >>> actually proves necessary, and it appears that current SRCU does what >>> you need. >>> >>> You would only need this patch if you wanted to invoke call_srcu() >>> before workqueue_init_early() was called, which does not seem likely. >> >> Cool. So I was chatting with Paul and just to update everyone as well, >> I tried the DEFINE_SRCU instead of the late init_srcu_struct call and >> can make it past boot too (thanks Paul!). Also I don't see a reason we >> need the RCU callback to execute early and its fine if it runs later. >> >> Also, I was thinking of introducing a separate trace_*event*_srcu API >> as a replacement to the _rcuidle API. Then I can make use of it for my >> tracepoints, and then later can use it for the other tracepoints >> needing _rcuidle. After that we can finally get rid of the _rcuidle >> API if there are no other users of it. This is just a rough plan, but >> let me know if there's any issue with this plan that you can think >> off. >> IMO, I believe its simpler if the caller worries about whether it can >> tolerate if tracepoint probes can block or not, than making it a >> property of the tracepoint. That would also simplify the patch to >> introduce srcu and keep the tracepoint creation API simple and less >> confusing, but let me know if I'm missing something about this. > > One problem with your approach is that you can have multiple callers > for the same tracepoint name, where some could be non-preemptible and > others blocking. Also, there is then no clear way for the callback Shouldn't it be responsibility of the caller to make sure it calls correct API? So if you're wanting to allow probes to block, then you'd call trace*blocking, if not then you don't. So the caller side can just always do the right thing. That's a caller side issue. > > Regarding the name, I'm OK with having something along the lines of > trace_*event*_blocking or such. Please don't use "srcu" or other naming > that is explicitly tied to the underlying mechanism used internally > however: what we want to convey is that this specific tracepoint probe Problem is that _blocking isn't the right word either. In my IRQ trace point case, it will look something like this then: local_irq_disable(); // IRQs are now off. trace_irq_disable_blocking(..); This wouldn't make sense. What we really want is to use the SRCU implementation so that its low overhead... So it would be something like: local_irq_disable(); // IRQs are now off. trace_irq_disable_srcu(..); I also Ok if, as Paul was saying in his last email, that just for _rcuidle, we use SRCU so that we don't have to do the rcu_enter_irq stuff. Or we kill the _rcuidle API completely and use _srcu for those users instead. We already have 1 implementation specific name anyway (rcuidle), we're just replacing it with another one. If in the future, if we want to change that name we can always do so (Also if you will, correcting the existing already bad naming is a different problem and we're not making it any worse tbh). > can be preempted and block. The underlying implementation could move to > a different RCU flavor brand in the future, and it should not impact > users of the tracepoint APIs. > > In order to ensure that probes that may block only register themselves > to tracepoints that allow blocking, we should introduce new tracepoint > declaration/definition *and* registration APIs also contain the > "BLOCKING/blocking" keywords (or such), so we can ensure that a > tracepoint probe being registered to a "blocking" tracepoint is indeed > allowed to block. I feel this problem you're describing is slightly out of the scope of the issues we're talking about, I think. Even right now, someone can write a callback that blocks and then bad things will happen. If I understand correctly, all callbacks right now will execute in a preempt disabled section because of rcu_read_lock_sched. So we already have a problem (without the SRCU changes) that if a callback blocks, then we'll have hard to diagnose sleeping while atomic issues. Sorry if I missed your point. thanks, - Joel