summaryrefslogtreecommitdiffstats
path: root/sys/vm
diff options
context:
space:
mode:
authordyson <dyson@FreeBSD.org>1998-05-04 03:01:44 +0000
committerdyson <dyson@FreeBSD.org>1998-05-04 03:01:44 +0000
commitdfdb369a7d706526b72dc7bff958688de5ca72a2 (patch)
tree2bf3497de13a2e7c2ced291564c639a2c97f01f9 /sys/vm
parent869ef5d1be6f873153140a04951a273e92256975 (diff)
downloadFreeBSD-src-dfdb369a7d706526b72dc7bff958688de5ca72a2.zip
FreeBSD-src-dfdb369a7d706526b72dc7bff958688de5ca72a2.tar.gz
Work around some VM bugs, the worst being an overly aggressive
swap space free calculation. More complete fixes will be forthcoming, in a week.
Diffstat (limited to 'sys/vm')
-rw-r--r--sys/vm/swap_pager.c19
-rw-r--r--sys/vm/vm_fault.c5
-rw-r--r--sys/vm/vm_map.c40
3 files changed, 39 insertions, 25 deletions
diff --git a/sys/vm/swap_pager.c b/sys/vm/swap_pager.c
index ea1824d..2f0305a 100644
--- a/sys/vm/swap_pager.c
+++ b/sys/vm/swap_pager.c
@@ -39,7 +39,7 @@
* from: Utah $Hdr: swap_pager.c 1.4 91/04/30$
*
* @(#)swap_pager.c 8.9 (Berkeley) 3/21/94
- * $Id: swap_pager.c,v 1.93 1998/04/15 17:47:35 bde Exp $
+ * $Id: swap_pager.c,v 1.94 1998/04/29 04:27:59 dyson Exp $
*/
/*
@@ -631,7 +631,8 @@ rfinished:
*/
void
-swap_pager_copy(srcobject, srcoffset, dstobject, dstoffset, offset, destroysource)
+swap_pager_copy(srcobject, srcoffset, dstobject, dstoffset,
+ offset, destroysource)
vm_object_t srcobject;
vm_pindex_t srcoffset;
vm_object_t dstobject;
@@ -651,10 +652,12 @@ swap_pager_copy(srcobject, srcoffset, dstobject, dstoffset, offset, destroysourc
/*
* remove the source object from the swap_pager internal queue
*/
- if (srcobject->handle == NULL) {
- TAILQ_REMOVE(&swap_pager_un_object_list, srcobject, pager_object_list);
- } else {
- TAILQ_REMOVE(&swap_pager_object_list, srcobject, pager_object_list);
+ if (destroysource) {
+ if (srcobject->handle == NULL) {
+ TAILQ_REMOVE(&swap_pager_un_object_list, srcobject, pager_object_list);
+ } else {
+ TAILQ_REMOVE(&swap_pager_object_list, srcobject, pager_object_list);
+ }
}
s = splvm();
@@ -673,8 +676,8 @@ swap_pager_copy(srcobject, srcoffset, dstobject, dstoffset, offset, destroysourc
*/
for (i = 0; i < dstobject->size; i += 1) {
int srcvalid, dstvalid;
- daddr_t *srcaddrp = swap_pager_diskaddr(srcobject, i + offset + srcoffset,
- &srcvalid);
+ daddr_t *srcaddrp = swap_pager_diskaddr(srcobject,
+ i + offset + srcoffset, &srcvalid);
daddr_t *dstaddrp;
/*
diff --git a/sys/vm/vm_fault.c b/sys/vm/vm_fault.c
index 52a2393..e664573 100644
--- a/sys/vm/vm_fault.c
+++ b/sys/vm/vm_fault.c
@@ -66,7 +66,7 @@
* any improvements or extensions that they make and grant Carnegie the
* rights to redistribute these changes.
*
- * $Id: vm_fault.c,v 1.81 1998/03/01 04:18:18 dyson Exp $
+ * $Id: vm_fault.c,v 1.82 1998/03/07 20:45:47 dyson Exp $
*/
/*
@@ -606,7 +606,8 @@ readrest:
*/
vm_page_rename(fs.m, fs.first_object, fs.first_pindex);
fs.first_m = fs.m;
- fs.m->dirty = VM_PAGE_BITS_ALL;
+ fs.first_m->dirty = VM_PAGE_BITS_ALL;
+ fs.first_m->flags |= PG_BUSY;
fs.m = NULL;
cnt.v_cow_optim++;
} else {
diff --git a/sys/vm/vm_map.c b/sys/vm/vm_map.c
index 8eef298..ab961b3 100644
--- a/sys/vm/vm_map.c
+++ b/sys/vm/vm_map.c
@@ -61,7 +61,7 @@
* any improvements or extensions that they make and grant Carnegie the
* rights to redistribute these changes.
*
- * $Id: vm_map.c,v 1.122 1998/05/01 02:25:29 dyson Exp $
+ * $Id: vm_map.c,v 1.123 1998/05/02 06:36:16 dyson Exp $
*/
/*
@@ -541,6 +541,13 @@ vm_map_insert(vm_map_t map, vm_object_t object, vm_ooffset_t offset,
new_entry->eflags = protoeflags;
new_entry->object.vm_object = object;
new_entry->offset = offset;
+ if (object) {
+ if ((object->ref_count > 1) || (object->shadow_count != 0)) {
+ object->flags &= ~OBJ_ONEMAPPING;
+ } else {
+ object->flags |= OBJ_ONEMAPPING;
+ }
+ }
if (map->is_main_map) {
new_entry->inheritance = VM_INHERIT_DEFAULT;
@@ -1751,6 +1758,7 @@ vm_map_delete(map, start, end)
vm_offset_t start;
vm_offset_t end;
{
+ vm_object_t object;
vm_map_entry_t entry;
vm_map_entry_t first_entry;
@@ -1760,9 +1768,9 @@ vm_map_delete(map, start, end)
if (!vm_map_lookup_entry(map, start, &first_entry)) {
entry = first_entry->next;
- if (entry->object.vm_object &&
- (entry->object.vm_object->ref_count == 1))
- entry->object.vm_object->flags |= OBJ_ONEMAPPING;
+ object = entry->object.vm_object;
+ if (object && (object->ref_count == 1) && (object->shadow_count == 0))
+ object->flags |= OBJ_ONEMAPPING;
} else {
entry = first_entry;
vm_map_clip_start(map, entry, start);
@@ -1790,20 +1798,17 @@ vm_map_delete(map, start, end)
while ((entry != &map->header) && (entry->start < end)) {
vm_map_entry_t next;
vm_offset_t s, e;
- vm_object_t object;
- vm_pindex_t offidxstart, offidxend;
- vm_ooffset_t offset;
+ vm_pindex_t offidxstart, offidxend, count;
vm_map_clip_end(map, entry, end);
- offset = entry->offset;
s = entry->start;
e = entry->end;
next = entry->next;
- object = entry->object.vm_object;
- offidxstart = OFF_TO_IDX(offset);
- offidxend = offidxstart + OFF_TO_IDX(e - s);
+ offidxstart = OFF_TO_IDX(entry->offset);
+ count = OFF_TO_IDX(e - s);
+ object = entry->object.vm_object;
/*
* Unwire before removing addresses from the pmap; otherwise,
@@ -1813,6 +1818,7 @@ vm_map_delete(map, start, end)
vm_map_entry_unwire(map, entry);
}
+ offidxend = offidxstart + count;
/*
* If this is a sharing map, we must remove *all* references
* to this data, since we can't find all of the physical maps
@@ -1831,10 +1837,12 @@ vm_map_delete(map, start, end)
vm_object_collapse(object);
vm_object_page_remove(object, offidxstart, offidxend, FALSE);
if (object->type == OBJT_SWAP) {
- swap_pager_freespace(object, offidxstart, offidxend);
+ swap_pager_freespace(object, offidxstart, count);
}
- if (object->size <= offidxend) {
- object->size = offidxstart;
+
+ if ((offidxend >= object->size) &&
+ (offidxstart < object->size)) {
+ object->size = offidxstart;
}
}
}
@@ -2045,6 +2053,7 @@ vm_map_copy_entry(src_map, dst_map, src_entry, dst_entry)
vm_object_collapse(src_object);
if (src_object->flags & OBJ_ONEMAPPING) {
vm_map_split(src_entry);
+ src_map->timestamp++;
src_object = src_entry->object.vm_object;
}
}
@@ -2120,7 +2129,6 @@ vmspace_fork(vm1)
if (object == NULL) {
object = vm_object_allocate(OBJT_DEFAULT,
atop(old_entry->end - old_entry->start));
- object->flags &= ~OBJ_ONEMAPPING;
old_entry->object.vm_object = object;
old_entry->offset = (vm_offset_t) 0;
} else if (old_entry->eflags & MAP_ENTRY_NEEDS_COPY) {
@@ -2130,6 +2138,7 @@ vmspace_fork(vm1)
old_entry->eflags &= ~MAP_ENTRY_NEEDS_COPY;
object = old_entry->object.vm_object;
}
+ object->flags &= ~OBJ_ONEMAPPING;
/*
* Clone the entry, referencing the sharing map.
@@ -2177,6 +2186,7 @@ vmspace_fork(vm1)
new_map->size = old_map->size;
vm_map_unlock(old_map);
+ old_map->timestamp++;
return (vm2);
}
OpenPOWER on IntegriCloud