summaryrefslogtreecommitdiff
path: root/usr/src/uts/common/vm/page_lock.c
diff options
context:
space:
mode:
authorstans <none@none>2006-10-27 11:20:28 -0700
committerstans <none@none>2006-10-27 11:20:28 -0700
commita71e32b6401c2e76a5bf9e3a3853da3405f77ef4 (patch)
treee6bfa23e1bf73b6f01c6afeff065341b6808a0a4 /usr/src/uts/common/vm/page_lock.c
parent3acfefaab29d68edc293bd4435567a7d55178b41 (diff)
downloadillumos-joyent-a71e32b6401c2e76a5bf9e3a3853da3405f77ef4.tar.gz
6393251 data corruption caused by VMODSORT problem
Diffstat (limited to 'usr/src/uts/common/vm/page_lock.c')
-rw-r--r--usr/src/uts/common/vm/page_lock.c29
1 files changed, 27 insertions, 2 deletions
diff --git a/usr/src/uts/common/vm/page_lock.c b/usr/src/uts/common/vm/page_lock.c
index 13860c6ea0..fdf74a5674 100644
--- a/usr/src/uts/common/vm/page_lock.c
+++ b/usr/src/uts/common/vm/page_lock.c
@@ -773,7 +773,7 @@ page_io_unlock(page_t *pp)
pio = PAGE_IO_MUTEX(pp);
mutex_enter(pio);
- cv_signal(&pp->p_io_cv);
+ cv_broadcast(&pp->p_io_cv);
pp->p_iolock_state &= ~PAGE_IO_INUSE;
mutex_exit(pio);
}
@@ -804,13 +804,38 @@ page_io_trylock(page_t *pp)
}
/*
+ * Wait until the i/o lock is not held.
+ */
+void
+page_io_wait(page_t *pp)
+{
+ kmutex_t *pio;
+
+ pio = PAGE_IO_MUTEX(pp);
+ mutex_enter(pio);
+ while (pp->p_iolock_state & PAGE_IO_INUSE) {
+ cv_wait(&(pp->p_io_cv), pio);
+ }
+ mutex_exit(pio);
+}
+
+/*
+ * Returns 1 on success, 0 on failure.
+ */
+int
+page_io_locked(page_t *pp)
+{
+ return (pp->p_iolock_state & PAGE_IO_INUSE);
+}
+
+/*
* Assert that the i/o lock on a page is held.
* Returns 1 on success, 0 on failure.
*/
int
page_iolock_assert(page_t *pp)
{
- return (pp->p_iolock_state & PAGE_IO_INUSE);
+ return (page_io_locked(pp));
}
/*