Received: by 2002:a05:6358:f14:b0:e5:3b68:ec04 with SMTP id b20csp572027rwj; Thu, 22 Dec 2022 11:27:30 -0800 (PST) X-Google-Smtp-Source: AMrXdXvZEwOs+vRRO6YO5YcjuyIBDb0ngV/nSm3A+aJMWDNfrvuMH6kP1lWiVFzWXbxDR8GErSrb X-Received: by 2002:a17:902:8ec7:b0:192:4f85:b91d with SMTP id x7-20020a1709028ec700b001924f85b91dmr5703682plo.46.1671737249896; Thu, 22 Dec 2022 11:27:29 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1671737249; cv=none; d=google.com; s=arc-20160816; b=TTkVzOu6aGAsafurVWvf5NuqZd8GCVfzj98LFK85O/iDIpdw5/jixxfjSHGWjGCeq8 MNOFTaNVZiOIbCNyd8ZG4C5cTTyKCcVgIRfAULeX5q6ioA5wOA2RZZym4kjDyb/0QIxJ LoedRfPpdl0RY23wi1a9dpH2+SW8PVO4c7BHt673eZBsXbxdZDPpqd+rV4Qexqj+0STk sBa2GQ5JuszP3lkV0LNJYnSS/1EPZSVtb2PLM+y6Rz9BAJqbwHNs1wEzuTY82PuD4hOI Iw4pvkYLOJghYbCn30lp8f9q7Xzlny+em56r4l0PdhQB0kKw0I2Wnz3AVgrh8lY8QEzM e2rg== 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=G9GtYq5cFfOBVYzvVU+5PZZIf4834gIHOOKcq4hB2+g=; b=uXexaWeJNxVNQJubW4pgKIsrhV05kEQwxbTtfshCz1D4jhzgOWGcU+VOJfmgtUEVf5 K9m+JEQ+FhCImMV2BjtVhChWMpksufPmj8roBG2i5izsdO5osQwuMXWiRsTc84z9U8Sl kG0vmHV5c3hZXCxOd6YFxDqueyyreTYNEvFBP5cIwF9X404eScAJZmdKMKldbnDn0x+k wfCfG8ITgBXbRs4P7bdsg2P9fuHvMEFEdvjEnXiJhe6RBMYbZQxHq41+TDk5zpqOumP7 YSf6cDFMIyjlIxczH8fG7CmBS7gjscdXJIB8cMFyHuW9dXNy3+dKKGlR9Xi4XxRb4RzT kMFw== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kernel.org header.s=k20201202 header.b=E6TLZ3eI; 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 e19-20020a170902e0d300b00188fce355c9si1188567pla.42.2022.12.22.11.27.20; Thu, 22 Dec 2022 11:27:29 -0800 (PST) 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=E6TLZ3eI; 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 S231337AbiLVSy1 (ORCPT + 68 others); Thu, 22 Dec 2022 13:54:27 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:32990 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S235490AbiLVSyL (ORCPT ); Thu, 22 Dec 2022 13:54:11 -0500 Received: from dfw.source.kernel.org (dfw.source.kernel.org [139.178.84.217]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 64C2624941; Thu, 22 Dec 2022 10:53:16 -0800 (PST) Received: from smtp.kernel.org (relay.kernel.org [52.25.139.140]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by dfw.source.kernel.org (Postfix) with ESMTPS id 00E9A61D05; Thu, 22 Dec 2022 18:53:16 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id 531C4C433F0; Thu, 22 Dec 2022 18:53:15 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1671735195; bh=0lfqHS+pnnKBfEkssmmqwz9g54VECV2eOGJmG2SehW0=; h=Date:From:To:Cc:Subject:Reply-To:References:In-Reply-To:From; b=E6TLZ3eIjXmPaq+e4d6nwmW4wL73YxySH48U40GgZ9Iw0FOAN6Fcs+YfrziaY4xg+ WK85cOb4PN+L6izp4jAJefrbsaVAYOoErtUGi5M8e5R6/jirmIuJlcQb8HNx5CtoGv DrToqKswi/1BVAu4ecJuV7B6ARiqRZjSymFc0PW08gRHXt5SGexW9vaAkFJGg+CO90 T8YbWRWQOSSg/MXeuGZqCsvJX2Hv2SD5djkxVNIDHF9z8JMdPYVeRqFSOnZigOvcdc GMjexz5tQYvUmwJpHlZVciTV9IUhzvAADnjK4nzyEPKIu2yHuSdKgqlq7mIwRorqOb 8Gdo6DOKjI4qQ== Received: by paulmck-ThinkPad-P17-Gen-1.home (Postfix, from userid 1000) id DD5555C146C; Thu, 22 Dec 2022 10:53:14 -0800 (PST) Date: Thu, 22 Dec 2022 10:53:14 -0800 From: "Paul E. McKenney" To: Joel Fernandes Cc: Frederic Weisbecker , Mathieu Desnoyers , linux-kernel@vger.kernel.org, Josh Triplett , Lai Jiangshan , rcu@vger.kernel.org, Steven Rostedt Subject: Re: [RFC 0/2] srcu: Remove pre-flip memory barrier Message-ID: <20221222185314.GR4001@paulmck-ThinkPad-P17-Gen-1> Reply-To: paulmck@kernel.org References: <20221222164302.GP4001@paulmck-ThinkPad-P17-Gen-1> <71C23049-158C-4E43-A54F-714640393682@joelfernandes.org> MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: 8bit In-Reply-To: <71C23049-158C-4E43-A54F-714640393682@joelfernandes.org> X-Spam-Status: No, score=-7.1 required=5.0 tests=BAYES_00,DKIMWL_WL_HIGH, DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,RCVD_IN_DNSWL_HI, SPF_HELO_NONE,SPF_PASS 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 Thu, Dec 22, 2022 at 01:19:06PM -0500, Joel Fernandes wrote: > > > > On Dec 22, 2022, at 11:43 AM, Paul E. McKenney wrote: > > > > On Thu, Dec 22, 2022 at 01:40:10PM +0100, Frederic Weisbecker wrote: > >>> On Wed, Dec 21, 2022 at 12:11:42PM -0500, Mathieu Desnoyers wrote: > >>> On 2022-12-21 06:59, Frederic Weisbecker wrote: > >>>>> On Tue, Dec 20, 2022 at 10:34:19PM -0500, Mathieu Desnoyers wrote: > >>> [...] > >>>>> > >>>>> The memory ordering constraint I am concerned about here is: > >>>>> > >>>>> * [...] In addition, > >>>>> * each CPU having an SRCU read-side critical section that extends beyond > >>>>> * the return from synchronize_srcu() is guaranteed to have executed a > >>>>> * full memory barrier after the beginning of synchronize_srcu() and before > >>>>> * the beginning of that SRCU read-side critical section. [...] > >>>>> > >>>>> So if we have a SRCU read-side critical section that begins after the beginning > >>>>> of synchronize_srcu, but before its first memory barrier, it would miss the > >>>>> guarantee that the full memory barrier is issued before the beginning of that > >>>>> SRCU read-side critical section. IOW, that memory barrier needs to be at the > >>>>> very beginning of the grace period. > >>>> > >>>> I'm confused, what's wrong with this ? > >>>> > >>>> UPDATER READER > >>>> ------- ------ > >>>> STORE X = 1 STORE srcu_read_lock++ > >>>> // rcu_seq_snap() smp_mb() > >>>> smp_mb() READ X > >>>> // scans > >>>> READ srcu_read_lock > >>> > >>> What you refer to here is only memory ordering of the store to X and load > >>> from X wrt loading/increment of srcu_read_lock, which is internal to the > >>> srcu implementation. If we really want to model the provided high-level > >>> memory ordering guarantees, we should consider a scenario where SRCU is used > >>> for its memory ordering properties to synchronize other variables. > >>> > >>> I'm concerned about the following Dekker scenario, where synchronize_srcu() > >>> and srcu_read_lock/unlock would be used instead of memory barriers: > >>> > >>> Initial state: X = 0, Y = 0 > >>> > >>> Thread A Thread B > >>> --------------------------------------------- > >>> STORE X = 1 STORE Y = 1 > >>> synchronize_srcu() > >>> srcu_read_lock() > >>> r1 = LOAD X > >>> srcu_read_unlock() > >>> r0 = LOAD Y > >>> > >>> BUG_ON(!r0 && !r1) > >>> > >>> So in the synchronize_srcu implementation, there appears to be two > >>> major scenarios: either srcu_gp_start_if_needed starts a gp or expedited gp, > >>> or it uses an already started gp/expedited gp. When snapshotting with > >>> rcu_seq_snap, the fact that the memory barrier is after the ssp->srcu_gp_seq > >>> load means that it does not order prior memory accesses before that load. > >>> This sequence value is then used to identify which gp_seq to wait for when > >>> piggy-backing on another already-started gp. I worry about reordering > >>> between STORE X = 1 and load of ssp->srcu_gp_seq, which is then used to > >>> piggy-back on an already-started gp. > >>> > >>> I suspect that the implicit barrier in srcu_read_lock() invoked at the > >>> beginning of srcu_gp_start_if_needed() is really the barrier that makes > >>> all this behave as expected. But without documentation it's rather hard to > >>> follow. > >> > >> Oh ok I see now. It might be working that way by accident or on forgotten > >> purpose. In any case, we really want to add a comment above that > >> __srcu_read_lock_nmisafe() call. > > > > Another test for the safety (or not) of removing either D or E is > > to move that WRITE_ONCE() to follow (or, respectively, precede) the > > adjacent scans. > > Good idea, though I believe the MBs that the above talk about are not the flip ones. They are the ones in synchronize_srcu() beginning and end, that order with respect to grace period start and end. > > So that (flipping MBs) is unrelated, or did I miss something? The thought is to manually similate in the source code the maximum memory-reference reordering that a maximally hostile compiler and CPU would be permitted to carry out. So yes, given that there are other memory barriers before and after, these other memory barriers limit how far the flip may be moved in the source code. Here I am talking about the memory barriers associated with the flip, but the same trick can of course be applied to other memory barriers. In general, remove a given memory barrier and (in the source code) maximally rearrange the memory references that were previously ordered by the memory barrier in question. Again, the presence of other memory barriers will limit the permitted maximal source-code rearrangement. Thanx, Paul