diff options
author | alc <alc@FreeBSD.org> | 2003-07-05 20:51:22 +0000 |
---|---|---|
committer | alc <alc@FreeBSD.org> | 2003-07-05 20:51:22 +0000 |
commit | bab2fb677ff802f187e172f4472fd6e6ad4739fe (patch) | |
tree | b155da28a84f9d2bcd74e7a945141057ede2c46a /sys/vm/vm_contig.c | |
parent | 34719e1dbbd13069c2034382dc5129edf7657a4b (diff) | |
download | FreeBSD-src-bab2fb677ff802f187e172f4472fd6e6ad4739fe.zip FreeBSD-src-bab2fb677ff802f187e172f4472fd6e6ad4739fe.tar.gz |
Lock a vm object when freeing a page from it.
Diffstat (limited to 'sys/vm/vm_contig.c')
-rw-r--r-- | sys/vm/vm_contig.c | 7 |
1 files changed, 7 insertions, 0 deletions
diff --git a/sys/vm/vm_contig.c b/sys/vm/vm_contig.c index 43db875..905e848 100644 --- a/sys/vm/vm_contig.c +++ b/sys/vm/vm_contig.c @@ -144,6 +144,7 @@ contigmalloc1( { int i, s, start; vm_paddr_t phys; + vm_object_t object; vm_offset_t addr, tmp_addr; int pass, pqtype; vm_page_t pga = vm_page_array; @@ -207,8 +208,14 @@ again1: vm_page_t m = &pga[i]; if ((m->queue - m->pc) == PQ_CACHE) { + object = m->object; + if (!VM_OBJECT_TRYLOCK(object)) { + start++; + goto again; + } vm_page_busy(m); vm_page_free(m); + VM_OBJECT_UNLOCK(object); } mtx_lock_spin(&vm_page_queue_free_mtx); vm_pageq_remove_nowakeup(m); |