diff options
| author | Mark Johnston <markj@FreeBSD.org> | 2026-04-08 04:21:09 +0000 |
|---|---|---|
| committer | Mark Johnston <markj@FreeBSD.org> | 2026-04-08 14:04:29 +0000 |
| commit | 04132e01004316ddd0e0cde6ef15b100b7b1844d (patch) | |
| tree | 16ea0d355be4084b504e2cd6b8f51e2241246b26 | |
| parent | 77df0240307ebbc606e17c9b83c0d940d33c2649 (diff) | |
vm_fault: Reset m_needs_zeroing properly
- When allocating a page, we should only consider the PG_ZERO flag when
handling the top-level page.
- Unconditionally reset the flag when restarting the fault handler.
Previously, vm_fault_busy_sleep() would fail to reset it.
PR: 294039
Reviewed by: kib
Tested by: Peter Much <pmc@citylink.dinoex.sub.org>
MFC after: 3 days
Fixes: cff67bc43df1 ("vm_fault: only rely on PG_ZERO when the page was newly allocated")
Differential Revision: https://reviews.freebsd.org/D56234
| -rw-r--r-- | sys/vm/vm_fault.c | 7 |
1 files changed, 3 insertions, 4 deletions
diff --git a/sys/vm/vm_fault.c b/sys/vm/vm_fault.c index 125311912c20..9f00e3b51a37 100644 --- a/sys/vm/vm_fault.c +++ b/sys/vm/vm_fault.c @@ -273,8 +273,6 @@ vm_fault_might_be_cow(struct faultstate *fs) static void vm_fault_deallocate(struct faultstate *fs) { - - fs->m_needs_zeroing = true; vm_fault_page_release(&fs->m_cow); vm_fault_page_release(&fs->m); vm_object_pip_wakeup(fs->object); @@ -1373,7 +1371,8 @@ vm_fault_allocate(struct faultstate *fs, struct pctrie_iter *pages) vm_waitpfault(dset, vm_pfault_oom_wait * hz); return (FAULT_RESTART); } - fs->m_needs_zeroing = (fs->m->flags & PG_ZERO) == 0; + if (fs->object == fs->first_object) + fs->m_needs_zeroing = (fs->m->flags & PG_ZERO) == 0; fs->oom_started = false; return (FAULT_CONTINUE); @@ -1708,7 +1707,6 @@ vm_fault(vm_map_t map, vm_offset_t vaddr, vm_prot_t fault_type, fs.fault_flags = fault_flags; fs.map = map; fs.lookup_still_valid = false; - fs.m_needs_zeroing = true; fs.oom_started = false; fs.nera = -1; fs.can_read_lock = true; @@ -1717,6 +1715,7 @@ vm_fault(vm_map_t map, vm_offset_t vaddr, vm_prot_t fault_type, RetryFault: fs.fault_type = fault_type; + fs.m_needs_zeroing = true; /* * Find the backing store object and offset into it to begin the |
