Skip to content

Commit

Permalink
block: remove AIOCBInfo->get_aio_context()
Browse files Browse the repository at this point in the history
The synchronous bdrv_aio_cancel() function needs the acb's AioContext so
it can call aio_poll() to wait for cancellation.

It turns out that all users run under the BQL in the main AioContext, so
this callback is not needed.

Remove the callback, mark bdrv_aio_cancel() GLOBAL_STATE_CODE just like
its blk_aio_cancel() caller, and poll the main loop AioContext.

The purpose of this cleanup is to identify bdrv_aio_cancel() as an API
that does not work with the multi-queue block layer.

Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
Message-ID: <20230823235938.1398382-2-stefanha@redhat.com>
Reviewed-by: Kevin Wolf <kwolf@redhat.com>
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
  • Loading branch information
stefanhaRH authored and kevmw committed Sep 1, 2023
1 parent ff0d26d commit 1410dc2
Show file tree
Hide file tree
Showing 8 changed files with 10 additions and 57 deletions.
17 changes: 0 additions & 17 deletions block/block-backend.c
Original file line number Diff line number Diff line change
Expand Up @@ -33,8 +33,6 @@

#define NOT_DONE 0x7fffffff /* used while emulated sync operation in progress */

static AioContext *blk_aiocb_get_aio_context(BlockAIOCB *acb);

typedef struct BlockBackendAioNotifier {
void (*attached_aio_context)(AioContext *new_context, void *opaque);
void (*detach_aio_context)(void *opaque);
Expand Down Expand Up @@ -103,7 +101,6 @@ typedef struct BlockBackendAIOCB {
} BlockBackendAIOCB;

static const AIOCBInfo block_backend_aiocb_info = {
.get_aio_context = blk_aiocb_get_aio_context,
.aiocb_size = sizeof(BlockBackendAIOCB),
};

Expand Down Expand Up @@ -1545,16 +1542,8 @@ typedef struct BlkAioEmAIOCB {
bool has_returned;
} BlkAioEmAIOCB;

static AioContext *blk_aio_em_aiocb_get_aio_context(BlockAIOCB *acb_)
{
BlkAioEmAIOCB *acb = container_of(acb_, BlkAioEmAIOCB, common);

return blk_get_aio_context(acb->rwco.blk);
}

static const AIOCBInfo blk_aio_em_aiocb_info = {
.aiocb_size = sizeof(BlkAioEmAIOCB),
.get_aio_context = blk_aio_em_aiocb_get_aio_context,
};

static void blk_aio_complete(BlkAioEmAIOCB *acb)
Expand Down Expand Up @@ -2434,12 +2423,6 @@ AioContext *blk_get_aio_context(BlockBackend *blk)
return blk->ctx;
}

static AioContext *blk_aiocb_get_aio_context(BlockAIOCB *acb)
{
BlockBackendAIOCB *blk_acb = DO_UPCAST(BlockBackendAIOCB, common, acb);
return blk_get_aio_context(blk_acb->blk);
}

int blk_set_aio_context(BlockBackend *blk, AioContext *new_context,
Error **errp)
{
Expand Down
23 changes: 8 additions & 15 deletions block/io.c
Original file line number Diff line number Diff line change
Expand Up @@ -2950,25 +2950,18 @@ int bdrv_load_vmstate(BlockDriverState *bs, uint8_t *buf,
/**************************************************************/
/* async I/Os */

/**
* Synchronously cancels an acb. Must be called with the BQL held and the acb
* must be processed with the BQL held too (IOThreads are not allowed).
*
* Use bdrv_aio_cancel_async() instead when possible.
*/
void bdrv_aio_cancel(BlockAIOCB *acb)
{
IO_CODE();
GLOBAL_STATE_CODE();
qemu_aio_ref(acb);
bdrv_aio_cancel_async(acb);
while (acb->refcnt > 1) {
if (acb->aiocb_info->get_aio_context) {
aio_poll(acb->aiocb_info->get_aio_context(acb), true);
} else if (acb->bs) {
/* qemu_aio_ref and qemu_aio_unref are not thread-safe, so
* assert that we're not using an I/O thread. Thread-safe
* code should use bdrv_aio_cancel_async exclusively.
*/
assert(bdrv_get_aio_context(acb->bs) == qemu_get_aio_context());
aio_poll(bdrv_get_aio_context(acb->bs), true);
} else {
abort();
}
}
AIO_WAIT_WHILE_UNLOCKED(NULL, acb->refcnt > 1);
qemu_aio_unref(acb);
}

Expand Down
7 changes: 0 additions & 7 deletions hw/nvme/ctrl.c
Original file line number Diff line number Diff line change
Expand Up @@ -2130,11 +2130,6 @@ static inline bool nvme_is_write(NvmeRequest *req)
rw->opcode == NVME_CMD_WRITE_ZEROES;
}

static AioContext *nvme_get_aio_context(BlockAIOCB *acb)
{
return qemu_get_aio_context();
}

static void nvme_misc_cb(void *opaque, int ret)
{
NvmeRequest *req = opaque;
Expand Down Expand Up @@ -3302,7 +3297,6 @@ static void nvme_flush_cancel(BlockAIOCB *acb)
static const AIOCBInfo nvme_flush_aiocb_info = {
.aiocb_size = sizeof(NvmeFlushAIOCB),
.cancel_async = nvme_flush_cancel,
.get_aio_context = nvme_get_aio_context,
};

static void nvme_do_flush(NvmeFlushAIOCB *iocb);
Expand Down Expand Up @@ -6478,7 +6472,6 @@ static void nvme_format_cancel(BlockAIOCB *aiocb)
static const AIOCBInfo nvme_format_aiocb_info = {
.aiocb_size = sizeof(NvmeFormatAIOCB),
.cancel_async = nvme_format_cancel,
.get_aio_context = nvme_get_aio_context,
};

static void nvme_format_set(NvmeNamespace *ns, uint8_t lbaf, uint8_t mset,
Expand Down
1 change: 0 additions & 1 deletion include/block/aio.h
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,6 @@ typedef void BlockCompletionFunc(void *opaque, int ret);

typedef struct AIOCBInfo {
void (*cancel_async)(BlockAIOCB *acb);
AioContext *(*get_aio_context)(BlockAIOCB *acb);
size_t aiocb_size;
} AIOCBInfo;

Expand Down
2 changes: 2 additions & 0 deletions include/block/block-global-state.h
Original file line number Diff line number Diff line change
Expand Up @@ -185,6 +185,8 @@ void bdrv_drain_all_begin_nopoll(void);
void bdrv_drain_all_end(void);
void bdrv_drain_all(void);

void bdrv_aio_cancel(BlockAIOCB *acb);

int bdrv_has_zero_init_1(BlockDriverState *bs);
int bdrv_has_zero_init(BlockDriverState *bs);
BlockDriverState *bdrv_find_node(const char *node_name);
Expand Down
1 change: 0 additions & 1 deletion include/block/block-io.h
Original file line number Diff line number Diff line change
Expand Up @@ -101,7 +101,6 @@ bdrv_co_delete_file_noerr(BlockDriverState *bs);


/* async block I/O */
void bdrv_aio_cancel(BlockAIOCB *acb);
void bdrv_aio_cancel_async(BlockAIOCB *acb);

/* sg packet commands */
Expand Down
8 changes: 0 additions & 8 deletions softmmu/dma-helpers.c
Original file line number Diff line number Diff line change
Expand Up @@ -206,17 +206,9 @@ static void dma_aio_cancel(BlockAIOCB *acb)
}
}

static AioContext *dma_get_aio_context(BlockAIOCB *acb)
{
DMAAIOCB *dbs = container_of(acb, DMAAIOCB, common);

return dbs->ctx;
}

static const AIOCBInfo dma_aiocb_info = {
.aiocb_size = sizeof(DMAAIOCB),
.cancel_async = dma_aio_cancel,
.get_aio_context = dma_get_aio_context,
};

BlockAIOCB *dma_blk_io(AioContext *ctx,
Expand Down
8 changes: 0 additions & 8 deletions util/thread-pool.c
Original file line number Diff line number Diff line change
Expand Up @@ -228,17 +228,9 @@ static void thread_pool_cancel(BlockAIOCB *acb)

}

static AioContext *thread_pool_get_aio_context(BlockAIOCB *acb)
{
ThreadPoolElement *elem = (ThreadPoolElement *)acb;
ThreadPool *pool = elem->pool;
return pool->ctx;
}

static const AIOCBInfo thread_pool_aiocb_info = {
.aiocb_size = sizeof(ThreadPoolElement),
.cancel_async = thread_pool_cancel,
.get_aio_context = thread_pool_get_aio_context,
};

BlockAIOCB *thread_pool_submit_aio(ThreadPoolFunc *func, void *arg,
Expand Down

0 comments on commit 1410dc2

Please sign in to comment.