diff --git a/mm/vmalloc.c b/mm/vmalloc.c index a3e2e4244c0f..395358b363fc 100644 --- a/mm/vmalloc.c +++ b/mm/vmalloc.c @@ -3361,12 +3361,15 @@ static inline void set_area_direct_map(const struct vm_struct *area, int (*set_direct_map)(struct page *page, unsigned int nr)) { - unsigned long i; + unsigned int nr = (1U << vm_area_page_order(area)); - /* HUGE_VMALLOC passes small pages to set_direct_map */ - for (i = 0; i < area->nr_pages; i++) - if (page_address(area->pages[i])) - set_direct_map(area->pages[i], 1); + for (unsigned long i = 0; i < area->nr_pages; i += nr) { + if (page_address(area->pages[i])) { + int err = set_direct_map(area->pages[i], nr); + + WARN_ON_ONCE(err); + } + } } /*