diff options
author | Richard Braun <rbraun@sceen.net> | 2016-06-17 12:50:45 +0200 |
---|---|---|
committer | Richard Braun <rbraun@sceen.net> | 2016-06-17 12:58:33 +0200 |
commit | 8fcdfb646d145f285341ef597568bb9e003ce28f (patch) | |
tree | d2b8ff63f7c0403c329362e4352505b4f2b8b5e1 /vm | |
parent | fdf86cccfeb4c3e09e024b3a35bbce6308f36412 (diff) | |
download | gnumach-8fcdfb646d145f285341ef597568bb9e003ce28f.tar.gz gnumach-8fcdfb646d145f285341ef597568bb9e003ce28f.tar.bz2 gnumach-8fcdfb646d145f285341ef597568bb9e003ce28f.zip |
Change page cache statistics
Instead of reporting statistics about unreferenced objects (the object
cache), report statistics about external objects (the page cache).
* vm/vm_object.c (vm_object_cached_count): Remove variable.
(vm_object_cache_add): Remove object cache stats updates.
(vm_object_cache_remove): Likewise.
(vm_object_terminate): Update page cache stats.
* vm/vm_object.h (vm_object_cached_count): Remove variable.
(vm_object_cached_pages): Likewise.
(vm_object_cached_pages_lock_data): Likewise.
(vm_object_cached_pages_update): Remove macro.
(vm_object_external_count): New extern variable.
(vm_object_external_pages): Likewise.
* vm/vm_resident.c (vm_object_external_count): New variable.
(vm_object_external_pages): Likewise.
(vm_page_insert): Remove object cache stats updates and
update page cache stats.
(vm_page_replace): Likewise.
(vm_page_remove): Likewise.
* vm/vm_user.c (vm_cache_statistics): Report page cache stats instead
of object cache stats.
Diffstat (limited to 'vm')
-rw-r--r-- | vm/vm_object.c | 16 | ||||
-rw-r--r-- | vm/vm_object.h | 17 | ||||
-rw-r--r-- | vm/vm_resident.c | 25 | ||||
-rw-r--r-- | vm/vm_user.c | 4 |
4 files changed, 31 insertions, 31 deletions
diff --git a/vm/vm_object.c b/vm/vm_object.c index 046b6c49..1e80bbca 100644 --- a/vm/vm_object.c +++ b/vm/vm_object.c @@ -181,7 +181,6 @@ vm_object_t kernel_object = &kernel_object_store; * not be held to make simple references. */ queue_head_t vm_object_cached_list; -int vm_object_cached_count; decl_simple_lock_data(,vm_object_cached_lock_data) @@ -362,8 +361,6 @@ static void vm_object_cache_add( { assert(!object->cached); queue_enter(&vm_object_cached_list, object, vm_object_t, cached_list); - vm_object_cached_count++; - vm_object_cached_pages_update(object->resident_page_count); object->cached = TRUE; } @@ -372,8 +369,6 @@ static void vm_object_cache_remove( { assert(object->cached); queue_remove(&vm_object_cached_list, object, vm_object_t, cached_list); - vm_object_cached_count--; - vm_object_cached_pages_update(-object->resident_page_count); object->cached = FALSE; } @@ -621,6 +616,14 @@ void vm_object_terminate( assert(object->paging_in_progress == 0); assert(!object->cached); + if (!object->internal) { + assert(object->resident_page_count == 0); + + vm_page_lock_queues(); + vm_object_external_count--; + vm_page_unlock_queues(); + } + /* * Throw away port rights... note that they may * already have been thrown away (by vm_object_destroy @@ -2091,6 +2094,9 @@ restart: object->internal = FALSE; object->temporary = FALSE; + assert(object->resident_page_count == 0); + vm_object_external_count++; + /* user pager objects are not ready until marked so */ object->pager_ready = FALSE; diff --git a/vm/vm_object.h b/vm/vm_object.h index e1dd0ba1..1914e8ee 100644 --- a/vm/vm_object.h +++ b/vm/vm_object.h @@ -394,20 +394,9 @@ MACRO_END /* * Page cache accounting. * - * The number of cached objects and pages can be read - * without holding any lock. + * The page queues must be locked when changing these counters. */ - -extern int vm_object_cached_count; - -extern int vm_object_cached_pages; -decl_simple_lock_data(extern,vm_object_cached_pages_lock_data) - -#define vm_object_cached_pages_update(page_count) \ - MACRO_BEGIN \ - simple_lock(&vm_object_cached_pages_lock_data); \ - vm_object_cached_pages += (page_count); \ - simple_unlock(&vm_object_cached_pages_lock_data); \ - MACRO_END +extern int vm_object_external_count; +extern int vm_object_external_pages; #endif /* _VM_VM_OBJECT_H_ */ diff --git a/vm/vm_resident.c b/vm/vm_resident.c index 79481a7b..ed867f54 100644 --- a/vm/vm_resident.c +++ b/vm/vm_resident.c @@ -100,6 +100,8 @@ decl_simple_lock_data(,vm_page_queue_free_lock) unsigned int vm_page_free_wanted; int vm_page_fictitious_count; int vm_page_external_count; +int vm_object_external_count; +int vm_object_external_pages; /* * This variable isn't directly used. It's merely a placeholder for the @@ -374,9 +376,6 @@ void vm_page_insert( object->resident_page_count++; assert(object->resident_page_count != 0); - if (object->can_persist && (object->ref_count == 0)) - vm_object_cached_pages_update(1); - /* * Detect sequential access and inactivate previous page. * We ignore busy pages. @@ -391,6 +390,10 @@ void vm_page_insert( vm_page_deactivate(last_mem); } object->last_alloc = offset; + + if (!object->internal) { + vm_object_external_pages++; + } } /* @@ -444,9 +447,9 @@ void vm_page_replace( m->tabled = FALSE; object->resident_page_count--; - if (object->can_persist - && (object->ref_count == 0)) - vm_object_cached_pages_update(-1); + if (!object->internal) { + vm_object_external_pages--; + } /* * Return page to the free list. @@ -481,8 +484,9 @@ void vm_page_replace( object->resident_page_count++; assert(object->resident_page_count != 0); - if (object->can_persist && (object->ref_count == 0)) - vm_object_cached_pages_update(1); + if (!object->internal) { + vm_object_external_pages++; + } } /* @@ -539,8 +543,9 @@ void vm_page_remove( mem->tabled = FALSE; - if (mem->object->can_persist && (mem->object->ref_count == 0)) - vm_object_cached_pages_update(-1); + if (!mem->object->internal) { + vm_object_external_pages--; + } } /* diff --git a/vm/vm_user.c b/vm/vm_user.c index e65f6d5f..7fc0fe8b 100644 --- a/vm/vm_user.c +++ b/vm/vm_user.c @@ -197,8 +197,8 @@ kern_return_t vm_cache_statistics( if (map == VM_MAP_NULL) return KERN_INVALID_ARGUMENT; - stats->cache_object_count = vm_object_cached_count; - stats->cache_count = vm_object_cached_pages; + stats->cache_object_count = vm_object_external_count; + stats->cache_count = vm_object_external_pages; /* XXX Not implemented yet */ stats->active_tmp_count = 0; |