Commit 9d456654 authored by Paolo Bonzini's avatar Paolo Bonzini Committed by Stefan Hajnoczi
Browse files

block: explicitly acquire aiocontext in callbacks that need it



This covers both file descriptor callbacks and polling callbacks,
since they execute related code.

Reviewed-by: default avatarStefan Hajnoczi <stefanha@redhat.com>
Signed-off-by: default avatarPaolo Bonzini <pbonzini@redhat.com>
Reviewed-by: default avatarFam Zheng <famz@redhat.com>
Reviewed-by: default avatarDaniel P. Berrange <berrange@redhat.com>
Message-id: 20170213135235.12274-14-pbonzini@redhat.com
Signed-off-by: default avatarStefan Hajnoczi <stefanha@redhat.com>
parent 2f47da5f
Loading
Loading
Loading
Loading
+13 −3
Original line number Diff line number Diff line
@@ -386,9 +386,8 @@ static void curl_multi_check_completion(BDRVCURLState *s)
    }
}

static void curl_multi_do(void *arg)
static void curl_multi_do_locked(CURLState *s)
{
    CURLState *s = (CURLState *)arg;
    CURLSocket *socket, *next_socket;
    int running;
    int r;
@@ -406,12 +405,23 @@ static void curl_multi_do(void *arg)
    }
}

static void curl_multi_do(void *arg)
{
    CURLState *s = (CURLState *)arg;

    aio_context_acquire(s->s->aio_context);
    curl_multi_do_locked(s);
    aio_context_release(s->s->aio_context);
}

static void curl_multi_read(void *arg)
{
    CURLState *s = (CURLState *)arg;

    curl_multi_do(arg);
    aio_context_acquire(s->s->aio_context);
    curl_multi_do_locked(s);
    curl_multi_check_completion(s->s);
    aio_context_release(s->s->aio_context);
}

static void curl_multi_timeout_do(void *arg)
+4 −0
Original line number Diff line number Diff line
@@ -394,8 +394,10 @@ iscsi_process_read(void *arg)
    IscsiLun *iscsilun = arg;
    struct iscsi_context *iscsi = iscsilun->iscsi;

    aio_context_acquire(iscsilun->aio_context);
    iscsi_service(iscsi, POLLIN);
    iscsi_set_events(iscsilun);
    aio_context_release(iscsilun->aio_context);
}

static void
@@ -404,8 +406,10 @@ iscsi_process_write(void *arg)
    IscsiLun *iscsilun = arg;
    struct iscsi_context *iscsi = iscsilun->iscsi;

    aio_context_acquire(iscsilun->aio_context);
    iscsi_service(iscsi, POLLOUT);
    iscsi_set_events(iscsilun);
    aio_context_release(iscsilun->aio_context);
}

static int64_t sector_lun2qemu(int64_t sector, IscsiLun *iscsilun)
+4 −0
Original line number Diff line number Diff line
@@ -251,7 +251,9 @@ static void qemu_laio_completion_cb(EventNotifier *e)
    LinuxAioState *s = container_of(e, LinuxAioState, e);

    if (event_notifier_test_and_clear(&s->e)) {
        aio_context_acquire(s->aio_context);
        qemu_laio_process_completions_and_submit(s);
        aio_context_release(s->aio_context);
    }
}

@@ -265,7 +267,9 @@ static bool qemu_laio_poll_cb(void *opaque)
        return false;
    }

    aio_context_acquire(s->aio_context);
    qemu_laio_process_completions_and_submit(s);
    aio_context_release(s->aio_context);
    return true;
}

+6 −0
Original line number Diff line number Diff line
@@ -208,15 +208,21 @@ static void nfs_set_events(NFSClient *client)
static void nfs_process_read(void *arg)
{
    NFSClient *client = arg;

    aio_context_acquire(client->aio_context);
    nfs_service(client->context, POLLIN);
    nfs_set_events(client);
    aio_context_release(client->aio_context);
}

static void nfs_process_write(void *arg)
{
    NFSClient *client = arg;

    aio_context_acquire(client->aio_context);
    nfs_service(client->context, POLLOUT);
    nfs_set_events(client);
    aio_context_release(client->aio_context);
}

static void nfs_co_init_task(BlockDriverState *bs, NFSRPC *task)
+15 −14
Original line number Diff line number Diff line
@@ -575,13 +575,6 @@ static coroutine_fn int send_co_req(int sockfd, SheepdogReq *hdr, void *data,
    return ret;
}

static void restart_co_req(void *opaque)
{
    Coroutine *co = opaque;

    qemu_coroutine_enter(co);
}

typedef struct SheepdogReqCo {
    int sockfd;
    BlockDriverState *bs;
@@ -592,12 +585,19 @@ typedef struct SheepdogReqCo {
    unsigned int *rlen;
    int ret;
    bool finished;
    Coroutine *co;
} SheepdogReqCo;

static void restart_co_req(void *opaque)
{
    SheepdogReqCo *srco = opaque;

    aio_co_wake(srco->co);
}

static coroutine_fn void do_co_req(void *opaque)
{
    int ret;
    Coroutine *co;
    SheepdogReqCo *srco = opaque;
    int sockfd = srco->sockfd;
    SheepdogReq *hdr = srco->hdr;
@@ -605,9 +605,9 @@ static coroutine_fn void do_co_req(void *opaque)
    unsigned int *wlen = srco->wlen;
    unsigned int *rlen = srco->rlen;

    co = qemu_coroutine_self();
    srco->co = qemu_coroutine_self();
    aio_set_fd_handler(srco->aio_context, sockfd, false,
                       NULL, restart_co_req, NULL, co);
                       NULL, restart_co_req, NULL, srco);

    ret = send_co_req(sockfd, hdr, data, wlen);
    if (ret < 0) {
@@ -615,7 +615,7 @@ static coroutine_fn void do_co_req(void *opaque)
    }

    aio_set_fd_handler(srco->aio_context, sockfd, false,
                       restart_co_req, NULL, NULL, co);
                       restart_co_req, NULL, NULL, srco);

    ret = qemu_co_recv(sockfd, hdr, sizeof(*hdr));
    if (ret != sizeof(*hdr)) {
@@ -643,6 +643,7 @@ out:
    aio_set_fd_handler(srco->aio_context, sockfd, false,
                       NULL, NULL, NULL, NULL);

    srco->co = NULL;
    srco->ret = ret;
    srco->finished = true;
    if (srco->bs) {
@@ -866,7 +867,7 @@ static void coroutine_fn aio_read_response(void *opaque)
         * We've finished all requests which belong to the AIOCB, so
         * we can switch back to sd_co_readv/writev now.
         */
        qemu_coroutine_enter(acb->coroutine);
        aio_co_wake(acb->coroutine);
    }

    return;
@@ -883,14 +884,14 @@ static void co_read_response(void *opaque)
        s->co_recv = qemu_coroutine_create(aio_read_response, opaque);
    }

    qemu_coroutine_enter(s->co_recv);
    aio_co_wake(s->co_recv);
}

static void co_write_request(void *opaque)
{
    BDRVSheepdogState *s = opaque;

    qemu_coroutine_enter(s->co_send);
    aio_co_wake(s->co_send);
}

/*
Loading