[PATCH 0/9] kthread detection cleanup

From: Mark Rutland
Date: Wed Aug 14 2019 - 06:41:41 EST


A reasonable amount of kernel code looks at task_struct::mm to determine
whether a thread is a kthread or a real user task. This isn't quite right,
since kthreads can have a non-NULL mm when calling use_mm().

The correct way to check whether a task is a kthread is to check whether
PF_KTHREAD is set in task_struct::flags, but doing so is a bit unwieldy.

To make this a bit nicer, this series adds a new is_kthread(tsk) helper,
converts existing code to make use of it, and fixes up a number of erroneous
checks of current->mm. Hopefully this will push people to use the right
approach in future.

I'm sure there are other instances in the kernel tree where we don't check this
correctly. In this series I'm just trying to fix the instances I'm reasonably
confident are incorrect.

This series is based on v5.3-rc3, and I've pushed it out to my
sched/kthread-cleanup branch on kernel.org [1,2].

Thanks,
Mark.

[1] git://git.kernel.org/pub/scm/linux/kernel/git/mark/linux.git sched/kthread-cleanup
[2] https://git.kernel.org/pub/scm/linux/kernel/git/mark/linux.git/log/?h=sched/kthread-cleanup

Mark Rutland (9):
sched/core: add is_kthread() helper
sched: treewide: use is_kthread()
kmemleak: correctly check for kthreads
arm/perf: correctly check for kthreads
arm64: correctly check for ktrheads
sparc/perf: correctly check for kthreads
x86/lbr: correctly check for kthreads
x86/fpu: correctly check for kthreads
samples/kretprobe: correctly check for kthreads

arch/alpha/kernel/process.c | 2 +-
arch/arc/kernel/process.c | 2 +-
arch/arm/kernel/perf_callchain.c | 2 +-
arch/arm/kernel/process.c | 2 +-
arch/arm/mm/init.c | 2 +-
arch/arm64/kernel/process.c | 6 +++---
arch/c6x/kernel/process.c | 2 +-
arch/csky/kernel/process.c | 2 +-
arch/h8300/kernel/process.c | 2 +-
arch/hexagon/kernel/process.c | 2 +-
arch/ia64/kernel/process.c | 2 +-
arch/m68k/kernel/process.c | 2 +-
arch/microblaze/kernel/process.c | 2 +-
arch/mips/kernel/process.c | 4 ++--
arch/nds32/kernel/process.c | 4 ++--
arch/nios2/kernel/process.c | 2 +-
arch/openrisc/kernel/process.c | 2 +-
arch/parisc/kernel/process.c | 2 +-
arch/powerpc/kernel/process.c | 2 +-
arch/riscv/kernel/process.c | 2 +-
arch/s390/kernel/process.c | 2 +-
arch/sh/kernel/process_32.c | 2 +-
arch/sh/kernel/process_64.c | 2 +-
arch/sparc/kernel/perf_event.c | 2 +-
arch/sparc/kernel/process_32.c | 2 +-
arch/sparc/kernel/process_64.c | 2 +-
arch/um/kernel/process.c | 2 +-
arch/unicore32/kernel/process.c | 2 +-
arch/x86/events/intel/lbr.c | 2 +-
arch/x86/include/asm/fpu/internal.h | 2 +-
arch/x86/kernel/fpu/core.c | 2 +-
arch/x86/kernel/process_32.c | 2 +-
arch/x86/kernel/process_64.c | 2 +-
arch/xtensa/kernel/process.c | 2 +-
block/blk-cgroup.c | 2 +-
drivers/tty/sysrq.c | 2 +-
fs/coredump.c | 2 +-
fs/file_table.c | 4 ++--
fs/namespace.c | 2 +-
fs/proc/base.c | 4 ++--
include/linux/cgroup.h | 2 +-
include/linux/sched.h | 13 ++++++++++++-
kernel/cgroup/freezer.c | 4 ++--
kernel/events/core.c | 2 +-
kernel/exit.c | 2 +-
kernel/fork.c | 6 +++---
kernel/freezer.c | 4 ++--
kernel/futex.c | 2 +-
kernel/kthread.c | 6 +++---
kernel/livepatch/transition.c | 2 +-
kernel/ptrace.c | 2 +-
kernel/sched/core.c | 8 ++++----
kernel/sched/idle.c | 2 +-
kernel/sched/wait.c | 2 +-
kernel/signal.c | 2 +-
kernel/stacktrace.c | 2 +-
lib/is_single_threaded.c | 2 +-
mm/kmemleak.c | 6 +++---
mm/memcontrol.c | 2 +-
mm/oom_kill.c | 4 ++--
mm/page_alloc.c | 2 +-
mm/vmacache.c | 2 +-
mm/vmscan.c | 2 +-
samples/kprobes/kretprobe_example.c | 2 +-
security/smack/smack_access.c | 2 +-
security/smack/smack_lsm.c | 4 ++--
security/yama/yama_lsm.c | 2 +-
67 files changed, 97 insertions(+), 86 deletions(-)

--
2.11.0