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 C9630CDB483 for ; Mon, 16 Oct 2023 23:32:47 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id 4A0368D00D2; Mon, 16 Oct 2023 19:32:39 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id 40C4D8D00B8; Mon, 16 Oct 2023 19:32:39 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 2A1C98D00D2; Mon, 16 Oct 2023 19:32:39 -0400 (EDT) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0016.hostedemail.com [216.40.44.16]) by kanga.kvack.org (Postfix) with ESMTP id 104568D00B8 for ; Mon, 16 Oct 2023 19:32:39 -0400 (EDT) Received: from smtpin27.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay09.hostedemail.com (Postfix) with ESMTP id DA52D80A79 for ; Mon, 16 Oct 2023 23:32:38 +0000 (UTC) X-FDA: 81352926396.27.F7630BB Received: from linux.microsoft.com (linux.microsoft.com [13.77.154.182]) by imf06.hostedemail.com (Postfix) with ESMTP id DA1C3180008 for ; Mon, 16 Oct 2023 23:32:36 +0000 (UTC) Authentication-Results: imf06.hostedemail.com; dkim=pass header.d=linux.microsoft.com header.s=default header.b=Yt8+5vTS; dmarc=pass (policy=none) header.from=linux.microsoft.com; spf=pass (imf06.hostedemail.com: domain of madvenka@linux.microsoft.com designates 13.77.154.182 as permitted sender) smtp.mailfrom=madvenka@linux.microsoft.com ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1697499157; h=from:from:sender:reply-to:subject:subject:date:date: message-id:message-id:to:to:cc:mime-version:mime-version:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references:dkim-signature; bh=7Kg0kDVRT4XUsyYitTfP8a+YwKQXAgc1KQikAOX3WAY=; b=Z20fTlHf7yadkm9Y/fRYRRIlxAol2tcYujm1hXAEVoWnCL50eW7xUn2Yr0Iosjl/kkukID ZuR28RRyAgR/ivmOCTRi4BnXtPk7STgjxz5GVkdEi4cm5h4/bsiKEJh63LpgigCYmL7bbo OdiF5O1/505G95PW2OYyUwXLpaFiSLA= ARC-Authentication-Results: i=1; imf06.hostedemail.com; dkim=pass header.d=linux.microsoft.com header.s=default header.b=Yt8+5vTS; dmarc=pass (policy=none) header.from=linux.microsoft.com; spf=pass (imf06.hostedemail.com: domain of madvenka@linux.microsoft.com designates 13.77.154.182 as permitted sender) smtp.mailfrom=madvenka@linux.microsoft.com ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1697499157; a=rsa-sha256; cv=none; b=2XZBNlinr/kc3oS/eU0jMaVfgq9/N5e5IhRoo1ORFlJek7GBCxiZldYI4BNADr9mlaVx/h 1pR6cS3Z06Ft+sTQhgR9UQB34kgXU5MFgsCw82Sioo1My9G5RXeP4meGwXm2yF8SRioy8K lLEuPyMAfMemQsZHdU0mPzKww+dg9+o= Received: from localhost.localdomain (unknown [47.186.13.91]) by linux.microsoft.com (Postfix) with ESMTPSA id 628DF20B74C4; Mon, 16 Oct 2023 16:32:35 -0700 (PDT) DKIM-Filter: OpenDKIM Filter v2.11.0 linux.microsoft.com 628DF20B74C4 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linux.microsoft.com; s=default; t=1697499156; bh=7Kg0kDVRT4XUsyYitTfP8a+YwKQXAgc1KQikAOX3WAY=; h=From:To:Subject:Date:In-Reply-To:References:From; b=Yt8+5vTSKf0oAErSwOtHn6FQjCOGeLisGeuub6q/djLn2p+T5pP7eOxRYSGmL6t3n rmGVIM80mpjIhbpqL9f/XXorAr0bZQkq3mlx1BLzOZNid96fWsO7hN5QGHtO+eT2SX zBHgeRKFsB0wU1vyi0WE4hJoh3zRyfs5hhdvcEsQ= From: madvenka@linux.microsoft.com To: gregkh@linuxfoundation.org, pbonzini@redhat.com, rppt@kernel.org, jgowans@amazon.com, graf@amazon.de, arnd@arndb.de, keescook@chromium.org, stanislav.kinsburskii@gmail.com, anthony.yznaga@oracle.com, linux-mm@kvack.org, linux-kernel@vger.kernel.org, madvenka@linux.microsoft.com, jamorris@linux.microsoft.com Subject: [RFC PATCH v1 04/10] mm/prmem: Implement a page allocator for persistent memory Date: Mon, 16 Oct 2023 18:32:09 -0500 Message-Id: <20231016233215.13090-5-madvenka@linux.microsoft.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20231016233215.13090-1-madvenka@linux.microsoft.com> References: <1b1bc25eb87355b91fcde1de7c2f93f38abb2bf9> <20231016233215.13090-1-madvenka@linux.microsoft.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Rspamd-Server: rspam09 X-Rspamd-Queue-Id: DA1C3180008 X-Stat-Signature: zy7ayap8a746n3nb5d6gkkamcb5pfq1d X-Rspam-User: X-HE-Tag: 1697499156-192117 X-HE-Meta: U2FsdGVkX1+VZKxp/S1sR02KvUNRFLgrVM6kC4ttZHMmEOo5zejglVFfxbxjx/y3PWXeJSbQjZ3gVXfCilezCRfAW/H/JHjmLcB2auE9zmS43+f0I5ZrqvC44FLz5dpo2IRzwp+XmGDKQ/ubxdN1F7mevfWlbxbCRgYQlYEACR03N2eg7vvhApNrCD6zS+LFOqtE2nUOHYgV+y6Idotn0Tc5+Mx0aX1GYlZhvte3J1xphQ0PmKEn742CtU++Y/IHWjT17x8tVV35zuVo6cGYhrvRd0Ya7f1QSSkcK/hksMVz3FNHrNG9qr775DBd2skrh0lOdzXZ9SEQB/TciEzf0jYuGNamStALYLH2CEjEo++ay1+E1oZ1VgSo0up+8bqarxVv4oT6zEIkyPRFk/iqHB5gxKMe8rcGs3iqb2/70nC71maBeaWAG3fNVexOfsvezEhSdc755/HTojH1Tvg+67RnMfjnuCBixd1ORWQh6jMv6JICgJCQaZ0LQhfLLNvcOhUgWniuoCwXZQqhxrlRvkf0vWF6JrgTY84l31h7nXfQ1Y4CZJc/KOnb+pI2WO3YzH7v8il0aV66u7JKFfkiVyTUNCUz+l4ohcNbt/KCWsS7/qLOT6eCjM+sMFFFYRfa8tBa+eEbZiqgpAnNYohIXKxRVtqOkZhYDlaXyc/euHFAsFRZvwkWL0a5/ABp3v/WQQ0+WUuE6KVqcOOXMTl8T9aRY7dedAp3yBVbJJL/aD5mRETblgbXMaQ4/VYgfvdzQp8F94X68NqPbNeqnylnkoavufL2dD+oNJhNUmA17XQbMAvNDTMh5G669ZNoAzHYLywLDLBXld2B18/SIWQxmYVteY+mMuRYEeELoOSqJFLFUSFqm9zLxhk6IL7eoO4C0y2B6WrsPQinnyQneVrzkv5Dn2RkkAaz55rLaZBH75KhuWTvaszUS2+u+0mVmaBEwQyTYUH/nxkuhy8Pz3a MuS2x4bG PxPdVxBs1hJQnIKW9V89p9XF9tDL9XGfCrV8JbikWucE+DMZd7gRQOCFoQyQnHDlQSEiGE43V2AOrDoB+Vffb/k1uI9tBsS8+vYP8G8FdzVPksoe55qCIWs54ijtyAd2niz9tl+cGsKslf4XpGSFYOn3dy6vYxI/l6iB1H6O40fiNFWHbNIud1Hrcb9+J5lfntotPZuHojpBthca1vbM8Y3xfNCk/dYdl97ZyAXEUbz5/6cxPtBzuFyVsxTUIcmMhxbDmR9SsyUkY5XbVxL4oMHHZzOtkcaa7xSt/ndk9mYroD/cGhbpw3n6eQA== 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: From: "Madhavan T. Venkataraman" Define the following convenience wrapper functions for allocating and freeing pages: - prmem_alloc_pages() - prmem_free_pages() The functions look similar to alloc_pages() and __free_pages(). However, the only GFP flag that is processed is __GFP_ZERO to zero out the allocated memory. Signed-off-by: Madhavan T. Venkataraman --- include/linux/prmem.h | 7 ++++ kernel/prmem/Makefile | 1 + kernel/prmem/prmem_allocator.c | 74 ++++++++++++++++++++++++++++++++++ kernel/prmem/prmem_init.c | 2 + 4 files changed, 84 insertions(+) create mode 100644 kernel/prmem/prmem_allocator.c diff --git a/include/linux/prmem.h b/include/linux/prmem.h index f43f5b0d2b9c..108683933c82 100644 --- a/include/linux/prmem.h +++ b/include/linux/prmem.h @@ -75,6 +75,7 @@ extern unsigned long prmem_metadata; extern unsigned long prmem_pa; extern size_t prmem_size; extern bool prmem_inited; +extern spinlock_t prmem_lock; /* Kernel API. */ void prmem_reserve_early(void); @@ -83,11 +84,17 @@ void prmem_init(void); void prmem_fini(void); int prmem_cmdline_size(void); +/* Allocator API. */ +struct page *prmem_alloc_pages(unsigned int order, gfp_t gfp); +void prmem_free_pages(struct page *pages, unsigned int order); + /* Internal functions. */ struct prmem_region *prmem_add_region(unsigned long pa, size_t size); bool prmem_create_pool(struct prmem_region *region, bool new_region); void *prmem_alloc_pool(struct prmem_region *region, size_t size, int align); void prmem_free_pool(struct prmem_region *region, void *va, size_t size); +void *prmem_alloc_pages_locked(unsigned int order); +void prmem_free_pages_locked(void *va, unsigned int order); unsigned long prmem_checksum(void *start, size_t size); bool __init prmem_validate(void); void prmem_cmdline(char *cmdline); diff --git a/kernel/prmem/Makefile b/kernel/prmem/Makefile index 9b0a693bfee1..99bb19f0afd3 100644 --- a/kernel/prmem/Makefile +++ b/kernel/prmem/Makefile @@ -1,3 +1,4 @@ # SPDX-License-Identifier: GPL-2.0 obj-y += prmem_parse.o prmem_reserve.o prmem_init.o prmem_region.o prmem_misc.o +obj-y += prmem_allocator.o diff --git a/kernel/prmem/prmem_allocator.c b/kernel/prmem/prmem_allocator.c new file mode 100644 index 000000000000..07a5a430630c --- /dev/null +++ b/kernel/prmem/prmem_allocator.c @@ -0,0 +1,74 @@ +// SPDX-License-Identifier: GPL-2.0 +/* + * Persistent-Across-Kexec memory feature (prmem) - Allocator. + * + * Copyright (C) 2023 Microsoft Corporation + * Author: Madhavan T. Venkataraman (madvenka@linux.microsoft.com) + */ +#include + +/* Page Allocation functions. */ + +void *prmem_alloc_pages_locked(unsigned int order) +{ + struct prmem_region *region; + void *va; + size_t size = (1UL << order) << PAGE_SHIFT; + + list_for_each_entry(region, &prmem->regions, node) { + va = prmem_alloc_pool(region, size, size); + if (va) + return va; + } + return NULL; +} + +struct page *prmem_alloc_pages(unsigned int order, gfp_t gfp) +{ + void *va; + size_t size = (1UL << order) << PAGE_SHIFT; + bool zero = !!(gfp & __GFP_ZERO); + + if (!prmem_inited || order > MAX_ORDER) + return NULL; + + spin_lock(&prmem_lock); + va = prmem_alloc_pages_locked(order); + spin_unlock(&prmem_lock); + + if (va) { + if (zero) + memset(va, 0, size); + return virt_to_page(va); + } + return NULL; +} +EXPORT_SYMBOL_GPL(prmem_alloc_pages); + +void prmem_free_pages_locked(void *va, unsigned int order) +{ + struct prmem_region *region; + size_t size = (1UL << order) << PAGE_SHIFT; + void *eva = va + size; + void *region_va; + + list_for_each_entry(region, &prmem->regions, node) { + /* The region structure is at the base of the region memory. */ + region_va = region; + if (va >= region_va && eva <= (region_va + region->size)) { + prmem_free_pool(region, va, size); + return; + } + } +} + +void prmem_free_pages(struct page *pages, unsigned int order) +{ + if (!prmem_inited || order > MAX_ORDER) + return; + + spin_lock(&prmem_lock); + prmem_free_pages_locked(page_to_virt(pages), order); + spin_unlock(&prmem_lock); +} +EXPORT_SYMBOL_GPL(prmem_free_pages); diff --git a/kernel/prmem/prmem_init.c b/kernel/prmem/prmem_init.c index 56df1e6d3ebc..d23833d296fe 100644 --- a/kernel/prmem/prmem_init.c +++ b/kernel/prmem/prmem_init.c @@ -9,6 +9,8 @@ bool prmem_inited; +DEFINE_SPINLOCK(prmem_lock); + void __init prmem_init(void) { if (!prmem) -- 2.25.1