freebsd-nq/sys/vm
Max Laier 14b5a3c7d5 vm pqbatch: move unmanaged page assert under pagequeue lock
This KASSERT is overzealous because of the following race condition:
 1) A managed page which is currently in PQ_LAUNDRY is freed.
    vm_page_free_prep calls vm_page_dequeue_deferred()

    The page state is:
       PQ_LAUNDRY, PGA_DEQUEUE|PGA_ENQUEUED

 2) The laundry worker comes around and pick up the page and calls
    vm_pageout_defer(m, PQ_LAUNDRY, true) to check if page is still in the
    queue.  We do a vm_page_astate_load and get
       PQ_LAUNDRY, PGA_DEQUEUE|PGA_ENQUEUED
    as per above.

 3) The laundry worker is pre-empted and another thread allocates our page
    from the free pool.  For example vm_page_alloc_domain_after calls
    vm_page_dequeue() and sets VPO_UNMANAGED because we are allocating for
    an OBJT_UNMANAGED object.

    The page state is:
       PQ_NONE, 0 - VPO_UNMANAGED

 4) The laundry worker resumes, and processes vm_pageout_defer based on the
    stale astate which leads to a call to vm_page_pqbatch_submit, which will
    trip on the KASSERT.

Submitted by:	mlaier
Reviewed by:	markj, rlibby
Sponsored by:	Dell EMC Isilon
Differential Revision:	https://reviews.freebsd.org/D28563
2021-02-24 15:56:16 -08:00
..
_vm_phys.h
_vm_radix.h
default_pager.c
device_pager.c
memguard.c
memguard.h
phys_pager.c
pmap.h
redzone.c
redzone.h
sg_pager.c
swap_pager.c
swap_pager.h
uma_core.c uma: Update the comment above startup_alloc() to reflect reality 2021-02-22 18:22:51 -05:00
uma_dbg.c
uma_dbg.h
uma_int.h
uma.h
vm_domainset.c
vm_domainset.h
vm_dumpset.h
vm_extern.h
vm_fault.c
vm_glue.c
vm_init.c
vm_kern.c vm_kern: Avoid sign extension in the KVA_QUANTUM definition 2021-02-22 15:50:09 -05:00
vm_kern.h
vm_map.c
vm_map.h
vm_meter.c Use atomic loads/stores when updating td->td_state 2021-02-18 14:02:48 +00:00
vm_mmap.c
vm_object.c
vm_object.h
vm_page.c vm pqbatch: move unmanaged page assert under pagequeue lock 2021-02-24 15:56:16 -08:00
vm_page.h
vm_pageout.c
vm_pageout.h
vm_pagequeue.h
vm_pager.c
vm_pager.h
vm_param.h
vm_phys.c
vm_phys.h
vm_radix.c
vm_radix.h
vm_reserv.c
vm_reserv.h
vm_swapout_dummy.c
vm_swapout.c
vm_unix.c
vm.h Add a VA_IS_CLEANMAP() macro. 2021-02-17 16:32:11 -08:00
vnode_pager.c
vnode_pager.h