Module Name: src
Committed By: yamt
Date: Sun Nov 6 22:04:07 UTC 2011
Modified Files:
src/sys/uvm [yamt-pagecache]: uvm_page_array.c uvm_page_array.h
Log Message:
add a convenient routine for common usage
To generate a diff of this commit:
cvs rdiff -u -r1.1.2.1 -r1.1.2.2 src/sys/uvm/uvm_page_array.c \
src/sys/uvm/uvm_page_array.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_array.c
diff -u src/sys/uvm/uvm_page_array.c:1.1.2.1 src/sys/uvm/uvm_page_array.c:1.1.2.2
--- src/sys/uvm/uvm_page_array.c:1.1.2.1 Wed Nov 2 21:55:39 2011
+++ src/sys/uvm/uvm_page_array.c Sun Nov 6 22:04:07 2011
@@ -1,4 +1,4 @@
-/* $NetBSD: uvm_page_array.c,v 1.1.2.1 2011/11/02 21:55:39 yamt Exp $ */
+/* $NetBSD: uvm_page_array.c,v 1.1.2.2 2011/11/06 22:04:07 yamt Exp $ */
/*-
* Copyright (c)2011 YAMAMOTO Takashi,
@@ -27,7 +27,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: uvm_page_array.c,v 1.1.2.1 2011/11/02 21:55:39 yamt Exp $");
+__KERNEL_RCSID(0, "$NetBSD: uvm_page_array.c,v 1.1.2.2 2011/11/06 22:04:07 yamt Exp $");
#include <sys/param.h>
#include <sys/systm.h>
@@ -161,3 +161,29 @@ uvm_page_array_fill(struct uvm_page_arra
#endif /* defined(DEBUG) */
return 0;
}
+
+/*
+ * uvm_page_array_fill_and_peek:
+ * same as uvm_page_array_peek except that, if the array is empty, try to fill
+ * it first.
+ */
+
+struct vm_page *
+uvm_page_array_fill_and_peek(struct uvm_page_array *a, struct uvm_object *uobj,
+ voff_t off, bool dirtyonly)
+{
+ struct vm_page *pg;
+ int error;
+
+ pg = uvm_page_array_peek(a);
+ if (pg != NULL) {
+ return pg;
+ }
+ error = uvm_page_array_fill(a, uobj, off, dirtyonly);
+ if (error != 0) {
+ return NULL;
+ }
+ pg = uvm_page_array_peek(a);
+ KASSERT(pg != NULL);
+ return pg;
+}
Index: src/sys/uvm/uvm_page_array.h
diff -u src/sys/uvm/uvm_page_array.h:1.1.2.1 src/sys/uvm/uvm_page_array.h:1.1.2.2
--- src/sys/uvm/uvm_page_array.h:1.1.2.1 Wed Nov 2 21:55:39 2011
+++ src/sys/uvm/uvm_page_array.h Sun Nov 6 22:04:07 2011
@@ -1,4 +1,4 @@
-/* $NetBSD: uvm_page_array.h,v 1.1.2.1 2011/11/02 21:55:39 yamt Exp $ */
+/* $NetBSD: uvm_page_array.h,v 1.1.2.2 2011/11/06 22:04:07 yamt Exp $ */
/*-
* Copyright (c)2011 YAMAMOTO Takashi,
@@ -41,10 +41,11 @@
* struct uvm_page_array ar;
*
* uvm_page_array_init(&ar);
- * for (uvm_page_array_fill(&ar, ...), pg = uvm_page_array_peek(&ar);
- * pg != NULL;
- * uvm_page_array_advance(&ar), pg = uvm_page_array_peek(&ar)) {
+ * while ((pg = uvm_page_array_fill_and_peek(&ar, uobj, off, ....))
+ * != NULL) {
+ * nextoff = pg->offset + PAGE_SIZE;
* do_something(pg);
+ * uvm_page_array_advance(&ar);
* }
* uvm_page_array_fini(&it);
*/
@@ -64,5 +65,7 @@ struct vm_page *uvm_page_array_peek(stru
void uvm_page_array_advance(struct uvm_page_array *);
int uvm_page_array_fill(struct uvm_page_array *, struct uvm_object *,
voff_t, bool);
+struct vm_page *uvm_page_array_fill_and_peek(struct uvm_page_array *,
+ struct uvm_object *, voff_t, bool);
#endif /* defined(_UVM_UVM_ARRAY_H_) */