1
The following changes since commit 464588675455afda2899e20a0b120e4075de50c7:
1
The following changes since commit d145c0da22cde391d8c6672d33146ce306e8bf75:
2
2
3
Merge remote-tracking branch 'remotes/sstabellini/tags/xen-20170627-tag' into staging (2017-06-29 11:45:01 +0100)
3
Merge tag 'pull-tcg-20230701' of https://gitlab.com/rth7680/qemu into staging (2023-07-01 08:55:37 +0200)
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 c324fd0a39cee43c13f6d1fb34f74fc5e2fb007b:
9
for you to fetch changes up to c21eae1ccc782440f320accb6f90c66cb8f45ee9:
10
10
11
virtio-pci: use ioeventfd even when KVM is disabled (2017-06-30 11:03:45 +0100)
11
block/blkio: fix module_block.py parsing (2023-07-04 17:28:25 +0200)
12
13
----------------------------------------------------------------
14
Pull request
15
16
Fix --enable-modules with the blkio block driver.
12
17
13
----------------------------------------------------------------
18
----------------------------------------------------------------
14
19
15
----------------------------------------------------------------
20
Stefan Hajnoczi (1):
21
block/blkio: fix module_block.py parsing
16
22
17
Stefan Hajnoczi (7):
23
block/blkio.c | 108 ++++++++++++++++++++++++++------------------------
18
virtio-blk: trace vdev so devices can be distinguished
24
1 file changed, 56 insertions(+), 52 deletions(-)
19
libqos: fix typo in virtio.h QVirtQueue->used comment
20
libqos: add virtio used ring support
21
tests: fix virtio-scsi-test ISR dependence
22
tests: fix virtio-blk-test ISR dependence
23
tests: fix virtio-net-test ISR dependence
24
virtio-pci: use ioeventfd even when KVM is disabled
25
26
tests/libqos/virtio.h | 8 ++++++-
27
hw/block/virtio-blk.c | 12 ++++++----
28
hw/virtio/virtio-pci.c | 2 +-
29
tests/libqos/virtio.c | 60 ++++++++++++++++++++++++++++++++++++++++++++++++
30
tests/virtio-blk-test.c | 27 ++++++++++++++--------
31
tests/virtio-net-test.c | 6 ++---
32
tests/virtio-scsi-test.c | 2 +-
33
hw/block/trace-events | 10 ++++----
34
8 files changed, 101 insertions(+), 26 deletions(-)
35
25
36
--
26
--
37
2.9.4
27
2.40.1
38
39
diff view generated by jsdifflib
Deleted patch
1
It is hard to analyze trace logs with multiple virtio-blk devices
2
because none of the trace events include the VirtIODevice *vdev.
3
1
4
This patch adds vdev so it's clear which device a request is associated
5
with.
6
7
I considered using VirtIOBlock *s instead but VirtIODevice *vdev is more
8
general and may be correlated with generic virtio trace events like
9
virtio_set_status.
10
11
Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
12
Reviewed-by: Fam Zheng <famz@redhat.com>
13
Message-id: 20170614092930.11234-1-stefanha@redhat.com
14
Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
15
---
16
hw/block/virtio-blk.c | 12 +++++++-----
17
hw/block/trace-events | 10 +++++-----
18
2 files changed, 12 insertions(+), 10 deletions(-)
19
20
diff --git a/hw/block/virtio-blk.c b/hw/block/virtio-blk.c
21
index XXXXXXX..XXXXXXX 100644
22
--- a/hw/block/virtio-blk.c
23
+++ b/hw/block/virtio-blk.c
24
@@ -XXX,XX +XXX,XX @@ static void virtio_blk_req_complete(VirtIOBlockReq *req, unsigned char status)
25
VirtIOBlock *s = req->dev;
26
VirtIODevice *vdev = VIRTIO_DEVICE(s);
27
28
- trace_virtio_blk_req_complete(req, status);
29
+ trace_virtio_blk_req_complete(vdev, req, status);
30
31
stb_p(&req->in->status, status);
32
virtqueue_push(req->vq, &req->elem, req->in_len);
33
@@ -XXX,XX +XXX,XX @@ static void virtio_blk_rw_complete(void *opaque, int ret)
34
{
35
VirtIOBlockReq *next = opaque;
36
VirtIOBlock *s = next->dev;
37
+ VirtIODevice *vdev = VIRTIO_DEVICE(s);
38
39
aio_context_acquire(blk_get_aio_context(s->conf.conf.blk));
40
while (next) {
41
VirtIOBlockReq *req = next;
42
next = req->mr_next;
43
- trace_virtio_blk_rw_complete(req, ret);
44
+ trace_virtio_blk_rw_complete(vdev, req, ret);
45
46
if (req->qiov.nalloc != -1) {
47
/* If nalloc is != 1 req->qiov is a local copy of the original
48
@@ -XXX,XX +XXX,XX @@ static inline void submit_requests(BlockBackend *blk, MultiReqBuffer *mrb,
49
mrb->reqs[i - 1]->mr_next = mrb->reqs[i];
50
}
51
52
- trace_virtio_blk_submit_multireq(mrb, start, num_reqs,
53
+ trace_virtio_blk_submit_multireq(VIRTIO_DEVICE(mrb->reqs[start]->dev),
54
+ mrb, start, num_reqs,
55
sector_num << BDRV_SECTOR_BITS,
56
qiov->size, is_write);
57
block_acct_merge_done(blk_get_stats(blk),
58
@@ -XXX,XX +XXX,XX @@ static int virtio_blk_handle_request(VirtIOBlockReq *req, MultiReqBuffer *mrb)
59
60
if (is_write) {
61
qemu_iovec_init_external(&req->qiov, iov, out_num);
62
- trace_virtio_blk_handle_write(req, req->sector_num,
63
+ trace_virtio_blk_handle_write(vdev, req, req->sector_num,
64
req->qiov.size / BDRV_SECTOR_SIZE);
65
} else {
66
qemu_iovec_init_external(&req->qiov, in_iov, in_num);
67
- trace_virtio_blk_handle_read(req, req->sector_num,
68
+ trace_virtio_blk_handle_read(vdev, req, req->sector_num,
69
req->qiov.size / BDRV_SECTOR_SIZE);
70
}
71
72
diff --git a/hw/block/trace-events b/hw/block/trace-events
73
index XXXXXXX..XXXXXXX 100644
74
--- a/hw/block/trace-events
75
+++ b/hw/block/trace-events
76
@@ -XXX,XX +XXX,XX @@
77
# See docs/tracing.txt for syntax documentation.
78
79
# hw/block/virtio-blk.c
80
-virtio_blk_req_complete(void *req, int status) "req %p status %d"
81
-virtio_blk_rw_complete(void *req, int ret) "req %p ret %d"
82
-virtio_blk_handle_write(void *req, uint64_t sector, size_t nsectors) "req %p sector %"PRIu64" nsectors %zu"
83
-virtio_blk_handle_read(void *req, uint64_t sector, size_t nsectors) "req %p sector %"PRIu64" nsectors %zu"
84
-virtio_blk_submit_multireq(void *mrb, int start, int num_reqs, uint64_t offset, size_t size, bool is_write) "mrb %p start %d num_reqs %d offset %"PRIu64" size %zu is_write %d"
85
+virtio_blk_req_complete(void *vdev, void *req, int status) "vdev %p req %p status %d"
86
+virtio_blk_rw_complete(void *vdev, void *req, int ret) "vdev %p req %p ret %d"
87
+virtio_blk_handle_write(void *vdev, void *req, uint64_t sector, size_t nsectors) "vdev %p req %p sector %"PRIu64" nsectors %zu"
88
+virtio_blk_handle_read(void *vdev, void *req, uint64_t sector, size_t nsectors) "vdev %p req %p sector %"PRIu64" nsectors %zu"
89
+virtio_blk_submit_multireq(void *vdev, void *mrb, int start, int num_reqs, uint64_t offset, size_t size, bool is_write) "vdev %p mrb %p start %d num_reqs %d offset %"PRIu64" size %zu is_write %d"
90
91
# hw/block/hd-geometry.c
92
hd_geometry_lchs_guess(void *blk, int cyls, int heads, int secs) "blk %p LCHS %d %d %d"
93
--
94
2.9.4
95
96
diff view generated by jsdifflib
Deleted patch
1
Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
2
Reviewed-by: Michael S. Tsirkin <mst@redhat.com>
3
Reviewed-by: Fam Zheng <famz@redhat.com>
4
Tested-by: Eric Blake <eblake@redhat.com>
5
Tested-by: Kevin Wolf <kwolf@redhat.com>
6
Message-id: 20170628184724.21378-2-stefanha@redhat.com
7
Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
8
---
9
tests/libqos/virtio.h | 2 +-
10
1 file changed, 1 insertion(+), 1 deletion(-)
11
1
12
diff --git a/tests/libqos/virtio.h b/tests/libqos/virtio.h
13
index XXXXXXX..XXXXXXX 100644
14
--- a/tests/libqos/virtio.h
15
+++ b/tests/libqos/virtio.h
16
@@ -XXX,XX +XXX,XX @@ typedef struct QVirtioDevice {
17
typedef struct QVirtQueue {
18
uint64_t desc; /* This points to an array of struct vring_desc */
19
uint64_t avail; /* This points to a struct vring_avail */
20
- uint64_t used; /* This points to a struct vring_desc */
21
+ uint64_t used; /* This points to a struct vring_used */
22
uint16_t index;
23
uint32_t size;
24
uint32_t free_head;
25
--
26
2.9.4
27
28
diff view generated by jsdifflib
Deleted patch
1
Existing tests do not touch the virtqueue used ring. Instead they poll
2
the virtqueue ISR register and peek into their request's device-specific
3
status field.
4
1
5
It turns out that the virtqueue ISR register can be set to 1 more than
6
once for a single notification (see commit
7
83d768b5640946b7da55ce8335509df297e2c7cd "virtio: set ISR on dataplane
8
notifications"). This causes problems for tests that assume a 1:1
9
correspondence between the ISR being 1 and request completion.
10
11
Peeking at device-specific status fields is also problematic if the
12
device has no field that can be abused for EINPROGRESS polling
13
semantics. This is the case if all the field's values may be set by the
14
device; there's no magic constant left for polling.
15
16
It's time to process the used ring for completed requests, just like a
17
real virtio guest driver. This patch adds the necessary APIs.
18
19
Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
20
Reviewed-by: Michael S. Tsirkin <mst@redhat.com>
21
Reviewed-by: Fam Zheng <famz@redhat.com>
22
Tested-by: Eric Blake <eblake@redhat.com>
23
Tested-by: Kevin Wolf <kwolf@redhat.com>
24
Message-id: 20170628184724.21378-3-stefanha@redhat.com
25
Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
26
---
27
tests/libqos/virtio.h | 6 ++++++
28
tests/libqos/virtio.c | 60 +++++++++++++++++++++++++++++++++++++++++++++++++++
29
2 files changed, 66 insertions(+)
30
31
diff --git a/tests/libqos/virtio.h b/tests/libqos/virtio.h
32
index XXXXXXX..XXXXXXX 100644
33
--- a/tests/libqos/virtio.h
34
+++ b/tests/libqos/virtio.h
35
@@ -XXX,XX +XXX,XX @@ typedef struct QVirtQueue {
36
uint32_t free_head;
37
uint32_t num_free;
38
uint32_t align;
39
+ uint16_t last_used_idx;
40
bool indirect;
41
bool event;
42
} QVirtQueue;
43
@@ -XXX,XX +XXX,XX @@ uint8_t qvirtio_wait_status_byte_no_isr(QVirtioDevice *d,
44
QVirtQueue *vq,
45
uint64_t addr,
46
gint64 timeout_us);
47
+void qvirtio_wait_used_elem(QVirtioDevice *d,
48
+ QVirtQueue *vq,
49
+ uint32_t desc_idx,
50
+ gint64 timeout_us);
51
void qvirtio_wait_config_isr(QVirtioDevice *d, gint64 timeout_us);
52
QVirtQueue *qvirtqueue_setup(QVirtioDevice *d,
53
QGuestAllocator *alloc, uint16_t index);
54
@@ -XXX,XX +XXX,XX @@ uint32_t qvirtqueue_add(QVirtQueue *vq, uint64_t data, uint32_t len, bool write,
55
bool next);
56
uint32_t qvirtqueue_add_indirect(QVirtQueue *vq, QVRingIndirectDesc *indirect);
57
void qvirtqueue_kick(QVirtioDevice *d, QVirtQueue *vq, uint32_t free_head);
58
+bool qvirtqueue_get_buf(QVirtQueue *vq, uint32_t *desc_idx);
59
60
void qvirtqueue_set_used_event(QVirtQueue *vq, uint16_t idx);
61
#endif
62
diff --git a/tests/libqos/virtio.c b/tests/libqos/virtio.c
63
index XXXXXXX..XXXXXXX 100644
64
--- a/tests/libqos/virtio.c
65
+++ b/tests/libqos/virtio.c
66
@@ -XXX,XX +XXX,XX @@ uint8_t qvirtio_wait_status_byte_no_isr(QVirtioDevice *d,
67
return val;
68
}
69
70
+/*
71
+ * qvirtio_wait_used_elem:
72
+ * @desc_idx: The next expected vq->desc[] index in the used ring
73
+ * @timeout_us: How many microseconds to wait before failing
74
+ *
75
+ * This function waits for the next completed request on the used ring.
76
+ */
77
+void qvirtio_wait_used_elem(QVirtioDevice *d,
78
+ QVirtQueue *vq,
79
+ uint32_t desc_idx,
80
+ gint64 timeout_us)
81
+{
82
+ gint64 start_time = g_get_monotonic_time();
83
+
84
+ for (;;) {
85
+ uint32_t got_desc_idx;
86
+
87
+ clock_step(100);
88
+
89
+ if (d->bus->get_queue_isr_status(d, vq) &&
90
+ qvirtqueue_get_buf(vq, &got_desc_idx)) {
91
+ g_assert_cmpint(got_desc_idx, ==, desc_idx);
92
+ return;
93
+ }
94
+
95
+ g_assert(g_get_monotonic_time() - start_time <= timeout_us);
96
+ }
97
+}
98
+
99
void qvirtio_wait_config_isr(QVirtioDevice *d, gint64 timeout_us)
100
{
101
gint64 start_time = g_get_monotonic_time();
102
@@ -XXX,XX +XXX,XX @@ void qvirtqueue_kick(QVirtioDevice *d, QVirtQueue *vq, uint32_t free_head)
103
}
104
}
105
106
+/*
107
+ * qvirtqueue_get_buf:
108
+ * @desc_idx: A pointer that is filled with the vq->desc[] index, may be NULL
109
+ *
110
+ * This function gets the next used element if there is one ready.
111
+ *
112
+ * Returns: true if an element was ready, false otherwise
113
+ */
114
+bool qvirtqueue_get_buf(QVirtQueue *vq, uint32_t *desc_idx)
115
+{
116
+ uint16_t idx;
117
+
118
+ idx = readw(vq->used + offsetof(struct vring_used, idx));
119
+ if (idx == vq->last_used_idx) {
120
+ return false;
121
+ }
122
+
123
+ if (desc_idx) {
124
+ uint64_t elem_addr;
125
+
126
+ elem_addr = vq->used +
127
+ offsetof(struct vring_used, ring) +
128
+ (vq->last_used_idx % vq->size) *
129
+ sizeof(struct vring_used_elem);
130
+ *desc_idx = readl(elem_addr + offsetof(struct vring_used_elem, id));
131
+ }
132
+
133
+ vq->last_used_idx++;
134
+ return true;
135
+}
136
+
137
void qvirtqueue_set_used_event(QVirtQueue *vq, uint16_t idx)
138
{
139
g_assert(vq->event);
140
--
141
2.9.4
142
143
diff view generated by jsdifflib
Deleted patch
1
Use the new used ring APIs instead of assuming ISR being set means the
2
request has completed.
3
1
4
Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
5
Reviewed-by: Michael S. Tsirkin <mst@redhat.com>
6
Reviewed-by: Fam Zheng <famz@redhat.com>
7
Tested-by: Eric Blake <eblake@redhat.com>
8
Tested-by: Kevin Wolf <kwolf@redhat.com>
9
Message-id: 20170628184724.21378-4-stefanha@redhat.com
10
Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
11
---
12
tests/virtio-scsi-test.c | 2 +-
13
1 file changed, 1 insertion(+), 1 deletion(-)
14
15
diff --git a/tests/virtio-scsi-test.c b/tests/virtio-scsi-test.c
16
index XXXXXXX..XXXXXXX 100644
17
--- a/tests/virtio-scsi-test.c
18
+++ b/tests/virtio-scsi-test.c
19
@@ -XXX,XX +XXX,XX @@ static uint8_t virtio_scsi_do_command(QVirtIOSCSI *vs, const uint8_t *cdb,
20
}
21
22
qvirtqueue_kick(vs->dev, vq, free_head);
23
- qvirtio_wait_queue_isr(vs->dev, vq, QVIRTIO_SCSI_TIMEOUT_US);
24
+ qvirtio_wait_used_elem(vs->dev, vq, free_head, QVIRTIO_SCSI_TIMEOUT_US);
25
26
response = readb(resp_addr +
27
offsetof(struct virtio_scsi_cmd_resp, response));
28
--
29
2.9.4
30
31
diff view generated by jsdifflib
Deleted patch
1
Use the new used ring APIs instead of assuming ISR being set means the
2
request has completed.
3
1
4
Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
5
Reviewed-by: Michael S. Tsirkin <mst@redhat.com>
6
Reviewed-by: Fam Zheng <famz@redhat.com>
7
Tested-by: Eric Blake <eblake@redhat.com>
8
Tested-by: Kevin Wolf <kwolf@redhat.com>
9
Message-id: 20170628184724.21378-5-stefanha@redhat.com
10
Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
11
---
12
tests/virtio-blk-test.c | 27 +++++++++++++++++----------
13
1 file changed, 17 insertions(+), 10 deletions(-)
14
15
diff --git a/tests/virtio-blk-test.c b/tests/virtio-blk-test.c
16
index XXXXXXX..XXXXXXX 100644
17
--- a/tests/virtio-blk-test.c
18
+++ b/tests/virtio-blk-test.c
19
@@ -XXX,XX +XXX,XX @@ static void test_basic(QVirtioDevice *dev, QGuestAllocator *alloc,
20
21
qvirtqueue_kick(dev, vq, free_head);
22
23
- qvirtio_wait_queue_isr(dev, vq, QVIRTIO_BLK_TIMEOUT_US);
24
+ qvirtio_wait_used_elem(dev, vq, free_head, QVIRTIO_BLK_TIMEOUT_US);
25
status = readb(req_addr + 528);
26
g_assert_cmpint(status, ==, 0);
27
28
@@ -XXX,XX +XXX,XX @@ static void test_basic(QVirtioDevice *dev, QGuestAllocator *alloc,
29
30
qvirtqueue_kick(dev, vq, free_head);
31
32
- qvirtio_wait_queue_isr(dev, vq, QVIRTIO_BLK_TIMEOUT_US);
33
+ qvirtio_wait_used_elem(dev, vq, free_head, QVIRTIO_BLK_TIMEOUT_US);
34
status = readb(req_addr + 528);
35
g_assert_cmpint(status, ==, 0);
36
37
@@ -XXX,XX +XXX,XX @@ static void test_basic(QVirtioDevice *dev, QGuestAllocator *alloc,
38
qvirtqueue_add(vq, req_addr + 528, 1, true, false);
39
qvirtqueue_kick(dev, vq, free_head);
40
41
- qvirtio_wait_queue_isr(dev, vq, QVIRTIO_BLK_TIMEOUT_US);
42
+ qvirtio_wait_used_elem(dev, vq, free_head, QVIRTIO_BLK_TIMEOUT_US);
43
status = readb(req_addr + 528);
44
g_assert_cmpint(status, ==, 0);
45
46
@@ -XXX,XX +XXX,XX @@ static void test_basic(QVirtioDevice *dev, QGuestAllocator *alloc,
47
48
qvirtqueue_kick(dev, vq, free_head);
49
50
- qvirtio_wait_queue_isr(dev, vq, QVIRTIO_BLK_TIMEOUT_US);
51
+ qvirtio_wait_used_elem(dev, vq, free_head, QVIRTIO_BLK_TIMEOUT_US);
52
status = readb(req_addr + 528);
53
g_assert_cmpint(status, ==, 0);
54
55
@@ -XXX,XX +XXX,XX @@ static void pci_indirect(void)
56
free_head = qvirtqueue_add_indirect(&vqpci->vq, indirect);
57
qvirtqueue_kick(&dev->vdev, &vqpci->vq, free_head);
58
59
- qvirtio_wait_queue_isr(&dev->vdev, &vqpci->vq,
60
+ qvirtio_wait_used_elem(&dev->vdev, &vqpci->vq, free_head,
61
QVIRTIO_BLK_TIMEOUT_US);
62
status = readb(req_addr + 528);
63
g_assert_cmpint(status, ==, 0);
64
@@ -XXX,XX +XXX,XX @@ static void pci_indirect(void)
65
free_head = qvirtqueue_add_indirect(&vqpci->vq, indirect);
66
qvirtqueue_kick(&dev->vdev, &vqpci->vq, free_head);
67
68
- qvirtio_wait_queue_isr(&dev->vdev, &vqpci->vq,
69
+ qvirtio_wait_used_elem(&dev->vdev, &vqpci->vq, free_head,
70
QVIRTIO_BLK_TIMEOUT_US);
71
status = readb(req_addr + 528);
72
g_assert_cmpint(status, ==, 0);
73
@@ -XXX,XX +XXX,XX @@ static void pci_msix(void)
74
qvirtqueue_add(&vqpci->vq, req_addr + 528, 1, true, false);
75
qvirtqueue_kick(&dev->vdev, &vqpci->vq, free_head);
76
77
- qvirtio_wait_queue_isr(&dev->vdev, &vqpci->vq,
78
+ qvirtio_wait_used_elem(&dev->vdev, &vqpci->vq, free_head,
79
QVIRTIO_BLK_TIMEOUT_US);
80
81
status = readb(req_addr + 528);
82
@@ -XXX,XX +XXX,XX @@ static void pci_msix(void)
83
qvirtqueue_kick(&dev->vdev, &vqpci->vq, free_head);
84
85
86
- qvirtio_wait_queue_isr(&dev->vdev, &vqpci->vq,
87
+ qvirtio_wait_used_elem(&dev->vdev, &vqpci->vq, free_head,
88
QVIRTIO_BLK_TIMEOUT_US);
89
90
status = readb(req_addr + 528);
91
@@ -XXX,XX +XXX,XX @@ static void pci_idx(void)
92
uint64_t capacity;
93
uint32_t features;
94
uint32_t free_head;
95
+ uint32_t write_head;
96
+ uint32_t desc_idx;
97
uint8_t status;
98
char *data;
99
100
@@ -XXX,XX +XXX,XX @@ static void pci_idx(void)
101
qvirtqueue_add(&vqpci->vq, req_addr + 528, 1, true, false);
102
qvirtqueue_kick(&dev->vdev, &vqpci->vq, free_head);
103
104
- qvirtio_wait_queue_isr(&dev->vdev, &vqpci->vq, QVIRTIO_BLK_TIMEOUT_US);
105
+ qvirtio_wait_used_elem(&dev->vdev, &vqpci->vq, free_head,
106
+ QVIRTIO_BLK_TIMEOUT_US);
107
108
/* Write request */
109
req.type = VIRTIO_BLK_T_OUT;
110
@@ -XXX,XX +XXX,XX @@ static void pci_idx(void)
111
qvirtqueue_add(&vqpci->vq, req_addr + 16, 512, false, true);
112
qvirtqueue_add(&vqpci->vq, req_addr + 528, 1, true, false);
113
qvirtqueue_kick(&dev->vdev, &vqpci->vq, free_head);
114
+ write_head = free_head;
115
116
/* No notification expected */
117
status = qvirtio_wait_status_byte_no_isr(&dev->vdev,
118
@@ -XXX,XX +XXX,XX @@ static void pci_idx(void)
119
120
qvirtqueue_kick(&dev->vdev, &vqpci->vq, free_head);
121
122
- qvirtio_wait_queue_isr(&dev->vdev, &vqpci->vq,
123
+ /* We get just one notification for both requests */
124
+ qvirtio_wait_used_elem(&dev->vdev, &vqpci->vq, write_head,
125
QVIRTIO_BLK_TIMEOUT_US);
126
+ g_assert(qvirtqueue_get_buf(&vqpci->vq, &desc_idx));
127
+ g_assert_cmpint(desc_idx, ==, free_head);
128
129
status = readb(req_addr + 528);
130
g_assert_cmpint(status, ==, 0);
131
--
132
2.9.4
133
134
diff view generated by jsdifflib
Deleted patch
1
Use the new used ring APIs instead of assuming ISR being set means the
2
request has completed.
3
1
4
Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
5
Reviewed-by: Michael S. Tsirkin <mst@redhat.com>
6
Reviewed-by: Fam Zheng <famz@redhat.com>
7
Tested-by: Eric Blake <eblake@redhat.com>
8
Tested-by: Kevin Wolf <kwolf@redhat.com>
9
Message-id: 20170628184724.21378-6-stefanha@redhat.com
10
Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
11
---
12
tests/virtio-net-test.c | 6 +++---
13
1 file changed, 3 insertions(+), 3 deletions(-)
14
15
diff --git a/tests/virtio-net-test.c b/tests/virtio-net-test.c
16
index XXXXXXX..XXXXXXX 100644
17
--- a/tests/virtio-net-test.c
18
+++ b/tests/virtio-net-test.c
19
@@ -XXX,XX +XXX,XX @@ static void rx_test(QVirtioDevice *dev,
20
ret = iov_send(socket, iov, 2, 0, sizeof(len) + sizeof(test));
21
g_assert_cmpint(ret, ==, sizeof(test) + sizeof(len));
22
23
- qvirtio_wait_queue_isr(dev, vq, QVIRTIO_NET_TIMEOUT_US);
24
+ qvirtio_wait_used_elem(dev, vq, free_head, QVIRTIO_NET_TIMEOUT_US);
25
memread(req_addr + VNET_HDR_SIZE, buffer, sizeof(test));
26
g_assert_cmpstr(buffer, ==, "TEST");
27
28
@@ -XXX,XX +XXX,XX @@ static void tx_test(QVirtioDevice *dev,
29
free_head = qvirtqueue_add(vq, req_addr, 64, false, false);
30
qvirtqueue_kick(dev, vq, free_head);
31
32
- qvirtio_wait_queue_isr(dev, vq, QVIRTIO_NET_TIMEOUT_US);
33
+ qvirtio_wait_used_elem(dev, vq, free_head, QVIRTIO_NET_TIMEOUT_US);
34
guest_free(alloc, req_addr);
35
36
ret = qemu_recv(socket, &len, sizeof(len), 0);
37
@@ -XXX,XX +XXX,XX @@ static void rx_stop_cont_test(QVirtioDevice *dev,
38
rsp = qmp("{ 'execute' : 'cont'}");
39
QDECREF(rsp);
40
41
- qvirtio_wait_queue_isr(dev, vq, QVIRTIO_NET_TIMEOUT_US);
42
+ qvirtio_wait_used_elem(dev, vq, free_head, QVIRTIO_NET_TIMEOUT_US);
43
memread(req_addr + VNET_HDR_SIZE, buffer, sizeof(test));
44
g_assert_cmpstr(buffer, ==, "TEST");
45
46
--
47
2.9.4
48
49
diff view generated by jsdifflib
1
Old kvm.ko versions only supported a tiny number of ioeventfds so
1
When QEMU is built with --enable-modules, the module_block.py script
2
virtio-pci avoids ioeventfds when kvm_has_many_ioeventfds() returns 0.
2
parses block/*.c to find block drivers that are built as modules. The
3
script generates a table of block drivers called block_driver_modules[].
4
This table is used for block driver module loading.
3
5
4
Do not check kvm_has_many_ioeventfds() when KVM is disabled since it
6
The blkio.c driver uses macros to define its BlockDriver structs. This
5
always returns 0. Since commit 8c56c1a592b5092d91da8d8943c17777d6462a6f
7
was done to avoid code duplication but the module_block.py script is
6
("memory: emulate ioeventfd") it has been possible to use ioeventfds in
8
unable to parse the macro. The result is that libblkio-based block
7
qtest or TCG mode.
9
drivers can be built as modules but will not be found at runtime.
8
10
9
This patch makes -device virtio-blk-pci,iothread=iothread0 work even
11
One fix is to make the module_block.py script or build system fancier so
10
when KVM is disabled.
12
it can parse C macros (e.g. by parsing the preprocessed source code). I
13
chose not to do this because it raises the complexity of the build,
14
making future issues harder to debug.
11
15
12
I have tested that virtio-blk-pci works under TCG both with and without
16
Keep things simple: use the macro to avoid duplicating BlockDriver
13
iothread.
17
function pointers but define .format_name and .protocol_name manually
18
for each BlockDriver. This way the module_block.py is able to parse the
19
code.
14
20
15
This patch fixes qemu-iotests 068, which was accidentally merged early
21
Also get rid of the block driver name macros (e.g. DRIVER_IO_URING)
16
despite the dependency on ioeventfd.
22
because module_block.py cannot parse them either.
17
23
18
Cc: Michael S. Tsirkin <mst@redhat.com>
24
Fixes: fd66dbd424f5 ("blkio: add libblkio block driver")
25
Reported-by: Qing Wang <qinwang@redhat.com>
19
Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
26
Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
20
Reviewed-by: Michael S. Tsirkin <mst@redhat.com>
27
Reviewed-by: Stefano Garzarella <sgarzare@redhat.com>
21
Reviewed-by: Fam Zheng <famz@redhat.com>
28
Message-id: 20230704123436.187761-1-stefanha@redhat.com
22
Tested-by: Eric Blake <eblake@redhat.com>
29
Cc: Stefano Garzarella <sgarzare@redhat.com>
23
Tested-by: Kevin Wolf <kwolf@redhat.com>
24
Message-id: 20170628184724.21378-7-stefanha@redhat.com
25
Message-id: 20170615163813.7255-2-stefanha@redhat.com
26
Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
30
Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
27
---
31
---
28
hw/virtio/virtio-pci.c | 2 +-
32
block/blkio.c | 108 ++++++++++++++++++++++++++------------------------
29
1 file changed, 1 insertion(+), 1 deletion(-)
33
1 file changed, 56 insertions(+), 52 deletions(-)
30
34
31
diff --git a/hw/virtio/virtio-pci.c b/hw/virtio/virtio-pci.c
35
diff --git a/block/blkio.c b/block/blkio.c
32
index XXXXXXX..XXXXXXX 100644
36
index XXXXXXX..XXXXXXX 100644
33
--- a/hw/virtio/virtio-pci.c
37
--- a/block/blkio.c
34
+++ b/hw/virtio/virtio-pci.c
38
+++ b/block/blkio.c
35
@@ -XXX,XX +XXX,XX @@ static void virtio_pci_realize(PCIDevice *pci_dev, Error **errp)
39
@@ -XXX,XX +XXX,XX @@
36
bool pcie_port = pci_bus_is_express(pci_dev->bus) &&
40
37
!pci_bus_is_root(pci_dev->bus);
41
#include "block/block-io.h"
38
42
39
- if (!kvm_has_many_ioeventfds()) {
43
-/*
40
+ if (kvm_enabled() && !kvm_has_many_ioeventfds()) {
44
- * Keep the QEMU BlockDriver names identical to the libblkio driver names.
41
proxy->flags &= ~VIRTIO_PCI_FLAG_USE_IOEVENTFD;
45
- * Using macros instead of typing out the string literals avoids typos.
46
- */
47
-#define DRIVER_IO_URING "io_uring"
48
-#define DRIVER_NVME_IO_URING "nvme-io_uring"
49
-#define DRIVER_VIRTIO_BLK_VFIO_PCI "virtio-blk-vfio-pci"
50
-#define DRIVER_VIRTIO_BLK_VHOST_USER "virtio-blk-vhost-user"
51
-#define DRIVER_VIRTIO_BLK_VHOST_VDPA "virtio-blk-vhost-vdpa"
52
-
53
/*
54
* Allocated bounce buffers are kept in a list sorted by buffer address.
55
*/
56
@@ -XXX,XX +XXX,XX @@ static int blkio_file_open(BlockDriverState *bs, QDict *options, int flags,
57
return ret;
42
}
58
}
43
59
60
- if (strcmp(blkio_driver, DRIVER_IO_URING) == 0) {
61
+ if (strcmp(blkio_driver, "io_uring") == 0) {
62
ret = blkio_io_uring_open(bs, options, flags, errp);
63
- } else if (strcmp(blkio_driver, DRIVER_NVME_IO_URING) == 0) {
64
+ } else if (strcmp(blkio_driver, "nvme-io_uring") == 0) {
65
ret = blkio_nvme_io_uring(bs, options, flags, errp);
66
- } else if (strcmp(blkio_driver, DRIVER_VIRTIO_BLK_VFIO_PCI) == 0) {
67
+ } else if (strcmp(blkio_driver, "virtio-blk-vfio-pci") == 0) {
68
ret = blkio_virtio_blk_common_open(bs, options, flags, errp);
69
- } else if (strcmp(blkio_driver, DRIVER_VIRTIO_BLK_VHOST_USER) == 0) {
70
+ } else if (strcmp(blkio_driver, "virtio-blk-vhost-user") == 0) {
71
ret = blkio_virtio_blk_common_open(bs, options, flags, errp);
72
- } else if (strcmp(blkio_driver, DRIVER_VIRTIO_BLK_VHOST_VDPA) == 0) {
73
+ } else if (strcmp(blkio_driver, "virtio-blk-vhost-vdpa") == 0) {
74
ret = blkio_virtio_blk_common_open(bs, options, flags, errp);
75
} else {
76
g_assert_not_reached();
77
@@ -XXX,XX +XXX,XX @@ static void blkio_refresh_limits(BlockDriverState *bs, Error **errp)
78
* - truncate
79
*/
80
81
-#define BLKIO_DRIVER(name, ...) \
82
- { \
83
- .format_name = name, \
84
- .protocol_name = name, \
85
- .instance_size = sizeof(BDRVBlkioState), \
86
- .bdrv_file_open = blkio_file_open, \
87
- .bdrv_close = blkio_close, \
88
- .bdrv_co_getlength = blkio_co_getlength, \
89
- .bdrv_co_truncate = blkio_truncate, \
90
- .bdrv_co_get_info = blkio_co_get_info, \
91
- .bdrv_attach_aio_context = blkio_attach_aio_context, \
92
- .bdrv_detach_aio_context = blkio_detach_aio_context, \
93
- .bdrv_co_pdiscard = blkio_co_pdiscard, \
94
- .bdrv_co_preadv = blkio_co_preadv, \
95
- .bdrv_co_pwritev = blkio_co_pwritev, \
96
- .bdrv_co_flush_to_disk = blkio_co_flush, \
97
- .bdrv_co_pwrite_zeroes = blkio_co_pwrite_zeroes, \
98
- .bdrv_refresh_limits = blkio_refresh_limits, \
99
- .bdrv_register_buf = blkio_register_buf, \
100
- .bdrv_unregister_buf = blkio_unregister_buf, \
101
- __VA_ARGS__ \
102
- }
103
+/*
104
+ * Do not include .format_name and .protocol_name because module_block.py
105
+ * does not parse macros in the source code.
106
+ */
107
+#define BLKIO_DRIVER_COMMON \
108
+ .instance_size = sizeof(BDRVBlkioState), \
109
+ .bdrv_file_open = blkio_file_open, \
110
+ .bdrv_close = blkio_close, \
111
+ .bdrv_co_getlength = blkio_co_getlength, \
112
+ .bdrv_co_truncate = blkio_truncate, \
113
+ .bdrv_co_get_info = blkio_co_get_info, \
114
+ .bdrv_attach_aio_context = blkio_attach_aio_context, \
115
+ .bdrv_detach_aio_context = blkio_detach_aio_context, \
116
+ .bdrv_co_pdiscard = blkio_co_pdiscard, \
117
+ .bdrv_co_preadv = blkio_co_preadv, \
118
+ .bdrv_co_pwritev = blkio_co_pwritev, \
119
+ .bdrv_co_flush_to_disk = blkio_co_flush, \
120
+ .bdrv_co_pwrite_zeroes = blkio_co_pwrite_zeroes, \
121
+ .bdrv_refresh_limits = blkio_refresh_limits, \
122
+ .bdrv_register_buf = blkio_register_buf, \
123
+ .bdrv_unregister_buf = blkio_unregister_buf,
124
125
-static BlockDriver bdrv_io_uring = BLKIO_DRIVER(
126
- DRIVER_IO_URING,
127
+/*
128
+ * Use the same .format_name and .protocol_name as the libblkio driver name for
129
+ * consistency.
130
+ */
131
+
132
+static BlockDriver bdrv_io_uring = {
133
+ .format_name = "io_uring",
134
+ .protocol_name = "io_uring",
135
.bdrv_needs_filename = true,
136
-);
137
+ BLKIO_DRIVER_COMMON
138
+};
139
140
-static BlockDriver bdrv_nvme_io_uring = BLKIO_DRIVER(
141
- DRIVER_NVME_IO_URING,
142
-);
143
+static BlockDriver bdrv_nvme_io_uring = {
144
+ .format_name = "nvme-io_uring",
145
+ .protocol_name = "nvme-io_uring",
146
+ BLKIO_DRIVER_COMMON
147
+};
148
149
-static BlockDriver bdrv_virtio_blk_vfio_pci = BLKIO_DRIVER(
150
- DRIVER_VIRTIO_BLK_VFIO_PCI
151
-);
152
+static BlockDriver bdrv_virtio_blk_vfio_pci = {
153
+ .format_name = "virtio-blk-vfio-pci",
154
+ .protocol_name = "virtio-blk-vfio-pci",
155
+ BLKIO_DRIVER_COMMON
156
+};
157
158
-static BlockDriver bdrv_virtio_blk_vhost_user = BLKIO_DRIVER(
159
- DRIVER_VIRTIO_BLK_VHOST_USER
160
-);
161
+static BlockDriver bdrv_virtio_blk_vhost_user = {
162
+ .format_name = "virtio-blk-vhost-user",
163
+ .protocol_name = "virtio-blk-vhost-user",
164
+ BLKIO_DRIVER_COMMON
165
+};
166
167
-static BlockDriver bdrv_virtio_blk_vhost_vdpa = BLKIO_DRIVER(
168
- DRIVER_VIRTIO_BLK_VHOST_VDPA
169
-);
170
+static BlockDriver bdrv_virtio_blk_vhost_vdpa = {
171
+ .format_name = "virtio-blk-vhost-vdpa",
172
+ .protocol_name = "virtio-blk-vhost-vdpa",
173
+ BLKIO_DRIVER_COMMON
174
+};
175
176
static void bdrv_blkio_init(void)
177
{
44
--
178
--
45
2.9.4
179
2.40.1
46
47
diff view generated by jsdifflib