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.
Showing the changes to kernel (2 of 4 files). Show all
Unified · Split
| @@ -1694,8 +1694,7 @@ static int is_trap_at_addr(struct mm_struct *mm, unsigned long vaddr) · 1693 unmodified lines | ||
| 1694 | 1694 | int result; |
| 1695 | 1695 | |
| 1696 | 1696 | 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); | |
| 1699 | 1698 | pagefault_enable(); |
| 1700 | 1699 | |
| 1701 | 1700 | if (likely(result == 0)) |
| @@ -729,7 +729,7 @@ static int get_futex_value_locked(u32 *dest, u32 __user *from) · 728 unmodified lines | ||
| 729 | 729 | int ret; |
| 730 | 730 | |
| 731 | 731 | pagefault_disable(); |
| 732 | − ret = __copy_from_user_inatomic(dest, from, sizeof(u32)); | |
| 732 | + ret = __get_user(*dest, from); | |
| 733 | 733 | pagefault_enable(); |
| 734 | 734 | |
| 735 | 735 | return ret ? -EFAULT : 0; |