Received: by 2002:ac0:a594:0:0:0:0:0 with SMTP id m20-v6csp929309imm; Mon, 21 May 2018 17:29:42 -0700 (PDT) X-Google-Smtp-Source: AB8JxZobUiknjWoSG8dCrXbUpYtJS0qTthiaxTACG1gOX/zd/bVzvnGbeRMiLHI0IdwEE5dz4q8R X-Received: by 2002:a63:2c13:: with SMTP id s19-v6mr17585534pgs.427.1526948982486; Mon, 21 May 2018 17:29:42 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1526948982; cv=none; d=google.com; s=arc-20160816; b=KdLFK2Ky4E/Ka1r9xy70rHUY9kBgW2ErZ006vx42q3c4dcePBL2qcMRPpHiZZzqk1E v27zH5su9y0dSSG/VhbdSMGMmcyYJPWg+Fbl19nrZmWOWfJIMYB7HSFMEQVJhpvAQBG3 J48U94FmKnlfNm/0IvyRglUlEv/5H68HAgs+Q2wokXG+qhm5zXcKsNUUUUb4d2eRpwcg 7T5OE98Xb/Dl7gKoSx70cW7i3Vzqc8a4quFwgE5ZpU1X5l+CpWG23ZgHDig1ClLheWyJ teYijm+DV8W5NWh3Lmi46yW8R/nCPAoCjAOUTpbxacOWoL2xT/6bTp/HGJDC/4ulPA4A 8Kag== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:message-id:user-agent:in-reply-to :content-disposition:mime-version:references:reply-to:subject:cc:to :from:date:arc-authentication-results; bh=cOjFweXQoFsoBfY5BjMFBsvbOcw+beW0wCVIxx/9Q8M=; b=AGknv41+LKw+I9rtRIPzSRiuU+qzNfkbRn1zUkZ5PpkjWjmf1iimYZ1DG6a8Yp3RBa pJVLnzqVaqzTEd0Q74tb6kXywJ4mD+Mbkinw2rE8V/epMHi5B3E6FF2QOHRepRXW+u94 G4HpW5nkprDF9mV3xXSFA4SVVovPVbU5HbPhirdqfX9bv3s6192DI4oq0WNUlJgWRS/5 oaXM1uxiqCBe6715RTRaQHqygaMA5Ertv0a5jhsudWtzrp6/Fr2woSEmzSKke8kTajW+ MLEDdnbt6kbiiOLIHOqU7mnstylUJWR23/z1MTo2jJFUNPVtzH/SLqNNE2yJc7BLyoWk hTZQ== ARC-Authentication-Results: i=1; mx.google.com; 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=fail (p=NONE sp=NONE dis=NONE) header.from=ibm.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id 1-v6si14864282plk.521.2018.05.21.17.29.27; Mon, 21 May 2018 17:29:42 -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; 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=fail (p=NONE sp=NONE dis=NONE) header.from=ibm.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752096AbeEVA1q (ORCPT + 99 others); Mon, 21 May 2018 20:27:46 -0400 Received: from mx0a-001b2d01.pphosted.com ([148.163.156.1]:44986 "EHLO mx0a-001b2d01.pphosted.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751576AbeEVA1n (ORCPT ); Mon, 21 May 2018 20:27:43 -0400 Received: from pps.filterd (m0098409.ppops.net [127.0.0.1]) by mx0a-001b2d01.pphosted.com (8.16.0.22/8.16.0.22) with SMTP id w4M0Nbqm056637 for ; Mon, 21 May 2018 20:27:42 -0400 Received: from e11.ny.us.ibm.com (e11.ny.us.ibm.com [129.33.205.201]) by mx0a-001b2d01.pphosted.com with ESMTP id 2j44mfg0ca-1 (version=TLSv1.2 cipher=AES256-GCM-SHA384 bits=256 verify=NOT) for ; Mon, 21 May 2018 20:27:42 -0400 Received: from localhost by e11.ny.us.ibm.com with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted for from ; Mon, 21 May 2018 20:27:41 -0400 Received: from b01cxnp23032.gho.pok.ibm.com (9.57.198.27) by e11.ny.us.ibm.com (146.89.104.198) with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted; Mon, 21 May 2018 20:27:39 -0400 Received: from b01ledav003.gho.pok.ibm.com (b01ledav003.gho.pok.ibm.com [9.57.199.108]) by b01cxnp23032.gho.pok.ibm.com (8.14.9/8.14.9/NCO v10.0) with ESMTP id w4M0RcA148300106; Tue, 22 May 2018 00:27:38 GMT Received: from b01ledav003.gho.pok.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 619C7B2065; Mon, 21 May 2018 21:29:29 -0400 (EDT) Received: from b01ledav003.gho.pok.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 30EA9B205F; Mon, 21 May 2018 21:29:29 -0400 (EDT) Received: from paulmck-ThinkPad-W541 (unknown [9.70.82.108]) by b01ledav003.gho.pok.ibm.com (Postfix) with ESMTP; Mon, 21 May 2018 21:29:29 -0400 (EDT) Received: by paulmck-ThinkPad-W541 (Postfix, from userid 1000) id 4323A16C3FCA; Mon, 21 May 2018 17:29:15 -0700 (PDT) Date: Mon, 21 May 2018 17:29:15 -0700 From: "Paul E. McKenney" To: Joel Fernandes 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 Reply-To: paulmck@linux.vnet.ibm.com References: <20180521044220.123933-1-joel@joelfernandes.org> <20180521044220.123933-4-joel@joelfernandes.org> <20180521231357.GI3803@linux.vnet.ibm.com> <20180522000016.GC40541@joelaf.mtv.corp.google.com> <20180522001925.GO3803@linux.vnet.ibm.com> <20180522001951.GE40541@joelaf.mtv.corp.google.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20180522001951.GE40541@joelaf.mtv.corp.google.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-TM-AS-GCONF: 00 x-cbid: 18052200-2213-0000-0000-000002A95E4A X-IBM-SpamModules-Scores: X-IBM-SpamModules-Versions: BY=3.00009063; HX=3.00000241; KW=3.00000007; PH=3.00000004; SC=3.00000261; SDB=6.01035761; UDB=6.00529805; IPR=6.00814890; MB=3.00021229; MTD=3.00000008; XFM=3.00000015; UTC=2018-05-22 00:27:41 X-IBM-AV-DETECTION: SAVI=unused REMOTE=unused XFE=unused x-cbparentid: 18052200-2214-0000-0000-00005A33898F Message-Id: <20180522002915.GQ3803@linux.vnet.ibm.com> X-Proofpoint-Virus-Version: vendor=fsecure engine=2.50.10434:,, definitions=2018-05-21_10:,, signatures=0 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 priorityscore=1501 malwarescore=0 suspectscore=0 phishscore=0 bulkscore=0 spamscore=0 clxscore=1015 lowpriorityscore=0 impostorscore=0 adultscore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.0.1-1709140000 definitions=main-1805220003 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 05:19:51PM -0700, Joel Fernandes wrote: > On Mon, May 21, 2018 at 05:19:25PM -0700, Paul E. McKenney wrote: > > On Mon, May 21, 2018 at 05:00:16PM -0700, Joel Fernandes wrote: > > > 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. > > > > But at that point, rnp_root is equal to rnp, so rnp_root still isn't > > really needed, correct? > > You are right. Sorry about that, so I'll change the tracepoints that follow > to use rnp, as you suggested. Sounds good, thank you! Thanx, Paul