1*737e150eSPaolo Bonzini /* 2*737e150eSPaolo Bonzini * QEMU aio implementation 3*737e150eSPaolo Bonzini * 4*737e150eSPaolo Bonzini * Copyright IBM, Corp. 2008 5*737e150eSPaolo Bonzini * 6*737e150eSPaolo Bonzini * Authors: 7*737e150eSPaolo Bonzini * Anthony Liguori <aliguori@us.ibm.com> 8*737e150eSPaolo Bonzini * 9*737e150eSPaolo Bonzini * This work is licensed under the terms of the GNU GPL, version 2. See 10*737e150eSPaolo Bonzini * the COPYING file in the top-level directory. 11*737e150eSPaolo Bonzini * 12*737e150eSPaolo Bonzini */ 13*737e150eSPaolo Bonzini 14*737e150eSPaolo Bonzini #ifndef QEMU_AIO_H 15*737e150eSPaolo Bonzini #define QEMU_AIO_H 16*737e150eSPaolo Bonzini 17*737e150eSPaolo Bonzini #include "qemu-common.h" 18*737e150eSPaolo Bonzini #include "qemu-queue.h" 19*737e150eSPaolo Bonzini #include "event_notifier.h" 20*737e150eSPaolo Bonzini 21*737e150eSPaolo Bonzini typedef struct BlockDriverAIOCB BlockDriverAIOCB; 22*737e150eSPaolo Bonzini typedef void BlockDriverCompletionFunc(void *opaque, int ret); 23*737e150eSPaolo Bonzini 24*737e150eSPaolo Bonzini typedef struct AIOCBInfo { 25*737e150eSPaolo Bonzini void (*cancel)(BlockDriverAIOCB *acb); 26*737e150eSPaolo Bonzini size_t aiocb_size; 27*737e150eSPaolo Bonzini } AIOCBInfo; 28*737e150eSPaolo Bonzini 29*737e150eSPaolo Bonzini struct BlockDriverAIOCB { 30*737e150eSPaolo Bonzini const AIOCBInfo *aiocb_info; 31*737e150eSPaolo Bonzini BlockDriverState *bs; 32*737e150eSPaolo Bonzini BlockDriverCompletionFunc *cb; 33*737e150eSPaolo Bonzini void *opaque; 34*737e150eSPaolo Bonzini }; 35*737e150eSPaolo Bonzini 36*737e150eSPaolo Bonzini void *qemu_aio_get(const AIOCBInfo *aiocb_info, BlockDriverState *bs, 37*737e150eSPaolo Bonzini BlockDriverCompletionFunc *cb, void *opaque); 38*737e150eSPaolo Bonzini void qemu_aio_release(void *p); 39*737e150eSPaolo Bonzini 40*737e150eSPaolo Bonzini typedef struct AioHandler AioHandler; 41*737e150eSPaolo Bonzini typedef void QEMUBHFunc(void *opaque); 42*737e150eSPaolo Bonzini typedef void IOHandler(void *opaque); 43*737e150eSPaolo Bonzini 44*737e150eSPaolo Bonzini typedef struct AioContext { 45*737e150eSPaolo Bonzini GSource source; 46*737e150eSPaolo Bonzini 47*737e150eSPaolo Bonzini /* The list of registered AIO handlers */ 48*737e150eSPaolo Bonzini QLIST_HEAD(, AioHandler) aio_handlers; 49*737e150eSPaolo Bonzini 50*737e150eSPaolo Bonzini /* This is a simple lock used to protect the aio_handlers list. 51*737e150eSPaolo Bonzini * Specifically, it's used to ensure that no callbacks are removed while 52*737e150eSPaolo Bonzini * we're walking and dispatching callbacks. 53*737e150eSPaolo Bonzini */ 54*737e150eSPaolo Bonzini int walking_handlers; 55*737e150eSPaolo Bonzini 56*737e150eSPaolo Bonzini /* Anchor of the list of Bottom Halves belonging to the context */ 57*737e150eSPaolo Bonzini struct QEMUBH *first_bh; 58*737e150eSPaolo Bonzini 59*737e150eSPaolo Bonzini /* A simple lock used to protect the first_bh list, and ensure that 60*737e150eSPaolo Bonzini * no callbacks are removed while we're walking and dispatching callbacks. 61*737e150eSPaolo Bonzini */ 62*737e150eSPaolo Bonzini int walking_bh; 63*737e150eSPaolo Bonzini 64*737e150eSPaolo Bonzini /* Used for aio_notify. */ 65*737e150eSPaolo Bonzini EventNotifier notifier; 66*737e150eSPaolo Bonzini } AioContext; 67*737e150eSPaolo Bonzini 68*737e150eSPaolo Bonzini /* Returns 1 if there are still outstanding AIO requests; 0 otherwise */ 69*737e150eSPaolo Bonzini typedef int (AioFlushEventNotifierHandler)(EventNotifier *e); 70*737e150eSPaolo Bonzini 71*737e150eSPaolo Bonzini /** 72*737e150eSPaolo Bonzini * aio_context_new: Allocate a new AioContext. 73*737e150eSPaolo Bonzini * 74*737e150eSPaolo Bonzini * AioContext provide a mini event-loop that can be waited on synchronously. 75*737e150eSPaolo Bonzini * They also provide bottom halves, a service to execute a piece of code 76*737e150eSPaolo Bonzini * as soon as possible. 77*737e150eSPaolo Bonzini */ 78*737e150eSPaolo Bonzini AioContext *aio_context_new(void); 79*737e150eSPaolo Bonzini 80*737e150eSPaolo Bonzini /** 81*737e150eSPaolo Bonzini * aio_context_ref: 82*737e150eSPaolo Bonzini * @ctx: The AioContext to operate on. 83*737e150eSPaolo Bonzini * 84*737e150eSPaolo Bonzini * Add a reference to an AioContext. 85*737e150eSPaolo Bonzini */ 86*737e150eSPaolo Bonzini void aio_context_ref(AioContext *ctx); 87*737e150eSPaolo Bonzini 88*737e150eSPaolo Bonzini /** 89*737e150eSPaolo Bonzini * aio_context_unref: 90*737e150eSPaolo Bonzini * @ctx: The AioContext to operate on. 91*737e150eSPaolo Bonzini * 92*737e150eSPaolo Bonzini * Drop a reference to an AioContext. 93*737e150eSPaolo Bonzini */ 94*737e150eSPaolo Bonzini void aio_context_unref(AioContext *ctx); 95*737e150eSPaolo Bonzini 96*737e150eSPaolo Bonzini /** 97*737e150eSPaolo Bonzini * aio_bh_new: Allocate a new bottom half structure. 98*737e150eSPaolo Bonzini * 99*737e150eSPaolo Bonzini * Bottom halves are lightweight callbacks whose invocation is guaranteed 100*737e150eSPaolo Bonzini * to be wait-free, thread-safe and signal-safe. The #QEMUBH structure 101*737e150eSPaolo Bonzini * is opaque and must be allocated prior to its use. 102*737e150eSPaolo Bonzini */ 103*737e150eSPaolo Bonzini QEMUBH *aio_bh_new(AioContext *ctx, QEMUBHFunc *cb, void *opaque); 104*737e150eSPaolo Bonzini 105*737e150eSPaolo Bonzini /** 106*737e150eSPaolo Bonzini * aio_notify: Force processing of pending events. 107*737e150eSPaolo Bonzini * 108*737e150eSPaolo Bonzini * Similar to signaling a condition variable, aio_notify forces 109*737e150eSPaolo Bonzini * aio_wait to exit, so that the next call will re-examine pending events. 110*737e150eSPaolo Bonzini * The caller of aio_notify will usually call aio_wait again very soon, 111*737e150eSPaolo Bonzini * or go through another iteration of the GLib main loop. Hence, aio_notify 112*737e150eSPaolo Bonzini * also has the side effect of recalculating the sets of file descriptors 113*737e150eSPaolo Bonzini * that the main loop waits for. 114*737e150eSPaolo Bonzini * 115*737e150eSPaolo Bonzini * Calling aio_notify is rarely necessary, because for example scheduling 116*737e150eSPaolo Bonzini * a bottom half calls it already. 117*737e150eSPaolo Bonzini */ 118*737e150eSPaolo Bonzini void aio_notify(AioContext *ctx); 119*737e150eSPaolo Bonzini 120*737e150eSPaolo Bonzini /** 121*737e150eSPaolo Bonzini * aio_bh_poll: Poll bottom halves for an AioContext. 122*737e150eSPaolo Bonzini * 123*737e150eSPaolo Bonzini * These are internal functions used by the QEMU main loop. 124*737e150eSPaolo Bonzini */ 125*737e150eSPaolo Bonzini int aio_bh_poll(AioContext *ctx); 126*737e150eSPaolo Bonzini 127*737e150eSPaolo Bonzini /** 128*737e150eSPaolo Bonzini * qemu_bh_schedule: Schedule a bottom half. 129*737e150eSPaolo Bonzini * 130*737e150eSPaolo Bonzini * Scheduling a bottom half interrupts the main loop and causes the 131*737e150eSPaolo Bonzini * execution of the callback that was passed to qemu_bh_new. 132*737e150eSPaolo Bonzini * 133*737e150eSPaolo Bonzini * Bottom halves that are scheduled from a bottom half handler are instantly 134*737e150eSPaolo Bonzini * invoked. This can create an infinite loop if a bottom half handler 135*737e150eSPaolo Bonzini * schedules itself. 136*737e150eSPaolo Bonzini * 137*737e150eSPaolo Bonzini * @bh: The bottom half to be scheduled. 138*737e150eSPaolo Bonzini */ 139*737e150eSPaolo Bonzini void qemu_bh_schedule(QEMUBH *bh); 140*737e150eSPaolo Bonzini 141*737e150eSPaolo Bonzini /** 142*737e150eSPaolo Bonzini * qemu_bh_cancel: Cancel execution of a bottom half. 143*737e150eSPaolo Bonzini * 144*737e150eSPaolo Bonzini * Canceling execution of a bottom half undoes the effect of calls to 145*737e150eSPaolo Bonzini * qemu_bh_schedule without freeing its resources yet. While cancellation 146*737e150eSPaolo Bonzini * itself is also wait-free and thread-safe, it can of course race with the 147*737e150eSPaolo Bonzini * loop that executes bottom halves unless you are holding the iothread 148*737e150eSPaolo Bonzini * mutex. This makes it mostly useless if you are not holding the mutex. 149*737e150eSPaolo Bonzini * 150*737e150eSPaolo Bonzini * @bh: The bottom half to be canceled. 151*737e150eSPaolo Bonzini */ 152*737e150eSPaolo Bonzini void qemu_bh_cancel(QEMUBH *bh); 153*737e150eSPaolo Bonzini 154*737e150eSPaolo Bonzini /** 155*737e150eSPaolo Bonzini *qemu_bh_delete: Cancel execution of a bottom half and free its resources. 156*737e150eSPaolo Bonzini * 157*737e150eSPaolo Bonzini * Deleting a bottom half frees the memory that was allocated for it by 158*737e150eSPaolo Bonzini * qemu_bh_new. It also implies canceling the bottom half if it was 159*737e150eSPaolo Bonzini * scheduled. 160*737e150eSPaolo Bonzini * 161*737e150eSPaolo Bonzini * @bh: The bottom half to be deleted. 162*737e150eSPaolo Bonzini */ 163*737e150eSPaolo Bonzini void qemu_bh_delete(QEMUBH *bh); 164*737e150eSPaolo Bonzini 165*737e150eSPaolo Bonzini /* Return whether there are any pending callbacks from the GSource 166*737e150eSPaolo Bonzini * attached to the AioContext. 167*737e150eSPaolo Bonzini * 168*737e150eSPaolo Bonzini * This is used internally in the implementation of the GSource. 169*737e150eSPaolo Bonzini */ 170*737e150eSPaolo Bonzini bool aio_pending(AioContext *ctx); 171*737e150eSPaolo Bonzini 172*737e150eSPaolo Bonzini /* Progress in completing AIO work to occur. This can issue new pending 173*737e150eSPaolo Bonzini * aio as a result of executing I/O completion or bh callbacks. 174*737e150eSPaolo Bonzini * 175*737e150eSPaolo Bonzini * If there is no pending AIO operation or completion (bottom half), 176*737e150eSPaolo Bonzini * return false. If there are pending bottom halves, return true. 177*737e150eSPaolo Bonzini * 178*737e150eSPaolo Bonzini * If there are no pending bottom halves, but there are pending AIO 179*737e150eSPaolo Bonzini * operations, it may not be possible to make any progress without 180*737e150eSPaolo Bonzini * blocking. If @blocking is true, this function will wait until one 181*737e150eSPaolo Bonzini * or more AIO events have completed, to ensure something has moved 182*737e150eSPaolo Bonzini * before returning. 183*737e150eSPaolo Bonzini * 184*737e150eSPaolo Bonzini * If @blocking is false, this function will also return false if the 185*737e150eSPaolo Bonzini * function cannot make any progress without blocking. 186*737e150eSPaolo Bonzini */ 187*737e150eSPaolo Bonzini bool aio_poll(AioContext *ctx, bool blocking); 188*737e150eSPaolo Bonzini 189*737e150eSPaolo Bonzini #ifdef CONFIG_POSIX 190*737e150eSPaolo Bonzini /* Returns 1 if there are still outstanding AIO requests; 0 otherwise */ 191*737e150eSPaolo Bonzini typedef int (AioFlushHandler)(void *opaque); 192*737e150eSPaolo Bonzini 193*737e150eSPaolo Bonzini /* Register a file descriptor and associated callbacks. Behaves very similarly 194*737e150eSPaolo Bonzini * to qemu_set_fd_handler2. Unlike qemu_set_fd_handler2, these callbacks will 195*737e150eSPaolo Bonzini * be invoked when using qemu_aio_wait(). 196*737e150eSPaolo Bonzini * 197*737e150eSPaolo Bonzini * Code that invokes AIO completion functions should rely on this function 198*737e150eSPaolo Bonzini * instead of qemu_set_fd_handler[2]. 199*737e150eSPaolo Bonzini */ 200*737e150eSPaolo Bonzini void aio_set_fd_handler(AioContext *ctx, 201*737e150eSPaolo Bonzini int fd, 202*737e150eSPaolo Bonzini IOHandler *io_read, 203*737e150eSPaolo Bonzini IOHandler *io_write, 204*737e150eSPaolo Bonzini AioFlushHandler *io_flush, 205*737e150eSPaolo Bonzini void *opaque); 206*737e150eSPaolo Bonzini #endif 207*737e150eSPaolo Bonzini 208*737e150eSPaolo Bonzini /* Register an event notifier and associated callbacks. Behaves very similarly 209*737e150eSPaolo Bonzini * to event_notifier_set_handler. Unlike event_notifier_set_handler, these callbacks 210*737e150eSPaolo Bonzini * will be invoked when using qemu_aio_wait(). 211*737e150eSPaolo Bonzini * 212*737e150eSPaolo Bonzini * Code that invokes AIO completion functions should rely on this function 213*737e150eSPaolo Bonzini * instead of event_notifier_set_handler. 214*737e150eSPaolo Bonzini */ 215*737e150eSPaolo Bonzini void aio_set_event_notifier(AioContext *ctx, 216*737e150eSPaolo Bonzini EventNotifier *notifier, 217*737e150eSPaolo Bonzini EventNotifierHandler *io_read, 218*737e150eSPaolo Bonzini AioFlushEventNotifierHandler *io_flush); 219*737e150eSPaolo Bonzini 220*737e150eSPaolo Bonzini /* Return a GSource that lets the main loop poll the file descriptors attached 221*737e150eSPaolo Bonzini * to this AioContext. 222*737e150eSPaolo Bonzini */ 223*737e150eSPaolo Bonzini GSource *aio_get_g_source(AioContext *ctx); 224*737e150eSPaolo Bonzini 225*737e150eSPaolo Bonzini /* Functions to operate on the main QEMU AioContext. */ 226*737e150eSPaolo Bonzini 227*737e150eSPaolo Bonzini bool qemu_aio_wait(void); 228*737e150eSPaolo Bonzini void qemu_aio_set_event_notifier(EventNotifier *notifier, 229*737e150eSPaolo Bonzini EventNotifierHandler *io_read, 230*737e150eSPaolo Bonzini AioFlushEventNotifierHandler *io_flush); 231*737e150eSPaolo Bonzini 232*737e150eSPaolo Bonzini #ifdef CONFIG_POSIX 233*737e150eSPaolo Bonzini void qemu_aio_set_fd_handler(int fd, 234*737e150eSPaolo Bonzini IOHandler *io_read, 235*737e150eSPaolo Bonzini IOHandler *io_write, 236*737e150eSPaolo Bonzini AioFlushHandler *io_flush, 237*737e150eSPaolo Bonzini void *opaque); 238*737e150eSPaolo Bonzini #endif 239*737e150eSPaolo Bonzini 240*737e150eSPaolo Bonzini #endif 241