Received: by 2002:a05:6358:9144:b0:117:f937:c515 with SMTP id r4csp802759rwr; Thu, 4 May 2023 09:44:19 -0700 (PDT) X-Google-Smtp-Source: ACHHUZ5v7b8nVHcc7xU5pe9TQU/D1iQGza8FH3NYcxCN2ArLnMTWG9PbkHb2XJTDdfN0sG4IJumG X-Received: by 2002:a05:6a21:3a48:b0:ef:b575:e55b with SMTP id zu8-20020a056a213a4800b000efb575e55bmr2838066pzb.55.1683218658787; Thu, 04 May 2023 09:44:18 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1683218658; cv=none; d=google.com; s=arc-20160816; b=gU1+JYxW7a88sjTSobe1d/QpeRdDybMUTAo7QD7h5kpg63tsXdlTZRZHn/51/0YyTW i5dCwojW0PXgBQD9c/u30i/1qwhhQW3OUrhpm95/tBJEiJqEq+93PY6lBuw221MpmEW1 CS+LK/no2OneWHBS0q0LFMyhl5Akm6gt36q6O0G/waoHoTm0g2w4DxDkh2xULqgMetFW 946SK2wgeQhl4UU3OQsM1AisBatOKHb7AQ5AL6hv1X8b/DP64CJyZUsjnfZzZwa85xdb WBNyZ9YMwVr6SsG04JChMSZwPVs0fin/x5RL4bBTgAS7qOM3caa9fmGsHluZhkCUKAf9 kcGQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:cc:to:subject :message-id:date:from:in-reply-to:references:mime-version :dkim-signature; bh=ISgqM4Z3Oi0FOwES04jIULNzOCOdZrHkvVQ6clhiCe4=; b=I6iy1Dq6X2D1Gqik2CRZEJzjlJo5uJzoQcpF0fTvm4pWiTLskfkT5MNPBJ7KT22aF7 74lV0sjET1se5pI+V3r2UOgYk465/031rNlNLIq+VwfUde7Qmwwi9hoDDfaUzO2ZFzfc cAs0yiRRIymYh3mh2sYZ997wLOnS0ZX+lkoHSagw5fNncjOl8RakO46Mn8IQdIKoS29K /Vt/FE38q1+mYtezRoX8NQzq6z9r+8Kc6QP0i0WYgBtQGYnNWyeBDdv55A8ivexWnqQ1 qq/Tmpy56hC3ifCL38m2xLwwrfJv8+/+VgVO8QHU0UyVboWeCBCDI0iOzHXC594V11CB ZXSw== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@joelfernandes.org header.s=google header.b=ynlJAFUV; 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 y19-20020a634953000000b0051fb9c77447si33979608pgk.477.2023.05.04.09.44.05; Thu, 04 May 2023 09:44:18 -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; dkim=pass header.i=@joelfernandes.org header.s=google header.b=ynlJAFUV; 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 S229721AbjEDQTy (ORCPT + 99 others); Thu, 4 May 2023 12:19:54 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:46534 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229719AbjEDQTw (ORCPT ); Thu, 4 May 2023 12:19:52 -0400 Received: from mail-yw1-x112f.google.com (mail-yw1-x112f.google.com [IPv6:2607:f8b0:4864:20::112f]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 8E6A33C0D for ; Thu, 4 May 2023 09:19:50 -0700 (PDT) Received: by mail-yw1-x112f.google.com with SMTP id 00721157ae682-555e853d3c5so6295907b3.2 for ; Thu, 04 May 2023 09:19:50 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=joelfernandes.org; s=google; t=1683217190; x=1685809190; h=content-transfer-encoding:cc:to:subject:message-id:date:from :in-reply-to:references:mime-version:from:to:cc:subject:date :message-id:reply-to; bh=ISgqM4Z3Oi0FOwES04jIULNzOCOdZrHkvVQ6clhiCe4=; b=ynlJAFUVp16VnGFAJScNIgHM+CiYCqNDozchRl+hPTp9o4xLTK0eeMwFDFEWlqNBSW Zzekrq1mTZdQcZ4ik/Jc+HIgaIigtU9uBov2d+ivniTh2ZC55DULrczXWGPfRS6oNN+I GsY4CqQrSO9AsjbxTpvA10VGrkJf42ukc4U68= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20221208; t=1683217190; x=1685809190; h=content-transfer-encoding:cc:to:subject:message-id:date:from :in-reply-to:references:mime-version:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=ISgqM4Z3Oi0FOwES04jIULNzOCOdZrHkvVQ6clhiCe4=; b=mH08aF/VQ186DuH6E0947ns/EzRXDZ/GjsmMsHcgfVHm+9l5BPGiDJXFCTVQLTYVV/ MEtLoUZ3Zbr8dQf3aQqMPtJsNmnCIABizoPZ+N+N+vbt9fa8E8CayHXo/LCj94qvZqUF ejTjaNlp2Tv+xeX3eVD6lM7J7kVedDlN+0KehZvNDKMbGNlY76CCmW/j/JHYSwVsTMGF mu6lJSZqIwPFKy+wxfWP8z7shc1ERzYVIWYM229Wlxvt17Wyuau8b+Pc9odCwyn8E06X KReXievxHlm9oUeFj1d8d1Zv/a0xyq3VY7TttAOOl93n+xK6mIPSl3SlRCTqZyDT/eQ3 PxUg== X-Gm-Message-State: AC+VfDy56sBBKtKc24GlcO9Tz1W+SgX1+EXFSaPA7h9cwUCfzYsCXmvt 6eE529qAuXGmw3zEjwvr7/VqvlywUw+nnvpUqgRtTA== X-Received: by 2002:a25:a4c5:0:b0:ba1:90ed:f7e7 with SMTP id g63-20020a25a4c5000000b00ba190edf7e7mr520110ybi.23.1683217189683; Thu, 04 May 2023 09:19:49 -0700 (PDT) MIME-Version: 1.0 References: <20230504012914.1797355-1-mathieu.desnoyers@efficios.com> <20230504012914.1797355-3-mathieu.desnoyers@efficios.com> In-Reply-To: <20230504012914.1797355-3-mathieu.desnoyers@efficios.com> From: Joel Fernandes Date: Thu, 4 May 2023 12:19:38 -0400 Message-ID: Subject: Re: [RFC PATCH 3/4] rculist.h: Fix parentheses around macro pointer parameter use To: Mathieu Desnoyers Cc: Andrew Morton , linux-kernel@vger.kernel.org, "Paul E. McKenney" , Frederic Weisbecker , Neeraj Upadhyay , Josh Triplett , Boqun Feng , Steven Rostedt , Lai Jiangshan , Zqiang , rcu@vger.kernel.org Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable X-Spam-Status: No, score=-2.1 required=5.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,RCVD_IN_DNSWL_NONE, SPF_HELO_NONE,SPF_PASS,T_SCC_BODY_TEXT_LINE,URIBL_BLOCKED autolearn=unavailable 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 Hello Mathieu, On Wed, May 3, 2023 at 9:29=E2=80=AFPM Mathieu Desnoyers wrote: > > Add missing parentheses around use of macro argument "pos" in those > patterns to ensure operator precedence behaves as expected: > > - typeof(*pos) > - pos->member > > This corrects the following usage pattern where operator precedence is > unexpected: > > LIST_HEAD(testlist); > > struct test { > struct list_head node; > int a; > }; > > // pos->member issue > void f(void) > { > struct test *t1; > struct test **t2 =3D &t1; > > list_for_each_entry_rcu((*t2), &testlist, node) { /* work= s */ > //... > } > list_for_each_entry_rcu(*t2, &testlist, node) { /* broken */ > //... > } Yeah it is not clear why anyone would ever want to use it like this. Why don't they just pass t1 to list_for_each_entry_rcu() ? I would rather it break them and they re-think their code ;). > } > > The typeof(*pos) lack of parentheses around "pos" is not an issue per se > in the specific macros modified here because "pos" is used as an lvalue, > which should prevent use of any operator causing issue. Still add the > extra parentheses for consistency. The consistency argument is valid though. I will stay neutral on this patch. ;-) thanks! - Joel > > Signed-off-by: Mathieu Desnoyers > Cc: "Paul E. McKenney" > Cc: Andrew Morton > Cc: Frederic Weisbecker > Cc: Neeraj Upadhyay > Cc: Joel Fernandes > Cc: Josh Triplett > Cc: Boqun Feng > Cc: Steven Rostedt > Cc: Lai Jiangshan > Cc: Zqiang > Cc: rcu@vger.kernel.org > Cc: linux-kernel@vger.kernel.org > --- > include/linux/rculist.h | 28 ++++++++++++++-------------- > 1 file changed, 14 insertions(+), 14 deletions(-) > > diff --git a/include/linux/rculist.h b/include/linux/rculist.h > index d29740be4833..d27aeff5447d 100644 > --- a/include/linux/rculist.h > +++ b/include/linux/rculist.h > @@ -388,9 +388,9 @@ static inline void list_splice_tail_init_rcu(struct l= ist_head *list, > */ > #define list_for_each_entry_rcu(pos, head, member, cond...) \ > for (__list_check_rcu(dummy, ## cond, 0), \ > - pos =3D list_entry_rcu((head)->next, typeof(*pos), member); = \ > - &pos->member !=3D (head); = \ > - pos =3D list_entry_rcu(pos->member.next, typeof(*pos), me= mber)) > + pos =3D list_entry_rcu((head)->next, typeof(*(pos)), member)= ;\ > + &(pos)->member !=3D (head); = \ > + pos =3D list_entry_rcu((pos)->member.next, typeof(*(pos))= , member)) > > /** > * list_for_each_entry_srcu - iterate over rcu list of given ty= pe > @@ -407,9 +407,9 @@ static inline void list_splice_tail_init_rcu(struct l= ist_head *list, > */ > #define list_for_each_entry_srcu(pos, head, member, cond) \ > for (__list_check_srcu(cond), \ > - pos =3D list_entry_rcu((head)->next, typeof(*pos), member); = \ > - &pos->member !=3D (head); = \ > - pos =3D list_entry_rcu(pos->member.next, typeof(*pos), me= mber)) > + pos =3D list_entry_rcu((head)->next, typeof(*(pos)), member)= ;\ > + &(pos)->member !=3D (head); = \ > + pos =3D list_entry_rcu((pos)->member.next, typeof(*(pos))= , member)) > > /** > * list_entry_lockless - get the struct for this entry > @@ -441,9 +441,9 @@ static inline void list_splice_tail_init_rcu(struct l= ist_head *list, > * but never deleted. > */ > #define list_for_each_entry_lockless(pos, head, member) \ > - for (pos =3D list_entry_lockless((head)->next, typeof(*pos), memb= er); \ > - &pos->member !=3D (head); \ > - pos =3D list_entry_lockless(pos->member.next, typeof(*pos), = member)) > + for (pos =3D list_entry_lockless((head)->next, typeof(*(pos)), me= mber); \ > + &(pos)->member !=3D (head); \ > + pos =3D list_entry_lockless((pos)->member.next, typeof(*(pos= )), member)) > > /** > * list_for_each_entry_continue_rcu - continue iteration over list of gi= ven type > @@ -464,9 +464,9 @@ static inline void list_splice_tail_init_rcu(struct l= ist_head *list, > * position. > */ > #define list_for_each_entry_continue_rcu(pos, head, member) \ > - for (pos =3D list_entry_rcu(pos->member.next, typeof(*pos), membe= r); \ > - &pos->member !=3D (head); \ > - pos =3D list_entry_rcu(pos->member.next, typeof(*pos), membe= r)) > + for (pos =3D list_entry_rcu((pos)->member.next, typeof(*(pos)), m= ember); \ > + &(pos)->member !=3D (head); \ > + pos =3D list_entry_rcu((pos)->member.next, typeof(*(pos)), m= ember)) > > /** > * list_for_each_entry_from_rcu - iterate over a list from current point > @@ -486,8 +486,8 @@ static inline void list_splice_tail_init_rcu(struct l= ist_head *list, > * after the given position. > */ > #define list_for_each_entry_from_rcu(pos, head, member) = \ > - for (; &(pos)->member !=3D (head); = \ > - pos =3D list_entry_rcu(pos->member.next, typeof(*(pos)), = member)) > + for (; &(pos)->member !=3D (head); = \ > + pos =3D list_entry_rcu((pos)->member.next, typeof(*(pos))= , member)) > > /** > * hlist_del_rcu - deletes entry from hash list without re-initializatio= n > -- > 2.25.1 >