@@ -65,6 +65,7 @@ static CURLMcode __curl_multi_socket_action(CURLM *multi_handle,
#define CURL_TIMEOUT_MAX 10000
#define CURL_BLOCK_OPT_URL "url"
+#define CURL_BLOCK_OPT_READAHEAD "readahead"
#define CURL_BLOCK_OPT_SSLVERIFY "sslverify"
#define CURL_BLOCK_OPT_TIMEOUT "timeout"
#define CURL_BLOCK_OPT_COOKIE "cookie"
@@ -149,6 +150,7 @@ typedef struct BDRVCURLState {
uint64_t len;
CURLState states[CURL_NUM_STATES];
char *url;
+ size_t readahead_size;
bool sslverify;
uint64_t timeout;
char *cookie;
@@ -881,6 +883,11 @@ static QemuOptsList runtime_opts = {
.type = QEMU_OPT_STRING,
.help = "URL to open",
},
+ {
+ .name = CURL_BLOCK_OPT_READAHEAD,
+ .type = QEMU_OPT_SIZE,
+ .help = "Readahead size",
+ },
{
.name = CURL_BLOCK_OPT_SSLVERIFY,
.type = QEMU_OPT_BOOL,
@@ -976,6 +983,8 @@ static int curl_open(BlockDriverState *bs, QDict *options, int flags,
goto out_noclean;
}
+ s->readahead_size = qemu_opt_get_size(opts, CURL_BLOCK_OPT_READAHEAD, 0);
+
s->timeout = qemu_opt_get_number(opts, CURL_BLOCK_OPT_TIMEOUT,
CURL_BLOCK_OPT_TIMEOUT_DEFAULT);
if (s->timeout > CURL_TIMEOUT_MAX) {
@@ -1247,6 +1256,8 @@ static int coroutine_fn curl_co_preadv(BlockDriverState *bs,
trace_curl_co_preadv(qemu_coroutine_self(), offset, bytes);
+ bytes += s->readahead_size;
+
while (bytes > 0) {
uint64_t len = MIN(bytes, s->blocksize - curl_block_offset(s, off));
CURLAIOCB acb = {
@@ -174,6 +174,13 @@ These are specified using a special URL syntax.
``url``
The full URL when passing options to the driver explicitly.
+ ``readahead``
+ The amount of data to read ahead with each range request to the
+ remote server. This value may optionally have the suffix 'T', 'G',
+ 'M', 'K', 'k' or 'b'. If it does not have a suffix, it will be
+ assumed to be in bytes. The value must be a multiple of 512 bytes.
+ It defaults to 256k.
+
``sslverify``
Whether to verify the remote server's certificate when connecting
over SSL. It can have the value 'on' or 'off'. It defaults to
@@ -3752,6 +3752,8 @@
#
# @url: URL of the image file
#
+# @readahead: Amount of read-ahead (defaults to 0)
+#
# @timeout: Timeout for connections, in seconds (defaults to 5)
#
# @username: Username for authentication (defaults to none)
@@ -3776,6 +3778,7 @@
'data': { 'url': 'str',
'*blocksize': 'int',
'*blockcount': 'int',
+ '*readahead': 'int',
'*timeout': 'int',
'*username': 'str',
'*password-secret': 'str',
Re-add support for a readahead parameter, which is the number of bytes added to the request from the upper layer before breaking the request into blocks. The default is zero. The number of bytes specified has no alignment requirements. Signed-off-by: David Edmondson <david.edmondson@oracle.com> --- block/curl.c | 11 +++++++++++ docs/system/device-url-syntax.rst.inc | 7 +++++++ qapi/block-core.json | 3 +++ 3 files changed, 21 insertions(+)