X-Git-Url: https://git.saurik.com/apple/xnu.git/blobdiff_plain/6d2010ae8f7a6078e10b361c6962983bab233e0f..04b8595b18b1b41ac7a206e4b3d51a635f8413d7:/osfmk/default_pager/dp_memory_object.c diff --git a/osfmk/default_pager/dp_memory_object.c b/osfmk/default_pager/dp_memory_object.c index e122e7711..3ffa10e44 100644 --- a/osfmk/default_pager/dp_memory_object.c +++ b/osfmk/default_pager/dp_memory_object.c @@ -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); } @@ -438,6 +438,7 @@ dp_memory_object_data_reclaim( boolean_t reclaim_backing_store) { vstruct_t vs; + kern_return_t retval; vs_lookup(mem_obj, vs); for (;;) { @@ -450,13 +451,13 @@ dp_memory_object_data_reclaim( 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); - return KERN_SUCCESS; + return retval; } kern_return_t @@ -776,6 +777,9 @@ dp_memory_object_data_return( 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 */ @@ -792,6 +796,7 @@ dp_memory_object_data_return( upl_deallocate(upl); return KERN_SUCCESS; } + __unreachable_ok_pop 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. */ - 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) @@ -979,7 +985,8 @@ default_pager_objects( * 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) { @@ -1065,8 +1072,12 @@ default_pager_objects( 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); @@ -1148,7 +1159,8 @@ default_pager_object_pages( 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; @@ -1163,8 +1175,12 @@ default_pager_object_pages( 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, ©);