From: Jeff Cody <jcody@redhat.com>
To: Paolo Bonzini <pbonzini@redhat.com>
Cc: qemu-devel@nongnu.org, qemu-stable@nongnu.org,
qemu-block@nongnu.org, rjones@redhat.com
Subject: Re: [Qemu-devel] [PATCH 4/7] curl: split curl_find_state/curl_init_state
Date: Fri, 12 May 2017 17:38:11 -0400 [thread overview]
Message-ID: <20170512213811.GD19824@localhost.localdomain> (raw)
In-Reply-To: <20170510143205.32013-5-pbonzini@redhat.com>
On Wed, May 10, 2017 at 04:32:02PM +0200, Paolo Bonzini wrote:
> If curl_easy_init fails, a CURLState is left with s->in_use = 1. Split
> curl_init_state in two, so that we can distinguish the two failures and
> call curl_clean_state if needed.
>
> While at it, simplify curl_find_state, removing a dummy loop. The
> aio_poll loop is moved to the sole caller that needs it.
>
> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
> ---
> block/curl.c | 52 ++++++++++++++++++++++++++++++----------------------
> 1 file changed, 30 insertions(+), 22 deletions(-)
>
> diff --git a/block/curl.c b/block/curl.c
> index b18e79bf54..4b4d5a2389 100644
> --- a/block/curl.c
> +++ b/block/curl.c
> @@ -455,34 +455,27 @@ static void curl_multi_timeout_do(void *arg)
> }
>
> /* Called with s->mutex held. */
> -static CURLState *curl_init_state(BlockDriverState *bs, BDRVCURLState *s)
> +static CURLState *curl_find_state(BDRVCURLState *s)
> {
> CURLState *state = NULL;
> - int i, j;
> -
> - do {
> - for (i=0; i<CURL_NUM_STATES; i++) {
> - for (j=0; j<CURL_NUM_ACB; j++)
> - if (s->states[i].acb[j])
> - continue;
> - if (s->states[i].in_use)
> - continue;
> + int i;
>
> + for (i=0; i<CURL_NUM_STATES; i++) {
> + if (!s->states[i].in_use) {
> state = &s->states[i];
> state->in_use = 1;
> break;
> }
> - if (!state) {
> - qemu_mutex_unlock(&s->mutex);
> - aio_poll(bdrv_get_aio_context(bs), true);
> - qemu_mutex_lock(&s->mutex);
> - }
> - } while(!state);
> + }
> + return state;
> +}
>
> +static int curl_init_state(BDRVCURLState *s, CURLState *state)
> +{
> if (!state->curl) {
> state->curl = curl_easy_init();
> if (!state->curl) {
> - return NULL;
> + return -EIO;
> }
> curl_easy_setopt(state->curl, CURLOPT_URL, s->url);
> curl_easy_setopt(state->curl, CURLOPT_SSL_VERIFYPEER,
> @@ -535,7 +528,7 @@ static CURLState *curl_init_state(BlockDriverState *bs, BDRVCURLState *s)
> QLIST_INIT(&state->sockets);
> state->s = s;
>
> - return state;
> + return 0;
> }
>
> /* Called with s->mutex held. */
> @@ -756,13 +749,18 @@ static int curl_open(BlockDriverState *bs, QDict *options, int flags,
> s->aio_context = bdrv_get_aio_context(bs);
> s->url = g_strdup(file);
> qemu_mutex_lock(&s->mutex);
> - state = curl_init_state(bs, s);
> + state = curl_find_state(s);
> qemu_mutex_unlock(&s->mutex);
> - if (!state)
> + if (!state) {
> goto out_noclean;
> + }
>
> // Get file size
>
> + if (curl_init_state(s, state) < 0) {
> + goto out;
> + }
> +
> s->accept_range = false;
> curl_easy_setopt(state->curl, CURLOPT_NOBODY, 1);
> curl_easy_setopt(state->curl, CURLOPT_HEADERFUNCTION,
> @@ -856,8 +854,18 @@ static void curl_readv_bh_cb(void *p)
> }
>
> // No cache found, so let's start a new request
> - state = curl_init_state(acb->common.bs, s);
> - if (!state) {
> + for (;;) {
> + state = curl_find_state(s);
> + if (state) {
> + break;
> + }
> + qemu_mutex_unlock(&s->mutex);
> + aio_poll(bdrv_get_aio_context(bs), true);
> + qemu_mutex_lock(&s->mutex);
> + }
> +
> + if (curl_init_state(s, state) < 0) {
> + curl_clean_state(state);
For some reason, I initially thought this might cause problems with the
assert in curl_clean_state(), but that isn't the case.
Reviewed-by: Jeff Cody <jcody@redhat.com>
> ret = -EIO;
> goto out;
> }
> --
> 2.12.2
>
>
next prev parent reply other threads:[~2017-05-12 21:38 UTC|newest]
Thread overview: 28+ messages / expand[flat|nested] mbox.gz Atom feed top
2017-05-10 14:31 [Qemu-devel] [PATCH v2 0/7] curl: locking cleanups/fixes, coroutine conversion, remove aio_poll Paolo Bonzini
2017-05-10 14:31 ` [Qemu-devel] [PATCH 1/7] curl: strengthen assertion in curl_clean_state Paolo Bonzini
2017-05-10 16:33 ` [Qemu-devel] [Qemu-block] " Max Reitz
2017-05-11 20:35 ` [Qemu-devel] " Jeff Cody
2017-05-10 14:32 ` [Qemu-devel] [PATCH 2/7] curl: never invoke callbacks with s->mutex held Paolo Bonzini
2017-05-10 16:33 ` [Qemu-devel] [Qemu-block] " Max Reitz
2017-05-11 20:40 ` [Qemu-devel] " Jeff Cody
2017-05-10 14:32 ` [Qemu-devel] [PATCH 3/7] curl: avoid recursive locking of BDRVCURLState mutex Paolo Bonzini
2017-05-10 16:38 ` [Qemu-devel] [Qemu-block] " Max Reitz
2017-05-11 20:56 ` [Qemu-devel] " Jeff Cody
2017-05-12 14:48 ` Paolo Bonzini
2017-05-10 14:32 ` [Qemu-devel] [PATCH 4/7] curl: split curl_find_state/curl_init_state Paolo Bonzini
2017-05-10 17:26 ` [Qemu-devel] [Qemu-block] " Max Reitz
2017-05-11 13:49 ` [Qemu-devel] " Paolo Bonzini
2017-05-12 21:38 ` Jeff Cody [this message]
2017-05-10 14:32 ` [Qemu-devel] [PATCH 5/7] curl: convert CURLAIOCB to byte values Paolo Bonzini
2017-05-10 17:36 ` [Qemu-devel] [Qemu-block] " Max Reitz
2017-05-10 18:37 ` Eric Blake
2017-05-12 21:38 ` [Qemu-devel] " Jeff Cody
2017-05-10 14:32 ` [Qemu-devel] [PATCH 6/7] curl: convert readv to coroutines Paolo Bonzini
2017-05-12 21:40 ` Jeff Cody
2017-05-10 14:32 ` [Qemu-devel] [PATCH 7/7] curl: do not do aio_poll when waiting for a free CURLState Paolo Bonzini
2017-05-10 17:54 ` [Qemu-devel] [Qemu-block] " Max Reitz
2017-05-12 21:41 ` [Qemu-devel] " Jeff Cody
2017-05-10 15:11 ` [Qemu-devel] [PATCH v2 0/7] curl: locking cleanups/fixes, coroutine conversion, remove aio_poll no-reply
2017-05-10 15:57 ` Richard W.M. Jones
2017-05-15 19:12 ` [Qemu-devel] [Qemu-block] " Max Reitz
2017-05-15 20:30 ` Richard W.M. Jones
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=20170512213811.GD19824@localhost.localdomain \
--to=jcody@redhat.com \
--cc=pbonzini@redhat.com \
--cc=qemu-block@nongnu.org \
--cc=qemu-devel@nongnu.org \
--cc=qemu-stable@nongnu.org \
--cc=rjones@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.