kraxel / rpms / kernel

Forked from rpms/kernel 2 years ago
Clone
Blob Blame History Raw
commit dd945918f747f61eff384f5cb8889e524f60615a
Author: Jon Masters <jcm@jonmasters.org>
Date:   Fri Oct 5 22:32:29 2012 -0400

    Revert "ARM: 7528/1: uaccess: annotate [__]{get,put}_user functions with might_fault()"
    
    This reverts commit ad72907acd2943304c292ae36960bb66e6dc23c9.
    
    Technically, the original commit is totally correct, however it exposes
    a deep-rooted problem with missaligned accesses in e.g. the networking
    stack and we need to revert this (sweep under rug) until we can get
    a good solution in place upstream. The problem is that the compiler
    believes the structs concerned are aligned (they are in the code),
    however at runtime the IP structs are actually not aligned within
    received network packets, and the fault handler is not guaranteed
    to be entirely atomic and free of calls to the scheduler.
    
    Signed-off-by: Jon Masters <jcm@jonmasters.org>

diff --git a/arch/arm/include/asm/uaccess.h b/arch/arm/include/asm/uaccess.h
index 77bd79f..6f83ad6 100644
--- a/arch/arm/include/asm/uaccess.h
+++ b/arch/arm/include/asm/uaccess.h
@@ -118,7 +118,7 @@ extern int __get_user_4(void *);
 		: "0" (__p), "r" (__l)					\
 		: __GUP_CLOBBER_##__s)
 
-#define __get_user_check(x,p)							\
+#define get_user(x,p)							\
 	({								\
 		unsigned long __limit = current_thread_info()->addr_limit - 1; \
 		register const typeof(*(p)) __user *__p asm("r0") = (p);\
@@ -141,12 +141,6 @@ extern int __get_user_4(void *);
 		__e;							\
 	})
 
-#define get_user(x,p)							\
-	({								\
-		might_fault();						\
-		__get_user_check(x,p);					\
-	 })
-
 extern int __put_user_1(void *, unsigned int);
 extern int __put_user_2(void *, unsigned int);
 extern int __put_user_4(void *, unsigned int);
@@ -161,7 +155,7 @@ extern int __put_user_8(void *, unsigned long long);
 		: "0" (__p), "r" (__r2), "r" (__l)			\
 		: "ip", "lr", "cc")
 
-#define __put_user_check(x,p)							\
+#define put_user(x,p)							\
 	({								\
 		unsigned long __limit = current_thread_info()->addr_limit - 1; \
 		register const typeof(*(p)) __r2 asm("r2") = (x);	\
@@ -186,12 +180,6 @@ extern int __put_user_8(void *, unsigned long long);
 		__e;							\
 	})
 
-#define put_user(x,p)							\
-	({								\
-		might_fault();						\
-		__put_user_check(x,p);					\
-	 })
-
 #else /* CONFIG_MMU */
 
 /*
@@ -245,7 +233,6 @@ do {									\
 	unsigned long __gu_addr = (unsigned long)(ptr);			\
 	unsigned long __gu_val;						\
 	__chk_user_ptr(ptr);						\
-	might_fault();							\
 	switch (sizeof(*(ptr))) {					\
 	case 1:	__get_user_asm_byte(__gu_val,__gu_addr,err);	break;	\
 	case 2:	__get_user_asm_half(__gu_val,__gu_addr,err);	break;	\
@@ -327,7 +314,6 @@ do {									\
 	unsigned long __pu_addr = (unsigned long)(ptr);			\
 	__typeof__(*(ptr)) __pu_val = (x);				\
 	__chk_user_ptr(ptr);						\
-	might_fault();							\
 	switch (sizeof(*(ptr))) {					\
 	case 1: __put_user_asm_byte(__pu_val,__pu_addr,err);	break;	\
 	case 2: __put_user_asm_half(__pu_val,__pu_addr,err);	break;	\