[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PATCH v2 05/10] pc: acpi: SRAT: create only valid processo
From: |
Igor Mammedov |
Subject: |
[Qemu-devel] [PATCH v2 05/10] pc: acpi: SRAT: create only valid processor lapic entries |
Date: |
Fri, 5 Feb 2016 19:07:01 +0100 |
When APIC IDs are sparse*, in addition to valid LAPIC
antries the SRAT is also filled invalid ones for non
posiible APIC IDs.
Fix it by asking machine for all possible APIC IDs
instead of wrongly assuming that all APIC IDs in
range 0..apic_id_limit are possible.
* sparse lapic topology CLI:
-smp x,sockets=2,cores=3,maxcpus=6
Signed-off-by: Igor Mammedov <address@hidden>
Reviewed-by: Eduardo Habkost <address@hidden>
---
hw/i386/acpi-build.c | 12 +++++++++---
1 file changed, 9 insertions(+), 3 deletions(-)
diff --git a/hw/i386/acpi-build.c b/hw/i386/acpi-build.c
index 4756924..de265aa 100644
--- a/hw/i386/acpi-build.c
+++ b/hw/i386/acpi-build.c
@@ -2410,6 +2410,8 @@ build_srat(GArray *table_data, GArray *linker,
MachineState *machine)
uint64_t curnode;
int srat_start, numa_start, slots;
uint64_t mem_len, mem_base, next_base;
+ MachineClass *mc = MACHINE_GET_CLASS(machine);
+ GArray *apic_id_list = mc->possible_cpu_arch_ids();
PCMachineState *pcms = PC_MACHINE(machine);
ram_addr_t hotplugabble_address_space_size =
object_property_get_int(OBJECT(pcms), PC_MACHINE_MEMHP_REGION_SIZE,
@@ -2421,12 +2423,15 @@ build_srat(GArray *table_data, GArray *linker,
MachineState *machine)
srat->reserved1 = cpu_to_le32(1);
core = (void *)(srat + 1);
- for (i = 0; i < pcms->apic_id_limit; ++i) {
+ for (i = 0; i < apic_id_list->len; i++) {
+ CPUArchId id = FETCH_CPU_ARCH_ID(apic_id_list, i);
+ int apic_id = id.arch_id;
+
core = acpi_data_push(table_data, sizeof *core);
core->type = ACPI_SRAT_PROCESSOR;
core->length = sizeof(*core);
- core->local_apic_id = i;
- curnode = pcms->node_cpu[i];
+ core->local_apic_id = apic_id;
+ curnode = pcms->node_cpu[apic_id];
core->proximity_lo = curnode;
memset(core->proximity_hi, 0, 3);
core->local_sapic_eid = 0;
@@ -2491,6 +2496,7 @@ build_srat(GArray *table_data, GArray *linker,
MachineState *machine)
(void *)(table_data->data + srat_start),
"SRAT",
table_data->len - srat_start, 1, NULL, NULL);
+ g_array_free(apic_id_list, true);
}
static void
--
1.8.3.1
- [Qemu-devel] [PATCH v2 00/10] pc: do not create invalid MADT.LAPIC/Processor entries, Igor Mammedov, 2016/02/05
- [Qemu-devel] [PATCH v2 02/10] machine: introduce MachineClass.possible_cpu_arch_ids() hook, Igor Mammedov, 2016/02/05
- [Qemu-devel] [PATCH v2 01/10] cpu: rename cpu_exists() to qemu_get_cpu_by_arch_id(), Igor Mammedov, 2016/02/05
- [Qemu-devel] [PATCH v2 03/10] pc: init pcms->apic_id_limit once and use it throughout pc.c, Igor Mammedov, 2016/02/05
- [Qemu-devel] [PATCH v2 04/10] pc: acpi: cleanup qdev_get_machine() calls, Igor Mammedov, 2016/02/05
- [Qemu-devel] [PATCH v2 05/10] pc: acpi: SRAT: create only valid processor lapic entries,
Igor Mammedov <=
- [Qemu-devel] [PATCH v2 06/10] pc: acpi: create Processor and Notify objects only for valid lapics, Igor Mammedov, 2016/02/05
- [Qemu-devel] [PATCH v2 07/10] pc: acpi: create MADT.lapic entries only for valid lapics, Igor Mammedov, 2016/02/05
- [Qemu-devel] [PATCH v2 10/10] pc: acpi: remove NOP assignment, Igor Mammedov, 2016/02/05
- [Qemu-devel] [PATCH v2 08/10] pc: acpi: move cpu->found_cpus bitmap to build_processor_devices(), Igor Mammedov, 2016/02/05
- [Qemu-devel] [PATCH v2 09/10] pc: acpi: clarify why possible LAPIC entries must be present in MADT, Igor Mammedov, 2016/02/05