Move A->K loan break code to uvm_loan.c.

This commit is contained in:
uebayasi 2010-02-02 06:06:02 +00:00
parent be06afbe24
commit 19fbe1698d
3 changed files with 65 additions and 72 deletions

View File

@ -1,4 +1,4 @@
/* $NetBSD: uvm_fault.c,v 1.152 2010/02/02 05:58:16 uebayasi Exp $ */
/* $NetBSD: uvm_fault.c,v 1.153 2010/02/02 06:06:02 uebayasi Exp $ */
/*
*
@ -39,7 +39,7 @@
*/
#include <sys/cdefs.h>
__KERNEL_RCSID(0, "$NetBSD: uvm_fault.c,v 1.152 2010/02/02 05:58:16 uebayasi Exp $");
__KERNEL_RCSID(0, "$NetBSD: uvm_fault.c,v 1.153 2010/02/02 06:06:02 uebayasi Exp $");
#include "opt_uvmhist.h"
@ -1461,11 +1461,6 @@ uvm_fault_upper(
return uvm_fault_upper1(ufi, flt, uobj, anon);
}
static int
uvm_fault_upper_loan_break(
struct uvm_faultinfo *ufi, struct uvm_faultctx *flt,
struct vm_anon *anon, struct uvm_object **ruobj);
static int
uvm_fault_upper_loan(
struct uvm_faultinfo *ufi, struct uvm_faultctx *flt,
@ -1499,7 +1494,7 @@ uvm_fault_upper_loan(
/* >1 case is already ok */
if (anon->an_ref == 1) {
error = uvm_fault_upper_loan_break(ufi, flt, anon, ruobj);
error = uvm_loanbreak_anon(anon, ruobj);
if (error != 0) {
uvmfault_unlockall(ufi, amap, *ruobj, anon);
uvm_wait("flt_noram2");
@ -1510,67 +1505,6 @@ uvm_fault_upper_loan(
return error;
}
/* XXXUEBS consider to move this elsewhere */
static int
uvm_fault_upper_loan_break(
struct uvm_faultinfo *ufi, struct uvm_faultctx *flt,
struct vm_anon *anon, struct uvm_object **ruobj)
{
struct vm_page *pg;
/* get new un-owned replacement page */
pg = uvm_pagealloc(NULL, 0, NULL, 0);
if (pg == NULL) {
return ENOMEM;
}
/*
* copy data, kill loan, and drop uobj lock
* (if any)
*/
/* copy old -> new */
uvm_pagecopy(anon->an_page, pg);
/* force reload */
pmap_page_protect(anon->an_page, VM_PROT_NONE);
mutex_enter(&uvm_pageqlock); /* KILL loan */
anon->an_page->uanon = NULL;
/* in case we owned */
anon->an_page->pqflags &= ~PQ_ANON;
if (*ruobj) {
/* if we were receiver of loan */
anon->an_page->loan_count--;
} else {
/*
* we were the lender (A->K); need
* to remove the page from pageq's.
*/
uvm_pagedequeue(anon->an_page);
}
if (*ruobj) {
mutex_exit(&(*ruobj)->vmobjlock);
*ruobj = NULL;
}
/* install new page in anon */
anon->an_page = pg;
pg->uanon = anon;
pg->pqflags |= PQ_ANON;
uvm_pageactivate(pg);
mutex_exit(&uvm_pageqlock);
pg->flags &= ~(PG_BUSY|PG_FAKE);
UVM_PAGE_OWN(pg, NULL);
/* done! */
return 0;
}
static int
uvm_fault_upper1(
struct uvm_faultinfo *ufi, struct uvm_faultctx *flt,

View File

@ -1,4 +1,4 @@
/* $NetBSD: uvm_loan.c,v 1.74 2009/12/05 22:34:43 pooka Exp $ */
/* $NetBSD: uvm_loan.c,v 1.75 2010/02/02 06:06:02 uebayasi Exp $ */
/*
*
@ -39,7 +39,7 @@
*/
#include <sys/cdefs.h>
__KERNEL_RCSID(0, "$NetBSD: uvm_loan.c,v 1.74 2009/12/05 22:34:43 pooka Exp $");
__KERNEL_RCSID(0, "$NetBSD: uvm_loan.c,v 1.75 2010/02/02 06:06:02 uebayasi Exp $");
#include <sys/param.h>
#include <sys/systm.h>
@ -1182,3 +1182,61 @@ uvm_loanbreak(struct vm_page *uobjpage)
return pg;
}
int
uvm_loanbreak_anon(struct vm_anon *anon, struct uvm_object **ruobj)
{
struct vm_page *pg;
/* get new un-owned replacement page */
pg = uvm_pagealloc(NULL, 0, NULL, 0);
if (pg == NULL) {
return ENOMEM;
}
/*
* copy data, kill loan, and drop uobj lock
* (if any)
*/
/* copy old -> new */
uvm_pagecopy(anon->an_page, pg);
/* force reload */
pmap_page_protect(anon->an_page, VM_PROT_NONE);
mutex_enter(&uvm_pageqlock); /* KILL loan */
anon->an_page->uanon = NULL;
/* in case we owned */
anon->an_page->pqflags &= ~PQ_ANON;
if (*ruobj) {
/* if we were receiver of loan */
anon->an_page->loan_count--;
} else {
/*
* we were the lender (A->K); need
* to remove the page from pageq's.
*/
uvm_pagedequeue(anon->an_page);
}
if (*ruobj) {
mutex_exit(&(*ruobj)->vmobjlock);
*ruobj = NULL;
}
/* install new page in anon */
anon->an_page = pg;
pg->uanon = anon;
pg->pqflags |= PQ_ANON;
uvm_pageactivate(pg);
mutex_exit(&uvm_pageqlock);
pg->flags &= ~(PG_BUSY|PG_FAKE);
UVM_PAGE_OWN(pg, NULL);
/* done! */
return 0;
}

View File

@ -1,4 +1,4 @@
/* $NetBSD: uvm_loan.h,v 1.14 2005/12/11 12:25:29 christos Exp $ */
/* $NetBSD: uvm_loan.h,v 1.15 2010/02/02 06:06:02 uebayasi Exp $ */
/*
*
@ -56,6 +56,7 @@ void uvm_unloan(void *, int, int);
int uvm_loanuobjpages(struct uvm_object *, voff_t, int,
struct vm_page **);
struct vm_page *uvm_loanbreak(struct vm_page *);
int uvm_loanbreak_anon(struct vm_anon *, struct uvm_object **);
#endif /* _KERNEL */