Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1754810AbcKISQi (ORCPT ); Wed, 9 Nov 2016 13:16:38 -0500 Received: from mx0a-000f0801.pphosted.com ([67.231.144.122]:43141 "EHLO mx0a-000f0801.pphosted.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752760AbcKISQ1 (ORCPT ); Wed, 9 Nov 2016 13:16:27 -0500 Subject: Re: [PATCH] x86/cpuid: Deal with broken firmware once more To: Thomas Gleixner References: <20161102122557.qs4rl6mb7n7l7j7p@linutronix.de> <24e69019-60d0-29e7-e31f-c6f00f9ed98a@brocade.com> <58e229e2-91f4-a97f-1b9f-089f48ef994a@brocade.com> <86609338-2b45-ed7e-fb07-99421e43a2f1@brocade.com> CC: Sebastian Andrzej Siewior , , LKML , "M. Vefa Bicakci" , Peter Zijlstra , Borislav Petkov From: "Charles (Chas) Williams" Message-ID: Date: Wed, 9 Nov 2016 13:15:19 -0500 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:45.0) Gecko/20100101 Icedove/45.3.0 MIME-Version: 1.0 In-Reply-To: Content-Type: text/plain; charset="windows-1252"; format=flowed Content-Transfer-Encoding: 7bit X-ClientProxiedBy: hq1wp-excas11.corp.brocade.com (10.70.36.102) To BRMWP-EXMB12.corp.brocade.com (172.16.59.130) X-Proofpoint-Virus-Version: vendor=fsecure engine=2.50.10432:,, definitions=2016-11-09_06:,, signatures=0 X-Proofpoint-Spam-Details: rule=notspam policy=default score=0 priorityscore=1501 malwarescore=0 suspectscore=0 phishscore=0 bulkscore=0 spamscore=0 clxscore=1015 lowpriorityscore=0 impostorscore=0 adultscore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.0.1-1609300000 definitions=main-1611090323 Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 3235 Lines: 64 On 11/09/2016 10:35 AM, Thomas Gleixner wrote: > Both ACPI and MP specifications require that the APIC id in the respective > tables must be the same as the APIC id in CPUID. > > The kernel retrieves the physical package id from the APIC id during the > ACPI/MP table scan and builds the physical to logical package map. > > There exist Virtualbox and Xen implementations which violate the spec. As a > result the physical to logical package map, which relies on the ACPI/MP > tables does not work on those systems, because the CPUID initialized > physical package id does not match the firmware id. This causes system > crashes and malfunction due to invalid package mappings. > > The only way to cure this is to sanitize the physical package id after the > CPUID enumeration and yell when the APIC ids are different. If the physical > package IDs differ use the package information from the ACPI/MP tables so > the existing logical package map just works. > > Reported-by: "Charles (Chas) Williams" , > Reported-by: M. Vefa Bicakci > Signed-off-by: Thomas Gleixner For 4 virtual sockets, 1 core per socket VM: [ 0.235459] .... node #0, CPUs: #1 [ 0.238579] Disabled fast string operations [ 0.238620] mce: CPU supports 0 MCE banks [ 0.238864] [Firmware Bug]: CPU1: APIC id mismatch. Firmware: 1 CPUID: 2 [ 0.238878] [Firmware Bug]: CPU1: Using firmware package id 1 instead of 2 [ 0.239502] #2 [ 0.241298] Disabled fast string operations [ 0.241356] mce: CPU supports 0 MCE banks [ 0.241429] [Firmware Bug]: CPU2: APIC id mismatch. Firmware: 2 CPUID: 4 [ 0.241431] [Firmware Bug]: CPU2: Using firmware package id 2 instead of 4 [ 0.241631] #3 [ 0.244075] Disabled fast string operations [ 0.244112] mce: CPU supports 0 MCE banks [ 0.244284] [Firmware Bug]: CPU3: APIC id mismatch. Firmware: 3 CPUID: 6 [ 0.244293] [Firmware Bug]: CPU3: Using firmware package id 3 instead of 6 For a 2 virtual sockets, 2 cores per socket, VMware seems to get its APIC table correct as this fixup code isn't triggered. The mapping looks like: [ 0.028911] topology_update_package_map: apicid 0 pkg 0 cpu 0 [ 0.029068] smpboot: APIC(0) Converting physical 0 to logical package 0, cpu 0 [ 0.029072] topology_update_package_map: apicid 1 pkg 0 cpu 1 [ 0.029220] topology_update_package_map: apicid 2 pkg 1 cpu 2 [ 0.029376] smpboot: APIC(2) Converting physical 1 to logical package 1, cpu 2 [ 0.029381] topology_update_package_map: apicid 3 pkg 1 cpu 3 [ 0.029525] smpboot: Max logical packages: 2 For a VM with 1 virtual socket and 4 cores, the behavior is again correct. [ 0.016198] topology_update_package_map: apicid 0 pkg 0 cpu 0 [ 0.016271] smpboot: APIC(0) Converting physical 0 to logical package 0, cpu 0 (ffff88023fc0a040) [ 0.016273] topology_update_package_map: apicid 1 pkg 0 cpu 1 [ 0.016336] topology_update_package_map: apicid 2 pkg 0 cpu 2 [ 0.016397] topology_update_package_map: apicid 3 pkg 0 cpu 3 It looks like VMware might have some assumption about the minimum number of cores on a virtual socket. Regardless, the fix solves my problem! Thanks!