summaryrefslogtreecommitdiffstats
path: root/sys/vm/vm_zeroidle.c
diff options
context:
space:
mode:
authoralc <alc@FreeBSD.org>2002-07-07 19:27:57 +0000
committeralc <alc@FreeBSD.org>2002-07-07 19:27:57 +0000
commitffff9f17c5564d0b68bf6944ba87a9487bf1c0e4 (patch)
treeaca26d5bf97d751109a7ca09d5aff8aa6d885973 /sys/vm/vm_zeroidle.c
parent499545477275c9a081c0b8177dc79b6b338179a1 (diff)
downloadFreeBSD-src-ffff9f17c5564d0b68bf6944ba87a9487bf1c0e4.zip
FreeBSD-src-ffff9f17c5564d0b68bf6944ba87a9487bf1c0e4.tar.gz
o Lock accesses to the free queue(s) in vm_page_zero_idle().
Diffstat (limited to 'sys/vm/vm_zeroidle.c')
-rw-r--r--sys/vm/vm_zeroidle.c4
1 files changed, 4 insertions, 0 deletions
diff --git a/sys/vm/vm_zeroidle.c b/sys/vm/vm_zeroidle.c
index d7ab1ce..0552c32 100644
--- a/sys/vm/vm_zeroidle.c
+++ b/sys/vm/vm_zeroidle.c
@@ -75,15 +75,18 @@ vm_page_zero_idle(void)
vm_page_t m;
mtx_lock(&Giant);
+ mtx_lock(&vm_page_queue_free_mtx);
zero_state = 0;
m = vm_pageq_find(PQ_FREE, free_rover, FALSE);
if (m != NULL && (m->flags & PG_ZERO) == 0) {
vm_page_queues[m->queue].lcnt--;
TAILQ_REMOVE(&vm_page_queues[m->queue].pl, m, pageq);
m->queue = PQ_NONE;
+ mtx_unlock(&vm_page_queue_free_mtx);
/* maybe drop out of Giant here */
pmap_zero_page(m);
/* and return here */
+ mtx_lock(&vm_page_queue_free_mtx);
vm_page_flag_set(m, PG_ZERO);
m->queue = PQ_FREE + m->pc;
vm_page_queues[m->queue].lcnt++;
@@ -95,6 +98,7 @@ vm_page_zero_idle(void)
zero_state = 1;
}
free_rover = (free_rover + PQ_PRIME2) & PQ_L2_MASK;
+ mtx_unlock(&vm_page_queue_free_mtx);
mtx_unlock(&Giant);
return 1;
}
OpenPOWER on IntegriCloud