From patchwork Wed Apr 30 05:55:03 2014 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Baoquan He X-Patchwork-Id: 4091571 Return-Path: X-Original-To: patchwork-linux-acpi@patchwork.kernel.org Delivered-To: patchwork-parsemail@patchwork1.web.kernel.org Received: from mail.kernel.org (mail.kernel.org [198.145.19.201]) by patchwork1.web.kernel.org (Postfix) with ESMTP id B5BF99F271 for ; Wed, 30 Apr 2014 05:56:14 +0000 (UTC) Received: from mail.kernel.org (localhost [127.0.0.1]) by mail.kernel.org (Postfix) with ESMTP id EA2FF20211 for ; Wed, 30 Apr 2014 05:56:13 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id 15797201F4 for ; Wed, 30 Apr 2014 05:56:13 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752160AbaD3F4M (ORCPT ); Wed, 30 Apr 2014 01:56:12 -0400 Received: from mx1.redhat.com ([209.132.183.28]:1698 "EHLO mx1.redhat.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751899AbaD3F4L (ORCPT ); Wed, 30 Apr 2014 01:56:11 -0400 Received: from int-mx01.intmail.prod.int.phx2.redhat.com (int-mx01.intmail.prod.int.phx2.redhat.com [10.5.11.11]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id s3U5u8lG012821 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Wed, 30 Apr 2014 01:56:08 -0400 Received: from localhost (dhcp-16-119.nay.redhat.com [10.66.16.119]) by int-mx01.intmail.prod.int.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id s3U5u4Hm031154 (version=TLSv1/SSLv3 cipher=AES128-SHA bits=128 verify=NO); Wed, 30 Apr 2014 01:56:07 -0400 Date: Wed, 30 Apr 2014 13:55:03 +0800 From: Baoquan He To: linux-kernel@vger.kernel.org Cc: rjw@rjwysocki.net, lenb@kernel.org, linux-acpi@vger.kernel.org, jiang.liu@linux.intel.com, vgoyal@redhat.com Subject: [Patch v2] lapic need be checked if available when initialize acpi processor id Message-ID: <20140430055503.GD4774@dhcp-16-105.nay.redhat.com> References: <1397519754-10205-1-git-send-email-bhe@redhat.com> MIME-Version: 1.0 Content-Disposition: inline In-Reply-To: <1397519754-10205-1-git-send-email-bhe@redhat.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-Scanned-By: MIMEDefang 2.67 on 10.5.11.11 Sender: linux-acpi-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-acpi@vger.kernel.org X-Spam-Status: No, score=-7.5 required=5.0 tests=BAYES_00, RCVD_IN_DNSWL_HI, RP_MATCHES_RCVD, UNPARSEABLE_RELAY autolearn=unavailable version=3.3.1 X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on mail.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP In acpi_processor_get_info(), acpi processor info is initialized including id, namely cpu index. Currently, if on UP system running SMP kerenl with no LAPIC in MADT, cpu0_initialized is checked if acpi processor id is initialized. However this check maybe is not correct for kdump kernel. Most of time only 1 CPU is supported because of known problems. So in 1st kernel multiple CPUs are present, then crash happened in one specific CPU, say 2nd CPU. Then it jump into kdump kernel with "nr_cpus=1" specified in cmdline. In this situation, since kdump kernel is warm reset, it will reuse the ACPI resource passed from crashed kernel directly, namely 1st kernel. It means in MADT all LAPIC is enabled while only 1 CPU is present in running system. The kdump kernel usually is the same as the crashed 1st kernel. So now in kdump kernel, x86_cpu_to_apicid stored the apicid and its related cpu id. If only check cpu0_initialized, it will assign 0 to the acpi processor id of 1st CPU, it's not correct. So in this patch, check acpi_lapic too. If acpi_lapic is 0, then LAPIC in MADT is not available, assigne 0 to the handling acpi processor. If acpi_lapic is 1, then LAPIC in MADT is available, let's get apic processor id from x86_cpu_to_apicid. Signed-off-by: Baoquan He --- drivers/acpi/acpi_processor.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/acpi/acpi_processor.c b/drivers/acpi/acpi_processor.c index c29c2c3..33f934d 100644 --- a/drivers/acpi/acpi_processor.c +++ b/drivers/acpi/acpi_processor.c @@ -267,7 +267,7 @@ static int acpi_processor_get_info(struct acpi_device *device) pr->apic_id = apic_id; cpu_index = acpi_map_cpuid(pr->apic_id, pr->acpi_id); - if (!cpu0_initialized) { + if (!cpu0_initialized && !acpi_lapic) { cpu0_initialized = 1; /* Handle UP system running SMP kernel, with no LAPIC in MADT */ if ((cpu_index == -1) && (num_online_cpus() == 1))