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_) */