x86: use more conventional access_ok() definition
The way that access_ok() is defined on x86 is slightly different from most other architectures, and a bit more complex. The generic version tends to result in the best output on all architectures, as it results in single comparison against a constant limit for calls with a known size. There are a few callers of __range_not_ok(), all of which use TASK_SIZE as the limit rather than TASK_SIZE_MAX, but I could not see any reason for picking this. Changing these to call __access_ok() instead uses the default limit, but keeps the behavior otherwise. x86 is the only architecture with a WARN_ON_IN_IRQ() checking access_ok(), but it's probably best to leave that in place. Reviewed-by: Christoph Hellwig <hch@lst.de> Signed-off-by: Arnd Bergmann <arnd@arndb.de>
This commit is contained in:
parent
36903abedf
commit
1830a1d6a5
|
@ -16,33 +16,14 @@
|
|||
* Test whether a block of memory is a valid user space address.
|
||||
* Returns 0 if the range is valid, nonzero otherwise.
|
||||
*/
|
||||
static inline bool __chk_range_not_ok(unsigned long addr, unsigned long size)
|
||||
static inline bool __access_ok(void __user *ptr, unsigned long size)
|
||||
{
|
||||
unsigned long limit = TASK_SIZE_MAX;
|
||||
unsigned long addr = ptr;
|
||||
|
||||
/*
|
||||
* If we have used "sizeof()" for the size,
|
||||
* we know it won't overflow the limit (but
|
||||
* it might overflow the 'addr', so it's
|
||||
* important to subtract the size from the
|
||||
* limit, not add it to the address).
|
||||
*/
|
||||
if (__builtin_constant_p(size))
|
||||
return unlikely(addr > limit - size);
|
||||
|
||||
/* Arbitrary sizes? Be careful about overflow */
|
||||
addr += size;
|
||||
if (unlikely(addr < size))
|
||||
return true;
|
||||
return unlikely(addr > limit);
|
||||
return (size <= limit) && (addr <= (limit - size));
|
||||
}
|
||||
|
||||
#define __access_ok(addr, size) \
|
||||
({ \
|
||||
__chk_user_ptr(addr); \
|
||||
!__chk_range_not_ok((unsigned long __force)(addr), size); \
|
||||
})
|
||||
|
||||
#ifdef CONFIG_DEBUG_ATOMIC_SLEEP
|
||||
static inline bool pagefault_disabled(void);
|
||||
# define WARN_ON_IN_IRQ() \
|
||||
|
|
Loading…
Reference in New Issue