From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:49598) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1aRIO7-0007RF-2w for qemu-devel@nongnu.org; Thu, 04 Feb 2016 06:47:51 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1aRIO6-0000Bh-6i for qemu-devel@nongnu.org; Thu, 04 Feb 2016 06:47:51 -0500 Received: from mx1.redhat.com ([209.132.183.28]:45082) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1aRIO6-0000Bc-1V for qemu-devel@nongnu.org; Thu, 04 Feb 2016 06:47:50 -0500 Received: from int-mx14.intmail.prod.int.phx2.redhat.com (int-mx14.intmail.prod.int.phx2.redhat.com [10.5.11.27]) by mx1.redhat.com (Postfix) with ESMTPS id A392D804F8 for ; Thu, 4 Feb 2016 11:47:49 +0000 (UTC) From: Igor Mammedov Date: Thu, 4 Feb 2016 12:47:30 +0100 Message-Id: <1454586455-10202-4-git-send-email-imammedo@redhat.com> In-Reply-To: <1454586455-10202-1-git-send-email-imammedo@redhat.com> References: <1454586455-10202-1-git-send-email-imammedo@redhat.com> Subject: [Qemu-devel] [PATCH 4/9] pc: acpi: SRAT: create only valid processor lapic entries List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org Cc: pbonzini@redhat.com, ehabkost@redhat.com, mst@redhat.com 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 --- 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 faf541c..3077061 100644 --- a/hw/i386/acpi-build.c +++ b/hw/i386/acpi-build.c @@ -2376,6 +2376,8 @@ build_srat(GArray *table_data, GArray *linker, PcGuestInfo *guest_info, 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, @@ -2387,12 +2389,15 @@ build_srat(GArray *table_data, GArray *linker, PcGuestInfo *guest_info, srat->reserved1 = cpu_to_le32(1); core = (void *)(srat + 1); - for (i = 0; i < guest_info->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 = guest_info->node_cpu[i]; + core->local_apic_id = apic_id; + curnode = guest_info->node_cpu[apic_id]; core->proximity_lo = curnode; memset(core->proximity_hi, 0, 3); core->local_sapic_eid = 0; @@ -2457,6 +2462,7 @@ build_srat(GArray *table_data, GArray *linker, PcGuestInfo *guest_info, (void *)(table_data->data + srat_start), "SRAT", table_data->len - srat_start, 1, NULL); + g_array_free(apic_id_list, true); } static void -- 1.8.3.1