[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 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. > > 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? > > 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. > 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. Thanks, Roger.
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |