Received: by 2002:a05:6358:3188:b0:123:57c1:9b43 with SMTP id q8csp11961637rwd; Thu, 22 Jun 2023 22:40:42 -0700 (PDT) X-Google-Smtp-Source: ACHHUZ68BDcoFfQYtzm467xDScAMY3MsQJiGPX7uGNADp+pbFUtb3SpO8VMytu96Djf6vtq0YIKZ X-Received: by 2002:a05:6a21:998e:b0:122:1de8:71c9 with SMTP id ve14-20020a056a21998e00b001221de871c9mr13212567pzb.27.1687498842457; Thu, 22 Jun 2023 22:40:42 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1687498842; cv=none; d=google.com; s=arc-20160816; b=RaBwHhME/aMjUXoctezvQmjAdeJEekshVVy/AStwikgRVB4uS43GwVIOvLpZtIpINb bdpa2rYdRYIQwVzt4Zqwdl6EI3j7bzL7gGCFJ+JHbag7rToOuznMqxqqM90E1gwrvepK lWKY2S+NA0jDszW012XIqudhbnUemcae4J5RcSpVOgg+OtdOZQl6l+JF81NBbfvqGcI4 kAClIignxntvnwryBvt+UhUIAxBDw1nMe0a7gz5k/1jUvo37+ahdDBxyQ94CxXI2scRP J21NXz7ihfm5bh5ZJ5le0QkmVtq7Ii1tPWdt2Um9fQfqD3WQB4Ff2NTauEZ+krMLlTi2 JTbQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:in-reply-to:content-transfer-encoding :content-disposition:mime-version:references:reply-to:message-id :subject:cc:to:from:date:dkim-signature; bh=h1G83ZeEXrTUEnIIjgH4WIU2Wbwyey1X+HZ9h5+8KvI=; b=kZ97xIMlsdgclvG7F72l/twX0aKTrkYGRCjb0fR5sfoeMaLfA6i5KXuFauNAzfc5J9 2NZQ/jtsG1JxXy1zM/uTLvHW/bCUj1muWgKLyflL3P9i342cTQum184m921qtYmXwLJR gaHb7/BDN7+/caGV1DPW96aEfDL4hdQKuBD7id1njo6Yt+KR09rbKBd92dsrJXRH7ykU WPb//DRhBy3cwXsKuiOEcNqe2OSkbYwwAIxNb/L9OUxVWp8QdRIlC2u6bzkuzABQzWrQ L5d/yv1ZI/wUq6sDfBHIZF9lVo2mYUimWxPmcleaW//PgrRUPgR9jCHUPlW8g2vuX7Hf MhjA== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kernel.org header.s=k20201202 header.b=iecVcTPZ; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=kernel.org Return-Path: Received: from out1.vger.email (out1.vger.email. [2620:137:e000::1:20]) by mx.google.com with ESMTP id z16-20020a170903019000b001b679ec31ccsi1843317plg.70.2023.06.22.22.40.16; Thu, 22 Jun 2023 22:40:42 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) client-ip=2620:137:e000::1:20; Authentication-Results: mx.google.com; dkim=pass header.i=@kernel.org header.s=k20201202 header.b=iecVcTPZ; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S231214AbjFWFR2 (ORCPT + 99 others); Fri, 23 Jun 2023 01:17:28 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:54628 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229469AbjFWFR1 (ORCPT ); Fri, 23 Jun 2023 01:17:27 -0400 Received: from dfw.source.kernel.org (dfw.source.kernel.org [IPv6:2604:1380:4641:c500::1]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id C843F1FF5; Thu, 22 Jun 2023 22:17:25 -0700 (PDT) Received: from smtp.kernel.org (relay.kernel.org [52.25.139.140]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits)) (No client certificate requested) by dfw.source.kernel.org (Postfix) with ESMTPS id 4C8C461976; Fri, 23 Jun 2023 05:17:25 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id A662DC433C8; Fri, 23 Jun 2023 05:17:24 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1687497444; bh=XX6cUuDdk9ATCSiX4MTnMkPw220czxXOLev5W1cROd4=; h=Date:From:To:Cc:Subject:Reply-To:References:In-Reply-To:From; b=iecVcTPZymyB3ev5EB1lOFSfIzhKgfN4XcJcbxovmXtBvjexkClGWES/47ZYMUI4Z QnJC5xN81fP38xrRhSey58INv/a8ncUH3xF0h2Tn34lOohPy32waEjQ2jlTsBurNSX MGQMkhvju/4JG9bTQcPBmpnuER5qs9bIr6WxlCAe/3csszQ5eTFD34rBtyub3MB6Vx MFeVKKfOuCdgthC0VtZ2GtrChM4l+bmRnz+M/uAmdvDxZ0EVOVd/a84HHR4p7Tg5rE afy1plXymmvOSTlb/OgeRdTlCGd6FqhgP3uMICTuMTTs3WqRbsjTvkbf3oxvD0QSY7 wMvsctURVom+w== Received: by paulmck-ThinkPad-P17-Gen-1.home (Postfix, from userid 1000) id 40B6BCE2569; Thu, 22 Jun 2023 22:17:24 -0700 (PDT) Date: Thu, 22 Jun 2023 22:17:24 -0700 From: "Paul E. McKenney" To: Alan Huang Cc: rcu@vger.kernel.org, linux-kernel@vger.kernel.org Subject: Re: [PATCH v2] rcu: Add necessary WRITE_ONCE() Message-ID: <2fd1169a-a695-4bff-9611-a84dd02025b2@paulmck-laptop> Reply-To: paulmck@kernel.org References: <20230620171346.207076-1-mmpgouride@gmail.com> <50c4aa37-388b-449c-8184-00a9d69471fc@paulmck-laptop> MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: 8bit In-Reply-To: X-Spam-Status: No, score=-4.4 required=5.0 tests=BAYES_00,DKIMWL_WL_HIGH, DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,RCVD_IN_DNSWL_MED, SPF_HELO_NONE,SPF_PASS,T_SCC_BODY_TEXT_LINE autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on lindbergh.monkeyblade.net Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Wed, Jun 21, 2023 at 10:08:28AM +0800, Alan Huang wrote: > > > 2023年6月21日 06:26,Paul E. McKenney 写道: > > > > On Tue, Jun 20, 2023 at 05:13:46PM +0000, Alan Huang wrote: > >> Commit c54a2744497d("list: Add hlist_unhashed_lockless()") and > >> commit 860c8802ace1("rcu: Use WRITE_ONCE() for assignments to > >> ->pprev for hlist_nulls") added various WRITE_ONCE() to pair with > >> the READ_ONCE() in hlist_unhashed_lockless(), but there are still > >> some places where WRITE_ONCE() was not added, this commit adds that. > >> > >> Also add WRITE_ONCE() to pair with the READ_ONCE() in hlist_empty(). > >> > >> Signed-off-by: Alan Huang > > > > On hlist_nulls_add_tail_rcu(), good catch, thank you! > > > > On the others, are there really cases where a lockless read races with > > the update? At first glance, that sounds like a usage bug. For example, > > as I understand it, when you use something like hlist_del(), you are > > supposed to ensure that there are no concurrent readers. Which is the > > point of the assignment of the special value LIST_POISON2, right? > > Do you mean there are cases where a lockless read races with hlist_add_head/hlist_add_before > hlist_add_behind/__hlist_del, but there is no real case where a lockless read races with the hlist_del_init/hlist_del > hlist_move_list? > > There may be no real case where a lockless read races with the hlist_del_init/hlist_del > hlist_move_list. But for the sake of completeness, I added those WRITE_ONCE, after all, if there is WRITE_ONCE > in __hlist_del, why not add WRITE_ONCE in its caller, like hlist_del()? You might well have located a larger issue. We want to be able to use KCSAN to find unintended data races, but as you noted, there might be different requirements for RCU-protected linked lists and for lock-protected linked lists. If there are, then there is probably existing linked-list code that is using the wrong primitive, for example, using (or failing to use) the one that Eric Dumazet provided. For example, mismatched API usage might be causing the differences in uses of _ONCE() primitives that you are calling out. Would you be interested in digging into this? You will of course need to be able to build and run kernels with KCSAN enabled, which is not hard to do given a laptop that can build a kernel and run a guest OS. Thanx, Paul > Thanks, > Alan > > > > > Or is there some use case that I am missing? > > > > If I am not missing something, then switching the non-RCU APIs to > > WRITE_ONCE() would be a step backwards, because it would make it harder > > for tools like KCSAN to find bugs. > > > > Thanx, Paul > > > >> --- > >> Changelog: > >> V1 -> V2: > >> Add WRITE_ONCE in hlist_del_init to pair with READ_ONCE in > >> hlist_unhashed_lockless. > >> > >> include/linux/list.h | 9 +++++---- > >> include/linux/list_nulls.h | 2 +- > >> include/linux/rculist_nulls.h | 2 +- > >> 3 files changed, 7 insertions(+), 6 deletions(-) > >> > >> diff --git a/include/linux/list.h b/include/linux/list.h > >> index ac366958ea..3a29b95bfe 100644 > >> --- a/include/linux/list.h > >> +++ b/include/linux/list.h > >> @@ -912,7 +912,7 @@ static inline void hlist_del(struct hlist_node *n) > >> { > >> __hlist_del(n); > >> n->next = LIST_POISON1; > >> - n->pprev = LIST_POISON2; > >> + WRITE_ONCE(n->pprev, LIST_POISON2); > >> } > >> > >> /** > >> @@ -925,7 +925,8 @@ static inline void hlist_del_init(struct hlist_node *n) > >> { > >> if (!hlist_unhashed(n)) { > >> __hlist_del(n); > >> - INIT_HLIST_NODE(n); > >> + n->next = NULL; > >> + WRITE_ONCE(n->pprev, NULL); > >> } > >> } > >> > >> @@ -1026,8 +1027,8 @@ static inline void hlist_move_list(struct hlist_head *old, > >> { > >> new->first = old->first; > >> if (new->first) > >> - new->first->pprev = &new->first; > >> - old->first = NULL; > >> + WRITE_ONCE(new->first->pprev, &new->first); > >> + WRITE_ONCE(old->first, NULL); > >> } > >> > >> #define hlist_entry(ptr, type, member) container_of(ptr,type,member) > >> diff --git a/include/linux/list_nulls.h b/include/linux/list_nulls.h > >> index fa6e8471bd..b63b0589fa 100644 > >> --- a/include/linux/list_nulls.h > >> +++ b/include/linux/list_nulls.h > >> @@ -95,7 +95,7 @@ static inline void hlist_nulls_add_head(struct hlist_nulls_node *n, > >> > >> n->next = first; > >> WRITE_ONCE(n->pprev, &h->first); > >> - h->first = n; > >> + WRITE_ONCE(h->first, n); > >> if (!is_a_nulls(first)) > >> WRITE_ONCE(first->pprev, &n->next); > >> } > >> diff --git a/include/linux/rculist_nulls.h b/include/linux/rculist_nulls.h > >> index ba4c00dd80..c65121655b 100644 > >> --- a/include/linux/rculist_nulls.h > >> +++ b/include/linux/rculist_nulls.h > >> @@ -138,7 +138,7 @@ static inline void hlist_nulls_add_tail_rcu(struct hlist_nulls_node *n, > >> > >> if (last) { > >> n->next = last->next; > >> - n->pprev = &last->next; > >> + WRITE_ONCE(n->pprev, &last->next); > >> rcu_assign_pointer(hlist_nulls_next_rcu(last), n); > >> } else { > >> hlist_nulls_add_head_rcu(n, h); > >> -- > >> 2.34.1 > >> >