1a76bab49Saliguori /* 2a76bab49Saliguori * QEMU aio implementation 3a76bab49Saliguori * 4a76bab49Saliguori * Copyright IBM, Corp. 2008 5a76bab49Saliguori * 6a76bab49Saliguori * Authors: 7a76bab49Saliguori * Anthony Liguori <aliguori@us.ibm.com> 8a76bab49Saliguori * 9a76bab49Saliguori * This work is licensed under the terms of the GNU GPL, version 2. See 10a76bab49Saliguori * the COPYING file in the top-level directory. 11a76bab49Saliguori * 12a76bab49Saliguori */ 13a76bab49Saliguori 14a76bab49Saliguori #ifndef QEMU_AIO_H 15a76bab49Saliguori #define QEMU_AIO_H 16a76bab49Saliguori 17a76bab49Saliguori #include "qemu-common.h" 181de7afc9SPaolo Bonzini #include "qemu/queue.h" 191de7afc9SPaolo Bonzini #include "qemu/event_notifier.h" 20dcc772e2SLiu Ping Fan #include "qemu/thread.h" 21a76bab49Saliguori 2285e8dab1SPaolo Bonzini typedef struct BlockDriverAIOCB BlockDriverAIOCB; 2385e8dab1SPaolo Bonzini typedef void BlockDriverCompletionFunc(void *opaque, int ret); 2485e8dab1SPaolo Bonzini 25d7331bedSStefan Hajnoczi typedef struct AIOCBInfo { 2685e8dab1SPaolo Bonzini void (*cancel)(BlockDriverAIOCB *acb); 278c82e9a4SStefan Hajnoczi size_t aiocb_size; 28d7331bedSStefan Hajnoczi } AIOCBInfo; 2985e8dab1SPaolo Bonzini 3085e8dab1SPaolo Bonzini struct BlockDriverAIOCB { 31d7331bedSStefan Hajnoczi const AIOCBInfo *aiocb_info; 3285e8dab1SPaolo Bonzini BlockDriverState *bs; 3385e8dab1SPaolo Bonzini BlockDriverCompletionFunc *cb; 3485e8dab1SPaolo Bonzini void *opaque; 3585e8dab1SPaolo Bonzini }; 3685e8dab1SPaolo Bonzini 37d7331bedSStefan Hajnoczi void *qemu_aio_get(const AIOCBInfo *aiocb_info, BlockDriverState *bs, 3885e8dab1SPaolo Bonzini BlockDriverCompletionFunc *cb, void *opaque); 3985e8dab1SPaolo Bonzini void qemu_aio_release(void *p); 4085e8dab1SPaolo Bonzini 41f627aab1SPaolo Bonzini typedef struct AioHandler AioHandler; 42f627aab1SPaolo Bonzini typedef void QEMUBHFunc(void *opaque); 43f627aab1SPaolo Bonzini typedef void IOHandler(void *opaque); 44f627aab1SPaolo Bonzini 45f627aab1SPaolo Bonzini typedef struct AioContext { 46e3713e00SPaolo Bonzini GSource source; 47e3713e00SPaolo Bonzini 48a915f4bcSPaolo Bonzini /* The list of registered AIO handlers */ 49a915f4bcSPaolo Bonzini QLIST_HEAD(, AioHandler) aio_handlers; 50a915f4bcSPaolo Bonzini 51a915f4bcSPaolo Bonzini /* This is a simple lock used to protect the aio_handlers list. 52a915f4bcSPaolo Bonzini * Specifically, it's used to ensure that no callbacks are removed while 53a915f4bcSPaolo Bonzini * we're walking and dispatching callbacks. 54a915f4bcSPaolo Bonzini */ 55a915f4bcSPaolo Bonzini int walking_handlers; 56a915f4bcSPaolo Bonzini 57dcc772e2SLiu Ping Fan /* lock to protect between bh's adders and deleter */ 58dcc772e2SLiu Ping Fan QemuMutex bh_lock; 59f627aab1SPaolo Bonzini /* Anchor of the list of Bottom Halves belonging to the context */ 60f627aab1SPaolo Bonzini struct QEMUBH *first_bh; 61f627aab1SPaolo Bonzini 62f627aab1SPaolo Bonzini /* A simple lock used to protect the first_bh list, and ensure that 63f627aab1SPaolo Bonzini * no callbacks are removed while we're walking and dispatching callbacks. 64f627aab1SPaolo Bonzini */ 65f627aab1SPaolo Bonzini int walking_bh; 662f4dc3c1SPaolo Bonzini 672f4dc3c1SPaolo Bonzini /* Used for aio_notify. */ 682f4dc3c1SPaolo Bonzini EventNotifier notifier; 696b5f8762SStefan Hajnoczi 706b5f8762SStefan Hajnoczi /* GPollFDs for aio_poll() */ 716b5f8762SStefan Hajnoczi GArray *pollfds; 729b34277dSStefan Hajnoczi 739b34277dSStefan Hajnoczi /* Thread pool for performing work and receiving completion callbacks */ 749b34277dSStefan Hajnoczi struct ThreadPool *thread_pool; 75f627aab1SPaolo Bonzini } AioContext; 76f627aab1SPaolo Bonzini 77f627aab1SPaolo Bonzini /** 78f627aab1SPaolo Bonzini * aio_context_new: Allocate a new AioContext. 79f627aab1SPaolo Bonzini * 80f627aab1SPaolo Bonzini * AioContext provide a mini event-loop that can be waited on synchronously. 81f627aab1SPaolo Bonzini * They also provide bottom halves, a service to execute a piece of code 82f627aab1SPaolo Bonzini * as soon as possible. 83f627aab1SPaolo Bonzini */ 84f627aab1SPaolo Bonzini AioContext *aio_context_new(void); 85f627aab1SPaolo Bonzini 86f627aab1SPaolo Bonzini /** 87e3713e00SPaolo Bonzini * aio_context_ref: 88e3713e00SPaolo Bonzini * @ctx: The AioContext to operate on. 89e3713e00SPaolo Bonzini * 90e3713e00SPaolo Bonzini * Add a reference to an AioContext. 91e3713e00SPaolo Bonzini */ 92e3713e00SPaolo Bonzini void aio_context_ref(AioContext *ctx); 93e3713e00SPaolo Bonzini 94e3713e00SPaolo Bonzini /** 95e3713e00SPaolo Bonzini * aio_context_unref: 96e3713e00SPaolo Bonzini * @ctx: The AioContext to operate on. 97e3713e00SPaolo Bonzini * 98e3713e00SPaolo Bonzini * Drop a reference to an AioContext. 99e3713e00SPaolo Bonzini */ 100e3713e00SPaolo Bonzini void aio_context_unref(AioContext *ctx); 101e3713e00SPaolo Bonzini 102e3713e00SPaolo Bonzini /** 103f627aab1SPaolo Bonzini * aio_bh_new: Allocate a new bottom half structure. 104f627aab1SPaolo Bonzini * 105f627aab1SPaolo Bonzini * Bottom halves are lightweight callbacks whose invocation is guaranteed 106f627aab1SPaolo Bonzini * to be wait-free, thread-safe and signal-safe. The #QEMUBH structure 107f627aab1SPaolo Bonzini * is opaque and must be allocated prior to its use. 108f627aab1SPaolo Bonzini */ 109f627aab1SPaolo Bonzini QEMUBH *aio_bh_new(AioContext *ctx, QEMUBHFunc *cb, void *opaque); 110f627aab1SPaolo Bonzini 111f627aab1SPaolo Bonzini /** 1122f4dc3c1SPaolo Bonzini * aio_notify: Force processing of pending events. 1132f4dc3c1SPaolo Bonzini * 1142f4dc3c1SPaolo Bonzini * Similar to signaling a condition variable, aio_notify forces 1152f4dc3c1SPaolo Bonzini * aio_wait to exit, so that the next call will re-examine pending events. 1162f4dc3c1SPaolo Bonzini * The caller of aio_notify will usually call aio_wait again very soon, 1172f4dc3c1SPaolo Bonzini * or go through another iteration of the GLib main loop. Hence, aio_notify 1182f4dc3c1SPaolo Bonzini * also has the side effect of recalculating the sets of file descriptors 1192f4dc3c1SPaolo Bonzini * that the main loop waits for. 1202f4dc3c1SPaolo Bonzini * 1212f4dc3c1SPaolo Bonzini * Calling aio_notify is rarely necessary, because for example scheduling 1222f4dc3c1SPaolo Bonzini * a bottom half calls it already. 1232f4dc3c1SPaolo Bonzini */ 1242f4dc3c1SPaolo Bonzini void aio_notify(AioContext *ctx); 1252f4dc3c1SPaolo Bonzini 1262f4dc3c1SPaolo Bonzini /** 127f627aab1SPaolo Bonzini * aio_bh_poll: Poll bottom halves for an AioContext. 128f627aab1SPaolo Bonzini * 129f627aab1SPaolo Bonzini * These are internal functions used by the QEMU main loop. 130dcc772e2SLiu Ping Fan * And notice that multiple occurrences of aio_bh_poll cannot 131dcc772e2SLiu Ping Fan * be called concurrently 132f627aab1SPaolo Bonzini */ 133f627aab1SPaolo Bonzini int aio_bh_poll(AioContext *ctx); 134f627aab1SPaolo Bonzini 135f627aab1SPaolo Bonzini /** 136f627aab1SPaolo Bonzini * qemu_bh_schedule: Schedule a bottom half. 137f627aab1SPaolo Bonzini * 138f627aab1SPaolo Bonzini * Scheduling a bottom half interrupts the main loop and causes the 139f627aab1SPaolo Bonzini * execution of the callback that was passed to qemu_bh_new. 140f627aab1SPaolo Bonzini * 141f627aab1SPaolo Bonzini * Bottom halves that are scheduled from a bottom half handler are instantly 142f627aab1SPaolo Bonzini * invoked. This can create an infinite loop if a bottom half handler 143f627aab1SPaolo Bonzini * schedules itself. 144f627aab1SPaolo Bonzini * 145f627aab1SPaolo Bonzini * @bh: The bottom half to be scheduled. 146f627aab1SPaolo Bonzini */ 147f627aab1SPaolo Bonzini void qemu_bh_schedule(QEMUBH *bh); 148f627aab1SPaolo Bonzini 149f627aab1SPaolo Bonzini /** 150f627aab1SPaolo Bonzini * qemu_bh_cancel: Cancel execution of a bottom half. 151f627aab1SPaolo Bonzini * 152f627aab1SPaolo Bonzini * Canceling execution of a bottom half undoes the effect of calls to 153f627aab1SPaolo Bonzini * qemu_bh_schedule without freeing its resources yet. While cancellation 154f627aab1SPaolo Bonzini * itself is also wait-free and thread-safe, it can of course race with the 155f627aab1SPaolo Bonzini * loop that executes bottom halves unless you are holding the iothread 156f627aab1SPaolo Bonzini * mutex. This makes it mostly useless if you are not holding the mutex. 157f627aab1SPaolo Bonzini * 158f627aab1SPaolo Bonzini * @bh: The bottom half to be canceled. 159f627aab1SPaolo Bonzini */ 160f627aab1SPaolo Bonzini void qemu_bh_cancel(QEMUBH *bh); 161f627aab1SPaolo Bonzini 162f627aab1SPaolo Bonzini /** 163f627aab1SPaolo Bonzini *qemu_bh_delete: Cancel execution of a bottom half and free its resources. 164f627aab1SPaolo Bonzini * 165f627aab1SPaolo Bonzini * Deleting a bottom half frees the memory that was allocated for it by 166f627aab1SPaolo Bonzini * qemu_bh_new. It also implies canceling the bottom half if it was 167f627aab1SPaolo Bonzini * scheduled. 168dcc772e2SLiu Ping Fan * This func is async. The bottom half will do the delete action at the finial 169dcc772e2SLiu Ping Fan * end. 170f627aab1SPaolo Bonzini * 171f627aab1SPaolo Bonzini * @bh: The bottom half to be deleted. 172f627aab1SPaolo Bonzini */ 173f627aab1SPaolo Bonzini void qemu_bh_delete(QEMUBH *bh); 174f627aab1SPaolo Bonzini 175cd9ba1ebSPaolo Bonzini /* Return whether there are any pending callbacks from the GSource 176cd9ba1ebSPaolo Bonzini * attached to the AioContext. 177cd9ba1ebSPaolo Bonzini * 178cd9ba1ebSPaolo Bonzini * This is used internally in the implementation of the GSource. 179cd9ba1ebSPaolo Bonzini */ 180cd9ba1ebSPaolo Bonzini bool aio_pending(AioContext *ctx); 181cd9ba1ebSPaolo Bonzini 1827c0628b2SPaolo Bonzini /* Progress in completing AIO work to occur. This can issue new pending 1837c0628b2SPaolo Bonzini * aio as a result of executing I/O completion or bh callbacks. 184bcdc1857SPaolo Bonzini * 1857c0628b2SPaolo Bonzini * If there is no pending AIO operation or completion (bottom half), 1862ea9b58fSKevin Wolf * return false. If there are pending AIO operations of bottom halves, 1872ea9b58fSKevin Wolf * return true. 1887c0628b2SPaolo Bonzini * 1897c0628b2SPaolo Bonzini * If there are no pending bottom halves, but there are pending AIO 1907c0628b2SPaolo Bonzini * operations, it may not be possible to make any progress without 1917c0628b2SPaolo Bonzini * blocking. If @blocking is true, this function will wait until one 1927c0628b2SPaolo Bonzini * or more AIO events have completed, to ensure something has moved 1937c0628b2SPaolo Bonzini * before returning. 1947c0628b2SPaolo Bonzini */ 1957c0628b2SPaolo Bonzini bool aio_poll(AioContext *ctx, bool blocking); 196a76bab49Saliguori 1979958c351SPaolo Bonzini #ifdef CONFIG_POSIX 198a76bab49Saliguori /* Register a file descriptor and associated callbacks. Behaves very similarly 199a76bab49Saliguori * to qemu_set_fd_handler2. Unlike qemu_set_fd_handler2, these callbacks will 200c57b6656SKevin Wolf * be invoked when using qemu_aio_wait(). 201a76bab49Saliguori * 202a76bab49Saliguori * Code that invokes AIO completion functions should rely on this function 203a76bab49Saliguori * instead of qemu_set_fd_handler[2]. 204a76bab49Saliguori */ 205a915f4bcSPaolo Bonzini void aio_set_fd_handler(AioContext *ctx, 206a915f4bcSPaolo Bonzini int fd, 207a76bab49Saliguori IOHandler *io_read, 208a76bab49Saliguori IOHandler *io_write, 209a76bab49Saliguori void *opaque); 2109958c351SPaolo Bonzini #endif 2119958c351SPaolo Bonzini 2129958c351SPaolo Bonzini /* Register an event notifier and associated callbacks. Behaves very similarly 2139958c351SPaolo Bonzini * to event_notifier_set_handler. Unlike event_notifier_set_handler, these callbacks 214c57b6656SKevin Wolf * will be invoked when using qemu_aio_wait(). 2159958c351SPaolo Bonzini * 2169958c351SPaolo Bonzini * Code that invokes AIO completion functions should rely on this function 2179958c351SPaolo Bonzini * instead of event_notifier_set_handler. 2189958c351SPaolo Bonzini */ 219a915f4bcSPaolo Bonzini void aio_set_event_notifier(AioContext *ctx, 220a915f4bcSPaolo Bonzini EventNotifier *notifier, 221*f2e5dca4SStefan Hajnoczi EventNotifierHandler *io_read); 222a915f4bcSPaolo Bonzini 223e3713e00SPaolo Bonzini /* Return a GSource that lets the main loop poll the file descriptors attached 224e3713e00SPaolo Bonzini * to this AioContext. 225e3713e00SPaolo Bonzini */ 226e3713e00SPaolo Bonzini GSource *aio_get_g_source(AioContext *ctx); 227e3713e00SPaolo Bonzini 2289b34277dSStefan Hajnoczi /* Return the ThreadPool bound to this AioContext */ 2299b34277dSStefan Hajnoczi struct ThreadPool *aio_get_thread_pool(AioContext *ctx); 2309b34277dSStefan Hajnoczi 231a915f4bcSPaolo Bonzini /* Functions to operate on the main QEMU AioContext. */ 232a915f4bcSPaolo Bonzini 233a915f4bcSPaolo Bonzini bool qemu_aio_wait(void); 2349958c351SPaolo Bonzini void qemu_aio_set_event_notifier(EventNotifier *notifier, 235*f2e5dca4SStefan Hajnoczi EventNotifierHandler *io_read); 236a76bab49Saliguori 237a915f4bcSPaolo Bonzini #ifdef CONFIG_POSIX 238a915f4bcSPaolo Bonzini void qemu_aio_set_fd_handler(int fd, 239a915f4bcSPaolo Bonzini IOHandler *io_read, 240a915f4bcSPaolo Bonzini IOHandler *io_write, 241a915f4bcSPaolo Bonzini void *opaque); 242a915f4bcSPaolo Bonzini #endif 243a915f4bcSPaolo Bonzini 244a76bab49Saliguori #endif 245