Right now, ZONE_DEVICE memory is always set PG_reserved. We want to change that.
Let's make sure that the logic in the function won't change. Once we no longer set these pages to reserved, we can rework this function to perform separate checks for ZONE_DEVICE (split from PG_reserved checks). Cc: Kees Cook <[email protected]> Cc: Andrew Morton <[email protected]> Cc: Kate Stewart <[email protected]> Cc: Allison Randal <[email protected]> Cc: "Isaac J. Manjarres" <[email protected]> Cc: Qian Cai <[email protected]> Cc: Thomas Gleixner <[email protected]> Signed-off-by: David Hildenbrand <[email protected]> --- mm/usercopy.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/mm/usercopy.c b/mm/usercopy.c index 660717a1ea5c..a3ac4be35cde 100644 --- a/mm/usercopy.c +++ b/mm/usercopy.c @@ -203,14 +203,15 @@ static inline void check_page_span(const void *ptr, unsigned long n, * device memory), or CMA. Otherwise, reject since the object spans * several independently allocated pages. */ - is_reserved = PageReserved(page); + is_reserved = PageReserved(page) || is_zone_device_page(page); is_cma = is_migrate_cma_page(page); if (!is_reserved && !is_cma) usercopy_abort("spans multiple pages", NULL, to_user, 0, n); for (ptr += PAGE_SIZE; ptr <= end; ptr += PAGE_SIZE) { page = virt_to_head_page(ptr); - if (is_reserved && !PageReserved(page)) + if (is_reserved && !(PageReserved(page) || + is_zone_device_page(page))) usercopy_abort("spans Reserved and non-Reserved pages", NULL, to_user, 0, n); if (is_cma && !is_migrate_cma_page(page)) -- 2.21.0 _______________________________________________ devel mailing list [email protected] http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel
