Received: by 2002:a05:7412:31a9:b0:e2:908c:2ebd with SMTP id et41csp6165554rdb; Mon, 18 Sep 2023 06:13:35 -0700 (PDT) X-Google-Smtp-Source: AGHT+IGb3qtEn4bxVmolFi7R0juX8qDw1WIeiheVfRwNeY2y/AVEhajcIjwM4J+Cwd99NOxykJrr X-Received: by 2002:a17:90b:314a:b0:276:6be8:8bfe with SMTP id ip10-20020a17090b314a00b002766be88bfemr3090120pjb.23.1695042814923; Mon, 18 Sep 2023 06:13:34 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1695042814; cv=none; d=google.com; s=arc-20160816; b=pFLrFizOb5rYJlrS4nST+sGOivzc9CJ3LMCbeckd1CXOTQc5CJ7GnAmnr1QMmEVI81 AnQ9mE0Kts45wzoRoRtXzO/RdyGW8hgjUVTpkPs//B34B6/m4VQe6zlk40WI+Dlf4H99 LMYh52/j5MtTZdCeDnyxZgOAXSDKg7WspcHkZ2Qv86LLal8UD+Ok7VnjkZ7A7Gto0+My PkdI3f0Juu3aSa0fr+Dzw7ht1KxpvCm612hAteRoe6EFAkp/79rC/c+a62fcE9yigaht RmxaxRoLzWyu33Nq1/tWHKMqg/MmAFeW95+bwlza9OouqOYZxaCfgcJm/K0RUX3+15do Iwyg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:content-language :in-reply-to:mime-version:user-agent:date:message-id:from:references :cc:to:subject; bh=8CkLbGac0pNoPHKaJebr50ufJJ/nTYy0CdjMsCecSPs=; fh=ak5tSlR+ztIs5L3HaLpEGo2AOAVO+mlna7T0u8ZeASw=; b=iyBCWEw0dRsYpOifGi+jM74gUf/jXZ7ytUIA5TyRiht4oql/oIFKIW59FlOTaZ97uN jutEzu5jJcYcIIvZa7BL9mt0kfMk5rZ7L8DF94cynO4wLcrg8PzIm9frYzPxEugTJg9o UCNsTh+75xDwHe6MswT4pxydc9TTD1saISd7wOYTk42cgi79xCBrrw4Zuna0H6ACFrpV JaXuHdfSUVKno1UXHwDMle8TUmz/bL+PFWFz1n1GTvDmFlz8PYgqsSkPdpB0l4L91nlr 6n0bTgeyd3G8TyF/a3qOVRVlf93uHFF27zPc7uh144PRiIfDHj9ZNJfuqjhOrCD0BTHq h3TA== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::3:8 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from fry.vger.email (fry.vger.email. [2620:137:e000::3:8]) by mx.google.com with ESMTPS id a19-20020a17090acb9300b00252d84b7af0si7993051pju.181.2023.09.18.06.13.34 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 18 Sep 2023 06:13:34 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::3:8 as permitted sender) client-ip=2620:137:e000::3:8; Authentication-Results: mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::3:8 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: from out1.vger.email (depot.vger.email [IPv6:2620:137:e000::3:0]) by fry.vger.email (Postfix) with ESMTP id 504F280A0DC7; Mon, 18 Sep 2023 05:47:25 -0700 (PDT) X-Virus-Status: Clean X-Virus-Scanned: clamav-milter 0.103.10 at fry.vger.email Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S232174AbjIRMqq (ORCPT + 99 others); Mon, 18 Sep 2023 08:46:46 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:44840 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S241665AbjIRMq3 (ORCPT ); Mon, 18 Sep 2023 08:46:29 -0400 Received: from dggsgout11.his.huawei.com (unknown [45.249.212.51]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 22C53E51 for ; Mon, 18 Sep 2023 05:44:52 -0700 (PDT) Received: from mail02.huawei.com (unknown [172.30.67.143]) by dggsgout11.his.huawei.com (SkyGuard) with ESMTP id 4Rq4J01vlDz4f3kkd for ; Mon, 18 Sep 2023 20:44:48 +0800 (CST) Received: from [10.174.178.55] (unknown [10.174.178.55]) by APP4 (Coremail) with SMTP id gCh0CgDnfd1ARghlVUEhAw--.8500S3; Mon, 18 Sep 2023 20:44:48 +0800 (CST) Subject: Re: [PATCH v3 4/9] crash_core: add generic function to do reservation To: Baoquan He , linux-kernel@vger.kernel.org Cc: akpm@linux-foundation.org, thunder.leizhen@huawei.com, catalin.marinas@arm.com, chenjiahao16@huawei.com, kexec@lists.infradead.org, linux-arm-kernel@lists.infradead.org, linux-riscv@lists.infradead.org, x86@kernel.org References: <20230914033142.676708-1-bhe@redhat.com> <20230914033142.676708-5-bhe@redhat.com> From: "Leizhen (ThunderTown)" Message-ID: <3006f785-612d-383e-7faf-a1bd80419af1@huaweicloud.com> Date: Mon, 18 Sep 2023 20:44:48 +0800 User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64; rv:60.0) Gecko/20100101 Thunderbird/60.7.0 MIME-Version: 1.0 In-Reply-To: <20230914033142.676708-5-bhe@redhat.com> Content-Type: text/plain; charset=utf-8 Content-Language: en-US Content-Transfer-Encoding: 7bit X-CM-TRANSID: gCh0CgDnfd1ARghlVUEhAw--.8500S3 X-Coremail-Antispam: 1UD129KBjvJXoW3AF1xZFWUtw4DZr1fCr4rZrb_yoWxXFW7pF y8AFs3CFW7tFnrCay3Zr9xCrWkZw1fua429Fy2yryrJF9rtFnxKrs8uFy2qr1jyrZ0gFWj yFyFgrZI9w4qqrJanT9S1TB71UUUUUUqnTZGkaVYY2UrUUUUjbIjqfuFe4nvWSU5nxnvy2 9KBjDU0xBIdaVrnRJUUUv2b4IE77IF4wAFF20E14v26r4j6ryUM7CY07I20VC2zVCF04k2 6cxKx2IYs7xG6rWj6s0DM7CIcVAFz4kK6r1j6r18M28lY4IEw2IIxxk0rwA2F7IY1VAKz4 vEj48ve4kI8wA2z4x0Y4vE2Ix0cI8IcVAFwI0_tr0E3s1l84ACjcxK6xIIjxv20xvEc7Cj xVAFwI0_Gr1j6F4UJwA2z4x0Y4vEx4A2jsIE14v26rxl6s0DM28EF7xvwVC2z280aVCY1x 0267AKxVW0oVCq3wAS0I0E0xvYzxvE52x082IY62kv0487Mc02F40EFcxC0VAKzVAqx4xG 6I80ewAv7VC0I7IYx2IY67AKxVWUGVWUXwAv7VC2z280aVAFwI0_Jr0_Gr1lOx8S6xCaFV Cjc4AY6r1j6r4UM4x0Y48IcVAKI48JM4IIrI8v6xkF7I0E8cxan2IY04v7Mxk0xIA0c2IE e2xFo4CEbIxvr21l42xK82IYc2Ij64vIr41l4I8I3I0E4IkC6x0Yz7v_Jr0_Gr1lx2IqxV Aqx4xG67AKxVWUJVWUGwC20s026x8GjcxK67AKxVWUGVWUWwC2zVAF1VAY17CE14v26r1q 6r43MIIYrxkI7VAKI48JMIIF0xvE2Ix0cI8IcVAFwI0_Jr0_JF4lIxAIcVC0I7IYx2IY6x kF7I0E14v26r4j6F4UMIIF0xvE42xK8VAvwI8IcIk0rVW3JVWrJr1lIxAIcVC2z280aVAF wI0_Jr0_Gr1lIxAIcVC2z280aVCY1x0267AKxVW8JVW8JrUvcSsGvfC2KfnxnUUI43ZEXa 7IUbPEf5UUUUU== X-CM-SenderInfo: hwkx0vthuozvpl2kv046kxt4xhlfz01xgou0bp/ X-CFilter-Loop: Reflected X-Spam-Status: No, score=-2.2 required=5.0 tests=HEADER_FROM_DIFFERENT_DOMAINS, MAILING_LIST_MULTI,NICE_REPLY_A,SPF_HELO_NONE,SPF_PASS autolearn=unavailable autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on fry.vger.email Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org X-Greylist: Sender passed SPF test, not delayed by milter-greylist-4.6.4 (fry.vger.email [0.0.0.0]); Mon, 18 Sep 2023 05:47:25 -0700 (PDT) On 2023/9/14 11:31, Baoquan He wrote: > In architecture like x86_64, arm64 and riscv, they have vast virtual > address space and usually have huge physical memory RAM. Their > crashkernel reservation doesn't have to be limited under 4G RAM, > but can be extended to the whole physical memory via crashkernel=,high > support. > > Now add function reserve_crashkernel_generic() to reserve crashkernel > memory if users specify any case of kernel pamameters, like > crashkernel=xM[@offset] or crashkernel=,high|low. > > This is preparation to simplify code of crashkernel=,high support > in architecutures. Reviewed-by: Zhen Lei > > Signed-off-by: Baoquan He > --- > include/linux/crash_core.h | 28 ++++++++++ > kernel/crash_core.c | 107 ++++++++++++++++++++++++++++++++++++- > 2 files changed, 134 insertions(+), 1 deletion(-) > > diff --git a/include/linux/crash_core.h b/include/linux/crash_core.h > index d8050a7eab01..4dbd6565e0ff 100644 > --- a/include/linux/crash_core.h > +++ b/include/linux/crash_core.h > @@ -93,6 +93,34 @@ int parse_crashkernel_high(char *cmdline, unsigned long long system_ram, > int parse_crashkernel_low(char *cmdline, unsigned long long system_ram, > unsigned long long *crash_size, unsigned long long *crash_base); > > +#ifdef CONFIG_ARCH_HAS_GENERIC_CRASHKERNEL_RESERVATION > +#ifndef DEFAULT_CRASH_KERNEL_LOW_SIZE > +#define DEFAULT_CRASH_KERNEL_LOW_SIZE (128UL << 20) > +#endif > +#ifndef CRASH_ALIGN > +#define CRASH_ALIGN SZ_2M > +#endif > +#ifndef CRASH_ADDR_LOW_MAX > +#define CRASH_ADDR_LOW_MAX SZ_4G > +#endif > +#ifndef CRASH_ADDR_HIGH_MAX > +#define CRASH_ADDR_HIGH_MAX memblock_end_of_DRAM() > +#endif > + > +void __init reserve_crashkernel_generic(char *cmdline, > + unsigned long long crash_size, > + unsigned long long crash_base, > + unsigned long long crash_low_size, > + bool high); > +#else > +static inline void __init reserve_crashkernel_generic(char *cmdline, > + unsigned long long crash_size, > + unsigned long long crash_base, > + unsigned long long crash_low_size, > + bool high) > +{} > +#endif > + > /* Alignment required for elf header segment */ > #define ELF_CORE_HEADER_ALIGN 4096 > > diff --git a/kernel/crash_core.c b/kernel/crash_core.c > index dce2f5874fea..ca66b5f41dc7 100644 > --- a/kernel/crash_core.c > +++ b/kernel/crash_core.c > @@ -5,7 +5,6 @@ > */ > > #include > -#include > #include > #include > #include > @@ -13,6 +12,9 @@ > #include > #include > #include > +#include > +#include > +#include > > #include > #include > @@ -360,6 +362,109 @@ static int __init parse_crashkernel_dummy(char *arg) > } > early_param("crashkernel", parse_crashkernel_dummy); > > +#ifdef CONFIG_ARCH_HAS_GENERIC_CRASHKERNEL_RESERVATION > +static int __init reserve_crashkernel_low(unsigned long long low_size) > +{ > +#ifdef CONFIG_64BIT > + unsigned long long low_base; > + > + low_base = memblock_phys_alloc_range(low_size, CRASH_ALIGN, 0, CRASH_ADDR_LOW_MAX); > + if (!low_base) { > + pr_err("cannot allocate crashkernel low memory (size:0x%llx).\n", low_size); > + return -ENOMEM; > + } > + > + pr_info("crashkernel low memory reserved: 0x%08llx - 0x%08llx (%lld MB)\n", > + low_base, low_base + low_size, low_size >> 20); > + > + crashk_low_res.start = low_base; > + crashk_low_res.end = low_base + low_size - 1; > + insert_resource(&iomem_resource, &crashk_low_res); > +#endif > + return 0; > +} > + > +void __init reserve_crashkernel_generic(char *cmdline, > + unsigned long long crash_size, > + unsigned long long crash_base, > + unsigned long long crash_low_size, > + bool high) > +{ > + unsigned long long search_end = CRASH_ADDR_LOW_MAX, search_base = 0; > + bool fixed_base = false; > + > + /* User specifies base address explicitly. */ > + if (crash_base) { > + fixed_base = true; > + search_base = crash_base; > + search_end = crash_base + crash_size; > + } else if (high) { > + search_base = CRASH_ADDR_LOW_MAX; > + search_end = CRASH_ADDR_HIGH_MAX; > + } > + > +retry: > + crash_base = memblock_phys_alloc_range(crash_size, CRASH_ALIGN, > + search_base, search_end); > + if (!crash_base) { > + /* > + * For crashkernel=size[KMG]@offset[KMG], print out failure > + * message if can't reserve the specified region. > + */ > + if (fixed_base) { > + pr_warn("crashkernel reservation failed - memory is in use.\n"); > + return; > + } > + > + /* > + * For crashkernel=size[KMG], if the first attempt was for > + * low memory, fall back to high memory, the minimum required > + * low memory will be reserved later. > + */ > + if (!high && search_end == CRASH_ADDR_LOW_MAX) { > + search_end = CRASH_ADDR_HIGH_MAX; > + search_base = CRASH_ADDR_LOW_MAX; > + crash_low_size = DEFAULT_CRASH_KERNEL_LOW_SIZE; > + goto retry; > + } > + > + /* > + * For crashkernel=size[KMG],high, if the first attempt was > + * for high memory, fall back to low memory. > + */ > + if (high && search_end == CRASH_ADDR_HIGH_MAX) { > + search_end = CRASH_ADDR_LOW_MAX; > + search_base = 0; > + goto retry; > + } > + pr_warn("cannot allocate crashkernel (size:0x%llx)\n", > + crash_size); > + return; > + } > + > + if ((crash_base > CRASH_ADDR_LOW_MAX) && > + crash_low_size && reserve_crashkernel_low(crash_low_size)) { > + memblock_phys_free(crash_base, crash_size); > + return; > + } > + > + pr_info("crashkernel reserved: 0x%016llx - 0x%016llx (%lld MB)\n", > + crash_base, crash_base + crash_size, crash_size >> 20); > + > + /* > + * The crashkernel memory will be removed from the kernel linear > + * map. Inform kmemleak so that it won't try to access it. > + */ > + kmemleak_ignore_phys(crash_base); > + if (crashk_low_res.end) > + kmemleak_ignore_phys(crashk_low_res.start); > + > + crashk_res.start = crash_base; > + crashk_res.end = crash_base + crash_size - 1; > + insert_resource(&iomem_resource, &crashk_res); > +} > +#endif > + > int crash_prepare_elf64_headers(struct crash_mem *mem, int need_kernel_map, > void **addr, unsigned long *sz) > { > -- Regards, Zhen Lei