diff options
author | alc <alc@FreeBSD.org> | 2002-07-23 04:39:48 +0000 |
---|---|---|
committer | alc <alc@FreeBSD.org> | 2002-07-23 04:39:48 +0000 |
commit | b5578712f7a8afca882ec729970e6fedd1aa4751 (patch) | |
tree | 290e407d110b18bf6e04aaf0e221c195553f1d34 | |
parent | c540d472eb276ef84bd4686ecd8ed70d5aad9b63 (diff) | |
download | FreeBSD-src-b5578712f7a8afca882ec729970e6fedd1aa4751.zip FreeBSD-src-b5578712f7a8afca882ec729970e6fedd1aa4751.tar.gz |
o Lock page queue accesses by vm_page_dontneed().
o Assert that the page queue lock is held in vm_page_dontneed().
-rw-r--r-- | sys/vm/vm_object.c | 7 | ||||
-rw-r--r-- | sys/vm/vm_page.c | 2 |
2 files changed, 5 insertions, 4 deletions
diff --git a/sys/vm/vm_object.c b/sys/vm/vm_object.c index da77d7f..915029e 100644 --- a/sys/vm/vm_object.c +++ b/sys/vm/vm_object.c @@ -1084,7 +1084,7 @@ shadowlookup: if (vm_page_sleep_busy(m, TRUE, "madvpo")) goto relookup; - + vm_page_lock_queues(); if (advise == MADV_WILLNEED) { vm_page_activate(m); } else if (advise == MADV_DONTNEED) { @@ -1109,9 +1109,10 @@ shadowlookup: m->dirty = 0; m->act_count = 0; vm_page_dontneed(m); - if (tobject->type == OBJT_SWAP) - swap_pager_freespace(tobject, tpindex, 1); } + vm_page_unlock_queues(); + if (advise == MADV_FREE && tobject->type == OBJT_SWAP) + swap_pager_freespace(tobject, tpindex, 1); } mtx_unlock(&Giant); } diff --git a/sys/vm/vm_page.c b/sys/vm/vm_page.c index cb613be..7ff3434 100644 --- a/sys/vm/vm_page.c +++ b/sys/vm/vm_page.c @@ -1466,7 +1466,7 @@ vm_page_dontneed(vm_page_t m) int dnw; int head; - GIANT_REQUIRED; + mtx_assert(&vm_page_queue_mtx, MA_OWNED); dnw = ++dnweight; /* |