Skip to content

Commit

Permalink
block/raw-posix: implement .bdrv_detach/attach_aio_context()
Browse files Browse the repository at this point in the history
Drop the assumption that we're using the main AioContext for Linux AIO.
Convert the Linux AIO event notifier to use aio_set_event_notifier().

The .bdrv_detach/attach_aio_context() interfaces also need to be
implemented to move the event notifier handler from the old to the new
AioContext.

Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
  • Loading branch information
stefanhaRH committed Jun 4, 2014
1 parent e3625d3 commit c2f3426
Show file tree
Hide file tree
Showing 3 changed files with 59 additions and 2 deletions.
16 changes: 14 additions & 2 deletions block/linux-aio.c
Expand Up @@ -177,6 +177,20 @@ BlockDriverAIOCB *laio_submit(BlockDriverState *bs, void *aio_ctx, int fd,
return NULL;
}

void laio_detach_aio_context(void *s_, AioContext *old_context)
{
struct qemu_laio_state *s = s_;

aio_set_event_notifier(old_context, &s->e, NULL);
}

void laio_attach_aio_context(void *s_, AioContext *new_context)
{
struct qemu_laio_state *s = s_;

aio_set_event_notifier(new_context, &s->e, qemu_laio_completion_cb);
}

void *laio_init(void)
{
struct qemu_laio_state *s;
Expand All @@ -190,8 +204,6 @@ void *laio_init(void)
goto out_close_efd;
}

qemu_aio_set_event_notifier(&s->e, qemu_laio_completion_cb);

return s;

out_close_efd:
Expand Down
2 changes: 2 additions & 0 deletions block/raw-aio.h
Expand Up @@ -37,6 +37,8 @@ void *laio_init(void);
BlockDriverAIOCB *laio_submit(BlockDriverState *bs, void *aio_ctx, int fd,
int64_t sector_num, QEMUIOVector *qiov, int nb_sectors,
BlockDriverCompletionFunc *cb, void *opaque, int type);
void laio_detach_aio_context(void *s, AioContext *old_context);
void laio_attach_aio_context(void *s, AioContext *new_context);
#endif

#ifdef _WIN32
Expand Down
43 changes: 43 additions & 0 deletions block/raw-posix.c
Expand Up @@ -307,6 +307,29 @@ static void raw_parse_flags(int bdrv_flags, int *open_flags)
}
}

static void raw_detach_aio_context(BlockDriverState *bs)
{
#ifdef CONFIG_LINUX_AIO
BDRVRawState *s = bs->opaque;

if (s->use_aio) {
laio_detach_aio_context(s->aio_ctx, bdrv_get_aio_context(bs));
}
#endif
}

static void raw_attach_aio_context(BlockDriverState *bs,
AioContext *new_context)
{
#ifdef CONFIG_LINUX_AIO
BDRVRawState *s = bs->opaque;

if (s->use_aio) {
laio_attach_aio_context(s->aio_ctx, new_context);
}
#endif
}

#ifdef CONFIG_LINUX_AIO
static int raw_set_aio(void **aio_ctx, int *use_aio, int bdrv_flags)
{
Expand Down Expand Up @@ -447,6 +470,8 @@ static int raw_open_common(BlockDriverState *bs, QDict *options,
}
#endif

raw_attach_aio_context(bs, bdrv_get_aio_context(bs));

ret = 0;
fail:
if (filename && (bdrv_flags & BDRV_O_TEMPORARY)) {
Expand Down Expand Up @@ -1059,6 +1084,9 @@ static BlockDriverAIOCB *raw_aio_flush(BlockDriverState *bs,
static void raw_close(BlockDriverState *bs)
{
BDRVRawState *s = bs->opaque;

raw_detach_aio_context(bs);

if (s->fd >= 0) {
qemu_close(s->fd);
s->fd = -1;
Expand Down Expand Up @@ -1478,6 +1506,9 @@ static BlockDriver bdrv_file = {
.bdrv_get_allocated_file_size
= raw_get_allocated_file_size,

.bdrv_detach_aio_context = raw_detach_aio_context,
.bdrv_attach_aio_context = raw_attach_aio_context,

.create_options = raw_create_options,
};

Expand Down Expand Up @@ -1878,6 +1909,9 @@ static BlockDriver bdrv_host_device = {
.bdrv_get_allocated_file_size
= raw_get_allocated_file_size,

.bdrv_detach_aio_context = raw_detach_aio_context,
.bdrv_attach_aio_context = raw_attach_aio_context,

/* generic scsi device */
#ifdef __linux__
.bdrv_ioctl = hdev_ioctl,
Expand Down Expand Up @@ -2020,6 +2054,9 @@ static BlockDriver bdrv_host_floppy = {
.bdrv_get_allocated_file_size
= raw_get_allocated_file_size,

.bdrv_detach_aio_context = raw_detach_aio_context,
.bdrv_attach_aio_context = raw_attach_aio_context,

/* removable device support */
.bdrv_is_inserted = floppy_is_inserted,
.bdrv_media_changed = floppy_media_changed,
Expand Down Expand Up @@ -2145,6 +2182,9 @@ static BlockDriver bdrv_host_cdrom = {
.bdrv_get_allocated_file_size
= raw_get_allocated_file_size,

.bdrv_detach_aio_context = raw_detach_aio_context,
.bdrv_attach_aio_context = raw_attach_aio_context,

/* removable device support */
.bdrv_is_inserted = cdrom_is_inserted,
.bdrv_eject = cdrom_eject,
Expand Down Expand Up @@ -2276,6 +2316,9 @@ static BlockDriver bdrv_host_cdrom = {
.bdrv_get_allocated_file_size
= raw_get_allocated_file_size,

.bdrv_detach_aio_context = raw_detach_aio_context,
.bdrv_attach_aio_context = raw_attach_aio_context,

/* removable device support */
.bdrv_is_inserted = cdrom_is_inserted,
.bdrv_eject = cdrom_eject,
Expand Down

0 comments on commit c2f3426

Please sign in to comment.