Skip to content
  • Paolo Bonzini's avatar
    aio: introduce aio_co_schedule and aio_co_wake · 0c330a73
    Paolo Bonzini authored
    
    
    aio_co_wake provides the infrastructure to start a coroutine on a "home"
    AioContext.  It will be used by CoMutex and CoQueue, so that coroutines
    don't jump from one context to another when they go to sleep on a
    mutex or waitqueue.  However, it can also be used as a more efficient
    alternative to one-shot bottom halves, and saves the effort of tracking
    which AioContext a coroutine is running on.
    
    aio_co_schedule is the part of aio_co_wake that starts a coroutine
    on a remove AioContext, but it is also useful to implement e.g.
    bdrv_set_aio_context callbacks.
    
    The implementation of aio_co_schedule is based on a lock-free
    multiple-producer, single-consumer queue.  The multiple producers use
    cmpxchg to add to a LIFO stack.  The consumer (a per-AioContext bottom
    half) grabs all items added so far, inverts the list to make it FIFO,
    and goes through it one item at a time until it's empty.  The data
    structure was inspired by OSv, which uses it in the very code we'll
    "port" to QEMU for the thread-safe CoMutex.
    
    Most of the new code is really tests.
    
    Signed-off-by: default avatarPaolo Bonzini <pbonzini@redhat.com>
    Reviewed-by: default avatarFam Zheng <famz@redhat.com>
    Message-id: 20170213135235.12274-3-pbonzini@redhat.com
    Signed-off-by: default avatarStefan Hajnoczi <stefanha@redhat.com>
    0c330a73