|
|
05bba0 |
From 2b07b0558685c234fd93214be705a4feb058e27b Mon Sep 17 00:00:00 2001
|
|
|
05bba0 |
From: Richard Jones <rjones@redhat.com>
|
|
|
05bba0 |
Date: Thu, 11 Jun 2015 11:40:16 +0200
|
|
|
05bba0 |
Subject: [PATCH 16/30] curl: Eliminate unnecessary use of
|
|
|
05bba0 |
curl_multi_socket_all
|
|
|
05bba0 |
|
|
|
05bba0 |
Message-id: <1434022828-13037-10-git-send-email-rjones@redhat.com>
|
|
|
05bba0 |
Patchwork-id: 65844
|
|
|
05bba0 |
O-Subject: [RHEL-7.2 qemu-kvm v3 PATCH 09/21] curl: Eliminate unnecessary use of curl_multi_socket_all
|
|
|
05bba0 |
Bugzilla: 1226684
|
|
|
05bba0 |
RH-Acked-by: Miroslav Rezanina <mrezanin@redhat.com>
|
|
|
05bba0 |
RH-Acked-by: Stefan Hajnoczi <stefanha@redhat.com>
|
|
|
05bba0 |
RH-Acked-by: Laszlo Ersek <lersek@redhat.com>
|
|
|
05bba0 |
|
|
|
05bba0 |
From: Matthew Booth <mbooth@redhat.com>
|
|
|
05bba0 |
|
|
|
05bba0 |
curl_multi_socket_all is a deprecated catch-all which checks for
|
|
|
05bba0 |
activities on all open curl sockets. We have enough information from
|
|
|
05bba0 |
the event loop to check only the sockets with activity. This change
|
|
|
05bba0 |
removes use of curl_multi_socket_all in favour of
|
|
|
05bba0 |
curl_multi_socket_action called with the relevant handle.
|
|
|
05bba0 |
|
|
|
05bba0 |
At the same time, it also ensures that the driver only checks for
|
|
|
05bba0 |
completion of read operations after reading from a socket, rather than
|
|
|
05bba0 |
both reading and writing.
|
|
|
05bba0 |
|
|
|
05bba0 |
Signed-off-by: Matthew Booth <mbooth@redhat.com>
|
|
|
05bba0 |
Tested-by: Richard W.M. Jones <rjones@redhat.com>
|
|
|
05bba0 |
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
|
|
|
05bba0 |
|
|
|
05bba0 |
Upstream-status: 838ef602498b8d1985a231a06f5e328e2946a81d
|
|
|
05bba0 |
Signed-off-by: Miroslav Rezanina <mrezanin@redhat.com>
|
|
|
05bba0 |
---
|
|
|
05bba0 |
block/curl.c | 34 +++++++++++++++++++++++-----------
|
|
|
05bba0 |
1 file changed, 23 insertions(+), 11 deletions(-)
|
|
|
05bba0 |
|
|
|
05bba0 |
diff --git a/block/curl.c b/block/curl.c
|
|
|
05bba0 |
index e4332c5..b19e632 100644
|
|
|
05bba0 |
--- a/block/curl.c
|
|
|
05bba0 |
+++ b/block/curl.c
|
|
|
05bba0 |
@@ -71,6 +71,7 @@ typedef struct CURLState
|
|
|
05bba0 |
struct BDRVCURLState *s;
|
|
|
05bba0 |
CURLAIOCB *acb[CURL_NUM_ACB];
|
|
|
05bba0 |
CURL *curl;
|
|
|
05bba0 |
+ curl_socket_t sock_fd;
|
|
|
05bba0 |
char *orig_buf;
|
|
|
05bba0 |
size_t buf_start;
|
|
|
05bba0 |
size_t buf_off;
|
|
|
05bba0 |
@@ -92,6 +93,7 @@ typedef struct BDRVCURLState {
|
|
|
05bba0 |
static void curl_clean_state(CURLState *s);
|
|
|
05bba0 |
static void curl_multi_do(void *arg);
|
|
|
05bba0 |
static int curl_aio_flush(void *opaque);
|
|
|
05bba0 |
+static void curl_multi_read(void *arg);
|
|
|
05bba0 |
|
|
|
05bba0 |
#ifdef NEED_CURL_TIMER_CALLBACK
|
|
|
05bba0 |
static int curl_timer_cb(CURLM *multi, long timeout_ms, void *opaque)
|
|
|
05bba0 |
@@ -113,17 +115,21 @@ static int curl_timer_cb(CURLM *multi, long timeout_ms, void *opaque)
|
|
|
05bba0 |
static int curl_sock_cb(CURL *curl, curl_socket_t fd, int action,
|
|
|
05bba0 |
void *s, void *sp)
|
|
|
05bba0 |
{
|
|
|
05bba0 |
+ CURLState *state = NULL;
|
|
|
05bba0 |
+ curl_easy_getinfo(curl, CURLINFO_PRIVATE, (char **)&state);
|
|
|
05bba0 |
+ state->sock_fd = fd;
|
|
|
05bba0 |
+
|
|
|
05bba0 |
DPRINTF("CURL (AIO): Sock action %d on fd %d\n", action, fd);
|
|
|
05bba0 |
switch (action) {
|
|
|
05bba0 |
case CURL_POLL_IN:
|
|
|
05bba0 |
- qemu_aio_set_fd_handler(fd, curl_multi_do, NULL, curl_aio_flush, s);
|
|
|
05bba0 |
+ qemu_aio_set_fd_handler(fd, curl_multi_read, NULL, curl_aio_flush, state);
|
|
|
05bba0 |
break;
|
|
|
05bba0 |
case CURL_POLL_OUT:
|
|
|
05bba0 |
- qemu_aio_set_fd_handler(fd, NULL, curl_multi_do, curl_aio_flush, s);
|
|
|
05bba0 |
+ qemu_aio_set_fd_handler(fd, NULL, curl_multi_do, curl_aio_flush, state);
|
|
|
05bba0 |
break;
|
|
|
05bba0 |
case CURL_POLL_INOUT:
|
|
|
05bba0 |
- qemu_aio_set_fd_handler(fd, curl_multi_do, curl_multi_do,
|
|
|
05bba0 |
- curl_aio_flush, s);
|
|
|
05bba0 |
+ qemu_aio_set_fd_handler(fd, curl_multi_read, curl_multi_do,
|
|
|
05bba0 |
+ curl_aio_flush, state);
|
|
|
05bba0 |
break;
|
|
|
05bba0 |
case CURL_POLL_REMOVE:
|
|
|
05bba0 |
qemu_aio_set_fd_handler(fd, NULL, NULL, NULL, NULL);
|
|
|
05bba0 |
@@ -236,7 +242,7 @@ static int curl_find_buf(BDRVCURLState *s, size_t start, size_t len,
|
|
|
05bba0 |
return FIND_RET_NONE;
|
|
|
05bba0 |
}
|
|
|
05bba0 |
|
|
|
05bba0 |
-static void curl_multi_read(BDRVCURLState *s)
|
|
|
05bba0 |
+static void curl_multi_check_completion(BDRVCURLState *s)
|
|
|
05bba0 |
{
|
|
|
05bba0 |
int msgs_in_queue;
|
|
|
05bba0 |
|
|
|
05bba0 |
@@ -286,19 +292,26 @@ static void curl_multi_read(BDRVCURLState *s)
|
|
|
05bba0 |
|
|
|
05bba0 |
static void curl_multi_do(void *arg)
|
|
|
05bba0 |
{
|
|
|
05bba0 |
- BDRVCURLState *s = (BDRVCURLState *)arg;
|
|
|
05bba0 |
+ CURLState *s = (CURLState *)arg;
|
|
|
05bba0 |
int running;
|
|
|
05bba0 |
int r;
|
|
|
05bba0 |
|
|
|
05bba0 |
- if (!s->multi) {
|
|
|
05bba0 |
+ if (!s->s->multi) {
|
|
|
05bba0 |
return;
|
|
|
05bba0 |
}
|
|
|
05bba0 |
|
|
|
05bba0 |
do {
|
|
|
05bba0 |
- r = curl_multi_socket_all(s->multi, &running);
|
|
|
05bba0 |
+ r = curl_multi_socket_action(s->s->multi, s->sock_fd, 0, &running);
|
|
|
05bba0 |
} while(r == CURLM_CALL_MULTI_PERFORM);
|
|
|
05bba0 |
|
|
|
05bba0 |
- curl_multi_read(s);
|
|
|
05bba0 |
+}
|
|
|
05bba0 |
+
|
|
|
05bba0 |
+static void curl_multi_read(void *arg)
|
|
|
05bba0 |
+{
|
|
|
05bba0 |
+ CURLState *s = (CURLState *)arg;
|
|
|
05bba0 |
+
|
|
|
05bba0 |
+ curl_multi_do(arg);
|
|
|
05bba0 |
+ curl_multi_check_completion(s->s);
|
|
|
05bba0 |
}
|
|
|
05bba0 |
|
|
|
05bba0 |
static void curl_multi_timeout_do(void *arg)
|
|
|
05bba0 |
@@ -313,7 +326,7 @@ static void curl_multi_timeout_do(void *arg)
|
|
|
05bba0 |
|
|
|
05bba0 |
curl_multi_socket_action(s->multi, CURL_SOCKET_TIMEOUT, 0, &running);
|
|
|
05bba0 |
|
|
|
05bba0 |
- curl_multi_read(s);
|
|
|
05bba0 |
+ curl_multi_check_completion(s);
|
|
|
05bba0 |
#else
|
|
|
05bba0 |
abort();
|
|
|
05bba0 |
#endif
|
|
|
05bba0 |
@@ -517,7 +530,6 @@ static int curl_open(BlockDriverState *bs, QDict *options, int flags,
|
|
|
05bba0 |
// initialize the multi interface!
|
|
|
05bba0 |
|
|
|
05bba0 |
s->multi = curl_multi_init();
|
|
|
05bba0 |
- curl_multi_setopt(s->multi, CURLMOPT_SOCKETDATA, s);
|
|
|
05bba0 |
curl_multi_setopt(s->multi, CURLMOPT_SOCKETFUNCTION, curl_sock_cb);
|
|
|
05bba0 |
#ifdef NEED_CURL_TIMER_CALLBACK
|
|
|
05bba0 |
curl_multi_setopt(s->multi, CURLMOPT_TIMERDATA, s);
|
|
|
05bba0 |
--
|
|
|
05bba0 |
1.8.3.1
|
|
|
05bba0 |
|