Received: by 2002:a05:6902:102b:0:0:0:0 with SMTP id x11csp2001796ybt; Thu, 2 Jul 2020 20:56:43 -0700 (PDT) X-Google-Smtp-Source: ABdhPJxd00Me9wJfgJI1kR1qgHE89ZTQFDNmvAaLdBbm3cLYsTCgMcsxKA4XXaIacRi/9EreMO49 X-Received: by 2002:a05:6402:3058:: with SMTP id bu24mr20985313edb.242.1593748603401; Thu, 02 Jul 2020 20:56:43 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1593748603; cv=none; d=google.com; s=arc-20160816; b=LTLZfGBrOLEw48BfdWEvR8zsVWXLwL2MPBZICB87LYk8V7In/sVYl/OX+HSVlt+PTJ 64m+VKnV02d/c9bRqJVpRRcK9PpFNEsOaIYaNueBAq//LwmFoFCLYQr0YhYnZE3OrU/w 0I0OQMbt/YDteUTUO0qsUjY1IYufdOhC//ofS8YBqKgGWIpfhSUQIlFevcTC6lAZsGgY uzGulOURTkPwhthjhdqV7RXWoiGEYUtfo9hOL9Cs4tT9kMCjLWmqGILuyldbivN65U4O x63HFi2axkh8HnM0SIl03r2LbYGb+C2u8pBC0N4VVDUGe2r/NJ2qs1eTnOte0gppFZYH 5xQg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:content-transfer-encoding:mime-version :references:in-reply-to:message-id:date:subject:cc:to:from; bh=pzxRSrdD25ImFgkuVeDn6ol/kcVyvC36Fr4+ekJxAXw=; b=qRH724qdxdfTtV2Xv9P4sQku/F/wHOS8NYkg49DqaTrY88trkGleRU+Fwm4NbrSbst k1a2xBwYqRnRlkdYaSGyDhjB7erdkK96mgdD2UpWkpcQbwwTVxzG9M4MLbDkbaLHyAdK /uMICKHd9k5gf/zCUDNqCvNYFqNOlhlCh0ruM2rHqD2B2/lBhJgsB7jK/5+TUPQNaDPG SY+uGH9vL+YGoJ2FPb4IJAhESb92UBPQk67IyU9vmMYLVg26642tiqwalmBjjsexe4S8 Tv5DA7mVynchYgZqFoRCGKXbKPfyt8AzxAyiEo2nk6NlCyq8HYp74qM0h6FiL2iYIlP2 YjYQ== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id cz22si6676902edb.148.2020.07.02.20.56.20; Thu, 02 Jul 2020 20:56:43 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726365AbgGCDyD (ORCPT + 99 others); Thu, 2 Jul 2020 23:54:03 -0400 Received: from szxga04-in.huawei.com ([45.249.212.190]:7365 "EHLO huawei.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1725915AbgGCDyC (ORCPT ); Thu, 2 Jul 2020 23:54:02 -0400 Received: from DGGEMS403-HUB.china.huawei.com (unknown [172.30.72.60]) by Forcepoint Email with ESMTP id E918989A71871D4C76B0; Fri, 3 Jul 2020 11:53:59 +0800 (CST) Received: from localhost.localdomain.localdomain (10.175.113.25) by DGGEMS403-HUB.china.huawei.com (10.3.19.203) with Microsoft SMTP Server id 14.3.487.0; Fri, 3 Jul 2020 11:53:51 +0800 From: Chen Zhou To: , , , , , , , , , , , , , , CC: , , , , , , , Subject: [PATCH v10 3/5] arm64: kdump: add memory for devices by DT property linux,usable-memory-range Date: Fri, 3 Jul 2020 11:58:14 +0800 Message-ID: <20200703035816.31289-4-chenzhou10@huawei.com> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20200703035816.31289-1-chenzhou10@huawei.com> References: <20200703035816.31289-1-chenzhou10@huawei.com> MIME-Version: 1.0 Content-Transfer-Encoding: 7BIT Content-Type: text/plain; charset=US-ASCII X-Originating-IP: [10.175.113.25] X-CFilter-Loop: Reflected Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org If we want to reserve crashkernel above 4G, we could use parameters "crashkernel=X crashkernel=Y,low", in this case, specified size low memory is reserved for crash dump kernel devices and never mapped by the first kernel. This memory range is advertised to crash dump kernel via DT property under /chosen, linux,usable-memory-range = We reused the DT property linux,usable-memory-range and made the low memory region as the second range "BASE2 SIZE2", which keeps compatibility with existing user-space and older kdump kernels. Crash dump kernel reads this property at boot time and call memblock_add() to add the low memory region after memblock_cap_memory_range() has been called. Signed-off-by: Chen Zhou Tested-by: John Donnelly Tested-by: Prabhakar Kushwaha --- arch/arm64/mm/init.c | 43 +++++++++++++++++++++++++++++++++---------- 1 file changed, 33 insertions(+), 10 deletions(-) diff --git a/arch/arm64/mm/init.c b/arch/arm64/mm/init.c index ce7ced85f5fb..f5b31e8f1f34 100644 --- a/arch/arm64/mm/init.c +++ b/arch/arm64/mm/init.c @@ -69,6 +69,15 @@ EXPORT_SYMBOL(vmemmap); phys_addr_t arm64_dma_phys_limit __ro_after_init; static phys_addr_t arm64_dma32_phys_limit __ro_after_init; +/* + * The main usage of linux,usable-memory-range is for crash dump kernel. + * Originally, the number of usable-memory regions is one. Now crash dump + * kernel support at most two regions, low region and high region. + * To make compatibility with existing user-space and older kdump, the low + * region is always the last range of linux,usable-memory-range if exist. + */ +#define MAX_USABLE_RANGES 2 + #ifdef CONFIG_KEXEC_CORE /* * reserve_crashkernel() - reserves memory for crash kernel @@ -272,9 +281,9 @@ 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 = data; - const __be32 *reg; - int len; + struct memblock_region *usable_rgns = data; + const __be32 *reg, *endp; + int len, nr = 0; if (depth != 1 || strcmp(uname, "chosen") != 0) return 0; @@ -283,22 +292,36 @@ static int __init early_init_dt_scan_usablemem(unsigned long node, 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, ®); + endp = reg + (len / sizeof(__be32)); + while ((endp - reg) >= (dt_root_addr_cells + dt_root_size_cells)) { + usable_rgns[nr].base = dt_mem_next_cell(dt_root_addr_cells, ®); + usable_rgns[nr].size = dt_mem_next_cell(dt_root_size_cells, ®); + + if (++nr >= MAX_USABLE_RANGES) + break; + } return 1; } static void __init fdt_enforce_memory_region(void) { - struct memblock_region reg = { - .size = 0, + struct memblock_region usable_rgns[MAX_USABLE_RANGES] = { + { .size = 0 }, + { .size = 0 } }; - of_scan_flat_dt(early_init_dt_scan_usablemem, ®); + of_scan_flat_dt(early_init_dt_scan_usablemem, &usable_rgns); - if (reg.size) - memblock_cap_memory_range(reg.base, reg.size); + /* + * The first range of usable-memory regions is for crash dump + * kernel with only one region or for high region with two regions, + * the second range is dedicated for low region if exist. + */ + if (usable_rgns[0].size) + memblock_cap_memory_range(usable_rgns[0].base, usable_rgns[0].size); + if (usable_rgns[1].size) + memblock_add(usable_rgns[1].base, usable_rgns[1].size); } void __init arm64_memblock_init(void) -- 2.20.1