Module Name:    src
Committed By:   yamt
Date:           Wed Jun 10 01:54:08 UTC 2009

Modified Files:
        src/sys/uvm: uvm_readahead.c uvm_readahead.h

Log Message:
- add a function to perform explicit read-ahead.
- ra_startio: tweak locking a bit.


To generate a diff of this commit:
cvs rdiff -u -r1.5 -r1.6 src/sys/uvm/uvm_readahead.c
cvs rdiff -u -r1.3 -r1.4 src/sys/uvm/uvm_readahead.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_readahead.c
diff -u src/sys/uvm/uvm_readahead.c:1.5 src/sys/uvm/uvm_readahead.c:1.6
--- src/sys/uvm/uvm_readahead.c:1.5	Wed Jan  2 11:49:20 2008
+++ src/sys/uvm/uvm_readahead.c	Wed Jun 10 01:54:08 2009
@@ -1,7 +1,7 @@
-/*	$NetBSD: uvm_readahead.c,v 1.5 2008/01/02 11:49:20 ad Exp $	*/
+/*	$NetBSD: uvm_readahead.c,v 1.6 2009/06/10 01:54:08 yamt Exp $	*/
 
 /*-
- * Copyright (c)2003, 2005 YAMAMOTO Takashi,
+ * Copyright (c)2003, 2005, 2009 YAMAMOTO Takashi,
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -40,7 +40,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: uvm_readahead.c,v 1.5 2008/01/02 11:49:20 ad Exp $");
+__KERNEL_RCSID(0, "$NetBSD: uvm_readahead.c,v 1.6 2009/06/10 01:54:08 yamt Exp $");
 
 #include <sys/param.h>
 #include <sys/pool.h>
@@ -145,11 +145,11 @@
 		 * use UVM_ADV_RANDOM to avoid recursion.
 		 */
 
+		mutex_enter(&uobj->vmobjlock);
 		error = (*uobj->pgops->pgo_get)(uobj, off, NULL,
 		    &npages, 0, VM_PROT_READ, UVM_ADV_RANDOM, 0);
 		DPRINTF(("%s:  off=%" PRIu64 ", bytelen=%zu -> %d\n",
 		    __func__, off, bytelen, error));
-		mutex_enter(&uobj->vmobjlock);
 		if (error != 0 && error != EBUSY) {
 			if (error != EINVAL) { /* maybe past EOF */
 				DPRINTF(("%s: error=%d\n", __func__, error));
@@ -313,7 +313,12 @@
 		 */
 
 		if (rasize >= RA_MINSIZE) {
-			ra->ra_next = ra_startio(uobj, raoff, rasize);
+			off_t next;
+
+			mutex_exit(&uobj->vmobjlock);
+			next = ra_startio(uobj, raoff, rasize);
+			mutex_enter(&uobj->vmobjlock);
+			ra->ra_next = next;
 		}
 	}
 
@@ -329,3 +334,17 @@
 
 done:;
 }
+
+int
+uvm_readahead(struct uvm_object *uobj, off_t off, off_t size)
+{
+
+	/*
+	 * don't allow too much read-ahead.
+	 */
+	if (size > RA_WINSIZE_MAX) {
+		size = RA_WINSIZE_MAX;
+	}
+	ra_startio(uobj, off, size);
+	return 0;
+}

Index: src/sys/uvm/uvm_readahead.h
diff -u src/sys/uvm/uvm_readahead.h:1.3 src/sys/uvm/uvm_readahead.h:1.4
--- src/sys/uvm/uvm_readahead.h:1.3	Wed Jan  2 11:49:21 2008
+++ src/sys/uvm/uvm_readahead.h	Wed Jun 10 01:54:08 2009
@@ -1,7 +1,7 @@
-/*	$NetBSD: uvm_readahead.h,v 1.3 2008/01/02 11:49:21 ad Exp $	*/
+/*	$NetBSD: uvm_readahead.h,v 1.4 2009/06/10 01:54:08 yamt Exp $	*/
 
 /*-
- * Copyright (c)2003, 2005 YAMAMOTO Takashi,
+ * Copyright (c)2003, 2005, 2009 YAMAMOTO Takashi,
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -37,5 +37,6 @@
 void uvm_ra_freectx(struct uvm_ractx *);
 void uvm_ra_request(struct uvm_ractx *, int, struct uvm_object *, off_t,
     size_t);
+int uvm_readahead(struct uvm_object *, off_t, off_t);
 
 #endif /* defined(_UVM_UVM_READAHEAD_H_) */

Reply via email to