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