Source-Changes-HG archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
[src/uebayasi-xip]: src/sys/uvm Make vm_physseg lookup into a real function.
details: https://anonhg.NetBSD.org/src/rev/0e6807042a5e
branches: uebayasi-xip
changeset: 751542:0e6807042a5e
user: uebayasi <uebayasi%NetBSD.org@localhost>
date: Mon Feb 08 05:53:05 2010 +0000
description:
Make vm_physseg lookup into a real function.
diffstat:
sys/uvm/uvm_page.c | 128 ++++++++++++++++++++++++++++++++++++++++++++++++++-
sys/uvm/uvm_page.h | 130 +---------------------------------------------------
2 files changed, 128 insertions(+), 130 deletions(-)
diffs (truncated from 314 to 300 lines):
diff -r 494c35d3a536 -r 0e6807042a5e sys/uvm/uvm_page.c
--- a/sys/uvm/uvm_page.c Mon Feb 08 05:41:43 2010 +0000
+++ b/sys/uvm/uvm_page.c Mon Feb 08 05:53:05 2010 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: uvm_page.c,v 1.153.2.1 2010/02/08 05:41:43 uebayasi Exp $ */
+/* $NetBSD: uvm_page.c,v 1.153.2.2 2010/02/08 05:53:05 uebayasi Exp $ */
/*
* Copyright (c) 1997 Charles D. Cranor and Washington University.
@@ -71,7 +71,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: uvm_page.c,v 1.153.2.1 2010/02/08 05:41:43 uebayasi Exp $");
+__KERNEL_RCSID(0, "$NetBSD: uvm_page.c,v 1.153.2.2 2010/02/08 05:53:05 uebayasi Exp $");
#include "opt_ddb.h"
#include "opt_uvmhist.h"
@@ -436,7 +436,7 @@
vm_physmem[lcv].pgs = pagearray;
pagearray += n;
pagecount -= n;
- vm_physmem[lcv].end = vm_physmem[lcv].pgs + n;
+ vm_physmem[lcv].endpg = vm_physmem[lcv].pgs + n;
/* init and free vm_pages (we've already zeroed them) */
paddr = ptoa(vm_physmem[lcv].start);
@@ -866,6 +866,126 @@
}
/*
+ * vm_physseg_find: find vm_physseg structure that belongs to a PA
+ */
+
+#if VM_PHYSSEG_MAX == 1
+static inline int vm_physseg_find_contig(struct vm_physseg *, int, paddr_t, int *);
+#elif (VM_PHYSSEG_STRAT == VM_PSTRAT_BSEARCH)
+static inline int vm_physseg_find_bsearch(struct vm_physseg *, int, paddr_t, int *);
+#else
+static inline int vm_physseg_find_linear(struct vm_physseg *, int, paddr_t, int *);
+#endif
+
+int
+vm_physseg_find(paddr_t pframe, int *offp)
+{
+
+#if VM_PHYSSEG_MAX == 1
+ return vm_physseg_find_contig(vm_physmem, vm_nphysseg, pframe, offp);
+#elif (VM_PHYSSEG_STRAT == VM_PSTRAT_BSEARCH)
+ return vm_physseg_find_bsearch(vm_physmem, vm_nphysseg, pframe, offp);
+#else
+ return vm_physseg_find_linear(vm_physmem, vm_nphysseg, pframe, offp);
+#endif
+}
+
+#if VM_PHYSSEG_MAX == 1
+static inline int
+vm_physseg_find_contig(struct vm_physseg *segs, int nsegs, paddr_t pframe, int *offp)
+{
+
+ /* 'contig' case */
+ if (pframe >= segs[0].start && pframe < segs[0].end) {
+ if (offp)
+ *offp = pframe - segs[0].start;
+ return(0);
+ }
+ return(-1);
+}
+
+#elif (VM_PHYSSEG_STRAT == VM_PSTRAT_BSEARCH)
+
+static inline int
+vm_physseg_find_bsearch(struct vm_physseg *segs, int nsegs, paddr_t pframe, int *offp)
+{
+ /* binary search for it */
+ u_int start, len, try;
+
+ /*
+ * if try is too large (thus target is less than try) we reduce
+ * the length to trunc(len/2) [i.e. everything smaller than "try"]
+ *
+ * if the try is too small (thus target is greater than try) then
+ * we set the new start to be (try + 1). this means we need to
+ * reduce the length to (round(len/2) - 1).
+ *
+ * note "adjust" below which takes advantage of the fact that
+ * (round(len/2) - 1) == trunc((len - 1) / 2)
+ * for any value of len we may have
+ */
+
+ for (start = 0, len = nsegs ; len != 0 ; len = len / 2) {
+ try = start + (len / 2); /* try in the middle */
+
+ /* start past our try? */
+ if (pframe >= segs[try].start) {
+ /* was try correct? */
+ if (pframe < segs[try].end) {
+ if (offp)
+ *offp = pframe - segs[try].start;
+ return(try); /* got it */
+ }
+ start = try + 1; /* next time, start here */
+ len--; /* "adjust" */
+ } else {
+ /*
+ * pframe before try, just reduce length of
+ * region, done in "for" loop
+ */
+ }
+ }
+ return(-1);
+}
+
+#else
+
+static inline int
+vm_physseg_find_linear(struct vm_physseg *segs, int nsegs, paddr_t pframe, int *offp)
+{
+ /* linear search for it */
+ int lcv;
+
+ for (lcv = 0; lcv < nsegs; lcv++) {
+ if (pframe >= segs[lcv].start &&
+ pframe < segs[lcv].end) {
+ if (offp)
+ *offp = pframe - segs[lcv].start;
+ return(lcv); /* got it */
+ }
+ }
+ return(-1);
+}
+#endif
+
+/*
+ * PHYS_TO_VM_PAGE: find vm_page for a PA. used by MI code to get vm_pages
+ * back from an I/O mapping (ugh!). used in some MD code as well.
+ */
+struct vm_page *
+uvm_phys_to_vm_page(paddr_t pa)
+{
+ paddr_t pf = atop(pa);
+ int off;
+ int psi;
+
+ psi = vm_physseg_find(pf, &off);
+ if (psi != -1)
+ return(&vm_physmem[psi].pgs[off]);
+ return(NULL);
+}
+
+/*
* uvm_page_recolor: Recolor the pages if the new bucket count is
* larger than the old one.
*/
@@ -1980,7 +2100,7 @@
#endif
"\n", "PAGE", "FLAG", "PQ", "UOBJECT", "UANON");
for (i = 0; i < vm_nphysseg; i++) {
- for (pg = vm_physmem[i].pgs; pg < vm_physmem[i].lastpg; pg++) {
+ for (pg = vm_physmem[i].pgs; pg < vm_physmem[i].endpg; pg++) {
(*pr)("%18p %04x %04x %18p %18p",
pg, pg->flags, pg->pqflags, pg->uobject,
pg->uanon);
diff -r 494c35d3a536 -r 0e6807042a5e sys/uvm/uvm_page.h
--- a/sys/uvm/uvm_page.h Mon Feb 08 05:41:43 2010 +0000
+++ b/sys/uvm/uvm_page.h Mon Feb 08 05:53:05 2010 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: uvm_page.h,v 1.59.2.1 2010/02/08 05:41:43 uebayasi Exp $ */
+/* $NetBSD: uvm_page.h,v 1.59.2.2 2010/02/08 05:53:05 uebayasi Exp $ */
/*
* Copyright (c) 1997 Charles D. Cranor and Washington University.
@@ -289,8 +289,8 @@
int uvm_page_lookup_freelist(struct vm_page *);
-static struct vm_page *PHYS_TO_VM_PAGE(paddr_t);
-static int vm_physseg_find(paddr_t, int *);
+int vm_physseg_find(paddr_t, int *);
+struct vm_page *uvm_phys_to_vm_page(paddr_t);
/*
* macros
@@ -306,129 +306,7 @@
#define VM_PGCOLOR_BUCKET(pg) \
(atop(VM_PAGE_TO_PHYS((pg))) & uvmexp.colormask)
-/*
- * when VM_PHYSSEG_MAX is 1, we can simplify these functions
- */
-
-#if VM_PHYSSEG_MAX == 1
-static inline int vm_physseg_find_contig(struct vm_physseg *, int, paddr_t, int *);
-#elif (VM_PHYSSEG_STRAT == VM_PSTRAT_BSEARCH)
-static inline int vm_physseg_find_bsearch(struct vm_physseg *, int, paddr_t, int *);
-#else
-static inline int vm_physseg_find_linear(struct vm_physseg *, int, paddr_t, int *);
-#endif
-
-/*
- * vm_physseg_find: find vm_physseg structure that belongs to a PA
- */
-static inline int
-vm_physseg_find(paddr_t pframe, int *offp)
-{
-
-#if VM_PHYSSEG_MAX == 1
- return vm_physseg_find_contig(vm_physmem, vm_nphysseg, pframe, offp);
-#elif (VM_PHYSSEG_STRAT == VM_PSTRAT_BSEARCH)
- return vm_physseg_find_bsearch(vm_physmem, vm_nphysseg, pframe, offp);
-#else
- return vm_physseg_find_linear(vm_physmem, vm_nphysseg, pframe, offp);
-#endif
-}
-
-#if VM_PHYSSEG_MAX == 1
-static inline int
-vm_physseg_find_contig(struct vm_physseg *segs, int nsegs, paddr_t pframe, int *offp)
-{
-
- /* 'contig' case */
- if (pframe >= segs[0].start && pframe < segs[0].end) {
- if (offp)
- *offp = pframe - segs[0].start;
- return(0);
- }
- return(-1);
-}
-
-#elif (VM_PHYSSEG_STRAT == VM_PSTRAT_BSEARCH)
-
-static inline int
-vm_physseg_find_bsearch(struct vm_physseg *segs, int nsegs, paddr_t pframe, int *offp)
-{
- /* binary search for it */
- u_int start, len, try;
-
- /*
- * if try is too large (thus target is less than try) we reduce
- * the length to trunc(len/2) [i.e. everything smaller than "try"]
- *
- * if the try is too small (thus target is greater than try) then
- * we set the new start to be (try + 1). this means we need to
- * reduce the length to (round(len/2) - 1).
- *
- * note "adjust" below which takes advantage of the fact that
- * (round(len/2) - 1) == trunc((len - 1) / 2)
- * for any value of len we may have
- */
-
- for (start = 0, len = nsegs ; len != 0 ; len = len / 2) {
- try = start + (len / 2); /* try in the middle */
-
- /* start past our try? */
- if (pframe >= segs[try].start) {
- /* was try correct? */
- if (pframe < segs[try].end) {
- if (offp)
- *offp = pframe - segs[try].start;
- return(try); /* got it */
- }
- start = try + 1; /* next time, start here */
- len--; /* "adjust" */
- } else {
- /*
- * pframe before try, just reduce length of
- * region, done in "for" loop
- */
- }
- }
- return(-1);
-}
-
-#else
-
-static inline int
-vm_physseg_find_linear(struct vm_physseg *segs, int nsegs, paddr_t pframe, int *offp)
-{
- /* linear search for it */
- int lcv;
-
- for (lcv = 0; lcv < nsegs; lcv++) {
- if (pframe >= segs[lcv].start &&
- pframe < segs[lcv].end) {
- if (offp)
- *offp = pframe - segs[lcv].start;
- return(lcv); /* got it */
- }
- }
- return(-1);
-}
-#endif
-
-
-/*
- * PHYS_TO_VM_PAGE: find vm_page for a PA. used by MI code to get vm_pages
- * back from an I/O mapping (ugh!). used in some MD code as well.
- */
-static inline struct vm_page *
-PHYS_TO_VM_PAGE(paddr_t pa)
Home |
Main Index |
Thread Index |
Old Index