Messages in this thread | | | From | Marco Elver <> | Date | Thu, 10 Jun 2021 11:01:34 +0200 | Subject | Re: [RFC PATCH 01/10] thread_info: add helpers to snapshot thread flags |
| |
On Wed, 9 Jun 2021 at 14:20, Mark Rutland <mark.rutland@arm.com> wrote: > > We have common helpers to manipulate individual thread flags, but where > code wants to check several flags at once, it must open code reading > current_thread_info()->flags and operating on a snapshot. > > As some flags can be set remotely it's necessary to use READ_ONCE() to > get a consistent snapshot even when IRQs are disabled, but some code > forgets to do this. Generally this is unlike to cause a problem in > practice, but it is somewhat unsound, and KCSAN will legitimately warn > that there is a data race. > > To make it easier to do the right thing, and to highlight that > concurrent modification is possible, let's add a new helpers to snapshot > the flags, which should be used in preference to plain reads. > Subsequent patches will move existing code to use the new helpers. > > Signed-off-by: Mark Rutland <mark.rutland@arm.com> > Cc: Boqun Feng <boqun.feng@gmail.com> > Cc: Dmitry Vyukov <dvyukov@google.com> > Cc: Marco Elver <elver@google.com> > Cc: Paul E. McKenney <paulmck@kernel.org> > Cc: Peter Zijlstra <peterz@infradead.org> > Cc: Will Deacon <will@kernel.org>
Acked-by: Marco Elver <elver@google.com>
> --- > include/linux/thread_info.h | 10 ++++++++++ > 1 file changed, 10 insertions(+) > > diff --git a/include/linux/thread_info.h b/include/linux/thread_info.h > index 157762db9d4b..f3769842046d 100644 > --- a/include/linux/thread_info.h > +++ b/include/linux/thread_info.h > @@ -117,6 +117,11 @@ static inline int test_ti_thread_flag(struct thread_info *ti, int flag) > return test_bit(flag, (unsigned long *)&ti->flags); > } > > +static inline unsigned long read_ti_thread_flags(struct thread_info *ti) > +{ > + return READ_ONCE(ti->flags); > +} > +
Are some of the callers 'noinstr'? I haven't seen it in this series yet, but if yes, then not inlining (which some compilers may do with heavier instrumentation) might cause issues and this could be __always_inline.
Thanks, -- Marco
| |