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 CABE1C072A2 for ; Sun, 19 Nov 2023 16:59:43 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id 634406B039E; Sun, 19 Nov 2023 11:59:43 -0500 (EST) Received: by kanga.kvack.org (Postfix, from userid 40) id 5E5616B03A1; Sun, 19 Nov 2023 11:59:43 -0500 (EST) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 4D36A6B03A2; Sun, 19 Nov 2023 11:59:43 -0500 (EST) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0010.hostedemail.com [216.40.44.10]) by kanga.kvack.org (Postfix) with ESMTP id 3C4306B039E for ; Sun, 19 Nov 2023 11:59:43 -0500 (EST) Received: from smtpin30.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay10.hostedemail.com (Postfix) with ESMTP id 0DFE8C04CF for ; Sun, 19 Nov 2023 16:59:43 +0000 (UTC) X-FDA: 81475315446.30.E19C235 Received: from foss.arm.com (foss.arm.com [217.140.110.172]) by imf27.hostedemail.com (Postfix) with ESMTP id 5B94A40014 for ; Sun, 19 Nov 2023 16:59:41 +0000 (UTC) Authentication-Results: imf27.hostedemail.com; dkim=none; spf=pass (imf27.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=1700413181; 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=qr+8lYp46G0rpzP2a+88Ojv+qWKvdOc01LWMAhJoicw=; b=LEsm17MCicmt245dJQLu2vHdH8tRL8aCvNeMoJEsxvB+l8qMJdow1KV8RNdxMub914GA72 Dj12Jxcuqf7WafZqtPh2KZodfbsU5kzfzNNs6wB/zbwowKL+tMcD9BG2FULoI8Q2swyF90 CRTqNwOsyf8OWCaRKkHlbTFVe8NyQi4= ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1700413181; a=rsa-sha256; cv=none; b=V2pmQc5+lDhv4i9yECwDoqJYMoM18eAQzwm2c7kL+PECETYYHgCQQ/yCnQ6Zg4FyuQZjef jZXSpqFdHOZWNnWm8cOP6V4teCDcLD4Laxufd8BgApFRL9BWVzXvrFQ6qwg+E7ANztUXFu Gai6e8+dLtLFTMNM0pug1J126ZvuDHQ= ARC-Authentication-Results: i=1; imf27.hostedemail.com; dkim=none; spf=pass (imf27.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 E785F1480; Sun, 19 Nov 2023 09:00:26 -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 B408D3F6C4; Sun, 19 Nov 2023 08:59:35 -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 23/27] arm64: mte: copypage: Handle tag restoring when missing tag storage Date: Sun, 19 Nov 2023 16:57:17 +0000 Message-Id: <20231119165721.9849-24-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-Stat-Signature: hp9kb4wwx3q4u1up1bcpbr38i5m1tjie X-Rspamd-Server: rspam10 X-Rspamd-Queue-Id: 5B94A40014 X-Rspam-User: X-HE-Tag: 1700413181-375709 X-HE-Meta: U2FsdGVkX1+CBro1MRmabSyVMxlnSp3XMOM2NTQzCnJK8PC43EMgpQvo8XNJYNvzCSCE9qybxEaTMTEpdSkR2ka3leS+KvbXBfnaDkyetsHZUNR5TasKTHKrDOD7dHfcPdyKzhhFO8E4AKhjE9Vng1wWfI4qFIg8Cw8s9kYDs3+/iBwPoOmojrbvli23oAzAdjxvF7jA42X+lpz8k/ciO+TKeB4X7eirFZs3RhCmln3sTRir24be5lTAMk1gQ09lYVe+OZld/SmHXZRz/zDEl7ycjmGeHCau4XWfzbdEpBDoQ2gtHSGVIFeuSoGV/teHhruKlmrukmppHPw3sPswSCSHTEekrvt6L1vtH7y5Hx4VileRKSs76qYhgQyDD0uMatAwi5x6dqiFa8HPm8uKYFK7+CHZE3xkkwfw5EQBhBxrHaReBc6VrdyQlz+OMbNqKf/XWSl02JHDMDD3jA3EbYDfv8ru5dhpIleCKLnUT9L1mtV1O1noDQAMYhmOc1n4ZexTwdFRorTwV3tfJT9248wVPfr/mIC6fJz2PmAZfj9vqAuKODmyU/hPjNsHMiZ8mbH1S7hE6Xf3fjhBjIAS8J7opxQKuQiyHt6iAlWpn2YxEi/uyfGFLfcotZMjz8H/+Yom3dCgp7lg80rc3qVY2Gonz02ZusAvgxvssC0M0s4XF8xSfRScJdmO72o++Mvx4ZlTUiBsW0NYuAmUsILwKHfRj+HIlIYL6fK3up0tWrgRHIOcPB0ORUG+BB8xAzEtvQY/qpbj7+GFbe69yMKQFV1qVUli/1G4ttcVHXL1BnYAdsbhzzOvFXUrQly85U7yxAmJLVX9sVppgiNayzcU4x9v33O8Nld1gX31HRKIwFKMiArtdD+cmNvhlTieFcatoAe37337uRIr4WkzFjUixPlInSkYOhLanzqjzpDHpeGA4023qQWvFRhhOcqInfPwFvWkh+sYGgub4/eY40M pC4XeE+u FkCalUcb2f3vH6v/9eXxmNxz4U1tBxj3/hdLLQlYEDnhlRImrzt9a0bpInWIDl+Io5GSZmC5gmIfzXpiJPnNwJMHbsvbFwkhKE7SDf6MRQ/TI+ubgmeY8KbTm+7Vd8U60uF12PTQ2q9t0rG9f2QAnqPxB3SDoOwDKCucM7uEqWn0dmGzYucWluJyfrmfchCLRvZCS 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: There are several situations where copy_highpage() can end up copying tags to a page which doesn't have its tag storage reserved. One situation involves migration racing with mprotect(PROT_MTE): VMA is initially untagged, migration starts and destination page is allocated as untagged, mprotect(PROT_MTE) changes the VMA to tagged and userspace accesses the source page, thus making it tagged. The migration code then calls copy_highpage(), which will copy the tags from the source page (now tagged) to the destination page (allocated as untagged). Yes another situation can happen during THP collapse. The huge page that will replace the HPAGE_PMD_NR contiguous mapped pages is allocated with __GFP_TAGGED not set. copy_highpage() will copy the tags from the pages being replaced to the huge page which doesn't have tag storage reserved. The situation gets even more complicated when the replacement huge page is a tag storage page. The tag storage huge page will be migrated after a fault on access, but the tags from the original pages must be copied over to the huge page that will be replacing the tag storage huge page. Signed-off-by: Alexandru Elisei --- arch/arm64/mm/copypage.c | 59 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 59 insertions(+) diff --git a/arch/arm64/mm/copypage.c b/arch/arm64/mm/copypage.c index a7bb20055ce0..7899f38773b9 100644 --- a/arch/arm64/mm/copypage.c +++ b/arch/arm64/mm/copypage.c @@ -13,6 +13,62 @@ #include #include #include +#include + +#ifdef CONFIG_ARM64_MTE_TAG_STORAGE +static inline bool try_transfer_saved_tags(struct page *from, struct page *to) +{ + void *tags; + bool saved; + + VM_WARN_ON_ONCE(!preemptible()); + + if (page_mte_tagged(from)) { + if (likely(page_tag_storage_reserved(to))) + return false; + + tags = mte_allocate_tag_buf(); + if (WARN_ON(!tags)) + return true; + + mte_copy_page_tags_to_buf(page_address(from), tags); + saved = mte_save_tags_for_pfn(tags, page_to_pfn(to)); + if (!saved) + mte_free_tag_buf(tags); + + return saved; + } + + if (likely(!page_is_tag_storage(from))) + return false; + + tags_by_pfn_lock(); + tags = mte_erase_tags_for_pfn(page_to_pfn(from)); + tags_by_pfn_unlock(); + + if (likely(!tags)) + return false; + + if (page_tag_storage_reserved(to)) { + WARN_ON_ONCE(!try_page_mte_tagging(to)); + mte_copy_page_tags_from_buf(page_address(to), tags); + set_page_mte_tagged(to); + mte_free_tag_buf(tags); + return true; + } + + saved = mte_save_tags_for_pfn(tags, page_to_pfn(to)); + if (!saved) + mte_free_tag_buf(tags); + + return saved; +} +#else +static inline bool try_transfer_saved_tags(struct page *from, struct page *to) +{ + return false; +} +#endif void copy_highpage(struct page *to, struct page *from) { @@ -24,6 +80,9 @@ void copy_highpage(struct page *to, struct page *from) if (kasan_hw_tags_enabled()) page_kasan_tag_reset(to); + if (tag_storage_enabled() && try_transfer_saved_tags(from, to)) + return; + if (system_supports_mte() && page_mte_tagged(from)) { /* It's a new page, shouldn't have been tagged yet */ WARN_ON_ONCE(!try_page_mte_tagging(to)); -- 2.42.1