From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from kanga.kvack.org (kanga.kvack.org [205.233.56.17]) by smtp.lore.kernel.org (Postfix) with ESMTP id BAA6AC4345F for ; Fri, 12 Apr 2024 17:22:52 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id 520F86B0095; Fri, 12 Apr 2024 13:22:52 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id 4D0C56B0096; Fri, 12 Apr 2024 13:22:52 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 3998C6B0098; Fri, 12 Apr 2024 13:22:52 -0400 (EDT) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0014.hostedemail.com [216.40.44.14]) by kanga.kvack.org (Postfix) with ESMTP id 16A5E6B0095 for ; Fri, 12 Apr 2024 13:22:52 -0400 (EDT) Received: from smtpin15.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay01.hostedemail.com (Postfix) with ESMTP id DD8581C049E for ; Fri, 12 Apr 2024 17:22:51 +0000 (UTC) X-FDA: 82001549742.15.1759A2A Received: from dfw.source.kernel.org (dfw.source.kernel.org [139.178.84.217]) by imf16.hostedemail.com (Postfix) with ESMTP id 425CE180018 for ; Fri, 12 Apr 2024 17:22:49 +0000 (UTC) Authentication-Results: imf16.hostedemail.com; dkim=none; dmarc=none; spf=pass (imf16.hostedemail.com: domain of "SRS0=gdh+=LR=goodmis.org=rostedt@kernel.org" designates 139.178.84.217 as permitted sender) smtp.mailfrom="SRS0=gdh+=LR=goodmis.org=rostedt@kernel.org" ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1712942569; h=from:from:sender:reply-to:subject:subject:date:date: message-id:message-id:to:to:cc:cc:mime-version:mime-version: content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=Ok7rurcKIRmarBP+tWe6z4ML7EkOHi7xI8Le42mpXJc=; b=q0GrooQGIbdaDvqmW3ozf0gA/mv7Y21nI+3MShmLo4p8JdiNEpDPlmRmdAzRNhP7eEOge2 TEO6WMYUxB67SbklugJTe/JM5mjhIV0WFpbf58sO0c8sOL6Lj4CvSfsJI+h0RvhuCPp/yG rGwAInO/2Fs81GKjH4zR7jHEnSsTPQA= ARC-Authentication-Results: i=1; imf16.hostedemail.com; dkim=none; dmarc=none; spf=pass (imf16.hostedemail.com: domain of "SRS0=gdh+=LR=goodmis.org=rostedt@kernel.org" designates 139.178.84.217 as permitted sender) smtp.mailfrom="SRS0=gdh+=LR=goodmis.org=rostedt@kernel.org" ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1712942569; a=rsa-sha256; cv=none; b=DFWfuMJb11MKf4bqs/FdsQOO2IrjjndCtcO8eds8XKgVoWiB+tTUvtLpBvOL+AHcGApj43 RfLVg8fzCBPL16fIHEllhfEJCyoLYS4mxuazgga/eP/7l72zhL8kF+OB+KhSfzevGT+/eA hZ0/YxLo5f2J3A3I9aUgJqyBvr9Xri4= Received: from smtp.kernel.org (transwarp.subspace.kernel.org [100.75.92.58]) by dfw.source.kernel.org (Postfix) with ESMTP id 2AFDF611F5; Fri, 12 Apr 2024 17:22:48 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id BF76AC2BD11; Fri, 12 Apr 2024 17:22:44 +0000 (UTC) Date: Fri, 12 Apr 2024 13:22:43 -0400 From: Steven Rostedt To: "Guilherme G. Piccoli" Cc: "Luck, Tony" , Kees Cook , Joel Fernandes , "linux-kernel@vger.kernel.org" , "linux-trace-kernel@vger.kernel.org" , Masami Hiramatsu , Mark Rutland , Mathieu Desnoyers , Andrew Morton , "Liam R. Howlett" , Vlastimil Babka , Lorenzo Stoakes , "linux-mm@kvack.org" , Thomas Gleixner , Ingo Molnar , Borislav Petkov , Dave Hansen , "x86@kernel.org" , "H. Peter Anvin" , Peter Zijlstra , "linux-hardening@vger.kernel.org" , Guenter Roeck , Ross Zwisler , "wklin@google.com" , Vineeth Remanan Pillai , Suleiman Souhlal , Linus Torvalds , Catalin Marinas , Will Deacon Subject: Re: [POC][RFC][PATCH 0/2] pstore/mm/x86: Add wildcard memmap to map pstore consistently Message-ID: <20240412132243.053ad096@gandalf.local.home> In-Reply-To: References: <20240409210254.660888920@goodmis.org> <20240409172358.34ea19f0@gandalf.local.home> <202404091519.B7B2221@keescook> <3391c693-cf54-526b-79a8-d565e7140947@igalia.com> <20240411154007.5bdf8d95@gandalf.local.home> X-Mailer: Claws Mail 3.19.1 (GTK+ 2.24.33; x86_64-pc-linux-gnu) MIME-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit X-Rspam-User: X-Rspamd-Server: rspam12 X-Rspamd-Queue-Id: 425CE180018 X-Stat-Signature: jw3tu79gnoiogc6iphxnn4wfy4gwj8yd X-HE-Tag: 1712942569-956849 X-HE-Meta: U2FsdGVkX1/AbzIYByXjiCqNu8MsKNJGbnse99QLUrUcSFEH6/X6FDnd+09ZOhHHXde2FIyhl7uJsvE98gK4weCNT9BcVLha4h/EeX8DFX+eEo+9lcc6uofsk5xq6mB40hONT/awaKOZKBRz3+wjOStyBWnb2U7BFqYvJK5BWMHDkbsWixHStP6NdeNWNNHU40tk81abmi+ZqfpUoqC7X5sjqKQP/Q/EX6YIeo8AuccEZWnSrlBrV2wGWuB+rgIVovBJu/JmgNwJI9Tinio8TPlXXakS+HHZ6gga/ZU4YrabrwLBrmyLtOf7KESjYv+Yptx0XodSF2o7Wmh3bSmbxWc4eOinpLMAJbPxvK3ve26LLHLrd5t1/JjvmKQqMvxOVKlx5xhRcUtxUcAeyGd7EbXLXJiAdaP4UQnmRA9IDdobjni4Ab13ZQrrNhiKsDpfU2gDBY012l7eUdcuihEXN9H54Fcts89JXYQUKOwR+5AGNtRDTySI48wM9wGwcca2ag+BK5ooH7V+2JJNKBEVxpR3b28jefcFTFR+tOfE/y4MFiPVp0toayq9Eizc9Y6rlvpR3WX+vaP3UHXmS1AJK4UVYkYVZzT9jMW5Won0uANP/qkELSQMyQCUhqDGi9NROFeMykZtJqt1MNqMdfdChkKbFx/H2QibtULAKUR2g1i+05a8ShGl2xZWb6KTzbFMq6Fm4Ubn2srkeozv533iF1/KV6yvgdDudF7icgfJelIutfBMjcvvthGZmK1pTotvMbumbKsSEy711TTwNXT5dgaKiYYLdMQH7uJML3oU3gR0lssONa3NZ/H117OU3DBN8F0InWSNxX+otQ7XeJH5MkMQWfZKMtKGG0zhjbsXlKt+FP5E3dHZVyi9DfRuS7BxoGAQxUAAszXFQRZKWbI/08rBrlCz0tKBW7K0NPoTIfw8Z/tP7zuo6VC5Zun6u/P8hbBb6x5qM7VJkl9akj3 qhVk94TZ RTQDqv5kaqE8BI+KJX/4FksI0LRb/GYepzuLVdkIxPwqaPG0BOXDFPDDQtxksIKE70nd3Vn4O1vHKvpdG6kfdIEPzGdMX1eov6GZhewrrZFQyaWofUthD352ed0y4k/Aa/ndsHb76fv9Q6p0jhr+WspaxUEm+on0w4/HblgXbsDQl2+oTejldpK3Ox4nZ+osSwhrWLC4fzzwmkhq2vh8jRoxdAP2t0x2XJviVdmhZH+7BgDoWw7qABkAeAJ3mAGECA3QD2dfCRm0PYFii73gl2AUpTpCoQyPPmOXtD3ucuihKKgbnNhjO7sTzXaxNw/5X9WNthfOMljQMMFEnLnfZSdEw251FTXuuryWs X-Bogosity: Ham, tests=bogofilter, spamicity=0.000000, version=1.2.4 Sender: owner-linux-mm@kvack.org Precedence: bulk X-Loop: owner-majordomo@kvack.org List-ID: List-Subscribe: List-Unsubscribe: On Fri, 12 Apr 2024 09:17:18 -0300 "Guilherme G. Piccoli" wrote: > Thanks Steve, seems a good idea. With that, I could test on kdumpst (the > tool used on Steam Deck), since it relies on modular pstore/ram. Something like this could work. -- Steve diff --git a/arch/x86/kernel/e820.c b/arch/x86/kernel/e820.c index a8831ef30c73..878aee8b2399 100644 --- a/arch/x86/kernel/e820.c +++ b/arch/x86/kernel/e820.c @@ -16,6 +16,7 @@ #include #include #include +#include #include #include @@ -64,61 +65,6 @@ struct e820_table *e820_table __refdata = &e820_table_init; struct e820_table *e820_table_kexec __refdata = &e820_table_kexec_init; struct e820_table *e820_table_firmware __refdata = &e820_table_firmware_init; -/* For wildcard memory requests, have a table to find them later */ -#define E820_MAX_MAPS 8 -#define E820_MAP_NAME_SIZE 16 -struct e820_mmap_map { - char name[E820_MAP_NAME_SIZE]; - u64 start; - u64 size; -}; -static struct e820_mmap_map e820_mmap_list[E820_MAX_MAPS] __initdata; -static int e820_mmap_size __initdata; - -/* Add wildcard region with a lookup name */ -static int __init e820_add_mmap(u64 start, u64 size, const char *name) -{ - struct e820_mmap_map *map; - - if (!name || !name[0] || strlen(name) >= E820_MAP_NAME_SIZE) - return -EINVAL; - - if (e820_mmap_size >= E820_MAX_MAPS) - return -1; - - map = &e820_mmap_list[e820_mmap_size++]; - map->start = start; - map->size = size; - strcpy(map->name, name); - return 0; -} - -/** - * memmap_named - Find a wildcard region with a given name - * @name: The name that is attached to a wildcard region - * @start: If found, holds the start address - * @size: If found, holds the size of the address. - * - * Returns: 1 if found or 0 if not found. - */ -int __init memmap_named(const char *name, u64 *start, u64 *size) -{ - struct e820_mmap_map *map; - int i; - - for (i = 0; i < e820_mmap_size; i++) { - map = &e820_mmap_list[i]; - if (!map->size) - continue; - if (strcmp(name, map->name) == 0) { - *start = map->start; - *size = map->size; - return 1; - } - } - return 0; -} - /* For PCI or other memory-mapped resources */ unsigned long pci_mem_start = 0xaeedbabe; #ifdef CONFIG_PCI @@ -1024,6 +970,8 @@ static int __init parse_memmap_one(char *p) e820__range_add(start_at, mem_size, E820_TYPE_RESERVED); } else if (*p == '*') { u64 align; + int ret; + /* Followed by alignment and ':' then the name */ align = memparse(p+1, &p); start_at = e820__region(mem_size, align); @@ -1032,9 +980,10 @@ static int __init parse_memmap_one(char *p) if (*p != ':') return -EINVAL; p++; - e820_add_mmap(start_at, mem_size, p); + ret = memmap_add(start_at, mem_size, p); p += strlen(p); - e820__range_add(start_at, mem_size, E820_TYPE_RESERVED); + if (!ret) + e820__range_add(start_at, mem_size, E820_TYPE_RESERVED); } else if (*p == '!') { start_at = memparse(p+1, &p); e820__range_add(start_at, mem_size, E820_TYPE_PRAM); diff --git a/fs/pstore/ram.c b/fs/pstore/ram.c index c200388399fb..22d2e2731dc2 100644 --- a/fs/pstore/ram.c +++ b/fs/pstore/ram.c @@ -919,7 +919,6 @@ static void __init ramoops_register_dummy(void) { struct ramoops_platform_data pdata; -#ifndef MODULE /* Only allowed when builtin */ if (mem_name) { u64 start; @@ -930,7 +929,6 @@ static void __init ramoops_register_dummy(void) mem_size = size; } } -#endif /* * Prepare a dummy platform data structure to carry the module diff --git a/include/linux/mm.h b/include/linux/mm.h index cf9b34454c6f..6ce1c6929d1f 100644 --- a/include/linux/mm.h +++ b/include/linux/mm.h @@ -4203,5 +4203,6 @@ static inline bool pfn_is_unaccepted_memory(unsigned long pfn) } int memmap_named(const char *name, u64 *start, u64 *size); +int memmap_add(long start, long size, const char *name); #endif /* _LINUX_MM_H */ diff --git a/mm/memory.c b/mm/memory.c index 7a29f17df7c1..fe054e1bb678 100644 --- a/mm/memory.c +++ b/mm/memory.c @@ -120,12 +120,6 @@ static bool vmf_orig_pte_uffd_wp(struct vm_fault *vmf) return pte_marker_uffd_wp(vmf->orig_pte); } -int __init __weak memmap_named(const char *name, u64 *start, u64 *size) -{ - pr_info("Kernel command line: memmap=nn*align:name not supported on this kernel"); - /* zero means not found */ - return 0; -} /* * A number of key systems in x86 including ioremap() rely on the assumption diff --git a/mm/mm_init.c b/mm/mm_init.c index 549e76af8f82..e5b729b83fdc 100644 --- a/mm/mm_init.c +++ b/mm/mm_init.c @@ -154,6 +154,77 @@ static __init int set_mminit_loglevel(char *str) early_param("mminit_loglevel", set_mminit_loglevel); #endif /* CONFIG_DEBUG_MEMORY_INIT */ +/* For wildcard memory requests, have a table to find them later */ +#define MAX_MAPS 8 +#define MAP_NAME_SIZE 16 +struct mmap_map { + char name[MAP_NAME_SIZE]; + long start; + long size; +}; +static struct mmap_map early_mmap_list[MAX_MAPS] __initdata; +static int early_mmap_size __initdata; +static struct mmap_map *mmap_list; + +/* Add wildcard region with a lookup name */ +int memmap_add(long start, long size, const char *name) +{ + struct mmap_map *map; + + if (!name || !name[0] || strlen(name) >= MAP_NAME_SIZE) + return -EINVAL; + + if (early_mmap_size >= MAX_MAPS) + return -1; + + map = &early_mmap_list[early_mmap_size++]; + map->start = start; + map->size = size; + strcpy(map->name, name); + return 0; +} + +static void __init memmap_copy(void) +{ + if (!early_mmap_size) + return; + + mmap_list = kcalloc(early_mmap_size + 1, sizeof(mmap_list), GFP_KERNEL); + if (!mmap_list) + return; + + for (int i = 0; i < early_mmap_size; i++) + mmap_list[i] = early_mmap_list[i]; +} + +/** + * memmap_named - Find a wildcard region with a given name + * @name: The name that is attached to a wildcard region + * @start: If found, holds the start address + * @size: If found, holds the size of the address. + * + * Returns: 1 if found or 0 if not found. + */ +int memmap_named(const char *name, u64 *start, u64 *size) +{ + struct mmap_map *map; + + if (!mmap_list) + return 0; + + for (int i = 0; mmap_list[i].name[0]; i++) { + map = &mmap_list[i]; + if (!map->size) + continue; + if (strcmp(name, map->name) == 0) { + *start = map->start; + *size = map->size; + return 1; + } + } + return 0; +} + struct kobject *mm_kobj; #ifdef CONFIG_SMP @@ -2793,4 +2864,5 @@ void __init mm_core_init(void) pti_init(); kmsan_init_runtime(); mm_cache_init(); + memmap_copy(); }