path: root/sys/sys/vmmeter.h
diff options
authorMark Johnston <markj@FreeBSD.org>2019-05-13 16:38:48 +0000
committerMark Johnston <markj@FreeBSD.org>2019-05-13 16:38:48 +0000
commit54a3a1142189f60edfbbdfb0e1f4085e2d30c115 (patch)
tree760ca413705c5e04ea996003c5e7872d4a05277f /sys/sys/vmmeter.h
parentaf1f58df9938e12acbe5fab69890c59684415902 (diff)
Provide separate accounting for user-wired pages.
Historically we have not distinguished between kernel wirings and user wirings for accounting purposes. User wirings (via mlock(2)) were subject to a global limit on the number of wired pages, so if large swaths of physical memory were wired by the kernel, as happens with the ZFS ARC among other things, the limit could be exceeded, causing user wirings to fail. The change adds a new counter, v_user_wire_count, which counts the number of virtual pages wired by user processes via mlock(2) and mlockall(2). Only user-wired pages are subject to the system-wide limit which helps provide some safety against deadlocks. In particular, while sources of kernel wirings typically support some backpressure mechanism, there is no way to reclaim user-wired pages shorting of killing the wiring process. The limit is exported as vm.max_user_wired, renamed from vm.max_wired, and changed from u_int to u_long. The choice to count virtual user-wired pages rather than physical pages was done for simplicity. There are mechanisms that can cause user-wired mappings to be destroyed while maintaining a wiring of the backing physical page; these make it difficult to accurately track user wirings at the physical page layer. The change also closes some holes which allowed user wirings to succeed even when they would cause the system limit to be exceeded. For instance, mmap() may now fail with ENOMEM in a process that has called mlockall(MCL_FUTURE) if the new mapping would cause the user wiring limit to be exceeded. Note that bhyve -S is subject to the user wiring limit, which defaults to 1/3 of physical RAM. Users that wish to exceed the limit must tune vm.max_user_wired. Reviewed by: kib, ngie (mlock() test changes) Tested by: pho (earlier version) MFC after: 45 days Sponsored by: Netflix Differential Revision: https://reviews.freebsd.org/D19908
Notes: svn path=/head/; revision=347532
Diffstat (limited to 'sys/sys/vmmeter.h')
1 files changed, 2 insertions, 0 deletions
diff --git a/sys/sys/vmmeter.h b/sys/sys/vmmeter.h
index 579d16756e99..3714a06983bf 100644
--- a/sys/sys/vmmeter.h
+++ b/sys/sys/vmmeter.h
@@ -153,6 +153,8 @@ extern domainset_t vm_severe_domains;
#define VM_CNT_INC(var) VM_CNT_ADD(var, 1)
#define VM_CNT_FETCH(var) counter_u64_fetch(vm_cnt.var)
+extern u_long vm_user_wire_count;
static inline void
vm_wire_add(int cnt)