]> git.saurik.com Git - apple/xnu.git/blobdiff - osfmk/default_pager/dp_memory_object.c
xnu-2782.20.48.tar.gz
[apple/xnu.git] / osfmk / default_pager / dp_memory_object.c
index e122e7711d967ff179a6786e84331beb7afe3976..3ffa10e447a17a31aa5a3fb06cc7ddaa09136469 100644 (file)
@@ -350,8 +350,8 @@ default_pager_add(
                pset = default_pager_external_set;
        }
 
                pset = default_pager_external_set;
        }
 
-       ipc_port_make_sonce(mem_obj);
        ip_lock(mem_obj);  /* unlocked in nsrequest below */
        ip_lock(mem_obj);  /* unlocked in nsrequest below */
+       ipc_port_make_sonce_locked(mem_obj);
        ipc_port_nsrequest(mem_obj, sync, mem_obj, &previous);
 }
 
        ipc_port_nsrequest(mem_obj, sync, mem_obj, &previous);
 }
 
@@ -438,6 +438,7 @@ dp_memory_object_data_reclaim(
        boolean_t               reclaim_backing_store)
 {
        vstruct_t               vs;
        boolean_t               reclaim_backing_store)
 {
        vstruct_t               vs;
+       kern_return_t           retval;
 
        vs_lookup(mem_obj, vs);
        for (;;) {
 
        vs_lookup(mem_obj, vs);
        for (;;) {
@@ -450,13 +451,13 @@ dp_memory_object_data_reclaim(
        vs->vs_xfer_pending = TRUE;
        vs_unlock(vs);
 
        vs->vs_xfer_pending = TRUE;
        vs_unlock(vs);
 
-       ps_vstruct_reclaim(vs, TRUE, reclaim_backing_store);
+       retval = ps_vstruct_reclaim(vs, TRUE, reclaim_backing_store);
 
        vs_lock(vs);
        vs->vs_xfer_pending = FALSE;
        vs_unlock(vs);
 
 
        vs_lock(vs);
        vs->vs_xfer_pending = FALSE;
        vs_unlock(vs);
 
-       return KERN_SUCCESS;
+       return retval;
 }
 
 kern_return_t
 }
 
 kern_return_t
@@ -776,6 +777,9 @@ dp_memory_object_data_return(
        vs_lookup(mem_obj, vs);
 
         default_pager_total++;
        vs_lookup(mem_obj, vs);
 
         default_pager_total++;
+
+       /* might be unreachable if VS_TRY_LOCK is, by definition, always true */
+       __unreachable_ok_push
        if(!VS_TRY_LOCK(vs)) {
                /* the call below will not be done by caller when we have */
                /* a synchronous interface */
        if(!VS_TRY_LOCK(vs)) {
                /* the call below will not be done by caller when we have */
                /* a synchronous interface */
@@ -792,6 +796,7 @@ dp_memory_object_data_return(
                upl_deallocate(upl);
                return KERN_SUCCESS;
        }
                upl_deallocate(upl);
                return KERN_SUCCESS;
        }
+       __unreachable_ok_pop
 
        if ((vs->vs_seqno != vs->vs_next_seqno++)
                        || (vs->vs_readers)
 
        if ((vs->vs_seqno != vs->vs_next_seqno++)
                        || (vs->vs_readers)
@@ -967,7 +972,8 @@ default_pager_objects(
        /*
         * Out out-of-line port arrays are simply kalloc'ed.
         */
        /*
         * Out out-of-line port arrays are simply kalloc'ed.
         */
-       psize = round_page(actual * sizeof (*pagers));
+       psize = vm_map_round_page(actual * sizeof (*pagers),
+                                 vm_map_page_mask(ipc_kernel_map));
        ppotential = (unsigned int) (psize / sizeof (*pagers));
        pagers = (memory_object_t *)kalloc(psize);
        if (0 == pagers)
        ppotential = (unsigned int) (psize / sizeof (*pagers));
        pagers = (memory_object_t *)kalloc(psize);
        if (0 == pagers)
@@ -979,7 +985,8 @@ default_pager_objects(
         * then "copied in" as if it had been sent by a
         * user process.
         */
         * then "copied in" as if it had been sent by a
         * user process.
         */
-       osize = round_page(actual * sizeof (*objects));
+       osize = vm_map_round_page(actual * sizeof (*objects),
+                                 vm_map_page_mask(ipc_kernel_map));
        opotential = (unsigned int) (osize / sizeof (*objects));
        kr = kmem_alloc(ipc_kernel_map, &oaddr, osize);
        if (KERN_SUCCESS != kr) {
        opotential = (unsigned int) (osize / sizeof (*objects));
        kr = kmem_alloc(ipc_kernel_map, &oaddr, osize);
        if (KERN_SUCCESS != kr) {
@@ -1065,8 +1072,12 @@ default_pager_objects(
                pagers[--ppotential] = MEMORY_OBJECT_NULL;
        }
 
                pagers[--ppotential] = MEMORY_OBJECT_NULL;
        }
 
-       kr = vm_map_unwire(ipc_kernel_map, vm_map_trunc_page(oaddr),
-                          vm_map_round_page(oaddr + osize), FALSE);
+       kr = vm_map_unwire(ipc_kernel_map,
+                          vm_map_trunc_page(oaddr,
+                                            vm_map_page_mask(ipc_kernel_map)),
+                          vm_map_round_page(oaddr + osize,
+                                            vm_map_page_mask(ipc_kernel_map)),
+                          FALSE);
        assert(KERN_SUCCESS == kr);
        kr = vm_map_copyin(ipc_kernel_map, (vm_map_address_t)oaddr,
                           (vm_map_size_t)osize, TRUE, &pcopy);
        assert(KERN_SUCCESS == kr);
        kr = vm_map_copyin(ipc_kernel_map, (vm_map_address_t)oaddr,
                           (vm_map_size_t)osize, TRUE, &pcopy);
@@ -1148,7 +1159,8 @@ default_pager_object_pages(
                if (0 != addr)
                        kmem_free(ipc_kernel_map, addr, size);
 
                if (0 != addr)
                        kmem_free(ipc_kernel_map, addr, size);
 
-               size = round_page(actual * sizeof (*pages));
+               size = vm_map_round_page(actual * sizeof (*pages),
+                                        vm_map_page_mask(ipc_kernel_map));
                kr = kmem_alloc(ipc_kernel_map, &addr, size);
                if (KERN_SUCCESS != kr)
                        return KERN_RESOURCE_SHORTAGE;
                kr = kmem_alloc(ipc_kernel_map, &addr, size);
                if (KERN_SUCCESS != kr)
                        return KERN_RESOURCE_SHORTAGE;
@@ -1163,8 +1175,12 @@ default_pager_object_pages(
        while (actual < potential)
                pages[--potential].dpp_offset = 0;
 
        while (actual < potential)
                pages[--potential].dpp_offset = 0;
 
-       kr = vm_map_unwire(ipc_kernel_map, vm_map_trunc_page(addr),
-                          vm_map_round_page(addr + size), FALSE);
+       kr = vm_map_unwire(ipc_kernel_map,
+                          vm_map_trunc_page(addr,
+                                            vm_map_page_mask(ipc_kernel_map)),
+                          vm_map_round_page(addr + size,
+                                            vm_map_page_mask(ipc_kernel_map)),
+                          FALSE);
        assert(KERN_SUCCESS == kr);
        kr = vm_map_copyin(ipc_kernel_map, (vm_map_address_t)addr,
                           (vm_map_size_t)size, TRUE, &copy);
        assert(KERN_SUCCESS == kr);
        kr = vm_map_copyin(ipc_kernel_map, (vm_map_address_t)addr,
                           (vm_map_size_t)size, TRUE, &copy);