Re: [PATCH] x86/mm: Make e820_end_ram_pfn() cover E820_TYPE_ACPI ranges

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Wed, 16 Aug 2023 at 23:24, Kirill A. Shutemov
<kirill.shutemov@xxxxxxxxxxxxxxx> wrote:
>
> e820__end_of_ram_pfn() is used to calculate max_pfn which, among other
> things, guides where direct mapping ends. Any memory above max_pfn is
> not going to be present in the direct mapping.
>
> e820__end_of_ram_pfn() finds the end of the ram based on the highest
> E820_TYPE_RAM range. But it doesn't includes E820_TYPE_ACPI ranges into
> calculation.
>
> Despite the name, E820_TYPE_ACPI covers not only ACPI data, but also EFI
> tables and might be required by kernel to function properly.
>
> Usually the problem is hidden because there is some E820_TYPE_RAM memory
> above E820_TYPE_ACPI. But crashkernel only presents pre-allocated crash
> memory as E820_TYPE_RAM on boot. If the preallocated range is small, it
> can fit under the last E820_TYPE_ACPI range.
>
> Modify e820__end_of_ram_pfn() and e820__end_of_low_ram_pfn() to cover
> E820_TYPE_ACPI memory.
>
> The problem was discovered during debugging kexec for TDX guest. TDX
> guest uses E820_TYPE_ACPI to store the unaccepted memory bitmap and pass
> it between the kernels on kexec.
>
> Signed-off-by: Kirill A. Shutemov <kirill.shutemov@xxxxxxxxxxxxxxx>

No objections to this, but we might also simply drop E820_TYPE_ACPI
altogether: it is only used for EFI_ACPI_RECLAIM_MEMORY, which is
memory that can be used by the OS as ordinary RAM if it is not
interested in the contents (or has already consumed them). So this
could arguably be classified as E820_TYPE_RAM too.

> ---
>  arch/x86/kernel/e820.c | 9 +++++----
>  1 file changed, 5 insertions(+), 4 deletions(-)
>
> diff --git a/arch/x86/kernel/e820.c b/arch/x86/kernel/e820.c
> index fb8cf953380d..99c80680dc9e 100644
> --- a/arch/x86/kernel/e820.c
> +++ b/arch/x86/kernel/e820.c
> @@ -827,7 +827,7 @@ u64 __init e820__memblock_alloc_reserved(u64 size, u64 align)
>  /*
>   * Find the highest page frame number we have available
>   */
> -static unsigned long __init e820_end_pfn(unsigned long limit_pfn, enum e820_type type)
> +static unsigned long __init e820_end_ram_pfn(unsigned long limit_pfn)
>  {
>         int i;
>         unsigned long last_pfn = 0;
> @@ -838,7 +838,8 @@ static unsigned long __init e820_end_pfn(unsigned long limit_pfn, enum e820_type
>                 unsigned long start_pfn;
>                 unsigned long end_pfn;
>
> -               if (entry->type != type)
> +               if (entry->type != E820_TYPE_RAM &&
> +                   entry->type != E820_TYPE_ACPI)
>                         continue;
>
>                 start_pfn = entry->addr >> PAGE_SHIFT;
> @@ -864,12 +865,12 @@ static unsigned long __init e820_end_pfn(unsigned long limit_pfn, enum e820_type
>
>  unsigned long __init e820__end_of_ram_pfn(void)
>  {
> -       return e820_end_pfn(MAX_ARCH_PFN, E820_TYPE_RAM);
> +       return e820_end_ram_pfn(MAX_ARCH_PFN);
>  }
>
>  unsigned long __init e820__end_of_low_ram_pfn(void)
>  {
> -       return e820_end_pfn(1UL << (32 - PAGE_SHIFT), E820_TYPE_RAM);
> +       return e820_end_ram_pfn(1UL << (32 - PAGE_SHIFT));
>  }
>
>  static void __init early_panic(char *msg)
> --
> 2.41.0
>



[Index of Archives]     [Linux ARM Kernel]     [Linux ARM]     [Linux Omap]     [Fedora ARM]     [IETF Annouce]     [Security]     [Bugtraq]     [Linux OMAP]     [Linux MIPS]     [ECOS]     [Asterisk Internet PBX]     [Linux API]

  Powered by Linux