Received: by 10.192.165.148 with SMTP id m20csp41603imm; Tue, 24 Apr 2018 16:48:28 -0700 (PDT) X-Google-Smtp-Source: AIpwx48Y9XiZXG9zva71EkGCNRXq3cE6Oo25J/OdILM3tVn025aXO64Gl3C9P+k9bLkWHB0E2Qqd X-Received: by 10.99.95.13 with SMTP id t13mr22220527pgb.145.1524613708394; Tue, 24 Apr 2018 16:48:28 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1524613708; cv=none; d=google.com; s=arc-20160816; b=yvPKWjsKyTeGAfQ7VUU6/E8OV0y6DlEXKwutrDeB4B2VbLlzgwpgC0KgguFm/ODUmk X3p0Ofg3dKez5PS2P+dSe5OyPl68QPhL3LHR5oqhfBwy0+pU1+tC7FDITuuyRdEee8vS muTg3esJ3CTVWWfuhk0JpqCZQdMKs7ePONjtB4HpJrkx7rF7wTEJ+f5ycwrxWgmRGA4/ lyNICFeVgRLWG/TO2tb6mkGXEE0Co2NpIzN5nN0NiEni/ZVGi9AiWCIKWmfMRFofQqF2 31YT+uZE7U/FBh8a3KnWfh3Vqojl44G9obAeBQk7d+cJ1lLI2Ji3uXZYrFKLbW6tF4fZ 9pjg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:content-transfer-encoding :content-language:in-reply-to:mime-version:user-agent:date :message-id:from:references:cc:to:subject:dkim-signature :arc-authentication-results; bh=HFoIEac1Y1jmZNvQ7HB4K8RO3zpoc1UGU5wpYCgWGcw=; b=BfHf2HXOA5UtYEf6f2Dc7MXaBNcItV01nnHygl0fFNtsJDJ7uv7XQ1yK+8O8isq1yB IDKP5BaXz3U2lCok9xU7bWyzVBKg5AsYum2r+iGagmPPqQcpTVcs7UN6b9fruNASRBwb STCsSpCuFaGgcXpIceoVU6GKixHcG/zcvhecG5DMqdFV/4eEOkwD+QYm9AtQx9Ub/yj3 8DoE9dYxhrLRUZ1oOv1wJCExP8dVfVMGcnV5oPpWqk8SUAltzIl8dPnVNoq+FWSY9K82 puzJqLQXtmNK/DNh91QsfVzbdNulqZu3arVJoGEgRNsqCO7Rzu3BZ5weESj+iWM+bYSm AvcQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@google.com header.s=20161025 header.b=sasALjlP; 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 e1-v6si14822382pld.69.2018.04.24.16.48.14; Tue, 24 Apr 2018 16:48:28 -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=sasALjlP; 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 S1751296AbeDXXrH (ORCPT + 99 others); Tue, 24 Apr 2018 19:47:07 -0400 Received: from mail-pg0-f42.google.com ([74.125.83.42]:39079 "EHLO mail-pg0-f42.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1750902AbeDXXq6 (ORCPT ); Tue, 24 Apr 2018 19:46:58 -0400 Received: by mail-pg0-f42.google.com with SMTP id b9so11990140pgf.6 for ; Tue, 24 Apr 2018 16:46:58 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20161025; h=subject:to:cc:references:from:message-id:date:user-agent :mime-version:in-reply-to:content-language:content-transfer-encoding; bh=HFoIEac1Y1jmZNvQ7HB4K8RO3zpoc1UGU5wpYCgWGcw=; b=sasALjlPFXNp/x2iV/99se1jiWWdP1tAl67VXjb/K5gJ4kGQz4jGX/Bhd9gXahPJYh iJdGldR60r+5LWGIONbflARCSZswZUauiOwVM0yLoF3PqEQQ1H0DrumJDpcDgGmxV+gc JrH0YTZUsw51zuugHCjnRE2SGvVZmNVvbT236e9fiAbH1I4i/Tc7nrSvUrcs1gSZ5ogc YfXwwCQ6qgo/TtvFvnmXgspzSVTpuafTxyJHIU94culHeUEOAurCmreZ40fpmGTLa4Xt KnWK02yMqiQe2cgiFW9xSS63OV1OmlaYTs0t1vYFN475NFbJFxRZlCm8GN8x/uprGU91 HBVg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:subject:to:cc:references:from:message-id:date :user-agent:mime-version:in-reply-to:content-language :content-transfer-encoding; bh=HFoIEac1Y1jmZNvQ7HB4K8RO3zpoc1UGU5wpYCgWGcw=; b=fWPvuEaCNlmCrl9NaSkpjFpX+pYPV9yXHjMr2pxgh5JdjUF8vQvHnq21yPbC8xWvF9 MIt0uFop8jl1AiGQ8kSoJe5ftolZIvRA3Gk6hjIHMz+JlKNA+EuvcRXKYEUI/6R8wX4r SePhmHDkAZXkTzwgiDMNYV1BrRg18kKlI4Whs2/12IPNHot08wZH3IzkCJHa2du06xGq Fvb4O5B7bIbgdPP6xpUXcz9ElUiuwcaLCn5xDq+jrV/R01fh4d7JRO7vvfK5dEJ5dYsM FU1ew3slbjmC8hli5DqKWnxX7pKhxpasEvKdIcXYyeCOR1re7WsXb8ck1DPu1fG9aXCP BR+A== X-Gm-Message-State: ALQs6tBN8OaUzyKaz7dXfNyi+XCHCmGrRySvvOFurfpr1uIPIhLxSjzH MUB3UkVDuAKmzq3YTyEQvxGCcw== X-Received: by 10.99.112.91 with SMTP id a27mr21766291pgn.432.1524613617072; Tue, 24 Apr 2018 16:46:57 -0700 (PDT) Received: from joelaf.mtv.corp.google.com ([2620:0:1000:1600:3122:ea9c:d178:eb]) by smtp.gmail.com with ESMTPSA id y5sm26841152pfm.117.2018.04.24.16.46.55 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Tue, 24 Apr 2018 16:46:55 -0700 (PDT) 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 References: <409016827.14587.1524493888181.JavaMail.zimbra@efficios.com> <20180423172244.694dbc9d@gandalf.local.home> <20180424155655.GA820@linux.vnet.ibm.com> <20180424172658.GT26088@linux.vnet.ibm.com> <20180424182302.GA404@linux.vnet.ibm.com> <20180424182623.GA1357@linux.vnet.ibm.com> <849066633.939.1524612064698.JavaMail.zimbra@efficios.com> From: Joel Fernandes Message-ID: <68e4c123-a223-5e26-e57a-da2515041bf3@google.com> Date: Tue, 24 Apr 2018 16:46:54 -0700 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:52.0) Gecko/20100101 Thunderbird/52.6.0 MIME-Version: 1.0 In-Reply-To: <849066633.939.1524612064698.JavaMail.zimbra@efficios.com> Content-Type: text/plain; charset=utf-8; format=flowed Content-Language: en-GB Content-Transfer-Encoding: 7bit Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On 04/24/2018 04:21 PM, Mathieu Desnoyers wrote: > ----- On Apr 24, 2018, at 2:59 PM, Joel Fernandes joelaf@google.com wrote: >> On Tue, Apr 24, 2018 at 11:26 AM, Paul E. McKenney >> wrote: >>> On Tue, Apr 24, 2018 at 11:23:02AM -0700, Paul E. McKenney wrote: >>>> On Tue, Apr 24, 2018 at 10:26:58AM -0700, Paul E. McKenney wrote: >>>>> On Tue, Apr 24, 2018 at 09:01:34AM -0700, Joel Fernandes wrote: >>>>>> On Tue, Apr 24, 2018 at 8:56 AM, Paul E. McKenney >>>>>> wrote: >>>>>>> On Mon, Apr 23, 2018 at 05:22:44PM -0400, Steven Rostedt wrote: >>>>>>>> On Mon, 23 Apr 2018 13:12:21 -0400 (EDT) >>>>>>>> Mathieu Desnoyers wrote: >>>>>>>> >>>>>>>> >>>>>>>>> I'm inclined to explicitly declare the tracepoints with their given >>>>>>>>> synchronization method. Tracepoint probe callback functions for currently >>>>>>>>> existing tracepoints expect to have preemption disabled when invoked. >>>>>>>>> This assumption will not be true anymore for srcu-tracepoints. >>>>>>>> >>>>>>>> Actually, why not have a flag attached to the tracepoint_func that >>>>>>>> states if it expects preemption to be enabled or not? If a >>>>>>>> trace_##event##_srcu() is called, then simply disable preemption before >>>>>>>> calling the callbacks for it. That way if a callback is fine for use >>>>>>>> with srcu, then it would require calling >>>>>>>> >>>>>>>> register_trace_##event##_may_sleep(); >>>>>>>> >>>>>>>> Then if someone uses this on a tracepoint where preemption is disabled, >>>>>>>> we simply do not call it. >>>>>>> >>>>>>> One more stupid question... If we are having to trace so much stuff >>>>>>> in the idle loop, are we perhaps grossly overstating the extent of that >>>>>>> "idle" loop? For being called "idle", this code seems quite busy! >>>>>> >>>>>> ;-) >>>>>> The performance hit I am observing is when running a heavy workload, >>>>>> like hackbench or something like that. That's what I am trying to >>>>>> correct. >>>>>> By the way is there any limitation on using SRCU too early during >>>>>> boot? I backported Mathieu's srcu tracepoint patches but the kernel >>>>>> hangs pretty early in the boot. I register lockdep probes in >>>>>> start_kernel. I am hoping that's not why. >>>>>> >>>>>> I could also have just screwed up the backporting... may be for my >>>>>> testing, I will just replace the rcu API with the srcu instead of all >>>>>> of Mathieu's new TRACE_EVENT macros for SRCU, since all I am trying to >>>>>> do right now is measure the performance of my patches with SRCU. >>>>> >>>>> Gah, yes, there is an entry on my capacious todo list on making SRCU >>>>> grace periods work during early boot and mid-boot. Let me see what >>>>> I can do... >>>> >>>> OK, just need to verify that you are OK with call_srcu()'s callbacks >>>> not being invoked until sometime during core_initcall() time. (If you >>>> really do need them to be invoked before that, in theory it is possible, >>>> but in practice it is weird, even for RCU.) >>> >>> Oh, and that early at boot, you will need to use DEFINE_SRCU() or >>> DEFINE_STATIC_SRCU() rather than dynamic allocation and initialization. >>> >>> Thanx, Paul >>> >> >> Oh ok. >> >> About call_rcu, calling it later may be an issue since we register the >> probes in start_kernel, for the first probe call_rcu will be sched, >> but for the second one I think it'll try to call_rcu to get rid of the >> first one. >> >> This is the relevant code that gets called when probes are added: >> >> static inline void release_probes(struct tracepoint_func *old) >> { >> if (old) { >> struct tp_probes *tp_probes = container_of(old, >> struct tp_probes, probes[0]); >> call_rcu_sched(&tp_probes->rcu, rcu_free_old_probes); >> } >> } >> >> Maybe we can somehow defer the call_srcu until later? Would that be possible? >> >> also Mathieu, you didn't modify the call_rcu_sched in your prototype >> to be changed to use call_srcu, should you be doing that? > > You're right, I think I should have introduced a call_srcu in there. > It's missing in my prototype. > > However, in the prototype I did, we need to wait for *both* sched-rcu > and SRCU grace periods, because we don't track which site is using which > rcu flavor. > > So you could achieve this relatively easily by means of two chained > RCU callbacks, e.g.: > > release_probes() calls call_rcu_sched(... , rcu_free_old_probes) > > and then in rcu_free_old_probes() do: > > call_srcu(... , srcu_free_old_probes) > > and perform kfree(container_of(head, struct tp_probes, rcu)); > within srcu_free_old_probes. > > It is somewhat a hack, but should work. 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..). thanks, - Joel