freebsd-src/sys/vm
Mark Johnston c90d075be4 Fix object locking races in swapoff(2).
swap_pager_swapoff_object()'s goal is to allocate pages for all valid
swap blocks belonging to the object, for which there is no resident
page.  If the page corresponding to a block is already resident and
valid, the block can simply be discarded.

The existing implementation tries to minimize the number of I/Os used.
For each cluster of swap blocks, it finds maximal runs of valid swap
blocks not resident in memory, and valid resident pages.  During this
processing, the object lock may be dropped in several places: when
calling getpages, or when blocking on a busy page in
vm_page_grab_pages().  While the lock is dropped, another thread may
free swap blocks, causing getpages to page in stale data.

Fix the problem following a suggestion from Jeff: use getpages'
readahead capability to perform clustering rather than doing it
ourselves.  The simplies the code a bit without reintroducing the old
behaviour of performing one I/O per page.

Reviewed by:	jeff
Reported by:	dhw, gallatin
Tested by:	pho
MFC after:	2 weeks
Sponsored by:	The FreeBSD Foundation
Differential Revision:	https://reviews.freebsd.org/D23664
2020-02-17 15:09:40 +00:00
..
_vm_radix.h
default_pager.c
device_pager.c Don't hold the object lock while calling getpages. 2020-01-19 23:47:32 +00:00
memguard.c vm: add missing CLTFLAG_MPSAFE annotations 2020-01-12 05:08:57 +00:00
memguard.h
phys_pager.c Don't hold the object lock while calling getpages. 2020-01-19 23:47:32 +00:00
pmap.h Remove page locking from pmap_mincore(). 2019-10-16 22:03:27 +00:00
redzone.c
redzone.h
sg_pager.c Don't hold the object lock while calling getpages. 2020-01-19 23:47:32 +00:00
swap_pager.c Fix object locking races in swapoff(2). 2020-02-17 15:09:40 +00:00
swap_pager.h
uma.h Add a simple accessor that returns the bytes of memory consumed by a zone. 2020-02-17 01:59:55 +00:00
uma_core.c Add a simple accessor that returns the bytes of memory consumed by a zone. 2020-02-17 01:59:55 +00:00
uma_dbg.c
uma_dbg.h
uma_int.h Reduce lock hold time in keg_drain(). 2020-02-11 20:06:33 +00:00
vm.h
vm_domainset.c
vm_domainset.h
vm_extern.h Improve MD page fault handlers. 2019-09-27 18:43:36 +00:00
vm_fault.c Restore OOM logic on page fault after r357026. 2020-01-29 12:02:47 +00:00
vm_glue.c Consistently use busy and vm_page_valid() rather than touching page bits 2020-01-23 04:54:49 +00:00
vm_init.c Simplify VM and UMA startup by eliminating boot pages. Instead use careful 2020-01-16 05:01:21 +00:00
vm_kern.c Remove sparc64 kernel support 2020-02-03 17:35:11 +00:00
vm_kern.h
vm_map.c Most uses of vm_map_clip_start follow a call to vm_map_lookup. Define 2020-01-24 07:48:11 +00:00
vm_map.h Revert r355505. The code that it allowed to compile has been removed. 2019-12-09 05:09:46 +00:00
vm_meter.c Simplify anonymous memory handling with an OBJ_ANON flag. This eliminates 2019-11-19 23:19:43 +00:00
vm_mmap.c vm: use new capsicum helpers 2020-02-15 01:29:07 +00:00
vm_object.c Enable vm_object_mightbedirty() and vm_object_page_clean() for swap 2020-02-04 19:03:37 +00:00
vm_object.h Enable vm_object_mightbedirty() and vm_object_page_clean() for swap 2020-02-04 19:03:37 +00:00
vm_page.c Refactor _vm_page_busy_sleep to reduce the delta between the various 2020-02-17 01:08:00 +00:00
vm_page.h Refactor _vm_page_busy_sleep to reduce the delta between the various 2020-02-17 01:08:00 +00:00
vm_pageout.c vm: remove no longer needed atomic_load_ptr casts 2020-02-14 23:16:29 +00:00
vm_pageout.h Fix OOM handling of some corner cases. 2019-08-16 09:43:49 +00:00
vm_pagequeue.h Simplify vm_pageout_init_domain() and add a "big picture" comment. 2019-11-22 16:31:43 +00:00
vm_pager.c Don't hold the object lock while calling getpages. 2020-01-19 23:47:32 +00:00
vm_pager.h Add a deferred free mechanism for freeing swap space that does not require 2019-12-15 03:15:06 +00:00
vm_param.h (fault 3/9) Move map relookup into a dedicated function. 2020-01-23 05:07:01 +00:00
vm_phys.c Fix typo using RB_INITIALIZER. 2019-12-22 21:53:05 +00:00
vm_phys.h Encapsulate phys_avail manipulation in a set of simple routines. Add a 2019-08-18 07:06:31 +00:00
vm_radix.c
vm_radix.h
vm_reserv.c vm: add missing CLTFLAG_MPSAFE annotations 2020-01-12 05:08:57 +00:00
vm_reserv.h Fix locking in vm_reserv_reclaim_contig(). 2019-11-22 16:28:52 +00:00
vm_swapout.c Don't hold the object lock while calling getpages. 2020-01-19 23:47:32 +00:00
vm_swapout_dummy.c
vm_unix.c Provide separate accounting for user-wired pages. 2019-05-13 16:38:48 +00:00
vnode_pager.c Fix up various vnode-related asserts which did not dump the used vnode 2020-02-03 14:25:32 +00:00
vnode_pager.h vm pager: writemapping accounting for OBJT_SWAP 2019-09-03 20:31:48 +00:00