1
The following changes since commit 8cb41fda78c7ebde0dd248c6afe1d336efb0de50:
1
The following changes since commit 887cba855bb6ff4775256f7968409281350b568c:
2
2
3
Merge remote-tracking branch 'remotes/philmd/tags/machine-20211101' into staging (2021-11-02 05:53:45 -0400)
3
configure: Fix cross-building for RISCV host (v5) (2023-07-11 17:56:09 +0100)
4
4
5
are available in the Git repository at:
5
are available in the Git repository at:
6
6
7
https://github.com/XanClic/qemu.git tags/pull-block-2021-11-02
7
https://gitlab.com/stefanha/qemu.git tags/block-pull-request
8
8
9
for you to fetch changes up to 7da9623cc078229caf07c290e16401ccdb9408d2:
9
for you to fetch changes up to 75dcb4d790bbe5327169fd72b185960ca58e2fa6:
10
10
11
block/vpc: Add a sanity check that fixed-size images have the right type (2021-11-02 12:47:51 +0100)
11
virtio-blk: fix host notifier issues during dataplane start/stop (2023-07-12 15:20:32 -0400)
12
12
13
----------------------------------------------------------------
13
----------------------------------------------------------------
14
Emanuele Giuseppe Esposito (1):
14
Pull request
15
pylint: fix errors and warnings generated by tests/qemu-iotests/297
16
15
17
Eric Blake (1):
16
----------------------------------------------------------------
18
qemu-img: Consistent docs for convert -F
19
17
20
Thomas Huth (1):
18
Stefan Hajnoczi (1):
21
block/vpc: Add a sanity check that fixed-size images have the right
19
virtio-blk: fix host notifier issues during dataplane start/stop
22
type
23
20
24
Thomas Weißschuh (1):
21
hw/block/dataplane/virtio-blk.c | 67 +++++++++++++++++++--------------
25
vmdk: allow specification of tools version
22
1 file changed, 38 insertions(+), 29 deletions(-)
26
27
docs/tools/qemu-img.rst | 2 +-
28
qapi/block-core.json | 3 +++
29
block/vmdk.c | 24 ++++++++++++++++++++----
30
block/vpc.c | 3 ++-
31
qemu-img-cmds.hx | 2 +-
32
tests/qemu-iotests/129 | 18 +++++++++---------
33
tests/qemu-iotests/310 | 16 ++++++++--------
34
tests/qemu-iotests/check | 11 ++++++-----
35
tests/qemu-iotests/iotests.py | 7 ++++---
36
tests/qemu-iotests/tests/image-fleecing | 4 ++--
37
10 files changed, 56 insertions(+), 34 deletions(-)
38
23
39
--
24
--
40
2.31.1
25
2.40.1
41
42
diff view generated by jsdifflib
Deleted patch
1
From: Eric Blake <eblake@redhat.com>
2
1
3
Use consistent capitalization, and fix a missed line (we duplicate the
4
qemu-img synopses in too many places).
5
6
Fixes: 1899bf4737 (qemu-img: Add -F shorthand to convert)
7
Signed-off-by: Eric Blake <eblake@redhat.com>
8
Message-Id: <20210921142812.2631605-1-eblake@redhat.com>
9
Reviewed-by: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>
10
Signed-off-by: Hanna Reitz <hreitz@redhat.com>
11
---
12
docs/tools/qemu-img.rst | 2 +-
13
qemu-img-cmds.hx | 2 +-
14
2 files changed, 2 insertions(+), 2 deletions(-)
15
16
diff --git a/docs/tools/qemu-img.rst b/docs/tools/qemu-img.rst
17
index XXXXXXX..XXXXXXX 100644
18
--- a/docs/tools/qemu-img.rst
19
+++ b/docs/tools/qemu-img.rst
20
@@ -XXX,XX +XXX,XX @@ Command description:
21
4
22
Error on reading data
23
24
-.. option:: convert [--object OBJECTDEF] [--image-opts] [--target-image-opts] [--target-is-zero] [--bitmaps [--skip-broken-bitmaps]] [-U] [-C] [-c] [-p] [-q] [-n] [-f FMT] [-t CACHE] [-T SRC_CACHE] [-O OUTPUT_FMT] [-B BACKING_FILE [-F backing_fmt]] [-o OPTIONS] [-l SNAPSHOT_PARAM] [-S SPARSE_SIZE] [-r RATE_LIMIT] [-m NUM_COROUTINES] [-W] FILENAME [FILENAME2 [...]] OUTPUT_FILENAME
25
+.. option:: convert [--object OBJECTDEF] [--image-opts] [--target-image-opts] [--target-is-zero] [--bitmaps [--skip-broken-bitmaps]] [-U] [-C] [-c] [-p] [-q] [-n] [-f FMT] [-t CACHE] [-T SRC_CACHE] [-O OUTPUT_FMT] [-B BACKING_FILE [-F BACKING_FMT]] [-o OPTIONS] [-l SNAPSHOT_PARAM] [-S SPARSE_SIZE] [-r RATE_LIMIT] [-m NUM_COROUTINES] [-W] FILENAME [FILENAME2 [...]] OUTPUT_FILENAME
26
27
Convert the disk image *FILENAME* or a snapshot *SNAPSHOT_PARAM*
28
to disk image *OUTPUT_FILENAME* using format *OUTPUT_FMT*. It can
29
diff --git a/qemu-img-cmds.hx b/qemu-img-cmds.hx
30
index XXXXXXX..XXXXXXX 100644
31
--- a/qemu-img-cmds.hx
32
+++ b/qemu-img-cmds.hx
33
@@ -XXX,XX +XXX,XX @@ ERST
34
DEF("convert", img_convert,
35
"convert [--object objectdef] [--image-opts] [--target-image-opts] [--target-is-zero] [--bitmaps] [-U] [-C] [-c] [-p] [-q] [-n] [-f fmt] [-t cache] [-T src_cache] [-O output_fmt] [-B backing_file [-F backing_fmt]] [-o options] [-l snapshot_param] [-S sparse_size] [-r rate_limit] [-m num_coroutines] [-W] [--salvage] filename [filename2 [...]] output_filename")
36
SRST
37
-.. option:: convert [--object OBJECTDEF] [--image-opts] [--target-image-opts] [--target-is-zero] [--bitmaps] [-U] [-C] [-c] [-p] [-q] [-n] [-f FMT] [-t CACHE] [-T SRC_CACHE] [-O OUTPUT_FMT] [-B BACKING_FILE] [-o OPTIONS] [-l SNAPSHOT_PARAM] [-S SPARSE_SIZE] [-r RATE_LIMIT] [-m NUM_COROUTINES] [-W] [--salvage] FILENAME [FILENAME2 [...]] OUTPUT_FILENAME
38
+.. option:: convert [--object OBJECTDEF] [--image-opts] [--target-image-opts] [--target-is-zero] [--bitmaps] [-U] [-C] [-c] [-p] [-q] [-n] [-f FMT] [-t CACHE] [-T SRC_CACHE] [-O OUTPUT_FMT] [-B BACKING_FILE [-F BACKING_FMT]] [-o OPTIONS] [-l SNAPSHOT_PARAM] [-S SPARSE_SIZE] [-r RATE_LIMIT] [-m NUM_COROUTINES] [-W] [--salvage] FILENAME [FILENAME2 [...]] OUTPUT_FILENAME
39
ERST
40
41
DEF("create", img_create,
42
--
43
2.31.1
44
45
diff view generated by jsdifflib
Deleted patch
1
From: Emanuele Giuseppe Esposito <eesposit@redhat.com>
2
1
3
Test 297 in tests/qemu-iotests currently fails: pylint has
4
learned new things to check, or we simply missed them.
5
6
All fixes in this patch are related to additional spaces used
7
or wrong indentation. No functional change intended.
8
9
Signed-off-by: Emanuele Giuseppe Esposito <eesposit@redhat.com>
10
Message-Id: <20211008062821.1010967-2-eesposit@redhat.com>
11
Signed-off-by: Hanna Reitz <hreitz@redhat.com>
12
---
13
tests/qemu-iotests/129 | 18 +++++++++---------
14
tests/qemu-iotests/310 | 16 ++++++++--------
15
tests/qemu-iotests/check | 11 ++++++-----
16
tests/qemu-iotests/iotests.py | 7 ++++---
17
tests/qemu-iotests/tests/image-fleecing | 4 ++--
18
5 files changed, 29 insertions(+), 27 deletions(-)
19
20
diff --git a/tests/qemu-iotests/129 b/tests/qemu-iotests/129
21
index XXXXXXX..XXXXXXX 100755
22
--- a/tests/qemu-iotests/129
23
+++ b/tests/qemu-iotests/129
24
@@ -XXX,XX +XXX,XX @@ class TestStopWithBlockJob(iotests.QMPTestCase):
25
self.do_test_stop("drive-backup", device="drive0",
26
target=self.target_img, format=iotests.imgfmt,
27
sync="full",
28
- x_perf={ 'max-chunk': 65536,
29
- 'max-workers': 8 })
30
+ x_perf={'max-chunk': 65536,
31
+ 'max-workers': 8})
32
33
def test_block_commit(self):
34
# Add overlay above the source node so that we actually use a
35
@@ -XXX,XX +XXX,XX @@ class TestStopWithBlockJob(iotests.QMPTestCase):
36
'1G')
37
38
result = self.vm.qmp('blockdev-add', **{
39
- 'node-name': 'overlay',
40
- 'driver': iotests.imgfmt,
41
- 'file': {
42
- 'driver': 'file',
43
- 'filename': self.overlay_img
44
- }
45
- })
46
+ 'node-name': 'overlay',
47
+ 'driver': iotests.imgfmt,
48
+ 'file': {
49
+ 'driver': 'file',
50
+ 'filename': self.overlay_img
51
+ }
52
+ })
53
self.assert_qmp(result, 'return', {})
54
55
result = self.vm.qmp('blockdev-snapshot',
56
diff --git a/tests/qemu-iotests/310 b/tests/qemu-iotests/310
57
index XXXXXXX..XXXXXXX 100755
58
--- a/tests/qemu-iotests/310
59
+++ b/tests/qemu-iotests/310
60
@@ -XXX,XX +XXX,XX @@ with iotests.FilePath('base.img') as base_img_path, \
61
assert qemu_io_silent(base_img_path, '-c', 'write -P 1 3M 1M') == 0
62
assert qemu_img('create', '-f', iotests.imgfmt, '-b', base_img_path,
63
'-F', iotests.imgfmt, mid_img_path) == 0
64
- assert qemu_io_silent(mid_img_path, '-c', 'write -P 3 2M 1M') == 0
65
- assert qemu_io_silent(mid_img_path, '-c', 'write -P 3 4M 1M') == 0
66
+ assert qemu_io_silent(mid_img_path, '-c', 'write -P 3 2M 1M') == 0
67
+ assert qemu_io_silent(mid_img_path, '-c', 'write -P 3 4M 1M') == 0
68
assert qemu_img('create', '-f', iotests.imgfmt, '-b', mid_img_path,
69
'-F', iotests.imgfmt, top_img_path) == 0
70
- assert qemu_io_silent(top_img_path, '-c', 'write -P 2 1M 1M') == 0
71
+ assert qemu_io_silent(top_img_path, '-c', 'write -P 2 1M 1M') == 0
72
73
# 0 1 2 3 4
74
# top 2
75
@@ -XXX,XX +XXX,XX @@ with iotests.FilePath('base.img') as base_img_path, \
76
assert qemu_img('rebase', '-u', '-b', '', '-f', iotests.imgfmt,
77
top_img_path) == 0
78
79
- assert qemu_io_silent(top_img_path, '-c', 'read -P 0 0 1M') == 0
80
- assert qemu_io_silent(top_img_path, '-c', 'read -P 2 1M 1M') == 0
81
- assert qemu_io_silent(top_img_path, '-c', 'read -P 3 2M 1M') == 0
82
- assert qemu_io_silent(top_img_path, '-c', 'read -P 0 3M 1M') == 0
83
- assert qemu_io_silent(top_img_path, '-c', 'read -P 3 4M 1M') == 0
84
+ assert qemu_io_silent(top_img_path, '-c', 'read -P 0 0 1M') == 0
85
+ assert qemu_io_silent(top_img_path, '-c', 'read -P 2 1M 1M') == 0
86
+ assert qemu_io_silent(top_img_path, '-c', 'read -P 3 2M 1M') == 0
87
+ assert qemu_io_silent(top_img_path, '-c', 'read -P 0 3M 1M') == 0
88
+ assert qemu_io_silent(top_img_path, '-c', 'read -P 3 4M 1M') == 0
89
90
log('Done')
91
diff --git a/tests/qemu-iotests/check b/tests/qemu-iotests/check
92
index XXXXXXX..XXXXXXX 100755
93
--- a/tests/qemu-iotests/check
94
+++ b/tests/qemu-iotests/check
95
@@ -XXX,XX +XXX,XX @@ def make_argparser() -> argparse.ArgumentParser:
96
97
p.add_argument('-d', dest='debug', action='store_true', help='debug')
98
p.add_argument('-p', dest='print', action='store_true',
99
- help='redirects qemu\'s stdout and stderr to the test output')
100
+ help='redirects qemu\'s stdout and stderr to '
101
+ 'the test output')
102
p.add_argument('-gdb', action='store_true',
103
- help="start gdbserver with $GDB_OPTIONS options \
104
- ('localhost:12345' if $GDB_OPTIONS is empty)")
105
+ help="start gdbserver with $GDB_OPTIONS options "
106
+ "('localhost:12345' if $GDB_OPTIONS is empty)")
107
p.add_argument('-valgrind', action='store_true',
108
- help='use valgrind, sets VALGRIND_QEMU environment '
109
- 'variable')
110
+ help='use valgrind, sets VALGRIND_QEMU environment '
111
+ 'variable')
112
113
p.add_argument('-misalign', action='store_true',
114
help='misalign memory allocations')
115
diff --git a/tests/qemu-iotests/iotests.py b/tests/qemu-iotests/iotests.py
116
index XXXXXXX..XXXXXXX 100644
117
--- a/tests/qemu-iotests/iotests.py
118
+++ b/tests/qemu-iotests/iotests.py
119
@@ -XXX,XX +XXX,XX @@ def _post_shutdown(self) -> None:
120
super()._post_shutdown()
121
if not qemu_valgrind or not self._popen:
122
return
123
- valgrind_filename = f"{test_dir}/{self._popen.pid}.valgrind"
124
+ valgrind_filename = f"{test_dir}/{self._popen.pid}.valgrind"
125
if self.exitcode() == 99:
126
with open(valgrind_filename, encoding='utf-8') as f:
127
print(f.read())
128
@@ -XXX,XX +XXX,XX @@ def write(self, arg=None):
129
130
class ReproducibleTestRunner(unittest.TextTestRunner):
131
def __init__(self, stream: Optional[TextIO] = None,
132
- resultclass: Type[unittest.TestResult] = ReproducibleTestResult,
133
- **kwargs: Any) -> None:
134
+ resultclass: Type[unittest.TestResult] =
135
+ ReproducibleTestResult,
136
+ **kwargs: Any) -> None:
137
rstream = ReproducibleStreamWrapper(stream or sys.stdout)
138
super().__init__(stream=rstream, # type: ignore
139
descriptions=True,
140
diff --git a/tests/qemu-iotests/tests/image-fleecing b/tests/qemu-iotests/tests/image-fleecing
141
index XXXXXXX..XXXXXXX 100755
142
--- a/tests/qemu-iotests/tests/image-fleecing
143
+++ b/tests/qemu-iotests/tests/image-fleecing
144
@@ -XXX,XX +XXX,XX @@ def do_test(use_cbw, base_img_path, fleece_img_path, nbd_sock_path, vm):
145
146
nbd_uri = 'nbd+unix:///%s?socket=%s' % (tmp_node, nbd_sock_path)
147
log(vm.qmp('nbd-server-start',
148
- {'addr': { 'type': 'unix',
149
- 'data': { 'path': nbd_sock_path } } }))
150
+ {'addr': {'type': 'unix',
151
+ 'data': {'path': nbd_sock_path}}}))
152
153
log(vm.qmp('nbd-server-add', device=tmp_node))
154
155
--
156
2.31.1
157
158
diff view generated by jsdifflib
Deleted patch
1
From: Thomas Weißschuh <thomas.weissschuh.ext@zeiss.com>
2
1
3
VMDK files support an attribute that represents the version of the guest
4
tools that are installed on the disk.
5
This attribute is used by vSphere before a machine has been started to
6
determine if the VM has the guest tools installed.
7
This is important when configuring "Operating system customizations" in
8
vSphere, as it checks for the presence of the guest tools before
9
allowing those customizations.
10
Thus when the VM has not yet booted normally it would be impossible to
11
customize it, therefore preventing a customized first-boot.
12
13
The attribute should not hurt on disks that do not have the guest tools
14
installed and indeed the VMware tools also unconditionally add this
15
attribute.
16
(Defaulting to the value "2147483647", as is done in this patch)
17
18
Signed-off-by: Thomas Weißschuh <thomas.weissschuh.ext@zeiss.com>
19
Message-Id: <20210913130419.13241-1-thomas.weissschuh.ext@zeiss.com>
20
[hreitz: Added missing '#' in block-core.json]
21
Signed-off-by: Hanna Reitz <hreitz@redhat.com>
22
---
23
qapi/block-core.json | 3 +++
24
block/vmdk.c | 24 ++++++++++++++++++++----
25
2 files changed, 23 insertions(+), 4 deletions(-)
26
27
diff --git a/qapi/block-core.json b/qapi/block-core.json
28
index XXXXXXX..XXXXXXX 100644
29
--- a/qapi/block-core.json
30
+++ b/qapi/block-core.json
31
@@ -XXX,XX +XXX,XX @@
32
# @adapter-type: The adapter type used to fill in the descriptor. Default: ide.
33
# @hwversion: Hardware version. The meaningful options are "4" or "6".
34
# Default: "4".
35
+# @toolsversion: VMware guest tools version.
36
+# Default: "2147483647" (Since 6.2)
37
# @zeroed-grain: Whether to enable zeroed-grain feature for sparse subformats.
38
# Default: false.
39
#
40
@@ -XXX,XX +XXX,XX @@
41
'*backing-file': 'str',
42
'*adapter-type': 'BlockdevVmdkAdapterType',
43
'*hwversion': 'str',
44
+ '*toolsversion': 'str',
45
'*zeroed-grain': 'bool' } }
46
47
48
diff --git a/block/vmdk.c b/block/vmdk.c
49
index XXXXXXX..XXXXXXX 100644
50
--- a/block/vmdk.c
51
+++ b/block/vmdk.c
52
@@ -XXX,XX +XXX,XX @@
53
#define VMDK_ZEROED (-3)
54
55
#define BLOCK_OPT_ZEROED_GRAIN "zeroed_grain"
56
+#define BLOCK_OPT_TOOLSVERSION "toolsversion"
57
58
typedef struct {
59
uint32_t version;
60
@@ -XXX,XX +XXX,XX @@ static int coroutine_fn vmdk_co_do_create(int64_t size,
61
BlockdevVmdkAdapterType adapter_type,
62
const char *backing_file,
63
const char *hw_version,
64
+ const char *toolsversion,
65
bool compat6,
66
bool zeroed_grain,
67
vmdk_create_extent_fn extent_fn,
68
@@ -XXX,XX +XXX,XX @@ static int coroutine_fn vmdk_co_do_create(int64_t size,
69
"ddb.geometry.cylinders = \"%" PRId64 "\"\n"
70
"ddb.geometry.heads = \"%" PRIu32 "\"\n"
71
"ddb.geometry.sectors = \"63\"\n"
72
- "ddb.adapterType = \"%s\"\n";
73
+ "ddb.adapterType = \"%s\"\n"
74
+ "ddb.toolsVersion = \"%s\"\n";
75
76
ext_desc_lines = g_string_new(NULL);
77
78
@@ -XXX,XX +XXX,XX @@ static int coroutine_fn vmdk_co_do_create(int64_t size,
79
if (!hw_version) {
80
hw_version = "4";
81
}
82
+ if (!toolsversion) {
83
+ toolsversion = "2147483647";
84
+ }
85
86
if (adapter_type != BLOCKDEV_VMDK_ADAPTER_TYPE_IDE) {
87
/* that's the number of heads with which vmware operates when
88
@@ -XXX,XX +XXX,XX @@ static int coroutine_fn vmdk_co_do_create(int64_t size,
89
size /
90
(int64_t)(63 * number_heads * BDRV_SECTOR_SIZE),
91
number_heads,
92
- BlockdevVmdkAdapterType_str(adapter_type));
93
+ BlockdevVmdkAdapterType_str(adapter_type),
94
+ toolsversion);
95
desc_len = strlen(desc);
96
/* the descriptor offset = 0x200 */
97
if (!split && !flat) {
98
@@ -XXX,XX +XXX,XX @@ static int coroutine_fn vmdk_co_create_opts(BlockDriver *drv,
99
BlockdevVmdkAdapterType adapter_type_enum;
100
char *backing_file = NULL;
101
char *hw_version = NULL;
102
+ char *toolsversion = NULL;
103
char *fmt = NULL;
104
BlockdevVmdkSubformat subformat;
105
int ret = 0;
106
@@ -XXX,XX +XXX,XX @@ static int coroutine_fn vmdk_co_create_opts(BlockDriver *drv,
107
adapter_type = qemu_opt_get_del(opts, BLOCK_OPT_ADAPTER_TYPE);
108
backing_file = qemu_opt_get_del(opts, BLOCK_OPT_BACKING_FILE);
109
hw_version = qemu_opt_get_del(opts, BLOCK_OPT_HWVERSION);
110
+ toolsversion = qemu_opt_get_del(opts, BLOCK_OPT_TOOLSVERSION);
111
compat6 = qemu_opt_get_bool_del(opts, BLOCK_OPT_COMPAT6, false);
112
if (strcmp(hw_version, "undefined") == 0) {
113
g_free(hw_version);
114
@@ -XXX,XX +XXX,XX @@ static int coroutine_fn vmdk_co_create_opts(BlockDriver *drv,
115
.opts = opts,
116
};
117
ret = vmdk_co_do_create(total_size, subformat, adapter_type_enum,
118
- backing_file, hw_version, compat6, zeroed_grain,
119
- vmdk_co_create_opts_cb, &data, errp);
120
+ backing_file, hw_version, toolsversion, compat6,
121
+ zeroed_grain, vmdk_co_create_opts_cb, &data, errp);
122
123
exit:
124
g_free(backing_fmt);
125
g_free(adapter_type);
126
g_free(backing_file);
127
g_free(hw_version);
128
+ g_free(toolsversion);
129
g_free(fmt);
130
g_free(desc);
131
g_free(path);
132
@@ -XXX,XX +XXX,XX @@ static int coroutine_fn vmdk_co_create(BlockdevCreateOptions *create_options,
133
opts->adapter_type,
134
opts->backing_file,
135
opts->hwversion,
136
+ opts->toolsversion,
137
false,
138
opts->zeroed_grain,
139
vmdk_co_create_cb,
140
@@ -XXX,XX +XXX,XX @@ static QemuOptsList vmdk_create_opts = {
141
.help = "VMDK hardware version",
142
.def_value_str = "undefined"
143
},
144
+ {
145
+ .name = BLOCK_OPT_TOOLSVERSION,
146
+ .type = QEMU_OPT_STRING,
147
+ .help = "VMware guest tools version",
148
+ },
149
{
150
.name = BLOCK_OPT_SUBFMT,
151
.type = QEMU_OPT_STRING,
152
--
153
2.31.1
154
155
diff view generated by jsdifflib
1
From: Thomas Huth <thuth@redhat.com>
1
The main loop thread can consume 100% CPU when using --device
2
virtio-blk-pci,iothread=<iothread>. ppoll() constantly returns but
3
reading virtqueue host notifiers fails with EAGAIN. The file descriptors
4
are stale and remain registered with the AioContext because of bugs in
5
the virtio-blk dataplane start/stop code.
2
6
3
The code in vpc.c uses BDRVVPCState->footer.type in various places
7
The problem is that the dataplane start/stop code involves drain
4
to decide whether the image is a fixed-size (VHD_FIXED) or a dynamic
8
operations, which call virtio_blk_drained_begin() and
5
(VHD_DYNAMIC) image. However, we never check that this field really
9
virtio_blk_drained_end() at points where the host notifier is not
6
contains VHD_FIXED if we detected a fixed size image in vpc_open(),
10
operational:
7
so a wrong value here could cause quite some trouble during runtime.
11
- In virtio_blk_data_plane_start(), blk_set_aio_context() drains after
12
vblk->dataplane_started has been set to true but the host notifier has
13
not been attached yet.
14
- In virtio_blk_data_plane_stop(), blk_drain() and blk_set_aio_context()
15
drain after the host notifier has already been detached but with
16
vblk->dataplane_started still set to true.
8
17
9
Suggested-by: Kevin Wolf <kwolf@redhat.com>
18
I would like to simplify ->ioeventfd_start/stop() to avoid interactions
10
Signed-off-by: Thomas Huth <thuth@redhat.com>
19
with drain entirely, but couldn't find a way to do that. Instead, this
11
Message-Id: <20211012082702.792259-1-thuth@redhat.com>
20
patch accepts the fragile nature of the code and reorders it so that
12
Signed-off-by: Hanna Reitz <hreitz@redhat.com>
21
vblk->dataplane_started is false during drain operations. This way the
22
virtio_blk_drained_begin() and virtio_blk_drained_end() calls don't
23
touch the host notifier. The result is that
24
virtio_blk_data_plane_start() and virtio_blk_data_plane_stop() have
25
complete control over the host notifier and stale file descriptors are
26
no longer left in the AioContext.
27
28
This patch fixes the 100% CPU consumption in the main loop thread and
29
correctly moves host notifier processing to the IOThread.
30
31
Fixes: 1665d9326fd2 ("virtio-blk: implement BlockDevOps->drained_begin()")
32
Reported-by: Lukáš Doktor <ldoktor@redhat.com>
33
Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
34
Tested-by: Lukas Doktor <ldoktor@redhat.com>
35
Message-id: 20230704151527.193586-1-stefanha@redhat.com
36
Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
13
---
37
---
14
block/vpc.c | 3 ++-
38
hw/block/dataplane/virtio-blk.c | 67 +++++++++++++++++++--------------
15
1 file changed, 2 insertions(+), 1 deletion(-)
39
1 file changed, 38 insertions(+), 29 deletions(-)
16
40
17
diff --git a/block/vpc.c b/block/vpc.c
41
diff --git a/hw/block/dataplane/virtio-blk.c b/hw/block/dataplane/virtio-blk.c
18
index XXXXXXX..XXXXXXX 100644
42
index XXXXXXX..XXXXXXX 100644
19
--- a/block/vpc.c
43
--- a/hw/block/dataplane/virtio-blk.c
20
+++ b/block/vpc.c
44
+++ b/hw/block/dataplane/virtio-blk.c
21
@@ -XXX,XX +XXX,XX @@ static int vpc_open(BlockDriverState *bs, QDict *options, int flags,
45
@@ -XXX,XX +XXX,XX @@ int virtio_blk_data_plane_start(VirtIODevice *vdev)
22
if (ret < 0) {
46
23
goto fail;
47
memory_region_transaction_commit();
24
}
48
25
- if (strncmp(footer->creator, "conectix", 8)) {
49
- /*
26
+ if (strncmp(footer->creator, "conectix", 8) ||
50
- * These fields are visible to the IOThread so we rely on implicit barriers
27
+ be32_to_cpu(footer->type) != VHD_FIXED) {
51
- * in aio_context_acquire() on the write side and aio_notify_accept() on
28
error_setg(errp, "invalid VPC image");
52
- * the read side.
29
ret = -EINVAL;
53
- */
30
goto fail;
54
- s->starting = false;
55
- vblk->dataplane_started = true;
56
trace_virtio_blk_data_plane_start(s);
57
58
old_context = blk_get_aio_context(s->conf->conf.blk);
59
@@ -XXX,XX +XXX,XX @@ int virtio_blk_data_plane_start(VirtIODevice *vdev)
60
event_notifier_set(virtio_queue_get_host_notifier(vq));
61
}
62
63
+ /*
64
+ * These fields must be visible to the IOThread when it processes the
65
+ * virtqueue, otherwise it will think dataplane has not started yet.
66
+ *
67
+ * Make sure ->dataplane_started is false when blk_set_aio_context() is
68
+ * called above so that draining does not cause the host notifier to be
69
+ * detached/attached prematurely.
70
+ */
71
+ s->starting = false;
72
+ vblk->dataplane_started = true;
73
+ smp_wmb(); /* paired with aio_notify_accept() on the read side */
74
+
75
/* Get this show started by hooking up our callbacks */
76
if (!blk_in_drain(s->conf->conf.blk)) {
77
aio_context_acquire(s->ctx);
78
@@ -XXX,XX +XXX,XX @@ int virtio_blk_data_plane_start(VirtIODevice *vdev)
79
fail_guest_notifiers:
80
vblk->dataplane_disabled = true;
81
s->starting = false;
82
- vblk->dataplane_started = true;
83
return -ENOSYS;
84
}
85
86
@@ -XXX,XX +XXX,XX @@ void virtio_blk_data_plane_stop(VirtIODevice *vdev)
87
aio_wait_bh_oneshot(s->ctx, virtio_blk_data_plane_stop_bh, s);
88
}
89
90
+ /*
91
+ * Batch all the host notifiers in a single transaction to avoid
92
+ * quadratic time complexity in address_space_update_ioeventfds().
93
+ */
94
+ memory_region_transaction_begin();
95
+
96
+ for (i = 0; i < nvqs; i++) {
97
+ virtio_bus_set_host_notifier(VIRTIO_BUS(qbus), i, false);
98
+ }
99
+
100
+ /*
101
+ * The transaction expects the ioeventfds to be open when it
102
+ * commits. Do it now, before the cleanup loop.
103
+ */
104
+ memory_region_transaction_commit();
105
+
106
+ for (i = 0; i < nvqs; i++) {
107
+ virtio_bus_cleanup_host_notifier(VIRTIO_BUS(qbus), i);
108
+ }
109
+
110
+ /*
111
+ * Set ->dataplane_started to false before draining so that host notifiers
112
+ * are not detached/attached anymore.
113
+ */
114
+ vblk->dataplane_started = false;
115
+
116
aio_context_acquire(s->ctx);
117
118
/* Wait for virtio_blk_dma_restart_bh() and in flight I/O to complete */
119
@@ -XXX,XX +XXX,XX @@ void virtio_blk_data_plane_stop(VirtIODevice *vdev)
120
121
aio_context_release(s->ctx);
122
123
- /*
124
- * Batch all the host notifiers in a single transaction to avoid
125
- * quadratic time complexity in address_space_update_ioeventfds().
126
- */
127
- memory_region_transaction_begin();
128
-
129
- for (i = 0; i < nvqs; i++) {
130
- virtio_bus_set_host_notifier(VIRTIO_BUS(qbus), i, false);
131
- }
132
-
133
- /*
134
- * The transaction expects the ioeventfds to be open when it
135
- * commits. Do it now, before the cleanup loop.
136
- */
137
- memory_region_transaction_commit();
138
-
139
- for (i = 0; i < nvqs; i++) {
140
- virtio_bus_cleanup_host_notifier(VIRTIO_BUS(qbus), i);
141
- }
142
-
143
qemu_bh_cancel(s->bh);
144
notify_guest_bh(s); /* final chance to notify guest */
145
146
/* Clean up guest notifier (irq) */
147
k->set_guest_notifiers(qbus->parent, nvqs, false);
148
149
- vblk->dataplane_started = false;
150
s->stopping = false;
151
}
31
--
152
--
32
2.31.1
153
2.40.1
33
154
34
155
diff view generated by jsdifflib