diff options
-rw-r--r-- | vm/vm_fault.c | 2 | ||||
-rw-r--r-- | vm/vm_object.c | 25 | ||||
-rw-r--r-- | vm/vm_page.c | 16 | ||||
-rw-r--r-- | vm/vm_page.h | 1 | ||||
-rw-r--r-- | vm/vm_pageout.c | 1 | ||||
-rw-r--r-- | vm/vm_resident.c | 20 |
6 files changed, 65 insertions, 0 deletions
diff --git a/vm/vm_fault.c b/vm/vm_fault.c index ef6b5656..b53592f0 100644 --- a/vm/vm_fault.c +++ b/vm/vm_fault.c @@ -127,6 +127,8 @@ vm_fault_cleanup( vm_object_t object, vm_page_t top_page) { + assert(vm_object_lock_taken(object)); + vm_object_paging_end(object); vm_object_unlock(object); diff --git a/vm/vm_object.c b/vm/vm_object.c index 9a46149b..a144f348 100644 --- a/vm/vm_object.c +++ b/vm/vm_object.c @@ -191,6 +191,8 @@ def_simple_lock_data(static,vm_object_cached_lock_data) simple_lock_try(&vm_object_cached_lock_data) #define vm_object_cache_unlock() \ simple_unlock(&vm_object_cached_lock_data) +#define vm_object_cache_locked() \ + simple_lock_taken(&vm_object_cached_lock_data) /* * Number of physical pages referenced by cached objects. @@ -359,6 +361,9 @@ void vm_object_init(void) static void vm_object_cache_add( vm_object_t object) { + assert(vm_object_lock_taken(object)); + assert(vm_object_cache_locked()); + assert(!object->cached); queue_enter(&vm_object_cached_list, object, vm_object_t, cached_list); object->cached = TRUE; @@ -367,6 +372,9 @@ static void vm_object_cache_add( static void vm_object_cache_remove( vm_object_t object) { + assert(vm_object_lock_taken(object)); + assert(vm_object_cache_locked()); + assert(object->cached); queue_remove(&vm_object_cached_list, object, vm_object_t, cached_list); object->cached = FALSE; @@ -529,6 +537,9 @@ void vm_object_terminate( vm_page_t p; vm_object_t shadow_object; + assert(vm_object_lock_taken(object)); + assert(vm_object_cache_locked()); + /* * Make sure the object isn't already being terminated */ @@ -732,6 +743,8 @@ static void vm_object_abort_activity( vm_page_t p; vm_page_t next; + assert(vm_object_lock_taken(object)); + /* * Abort all activity that would be waiting * for a result on this memory object. @@ -1031,6 +1044,8 @@ kern_return_t vm_object_copy_slowly( vm_object_t new_object; vm_offset_t new_offset; + assert(vm_object_lock_taken(src_object)); + if (size == 0) { vm_object_unlock(src_object); *_result_object = VM_OBJECT_NULL; @@ -1304,6 +1319,8 @@ static kern_return_t vm_object_copy_call( vm_object_t new_object; vm_page_t p; + assert(vm_object_lock_taken(src_object)); + /* * Create a memory object port to be associated * with this new vm_object. @@ -2155,6 +2172,8 @@ void vm_object_pager_create( { ipc_port_t pager; + assert(vm_object_lock_taken(object)); + if (object->pager_created) { /* * Someone else got to it first... @@ -2249,6 +2268,8 @@ void vm_object_remove( { ipc_port_t port; + assert(vm_object_cache_locked()); + if ((port = object->pager) != IP_NULL) { if (ip_kotype(port) == IKOT_PAGER) ipc_kobject_set(port, IKO_NULL, @@ -2304,6 +2325,8 @@ void vm_object_collapse( vm_page_t p, pp; ipc_port_t old_name_port; + assert(vm_object_lock_taken(object)); + if (!vm_object_collapse_allowed) return; @@ -2654,6 +2677,8 @@ void vm_object_page_remove( { vm_page_t p, next; + assert(vm_object_lock_taken(object)); + /* * One and two page removals are most popular. * The factor of 16 here is somewhat arbitrary. diff --git a/vm/vm_page.c b/vm/vm_page.c index 44573b10..4fde0759 100644 --- a/vm/vm_page.c +++ b/vm/vm_page.c @@ -755,6 +755,7 @@ vm_page_seg_free(struct vm_page_seg *seg, struct vm_page *page, static void vm_page_seg_add_active_page(struct vm_page_seg *seg, struct vm_page *page) { + assert(simple_lock_taken(&seg->lock)); assert(page->object != NULL); assert(page->seg_index == vm_page_seg_index(seg)); assert(page->type != VM_PT_FREE); @@ -770,6 +771,7 @@ vm_page_seg_add_active_page(struct vm_page_seg *seg, struct vm_page *page) static void vm_page_seg_remove_active_page(struct vm_page_seg *seg, struct vm_page *page) { + assert(simple_lock_taken(&seg->lock)); assert(page->object != NULL); assert(page->seg_index == vm_page_seg_index(seg)); assert(page->type != VM_PT_FREE); @@ -784,6 +786,7 @@ vm_page_seg_remove_active_page(struct vm_page_seg *seg, struct vm_page *page) static void vm_page_seg_add_inactive_page(struct vm_page_seg *seg, struct vm_page *page) { + assert(simple_lock_taken(&seg->lock)); assert(page->object != NULL); assert(page->seg_index == vm_page_seg_index(seg)); assert(page->type != VM_PT_FREE); @@ -798,6 +801,7 @@ vm_page_seg_add_inactive_page(struct vm_page_seg *seg, struct vm_page *page) static void vm_page_seg_remove_inactive_page(struct vm_page_seg *seg, struct vm_page *page) { + assert(simple_lock_taken(&seg->lock)); assert(page->object != NULL); assert(page->seg_index == vm_page_seg_index(seg)); assert(page->type != VM_PT_FREE); @@ -1726,6 +1730,9 @@ vm_page_mem_free(void) void vm_page_wire(struct vm_page *page) { + assert(vm_page_locked_queues()); + assert(vm_object_lock_taken(page->object)); + VM_PAGE_CHECK(page); if (page->wire_count == 0) { @@ -1749,6 +1756,9 @@ vm_page_unwire(struct vm_page *page) { struct vm_page_seg *seg; + assert(vm_page_locked_queues()); + assert(vm_object_lock_taken(page->object)); + VM_PAGE_CHECK(page); assert(page->wire_count != 0); @@ -1781,6 +1791,8 @@ vm_page_deactivate(struct vm_page *page) { struct vm_page_seg *seg; + assert(vm_page_locked_queues()); + VM_PAGE_CHECK(page); /* @@ -1820,6 +1832,8 @@ vm_page_activate(struct vm_page *page) { struct vm_page_seg *seg; + assert(vm_page_locked_queues()); + VM_PAGE_CHECK(page); /* @@ -1845,6 +1859,8 @@ vm_page_queues_remove(struct vm_page *page) { struct vm_page_seg *seg; + assert(vm_page_locked_queues()); + assert(!page->active || !page->inactive); if (!page->active && !page->inactive) { diff --git a/vm/vm_page.h b/vm/vm_page.h index 3be75f18..9e110209 100644 --- a/vm/vm_page.h +++ b/vm/vm_page.h @@ -293,6 +293,7 @@ extern unsigned int vm_page_info( #define vm_page_lock_queues() simple_lock(&vm_page_queue_lock) #define vm_page_unlock_queues() simple_unlock(&vm_page_queue_lock) +#define vm_page_locked_queues() simple_lock_taken(&vm_page_queue_lock) #define VM_PAGE_QUEUES_REMOVE(mem) vm_page_queues_remove(mem) diff --git a/vm/vm_pageout.c b/vm/vm_pageout.c index e2f4cf2b..c5b5bfbc 100644 --- a/vm/vm_pageout.c +++ b/vm/vm_pageout.c @@ -327,6 +327,7 @@ vm_pageout_page( kern_return_t rc; boolean_t precious_clean; + assert(vm_object_lock_taken(m->object)); assert(m->busy); /* diff --git a/vm/vm_resident.c b/vm/vm_resident.c index 817e4e8c..fba2c0d9 100644 --- a/vm/vm_resident.c +++ b/vm/vm_resident.c @@ -325,6 +325,9 @@ void vm_page_insert( { vm_page_bucket_t *bucket; + assert(vm_page_locked_queues()); + assert(vm_object_lock_taken(object)); + VM_PAGE_CHECK(mem); assert(!mem->active && !mem->inactive); @@ -403,6 +406,9 @@ void vm_page_replace( { vm_page_bucket_t *bucket; + assert(vm_page_locked_queues()); + assert(vm_object_lock_taken(object)); + VM_PAGE_CHECK(mem); assert(!mem->active && !mem->inactive); @@ -502,6 +508,10 @@ void vm_page_remove( vm_page_t this; assert(mem->tabled); + + assert(vm_page_locked_queues()); + assert(vm_object_lock_taken(mem->object)); + VM_PAGE_CHECK(mem); /* @@ -564,6 +574,8 @@ vm_page_t vm_page_lookup( vm_page_t mem; vm_page_bucket_t *bucket; + assert(vm_object_lock_taken(object)); + /* * Search the hash table for this object/offset pair */ @@ -598,6 +610,8 @@ void vm_page_rename( * the pageout daemon uses that lock to get the object. */ + assert(vm_object_lock_taken(new_object)); + vm_page_lock_queues(); vm_page_remove(mem); vm_page_insert(mem, new_object, new_offset); @@ -742,6 +756,7 @@ boolean_t vm_page_convert(struct vm_page **mp) return FALSE; object = fict_m->object; + assert(vm_object_lock_taken(object)); offset = fict_m->offset; vm_page_lock_queues(); vm_page_remove(fict_m); @@ -947,6 +962,8 @@ vm_page_t vm_page_alloc( { vm_page_t mem; + assert(vm_object_lock_taken(object)); + mem = vm_page_grab(VM_PAGE_HIGHMEM); if (mem == VM_PAGE_NULL) return VM_PAGE_NULL; @@ -976,6 +993,9 @@ void vm_page_free( vm_page_remove(mem); } + assert(vm_page_locked_queues()); + assert(vm_object_lock_taken(mem->object)); + assert(!mem->active && !mem->inactive); if (mem->wire_count != 0) { |