The value of ibm,associativity-reference-points is in sync with what Skiboot does. It's a three level NUMA configuration where the first two levels references the same associativity index (0x4), meaning that the next distance after the local_distance (10) is two orders away (a '40' value in the Linux kernel). The third level (0x2) was added to allow NVLink GPUs to be placed outside of the same associativity domain of the regular NUMA nodes. However, we have to deal with the possibility of user customization of the NUMA distances, something that Skiboot doesn't need to, and this current scheme is too tight.
The next step to give users more flexibility is to define 4 distinct NUMA levels, allowing for 5 discrete values of distances (10, 20, 40, 80 and 160 as seen by the kernel). Signed-off-by: Daniel Henrique Barboza <danielhb...@gmail.com> --- hw/ppc/spapr.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/hw/ppc/spapr.c b/hw/ppc/spapr.c index b0c4b80a23..bc51d2db90 100644 --- a/hw/ppc/spapr.c +++ b/hw/ppc/spapr.c @@ -906,8 +906,9 @@ static void spapr_dt_rtas(SpaprMachineState *spapr, void *fdt) GString *qemu_hypertas = g_string_sized_new(256); uint32_t refpoints[] = { cpu_to_be32(0x4), - cpu_to_be32(0x4), + cpu_to_be32(0x3), cpu_to_be32(0x2), + cpu_to_be32(0x1), }; uint32_t nr_refpoints = ARRAY_SIZE(refpoints); uint64_t max_device_addr = MACHINE(spapr)->device_memory->base + @@ -970,6 +971,10 @@ static void spapr_dt_rtas(SpaprMachineState *spapr, void *fdt) g_string_free(qemu_hypertas, TRUE); if (spapr_machine_using_legacy_numa(spapr)) { + refpoints[1] = cpu_to_be32(0x4); + refpoints[2] = cpu_to_be32(0x2); + nr_refpoints = 3; + maxdomain = cpu_to_be32(spapr->extra_numa_nodes > 1 ? 1 : 0); maxdomains[1] = maxdomain; maxdomains[2] = maxdomain; -- 2.26.2