From ee8a98fd836d3a69f20b59080bad278892833fcb Mon Sep 17 00:00:00 2001 From: Mark Johnston Date: Fri, 13 Jan 2023 14:55:51 -0500 Subject: [PATCH 34/52] mips: Fix a locking bug in the new pmap's mincore implementation --- sys/mips/mips/pmap_mips64.c | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/sys/mips/mips/pmap_mips64.c b/sys/mips/mips/pmap_mips64.c index 136b47ed4215..e97ec62f97e1 100644 --- a/sys/mips/mips/pmap_mips64.c +++ b/sys/mips/mips/pmap_mips64.c @@ -5377,6 +5377,7 @@ pmap_mincore(pmap_t pmap, vm_offset_t addr, vm_paddr_t *locked_pa) int val; PMAP_LOCK(pmap); +retry: pdep = pmap_pde(pmap, addr); if (pdep != NULL) { if (pde_is_superpage(pdep)) { @@ -5405,8 +5406,10 @@ pmap_mincore(pmap_t pmap, vm_offset_t addr, vm_paddr_t *locked_pa) (MINCORE_MODIFIED_OTHER | MINCORE_REFERENCED_OTHER) && pte_test(&pte, PTE_MANAGED)) { /* Ensure that "PHYS_TO_VM_PAGE(pa)->object" doesn't change. */ - *locked_pa = pa; - } + if (vm_page_pa_tryrelock(pmap, pa, locked_pa)) + goto retry; + } else + PA_UNLOCK_COND(*locked_pa); PMAP_UNLOCK(pmap); return (val); } -- 2.41.0