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 7D261203710 for ; Tue, 24 Feb 2026 05:12:35 +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=1771909956; cv=none; b=HBYPd/RFxG2NErgv2DBdE6W+2X/tU1YtK8kdaqu92/FNZNBUEdsIlhJFKD78MZUzQ+/S0/59QW6BXPeBjq9xTtL2nk8NP05SElnGv91pGJ2kraHa/0QT6i5/aO8LaA76Ca5gcsEYiKiiMkf/TFydPqv8iA4VcCdVJvxcWqpDcRk= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1771909956; c=relaxed/simple; bh=KL5CmD3RRc3PfWdZhi6H1RIrkJhdd/uW0/nYE1iJR3c=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=BOUeCn7YBR77+1A32kKgkzWAZUb2J9uPw0ZhOMp/jAT5i8iEFiTVulrKNGqBjXItn23nK7tPfLYl27/4G6X5EaWskEldo4bLpGW0pvPcWYcF7zs/ukMFErH+wh+S0TOgQGMVZWZdwY1XN00yXK1r1WFCHpKKSU0RcUX1XOgIYeo= 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; 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 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 A3E3B339; Mon, 23 Feb 2026 21:12:28 -0800 (PST) Received: from a085714.blr.arm.com (a085714.arm.com [10.164.18.87]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPA id C4D163F7BD; Mon, 23 Feb 2026 21:12:30 -0800 (PST) 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 Subject: [RFC V1 02/16] mm: Add read-write accessors for vm_page_prot Date: Tue, 24 Feb 2026 10:41:39 +0530 Message-ID: <20260224051153.3150613-3-anshuman.khandual@arm.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20260224051153.3150613-1-anshuman.khandual@arm.com> References: <20260224051153.3150613-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_once() 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 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 da17139a1279..8858b8b03a02 100644 --- a/include/linux/pgtable.h +++ b/include/linux/pgtable.h @@ -495,6 +495,20 @@ static inline pgd_t pgdp_get(pgd_t *pgdp) } #endif +#ifndef pgprot_read_once +static inline pgprot_t pgprot_read_once(pgprot_t *prot) +{ + return READ_ONCE(*prot); +} +#endif + +#ifndef pgprot_write_once +static inline void pgprot_write_once(pgprot_t *prot, pgprot_t val) +{ + WRITE_ONCE(*prot, val); +} +#endif + #ifndef __HAVE_ARCH_PTEP_TEST_AND_CLEAR_YOUNG static inline int ptep_test_and_clear_young(struct vm_area_struct *vma, unsigned long address, diff --git a/mm/huge_memory.c b/mm/huge_memory.c index d4ca8cfd7f9d..0d9d6569367e 100644 --- a/mm/huge_memory.c +++ b/mm/huge_memory.c @@ -3233,7 +3233,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_once(&vma->vm_page_prot)); if (write) entry = pte_mkwrite(entry, vma); if (!young) @@ -4918,7 +4918,7 @@ void remove_migration_pmd(struct page_vma_mapped_walk *pvmw, struct page *new) 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_once(&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 cfc3077fc52f..2d99c9212883 100644 --- a/mm/memory.c +++ b/mm/memory.c @@ -895,7 +895,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_once(&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 1bf2cf8c44dd..9db1e6ed9042 100644 --- a/mm/migrate.c +++ b/mm/migrate.c @@ -377,7 +377,7 @@ static bool remove_migration_pte(struct folio *folio, continue; folio_get(folio); - pte = mk_pte(new, READ_ONCE(vma->vm_page_prot)); + pte = mk_pte(new, pgprot_read_once(&vma->vm_page_prot)); entry = softleaf_from_pte(old_pte); if (!softleaf_is_migration_young(entry)) diff --git a/mm/mmap.c b/mm/mmap.c index 843160946aa5..af6870115a9d 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 = vm_pgprot_modify(vm_page_prot, vm_flags); } /* remove_protection_ptes reads vma->vm_page_prot without mmap_lock */ - WRITE_ONCE(vma->vm_page_prot, vm_page_prot); + pgprot_write_once(&vma->vm_page_prot, vm_page_prot); } /* -- 2.43.0