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 E10B8C5AE5B for ; Sun, 19 Nov 2023 16:58:45 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id 7B9D26B036C; Sun, 19 Nov 2023 11:58:45 -0500 (EST) Received: by kanga.kvack.org (Postfix, from userid 40) id 76A686B0372; Sun, 19 Nov 2023 11:58:45 -0500 (EST) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 60B026B0374; Sun, 19 Nov 2023 11:58:45 -0500 (EST) 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 4DF2B6B036C for ; Sun, 19 Nov 2023 11:58:45 -0500 (EST) Received: from smtpin03.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay05.hostedemail.com (Postfix) with ESMTP id 2F99040275 for ; Sun, 19 Nov 2023 16:58:45 +0000 (UTC) X-FDA: 81475313010.03.D74DA95 Received: from foss.arm.com (foss.arm.com [217.140.110.172]) by imf16.hostedemail.com (Postfix) with ESMTP id 8F4C8180004 for ; Sun, 19 Nov 2023 16:58:43 +0000 (UTC) Authentication-Results: imf16.hostedemail.com; dkim=none; spf=pass (imf16.hostedemail.com: domain of alexandru.elisei@arm.com designates 217.140.110.172 as permitted sender) smtp.mailfrom=alexandru.elisei@arm.com; dmarc=pass (policy=none) header.from=arm.com ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1700413123; 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-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=hBUSm5x9Dr7yzNHAY/OlM7c+2iWzNajphO/i8Zdq5X8=; b=b0YmapVrl1bDGoFCH9xLcx9GcIGdh0hJOfIuNPY3vJ/NaP2HZirNjt6fOnpBGc0VnHeMg1 rgTou41ykWUDHJ/VwBP+lpnqd9sbFy/ziVOC1wKB/2GWV7Gl3olQ89SfNCkwD5VyUuZaFa T270pKaQ3Ev8FnfhLAaHeVnLjsZC9os= ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1700413123; a=rsa-sha256; cv=none; b=kCxmFT++O+zMe1n+peGMiJQvamoInS4HGpeGVUC3KDWnmT+CazMv8IYD18jL1dcYUqnmkb DEi5ZdbVhfjIgTVjxLzi2BFSFfN64BpVLUjjK/4T1PxJ0kpY4EHNBQ8SLhQC9E79VP0Iai pkV4fG4UieeIVS7YAAxAwdT/RqXBfSg= ARC-Authentication-Results: i=1; imf16.hostedemail.com; dkim=none; spf=pass (imf16.hostedemail.com: domain of alexandru.elisei@arm.com designates 217.140.110.172 as permitted sender) smtp.mailfrom=alexandru.elisei@arm.com; dmarc=pass (policy=none) header.from=arm.com Received: from usa-sjc-imap-foss1.foss.arm.com (unknown [10.121.207.14]) by usa-sjc-mx-foss1.foss.arm.com (Postfix) with ESMTP id 1B42E1476; Sun, 19 Nov 2023 08:59:29 -0800 (PST) Received: from e121798.cable.virginm.net (unknown [172.31.20.19]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPSA id C846B3F6C4; Sun, 19 Nov 2023 08:58:37 -0800 (PST) From: Alexandru Elisei To: catalin.marinas@arm.com, will@kernel.org, oliver.upton@linux.dev, maz@kernel.org, james.morse@arm.com, suzuki.poulose@arm.com, yuzenghui@huawei.com, arnd@arndb.de, akpm@linux-foundation.org, mingo@redhat.com, peterz@infradead.org, juri.lelli@redhat.com, vincent.guittot@linaro.org, dietmar.eggemann@arm.com, rostedt@goodmis.org, bsegall@google.com, mgorman@suse.de, bristot@redhat.com, vschneid@redhat.com, mhiramat@kernel.org, rppt@kernel.org, hughd@google.com Cc: pcc@google.com, steven.price@arm.com, anshuman.khandual@arm.com, vincenzo.frascino@arm.com, david@redhat.com, eugenis@google.com, kcc@google.com, hyesoo.yu@samsung.com, linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org, kvmarm@lists.linux.dev, linux-fsdevel@vger.kernel.org, linux-arch@vger.kernel.org, linux-mm@kvack.org, linux-trace-kernel@vger.kernel.org Subject: [PATCH RFC v2 12/27] arm64: mte: Add tag storage pages to the MIGRATE_CMA migratetype Date: Sun, 19 Nov 2023 16:57:06 +0000 Message-Id: <20231119165721.9849-13-alexandru.elisei@arm.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20231119165721.9849-1-alexandru.elisei@arm.com> References: <20231119165721.9849-1-alexandru.elisei@arm.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Rspamd-Queue-Id: 8F4C8180004 X-Rspam-User: X-Stat-Signature: znm6kiqsia1a4jd3w81hqxmznbqzjtc4 X-Rspamd-Server: rspam03 X-HE-Tag: 1700413123-236991 X-HE-Meta: U2FsdGVkX18hg1UBcFifFmLInlUNySkUq8AVJqMce4ZZe8aZ2WDH4WRWhXOU/kICtxEZNd+TXmW2PDYkg2dr0hf0bdpoEnNI8PBt6A1byq2r+q6lStSaA4P2xRuBqZl2CTTFPDTs4DaaK0VjdO8/OjlXKxAL8F0UklJ61UasnuR+bZCBVFtbzTQxVhp6/c6HKmZGxofLs4dwpgDZX0L88zNvVx1L4gzuKPi8+ouMt8f/gYwbsxup5mQYNjZCSs94pSWX8LLYxiOugdu54Zw0QFEKqQkP0YBmDtY/MvgN6rz0c0/mpe5o519aBjfq5H0uQGV1mxxiGa4GO+ci53h6Eze7h1VUAL7WVhHv4Xbt3IcVkBLPsEB1O0khH6SifuYhhAunDJuW8iq+Pm1rDIm90RdO35hIM8Pu16srfP7MJxzQUb0helsYlgkERiWwDW8+SkRa56TAYhneIxCeSPc/yfmuUWPxTzdGCWToFq6PJP0i3o2MfCmYILCQK3WdGBudJpefL3/UY0LH4hWibKPpzD2GMYoB++zUhQo3BJ816HxGAytDcEJ40q9Xdc35O+ArGWShWfT8kISWcspkqIdBWvLu/t3qnRzf/aZZj8v5W+xyr3su51Rr5jmwuY23Am/eIS+9z4kjkw604fzYsfxCs45hmq2g6wZwDTmVF6fNTMDNSL+V4fIZYF/t2SS33orGH1CSQmy02GM2pKxiWuW8ACH26y0eWUnJ1G3HtJLH4L8xi6HkGmFNSdLvJbPwijieho6ExsCuq2tZS6i579Rv933d3V3z+SZLiFOJ8FYnVEHhhfoRI1JdbVTxZjDhQvDJ7OQv76IwvjN/Z6Etyx12z9VeOmDw1fzzqf8CFoZThZOSBpDav85FNhBzG6MMzpWxCQvw61A67lrf1uNPvcIg4zhktYMPVbmZRF+k0Fp//JReCDBMP6z0MeLnu9D7O08Kv6zASfTSwjV68i1OdSF js0kQO4Q efoeL1vGWYG2qdnk3s5ek99FQacNnX6NLEtHgFqGMxjXOJXS4mYmvcxrjYqctNw+rqU5fS7t6JuSSpypD2kNJwy3fUEkpu4mx4TgO6e1AkAa5RGyOMvr6uabLDRYLfq4wVVQQCXK72pgkB6UPMXRBUQAcUP2IWDUXU7CmyLQ0rhdGeQorWGle8lDJnnhTBVlb9w++RzxEl3li0+Q= 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: Add the MTE tag storage pages to the MIGRATE_CMA migratetype, which allows the page allocator to manage them like regular pages. Ths migratype lends the pages some very desirable properties: * They cannot be longterm pinned, meaning they will always be migratable. * The pages can be allocated explicitely by using their PFN (with alloc_contig_range()) when they are needed to store tags. Signed-off-by: Alexandru Elisei --- arch/arm64/Kconfig | 1 + arch/arm64/kernel/mte_tag_storage.c | 68 +++++++++++++++++++++++++++++ include/linux/mmzone.h | 5 +++ mm/internal.h | 3 -- 4 files changed, 74 insertions(+), 3 deletions(-) diff --git a/arch/arm64/Kconfig b/arch/arm64/Kconfig index fe8276fdc7a8..047487046e8f 100644 --- a/arch/arm64/Kconfig +++ b/arch/arm64/Kconfig @@ -2065,6 +2065,7 @@ config ARM64_MTE if ARM64_MTE config ARM64_MTE_TAG_STORAGE bool "Dynamic MTE tag storage management" + select CONFIG_CMA help Adds support for dynamic management of the memory used by the hardware for storing MTE tags. This memory, unlike normal memory, cannot be diff --git a/arch/arm64/kernel/mte_tag_storage.c b/arch/arm64/kernel/mte_tag_storage.c index fa6267ef8392..427f4f1909f3 100644 --- a/arch/arm64/kernel/mte_tag_storage.c +++ b/arch/arm64/kernel/mte_tag_storage.c @@ -5,10 +5,12 @@ * Copyright (C) 2023 ARM Ltd. */ +#include #include #include #include #include +#include #include #include #include @@ -189,6 +191,14 @@ static int __init fdt_init_tag_storage(unsigned long node, const char *uname, return ret; } + /* Pages are managed in pageblock_nr_pages chunks */ + if (!IS_ALIGNED(tag_range->start | range_len(tag_range), pageblock_nr_pages)) { + pr_err("Tag storage region 0x%llx-0x%llx not aligned to pageblock size 0x%llx", + PFN_PHYS(tag_range->start), PFN_PHYS(tag_range->end), + PFN_PHYS(pageblock_nr_pages)); + return -EINVAL; + } + ret = tag_storage_get_memory_node(node, &mem_node); if (ret) return ret; @@ -254,3 +264,61 @@ void __init mte_tag_storage_init(void) pr_info("MTE tag storage region management disabled"); } } + +static int __init mte_tag_storage_activate_regions(void) +{ + phys_addr_t dram_start, dram_end; + struct range *tag_range; + unsigned long pfn; + int i, ret; + + if (num_tag_regions == 0) + return 0; + + dram_start = memblock_start_of_DRAM(); + dram_end = memblock_end_of_DRAM(); + + for (i = 0; i < num_tag_regions; i++) { + tag_range = &tag_regions[i].tag_range; + /* + * Tag storage region was clipped by arm64_bootmem_init() + * enforcing addressing limits. + */ + if (PFN_PHYS(tag_range->start) < dram_start || + PFN_PHYS(tag_range->end) >= dram_end) { + pr_err("Tag storage region 0x%llx-0x%llx outside addressable memory", + PFN_PHYS(tag_range->start), PFN_PHYS(tag_range->end)); + ret = -EINVAL; + goto out_disabled; + } + } + + /* + * MTE disabled, tag storage pages can be used like any other pages. The + * only restriction is that the pages cannot be used by kexec because + * the memory remains marked as reserved in the memblock allocator. + */ + if (!system_supports_mte()) { + for (i = 0; i< num_tag_regions; i++) { + tag_range = &tag_regions[i].tag_range; + for (pfn = tag_range->start; pfn <= tag_range->end; pfn++) + free_reserved_page(pfn_to_page(pfn)); + } + ret = 0; + goto out_disabled; + } + + for (i = 0; i < num_tag_regions; i++) { + tag_range = &tag_regions[i].tag_range; + for (pfn = tag_range->start; pfn <= tag_range->end; pfn += pageblock_nr_pages) + init_cma_reserved_pageblock(pfn_to_page(pfn)); + totalcma_pages += range_len(tag_range); + } + + return 0; + +out_disabled: + pr_info("MTE tag storage region management disabled"); + return ret; +} +arch_initcall(mte_tag_storage_activate_regions); diff --git a/include/linux/mmzone.h b/include/linux/mmzone.h index 3c25226beeed..15f81429e145 100644 --- a/include/linux/mmzone.h +++ b/include/linux/mmzone.h @@ -83,6 +83,11 @@ static inline bool is_migrate_movable(int mt) return is_migrate_cma(mt) || mt == MIGRATE_MOVABLE; } +#ifdef CONFIG_CMA +/* Free whole pageblock and set its migration type to MIGRATE_CMA. */ +void init_cma_reserved_pageblock(struct page *page); +#endif + /* * Check whether a migratetype can be merged with another migratetype. * diff --git a/mm/internal.h b/mm/internal.h index b61034bd50f5..ddf6bb6c6308 100644 --- a/mm/internal.h +++ b/mm/internal.h @@ -539,9 +539,6 @@ isolate_migratepages_range(struct compact_control *cc, int __alloc_contig_migrate_range(struct compact_control *cc, unsigned long start, unsigned long end); -/* Free whole pageblock and set its migration type to MIGRATE_CMA. */ -void init_cma_reserved_pageblock(struct page *page); - #endif /* CONFIG_COMPACTION || CONFIG_CMA */ int find_suitable_fallback(struct free_area *area, unsigned int order, -- 2.42.1