|
@@ -688,6 +688,15 @@ static int change_page_attr_set_clr(unsigned long addr, int numpages,
|
|
|
if (!pgprot_val(mask_set) && !pgprot_val(mask_clr))
|
|
|
return 0;
|
|
|
|
|
|
+ /* Ensure we are PAGE_SIZE aligned */
|
|
|
+ if (addr & ~PAGE_MASK) {
|
|
|
+ addr &= PAGE_MASK;
|
|
|
+ /*
|
|
|
+ * People should not be passing in unaligned addresses:
|
|
|
+ */
|
|
|
+ WARN_ON_ONCE(1);
|
|
|
+ }
|
|
|
+
|
|
|
cpa.vaddr = addr;
|
|
|
cpa.numpages = numpages;
|
|
|
cpa.mask_set = mask_set;
|
|
@@ -861,8 +870,12 @@ void kernel_map_pages(struct page *page, int numpages, int enable)
|
|
|
return;
|
|
|
|
|
|
/*
|
|
|
- * The return value is ignored - the calls cannot fail,
|
|
|
- * large pages are disabled at boot time:
|
|
|
+ * The return value is ignored as the calls cannot fail.
|
|
|
+ * Large pages are kept enabled at boot time, and are
|
|
|
+ * split up quickly with DEBUG_PAGEALLOC. If a splitup
|
|
|
+ * fails here (due to temporary memory shortage) no damage
|
|
|
+ * is done because we just keep the largepage intact up
|
|
|
+ * to the next attempt when it will likely be split up:
|
|
|
*/
|
|
|
if (enable)
|
|
|
__set_pages_p(page, numpages);
|