aio.h 7.5 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
/*
 * QEMU aio implementation
 *
 * Copyright IBM, Corp. 2008
 *
 * Authors:
 *  Anthony Liguori   <aliguori@us.ibm.com>
 *
 * This work is licensed under the terms of the GNU GPL, version 2.  See
 * the COPYING file in the top-level directory.
 *
 */

#ifndef QEMU_AIO_H
#define QEMU_AIO_H

17
#include "qemu/typedefs.h"
18
#include "qemu-common.h"
19 20
#include "qemu/queue.h"
#include "qemu/event_notifier.h"
21
#include "qemu/thread.h"
22

23 24 25
typedef struct BlockDriverAIOCB BlockDriverAIOCB;
typedef void BlockDriverCompletionFunc(void *opaque, int ret);

S
Stefan Hajnoczi 已提交
26
typedef struct AIOCBInfo {
27
    void (*cancel)(BlockDriverAIOCB *acb);
28
    size_t aiocb_size;
S
Stefan Hajnoczi 已提交
29
} AIOCBInfo;
30 31

struct BlockDriverAIOCB {
S
Stefan Hajnoczi 已提交
32
    const AIOCBInfo *aiocb_info;
33 34 35 36 37
    BlockDriverState *bs;
    BlockDriverCompletionFunc *cb;
    void *opaque;
};

S
Stefan Hajnoczi 已提交
38
void *qemu_aio_get(const AIOCBInfo *aiocb_info, BlockDriverState *bs,
39 40 41
                   BlockDriverCompletionFunc *cb, void *opaque);
void qemu_aio_release(void *p);

42 43 44 45
typedef struct AioHandler AioHandler;
typedef void QEMUBHFunc(void *opaque);
typedef void IOHandler(void *opaque);

46
struct AioContext {
P
Paolo Bonzini 已提交
47 48
    GSource source;

49 50 51 52 53 54 55 56 57
    /* The list of registered AIO handlers */
    QLIST_HEAD(, AioHandler) aio_handlers;

    /* This is a simple lock used to protect the aio_handlers list.
     * Specifically, it's used to ensure that no callbacks are removed while
     * we're walking and dispatching callbacks.
     */
    int walking_handlers;

58 59
    /* lock to protect between bh's adders and deleter */
    QemuMutex bh_lock;
60 61 62 63 64 65 66
    /* Anchor of the list of Bottom Halves belonging to the context */
    struct QEMUBH *first_bh;

    /* A simple lock used to protect the first_bh list, and ensure that
     * no callbacks are removed while we're walking and dispatching callbacks.
     */
    int walking_bh;
P
Paolo Bonzini 已提交
67 68 69

    /* Used for aio_notify.  */
    EventNotifier notifier;
70 71 72

    /* GPollFDs for aio_poll() */
    GArray *pollfds;
73 74 75

    /* Thread pool for performing work and receiving completion callbacks */
    struct ThreadPool *thread_pool;
76
};
77 78 79 80 81 82 83 84 85 86

/**
 * aio_context_new: Allocate a new AioContext.
 *
 * AioContext provide a mini event-loop that can be waited on synchronously.
 * They also provide bottom halves, a service to execute a piece of code
 * as soon as possible.
 */
AioContext *aio_context_new(void);

P
Paolo Bonzini 已提交
87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102
/**
 * aio_context_ref:
 * @ctx: The AioContext to operate on.
 *
 * Add a reference to an AioContext.
 */
void aio_context_ref(AioContext *ctx);

/**
 * aio_context_unref:
 * @ctx: The AioContext to operate on.
 *
 * Drop a reference to an AioContext.
 */
void aio_context_unref(AioContext *ctx);

103 104 105 106 107 108 109 110 111
/**
 * aio_bh_new: Allocate a new bottom half structure.
 *
 * Bottom halves are lightweight callbacks whose invocation is guaranteed
 * to be wait-free, thread-safe and signal-safe.  The #QEMUBH structure
 * is opaque and must be allocated prior to its use.
 */
QEMUBH *aio_bh_new(AioContext *ctx, QEMUBHFunc *cb, void *opaque);

P
Paolo Bonzini 已提交
112 113 114 115 116 117 118 119 120 121 122 123 124 125 126
/**
 * aio_notify: Force processing of pending events.
 *
 * Similar to signaling a condition variable, aio_notify forces
 * aio_wait to exit, so that the next call will re-examine pending events.
 * The caller of aio_notify will usually call aio_wait again very soon,
 * or go through another iteration of the GLib main loop.  Hence, aio_notify
 * also has the side effect of recalculating the sets of file descriptors
 * that the main loop waits for.
 *
 * Calling aio_notify is rarely necessary, because for example scheduling
 * a bottom half calls it already.
 */
void aio_notify(AioContext *ctx);

127 128 129 130
/**
 * aio_bh_poll: Poll bottom halves for an AioContext.
 *
 * These are internal functions used by the QEMU main loop.
131 132
 * And notice that multiple occurrences of aio_bh_poll cannot
 * be called concurrently
133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168
 */
int aio_bh_poll(AioContext *ctx);

/**
 * qemu_bh_schedule: Schedule a bottom half.
 *
 * Scheduling a bottom half interrupts the main loop and causes the
 * execution of the callback that was passed to qemu_bh_new.
 *
 * Bottom halves that are scheduled from a bottom half handler are instantly
 * invoked.  This can create an infinite loop if a bottom half handler
 * schedules itself.
 *
 * @bh: The bottom half to be scheduled.
 */
void qemu_bh_schedule(QEMUBH *bh);

/**
 * qemu_bh_cancel: Cancel execution of a bottom half.
 *
 * Canceling execution of a bottom half undoes the effect of calls to
 * qemu_bh_schedule without freeing its resources yet.  While cancellation
 * itself is also wait-free and thread-safe, it can of course race with the
 * loop that executes bottom halves unless you are holding the iothread
 * mutex.  This makes it mostly useless if you are not holding the mutex.
 *
 * @bh: The bottom half to be canceled.
 */
void qemu_bh_cancel(QEMUBH *bh);

/**
 *qemu_bh_delete: Cancel execution of a bottom half and free its resources.
 *
 * Deleting a bottom half frees the memory that was allocated for it by
 * qemu_bh_new.  It also implies canceling the bottom half if it was
 * scheduled.
169 170
 * This func is async. The bottom half will do the delete action at the finial
 * end.
171 172 173 174 175
 *
 * @bh: The bottom half to be deleted.
 */
void qemu_bh_delete(QEMUBH *bh);

176 177 178 179 180 181 182
/* Return whether there are any pending callbacks from the GSource
 * attached to the AioContext.
 *
 * This is used internally in the implementation of the GSource.
 */
bool aio_pending(AioContext *ctx);

183 184
/* Progress in completing AIO work to occur.  This can issue new pending
 * aio as a result of executing I/O completion or bh callbacks.
185
 *
186
 * If there is no pending AIO operation or completion (bottom half),
K
Kevin Wolf 已提交
187 188
 * return false.  If there are pending AIO operations of bottom halves,
 * return true.
189 190 191 192 193 194 195 196
 *
 * If there are no pending bottom halves, but there are pending AIO
 * operations, it may not be possible to make any progress without
 * blocking.  If @blocking is true, this function will wait until one
 * or more AIO events have completed, to ensure something has moved
 * before returning.
 */
bool aio_poll(AioContext *ctx, bool blocking);
197

198
#ifdef CONFIG_POSIX
199 200
/* Register a file descriptor and associated callbacks.  Behaves very similarly
 * to qemu_set_fd_handler2.  Unlike qemu_set_fd_handler2, these callbacks will
K
Kevin Wolf 已提交
201
 * be invoked when using qemu_aio_wait().
202 203 204 205
 *
 * Code that invokes AIO completion functions should rely on this function
 * instead of qemu_set_fd_handler[2].
 */
206 207 208 209 210
void aio_set_fd_handler(AioContext *ctx,
                        int fd,
                        IOHandler *io_read,
                        IOHandler *io_write,
                        void *opaque);
211 212 213 214
#endif

/* Register an event notifier and associated callbacks.  Behaves very similarly
 * to event_notifier_set_handler.  Unlike event_notifier_set_handler, these callbacks
K
Kevin Wolf 已提交
215
 * will be invoked when using qemu_aio_wait().
216 217 218 219
 *
 * Code that invokes AIO completion functions should rely on this function
 * instead of event_notifier_set_handler.
 */
220 221
void aio_set_event_notifier(AioContext *ctx,
                            EventNotifier *notifier,
S
Stefan Hajnoczi 已提交
222
                            EventNotifierHandler *io_read);
223

P
Paolo Bonzini 已提交
224 225 226 227 228
/* Return a GSource that lets the main loop poll the file descriptors attached
 * to this AioContext.
 */
GSource *aio_get_g_source(AioContext *ctx);

229 230 231
/* Return the ThreadPool bound to this AioContext */
struct ThreadPool *aio_get_thread_pool(AioContext *ctx);

232 233 234
/* Functions to operate on the main QEMU AioContext.  */

bool qemu_aio_wait(void);
235
void qemu_aio_set_event_notifier(EventNotifier *notifier,
S
Stefan Hajnoczi 已提交
236
                                 EventNotifierHandler *io_read);
237

238 239 240 241 242 243 244
#ifdef CONFIG_POSIX
void qemu_aio_set_fd_handler(int fd,
                             IOHandler *io_read,
                             IOHandler *io_write,
                             void *opaque);
#endif

245
#endif