aboutsummaryrefslogtreecommitdiff
path: root/sys/vm/vm_object.h
diff options
context:
space:
mode:
authorJeff Roberson <jeff@FreeBSD.org>2019-10-15 03:41:36 +0000
committerJeff Roberson <jeff@FreeBSD.org>2019-10-15 03:41:36 +0000
commit205be21d997d5becfaee5918386d4087b09f98a8 (patch)
tree045cfd556e3e84abc62d4254bba751f51664ad19 /sys/vm/vm_object.h
parent8da1c09853811f6ce71ec3814a6082e43b202c2d (diff)
downloadsrc-205be21d997d5becfaee5918386d4087b09f98a8.tar.gz
src-205be21d997d5becfaee5918386d4087b09f98a8.zip
(3/6) Add a shared object busy synchronization mechanism that blocks new page
busy acquires while held. This allows code that would need to acquire and release a very large number of page busy locks to use the old mechanism where busy is only checked and not held. This comes at the cost of false positives but never false negatives which the single consumer, vm_fault_soft_fast(), handles. Reviewed by: kib Tested by: pho Sponsored by: Netflix, Intel Differential Revision: https://reviews.freebsd.org/D21592
Notes
Notes: svn path=/head/; revision=353538
Diffstat (limited to 'sys/vm/vm_object.h')
-rw-r--r--sys/vm/vm_object.h14
1 files changed, 14 insertions, 0 deletions
diff --git a/sys/vm/vm_object.h b/sys/vm/vm_object.h
index 49cd99f28d4e..ab56d8da34d1 100644
--- a/sys/vm/vm_object.h
+++ b/sys/vm/vm_object.h
@@ -84,6 +84,7 @@
* vm_object_t Virtual memory object.
*
* List of locks
+ * (a) atomic
* (c) const until freed
* (o) per-object lock
* (f) free pages queue mutex
@@ -112,6 +113,7 @@ struct vm_object {
u_short flags; /* see below */
u_short pg_color; /* (c) color of first page in obj */
volatile u_int paging_in_progress; /* Paging (in or out) so don't collapse or destroy */
+ volatile u_int busy; /* (a) object is busy, disallow page busy. */
int resident_page_count; /* number of resident pages */
struct vm_object *backing_object; /* object that I'm a shadow of */
vm_ooffset_t backing_object_offset;/* Offset in backing object */
@@ -313,6 +315,18 @@ void vm_object_pip_wakeupn(vm_object_t object, short i);
void vm_object_pip_wait(vm_object_t object, char *waitid);
void vm_object_pip_wait_unlocked(vm_object_t object, char *waitid);
+void vm_object_busy(vm_object_t object);
+void vm_object_unbusy(vm_object_t object);
+void vm_object_busy_wait(vm_object_t object, const char *wmesg);
+
+static inline bool
+vm_object_busied(vm_object_t object)
+{
+
+ return (object->busy != 0);
+}
+#define VM_OBJECT_ASSERT_BUSY(object) MPASS(vm_object_busied((object)))
+
void umtx_shm_object_init(vm_object_t object);
void umtx_shm_object_terminated(vm_object_t object);
extern int umtx_shm_vnobj_persistent;