|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] RE: [XEN RFC PATCH 23/40] xen/arm: introduce a helper to parse device tree memory node
Hi Stefano,
> -----Original Message-----
> From: Stefano Stabellini <sstabellini@xxxxxxxxxx>
> Sent: 2021年8月28日 9:06
> To: Wei Chen <Wei.Chen@xxxxxxx>
> Cc: xen-devel@xxxxxxxxxxxxxxxxxxxx; sstabellini@xxxxxxxxxx; julien@xxxxxxx;
> jbeulich@xxxxxxxx; Bertrand Marquis <Bertrand.Marquis@xxxxxxx>
> Subject: Re: [XEN RFC PATCH 23/40] xen/arm: introduce a helper to parse
> device tree memory node
>
> On Wed, 11 Aug 2021, Wei Chen wrote:
> > Memory blocks' NUMA ID information is stored in device tree's
> > memory nodes as "numa-node-id". We need a new helper to parse
> > and verify this ID from memory nodes.
> >
> > In order to support memory affinity in later use, the valid
> > memory ranges and NUMA ID will be saved to tables.
> >
> > Signed-off-by: Wei Chen <wei.chen@xxxxxxx>
> > ---
> > xen/arch/arm/numa_device_tree.c | 130 ++++++++++++++++++++++++++++++++
> > 1 file changed, 130 insertions(+)
> >
> > diff --git a/xen/arch/arm/numa_device_tree.c
> b/xen/arch/arm/numa_device_tree.c
> > index 37cc56acf3..bbe081dcd1 100644
> > --- a/xen/arch/arm/numa_device_tree.c
> > +++ b/xen/arch/arm/numa_device_tree.c
> > @@ -20,11 +20,13 @@
> > #include <xen/init.h>
> > #include <xen/nodemask.h>
> > #include <xen/numa.h>
> > +#include <xen/libfdt/libfdt.h>
> > #include <xen/device_tree.h>
> > #include <asm/setup.h>
> >
> > s8 device_tree_numa = 0;
> > static nodemask_t processor_nodes_parsed __initdata;
> > +static nodemask_t memory_nodes_parsed __initdata;
> >
> > static int srat_disabled(void)
> > {
> > @@ -55,6 +57,79 @@ static int __init
> dtb_numa_processor_affinity_init(nodeid_t node)
> > return 0;
> > }
> >
> > +/* Callback for parsing of the memory regions affinity */
> > +static int __init dtb_numa_memory_affinity_init(nodeid_t node,
> > + paddr_t start, paddr_t size)
> > +{
> > + struct node *nd;
> > + paddr_t end;
> > + int i;
> > +
> > + if ( srat_disabled() )
> > + return -EINVAL;
> > +
> > + end = start + size;
> > + if ( num_node_memblks >= NR_NODE_MEMBLKS )
> > + {
> > + dprintk(XENLOG_WARNING,
> > + "Too many numa entry, try bigger NR_NODE_MEMBLKS \n");
> > + bad_srat();
> > + return -EINVAL;
> > + }
> > +
> > + /* It is fine to add this area to the nodes data it will be used
> later */
> > + i = conflicting_memblks(start, end);
> > + /* No conflicting memory block, we can save it for later usage */;
> > + if ( i < 0 )
> > + goto save_memblk;
> > +
> > + if ( memblk_nodeid[i] == node ) {
> > + /*
> > + * Overlaps with other memblk in the same node, warning here.
> > + * This memblk will be merged with conflicted memblk later.
> > + */
> > + printk(XENLOG_WARNING
> > + "DT: NUMA NODE %u (%"PRIx64
> > + "-%"PRIx64") overlaps with itself (%"PRIx64"-
> %"PRIx64")\n",
> > + node, start, end,
> > + node_memblk_range[i].start, node_memblk_range[i].end);
> > + } else {
> > + /*
> > + * Conflict with memblk in other node, this is an error.
> > + * The NUMA information is invalid, NUMA will be turn off.
> > + */
> > + printk(XENLOG_ERR
> > + "DT: NUMA NODE %u (%"PRIx64"-%"
> > + PRIx64") overlaps with NODE %u (%"PRIx64"-%"PRIx64")\n",
> > + node, start, end, memblk_nodeid[i],
> > + node_memblk_range[i].start, node_memblk_range[i].end);
> > + bad_srat();
> > + return -EINVAL;
> > + }
> > +
> > +save_memblk:
> > + nd = &nodes[node];
> > + if ( !node_test_and_set(node, memory_nodes_parsed) ) {
> > + nd->start = start;
> > + nd->end = end;
> > + } else {
> > + if ( start < nd->start )
> > + nd->start = start;
> > + if ( nd->end < end )
> > + nd->end = end;
> > + }
> > +
> > + printk(XENLOG_INFO "DT: NUMA node %u %"PRIx64"-%"PRIx64"\n",
> > + node, start, end);
> > +
> > + node_memblk_range[num_node_memblks].start = start;
> > + node_memblk_range[num_node_memblks].end = end;
> > + memblk_nodeid[num_node_memblks] = node;
> > + num_node_memblks++;
>
>
> Is it possible to have non-contigous ranges of memory for a single NUMA
> node?
>
> Looking at the DT bindings and Linux implementation, it seems possible.
> Here, it seems that node_memblk_range/memblk_nodeid could handle it,
> but nodes couldn't.
Yes, you're right. I copied this code for x86 ACPI NUMA. Does ACPI allow
non-contiguous ranges of memory for a single NUMA node too? If yes, I think
this will affect x86 ACPI NUMA too. In next version, we plan to merge
dtb_numa_memory_affinity_init and acpi_numa_memory_affinity_init into a
neutral function. So we can fix them at the same time.
If not, maybe we have to keep the diversity for dtb and ACPI here.
Anyway, Thanks for pointing this, I will look into the latest Linux
implementation.
Cheers,
Wei Chen
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |