Module Name: src
Committed By: uebayasi
Date: Tue Feb 2 06:06:02 UTC 2010
Modified Files:
src/sys/uvm: uvm_fault.c uvm_loan.c uvm_loan.h
Log Message:
Move A->K loan break code to uvm_loan.c.
To generate a diff of this commit:
cvs rdiff -u -r1.152 -r1.153 src/sys/uvm/uvm_fault.c
cvs rdiff -u -r1.74 -r1.75 src/sys/uvm/uvm_loan.c
cvs rdiff -u -r1.14 -r1.15 src/sys/uvm/uvm_loan.h
Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.
Modified files:
Index: src/sys/uvm/uvm_fault.c
diff -u src/sys/uvm/uvm_fault.c:1.152 src/sys/uvm/uvm_fault.c:1.153
--- src/sys/uvm/uvm_fault.c:1.152 Tue Feb 2 05:58:16 2010
+++ src/sys/uvm/uvm_fault.c Tue Feb 2 06:06:02 2010
@@ -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"
@@ -1462,11 +1462,6 @@
}
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,
struct vm_anon *anon, struct uvm_object **ruobj)
@@ -1499,7 +1494,7 @@
/* >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 @@
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,
Index: src/sys/uvm/uvm_loan.c
diff -u src/sys/uvm/uvm_loan.c:1.74 src/sys/uvm/uvm_loan.c:1.75
--- src/sys/uvm/uvm_loan.c:1.74 Sat Dec 5 22:34:43 2009
+++ src/sys/uvm/uvm_loan.c Tue Feb 2 06:06:02 2010
@@ -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 @@
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;
+}
Index: src/sys/uvm/uvm_loan.h
diff -u src/sys/uvm/uvm_loan.h:1.14 src/sys/uvm/uvm_loan.h:1.15
--- src/sys/uvm/uvm_loan.h:1.14 Sun Dec 11 12:25:29 2005
+++ src/sys/uvm/uvm_loan.h Tue Feb 2 06:06:02 2010
@@ -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 @@
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 */