Page MenuHomeFreeBSD

D49874.id153764.diff
No OneTemporary

D49874.id153764.diff

Index: sys/vm/vm_object.c
===================================================================
--- sys/vm/vm_object.c
+++ sys/vm/vm_object.c
@@ -110,8 +110,8 @@
SYSCTL_INT(_vm, OID_AUTO, old_msync, CTLFLAG_RW, &old_msync, 0,
"Use old (insecure) msync behavior");
-static int vm_object_page_collect_flush(vm_object_t object, vm_page_t p,
- int pagerflags, int flags, boolean_t *allclean,
+static int vm_object_page_collect_flush(struct pctrie_iter *pages,
+ vm_page_t p, int pagerflags, int flags, boolean_t *allclean,
boolean_t *eio);
static boolean_t vm_object_page_remove_write(vm_page_t p, int flags,
boolean_t *allclean);
@@ -1032,6 +1032,7 @@
vm_object_page_clean(vm_object_t object, vm_ooffset_t start, vm_ooffset_t end,
int flags)
{
+ struct pctrie_iter pages;
vm_page_t np, p;
vm_pindex_t pi, tend, tstart;
int curgeneration, n, pagerflags;
@@ -1050,38 +1051,45 @@
tend = (end == 0) ? object->size : OFF_TO_IDX(end + PAGE_MASK);
allclean = tstart == 0 && tend >= object->size;
res = TRUE;
+ vm_page_iter_init(&pages, object);
rescan:
curgeneration = object->generation;
- for (p = vm_page_find_least(object, tstart); p != NULL; p = np) {
+ for (p = vm_radix_iter_lookup_ge(&pages, tstart); p != NULL; p = np) {
pi = p->pindex;
if (pi >= tend)
break;
- np = TAILQ_NEXT(p, listq);
- if (vm_page_none_valid(p))
+ if (vm_page_none_valid(p)) {
+ np = vm_radix_iter_step(&pages);
continue;
- if (vm_page_busy_acquire(p, VM_ALLOC_WAITFAIL) == 0) {
+ }
+ if (!vm_page_busy_acquire(p, VM_ALLOC_WAITFAIL)) {
if (object->generation != curgeneration &&
- (flags & OBJPC_SYNC) != 0)
+ (flags & OBJPC_SYNC) != 0) {
+ pctrie_iter_reset(&pages);
goto rescan;
- np = vm_page_find_least(object, pi);
+ }
+ np = vm_radix_iter_lookup_ge(&pages, pi);
continue;
}
if (!vm_object_page_remove_write(p, flags, &allclean)) {
+ np = vm_radix_iter_step(&pages);
vm_page_xunbusy(p);
continue;
}
if (object->type == OBJT_VNODE) {
- n = vm_object_page_collect_flush(object, p, pagerflags,
+ n = vm_object_page_collect_flush(&pages, p, pagerflags,
flags, &allclean, &eio);
if (eio) {
res = FALSE;
allclean = FALSE;
}
if (object->generation != curgeneration &&
- (flags & OBJPC_SYNC) != 0)
+ (flags & OBJPC_SYNC) != 0) {
+ pctrie_iter_reset(&pages);
goto rescan;
+ }
/*
* If the VOP_PUTPAGES() did a truncated write, so
@@ -1103,7 +1111,7 @@
n = 1;
vm_page_xunbusy(p);
}
- np = vm_page_find_least(object, pi + n);
+ np = vm_radix_iter_lookup_ge(&pages, pi + n);
}
#if 0
VOP_FSYNC(vp, (pagerflags & VM_PAGER_PUT_SYNC) ? MNT_WAIT : 0);
@@ -1120,37 +1128,37 @@
}
static int
-vm_object_page_collect_flush(vm_object_t object, vm_page_t p, int pagerflags,
- int flags, boolean_t *allclean, boolean_t *eio)
+vm_object_page_collect_flush(struct pctrie_iter *pages, vm_page_t p,
+ int pagerflags, int flags, boolean_t *allclean, boolean_t *eio)
{
- vm_page_t ma[2 * vm_pageout_page_count - 1], tp;
+ vm_page_t ma[2 * vm_pageout_page_count - 1];
int base, count, runlen;
vm_page_lock_assert(p, MA_NOTOWNED);
vm_page_assert_xbusied(p);
- VM_OBJECT_ASSERT_WLOCKED(object);
base = nitems(ma) / 2;
ma[base] = p;
- for (count = 1, tp = p; count < vm_pageout_page_count; count++) {
- tp = vm_page_next(tp);
- if (tp == NULL || vm_page_tryxbusy(tp) == 0)
+ for (count = 1; count < vm_pageout_page_count; count++) {
+ p = vm_radix_iter_next(pages);
+ if (p == NULL || vm_page_tryxbusy(p) == 0)
break;
- if (!vm_object_page_remove_write(tp, flags, allclean)) {
- vm_page_xunbusy(tp);
+ if (!vm_object_page_remove_write(p, flags, allclean)) {
+ vm_page_xunbusy(p);
break;
}
- ma[base + count] = tp;
+ ma[base + count] = p;
}
- for (tp = p; count < vm_pageout_page_count; count++) {
- tp = vm_page_prev(tp);
- if (tp == NULL || vm_page_tryxbusy(tp) == 0)
+ pages->index = ma[base]->pindex;
+ for (; count < vm_pageout_page_count; count++) {
+ p = vm_radix_iter_prev(pages);
+ if (p == NULL || vm_page_tryxbusy(p) == 0)
break;
- if (!vm_object_page_remove_write(tp, flags, allclean)) {
- vm_page_xunbusy(tp);
+ if (!vm_object_page_remove_write(p, flags, allclean)) {
+ vm_page_xunbusy(p);
break;
}
- ma[--base] = tp;
+ ma[--base] = p;
}
vm_pageout_flush(&ma[base], count, pagerflags, nitems(ma) / 2 - base,

File Metadata

Mime Type
text/plain
Expires
Tue, Apr 7, 11:26 PM (3 h, 7 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
31055074
Default Alt Text
D49874.id153764.diff (4 KB)

Event Timeline