--- Net2/vm/vm_map.c 2018/04/24 18:03:57 1.1 +++ Net2/vm/vm_map.c 2018/04/24 18:09:15 1.1.1.3 @@ -272,9 +272,10 @@ vm_map_entry_t vm_map_entry_create(map) vm_map_t map; { vm_map_entry_t entry; - extern vm_map_t kernel_map, kmem_map, mb_map; + extern vm_map_t kernel_map, kmem_map, mb_map, buffer_map, pager_map; - if (map == kernel_map || map == kmem_map || map == mb_map) { + if (map == kernel_map || map == kmem_map || map == mb_map + || map == buffer_map || map == pager_map) { if (entry = kentry_free) kentry_free = kentry_free->next; } else @@ -295,9 +296,10 @@ void vm_map_entry_dispose(map, entry) vm_map_t map; vm_map_entry_t entry; { - extern vm_map_t kernel_map, kmem_map, mb_map; + extern vm_map_t kernel_map, kmem_map, mb_map, buffer_map, pager_map; - if (map == kernel_map || map == kmem_map || map == mb_map) { + if (map == kernel_map || map == kmem_map || map == mb_map + || map == buffer_map || map == pager_map) { entry->next = kentry_free; kentry_free = entry; } else @@ -1121,6 +1123,8 @@ vm_map_pageable(map, start, end, new_pag { register vm_map_entry_t entry; vm_map_entry_t temp_entry; + register vm_offset_t failed; + int rv; vm_map_lock(map); @@ -1273,10 +1277,26 @@ vm_map_pageable(map, start, end, new_pag lock_write_to_read(&map->lock); } + rv = 0; entry = temp_entry; while (entry != &map->header && entry->start < end) { - if (entry->wired_count == 1) { - vm_fault_wire(map, entry->start, entry->end); + /* + * If vm_fault_wire fails for any page we need to + * undo what has been done. We decrement the wiring + * count for those pages which have not yet been + * wired (now) and unwire those that have (later). + * + * XXX this violates the locking protocol on the map, + * needs to be fixed. + */ + if (rv) + entry->wired_count--; + else if (entry->wired_count == 1) { + rv = vm_fault_wire(map, entry->start, entry->end); + if (rv) { + failed = entry->start; + entry->wired_count--; + } } entry = entry->next; } @@ -1287,6 +1307,11 @@ vm_map_pageable(map, start, end, new_pag else { lock_clear_recursive(&map->lock); } + if (rv) { + vm_map_unlock(map); + (void) vm_map_pageable(map, start, failed, TRUE); + return(rv); + } } vm_map_unlock(map);