1
The following changes since commit 560009f2c8b57b7cdd31a5693ea86ab369382f49:
1
The following changes since commit ca61fa4b803e5d0abaf6f1ceb690f23bb78a4def:
2
2
3
Merge remote-tracking branch 'remotes/kevin/tags/for-upstream' into staging (2019-10-07 15:40:53 +0100)
3
Merge remote-tracking branch 'remotes/quic/tags/pull-hex-20211006' into staging (2021-10-06 12:11:14 -0700)
4
4
5
are available in the Git repository at:
5
are available in the Git repository at:
6
6
7
https://github.com/stefanha/qemu.git tags/block-pull-request
7
https://gitlab.com/stefanha/qemu.git tags/block-pull-request
8
8
9
for you to fetch changes up to 4d804b5305ffb4d5fa414c38d4f1bdfb987c8d0b:
9
for you to fetch changes up to 1cc7eada97914f090125e588497986f6f7900514:
10
10
11
iotests/262: Switch source/dest VM launch order (2019-10-08 14:28:25 +0100)
11
iothread: use IOThreadParamInfo in iothread_[set|get]_param() (2021-10-07 15:29:50 +0100)
12
12
13
----------------------------------------------------------------
13
----------------------------------------------------------------
14
Pull request
14
Pull request
15
15
16
This pull request also contains the two commits from the previous pull request
17
that was dropped due to a mingw compilation error. The compilation should now
18
be fixed.
19
20
----------------------------------------------------------------
16
----------------------------------------------------------------
21
17
22
Max Reitz (2):
18
Stefano Garzarella (2):
23
block: Skip COR for inactive nodes
19
iothread: rename PollParamInfo to IOThreadParamInfo
24
iotests/262: Switch source/dest VM launch order
20
iothread: use IOThreadParamInfo in iothread_[set|get]_param()
25
21
26
Sergio Lopez (1):
22
iothread.c | 28 +++++++++++++++-------------
27
virtio-blk: schedule virtio_notify_config to run on main context
23
1 file changed, 15 insertions(+), 13 deletions(-)
28
29
Vladimir Sementsov-Ogievskiy (1):
30
util/ioc.c: try to reassure Coverity about qemu_iovec_init_extended
31
32
block/io.c | 41 +++++++++++++++++++++++++-------------
33
hw/block/virtio-blk.c | 16 ++++++++++++++-
34
util/iov.c | 5 +++--
35
tests/qemu-iotests/262 | 12 +++++------
36
tests/qemu-iotests/262.out | 6 +++---
37
5 files changed, 54 insertions(+), 26 deletions(-)
38
24
39
--
25
--
40
2.21.0
26
2.31.1
41
27
42
28
29
diff view generated by jsdifflib
Deleted patch
1
From: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>
2
1
3
Make it more obvious, that filling qiov corresponds to qiov allocation,
4
which in turn corresponds to total_niov calculation, based on mid_niov
5
(not mid_len). Still add an assertion to show that there should be no
6
difference.
7
8
[Added mingw "error: 'mid_iov' may be used uninitialized in this
9
function" compiler error fix suggested by Vladimir.
10
--Stefan]
11
12
Reported-by: Coverity (CID 1405302)
13
Signed-off-by: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>
14
Message-id: 20190910090310.14032-1-vsementsov@virtuozzo.com
15
Suggested-by: Peter Maydell <peter.maydell@linaro.org>
16
Signed-off-by: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>
17
Message-Id: <20190910090310.14032-1-vsementsov@virtuozzo.com>
18
Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
19
20
fixup! util/ioc.c: try to reassure Coverity about qemu_iovec_init_extended
21
---
22
util/iov.c | 5 +++--
23
1 file changed, 3 insertions(+), 2 deletions(-)
24
25
diff --git a/util/iov.c b/util/iov.c
26
index XXXXXXX..XXXXXXX 100644
27
--- a/util/iov.c
28
+++ b/util/iov.c
29
@@ -XXX,XX +XXX,XX @@ void qemu_iovec_init_extended(
30
{
31
size_t mid_head, mid_tail;
32
int total_niov, mid_niov = 0;
33
- struct iovec *p, *mid_iov;
34
+ struct iovec *p, *mid_iov = NULL;
35
36
if (mid_len) {
37
mid_iov = qiov_slice(mid_qiov, mid_offset, mid_len,
38
@@ -XXX,XX +XXX,XX @@ void qemu_iovec_init_extended(
39
p++;
40
}
41
42
- if (mid_len) {
43
+ assert(!mid_niov == !mid_len);
44
+ if (mid_niov) {
45
memcpy(p, mid_iov, mid_niov * sizeof(*p));
46
p[0].iov_base = (uint8_t *)p[0].iov_base + mid_head;
47
p[0].iov_len -= mid_head;
48
--
49
2.21.0
50
51
diff view generated by jsdifflib
1
From: Max Reitz <mreitz@redhat.com>
1
From: Stefano Garzarella <sgarzare@redhat.com>
2
2
3
Launching the destination VM before the source VM gives us a regression
3
Commit 1793ad0247 ("iothread: add aio-max-batch parameter") added
4
test for HEAD^:
4
a new parameter (aio-max-batch) to IOThread and used PollParamInfo
5
structure to handle it.
5
6
6
The guest device causes a read from the disk image through
7
Since it is not a parameter of the polling mechanism, we rename the
7
guess_disk_lchs(). This will not work if the first sector (containing
8
structure to a more generic IOThreadParamInfo.
8
the partition table) is yet unallocated, we use COR, and the node is
9
inactive.
10
9
11
By launching the source VM before the destination, however, the COR
10
Suggested-by: Kevin Wolf <kwolf@redhat.com>
12
filter on the source will allocate that area in the image shared between
11
Signed-off-by: Stefano Garzarella <sgarzare@redhat.com>
13
both VMs, thus the problem will not become apparent.
12
Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com>
14
13
Message-id: 20210727145936.147032-2-sgarzare@redhat.com
15
Switching the launch order causes the sector to still be unallocated
16
when guess_disk_lchs() runs on the inactive node in the destination VM,
17
and thus we get our test case.
18
19
Signed-off-by: Max Reitz <mreitz@redhat.com>
20
Reviewed-by: Eric Blake <eblake@redhat.com>
21
Message-id: 20191001174827.11081-3-mreitz@redhat.com
22
Message-Id: <20191001174827.11081-3-mreitz@redhat.com>
23
Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
14
Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
24
---
15
---
25
tests/qemu-iotests/262 | 12 ++++++------
16
iothread.c | 14 +++++++-------
26
tests/qemu-iotests/262.out | 6 +++---
17
1 file changed, 7 insertions(+), 7 deletions(-)
27
2 files changed, 9 insertions(+), 9 deletions(-)
28
18
29
diff --git a/tests/qemu-iotests/262 b/tests/qemu-iotests/262
19
diff --git a/iothread.c b/iothread.c
30
index XXXXXXX..XXXXXXX 100755
31
--- a/tests/qemu-iotests/262
32
+++ b/tests/qemu-iotests/262
33
@@ -XXX,XX +XXX,XX @@ with iotests.FilePath('img') as img_path, \
34
35
os.mkfifo(fifo)
36
37
- iotests.log('Launching source VM...')
38
- add_opts(vm_a)
39
- vm_a.launch()
40
-
41
- vm_a.enable_migration_events('A')
42
-
43
iotests.log('Launching destination VM...')
44
add_opts(vm_b)
45
vm_b.add_incoming("exec: cat '%s'" % (fifo))
46
@@ -XXX,XX +XXX,XX @@ with iotests.FilePath('img') as img_path, \
47
48
vm_b.enable_migration_events('B')
49
50
+ iotests.log('Launching source VM...')
51
+ add_opts(vm_a)
52
+ vm_a.launch()
53
+
54
+ vm_a.enable_migration_events('A')
55
+
56
iotests.log('Starting migration to B...')
57
iotests.log(vm_a.qmp('migrate', uri='exec:cat >%s' % (fifo)))
58
with iotests.Timeout(3, 'Migration does not complete'):
59
diff --git a/tests/qemu-iotests/262.out b/tests/qemu-iotests/262.out
60
index XXXXXXX..XXXXXXX 100644
20
index XXXXXXX..XXXXXXX 100644
61
--- a/tests/qemu-iotests/262.out
21
--- a/iothread.c
62
+++ b/tests/qemu-iotests/262.out
22
+++ b/iothread.c
63
@@ -XXX,XX +XXX,XX @@
23
@@ -XXX,XX +XXX,XX @@ static void iothread_complete(UserCreatable *obj, Error **errp)
64
-Launching source VM...
24
typedef struct {
65
-Enabling migration QMP events on A...
25
const char *name;
66
-{"return": {}}
26
ptrdiff_t offset; /* field's byte offset in IOThread struct */
67
Launching destination VM...
27
-} PollParamInfo;
68
Enabling migration QMP events on B...
28
+} IOThreadParamInfo;
69
{"return": {}}
29
70
+Launching source VM...
30
-static PollParamInfo poll_max_ns_info = {
71
+Enabling migration QMP events on A...
31
+static IOThreadParamInfo poll_max_ns_info = {
72
+{"return": {}}
32
"poll-max-ns", offsetof(IOThread, poll_max_ns),
73
Starting migration to B...
33
};
74
{"return": {}}
34
-static PollParamInfo poll_grow_info = {
75
{"data": {"status": "setup"}, "event": "MIGRATION", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
35
+static IOThreadParamInfo poll_grow_info = {
36
"poll-grow", offsetof(IOThread, poll_grow),
37
};
38
-static PollParamInfo poll_shrink_info = {
39
+static IOThreadParamInfo poll_shrink_info = {
40
"poll-shrink", offsetof(IOThread, poll_shrink),
41
};
42
-static PollParamInfo aio_max_batch_info = {
43
+static IOThreadParamInfo aio_max_batch_info = {
44
"aio-max-batch", offsetof(IOThread, aio_max_batch),
45
};
46
47
@@ -XXX,XX +XXX,XX @@ static void iothread_get_param(Object *obj, Visitor *v,
48
const char *name, void *opaque, Error **errp)
49
{
50
IOThread *iothread = IOTHREAD(obj);
51
- PollParamInfo *info = opaque;
52
+ IOThreadParamInfo *info = opaque;
53
int64_t *field = (void *)iothread + info->offset;
54
55
visit_type_int64(v, name, field, errp);
56
@@ -XXX,XX +XXX,XX @@ static bool iothread_set_param(Object *obj, Visitor *v,
57
const char *name, void *opaque, Error **errp)
58
{
59
IOThread *iothread = IOTHREAD(obj);
60
- PollParamInfo *info = opaque;
61
+ IOThreadParamInfo *info = opaque;
62
int64_t *field = (void *)iothread + info->offset;
63
int64_t value;
64
76
--
65
--
77
2.21.0
66
2.31.1
78
67
79
68
diff view generated by jsdifflib
1
From: Sergio Lopez <slp@redhat.com>
1
From: Stefano Garzarella <sgarzare@redhat.com>
2
2
3
virtio_notify_config() needs to acquire the global mutex, which isn't
3
Commit 0445409d74 ("iothread: generalize
4
allowed from an iothread, and may lead to a deadlock like this:
4
iothread_set_param/iothread_get_param") moved common code to set and
5
get IOThread parameters in two new functions.
5
6
6
- main thead
7
These functions are called inside callbacks, so we don't need to use an
7
* Has acquired: qemu_global_mutex.
8
opaque pointer. Let's replace `void *opaque` parameter with
8
* Is trying the acquire: iothread AioContext lock via
9
`IOThreadParamInfo *info`.
9
AIO_WAIT_WHILE (after aio_poll).
10
10
11
- iothread
11
Suggested-by: Kevin Wolf <kwolf@redhat.com>
12
* Has acquired: AioContext lock.
12
Signed-off-by: Stefano Garzarella <sgarzare@redhat.com>
13
* Is trying to acquire: qemu_global_mutex (via
13
Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com>
14
virtio_notify_config->prepare_mmio_access).
14
Message-id: 20210727145936.147032-3-sgarzare@redhat.com
15
16
If virtio_blk_resize() is called from an iothread, schedule
17
virtio_notify_config() to be run in the main context BH.
18
19
[Removed unnecessary newline as suggested by Kevin Wolf
20
<kwolf@redhat.com>.
21
--Stefan]
22
23
Signed-off-by: Sergio Lopez <slp@redhat.com>
24
Reviewed-by: Kevin Wolf <kwolf@redhat.com>
25
Message-id: 20190916112411.21636-1-slp@redhat.com
26
Message-Id: <20190916112411.21636-1-slp@redhat.com>
27
Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
15
Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
28
---
16
---
29
hw/block/virtio-blk.c | 16 +++++++++++++++-
17
iothread.c | 18 ++++++++++--------
30
1 file changed, 15 insertions(+), 1 deletion(-)
18
1 file changed, 10 insertions(+), 8 deletions(-)
31
19
32
diff --git a/hw/block/virtio-blk.c b/hw/block/virtio-blk.c
20
diff --git a/iothread.c b/iothread.c
33
index XXXXXXX..XXXXXXX 100644
21
index XXXXXXX..XXXXXXX 100644
34
--- a/hw/block/virtio-blk.c
22
--- a/iothread.c
35
+++ b/hw/block/virtio-blk.c
23
+++ b/iothread.c
36
@@ -XXX,XX +XXX,XX @@
24
@@ -XXX,XX +XXX,XX @@ static IOThreadParamInfo aio_max_batch_info = {
37
#include "qemu/iov.h"
25
};
38
#include "qemu/module.h"
26
39
#include "qemu/error-report.h"
27
static void iothread_get_param(Object *obj, Visitor *v,
40
+#include "qemu/main-loop.h"
28
- const char *name, void *opaque, Error **errp)
41
#include "trace.h"
29
+ const char *name, IOThreadParamInfo *info, Error **errp)
42
#include "hw/block/block.h"
30
{
43
#include "hw/qdev-properties.h"
31
IOThread *iothread = IOTHREAD(obj);
44
@@ -XXX,XX +XXX,XX @@ static int virtio_blk_load_device(VirtIODevice *vdev, QEMUFile *f,
32
- IOThreadParamInfo *info = opaque;
45
return 0;
33
int64_t *field = (void *)iothread + info->offset;
34
35
visit_type_int64(v, name, field, errp);
46
}
36
}
47
37
48
+static void virtio_resize_cb(void *opaque)
38
static bool iothread_set_param(Object *obj, Visitor *v,
49
+{
39
- const char *name, void *opaque, Error **errp)
50
+ VirtIODevice *vdev = opaque;
40
+ const char *name, IOThreadParamInfo *info, Error **errp)
51
+
52
+ assert(qemu_get_current_aio_context() == qemu_get_aio_context());
53
+ virtio_notify_config(vdev);
54
+}
55
+
56
static void virtio_blk_resize(void *opaque)
57
{
41
{
58
VirtIODevice *vdev = VIRTIO_DEVICE(opaque);
42
IOThread *iothread = IOTHREAD(obj);
59
43
- IOThreadParamInfo *info = opaque;
60
- virtio_notify_config(vdev);
44
int64_t *field = (void *)iothread + info->offset;
61
+ /*
45
int64_t value;
62
+ * virtio_notify_config() needs to acquire the global mutex,
46
63
+ * so it can't be called from an iothread. Instead, schedule
47
@@ -XXX,XX +XXX,XX @@ static bool iothread_set_param(Object *obj, Visitor *v,
64
+ * it to be run in the main context BH.
48
static void iothread_get_poll_param(Object *obj, Visitor *v,
65
+ */
49
const char *name, void *opaque, Error **errp)
66
+ aio_bh_schedule_oneshot(qemu_get_aio_context(), virtio_resize_cb, vdev);
50
{
51
+ IOThreadParamInfo *info = opaque;
52
53
- iothread_get_param(obj, v, name, opaque, errp);
54
+ iothread_get_param(obj, v, name, info, errp);
67
}
55
}
68
56
69
static const BlockDevOps virtio_block_ops = {
57
static void iothread_set_poll_param(Object *obj, Visitor *v,
58
const char *name, void *opaque, Error **errp)
59
{
60
IOThread *iothread = IOTHREAD(obj);
61
+ IOThreadParamInfo *info = opaque;
62
63
- if (!iothread_set_param(obj, v, name, opaque, errp)) {
64
+ if (!iothread_set_param(obj, v, name, info, errp)) {
65
return;
66
}
67
68
@@ -XXX,XX +XXX,XX @@ static void iothread_set_poll_param(Object *obj, Visitor *v,
69
static void iothread_get_aio_param(Object *obj, Visitor *v,
70
const char *name, void *opaque, Error **errp)
71
{
72
+ IOThreadParamInfo *info = opaque;
73
74
- iothread_get_param(obj, v, name, opaque, errp);
75
+ iothread_get_param(obj, v, name, info, errp);
76
}
77
78
static void iothread_set_aio_param(Object *obj, Visitor *v,
79
const char *name, void *opaque, Error **errp)
80
{
81
IOThread *iothread = IOTHREAD(obj);
82
+ IOThreadParamInfo *info = opaque;
83
84
- if (!iothread_set_param(obj, v, name, opaque, errp)) {
85
+ if (!iothread_set_param(obj, v, name, info, errp)) {
86
return;
87
}
88
70
--
89
--
71
2.21.0
90
2.31.1
72
91
73
92
diff view generated by jsdifflib
Deleted patch
1
From: Max Reitz <mreitz@redhat.com>
2
1
3
We must not write data to inactive nodes, and a COR is certainly
4
something we can simply not do without upsetting anyone. So skip COR
5
operations on inactive nodes.
6
7
Signed-off-by: Max Reitz <mreitz@redhat.com>
8
Reviewed-by: Eric Blake <eblake@redhat.com>
9
Message-id: 20191001174827.11081-2-mreitz@redhat.com
10
Message-Id: <20191001174827.11081-2-mreitz@redhat.com>
11
Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
12
---
13
block/io.c | 41 +++++++++++++++++++++++++++--------------
14
1 file changed, 27 insertions(+), 14 deletions(-)
15
16
diff --git a/block/io.c b/block/io.c
17
index XXXXXXX..XXXXXXX 100644
18
--- a/block/io.c
19
+++ b/block/io.c
20
@@ -XXX,XX +XXX,XX @@ static int coroutine_fn bdrv_co_do_copy_on_readv(BdrvChild *child,
21
int max_transfer = MIN_NON_ZERO(bs->bl.max_transfer,
22
BDRV_REQUEST_MAX_BYTES);
23
unsigned int progress = 0;
24
+ bool skip_write;
25
26
if (!drv) {
27
return -ENOMEDIUM;
28
}
29
30
+ /*
31
+ * Do not write anything when the BDS is inactive. That is not
32
+ * allowed, and it would not help.
33
+ */
34
+ skip_write = (bs->open_flags & BDRV_O_INACTIVE);
35
+
36
/* FIXME We cannot require callers to have write permissions when all they
37
* are doing is a read request. If we did things right, write permissions
38
* would be obtained anyway, but internally by the copy-on-read code. As
39
@@ -XXX,XX +XXX,XX @@ static int coroutine_fn bdrv_co_do_copy_on_readv(BdrvChild *child,
40
while (cluster_bytes) {
41
int64_t pnum;
42
43
- ret = bdrv_is_allocated(bs, cluster_offset,
44
- MIN(cluster_bytes, max_transfer), &pnum);
45
- if (ret < 0) {
46
- /* Safe to treat errors in querying allocation as if
47
- * unallocated; we'll probably fail again soon on the
48
- * read, but at least that will set a decent errno.
49
- */
50
+ if (skip_write) {
51
+ ret = 1; /* "already allocated", so nothing will be copied */
52
pnum = MIN(cluster_bytes, max_transfer);
53
- }
54
+ } else {
55
+ ret = bdrv_is_allocated(bs, cluster_offset,
56
+ MIN(cluster_bytes, max_transfer), &pnum);
57
+ if (ret < 0) {
58
+ /*
59
+ * Safe to treat errors in querying allocation as if
60
+ * unallocated; we'll probably fail again soon on the
61
+ * read, but at least that will set a decent errno.
62
+ */
63
+ pnum = MIN(cluster_bytes, max_transfer);
64
+ }
65
66
- /* Stop at EOF if the image ends in the middle of the cluster */
67
- if (ret == 0 && pnum == 0) {
68
- assert(progress >= bytes);
69
- break;
70
- }
71
+ /* Stop at EOF if the image ends in the middle of the cluster */
72
+ if (ret == 0 && pnum == 0) {
73
+ assert(progress >= bytes);
74
+ break;
75
+ }
76
77
- assert(skip_bytes < pnum);
78
+ assert(skip_bytes < pnum);
79
+ }
80
81
if (ret <= 0) {
82
QEMUIOVector local_qiov;
83
--
84
2.21.0
85
86
diff view generated by jsdifflib