summaryrefslogtreecommitdiff
path: root/vm
diff options
context:
space:
mode:
authorRichard Braun <rbraun@sceen.net>2016-06-17 12:50:45 +0200
committerRichard Braun <rbraun@sceen.net>2016-06-17 12:58:33 +0200
commit8fcdfb646d145f285341ef597568bb9e003ce28f (patch)
treed2b8ff63f7c0403c329362e4352505b4f2b8b5e1 /vm
parentfdf86cccfeb4c3e09e024b3a35bbce6308f36412 (diff)
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.c16
-rw-r--r--vm/vm_object.h17
-rw-r--r--vm/vm_resident.c25
-rw-r--r--vm/vm_user.c4
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;