From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-9.8 required=3.0 tests=DKIM_SIGNED,DKIM_VALID, DKIM_VALID_AU,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_PATCH,MAILING_LIST_MULTI, SIGNED_OFF_BY,SPF_HELO_NONE,SPF_PASS,URIBL_BLOCKED,USER_AGENT_GIT autolearn=unavailable autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id E0F03C3A59B for ; Fri, 30 Aug 2019 16:24:01 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id AAB252341B for ; Fri, 30 Aug 2019 16:24:01 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (1024-bit key) header.d=joelfernandes.org header.i=@joelfernandes.org header.b="GeC6ElFe" Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1728176AbfH3QX5 (ORCPT ); Fri, 30 Aug 2019 12:23:57 -0400 Received: from mail-pl1-f193.google.com ([209.85.214.193]:37153 "EHLO mail-pl1-f193.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1728155AbfH3QX4 (ORCPT ); Fri, 30 Aug 2019 12:23:56 -0400 Received: by mail-pl1-f193.google.com with SMTP id bj8so3593326plb.4 for ; Fri, 30 Aug 2019 09:23:56 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=joelfernandes.org; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=+lcx73l3OzJk+ymCURbXhF5jO4XUhkQ3JEoTfd3jxVI=; b=GeC6ElFerlFgRT/Mt0Q/M/2H6PAPix5mue9D2INqzxc8Azr0OxF+wViO3AbkwZzOSb H/Kuphze/HAQyYZZl6taoCU1Ig9WNwBSZnD1zL92LdAK7pxYCjEGrjf44+HE54nW4k7A eUTENa9xYo3+x32AOPC2Ao+I1zJq9zhjKrSYE= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=+lcx73l3OzJk+ymCURbXhF5jO4XUhkQ3JEoTfd3jxVI=; b=daSqt5N6gfMEVAOyTa1veSC9pKOLPZvz00IlhYfjfhIiuYU0giwSvSDEPw8/ur9EYT P+ahkKJqDbqaB6/LkhY36bER6aXIdqvLtb1NFwEgf91PJqP+IKTXo4c95YAVmSiSHWjR sL1bcui+6pd1Lvxlossju9NlwiKvOVkw31uqRwhCn0xP+yIm+F9UFBves/1J+ENtk/15 TX19sW5UF5uhd9/yAuToq6H2+/cQUEX1S+qQrto0lNlYw+a1ci7BVHVeIR0YYyAoEra5 wJzgvJEXvx57+0YFzTq9ufYTufBqdHo8u5V+FTfM5g7mCdRZwXi3dKjUJ6GHkcMkXwcu jvPw== X-Gm-Message-State: APjAAAWwiDWpZyt/sUl+LWoMuDzWDAH67qHTBT2Arw58vFmE9A6U/PbA YaPnqwkmjhvyjRttGpu0PEHR8g== X-Google-Smtp-Source: APXvYqxxxD8KIw/2cWvLLxdXw7npD04v0O0JIIDOdJUZx3AFjSZCze2PkguFJ17bK3RXDDyWFCJfWg== X-Received: by 2002:a17:902:f216:: with SMTP id gn22mr17464983plb.59.1567182235680; Fri, 30 Aug 2019 09:23:55 -0700 (PDT) Received: from joelaf.cam.corp.google.com ([2620:15c:6:12:9c46:e0da:efbf:69cc]) by smtp.gmail.com with ESMTPSA id t9sm5646109pgj.89.2019.08.30.09.23.53 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 30 Aug 2019 09:23:54 -0700 (PDT) From: "Joel Fernandes (Google)" To: linux-kernel@vger.kernel.org Cc: "Joel Fernandes (Google)" , Bjorn Helgaas , Ingo Molnar , Josh Triplett , Lai Jiangshan , Mathieu Desnoyers , "Paul E. McKenney" , Petr Mladek , "Rafael J. Wysocki" , rcu@vger.kernel.org, Steven Rostedt , Yafang Shao Subject: [PATCH -rcu dev 2/2] rcu/dyntick-idle: Add better tracing Date: Fri, 30 Aug 2019 12:23:48 -0400 Message-Id: <20190830162348.192303-2-joel@joelfernandes.org> X-Mailer: git-send-email 2.23.0.187.g17f5b7556c-goog In-Reply-To: <20190830162348.192303-1-joel@joelfernandes.org> References: <20190830162348.192303-1-joel@joelfernandes.org> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Sender: rcu-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: rcu@vger.kernel.org The dyntick-idle traces are a bit confusing. This patch makes it simpler and adds some missing cases such as EQS-enter due to user vs idle mode. Following are the changes: (1) Add a new context field to trace_rcu_dyntick tracepoint. This context field can be "USER", "IDLE" or "IRQ". (2) Remove the "++=" and "--=" strings and replace them with "StillNonIdle". This is much easier on the eyes, and the -- and ++ are easily apparent in the dynticks_nesting counters we are printing anyway. This patch is based on the previous patches to simplify rcu_dyntick counters [1] and with these traces, I have verified the counters are working properly. [1] Link: https://lore.kernel.org/patchwork/patch/1120021/ Link: https://lore.kernel.org/patchwork/patch/1120022/ Signed-off-by: Joel Fernandes (Google) --- include/trace/events/rcu.h | 13 ++++++++----- kernel/rcu/tree.c | 19 +++++++++++++------ 2 files changed, 21 insertions(+), 11 deletions(-) diff --git a/include/trace/events/rcu.h b/include/trace/events/rcu.h index 66122602bd08..474c1f7e7104 100644 --- a/include/trace/events/rcu.h +++ b/include/trace/events/rcu.h @@ -449,12 +449,14 @@ TRACE_EVENT_RCU(rcu_fqs, */ TRACE_EVENT_RCU(rcu_dyntick, - TP_PROTO(const char *polarity, long oldnesting, long newnesting, atomic_t dynticks), + TP_PROTO(const char *polarity, const char *context, long oldnesting, + long newnesting, atomic_t dynticks), - TP_ARGS(polarity, oldnesting, newnesting, dynticks), + TP_ARGS(polarity, context, oldnesting, newnesting, dynticks), TP_STRUCT__entry( __field(const char *, polarity) + __field(const char *, context) __field(long, oldnesting) __field(long, newnesting) __field(int, dynticks) @@ -462,14 +464,15 @@ TRACE_EVENT_RCU(rcu_dyntick, TP_fast_assign( __entry->polarity = polarity; + __entry->context = context; __entry->oldnesting = oldnesting; __entry->newnesting = newnesting; __entry->dynticks = atomic_read(&dynticks); ), - TP_printk("%s %lx %lx %#3x", __entry->polarity, - __entry->oldnesting, __entry->newnesting, - __entry->dynticks & 0xfff) + TP_printk("%s %s %lx %lx %#3x", __entry->polarity, + __entry->context, __entry->oldnesting, __entry->newnesting, + __entry->dynticks & 0xfff) ); /* diff --git a/kernel/rcu/tree.c b/kernel/rcu/tree.c index 417dd00b9e87..463407762b5a 100644 --- a/kernel/rcu/tree.c +++ b/kernel/rcu/tree.c @@ -533,7 +533,8 @@ static void rcu_eqs_enter(bool user) } lockdep_assert_irqs_disabled(); - trace_rcu_dyntick(TPS("Start"), rdp->dynticks_nesting, 0, rdp->dynticks); + trace_rcu_dyntick(TPS("Start"), (user ? TPS("USER") : TPS("IDLE")), + rdp->dynticks_nesting, 0, rdp->dynticks); WARN_ON_ONCE(IS_ENABLED(CONFIG_RCU_EQS_DEBUG) && !user && !is_idle_task(current)); rdp = this_cpu_ptr(&rcu_data); do_nocb_deferred_wakeup(rdp); @@ -606,14 +607,17 @@ static __always_inline void rcu_nmi_exit_common(bool irq) * leave it in non-RCU-idle state. */ if (rdp->dynticks_nmi_nesting != 1) { - trace_rcu_dyntick(TPS("--="), rdp->dynticks_nmi_nesting, rdp->dynticks_nmi_nesting - 2, rdp->dynticks); + trace_rcu_dyntick(TPS("StillNonIdle"), TPS("IRQ"), + rdp->dynticks_nmi_nesting, + rdp->dynticks_nmi_nesting - 2, rdp->dynticks); WRITE_ONCE(rdp->dynticks_nmi_nesting, /* No store tearing. */ rdp->dynticks_nmi_nesting - 2); return; } /* This NMI interrupted an RCU-idle CPU, restore RCU-idleness. */ - trace_rcu_dyntick(TPS("Startirq"), rdp->dynticks_nmi_nesting, 0, rdp->dynticks); + trace_rcu_dyntick(TPS("Start"), TPS("IRQ"), rdp->dynticks_nmi_nesting, + 0, rdp->dynticks); WRITE_ONCE(rdp->dynticks_nmi_nesting, 0); /* Avoid store tearing. */ if (irq) @@ -700,7 +704,8 @@ static void rcu_eqs_exit(bool user) rcu_dynticks_task_exit(); rcu_dynticks_eqs_exit(); rcu_cleanup_after_idle(); - trace_rcu_dyntick(TPS("End"), rdp->dynticks_nesting, 1, rdp->dynticks); + trace_rcu_dyntick(TPS("End"), (user ? TPS("USER") : TPS("IDLE")), + rdp->dynticks_nesting, 1, rdp->dynticks); WARN_ON_ONCE(IS_ENABLED(CONFIG_RCU_EQS_DEBUG) && !user && !is_idle_task(current)); WRITE_ONCE(rdp->dynticks_nesting, 1); WARN_ON_ONCE(rdp->dynticks_nmi_nesting); @@ -787,9 +792,11 @@ static __always_inline void rcu_nmi_enter_common(bool irq) rdp->rcu_forced_tick = true; tick_dep_set_cpu(rdp->cpu, TICK_DEP_BIT_RCU); } - trace_rcu_dyntick(incby == 1 ? TPS("Endirq") : TPS("++="), - rdp->dynticks_nmi_nesting, + + trace_rcu_dyntick(incby == 1 ? TPS("End") : TPS("StillNonIdle"), + TPS("IRQ"), rdp->dynticks_nmi_nesting, rdp->dynticks_nmi_nesting + incby, rdp->dynticks); + WRITE_ONCE(rdp->dynticks_nmi_nesting, /* Prevent store tearing. */ rdp->dynticks_nmi_nesting + incby); barrier(); -- 2.23.0.187.g17f5b7556c-goog