1
The following changes since commit b38df311c174c98ef8cce7dec9f46603b083018e:
1
The following changes since commit 00b1faea41d283e931256aa78aa975a369ec3ae6:
2
2
3
Merge remote-tracking branch 'remotes/dgibson/tags/ppc-for-2.10-20170809' into staging (2017-08-10 11:12:36 +0100)
3
Merge tag 'pull-target-arm-20230123' of https://git.linaro.org/people/pmaydell/qemu-arm into staging (2023-01-23 13:40:28 +0000)
4
4
5
are available in the git repository at:
5
are available in the Git repository at:
6
6
7
git://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 17d0bc01bfcce0ad4fb5105d4502595224569ff0:
9
for you to fetch changes up to 4f01a9bb0461e8c11ee0c94d90a504cb7d580a85:
10
10
11
virtio-blk: handle blk_getlength() errors (2017-08-10 14:33:43 +0100)
11
block/blkio: Fix inclusion of required headers (2023-01-23 15:02:07 -0500)
12
13
----------------------------------------------------------------
14
Pull request
12
15
13
----------------------------------------------------------------
16
----------------------------------------------------------------
14
17
15
----------------------------------------------------------------
18
Chao Gao (1):
19
util/aio: Defer disabling poll mode as long as possible
16
20
17
Kevin Wolf (1):
21
Peter Krempa (1):
18
IDE: test flush on empty CDROM
22
block/blkio: Fix inclusion of required headers
19
23
20
Stefan Hajnoczi (2):
24
Stefan Hajnoczi (1):
21
IDE: Do not flush empty CDROM drives
25
virtio-blk: simplify virtio_blk_dma_restart_cb()
22
virtio-blk: handle blk_getlength() errors
23
26
24
hw/block/virtio-blk.c | 4 +++-
27
include/hw/virtio/virtio-blk.h | 2 --
25
hw/ide/core.c | 10 +++++++++-
28
block/blkio.c | 2 ++
26
tests/ide-test.c | 19 +++++++++++++++++++
29
hw/block/dataplane/virtio-blk.c | 17 +++++-------
27
3 files changed, 31 insertions(+), 2 deletions(-)
30
hw/block/virtio-blk.c | 46 ++++++++++++++-------------------
31
util/aio-posix.c | 21 ++++++++++-----
32
5 files changed, 43 insertions(+), 45 deletions(-)
28
33
29
--
34
--
30
2.13.4
35
2.39.0
31
32
diff view generated by jsdifflib
1
From: Kevin Wolf <kwolf@redhat.com>
1
From: Chao Gao <chao.gao@intel.com>
2
2
3
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
3
When we measure FIO read performance (cache=writethrough, bs=4k,
4
Signed-off-by: John Snow <jsnow@redhat.com>
4
iodepth=64) in VMs, ~80K/s notifications (e.g., EPT_MISCONFIG) are observed
5
Reviewed-by: Eric Blake <eblake@redhat.com>
5
from guest to qemu.
6
Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
6
7
Message-id: 20170809160212.29976-3-stefanha@redhat.com
7
It turns out those frequent notificatons are caused by interference from
8
worker threads. Worker threads queue bottom halves after completing IO
9
requests. Pending bottom halves may lead to either aio_compute_timeout()
10
zeros timeout and pass it to try_poll_mode() or run_poll_handlers() returns
11
no progress after noticing pending aio_notify() events. Both cause
12
run_poll_handlers() to call poll_set_started(false) to disable poll mode.
13
However, for both cases, as timeout is already zeroed, the event loop
14
(i.e., aio_poll()) just processes bottom halves and then starts the next
15
event loop iteration. So, disabling poll mode has no value but leads to
16
unnecessary notifications from guest.
17
18
To minimize unnecessary notifications from guest, defer disabling poll
19
mode to when the event loop is about to be blocked.
20
21
With this patch applied, FIO seq-read performance (bs=4k, iodepth=64,
22
cache=writethrough) in VMs increases from 330K/s to 413K/s IOPS.
23
24
Suggested-by: Stefan Hajnoczi <stefanha@redhat.com>
25
Signed-off-by: Chao Gao <chao.gao@intel.com>
26
Message-id: 20220710120849.63086-1-chao.gao@intel.com
8
Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
27
Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
9
---
28
---
10
tests/ide-test.c | 19 +++++++++++++++++++
29
util/aio-posix.c | 21 +++++++++++++++------
11
1 file changed, 19 insertions(+)
30
1 file changed, 15 insertions(+), 6 deletions(-)
12
31
13
diff --git a/tests/ide-test.c b/tests/ide-test.c
32
diff --git a/util/aio-posix.c b/util/aio-posix.c
14
index XXXXXXX..XXXXXXX 100644
33
index XXXXXXX..XXXXXXX 100644
15
--- a/tests/ide-test.c
34
--- a/util/aio-posix.c
16
+++ b/tests/ide-test.c
35
+++ b/util/aio-posix.c
17
@@ -XXX,XX +XXX,XX @@ static void test_flush_nodev(void)
36
@@ -XXX,XX +XXX,XX @@ static bool try_poll_mode(AioContext *ctx, AioHandlerList *ready_list,
18
ide_test_quit();
37
38
max_ns = qemu_soonest_timeout(*timeout, ctx->poll_ns);
39
if (max_ns && !ctx->fdmon_ops->need_wait(ctx)) {
40
+ /*
41
+ * Enable poll mode. It pairs with the poll_set_started() in
42
+ * aio_poll() which disables poll mode.
43
+ */
44
poll_set_started(ctx, ready_list, true);
45
46
if (run_poll_handlers(ctx, ready_list, max_ns, timeout)) {
47
return true;
48
}
49
}
50
-
51
- if (poll_set_started(ctx, ready_list, false)) {
52
- *timeout = 0;
53
- return true;
54
- }
55
-
56
return false;
19
}
57
}
20
58
21
+static void test_flush_empty_drive(void)
59
@@ -XXX,XX +XXX,XX @@ bool aio_poll(AioContext *ctx, bool blocking)
22
+{
60
* system call---a single round of run_poll_handlers_once suffices.
23
+ QPCIDevice *dev;
61
*/
24
+ QPCIBar bmdma_bar, ide_bar;
62
if (timeout || ctx->fdmon_ops->need_wait(ctx)) {
63
+ /*
64
+ * Disable poll mode. poll mode should be disabled before the call
65
+ * of ctx->fdmon_ops->wait() so that guest's notification can wake
66
+ * up IO threads when some work becomes pending. It is essential to
67
+ * avoid hangs or unnecessary latency.
68
+ */
69
+ if (poll_set_started(ctx, &ready_list, false)) {
70
+ timeout = 0;
71
+ progress = true;
72
+ }
25
+
73
+
26
+ ide_test_start("-device ide-cd,bus=ide.0");
74
ctx->fdmon_ops->wait(ctx, &ready_list, timeout);
27
+ dev = get_pci_device(&bmdma_bar, &ide_bar);
75
}
28
+
29
+ /* FLUSH CACHE command on device 0 */
30
+ qpci_io_writeb(dev, ide_bar, reg_device, 0);
31
+ qpci_io_writeb(dev, ide_bar, reg_command, CMD_FLUSH_CACHE);
32
+
33
+ /* Just testing that qemu doesn't crash... */
34
+
35
+ free_pci_device(dev);
36
+ ide_test_quit();
37
+}
38
+
39
static void test_pci_retry_flush(void)
40
{
41
test_retry_flush("pc");
42
@@ -XXX,XX +XXX,XX @@ int main(int argc, char **argv)
43
44
qtest_add_func("/ide/flush", test_flush);
45
qtest_add_func("/ide/flush/nodev", test_flush_nodev);
46
+ qtest_add_func("/ide/flush/empty_drive", test_flush_empty_drive);
47
qtest_add_func("/ide/flush/retry_pci", test_pci_retry_flush);
48
qtest_add_func("/ide/flush/retry_isa", test_isa_retry_flush);
49
76
50
--
77
--
51
2.13.4
78
2.39.0
52
53
diff view generated by jsdifflib
1
If blk_getlength() fails in virtio_blk_update_config() consider the disk
1
virtio_blk_dma_restart_cb() is tricky because the BH must deal with
2
image length to be 0 bytes.
2
virtio_blk_data_plane_start()/virtio_blk_data_plane_stop() being called.
3
3
4
There are two issues with the code:
5
6
1. virtio_blk_realize() should use qdev_add_vm_change_state_handler()
7
instead of qemu_add_vm_change_state_handler(). This ensures the
8
ordering with virtio_init()'s vm change state handler that calls
9
virtio_blk_data_plane_start()/virtio_blk_data_plane_stop() is
10
well-defined. Then blk's AioContext is guaranteed to be up-to-date in
11
virtio_blk_dma_restart_cb() and it's no longer necessary to have a
12
special case for virtio_blk_data_plane_start().
13
14
2. Only blk_drain() waits for virtio_blk_dma_restart_cb()'s
15
blk_inc_in_flight() to be decremented. The bdrv_drain() family of
16
functions do not wait for BlockBackend's in_flight counter to reach
17
zero. virtio_blk_data_plane_stop() relies on blk_set_aio_context()'s
18
implicit drain, but that's a bdrv_drain() and not a blk_drain().
19
Note that virtio_blk_reset() already correctly relies on blk_drain().
20
If virtio_blk_data_plane_stop() switches to blk_drain() then we can
21
properly wait for pending virtio_blk_dma_restart_bh() calls.
22
23
Once these issues are taken care of the code becomes simpler. This
24
change is in preparation for multiple IOThreads in virtio-blk where we
25
need to clean up the multi-threading behavior.
26
27
I ran the reproducer from commit 49b44549ace7 ("virtio-blk: On restart,
28
process queued requests in the proper context") to check that there is
29
no regression.
30
31
Cc: Sergio Lopez <slp@redhat.com>
32
Cc: Kevin Wolf <kwolf@redhat.com>
33
Cc: Emanuele Giuseppe Esposito <eesposit@redhat.com>
4
Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
34
Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
5
Reviewed-by: Fam Zheng <famz@redhat.com>
35
Acked-by: Michael S. Tsirkin <mst@redhat.com>
6
Message-id: 20170808122251.29815-1-stefanha@redhat.com
36
Reviewed-by: Emanuele Giuseppe Esposito <eesposit@redhat.com>
37
Message-id: 20221102182337.252202-1-stefanha@redhat.com
7
Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
38
Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
8
---
39
---
9
hw/block/virtio-blk.c | 4 +++-
40
include/hw/virtio/virtio-blk.h | 2 --
10
1 file changed, 3 insertions(+), 1 deletion(-)
41
hw/block/dataplane/virtio-blk.c | 17 +++++-------
42
hw/block/virtio-blk.c | 46 ++++++++++++++-------------------
43
3 files changed, 26 insertions(+), 39 deletions(-)
11
44
45
diff --git a/include/hw/virtio/virtio-blk.h b/include/hw/virtio/virtio-blk.h
46
index XXXXXXX..XXXXXXX 100644
47
--- a/include/hw/virtio/virtio-blk.h
48
+++ b/include/hw/virtio/virtio-blk.h
49
@@ -XXX,XX +XXX,XX @@ struct VirtIOBlock {
50
VirtIODevice parent_obj;
51
BlockBackend *blk;
52
void *rq;
53
- QEMUBH *bh;
54
VirtIOBlkConf conf;
55
unsigned short sector_mask;
56
bool original_wce;
57
@@ -XXX,XX +XXX,XX @@ typedef struct MultiReqBuffer {
58
} MultiReqBuffer;
59
60
void virtio_blk_handle_vq(VirtIOBlock *s, VirtQueue *vq);
61
-void virtio_blk_process_queued_requests(VirtIOBlock *s, bool is_bh);
62
63
#endif
64
diff --git a/hw/block/dataplane/virtio-blk.c b/hw/block/dataplane/virtio-blk.c
65
index XXXXXXX..XXXXXXX 100644
66
--- a/hw/block/dataplane/virtio-blk.c
67
+++ b/hw/block/dataplane/virtio-blk.c
68
@@ -XXX,XX +XXX,XX @@ int virtio_blk_data_plane_start(VirtIODevice *vdev)
69
goto fail_aio_context;
70
}
71
72
- /* Process queued requests before the ones in vring */
73
- virtio_blk_process_queued_requests(vblk, false);
74
-
75
/* Kick right away to begin processing requests already in vring */
76
for (i = 0; i < nvqs; i++) {
77
VirtQueue *vq = virtio_get_queue(s->vdev, i);
78
@@ -XXX,XX +XXX,XX @@ int virtio_blk_data_plane_start(VirtIODevice *vdev)
79
fail_host_notifiers:
80
k->set_guest_notifiers(qbus->parent, nvqs, false);
81
fail_guest_notifiers:
82
- /*
83
- * If we failed to set up the guest notifiers queued requests will be
84
- * processed on the main context.
85
- */
86
- virtio_blk_process_queued_requests(vblk, false);
87
vblk->dataplane_disabled = true;
88
s->starting = false;
89
vblk->dataplane_started = true;
90
@@ -XXX,XX +XXX,XX @@ void virtio_blk_data_plane_stop(VirtIODevice *vdev)
91
aio_context_acquire(s->ctx);
92
aio_wait_bh_oneshot(s->ctx, virtio_blk_data_plane_stop_bh, s);
93
94
- /* Drain and try to switch bs back to the QEMU main loop. If other users
95
- * keep the BlockBackend in the iothread, that's ok */
96
+ /* Wait for virtio_blk_dma_restart_bh() and in flight I/O to complete */
97
+ blk_drain(s->conf->conf.blk);
98
+
99
+ /*
100
+ * Try to switch bs back to the QEMU main loop. If other users keep the
101
+ * BlockBackend in the iothread, that's ok
102
+ */
103
blk_set_aio_context(s->conf->conf.blk, qemu_get_aio_context(), NULL);
104
105
aio_context_release(s->ctx);
12
diff --git a/hw/block/virtio-blk.c b/hw/block/virtio-blk.c
106
diff --git a/hw/block/virtio-blk.c b/hw/block/virtio-blk.c
13
index XXXXXXX..XXXXXXX 100644
107
index XXXXXXX..XXXXXXX 100644
14
--- a/hw/block/virtio-blk.c
108
--- a/hw/block/virtio-blk.c
15
+++ b/hw/block/virtio-blk.c
109
+++ b/hw/block/virtio-blk.c
16
@@ -XXX,XX +XXX,XX @@ static void virtio_blk_update_config(VirtIODevice *vdev, uint8_t *config)
110
@@ -XXX,XX +XXX,XX @@ static void virtio_blk_handle_output(VirtIODevice *vdev, VirtQueue *vq)
17
BlockConf *conf = &s->conf.conf;
111
virtio_blk_handle_vq(s, vq);
18
struct virtio_blk_config blkcfg;
112
}
19
uint64_t capacity;
113
20
+ int64_t length;
114
-void virtio_blk_process_queued_requests(VirtIOBlock *s, bool is_bh)
21
int blk_size = conf->logical_block_size;
115
+static void virtio_blk_dma_restart_bh(void *opaque)
22
116
{
23
blk_get_geometry(s->blk, &capacity);
117
+ VirtIOBlock *s = opaque;
24
@@ -XXX,XX +XXX,XX @@ static void virtio_blk_update_config(VirtIODevice *vdev, uint8_t *config)
118
+
25
* divided by 512 - instead it is the amount of blk_size blocks
119
VirtIOBlockReq *req = s->rq;
26
* per track (cylinder).
120
MultiReqBuffer mrb = {};
27
*/
121
28
- if (blk_getlength(s->blk) / conf->heads / conf->secs % blk_size) {
122
@@ -XXX,XX +XXX,XX @@ void virtio_blk_process_queued_requests(VirtIOBlock *s, bool is_bh)
29
+ length = blk_getlength(s->blk);
123
if (mrb.num_reqs) {
30
+ if (length > 0 && length / conf->heads / conf->secs % blk_size) {
124
virtio_blk_submit_multireq(s, &mrb);
31
blkcfg.geometry.sectors = conf->secs & ~s->sector_mask;
125
}
32
} else {
126
- if (is_bh) {
33
blkcfg.geometry.sectors = conf->secs;
127
- blk_dec_in_flight(s->conf.conf.blk);
128
- }
129
+
130
+ /* Paired with inc in virtio_blk_dma_restart_cb() */
131
+ blk_dec_in_flight(s->conf.conf.blk);
132
+
133
aio_context_release(blk_get_aio_context(s->conf.conf.blk));
134
}
135
136
-static void virtio_blk_dma_restart_bh(void *opaque)
137
-{
138
- VirtIOBlock *s = opaque;
139
-
140
- qemu_bh_delete(s->bh);
141
- s->bh = NULL;
142
-
143
- virtio_blk_process_queued_requests(s, true);
144
-}
145
-
146
static void virtio_blk_dma_restart_cb(void *opaque, bool running,
147
RunState state)
148
{
149
VirtIOBlock *s = opaque;
150
- BusState *qbus = BUS(qdev_get_parent_bus(DEVICE(s)));
151
- VirtioBusState *bus = VIRTIO_BUS(qbus);
152
153
if (!running) {
154
return;
155
}
156
157
- /*
158
- * If ioeventfd is enabled, don't schedule the BH here as queued
159
- * requests will be processed while starting the data plane.
160
- */
161
- if (!s->bh && !virtio_bus_ioeventfd_enabled(bus)) {
162
- s->bh = aio_bh_new(blk_get_aio_context(s->conf.conf.blk),
163
- virtio_blk_dma_restart_bh, s);
164
- blk_inc_in_flight(s->conf.conf.blk);
165
- qemu_bh_schedule(s->bh);
166
- }
167
+ /* Paired with dec in virtio_blk_dma_restart_bh() */
168
+ blk_inc_in_flight(s->conf.conf.blk);
169
+
170
+ aio_bh_schedule_oneshot(blk_get_aio_context(s->conf.conf.blk),
171
+ virtio_blk_dma_restart_bh, s);
172
}
173
174
static void virtio_blk_reset(VirtIODevice *vdev)
175
@@ -XXX,XX +XXX,XX @@ static void virtio_blk_device_realize(DeviceState *dev, Error **errp)
176
return;
177
}
178
179
- s->change = qemu_add_vm_change_state_handler(virtio_blk_dma_restart_cb, s);
180
+ /*
181
+ * This must be after virtio_init() so virtio_blk_dma_restart_cb() gets
182
+ * called after ->start_ioeventfd() has already set blk's AioContext.
183
+ */
184
+ s->change =
185
+ qdev_add_vm_change_state_handler(dev, virtio_blk_dma_restart_cb, s);
186
+
187
blk_ram_registrar_init(&s->blk_ram_registrar, s->blk);
188
blk_set_dev_ops(s->blk, &virtio_block_ops, s);
189
34
--
190
--
35
2.13.4
191
2.39.0
36
37
diff view generated by jsdifflib
1
The block backend changed in a way that flushing empty CDROM drives now
1
From: Peter Krempa <pkrempa@redhat.com>
2
crashes. Amend IDE to avoid doing so until the root problem can be
3
addressed for 2.11.
4
2
5
Original patch by John Snow <jsnow@redhat.com>.
3
After recent header file inclusion rework the build fails when the blkio
4
module is enabled:
6
5
7
Reported-by: Kieron Shorrock <kshorrock@paloaltonetworks.com>
6
../block/blkio.c: In function ‘blkio_detach_aio_context’:
8
Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
7
../block/blkio.c:321:24: error: implicit declaration of function ‘bdrv_get_aio_context’; did you mean ‘qemu_get_aio_context’? [-Werror=implicit-function-declaration]
9
Reviewed-by: Eric Blake <eblake@redhat.com>
8
321 | aio_set_fd_handler(bdrv_get_aio_context(bs),
10
Message-id: 20170809160212.29976-2-stefanha@redhat.com
9
| ^~~~~~~~~~~~~~~~~~~~
10
| qemu_get_aio_context
11
../block/blkio.c:321:24: error: nested extern declaration of ‘bdrv_get_aio_context’ [-Werror=nested-externs]
12
../block/blkio.c:321:24: error: passing argument 1 of ‘aio_set_fd_handler’ makes pointer from integer without a cast [-Werror=int-conversion]
13
321 | aio_set_fd_handler(bdrv_get_aio_context(bs),
14
| ^~~~~~~~~~~~~~~~~~~~~~~~
15
| |
16
| int
17
In file included from /home/pipo/git/qemu.git/include/qemu/job.h:33,
18
from /home/pipo/git/qemu.git/include/block/blockjob.h:30,
19
from /home/pipo/git/qemu.git/include/block/block_int-global-state.h:28,
20
from /home/pipo/git/qemu.git/include/block/block_int.h:27,
21
from ../block/blkio.c:13:
22
/home/pipo/git/qemu.git/include/block/aio.h:476:37: note: expected ‘AioContext *’ but argument is of type ‘int’
23
476 | void aio_set_fd_handler(AioContext *ctx,
24
| ~~~~~~~~~~~~^~~
25
../block/blkio.c: In function ‘blkio_file_open’:
26
../block/blkio.c:821:34: error: passing argument 2 of ‘blkio_attach_aio_context’ makes pointer from integer without a cast [-Werror=int-conversion]
27
821 | blkio_attach_aio_context(bs, bdrv_get_aio_context(bs));
28
| ^~~~~~~~~~~~~~~~~~~~~~~~
29
| |
30
| int
31
32
Fix it by including 'block/block-io.h' which contains the required
33
declarations.
34
35
Fixes: e2c1c34f139f49ef909bb4322607fb8b39002312
36
Signed-off-by: Peter Krempa <pkrempa@redhat.com>
37
Reviewed-by: Markus Armbruster <armbru@redhat.com>
38
Message-id: 2bc956011404a1ab03342aefde0087b5b4762562.1674477350.git.pkrempa@redhat.com
11
Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
39
Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
12
---
40
---
13
hw/ide/core.c | 10 +++++++++-
41
block/blkio.c | 2 ++
14
1 file changed, 9 insertions(+), 1 deletion(-)
42
1 file changed, 2 insertions(+)
15
43
16
diff --git a/hw/ide/core.c b/hw/ide/core.c
44
diff --git a/block/blkio.c b/block/blkio.c
17
index XXXXXXX..XXXXXXX 100644
45
index XXXXXXX..XXXXXXX 100644
18
--- a/hw/ide/core.c
46
--- a/block/blkio.c
19
+++ b/hw/ide/core.c
47
+++ b/block/blkio.c
20
@@ -XXX,XX +XXX,XX @@ static void ide_flush_cache(IDEState *s)
48
@@ -XXX,XX +XXX,XX @@
21
s->status |= BUSY_STAT;
49
#include "qemu/module.h"
22
ide_set_retry(s);
50
#include "exec/memory.h" /* for ram_block_discard_disable() */
23
block_acct_start(blk_get_stats(s->blk), &s->acct, 0, BLOCK_ACCT_FLUSH);
51
24
- s->pio_aiocb = blk_aio_flush(s->blk, ide_flush_cb, s);
52
+#include "block/block-io.h"
25
+
53
+
26
+ if (blk_bs(s->blk)) {
54
/*
27
+ s->pio_aiocb = blk_aio_flush(s->blk, ide_flush_cb, s);
55
* Keep the QEMU BlockDriver names identical to the libblkio driver names.
28
+ } else {
56
* Using macros instead of typing out the string literals avoids typos.
29
+ /* XXX blk_aio_flush() crashes when blk_bs(blk) is NULL, remove this
30
+ * temporary workaround when blk_aio_*() functions handle NULL blk_bs.
31
+ */
32
+ ide_flush_cb(s, 0);
33
+ }
34
}
35
36
static void ide_cfata_metadata_inquiry(IDEState *s)
37
--
57
--
38
2.13.4
58
2.39.0
39
59
40
60
diff view generated by jsdifflib