mirror of
https://gitlab.com/qemu-project/qemu
synced 2024-11-05 20:35:44 +00:00
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
2 changed files with 45 additions and 6 deletions
|
@ -14,6 +14,7 @@
|
|||
#include "hw/arm/linux-boot-if.h"
|
||||
#include "sysemu/kvm.h"
|
||||
#include "sysemu/sysemu.h"
|
||||
#include "sysemu/numa.h"
|
||||
#include "hw/boards.h"
|
||||
#include "hw/loader.h"
|
||||
#include "elf.h"
|
||||
|
@ -405,6 +406,9 @@ static int load_dtb(hwaddr addr, const struct arm_boot_info *binfo,
|
|||
void *fdt = NULL;
|
||||
int size, rc;
|
||||
uint32_t acells, scells;
|
||||
char *nodename;
|
||||
unsigned int i;
|
||||
hwaddr mem_base, mem_len;
|
||||
|
||||
if (binfo->dtb_filename) {
|
||||
char *filename;
|
||||
|
@ -456,12 +460,39 @@ static int load_dtb(hwaddr addr, const struct arm_boot_info *binfo,
|
|||
goto fail;
|
||||
}
|
||||
|
||||
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 (nb_numa_nodes > 0) {
|
||||
/*
|
||||
* Turn the /memory node created before into a NOP node, then create
|
||||
* /memory@addr nodes for all numa nodes respectively.
|
||||
*/
|
||||
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) {
|
||||
|
|
|
@ -38,6 +38,7 @@
|
|||
#include "net/net.h"
|
||||
#include "sysemu/block-backend.h"
|
||||
#include "sysemu/device_tree.h"
|
||||
#include "sysemu/numa.h"
|
||||
#include "sysemu/sysemu.h"
|
||||
#include "sysemu/kvm.h"
|
||||
#include "hw/boards.h"
|
||||
|
@ -329,6 +330,7 @@ static void fdt_add_cpu_nodes(const VirtBoardInfo *vbi)
|
|||
{
|
||||
int cpu;
|
||||
int addr_cells = 1;
|
||||
unsigned int i;
|
||||
|
||||
/*
|
||||
* From Documentation/devicetree/bindings/arm/cpus.txt
|
||||
|
@ -378,6 +380,12 @@ static void fdt_add_cpu_nodes(const VirtBoardInfo *vbi)
|
|||
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);
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue