summaryrefslogtreecommitdiffstats
path: root/sys/vm/vm_page.c
diff options
context:
space:
mode:
authoralc <alc@FreeBSD.org>2002-07-29 19:41:22 +0000
committeralc <alc@FreeBSD.org>2002-07-29 19:41:22 +0000
commit478c0ba990961936269a6d44bccdbf9891a19977 (patch)
tree8770c6b5954a800908c6c0f6611953827b07e706 /sys/vm/vm_page.c
parentdeb56242100f6e090d1bc5c5e88885d2670f51d0 (diff)
downloadFreeBSD-src-478c0ba990961936269a6d44bccdbf9891a19977.zip
FreeBSD-src-478c0ba990961936269a6d44bccdbf9891a19977.tar.gz
o Introduce vm_page_sleep_if_busy() as an eventual replacement for
vm_page_sleep_busy(). vm_page_sleep_if_busy() uses the page queues lock.
Diffstat (limited to 'sys/vm/vm_page.c')
-rw-r--r--sys/vm/vm_page.c22
1 files changed, 22 insertions, 0 deletions
diff --git a/sys/vm/vm_page.c b/sys/vm/vm_page.c
index 1674b07..9acd481 100644
--- a/sys/vm/vm_page.c
+++ b/sys/vm/vm_page.c
@@ -552,6 +552,28 @@ vm_page_sleep_busy(vm_page_t m, int also_m_busy, const char *msg)
}
return (FALSE);
}
+
+/*
+ * vm_page_sleep_if_busy:
+ *
+ * Sleep and release the page queues lock if PG_BUSY is set or,
+ * if also_m_busy is TRUE, busy is non-zero. Returns TRUE if the
+ * thread slept and the page queues lock was released.
+ * Otherwise, retains the page queues lock and returns FALSE.
+ */
+int
+vm_page_sleep_if_busy(vm_page_t m, int also_m_busy, const char *msg)
+{
+
+ mtx_assert(&vm_page_queue_mtx, MA_OWNED);
+ if ((m->flags & PG_BUSY) || (also_m_busy && m->busy)) {
+ vm_page_flag_set(m, PG_WANTED | PG_REFERENCED);
+ msleep(m, &vm_page_queue_mtx, PDROP | PVM, msg, 0);
+ return (TRUE);
+ }
+ return (FALSE);
+}
+
/*
* vm_page_dirty:
*
OpenPOWER on IntegriCloud