diff mbox series

efi/unaccepted: Use ACPI reclaim memory for unaccepted memory table

Message ID 20230816190557.3738-1-ardb@kernel.org
State Accepted
Commit e7761d827e99919c32400056a884e481ef008ec4
Headers show
Series efi/unaccepted: Use ACPI reclaim memory for unaccepted memory table | expand

Commit Message

Ard Biesheuvel Aug. 16, 2023, 7:05 p.m. UTC
Kyril reports that crashkernels fail to work on confidential VMs that
rely on the unaccepted memory table, and this appears to be caused by
the fact that it is not considered part of the set of firmware tables
that the crashkernel needs to map.

This is an oversight, and a result of the use of the EFI_LOADER_DATA
memory type for this table. The correct memory type to use for any
firmware table is EFI_ACPI_RECLAIM_MEMORY (including ones created by the
EFI stub), even though the name suggests that is it specific to ACPI.
ACPI reclaim means that the memory is used by the firmware to expose
information to the operating system, but that the memory region has no
special significance to the firmware itself, and the OS is free to
reclaim the memory and use it as ordinary memory if it is not interested
in the contents, or if it has already consumed them. In Linux, this
memory is never reclaimed, but it is always covered by the kernel direct
map and generally made accessible as ordinary memory.

On x86, ACPI reclaim memory is translated into E820_ACPI, which the
kexec logic already recognizes as memory that the crashkernel may need
to to access, and so it will be mapped and accessible to the booting
crash kernel.

Reported-by: Kirill A. Shutemov <kirill.shutemov@linux.intel.com>
Signed-off-by: Ard Biesheuvel <ardb@kernel.org>
---
 drivers/firmware/efi/libstub/unaccepted_memory.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

Comments

Tom Lendacky Sept. 18, 2023, 10:03 p.m. UTC | #1
On 8/16/23 14:05, Ard Biesheuvel wrote:
> Kyril reports that crashkernels fail to work on confidential VMs that
> rely on the unaccepted memory table, and this appears to be caused by
> the fact that it is not considered part of the set of firmware tables
> that the crashkernel needs to map.
> 
> This is an oversight, and a result of the use of the EFI_LOADER_DATA
> memory type for this table. The correct memory type to use for any
> firmware table is EFI_ACPI_RECLAIM_MEMORY (including ones created by the
> EFI stub), even though the name suggests that is it specific to ACPI.
> ACPI reclaim means that the memory is used by the firmware to expose
> information to the operating system, but that the memory region has no
> special significance to the firmware itself, and the OS is free to
> reclaim the memory and use it as ordinary memory if it is not interested
> in the contents, or if it has already consumed them. In Linux, this
> memory is never reclaimed, but it is always covered by the kernel direct
> map and generally made accessible as ordinary memory.
> 
> On x86, ACPI reclaim memory is translated into E820_ACPI, which the
> kexec logic already recognizes as memory that the crashkernel may need
> to to access, and so it will be mapped and accessible to the booting
> crash kernel.
> 
> Reported-by: Kirill A. Shutemov <kirill.shutemov@linux.intel.com>
> Signed-off-by: Ard Biesheuvel <ardb@kernel.org>
> ---
>   drivers/firmware/efi/libstub/unaccepted_memory.c | 2 +-
>   1 file changed, 1 insertion(+), 1 deletion(-)
> 
> diff --git a/drivers/firmware/efi/libstub/unaccepted_memory.c b/drivers/firmware/efi/libstub/unaccepted_memory.c
> index ca61f4733ea58693..9a655f30ba47db01 100644
> --- a/drivers/firmware/efi/libstub/unaccepted_memory.c
> +++ b/drivers/firmware/efi/libstub/unaccepted_memory.c
> @@ -62,7 +62,7 @@ efi_status_t allocate_unaccepted_bitmap(__u32 nr_desc,
>   	bitmap_size = DIV_ROUND_UP(unaccepted_end - unaccepted_start,
>   				   EFI_UNACCEPTED_UNIT_SIZE * BITS_PER_BYTE);
>   
> -	status = efi_bs_call(allocate_pool, EFI_LOADER_DATA,
> +	status = efi_bs_call(allocate_pool, EFI_ACPI_RECLAIM_MEMORY,

I bisected an SNP guest crash when using the tip tree to this commit. When
the kernel switches over to the swapper_pg_dir in init_mem_mapping(), the
unaccepted table is no longer mapped. Here's a copy of the stack trace:

[    0.074233] *** DEBUG: accept_memory:36 - unaccepted=0xffff88807f77ef18
[    0.075805] BUG: unable to handle page fault for address: ffff88807f77ef1c
[    0.076541] #PF: supervisor read access in kernel mode
[    0.077089] #PF: error_code(0x0000) - not-present page
[    0.077631] PGD 8000004c01067 P4D 8000004c01067 PUD 800017fffe067 PMD 8000004c04067 PTE 0
[    0.078498] Oops: 0000 [#1] PREEMPT SMP NOPTI
[    0.078967] CPU: 0 PID: 0 Comm: swapper Not tainted 6.6.0-rc2-sos-sev #12
[    0.079682] Hardware name: QEMU Standard PC (Q35 + ICH9, 2009), BIOS unknown 2/2/2022
[    0.080507] RIP: 0010:accept_memory+0x75/0x250
[    0.080984] Code: 74 4a 4c 89 e1 ba 24 00 00 00 48 c7 c6 68 9e 10 82 48 c7 c7 50 9e 53 82 e8 48 92 79 ff 4c 89 e7 e8 50 b5 6e ff ba 2c 00 00 00 <45> 8b 74 24 04 48 c7 c6 68 9e 10 82 48 c7 c7 3d 9e 53 82 e8 23 92
[    0.082969] RSP: 0000:ffffffff82803df8 EFLAGS: 00010046
[    0.083518] RAX: 0000000000000000 RBX: 000000017fffd000 RCX: 0000000000000000
[    0.084271] RDX: 000000000000002c RSI: ffffffff82803cc0 RDI: 00000000ffffffff
[    0.085029] RBP: 0000000000000000 R08: 00000000ffff7fff R09: 0000000000000001
[    0.085786] R10: 00000000ffff7fff R11: ffffffff8286f9e0 R12: ffff88807f77ef18
[    0.086537] R13: 000000017ffd2000 R14: 0000000000000000 R15: 000000017ffd2000
[    0.087293] FS:  0000000000000000(0000) GS:ffffffff83273000(0000) knlGS:0000000000000000
[    0.088154] CS:  0010 DS: 0000 ES: 0000 CR0: 0000000080050033
[    0.088764] CR2: ffff88807f77ef1c CR3: 000800000382e000 CR4: 00000000000000f0
[    0.089520] Call Trace:
[    0.089783]  <TASK>
[    0.090005]  ? __die+0x1f/0x70
[    0.090334]  ? page_fault_oops+0x81/0x150
[    0.090780]  ? kernelmode_fixup_or_oops+0x84/0x110
[    0.091287]  ? exc_page_fault+0xa8/0x150
[    0.091705]  ? asm_exc_page_fault+0x22/0x30
[    0.092161]  ? accept_memory+0x75/0x250
[    0.092564]  ? accept_memory+0x70/0x250
[    0.092971]  ? memblock_alloc_range_nid+0xf4/0x160
[    0.093479]  ? numa_register_memblks.constprop.0+0x286/0x3a0
[    0.094079]  ? __pfx_dummy_numa_init+0x10/0x10
[    0.094548]  ? numa_init+0x102/0x2a0
[    0.094929]  ? setup_arch+0xc58/0x1010
[    0.095326]  ? start_kernel+0x5e/0x5e0
[    0.095728]  ? x86_64_start_reservations+0x14/0x30
[    0.096235]  ? x86_64_start_kernel+0x79/0x80
[    0.096688]  ? secondary_startup_64_no_verify+0x16b/0x16b
[    0.097269]  </TASK>
[    0.097499] Modules linked in:
[    0.097826] CR2: ffff88807f77ef1c
[    0.098178] ---[ end trace 0000000000000000 ]---

Thanks,
Tom

>   			     sizeof(*unaccepted_table) + bitmap_size,
>   			     (void **)&unaccepted_table);
>   	if (status != EFI_SUCCESS) {
Kirill A. Shutemov Sept. 18, 2023, 10:10 p.m. UTC | #2
On Mon, Sep 18, 2023 at 05:03:59PM -0500, Tom Lendacky wrote:
> On 8/16/23 14:05, Ard Biesheuvel wrote:
> > Kyril reports that crashkernels fail to work on confidential VMs that
> > rely on the unaccepted memory table, and this appears to be caused by
> > the fact that it is not considered part of the set of firmware tables
> > that the crashkernel needs to map.
> > 
> > This is an oversight, and a result of the use of the EFI_LOADER_DATA
> > memory type for this table. The correct memory type to use for any
> > firmware table is EFI_ACPI_RECLAIM_MEMORY (including ones created by the
> > EFI stub), even though the name suggests that is it specific to ACPI.
> > ACPI reclaim means that the memory is used by the firmware to expose
> > information to the operating system, but that the memory region has no
> > special significance to the firmware itself, and the OS is free to
> > reclaim the memory and use it as ordinary memory if it is not interested
> > in the contents, or if it has already consumed them. In Linux, this
> > memory is never reclaimed, but it is always covered by the kernel direct
> > map and generally made accessible as ordinary memory.
> > 
> > On x86, ACPI reclaim memory is translated into E820_ACPI, which the
> > kexec logic already recognizes as memory that the crashkernel may need
> > to to access, and so it will be mapped and accessible to the booting
> > crash kernel.
> > 
> > Reported-by: Kirill A. Shutemov <kirill.shutemov@linux.intel.com>
> > Signed-off-by: Ard Biesheuvel <ardb@kernel.org>
> > ---
> >   drivers/firmware/efi/libstub/unaccepted_memory.c | 2 +-
> >   1 file changed, 1 insertion(+), 1 deletion(-)
> > 
> > diff --git a/drivers/firmware/efi/libstub/unaccepted_memory.c b/drivers/firmware/efi/libstub/unaccepted_memory.c
> > index ca61f4733ea58693..9a655f30ba47db01 100644
> > --- a/drivers/firmware/efi/libstub/unaccepted_memory.c
> > +++ b/drivers/firmware/efi/libstub/unaccepted_memory.c
> > @@ -62,7 +62,7 @@ efi_status_t allocate_unaccepted_bitmap(__u32 nr_desc,
> >   	bitmap_size = DIV_ROUND_UP(unaccepted_end - unaccepted_start,
> >   				   EFI_UNACCEPTED_UNIT_SIZE * BITS_PER_BYTE);
> > -	status = efi_bs_call(allocate_pool, EFI_LOADER_DATA,
> > +	status = efi_bs_call(allocate_pool, EFI_ACPI_RECLAIM_MEMORY,
> 
> I bisected an SNP guest crash when using the tip tree to this commit. When
> the kernel switches over to the swapper_pg_dir in init_mem_mapping(), the
> unaccepted table is no longer mapped. Here's a copy of the stack trace:

Could you try this patch:
 https://lore.kernel.org/all/20230917170629.d35gnwb6o54bdrhl@box.shutemov.name
Tom Lendacky Sept. 19, 2023, 1:28 p.m. UTC | #3
On 9/18/23 17:10, Kirill A . Shutemov wrote:
> On Mon, Sep 18, 2023 at 05:03:59PM -0500, Tom Lendacky wrote:
>> On 8/16/23 14:05, Ard Biesheuvel wrote:
>>> Kyril reports that crashkernels fail to work on confidential VMs that
>>> rely on the unaccepted memory table, and this appears to be caused by
>>> the fact that it is not considered part of the set of firmware tables
>>> that the crashkernel needs to map.
>>>
>>> This is an oversight, and a result of the use of the EFI_LOADER_DATA
>>> memory type for this table. The correct memory type to use for any
>>> firmware table is EFI_ACPI_RECLAIM_MEMORY (including ones created by the
>>> EFI stub), even though the name suggests that is it specific to ACPI.
>>> ACPI reclaim means that the memory is used by the firmware to expose
>>> information to the operating system, but that the memory region has no
>>> special significance to the firmware itself, and the OS is free to
>>> reclaim the memory and use it as ordinary memory if it is not interested
>>> in the contents, or if it has already consumed them. In Linux, this
>>> memory is never reclaimed, but it is always covered by the kernel direct
>>> map and generally made accessible as ordinary memory.
>>>
>>> On x86, ACPI reclaim memory is translated into E820_ACPI, which the
>>> kexec logic already recognizes as memory that the crashkernel may need
>>> to to access, and so it will be mapped and accessible to the booting
>>> crash kernel.
>>>
>>> Reported-by: Kirill A. Shutemov <kirill.shutemov@linux.intel.com>
>>> Signed-off-by: Ard Biesheuvel <ardb@kernel.org>
>>> ---
>>>    drivers/firmware/efi/libstub/unaccepted_memory.c | 2 +-
>>>    1 file changed, 1 insertion(+), 1 deletion(-)
>>>
>>> diff --git a/drivers/firmware/efi/libstub/unaccepted_memory.c b/drivers/firmware/efi/libstub/unaccepted_memory.c
>>> index ca61f4733ea58693..9a655f30ba47db01 100644
>>> --- a/drivers/firmware/efi/libstub/unaccepted_memory.c
>>> +++ b/drivers/firmware/efi/libstub/unaccepted_memory.c
>>> @@ -62,7 +62,7 @@ efi_status_t allocate_unaccepted_bitmap(__u32 nr_desc,
>>>    	bitmap_size = DIV_ROUND_UP(unaccepted_end - unaccepted_start,
>>>    				   EFI_UNACCEPTED_UNIT_SIZE * BITS_PER_BYTE);
>>> -	status = efi_bs_call(allocate_pool, EFI_LOADER_DATA,
>>> +	status = efi_bs_call(allocate_pool, EFI_ACPI_RECLAIM_MEMORY,
>>
>> I bisected an SNP guest crash when using the tip tree to this commit. When
>> the kernel switches over to the swapper_pg_dir in init_mem_mapping(), the
>> unaccepted table is no longer mapped. Here's a copy of the stack trace:
> 
> Could you try this patch:
>   https://lore.kernel.org/all/20230917170629.d35gnwb6o54bdrhl@box.shutemov.name

Yes, that fixes the issue for me.

Thanks,
Tom
>
Ard Biesheuvel Sept. 19, 2023, 1:37 p.m. UTC | #4
On Tue, 19 Sept 2023 at 15:28, Tom Lendacky <thomas.lendacky@amd.com> wrote:
>
> On 9/18/23 17:10, Kirill A . Shutemov wrote:
> > On Mon, Sep 18, 2023 at 05:03:59PM -0500, Tom Lendacky wrote:
> >> On 8/16/23 14:05, Ard Biesheuvel wrote:
> >>> Kyril reports that crashkernels fail to work on confidential VMs that
> >>> rely on the unaccepted memory table, and this appears to be caused by
> >>> the fact that it is not considered part of the set of firmware tables
> >>> that the crashkernel needs to map.
> >>>
> >>> This is an oversight, and a result of the use of the EFI_LOADER_DATA
> >>> memory type for this table. The correct memory type to use for any
> >>> firmware table is EFI_ACPI_RECLAIM_MEMORY (including ones created by the
> >>> EFI stub), even though the name suggests that is it specific to ACPI.
> >>> ACPI reclaim means that the memory is used by the firmware to expose
> >>> information to the operating system, but that the memory region has no
> >>> special significance to the firmware itself, and the OS is free to
> >>> reclaim the memory and use it as ordinary memory if it is not interested
> >>> in the contents, or if it has already consumed them. In Linux, this
> >>> memory is never reclaimed, but it is always covered by the kernel direct
> >>> map and generally made accessible as ordinary memory.
> >>>
> >>> On x86, ACPI reclaim memory is translated into E820_ACPI, which the
> >>> kexec logic already recognizes as memory that the crashkernel may need
> >>> to to access, and so it will be mapped and accessible to the booting
> >>> crash kernel.
> >>>
> >>> Reported-by: Kirill A. Shutemov <kirill.shutemov@linux.intel.com>
> >>> Signed-off-by: Ard Biesheuvel <ardb@kernel.org>
> >>> ---
> >>>    drivers/firmware/efi/libstub/unaccepted_memory.c | 2 +-
> >>>    1 file changed, 1 insertion(+), 1 deletion(-)
> >>>
> >>> diff --git a/drivers/firmware/efi/libstub/unaccepted_memory.c b/drivers/firmware/efi/libstub/unaccepted_memory.c
> >>> index ca61f4733ea58693..9a655f30ba47db01 100644
> >>> --- a/drivers/firmware/efi/libstub/unaccepted_memory.c
> >>> +++ b/drivers/firmware/efi/libstub/unaccepted_memory.c
> >>> @@ -62,7 +62,7 @@ efi_status_t allocate_unaccepted_bitmap(__u32 nr_desc,
> >>>     bitmap_size = DIV_ROUND_UP(unaccepted_end - unaccepted_start,
> >>>                                EFI_UNACCEPTED_UNIT_SIZE * BITS_PER_BYTE);
> >>> -   status = efi_bs_call(allocate_pool, EFI_LOADER_DATA,
> >>> +   status = efi_bs_call(allocate_pool, EFI_ACPI_RECLAIM_MEMORY,
> >>
> >> I bisected an SNP guest crash when using the tip tree to this commit. When
> >> the kernel switches over to the swapper_pg_dir in init_mem_mapping(), the
> >> unaccepted table is no longer mapped. Here's a copy of the stack trace:
> >
> > Could you try this patch:
> >   https://lore.kernel.org/all/20230917170629.d35gnwb6o54bdrhl@box.shutemov.name
>
> Yes, that fixes the issue for me.
>

Thanks for confirming. I've queued it up already, I will send it out
later this week.
Ard Biesheuvel Sept. 19, 2023, 3:04 p.m. UTC | #5
On Tue, 19 Sept 2023 at 13:37, Ard Biesheuvel <ardb@kernel.org> wrote:
>
> On Tue, 19 Sept 2023 at 15:28, Tom Lendacky <thomas.lendacky@amd.com> wrote:
> >
> > On 9/18/23 17:10, Kirill A . Shutemov wrote:
> > > On Mon, Sep 18, 2023 at 05:03:59PM -0500, Tom Lendacky wrote:
> > >> On 8/16/23 14:05, Ard Biesheuvel wrote:
> > >>> Kyril reports that crashkernels fail to work on confidential VMs that
> > >>> rely on the unaccepted memory table, and this appears to be caused by
> > >>> the fact that it is not considered part of the set of firmware tables
> > >>> that the crashkernel needs to map.
> > >>>
> > >>> This is an oversight, and a result of the use of the EFI_LOADER_DATA
> > >>> memory type for this table. The correct memory type to use for any
> > >>> firmware table is EFI_ACPI_RECLAIM_MEMORY (including ones created by the
> > >>> EFI stub), even though the name suggests that is it specific to ACPI.
> > >>> ACPI reclaim means that the memory is used by the firmware to expose
> > >>> information to the operating system, but that the memory region has no
> > >>> special significance to the firmware itself, and the OS is free to
> > >>> reclaim the memory and use it as ordinary memory if it is not interested
> > >>> in the contents, or if it has already consumed them. In Linux, this
> > >>> memory is never reclaimed, but it is always covered by the kernel direct
> > >>> map and generally made accessible as ordinary memory.
> > >>>
> > >>> On x86, ACPI reclaim memory is translated into E820_ACPI, which the
> > >>> kexec logic already recognizes as memory that the crashkernel may need
> > >>> to to access, and so it will be mapped and accessible to the booting
> > >>> crash kernel.
> > >>>
> > >>> Reported-by: Kirill A. Shutemov <kirill.shutemov@linux.intel.com>
> > >>> Signed-off-by: Ard Biesheuvel <ardb@kernel.org>
> > >>> ---
> > >>>    drivers/firmware/efi/libstub/unaccepted_memory.c | 2 +-
> > >>>    1 file changed, 1 insertion(+), 1 deletion(-)
> > >>>
> > >>> diff --git a/drivers/firmware/efi/libstub/unaccepted_memory.c b/drivers/firmware/efi/libstub/unaccepted_memory.c
> > >>> index ca61f4733ea58693..9a655f30ba47db01 100644
> > >>> --- a/drivers/firmware/efi/libstub/unaccepted_memory.c
> > >>> +++ b/drivers/firmware/efi/libstub/unaccepted_memory.c
> > >>> @@ -62,7 +62,7 @@ efi_status_t allocate_unaccepted_bitmap(__u32 nr_desc,
> > >>>     bitmap_size = DIV_ROUND_UP(unaccepted_end - unaccepted_start,
> > >>>                                EFI_UNACCEPTED_UNIT_SIZE * BITS_PER_BYTE);
> > >>> -   status = efi_bs_call(allocate_pool, EFI_LOADER_DATA,
> > >>> +   status = efi_bs_call(allocate_pool, EFI_ACPI_RECLAIM_MEMORY,
> > >>
> > >> I bisected an SNP guest crash when using the tip tree to this commit. When
> > >> the kernel switches over to the swapper_pg_dir in init_mem_mapping(), the
> > >> unaccepted table is no longer mapped. Here's a copy of the stack trace:
> > >
> > > Could you try this patch:
> > >   https://lore.kernel.org/all/20230917170629.d35gnwb6o54bdrhl@box.shutemov.name
> >
> > Yes, that fixes the issue for me.
> >
>
> Thanks for confirming. I've queued it up already, I will send it out
> later this week.

Tom,

Could you confirm whether or not this is related to loading a crashkernel?
Tom Lendacky Sept. 19, 2023, 3:08 p.m. UTC | #6
On 9/19/23 10:04, Ard Biesheuvel wrote:
> On Tue, 19 Sept 2023 at 13:37, Ard Biesheuvel <ardb@kernel.org> wrote:
>>
>> On Tue, 19 Sept 2023 at 15:28, Tom Lendacky <thomas.lendacky@amd.com> wrote:
>>>
>>> On 9/18/23 17:10, Kirill A . Shutemov wrote:
>>>> On Mon, Sep 18, 2023 at 05:03:59PM -0500, Tom Lendacky wrote:
>>>>> On 8/16/23 14:05, Ard Biesheuvel wrote:
>>>>>> Kyril reports that crashkernels fail to work on confidential VMs that
>>>>>> rely on the unaccepted memory table, and this appears to be caused by
>>>>>> the fact that it is not considered part of the set of firmware tables
>>>>>> that the crashkernel needs to map.
>>>>>>
>>>>>> This is an oversight, and a result of the use of the EFI_LOADER_DATA
>>>>>> memory type for this table. The correct memory type to use for any
>>>>>> firmware table is EFI_ACPI_RECLAIM_MEMORY (including ones created by the
>>>>>> EFI stub), even though the name suggests that is it specific to ACPI.
>>>>>> ACPI reclaim means that the memory is used by the firmware to expose
>>>>>> information to the operating system, but that the memory region has no
>>>>>> special significance to the firmware itself, and the OS is free to
>>>>>> reclaim the memory and use it as ordinary memory if it is not interested
>>>>>> in the contents, or if it has already consumed them. In Linux, this
>>>>>> memory is never reclaimed, but it is always covered by the kernel direct
>>>>>> map and generally made accessible as ordinary memory.
>>>>>>
>>>>>> On x86, ACPI reclaim memory is translated into E820_ACPI, which the
>>>>>> kexec logic already recognizes as memory that the crashkernel may need
>>>>>> to to access, and so it will be mapped and accessible to the booting
>>>>>> crash kernel.
>>>>>>
>>>>>> Reported-by: Kirill A. Shutemov <kirill.shutemov@linux.intel.com>
>>>>>> Signed-off-by: Ard Biesheuvel <ardb@kernel.org>
>>>>>> ---
>>>>>>     drivers/firmware/efi/libstub/unaccepted_memory.c | 2 +-
>>>>>>     1 file changed, 1 insertion(+), 1 deletion(-)
>>>>>>
>>>>>> diff --git a/drivers/firmware/efi/libstub/unaccepted_memory.c b/drivers/firmware/efi/libstub/unaccepted_memory.c
>>>>>> index ca61f4733ea58693..9a655f30ba47db01 100644
>>>>>> --- a/drivers/firmware/efi/libstub/unaccepted_memory.c
>>>>>> +++ b/drivers/firmware/efi/libstub/unaccepted_memory.c
>>>>>> @@ -62,7 +62,7 @@ efi_status_t allocate_unaccepted_bitmap(__u32 nr_desc,
>>>>>>      bitmap_size = DIV_ROUND_UP(unaccepted_end - unaccepted_start,
>>>>>>                                 EFI_UNACCEPTED_UNIT_SIZE * BITS_PER_BYTE);
>>>>>> -   status = efi_bs_call(allocate_pool, EFI_LOADER_DATA,
>>>>>> +   status = efi_bs_call(allocate_pool, EFI_ACPI_RECLAIM_MEMORY,
>>>>>
>>>>> I bisected an SNP guest crash when using the tip tree to this commit. When
>>>>> the kernel switches over to the swapper_pg_dir in init_mem_mapping(), the
>>>>> unaccepted table is no longer mapped. Here's a copy of the stack trace:
>>>>
>>>> Could you try this patch:
>>>>    https://lore.kernel.org/all/20230917170629.d35gnwb6o54bdrhl@box.shutemov.name
>>>
>>> Yes, that fixes the issue for me.
>>>
>>
>> Thanks for confirming. I've queued it up already, I will send it out
>> later this week.
> 
> Tom,
> 
> Could you confirm whether or not this is related to loading a crashkernel?

This was experienced just booting an SNP guest, it was not related to 
loading a crashkernel.

Thanks,
Tom
diff mbox series

Patch

diff --git a/drivers/firmware/efi/libstub/unaccepted_memory.c b/drivers/firmware/efi/libstub/unaccepted_memory.c
index ca61f4733ea58693..9a655f30ba47db01 100644
--- a/drivers/firmware/efi/libstub/unaccepted_memory.c
+++ b/drivers/firmware/efi/libstub/unaccepted_memory.c
@@ -62,7 +62,7 @@  efi_status_t allocate_unaccepted_bitmap(__u32 nr_desc,
 	bitmap_size = DIV_ROUND_UP(unaccepted_end - unaccepted_start,
 				   EFI_UNACCEPTED_UNIT_SIZE * BITS_PER_BYTE);
 
-	status = efi_bs_call(allocate_pool, EFI_LOADER_DATA,
+	status = efi_bs_call(allocate_pool, EFI_ACPI_RECLAIM_MEMORY,
 			     sizeof(*unaccepted_table) + bitmap_size,
 			     (void **)&unaccepted_table);
 	if (status != EFI_SUCCESS) {