diff options
| author | Jiri Kosina <jkosina@suse.cz> | 2011-09-15 15:08:05 +0200 | 
|---|---|---|
| committer | Jiri Kosina <jkosina@suse.cz> | 2011-09-15 15:08:18 +0200 | 
| commit | e060c38434b2caa78efe7cedaff4191040b65a15 (patch) | |
| tree | 407361230bf6733f63d8e788e4b5e6566ee04818 /arch/powerpc/kernel/perf_callchain.c | |
| parent | 10e4ac572eeffe5317019bd7330b6058a400dfc2 (diff) | |
| parent | cc39c6a9bbdebfcf1a7dee64d83bf302bc38d941 (diff) | |
| download | olio-linux-3.10-e060c38434b2caa78efe7cedaff4191040b65a15.tar.xz olio-linux-3.10-e060c38434b2caa78efe7cedaff4191040b65a15.zip  | |
Merge branch 'master' into for-next
Fast-forward merge with Linus to be able to merge patches
based on more recent version of the tree.
Diffstat (limited to 'arch/powerpc/kernel/perf_callchain.c')
| -rw-r--r-- | arch/powerpc/kernel/perf_callchain.c | 20 | 
1 files changed, 17 insertions, 3 deletions
diff --git a/arch/powerpc/kernel/perf_callchain.c b/arch/powerpc/kernel/perf_callchain.c index d05ae4204bb..564c1d8bdb5 100644 --- a/arch/powerpc/kernel/perf_callchain.c +++ b/arch/powerpc/kernel/perf_callchain.c @@ -154,8 +154,12 @@ static int read_user_stack_64(unsigned long __user *ptr, unsigned long *ret)  	    ((unsigned long)ptr & 7))  		return -EFAULT; -	if (!__get_user_inatomic(*ret, ptr)) +	pagefault_disable(); +	if (!__get_user_inatomic(*ret, ptr)) { +		pagefault_enable();  		return 0; +	} +	pagefault_enable();  	return read_user_stack_slow(ptr, ret, 8);  } @@ -166,8 +170,12 @@ static int read_user_stack_32(unsigned int __user *ptr, unsigned int *ret)  	    ((unsigned long)ptr & 3))  		return -EFAULT; -	if (!__get_user_inatomic(*ret, ptr)) +	pagefault_disable(); +	if (!__get_user_inatomic(*ret, ptr)) { +		pagefault_enable();  		return 0; +	} +	pagefault_enable();  	return read_user_stack_slow(ptr, ret, 4);  } @@ -294,11 +302,17 @@ static inline int current_is_64bit(void)   */  static int read_user_stack_32(unsigned int __user *ptr, unsigned int *ret)  { +	int rc; +  	if ((unsigned long)ptr > TASK_SIZE - sizeof(unsigned int) ||  	    ((unsigned long)ptr & 3))  		return -EFAULT; -	return __get_user_inatomic(*ret, ptr); +	pagefault_disable(); +	rc = __get_user_inatomic(*ret, ptr); +	pagefault_enable(); + +	return rc;  }  static inline void perf_callchain_user_64(struct perf_callchain_entry *entry,  |