freebsd-skq/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 sys: general adoption of SPDX licensing ID tags. 2017-11-27 15:23:17 +00:00
default_pager.c SPDX: wrong license. 2017-11-30 15:45:42 +00:00
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 sys: general adoption of SPDX licensing ID tags. 2017-11-27 15:23:17 +00:00
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 sys: general adoption of SPDX licensing ID tags. 2017-11-27 15:23:17 +00:00
redzone.h sys: general adoption of SPDX licensing ID tags. 2017-11-27 15:23:17 +00:00
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_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 Fix compilation failures on different arches that have vm_machdep.c not 2019-01-15 19:33:47 +00:00
uma_dbg.h sys: general adoption of SPDX licensing ID tags. 2017-11-27 15:23:17 +00:00
uma_int.h Reduce lock hold time in keg_drain(). 2020-02-11 20:06:33 +00:00
uma.h Add a simple accessor that returns the bytes of memory consumed by a zone. 2020-02-17 01:59:55 +00:00
vm_domainset.c Add a !NUMA definition for vm_domainset_iter_policy_ref_init(). 2018-10-24 17:09:20 +00:00
vm_domainset.h Refactor domainset iterators for use by malloc(9) and UMA. 2018-10-23 16:35:58 +00:00
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 Do not reserve KVA for paging bufs in vm_ksubmap_init(), since now 2019-01-16 20:14:16 +00:00
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: stop passing M_ZERO when allocating radix nodes 2018-06-24 13:08:05 +00:00
vm_radix.h sys: general adoption of SPDX licensing ID tags. 2017-11-27 15:23:17 +00:00
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_dummy.c SPDX: Consider code from Carnegie-Mellon University. 2017-11-30 15:48:35 +00:00
vm_swapout.c Don't hold the object lock while calling getpages. 2020-01-19 23:47:32 +00:00
vm_unix.c Provide separate accounting for user-wired pages. 2019-05-13 16:38:48 +00:00
vm.h Move vm_ndomains to vm.h where it can be used with a single header include 2018-03-27 03:27:02 +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