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