On Thu, Apr 30, 2020 at 5:23 PM Andy Lutomirski <luto(a)amacapital.net> 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"
I don’t like this. “user” already implied that basically anything can be wrong with the
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
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).