The QEMU_CFG_NUMA fw_cfg entry is actually two separate tables in one
fw_cfg entry - a table for cpu affinity and a table for the memory
map. Create two romfile entries to make that more clear.
Signed-off-by: Kevin O'Connor <kevin(a)koconnor.net>
---
src/acpi.c | 25 ++++++++++++++-----------
src/paravirt.c | 7 +++++--
2 files changed, 19 insertions(+), 13 deletions(-)
diff --git a/src/acpi.c b/src/acpi.c
index bc4d8ea..55c7259 100644
--- a/src/acpi.c
+++ b/src/acpi.c
@@ -646,14 +646,13 @@ acpi_build_srat_memory(struct srat_memory_affinity *numamem,
static void *
build_srat(void)
{
- int filesize;
- u64 *numadata = romfile_loadfile("etc/numa-nodes", &filesize);
- if (!numadata)
- return NULL;
- int max_cpu = romfile_loadint("etc/max-cpus", 0);
- int nb_numa_nodes = (filesize / sizeof(u64)) - max_cpu;
- if (!nb_numa_nodes)
- return NULL;
+ int numadatasize, numacpusize;
+ u64 *numadata = romfile_loadfile("etc/numa-nodes", &numadatasize);
+ u64 *numacpumap = romfile_loadfile("etc/numa-cpu-map", &numacpusize);
+ if (!numadata || !numacpumap)
+ goto fail;
+ int max_cpu = numacpusize / sizeof(u64);
+ int nb_numa_nodes = numadatasize / sizeof(u64);
struct system_resource_affinity_table *srat;
int srat_size = sizeof(*srat) +
@@ -663,8 +662,7 @@ build_srat(void)
srat = malloc_high(srat_size);
if (!srat) {
warn_noalloc();
- free(numadata);
- return NULL;
+ goto fail;
}
memset(srat, 0, srat_size);
@@ -677,7 +675,7 @@ build_srat(void)
core->type = SRAT_PROCESSOR;
core->length = sizeof(*core);
core->local_apic_id = i;
- curnode = *numadata++;
+ curnode = *numacpumap++;
core->proximity_lo = curnode;
memset(core->proximity_hi, 0, 3);
core->local_sapic_eid = 0;
@@ -731,7 +729,12 @@ build_srat(void)
build_header((void*)srat, SRAT_SIGNATURE, srat_size, 1);
free(numadata);
+ free(numacpumap);
return srat;
+fail:
+ free(numadata);
+ free(numacpumap);
+ return NULL;
}
static void *
diff --git a/src/paravirt.c b/src/paravirt.c
index 4a26c6e..ee6a86e 100644
--- a/src/paravirt.c
+++ b/src/paravirt.c
@@ -223,8 +223,11 @@ qemu_cfg_legacy(void)
// NUMA data
u64 numacount;
qemu_cfg_read_entry(&numacount, QEMU_CFG_NUMA, sizeof(numacount));
- numacount += romfile_loadint("etc/max-cpus", 0);
- qemu_romfile_add("etc/numa-nodes", QEMU_CFG_NUMA, sizeof(numacount)
+ int max_cpu = romfile_loadint("etc/max-cpus", 0);
+ qemu_romfile_add("etc/numa-cpu-map", QEMU_CFG_NUMA, sizeof(numacount)
+ , max_cpu*sizeof(u64));
+ qemu_romfile_add("etc/numa-nodes", QEMU_CFG_NUMA
+ , sizeof(numacount) + max_cpu*sizeof(u64)
, numacount*sizeof(u64));
// e820 data
--
1.7.11.7