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

Reply via email to