Message ID | 20220329133352.3361248-1-amadeuszx.slawinski@linux.intel.com |
---|---|
State | Accepted |
Commit | 84958f38d897f85b34036356f64e908e4754170f |
Headers | show |
Series | [v2] x86/acpi: Preserve ACPI-table override during hibernation | expand |
On Tue, Mar 29, 2022 at 3:34 PM Amadeusz Sławiński <amadeuszx.slawinski@linux.intel.com> wrote: > > When overriding NHLT ACPI-table tests show that on some platforms > there is problem that NHLT contains garbage after hibernation/resume > cycle. > > Problem stems from the fact that ACPI override performs early memory > allocation using memblock_phys_alloc_range() in > memblock_phys_alloc_range(). This memory block is later being marked as > ACPI memory block in arch_reserve_mem_area(). Later when memory areas > are considered for hibernation it is being marked as nosave in > e820__register_nosave_regions(). > > Fix this by marking ACPI override memory area as ACPI NVS > (Non-Volatile-Sleeping), which according to specification needs to be > saved on entering S4 and restored when leaving and is implemented as > such in kernel. > > Signed-off-by: Amadeusz Sławiński <amadeuszx.slawinski@linux.intel.com> > --- > > Changes in v2: > * Changed approach as method used in v1 introduced potential for memory > corruption, which was caught by tests. > * Adjusted commit message describing above change in approach. > > --- > arch/x86/kernel/acpi/boot.c | 2 +- > 1 file changed, 1 insertion(+), 1 deletion(-) > > diff --git a/arch/x86/kernel/acpi/boot.c b/arch/x86/kernel/acpi/boot.c > index 0d01e7f5078c..2eeca97b730b 100644 > --- a/arch/x86/kernel/acpi/boot.c > +++ b/arch/x86/kernel/acpi/boot.c > @@ -1772,7 +1772,7 @@ int __acpi_release_global_lock(unsigned int *lock) > > void __init arch_reserve_mem_area(acpi_physical_address addr, size_t size) > { > - e820__range_add(addr, size, E820_TYPE_ACPI); > + e820__range_add(addr, size, E820_TYPE_NVS); > e820__update_table_print(); > } > > -- Given the lack of objections or concerns, applied as 5.19 material, thanks!
diff --git a/arch/x86/kernel/acpi/boot.c b/arch/x86/kernel/acpi/boot.c index 0d01e7f5078c..2eeca97b730b 100644 --- a/arch/x86/kernel/acpi/boot.c +++ b/arch/x86/kernel/acpi/boot.c @@ -1772,7 +1772,7 @@ int __acpi_release_global_lock(unsigned int *lock) void __init arch_reserve_mem_area(acpi_physical_address addr, size_t size) { - e820__range_add(addr, size, E820_TYPE_ACPI); + e820__range_add(addr, size, E820_TYPE_NVS); e820__update_table_print(); }
When overriding NHLT ACPI-table tests show that on some platforms there is problem that NHLT contains garbage after hibernation/resume cycle. Problem stems from the fact that ACPI override performs early memory allocation using memblock_phys_alloc_range() in memblock_phys_alloc_range(). This memory block is later being marked as ACPI memory block in arch_reserve_mem_area(). Later when memory areas are considered for hibernation it is being marked as nosave in e820__register_nosave_regions(). Fix this by marking ACPI override memory area as ACPI NVS (Non-Volatile-Sleeping), which according to specification needs to be saved on entering S4 and restored when leaving and is implemented as such in kernel. Signed-off-by: Amadeusz Sławiński <amadeuszx.slawinski@linux.intel.com> --- Changes in v2: * Changed approach as method used in v1 introduced potential for memory corruption, which was caught by tests. * Adjusted commit message describing above change in approach. --- arch/x86/kernel/acpi/boot.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)