Received: by 10.192.165.148 with SMTP id m20csp900383imm; Fri, 27 Apr 2018 09:15:55 -0700 (PDT) X-Google-Smtp-Source: AB8JxZpjF9ycks2Iq9wFK8qFMmvB2iAwdszaepiP8ik+3EjurIu98se2b2w9w5Dhd+2LctyOTaWD X-Received: by 2002:a17:902:228:: with SMTP id 37-v6mr2802121plc.141.1524845755211; Fri, 27 Apr 2018 09:15:55 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1524845755; cv=none; d=google.com; s=arc-20160816; b=mRNpIavrugRshab2BzrDmCa6Ka6e5FuchyKlwAjzoI/wmjLcjwvSS+EQgIliYXnZ9b hQZDLBym+N2rhtTbQIk93reCyFw90O2Au9xurlc1uRzePnLFxIYjyKRxotmZrtgbG1RZ jpxHvaxeAKyDvIC+amV6H8zD/T4CxSWzf5ezMP+6yKZhuVWnL5EHHNVNQ5l8jYkBivhm AGMaB/KnMWVSFyaCZjY/9UGa6AONqlwfx15LXrL2F7wq3l61mjkf8RIzOwMULqmaidu2 lx42SaYpEHV9RTSA9va88aNk0vOwlQZbzLX/l0Rzt+xMzyjAmM0H6dQUeszlapARw9AN GtIw== 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=F3VZUYgUF+rsA16lAN38u9aUMiAfxfsdLlEkQOevJqA=; b=uEZaXSf152YHlTC7bZw/hZw8pEWxG1Jvf/y0vqEFoP4IapXvBHYCENTJv5zyWRzvHA CGUhl3ezdg0fSZNOzAFv7WzWE3PhF82Ir19NsQziDZlLjaWCioyhXmCX/eZ+n3Uibgty aaPQRNfBZ1do6TAdgeZwAgx/Njn93uhgjQIOMpdhG7EMJU7kxB4jiGoVTlxfLebzypA5 0M5L7W4ot/nmBtLypSrHJIOYZAA9TJ2RLlebvHb0C19DcIR1da1TbbPaa75qgMzrvwVA J36oJ6HEBa9+H6UG1TyM/eWIQ8mwbOP8deSvUPJLaiNN2FhRFhS49AvIrrzKo+u2wPic DyWg== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@google.com header.s=20161025 header.b=nOUoNI1g; 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 o32-v6si1453657pld.369.2018.04.27.09.15.40; Fri, 27 Apr 2018 09:15:55 -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=nOUoNI1g; 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 S1758625AbeD0QOe (ORCPT + 99 others); Fri, 27 Apr 2018 12:14:34 -0400 Received: from mail-it0-f68.google.com ([209.85.214.68]:34031 "EHLO mail-it0-f68.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1758515AbeD0QOc (ORCPT ); Fri, 27 Apr 2018 12:14:32 -0400 Received: by mail-it0-f68.google.com with SMTP id c5-v6so2898569itj.1 for ; Fri, 27 Apr 2018 09:14:32 -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=F3VZUYgUF+rsA16lAN38u9aUMiAfxfsdLlEkQOevJqA=; b=nOUoNI1gUQrWloTlUrXPHkVovbCUqEwiFeWKj5Y+HnJHzpS0IHfGPRtoCQxYS82hIe CpjlPmhWoMvJy0uMvW0PFXpql6pcR3GLQ0Nnw6Eb7pceqSe77GqM/rJ4Teen0x6rRD/h J5oR1qYh5m7wLG5IxUHVRxyu6SEhhmWYwIJjMCbgewpW13W5Ta+vvpoyu+RPwqIJ6Buh /3iob2L/lywoPQf+ootQhYXtei7qyIiztZW7kFXfM7qyTjqgLcYBhmjJUPLcDpiwiaiu NaNNlbH8e4lvigaSRI7OCC5xWwy25DXPtewsCak4QM7rKRj5/S77TYb03ld+GNoi8sTN WVkA== 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=F3VZUYgUF+rsA16lAN38u9aUMiAfxfsdLlEkQOevJqA=; b=je3LY8yCKcxRgBrMUNizxaA10Rqt5qWshjz+RK06yhQ7ECvcx1omXxKAveANokPxSd 6QX64zRZapd6wuk2apXcSpO27QlM5jkh2cbrGgc6p6ECig4MjqGLqtOC4xB6+f3XLuje +LaOn+8kkQolEZoJzx6kMLWGs5JK/tBoQTzSHly/JGOOoJmutsl//VCLWqTEepuAeiSG QvhwXZqUjEKbLQtCboa7QfxsDud/TsS57kT86sL3OniRTDf4ZFz1ZT+8wLq+SgY+uIvb A+zfbgyIrVl4ShjF64RdgdmHidEGr9TdMjSS+bQIpfjRMmdFfad50VKKhhnwyZBU22Jx kXhw== X-Gm-Message-State: ALQs6tD2vk4w79abwNT1Nct+kVIC+esmGWFs8OIQb3hOqlgFPw1VmNWV Vv0e8vlBYJwo0XrbizfP3IuV0ADTwyVfp2PE1T7X3awo X-Received: by 2002:a24:5f45:: with SMTP id r66-v6mr2533168itb.126.1524845671255; Fri, 27 Apr 2018 09:14:31 -0700 (PDT) MIME-Version: 1.0 Received: by 10.107.181.213 with HTTP; Fri, 27 Apr 2018 09:14:30 -0700 (PDT) In-Reply-To: <20180427155701.GL26088@linux.vnet.ibm.com> References: <20180427042656.190746-1-joelaf@google.com> <20180427155701.GL26088@linux.vnet.ibm.com> From: Joel Fernandes Date: Fri, 27 Apr 2018 09:14:30 -0700 Message-ID: Subject: Re: [PATCH RFC] tracepoint: Introduce tracepoint callbacks executing with preempt on To: Paul McKenney Cc: LKML , Steven Rostedt , Peter Zilstra , Ingo Molnar , Mathieu Desnoyers , Tom Zanussi , Namhyung Kim , Thomas Glexiner , Boqun Feng , Frederic Weisbecker , Randy Dunlap , Masami Hiramatsu , Fenguang Wu , Baohong Liu , Vedang Patel , "Cc: Android Kernel" 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 Paul, On Fri, Apr 27, 2018 at 8:57 AM, Paul E. McKenney wrote: > On Thu, Apr 26, 2018 at 09:26:56PM -0700, Joel Fernandes wrote: >> In recent tests with IRQ on/off tracepoints, a large performance >> overhead ~10% is noticed when running hackbench. This is root caused to >> calls to rcu_irq_enter_irqson and rcu_irq_exit_irqson from the >> tracepoint code. Following a long discussion on the list [1] about this, >> we concluded that srcu is a better alternative for use during rcu idle. >> Although it does involve extra barriers, its lighter than the sched-rcu >> version which has to do additional RCU calls to notify RCU idle about >> entry into RCU sections. >> >> In this patch, we change the underlying implementation of the >> trace_*_rcuidle API to use SRCU. This has shown to improve performance >> alot for the high frequency irq enable/disable tracepoints. >> >> In the future, we can add a new may_sleep API which can use this >> infrastructure for callbacks that actually can sleep which will support >> Mathieu's usecase of blocking probes. >> >> Test: Tested idle and preempt/irq tracepoints. > > Looks good overall! One question and a few comments below. > > Thanx, Paul > >> [1] https://patchwork.kernel.org/patch/10344297/ >> >> Cc: Steven Rostedt >> Cc: Peter Zilstra >> Cc: Ingo Molnar >> Cc: Mathieu Desnoyers >> Cc: Tom Zanussi >> Cc: Namhyung Kim >> Cc: Thomas Glexiner >> Cc: Boqun Feng >> Cc: Paul McKenney >> Cc: Frederic Weisbecker >> Cc: Randy Dunlap >> Cc: Masami Hiramatsu >> Cc: Fenguang Wu >> Cc: Baohong Liu >> Cc: Vedang Patel >> Cc: kernel-team@android.com >> Signed-off-by: Joel Fernandes >> --- >> include/linux/tracepoint.h | 37 +++++++++++++++++++++++++++++-------- >> kernel/tracepoint.c | 10 +++++++++- >> 2 files changed, 38 insertions(+), 9 deletions(-) >> >> diff --git a/include/linux/tracepoint.h b/include/linux/tracepoint.h >> index c94f466d57ef..a1c1987de423 100644 >> --- a/include/linux/tracepoint.h >> +++ b/include/linux/tracepoint.h >> @@ -15,6 +15,7 @@ >> */ >> >> #include >> +#include >> #include >> #include >> #include >> @@ -33,6 +34,8 @@ struct trace_eval_map { >> >> #define TRACEPOINT_DEFAULT_PRIO 10 >> >> +extern struct srcu_struct tracepoint_srcu; >> + >> extern int >> tracepoint_probe_register(struct tracepoint *tp, void *probe, void *data); >> extern int >> @@ -77,6 +80,7 @@ int unregister_tracepoint_module_notifier(struct notifier_block *nb) >> */ >> static inline void tracepoint_synchronize_unregister(void) >> { >> + synchronize_srcu(&tracepoint_srcu); >> synchronize_sched(); >> } >> >> @@ -129,18 +133,26 @@ extern void syscall_unregfunc(void); >> * as "(void *, void)". The DECLARE_TRACE_NOARGS() will pass in just >> * "void *data", where as the DECLARE_TRACE() will pass in "void *data, proto". >> */ >> -#define __DO_TRACE(tp, proto, args, cond, rcucheck) \ >> +#define __DO_TRACE(tp, proto, args, cond, preempt_on) \ >> do { \ >> struct tracepoint_func *it_func_ptr; \ >> void *it_func; \ >> void *__data; \ >> + int __maybe_unused idx = 0; \ >> \ >> if (!(cond)) \ >> return; \ >> - if (rcucheck) \ >> - rcu_irq_enter_irqson(); \ >> - rcu_read_lock_sched_notrace(); \ >> - it_func_ptr = rcu_dereference_sched((tp)->funcs); \ >> + if (preempt_on) { \ >> + WARN_ON_ONCE(in_nmi()); /* no srcu from nmi */ \ > > Very good on this check, thank you! Sure thing :-) > >> + idx = srcu_read_lock(&tracepoint_srcu); \ > > Hmmm... Do I need to create a _notrace variant of srcu_read_lock() > and srcu_read_unlock()? That shouldn't be needed. For the rcu_read_lock_sched case, there is a preempt_disable which needs to be a notrace, but for the srcu one, since we don't do that, I think it should be fine. Thanks! - Joel