summaryrefslogtreecommitdiffstats
path: root/sys/vm/vm_pageout.c
diff options
context:
space:
mode:
authoralc <alc@FreeBSD.org>2015-09-27 01:35:32 +0000
committeralc <alc@FreeBSD.org>2015-09-27 01:35:32 +0000
commit32fcd5e4dc4723f8c517d84e8c6ff9edbd496232 (patch)
tree246a921d955c0af818a01dadb0a473d45512a916 /sys/vm/vm_pageout.c
parentb44e8c14438c6602432ef5d490df5fd818d5a1db (diff)
downloadFreeBSD-src-32fcd5e4dc4723f8c517d84e8c6ff9edbd496232.zip
FreeBSD-src-32fcd5e4dc4723f8c517d84e8c6ff9edbd496232.tar.gz
MFC r287121
Testing whether a page is dirty does not require the page lock.
Diffstat (limited to 'sys/vm/vm_pageout.c')
-rw-r--r--sys/vm/vm_pageout.c16
1 files changed, 10 insertions, 6 deletions
diff --git a/sys/vm/vm_pageout.c b/sys/vm/vm_pageout.c
index dce3aad..3e019fb 100644
--- a/sys/vm/vm_pageout.c
+++ b/sys/vm/vm_pageout.c
@@ -408,10 +408,13 @@ more:
ib = 0;
break;
}
- vm_page_lock(p);
vm_page_test_dirty(p);
- if (p->dirty == 0 ||
- p->queue != PQ_INACTIVE ||
+ if (p->dirty == 0) {
+ ib = 0;
+ break;
+ }
+ vm_page_lock(p);
+ if (p->queue != PQ_INACTIVE ||
p->hold_count != 0) { /* may be undergoing I/O */
vm_page_unlock(p);
ib = 0;
@@ -435,10 +438,11 @@ more:
if ((p = vm_page_next(ps)) == NULL || vm_page_busied(p))
break;
- vm_page_lock(p);
vm_page_test_dirty(p);
- if (p->dirty == 0 ||
- p->queue != PQ_INACTIVE ||
+ if (p->dirty == 0)
+ break;
+ vm_page_lock(p);
+ if (p->queue != PQ_INACTIVE ||
p->hold_count != 0) { /* may be undergoing I/O */
vm_page_unlock(p);
break;
OpenPOWER on IntegriCloud