Messages in this thread | | | Date | Fri, 11 Jun 2021 10:17:24 +0100 | From | Mark Rutland <> | Subject | Re: [RFC PATCH 01/10] thread_info: add helpers to snapshot thread flags |
| |
On Thu, Jun 10, 2021 at 11:01:34AM +0200, Marco Elver wrote: > 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>
Thanks!
> > --- > > 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.
That's a very good point; I agree it should be __always_inline, and I'll fix that up for the next spin.
Thanks, Mark.
| |