Module Name:    src
Committed By:   uebayasi
Date:           Sat Feb  6 02:56:17 UTC 2010

Modified Files:
        src/sys/uvm: uvm_page.h

Log Message:
Make vm_physseg lookup routines take the target vm_physseg.  This is for the
coming "managed" device segments.


To generate a diff of this commit:
cvs rdiff -u -r1.57 -r1.58 src/sys/uvm/uvm_page.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_page.h
diff -u src/sys/uvm/uvm_page.h:1.57 src/sys/uvm/uvm_page.h:1.58
--- src/sys/uvm/uvm_page.h:1.57	Tue Aug 18 18:06:54 2009
+++ src/sys/uvm/uvm_page.h	Sat Feb  6 02:56:17 2010
@@ -1,4 +1,4 @@
-/*	$NetBSD: uvm_page.h,v 1.57 2009/08/18 18:06:54 thorpej Exp $	*/
+/*	$NetBSD: uvm_page.h,v 1.58 2010/02/06 02:56:17 uebayasi Exp $	*/
 
 /*
  * Copyright (c) 1997 Charles D. Cranor and Washington University.
@@ -310,23 +310,49 @@
  * 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 >= vm_physmem[0].start && pframe < vm_physmem[0].end) {
+	if (pframe >= segs[0].start && pframe < segs[0].end) {
 		if (offp)
-			*offp = pframe - vm_physmem[0].start;
+			*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;
 
@@ -343,15 +369,15 @@
 	 * for any value of len we may have
 	 */
 
-	for (start = 0, len = vm_nphysseg ; len != 0 ; len = len / 2) {
+	for (start = 0, len = nsegs ; len != 0 ; len = len / 2) {
 		try = start + (len / 2);	/* try in the middle */
 
 		/* start past our try? */
-		if (pframe >= vm_physmem[try].start) {
+		if (pframe >= segs[try].start) {
 			/* was try correct? */
-			if (pframe < vm_physmem[try].end) {
+			if (pframe < segs[try].end) {
 				if (offp)
-					*offp = pframe - vm_physmem[try].start;
+					*offp = pframe - segs[try].start;
 				return(try);            /* got it */
 			}
 			start = try + 1;	/* next time, start here */
@@ -364,23 +390,27 @@
 		}
 	}
 	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 < vm_nphysseg; lcv++) {
-		if (pframe >= vm_physmem[lcv].start &&
-		    pframe < vm_physmem[lcv].end) {
+	for (lcv = 0; lcv < nsegs; lcv++) {
+		if (pframe >= segs[lcv].start &&
+		    pframe < segs[lcv].end) {
 			if (offp)
-				*offp = pframe - vm_physmem[lcv].start;
+				*offp = pframe - segs[lcv].start;
 			return(lcv);		   /* got it */
 		}
 	}
 	return(-1);
-
-#endif
 }
+#endif
 
 
 /*

Reply via email to