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 5851BC25B74 for ; Tue, 4 Jun 2024 05:52:41 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id C9C8F6B0083; Tue, 4 Jun 2024 01:52:40 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id C4B536B0085; Tue, 4 Jun 2024 01:52:40 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id B12AB6B0088; Tue, 4 Jun 2024 01:52:40 -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 930196B0083 for ; Tue, 4 Jun 2024 01:52:40 -0400 (EDT) Received: from smtpin17.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay10.hostedemail.com (Postfix) with ESMTP id 05D44C0B3E for ; Tue, 4 Jun 2024 05:52:40 +0000 (UTC) X-FDA: 82192136880.17.38F2441 Received: from dfw.source.kernel.org (dfw.source.kernel.org [139.178.84.217]) by imf23.hostedemail.com (Postfix) with ESMTP id 4DF43140010 for ; Tue, 4 Jun 2024 05:52:38 +0000 (UTC) Authentication-Results: imf23.hostedemail.com; dkim=pass header.d=kernel.org header.s=k20201202 header.b=rRygG54C; dmarc=pass (policy=none) header.from=kernel.org; spf=pass (imf23.hostedemail.com: domain of kees@kernel.org designates 139.178.84.217 as permitted sender) smtp.mailfrom=kees@kernel.org ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1717480358; 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:dkim-signature; bh=r9URWRYyUPhjlnlhWnLuJQ68WIKCR78Uj6XOOLvO9nU=; b=dWqer0z+3ni7+i3YujHwC1kbXB/kzKpa7ZWDH6SCmNf1hK5MAyi3ChOA5n/hF5p8j3Gjhq PSDjBVd7TyAx8JPbYaCev968ELoDZI3Eeaowo6lB5nmYae+8pU9FIMsDvXeIWQ+ZpOGSxe m9aoQGUqXpJYna29yO6SaitfL8lzIdM= ARC-Authentication-Results: i=1; imf23.hostedemail.com; dkim=pass header.d=kernel.org header.s=k20201202 header.b=rRygG54C; dmarc=pass (policy=none) header.from=kernel.org; spf=pass (imf23.hostedemail.com: domain of kees@kernel.org designates 139.178.84.217 as permitted sender) smtp.mailfrom=kees@kernel.org ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1717480358; a=rsa-sha256; cv=none; b=Tb114E8SnL+LYFSiPlbBBMKqoNpt6ANgDFLCae1e48mZnMKhoDt79FzmwE+3cVsaIgbUvl 9LTRyOAROUBGeY/y9QfK1IwF7H7PvKRba0K5WgySDct1e0D9/TYaGxAPeZeU5It0vQEgd5 iggJ6FfJGoWFah7abHJZmOf392/VrRI= Received: from smtp.kernel.org (transwarp.subspace.kernel.org [100.75.92.58]) by dfw.source.kernel.org (Postfix) with ESMTP id 2F955611A6; Tue, 4 Jun 2024 05:52:37 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id B8A96C2BBFC; Tue, 4 Jun 2024 05:52:36 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1717480356; bh=hp/q9fl1l/6+eFOkIX8ny4QgcjTOK17pB3rxlmTZ8Iw=; h=Date:From:To:CC:Subject:In-Reply-To:References:From; b=rRygG54CoZ8htmevLQ2Hwd3ZKINlMR4WCoy3mGZm7Er7VXEGvDHQ4Hxm8Fvhepf6G xEMuSpoBut1mphalvVhYydblbpdlzb9tM6341UEtCE+SYUIpv3WBE/bsBoCYxCutSM XYUumCwRSdEgTN/mEIo7JIgarVXj5ERxHBHWdZoRAdXpgSToo4JXHm/GyuJCd3wDBr 5vYjNG6497Phbm/PJ9zukKXKSRmm0QPgH9ER9iIQiUux4Q8rquDIPIqY5szq2BVoG6 fdNd2eK8IcYXXbNAe5srDrLtFRI6j9h/cMgIz3X04EHoLjc1Lo6nI9BZWWuBNFy1yz fpNdjbjPA6yYA== Date: Mon, 03 Jun 2024 22:52:37 -0700 From: Kees Cook To: Steven Rostedt , linux-kernel@vger.kernel.org, linux-trace-kernel@vger.kernel.org CC: 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 , Kees Cook , Tony Luck , "Guilherme G. Piccoli" , linux-hardening@vger.kernel.org, Guenter Roeck , Ross Zwisler , wklin@google.com, Vineeth Remanan Pillai , Joel Fernandes , Suleiman Souhlal , Linus Torvalds , Catalin Marinas , Will Deacon , Mike Rapoport , ardb@kernel.org Subject: =?US-ASCII?Q?Re=3A_=5BPATCH_1/2=5D_mm/memblock=3A_Add_=22reserve?= =?US-ASCII?Q?=5Fmem=22_to_reserved_named_memory_at_boot_up?= User-Agent: K-9 Mail for Android In-Reply-To: <20240603233631.452433539@goodmis.org> References: <20240603233330.801075898@goodmis.org> <20240603233631.452433539@goodmis.org> Message-ID: <5DAB46F6-F415-4C2B-AA6A-E0049CF6270C@kernel.org> MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable X-Rspamd-Queue-Id: 4DF43140010 X-Stat-Signature: quo5nih8trt8jeuxra5kcrsnzdwt55fn X-Rspam-User: X-Rspamd-Server: rspam04 X-HE-Tag: 1717480358-767655 X-HE-Meta: U2FsdGVkX1+bRi+dJjGnA7XOabdK3tFSb1iPls5yuIRWQmxJ8jlUSuxNutGXVT0rbnMFJG17Q74bHE/Y04LiLm3OgMvaG/aq3fDxjBZfPO4LyT5o7qxE78FW8JW7RXqzABouY9hIjLl3BXvuJL76PlW6NfaBZIp5fzbQ3mJwzgZWBz89ehZB0Rm6Y54H1T0J019rxwgBbWHInyMKBJElvtF9uPpbMdla0kvDJOKvzxvBLC2KSNRYGVGoTDGZ/aLS5ZZxGocOX5M/KsfZJG0cc0LPrZPeGMarZpzBQL5oQSKU18JhVAh9Vephv8eiVZuZwhiRdT6WaEMMJv8ue1RSbUUbfrL2xfQpzI0mp5sz4TZkPYL0ILw/EL29Ug3HiCXF3qJ0rd8zzSvCCxeQ1kiUEGxaVgj8H4uzn5/YIKaoXAzLh0ymGClAVJHgcZ4UvYeGvkSn6MSMxEICDm+TwtzjEBo4MpYscT8yRFFkJPuEzH3u+u+CsA+UN2ArNe65AKQ+SmPtME28+GC2mA7EEmKe9RK75GsjN3+i9JjAs5tFYK0R6L+OVrg6VBCzS1EUk3tVnl1mGY4osdvafYIDbHhDY1JnUEqvZEu0nJmju8BKvr6sOhZ0AdM/buLwEnmNMtyRg0WYiMYVSDWDvSz8oBubZppMb3RXlHpQ/Fqkojz33M/Pg/L1mxyMRwUISQZquaen78DByEptJCLSTI8mawh0nm1kO17dCmSZ2jDaEYmxbCb5jFcT9z/7t5arPqHMGegKSpXP7ni+wS8aE2dvWx7JzsR/QhrvPRi+lwltol8hMt+4Z1HuonUAlxuOI6IRnXCAbAu+Kx9xP+6Ip6qd6ab+KuznMXRNReYv9fCOL1bI9uM6o8/rcSfItG1wKF+HsDCMstBs7TaT6QOG20dik5iL3E/xzDKoLYx85VM5WQOVqlmGNc97QyNTEXngdz4DN1Ltf3Le6aW9e0XRrSB9GZe InHnnNdi gpkxBX+Aqb9t0DXl+HJaYKN/Mn+BXhs/67M0zUkZOlrMV7se/2c/GGlKKlVzbWUpjD4kbWEpdf0NXvFSGKoEdn9pTbteG+Mb9vHovA1BG7Lgmjuc4AQZ+UjS5LHWA/SQqyMZmsxC9Vz51pSMTRwyxcTC2M8Sl96iLUVAnT3HMBs++nbyrHWF9ghAAFEO7sBvrn0KGi2IdjG6Nu7mfl6sJEtQsQxmnrRzrg+8/d9twcbdQLRr52xjRaRmqwl+mtjEM78+3DIqpBZr3yrfXv/jQFGpOIMWWbVkL7X3NlLwXKDzy8pokXRxdajUTnbMDiAP+ey3ghQJ9UfpHqENE5MUydjaEHVS0EYXEYoBOw7+V9RCLnDP1cqa6E3BZj/xYdsxoHR5bjMAjTqQ5Qo18Okp5xlLoQMzHEnQUiKYS 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 June 3, 2024 4:33:31 PM PDT, Steven Rostedt wro= te: >From: "Steven Rostedt (Google)" > >In order to allow for requesting a memory region that can be used for >things like pstore on multiple machines where the memory layout is not th= e >same, add a new option to the kernel command line called "reserve_mem"=2E > >The format is: reserve_mem=3Dnn:align:name > >Where it will find nn amount of memory at the given alignment of align=2E >The name field is to allow another subsystem to retrieve where the memory >was found=2E For example: > > reserve_mem=3D12M:4096:oops ramoops=2Emem_name=3Doops How does this interact with KASLR? It has chosen its physical location bef= ore this parsing happens, so I'd expect this to fail once in a while, unles= s the size/alignment is lucky enough that KASLR never uses that portion of = the physical memory=2E=2E=2E -Kees > >Where ramoops=2Emem_name will tell ramoops that memory was reserved for i= t >via the reserve_mem option and it can find it by calling: > > if (reserve_mem_find_by_name("oops", &start, &size)) { > // start holds the start address and size holds the size given > >Link: https://lore=2Ekernel=2Eorg/all/ZjJVnZUX3NZiGW6q@kernel=2Eorg/ > >Suggested-by: Mike Rapoport >Signed-off-by: Steven Rostedt (Google) >--- > include/linux/mm=2Eh | 2 + > mm/memblock=2Ec | 97 ++++++++++++++++++++++++++++++++++++++++++++++ > 2 files changed, 99 insertions(+) > >diff --git a/include/linux/mm=2Eh b/include/linux/mm=2Eh >index 9849dfda44d4=2E=2Eb4455cc02f2c 100644 >--- a/include/linux/mm=2Eh >+++ b/include/linux/mm=2Eh >@@ -4263,4 +4263,6 @@ static inline bool pfn_is_unaccepted_memory(unsigne= d long pfn) > void vma_pgtable_walk_begin(struct vm_area_struct *vma); > void vma_pgtable_walk_end(struct vm_area_struct *vma); >=20 >+int reserve_mem_find_by_name(const char *name, unsigned long *start, uns= igned long *size); >+ > #endif /* _LINUX_MM_H */ >diff --git a/mm/memblock=2Ec b/mm/memblock=2Ec >index d09136e040d3=2E=2Ea8bf0ee9e2b4 100644 >--- a/mm/memblock=2Ec >+++ b/mm/memblock=2Ec >@@ -2244,6 +2244,103 @@ void __init memblock_free_all(void) > totalram_pages_add(pages); > } >=20 >+/* Keep a table to reserve named memory */ >+#define RESERVE_MEM_MAX_ENTRIES 8 >+#define RESERVE_MEM_NAME_SIZE 16 >+struct reserve_mem_table { >+ char name[RESERVE_MEM_NAME_SIZE]; >+ unsigned long start; >+ unsigned long size; >+}; >+static struct reserve_mem_table reserved_mem_table[RESERVE_MEM_MAX_ENTRI= ES]; >+static int reserved_mem_count; >+ >+/* Add wildcard region with a lookup name */ >+static int __init reserved_mem_add(unsigned long start, unsigned long si= ze, >+ const char *name) >+{ >+ struct reserve_mem_table *map; >+ >+ if (!name || !name[0] || strlen(name) >=3D RESERVE_MEM_NAME_SIZE) >+ return -EINVAL; >+ >+ if (reserved_mem_count >=3D RESERVE_MEM_MAX_ENTRIES) >+ return -1; >+ >+ map =3D &reserved_mem_table[reserved_mem_count++]; >+ map->start =3D start; >+ map->size =3D size; >+ strscpy(map->name, name); >+ return 0; >+} >+ >+/** >+ * reserve_mem_find_by_name - Find reserved memory region with a given n= ame >+ * @name: The name that is attached to a reserved memory region >+ * @start: If found, holds the start address >+ * @size: If found, holds the size of the address=2E >+ * >+ * Returns: 1 if found or 0 if not found=2E >+ */ >+int reserve_mem_find_by_name(const char *name, unsigned long *start, uns= igned long *size) >+{ >+ struct reserve_mem_table *map; >+ int i; >+ >+ for (i =3D 0; i < reserved_mem_count; i++) { >+ map =3D &reserved_mem_table[i]; >+ if (!map->size) >+ continue; >+ if (strcmp(name, map->name) =3D=3D 0) { >+ *start =3D map->start; >+ *size =3D map->size; >+ return 1; >+ } >+ } >+ return 0; >+} >+ >+/* >+ * Parse early_reserve_mem=3Dnn:align:name >+ */ >+static int __init reserve_mem(char *p) >+{ >+ phys_addr_t start, size, align; >+ char *oldp; >+ int err; >+ >+ if (!p) >+ return -EINVAL; >+ >+ oldp =3D p; >+ size =3D memparse(p, &p); >+ if (p =3D=3D oldp) >+ return -EINVAL; >+ >+ if (*p !=3D ':') >+ return -EINVAL; >+ >+ align =3D memparse(p+1, &p); >+ if (*p !=3D ':') >+ return -EINVAL; >+ >+ start =3D memblock_phys_alloc(size, align); >+ if (!start) >+ return -ENOMEM; >+ >+ p++; >+ err =3D reserved_mem_add(start, size, p); >+ if (err) { >+ memblock_phys_free(start, size); >+ return err; >+ } >+ >+ p +=3D strlen(p); >+ >+ return *p =3D=3D '\0' ? 0: -EINVAL; >+} >+__setup("reserve_mem=3D", reserve_mem); >+ > #if defined(CONFIG_DEBUG_FS) && defined(CONFIG_ARCH_KEEP_MEMBLOCK) > static const char * const flagname[] =3D { > [ilog2(MEMBLOCK_HOTPLUG)] =3D "HOTPLUG", --=20 Kees Cook