Received: by 2002:ac0:a594:0:0:0:0:0 with SMTP id m20-v6csp908190imm; Mon, 21 May 2018 17:01:16 -0700 (PDT) X-Google-Smtp-Source: AB8JxZqtdXpNH/emo5FMEzNoy/LZ4u/mk4XazbBhjV63fifnpNimTIKD9RxIVDf5Wur7rFoOBRRb X-Received: by 2002:a63:4384:: with SMTP id q126-v6mr16894218pga.294.1526947275950; Mon, 21 May 2018 17:01:15 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1526947275; cv=none; d=google.com; s=arc-20160816; b=ByoOLToMYQUhkjd6yz97WImH65sX6PW0LmgkSVb92lSYi1w/umFOLSJWBkM/DlsB6g Ylw4JpiQYsWnr10YeaYJbPv2TJjugebRbx9cPv+I9YEC4BYeOIq+CutoRjksJhSwve6w EobR2JAsnsiomYf/c/65tl1g7KwyLHTT5z6CFusFcfRKIwPnk9q6qRUvB42vcZFAA0Xq ZGJ83NoAEUjHd24kbz9ykshqYEoKPV5drrZYd0D4hzDad/3jWb+ACX9xgHTAyI45p5JP 6xVXd4KpgDZnInh1EhlqIkqjMyi77FhvzLXjW7ZuAZ2rI2/r7kY8Nw4ifuTRh8QrR6Ad egwA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:user-agent:in-reply-to :content-disposition:mime-version:references:message-id:subject:cc :to:from:date:dkim-signature:arc-authentication-results; bh=jShWw43wZsrvfezhHKqGcHYa0FteuhGyB2iPmgu4oU4=; b=vtnRt0qN3T9L64uSTaTEmzWPwGxYhTzWLGtcF0ZuJZzeBxR8UG8Y8gjHZGR87Fr1ox Z6lNiHnFPJ3Ula+l/vZxHIkdgLsimNC5+7kl/oiVoNth934vetR9jhDcB4MN9sR8XTpQ SiC7q/Yh2C+z4TsMq9uVb417JbQngUSChmDMPqsq6+1Rv4FN/oxGGtU7Ge41siT+DLhU cc43wJxTMcjLO86plWzDPAr9LXdH23MOQV1cEOBg//HecHWs7Z61Qmd+kugx41OuIX3x vfcwOqJVcGyrNxYvGzuKPvsr4DOy6w7GRND9UoB5wknGjbYhAoSqy9dzQ5FvfzbHP1qm Opeg== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@joelfernandes.org header.s=google header.b=T+cpGrMv; 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 Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id h131-v6si14433326pfc.206.2018.05.21.17.00.39; Mon, 21 May 2018 17:01:15 -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=@joelfernandes.org header.s=google header.b=T+cpGrMv; 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 Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751160AbeEVAAV (ORCPT + 99 others); Mon, 21 May 2018 20:00:21 -0400 Received: from mail-pf0-f193.google.com ([209.85.192.193]:39014 "EHLO mail-pf0-f193.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751073AbeEVAAS (ORCPT ); Mon, 21 May 2018 20:00:18 -0400 Received: by mail-pf0-f193.google.com with SMTP id a22-v6so7832363pfn.6 for ; Mon, 21 May 2018 17:00:18 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=joelfernandes.org; s=google; h=date:from:to:cc:subject:message-id:references:mime-version :content-disposition:in-reply-to:user-agent; bh=jShWw43wZsrvfezhHKqGcHYa0FteuhGyB2iPmgu4oU4=; b=T+cpGrMvg91Bv++KYItCdhXsqDsTnZ5s1UKzEYIlDXVDKnyuvaj2f4QZZtFsBoucWG yrPnZC9Vm1nSbGb15bpoWs5gJX404zf63qianqwh7FiMIknjtOkDvdhBkwNpDJfJJ/Cx bdiH2gpKuIkECXAFn5oMciWgFFAMK1bFhsgIo= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:date:from:to:cc:subject:message-id:references :mime-version:content-disposition:in-reply-to:user-agent; bh=jShWw43wZsrvfezhHKqGcHYa0FteuhGyB2iPmgu4oU4=; b=Tn5W8MImGwKLvARlSgiK7eF7anlD6WrhM4NneRMdZxU3Pu7X552nrOp41KAo7dvefg fgNy48wriYCi6XuHx16DyKO83na9Os9AaB7TB6fO1VKHLdENAlwgEd/1YQVenGR5vM+g OW5OKwSZa0cxkJtEltDsI43jFX+b7Neo/2Wq2H/qTazDmtzlxqcZ8KmYOlvGVzxxhPTb zolewKYi1Wy0QIolDvqo+wLY2hf4vyfPJzXuWWkz4FUsoS6tsfEFZfdKUNGORAF5UJmH ELN3VVdYbrYu2vz1euJpN5c6uuOXGeMefVHorHOByrOgIlp77+jx5sLyUSVYvnejoeD0 FGEQ== X-Gm-Message-State: ALKqPweq2ZMXQCTaNmFTIiO7fAiiJrN2ITpe8kfDTchleM53+iCtoxmw p3rNDoMxTFU6YqtYkd5kmt+f9Q== X-Received: by 2002:a65:4309:: with SMTP id j9-v6mr17064506pgq.375.1526947218144; Mon, 21 May 2018 17:00:18 -0700 (PDT) Received: from localhost ([2620:0:1000:1600:3122:ea9c:d178:eb]) by smtp.gmail.com with ESMTPSA id t14-v6sm32236818pfh.109.2018.05.21.17.00.17 (version=TLS1_2 cipher=ECDHE-RSA-CHACHA20-POLY1305 bits=256/256); Mon, 21 May 2018 17:00:17 -0700 (PDT) Date: Mon, 21 May 2018 17:00:16 -0700 From: Joel Fernandes To: "Paul E. McKenney" Cc: Joel Fernandes , linux-kernel@vger.kernel.org, Josh Triplett , Steven Rostedt , Mathieu Desnoyers , Lai Jiangshan , byungchul.park@lge.com, kernel-team@android.com Subject: Re: [PATCH v3 3/4] rcu: Use better variable names in funnel locking loop Message-ID: <20180522000016.GC40541@joelaf.mtv.corp.google.com> References: <20180521044220.123933-1-joel@joelfernandes.org> <20180521044220.123933-4-joel@joelfernandes.org> <20180521231357.GI3803@linux.vnet.ibm.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20180521231357.GI3803@linux.vnet.ibm.com> User-Agent: Mutt/1.9.2 (2017-12-15) Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Mon, May 21, 2018 at 04:13:57PM -0700, Paul E. McKenney wrote: > > --- > > kernel/rcu/tree.c | 48 ++++++++++++++++++++++++----------------------- > > 1 file changed, 25 insertions(+), 23 deletions(-) > > > > diff --git a/kernel/rcu/tree.c b/kernel/rcu/tree.c > > index 0ffd41ba304f..879c67a31116 100644 > > --- a/kernel/rcu/tree.c > > +++ b/kernel/rcu/tree.c > > @@ -1526,7 +1526,7 @@ static void trace_rcu_this_gp(struct rcu_node *rnp, struct rcu_data *rdp, > > > > /* > > * rcu_start_this_gp - Request the start of a particular grace period > > - * @rnp: The leaf node of the CPU from which to start. > > + * @rnp_start: The leaf node of the CPU from which to start. > > * @rdp: The rcu_data corresponding to the CPU from which to start. > > * @gp_seq_req: The gp_seq of the grace period to start. > > * > > @@ -1540,12 +1540,12 @@ static void trace_rcu_this_gp(struct rcu_node *rnp, struct rcu_data *rdp, > > * > > * Returns true if the GP thread needs to be awakened else false. > > */ > > -static bool rcu_start_this_gp(struct rcu_node *rnp, struct rcu_data *rdp, > > +static bool rcu_start_this_gp(struct rcu_node *rnp_start, struct rcu_data *rdp, > > unsigned long gp_seq_req) > > { > > bool ret = false; > > struct rcu_state *rsp = rdp->rsp; > > - struct rcu_node *rnp_root; > > + struct rcu_node *rnp, *rnp_root = NULL; > > Unless I am going blind, this patch really isn't using rnp_root. It > could be removed. Its just limitation of the diff tools. Your eyes are just fine and doing great based on your review comments ;) The rnp_root is used after we break out of the loop. > > > > /* > > * Use funnel locking to either acquire the root rcu_node > > @@ -1556,34 +1556,36 @@ static bool rcu_start_this_gp(struct rcu_node *rnp, struct rcu_data *rdp, > > * scan the leaf rcu_node structures. Note that rnp->lock must > > * not be released. > > */ > > - raw_lockdep_assert_held_rcu_node(rnp); > > - trace_rcu_this_gp(rnp, rdp, gp_seq_req, TPS("Startleaf")); > > - for (rnp_root = rnp; 1; rnp_root = rnp_root->parent) { > > - if (rnp_root != rnp) > > - raw_spin_lock_rcu_node(rnp_root); > > - if (ULONG_CMP_GE(rnp_root->gp_seq_needed, gp_seq_req) || > > - rcu_seq_started(&rnp_root->gp_seq, gp_seq_req) || > > - (rnp != rnp_root && > > - rcu_seq_state(rcu_seq_current(&rnp_root->gp_seq)))) { > > - trace_rcu_this_gp(rnp_root, rdp, gp_seq_req, > > + raw_lockdep_assert_held_rcu_node(rnp_start); > > + trace_rcu_this_gp(rnp_start, rdp, gp_seq_req, TPS("Startleaf")); > > + for (rnp = rnp_start; 1; rnp = rnp->parent) { > > + if (rnp != rnp_start) > > + raw_spin_lock_rcu_node(rnp); > > + if (ULONG_CMP_GE(rnp->gp_seq_needed, gp_seq_req) || > > + rcu_seq_started(&rnp->gp_seq, gp_seq_req) || > > + (rnp != rnp_start && > > + rcu_seq_state(rcu_seq_current(&rnp->gp_seq)))) { > > + trace_rcu_this_gp(rnp, rdp, gp_seq_req, > > TPS("Prestarted")); > > goto unlock_out; > > } > > - rnp_root->gp_seq_needed = gp_seq_req; > > - if (rcu_seq_state(rcu_seq_current(&rnp->gp_seq))) { > > + rnp->gp_seq_needed = gp_seq_req; > > + if (rcu_seq_state(rcu_seq_current(&rnp_start->gp_seq))) { > > The original had a performance bug, which is quite a bit more obvious > given the new names, so thank you for that! The above statement should > instead be as follows: > > if (rcu_seq_state(rcu_seq_current(&rnp->gp_seq))) { > > It does not make sense to keep checking the starting rcu_node because > changes to ->gp_seq happen first at the top of the tree. So we might > take an earlier exit by checking the current rnp instead of rechecking > rnp_start over and over. > > Please feel free to make this change, which is probably best as a separate > patch. That way this rename patch can remain a straightforward rename patch. Yes, sounds like a nice optimization and I'm glad my variable renaming helped ;) I feel I should have seen it too. I can make this change and send out with my next series as you suggest. > > /* > > * We just marked the leaf, and a grace period > > * is in progress, which means that rcu_gp_cleanup() > > * will see the marking. Bail to reduce contention. > > */ > > - trace_rcu_this_gp(rnp, rdp, gp_seq_req, > > + trace_rcu_this_gp(rnp_start, rdp, gp_seq_req, > > TPS("Startedleaf")); > > goto unlock_out; > > } > > - if (rnp_root != rnp && rnp_root->parent != NULL) > > - raw_spin_unlock_rcu_node(rnp_root); > > - if (!rnp_root->parent) > > + if (rnp != rnp_start && rnp->parent != NULL) > > + raw_spin_unlock_rcu_node(rnp); > > + if (!rnp->parent) { > > + rnp_root = rnp; > > Since rnp_root is otherwise unused in the new version, the above statement > can be dropped along with the "if" statement's braces and the declaration. Actually rnp_root is needed for tracing calls after we breakout of the loop. thanks! - Joel