From patchwork Thu Jul 21 00:57:58 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: AKASHI Takahiro X-Patchwork-Id: 72520 Delivered-To: patch@linaro.org Received: by 10.140.29.52 with SMTP id a49csp164115qga; Wed, 20 Jul 2016 17:55:04 -0700 (PDT) X-Received: by 10.98.27.200 with SMTP id b191mr69310206pfb.111.1469062504859; Wed, 20 Jul 2016 17:55:04 -0700 (PDT) Return-Path: Received: from bombadil.infradead.org (bombadil.infradead.org. [2001:1868:205::9]) by mx.google.com with ESMTPS id tj3si750136pab.171.2016.07.20.17.55.04 for (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Wed, 20 Jul 2016 17:55:04 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of linux-arm-kernel-bounces+patch=linaro.org@lists.infradead.org designates 2001:1868:205::9 as permitted sender) client-ip=2001:1868:205::9; Authentication-Results: mx.google.com; dkim=neutral (body hash did not verify) header.i=@linaro.org; spf=pass (google.com: best guess record for domain of linux-arm-kernel-bounces+patch=linaro.org@lists.infradead.org designates 2001:1868:205::9 as permitted sender) smtp.mailfrom=linux-arm-kernel-bounces+patch=linaro.org@lists.infradead.org; dmarc=fail (p=NONE dis=NONE) header.from=linaro.org Received: from localhost ([127.0.0.1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.85_2 #1 (Red Hat Linux)) id 1bQ2E1-0006mx-QB; Thu, 21 Jul 2016 00:52:29 +0000 Received: from mail-pa0-x232.google.com ([2607:f8b0:400e:c03::232]) by bombadil.infradead.org with esmtps (Exim 4.85_2 #1 (Red Hat Linux)) id 1bQ2Dx-0006lq-9q for linux-arm-kernel@lists.infradead.org; Thu, 21 Jul 2016 00:52:27 +0000 Received: by mail-pa0-x232.google.com with SMTP id ks6so23227136pab.0 for ; Wed, 20 Jul 2016 17:52:03 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=date:from:to:cc:subject:message-id:mail-followup-to:references :mime-version:content-disposition:in-reply-to:user-agent; bh=j2opfNrFz7xIuEeakIw1BVu0ZR1V1NK91+w8rPqXyiQ=; b=foVnLHWLO1UKTpcNALvE0RuckLD/zelqlXRfWgNRJr40KsJhwTJm0n72rJok7K8nJ/ bGxDRVJZg2RZTThdpr2lE+Mj2F9X/QC9grMtbqeJtLvk961kXP8OCSOM1FvabV4O4Eii witzKvXEJlm+uh88LBX6MpoR5WpQVUrmr1FbI= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:date:from:to:cc:subject:message-id :mail-followup-to:references:mime-version:content-disposition :in-reply-to:user-agent; bh=j2opfNrFz7xIuEeakIw1BVu0ZR1V1NK91+w8rPqXyiQ=; b=YtvtRUCwIBjfYjp9wMjRpHXJmS6IecRY5xwECc7EnVQkLCt/6uVCz0qOso7NS6JPCZ iDiGCx0oD4028e4vHw7eBK43M7wCELtKNtpgbPqJc/wX68DUQtdvmdiHnYd74dHLABfn Pk8LO5wF1JX7Uw/312UOYDslJFXWbABZrhKopcCm0o2T3WNr0WBnDOGRbca9GMh5xd0Z DU/zHiOyM06SrMwgS9Te7eCeYBIfL1maFRnxWE6aMEmrxFyDjoIdcZa+c5lfD2yRA5/L hzN1p9gHa6ES9n3zUVbsDlLtEgNsm2qaxMXiE/z4MZseeA6W5CBUTe0bx3zAweK2qS+1 Gt3Q== X-Gm-Message-State: ALyK8tK9SAXU7JagBg9ZadTGhO3KiG+NxjrfVEQE3Hg2P79B1y9Sdd4MDfbhORWqiq36ukix X-Received: by 10.66.254.39 with SMTP id af7mr78378734pad.37.1469062323199; Wed, 20 Jul 2016 17:52:03 -0700 (PDT) Received: from linaro.org ([121.95.100.191]) by smtp.googlemail.com with ESMTPSA id s89sm7181834pfi.83.2016.07.20.17.52.00 (version=TLS1_2 cipher=AES128-SHA bits=128/128); Wed, 20 Jul 2016 17:52:02 -0700 (PDT) Date: Thu, 21 Jul 2016 09:57:58 +0900 From: AKASHI Takahiro To: James Morse Subject: Re: [PATCH v22 2/8] arm64: limit memory regions based on DT property, usable-memory-range Message-ID: <20160721005756.GN20774@linaro.org> Mail-Followup-To: AKASHI Takahiro , James Morse , catalin.marinas@arm.com, will.deacon@arm.com, geoff@infradead.org, bauerman@linux.vnet.ibm.com, dyoung@redhat.com, robh+dt@kernel.org, mark.rutland@arm.com, kexec@lists.infradead.org, linux-arm-kernel@lists.infradead.org, dennis.chen@arm.com References: <20160712050514.22307-1-takahiro.akashi@linaro.org> <20160712050514.22307-3-takahiro.akashi@linaro.org> <578D1A31.5080509@arm.com> MIME-Version: 1.0 Content-Disposition: inline In-Reply-To: <578D1A31.5080509@arm.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20160720_175225_644940_3301CEDE X-CRM114-Status: GOOD ( 33.61 ) X-Spam-Score: -2.7 (--) X-Spam-Report: SpamAssassin version 3.4.0 on bombadil.infradead.org summary: Content analysis details: (-2.7 points) pts rule name description ---- ---------------------- -------------------------------------------------- -0.7 RCVD_IN_DNSWL_LOW RBL: Sender listed at http://www.dnswl.org/, low trust [2607:f8b0:400e:c03:0:0:0:232 listed in] [list.dnswl.org] -0.0 SPF_PASS SPF: sender matches SPF record -1.9 BAYES_00 BODY: Bayes spam probability is 0 to 1% [score: 0.0000] -0.1 DKIM_VALID Message has at least one valid DKIM or DK signature -0.1 DKIM_VALID_AU Message has a valid DKIM or DK signature from author's domain 0.1 DKIM_SIGNED Message has a DKIM or DK signature, not necessarily valid X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.20 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: mark.rutland@arm.com, geoff@infradead.org, catalin.marinas@arm.com, will.deacon@arm.com, robh+dt@kernel.org, bauerman@linux.vnet.ibm.com, dennis.chen@arm.com, dyoung@redhat.com, kexec@lists.infradead.org, linux-arm-kernel@lists.infradead.org Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+patch=linaro.org@lists.infradead.org James, On Mon, Jul 18, 2016 at 07:04:33PM +0100, James Morse wrote: > Hi! > > (CC: Dennis Chen) > > On 12/07/16 06:05, AKASHI Takahiro wrote: > > Crash dump kernel will be run with a limited range of memory as System > > RAM. > > > > On arm64, we will use a device-tree property under /chosen, > > linux,usable-memory-range = > > in order for primary kernel either on uefi or non-uefi (device tree only) > > system to hand over the information about usable memory region to crash > > dump kernel. This property will supercede entries in uefi memory map table > > and "memory" nodes in a device tree. > > > diff --git a/arch/arm64/mm/init.c b/arch/arm64/mm/init.c > > index 51b1302..d8b296f 100644 > > --- a/arch/arm64/mm/init.c > > +++ b/arch/arm64/mm/init.c > > @@ -300,10 +300,48 @@ static int __init early_mem(char *p) > > } > > early_param("mem", early_mem); > > > > +static int __init early_init_dt_scan_usablemem(unsigned long node, > > + const char *uname, int depth, void *data) > > +{ > > + struct memblock_region *usablemem = (struct memblock_region *)data; > > + const __be32 *reg; > > + int len; > > + > > + usablemem->size = 0; > > + > > + if (depth != 1 || strcmp(uname, "chosen") != 0) > > + return 0; > > + > > + reg = of_get_flat_dt_prop(node, "linux,usable-memory-range", &len); > > + if (!reg || (len < (dt_root_addr_cells + dt_root_size_cells))) > > + return 1; > > + > > + usablemem->base = dt_mem_next_cell(dt_root_addr_cells, ®); > > + usablemem->size = dt_mem_next_cell(dt_root_size_cells, ®); > > + > > + return 1; > > +} > > + > > +static void __init fdt_enforce_memory_region(void) > > +{ > > + struct memblock_region reg; > > + > > + of_scan_flat_dt(early_init_dt_scan_usablemem, ®); > > + > > + if (reg.size) { > > + memblock_remove(0, PAGE_ALIGN(reg.base)); > > + memblock_remove(round_down(reg.base + reg.size, PAGE_SIZE), > > + ULLONG_MAX); > > I think this is a new way to trip the problem Dennis Chen has been working on > [0]. If I kdump with --reuse-cmdline on a kernel booted with 'acpi=on', I get > the panic below [1]... > > It looks like Dennis's fix involves changes in mm/memblock.c, maybe they can be > extended to support a range instead of just a limit? Could you please apply the diff attached below and confirm that kdump works in your environment? I can't test it by myself since my hikey board seems to be broken now. Thanks, -Takahiro AKASHI > (It looks like x86 explicitly adds the acpi regions to the crash-kernels memory > map in crash_setup_memmap_entries()). > > > > Is it possible for the kernel text to be outside this range? (a bug in > kexec-tools, or another user of the DT property) If we haven't already failed in > this case, it may be worth printing a warning, or refusing to > restrict-memory/expose-vmcore. > > > > Thanks, > > James > > > [0] http://lists.infradead.org/pipermail/linux-arm-kernel/2016-July/443356.html > [1] > [ 0.000000] efi: Getting EFI parameters from FDT: > [ 0.000000] efi: EFI v2.50 by ARM Juno EFI Nov 24 2015 12:36:35 > [ 0.000000] efi: ACPI=0xf95b0000 ACPI 2.0=0xf95b0014 PROP=0xfe8db4d8 > [ 0.000000] Reserving 1KB of memory at 0x9fffff000 for elfcorehdr > [ 0.000000] cma: Reserved 16 MiB at 0x00000009fec00000 > [ 0.000000] ACPI: Early table checksum verification disabled > [ 0.000000] ACPI: RSDP 0x00000000F95B0014 000024 (v02 ARMLTD) > [ 0.000000] ACPI: XSDT 0x00000000F95A00E8 00004C (v01 ARMLTD ARM-JUNO 2014072 > 7 01000013) > [ 0.000000] ACPI: FACP 0x00000000F9500000 00010C (v05 ARMLTD ARM-JUNO 2014072 > 7 ARM 00000099) > [ 0.000000] ACPI: DSDT 0x00000000F94C0000 000396 (v01 ARMLTD ARM-JUNO 2014072 > 7 INTL 20150619) > [ 0.000000] ACPI: GTDT 0x00000000F94F0000 000060 (v02 ARMLTD ARM-JUNO 2014072 > 7 ARM 00000099) > [ 0.000000] ACPI: APIC 0x00000000F94E0000 000224 (v03 ARMLTD ARM-JUNO 2014072 > 7 ARM 00000099) > [ 0.000000] ACPI: SSDT 0x00000000F94D0000 0001E3 (v01 ARMLTD ARM-JUNO 2014072 > 7 INTL 20150619) > [ 0.000000] ACPI: MCFG 0x00000000F94B0000 00003C (v01 ARMLTD ARM-JUNO 2014072 > 7 ARM 00000099) > ... > [ 0.737577] Serial: AMBA PL011 UART driver > [ 0.786086] HugeTLB registered 2 MB page size, pre-allocated 0 pages > [ 0.794203] ACPI: Added _OSI(Module Device) > [ 0.798659] ACPI: Added _OSI(Processor Device) > [ 0.803190] ACPI: Added _OSI(3.0 _SCP Extensions) > [ 0.807973] ACPI: Added _OSI(Processor Aggregator Device) > [ 0.813653] Unable to handle kernel paging request at virtual address ffff000 > 00804e027 > [ 0.821704] pgd = ffff000008cce000 > [ 0.825155] [ffff00000804e027] *pgd=00000009ffffd003, *pud=00000009ffffc003, > *pmd=00000009ffffb003, *pte=00e80000f94c0707 > [ 0.836319] Internal error: Oops: 96000021 [#1] PREEMPT SMP > [ 0.841972] Modules linked in: > [ 0.845073] CPU: 2 PID: 1 Comm: swapper/0 Tainted: G S 4.7.0-rc4 > + #4569 > [ 0.852927] Hardware name: ARM Juno development board (r1) (DT) > [ 0.858936] task: ffff80003d898000 ti: ffff80003d894000 task.ti: ffff80003d89 > 4000 > [ 0.866537] PC is at acpi_ns_lookup+0x23c/0x378 > [ 0.871131] LR is at acpi_ds_load1_begin_op+0x88/0x260 > [ 0.876340] pc : [] lr : [] pstate: 60000 > 045 > [ 0.883846] sp : ffff80003d8979b0 > [ 0.887206] x29: ffff80003d8979b0 x28: 0000000000000000 > [ 0.892596] x27: 000000000000001b x26: ffff000008a80a07 > [ 0.897986] x25: ffff80003d897a48 x24: 0000000000000001 > [ 0.903377] x23: 0000000000000001 x22: ffff00000804e027 > [ 0.908769] x21: 000000000000001b x20: 0000000000000001 > [ 0.914158] x19: 0000000000000000 x18: ffff00000804efff > [ 0.919547] x17: 00000000000038ff x16: 0000000000000002 > [ 0.924937] x15: ffff00000804efff x14: 0000008000000000 > [ 0.930326] x13: ffff000008c942b2 x12: ffff00000804efff > [ 0.935717] x11: ffff000008bf0000 x10: 00000000ffffff76 > [ 0.941107] x9 : 0000000000000000 x8 : ffff000008cb6000 > [ 0.946498] x7 : 0000000000000000 x6 : ffff80003d897aa8 > [ 0.951891] x5 : ffff80003d028400 x4 : 0000000000000001 > [ 0.957281] x3 : 0000000000000003 x2 : ffff000008cb6090 > [ 0.962673] x1 : 000000000000005f x0 : 0000000000000000 > [ 0.968063] > [ 0.969569] Process swapper/0 (pid: 1, stack limit = 0xffff80003d894020) > [ 1.387661] Call trace: > ... > [ 1.473172] [] acpi_ns_lookup+0x23c/0x378 > [ 1.478832] [] acpi_ds_load1_begin_op+0x88/0x260 > [ 1.485105] [] acpi_ps_build_named_op+0xa8/0x170 > [ 1.491378] [] acpi_ps_create_op+0x130/0x230 > [ 1.497299] [] acpi_ps_parse_loop+0x168/0x580 > [ 1.503302] [] acpi_ps_parse_aml+0xa0/0x278 > [ 1.509135] [] acpi_ns_one_complete_parse+0x128/0x150 > [ 1.515852] [] acpi_ns_parse_table+0x24/0x44 > [ 1.521775] [] acpi_ns_load_table+0x54/0xdc > [ 1.527612] [] acpi_tb_load_namespace+0xd0/0x230 > [ 1.533887] [] acpi_load_tables+0x3c/0xa8 > [ 1.539542] [] acpi_init+0x88/0x2b0 > [ 1.544670] [] do_one_initcall+0x38/0x128 > [ 1.550325] [] kernel_init_freeable+0x14c/0x1f0 > [ 1.556517] [] kernel_init+0x10/0x100 > [ 1.561823] [] ret_from_fork+0x10/0x40 > [ 1.567216] Code: b9008fbb 2a000318 36380054 32190318 (b94002c0) > [ 1.573451] ---[ end trace dec6cecdcba673b7 ]--- > [ 1.578158] Kernel panic - not syncing: Attempted to kill init! exitcode=0x00 > 00000b > [ 1.578158] > [ 1.587428] SMP: stopping secondary CPUs > [ 1.591411] ---[ end Kernel panic - not syncing: Attempted to kill init! exit > code=0x0000000b > [ 0.969225] Process swapper/0 (pid: 1, stack limit = 0xffff80003d894020) > > _______________________________________________ linux-arm-kernel mailing list linux-arm-kernel@lists.infradead.org http://lists.infradead.org/mailman/listinfo/linux-arm-kernel ===8<=== diff --git a/arch/arm64/mm/init.c b/arch/arm64/mm/init.c index 4bd55cd..c027275 100644 --- a/arch/arm64/mm/init.c +++ b/arch/arm64/mm/init.c @@ -380,11 +380,8 @@ static void __init fdt_enforce_memory_region(void) of_scan_flat_dt(early_init_dt_scan_usablemem, ®); - if (reg.size) { - memblock_remove(0, PAGE_ALIGN(reg.base)); - memblock_remove(round_down(reg.base + reg.size, PAGE_SIZE), - ULLONG_MAX); - } + if (reg.size) + memblock_cap_memory_range(reg.base, reg.size); } void __init arm64_memblock_init(void) diff --git a/include/linux/memblock.h b/include/linux/memblock.h index 3106ac1..9ab17a9 100644 --- a/include/linux/memblock.h +++ b/include/linux/memblock.h @@ -333,6 +333,7 @@ phys_addr_t memblock_mem_size(unsigned long limit_pfn); phys_addr_t memblock_start_of_DRAM(void); phys_addr_t memblock_end_of_DRAM(void); void memblock_enforce_memory_limit(phys_addr_t memory_limit); +void memblock_cap_memory_range(phys_addr_t base, phys_addr_t size); bool memblock_is_memory(phys_addr_t addr); int memblock_is_map_memory(phys_addr_t addr); int memblock_is_region_memory(phys_addr_t base, phys_addr_t size); diff --git a/mm/memblock.c b/mm/memblock.c index ac12489..30badf1 100644 --- a/mm/memblock.c +++ b/mm/memblock.c @@ -1486,6 +1486,34 @@ void __init memblock_enforce_memory_limit(phys_addr_t limit) (phys_addr_t)ULLONG_MAX); } +void __init memblock_cap_memory_range(phys_addr_t base, phys_addr_t size) +{ + int start_rgn, end_rgn; + int i, ret; + + if (!size) + return; + + ret = memblock_isolate_range(&memblock.memory, base, size, + &start_rgn, &end_rgn); + if (ret) + return; + + /* remove all the MAP regions */ + for (i = memblock.memory.cnt - 1; i >= end_rgn; i--) + if (!memblock_is_nomap(&memblock.memory.regions[i])) + memblock_remove_region(&memblock.memory, i); + + for (i = start_rgn - 1; i >= 0; i--) + if (!memblock_is_nomap(&memblock.memory.regions[i])) + memblock_remove_region(&memblock.memory, i); + + /* truncate the reserved regions */ + memblock_remove_range(&memblock.reserved, 0, base); + memblock_remove_range(&memblock.reserved, + base + size, (phys_addr_t)ULLONG_MAX); +} + static int __init_memblock memblock_search(struct memblock_type *type, phys_addr_t addr) { unsigned int left = 0, right = type->cnt;