summaryrefslogtreecommitdiffstats
path: root/sys/geom/geom_io.c
diff options
context:
space:
mode:
authorjhb <jhb@FreeBSD.org>2005-09-15 19:05:37 +0000
committerjhb <jhb@FreeBSD.org>2005-09-15 19:05:37 +0000
commite535e11c9f1e82c6daa8b6af94249d2f8cc719c7 (patch)
tree1a97be74d31fd11ae0c4179f921efa5d4a11fa7a /sys/geom/geom_io.c
parent4fbd998dffe50e8632d7713e024a655da034de2f (diff)
downloadFreeBSD-src-e535e11c9f1e82c6daa8b6af94249d2f8cc719c7.zip
FreeBSD-src-e535e11c9f1e82c6daa8b6af94249d2f8cc719c7.tar.gz
- Add a new simple facility for marking the current thread as being in a
state where sleeping on a sleep queue is not allowed. The facility doesn't support recursion but uses a simple private per-thread flag (TDP_NOSLEEPING). The sleepq_add() function will panic if the flag is set and INVARIANTS is enabled. - Use this new facility to replace the g_xup and g_xdown mutexes that were (ab)used to achieve similar behavior. - Disallow sleeping in interrupt threads when invoking interrupt handlers. MFC after: 1 week Reviewed by: phk
Diffstat (limited to 'sys/geom/geom_io.c')
-rw-r--r--sys/geom/geom_io.c37
1 files changed, 7 insertions, 30 deletions
diff --git a/sys/geom/geom_io.c b/sys/geom/geom_io.c
index f50dad9..7ee1d25 100644
--- a/sys/geom/geom_io.c
+++ b/sys/geom/geom_io.c
@@ -42,6 +42,7 @@ __FBSDID("$FreeBSD$");
#include <sys/malloc.h>
#include <sys/bio.h>
#include <sys/ktr.h>
+#include <sys/proc.h>
#include <sys/stack.h>
#include <sys/errno.h>
@@ -400,12 +401,6 @@ g_io_schedule_down(struct thread *tp __unused)
struct bio *bp;
off_t excess;
int error;
-#ifdef WITNESS
- struct mtx mymutex;
-
- bzero(&mymutex, sizeof mymutex);
- mtx_init(&mymutex, "g_xdown", NULL, MTX_DEF);
-#endif
for(;;) {
g_bioq_lock(&g_bio_run_down);
@@ -461,16 +456,12 @@ g_io_schedule_down(struct thread *tp __unused)
default:
break;
}
-#ifdef WITNESS
- mtx_lock(&mymutex);
-#endif
+ THREAD_NO_SLEEPING();
CTR4(KTR_GEOM, "g_down starting bp %p provider %s off %ld "
"len %ld", bp, bp->bio_to->name, bp->bio_offset,
bp->bio_length);
bp->bio_to->geom->start(bp);
-#ifdef WITNESS
- mtx_unlock(&mymutex);
-#endif
+ THREAD_SLEEPING_OK();
}
}
@@ -498,40 +489,26 @@ void
g_io_schedule_up(struct thread *tp __unused)
{
struct bio *bp;
-#ifdef WITNESS
- struct mtx mymutex;
-
- bzero(&mymutex, sizeof mymutex);
- mtx_init(&mymutex, "g_xup", NULL, MTX_DEF);
-#endif
for(;;) {
g_bioq_lock(&g_bio_run_up);
bp = g_bioq_first(&g_bio_run_task);
if (bp != NULL) {
g_bioq_unlock(&g_bio_run_up);
-#ifdef WITNESS
- mtx_lock(&mymutex);
-#endif
+ THREAD_NO_SLEEPING();
CTR1(KTR_GEOM, "g_up processing task bp %p", bp);
bp->bio_task(bp->bio_task_arg);
-#ifdef WITNESS
- mtx_unlock(&mymutex);
-#endif
+ THREAD_SLEEPING_OK();
continue;
}
bp = g_bioq_first(&g_bio_run_up);
if (bp != NULL) {
g_bioq_unlock(&g_bio_run_up);
-#ifdef WITNESS
- mtx_lock(&mymutex);
-#endif
+ THREAD_NO_SLEEPING();
CTR4(KTR_GEOM, "g_up biodone bp %p provider %s off "
"%ld len %ld", bp, bp->bio_to->name,
bp->bio_offset, bp->bio_length);
biodone(bp);
-#ifdef WITNESS
- mtx_unlock(&mymutex);
-#endif
+ THREAD_SLEEPING_OK();
continue;
}
CTR0(KTR_GEOM, "g_up going to sleep");
OpenPOWER on IntegriCloud