diff options
Diffstat (limited to 'kernel/events/internal.h')
| -rw-r--r-- | kernel/events/internal.h | 35 | 
1 files changed, 26 insertions, 9 deletions
diff --git a/kernel/events/internal.h b/kernel/events/internal.h index ca6599723be..569b218782a 100644 --- a/kernel/events/internal.h +++ b/kernel/events/internal.h @@ -82,16 +82,16 @@ static inline unsigned long perf_data_size(struct ring_buffer *rb)  }  #define DEFINE_OUTPUT_COPY(func_name, memcpy_func)			\ -static inline unsigned int						\ +static inline unsigned long						\  func_name(struct perf_output_handle *handle,				\ -	  const void *buf, unsigned int len)				\ +	  const void *buf, unsigned long len)				\  {									\  	unsigned long size, written;					\  									\  	do {								\ -		size = min_t(unsigned long, handle->size, len);		\ -									\ +		size    = min(handle->size, len);			\  		written = memcpy_func(handle->addr, buf, size);		\ +		written = size - written;				\  									\  		len -= written;						\  		handle->addr += written;				\ @@ -110,20 +110,37 @@ func_name(struct perf_output_handle *handle,				\  	return len;							\  } -static inline int memcpy_common(void *dst, const void *src, size_t n) +static inline unsigned long +memcpy_common(void *dst, const void *src, unsigned long n)  {  	memcpy(dst, src, n); -	return n; +	return 0;  }  DEFINE_OUTPUT_COPY(__output_copy, memcpy_common) -#define MEMCPY_SKIP(dst, src, n) (n) +static inline unsigned long +memcpy_skip(void *dst, const void *src, unsigned long n) +{ +	return 0; +} -DEFINE_OUTPUT_COPY(__output_skip, MEMCPY_SKIP) +DEFINE_OUTPUT_COPY(__output_skip, memcpy_skip)  #ifndef arch_perf_out_copy_user -#define arch_perf_out_copy_user __copy_from_user_inatomic +#define arch_perf_out_copy_user arch_perf_out_copy_user + +static inline unsigned long +arch_perf_out_copy_user(void *dst, const void *src, unsigned long n) +{ +	unsigned long ret; + +	pagefault_disable(); +	ret = __copy_from_user_inatomic(dst, src, n); +	pagefault_enable(); + +	return ret; +}  #endif  DEFINE_OUTPUT_COPY(__output_copy_user, arch_perf_out_copy_user)  | 
