ARM: Virt: Set numa-node-id for cpu and memory nodes
Generate memory nodes according to NUMA topology. Set numa-node-id property for cpu and memory nodes. Signed-off-by: Shannon Zhao <shannon.zhao@linaro.org> Reviewed-by: Andrew Jones <drjones@redhat.com> Message-id: 1461667229-9216-2-git-send-email-zhaoshenglong@huawei.com Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
This commit is contained in:
parent
3c09d6caad
commit
9695200ad8
|
@ -14,6 +14,7 @@
|
||||||
#include "hw/arm/linux-boot-if.h"
|
#include "hw/arm/linux-boot-if.h"
|
||||||
#include "sysemu/kvm.h"
|
#include "sysemu/kvm.h"
|
||||||
#include "sysemu/sysemu.h"
|
#include "sysemu/sysemu.h"
|
||||||
|
#include "sysemu/numa.h"
|
||||||
#include "hw/boards.h"
|
#include "hw/boards.h"
|
||||||
#include "hw/loader.h"
|
#include "hw/loader.h"
|
||||||
#include "elf.h"
|
#include "elf.h"
|
||||||
|
@ -405,6 +406,9 @@ static int load_dtb(hwaddr addr, const struct arm_boot_info *binfo,
|
||||||
void *fdt = NULL;
|
void *fdt = NULL;
|
||||||
int size, rc;
|
int size, rc;
|
||||||
uint32_t acells, scells;
|
uint32_t acells, scells;
|
||||||
|
char *nodename;
|
||||||
|
unsigned int i;
|
||||||
|
hwaddr mem_base, mem_len;
|
||||||
|
|
||||||
if (binfo->dtb_filename) {
|
if (binfo->dtb_filename) {
|
||||||
char *filename;
|
char *filename;
|
||||||
|
@ -456,12 +460,39 @@ static int load_dtb(hwaddr addr, const struct arm_boot_info *binfo,
|
||||||
goto fail;
|
goto fail;
|
||||||
}
|
}
|
||||||
|
|
||||||
rc = qemu_fdt_setprop_sized_cells(fdt, "/memory", "reg",
|
if (nb_numa_nodes > 0) {
|
||||||
acells, binfo->loader_start,
|
/*
|
||||||
scells, binfo->ram_size);
|
* Turn the /memory node created before into a NOP node, then create
|
||||||
if (rc < 0) {
|
* /memory@addr nodes for all numa nodes respectively.
|
||||||
fprintf(stderr, "couldn't set /memory/reg\n");
|
*/
|
||||||
goto fail;
|
qemu_fdt_nop_node(fdt, "/memory");
|
||||||
|
mem_base = binfo->loader_start;
|
||||||
|
for (i = 0; i < nb_numa_nodes; i++) {
|
||||||
|
mem_len = numa_info[i].node_mem;
|
||||||
|
nodename = g_strdup_printf("/memory@%" PRIx64, mem_base);
|
||||||
|
qemu_fdt_add_subnode(fdt, nodename);
|
||||||
|
qemu_fdt_setprop_string(fdt, nodename, "device_type", "memory");
|
||||||
|
rc = qemu_fdt_setprop_sized_cells(fdt, nodename, "reg",
|
||||||
|
acells, mem_base,
|
||||||
|
scells, mem_len);
|
||||||
|
if (rc < 0) {
|
||||||
|
fprintf(stderr, "couldn't set %s/reg for node %d\n", nodename,
|
||||||
|
i);
|
||||||
|
goto fail;
|
||||||
|
}
|
||||||
|
|
||||||
|
qemu_fdt_setprop_cell(fdt, nodename, "numa-node-id", i);
|
||||||
|
mem_base += mem_len;
|
||||||
|
g_free(nodename);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
rc = qemu_fdt_setprop_sized_cells(fdt, "/memory", "reg",
|
||||||
|
acells, binfo->loader_start,
|
||||||
|
scells, binfo->ram_size);
|
||||||
|
if (rc < 0) {
|
||||||
|
fprintf(stderr, "couldn't set /memory/reg\n");
|
||||||
|
goto fail;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (binfo->kernel_cmdline && *binfo->kernel_cmdline) {
|
if (binfo->kernel_cmdline && *binfo->kernel_cmdline) {
|
||||||
|
|
|
@ -38,6 +38,7 @@
|
||||||
#include "net/net.h"
|
#include "net/net.h"
|
||||||
#include "sysemu/block-backend.h"
|
#include "sysemu/block-backend.h"
|
||||||
#include "sysemu/device_tree.h"
|
#include "sysemu/device_tree.h"
|
||||||
|
#include "sysemu/numa.h"
|
||||||
#include "sysemu/sysemu.h"
|
#include "sysemu/sysemu.h"
|
||||||
#include "sysemu/kvm.h"
|
#include "sysemu/kvm.h"
|
||||||
#include "hw/boards.h"
|
#include "hw/boards.h"
|
||||||
|
@ -329,6 +330,7 @@ static void fdt_add_cpu_nodes(const VirtBoardInfo *vbi)
|
||||||
{
|
{
|
||||||
int cpu;
|
int cpu;
|
||||||
int addr_cells = 1;
|
int addr_cells = 1;
|
||||||
|
unsigned int i;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* From Documentation/devicetree/bindings/arm/cpus.txt
|
* From Documentation/devicetree/bindings/arm/cpus.txt
|
||||||
|
@ -378,6 +380,12 @@ static void fdt_add_cpu_nodes(const VirtBoardInfo *vbi)
|
||||||
armcpu->mp_affinity);
|
armcpu->mp_affinity);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
for (i = 0; i < nb_numa_nodes; i++) {
|
||||||
|
if (test_bit(cpu, numa_info[i].node_cpu)) {
|
||||||
|
qemu_fdt_setprop_cell(vbi->fdt, nodename, "numa-node-id", i);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
g_free(nodename);
|
g_free(nodename);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue