summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSamuel Thibault <samuel.thibault@ens-lyon.org>2025-02-12 01:58:53 +0100
committerSamuel Thibault <samuel.thibault@ens-lyon.org>2025-02-12 02:11:11 +0100
commitea5ef1b6706dae31b6dc7083d341fda6818d4391 (patch)
treeac840ef454118f5755ba9ccb1f10e5f04c22ed2c
parentb163e2a6181c805bb2369458203a6af23bf4669e (diff)
vm: Add and use vm_object_lock_taken, vm_object_cache_locked, vm_page_locked_queues
to check locking
-rw-r--r--vm/vm_fault.c2
-rw-r--r--vm/vm_object.c25
-rw-r--r--vm/vm_page.c16
-rw-r--r--vm/vm_page.h1
-rw-r--r--vm/vm_pageout.c1
-rw-r--r--vm/vm_resident.c20
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) {