Received: by 2002:a25:f815:0:0:0:0:0 with SMTP id u21csp4083906ybd; Tue, 25 Jun 2019 13:50:28 -0700 (PDT) X-Google-Smtp-Source: APXvYqxkyXJ3FGqnMFuUw/hkpu92rRKCaK/4hsBL3oEWu/zy1MRHf07Y7W/odM946bA893OklVW+ X-Received: by 2002:a63:a1f:: with SMTP id 31mr21300624pgk.66.1561495828573; Tue, 25 Jun 2019 13:50:28 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1561495828; cv=none; d=google.com; s=arc-20160816; b=gIkGcRmfIs052dCbZCOmJ/OlYkH2lrPBwt/uUn8BTMjhzmsx34/k84QDWudjjXcuke 1erAxQJa8krjjRtyrVtiwC5cACX4oKhBCjp+9Kc3N4GckUwCa46Lk3mIeTQskMozy3WZ wXZbxxfD6toJTqKmc3nPXUn9+vnmEVCml10CyGdZCX0jc7xin74lzEc0B44q6hRkOrTZ CC36wzfRI+lEuuB1PNlwGGo9VKGCJNIAl9yXnE0KiQRBs3F6qr9Nwn5FqU5ERj9CcEg6 xoCabBeF/REkpTRSTWM6Brk/Lkl/k48a6hH3pYgMEvBJmNARzC/XZemGdjx1gYhFDCU4 Ms3Q== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:content-transfer-encoding:cc:to:subject :message-id:date:from:in-reply-to:references:mime-version :dkim-signature; bh=S3ThzB0FxOM43lC1HEahXxVTCZ708F6Vcodz7HniaZE=; b=Nbt/H2KjxYSlq75MDMC4pTBzRWIHt0iEJX9E1ryLMZf40iXt/rJ1ZKfnnMEXRKdBtd e3bfB+jNSLNXRYvTWoQhl2925qqKo19UCQwa23iS8tnfKayx4NtrhyXFVI4JHZsBAHHN UvOYWGGYuz+paOYyhkct8/7km4KJq9cs+QdlmRT80Da28iK4f2PKj2GzuDzg6bPys8tS YHbJmmSRs062uwEnEKlrYq8Ks2s2dXbbyvBxBI45R5+xDT50w5TFXJ1TvXt2CrXCBb2R 7pdit1K9j/juMpWgQ8lYtwrXPXYzYHw1pfDEug6pvSbk5lDoZNc2DKKOWVCmAhNMs4k5 iOXg== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@gmail.com header.s=20161025 header.b=KJ0ZXzXc; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id m9si153856pjs.95.2019.06.25.13.50.11; Tue, 25 Jun 2019 13:50:28 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; dkim=pass header.i=@gmail.com header.s=20161025 header.b=KJ0ZXzXc; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726955AbfFYUuF (ORCPT + 99 others); Tue, 25 Jun 2019 16:50:05 -0400 Received: from mail-qt1-f196.google.com ([209.85.160.196]:45701 "EHLO mail-qt1-f196.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726053AbfFYUuF (ORCPT ); Tue, 25 Jun 2019 16:50:05 -0400 Received: by mail-qt1-f196.google.com with SMTP id j19so19987426qtr.12; Tue, 25 Jun 2019 13:50:04 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=mime-version:references:in-reply-to:from:date:message-id:subject:to :cc:content-transfer-encoding; bh=S3ThzB0FxOM43lC1HEahXxVTCZ708F6Vcodz7HniaZE=; b=KJ0ZXzXcIbKjkt0vtSCVpLnvHNFsgh09BQvaDlX2cIajjSEJRD3sQEZ06utl5qCFUa 1O3bXsnM1MmOH5DsjYr3tA08qMxDgZJsNe+cb52zQSHF0rjf+cvuLXPCrhIZfkM7nF4f 6rvydx382/mUSU5iX6UNgFbo22l1CRLfyZ9Yp9uvNtAgrke+9OQuHf+KElua5K2uLyq/ FUTKJxtGWE5DOxcrsjldXQLSlb0ALM+/26F9pS61Qhjg64TSRYSlMVWITMhfRar6Uapg WJrFBijBdSDWfi+3lQXyEVKv3Yzt9wMeOWozckx11Yqr583pB/vGIFNJ7Vc9JXMhIkec vOuQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:mime-version:references:in-reply-to:from:date :message-id:subject:to:cc:content-transfer-encoding; bh=S3ThzB0FxOM43lC1HEahXxVTCZ708F6Vcodz7HniaZE=; b=YxkfLVKSrxGvn4RS8BKMVONl4U9/3Ikm5LrALIUHzm2lI41OTUneJqfwSXF1S5+MUk 10lAwlO1qgB+y9tPnjKWTJo5aCW0ec+um6q7tcNyuwICzdEX/+quszi8zpM4WG/cENGQ 0CD+qt8+C2ZN75DjnQvcDudwcujafIH+aj2afraAeUqrjCwnKU37G6TGjBAjHtu448U0 ufXCj0+XjmGdSzNHzj1hd8uszAIHwbTt6HA0gyhF5T5nXy/AlGUyiXdST23gZ1oPrkey P3Ya9hV5hhACCXx1HNCPu+fiT+iLsRaxjMR23hjiSoH1IqqbmWuEUU4o/GQIKmsSj+uW 2Yqg== X-Gm-Message-State: APjAAAWRiadi1LqocMcctTGsbOrLUzm7PBFHsTo7M0u3tWBkQAvlQZgi Og1YvyM2r6u0sHIUQk9gKlZf7LpveCBIlUmn4sM= X-Received: by 2002:a0c:d0b6:: with SMTP id z51mr256561qvg.3.1561495803720; Tue, 25 Jun 2019 13:50:03 -0700 (PDT) MIME-Version: 1.0 References: <20190625182352.13918-1-natechancellor@gmail.com> <34F07894-FDE7-44F8-B7F2-E2003D550AD2@gmail.com> In-Reply-To: <34F07894-FDE7-44F8-B7F2-E2003D550AD2@gmail.com> From: =?UTF-8?B?QmrDtnJuIFTDtnBlbA==?= Date: Tue, 25 Jun 2019 22:49:52 +0200 Message-ID: Subject: Re: [PATCH] xsk: Properly terminate assignment in xskq_produce_flush_desc To: Jonathan Lemon Cc: Nathan Chancellor , =?UTF-8?B?QmrDtnJuIFTDtnBlbA==?= , Magnus Karlsson , "David S. Miller" , Alexei Starovoitov , Daniel Borkmann , Jakub Kicinski , Jesper Dangaard Brouer , John Fastabend , Netdev , bpf , Xdp , LKML , clang-built-linux@googlegroups.com, Nick Desaulniers , Nathan Huckleberry Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Tue, 25 Jun 2019 at 22:04, Jonathan Lemon wro= te: > > > > On 25 Jun 2019, at 11:23, Nathan Chancellor wrote: > > > Clang warns: > > > > In file included from net/xdp/xsk_queue.c:10: > > net/xdp/xsk_queue.h:292:2: warning: expression result unused > > [-Wunused-value] > > WRITE_ONCE(q->ring->producer, q->prod_tail); > > ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ > > include/linux/compiler.h:284:6: note: expanded from macro 'WRITE_ONCE' > > __u.__val; \ > > ~~~ ^~~~~ > > 1 warning generated. > > > > The q->prod_tail assignment has a comma at the end, not a semi-colon. > > Fix that so clang no longer warns and everything works as expected. > > > > Fixes: c497176cb2e4 ("xsk: add Rx receive functions and poll support") > > Link: https://github.com/ClangBuiltLinux/linux/issues/544 > > Signed-off-by: Nathan Chancellor > > Nice find. > > Acked-by: Jonathan Lemon > Yikes. Yes, nice find, indeed. Acked-by: Bj=C3=B6rn T=C3=B6pel The broader question is "Why does it work at all?", which is an "oh no" mom= ent. The problematic functions are xsk_flush() and xsk_generic_rcv, where xskq_produce_flush_desc() is inlined. On the test machine, the GCC version is: $ gcc --version gcc (Ubuntu 7.4.0-1ubuntu1~18.04) 7.4.0 Copyright (C) 2017 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. I when I diff the output, both .lst and .o: $ diff -u old.lst new.lst --- old.lst 2019-06-25 22:10:57.709591605 +0200 +++ new.lst 2019-06-25 22:10:35.301359865 +0200 @@ -2480,7 +2480,7 @@ 1566: 48 8b 87 e0 02 00 00 mov 0x2e0(%rdi),%rax { 156d: 48 89 e5 mov %rsp,%rbp - q->prod_tail =3D q->prod_head, + q->prod_tail =3D q->prod_head; 1570: 8b 50 18 mov 0x18(%rax),%edx 1573: 89 50 1c mov %edx,0x1c(%rax) WRITE_ONCE(q->ring->producer, q->prod_tail); @@ -2649,7 +2649,7 @@ 16fb: 83 40 24 01 addl $0x1,0x24(%rax) xskq_produce_flush_desc(xs->rx); 16ff: 49 8b 86 e0 02 00 00 mov 0x2e0(%r14),%rax - q->prod_tail =3D q->prod_head, + q->prod_tail =3D q->prod_head; 1706: 8b 50 18 mov 0x18(%rax),%edx xs->sk.sk_data_ready(&xs->sk); 1709: 4c 89 f7 mov %r14,%rdi $ diff -u <(gdb -batch -ex 'file old.o' -ex 'disassemble xsk_flush') <(gdb -batch -ex 'file new.o' -ex 'disassemble xsk_flush') && echo "Whew" Whew $ diff -u <(gdb -batch -ex 'file old.o' -ex 'disassemble xsk_generic_rcv') <(gdb -batch -ex 'file new.o' -ex 'disassemble xsk_generic_rcv') && echo "Whew" Whew struct xsk_queue { u64 chunk_mask; /* 0 0x8 */ u64 size; /* 0x8 0x8 */ u32 ring_mask; /* 0x10 0x4 */ u32 nentries; /* 0x14 0x4 */ u32 prod_head; /* 0x18 0x4 */ u32 prod_tail; /* 0x1c 0x4 */ u32 cons_head; /* 0x20 0x4 */ u32 cons_tail; /* 0x24 0x4 */ struct xdp_ring * ring; /* 0x28 0x8 */ u64 invalid_descs; /* 0x30 0x8 */ /* size: 56, cachelines: 1, members: 10 */ /* last cacheline: 56 bytes */ }; So, it appears that the generated code is equal, both in xsk_flush() and xsk_generic_rcv() where flush was inlined. I'll be digging into more GCC versions, and observe the generated code. Regardless, this was a really good find. Thank you very much! Clang is added to my kernel build workflow from now on... Bj=C3=B6rn > > > --- > > net/xdp/xsk_queue.h | 2 +- > > 1 file changed, 1 insertion(+), 1 deletion(-) > > > > diff --git a/net/xdp/xsk_queue.h b/net/xdp/xsk_queue.h > > index 88b9ae24658d..cba4a640d5e8 100644 > > --- a/net/xdp/xsk_queue.h > > +++ b/net/xdp/xsk_queue.h > > @@ -288,7 +288,7 @@ static inline void xskq_produce_flush_desc(struct > > xsk_queue *q) > > /* Order producer and data */ > > smp_wmb(); /* B, matches C */ > > > > - q->prod_tail =3D q->prod_head, > > + q->prod_tail =3D q->prod_head; > > WRITE_ONCE(q->ring->producer, q->prod_tail); > > } > > > > -- > > 2.22.0