diff options
Diffstat (limited to 'mm/usercopy.c')
| -rw-r--r-- | mm/usercopy.c | 8 | 
1 files changed, 7 insertions, 1 deletions
diff --git a/mm/usercopy.c b/mm/usercopy.c index 98e924864554..660717a1ea5c 100644 --- a/mm/usercopy.c +++ b/mm/usercopy.c @@ -11,6 +11,7 @@  #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt  #include <linux/mm.h> +#include <linux/highmem.h>  #include <linux/slab.h>  #include <linux/sched.h>  #include <linux/sched/task.h> @@ -227,7 +228,12 @@ static inline void check_heap_object(const void *ptr, unsigned long n,  	if (!virt_addr_valid(ptr))  		return; -	page = virt_to_head_page(ptr); +	/* +	 * When CONFIG_HIGHMEM=y, kmap_to_page() will give either the +	 * highmem page or fallback to virt_to_page(). The following +	 * is effectively a highmem-aware virt_to_head_page(). +	 */ +	page = compound_head(kmap_to_page((void *)ptr));  	if (PageSlab(page)) {  		/* Check slab allocator for flags and size. */  |