Back out all behavioral chnages.

This commit is contained in:
Brian Feldman 2004-08-10 14:42:48 +00:00
parent de0d0233b8
commit 0ada205ee6
2 changed files with 17 additions and 36 deletions

View File

@ -206,11 +206,7 @@ kmem_free(map, addr, size)
vm_offset_t addr; vm_offset_t addr;
vm_size_t size; vm_size_t size;
{ {
int error;
error = vm_map_unwire(map, trunc_page(addr), round_page(addr + size),
VM_MAP_WIRE_SYSTEM | VM_MAP_WIRE_HOLESOK);
KASSERT(error == 0, ("kmem_free could not vm_map_unwire"));
(void) vm_map_remove(map, trunc_page(addr), round_page(addr + size)); (void) vm_map_remove(map, trunc_page(addr), round_page(addr + size));
} }

View File

@ -1606,8 +1606,6 @@ vm_map_inherit(vm_map_t map, vm_offset_t start, vm_offset_t end,
* vm_map_unwire: * vm_map_unwire:
* *
* Implements both kernel and user unwiring. * Implements both kernel and user unwiring.
*
* Ignores MAP_NOFAULT (wired_count == 0 is okay) for kernel unwiring.
*/ */
int int
vm_map_unwire(vm_map_t map, vm_offset_t start, vm_offset_t end, vm_map_unwire(vm_map_t map, vm_offset_t start, vm_offset_t end,
@ -1700,9 +1698,8 @@ vm_map_unwire(vm_map_t map, vm_offset_t start, vm_offset_t end,
/* /*
* If system unwiring, require that the entry is system wired. * If system unwiring, require that the entry is system wired.
*/ */
if (user_unwire ? vm_map_entry_user_wired_count(entry) == 0 : if (!user_unwire &&
(vm_map_entry_system_wired_count(entry) == 0 && vm_map_entry_system_wired_count(entry) == 0) {
(entry->eflags & MAP_ENTRY_NOFAULT) == 0)) {
end = entry->end; end = entry->end;
rv = KERN_INVALID_ARGUMENT; rv = KERN_INVALID_ARGUMENT;
goto done; goto done;
@ -1725,11 +1722,8 @@ done:
(entry->eflags & MAP_ENTRY_USER_WIRED))) { (entry->eflags & MAP_ENTRY_USER_WIRED))) {
if (user_unwire) if (user_unwire)
entry->eflags &= ~MAP_ENTRY_USER_WIRED; entry->eflags &= ~MAP_ENTRY_USER_WIRED;
if (user_unwire ||
(entry->eflags & MAP_ENTRY_NOFAULT) == 0)
entry->wired_count--; entry->wired_count--;
if (entry->wired_count == 0 && if (entry->wired_count == 0) {
(entry->eflags & MAP_ENTRY_NOFAULT) == 0) {
/* /*
* Retain the map lock. * Retain the map lock.
*/ */
@ -1837,14 +1831,10 @@ vm_map_wire(vm_map_t map, vm_offset_t start, vm_offset_t end,
*/ */
entry->eflags |= MAP_ENTRY_IN_TRANSITION; entry->eflags |= MAP_ENTRY_IN_TRANSITION;
/* /*
* The wired_count keeps track of zero or one user *
* wirings. It also keeps track of system wirings if
* MAP_ENTRY_NOFAULT is not set.
*/ */
if ((user_wire ? vm_map_entry_user_wired_count(entry) == 0 : if (entry->wired_count == 0) {
(entry->eflags & MAP_ENTRY_NOFAULT) == 0) && entry->wired_count++;
entry->wired_count++ == 0 &&
(entry->eflags & MAP_ENTRY_NOFAULT) == 0) {
saved_start = entry->start; saved_start = entry->start;
saved_end = entry->end; saved_end = entry->end;
fictitious = entry->object.vm_object != NULL && fictitious = entry->object.vm_object != NULL &&
@ -1893,6 +1883,9 @@ vm_map_wire(vm_map_t map, vm_offset_t start, vm_offset_t end,
end = entry->end; end = entry->end;
goto done; goto done;
} }
} else if (!user_wire ||
(entry->eflags & MAP_ENTRY_USER_WIRED) == 0) {
entry->wired_count++;
} }
/* /*
* Check the map for holes in the specified region. * Check the map for holes in the specified region.
@ -1920,11 +1913,6 @@ done:
entry = first_entry; entry = first_entry;
while (entry != &map->header && entry->start < end) { while (entry != &map->header && entry->start < end) {
if (rv == KERN_SUCCESS) { if (rv == KERN_SUCCESS) {
/*
* The MAP_ENTRY_USER_WIRED may already have been
* set. If so, this statement has no effect
* (and wired_count will not have changed).
*/
if (user_wire) if (user_wire)
entry->eflags |= MAP_ENTRY_USER_WIRED; entry->eflags |= MAP_ENTRY_USER_WIRED;
} else if (entry->wired_count == -1) { } else if (entry->wired_count == -1) {
@ -1934,11 +1922,10 @@ done:
*/ */
entry->wired_count = 0; entry->wired_count = 0;
} else { } else {
if (user_wire || if (!user_wire ||
(entry->eflags & MAP_ENTRY_NOFAULT) == 0) (entry->eflags & MAP_ENTRY_USER_WIRED) == 0)
entry->wired_count--; entry->wired_count--;
if (entry->wired_count == 0 && if (entry->wired_count == 0) {
(entry->eflags & MAP_ENTRY_NOFAULT) == 0) {
/* /*
* Retain the map lock. * Retain the map lock.
*/ */
@ -2066,9 +2053,6 @@ vm_map_sync(
static void static void
vm_map_entry_unwire(vm_map_t map, vm_map_entry_t entry) vm_map_entry_unwire(vm_map_t map, vm_map_entry_t entry)
{ {
KASSERT(vm_map_entry_user_wired_count(entry) == 1 &&
vm_map_entry_system_wired_count(entry) == 0,
("system/user wiring mistake"));
vm_fault_unwire(map, entry->start, entry->end, vm_fault_unwire(map, entry->start, entry->end,
entry->object.vm_object != NULL && entry->object.vm_object != NULL &&
entry->object.vm_object->type == OBJT_DEVICE); entry->object.vm_object->type == OBJT_DEVICE);
@ -2153,10 +2137,8 @@ vm_map_delete(vm_map_t map, vm_offset_t start, vm_offset_t end)
/* /*
* Wait for wiring or unwiring of an entry to complete. * Wait for wiring or unwiring of an entry to complete.
* Also wait for any system wirings to disappear.
*/ */
if ((entry->eflags & MAP_ENTRY_IN_TRANSITION) != 0 || if ((entry->eflags & MAP_ENTRY_IN_TRANSITION) != 0) {
vm_map_entry_system_wired_count(entry) != 0) {
unsigned int last_timestamp; unsigned int last_timestamp;
vm_offset_t saved_start; vm_offset_t saved_start;
vm_map_entry_t tmp_entry; vm_map_entry_t tmp_entry;
@ -3039,6 +3021,9 @@ RetryLookup:;
*pindex = OFF_TO_IDX((vaddr - entry->start) + entry->offset); *pindex = OFF_TO_IDX((vaddr - entry->start) + entry->offset);
*object = entry->object.vm_object; *object = entry->object.vm_object;
/*
* Return whether this is the only map sharing this data.
*/
*out_prot = prot; *out_prot = prot;
return (KERN_SUCCESS); return (KERN_SUCCESS);