]> git.saurik.com Git - apple/xnu.git/blobdiff - osfmk/default_pager/dp_memory_object.c
xnu-2050.9.2.tar.gz
[apple/xnu.git] / osfmk / default_pager / dp_memory_object.c
index c85278056c2977fb35b1ff34f287e743e2f8aaf7..83c24fe6f655eac1aadefeb08d4879815cd601a2 100644 (file)
@@ -350,8 +350,8 @@ default_pager_add(
                pset = default_pager_external_set;
        }
 
-       ipc_port_make_sonce(mem_obj);
        ip_lock(mem_obj);  /* unlocked in nsrequest below */
+       ipc_port_make_sonce_locked(mem_obj);
        ipc_port_nsrequest(mem_obj, sync, mem_obj, &previous);
 }
 
@@ -369,6 +369,7 @@ const struct memory_object_pager_ops default_pager_ops = {
        dp_memory_object_synchronize,
        dp_memory_object_map,
        dp_memory_object_last_unmap,
+       dp_memory_object_data_reclaim,
        "default pager"
 };
 
@@ -431,6 +432,33 @@ dp_memory_object_last_unmap(
        return KERN_FAILURE;
 }
 
+kern_return_t
+dp_memory_object_data_reclaim(
+       memory_object_t         mem_obj,
+       boolean_t               reclaim_backing_store)
+{
+       vstruct_t               vs;
+
+       vs_lookup(mem_obj, vs);
+       for (;;) {
+               vs_lock(vs);
+               vs_async_wait(vs);
+               if (!vs->vs_xfer_pending) {
+                       break;
+               }
+       }
+       vs->vs_xfer_pending = TRUE;
+       vs_unlock(vs);
+
+       ps_vstruct_reclaim(vs, TRUE, reclaim_backing_store);
+
+       vs_lock(vs);
+       vs->vs_xfer_pending = FALSE;
+       vs_unlock(vs);
+
+       return KERN_SUCCESS;
+}
+
 kern_return_t
 dp_memory_object_terminate(
        memory_object_t         mem_obj)