Thread (1 message) 1 message, 1 author, 2015-12-01

[PATCH v7 3/4] arm64/arm, numa, dt: adding numa dt binding implementation for arm64 platforms.

From: Ganapatrao Kulkarni <hidden>
Date: 2015-12-01 08:43:11
Also in: linux-devicetree

On Sat, Nov 28, 2015 at 3:00 PM, Shannon Zhao [off-list ref] wrote:

On 2015/11/18 1:20, Ganapatrao Kulkarni wrote:
quoted
+static int __init early_init_parse_memory_node(unsigned long node)
+{
+     const __be32 *reg, *endp;
+     int length;
+     int nid;
+
+     const char *type = of_get_flat_dt_prop(node, "device_type", NULL);
+
+     /* We are scanning "memory" nodes only */
+     if (type == NULL)
+             return 0;
+     else if (strcmp(type, "memory") != 0)
+             return 0;
+
+     nid = early_init_of_get_numa_nid(node);
+
+     if (nid == NUMA_NO_NODE)
+             return -EINVAL;
+
+     reg = of_get_flat_dt_prop(node, "reg", &length);
+     endp = reg + (length / sizeof(__be32));
+
+     while ((endp - reg) >= (dt_root_addr_cells + dt_root_size_cells)) {
+             u64 base, size;
+             struct memblock_region *mblk;
+
+             base = dt_mem_next_cell(dt_root_addr_cells, &reg);
+             size = dt_mem_next_cell(dt_root_size_cells, &reg);
+             pr_debug("NUMA-DT:  base = %llx , node = %u\n",
+                             base, nid);
+
+             for_each_memblock(memory, mblk) {
+                     if (mblk->base == base) {
+                             if (numa_add_memblk(nid,
+                                                     mblk->base,
+                                                     mblk->size) < 0)
+                                     return -EINVAL;
+                             break;
+                     }
+             }
Maybe this is not right. If the memory spaces of NUMA nodes are
continuous like below:

        memory at 60000000 {
                numa-node-id = <0x1>;
                reg = <0x0 0x60000000 0x0 0x20000000>;
                device_type = "memory";
        };

        memory at 40000000 {
                numa-node-id = <0x0>;
                reg = <0x0 0x40000000 0x0 0x20000000>;
                device_type = "memory";
        };

There is only one memory region [0x00000040000000-0x0000007fffffff] and
the mblk->base is 40000000, so it will not add the memory node 1.

I think this should do the same thing like ACPI_NUMA but add some codes
to check if the [base, base + size] is located in some memory region.
Or don't check because numa_add_memblk will fail if the [base, base +
size] is not located in some memory region.
i am not sure, this kind of mapping we can have, since memblock can only map
contiguous region to only one numa node. however i can add a check as
you suggested.
Thanks for the review!.
Thanks,
--
Shannon
thanks
Ganapat
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help