Now
MAIN commitmail json YAML
src/sys/kern/kern_idle.c@1.29
/
diff
/
nxr@1.29
src/sys/miscfs/genfs/genfs_io.c@1.83 / diff / nxr@1.83
src/sys/ufs/lfs/lfs_pages.c@1.19 / diff / nxr@1.19
src/sys/ufs/lfs/lfs_vfsops.c@1.367 / diff / nxr@1.367
src/sys/ufs/lfs/ulfs_inode.c@1.23 / diff / nxr@1.23
src/sys/ufs/ufs/ufs_inode.c@1.107 / diff / nxr@1.107
src/sys/uvm/uvm.h@1.73 / diff / nxr@1.73
src/sys/uvm/uvm_anon.c@1.70 / diff / nxr@1.70
src/sys/uvm/uvm_aobj.c@1.133 / diff / nxr@1.133
src/sys/uvm/uvm_bio.c@1.102 / diff / nxr@1.102
src/sys/uvm/uvm_extern.h@1.218 / diff / nxr@1.218
src/sys/uvm/uvm_fault.c@1.214 / diff / nxr@1.214
src/sys/uvm/uvm_glue.c@1.175 / diff / nxr@1.175
src/sys/uvm/uvm_loan.c@1.93 / diff / nxr@1.93
src/sys/uvm/uvm_map.c@1.369 / diff / nxr@1.369
src/sys/uvm/uvm_object.c@1.19 / diff / nxr@1.19
src/sys/uvm/uvm_page.c@1.220 / diff / nxr@1.220
src/sys/uvm/uvm_page.h@1.93 / diff / nxr@1.93
src/sys/uvm/uvm_pager.c@1.119 / diff / nxr@1.119
src/sys/uvm/uvm_pdaemon.c@1.122 / diff / nxr@1.122
src/sys/uvm/uvm_pdpolicy.h@1.6 / diff / nxr@1.6
src/sys/uvm/uvm_pdpolicy_clock.c@1.28 / diff / nxr@1.28
src/sys/uvm/uvm_pdpolicy_clockpro.c@1.22 / diff / nxr@1.22
src/sys/miscfs/genfs/genfs_io.c@1.83 / diff / nxr@1.83
src/sys/ufs/lfs/lfs_pages.c@1.19 / diff / nxr@1.19
src/sys/ufs/lfs/lfs_vfsops.c@1.367 / diff / nxr@1.367
src/sys/ufs/lfs/ulfs_inode.c@1.23 / diff / nxr@1.23
src/sys/ufs/ufs/ufs_inode.c@1.107 / diff / nxr@1.107
src/sys/uvm/uvm.h@1.73 / diff / nxr@1.73
src/sys/uvm/uvm_anon.c@1.70 / diff / nxr@1.70
src/sys/uvm/uvm_aobj.c@1.133 / diff / nxr@1.133
src/sys/uvm/uvm_bio.c@1.102 / diff / nxr@1.102
src/sys/uvm/uvm_extern.h@1.218 / diff / nxr@1.218
src/sys/uvm/uvm_fault.c@1.214 / diff / nxr@1.214
src/sys/uvm/uvm_glue.c@1.175 / diff / nxr@1.175
src/sys/uvm/uvm_loan.c@1.93 / diff / nxr@1.93
src/sys/uvm/uvm_map.c@1.369 / diff / nxr@1.369
src/sys/uvm/uvm_object.c@1.19 / diff / nxr@1.19
src/sys/uvm/uvm_page.c@1.220 / diff / nxr@1.220
src/sys/uvm/uvm_page.h@1.93 / diff / nxr@1.93
src/sys/uvm/uvm_pager.c@1.119 / diff / nxr@1.119
src/sys/uvm/uvm_pdaemon.c@1.122 / diff / nxr@1.122
src/sys/uvm/uvm_pdpolicy.h@1.6 / diff / nxr@1.6
src/sys/uvm/uvm_pdpolicy_clock.c@1.28 / diff / nxr@1.28
src/sys/uvm/uvm_pdpolicy_clockpro.c@1.22 / diff / nxr@1.22
- 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.
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.