diff options
-rw-r--r-- | sys/kern/vfs_bio.c | 6 | ||||
-rw-r--r-- | sys/vm/vm_page.c | 2 | ||||
-rw-r--r-- | sys/vm/vnode_pager.c | 4 |
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); } } |