sheepdog: add queue_lock
Reviewed-by: Stefan Hajnoczi <stefanha@redhat.com> Reviewed-by: Fam Zheng <famz@redhat.com> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com> Message-Id: <20170629132749.997-11-pbonzini@redhat.com> Signed-off-by: Fam Zheng <famz@redhat.com>
This commit is contained in:
parent
1f01e50b83
commit
f1af3251f8
|
@ -390,6 +390,7 @@ struct BDRVSheepdogState {
|
||||||
QLIST_HEAD(inflight_aio_head, AIOReq) inflight_aio_head;
|
QLIST_HEAD(inflight_aio_head, AIOReq) inflight_aio_head;
|
||||||
QLIST_HEAD(failed_aio_head, AIOReq) failed_aio_head;
|
QLIST_HEAD(failed_aio_head, AIOReq) failed_aio_head;
|
||||||
|
|
||||||
|
CoMutex queue_lock;
|
||||||
CoQueue overlapping_queue;
|
CoQueue overlapping_queue;
|
||||||
QLIST_HEAD(inflight_aiocb_head, SheepdogAIOCB) inflight_aiocb_head;
|
QLIST_HEAD(inflight_aiocb_head, SheepdogAIOCB) inflight_aiocb_head;
|
||||||
};
|
};
|
||||||
|
@ -488,7 +489,7 @@ static void wait_for_overlapping_aiocb(BDRVSheepdogState *s, SheepdogAIOCB *acb)
|
||||||
retry:
|
retry:
|
||||||
QLIST_FOREACH(cb, &s->inflight_aiocb_head, aiocb_siblings) {
|
QLIST_FOREACH(cb, &s->inflight_aiocb_head, aiocb_siblings) {
|
||||||
if (AIOCBOverlapping(acb, cb)) {
|
if (AIOCBOverlapping(acb, cb)) {
|
||||||
qemu_co_queue_wait(&s->overlapping_queue, NULL);
|
qemu_co_queue_wait(&s->overlapping_queue, &s->queue_lock);
|
||||||
goto retry;
|
goto retry;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -525,8 +526,10 @@ static void sd_aio_setup(SheepdogAIOCB *acb, BDRVSheepdogState *s,
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
qemu_co_mutex_lock(&s->queue_lock);
|
||||||
wait_for_overlapping_aiocb(s, acb);
|
wait_for_overlapping_aiocb(s, acb);
|
||||||
QLIST_INSERT_HEAD(&s->inflight_aiocb_head, acb, aiocb_siblings);
|
QLIST_INSERT_HEAD(&s->inflight_aiocb_head, acb, aiocb_siblings);
|
||||||
|
qemu_co_mutex_unlock(&s->queue_lock);
|
||||||
}
|
}
|
||||||
|
|
||||||
static SocketAddress *sd_socket_address(const char *path,
|
static SocketAddress *sd_socket_address(const char *path,
|
||||||
|
@ -785,6 +788,7 @@ static coroutine_fn void reconnect_to_sdog(void *opaque)
|
||||||
* have to move all the inflight requests to the failed queue before
|
* have to move all the inflight requests to the failed queue before
|
||||||
* resend_aioreq() is called.
|
* resend_aioreq() is called.
|
||||||
*/
|
*/
|
||||||
|
qemu_co_mutex_lock(&s->queue_lock);
|
||||||
QLIST_FOREACH_SAFE(aio_req, &s->inflight_aio_head, aio_siblings, next) {
|
QLIST_FOREACH_SAFE(aio_req, &s->inflight_aio_head, aio_siblings, next) {
|
||||||
QLIST_REMOVE(aio_req, aio_siblings);
|
QLIST_REMOVE(aio_req, aio_siblings);
|
||||||
QLIST_INSERT_HEAD(&s->failed_aio_head, aio_req, aio_siblings);
|
QLIST_INSERT_HEAD(&s->failed_aio_head, aio_req, aio_siblings);
|
||||||
|
@ -794,8 +798,11 @@ static coroutine_fn void reconnect_to_sdog(void *opaque)
|
||||||
while (!QLIST_EMPTY(&s->failed_aio_head)) {
|
while (!QLIST_EMPTY(&s->failed_aio_head)) {
|
||||||
aio_req = QLIST_FIRST(&s->failed_aio_head);
|
aio_req = QLIST_FIRST(&s->failed_aio_head);
|
||||||
QLIST_REMOVE(aio_req, aio_siblings);
|
QLIST_REMOVE(aio_req, aio_siblings);
|
||||||
|
qemu_co_mutex_unlock(&s->queue_lock);
|
||||||
resend_aioreq(s, aio_req);
|
resend_aioreq(s, aio_req);
|
||||||
|
qemu_co_mutex_lock(&s->queue_lock);
|
||||||
}
|
}
|
||||||
|
qemu_co_mutex_unlock(&s->queue_lock);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -887,7 +894,10 @@ static void coroutine_fn aio_read_response(void *opaque)
|
||||||
*/
|
*/
|
||||||
s->co_recv = NULL;
|
s->co_recv = NULL;
|
||||||
|
|
||||||
|
qemu_co_mutex_lock(&s->queue_lock);
|
||||||
QLIST_REMOVE(aio_req, aio_siblings);
|
QLIST_REMOVE(aio_req, aio_siblings);
|
||||||
|
qemu_co_mutex_unlock(&s->queue_lock);
|
||||||
|
|
||||||
switch (rsp.result) {
|
switch (rsp.result) {
|
||||||
case SD_RES_SUCCESS:
|
case SD_RES_SUCCESS:
|
||||||
break;
|
break;
|
||||||
|
@ -1307,7 +1317,9 @@ static void coroutine_fn add_aio_request(BDRVSheepdogState *s, AIOReq *aio_req,
|
||||||
uint64_t old_oid = aio_req->base_oid;
|
uint64_t old_oid = aio_req->base_oid;
|
||||||
bool create = aio_req->create;
|
bool create = aio_req->create;
|
||||||
|
|
||||||
|
qemu_co_mutex_lock(&s->queue_lock);
|
||||||
QLIST_INSERT_HEAD(&s->inflight_aio_head, aio_req, aio_siblings);
|
QLIST_INSERT_HEAD(&s->inflight_aio_head, aio_req, aio_siblings);
|
||||||
|
qemu_co_mutex_unlock(&s->queue_lock);
|
||||||
|
|
||||||
if (!nr_copies) {
|
if (!nr_copies) {
|
||||||
error_report("bug");
|
error_report("bug");
|
||||||
|
@ -1678,6 +1690,7 @@ static int sd_open(BlockDriverState *bs, QDict *options, int flags,
|
||||||
bs->total_sectors = s->inode.vdi_size / BDRV_SECTOR_SIZE;
|
bs->total_sectors = s->inode.vdi_size / BDRV_SECTOR_SIZE;
|
||||||
pstrcpy(s->name, sizeof(s->name), vdi);
|
pstrcpy(s->name, sizeof(s->name), vdi);
|
||||||
qemu_co_mutex_init(&s->lock);
|
qemu_co_mutex_init(&s->lock);
|
||||||
|
qemu_co_mutex_init(&s->queue_lock);
|
||||||
qemu_co_queue_init(&s->overlapping_queue);
|
qemu_co_queue_init(&s->overlapping_queue);
|
||||||
qemu_opts_del(opts);
|
qemu_opts_del(opts);
|
||||||
g_free(buf);
|
g_free(buf);
|
||||||
|
@ -2438,12 +2451,16 @@ static void coroutine_fn sd_co_rw_vector(SheepdogAIOCB *acb)
|
||||||
|
|
||||||
static void sd_aio_complete(SheepdogAIOCB *acb)
|
static void sd_aio_complete(SheepdogAIOCB *acb)
|
||||||
{
|
{
|
||||||
|
BDRVSheepdogState *s;
|
||||||
if (acb->aiocb_type == AIOCB_FLUSH_CACHE) {
|
if (acb->aiocb_type == AIOCB_FLUSH_CACHE) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
s = acb->s;
|
||||||
|
qemu_co_mutex_lock(&s->queue_lock);
|
||||||
QLIST_REMOVE(acb, aiocb_siblings);
|
QLIST_REMOVE(acb, aiocb_siblings);
|
||||||
qemu_co_queue_restart_all(&acb->s->overlapping_queue);
|
qemu_co_queue_restart_all(&s->overlapping_queue);
|
||||||
|
qemu_co_mutex_unlock(&s->queue_lock);
|
||||||
}
|
}
|
||||||
|
|
||||||
static coroutine_fn int sd_co_writev(BlockDriverState *bs, int64_t sector_num,
|
static coroutine_fn int sd_co_writev(BlockDriverState *bs, int64_t sector_num,
|
||||||
|
|
Loading…
Reference in New Issue