Re: remove the last set_fs() in common code, and remove it for x86 and powerpc

From: Christophe Leroy
Date: Tue Aug 18 2020 - 13:46:36 EST




Le 17/08/2020 à 09:32, Christoph Hellwig a écrit :
Hi all,

this series removes the last set_fs() used to force a kernel address
space for the uaccess code in the kernel read/write/splice code, and then
stops implementing the address space overrides entirely for x86 and
powerpc.

The file system part has been posted a few times, and the read/write side
has been pretty much unchanced. For splice this series drops the
conversion of the seq_file and sysctl code to the iter ops, and thus loses
the splice support for them. The reasons for that is that it caused a lot
of churn for not much use - splice for these small files really isn't much
of a win, even if existing userspace uses it. All callers I found do the
proper fallback, but if this turns out to be an issue the conversion can
be resurrected.

I like this series.

I gave it a go on my powerpc mpc832x. I tested it on top of my newest series that reworks the 32 bits signal handlers (see https://patchwork.ozlabs.org/project/linuxppc-dev/list/?series=196278) with the microbenchmark test used is that series.

With KUAP activated, on top of signal32 rework, performance is boosted as system time for the microbenchmark goes from 1.73s down to 1.56s, that is 10% quicker

Surprisingly, with the kernel as is today without my signal's series, your series degrades performance slightly (from 2.55s to 2.64s ie 3.5% slower).


I also observe, in both cases, a degradation on

dd if=/dev/zero of=/dev/null count=1M

Without your series, it runs in 5.29 seconds.
With your series, it runs in 5.82 seconds, that is 10% more time.

Christophe



Besides x86 and powerpc I plan to eventually convert all other
architectures, although this will be a slow process, starting with the
easier ones once the infrastructure is merged. The process to convert
architectures is roughtly:

- ensure there is no set_fs(KERNEL_DS) left in arch specific code
- implement __get_kernel_nofault and __put_kernel_nofault
- remove the arch specific address limitation functionality

Diffstat:
arch/Kconfig | 3
arch/alpha/Kconfig | 1
arch/arc/Kconfig | 1
arch/arm/Kconfig | 1
arch/arm64/Kconfig | 1
arch/c6x/Kconfig | 1
arch/csky/Kconfig | 1
arch/h8300/Kconfig | 1
arch/hexagon/Kconfig | 1
arch/ia64/Kconfig | 1
arch/m68k/Kconfig | 1
arch/microblaze/Kconfig | 1
arch/mips/Kconfig | 1
arch/nds32/Kconfig | 1
arch/nios2/Kconfig | 1
arch/openrisc/Kconfig | 1
arch/parisc/Kconfig | 1
arch/powerpc/include/asm/processor.h | 7 -
arch/powerpc/include/asm/thread_info.h | 5 -
arch/powerpc/include/asm/uaccess.h | 78 ++++++++-----------
arch/powerpc/kernel/signal.c | 3
arch/powerpc/lib/sstep.c | 6 -
arch/riscv/Kconfig | 1
arch/s390/Kconfig | 1
arch/sh/Kconfig | 1
arch/sparc/Kconfig | 1
arch/um/Kconfig | 1
arch/x86/ia32/ia32_aout.c | 1
arch/x86/include/asm/page_32_types.h | 11 ++
arch/x86/include/asm/page_64_types.h | 38 +++++++++
arch/x86/include/asm/processor.h | 60 ---------------
arch/x86/include/asm/thread_info.h | 2
arch/x86/include/asm/uaccess.h | 26 ------
arch/x86/kernel/asm-offsets.c | 3
arch/x86/lib/getuser.S | 28 ++++---
arch/x86/lib/putuser.S | 21 +++--
arch/xtensa/Kconfig | 1
drivers/char/mem.c | 16 ----
drivers/misc/lkdtm/bugs.c | 2
drivers/misc/lkdtm/core.c | 4 +
drivers/misc/lkdtm/usercopy.c | 2
fs/read_write.c | 69 ++++++++++-------
fs/splice.c | 130 +++------------------------------
include/linux/fs.h | 2
include/linux/uaccess.h | 18 ++++
lib/test_bitmap.c | 10 ++
46 files changed, 235 insertions(+), 332 deletions(-)