|
|
76daa3 |
From 0493fc983cc97eeb9c142ab7efcfce940f0cf75d Mon Sep 17 00:00:00 2001
|
|
|
76daa3 |
From: Paolo Bonzini <pbonzini@redhat.com>
|
|
|
76daa3 |
Date: Wed, 17 May 2017 13:09:21 +0200
|
|
|
76daa3 |
Subject: [PATCH 15/27] curl: do not do aio_poll when waiting for a free
|
|
|
76daa3 |
CURLState
|
|
|
76daa3 |
|
|
|
76daa3 |
RH-Author: Paolo Bonzini <pbonzini@redhat.com>
|
|
|
76daa3 |
Message-id: <20170517130921.27402-8-pbonzini@redhat.com>
|
|
|
76daa3 |
Patchwork-id: 75266
|
|
|
76daa3 |
O-Subject: [RHEL7.4 qemu-kvm PATCH v2 7/7] curl: do not do aio_poll when waiting for a free CURLState
|
|
|
76daa3 |
Bugzilla: 1437393
|
|
|
76daa3 |
RH-Acked-by: Max Reitz <mreitz@redhat.com>
|
|
|
76daa3 |
RH-Acked-by: Stefan Hajnoczi <stefanha@redhat.com>
|
|
|
76daa3 |
RH-Acked-by: Jeffrey Cody <jcody@redhat.com>
|
|
|
76daa3 |
|
|
|
76daa3 |
Instead, put the CURLAIOCB on a wait list and yield; curl_clean_state will
|
|
|
76daa3 |
wake the corresponding coroutine.
|
|
|
76daa3 |
|
|
|
76daa3 |
Because of CURL's callback-based structure, we cannot easily convert
|
|
|
76daa3 |
everything to CoMutex/CoQueue; keeping the QemuMutex is simpler. However,
|
|
|
76daa3 |
CoQueue is a simple wrapper around a linked list, so we can easily
|
|
|
76daa3 |
use QSIMPLEQ and open-code a CoQueue, protected by the BDRVCURLState
|
|
|
76daa3 |
QemuMutex instead of a CoMutex.
|
|
|
76daa3 |
|
|
|
76daa3 |
Reviewed-by: Jeff Cody <jcody@redhat.com>
|
|
|
76daa3 |
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
|
|
|
76daa3 |
Reviewed-by: Max Reitz <mreitz@redhat.com>
|
|
|
76daa3 |
Message-id: 20170515100059.15795-8-pbonzini@redhat.com
|
|
|
76daa3 |
Signed-off-by: Jeff Cody <jcody@redhat.com>
|
|
|
76daa3 |
(cherry picked from commit 2bb5c936c5827e1d831002f7a7517cb8c2c2201d)
|
|
|
76daa3 |
Signed-off-by: Miroslav Rezanina <mrezanin@redhat.com>
|
|
|
76daa3 |
---
|
|
|
76daa3 |
block/curl.c | 16 +++++++++++++++-
|
|
|
76daa3 |
1 file changed, 15 insertions(+), 1 deletion(-)
|
|
|
76daa3 |
|
|
|
76daa3 |
diff --git a/block/curl.c b/block/curl.c
|
|
|
76daa3 |
index acfbe52..eb9fda7 100644
|
|
|
76daa3 |
--- a/block/curl.c
|
|
|
76daa3 |
+++ b/block/curl.c
|
|
|
76daa3 |
@@ -98,6 +98,8 @@ typedef struct CURLAIOCB {
|
|
|
76daa3 |
|
|
|
76daa3 |
size_t start;
|
|
|
76daa3 |
size_t end;
|
|
|
76daa3 |
+
|
|
|
76daa3 |
+ QSIMPLEQ_ENTRY(CURLAIOCB) next;
|
|
|
76daa3 |
} CURLAIOCB;
|
|
|
76daa3 |
|
|
|
76daa3 |
typedef struct CURLSocket {
|
|
|
76daa3 |
@@ -133,6 +135,7 @@ typedef struct BDRVCURLState {
|
|
|
76daa3 |
bool accept_range;
|
|
|
76daa3 |
AioContext *aio_context;
|
|
|
76daa3 |
QemuMutex mutex;
|
|
|
76daa3 |
+ QSIMPLEQ_HEAD(, CURLAIOCB) free_state_waitq;
|
|
|
76daa3 |
char *username;
|
|
|
76daa3 |
char *password;
|
|
|
76daa3 |
char *proxyusername;
|
|
|
76daa3 |
@@ -532,6 +535,7 @@ static int curl_init_state(BDRVCURLState *s, CURLState *state)
|
|
|
76daa3 |
/* Called with s->mutex held. */
|
|
|
76daa3 |
static void curl_clean_state(CURLState *s)
|
|
|
76daa3 |
{
|
|
|
76daa3 |
+ CURLAIOCB *next;
|
|
|
76daa3 |
int j;
|
|
|
76daa3 |
for (j = 0; j < CURL_NUM_ACB; j++) {
|
|
|
76daa3 |
assert(!s->acb[j]);
|
|
|
76daa3 |
@@ -548,6 +552,14 @@ static void curl_clean_state(CURLState *s)
|
|
|
76daa3 |
}
|
|
|
76daa3 |
|
|
|
76daa3 |
s->in_use = 0;
|
|
|
76daa3 |
+
|
|
|
76daa3 |
+ next = QSIMPLEQ_FIRST(&s->s->free_state_waitq);
|
|
|
76daa3 |
+ if (next) {
|
|
|
76daa3 |
+ QSIMPLEQ_REMOVE_HEAD(&s->s->free_state_waitq, next);
|
|
|
76daa3 |
+ qemu_mutex_unlock(&s->s->mutex);
|
|
|
76daa3 |
+ aio_co_wake(next->co);
|
|
|
76daa3 |
+ qemu_mutex_lock(&s->s->mutex);
|
|
|
76daa3 |
+ }
|
|
|
76daa3 |
}
|
|
|
76daa3 |
|
|
|
76daa3 |
static void curl_parse_filename(const char *filename, QDict *options,
|
|
|
76daa3 |
@@ -744,6 +756,7 @@ static int curl_open(BlockDriverState *bs, QDict *options, int flags,
|
|
|
76daa3 |
}
|
|
|
76daa3 |
|
|
|
76daa3 |
DPRINTF("CURL: Opening %s\n", file);
|
|
|
76daa3 |
+ QSIMPLEQ_INIT(&s->free_state_waitq);
|
|
|
76daa3 |
s->aio_context = bdrv_get_aio_context(bs);
|
|
|
76daa3 |
s->url = g_strdup(file);
|
|
|
76daa3 |
qemu_mutex_lock(&s->mutex);
|
|
|
76daa3 |
@@ -844,8 +857,9 @@ static void curl_setup_preadv(BlockDriverState *bs, CURLAIOCB *acb)
|
|
|
76daa3 |
if (state) {
|
|
|
76daa3 |
break;
|
|
|
76daa3 |
}
|
|
|
76daa3 |
+ QSIMPLEQ_INSERT_TAIL(&s->free_state_waitq, acb, next);
|
|
|
76daa3 |
qemu_mutex_unlock(&s->mutex);
|
|
|
76daa3 |
- aio_poll(bdrv_get_aio_context(bs), true);
|
|
|
76daa3 |
+ qemu_coroutine_yield();
|
|
|
76daa3 |
qemu_mutex_lock(&s->mutex);
|
|
|
76daa3 |
}
|
|
|
76daa3 |
|
|
|
76daa3 |
--
|
|
|
76daa3 |
1.8.3.1
|
|
|
76daa3 |
|