Add per-CPU caches to the pmemrange allocator.
authormpi <mpi@openbsd.org>
Wed, 1 May 2024 12:54:27 +0000 (12:54 +0000)
committermpi <mpi@openbsd.org>
Wed, 1 May 2024 12:54:27 +0000 (12:54 +0000)
commit82673a188a32931f4005a3ede8f05d97542feb17
treeb95afecfce21cf486fbff50a6c540e850ea6f536
parent65a55a55c7a1ceb83f2b4bc7b773d473ee2e30fb
Add per-CPU caches to the pmemrange allocator.

The caches are used primarily to reduce contention on uvm_lock_fpageq() during
concurrent page faults.  For the moment only uvm_pagealloc() tries to get a
page from the current CPU's cache.  So on some architectures the caches are
also used by the pmap layer.

Each cache is composed of two magazines, design is borrowed from jeff bonwick
vmem's paper and the implementation is similar to the one of pool_cache from
dlg@.  However there is no depot layer and magazines are refilled directly by
the pmemrange allocator.

This version includes splvm()/splx() dances because the buffer cache flips
buffers in interrupt context.  So we have to prevent recursive accesses to
per-CPU magazines.

Tested by naddy@, solene@, krw@, robert@, claudio@ and Laurence Tratt.

ok claudio@, kettenis@
sys/arch/amd64/include/cpu.h
sys/arch/arm64/include/cpu.h
sys/arch/i386/include/cpu.h
sys/uvm/uvm_page.c
sys/uvm/uvm_pdaemon.c
sys/uvm/uvm_percpu.h
sys/uvm/uvm_pmemrange.c
sys/uvm/uvm_pmemrange.h
sys/uvm/uvmexp.h
usr.bin/systat/uvm.c
usr.bin/vmstat/vmstat.c