Received: by 2002:ab3:784e:0:b0:1dc:8548:e819 with SMTP id f14csp131366ltk; Tue, 30 Aug 2022 19:09:20 -0700 (PDT) X-Google-Smtp-Source: AA6agR5nQvZvCDg8pjqzlS93OXMgAX9IbYRnvc1r5HH7ZMX9lVZIpmUX3IjgcRMGZlbMQQZHFSbK X-Received: by 2002:a17:906:58d6:b0:733:77c:5ed1 with SMTP id e22-20020a17090658d600b00733077c5ed1mr19002729ejs.454.1661911760053; Tue, 30 Aug 2022 19:09:20 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1661911760; cv=none; d=google.com; s=arc-20160816; b=If0cyFxh1uiPMtTvxRCODETSULyA72xhMDAac55FGA430HBCPcYbQQvmJcvqtFcTLX muAEKVTxBwgpN/EPOnXHNLCNbzrEcd1OxRcVLYRJJPD2/s2EjS4MhTEBgWrrg6sih77/ IAZjMw1cqA90r6HWY5gGN6u2QVpInZxj+H0riNY02YsJA2KzkxDCfUS4SA6IT8/Xkm9G ixytKKYEJKm/RH2n9N6Z7pPFXZTLODu9RUiiJHqMbm60mOWp/oZ5dTvKroRm9hXf5QQe a1q3kwF42cdPXHQgKNeCn4bP3FS9NiILb8LxbC1CqEtaNQ9YsbXA9TmOvFt4mUyYdlTp zwaw== 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:message-id:subject:cc :to:from:date; bh=K31cJXiZzCWrxXSxakVcE2AGfIMMk18J3HQjqAAS32o=; b=rbgBMb05S2c2exjJp9/fI2V3QedYUBaHU/cEPMHrAgRwoU4UUR8+jAxIpzbbGRyXzF kx2PwZcDdO1rNle+JsTsa1uNF+I9X4B9aulNwFj1AFn5hpGvJGiGOkxwTm7AFd0mPmwM 9aH4PwFwxeDmpTplzTMJ8jStndTJFVCIEi2E3Zu0gazzAmN/PwEJbDZgBmLsW/6zJPEr 4G7jLXriEHZ8FSRWIM/1afsHU1vg5FsPswoX4lOMUXyOwUpAG6Ooi74QqpTHa1jEgw5E adHX5fTSqsXvzs6uUl0Wtb6FACFacMl/v23XQJSfFjmTxPWhqoQMmz2osCV3KYpDVe3s JbpQ== ARC-Authentication-Results: i=1; mx.google.com; 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 Return-Path: Received: from out1.vger.email (out1.vger.email. [2620:137:e000::1:20]) by mx.google.com with ESMTP id em5-20020a056402364500b004484fbd4d33si6987755edb.117.2022.08.30.19.08.55; Tue, 30 Aug 2022 19:09:20 -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; 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 Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S231812AbiHaB5o (ORCPT + 99 others); Tue, 30 Aug 2022 21:57:44 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:37848 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S230454AbiHaB5l (ORCPT ); Tue, 30 Aug 2022 21:57:41 -0400 Received: from netrider.rowland.org (netrider.rowland.org [192.131.102.5]) by lindbergh.monkeyblade.net (Postfix) with SMTP id 46A5BB2D84 for ; Tue, 30 Aug 2022 18:57:40 -0700 (PDT) Received: (qmail 176698 invoked by uid 1000); 30 Aug 2022 21:57:39 -0400 Date: Tue, 30 Aug 2022 21:57:39 -0400 From: Alan Stern To: Joel Fernandes Cc: Paul =?iso-8859-1?Q?Heidekr=FCger?= , Andrea Parri , Will Deacon , Peter Zijlstra , Boqun Feng , Nicholas Piggin , David Howells , Jade Alglave , Luc Maranget , "Paul E. McKenney" , Akira Yokosawa , Daniel Lustig , linux-kernel@vger.kernel.org, linux-arch@vger.kernel.org, Marco Elver , Charalampos Mainas , Pramod Bhatotia , Soham Chakraborty , Martin Fink Subject: Re: [PATCH] tools/memory-model: Weaken ctrl dependency definition in explanation.txt Message-ID: References: <20220830204446.3590197-1-paul.heidekrueger@in.tum.de> <663d568d-a343-d44b-d33d-29998bff8f70@joelfernandes.org> <98f2b194-1fe6-3cd8-36cf-da017c35198f@joelfernandes.org> MIME-Version: 1.0 Content-Type: text/plain; charset=iso-8859-1 Content-Disposition: inline Content-Transfer-Encoding: 8bit In-Reply-To: <98f2b194-1fe6-3cd8-36cf-da017c35198f@joelfernandes.org> X-Spam-Status: No, score=-1.7 required=5.0 tests=BAYES_00, HEADER_FROM_DIFFERENT_DOMAINS,SPF_HELO_PASS,SPF_PASS, T_SCC_BODY_TEXT_LINE autolearn=no 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 Tue, Aug 30, 2022 at 05:12:33PM -0400, Joel Fernandes wrote: > > > On 8/30/2022 5:08 PM, Joel Fernandes wrote: > > > > > > On 8/30/2022 4:44 PM, Paul Heidekr?ger wrote: > >> The current informal control dependency definition in explanation.txt is > >> too broad and, as dicsussed, needs to be updated. > >> > >> Consider the following example: > >> > >>> if(READ_ONCE(x)) > >>> return 42; > >>> > >>> WRITE_ONCE(y, 42); > >>> > >>> return 21; > >> > >> The read event determines whether the write event will be executed "at > >> all" - as per the current definition - but the formal LKMM does not > >> recognize this as a control dependency. > >> > >> Introduce a new defintion which includes the requirement for the second > >> memory access event to syntactically lie within the arm of a non-loop > >> conditional. > >> > >> Link: https://lore.kernel.org/all/20220615114330.2573952-1-paul.heidekrueger@in.tum.de/ > >> Cc: Marco Elver > >> Cc: Charalampos Mainas > >> Cc: Pramod Bhatotia > >> Cc: Soham Chakraborty > >> Cc: Martin Fink > >> Signed-off-by: Paul Heidekr?ger > >> Co-developed-by: Alan Stern > >> --- > >> > >> @Alan: > >> > >> Since I got it wrong the last time, I'm adding you as a co-developer after my > >> SOB. I'm sorry if this creates extra work on your side due to you having to > >> resubmit the patch now with your SOB if I understand correctly, but since it's > >> based on your wording from the other thread, I definitely wanted to give you > >> credit. > >> > >> tools/memory-model/Documentation/explanation.txt | 7 ++++--- > >> 1 file changed, 4 insertions(+), 3 deletions(-) > >> > >> diff --git a/tools/memory-model/Documentation/explanation.txt b/tools/memory-model/Documentation/explanation.txt > >> index ee819a402b69..0bca50cac5f4 100644 > >> --- a/tools/memory-model/Documentation/explanation.txt > >> +++ b/tools/memory-model/Documentation/explanation.txt > >> @@ -464,9 +464,10 @@ to address dependencies, since the address of a location accessed > >> through a pointer will depend on the value read earlier from that > >> pointer. > >> > >> -Finally, a read event and another memory access event are linked by a > >> -control dependency if the value obtained by the read affects whether > >> -the second event is executed at all. Simple example: > >> +Finally, a read event X and another memory access event Y are linked by > >> +a control dependency if Y syntactically lies within an arm of an if, > >> +else or switch statement and the condition guarding Y is either data or > >> +address-dependent on X. Simple example: "if, else or switch" should be just "if or switch". In C there is no such thing as an "else" statement; an "else" clause is merely part of an "if" statement. In fact, maybe "body" would be more appropriate than "arm", because "switch" statements don't have arms -- they have cases. > > 'conditioning guarding Y' sounds confusing to me as it implies to me that the > > condition's evaluation depends on Y. I much prefer Alan's wording from the > > linked post saying something like 'the branch condition is data or address > > dependent on X, and Y lies in one of the arms'. > > > > I have to ask though, why doesn't this imply that the second instruction never > > executes at all? I believe that would break the MP-pattern if it were not true. > > About my last statement, I believe your patch does not disagree with the > correctness of the earlier text but just wants to improve it. If that's case > then that's fine. The biggest difference between the original text and Paul's suggested update is that the new text makes clear that Y has to lie within the body of the "if" or "switch" statement. If Y follows the end of the if/else, as in the example at the top of this email, then it does have not a control dependency on X (at least, not via that if/else), even though the value read by X does determine whether or not Y will execute. [It has to be said that this illustrates a big weakness of the LKMM: It isn't cognizant of "goto"s or "return"s. This naturally derives from limitations of the herd tool, but the situation could be improved. So for instance, I don't think it would cause trouble to say that in: if (READ_ONCE(x) == 0) return; WRITE_ONCE(y, 5); there really is a control dependence from x to y, even though the WRITE_ONCE is outside the body of the "if" statement. Certainly the compiler can't reorder the write before the read. But AFAIK there's no way to include a "return" statement in a litmus test for herd. Or a subroutine definition, for that matter.] I agree that "condition guarding Y" is somewhat awkward. "the condition of the if (or the expression of the switch)" might be better, even though it is somewhat awkward as well. At least it's more explicit. Alan