aboutsummaryrefslogtreecommitdiff
path: root/sys/vm/vm_page.c
diff options
context:
space:
mode:
authorAlan Cox <alc@FreeBSD.org>2002-07-29 19:41:22 +0000
committerAlan Cox <alc@FreeBSD.org>2002-07-29 19:41:22 +0000
commite5f8bd9418078c43fdf1b7935b898eb2e16ef8fc (patch)
tree8770c6b5954a800908c6c0f6611953827b07e706 /sys/vm/vm_page.c
parentb7f2cf173ecf1ae3adc039e420b63e762cdc1c32 (diff)
downloadsrc-e5f8bd9418078c43fdf1b7935b898eb2e16ef8fc.tar.gz
src-e5f8bd9418078c43fdf1b7935b898eb2e16ef8fc.zip
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.
Notes
Notes: svn path=/head/; revision=100889
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 1674b07884e4..9acd481c2bed 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:
*