Exemplo n.º 1
0
void blkfront_sync(struct blkfront_dev *dev)
{
    unsigned long flags;
    DEFINE_WAIT(w);

    if (dev->info.mode == O_RDWR) {
        if (dev->info.barrier == 1)
            blkfront_push_operation(dev, BLKIF_OP_WRITE_BARRIER, 0);

        if (dev->info.flush == 1)
            blkfront_push_operation(dev, BLKIF_OP_FLUSH_DISKCACHE, 0);
    }

    /* Note: This won't finish if another thread enqueues requests.  */
    local_irq_save(flags);
    while (1) {
	blkfront_aio_poll(dev);
	if (RING_FREE_REQUESTS(&dev->ring) == RING_SIZE(&dev->ring))
	    break;

	minios_add_waiter(w, blkfront_queue);
	local_irq_restore(flags);
	minios_schedule();
	local_irq_save(flags);
    }
    minios_remove_waiter(w, blkfront_queue);
    local_irq_restore(flags);
}
Exemplo n.º 2
0
static struct xenbus_event *await_event(struct xenbus_event_queue *queue)
{
    struct xenbus_event *event;
    DEFINE_WAIT(w);
    spin_lock(&xenbus_req_lock);
    while (!(event = remove_event(queue))) {
        minios_add_waiter(w, queue->waitq);
        spin_unlock(&xenbus_req_lock);
        minios_wait(w);
        spin_lock(&xenbus_req_lock);
    }
    minios_remove_waiter(w, queue->waitq);
    spin_unlock(&xenbus_req_lock);
    return event;
}
Exemplo n.º 3
0
static void blkfront_wait_slot(struct blkfront_dev *dev)
{
    /* Wait for a slot */
    if (RING_FULL(&dev->ring)) {
	unsigned long flags;
	DEFINE_WAIT(w);
	local_irq_save(flags);
	while (1) {
	    blkfront_aio_poll(dev);
	    if (!RING_FULL(&dev->ring))
		break;
	    /* Really no slot, go to sleep. */
	    minios_add_waiter(w, blkfront_queue);
	    local_irq_restore(flags);
	    minios_schedule();
	    local_irq_save(flags);
	}
	minios_remove_waiter(w, blkfront_queue);
	local_irq_restore(flags);
    }
}
Exemplo n.º 4
0
void blkfront_io(struct blkfront_aiocb *aiocbp, int write)
{
    unsigned long flags;
    DEFINE_WAIT(w);

    ASSERT(!aiocbp->aio_cb);
    aiocbp->aio_cb = blkfront_aio_cb;
    blkfront_aio(aiocbp, write);
    aiocbp->data = NULL;

    local_irq_save(flags);
    while (1) {
	blkfront_aio_poll(aiocbp->aio_dev);
	if (aiocbp->data)
	    break;

	minios_add_waiter(w, blkfront_queue);
	local_irq_restore(flags);
	minios_schedule();
	local_irq_save(flags);
    }
    minios_remove_waiter(w, blkfront_queue);
    local_irq_restore(flags);
}