Re: [PATCH] mm, kasan: don't poison boot memory

From: Mike Rapoport
Date: Tue Mar 02 2021 - 05:13:08 EST


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.