|
|
| version 1.26, 2004/04/26 20:26:59 | version 1.27, 2004/05/13 17:40:19 |
|---|---|
| Line 2489 vm_map_split(vm_map_entry_t entry) | Line 2489 vm_map_split(vm_map_entry_t entry) |
| for (idx = 0; idx < size; idx++) { | for (idx = 0; idx < size; idx++) { |
| vm_page_t m; | vm_page_t m; |
| int ss; /* s used */ | |
| /* | |
| * splvm protection is required to avoid a race between | |
| * the lookup and an interrupt/unbusy/free and our busy | |
| * check. | |
| */ | |
| ss = splvm(); | |
| retry: | retry: |
| m = vm_page_lookup(orig_object, offidxstart + idx); | m = vm_page_lookup(orig_object, offidxstart + idx); |
| if (m == NULL) | if (m == NULL) { |
| splx(ss); | |
| continue; | continue; |
| } | |
| /* | /* |
| * We must wait for pending I/O to complete before we can | * We must wait for pending I/O to complete before we can |
| Line 2504 vm_map_split(vm_map_entry_t entry) | Line 2513 vm_map_split(vm_map_entry_t entry) |
| */ | */ |
| if (vm_page_sleep_busy(m, TRUE, "spltwt")) | if (vm_page_sleep_busy(m, TRUE, "spltwt")) |
| goto retry; | goto retry; |
| vm_page_busy(m); | vm_page_busy(m); |
| vm_page_rename(m, new_object, idx); | vm_page_rename(m, new_object, idx); |
| /* page automatically made dirty by rename and cache handled */ | /* page automatically made dirty by rename and cache handled */ |
| vm_page_busy(m); | vm_page_busy(m); |
| splx(ss); | |
| } | } |
| if (orig_object->type == OBJT_SWAP) { | if (orig_object->type == OBJT_SWAP) { |
| Line 2522 vm_map_split(vm_map_entry_t entry) | Line 2531 vm_map_split(vm_map_entry_t entry) |
| vm_object_pip_wakeup(orig_object); | vm_object_pip_wakeup(orig_object); |
| } | } |
| /* | |
| * Wakeup the pages we played with. No spl protection is needed | |
| * for a simple wakeup. | |
| */ | |
| for (idx = 0; idx < size; idx++) { | for (idx = 0; idx < size; idx++) { |
| m = vm_page_lookup(new_object, idx); | m = vm_page_lookup(new_object, idx); |
| if (m) { | if (m) |
| vm_page_wakeup(m); | vm_page_wakeup(m); |
| } | |
| } | } |
| entry->object.vm_object = new_object; | entry->object.vm_object = new_object; |
| Line 3262 vm_map_lookup_done(vm_map_t map, vm_map_ | Line 3274 vm_map_lookup_done(vm_map_t map, vm_map_ |
| * Implement uiomove with VM operations. This handles (and collateral changes) | * Implement uiomove with VM operations. This handles (and collateral changes) |
| * support every combination of source object modification, and COW type | * support every combination of source object modification, and COW type |
| * operations. | * operations. |
| * | |
| * XXX this is extremely dangerous, enabling this option is NOT recommended. | |
| */ | */ |
| int | int |
| vm_uiomove(vm_map_t mapa, vm_object_t srcobject, off_t cp, int cnta, | vm_uiomove(vm_map_t mapa, vm_object_t srcobject, off_t cp, int cnta, |
| Line 3278 vm_uiomove(vm_map_t mapa, vm_object_t sr | Line 3292 vm_uiomove(vm_map_t mapa, vm_object_t sr |
| off_t ooffset; | off_t ooffset; |
| int cnt; | int cnt; |
| int count; | int count; |
| int s; | |
| if (npages) | if (npages) |
| *npages = 0; | *npages = 0; |
| Line 3315 vm_uiomove(vm_map_t mapa, vm_object_t sr | Line 3330 vm_uiomove(vm_map_t mapa, vm_object_t sr |
| oindex = OFF_TO_IDX(cp); | oindex = OFF_TO_IDX(cp); |
| if (npages) { | if (npages) { |
| vm_pindex_t idx; | vm_pindex_t idx; |
| /* | |
| * spl protection is needed to avoid a race between | |
| * the lookup and an interrupt/unbusy/free occuring | |
| * prior to our busy check. | |
| */ | |
| s = splvm(); | |
| for (idx = 0; idx < osize; idx++) { | for (idx = 0; idx < osize; idx++) { |
| vm_page_t m; | vm_page_t m; |
| if ((m = vm_page_lookup(srcobject, oindex + idx)) == NULL) { | if ((m = vm_page_lookup(srcobject, oindex + idx)) == NULL) { |
| splx(s); | |
| vm_map_lookup_done(map, entry, count); | vm_map_lookup_done(map, entry, count); |
| return 0; | return 0; |
| } | } |
| Line 3327 vm_uiomove(vm_map_t mapa, vm_object_t sr | Line 3350 vm_uiomove(vm_map_t mapa, vm_object_t sr |
| */ | */ |
| if ((m->flags & PG_BUSY) || | if ((m->flags & PG_BUSY) || |
| ((m->valid & VM_PAGE_BITS_ALL) != VM_PAGE_BITS_ALL)) { | ((m->valid & VM_PAGE_BITS_ALL) != VM_PAGE_BITS_ALL)) { |
| splx(s); | |
| vm_map_lookup_done(map, entry, count); | vm_map_lookup_done(map, entry, count); |
| return 0; | return 0; |
| } | } |
| } | } |
| splx(s); | |
| } | } |
| /* | /* |
| Line 3511 vm_freeze_copyopts(vm_object_t object, v | Line 3536 vm_freeze_copyopts(vm_object_t object, v |
| if (object->shadow_count > object->ref_count) | if (object->shadow_count > object->ref_count) |
| panic("vm_freeze_copyopts: sc > rc"); | panic("vm_freeze_copyopts: sc > rc"); |
| while((robject = LIST_FIRST(&object->shadow_head)) != NULL) { | while ((robject = LIST_FIRST(&object->shadow_head)) != NULL) { |
| vm_pindex_t bo_pindex; | vm_pindex_t bo_pindex; |
| vm_page_t m_in, m_out; | vm_page_t m_in, m_out; |