[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [PATCH v2 04/10] xen/arm: Keep memory nodes in device tree when Xen boots from EFI
On Mon, 18 Apr 2022, Wei Chen wrote: > In current code, when Xen is booting from EFI, it will delete > all memory nodes in device tree. This would work well in current > stage, because Xen can get memory map from EFI system table. > However, EFI system table cannot completely replace memory nodes > of device tree. EFI system table doesn't contain memory NUMA > information. Xen depends on ACPI SRAT or device tree memory nodes > to parse memory blocks' NUMA mapping. So in EFI + DTB boot, Xen > doesn't have any method to get numa-node-id for memory blocks any > more. This makes device tree based NUMA support become impossible > for Xen in EFI + DTB boot. > > So in this patch, we will keep memory nodes in device tree for > NUMA code to parse memory numa-node-id later. > > As a side effect, if we still parse boot memory information in > early_scan_node, bootmem.info will calculate memory ranges in > memory nodes twice. So we have to prevent early_scan_node to > parse memory nodes in EFI boot. > > Signed-off-by: Wei Chen <wei.chen@xxxxxxx> Reviewed-by: Stefano Stabellini <sstabellini@xxxxxxxxxx> > --- > v1 -> v2: > 1. Move this patch from later to early of this series. > 2. Refine commit message. > --- > xen/arch/arm/bootfdt.c | 8 +++++++- > xen/arch/arm/efi/efi-boot.h | 25 ------------------------- > 2 files changed, 7 insertions(+), 26 deletions(-) > > diff --git a/xen/arch/arm/bootfdt.c b/xen/arch/arm/bootfdt.c > index e318ef9603..78e10c6ebc 100644 > --- a/xen/arch/arm/bootfdt.c > +++ b/xen/arch/arm/bootfdt.c > @@ -11,6 +11,7 @@ > #include <xen/lib.h> > #include <xen/kernel.h> > #include <xen/init.h> > +#include <xen/efi.h> > #include <xen/device_tree.h> > #include <xen/libfdt/libfdt.h> > #include <xen/sort.h> > @@ -370,7 +371,12 @@ static int __init early_scan_node(const void *fdt, > { > int rc = 0; > > - if ( device_tree_node_matches(fdt, node, "memory") ) > + /* > + * If Xen has been booted via UEFI, the memory banks are > + * populated. So we should skip the parsing. > + */ > + if ( !efi_enabled(EFI_BOOT) && > + device_tree_node_matches(fdt, node, "memory") ) > rc = process_memory_node(fdt, node, name, depth, > address_cells, size_cells, &bootinfo.mem); > else if ( depth == 1 && !dt_node_cmp(name, "reserved-memory") ) > diff --git a/xen/arch/arm/efi/efi-boot.h b/xen/arch/arm/efi/efi-boot.h > index e452b687d8..59d93c24a1 100644 > --- a/xen/arch/arm/efi/efi-boot.h > +++ b/xen/arch/arm/efi/efi-boot.h > @@ -231,33 +231,8 @@ EFI_STATUS __init fdt_add_uefi_nodes(EFI_SYSTEM_TABLE > *sys_table, > int status; > u32 fdt_val32; > u64 fdt_val64; > - int prev; > int num_rsv; > > - /* > - * Delete any memory nodes present. The EFI memory map is the only > - * memory description provided to Xen. > - */ > - prev = 0; > - for (;;) > - { > - const char *type; > - int len; > - > - node = fdt_next_node(fdt, prev, NULL); > - if ( node < 0 ) > - break; > - > - type = fdt_getprop(fdt, node, "device_type", &len); > - if ( type && strncmp(type, "memory", len) == 0 ) > - { > - fdt_del_node(fdt, node); > - continue; > - } > - > - prev = node; > - } > - > /* > * Delete all memory reserve map entries. When booting via UEFI, > * kernel will use the UEFI memory map to find reserved regions. > -- > 2.25.1 >
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |