From 2a0c043c4684232062de56e0b1b7dc00ca762edc Mon Sep 17 00:00:00 2001 From: Mark Johnston Date: Fri, 25 Nov 2022 11:48:03 -0500 Subject: [PATCH 14/52] vm_fault: Fix locking when wiring faulted pages This is a bug in the backport of largepage mappings; in more recent FreeBSD, the page lock is not used, but in this branch it is used to serialize modifications to a page's wiring counter. --- sys/vm/vm_fault.c | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/sys/vm/vm_fault.c b/sys/vm/vm_fault.c index c3ff4161cc44..d29bed658df0 100644 --- a/sys/vm/vm_fault.c +++ b/sys/vm/vm_fault.c @@ -488,14 +488,20 @@ vm_fault_populate(struct faultstate *fs, vm_prot_t prot, int fault_type, PMAP_ENTER_LARGEPAGE, bdry_idx); VM_OBJECT_WLOCK(fs->first_object); vm_page_xunbusy(m); + m_mtx = NULL; if ((fault_flags & VM_FAULT_WIRE) != 0) { - for (i = 0; i < atop(pagesizes[bdry_idx]); i++) + for (i = 0; i < atop(pagesizes[bdry_idx]); i++) { + vm_page_change_lock(m + i, &m_mtx); vm_page_wire(m + i); + } } if (m_hold != NULL) { *m_hold = m + (fs->first_pindex - pager_first); + vm_page_change_lock(*m_hold, &m_mtx); vm_page_wire(*m_hold); } + if (m_mtx != NULL) + mtx_unlock(m_mtx); goto out; } -- 2.41.0