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 1368EC5B552 for ; Fri, 30 May 2025 09:04:46 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id A66AF6B0088; Fri, 30 May 2025 05:04:45 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id A3E166B0089; Fri, 30 May 2025 05:04:45 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 9540B6B008A; Fri, 30 May 2025 05:04:45 -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 7C9C86B0088 for ; Fri, 30 May 2025 05:04:45 -0400 (EDT) Received: from smtpin20.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay02.hostedemail.com (Postfix) with ESMTP id 41460122B22 for ; Fri, 30 May 2025 09:04:45 +0000 (UTC) X-FDA: 83498988930.20.E6E6965 Received: from foss.arm.com (foss.arm.com [217.140.110.172]) by imf20.hostedemail.com (Postfix) with ESMTP id 7A4E61C000F for ; Fri, 30 May 2025 09:04:43 +0000 (UTC) Authentication-Results: imf20.hostedemail.com; dkim=none; spf=pass (imf20.hostedemail.com: domain of dev.jain@arm.com designates 217.140.110.172 as permitted sender) smtp.mailfrom=dev.jain@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=1748595883; 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=ZEMUQQZUL2fjTR0/QHgYz5UYqcVXbfNX4AYnY/4uPmQ=; b=rskwpdIR/E1Ta1jAhXVIwN5grzzTvjmsdby0L7KyfprJ6Dn9XGXKmz2EAYkjYNGwtmw7IG D7hUfpOm4uSAIRI1vKkQ0fRlKLZuNigJD3GyT/09sxtHcnemQ3nnT4IyXWycyJ6ynrVy8T Mop2RaYE058yAK49lBS9cXHteS8FnFY= ARC-Authentication-Results: i=1; imf20.hostedemail.com; dkim=none; spf=pass (imf20.hostedemail.com: domain of dev.jain@arm.com designates 217.140.110.172 as permitted sender) smtp.mailfrom=dev.jain@arm.com; dmarc=pass (policy=none) header.from=arm.com ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1748595883; a=rsa-sha256; cv=none; b=pwmONCOZbjBD65nR/PAEMPcLItSsTNIJr30hjAYusEO7GNg/VmkbvET/UZVzfbe43j2NiA z1m+VI2+5DFaATr8buauL9pKO1TMlgP/unoYaKR6uwDBmiIM2Oi3vQQLJaCroZk3Z33/ua 6aj9NbNHZxodvpExkKD41yr4l78J/JY= 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 3CDAC16F2; Fri, 30 May 2025 02:04:26 -0700 (PDT) Received: from MacBook-Pro.blr.arm.com (unknown [10.164.18.49]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPA id 9ED583F5A1; Fri, 30 May 2025 02:04:37 -0700 (PDT) From: Dev Jain To: akpm@linux-foundation.org, david@redhat.com, catalin.marinas@arm.com, will@kernel.org Cc: lorenzo.stoakes@oracle.com, Liam.Howlett@oracle.com, vbabka@suse.cz, rppt@kernel.org, surenb@google.com, mhocko@suse.com, linux-mm@kvack.org, linux-kernel@vger.kernel.org, suzuki.poulose@arm.com, steven.price@arm.com, gshan@redhat.com, linux-arm-kernel@lists.infradead.org, Dev Jain Subject: [PATCH 2/3] arm64: pageattr: Use walk_page_range_novma() to change memory permissions Date: Fri, 30 May 2025 14:34:06 +0530 Message-Id: <20250530090407.19237-3-dev.jain@arm.com> X-Mailer: git-send-email 2.39.3 (Apple Git-146) In-Reply-To: <20250530090407.19237-1-dev.jain@arm.com> References: <20250530090407.19237-1-dev.jain@arm.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Rspamd-Queue-Id: 7A4E61C000F X-Stat-Signature: 9ozphxqmhd4y93otwgn6bd6rejx16rjc X-Rspam-User: X-Rspamd-Server: rspam04 X-HE-Tag: 1748595883-958818 X-HE-Meta: U2FsdGVkX1+VddPhmENpgb8bDvZwiDLQY18g1pvtVgrtGGShM402jaxFLxhF3C3al/Sh/NZ6vnL9A0ZSKqbZnleT4wSh26IzYV6NBo6/c+Hn0ZxVqG334KaP5iWphd3pT4zOgLpQ3Qjjr1WOl6odaknUwu/kFaK3HNgU6lkWU20z0lvUEgh7awH/+tAavozNrH0RsJ0grDnDZ7M1abQI35IyINGgLAlwQ80FZA3yGnfexTRqGR46MK2l72E4+3cfVLWfOXPr3SfpubU8yRkb6xA1dmHkb3eKyDjNXSKJ0tYz+A/kquAFRpSyu9PR/rsF8WFqOf8ub6DPP44v11klelldBz2Yb6Dtad3F9ckRZawR1za/CQupA8tY07OlgwVihcQ+4CNWcqScK3zSNNx2C4QfYBpnTSBNQoLw6lriEBzGkpQ6KNMktncETytOjJfQfQ5lE42vyZqBzTHlU3Vd2VMEVHkA7WCq45e6s67ID7fNGIipAs90NSHwg2epQnYtGpkdjIK4UHQ2j0KQ0gnLEJI78Hb8IeQjUHYYGR8Xd1IoGOSB4Jv956Fn1Fk0fbT09PMQctWhyaFCmgrkIMjlLoXKqzHx/5CMr44Aq7S0/qMUxl6eWjimUbLNmMifOda5NmEW2R5drKsyCMatFnn8zCSrEPOgpHPEHAIpX0nhNCzb0aN0wEXcqIYxzc18zWyx55dLu8fE7Hk+2ia3R3ANedzOcoZdyNt8wMWTEczpiryHZlZjx4kOFYUxqgExUArvcExpNgIWLwmsIC3w5mihyViSdhtxjE0yFEUANF7Iza/0dcLVGBGGtC8sj72HERrCXsuWBObLIiJHLMfB4e7tylF2vRQ55L1ic5uO5ltB5m3U9Ha2ZDNoHLoq0lugMvrgYLgSXn7veXCO1SRgDhgIGl7yVfA+jyTtNuCf2oZTdL8l07aUFfAWjOQiIR3iP06SzWo8HU4Bttnemfc6ucJ S8//y4GT YWarfO61Br2j8WJ3II7K0NTH2P4nZdeQSjhgd7lENbG2B+mOJnYOoy52QESTOTRGCIx4b/KuVYfIfDB/0Rm7iWJNlyhvMDlmDKJYjatBgVyY76md6yKcYevnZHkEhOuPfIvU9ALctJJxY2RA9oNgzgMB1LzRAKkcMiyliAzUN+KWlFi4cnoZXlUrMghQrKIPzYX0rKQR8FX0bCaCX19/mo0cUcAaBtx0ZZkH8tlbtD88B8eo= 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: Move away from apply_to_page_range(), which does not honour leaf mappings, to walk_page_range_novma(). The callbacks emit a warning and return EINVAL if a partial range is detected. Signed-off-by: Dev Jain --- arch/arm64/mm/pageattr.c | 69 +++++++++++++++++++++++++++++++++++++--- 1 file changed, 64 insertions(+), 5 deletions(-) diff --git a/arch/arm64/mm/pageattr.c b/arch/arm64/mm/pageattr.c index 39fd1f7ff02a..a5c829c64969 100644 --- a/arch/arm64/mm/pageattr.c +++ b/arch/arm64/mm/pageattr.c @@ -8,6 +8,7 @@ #include #include #include +#include #include #include @@ -20,6 +21,67 @@ struct page_change_data { pgprot_t clear_mask; }; +static pteval_t set_pageattr_masks(unsigned long val, struct mm_walk *walk) +{ + struct page_change_data *masks = walk->private; + unsigned long new_val = val; + + new_val &= ~(pgprot_val(masks->clear_mask)); + new_val |= (pgprot_val(masks->set_mask)); + + return new_val; +} + +static int pageattr_pud_entry(pud_t *pud, unsigned long addr, + unsigned long next, struct mm_walk *walk) +{ + pud_t val = pudp_get(pud); + + if (pud_leaf(val)) { + if (WARN_ON_ONCE((next - addr) != PUD_SIZE)) + return -EINVAL; + val = __pud(set_pageattr_masks(pud_val(val), walk)); + set_pud(pud, val); + walk->action = ACTION_CONTINUE; + } + + return 0; +} + +static int pageattr_pmd_entry(pmd_t *pmd, unsigned long addr, + unsigned long next, struct mm_walk *walk) +{ + pmd_t val = pmdp_get(pmd); + + if (pmd_leaf(val)) { + if (WARN_ON_ONCE((next - addr) != PMD_SIZE)) + return -EINVAL; + val = __pmd(set_pageattr_masks(pmd_val(val), walk)); + set_pmd(pmd, val); + walk->action = ACTION_CONTINUE; + } + + return 0; +} + +static int pageattr_pte_entry(pte_t *pte, unsigned long addr, + unsigned long next, struct mm_walk *walk) +{ + pte_t val = ptep_get(pte); + + val = __pte(set_pageattr_masks(pte_val(val), walk)); + set_pte(pte, val); + + return 0; +} + +static const struct mm_walk_ops pageattr_ops = { + .pud_entry = pageattr_pud_entry, + .pmd_entry = pageattr_pmd_entry, + .pte_entry = pageattr_pte_entry, + .walk_lock = PGWALK_NOLOCK, +}; + bool rodata_full __ro_after_init = IS_ENABLED(CONFIG_RODATA_FULL_DEFAULT_ENABLED); bool can_set_direct_map(void) @@ -49,9 +111,6 @@ static int change_page_range(pte_t *ptep, unsigned long addr, void *data) return 0; } -/* - * This function assumes that the range is mapped with PAGE_SIZE pages. - */ static int __change_memory_common(unsigned long start, unsigned long size, pgprot_t set_mask, pgprot_t clear_mask) { @@ -61,8 +120,8 @@ static int __change_memory_common(unsigned long start, unsigned long size, data.set_mask = set_mask; data.clear_mask = clear_mask; - ret = apply_to_page_range(&init_mm, start, size, change_page_range, - &data); + ret = walk_page_range_novma(&init_mm, start, start + size, + &pageattr_ops, NULL, &data); /* * If the memory is being made valid without changing any other bits -- 2.30.2