Change vm_object_madvise() so that it checks whether the page is invalid
or unmanaged before acquiring the page queues lock. Neither of these tests require that lock. Moreover, a better way of testing if the page is unmanaged is to test the type of vm object. This avoids a pointless vm_page_lookup(). MFC after: 3 weeks
This commit is contained in:
parent
ab8f1a2302
commit
e3ebeca68e
@ -1162,7 +1162,8 @@ shadowlookup:
|
||||
(tobject->flags & OBJ_ONEMAPPING) == 0) {
|
||||
goto unlock_tobject;
|
||||
}
|
||||
}
|
||||
} else if (tobject->type == OBJT_PHYS)
|
||||
goto unlock_tobject;
|
||||
m = vm_page_lookup(tobject, tpindex);
|
||||
if (m == NULL && advise == MADV_WILLNEED) {
|
||||
/*
|
||||
@ -1189,18 +1190,13 @@ shadowlookup:
|
||||
VM_OBJECT_UNLOCK(tobject);
|
||||
tobject = backing_object;
|
||||
goto shadowlookup;
|
||||
}
|
||||
} else if (m->valid != VM_PAGE_BITS_ALL)
|
||||
goto unlock_tobject;
|
||||
/*
|
||||
* If the page is busy or not in a normal active state,
|
||||
* we skip it. If the page is not managed there are no
|
||||
* page queues to mess with. Things can break if we mess
|
||||
* with pages in any of the below states.
|
||||
* If the page is not in a normal state, skip it.
|
||||
*/
|
||||
vm_page_lock_queues();
|
||||
if (m->hold_count ||
|
||||
m->wire_count ||
|
||||
(m->flags & PG_UNMANAGED) ||
|
||||
m->valid != VM_PAGE_BITS_ALL) {
|
||||
if (m->hold_count != 0 || m->wire_count != 0) {
|
||||
vm_page_unlock_queues();
|
||||
goto unlock_tobject;
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user