summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--sys/vm/vm_map.c9
1 files changed, 5 insertions, 4 deletions
diff --git a/sys/vm/vm_map.c b/sys/vm/vm_map.c
index 5324400..d27df6f 100644
--- a/sys/vm/vm_map.c
+++ b/sys/vm/vm_map.c
@@ -1696,10 +1696,10 @@ vm_map_unwire(vm_map_t map, vm_offset_t start, vm_offset_t end,
goto done;
}
/*
- * Require that the entry is wired.
+ * If system unwiring, require that the entry is system wired.
*/
- if (entry->wired_count == 0 || (user_unwire &&
- (entry->eflags & MAP_ENTRY_USER_WIRED) == 0)) {
+ if (!user_unwire && entry->wired_count < ((entry->eflags &
+ MAP_ENTRY_USER_WIRED) ? 2 : 1)) {
end = entry->end;
rv = KERN_INVALID_ARGUMENT;
goto done;
@@ -1718,7 +1718,8 @@ done:
}
entry = first_entry;
while (entry != &map->header && entry->start < end) {
- if (rv == KERN_SUCCESS) {
+ if (rv == KERN_SUCCESS && (!user_unwire ||
+ (entry->eflags & MAP_ENTRY_USER_WIRED))) {
if (user_unwire)
entry->eflags &= ~MAP_ENTRY_USER_WIRED;
entry->wired_count--;
OpenPOWER on IntegriCloud