From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from foss.arm.com (foss.arm.com [217.140.110.172]) by smtp.subspace.kernel.org (Postfix) with ESMTP id 6A1013F104F for ; Mon, 7 Sep 2026 03:50:44 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=217.140.110.172 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788753046; cv=none; b=NZ0JOcLXn/TbBnCxVzu42OCFRIT7kKnviSNFuJ4atNIv+uB7QugMBfQqtQa9m3lymz7DoxwoQVO8+Vfg5iEjy42/Lzm/WNSQjEiuKwqdKwLd+ZEUUBp7DhjhN4cvZC8KxVoO4H+rzH34nCdaW0KYKoHYUkc5OCVkWJVxdXd938w= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788753046; c=relaxed/simple; bh=3yn6gSsOXRoyaBz1CARO0jyrfcLMBCzmt7csYw/Fkvk=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=QP+xN8urV70j90nu43w47WJvU0WMZb3gkOMq09d1cefPqqVRgoW8Oq6UQT7n1WSjgIQglTh7rM1XCxXzbte3mbZuQZuukjeVDowz3VGL6vpIuJORBfC9Eeqbsq1PhMw5GIGEsOt1D3rre0RY/it+h49YuPB/uJygedAmhptjyz4= ARC-Authentication-Results:i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=arm.com; spf=pass smtp.mailfrom=arm.com; dkim=pass (1024-bit key) header.d=arm.com header.i=@arm.com header.b=LW2jt5b0; arc=none smtp.client-ip=217.140.110.172 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=arm.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=arm.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=arm.com header.i=@arm.com header.b="LW2jt5b0" 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 945811516; Sun, 6 Sep 2026 20:50:34 -0700 (PDT) Received: from localhost (a085714.arm.com [10.164.19.28]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPSA id 89B773F7B4; Sun, 6 Sep 2026 20:50:37 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=simple/simple; d=arm.com; s=foss; t=1788753038; bh=3yn6gSsOXRoyaBz1CARO0jyrfcLMBCzmt7csYw/Fkvk=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=LW2jt5b0BLThiRONOynNfF1FBuy3s6vy0IP2y1G8Ho9rA3Rexh4127PHoDgS9FR98 ZDfgStQaqGpdqFi3z28eNV4z53rIyzJ5VwrpgP/WMoKM3iCdUA0Gjq3CKdnnc0WvyA DOD/Cgke+1nc0Oi/K3jQrqX5CVCODcbUyP+HNuEs= From: Anshuman Khandual To: linux-arm-kernel@lists.infradead.org Cc: Anshuman Khandual , Catalin Marinas , Will Deacon , Ryan Roberts , Mark Rutland , Lorenzo Stoakes , Andrew Morton , David Hildenbrand , Mike Rapoport , Linu Cherian , linux-kernel@vger.kernel.org, linux-mm@kvack.org, Lorenzo Stoakes Subject: [PATCH V2 01/14] mm: Add read-write accessors for vm_page_prot Date: Mon, 7 Sep 2026 09:20:16 +0530 Message-ID: <20260907035030.2839978-2-anshuman.khandual@arm.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20260907035030.2839978-1-anshuman.khandual@arm.com> References: <20260907035030.2839978-1-anshuman.khandual@arm.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Currently vma->vm_page_prot is safely read from and written to, without any locks with READ_ONCE() and WRITE_ONCE(). But with introduction of D128 page tables on arm64 platform, vm_page_prot grows to 128 bits which can't safely be handled with READ_ONCE() and WRITE_ONCE(). Add read and write accessors for vm_page_prot like pgprot_[read|write]() which any platform can override when required, although still defaulting as READ_ONCE() and WRITE_ONCE(), thus preserving the functionality for others. Cc: Andrew Morton Cc: David Hildenbrand Cc: Lorenzo Stoakes Cc: Mike Rapoport Cc: linux-mm@kvack.org Cc: linux-kernel@vger.kernel.org Acked-by: Mike Rapoport (Microsoft) Signed-off-by: Anshuman Khandual --- include/linux/pgtable.h | 14 ++++++++++++++ mm/huge_memory.c | 4 ++-- mm/memory.c | 2 +- mm/migrate.c | 2 +- mm/mmap.c | 2 +- 5 files changed, 19 insertions(+), 5 deletions(-) diff --git a/include/linux/pgtable.h b/include/linux/pgtable.h index e3c8ab96941c..0df57a5c19ef 100644 --- a/include/linux/pgtable.h +++ b/include/linux/pgtable.h @@ -524,6 +524,20 @@ static inline pgd_t pgdp_get(pgd_t *pgdp) } #endif +#ifndef pgprot_read +static inline pgprot_t pgprot_read(pgprot_t *prot) +{ + return READ_ONCE(*prot); +} +#endif + +#ifndef pgprot_write +static inline void pgprot_write(pgprot_t *prot, pgprot_t val) +{ + WRITE_ONCE(*prot, val); +} +#endif + #ifndef __HAVE_ARCH_PTEP_TEST_AND_CLEAR_YOUNG static inline bool ptep_test_and_clear_young(struct vm_area_struct *vma, unsigned long address, pte_t *ptep) diff --git a/mm/huge_memory.c b/mm/huge_memory.c index ced400f72d43..33753bffead4 100644 --- a/mm/huge_memory.c +++ b/mm/huge_memory.c @@ -3391,7 +3391,7 @@ static void __split_huge_pmd_locked(struct vm_area_struct *vma, pmd_t *pmd, } else { pte_t entry; - entry = mk_pte(page, READ_ONCE(vma->vm_page_prot)); + entry = mk_pte(page, pgprot_read(&vma->vm_page_prot)); if (write) entry = pte_mkwrite(entry, vma); if (!young) @@ -5103,7 +5103,7 @@ void remove_migration_pmd(struct page_vma_mapped_walk *pvmw, struct folio *folio entry = softleaf_from_pmd(*pvmw->pmd); folio_get(folio); - pmde = folio_mk_pmd(folio, READ_ONCE(vma->vm_page_prot)); + pmde = folio_mk_pmd(folio, pgprot_read(&vma->vm_page_prot)); if (pmd_swp_soft_dirty(*pvmw->pmd)) pmde = pmd_mksoft_dirty(pmde); diff --git a/mm/memory.c b/mm/memory.c index aa6b2fc770fc..fcea6098efb2 100644 --- a/mm/memory.c +++ b/mm/memory.c @@ -939,7 +939,7 @@ static void restore_exclusive_pte(struct vm_area_struct *vma, VM_WARN_ON_FOLIO(!folio_test_locked(folio), folio); - pte = pte_mkold(mk_pte(page, READ_ONCE(vma->vm_page_prot))); + pte = pte_mkold(mk_pte(page, pgprot_read(&vma->vm_page_prot))); if (pte_swp_soft_dirty(orig_pte)) pte = pte_mksoft_dirty(pte); diff --git a/mm/migrate.c b/mm/migrate.c index 15b45832bcfa..579152cce502 100644 --- a/mm/migrate.c +++ b/mm/migrate.c @@ -387,7 +387,7 @@ static bool remove_migration_pte(struct folio *folio, folio_get(folio); new = folio_page(folio, idx); - pte = mk_pte(new, READ_ONCE(vma->vm_page_prot)); + pte = mk_pte(new, pgprot_read(&vma->vm_page_prot)); if (!softleaf_is_migration_young(entry)) pte = pte_mkold(pte); if (folio_test_dirty(folio) && softleaf_is_migration_dirty(entry)) diff --git a/mm/mmap.c b/mm/mmap.c index 4bf26b0f1e6e..729bc244b317 100644 --- a/mm/mmap.c +++ b/mm/mmap.c @@ -89,7 +89,7 @@ void vma_set_page_prot(struct vm_area_struct *vma) vm_page_prot = vma_pgprot_modify(vm_page_prot, vma_flags); } /* remove_protection_ptes reads vma->vm_page_prot without mmap_lock */ - WRITE_ONCE(vma->vm_page_prot, vm_page_prot); + pgprot_write(&vma->vm_page_prot, vm_page_prot); } /* -- 2.43.0