summaryrefslogtreecommitdiffstats
path: root/sys
diff options
context:
space:
mode:
authoralc <alc@FreeBSD.org>2002-11-23 19:10:31 +0000
committeralc <alc@FreeBSD.org>2002-11-23 19:10:31 +0000
commitcd298c7231a030662b5004924c0b2f732856407b (patch)
treea1f1db4fcb72522d3cef1259dbcc731efbf9211e /sys
parent10b7fba62b79acac62c1bf9771b4eee568a2a582 (diff)
downloadFreeBSD-src-cd298c7231a030662b5004924c0b2f732856407b.zip
FreeBSD-src-cd298c7231a030662b5004924c0b2f732856407b.tar.gz
Hold the page queues/flags lock when calling vm_page_set_validclean().
Approved by: re
Diffstat (limited to 'sys')
-rw-r--r--sys/kern/vfs_bio.c6
-rw-r--r--sys/vm/vm_page.c2
-rw-r--r--sys/vm/vnode_pager.c4
3 files changed, 10 insertions, 2 deletions
diff --git a/sys/kern/vfs_bio.c b/sys/kern/vfs_bio.c
index b22564f..bfd7888 100644
--- a/sys/kern/vfs_bio.c
+++ b/sys/kern/vfs_bio.c
@@ -3185,7 +3185,7 @@ vfs_page_set_valid(struct buf *bp, vm_ooffset_t off, int pageno, vm_page_t m)
{
vm_ooffset_t soff, eoff;
- GIANT_REQUIRED;
+ mtx_assert(&vm_page_queue_mtx, MA_OWNED);
/*
* Start and end offsets in buffer. eoff - soff may not cross a
* page boundry or cross the end of the buffer. The end of the
@@ -3305,6 +3305,7 @@ vfs_clean_pages(struct buf * bp)
foff = bp->b_offset;
KASSERT(bp->b_offset != NOOFFSET,
("vfs_clean_pages: no buffer offset"));
+ vm_page_lock_queues();
for (i = 0; i < bp->b_npages; i++) {
vm_page_t m = bp->b_pages[i];
vm_ooffset_t noff = (foff + PAGE_SIZE) & ~(off_t)PAGE_MASK;
@@ -3316,6 +3317,7 @@ vfs_clean_pages(struct buf * bp)
/* vm_page_clear_dirty(m, foff & PAGE_MASK, eoff - foff); */
foff = noff;
}
+ vm_page_unlock_queues();
}
}
@@ -3344,6 +3346,7 @@ vfs_bio_set_validclean(struct buf *bp, int base, int size)
base += (bp->b_offset & PAGE_MASK);
n = PAGE_SIZE - (base & PAGE_MASK);
+ vm_page_lock_queues();
for (i = base / PAGE_SIZE; size > 0 && i < bp->b_npages; ++i) {
vm_page_t m = bp->b_pages[i];
@@ -3355,6 +3358,7 @@ vfs_bio_set_validclean(struct buf *bp, int base, int size)
size -= n;
n = PAGE_SIZE;
}
+ vm_page_unlock_queues();
}
}
diff --git a/sys/vm/vm_page.c b/sys/vm/vm_page.c
index bcd92bf..4cc9e18 100644
--- a/sys/vm/vm_page.c
+++ b/sys/vm/vm_page.c
@@ -1565,7 +1565,7 @@ vm_page_set_validclean(vm_page_t m, int base, int size)
int frag;
int endoff;
- GIANT_REQUIRED;
+ mtx_assert(&vm_page_queue_mtx, MA_OWNED);
if (size == 0) /* handle degenerate case */
return;
diff --git a/sys/vm/vnode_pager.c b/sys/vm/vnode_pager.c
index af74d28..f5d2f0e 100644
--- a/sys/vm/vnode_pager.c
+++ b/sys/vm/vnode_pager.c
@@ -510,9 +510,13 @@ vnode_pager_input_smlfs(object, m)
if (error)
break;
+ vm_page_lock_queues();
vm_page_set_validclean(m, (i * bsize) & PAGE_MASK, bsize);
+ vm_page_unlock_queues();
} else {
+ vm_page_lock_queues();
vm_page_set_validclean(m, (i * bsize) & PAGE_MASK, bsize);
+ vm_page_unlock_queues();
bzero((caddr_t) kva + i * bsize, bsize);
}
}
OpenPOWER on IntegriCloud