Received: by 2002:a05:6358:a55:b0:ec:fcf4:3ecf with SMTP id 21csp1009681rwb; Sat, 14 Jan 2023 12:22:09 -0800 (PST) X-Google-Smtp-Source: AMrXdXu71cyVARx5ZTVdTdUBQESMZOZVQz9MEuIG6YRJjwDUFzmoZNdM15RAjvgalU+phERU/Ufe X-Received: by 2002:a17:90a:b306:b0:218:d7ee:d4ba with SMTP id d6-20020a17090ab30600b00218d7eed4bamr89893939pjr.3.1673727729705; Sat, 14 Jan 2023 12:22:09 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1673727729; cv=none; d=google.com; s=arc-20160816; b=Xl/Og3Cp8h+FNIUUswnsa/GoPDI5Rv70Z+JH/GxTFaF3jwZ8GekIgOmBWIsSxLOOzi CB/8YxwGTaMlclFh66LPqu+gP7EyS9wAIIJCH6810qo6lETn0rB89hsp5nVFMeEUMchq tdGT1CXQ3OfzvsD6dKv6X/jSzlCUH0s5sxSJjb1+fw9ppFZkLBNPMK7FBKVVom/DPHni bLBzGHD90g9fzM/tO/yly0BO5bjPf3mjFoyhBYyFRr/QtZrH0gaAYEOr5oLKfkAE7vdi VKvhsk3hOE+8f4iArNdYdYDK/NUoo4aWFydyDVX06GG4dpEKVfDpsy+DSc2li8+0azJm Ibnw== 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-disposition:mime-version :references:message-id:subject:cc:to:from:date; bh=MmbC2YwGRuaC2o/hYDSyDWm2SpQg2eN2xfTQl2zs8M4=; b=eqcXyyq44Oj9vYamWN8aXCgKDdlcZ1pDqPTxeJi31p+YsQlZcKrkxVr5xufl8tbOsy KAPyKDi0wagBd/YwtvaJgp5lzOXzIopaQwuunEWcuhXnSoVFUnVjNxtt+SepMZRiyVqJ Q9JUM+fDCPxk9ySt1l1CkAE8XFIR2uG285pv37tLbozEWYKtrdztlu4Ww/e0EFa+qlQi rhPwz2f67TtRglN7XggeRSR+ez9mE5/0jSxvQszYI/cfImVPH3kBAxfCTZOJDvNbObHa bkiP6WEZXjY+hVbiNnp4aigQSsS4VxkMCCVEgv9XTNkRMRFHUU1xsAHf+WGLi7frKekG FtMQ== 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 i2-20020a17090ac40200b00219f65e19fcsi26686725pjt.170.2023.01.14.12.22.03; Sat, 14 Jan 2023 12:22:09 -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; 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 S230235AbjANT6d (ORCPT + 53 others); Sat, 14 Jan 2023 14:58:33 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:35402 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229971AbjANT6b (ORCPT ); Sat, 14 Jan 2023 14:58:31 -0500 Received: from netrider.rowland.org (netrider.rowland.org [192.131.102.5]) by lindbergh.monkeyblade.net (Postfix) with SMTP id 3ACB05B8C for ; Sat, 14 Jan 2023 11:58:30 -0800 (PST) Received: (qmail 71149 invoked by uid 1000); 14 Jan 2023 14:58:29 -0500 Date: Sat, 14 Jan 2023 14:58:29 -0500 From: Alan Stern To: "Paul E. McKenney" Cc: Jonas Oberhauser , Peter Zijlstra , "parri.andrea" , will , "boqun.feng" , npiggin , dhowells , "j.alglave" , "luc.maranget" , akiyks , dlustig , joel , urezki , quic_neeraju , frederic , Kernel development list Subject: Re: Internal vs. external barriers (was: Re: Interesting LKMM litmus test) Message-ID: References: <114ECED5-FED1-4361-94F7-8D9BC02449B7> <4c1abc7733794519ad7c5153ae8b58f9@huawei.com> <20230113200706.GI4028633@paulmck-ThinkPad-P17-Gen-1> <20230113203241.GA2958699@paulmck-ThinkPad-P17-Gen-1> <136d019d8c8049f6b737627df830e66f@huawei.com> <20230114175343.GF2948950@paulmck-ThinkPad-P17-Gen-1> <20230114181537.GA493203@paulmck-ThinkPad-P17-Gen-1> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20230114181537.GA493203@paulmck-ThinkPad-P17-Gen-1> X-Spam-Status: No, score=-1.7 required=5.0 tests=BAYES_00, HEADER_FROM_DIFFERENT_DOMAINS,SPF_HELO_PASS,SPF_PASS 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 Sat, Jan 14, 2023 at 10:15:37AM -0800, Paul E. McKenney wrote: > > > Perhaps the closest to what you want is to express that as a data dependency if you know how to teach herd that Srcu-unlock is a read and Srcu-lock depends on its second input :D (I have no idea how to do that, hence the questions above) > > > > Given that both you and Alan suggested it, I must try it. ;-) > > And it works as desired on these litmus tests: > > manual/kernel/C-srcu-nest-*.litmus > > In this repository: > > https://github.com/paulmckrcu/litmus > > However, this has to be dumb luck because herd7 does not yet provide > the second argument to srcu_read_unlock(). Yes it does. Grep for srcu_read_unlock in linux-kernel.def and you'll see two arguments. > My guess is that the herd7 > is noting the dependency that is being carried by the pointers to the > srcu_struct structures. That is not a dependency. > This guess stems in part from the fact that > I get "Flag unbalanced-srcu-locking" when I have one SRCU read-side > critical section following another in the same process, both using the > same srcu_struct structure. > > Nevertheless, here is the resulting .bell fragment: > > ------------------------------------------------------------------------ > > (* Compute matching pairs of Srcu-lock and Srcu-unlock *) > let srcu-rscs = ([Srcu-lock] ; data ; [Srcu-unlock]) & loc > > (* Validate nesting *) > flag ~empty Srcu-lock \ domain(srcu-rscs) as unbalanced-srcu-locking > flag ~empty Srcu-unlock \ range(srcu-rscs) as unbalanced-srcu-locking > > (* Check for use of synchronize_srcu() inside an RCU critical section *) > flag ~empty rcu-rscs & (po ; [Sync-srcu] ; po) as invalid-sleep > > (* Validate SRCU dynamic match *) > flag ~empty different-values(srcu-rscs) as srcu-bad-nesting > > ------------------------------------------------------------------------ > > I also created a C-srcu-nest-*.litmus as shown below, and LKMM does > complain about one srcu_read_lock() feeding into multiple instances of > srcu_read_unlock(). It shouldn't; that doesn't happen in the litmus test below. But the test does contain an srcu_read_lock() that doesn't match any instances of srcu_read_unlock(), so you should be getting an "unbalanced-srcu-locking" complaint -- and indeed, you mentioned above that this does happen. Also, your bell file doesn't contain a check for a lock matched with multiple unlocks, so there's no way for herd to complain about it. > The complaint comes from the different_values() > check, which presumably complains about any duplication in the domain > or range of the specified relation. No; different_values() holds when the values of the two events linked by srcu-rscs are different. It has nothing to do with duplication. > But still working by accident! ;-) > > Thanx, Paul > > ------------------------------------------------------------------------ > > C C-srcu-nest-3 > > (* > * Result: Flag srcu-bad-nesting > * > * This demonstrates erroneous matching of a single srcu_read_lock() > * with multiple srcu_read_unlock() instances. > *) > > {} > > P0(int *x, int *y, struct srcu_struct *s1, struct srcu_struct *s2) > { > int r1; > int r2; > int r3; > int r4; > > r3 = srcu_read_lock(s1); > r2 = READ_ONCE(*y); > r4 = srcu_read_lock(s2); > r5 = srcu_read_lock(s2); > srcu_read_unlock(s1, r3); > r1 = READ_ONCE(*x); > srcu_read_unlock(s2, r4); > } This has 3 locks and 2 unlocks. The first lock matches the the first unlock (r3 and s3), the second lock matches the second unlock (r4 and s2), and the third lock doesn't match any unlock (r5 and s2). Alan > > P1(int *x, int *y, struct srcu_struct *s2) > { > WRITE_ONCE(*y, 1); > synchronize_srcu(s2); > WRITE_ONCE(*x, 1); > } > > locations [0:r1] > exists (0:r1=1 /\ 0:r2=0)