History

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.

Linus Torvalds committed 10 years ago

Commit bd28b141 parent 5b09c3e4 files · +3 −31Browse files

Unified · Split

4 files
  1. arch/x86/include/asm/uaccess_32.h +0 −26
  2. kernel/events/uprobes.c +1 −2
  3. kernel/futex.c +1 −1
  4. mm/maccess.c +1 −2
arch/x86/include/asm/uaccess_32.h+0−26
@@ -65,32 +65,6 @@ __copy_to_user(void __user *to, const void *from, unsigned long n) · 64 unmodified lines
6565 static __always_inline unsigned long
6666 __copy_from_user_inatomic(void *to, const void __user *from, unsigned long n)
6767 {
68− /* Avoid zeroing the tail if the copy fails..
69− * If 'n' is constant and 1, 2, or 4, we do still zero on a failure,
70− * but as the zeroing behaviour is only significant when n is not
71− * constant, that shouldn't be a problem.
72− */
73− if (__builtin_constant_p(n)) {
74− unsigned long ret;
75−
76− switch (n) {
77− case 1:
78− __uaccess_begin();
79− __get_user_size(*(u8 *)to, from, 1, ret, 1);
80− __uaccess_end();
81− return ret;
82− case 2:
83− __uaccess_begin();
84− __get_user_size(*(u16 *)to, from, 2, ret, 2);
85− __uaccess_end();
86− return ret;
87− case 4:
88− __uaccess_begin();
89− __get_user_size(*(u32 *)to, from, 4, ret, 4);
90− __uaccess_end();
91− return ret;
92− }
93− }
9468 return __copy_from_user_ll_nozero(to, from, n);
9569 }
9670
kernel/events/uprobes.c+1−2
@@ -1694,8 +1694,7 @@ static int is_trap_at_addr(struct mm_struct *mm, unsigned long vaddr) · 1693 unmodified lines
16941694 int result;
16951695
16961696 pagefault_disable();
1697− result = __copy_from_user_inatomic(&opcode, (void __user*)vaddr,
1698− sizeof(opcode));
1697+ result = __get_user(opcode, (uprobe_opcode_t __user *)vaddr);
16991698 pagefault_enable();
17001699
17011700 if (likely(result == 0))
kernel/futex.c+1−1
@@ -729,7 +729,7 @@ static int get_futex_value_locked(u32 *dest, u32 __user *from) · 728 unmodified lines
729729 int ret;
730730
731731 pagefault_disable();
732− ret = __copy_from_user_inatomic(dest, from, sizeof(u32));
732+ ret = __get_user(*dest, from);
733733 pagefault_enable();
734734
735735 return ret ? -EFAULT : 0;
mm/maccess.c+1−2
@@ -96,8 +96,7 @@ long strncpy_from_unsafe(char *dst, const void *unsafe_addr, long count) · 95 unmodified lines
9696 pagefault_disable();
9797
9898 do {
99− ret = __copy_from_user_inatomic(dst++,
100− (const void __user __force *)src++, 1);
99+ ret = __get_user(*dst++, (const char __user __force *)src++);
101100 } while (dst[-1] && ret == 0 && src - unsafe_addr < count);
102101
103102 dst[-1] = '\0';