diff options
Diffstat (limited to 'sys/vm')
| -rw-r--r-- | sys/vm/vm_object.c | 5 | ||||
| -rw-r--r-- | sys/vm/vm_object.h | 5 |
2 files changed, 10 insertions, 0 deletions
diff --git a/sys/vm/vm_object.c b/sys/vm/vm_object.c index bc0e4c05f126..1b1d532ba1cf 100644 --- a/sys/vm/vm_object.c +++ b/sys/vm/vm_object.c @@ -264,6 +264,7 @@ _vm_object_allocate(objtype_t type, vm_pindex_t size, vm_object_t object) #if VM_NRESERVLEVEL > 0 LIST_INIT(&object->rvq); #endif + umtx_shm_object_init(object); } /* @@ -475,6 +476,9 @@ vm_object_vndeallocate(vm_object_t object) } #endif + if (object->ref_count == 1) + umtx_shm_object_terminated(object); + /* * The test for text of vp vnode does not need a bypass to * reach right VV_TEXT there, since it is obtained from @@ -647,6 +651,7 @@ retry: return; } doterm: + umtx_shm_object_terminated(object); temp = object->backing_object; if (temp != NULL) { KASSERT((object->flags & OBJ_TMPFS_NODE) == 0, diff --git a/sys/vm/vm_object.h b/sys/vm/vm_object.h index ca2d73a75a42..c68fdce09158 100644 --- a/sys/vm/vm_object.h +++ b/sys/vm/vm_object.h @@ -174,6 +174,7 @@ struct vm_object { } un_pager; struct ucred *cred; vm_ooffset_t charge; + void *umtx_data; }; /* @@ -184,6 +185,7 @@ struct vm_object { #define OBJ_ACTIVE 0x0004 /* active objects */ #define OBJ_DEAD 0x0008 /* dead objects (during rundown) */ #define OBJ_NOSPLIT 0x0010 /* dont split this object */ +#define OBJ_UMTXDEAD 0x0020 /* umtx pshared was terminated */ #define OBJ_PIPWNT 0x0040 /* paging in progress wanted */ #define OBJ_MIGHTBEDIRTY 0x0100 /* object might be dirty, only for vnode */ #define OBJ_TMPFS_NODE 0x0200 /* object belongs to tmpfs VREG node */ @@ -296,6 +298,9 @@ vm_object_cache_is_empty(vm_object_t object) return (vm_radix_is_empty(&object->cache)); } +void umtx_shm_object_init(vm_object_t object); +void umtx_shm_object_terminated(vm_object_t object); + vm_object_t vm_object_allocate (objtype_t, vm_pindex_t); boolean_t vm_object_coalesce(vm_object_t, vm_ooffset_t, vm_size_t, vm_size_t, boolean_t); |
