From patchwork Fri Jan 10 14:36:55 2014 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Prarit Bhargava X-Patchwork-Id: 3466731 Return-Path: X-Original-To: patchwork-linux-acpi@patchwork.kernel.org Delivered-To: patchwork-parsemail@patchwork2.web.kernel.org Received: from mail.kernel.org (mail.kernel.org [198.145.19.201]) by patchwork2.web.kernel.org (Postfix) with ESMTP id B93FEC02DC for ; Fri, 10 Jan 2014 14:37:43 +0000 (UTC) Received: from mail.kernel.org (localhost [127.0.0.1]) by mail.kernel.org (Postfix) with ESMTP id 7380C20123 for ; Fri, 10 Jan 2014 14:37:42 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id 8165420122 for ; Fri, 10 Jan 2014 14:37:37 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751797AbaAJOhg (ORCPT ); Fri, 10 Jan 2014 09:37:36 -0500 Received: from mx1.redhat.com ([209.132.183.28]:60962 "EHLO mx1.redhat.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1750910AbaAJOhf (ORCPT ); Fri, 10 Jan 2014 09:37:35 -0500 Received: from int-mx11.intmail.prod.int.phx2.redhat.com (int-mx11.intmail.prod.int.phx2.redhat.com [10.5.11.24]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id s0AEb6Nl026136 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Fri, 10 Jan 2014 09:37:07 -0500 Received: from prarit.bos.redhat.com ([10.18.17.119]) by int-mx11.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id s0AEb5lT014629; Fri, 10 Jan 2014 09:37:06 -0500 From: Prarit Bhargava To: linux-kernel@vger.kernel.org Cc: Prarit Bhargava , Vivek Goyal , Len Brown , "Rafael J. Wysocki" , kosaki.motohiro@gmail.com, dyoung@redhat.com, linux-acpi@vger.kernel.org, kexec@lists.infradead.org Subject: [PATCH] acpi memory hotplug, add parameter to disable memory hotplug [v2] Date: Fri, 10 Jan 2014 09:36:55 -0500 Message-Id: <1389364615-13320-1-git-send-email-prarit@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.24 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.0 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 When booting a kexec/kdump kernel on a system that has specific memory hotplug regions the boot will fail with warnings like: [ 2.939467] swapper/0: page allocation failure: order:9, mode:0x84d0 [ 2.946564] CPU: 0 PID: 1 Comm: swapper/0 Not tainted 3.10.0-65.el7.x86_64 #1 [ 2.954532] Hardware name: QCI QSSC-S4R/QSSC-S4R, BIOS QSSC-S4R.QCI.01.00.S013.032920111005 03/29/2011 [ 2.964926] 0000000000000000 ffff8800341bd8c8 ffffffff815bcc67 ffff8800341bd950 [ 2.973224] ffffffff8113b1a0 ffff880036339b00 0000000000000009 00000000000084d0 [ 2.981523] ffff8800341bd950 ffffffff815b87ee 0000000000000000 0000000000000200 [ 2.989821] Call Trace: [ 2.992560] [] dump_stack+0x19/0x1b [ 2.998300] [] warn_alloc_failed+0xf0/0x160 [ 3.004817] [] ? __alloc_pages_direct_compact+0xac/0x196 [ 3.012594] [] __alloc_pages_nodemask+0x7ff/0xa00 [ 3.019692] [] vmemmap_alloc_block+0x62/0xba [ 3.026303] [] vmemmap_alloc_block_buf+0x15/0x3b [ 3.033302] [] vmemmap_populate+0xb4/0x21b [ 3.039718] [] sparse_mem_map_populate+0x27/0x35 [ 3.046717] [] sparse_add_one_section+0x7a/0x185 [ 3.053720] [] __add_pages+0xaf/0x240 [ 3.059656] [] arch_add_memory+0x59/0xd0 [ 3.065877] [] add_memory+0xb9/0x1b0 [ 3.071713] [] acpi_memory_device_add+0x18d/0x26d [ 3.078813] [] acpi_bus_device_attach+0x7d/0xcd [ 3.085719] [] acpi_ns_walk_namespace+0xc8/0x17f [ 3.092716] [] ? acpi_bus_type_and_status+0x90/0x90 [ 3.100004] [] ? acpi_bus_type_and_status+0x90/0x90 [ 3.107293] [] acpi_walk_namespace+0x95/0xc5 [ 3.113904] [] acpi_bus_scan+0x8b/0x9d [ 3.119933] [] acpi_scan_init+0x63/0x160 [ 3.126153] [] acpi_init+0x25d/0x2a6 [ 3.131987] [] ? acpi_sleep_proc_init+0x2a/0x2a [ 3.138889] [] do_one_initcall+0xe2/0x190 [ 3.145210] [] kernel_init_freeable+0x17c/0x207 [ 3.152111] [] ? do_early_param+0x88/0x88 [ 3.158430] [] ? rest_init+0x80/0x80 [ 3.164264] [] kernel_init+0xe/0x180 [ 3.170097] [] ret_from_fork+0x7c/0xb0 [ 3.176123] [] ? rest_init+0x80/0x80 [ 3.181956] Mem-Info: [ 3.184490] Node 0 DMA per-cpu: [ 3.188007] CPU 0: hi: 0, btch: 1 usd: 0 [ 3.193353] Node 0 DMA32 per-cpu: [ 3.197060] CPU 0: hi: 42, btch: 7 usd: 0 [ 3.202410] active_anon:0 inactive_anon:0 isolated_anon:0 [ 3.202410] active_file:0 inactive_file:0 isolated_file:0 [ 3.202410] unevictable:0 dirty:0 writeback:0 unstable:0 [ 3.202410] free:872 slab_reclaimable:13 slab_unreclaimable:1880 [ 3.202410] mapped:0 shmem:0 pagetables:0 bounce:0 [ 3.202410] free_cma:0 because the system has run out of memory at boot time. This occurs because of the following sequence in the boot: Main kernel boots and sets E820 map. The second kernel is booted with a map generated by the kdump service using memmap= and memmap=exactmap. These parameters are added to the kernel parameters of the kexec/kdump kernel. The kexec/kdump kernel has limited memory resources so as not to severely impact the main kernel. The system then panics and the kdump/kexec kernel boots (which is a completely new kernel boot). During this boot ACPI is initialized and the kernel (as can be seen above) traverses the ACPI namespace and finds an entry for a memory device to be hotadded. ie) [ 3.053720] [] __add_pages+0xaf/0x240 [ 3.059656] [] arch_add_memory+0x59/0xd0 [ 3.065877] [] add_memory+0xb9/0x1b0 [ 3.071713] [] acpi_memory_device_add+0x18d/0x26d [ 3.078813] [] acpi_bus_device_attach+0x7d/0xcd [ 3.085719] [] acpi_ns_walk_namespace+0xc8/0x17f [ 3.092716] [] ? acpi_bus_type_and_status+0x90/0x90 [ 3.100004] [] ? acpi_bus_type_and_status+0x90/0x90 [ 3.107293] [] acpi_walk_namespace+0x95/0xc5 [ 3.113904] [] acpi_bus_scan+0x8b/0x9d [ 3.119933] [] acpi_scan_init+0x63/0x160 [ 3.126153] [] acpi_init+0x25d/0x2a6 At this point the kernel adds page table information and the the kexec/kdump kernel runs out of memory. This can also be reproduced by using the memmap=exactmap and mem=X parameters on the main kernel and booting. This patchset resolves the problem by adding a kernel parameter, acpi_no_memhotplug, to disable ACPI memory hotplug. [v2]: changed acpi_no_memhotplug to bool Signed-off-by: Prarit Bhargava Cc: Vivek Goyal Cc: Len Brown Cc: "Rafael J. Wysocki" Cc: kosaki.motohiro@gmail.com Cc: dyoung@redhat.com Cc: linux-acpi@vger.kernel.org Cc: kexec@lists.infradead.org --- Documentation/kernel-parameters.txt | 3 +++ drivers/acpi/acpi_memhotplug.c | 12 ++++++++++++ 2 files changed, 15 insertions(+) diff --git a/Documentation/kernel-parameters.txt b/Documentation/kernel-parameters.txt index b9e9bd8..41374f9 100644 --- a/Documentation/kernel-parameters.txt +++ b/Documentation/kernel-parameters.txt @@ -2117,6 +2117,9 @@ bytes respectively. Such letter suffixes can also be entirely omitted. nomce [X86-32] Machine Check Exception + acpi_no_memhotplug [ACPI] Disable memory hotplug. Useful for kexec + and kdump kernels. + nomfgpt [X86-32] Disable Multi-Function General Purpose Timer usage (for AMD Geode machines). diff --git a/drivers/acpi/acpi_memhotplug.c b/drivers/acpi/acpi_memhotplug.c index 551dad7..4a0fa94 100644 --- a/drivers/acpi/acpi_memhotplug.c +++ b/drivers/acpi/acpi_memhotplug.c @@ -361,7 +361,19 @@ static void acpi_memory_device_remove(struct acpi_device *device) acpi_memory_device_free(mem_device); } +static bool acpi_no_memhotplug; + void __init acpi_memory_hotplug_init(void) { + if (acpi_no_memhotplug) + return; + acpi_scan_add_handler_with_hotplug(&memory_device_handler, "memory"); } + +static int __init disable_acpi_memory_hotplug(char *str) +{ + acpi_no_memhotplug = true; + return 1; +} +__setup("acpi_no_memhotplug", disable_acpi_memory_hotplug);