Re: [PATCH] x86/boot/compressed: Reserve more memory for page tables

From: Dave Hansen
Date: Thu Sep 14 2023 - 11:51:55 EST


On 9/14/23 05:30, Kirill A. Shutemov wrote:
> +/*
> + * Total number of page table kernel_add_identity_map() can allocate,
> + * including page tables consumed by startup_32().
> + */
> +# define BOOT_PGT_SIZE (32*4096)

I agree that needing to know this in advance *exactly* is troublesome.

But I do think that we should preserve the comment about the worst-case
scenario. Also, I thought this was triggered by unaccepted memory. Am
I remembering it wrong? How was it in play?

Either way, I think your general approach here is sound. But let's add
one little tweak to at least warn when we're getting close to the limit.
Now that nobody has to worry about the limit for the immediate future
it's a guarantee that in the long term someone will plow through it
accidentally.

Let's add a soft warning when we're nearing the limit so that there's a
chance to catch these things in the future.diff --git a/arch/x86/boot/compressed/ident_map_64.c b/arch/x86/boot/compressed/ident_map_64.c
index bcc956c17872..5dfb6a31bbb1 100644
--- a/arch/x86/boot/compressed/ident_map_64.c
+++ b/arch/x86/boot/compressed/ident_map_64.c
@@ -59,6 +59,13 @@ static void *alloc_pgt_page(void *context)
return NULL;
}

+ if (pages->pgt_buf_offset >= pages->pgt_buf_size * 3 / 4) {
+ debug_putstr("pgt_buf running low in " __FILE__ "\n");
+ debug_putstr("Need to raise BOOT_PGT_SIZE??\n");
+ debug_putaddr(pages->pgt_buf_offset);
+ debug_putaddr(pages->pgt_buf_size);
+ }
+
entry = pages->pgt_buf + pages->pgt_buf_offset;
pages->pgt_buf_offset += PAGE_SIZE;