Re: [PATCH v2 0/2] Replace and improve "mcsafe" with copy_safe()
From: Linus Torvalds
Date: Thu Apr 30 2020 - 20:40:22 EST
On Thu, Apr 30, 2020 at 5:23 PM Andy Lutomirski <luto@xxxxxxxxxxxxxx> wrote:
>
> > But anyway, I don't hate something like "copy_to_user_fallible()"
> > conceptually. The naming needs to be fixed, in that "user" can always
> > take a fault, so it's the _source_ that can fault, not the "user"
> > part.
>
> I donât like this. âuserâ already implied that basically anything can be wrong with the memory
Maybe I didn't explain.
"user" already implies faulting. We agree.
And since we by definition cannot know what the user has mapped into
user space, *every* normal copy_to_user() has to be able to handle
whatever faults that throws at us.
The reason I dislike "copy_to_user_fallible()" is that the user side
already has that 'fallible".
If it's the _source_ being "fallible" (it really needs a better name -
I will not call it just "f") then it should be "copy_f_to_user()".
That would be ok.
So "copy_f_to_user()" makes sense. But "copy_to_user_f()" does not.
That puts the "f" on the "user", which we already know can fault.
See what I want in the name? I want the name to say which side can
cause problems!
If you are copying memory from some f source, it must not be
"copy_safe()". That doesn't say if the _source_ is f, or the
destination is f.
So "copy_to_f()" makes sense (we don't say "copy_kernel_to_user()" -
the "normal" case is silent), and "copy_from_f()" makes sense.
"copy_in_f()" makes sense too.
But not this "randomly copy some randomly f memory area that I don't
know if it's the source or the destination".
Sometimes you may then use a common implementation for the different
directions - if that works on the architecture.
For example, "copy_to_user()" and "copy_from_user()" on x86 both end
up internally using a shared "copy_user_generic()" implementation. I
wish that wasn't the case (when I asked for what was to become
STAC/CLAC, I asked for one that could determine which direction of a
"rep movs" could touch user space), but it so happens that the
implementations end up being symmetric on x86.
But that's a pure implementation issue, and it very much is not going
to be true in general, and it shouldn't be exposed to users as such
(and we obviously don't).
Linus