Received: by 2002:a05:6a10:8c0a:0:0:0:0 with SMTP id go10csp979465pxb; Wed, 3 Mar 2021 23:19:14 -0800 (PST) X-Google-Smtp-Source: ABdhPJxGhBHJ7KpP893zUQQpMXbV9fKHQPWGI4V2LPWo92lVcvyYb2+nQxshoSyQpZOlLxe5i73t X-Received: by 2002:aa7:c441:: with SMTP id n1mr2707548edr.203.1614842353903; Wed, 03 Mar 2021 23:19:13 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1614842353; cv=none; d=google.com; s=arc-20160816; b=a/XEA0osSF840uGFu5oL5GlWR36LHAQAYIawPjX2Q+HWM8hixOY8cVbgEE5smK6sSs ia8Lk6nhxUw88F1135vESV5TkbEJmb38IVrmBwH+PAKe66W4fEDPhCPv5wFLWoWRJ2tX j767LapKYUtJrYqrL3ek+Qb/TDwPE/shq/pMshR30zsHsZBdYEe7ckv8KQdINaLiFs90 R1gYuksjJpn1J/yNO7dE+4/51506O/Bi5NJrjBItyayvfef6j6n5lJRTV61nvmauomsJ 8gDSPWImwSJ3wl7QuLKlzMFfESUaBELIvhHytfJByDClTCH5sBzDJJcnhkgh/E43u7Mi Ik7w== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:user-agent:in-reply-to:content-transfer-encoding :content-disposition:mime-version:references:message-id:subject:cc :to:from:date; bh=UNnzmVoL2f1k8BP+0oTFsT1mXaBYjXx5eTPO1lHCXPA=; b=QsqeX3rvBuOtSfBj8wqUErXbMLxmm0fBX7UIxIRJ/Swb9Lvvovnrpvc9hZsPEBDPRr Mn3HNl2LvDDWZZsR9XQQ8zaW2S+LR8JRHylWc8QuFI9EHDGrml0T7TT1bBJiCdsyQaAY QjXNw4i6hRLhSIgY4i8EMjcNmLYZLUu3ZTH7fTN+aZKJTNcyqssg5dra48znUaRDWtXL SMqAl9gP5P8i4gwMNcAV3qu7G6QftQJpopw8mx14fXqNIoNX3+DTCQzGudfLT7S/rlu7 RfZY5Ftyf26HpYXyKFbYO+eH8dht30U3nIz+iJ2tjJJF+rIVlS3kP383mziKD8m3fu3h ho4g== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id bx25si6515232edb.242.2021.03.03.23.18.51; Wed, 03 Mar 2021 23:19:13 -0800 (PST) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S2360495AbhCBWVL (ORCPT + 99 others); Tue, 2 Mar 2021 17:21:11 -0500 Received: from netrider.rowland.org ([192.131.102.5]:60963 "HELO netrider.rowland.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with SMTP id S1383579AbhCBVQ2 (ORCPT ); Tue, 2 Mar 2021 16:16:28 -0500 Received: (qmail 1545136 invoked by uid 1000); 2 Mar 2021 16:14:46 -0500 Date: Tue, 2 Mar 2021 16:14:46 -0500 From: Alan Stern To: =?iso-8859-1?Q?Bj=F6rn_T=F6pel?= Cc: bpf , LKML , parri.andrea@gmail.com, Will Deacon , Peter Zijlstra , boqun.feng@gmail.com, npiggin@gmail.com, dhowells@redhat.com, j.alglave@ucl.ac.uk, luc.maranget@inria.fr, paulmck@kernel.org, akiyks@gmail.com, dlustig@nvidia.com, joel@joelfernandes.org, Toke =?iso-8859-1?Q?H=F8iland-J=F8rgensen?= , "Karlsson, Magnus" Subject: Re: XDP socket rings, and LKMM litmus tests Message-ID: <20210302211446.GA1541641@rowland.harvard.edu> References: MIME-Version: 1.0 Content-Type: text/plain; charset=iso-8859-1 Content-Disposition: inline Content-Transfer-Encoding: 8bit In-Reply-To: User-Agent: Mutt/1.10.1 (2018-07-13) Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Tue, Mar 02, 2021 at 07:46:27PM +0100, Bj?rn T?pel wrote: > Hi! > > Firstly; The long Cc-list is to reach the LKMM-folks. > > Some background; the XDP sockets use a ring-buffer to communicate > between the kernel and userland. It's a > single-consumer/single-producer ring, and described in > net/xdp/xsk_queue.h. > > --8<--- > /* The structure of the shared state of the rings are the same as the > * ring buffer in kernel/events/ring_buffer.c. For the Rx and completion > * ring, the kernel is the producer and user space is the consumer. For > * the Tx and fill rings, the kernel is the consumer and user space is > * the producer. > * > * producer consumer > * > * if (LOAD ->consumer) { LOAD ->producer > * (A) smp_rmb() (C) > * STORE $data LOAD $data > * smp_wmb() (B) smp_mb() (D) > * STORE ->producer STORE ->consumer > * } > * > * (A) pairs with (D), and (B) pairs with (C). > ... > -->8--- > > I'd like to replace the smp_{r,w,}mb() barriers with acquire-release > semantics [1], without breaking existing userspace applications. > > So, I figured I'd use herd7 and the LKMM model to build a litmus test > for the barrier version, then for the acquire-release version, and > finally permutations of both. > > The idea is to use a one element ring, with a state machine outlined > in the litmus test. > > The basic test for the existing smp_{r,w,}mb() barriers looks like: > > $ cat spsc-rb+1p1c.litmus > C spsc-rb+1p1c > > // Stupid one entry ring: > // prod cons allowed action prod cons > // 0 0 => prod => 1 0 > // 0 1 => cons => 0 0 > // 1 0 => cons => 1 1 > // 1 1 => prod => 0 1 > > { prod = 1; } > > // Here, we start at prod==1,cons==0, data==0, i.e. producer has > // written data=0, so from here only the consumer can start, and should > // consume data==0. Afterwards, producer can continue and write 1 to > // data. Can we enter state prod==0, cons==1, but consumer observerd > // the write of 1? > > P0(int *prod, int *cons, int *data) > { > int p; > int c; > int cond = 0; > > p = READ_ONCE(*prod); > c = READ_ONCE(*cons); > if (p == 0) > if (c == 0) > cond = 1; > if (p == 1) > if (c == 1) > cond = 1; > > if (cond) { > smp_mb(); > WRITE_ONCE(*data, 1); > smp_wmb(); > WRITE_ONCE(*prod, p ^ 1); > } > } > > P1(int *prod, int *cons, int *data) > { > int p; > int c; > int d = -1; > int cond = 0; > > p = READ_ONCE(*prod); > c = READ_ONCE(*cons); > if (p == 1) > if (c == 0) > cond = 1; > if (p == 0) > if (c == 1) > cond = 1; > > if (cond == 1) { > smp_rmb(); > d = READ_ONCE(*data); > smp_mb(); > WRITE_ONCE(*cons, c ^ 1); > } > } > > exists( 1:d=1 /\ prod=0 /\ cons=1 ); > > -- > > The weird state changing if-statements is because that I didn't get > '&&' and '||' to work with herd. > > When this is run: > > $ herd7 -conf linux-kernel.cfg litmus-tests/spsc-rb+1p1c.litmus > Test spsc-rb+1p1c Allowed > States 2 > 1:d=0; cons=1; prod=0; > 1:d=0; cons=1; prod=1; > No > Witnesses > Positive: 0 Negative: 2 > Condition exists (1:d=1 /\ prod=0 /\ cons=1) > Observation spsc-rb+1p1c Never 0 2 > Time spsc-rb+1p1c 0.04 > Hash=b399756d6a1301ca5bda042f32130791 > > Now to my question; In P0 there's an smp_mb(). Without that, the d==1 > can be observed from P1 (consumer): > > $ herd7 -conf linux-kernel.cfg litmus-tests/spsc-rb+1p1c.litmus > Test spsc-rb+1p1c Allowed > States 3 > 1:d=0; cons=1; prod=0; > 1:d=0; cons=1; prod=1; > 1:d=1; cons=1; prod=0; > Ok > Witnesses > Positive: 1 Negative: 2 > Condition exists (1:d=1 /\ prod=0 /\ cons=1) > Observation spsc-rb+1p1c Sometimes 1 2 > Time spsc-rb+1p1c 0.04 > Hash=0047fc21fa77da9a9aee15e35ec367ef This result is wrong, apparently because of a bug in herd7. There should be control dependencies from each of the two loads in P0 to each of the two stores, but herd7 doesn't detect them. Maybe Luc can find some time to check whether this really is a bug and if it is, fix it. > In commit c7f2e3cd6c1f ("perf: Optimize ring-buffer write by depending > on control dependencies") removes the corresponding smp_mb(), and also > the circular buffer in circular-buffers.txt (pre commit 6c43c091bdc5 > ("documentation: Update circular buffer for > load-acquire/store-release")) is missing the smp_mb() at the > producer-side. > > I'm trying to wrap my head around why it's OK to remove the smp_mb() > in the cases above? I'm worried that the current XDP socket ring > implementation (which is missing smp_mb()) might be broken. Because of the control dependencies, the smp_mb isn't needed. The dependencies will order both of the stores after both of the loads. Alan Stern