mirror of https://gitee.com/openkylin/qemu.git
pc: acpi: SRAT: create only valid processor lapic entries
When APIC IDs are sparse*, in addition to valid LAPIC entries the SRAT is also filled invalid ones for non possible 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 <imammedo@redhat.com> Reviewed-by: Eduardo Habkost <ehabkost@redhat.com> Reviewed-by: Michael S. Tsirkin <mst@redhat.com> Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
This commit is contained in:
parent
3d3ebcad6a
commit
5803fce389
|
@ -2453,6 +2453,8 @@ build_srat(GArray *table_data, GArray *linker, MachineState *machine)
|
||||||
uint64_t curnode;
|
uint64_t curnode;
|
||||||
int srat_start, numa_start, slots;
|
int srat_start, numa_start, slots;
|
||||||
uint64_t mem_len, mem_base, next_base;
|
uint64_t mem_len, mem_base, next_base;
|
||||||
|
MachineClass *mc = MACHINE_GET_CLASS(machine);
|
||||||
|
CPUArchIdList *apic_ids = mc->possible_cpu_arch_ids(machine);
|
||||||
PCMachineState *pcms = PC_MACHINE(machine);
|
PCMachineState *pcms = PC_MACHINE(machine);
|
||||||
ram_addr_t hotplugabble_address_space_size =
|
ram_addr_t hotplugabble_address_space_size =
|
||||||
object_property_get_int(OBJECT(pcms), PC_MACHINE_MEMHP_REGION_SIZE,
|
object_property_get_int(OBJECT(pcms), PC_MACHINE_MEMHP_REGION_SIZE,
|
||||||
|
@ -2463,12 +2465,14 @@ build_srat(GArray *table_data, GArray *linker, MachineState *machine)
|
||||||
srat = acpi_data_push(table_data, sizeof *srat);
|
srat = acpi_data_push(table_data, sizeof *srat);
|
||||||
srat->reserved1 = cpu_to_le32(1);
|
srat->reserved1 = cpu_to_le32(1);
|
||||||
|
|
||||||
for (i = 0; i < pcms->apic_id_limit; ++i) {
|
for (i = 0; i < apic_ids->len; i++) {
|
||||||
|
int apic_id = apic_ids->cpus[i].arch_id;
|
||||||
|
|
||||||
core = acpi_data_push(table_data, sizeof *core);
|
core = acpi_data_push(table_data, sizeof *core);
|
||||||
core->type = ACPI_SRAT_PROCESSOR;
|
core->type = ACPI_SRAT_PROCESSOR;
|
||||||
core->length = sizeof(*core);
|
core->length = sizeof(*core);
|
||||||
core->local_apic_id = i;
|
core->local_apic_id = apic_id;
|
||||||
curnode = pcms->node_cpu[i];
|
curnode = pcms->node_cpu[apic_id];
|
||||||
core->proximity_lo = curnode;
|
core->proximity_lo = curnode;
|
||||||
memset(core->proximity_hi, 0, 3);
|
memset(core->proximity_hi, 0, 3);
|
||||||
core->local_sapic_eid = 0;
|
core->local_sapic_eid = 0;
|
||||||
|
@ -2533,6 +2537,7 @@ build_srat(GArray *table_data, GArray *linker, MachineState *machine)
|
||||||
(void *)(table_data->data + srat_start),
|
(void *)(table_data->data + srat_start),
|
||||||
"SRAT",
|
"SRAT",
|
||||||
table_data->len - srat_start, 1, NULL, NULL);
|
table_data->len - srat_start, 1, NULL, NULL);
|
||||||
|
g_free(apic_ids);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
|
|
Loading…
Reference in New Issue