Module Name:    src
Committed By:   uebayasi
Date:           Mon Feb  1 05:48:19 UTC 2010

Modified Files:
        src/sys/uvm: uvm_fault.c

Log Message:
ERESTART is already negative.  Give up negating error values to not override
the original values.  Pointed out by rmind@, thanks.

In the lower fault case, if (*pgo_get)() can return ERESTART and we should
re-fault for that remains a question.  The original code just returned the
error, so keep that behaviour for now.  In case (*pgo_get)() really returns
ERESTART, pass EIO to tell the uvm_fault caller that (*pgo_get)() failed.

(As far as I grep callers don't check if the return value is ERESTART or not.
So assuming (*pgo_get)() never returns ERESTART should be a safe bet.)


To generate a diff of this commit:
cvs rdiff -u -r1.138 -r1.139 src/sys/uvm/uvm_fault.c

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.138 src/sys/uvm/uvm_fault.c:1.139
--- src/sys/uvm/uvm_fault.c:1.138	Sun Jan 31 17:13:38 2010
+++ src/sys/uvm/uvm_fault.c	Mon Feb  1 05:48:19 2010
@@ -1,4 +1,4 @@
-/*	$NetBSD: uvm_fault.c,v 1.138 2010/01/31 17:13:38 uebayasi Exp $	*/
+/*	$NetBSD: uvm_fault.c,v 1.139 2010/02/01 05:48:19 uebayasi Exp $	*/
 
 /*
  *
@@ -39,7 +39,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: uvm_fault.c,v 1.138 2010/01/31 17:13:38 uebayasi Exp $");
+__KERNEL_RCSID(0, "$NetBSD: uvm_fault.c,v 1.139 2010/02/01 05:48:19 uebayasi Exp $");
 
 #include "opt_uvmhist.h"
 
@@ -780,7 +780,7 @@
 			amap, uobj, anons_store, anons, &anon_spare,
 			pages, uobjpage);
 
-	if (error == -ERESTART)
+	if (error == ERESTART)
 		goto ReFault;
 
 done:
@@ -1144,7 +1144,7 @@
 		/* locked: nothing, pgo_fault has unlocked everything */
 
 		if (error == ERESTART)
-			error = -ERESTART;		/* try again! */
+			error = ERESTART;		/* try again! */
 		/*
 		 * object fault routine responsible for pmap_update().
 		 */
@@ -1399,11 +1399,11 @@
 		break;
 
 	case ERESTART:
-		return -ERESTART;
+		return ERESTART;
 
 	case EAGAIN:
 		kpause("fltagain1", false, hz/2, NULL);
-		return -ERESTART;
+		return ERESTART;
 
 	default:
 		return error;
@@ -1459,7 +1459,7 @@
 					uvmfault_unlockall(ufi, amap, uobj,
 					    anon);
 					uvm_wait("flt_noram2");
-					return -ERESTART;
+					return ERESTART;
 				}
 
 				/*
@@ -1535,7 +1535,7 @@
 		case 0:
 			break;
 		case ERESTART:
-			return -ERESTART;
+			return ERESTART;
 		default:
 			return error;
 		}
@@ -1601,7 +1601,7 @@
 		}
 		/* XXX instrumentation */
 		uvm_wait("flt_pmfail1");
-		return -ERESTART;
+		return ERESTART;
 	}
 
 	/*
@@ -1634,8 +1634,7 @@
 		mutex_exit(&anon->an_lock);
 	uvmfault_unlockall(ufi, amap, uobj, oanon);
 	pmap_update(ufi->orig_map->pmap);
-	error = 0;
-	return error;
+	return 0;
 }
 
 static int
@@ -1723,9 +1722,17 @@
 				UVMHIST_LOG(maphist,
 				    "  pgo_get says TRY AGAIN!",0,0,0,0);
 				kpause("fltagain2", false, hz/2, NULL);
-				return -ERESTART;
+				return ERESTART;
 			}
 
+#if 0
+			KASSERT(error != ERESTART);
+#else
+			/* XXXUEBS don't re-fault? */
+			if (error == ERESTART)
+				error = EIO;
+#endif
+
 			UVMHIST_LOG(maphist, "<- pgo_get failed (code %d)",
 			    error, 0,0,0);
 			return error;
@@ -1779,12 +1786,12 @@
 			if (uobjpage->flags & PG_RELEASED) {
 				uvmexp.fltpgrele++;
 				uvm_pagefree(uobjpage);
-				return -ERESTART;
+				return ERESTART;
 			}
 			uobjpage->flags &= ~(PG_BUSY|PG_WANTED);
 			UVM_PAGE_OWN(uobjpage, NULL);
 			mutex_exit(&uobj->vmobjlock);
-			return -ERESTART;
+			return ERESTART;
 		}
 
 		/*
@@ -1871,7 +1878,7 @@
 					  0,0,0,0);
 					uvmexp.fltnoram++;
 					uvm_wait("flt_noram4");
-					return -ERESTART;
+					return ERESTART;
 				}
 				uobjpage = pg;
 			}
@@ -1892,7 +1899,7 @@
 		case 0:
 			break;
 		case ERESTART:
-			return -ERESTART;
+			return ERESTART;
 		default:
 			return error;
 		}
@@ -2005,7 +2012,7 @@
 		}
 		/* XXX instrumentation */
 		uvm_wait("flt_pmfail2");
-		return -ERESTART;
+		return ERESTART;
 	}
 
 	mutex_enter(&uvm_pageqlock);
@@ -2042,8 +2049,7 @@
 	uvmfault_unlockall(ufi, amap, uobj, anon);
 	pmap_update(ufi->orig_map->pmap);
 	UVMHIST_LOG(maphist, "<- done (SUCCESS!)",0,0,0,0);
-	error = 0;
-	return error;
+	return 0;
 }
 
 

Reply via email to