diff --git a/arch/arm64/kernel/memory.c b/arch/arm64/kernel/memory.c index a9ab6af7..5ac7ae70 100644 --- a/arch/arm64/kernel/memory.c +++ b/arch/arm64/kernel/memory.c @@ -2591,14 +2591,28 @@ int arch_get_smaller_page_size(void *args, size_t cursize, size_t *newsizep, /* dummy */ panic("not reached"); } - else if ((cursize > PTL3_SIZE) && CONFIG_ARM64_PGTABLE_LEVELS > 2) { + else if (CONFIG_ARM64_PGTABLE_LEVELS > 2 && + cursize > PTL3_CONT_SIZE) { + newsize = PTL3_CONT_SIZE; + p2align = PTL3_CONT_SHIFT - PTL1_SHIFT; + } + else if (CONFIG_ARM64_PGTABLE_LEVELS > 2 && + cursize > PTL3_SIZE) { newsize = PTL3_SIZE; p2align = PTL3_SHIFT - PTL1_SHIFT; } + else if (cursize > PTL2_CONT_SIZE) { + newsize = PTL2_CONT_SIZE; + p2align = PTL2_CONT_SHIFT - PTL1_SHIFT; + } else if (cursize > PTL2_SIZE) { newsize = PTL2_SIZE; p2align = PTL2_SHIFT - PTL1_SHIFT; } + else if (cursize > PTL1_CONT_SIZE) { + newsize = PTL1_CONT_SIZE; + p2align = PTL1_CONT_SHIFT - PTL1_SHIFT; + } else if (cursize > PTL1_SIZE) { newsize = PTL1_SIZE; p2align = PTL1_SHIFT - PTL1_SHIFT;