|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [RFC PATCH v3 13/24] ARM: NUMA: DT: Parse memory NUMA information
On Thu, Jul 20, 2017 at 12:09 AM, Julien Grall <julien.grall@xxxxxxx> wrote:
> Hi Vijay,
>
> On 18/07/17 12:41, vijay.kilari@xxxxxxxxx wrote:
>>
>> From: Vijaya Kumar K <Vijaya.Kumar@xxxxxxxxxx>
>>
>> Parse memory node and fetch numa-node-id information.
>> For each memory range, store in node_memblk_range[]
>> along with node id.
>>
>> When booting in UEFI mode, UEFI passes memory information
>> to Dom0 using EFI memory descriptor table and deletes the
>> memory nodes from the host DT. However to fetch the memory
>> numa node id, memory DT node should not be deleted by EFI stub.
>> With this patch, do not delete memory node from FDT.
>>
>> NUMA info of memory is extracted from process_memory_node()
>> instead of parsing the DT again during numa_init().
>
>
> This patch does too much and needs to be split. The splitting would be at
> least:
>
> - EFI mode change
> - Numa change
OK
>
>>
>> Signed-off-by: Vijaya Kumar K <Vijaya.Kumar@xxxxxxxxxx>
>> ---
>> v3: - Set numa_off in numa_failed() and drop dt_numa variable
>> ---
>> xen/arch/arm/bootfdt.c | 25 +++++++++++++++++++++----
>> xen/arch/arm/efi/efi-boot.h | 25 -------------------------
>> xen/arch/arm/numa/dt_numa.c | 32 ++++++++++++++++++++++++++++++++
>> xen/arch/arm/numa/numa.c | 5 +++++
>> xen/include/asm-arm/numa.h | 2 ++
>> 5 files changed, 60 insertions(+), 29 deletions(-)
>>
>> diff --git a/xen/arch/arm/bootfdt.c b/xen/arch/arm/bootfdt.c
>> index 6e8251b..b3a132c 100644
>> --- a/xen/arch/arm/bootfdt.c
>> +++ b/xen/arch/arm/bootfdt.c
>> @@ -13,6 +13,8 @@
>> #include <xen/init.h>
>> #include <xen/device_tree.h>
>> #include <xen/libfdt/libfdt.h>
>> +#include <xen/numa.h>
>> +#include <xen/efi.h>
>
>
> Please add the headers in alphabetical order.
>
>> #include <xsm/xsm.h>
>> #include <asm/setup.h>
>>
>> @@ -146,6 +148,9 @@ static void __init process_memory_node(const void
>> *fdt, int node,
>> const __be32 *cell;
>> paddr_t start, size;
>> u32 reg_cells = address_cells + size_cells;
>> +#ifdef CONFIG_NUMA
>> + uint32_t nid;
>> +#endif
>>
>> if ( address_cells < 1 || size_cells < 1 )
>> {
>> @@ -154,24 +159,36 @@ static void __init process_memory_node(const void
>> *fdt, int node,
>> return;
>> }
>>
>> +#ifdef CONFIG_NUMA
>> + nid = device_tree_get_u32(fdt, node, "numa-node-id",
>> NR_NODE_MEMBLKS);
>
>
> Should not you use MAX_NUM_NODES rather than NR_NODE_MEMBLKS?
>
> Also, where is the sanity check?
OK
>
>> +#endif
>> prop = fdt_get_property(fdt, node, "reg", NULL);
>> if ( !prop )
>> {
>> printk("fdt: node `%s': missing `reg' property\n", name);
>> +#ifdef CONFIG_NUMA
>> + numa_failed();
>
>
> This file is using soft-tab not hard one.
>
>> +#endif
>> return;
>> }
>>
>> cell = (const __be32 *)prop->data;
>> banks = fdt32_to_cpu(prop->len) / (reg_cells * sizeof (u32));
>>
>> - for ( i = 0; i < banks && bootinfo.mem.nr_banks < NR_MEM_BANKS; i++ )
>> + for ( i = 0; i < banks; i++ )
>> {
>> device_tree_get_reg(&cell, address_cells, size_cells, &start,
>> &size);
>> if ( !size )
>> continue;
>> - bootinfo.mem.bank[bootinfo.mem.nr_banks].start = start;
>> - bootinfo.mem.bank[bootinfo.mem.nr_banks].size = size;
>> - bootinfo.mem.nr_banks++;
>> + if ( !efi_enabled(EFI_BOOT) && bootinfo.mem.nr_banks <
>> NR_MEM_BANKS )
>> + {
>> + bootinfo.mem.bank[bootinfo.mem.nr_banks].start = start;
>> + bootinfo.mem.bank[bootinfo.mem.nr_banks].size = size;
>> + bootinfo.mem.nr_banks++;
>> + }
>
>
> This change should be split.
>
>
>> +#ifdef CONFIG_NUMA
>> + dt_numa_process_memory_node(nid, start, size);
>> +#endif
>> }
>> }
>>
>> diff --git a/xen/arch/arm/efi/efi-boot.h b/xen/arch/arm/efi/efi-boot.h
>> index 56de26e..a8bde68 100644
>> --- a/xen/arch/arm/efi/efi-boot.h
>> +++ b/xen/arch/arm/efi/efi-boot.h
>> @@ -194,33 +194,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;
>> - }
>> -
>
>
> That chunk should move to the same patch as the EFI check.
>
ok
>
>> /*
>> * Delete all memory reserve map entries. When booting via UEFI,
>> * kernel will use the UEFI memory map to find reserved regions.
>> diff --git a/xen/arch/arm/numa/dt_numa.c b/xen/arch/arm/numa/dt_numa.c
>> index 963bb40..84030e7 100644
>> --- a/xen/arch/arm/numa/dt_numa.c
>> +++ b/xen/arch/arm/numa/dt_numa.c
>> @@ -58,6 +58,38 @@ static int __init dt_numa_process_cpu_node(const void
>> *fdt)
>> return 0;
>> }
>>
>> +void __init dt_numa_process_memory_node(uint32_t nid, paddr_t start,
>> + paddr_t size)
>> +{
>> + struct node *nd;
>> + int i;
>> +
>> + i = conflicting_memblks(start, start + size);
>> + if ( i < 0 )
>> + {
>> + if ( numa_add_memblk(nid, start, size) )
>> + {
>> + printk(XENLOG_WARNING "DT: NUMA: node-id %u overflow \n",
>> nid);
>> + numa_failed();
>> + return;
>> + }
>> + }
>> + else
>> + {
>> + nd = get_node_memblk_range(i);
>> + printk(XENLOG_ERR
>> + "NUMA DT: node %u (%"PRIx64"-%"PRIx64") overlaps with %d
>> (%"PRIx64"-%"PRIx64")\n",
>
>
> s/PRIx64/PRI_paddr/
ok
>
>> + nid, start, start + size, i, nd->start, nd->end);
>> +
>> + numa_failed();
>> + return;
>> + }
>> +
>> + node_set(nid, memory_nodes_parsed);
>
>
> This code looks fairly similar to some bits of
> acpi_numa_memory_affinity_init. Is there any way we could introduce a common
> helper?
Yes some bit of code is similar, But acpi_numa_memory_affinity_init() is stuffed
with some more checks of ACPI data in between the code. So quite complex
to make it common code.
>
>
>> +
>> + return;
>> +}
>> +
>> int __init dt_numa_init(void)
>> {
>> int ret;
>> diff --git a/xen/arch/arm/numa/numa.c b/xen/arch/arm/numa/numa.c
>> index 45cc418..8227361 100644
>> --- a/xen/arch/arm/numa/numa.c
>> +++ b/xen/arch/arm/numa/numa.c
>> @@ -19,6 +19,11 @@
>> #include <xen/nodemask.h>
>> #include <xen/numa.h>
>>
>> +void numa_failed(void)
>> +{
>> + numa_off = true;
>> +}
>> +
>> void __init numa_init(void)
>> {
>> int ret = 0;
>> diff --git a/xen/include/asm-arm/numa.h b/xen/include/asm-arm/numa.h
>> index 8f517a2..36cd782 100644
>> --- a/xen/include/asm-arm/numa.h
>> +++ b/xen/include/asm-arm/numa.h
>> @@ -3,6 +3,8 @@
>>
>> typedef uint8_t nodeid_t;
>>
>> +void dt_numa_process_memory_node(uint32_t nid, paddr_t start, paddr_t
>> size);
>
>
> Likely, this should go under CONFIG_NUMA.
ok
>
>> +
>> #ifdef CONFIG_NUMA
>> void numa_init(void);
>> int dt_numa_init(void);
>>
>
> Cheers,
>
> --
> Julien Grall
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
https://lists.xen.org/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |