[PATCH v8 00/11] thread_info: use helpers to snapshot thread flags

From: Mark Rutland
Date: Mon Nov 29 2021 - 08:09:07 EST


This is a trivial fixup and resend of v7 due to a typo breaking the build on
powerpc, as spotted by the kernel test robot:

https://lore.kernel.org/r/202111271105.v7pE3REd-lkp@xxxxxxxxx

I've fixed that, and I've double-checked the series, build testing a few
configs for all architectures for chieck the kernel.org crosstool page
provides a GCC 10.3.0 binary. That hit some (unrelated) latent issues,
but there are no new failrues introduced by this series.

Thomas, I'm hoping you'd be happy to pick this again.

As thread_info::flags scan be manipulated by remote threads, it is
necessary to use atomics or READ_ONCE() to ensure that code manipulates
a consistent snapshot, but we open-code plain accesses to
thread_info::flags across the kernel tree.

Generally we get away with this, but tools like KCSAN legitimately warn
that there is a data-race, and this is potentially fragile with compiler
optimizations, LTO, etc.

These patches introduce new helpers to snapshot the thread flags, with the
intent being that these should replace all plain accesses.

Since v1 [1]:
* Drop RFC
* Make read_ti_thread_flags() __always_inline
* Clarify commit messages
* Fix typo in arm64 patch
* Accumulate Reviewed-by / Acked-by tags
* Drop powerpc patch to avoid potential conflicts (per [2])

Since v2 [3]:
* Rebase to v5.14-rc1
* Reinstate powerpc patch

Since v3 [4]:
* Rebase to v5.14-rc4

Since v4 [5]:
* Rebase to v5.15-rc1
* Apply Acked-by / Tested-by tags

Since v5 [6]:
* Fix trivial whitespace bug in x86 patch

Since v6 [7]:
* Rebase to v5.16-rc1
* Fix new issue on PPC where thread flags could be discarded

Since v7 [8]:
* Add missing `&` to use of set_bits()

[1] https://lore.kernel.org/r/20210609122001.18277-1-mark.rutland@xxxxxxx
[2] https://lore.kernel.org/r/87k0mvtgeb.fsf@xxxxxxxxxxxxxxxxxx
[3] https://lore.kernel.org/r/20210621090602.16883-1-mark.rutland@xxxxxxx
[4] https://lore.kernel.org/r/20210713113842.2106-1-mark.rutland@xxxxxxx
[5] https://lore.kernel.org/r/20210803095428.17009-1-mark.rutland@xxxxxxx
[6] https://lore.kernel.org/r/20210914103027.53565-1-mark.rutland@xxxxxxx
[7] https://lore.kernel.org/lkml/20211022135643.7442-1-mark.rutland@xxxxxxx
[8] https://lore.kernel.org/lkml/20211117163050.53986-1-mark.rutland@xxxxxxx/

Thanks,
Mark.

Mark Rutland (11):
thread_info: add helpers to snapshot thread flags
entry: snapshot thread flags
sched: snapshot thread flags
alpha: snapshot thread flags
arm: snapshot thread flags
arm64: snapshot thread flags
microblaze: snapshot thread flags
openrisc: snapshot thread flags
powerpc: avoid discarding flags in system_call_exception()
powerpc: snapshot thread flags
x86: snapshot thread flags

arch/alpha/kernel/signal.c | 2 +-
arch/arm/kernel/signal.c | 2 +-
arch/arm/mm/alignment.c | 2 +-
arch/arm64/kernel/entry-common.c | 2 +-
arch/arm64/kernel/ptrace.c | 4 ++--
arch/arm64/kernel/signal.c | 2 +-
arch/arm64/kernel/syscall.c | 4 ++--
arch/microblaze/kernel/signal.c | 2 +-
arch/openrisc/kernel/signal.c | 2 +-
arch/powerpc/kernel/interrupt.c | 15 +++++++--------
arch/powerpc/kernel/ptrace/ptrace.c | 3 +--
arch/x86/kernel/process.c | 8 ++++----
arch/x86/kernel/process.h | 4 ++--
arch/x86/mm/tlb.c | 2 +-
include/linux/entry-kvm.h | 2 +-
include/linux/thread_info.h | 14 ++++++++++++++
kernel/entry/common.c | 4 ++--
kernel/entry/kvm.c | 4 ++--
kernel/sched/core.c | 2 +-
19 files changed, 46 insertions(+), 34 deletions(-)

--
2.30.2