Hi George, On Mon, Mar 01, 2021 at 08:20:45PM -0500, George Kennedy wrote: > > > > > > > > > There should be no harm in doing the memblock_reserve() for all > > > > the standard > > > > tables, right? > > > It should be ok to memblock_reserve() all the tables very early as > > > long as > > > we don't run out of static entries in memblock.reserved. > > > > > > We just need to make sure the tables are reserved before memblock > > > allocations are possible, so we'd still need to move > > > acpi_table_init() in > > > x86::setup_arch() before e820__memblock_setup(). > > > Not sure how early ACPI is initialized on arm64. > > > > Thanks Mike. Will try to move the memblock_reserves() before > > e820__memblock_setup(). > > Hi Mike, > > Moved acpi_table_init() in x86::setup_arch() before e820__memblock_setup() > as you suggested. > > Ran 10 boots with the following without error. I'd suggest to send it as a formal patch to see what x86 and ACPI folks have to say about this. > diff --git a/arch/x86/kernel/setup.c b/arch/x86/kernel/setup.c > index 740f3bdb..3b1dd24 100644 > --- a/arch/x86/kernel/setup.c > +++ b/arch/x86/kernel/setup.c > @@ -1047,6 +1047,7 @@ void __init setup_arch(char **cmdline_p) > cleanup_highmap(); > > memblock_set_current_limit(ISA_END_ADDRESS); > + acpi_boot_table_init(); > e820__memblock_setup(); > > /* > @@ -1140,8 +1141,6 @@ void __init setup_arch(char **cmdline_p) > /* > * Parse the ACPI tables for possible boot-time SMP configuration. > */ > - acpi_boot_table_init(); > - > early_acpi_boot_init(); > > initmem_init(); > diff --git a/drivers/acpi/acpica/tbinstal.c b/drivers/acpi/acpica/tbinstal.c > index 0bb15ad..7830109 100644 > --- a/drivers/acpi/acpica/tbinstal.c > +++ b/drivers/acpi/acpica/tbinstal.c > @@ -7,6 +7,7 @@ > * > *****************************************************************************/ > > +#include <linux/memblock.h> > #include <acpi/acpi.h> > #include "accommon.h" > #include "actables.h" > @@ -16,6 +17,33 @@ > > /******************************************************************************* > * > + * FUNCTION: acpi_tb_reserve_standard_table > + * > + * PARAMETERS: address - Table physical address > + * header - Table header > + * > + * RETURN: None > + * > + * DESCRIPTION: To avoid an acpi table page from being "stolen" by the > buddy > + * allocator run memblock_reserve() on all the standard acpi > tables. > + * > + ******************************************************************************/ > +void > +acpi_tb_reserve_standard_table(acpi_physical_address address, > + struct acpi_table_header *header) > +{ > + if ((ACPI_COMPARE_NAMESEG(header->signature, ACPI_SIG_FACS)) || > + (ACPI_VALIDATE_RSDP_SIG(header->signature))) > + return; > + Why these should be excluded? > + if (header->length > PAGE_SIZE) /* same check as in acpi_map() */ > + return; I don't think this is required, I believe acpi_map() has this check because kmap() cannot handle multiple pages. > + > + memblock_reserve(address, PAGE_ALIGN(header->length)); > +} > + > +/******************************************************************************* > + * > * FUNCTION: acpi_tb_install_table_with_override > * > * PARAMETERS: new_table_desc - New table descriptor to install > @@ -58,6 +86,9 @@ > new_table_desc->flags, > new_table_desc->pointer); > > + acpi_tb_reserve_standard_table(new_table_desc->address, > + new_table_desc->pointer); > + > acpi_tb_print_table_header(new_table_desc->address, > new_table_desc->pointer); > > George -- Sincerely yours, Mike.