x86: remove more uaccess_32.h complexity
I'm looking at trying to possibly merge the 32-bit and 64-bit versions of the x86 uaccess.h implementation, but first this needs to be cleaned up. For example, the 32-bit version of "__copy_from_user_inatomic()" is mostly the special cases for the constant size, and it's actually almost never relevant. Most users aren't actually using a constant size anyway, and the few cases that do small constant copies are better off just using __get_user() instead. So get rid of the unnecessary complexity. Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
This commit is contained in:
parent
5b09c3edec
commit
bd28b14591
|
@ -65,32 +65,6 @@ __copy_to_user(void __user *to, const void *from, unsigned long n)
|
||||||
static __always_inline unsigned long
|
static __always_inline unsigned long
|
||||||
__copy_from_user_inatomic(void *to, const void __user *from, unsigned long n)
|
__copy_from_user_inatomic(void *to, const void __user *from, unsigned long n)
|
||||||
{
|
{
|
||||||
/* Avoid zeroing the tail if the copy fails..
|
|
||||||
* If 'n' is constant and 1, 2, or 4, we do still zero on a failure,
|
|
||||||
* but as the zeroing behaviour is only significant when n is not
|
|
||||||
* constant, that shouldn't be a problem.
|
|
||||||
*/
|
|
||||||
if (__builtin_constant_p(n)) {
|
|
||||||
unsigned long ret;
|
|
||||||
|
|
||||||
switch (n) {
|
|
||||||
case 1:
|
|
||||||
__uaccess_begin();
|
|
||||||
__get_user_size(*(u8 *)to, from, 1, ret, 1);
|
|
||||||
__uaccess_end();
|
|
||||||
return ret;
|
|
||||||
case 2:
|
|
||||||
__uaccess_begin();
|
|
||||||
__get_user_size(*(u16 *)to, from, 2, ret, 2);
|
|
||||||
__uaccess_end();
|
|
||||||
return ret;
|
|
||||||
case 4:
|
|
||||||
__uaccess_begin();
|
|
||||||
__get_user_size(*(u32 *)to, from, 4, ret, 4);
|
|
||||||
__uaccess_end();
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return __copy_from_user_ll_nozero(to, from, n);
|
return __copy_from_user_ll_nozero(to, from, n);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1694,8 +1694,7 @@ static int is_trap_at_addr(struct mm_struct *mm, unsigned long vaddr)
|
||||||
int result;
|
int result;
|
||||||
|
|
||||||
pagefault_disable();
|
pagefault_disable();
|
||||||
result = __copy_from_user_inatomic(&opcode, (void __user*)vaddr,
|
result = __get_user(opcode, (uprobe_opcode_t __user *)vaddr);
|
||||||
sizeof(opcode));
|
|
||||||
pagefault_enable();
|
pagefault_enable();
|
||||||
|
|
||||||
if (likely(result == 0))
|
if (likely(result == 0))
|
||||||
|
|
|
@ -729,7 +729,7 @@ static int get_futex_value_locked(u32 *dest, u32 __user *from)
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
pagefault_disable();
|
pagefault_disable();
|
||||||
ret = __copy_from_user_inatomic(dest, from, sizeof(u32));
|
ret = __get_user(*dest, from);
|
||||||
pagefault_enable();
|
pagefault_enable();
|
||||||
|
|
||||||
return ret ? -EFAULT : 0;
|
return ret ? -EFAULT : 0;
|
||||||
|
|
|
@ -96,8 +96,7 @@ long strncpy_from_unsafe(char *dst, const void *unsafe_addr, long count)
|
||||||
pagefault_disable();
|
pagefault_disable();
|
||||||
|
|
||||||
do {
|
do {
|
||||||
ret = __copy_from_user_inatomic(dst++,
|
ret = __get_user(*dst++, (const char __user __force *)src++);
|
||||||
(const void __user __force *)src++, 1);
|
|
||||||
} while (dst[-1] && ret == 0 && src - unsafe_addr < count);
|
} while (dst[-1] && ret == 0 && src - unsafe_addr < count);
|
||||||
|
|
||||||
dst[-1] = '\0';
|
dst[-1] = '\0';
|
||||||
|
|
Loading…
Reference in New Issue