Messages in this thread | | | From | Linus Torvalds <> | Date | Thu, 30 Apr 2020 17:39:46 -0700 | Subject | Re: [PATCH v2 0/2] Replace and improve "mcsafe" with copy_safe() |
| |
On Thu, Apr 30, 2020 at 5:23 PM Andy Lutomirski <luto@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" > > 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
| |