[ Adding Peter Xu to the participants, he did a lot of "add generic helpers" code a few years ago. Peter, see https://lore.kernel.org/linux-arch/Y9lz6yk113LmC9SI@ZenIV/ for context ] On Tue, Jan 31, 2023 at 12:03 PM Al Viro <viro@xxxxxxxxxxxxxxxxxx> wrote: > > However, it never had been done on a bunch of architectures - the > current mainline still has that bug on alpha, hexagon, itanic, m68k, > microblaze, nios2, openrisc, parisc, riscv and sparc (both sparc32 and > sparc64). Fixes are trivial, but I've no way to test them for most > of those architectures. Gaah. The patches look simple and "trivially correct", but I hate how we duplicate basically the same (complicated) logic across architectures. Peter improved a bit on things, but I think we could do better. Yes, all architectures basically have their own special code for special error registers etc, and for various errata and/or special handling for vmalloc addresses of vdso's etc. And they aren't always translated to the generic flags, looking at alpha, for example, we have code like this: si_code = SEGV_ACCERR; if (cause < 0) { if (!(vma->vm_flags & VM_EXEC)) goto bad_area; } else if (!cause) { /* Allow reads even for write-only mappings */ if (!(vma->vm_flags & (VM_READ | VM_WRITE))) goto bad_area; } else { if (!(vma->vm_flags & VM_WRITE)) goto bad_area; flags |= FAULT_FLAG_WRITE; } because it uses the alpha internal "cause < 0" logic, instead of having translated it into FAULT_FLAG_INSTRUCTION. But *if* the alpha code were to just translate it into the FAULT_FLAG_xyz namespace, apretty much *all* of the alpha do_page_fault() could have been then done by a completely generic "generic_page_fault()" that has all of the retry logic, all of the si_code logic, etc etc. So in a perfect world, we'd only have the special errata handling (*) and the "translate to FAULT_FLAG_xyz" code in the architecture code, and then just call that generic_page_fault() function for what really is pretty much generic. And then we would never again have these kinds of "architecture got the retry wrong" issues. Would anybody be interested in trying that? Just converting one or two architectures to a new world order? But if not, Al's patches all look "obviously fine" to me, but that's because they basically all do the same thing except for that odd special TSTATE_PRIV thing for sparc-64 - why can't that use '!user_mode(regs)' like everybody else?) Linus (*) we really have a *lot* of architectures that have gotten 'prefetch' wrong and have errata for prefetch: alpha, arm and x86 all have magic "bogus fault on prefetch" cases.