Page MenuHomeFreeBSD

D46944.diff
No OneTemporary

D46944.diff

diff --git a/sys/vm/vm_page.c b/sys/vm/vm_page.c
--- a/sys/vm/vm_page.c
+++ b/sys/vm/vm_page.c
@@ -4274,10 +4274,13 @@
*/
old = atomic_load_int(&m->ref_count);
do {
+ u_int count;
+
KASSERT(VPRC_WIRE_COUNT(old) > 0,
("vm_page_unwire: wire count underflow for page %p", m));
- if (old > VPRC_OBJREF + 1) {
+ count = old & ~VPRC_BLOCKED;
+ if (count > VPRC_OBJREF + 1) {
/*
* The page has at least one other wiring reference. An
* earlier iteration of this loop may have called
@@ -4286,7 +4289,7 @@
*/
if ((vm_page_astate_load(m).flags & PGA_DEQUEUE) == 0)
vm_page_aflag_set(m, PGA_DEQUEUE);
- } else if (old == VPRC_OBJREF + 1) {
+ } else if (count == VPRC_OBJREF + 1) {
/*
* This is the last wiring. Clear PGA_DEQUEUE and
* update the page's queue state to reflect the
@@ -4295,7 +4298,7 @@
* clear leftover queue state.
*/
vm_page_release_toq(m, nqueue, noreuse);
- } else if (old == 1) {
+ } else if (count == 1) {
vm_page_aflag_clear(m, PGA_DEQUEUE);
}
} while (!atomic_fcmpset_rel_int(&m->ref_count, &old, old - 1));
@@ -4571,6 +4574,8 @@
do {
KASSERT(old != 0,
("vm_page_try_blocked_op: page %p has no references", m));
+ KASSERT((old & VPRC_BLOCKED) == 0,
+ ("vm_page_try_blocked_op: page %p blocks wirings", m));
if (VPRC_WIRE_COUNT(old) != 0)
return (false);
} while (!atomic_fcmpset_int(&m->ref_count, &old, old | VPRC_BLOCKED));

File Metadata

Mime Type
text/plain
Expires
Sat, Oct 5, 10:44 PM (19 h, 21 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
13651777
Default Alt Text
D46944.diff (1 KB)

Event Timeline