1
The following changes since commit 41feb5b955f0d7c9d071b2c5adbc404ae2895c7a:
1
The following changes since commit a3607def89f9cd68c1b994e1030527df33aa91d0:
2
2
3
Merge remote-tracking branch 'remotes/vivier2/tags/linux-user-for-3.0-pull-request' into staging (2018-06-05 10:38:33 +0100)
3
Update version for v6.2.0-rc4 release (2021-12-07 17:51:38 -0800)
4
4
5
are available in the git repository at:
5
are available in the Git repository at:
6
6
7
git://github.com/codyprime/qemu-kvm-jtc.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 68acc99f143b60ec4faa2903065b187d4d3c4bf3:
9
for you to fetch changes up to cf4fbc3030c974fff726756a7ceef8386cdf500b:
10
10
11
sheepdog: remove huge BSS object (2018-06-05 10:15:12 -0400)
11
block/nvme: fix infinite loop in nvme_free_req_queue_cb() (2021-12-09 09:19:49 +0000)
12
12
13
----------------------------------------------------------------
13
----------------------------------------------------------------
14
Sheepdog patches
14
Pull request
15
16
An infinite loop fix for the userspace NVMe driver.
17
15
----------------------------------------------------------------
18
----------------------------------------------------------------
16
19
17
Paolo Bonzini (2):
20
Stefan Hajnoczi (1):
18
sheepdog: cleanup repeated expression
21
block/nvme: fix infinite loop in nvme_free_req_queue_cb()
19
sheepdog: remove huge BSS object
20
22
21
block/sheepdog.c | 28 +++++++++++++++-------------
23
block/nvme.c | 5 +++--
22
1 file changed, 15 insertions(+), 13 deletions(-)
24
1 file changed, 3 insertions(+), 2 deletions(-)
23
25
24
--
26
--
25
2.13.6
27
2.33.1
26
28
27
29
30
diff view generated by jsdifflib
Deleted patch
1
From: Paolo Bonzini <pbonzini@redhat.com>
2
1
3
The expression "SD_INODE_SIZE - sizeof(inode.data_vdi_id)" already has a macro
4
defined for the same value (though with a nicer definition using offsetof).
5
Replace it.
6
7
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
8
Reviewed-by: Fam Zheng <famz@redhat.com>
9
Reviewed-by: Jeff Cody <jcody@redhat.com>
10
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
11
Message-Id: <20180523160721.14018-2-pbonzini@redhat.com>
12
Signed-off-by: Jeff Cody <jcody@redhat.com>
13
---
14
block/sheepdog.c | 6 +++---
15
1 file changed, 3 insertions(+), 3 deletions(-)
16
17
diff --git a/block/sheepdog.c b/block/sheepdog.c
18
index XXXXXXX..XXXXXXX 100644
19
--- a/block/sheepdog.c
20
+++ b/block/sheepdog.c
21
@@ -XXX,XX +XXX,XX @@ static int sd_truncate(BlockDriverState *bs, int64_t offset,
22
}
23
24
/* we don't need to update entire object */
25
- datalen = SD_INODE_SIZE - sizeof(s->inode.data_vdi_id);
26
+ datalen = SD_INODE_HEADER_SIZE;
27
s->inode.vdi_size = offset;
28
ret = write_object(fd, s->bs, (char *)&s->inode,
29
vid_to_vdi_oid(s->inode.vdi_id), s->inode.nr_copies,
30
@@ -XXX,XX +XXX,XX @@ static int sd_snapshot_create(BlockDriverState *bs, QEMUSnapshotInfo *sn_info)
31
*/
32
strncpy(s->inode.tag, sn_info->name, sizeof(s->inode.tag));
33
/* we don't need to update entire object */
34
- datalen = SD_INODE_SIZE - sizeof(s->inode.data_vdi_id);
35
+ datalen = SD_INODE_HEADER_SIZE;
36
inode = g_malloc(datalen);
37
38
/* refresh inode. */
39
@@ -XXX,XX +XXX,XX @@ static int sd_snapshot_list(BlockDriverState *bs, QEMUSnapshotInfo **psn_tab)
40
/* we don't need to read entire object */
41
ret = read_object(fd, s->bs, (char *)&inode,
42
vid_to_vdi_oid(vid),
43
- 0, SD_INODE_SIZE - sizeof(inode.data_vdi_id), 0,
44
+ 0, SD_INODE_HEADER_SIZE, 0,
45
s->cache_flags);
46
47
if (ret) {
48
--
49
2.13.6
50
51
diff view generated by jsdifflib
1
From: Paolo Bonzini <pbonzini@redhat.com>
1
When the request free list is exhausted the coroutine waits on
2
q->free_req_queue for the next free request. Whenever a request is
3
completed a BH is scheduled to invoke nvme_free_req_queue_cb() and wake
4
up waiting coroutines.
2
5
3
block/sheepdog.o has a 4M static variable that is 90% of QEMU's whole .bss
6
1. nvme_get_free_req() waits for a free request:
4
section. Replace it with a heap-allocated block, and make it smaller too
5
since only the inode header is actually being used.
6
7
7
bss size goes down from 4464280 to 269976.
8
while (q->free_req_head == -1) {
9
...
10
trace_nvme_free_req_queue_wait(q->s, q->index);
11
qemu_co_queue_wait(&q->free_req_queue, &q->lock);
12
...
13
}
8
14
9
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
15
2. nvme_free_req_queue_cb() wakes up the coroutine:
10
Reviewed-by: Jeff Cody <jcody@redhat.com>
16
11
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
17
while (qemu_co_enter_next(&q->free_req_queue, &q->lock)) {
12
Message-Id: <20180523160721.14018-3-pbonzini@redhat.com>
18
^--- infinite loop when free_req_head == -1
13
Signed-off-by: Jeff Cody <jcody@redhat.com>
19
}
20
21
nvme_free_req_queue_cb() and the coroutine form an infinite loop when
22
q->free_req_head == -1. Fix this by checking q->free_req_head in
23
nvme_free_req_queue_cb(). If the free request list is exhausted, don't
24
wake waiting coroutines. Eventually an in-flight request will complete
25
and the BH will be scheduled again, guaranteeing forward progress.
26
27
Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
28
Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com>
29
Message-id: 20211208152246.244585-1-stefanha@redhat.com
30
Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
14
---
31
---
15
block/sheepdog.c | 22 ++++++++++++----------
32
block/nvme.c | 5 +++--
16
1 file changed, 12 insertions(+), 10 deletions(-)
33
1 file changed, 3 insertions(+), 2 deletions(-)
17
34
18
diff --git a/block/sheepdog.c b/block/sheepdog.c
35
diff --git a/block/nvme.c b/block/nvme.c
19
index XXXXXXX..XXXXXXX 100644
36
index XXXXXXX..XXXXXXX 100644
20
--- a/block/sheepdog.c
37
--- a/block/nvme.c
21
+++ b/block/sheepdog.c
38
+++ b/block/nvme.c
22
@@ -XXX,XX +XXX,XX @@ static int sd_snapshot_list(BlockDriverState *bs, QEMUSnapshotInfo **psn_tab)
39
@@ -XXX,XX +XXX,XX @@ static void nvme_free_req_queue_cb(void *opaque)
23
QEMUSnapshotInfo *sn_tab = NULL;
40
NVMeQueuePair *q = opaque;
24
unsigned wlen, rlen;
41
25
int found = 0;
42
qemu_mutex_lock(&q->lock);
26
- static SheepdogInode inode;
43
- while (qemu_co_enter_next(&q->free_req_queue, &q->lock)) {
27
+ SheepdogInode *inode;
44
- /* Retry all pending requests */
28
unsigned long *vdi_inuse;
45
+ while (q->free_req_head != -1 &&
29
unsigned int start_nr;
46
+ qemu_co_enter_next(&q->free_req_queue, &q->lock)) {
30
uint64_t hval;
47
+ /* Retry waiting requests */
31
uint32_t vid;
32
33
vdi_inuse = g_malloc(max);
34
+ inode = g_malloc(SD_INODE_HEADER_SIZE);
35
36
fd = connect_to_sdog(s, &local_err);
37
if (fd < 0) {
38
@@ -XXX,XX +XXX,XX @@ static int sd_snapshot_list(BlockDriverState *bs, QEMUSnapshotInfo **psn_tab)
39
}
40
41
/* we don't need to read entire object */
42
- ret = read_object(fd, s->bs, (char *)&inode,
43
+ ret = read_object(fd, s->bs, (char *)inode,
44
vid_to_vdi_oid(vid),
45
0, SD_INODE_HEADER_SIZE, 0,
46
s->cache_flags);
47
@@ -XXX,XX +XXX,XX @@ static int sd_snapshot_list(BlockDriverState *bs, QEMUSnapshotInfo **psn_tab)
48
continue;
49
}
50
51
- if (!strcmp(inode.name, s->name) && is_snapshot(&inode)) {
52
- sn_tab[found].date_sec = inode.snap_ctime >> 32;
53
- sn_tab[found].date_nsec = inode.snap_ctime & 0xffffffff;
54
- sn_tab[found].vm_state_size = inode.vm_state_size;
55
- sn_tab[found].vm_clock_nsec = inode.vm_clock_nsec;
56
+ if (!strcmp(inode->name, s->name) && is_snapshot(inode)) {
57
+ sn_tab[found].date_sec = inode->snap_ctime >> 32;
58
+ sn_tab[found].date_nsec = inode->snap_ctime & 0xffffffff;
59
+ sn_tab[found].vm_state_size = inode->vm_state_size;
60
+ sn_tab[found].vm_clock_nsec = inode->vm_clock_nsec;
61
62
snprintf(sn_tab[found].id_str, sizeof(sn_tab[found].id_str),
63
- "%" PRIu32, inode.snap_id);
64
+ "%" PRIu32, inode->snap_id);
65
pstrcpy(sn_tab[found].name,
66
- MIN(sizeof(sn_tab[found].name), sizeof(inode.tag)),
67
- inode.tag);
68
+ MIN(sizeof(sn_tab[found].name), sizeof(inode->tag)),
69
+ inode->tag);
70
found++;
71
}
72
}
48
}
73
@@ -XXX,XX +XXX,XX @@ out:
49
qemu_mutex_unlock(&q->lock);
74
*psn_tab = sn_tab;
50
}
75
76
g_free(vdi_inuse);
77
+ g_free(inode);
78
79
if (ret < 0) {
80
return ret;
81
--
51
--
82
2.13.6
52
2.33.1
83
53
84
54
diff view generated by jsdifflib