On Sun, Oct 6, 2019 at 8:11 PM Linus Torvalds <torvalds@xxxxxxxxxxxxxxxxxxxx> wrote: > > > > > The last two should just do user_access_begin()/user_access_end() > > instead of access_ok(). __copy_to_user_inatomic() has very few callers as well: > > Yeah, good points. Looking at it some more this morning, I think it's actually pretty painful. The good news is that right now x86 is the only architecture that does that user_access_begin(), so we don't need to worry about anything else. Apparently the ARM people haven't had enough performance problems with the PAN bit for them to care. We can have a fallback wrapper for unsafe_copy_to_user() for other architectures that just does the __copy_to_user(). But on x86, if we move the STAC/CLAC out of the low-level copy routines and into the callers, we'll have a _lot_ of churn. I thought it would be mostly a "teach objtool" thing, but we have lots of different versions of it. Not just the 32-bit vs 64-bit, it's embedded in all the low-level asm implementations. And we don't want the regular "copy_to/from_user()" to then have to add the STAC/CLAC at the call-site. So then we'd want to un-inline copy_to_user() entirely. Which all sounds like a really good idea, don't get me wrong. I think we inline it way too aggressively now. But it'sa _big_ job. So we probably _should_ - remove INLINE_COPY_TO/FROM_USER - remove all the "small constant size special cases". - make "raw_copy_to/from_user()" have the "unsafe" semantics and make the out-of-line copy in lib/usercopy.c be the only real interface - get rid of a _lot_ of oddities but looking at just how much churn this is, I suspect that for 5.4 it's a bit late to do quite that much cleanup. I hope you prove me wrong. But I'll look at a smaller change to just make x86 use the current special copy loop (as "unsafe_copy_to_user()") and have everybody else do the trivial wrapper. Because we definitely should do that cleanup (it also fixes the whole "atomic copy in kernel space" issue that you pointed to that doesn't actually want STAC/CLAC at all), but it just looks fairly massive to me. Linus