From: Kevin Wolf <kwolf@redhat.com>
To: qemu-block@nongnu.org
Cc: kwolf@redhat.com, qemu-devel@nongnu.org
Subject: [Qemu-devel] [PULL 07/69] linux-aio: make it more type safe
Date: Thu, 12 May 2016 16:34:47 +0200 [thread overview]
Message-ID: <1463063749-2201-8-git-send-email-kwolf@redhat.com> (raw)
In-Reply-To: <1463063749-2201-1-git-send-email-kwolf@redhat.com>
From: Paolo Bonzini <pbonzini@redhat.com>
Replace void* with an opaque LinuxAioState type.
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
Acked-by: Stefan Hajnoczi <stefanha@redhat.com>
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
---
block/linux-aio.c | 46 +++++++++++++++++-----------------------------
block/raw-aio.h | 15 ++++++++-------
block/raw-posix.c | 4 ++--
3 files changed, 27 insertions(+), 38 deletions(-)
diff --git a/block/linux-aio.c b/block/linux-aio.c
index 102bf92..90ec98e 100644
--- a/block/linux-aio.c
+++ b/block/linux-aio.c
@@ -30,7 +30,7 @@
struct qemu_laiocb {
BlockAIOCB common;
- struct qemu_laio_state *ctx;
+ LinuxAioState *ctx;
struct iocb iocb;
ssize_t ret;
size_t nbytes;
@@ -46,7 +46,7 @@ typedef struct {
QSIMPLEQ_HEAD(, qemu_laiocb) pending;
} LaioQueue;
-struct qemu_laio_state {
+struct LinuxAioState {
io_context_t ctx;
EventNotifier e;
@@ -60,7 +60,7 @@ struct qemu_laio_state {
int event_max;
};
-static void ioq_submit(struct qemu_laio_state *s);
+static void ioq_submit(LinuxAioState *s);
static inline ssize_t io_event_ret(struct io_event *ev)
{
@@ -70,8 +70,7 @@ static inline ssize_t io_event_ret(struct io_event *ev)
/*
* Completes an AIO request (calls the callback and frees the ACB).
*/
-static void qemu_laio_process_completion(struct qemu_laio_state *s,
- struct qemu_laiocb *laiocb)
+static void qemu_laio_process_completion(struct qemu_laiocb *laiocb)
{
int ret;
@@ -99,7 +98,7 @@ static void qemu_laio_process_completion(struct qemu_laio_state *s,
*
* The function is somewhat tricky because it supports nested event loops, for
* example when a request callback invokes aio_poll(). In order to do this,
- * the completion events array and index are kept in qemu_laio_state. The BH
+ * the completion events array and index are kept in LinuxAioState. The BH
* reschedules itself as long as there are completions pending so it will
* either be called again in a nested event loop or will be called after all
* events have been completed. When there are no events left to complete, the
@@ -107,7 +106,7 @@ static void qemu_laio_process_completion(struct qemu_laio_state *s,
*/
static void qemu_laio_completion_bh(void *opaque)
{
- struct qemu_laio_state *s = opaque;
+ LinuxAioState *s = opaque;
/* Fetch more completion events when empty */
if (s->event_idx == s->event_max) {
@@ -136,7 +135,7 @@ static void qemu_laio_completion_bh(void *opaque)
laiocb->ret = io_event_ret(&s->events[s->event_idx]);
s->event_idx++;
- qemu_laio_process_completion(s, laiocb);
+ qemu_laio_process_completion(laiocb);
}
if (!s->io_q.plugged && !QSIMPLEQ_EMPTY(&s->io_q.pending)) {
@@ -146,7 +145,7 @@ static void qemu_laio_completion_bh(void *opaque)
static void qemu_laio_completion_cb(EventNotifier *e)
{
- struct qemu_laio_state *s = container_of(e, struct qemu_laio_state, e);
+ LinuxAioState *s = container_of(e, LinuxAioState, e);
if (event_notifier_test_and_clear(&s->e)) {
qemu_bh_schedule(s->completion_bh);
@@ -185,7 +184,7 @@ static void ioq_init(LaioQueue *io_q)
io_q->blocked = false;
}
-static void ioq_submit(struct qemu_laio_state *s)
+static void ioq_submit(LinuxAioState *s)
{
int ret, len;
struct qemu_laiocb *aiocb;
@@ -216,18 +215,14 @@ static void ioq_submit(struct qemu_laio_state *s)
s->io_q.blocked = (s->io_q.n > 0);
}
-void laio_io_plug(BlockDriverState *bs, void *aio_ctx)
+void laio_io_plug(BlockDriverState *bs, LinuxAioState *s)
{
- struct qemu_laio_state *s = aio_ctx;
-
assert(!s->io_q.plugged);
s->io_q.plugged = 1;
}
-void laio_io_unplug(BlockDriverState *bs, void *aio_ctx)
+void laio_io_unplug(BlockDriverState *bs, LinuxAioState *s)
{
- struct qemu_laio_state *s = aio_ctx;
-
assert(s->io_q.plugged);
s->io_q.plugged = 0;
if (!s->io_q.blocked && !QSIMPLEQ_EMPTY(&s->io_q.pending)) {
@@ -235,11 +230,10 @@ void laio_io_unplug(BlockDriverState *bs, void *aio_ctx)
}
}
-BlockAIOCB *laio_submit(BlockDriverState *bs, void *aio_ctx, int fd,
+BlockAIOCB *laio_submit(BlockDriverState *bs, LinuxAioState *s, int fd,
int64_t sector_num, QEMUIOVector *qiov, int nb_sectors,
BlockCompletionFunc *cb, void *opaque, int type)
{
- struct qemu_laio_state *s = aio_ctx;
struct qemu_laiocb *laiocb;
struct iocb *iocbs;
off_t offset = sector_num * 512;
@@ -281,26 +275,22 @@ out_free_aiocb:
return NULL;
}
-void laio_detach_aio_context(void *s_, AioContext *old_context)
+void laio_detach_aio_context(LinuxAioState *s, AioContext *old_context)
{
- struct qemu_laio_state *s = s_;
-
aio_set_event_notifier(old_context, &s->e, false, NULL);
qemu_bh_delete(s->completion_bh);
}
-void laio_attach_aio_context(void *s_, AioContext *new_context)
+void laio_attach_aio_context(LinuxAioState *s, AioContext *new_context)
{
- struct qemu_laio_state *s = s_;
-
s->completion_bh = aio_bh_new(new_context, qemu_laio_completion_bh, s);
aio_set_event_notifier(new_context, &s->e, false,
qemu_laio_completion_cb);
}
-void *laio_init(void)
+LinuxAioState *laio_init(void)
{
- struct qemu_laio_state *s;
+ LinuxAioState *s;
s = g_malloc0(sizeof(*s));
if (event_notifier_init(&s->e, false) < 0) {
@@ -322,10 +312,8 @@ out_free_state:
return NULL;
}
-void laio_cleanup(void *s_)
+void laio_cleanup(LinuxAioState *s)
{
- struct qemu_laio_state *s = s_;
-
event_notifier_cleanup(&s->e);
if (io_destroy(s->ctx) != 0) {
diff --git a/block/raw-aio.h b/block/raw-aio.h
index 0f5e35a..714714e 100644
--- a/block/raw-aio.h
+++ b/block/raw-aio.h
@@ -35,15 +35,16 @@
/* linux-aio.c - Linux native implementation */
#ifdef CONFIG_LINUX_AIO
-void *laio_init(void);
-void laio_cleanup(void *s);
-BlockAIOCB *laio_submit(BlockDriverState *bs, void *aio_ctx, int fd,
+typedef struct LinuxAioState LinuxAioState;
+LinuxAioState *laio_init(void);
+void laio_cleanup(LinuxAioState *s);
+BlockAIOCB *laio_submit(BlockDriverState *bs, LinuxAioState *s, int fd,
int64_t sector_num, QEMUIOVector *qiov, int nb_sectors,
BlockCompletionFunc *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);
-void laio_io_plug(BlockDriverState *bs, void *aio_ctx);
-void laio_io_unplug(BlockDriverState *bs, void *aio_ctx);
+void laio_detach_aio_context(LinuxAioState *s, AioContext *old_context);
+void laio_attach_aio_context(LinuxAioState *s, AioContext *new_context);
+void laio_io_plug(BlockDriverState *bs, LinuxAioState *s);
+void laio_io_unplug(BlockDriverState *bs, LinuxAioState *s);
#endif
#ifdef _WIN32
diff --git a/block/raw-posix.c b/block/raw-posix.c
index 50135ad..71ec463 100644
--- a/block/raw-posix.c
+++ b/block/raw-posix.c
@@ -139,7 +139,7 @@ typedef struct BDRVRawState {
#ifdef CONFIG_LINUX_AIO
int use_aio;
- void *aio_ctx;
+ LinuxAioState *aio_ctx;
#endif
#ifdef CONFIG_XFS
bool is_xfs:1;
@@ -398,7 +398,7 @@ static void raw_attach_aio_context(BlockDriverState *bs,
}
#ifdef CONFIG_LINUX_AIO
-static int raw_set_aio(void **aio_ctx, int *use_aio, int bdrv_flags)
+static int raw_set_aio(LinuxAioState **aio_ctx, int *use_aio, int bdrv_flags)
{
int ret = -1;
assert(aio_ctx != NULL);
--
1.8.3.1
next prev parent reply other threads:[~2016-05-12 14:36 UTC|newest]
Thread overview: 72+ messages / expand[flat|nested] mbox.gz Atom feed top
2016-05-12 14:34 [Qemu-devel] [PULL 00/69] Block layer patches Kevin Wolf
2016-05-12 14:34 ` [Qemu-devel] [PULL 01/69] block: Don't disable I/O throttling on sync requests Kevin Wolf
2016-05-12 14:34 ` [Qemu-devel] [PULL 02/69] block: make bdrv_start_throttled_reqs return void Kevin Wolf
2016-05-12 14:34 ` [Qemu-devel] [PULL 03/69] block: move restarting of throttled reqs to block/throttle-groups.c Kevin Wolf
2016-05-12 14:34 ` [Qemu-devel] [PULL 04/69] block: extract bdrv_drain_poll/bdrv_co_yield_to_drain from bdrv_drain/bdrv_co_drain Kevin Wolf
2016-05-12 14:34 ` [Qemu-devel] [PULL 05/69] block: introduce bdrv_no_throttling_begin/end Kevin Wolf
2016-05-12 14:34 ` [Qemu-devel] [PULL 06/69] block: plug whole tree at once, introduce bdrv_io_unplugged_begin/end Kevin Wolf
2016-05-12 14:34 ` Kevin Wolf [this message]
2016-05-12 14:34 ` [Qemu-devel] [PULL 08/69] block: Introduce bdrv_driver_preadv() Kevin Wolf
2016-05-12 14:34 ` [Qemu-devel] [PULL 09/69] block: Introduce bdrv_driver_pwritev() Kevin Wolf
2016-05-12 14:34 ` [Qemu-devel] [PULL 10/69] block: Support AIO drivers in bdrv_driver_preadv/pwritev() Kevin Wolf
2016-05-12 14:34 ` [Qemu-devel] [PULL 11/69] block: Rename bdrv_co_do_preadv/writev to bdrv_co_preadv/writev Kevin Wolf
2016-05-12 14:34 ` [Qemu-devel] [PULL 12/69] block: Introduce .bdrv_co_preadv/pwritev BlockDriver function Kevin Wolf
2016-05-12 14:34 ` [Qemu-devel] [PULL 13/69] bochs: Implement .bdrv_co_preadv() interface Kevin Wolf
2016-05-12 14:34 ` [Qemu-devel] [PULL 14/69] cloop: " Kevin Wolf
2016-05-12 14:34 ` [Qemu-devel] [PULL 15/69] dmg: " Kevin Wolf
2016-05-12 14:34 ` [Qemu-devel] [PULL 16/69] vdi: " Kevin Wolf
2016-05-12 14:34 ` [Qemu-devel] [PULL 17/69] vdi: Implement .bdrv_co_pwritev() interface Kevin Wolf
2016-05-12 14:34 ` [Qemu-devel] [PULL 18/69] vmdk: Add vmdk_find_offset_in_cluster() Kevin Wolf
2016-05-12 14:34 ` [Qemu-devel] [PULL 19/69] vmdk: Implement .bdrv_co_preadv() interface Kevin Wolf
2016-05-12 14:35 ` [Qemu-devel] [PULL 20/69] vmdk: Implement .bdrv_co_pwritev() interface Kevin Wolf
2016-05-12 14:35 ` [Qemu-devel] [PULL 21/69] vpc: Implement .bdrv_co_preadv() interface Kevin Wolf
2016-05-12 14:35 ` [Qemu-devel] [PULL 22/69] vpc: Implement .bdrv_co_pwritev() interface Kevin Wolf
2016-05-12 14:35 ` [Qemu-devel] [PULL 23/69] vvfat: Implement .bdrv_co_preadv/pwritev interfaces Kevin Wolf
2016-05-12 14:35 ` [Qemu-devel] [PULL 24/69] block: Remove BlockDriver.bdrv_read/write Kevin Wolf
2016-05-12 14:35 ` [Qemu-devel] [PULL 25/69] block: Fix typo in comment Kevin Wolf
2016-05-12 14:35 ` [Qemu-devel] [PULL 26/69] block: always compile-check debug prints Kevin Wolf
2016-05-12 14:35 ` [Qemu-devel] [PULL 27/69] Allow users to specify the vmdk virtual hardware version Kevin Wolf
2016-05-12 14:35 ` [Qemu-devel] [PULL 28/69] qemu-io: Fix memory leak in 'aio_write -z' Kevin Wolf
2016-05-12 14:35 ` [Qemu-devel] [PULL 29/69] block: Allow BDRV_REQ_FUA through blk_pwrite() Kevin Wolf
2016-05-12 14:35 ` [Qemu-devel] [PULL 30/69] block: Switch blk_read_unthrottled() to byte interface Kevin Wolf
2016-05-12 14:35 ` [Qemu-devel] [PULL 31/69] block: Switch blk_*write_zeroes() " Kevin Wolf
2016-05-12 14:35 ` [Qemu-devel] [PULL 32/69] block: Introduce byte-based aio read/write Kevin Wolf
2016-05-12 14:35 ` [Qemu-devel] [PULL 33/69] ide: Switch to byte-based aio block access Kevin Wolf
2016-05-12 14:35 ` [Qemu-devel] [PULL 34/69] scsi-disk: " Kevin Wolf
2016-05-12 14:35 ` [Qemu-devel] [PULL 35/69] virtio: " Kevin Wolf
2016-05-12 14:35 ` [Qemu-devel] [PULL 36/69] xen_disk: " Kevin Wolf
2016-05-12 14:35 ` [Qemu-devel] [PULL 37/69] fdc: Switch to byte-based " Kevin Wolf
2016-05-12 14:35 ` [Qemu-devel] [PULL 38/69] nand: " Kevin Wolf
2016-05-12 14:35 ` [Qemu-devel] [PULL 39/69] onenand: " Kevin Wolf
2016-05-12 14:35 ` [Qemu-devel] [PULL 40/69] pflash: " Kevin Wolf
2016-05-12 14:35 ` [Qemu-devel] [PULL 41/69] sd: " Kevin Wolf
2016-05-12 14:35 ` [Qemu-devel] [PULL 42/69] m25p80: " Kevin Wolf
2016-05-12 14:35 ` [Qemu-devel] [PULL 43/69] atapi: " Kevin Wolf
2016-05-12 14:35 ` [Qemu-devel] [PULL 44/69] nbd: " Kevin Wolf
2016-05-12 14:35 ` [Qemu-devel] [PULL 45/69] qemu-img: " Kevin Wolf
2016-05-12 14:35 ` [Qemu-devel] [PULL 46/69] qemu-io: " Kevin Wolf
2016-05-12 14:35 ` [Qemu-devel] [PULL 47/69] block: Kill unused sector-based blk_* functions Kevin Wolf
2016-05-12 14:35 ` [Qemu-devel] [PULL 48/69] qcow2: improve qcow2_co_write_zeroes() Kevin Wolf
2016-05-12 14:35 ` [Qemu-devel] [PULL 49/69] block: Make supported_write_flags a per-bds property Kevin Wolf
2016-05-12 14:35 ` [Qemu-devel] [PULL 50/69] block: Honor BDRV_REQ_FUA during write_zeroes Kevin Wolf
2016-05-12 14:35 ` [Qemu-devel] [PULL 51/69] nbd: Simplify client FUA handling Kevin Wolf
2016-05-12 14:35 ` [Qemu-devel] [PULL 52/69] block: Invalidate all children Kevin Wolf
2016-05-12 14:35 ` [Qemu-devel] [PULL 53/69] block: Drop superfluous invalidating bs->file from drivers Kevin Wolf
2016-05-12 14:35 ` [Qemu-devel] [PULL 54/69] block: Inactivate all children Kevin Wolf
2016-05-12 14:35 ` [Qemu-devel] [PULL 55/69] iotests: fix the redirection order in 083 Kevin Wolf
2016-05-12 14:35 ` [Qemu-devel] [PULL 56/69] qemu-img: check block status of backing file when converting Kevin Wolf
2016-05-12 14:35 ` [Qemu-devel] [PULL 57/69] Add new block driver interface to add/delete a BDS's child Kevin Wolf
2016-05-12 14:35 ` [Qemu-devel] [PULL 58/69] quorum: implement bdrv_add_child() and bdrv_del_child() Kevin Wolf
2016-05-12 14:35 ` [Qemu-devel] [PULL 59/69] qmp: add monitor command to add/remove a child Kevin Wolf
2016-05-12 14:35 ` [Qemu-devel] [PULL 60/69] qemu-io: Add missing option documentation Kevin Wolf
2016-05-12 14:35 ` [Qemu-devel] [PULL 61/69] qemu-io: Make 'open' subcommand more like command line Kevin Wolf
2016-05-12 14:35 ` [Qemu-devel] [PULL 62/69] qemu-io: Use bool for command line flags Kevin Wolf
2016-05-12 14:35 ` [Qemu-devel] [PULL 63/69] qemu-io: Allow unaligned access by default Kevin Wolf
2016-05-12 14:35 ` [Qemu-devel] [PULL 64/69] qemu-io: Add 'write -f' to test FUA flag Kevin Wolf
2016-05-12 21:23 ` Eric Blake
2016-05-12 14:35 ` [Qemu-devel] [PULL 65/69] qemu-io: Add 'write -z -u' to test MAY_UNMAP flag Kevin Wolf
2016-05-12 14:35 ` [Qemu-devel] [PULL 66/69] block: add support for --image-opts in block I/O tests Kevin Wolf
2016-05-12 14:35 ` [Qemu-devel] [PULL 67/69] block: add support for encryption secrets " Kevin Wolf
2016-05-12 14:35 ` [Qemu-devel] [PULL 68/69] block: enable testing of LUKS driver with " Kevin Wolf
2016-05-12 14:35 ` [Qemu-devel] [PULL 69/69] qemu-iotests: iotests: fail hard if not run via "check" Kevin Wolf
2016-05-12 16:19 ` [Qemu-devel] [PULL 00/69] Block layer patches Peter Maydell
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1463063749-2201-8-git-send-email-kwolf@redhat.com \
--to=kwolf@redhat.com \
--cc=qemu-block@nongnu.org \
--cc=qemu-devel@nongnu.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).