|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [PATCH v2.1] hvmloader: indicate dynamically allocated memory as ACPI NVS in e820
On 01/09/2020 10:28, Roger Pau Monné wrote:
> On Tue, Sep 01, 2020 at 03:50:34AM +0100, Igor Druzhinin wrote:
>> Guest kernel does need to know in some cases where the tables are located
>> to treat these regions properly. One example is kexec process where
>> the first kernel needs to pass firmware region locations to the second
>> kernel which is now a requirement after 02a3e3cdb7f12 ("x86/boot: Parse SRAT
>> table and count immovable memory regions").
>
> Can you add a note that this is a Linux commit? Albeit there's a
> reference to kexec above I don't it's entirely clear it's a Linux
> commit.
Ok.
>>
>> The memory that hvmloader allocates in the reserved region mostly contains
>> these useful tables and could be safely indicated as ACPI without the need
>> to designate a sub-region specially for that. Making it non-reclaimable
>> (ACPI NVS) in contrast with ACPI reclaim (ACPI table) memory would avoid
>> potential reuse of this memory by the guest taking into account this region
>> may contain runtime structures like VM86 TSS, etc. If necessary, those
>> can be moved away later and the region marked as reclaimable.
>
> By looking at domain_construct_memmap from libxl I think the same
> problem is not present on that case as regions are properly marked as
> RESERVED or ACPI as required?
Uhh, I simply forgot that PVH also constructs e820 - it seems it's doing it
properly though. I want to makes e820 map as close as possible between PVH and
HVM - let me see if I can improve my HVM version.
>>
>> Signed-off-by: Igor Druzhinin <igor.druzhinin@xxxxxxxxxx>
>
> Just one question below and one nit.
>
>> ---
>> Changes in v2.1:
>> - fixed previously missed uint32_t occurence
>>
>> Changes in v2:
>> - gave more information on NVS type selection and potential alternatives
>> in the description
>> - minor type fixes suggested
>>
>> ---
>> tools/firmware/hvmloader/e820.c | 21 +++++++++++++++++----
>> tools/firmware/hvmloader/util.c | 6 ++++++
>> tools/firmware/hvmloader/util.h | 3 +++
>> 3 files changed, 26 insertions(+), 4 deletions(-)
>>
>> diff --git a/tools/firmware/hvmloader/e820.c
>> b/tools/firmware/hvmloader/e820.c
>> index 4d1c955..0ad2f05 100644
>> --- a/tools/firmware/hvmloader/e820.c
>> +++ b/tools/firmware/hvmloader/e820.c
>> @@ -155,6 +155,8 @@ int build_e820_table(struct e820entry *e820,
>> {
>> unsigned int nr = 0, i, j;
>> uint32_t low_mem_end = hvm_info->low_mem_pgend << PAGE_SHIFT;
>> + unsigned long firmware_mem_end =
>> + RESERVED_MEMORY_DYNAMIC_START + (mem_mfns_allocated() <<
>> PAGE_SHIFT);
>>
>> if ( !lowmem_reserved_base )
>> lowmem_reserved_base = 0xA0000;
>> @@ -199,8 +201,19 @@ int build_e820_table(struct e820entry *e820,
>> nr++;
>>
>> /*
>> + * Mark populated reserved memory that contains ACPI and other tables as
>> + * ACPI NVS (non-reclaimable) space - that should help the guest to
>> treat
>> + * it correctly later (e.g. pass to the next kernel on kexec).
>> + */
>> +
>> + e820[nr].addr = RESERVED_MEMBASE;
>> + e820[nr].size = firmware_mem_end - RESERVED_MEMBASE;
>> + e820[nr].type = E820_NVS;
>> + nr++;
>> +
>> + /*
>> * Explicitly reserve space for special pages.
>> - * This space starts at RESERVED_MEMBASE an extends to cover various
>> + * This space starts after ACPI region and extends to cover various
>> * fixed hardware mappings (e.g., LAPIC, IOAPIC, default SVGA
>> framebuffer).
>> *
>> * If igd_opregion_pgbase we need to split the RESERVED region in two.
>> @@ -210,8 +223,8 @@ int build_e820_table(struct e820entry *e820,
>> {
>> uint32_t igd_opregion_base = igd_opregion_pgbase << PAGE_SHIFT;
>>
>> - e820[nr].addr = RESERVED_MEMBASE;
>> - e820[nr].size = (uint32_t) igd_opregion_base - RESERVED_MEMBASE;
>> + e820[nr].addr = firmware_mem_end;
>> + e820[nr].size = igd_opregion_base - firmware_mem_end;
>
> Is there anything between firmware_mem_end and igd_opregion_base now?
> You already account for RESERVED_MEMBASE to firmware_mem_end.
It's possible that there is something in between. IGD opregion is allocated
dynamically from above and occupies a couple of pages - there is a gap between
the
top of a populated region and it where other structures could be located.
I don't want to tie e820 to the current allocation order.
>> e820[nr].type = E820_RESERVED;
>> nr++;
>>
>> @@ -227,7 +240,7 @@ int build_e820_table(struct e820entry *e820,
>> }
>> else
>> {
>> - e820[nr].addr = RESERVED_MEMBASE;
>> + e820[nr].addr = firmware_mem_end;
>> e820[nr].size = (uint32_t)-e820[nr].addr;
>> e820[nr].type = E820_RESERVED;
>> nr++;
>> diff --git a/tools/firmware/hvmloader/util.c
>> b/tools/firmware/hvmloader/util.c
>> index 0c3f2d2..59cde4a 100644
>> --- a/tools/firmware/hvmloader/util.c
>> +++ b/tools/firmware/hvmloader/util.c
>> @@ -444,6 +444,12 @@ void mem_hole_populate_ram(xen_pfn_t mfn, uint32_t
>> nr_mfns)
>> static uint32_t alloc_up = RESERVED_MEMORY_DYNAMIC_START - 1;
>> static uint32_t alloc_down = RESERVED_MEMORY_DYNAMIC_END;
>>
>> +unsigned long mem_mfns_allocated(void)
>
> mem_pages_allocated might be better.
Ok, I'll see if I keep this function in a new version.
Igor
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |