mirror of
https://github.com/freebsd/freebsd-src
synced 2024-10-15 12:54:27 +00:00
Reduce code duplication and exposure of direct access to struct
vm_page oflags by providing helper function vm_page_readahead_finish(), which handles completed reads for pages with indexes other then the requested one, for VOP_GETPAGES(). Reviewed by: alc MFC after: 1 week
This commit is contained in:
parent
843dcea09e
commit
0055cbd3c5
Notes:
svn2git
2020-12-20 02:59:44 +00:00
svn path=/head/; revision=239040
|
@ -223,36 +223,8 @@ ncl_getpages(struct vop_getpages_args *ap)
|
|||
*/
|
||||
;
|
||||
}
|
||||
if (i != ap->a_reqpage) {
|
||||
/*
|
||||
* Whether or not to leave the page activated is up in
|
||||
* the air, but we should put the page on a page queue
|
||||
* somewhere (it already is in the object). Result:
|
||||
* It appears that emperical results show that
|
||||
* deactivating pages is best.
|
||||
*/
|
||||
|
||||
/*
|
||||
* Just in case someone was asking for this page we
|
||||
* now tell them that it is ok to use.
|
||||
*/
|
||||
if (!error) {
|
||||
if (m->oflags & VPO_WANTED) {
|
||||
vm_page_lock(m);
|
||||
vm_page_activate(m);
|
||||
vm_page_unlock(m);
|
||||
} else {
|
||||
vm_page_lock(m);
|
||||
vm_page_deactivate(m);
|
||||
vm_page_unlock(m);
|
||||
}
|
||||
vm_page_wakeup(m);
|
||||
} else {
|
||||
vm_page_lock(m);
|
||||
vm_page_free(m);
|
||||
vm_page_unlock(m);
|
||||
}
|
||||
}
|
||||
if (i != ap->a_reqpage)
|
||||
vm_page_readahead_finish(m, error);
|
||||
}
|
||||
VM_OBJECT_UNLOCK(object);
|
||||
return (0);
|
||||
|
|
|
@ -457,36 +457,8 @@ nwfs_getpages(ap)
|
|||
("nwfs_getpages: page %p is dirty", m));
|
||||
}
|
||||
|
||||
if (i != ap->a_reqpage) {
|
||||
/*
|
||||
* Whether or not to leave the page activated is up in
|
||||
* the air, but we should put the page on a page queue
|
||||
* somewhere (it already is in the object). Result:
|
||||
* It appears that emperical results show that
|
||||
* deactivating pages is best.
|
||||
*/
|
||||
|
||||
/*
|
||||
* Just in case someone was asking for this page we
|
||||
* now tell them that it is ok to use.
|
||||
*/
|
||||
if (!error) {
|
||||
if (m->oflags & VPO_WANTED) {
|
||||
vm_page_lock(m);
|
||||
vm_page_activate(m);
|
||||
vm_page_unlock(m);
|
||||
} else {
|
||||
vm_page_lock(m);
|
||||
vm_page_deactivate(m);
|
||||
vm_page_unlock(m);
|
||||
}
|
||||
vm_page_wakeup(m);
|
||||
} else {
|
||||
vm_page_lock(m);
|
||||
vm_page_free(m);
|
||||
vm_page_unlock(m);
|
||||
}
|
||||
}
|
||||
if (i != ap->a_reqpage)
|
||||
vm_page_readahead_finish(m, error);
|
||||
}
|
||||
VM_OBJECT_UNLOCK(object);
|
||||
return 0;
|
||||
|
|
|
@ -521,36 +521,8 @@ smbfs_getpages(ap)
|
|||
;
|
||||
}
|
||||
|
||||
if (i != reqpage) {
|
||||
/*
|
||||
* Whether or not to leave the page activated is up in
|
||||
* the air, but we should put the page on a page queue
|
||||
* somewhere (it already is in the object). Result:
|
||||
* It appears that emperical results show that
|
||||
* deactivating pages is best.
|
||||
*/
|
||||
|
||||
/*
|
||||
* Just in case someone was asking for this page we
|
||||
* now tell them that it is ok to use.
|
||||
*/
|
||||
if (!error) {
|
||||
if (m->oflags & VPO_WANTED) {
|
||||
vm_page_lock(m);
|
||||
vm_page_activate(m);
|
||||
vm_page_unlock(m);
|
||||
} else {
|
||||
vm_page_lock(m);
|
||||
vm_page_deactivate(m);
|
||||
vm_page_unlock(m);
|
||||
}
|
||||
vm_page_wakeup(m);
|
||||
} else {
|
||||
vm_page_lock(m);
|
||||
vm_page_free(m);
|
||||
vm_page_unlock(m);
|
||||
}
|
||||
}
|
||||
if (i != reqpage)
|
||||
vm_page_readahead_finish(m, error);
|
||||
}
|
||||
VM_OBJECT_UNLOCK(object);
|
||||
return 0;
|
||||
|
|
|
@ -217,36 +217,8 @@ nfs_getpages(struct vop_getpages_args *ap)
|
|||
*/
|
||||
;
|
||||
}
|
||||
if (i != ap->a_reqpage) {
|
||||
/*
|
||||
* Whether or not to leave the page activated is up in
|
||||
* the air, but we should put the page on a page queue
|
||||
* somewhere (it already is in the object). Result:
|
||||
* It appears that emperical results show that
|
||||
* deactivating pages is best.
|
||||
*/
|
||||
|
||||
/*
|
||||
* Just in case someone was asking for this page we
|
||||
* now tell them that it is ok to use.
|
||||
*/
|
||||
if (!error) {
|
||||
if (m->oflags & VPO_WANTED) {
|
||||
vm_page_lock(m);
|
||||
vm_page_activate(m);
|
||||
vm_page_unlock(m);
|
||||
} else {
|
||||
vm_page_lock(m);
|
||||
vm_page_deactivate(m);
|
||||
vm_page_unlock(m);
|
||||
}
|
||||
vm_page_wakeup(m);
|
||||
} else {
|
||||
vm_page_lock(m);
|
||||
vm_page_free(m);
|
||||
vm_page_unlock(m);
|
||||
}
|
||||
}
|
||||
if (i != ap->a_reqpage)
|
||||
vm_page_readahead_finish(m, error);
|
||||
}
|
||||
VM_OBJECT_UNLOCK(object);
|
||||
return (0);
|
||||
|
|
|
@ -694,6 +694,39 @@ vm_page_free_zero(vm_page_t m)
|
|||
vm_page_free_toq(m);
|
||||
}
|
||||
|
||||
/*
|
||||
* Unbusy and handle the page queueing for a page from the VOP_GETPAGES()
|
||||
* array which is not the request page.
|
||||
*/
|
||||
void
|
||||
vm_page_readahead_finish(vm_page_t m, int error)
|
||||
{
|
||||
|
||||
if (error == 0) {
|
||||
/*
|
||||
* Since the page is not the requested page, whether
|
||||
* it should be activated or deactivated is not
|
||||
* obvious. Empirical results have shown that
|
||||
* deactivating the page is usually the best choice,
|
||||
* unless the page is wanted by another thread.
|
||||
*/
|
||||
if (m->oflags & VPO_WANTED) {
|
||||
vm_page_lock(m);
|
||||
vm_page_activate(m);
|
||||
vm_page_unlock(m);
|
||||
} else {
|
||||
vm_page_lock(m);
|
||||
vm_page_deactivate(m);
|
||||
vm_page_unlock(m);
|
||||
}
|
||||
vm_page_wakeup(m);
|
||||
} else {
|
||||
vm_page_lock(m);
|
||||
vm_page_free(m);
|
||||
vm_page_unlock(m);
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* vm_page_sleep:
|
||||
*
|
||||
|
|
|
@ -390,6 +390,7 @@ vm_page_t vm_page_next(vm_page_t m);
|
|||
int vm_page_pa_tryrelock(pmap_t, vm_paddr_t, vm_paddr_t *);
|
||||
vm_page_t vm_page_prev(vm_page_t m);
|
||||
void vm_page_putfake(vm_page_t m);
|
||||
void vm_page_readahead_finish(vm_page_t m, int error);
|
||||
void vm_page_reference(vm_page_t m);
|
||||
void vm_page_remove (vm_page_t);
|
||||
void vm_page_rename (vm_page_t, vm_object_t, vm_pindex_t);
|
||||
|
|
|
@ -985,37 +985,8 @@ vnode_pager_generic_getpages(vp, m, bytecount, reqpage)
|
|||
mt));
|
||||
}
|
||||
|
||||
if (i != reqpage) {
|
||||
|
||||
/*
|
||||
* whether or not to leave the page activated is up in
|
||||
* the air, but we should put the page on a page queue
|
||||
* somewhere. (it already is in the object). Result:
|
||||
* It appears that empirical results show that
|
||||
* deactivating pages is best.
|
||||
*/
|
||||
|
||||
/*
|
||||
* just in case someone was asking for this page we
|
||||
* now tell them that it is ok to use
|
||||
*/
|
||||
if (!error) {
|
||||
if (mt->oflags & VPO_WANTED) {
|
||||
vm_page_lock(mt);
|
||||
vm_page_activate(mt);
|
||||
vm_page_unlock(mt);
|
||||
} else {
|
||||
vm_page_lock(mt);
|
||||
vm_page_deactivate(mt);
|
||||
vm_page_unlock(mt);
|
||||
}
|
||||
vm_page_wakeup(mt);
|
||||
} else {
|
||||
vm_page_lock(mt);
|
||||
vm_page_free(mt);
|
||||
vm_page_unlock(mt);
|
||||
}
|
||||
}
|
||||
if (i != reqpage)
|
||||
vm_page_readahead_finish(mt, error);
|
||||
}
|
||||
VM_OBJECT_UNLOCK(object);
|
||||
if (error) {
|
||||
|
|
Loading…
Reference in a new issue