diff options
author | alc <alc@FreeBSD.org> | 2002-07-14 19:45:46 +0000 |
---|---|---|
committer | alc <alc@FreeBSD.org> | 2002-07-14 19:45:46 +0000 |
commit | e650551ab94d75db5cd689ab630bf45931ec961d (patch) | |
tree | 5447bff25f7002f154b187193df4dce5c776028d /sys/kern | |
parent | 13868892dbc49cff489b66840185bd3a2c489495 (diff) | |
download | FreeBSD-src-e650551ab94d75db5cd689ab630bf45931ec961d.zip FreeBSD-src-e650551ab94d75db5cd689ab630bf45931ec961d.tar.gz |
o Lock page queue accesses by vm_page_wire().
Diffstat (limited to 'sys/kern')
-rw-r--r-- | sys/kern/vfs_bio.c | 6 |
1 files changed, 6 insertions, 0 deletions
diff --git a/sys/kern/vfs_bio.c b/sys/kern/vfs_bio.c index 9b7c794..58a5adb 100644 --- a/sys/kern/vfs_bio.c +++ b/sys/kern/vfs_bio.c @@ -2698,8 +2698,10 @@ allocbuf(struct buf *bp, int size) VM_WAIT; vm_pageout_deficit += desiredpages - bp->b_npages; } else { + vm_page_lock_queues(); vm_page_wire(m); vm_page_wakeup(m); + vm_page_unlock_queues(); bp->b_flags &= ~B_CACHE; bp->b_pages[bp->b_npages] = m; ++bp->b_npages; @@ -2732,8 +2734,10 @@ allocbuf(struct buf *bp, int size) (cnt.v_free_min + cnt.v_cache_min))) { pagedaemon_wakeup(); } + vm_page_lock_queues(); vm_page_flag_clear(m, PG_ZERO); vm_page_wire(m); + vm_page_unlock_queues(); bp->b_pages[bp->b_npages] = m; ++bp->b_npages; } @@ -3354,9 +3358,11 @@ tryagain: VM_WAIT; goto tryagain; } + vm_page_lock_queues(); vm_page_wire(p); p->valid = VM_PAGE_BITS_ALL; vm_page_flag_clear(p, PG_ZERO); + vm_page_unlock_queues(); pmap_qenter(pg, &p, 1); bp->b_pages[index] = p; vm_page_wakeup(p); |