From patchwork Thu Jan 16 15:35:51 2014 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Prarit Bhargava X-Patchwork-Id: 3499131 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 50123C02DC for ; Thu, 16 Jan 2014 15:36:35 +0000 (UTC) Received: from mail.kernel.org (localhost [127.0.0.1]) by mail.kernel.org (Postfix) with ESMTP id 1321F20127 for ; Thu, 16 Jan 2014 15:36:34 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id AA2E1200F3 for ; Thu, 16 Jan 2014 15:36:32 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751714AbaAPPgb (ORCPT ); Thu, 16 Jan 2014 10:36:31 -0500 Received: from mx1.redhat.com ([209.132.183.28]:52882 "EHLO mx1.redhat.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751271AbaAPPga (ORCPT ); Thu, 16 Jan 2014 10:36:30 -0500 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 s0GFZu3n030947 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 16 Jan 2014 10:35:57 -0500 Received: from prarit.bos.redhat.com ([10.18.17.119]) by int-mx01.intmail.prod.int.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id s0GFZtYo031857; Thu, 16 Jan 2014 10:35:55 -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, rientjes@google.com, linux-acpi@vger.kernel.org, kexec@lists.infradead.org Subject: [PATCH] acpi memory hotplug, add parameter to disable memory hotplug [v5] Date: Thu, 16 Jan 2014 10:35:51 -0500 Message-Id: <1389886551-32647-1-git-send-email-prarit@redhat.com> In-Reply-To: <1389822660.1792.349.camel@misato.fc.hp.com> References: <1389822660.1792.349.camel@misato.fc.hp.com> 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.2 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 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 kdump kernel. The kdump kernel has limited memory resources so as not to severely impact the main kernel. The system then panics and the kdump 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 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 [v3]: cleaned up Documentation/kernel-parameters.txt [v4]: add __initdata to acpi_no_memhotplug [v5]: remove kexec, kdump only Signed-off-by: Prarit Bhargava Acked-by: Toshi Kani Acked-by: Vivek Goyal Cc: Vivek Goyal Cc: Len Brown Cc: "Rafael J. Wysocki" Cc: kosaki.motohiro@gmail.com Cc: dyoung@redhat.com Cc: rientjes@google.com Cc: linux-acpi@vger.kernel.org Cc: kexec@lists.infradead.org Acked-by: David Rientjes --- 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..6201229 100644 --- a/Documentation/kernel-parameters.txt +++ b/Documentation/kernel-parameters.txt @@ -343,6 +343,9 @@ bytes respectively. Such letter suffixes can also be entirely omitted. no: ACPI OperationRegions are not marked as reserved, no further checks are performed. + acpi_no_memhotplug [ACPI] Disable memory hotplug. Useful for kdump + kernels. + add_efi_memmap [EFI; X86] Include EFI memory map in kernel's map of available physical RAM. diff --git a/drivers/acpi/acpi_memhotplug.c b/drivers/acpi/acpi_memhotplug.c index 551dad7..383cd80 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 __initdata 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);