From patchwork Wed Oct 4 22:23:15 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Stanislav Kinsburskii X-Patchwork-Id: 13409627 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 EB4F9E936EA for ; Wed, 4 Oct 2023 22:23:20 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id 32E356B0248; Wed, 4 Oct 2023 18:23:20 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id 2DD856B024A; Wed, 4 Oct 2023 18:23:20 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 17E2F6B024C; Wed, 4 Oct 2023 18:23:20 -0400 (EDT) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0013.hostedemail.com [216.40.44.13]) by kanga.kvack.org (Postfix) with ESMTP id 048006B0248 for ; Wed, 4 Oct 2023 18:23:20 -0400 (EDT) Received: from smtpin07.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay01.hostedemail.com (Postfix) with ESMTP id C864E1C9C5F for ; Wed, 4 Oct 2023 22:23:19 +0000 (UTC) X-FDA: 81309206118.07.E8D9A99 Received: from linux.microsoft.com (linux.microsoft.com [13.77.154.182]) by imf26.hostedemail.com (Postfix) with ESMTP id EE2B114001B for ; Wed, 4 Oct 2023 22:23:17 +0000 (UTC) Authentication-Results: imf26.hostedemail.com; dkim=pass header.d=linux.microsoft.com header.s=default header.b=QbSVwGL5; dmarc=pass (policy=none) header.from=linux.microsoft.com; spf=pass (imf26.hostedemail.com: domain of skinsburskii@linux.microsoft.com designates 13.77.154.182 as permitted sender) smtp.mailfrom=skinsburskii@linux.microsoft.com ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1696458198; h=from:from:sender:reply-to:subject:subject:date:date: message-id:message-id:to:to: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=ycFAv0PCBQmDgiC3b/2+OMlEJBzxcUfQc48aiL7bf3M=; b=Uyy08y1hgpz7i+akKlOc9u4vjEiCe5IvqOIsmgS1D9BDrsGSJX3WhW5QkAywcbEcJx1h0j 7TubwnKnP5qzTrTa1wv6tJ7gmZylmdz3oCG5bGfF6ViOfYSQQEtnfG1qGabAwljp7T5BZg ALyAwDb4qH8CK3yRFTDTj98XewOVZug= ARC-Authentication-Results: i=1; imf26.hostedemail.com; dkim=pass header.d=linux.microsoft.com header.s=default header.b=QbSVwGL5; dmarc=pass (policy=none) header.from=linux.microsoft.com; spf=pass (imf26.hostedemail.com: domain of skinsburskii@linux.microsoft.com designates 13.77.154.182 as permitted sender) smtp.mailfrom=skinsburskii@linux.microsoft.com ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1696458198; a=rsa-sha256; cv=none; b=Sld1KeJW402Gq/g3HlgjH7RFBYZQR7Ets6t8YsFntltyYo9A/pTOhBWwtSLP0HimiN/iiz FsXkIQ474QOLm2G1QX8V6kUOUjUx+yT95mbTHZUDwv0vS9n94mTPuvhz1CoSCqtCn07muO ZV0RkFaT5rvVi96fWzWc7gr6nSysAEY= Received: from skinsburskii. (c-67-170-100-148.hsd1.wa.comcast.net [67.170.100.148]) by linux.microsoft.com (Postfix) with ESMTPSA id 7781420B74C2; Wed, 4 Oct 2023 15:23:16 -0700 (PDT) DKIM-Filter: OpenDKIM Filter v2.11.0 linux.microsoft.com 7781420B74C2 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linux.microsoft.com; s=default; t=1696458196; bh=ycFAv0PCBQmDgiC3b/2+OMlEJBzxcUfQc48aiL7bf3M=; h=Subject:From:To:Date:In-Reply-To:References:From; b=QbSVwGL5m1YV4ZHlI7tRceJRWnWKXfuvjkrkM6T3QHhhstHPuzxjz07qTLxANFrZk Et3OvrVSC5lRKgTv2fB8uTv8CcmDbYXQ6OSnLKsopKQZg69XmRcsJ0SIvj/Rpo1/lr pygBF8mQ5e3QBv3q3CjyepJosWZjhUMMCLIGYcbk= Subject: [RFC PATCH v3 1/3] x86/boot/e820: Expose kexec range update, remove and table update functions From: Stanislav Kinsburskii To: tglx@linutronix.de, mingo@redhat.com, bp@alien8.de, dave.hansen@linux.intel.com, x86@kernel.org, hpa@zytor.com, ebiederm@xmission.com, akpm@linux-foundation.org, stanislav.kinsburskii@gmail.com, corbet@lwn.net, linux-kernel@vger.kernel.org, kexec@lists.infradead.org, linux-mm@kvack.org, kys@microsoft.com, jgowans@amazon.com, wei.liu@kernel.org, arnd@arndb.de, gregkh@linuxfoundation.org, graf@amazon.de, pbonzini@redhat.com, bhe@redhat.com, dave.hansen@intel.com, kirill.shutemov@intel.com Date: Wed, 04 Oct 2023 15:23:15 -0700 Message-ID: <169645819587.11424.5389114333710932782.stgit@skinsburskii.> In-Reply-To: <169645773092.11424.7258549771090599226.stgit@skinsburskii.> References: <169645773092.11424.7258549771090599226.stgit@skinsburskii.> User-Agent: StGit/0.19 MIME-Version: 1.0 X-Rspamd-Queue-Id: EE2B114001B X-Rspam-User: X-Rspamd-Server: rspam05 X-Stat-Signature: ya3cjmuma4igkn1z4hmfuarpwykxi3f7 X-HE-Tag: 1696458197-53863 X-HE-Meta: U2FsdGVkX18fpCi8VQDHR3T7DVR/BkBJJckxUBAkF5BKmaBajXXZ9SfeM0Z0rAREezUJcfkfA/Ddkd8BbrOIh4hWYtlsTTHVGuUKvm9Ef2j8WldTyyOpxPJIPeaTYswQmKNqbQ0rz0FkCC6iixc4yZUid1PVlrggdvH6MUj6LOtNcIwqJtbB1K7X75cr+z551yt+4NQSHBl6OFXHivPat/0uWBtrJ6DlVKqqgqdDYaFnQZkZBNCYqe49aBnpcHpzoTsEeccXe2yfONx0sh+0oexY3ag0w9n8z00wzenCqt4UhjfHCdZpHaI2IRpPdK2aoeJ/Ti+fzXls323KI9hVuyfLVGjpmiQQStYFeKsU2T7PiFD/E6BvTto1+bWShu644lepsbrvNkHrbwbRJRgxiI0cjVnQPb67KhoNTG0fl7hrDLQ9GMiEVq++ywnhhLO83laCztDd0ap4QubMTHM2CLiho3xRTvjjTbs0I1YiHWneeprPm2Qm4tD9gZJRziKQKiVthD4T8BSMyyDfSE2jmbGZzTpByc3NuE0WvMIHFnSYZiuAooasWGuKzXQccAMO8d5cR1CMrtYKWq9wC95znVVUae0sjFxYcnoSsKk/WEEsLaB6Y99sXZD7Bm2+38e1EtKLGzCfDnqew7BOTptCDw0v5tRiQq4zc4DxK8JEqT+GSyzNRNeHUeptu/q95pxrdxniyQUZkteXssc2HXMJWPDJATH5H16YX3mjn3Qq2Fny9FgKerhl10QHtYMB3XwLJPK250SQlQVdKeg6SJWisL6L4IiDOZbhhXwhI5To2SBDIYtb0xakhv/EoDsSgZEC24AtVLnKXTJLoHtV2B88Z5E7/LOukoIANWMikpQHlht36aYH9VnJLzKqmt/OirAZtvttPI+ZTbn00EQv1pug+JNxUMjBH5f374YhCwL5RVHtLaMrbxTsivRIv0LjIJbQgpGiRPhbQKm21pLviv3 rV9u5Ah9 UtNo81J9SOrWXonAWAQDM8YWij8SdvP28cM0ZMMPGzgKewpMPvYS87buSkl11iFxqCGtK5eKJThvo7AkYlojwAhzfnm/EvJFAE6uIL5BkF+THOcYM438G5VCE1FLwOw144HioTDK87fXZ/9IHlm2sWhkExNMp9UMaoXllkv5gWJ9NA6IriIk/6OP8ztUPvmEbbYtstf/v5/19dy8ebNd7vWolzDHeUvCAJ3axgaoqcaRXz4g9dtqYV48UGhVs8X1ZVX6CPes6xK+Q3jTv924HXU8Ayg== 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: This functions are to be used to reserve memory regions in kexec kernel by other kernel subsystems. Signed-off-by: Stanislav Kinsburskii --- arch/x86/include/asm/e820/api.h | 4 ++++ arch/x86/kernel/e820.c | 21 +++++++++++++++------ 2 files changed, 19 insertions(+), 6 deletions(-) diff --git a/arch/x86/include/asm/e820/api.h b/arch/x86/include/asm/e820/api.h index e8f58ddd06d9..24bb8da928bb 100644 --- a/arch/x86/include/asm/e820/api.h +++ b/arch/x86/include/asm/e820/api.h @@ -22,6 +22,10 @@ extern void e820__print_table(char *who); extern int e820__update_table(struct e820_table *table); extern void e820__update_table_print(void); +extern u64 e820__range_update_kexec(u64 start, u64 size, enum e820_type old_type, enum e820_type new_type); +extern u64 e820__range_remove_kexec(u64 start, u64 size, enum e820_type old_type, bool check_type); +extern void e820__update_table_kexec(void); + extern unsigned long e820__end_of_ram_pfn(void); extern unsigned long e820__end_of_low_ram_pfn(void); diff --git a/arch/x86/kernel/e820.c b/arch/x86/kernel/e820.c index fb8cf953380d..f339815029f7 100644 --- a/arch/x86/kernel/e820.c +++ b/arch/x86/kernel/e820.c @@ -532,13 +532,12 @@ u64 __init e820__range_update(u64 start, u64 size, enum e820_type old_type, enum return __e820__range_update(e820_table, start, size, old_type, new_type); } -static u64 __init e820__range_update_kexec(u64 start, u64 size, enum e820_type old_type, enum e820_type new_type) +u64 __init e820__range_update_kexec(u64 start, u64 size, enum e820_type old_type, enum e820_type new_type) { return __e820__range_update(e820_table_kexec, start, size, old_type, new_type); } -/* Remove a range of memory from the E820 table: */ -u64 __init e820__range_remove(u64 start, u64 size, enum e820_type old_type, bool check_type) +u64 __init __e820__range_remove(struct e820_table *table, u64 start, u64 size, enum e820_type old_type, bool check_type) { int i; u64 end; @@ -553,8 +552,8 @@ u64 __init e820__range_remove(u64 start, u64 size, enum e820_type old_type, bool e820_print_type(old_type); pr_cont("\n"); - for (i = 0; i < e820_table->nr_entries; i++) { - struct e820_entry *entry = &e820_table->entries[i]; + for (i = 0; i < table->nr_entries; i++) { + struct e820_entry *entry = &table->entries[i]; u64 final_start, final_end; u64 entry_end; @@ -599,6 +598,16 @@ u64 __init e820__range_remove(u64 start, u64 size, enum e820_type old_type, bool return real_removed_size; } +u64 __init e820__range_remove(u64 start, u64 size, enum e820_type old_type, bool check_type) +{ + return __e820__range_remove(e820_table, start, size, old_type, check_type); +} + +u64 __init e820__range_remove_kexec(u64 start, u64 size, enum e820_type old_type, bool check_type) +{ + return __e820__range_remove(e820_table_kexec, start, size, old_type, check_type); +} + void __init e820__update_table_print(void) { if (e820__update_table(e820_table)) @@ -608,7 +617,7 @@ void __init e820__update_table_print(void) e820__print_table("modified"); } -static void __init e820__update_table_kexec(void) +void __init e820__update_table_kexec(void) { e820__update_table(e820_table_kexec); } From patchwork Wed Oct 4 22:23:21 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Stanislav Kinsburskii X-Patchwork-Id: 13409628 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 917EBE936EC for ; Wed, 4 Oct 2023 22:23:26 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id 0E38A6B024C; Wed, 4 Oct 2023 18:23:26 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id 094596B024D; Wed, 4 Oct 2023 18:23:26 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id E4F136B0254; Wed, 4 Oct 2023 18:23:25 -0400 (EDT) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0013.hostedemail.com [216.40.44.13]) by kanga.kvack.org (Postfix) with ESMTP id D51356B024C for ; Wed, 4 Oct 2023 18:23:25 -0400 (EDT) Received: from smtpin22.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay02.hostedemail.com (Postfix) with ESMTP id A465F12012D for ; Wed, 4 Oct 2023 22:23:25 +0000 (UTC) X-FDA: 81309206370.22.1D2DB26 Received: from linux.microsoft.com (linux.microsoft.com [13.77.154.182]) by imf04.hostedemail.com (Postfix) with ESMTP id DBEEC40003 for ; Wed, 4 Oct 2023 22:23:23 +0000 (UTC) Authentication-Results: imf04.hostedemail.com; dkim=pass header.d=linux.microsoft.com header.s=default header.b=DlMtgdVr; dmarc=pass (policy=none) header.from=linux.microsoft.com; spf=pass (imf04.hostedemail.com: domain of skinsburskii@linux.microsoft.com designates 13.77.154.182 as permitted sender) smtp.mailfrom=skinsburskii@linux.microsoft.com ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1696458204; h=from:from:sender:reply-to:subject:subject:date:date: message-id:message-id:to:to: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=/kL+2ixzH9Y0/6AQP5r2LCMUwHJ2IksXHQmOSZeRk70=; b=Y0AoutMP9e/TurpYurcCRpUbx/HLJal4KwcVBeA/qyoKaE+R48YjHCD74HRFWDPvJI2dQl pMmaZIY7dBKH4nIoEBKWIwqLD9RvHL63uvR/PSUppAXACQkLrJ+7kOmTxB9jQjdssVgtST yxsqboanghK7GIPj8iYT7zuFOL2BRpc= ARC-Authentication-Results: i=1; imf04.hostedemail.com; dkim=pass header.d=linux.microsoft.com header.s=default header.b=DlMtgdVr; dmarc=pass (policy=none) header.from=linux.microsoft.com; spf=pass (imf04.hostedemail.com: domain of skinsburskii@linux.microsoft.com designates 13.77.154.182 as permitted sender) smtp.mailfrom=skinsburskii@linux.microsoft.com ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1696458204; a=rsa-sha256; cv=none; b=jT+NIYE1sjZF/AUBZJBerpC5ayWiTvp1M//6j+sVe4ugu1AHP7NOHpbIPgEZrcIjl8obfC TvpgKimViJZL3YF5vVRXzQPt8P0+LA7rTyClhGJIGMrPgim4fyUd7/PpWESmQwlg4xFbJx yvgcsglVsbjxToAHF9Ns1nx99B8JFRY= Received: from skinsburskii. (c-67-170-100-148.hsd1.wa.comcast.net [67.170.100.148]) by linux.microsoft.com (Postfix) with ESMTPSA id 7808420B74C3; Wed, 4 Oct 2023 15:23:22 -0700 (PDT) DKIM-Filter: OpenDKIM Filter v2.11.0 linux.microsoft.com 7808420B74C3 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linux.microsoft.com; s=default; t=1696458202; bh=/kL+2ixzH9Y0/6AQP5r2LCMUwHJ2IksXHQmOSZeRk70=; h=Subject:From:To:Date:In-Reply-To:References:From; b=DlMtgdVrA20cf0WTlXXW5RXqRzynEKABAzw/J5WMThiJUmO+Lc0rmP1Rc1OruUeLB R7bcSK9jKhK4ic0bOrJKyjziPapZ1jp5S6vb0OXKD9z7fYUH0i54ceUbwrJ/9GWA2H 2JA3TqJMbqo7iWRfG6KPnIaG2vLSTnd02Tf9D/w0= Subject: [RFC PATCH v3 2/3] pmpool: Introduce persistent memory pool From: Stanislav Kinsburskii To: tglx@linutronix.de, mingo@redhat.com, bp@alien8.de, dave.hansen@linux.intel.com, x86@kernel.org, hpa@zytor.com, ebiederm@xmission.com, akpm@linux-foundation.org, stanislav.kinsburskii@gmail.com, corbet@lwn.net, linux-kernel@vger.kernel.org, kexec@lists.infradead.org, linux-mm@kvack.org, kys@microsoft.com, jgowans@amazon.com, wei.liu@kernel.org, arnd@arndb.de, gregkh@linuxfoundation.org, graf@amazon.de, pbonzini@redhat.com, bhe@redhat.com, dave.hansen@intel.com, kirill.shutemov@intel.com Date: Wed, 04 Oct 2023 15:23:21 -0700 Message-ID: <169645820185.11424.12461972351107674989.stgit@skinsburskii.> In-Reply-To: <169645773092.11424.7258549771090599226.stgit@skinsburskii.> References: <169645773092.11424.7258549771090599226.stgit@skinsburskii.> User-Agent: StGit/0.19 MIME-Version: 1.0 X-Rspamd-Queue-Id: DBEEC40003 X-Rspam-User: X-Rspamd-Server: rspam05 X-Stat-Signature: np4ohzgk341hc6e8fatuxbq97pofnrbi X-HE-Tag: 1696458203-13074 X-HE-Meta: U2FsdGVkX1/ELNke1182SVgMsn+9EtoBn02fiLetjhpHqAy4vgYMFAqB5FoiMfMt+l/4krItzeUuX39HCgOOXfcpibVI5MXAfeO9GsbAenhZp0Siuqzu0OiVCSDvrMNlJ4QIObE5LjATQhI7KYZVPKKPPl2ngbmLP6QqNOLS6gV+gedfwNeQjvcP2oKhi7op/DBlH6b7zydkMxUvVdn5Ueo9yNkJmMpQ/kleOIg3pa40XCrNcw9hp5Wvc/eG6ndtClE8ObupzZi9EBi0zxb74RoeiH++u2cNl2DMWIKOpjkdG3h9lTUpf0VlKbt4vMPhfWNeAs8L2Ea/vg1nZmsQvVCugdYkte3a3xqGXCuyMnDg8MImGH4owNh5yh89201lL1YS/eHbgwEC7M0q5/hbrOIWw+Ckoeem04lFQBZ1F8Yo7s2WjdCEi0SF7SbIDfc+mDT4S/OkVPGiGBQMAC6A+8pAQK+Xmc0Cb25jzHm4cZEaQhOSEcJKrMRMKsYefqAoM2lBSAhDyNd4vKRr0pv5aI2myLSFvqdaf5IuoOIgqSN6IQOyV1EqZWOpkUWEyrYtbx9yoX/8hI4aOLhSAAGAcU4ps2s6I2rNVt6wKiqDSVYlVEtrIqHGidaqoANJA11/2U2febcD6UBJ1R2YsEHcc59eo5jSyWqXN5hpV/GWOAsqfQCMzsgtVe1QCMnthbxn/Xfj4qlQqxBgXgY7gUMLqOndxdx5MvHG/GTU9JdNwHMdV7RZzr/CA9LBMSz3+3JI5jpjbShGYIebKSXyhLiIx5KTSLx9q6uxvFEDtfiq3LGpJiBuGhpF59Y1K2Spc7odZh11ZdYuFrBx3E0S1PdyL8uf0EcaAaQCGe8Q7bgJ7ZTsYLhXwuVjZ/k3U30By+U1vXWN4UqG/JatR5APqLX27jSLX9dJtvdLGNGhqWUazvRjdNDI2Y4jg4p2AEM3JM/Tv3cv/XMs+8MEogUDZ1a 2yw6Zlzk 3LBpnHj1T01gktp8rfarahtfGeogSv8ylEeK9hkaZNyMzcB8FVt6zO3lzKwa7D+Ifw7mRm/PiGR/S0I3XIQM4Z4LnIQjcKOdczqUtCrDSY7c9R/UDbeWzOh2131FVdXbINXCAVTvgcY4sTTj121lOyHkGhmS99Lcj9vN/SfLbal5D5y2CwH/IuT75c/WL9ZprSb/oj3x+GXuv3qpVnXtKJ4jCNTGM7HcECfhWP4j1s9sOuHwlRLVdxgGQabxqYhho9OgnMRVH4kA9iGSQ2VC1JkFUuYbAM8x0GXtnl1TCmxJpXxRl0oMWuUF7bg== 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: This patch introduces a memory allocator specifically tailored for persistent memory within the kernel. The allocator maintains kernel-specific states like DMA passthrough device states, IOMMU state, and more across kexec. The current implementation provides a foundation for custom solutions that may be developed in the future. Although the design is kept concise and straightforward to encourage discussion and feedback, it remains fully functional. The persistent memory pool builds upon the continuous memory allocator (CMA) and ensures CMA state persistency across kexec by incorporating the CMA bitmap into the memory region. Potential applications include: 1. Enabling various in-kernel entities to allocate persistent pages from a unified memory pool, obviating the need for reserving multiple regions. 2. For in-kernel components that need the allocation address to be retained on kernel kexec, this address can be exposed to user space and subsequently passed through the command line. 3. Distinct subsystems or drivers can set aside their region, allocating a segment for their persistent memory pool, suitable for uses such as file systems, key-value stores, and other applications. Signed-off-by: Stanislav Kinsburskii --- include/linux/pmpool.h | 22 +++++++++ mm/Kconfig | 8 +++ mm/Makefile | 1 mm/pmpool.c | 115 ++++++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 146 insertions(+) create mode 100644 include/linux/pmpool.h create mode 100644 mm/pmpool.c diff --git a/include/linux/pmpool.h b/include/linux/pmpool.h new file mode 100644 index 000000000000..b41f16fa9660 --- /dev/null +++ b/include/linux/pmpool.h @@ -0,0 +1,22 @@ +/* SPDX-License-Identifier: GPL-2.0 */ + +#ifndef _PMPOOL_H +#define _PMPOOL_H + +struct page; + +#if defined(CONFIG_PMPOOL) +struct page *pmpool_alloc(unsigned long count); +bool pmpool_release(struct page *pages, unsigned long count); +#else +static inline struct page *pmpool_alloc(unsigned long count) +{ + return NULL; +} +static inline bool pmpool_release(struct page *pages, unsigned long count) +{ + return false; +} +#endif + +#endif /* _PMPOOL_H */ diff --git a/mm/Kconfig b/mm/Kconfig index 09130434e30d..e7c10094fb10 100644 --- a/mm/Kconfig +++ b/mm/Kconfig @@ -922,6 +922,14 @@ config CMA_AREAS If unsure, leave the default value "7" in UMA and "19" in NUMA. +config PMPOOL + bool "Persistent memory pool support" + select CMA + help + This option adds support for CMA-based persistent memory pool + feature, which provides pages allocation and freeing from a set of + persistent memory ranges, deposited to the memory pool. + config MEM_SOFT_DIRTY bool "Track memory changes" depends on CHECKPOINT_RESTORE && HAVE_ARCH_SOFT_DIRTY && PROC_FS diff --git a/mm/Makefile b/mm/Makefile index 678530a07326..8d3579e58c2c 100644 --- a/mm/Makefile +++ b/mm/Makefile @@ -139,3 +139,4 @@ obj-$(CONFIG_IO_MAPPING) += io-mapping.o obj-$(CONFIG_HAVE_BOOTMEM_INFO_NODE) += bootmem_info.o obj-$(CONFIG_GENERIC_IOREMAP) += ioremap.o obj-$(CONFIG_SHRINKER_DEBUG) += shrinker_debug.o +obj-$(CONFIG_PMPOOL) += pmpool.o diff --git a/mm/pmpool.c b/mm/pmpool.c new file mode 100644 index 000000000000..c74f09b99283 --- /dev/null +++ b/mm/pmpool.c @@ -0,0 +1,115 @@ +// SPDX-License-Identifier: GPL-2.0 + +#define pr_fmt(fmt) "pmpool: " fmt + +#include +#include +#include +#include +#include +#include +#include +#include + +#include "cma.h" + +struct pmpool { + struct resource resource; + struct cma *cma; +}; + +static struct pmpool *default_pmpool; + +bool pmpool_release(struct page *pages, unsigned long count) +{ + if (!default_pmpool) + return false; + + return cma_release(default_pmpool->cma, pages, count); +} + +struct page *pmpool_alloc(unsigned long count) +{ + if (!default_pmpool) + return NULL; + + return cma_alloc(default_pmpool->cma, count, 0, true); +} + +static void pmpool_cma_accomodate_bitmap(struct cma *cma) +{ + unsigned long bitmap_size; + + bitmap_free(cma->bitmap); + cma->bitmap = phys_to_virt(PFN_PHYS(cma->base_pfn)); + + bitmap_size = BITS_TO_LONGS(cma_bitmap_maxno(cma)); + memset(cma->bitmap, 0, bitmap_size); + bitmap_set(cma->bitmap, 0, PAGE_ALIGN(bitmap_size) >> PAGE_SHIFT); + + pr_info("CMA bitmap moved to %#llx\n", virt_to_phys(cma->bitmap)); +} + +static int __init default_pmpool_fixup(void) +{ + if (!default_pmpool) + return 0; + + if (insert_resource(&iomem_resource, &default_pmpool->resource)) + pr_err("failed to insert resource\n"); + + pmpool_cma_accomodate_bitmap(default_pmpool->cma); + return 0; +} +postcore_initcall(default_pmpool_fixup); + +static int __init parse_pmpool_opt(char *str) +{ + static struct pmpool pmpool = { + .resource = { + .name = "Persistent Memory Pool", + .flags = IORESOURCE_BUSY | IORESOURCE_SYSTEM_RAM, + .desc = IORES_DESC_CXL + } + }; + phys_addr_t base, size, end; + int err; + + /* Format is pmpool=, */ + base = memparse(str, &str); + size = memparse(str + 1, NULL); + end = base + size - 1; + + err = memblock_is_region_reserved(base, size); + if (err) { + pr_err("memory block overlaps with another one: %d\n", err); + return 0; + } + + err = memblock_reserve(base, size); + if (err) { + pr_err("failed to reserve memory block: %d\n", err); + return 0; + } + + err = cma_init_reserved_mem(base, size, 0, "pmpool", &pmpool.cma); + if (err) { + pr_err("failed to initialize CMA: %d\n", err); + goto free_memblock; + } + + pmpool.resource.start = base; + pmpool.resource.end = end; + + pr_info("default memory pool is created: %#llx-%#llx\n", + base, end); + + default_pmpool = &pmpool; + + return 0; + +free_memblock: + memblock_phys_free(base, size); + return 0; +} +early_param("pmpool", parse_pmpool_opt); From patchwork Wed Oct 4 22:23:27 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Stanislav Kinsburskii X-Patchwork-Id: 13409629 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 7F6A7E936EA for ; Wed, 4 Oct 2023 22:23:32 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id 10B146B0254; Wed, 4 Oct 2023 18:23:32 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id 0BBE46B0255; Wed, 4 Oct 2023 18:23:32 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id E9E0E6B0256; Wed, 4 Oct 2023 18:23:31 -0400 (EDT) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0017.hostedemail.com [216.40.44.17]) by kanga.kvack.org (Postfix) with ESMTP id D7C8A6B0254 for ; Wed, 4 Oct 2023 18:23:31 -0400 (EDT) Received: from smtpin15.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay05.hostedemail.com (Postfix) with ESMTP id AA5E340126 for ; Wed, 4 Oct 2023 22:23:31 +0000 (UTC) X-FDA: 81309206622.15.8BA7FE4 Received: from linux.microsoft.com (linux.microsoft.com [13.77.154.182]) by imf18.hostedemail.com (Postfix) with ESMTP id E9B391C001C for ; Wed, 4 Oct 2023 22:23:29 +0000 (UTC) Authentication-Results: imf18.hostedemail.com; dkim=pass header.d=linux.microsoft.com header.s=default header.b=axnzA+IE; dmarc=pass (policy=none) header.from=linux.microsoft.com; spf=pass (imf18.hostedemail.com: domain of skinsburskii@linux.microsoft.com designates 13.77.154.182 as permitted sender) smtp.mailfrom=skinsburskii@linux.microsoft.com ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1696458210; h=from:from:sender:reply-to:subject:subject:date:date: message-id:message-id:to:to: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=GwlOK8b41ZMX6FlX17PSaZUjynXX2Y2dfZVQs+XIzFQ=; b=3diAJ1QWB60bhyscki9WJyX55Srma6Ty7Ew9LCDyoeyeXTA328gvtlpfYMKsfr44+lxUDW 0P3ZN3Pat1cyXOAOui5gOADiWXGXFwiiQ2VGNrKKau3R4su4fsj65118axl6k0tL/z02be wmHmzYRFPr44kepHI3vLJT8GUVlVPA0= ARC-Authentication-Results: i=1; imf18.hostedemail.com; dkim=pass header.d=linux.microsoft.com header.s=default header.b=axnzA+IE; dmarc=pass (policy=none) header.from=linux.microsoft.com; spf=pass (imf18.hostedemail.com: domain of skinsburskii@linux.microsoft.com designates 13.77.154.182 as permitted sender) smtp.mailfrom=skinsburskii@linux.microsoft.com ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1696458210; a=rsa-sha256; cv=none; b=5VnMwYpxUNklEyoCtb0KakAoG+HcNcnKCYMzgYNIKDq6DG9cCda2vjtZOsumeRT7eS9VkV GiuJukZ5tpqTG+fyxGblZbo9XLGDf9HrKwKX25nQEhDlP3tDRMRLM3wC+S/g/oKrTNkyII 8Wdo3eWKUWnajaiDshWe789+Bi5WMsU= Received: from skinsburskii. (c-67-170-100-148.hsd1.wa.comcast.net [67.170.100.148]) by linux.microsoft.com (Postfix) with ESMTPSA id 5BE9120B74C2; Wed, 4 Oct 2023 15:23:28 -0700 (PDT) DKIM-Filter: OpenDKIM Filter v2.11.0 linux.microsoft.com 5BE9120B74C2 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linux.microsoft.com; s=default; t=1696458208; bh=GwlOK8b41ZMX6FlX17PSaZUjynXX2Y2dfZVQs+XIzFQ=; h=Subject:From:To:Date:In-Reply-To:References:From; b=axnzA+IECu/ui4Tf2+4LzIpRwRNobJZ7f/opucsDIpIfIY5FHNrKIswtqpqXETsE8 tnvkKFLIw9xy27zm/T2uFcTCyWA7egEgshtkPXI9nGz8ibpV2r0nkd901pNXF1ehLo +NYpWXf+TF4LlsQY2gfr02aV2b5lYXcuLvXId7g8= Subject: [RFC PATCH v3 3/3] pmpool: Mark reserved range as "kernel reserved" in kexec e820 table From: Stanislav Kinsburskii To: tglx@linutronix.de, mingo@redhat.com, bp@alien8.de, dave.hansen@linux.intel.com, x86@kernel.org, hpa@zytor.com, ebiederm@xmission.com, akpm@linux-foundation.org, stanislav.kinsburskii@gmail.com, corbet@lwn.net, linux-kernel@vger.kernel.org, kexec@lists.infradead.org, linux-mm@kvack.org, kys@microsoft.com, jgowans@amazon.com, wei.liu@kernel.org, arnd@arndb.de, gregkh@linuxfoundation.org, graf@amazon.de, pbonzini@redhat.com, bhe@redhat.com, dave.hansen@intel.com, kirill.shutemov@intel.com Date: Wed, 04 Oct 2023 15:23:27 -0700 Message-ID: <169645820784.11424.922048380402402210.stgit@skinsburskii.> In-Reply-To: <169645773092.11424.7258549771090599226.stgit@skinsburskii.> References: <169645773092.11424.7258549771090599226.stgit@skinsburskii.> User-Agent: StGit/0.19 MIME-Version: 1.0 X-Rspamd-Queue-Id: E9B391C001C X-Rspam-User: X-Rspamd-Server: rspam04 X-Stat-Signature: wfg7euypnziknp1ksggj36nao3n7futf X-HE-Tag: 1696458209-758976 X-HE-Meta: U2FsdGVkX1+Jh1xgUKDcaT4j6ZfFrhXMxVSEququ0ivR4fIe/om7mRFnlejitXCTDeppf+e7PlkSJNmd14ol6b63VIEUuWgJcGH0STkEKssYPvx3+XRz3zRaRMYw8vwRrzSgX8hN3H3bMgKk3mjSq0/7JgDscDqJVmLjXHnV240H/XDmG2xaV5sgPeCNPQpX0JPdcg+YpxXaldlCpM/iv1kbnJ2d6JFOqvkSFdbF6IrEHxNiTdB1rA35/LNAfR7YlhM9RoyJUEM58v3QJ4OkoM8DIaYDUd4pWvkSd9bCRjsTeI2zykmtpFWFEhfNSgRNMCucKn7m0qvz/jgLQMKEdVhcHUe/xKyKpQop9yEIJwzxFUttGVsOtz+hF9s+ZLqSPE9+YluESI/NKO5iGZm5X9zOOI7GBcnSp7ZAAilz3W4Oo+PzYzRopIlBtl0TH6V0p9GPBk4/vHQosDIFDJF0Y/UlfG+PuXHPMJT1k/3fY/KhQyEmnH6IjAskOtx3Yk/AwUavb41+3Ak07YlAhQBOk2zgIoQGzHX3YWu0H5F9QmN2lKK4O4ez1avNiyFpCpYDLoLP7KWFAVsQdWyySwS1W/QYI5mhcb42jQi572UceApLLhO51HTYVOi14PZcg6e5qALCy++o7Wv/52DECFHtnF0DdJ8DI0rJKCUaNDvjjxBEOdf512Rbi4E61vJm3oVXS1XqTih2RmVlrqlm2NQrr0xnqU4M5eD7ozxRq3WVO9AzQPuiQQA8EAgvl8yghc0ByQfp3XDJfJmfkHJwC+6bAtWLRoIHToFuw0zGTZlMbCRe7JgDvV6QphbzrhFqubSOW3eK5lXTTZXSnP0J4BpUaDdn2JKGzPMkmde/haSRDknrKdCTwH2wXR1iXLP686l6uvPhI908mipdMgZAP3CxQDipcAqLnhc2mSmYWJPRqoaAVXZmxRI21gKj8hFv8x9TzdL7SzGty6MJEVyY7rB wZVDiHV3 7gJB1JEIdnHzbnuKcNR0C8Bo/vJgfbRcww3dWmAN9QP2a5Ymov2/xdcyWNOM3qdglxwpGLlv6oxZAxtRburTOCkx9diaKpOYYmZaqBgaaEq5iDGbYREp6zlVA73SpDoiOzMJqJ0fWwtpexd4bsoKiZAONMWpv0+1wZjojGVh+7qwu6JAMxSW9pEFk5JeLb09/vnXv0yNEzpQEf1Q+PvJbSmrPAAWpXnjvtvPkTnYn9sC/VO98vidCbnwxRNLwmDQ/pFVN8MwOr5HY4jmf4s9e1tKWsMBIlUTeC5zaEo9zCpY5bvHHcGrF1Wiu1w== 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: Update the logic to classify the persistent memory pool in the kexec e820 table as "kernel reserved" when its corresponding e820 region type is "System RAM". Restore the pool when its type is "kernel reserved". This ensures the persistence of the memory pool across kexec operations. Signed-off-by: Stanislav Kinsburskii --- mm/pmpool.c | 50 +++++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 47 insertions(+), 3 deletions(-) diff --git a/mm/pmpool.c b/mm/pmpool.c index c74f09b99283..1e3a2dffc5d3 100644 --- a/mm/pmpool.c +++ b/mm/pmpool.c @@ -11,11 +11,14 @@ #include #include +#include + #include "cma.h" struct pmpool { struct resource resource; struct cma *cma; + bool exists; }; static struct pmpool *default_pmpool; @@ -50,6 +53,18 @@ static void pmpool_cma_accomodate_bitmap(struct cma *cma) pr_info("CMA bitmap moved to %#llx\n", virt_to_phys(cma->bitmap)); } +static void pmpool_cma_restore_bitmap(struct cma *cma) +{ + u64 base; + + base = PFN_PHYS(cma->base_pfn); + + bitmap_free(cma->bitmap); + cma->bitmap = phys_to_virt(base); + + pr_info("CMA bitmap restored to %#llx\n", base); +} + static int __init default_pmpool_fixup(void) { if (!default_pmpool) @@ -58,7 +73,11 @@ static int __init default_pmpool_fixup(void) if (insert_resource(&iomem_resource, &default_pmpool->resource)) pr_err("failed to insert resource\n"); - pmpool_cma_accomodate_bitmap(default_pmpool->cma); + if (default_pmpool->exists) + pmpool_cma_restore_bitmap(default_pmpool->cma); + else + pmpool_cma_accomodate_bitmap(default_pmpool->cma); + return 0; } postcore_initcall(default_pmpool_fixup); @@ -73,7 +92,7 @@ static int __init parse_pmpool_opt(char *str) } }; phys_addr_t base, size, end; - int err; + int err, e820_type; /* Format is pmpool=, */ base = memparse(str, &str); @@ -92,10 +111,33 @@ static int __init parse_pmpool_opt(char *str) return 0; } + e820_type = e820__get_entry_type(base, end); + switch (e820_type) { + case E820_TYPE_RAM: + e820__range_update_kexec(base, size, E820_TYPE_RAM, + E820_TYPE_RESERVED_KERN); + e820__update_table_kexec(); + break; + case E820_TYPE_RESERVED_KERN: + /* + * TODO: there are several assumptions here: + * 1. That the kernel reserved region represents pmpool, + * 2. That the region had the same base and size and + * 3. That the region was properly initialized. + * All these assumptions aren't valid in general case and this + * should be addressed. + */ + pmpool.exists = true; + break; + default: + pr_err("unsupported e820 type: %d\n", e820_type); + goto free_memblock; + } + err = cma_init_reserved_mem(base, size, 0, "pmpool", &pmpool.cma); if (err) { pr_err("failed to initialize CMA: %d\n", err); - goto free_memblock; + goto remove_e820_kexec_range; } pmpool.resource.start = base; @@ -108,6 +150,8 @@ static int __init parse_pmpool_opt(char *str) return 0; +remove_e820_kexec_range: + e820__range_remove_kexec(base, size, E820_TYPE_RESERVED_KERN, 1); free_memblock: memblock_phys_free(base, size); return 0;