Page MenuHomeFreeBSD

D14184.diff
No OneTemporary

D14184.diff

Index: head/sys/vm/vm_object.c
===================================================================
--- head/sys/vm/vm_object.c
+++ head/sys/vm/vm_object.c
@@ -2278,7 +2278,7 @@
vm_object_unwire(vm_object_t object, vm_ooffset_t offset, vm_size_t length,
uint8_t queue)
{
- vm_object_t tobject;
+ vm_object_t tobject, t1object;
vm_page_t m, tm;
vm_pindex_t end_pindex, pindex, tpindex;
int depth, locked_depth;
@@ -2292,6 +2292,7 @@
return;
pindex = OFF_TO_IDX(offset);
end_pindex = pindex + atop(length);
+again:
locked_depth = 1;
VM_OBJECT_RLOCK(object);
m = vm_page_find_least(object, pindex);
@@ -2325,16 +2326,26 @@
m = TAILQ_NEXT(m, listq);
}
vm_page_lock(tm);
+ if (vm_page_xbusied(tm)) {
+ for (tobject = object; locked_depth >= 1;
+ locked_depth--) {
+ t1object = tobject->backing_object;
+ VM_OBJECT_RUNLOCK(tobject);
+ tobject = t1object;
+ }
+ vm_page_busy_sleep(tm, "unwbo", true);
+ goto again;
+ }
vm_page_unwire(tm, queue);
vm_page_unlock(tm);
next_page:
pindex++;
}
/* Release the accumulated object locks. */
- for (depth = 0; depth < locked_depth; depth++) {
- tobject = object->backing_object;
- VM_OBJECT_RUNLOCK(object);
- object = tobject;
+ for (tobject = object; locked_depth >= 1; locked_depth--) {
+ t1object = tobject->backing_object;
+ VM_OBJECT_RUNLOCK(tobject);
+ tobject = t1object;
}
}

File Metadata

Mime Type
text/plain
Expires
Thu, Apr 9, 4:30 PM (13 h, 13 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
31143664
Default Alt Text
D14184.diff (1 KB)

Event Timeline