* * vm_map_copy_swap_object: * * Copies a swap-backed object from an existing map entry to a * new one. Carries forward the swap charge. May change the * src object on return. */
| 4085 | * src object on return. |
| 4086 | */ |
| 4087 | static void |
| 4088 | vm_map_copy_swap_object(vm_map_entry_t src_entry, vm_map_entry_t dst_entry, |
| 4089 | vm_offset_t size, vm_ooffset_t *fork_charge) |
| 4090 | { |
| 4091 | vm_object_t src_object; |
| 4092 | struct ucred *cred; |
| 4093 | int charged; |
| 4094 | |
| 4095 | src_object = src_entry->object.vm_object; |
| 4096 | charged = ENTRY_CHARGED(src_entry); |
| 4097 | if ((src_object->flags & OBJ_ANON) != 0) { |
| 4098 | VM_OBJECT_WLOCK(src_object); |
| 4099 | vm_object_collapse(src_object); |
| 4100 | if ((src_object->flags & OBJ_ONEMAPPING) != 0) { |
| 4101 | vm_object_split(src_entry); |
| 4102 | src_object = src_entry->object.vm_object; |
| 4103 | } |
| 4104 | vm_object_reference_locked(src_object); |
| 4105 | vm_object_clear_flag(src_object, OBJ_ONEMAPPING); |
| 4106 | VM_OBJECT_WUNLOCK(src_object); |
| 4107 | } else |
| 4108 | vm_object_reference(src_object); |
| 4109 | if (src_entry->cred != NULL && |
| 4110 | !(src_entry->eflags & MAP_ENTRY_NEEDS_COPY)) { |
| 4111 | KASSERT(src_object->cred == NULL, |
| 4112 | ("OVERCOMMIT: vm_map_copy_anon_entry: cred %p", |
| 4113 | src_object)); |
| 4114 | src_object->cred = src_entry->cred; |
| 4115 | src_object->charge = size; |
| 4116 | } |
| 4117 | dst_entry->object.vm_object = src_object; |
| 4118 | if (charged) { |
| 4119 | cred = curthread->td_ucred; |
| 4120 | crhold(cred); |
| 4121 | dst_entry->cred = cred; |
| 4122 | *fork_charge += size; |
| 4123 | if (!(src_entry->eflags & MAP_ENTRY_NEEDS_COPY)) { |
| 4124 | crhold(cred); |
| 4125 | src_entry->cred = cred; |
| 4126 | *fork_charge += size; |
| 4127 | } |
| 4128 | } |
| 4129 | } |
| 4130 | |
| 4131 | /* |
| 4132 | * vm_map_copy_entry: |
no test coverage detected