|
@@ -118,6 +118,18 @@ static void __init zero_p4d_populate(pgd_t *pgd, unsigned long addr,
|
|
|
|
|
|
do {
|
|
|
next = p4d_addr_end(addr, end);
|
|
|
+ if (IS_ALIGNED(addr, P4D_SIZE) && end - addr >= P4D_SIZE) {
|
|
|
+ pud_t *pud;
|
|
|
+ pmd_t *pmd;
|
|
|
+
|
|
|
+ p4d_populate(&init_mm, p4d, lm_alias(kasan_zero_pud));
|
|
|
+ pud = pud_offset(p4d, addr);
|
|
|
+ pud_populate(&init_mm, pud, lm_alias(kasan_zero_pmd));
|
|
|
+ pmd = pmd_offset(pud, addr);
|
|
|
+ pmd_populate_kernel(&init_mm, pmd,
|
|
|
+ lm_alias(kasan_zero_pte));
|
|
|
+ continue;
|
|
|
+ }
|
|
|
|
|
|
if (p4d_none(*p4d)) {
|
|
|
p4d_populate(&init_mm, p4d,
|