void mutex_enter(kmutex_t *mtx) { WANTLOCK(mtx, 0); rumpuser_mutex_enter(RUMPMTX(mtx)); LOCKED(mtx, false); }
void rumpuser_bio(int fd, int op, void *data, size_t dlen, int64_t off, rump_biodone_fn biodone, void *donearg) { static int bio_inited; struct biocb *bio = memalloc(sizeof(*bio), 0); struct blkfront_aiocb *aiocb = &bio->bio_aiocb; int nlocks; int num = fd - BLKFDOFF; rumpkern_unsched(&nlocks, NULL); if (!bio_inited) { rumpuser_mutex_enter_nowrap(bio_mtx); if (!bio_inited) { bio_inited = 1; rumpuser_mutex_exit(bio_mtx); create_thread("biopoll", biothread, NULL); } else { rumpuser_mutex_exit(bio_mtx); } } bio->bio_done = biodone; bio->bio_arg = donearg; bio->bio_num = num; aiocb->aio_dev = blkdevs[num]; aiocb->aio_buf = data; aiocb->aio_nbytes = dlen; aiocb->aio_offset = off; aiocb->aio_cb = biocomp; aiocb->data = bio; if (op & RUMPUSER_BIO_READ) blkfront_aio_read(aiocb); else blkfront_aio_write(aiocb); rumpuser_mutex_enter(bio_mtx); bio_outstanding_total++; blkdev_outstanding[num]++; rumpuser_cv_signal(bio_cv); rumpuser_mutex_exit(bio_mtx); rumpkern_sched(nlocks, NULL); }
void mutex_enter(kmutex_t *mtx) { rumpuser_mutex_enter(mtx->kmtx_mtx); }
void rumpuser_mutex_enter_nowrap(struct rumpuser_mtx *mtx) { rumpuser_mutex_enter(mtx); }