Module Name: src Committed By: ad Date: Tue Dec 31 22:42:51 UTC 2019
Modified Files: src/sys/kern: kern_idle.c src/sys/miscfs/genfs: genfs_io.c src/sys/ufs/lfs: lfs_pages.c lfs_vfsops.c ulfs_inode.c src/sys/ufs/ufs: ufs_inode.c src/sys/uvm: uvm.h uvm_anon.c uvm_aobj.c uvm_bio.c uvm_extern.h uvm_fault.c uvm_glue.c uvm_loan.c uvm_map.c uvm_object.c uvm_page.c uvm_page.h uvm_pager.c uvm_pdaemon.c uvm_pdpolicy.h uvm_pdpolicy_clock.c uvm_pdpolicy_clockpro.c Log Message: - Add and use wrapper functions that take and acquire page interlocks, and pairs of page interlocks. Require that the page interlock be held over calls to uvm_pageactivate(), uvm_pagewire() and similar. - Solve the concurrency problem with page replacement state. Rather than updating the global state synchronously, set an intended state on individual pages (active, inactive, enqueued, dequeued) while holding the page interlock. After the interlock is released put the pages on a 128 entry per-CPU queue for their state changes to be made real in batch. This results in in a ~400 fold decrease in contention on my test system. Proposed on tech-kern but modified to use the page interlock rather than atomics to synchronise as it's much easier to maintain that way, and cheaper. To generate a diff of this commit: cvs rdiff -u -r1.28 -r1.29 src/sys/kern/kern_idle.c cvs rdiff -u -r1.82 -r1.83 src/sys/miscfs/genfs/genfs_io.c cvs rdiff -u -r1.18 -r1.19 src/sys/ufs/lfs/lfs_pages.c cvs rdiff -u -r1.366 -r1.367 src/sys/ufs/lfs/lfs_vfsops.c cvs rdiff -u -r1.22 -r1.23 src/sys/ufs/lfs/ulfs_inode.c cvs rdiff -u -r1.106 -r1.107 src/sys/ufs/ufs/ufs_inode.c cvs rdiff -u -r1.72 -r1.73 src/sys/uvm/uvm.h cvs rdiff -u -r1.69 -r1.70 src/sys/uvm/uvm_anon.c cvs rdiff -u -r1.132 -r1.133 src/sys/uvm/uvm_aobj.c cvs rdiff -u -r1.101 -r1.102 src/sys/uvm/uvm_bio.c cvs rdiff -u -r1.217 -r1.218 src/sys/uvm/uvm_extern.h cvs rdiff -u -r1.213 -r1.214 src/sys/uvm/uvm_fault.c cvs rdiff -u -r1.174 -r1.175 src/sys/uvm/uvm_glue.c cvs rdiff -u -r1.92 -r1.93 src/sys/uvm/uvm_loan.c src/sys/uvm/uvm_page.h cvs rdiff -u -r1.368 -r1.369 src/sys/uvm/uvm_map.c cvs rdiff -u -r1.18 -r1.19 src/sys/uvm/uvm_object.c cvs rdiff -u -r1.219 -r1.220 src/sys/uvm/uvm_page.c cvs rdiff -u -r1.118 -r1.119 src/sys/uvm/uvm_pager.c cvs rdiff -u -r1.121 -r1.122 src/sys/uvm/uvm_pdaemon.c cvs rdiff -u -r1.5 -r1.6 src/sys/uvm/uvm_pdpolicy.h cvs rdiff -u -r1.27 -r1.28 src/sys/uvm/uvm_pdpolicy_clock.c cvs rdiff -u -r1.21 -r1.22 src/sys/uvm/uvm_pdpolicy_clockpro.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.