From: Paolo Bonzini <pbonzini@redhat.com>
To: Peter Maydell <peter.maydell@linaro.org>
Cc: Kevin Wolf <kwolf@redhat.com>,
patches@linaro.org, qemu-devel@nongnu.org,
Stefan Hajnoczi <stefanha@redhat.com>,
qemu-stable@nongnu.org
Subject: Re: [Qemu-devel] [PATCH] block/curl: Implement the libcurl timer callback interface
Date: Wed, 15 Jan 2014 23:06:23 +0100 [thread overview]
Message-ID: <52D7065F.9020203@redhat.com> (raw)
In-Reply-To: <1389806638-3114-1-git-send-email-peter.maydell@linaro.org>
Il 15/01/2014 18:23, Peter Maydell ha scritto:
> libcurl versions 7.16.0 and later have a timer callback interface which
> must be implemented in order for libcurl to make forward progress (it
> will sometimes rely on being called back on the timeout if there are
> no file descriptors registered). Implement the callback, and use a
> QEMU AIO timer to ensure we prod libcurl again when it asks us to.
>
> Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
> ---
> This fixes the problem I was seeing where trying to use the curl block
> backend just hung. I'm not sure whether all libcurl versions that provide
> the timer callback API require its use, but it shouldn't hurt.
It still hangs here, but the adding the following patch on top fixes
curl on Fedora for me!
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
diff --git a/block/curl.c b/block/curl.c
index 5238961..e0cf138 100644
--- a/block/curl.c
+++ b/block/curl.c
@@ -232,20 +232,10 @@ static int curl_find_buf(BDRVCURLState *s, size_t start, size_t len,
return FIND_RET_NONE;
}
-static void curl_multi_do(void *arg)
+static void curl_multi_read(BDRVCURLState *s)
{
- BDRVCURLState *s = (BDRVCURLState *)arg;
- int running;
- int r;
int msgs_in_queue;
- if (!s->multi)
- return;
-
- do {
- r = curl_multi_socket_all(s->multi, &running);
- } while(r == CURLM_CALL_MULTI_PERFORM);
-
/* Try to find done transfers, so we can free the easy
* handle again. */
do {
@@ -289,6 +279,37 @@ static void curl_multi_do(void *arg)
} while(msgs_in_queue);
}
+static void curl_multi_do(void *arg)
+{
+ BDRVCURLState *s = (BDRVCURLState *)arg;
+ int running;
+ int r;
+
+ if (!s->multi) {
+ return;
+ }
+
+ do {
+ r = curl_multi_socket_all(s->multi, &running);
+ } while(r == CURLM_CALL_MULTI_PERFORM);
+
+ curl_multi_read(s);
+}
+
+static void curl_multi_timeout_do(void *arg)
+{
+ BDRVCURLState *s = (BDRVCURLState *)arg;
+ int running;
+
+ if (!s->multi) {
+ return;
+ }
+
+ curl_multi_socket_action(s->multi, CURL_SOCKET_TIMEOUT, 0, &running);
+
+ curl_multi_read(s);
+}
+
static CURLState *curl_init_state(BDRVCURLState *s)
{
CURLState *state = NULL;
@@ -498,7 +519,7 @@ static int curl_open(BlockDriverState *bs, QDict *options, int flags,
aio_timer_init(bdrv_get_aio_context(bs), &s->timer,
QEMU_CLOCK_REALTIME, SCALE_NS,
- curl_multi_do, s);
+ curl_multi_timeout_do, s);
// Now we know the file exists and its size, so let's
// initialize the multi interface!
next prev parent reply other threads:[~2014-01-15 22:06 UTC|newest]
Thread overview: 14+ messages / expand[flat|nested] mbox.gz Atom feed top
2014-01-15 17:23 [Qemu-devel] [PATCH] block/curl: Implement the libcurl timer callback interface Peter Maydell
2014-01-15 21:37 ` Richard W.M. Jones
2014-01-15 21:56 ` Peter Maydell
2014-01-16 8:40 ` Paolo Bonzini
2014-01-15 22:06 ` Paolo Bonzini [this message]
2014-01-15 22:15 ` Peter Maydell
2014-01-16 8:38 ` Paolo Bonzini
2014-01-16 9:55 ` Peter Maydell
2014-01-16 10:15 ` Paolo Bonzini
2014-01-16 9:12 ` Richard W.M. Jones
2014-01-16 9:24 ` Richard W.M. Jones
2014-01-16 9:52 ` Kevin Wolf
-- strict thread matches above, loose matches on Subject: below --
2014-01-24 13:56 Paolo Bonzini
2014-01-24 15:01 ` Kevin Wolf
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=52D7065F.9020203@redhat.com \
--to=pbonzini@redhat.com \
--cc=kwolf@redhat.com \
--cc=patches@linaro.org \
--cc=peter.maydell@linaro.org \
--cc=qemu-devel@nongnu.org \
--cc=qemu-stable@nongnu.org \
--cc=stefanha@redhat.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.