From: Boqun Feng <boqun.feng@gmail.com>
To: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
Cc: "Paul E. McKenney" <paulmck@kernel.org>,
linux-kernel@vger.kernel.org,
Joel Fernandes <joel@joelfernandes.org>,
Josh Triplett <josh@joshtriplett.org>,
Steven Rostedt <rostedt@goodmis.org>,
Lai Jiangshan <jiangshanlai@gmail.com>,
Zqiang <qiang1.zhang@intel.com>
Subject: Re: [RFC PATCH] rcu: rcupdate.h: Add missing parentheses around macro pointer dereference
Date: Wed, 3 May 2023 13:33:54 -0700 [thread overview]
Message-ID: <ZFLFMmGsGF578sg2@boqun-archlinux> (raw)
In-Reply-To: <20230503203236.1587590-1-mathieu.desnoyers@efficios.com>
On Wed, May 03, 2023 at 04:32:36PM -0400, Mathieu Desnoyers wrote:
> linux/rcupdate.h macros use the *p parameter without parentheses, e.g.:
>
> typeof(*p)
>
> rather than
>
> typeof(*(p))
>
> The following test-case shows how it can generate confusion due to C
> operator precedence being reversed compared to the expectations:
>
> #define m(p) \
> do { \
> __typeof__(*p) v = 0; \
> } while (0)
>
> void fct(unsigned long long *p1)
> {
> m(p1 + 1); /* works */
> m(1 + p1); /* broken */
> }
>
> Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
> Cc: "Paul E. McKenney" <paulmck@kernel.org>
> Cc: Joel Fernandes <joel@joelfernandes.org>
> Cc: Josh Triplett <josh@joshtriplett.org>
> Cc: Boqun Feng <boqun.feng@gmail.com>
> Cc: Steven Rostedt <rostedt@goodmis.org>
> Cc: Lai Jiangshan <jiangshanlai@gmail.com>
> Cc: Zqiang <qiang1.zhang@intel.com>
Reviewed-by: Boqun Feng <boqun.feng@gmail.com>
Regards,
Boqun
> ---
> include/linux/rcupdate.h | 18 +++++++++---------
> 1 file changed, 9 insertions(+), 9 deletions(-)
>
> diff --git a/include/linux/rcupdate.h b/include/linux/rcupdate.h
> index dcd2cf1e8326..1565012fa47f 100644
> --- a/include/linux/rcupdate.h
> +++ b/include/linux/rcupdate.h
> @@ -430,16 +430,16 @@ static inline void rcu_preempt_sleep_check(void) { }
>
> #ifdef __CHECKER__
> #define rcu_check_sparse(p, space) \
> - ((void)(((typeof(*p) space *)p) == p))
> + ((void)(((typeof(*(p)) space *)p) == p))
> #else /* #ifdef __CHECKER__ */
> #define rcu_check_sparse(p, space)
> #endif /* #else #ifdef __CHECKER__ */
>
> #define __unrcu_pointer(p, local) \
> ({ \
> - typeof(*p) *local = (typeof(*p) *__force)(p); \
> + typeof(*(p)) *local = (typeof(*(p)) *__force)(p); \
> rcu_check_sparse(p, __rcu); \
> - ((typeof(*p) __force __kernel *)(local)); \
> + ((typeof(*(p)) __force __kernel *)(local)); \
> })
> /**
> * unrcu_pointer - mark a pointer as not being RCU protected
> @@ -452,29 +452,29 @@ static inline void rcu_preempt_sleep_check(void) { }
>
> #define __rcu_access_pointer(p, local, space) \
> ({ \
> - typeof(*p) *local = (typeof(*p) *__force)READ_ONCE(p); \
> + typeof(*(p)) *local = (typeof(*(p)) *__force)READ_ONCE(p); \
> rcu_check_sparse(p, space); \
> - ((typeof(*p) __force __kernel *)(local)); \
> + ((typeof(*(p)) __force __kernel *)(local)); \
> })
> #define __rcu_dereference_check(p, local, c, space) \
> ({ \
> /* Dependency order vs. p above. */ \
> - typeof(*p) *local = (typeof(*p) *__force)READ_ONCE(p); \
> + typeof(*(p)) *local = (typeof(*(p)) *__force)READ_ONCE(p); \
> RCU_LOCKDEP_WARN(!(c), "suspicious rcu_dereference_check() usage"); \
> rcu_check_sparse(p, space); \
> - ((typeof(*p) __force __kernel *)(local)); \
> + ((typeof(*(p)) __force __kernel *)(local)); \
> })
> #define __rcu_dereference_protected(p, local, c, space) \
> ({ \
> RCU_LOCKDEP_WARN(!(c), "suspicious rcu_dereference_protected() usage"); \
> rcu_check_sparse(p, space); \
> - ((typeof(*p) __force __kernel *)(p)); \
> + ((typeof(*(p)) __force __kernel *)(p)); \
> })
> #define __rcu_dereference_raw(p, local) \
> ({ \
> /* Dependency order vs. p above. */ \
> typeof(p) local = READ_ONCE(p); \
> - ((typeof(*p) __force __kernel *)(local)); \
> + ((typeof(*(p)) __force __kernel *)(local)); \
> })
> #define rcu_dereference_raw(p) __rcu_dereference_raw(p, __UNIQUE_ID(rcu))
>
> --
> 2.25.1
>
next prev parent reply other threads:[~2023-05-03 20:35 UTC|newest]
Thread overview: 7+ messages / expand[flat|nested] mbox.gz Atom feed top
2023-05-03 20:32 [RFC PATCH] rcu: rcupdate.h: Add missing parentheses around macro pointer dereference Mathieu Desnoyers
2023-05-03 20:33 ` Boqun Feng [this message]
2023-05-03 22:06 ` Steven Rostedt
2023-05-05 0:28 ` Paul E. McKenney
2023-05-05 13:15 ` Mathieu Desnoyers
2023-05-05 18:39 ` Paul E. McKenney
2023-05-04 1:17 ` Joel Fernandes
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=ZFLFMmGsGF578sg2@boqun-archlinux \
--to=boqun.feng@gmail.com \
--cc=jiangshanlai@gmail.com \
--cc=joel@joelfernandes.org \
--cc=josh@joshtriplett.org \
--cc=linux-kernel@vger.kernel.org \
--cc=mathieu.desnoyers@efficios.com \
--cc=paulmck@kernel.org \
--cc=qiang1.zhang@intel.com \
--cc=rostedt@goodmis.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.