[RFC][PATCHSET] VM_FAULT_RETRY fixes
Al Viro
viro at zeniv.linux.org.uk
Sat Feb 4 21:10:21 PST 2023
On Sat, Feb 04, 2023 at 12:26:39AM +0000, Al Viro wrote:
> On Thu, Feb 02, 2023 at 05:56:22PM -0500, Peter Xu wrote:
>
> > IMHO it'll be merely impossible to merge things across most (if not to say,
> > all) archs. It will need to be start from one or at least a few that still
> > shares a major common base - I would still rely on x86 as a start - then we
> > try to use the helper in as much archs as possible.
> >
> > Even on x86, I do also see challenges so I'm not sure whether a common
> > enough routine can be abstracted indeed. But I believe there's a way to do
> > this because obviously we still see tons of duplicated logics falling
> > around. It may definitely need time to think out where's the best spot to
> > start, and how to gradually move towards covering more archs starting from
> > one.
>
> FWIW, after going through everything from alpha to loongarch (in alphabetic
> order, skipping the itanic) the following seems to be suitable for all of
> them:
>
> generic_fault(address, flags, vm_flags, regs)
[snip]
After looking through other architectures: that needs changes.
AFAICS, the right approach would be to add a pointer to (uninitialized)
kernel_siginfo. And let it pass the signal number, etc. through that.
That way all "we want to raise a signal" return values fold together.
*IF* the page fault wants to do something extra on SIGSEGV, but not on
SIGBUS (we have several such), it can key that upon info.si_signo.
Speaking of SIGSEGV, there's a fun situation with VM_FAULT_SIGSEGV:
1) Only x86 and ppc generate VM_FAULT_SIGSEGV in handle_mm_fault()
without hitting WARN_ON_ONCE(). And neither actually returns it
to page fault handler - the conditions that would've led to that
return value (pkey stuff) are checked in the page fault handler
and handle_mm_fault() is not called in such cases.
2) on alpha, hexagon, itanic, loongarch, microblaze, mips, nios2,
openrisc, sparc, um and xtensa #PF handler would end up with SEGV_ACCERR
if it saw VM_FAULT_SIGNAL.
3) on arm, arm64, arc, m68k, powerpc, s390, sh and x86 - SEGV_MAPERR
(except that neither x86 nor powerpc #PF ever see it)
4) on csky and riscv it would end up with BUG()
5) on parisc it's complicated^Wbroken - it tries to decide which
one to use after having unlocked mmap and looking at vma in process.
As it is, VM_FAULT_SIGSEGV had ended up as "we need to report some
error to get_user_pages() and similar callers in cases when
page fault handler would've detected pkey problem and refused
to call handle_mm_fault()", with several places where it's
"we had been called with bogus arguments; printk and return
something to indicate the things had gone wrong". It used to
have other uses, but this is what it had become now - grep and
you'll see.
AFAICS, all checks for it in page fault handlers are pretty much
dead code...
More information about the linux-riscv
mailing list