1
The following changes since commit ecc1f5adeec4e3324d1b695a7c54e3967c526949:
1
The following changes since commit 6c769690ac845fa62642a5f93b4e4bd906adab95:
2
2
3
maintainers: Add myself as linux-user reviewer (2017-05-11 13:31:11 -0400)
3
Merge remote-tracking branch 'remotes/vsementsov/tags/pull-simplebench-2021-05-04' into staging (2021-05-21 12:02:34 +0100)
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 321d1dba8bef9676a77e9399484e3cd8bf2cf16a:
9
for you to fetch changes up to 0a6f0c76a030710780ce10d6347a70f098024d21:
10
10
11
aio: add missing aio_notify() to aio_enable_external() (2017-05-12 10:36:46 -0400)
11
coroutine-sleep: introduce qemu_co_sleep (2021-05-21 18:22:33 +0100)
12
13
----------------------------------------------------------------
14
Pull request
12
15
13
----------------------------------------------------------------
16
----------------------------------------------------------------
14
17
15
----------------------------------------------------------------
18
Paolo Bonzini (6):
19
coroutine-sleep: use a stack-allocated timer
20
coroutine-sleep: disallow NULL QemuCoSleepState** argument
21
coroutine-sleep: allow qemu_co_sleep_wake that wakes nothing
22
coroutine-sleep: move timer out of QemuCoSleepState
23
coroutine-sleep: replace QemuCoSleepState pointer with struct in the
24
API
25
coroutine-sleep: introduce qemu_co_sleep
16
26
17
Daniel P. Berrange (1):
27
Philippe Mathieu-Daudé (1):
18
coroutine: remove GThread implementation
28
bitops.h: Improve find_xxx_bit() documentation
19
29
20
Eric Blake (1):
30
Zenghui Yu (1):
21
block: Simplify BDRV_BLOCK_RAW recursion
31
multi-process: Initialize variables declared with g_auto*
22
32
23
Stefan Hajnoczi (1):
33
include/qemu/bitops.h | 15 ++++++--
24
aio: add missing aio_notify() to aio_enable_external()
34
include/qemu/coroutine.h | 27 ++++++++-----
25
35
block/block-copy.c | 10 ++---
26
configure | 19 ++---
36
block/nbd.c | 14 +++----
27
include/block/aio.h | 10 ++-
37
hw/remote/memory.c | 5 +--
28
block/io.c | 4 +-
38
hw/remote/proxy.c | 3 +-
29
util/coroutine-gthread.c | 198 -----------------------------------------------
39
util/qemu-coroutine-sleep.c | 75 +++++++++++++++++++------------------
30
.travis.yml | 5 +-
40
7 files changed, 79 insertions(+), 70 deletions(-)
31
5 files changed, 16 insertions(+), 220 deletions(-)
32
delete mode 100644 util/coroutine-gthread.c
33
41
34
--
42
--
35
2.9.3
43
2.31.1
36
44
37
diff view generated by jsdifflib
Deleted patch
1
From: "Daniel P. Berrange" <berrange@redhat.com>
2
1
3
The GThread implementation is not functional enough to actually
4
run QEMU reliably. While it was potentially useful for debugging,
5
we have a scripts/qemugdb/coroutine.py to enable tracing of
6
ucontext coroutines in GDB, so that removes the only reason for
7
GThread to exist.
8
9
Signed-off-by: Daniel P. Berrange <berrange@redhat.com>
10
Acked-by: Alex Bennée <alex.bennee@linaro.org>
11
Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
12
---
13
configure | 19 ++---
14
util/coroutine-gthread.c | 198 -----------------------------------------------
15
.travis.yml | 5 +-
16
3 files changed, 6 insertions(+), 216 deletions(-)
17
delete mode 100644 util/coroutine-gthread.c
18
19
diff --git a/configure b/configure
20
index XXXXXXX..XXXXXXX 100755
21
--- a/configure
22
+++ b/configure
23
@@ -XXX,XX +XXX,XX @@ Advanced options (experts only):
24
--oss-lib path to OSS library
25
--cpu=CPU Build for host CPU [$cpu]
26
--with-coroutine=BACKEND coroutine backend. Supported options:
27
- gthread, ucontext, sigaltstack, windows
28
+ ucontext, sigaltstack, windows
29
--enable-gcov enable test coverage analysis with gcov
30
--gcov=GCOV use specified gcov [$gcov_tool]
31
--disable-blobs disable installing provided firmware blobs
32
@@ -XXX,XX +XXX,XX @@ fi
33
# check and set a backend for coroutine
34
35
# We prefer ucontext, but it's not always possible. The fallback
36
-# is sigcontext. gthread is not selectable except explicitly, because
37
-# it is not functional enough to run QEMU proper. (It is occasionally
38
-# useful for debugging purposes.) On Windows the only valid backend
39
-# is the Windows-specific one.
40
+# is sigcontext. On Windows the only valid backend is the Windows
41
+# specific one.
42
43
ucontext_works=no
44
if test "$darwin" != "yes"; then
45
@@ -XXX,XX +XXX,XX @@ else
46
feature_not_found "ucontext"
47
fi
48
;;
49
- gthread|sigaltstack)
50
+ sigaltstack)
51
if test "$mingw32" = "yes"; then
52
error_exit "only the 'windows' coroutine backend is valid for Windows"
53
fi
54
@@ -XXX,XX +XXX,XX @@ else
55
fi
56
57
if test "$coroutine_pool" = ""; then
58
- if test "$coroutine" = "gthread"; then
59
- coroutine_pool=no
60
- else
61
- coroutine_pool=yes
62
- fi
63
-fi
64
-if test "$coroutine" = "gthread" -a "$coroutine_pool" = "yes"; then
65
- error_exit "'gthread' coroutine backend does not support pool (use --disable-coroutine-pool)"
66
+ coroutine_pool=yes
67
fi
68
69
if test "$debug_stack_usage" = "yes"; then
70
diff --git a/util/coroutine-gthread.c b/util/coroutine-gthread.c
71
deleted file mode 100644
72
index XXXXXXX..XXXXXXX
73
--- a/util/coroutine-gthread.c
74
+++ /dev/null
75
@@ -XXX,XX +XXX,XX @@
76
-/*
77
- * GThread coroutine initialization code
78
- *
79
- * Copyright (C) 2006 Anthony Liguori <anthony@codemonkey.ws>
80
- * Copyright (C) 2011 Aneesh Kumar K.V <aneesh.kumar@linux.vnet.ibm.com>
81
- *
82
- * This library is free software; you can redistribute it and/or
83
- * modify it under the terms of the GNU Lesser General Public
84
- * License as published by the Free Software Foundation; either
85
- * version 2.0 of the License, or (at your option) any later version.
86
- *
87
- * This library is distributed in the hope that it will be useful,
88
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
89
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
90
- * Lesser General Public License for more details.
91
- *
92
- * You should have received a copy of the GNU Lesser General Public
93
- * License along with this library; if not, see <http://www.gnu.org/licenses/>.
94
- */
95
-
96
-#include "qemu/osdep.h"
97
-#include "qemu-common.h"
98
-#include "qemu/coroutine_int.h"
99
-
100
-typedef struct {
101
- Coroutine base;
102
- GThread *thread;
103
- bool runnable;
104
- bool free_on_thread_exit;
105
- CoroutineAction action;
106
-} CoroutineGThread;
107
-
108
-static CompatGMutex coroutine_lock;
109
-static CompatGCond coroutine_cond;
110
-
111
-/* GLib 2.31 and beyond deprecated various parts of the thread API,
112
- * but the new interfaces are not available in older GLib versions
113
- * so we have to cope with both.
114
- */
115
-#if GLIB_CHECK_VERSION(2, 31, 0)
116
-/* Awkwardly, the GPrivate API doesn't provide a way to update the
117
- * GDestroyNotify handler for the coroutine key dynamically. So instead
118
- * we track whether or not the CoroutineGThread should be freed on
119
- * thread exit / coroutine key update using the free_on_thread_exit
120
- * field.
121
- */
122
-static void coroutine_destroy_notify(gpointer data)
123
-{
124
- CoroutineGThread *co = data;
125
- if (co && co->free_on_thread_exit) {
126
- g_free(co);
127
- }
128
-}
129
-
130
-static GPrivate coroutine_key = G_PRIVATE_INIT(coroutine_destroy_notify);
131
-
132
-static inline CoroutineGThread *get_coroutine_key(void)
133
-{
134
- return g_private_get(&coroutine_key);
135
-}
136
-
137
-static inline void set_coroutine_key(CoroutineGThread *co,
138
- bool free_on_thread_exit)
139
-{
140
- /* Unlike g_static_private_set() this does not call the GDestroyNotify
141
- * if the previous value of the key was NULL. Fortunately we only need
142
- * the GDestroyNotify in the non-NULL key case.
143
- */
144
- co->free_on_thread_exit = free_on_thread_exit;
145
- g_private_replace(&coroutine_key, co);
146
-}
147
-
148
-static inline GThread *create_thread(GThreadFunc func, gpointer data)
149
-{
150
- return g_thread_new("coroutine", func, data);
151
-}
152
-
153
-#else
154
-
155
-/* Handle older GLib versions */
156
-
157
-static GStaticPrivate coroutine_key = G_STATIC_PRIVATE_INIT;
158
-
159
-static inline CoroutineGThread *get_coroutine_key(void)
160
-{
161
- return g_static_private_get(&coroutine_key);
162
-}
163
-
164
-static inline void set_coroutine_key(CoroutineGThread *co,
165
- bool free_on_thread_exit)
166
-{
167
- g_static_private_set(&coroutine_key, co,
168
- free_on_thread_exit ? (GDestroyNotify)g_free : NULL);
169
-}
170
-
171
-static inline GThread *create_thread(GThreadFunc func, gpointer data)
172
-{
173
- return g_thread_create_full(func, data, 0, TRUE, TRUE,
174
- G_THREAD_PRIORITY_NORMAL, NULL);
175
-}
176
-
177
-#endif
178
-
179
-
180
-static void __attribute__((constructor)) coroutine_init(void)
181
-{
182
-#if !GLIB_CHECK_VERSION(2, 31, 0)
183
- if (!g_thread_supported()) {
184
- g_thread_init(NULL);
185
- }
186
-#endif
187
-}
188
-
189
-static void coroutine_wait_runnable_locked(CoroutineGThread *co)
190
-{
191
- while (!co->runnable) {
192
- g_cond_wait(&coroutine_cond, &coroutine_lock);
193
- }
194
-}
195
-
196
-static void coroutine_wait_runnable(CoroutineGThread *co)
197
-{
198
- g_mutex_lock(&coroutine_lock);
199
- coroutine_wait_runnable_locked(co);
200
- g_mutex_unlock(&coroutine_lock);
201
-}
202
-
203
-static gpointer coroutine_thread(gpointer opaque)
204
-{
205
- CoroutineGThread *co = opaque;
206
-
207
- set_coroutine_key(co, false);
208
- coroutine_wait_runnable(co);
209
- co->base.entry(co->base.entry_arg);
210
- qemu_coroutine_switch(&co->base, co->base.caller, COROUTINE_TERMINATE);
211
- return NULL;
212
-}
213
-
214
-Coroutine *qemu_coroutine_new(void)
215
-{
216
- CoroutineGThread *co;
217
-
218
- co = g_malloc0(sizeof(*co));
219
- co->thread = create_thread(coroutine_thread, co);
220
- if (!co->thread) {
221
- g_free(co);
222
- return NULL;
223
- }
224
- return &co->base;
225
-}
226
-
227
-void qemu_coroutine_delete(Coroutine *co_)
228
-{
229
- CoroutineGThread *co = DO_UPCAST(CoroutineGThread, base, co_);
230
-
231
- g_thread_join(co->thread);
232
- g_free(co);
233
-}
234
-
235
-CoroutineAction qemu_coroutine_switch(Coroutine *from_,
236
- Coroutine *to_,
237
- CoroutineAction action)
238
-{
239
- CoroutineGThread *from = DO_UPCAST(CoroutineGThread, base, from_);
240
- CoroutineGThread *to = DO_UPCAST(CoroutineGThread, base, to_);
241
-
242
- g_mutex_lock(&coroutine_lock);
243
- from->runnable = false;
244
- from->action = action;
245
- to->runnable = true;
246
- to->action = action;
247
- g_cond_broadcast(&coroutine_cond);
248
-
249
- if (action != COROUTINE_TERMINATE) {
250
- coroutine_wait_runnable_locked(from);
251
- }
252
- g_mutex_unlock(&coroutine_lock);
253
- return from->action;
254
-}
255
-
256
-Coroutine *qemu_coroutine_self(void)
257
-{
258
- CoroutineGThread *co = get_coroutine_key();
259
- if (!co) {
260
- co = g_malloc0(sizeof(*co));
261
- co->runnable = true;
262
- set_coroutine_key(co, true);
263
- }
264
-
265
- return &co->base;
266
-}
267
-
268
-bool qemu_in_coroutine(void)
269
-{
270
- CoroutineGThread *co = get_coroutine_key();
271
-
272
- return co && co->base.caller;
273
-}
274
diff --git a/.travis.yml b/.travis.yml
275
index XXXXXXX..XXXXXXX 100644
276
--- a/.travis.yml
277
+++ b/.travis.yml
278
@@ -XXX,XX +XXX,XX @@ matrix:
279
- env: CONFIG="--enable-trace-backends=ust"
280
TEST_CMD=""
281
compiler: gcc
282
- - env: CONFIG="--with-coroutine=gthread"
283
- TEST_CMD=""
284
- compiler: gcc
285
- env: CONFIG=""
286
os: osx
287
compiler: clang
288
@@ -XXX,XX +XXX,XX @@ matrix:
289
compiler: none
290
env:
291
- COMPILER_NAME=gcc CXX=g++-5 CC=gcc-5
292
- - CONFIG="--cc=gcc-5 --cxx=g++-5 --disable-pie --disable-linux-user --with-coroutine=gthread"
293
+ - CONFIG="--cc=gcc-5 --cxx=g++-5 --disable-pie --disable-linux-user"
294
- TEST_CMD=""
295
before_script:
296
- ./configure ${CONFIG} --extra-cflags="-g3 -O0 -fsanitize=thread -fuse-ld=gold" || cat config.log
297
--
298
2.9.3
299
300
diff view generated by jsdifflib
Deleted patch
1
From: Eric Blake <eblake@redhat.com>
2
1
3
Since we are already in coroutine context during the body of
4
bdrv_co_get_block_status(), we can shave off a few layers of
5
wrappers when recursing to query the protocol when a format driver
6
returned BDRV_BLOCK_RAW.
7
8
Note that we are already using the correct recursion later on in
9
the same function, when probing whether the protocol layer is sparse
10
in order to find out if we can add BDRV_BLOCK_ZERO to an existing
11
BDRV_BLOCK_DATA|BDRV_BLOCK_OFFSET_VALID.
12
13
Signed-off-by: Eric Blake <eblake@redhat.com>
14
Reviewed-by: Max Reitz <mreitz@redhat.com>
15
Reviewed-by: Fam Zheng <famz@redhat.com>
16
Message-id: 20170504173745.27414-1-eblake@redhat.com
17
Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
18
---
19
block/io.c | 4 ++--
20
1 file changed, 2 insertions(+), 2 deletions(-)
21
22
diff --git a/block/io.c b/block/io.c
23
index XXXXXXX..XXXXXXX 100644
24
--- a/block/io.c
25
+++ b/block/io.c
26
@@ -XXX,XX +XXX,XX @@ static int64_t coroutine_fn bdrv_co_get_block_status(BlockDriverState *bs,
27
28
if (ret & BDRV_BLOCK_RAW) {
29
assert(ret & BDRV_BLOCK_OFFSET_VALID);
30
- ret = bdrv_get_block_status(*file, ret >> BDRV_SECTOR_BITS,
31
- *pnum, pnum, file);
32
+ ret = bdrv_co_get_block_status(*file, ret >> BDRV_SECTOR_BITS,
33
+ *pnum, pnum, file);
34
goto out;
35
}
36
37
--
38
2.9.3
39
40
diff view generated by jsdifflib
1
The main loop uses aio_disable_external()/aio_enable_external() to
1
From: Zenghui Yu <yuzenghui@huawei.com>
2
temporarily disable processing of external AioContext clients like
3
device emulation.
4
2
5
This allows monitor commands to quiesce I/O and prevent the guest from
3
Quote docs/devel/style.rst (section "Automatic memory deallocation"):
6
submitting new requests while a monitor command is in progress.
7
4
8
The aio_enable_external() API is currently broken when an IOThread is in
5
* Variables declared with g_auto* MUST always be initialized,
9
aio_poll() waiting for fd activity when the main loop re-enables
6
otherwise the cleanup function will use uninitialized stack memory
10
external clients. Incrementing ctx->external_disable_cnt does not wake
11
the IOThread from ppoll(2) so fd processing remains suspended and leads
12
to unresponsive emulated devices.
13
7
14
This patch adds an aio_notify() call to aio_enable_external() so the
8
Initialize @name properly to get rid of the compilation error (using
15
IOThread is kicked out of ppoll(2) and will re-arm the file descriptors.
9
gcc-7.3.0 on CentOS):
16
10
17
The bug can be reproduced as follows:
11
../hw/remote/proxy.c: In function 'pci_proxy_dev_realize':
12
/usr/include/glib-2.0/glib/glib-autocleanups.h:28:3: error: 'name' may be used uninitialized in this function [-Werror=maybe-uninitialized]
13
g_free (*pp);
14
^~~~~~~~~~~~
15
../hw/remote/proxy.c:350:30: note: 'name' was declared here
16
g_autofree char *name;
17
^~~~
18
18
19
$ qemu -M accel=kvm -m 1024 \
19
Signed-off-by: Zenghui Yu <yuzenghui@huawei.com>
20
-object iothread,id=iothread0 \
20
Reviewed-by: Jagannathan Raman <jag.raman@oracle.com>
21
-device virtio-scsi-pci,iothread=iothread0,id=virtio-scsi-pci0 \
21
Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com>
22
-drive if=none,id=drive0,aio=native,cache=none,format=raw,file=test.img \
22
Reviewed-by: Miroslav Rezanina <mrezanin@redhat.com>
23
-device scsi-hd,id=scsi-hd0,drive=drive0 \
23
Message-id: 20210312112143.1369-1-yuzenghui@huawei.com
24
-qmp tcp::5555,server,nowait
25
26
$ scripts/qmp/qmp-shell localhost:5555
27
(qemu) blockdev-snapshot-sync device=drive0 snapshot-file=sn1.qcow2
28
mode=absolute-paths format=qcow2
29
30
After blockdev-snapshot-sync completes the SCSI disk will be
31
unresponsive. This leads to request timeouts inside the guest.
32
33
Reported-by: Qianqian Zhu <qizhu@redhat.com>
34
Reviewed-by: Fam Zheng <famz@redhat.com>
35
Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
36
Message-id: 20170508180705.20609-1-stefanha@redhat.com
37
Suggested-by: Fam Zheng <famz@redhat.com>
38
Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
24
Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
39
---
25
---
40
include/block/aio.h | 10 ++++++++--
26
hw/remote/memory.c | 5 ++---
41
1 file changed, 8 insertions(+), 2 deletions(-)
27
hw/remote/proxy.c | 3 +--
28
2 files changed, 3 insertions(+), 5 deletions(-)
42
29
43
diff --git a/include/block/aio.h b/include/block/aio.h
30
diff --git a/hw/remote/memory.c b/hw/remote/memory.c
44
index XXXXXXX..XXXXXXX 100644
31
index XXXXXXX..XXXXXXX 100644
45
--- a/include/block/aio.h
32
--- a/hw/remote/memory.c
46
+++ b/include/block/aio.h
33
+++ b/hw/remote/memory.c
47
@@ -XXX,XX +XXX,XX @@ static inline void aio_disable_external(AioContext *ctx)
34
@@ -XXX,XX +XXX,XX @@ void remote_sysmem_reconfig(MPQemuMsg *msg, Error **errp)
48
*/
35
49
static inline void aio_enable_external(AioContext *ctx)
36
remote_sysmem_reset();
50
{
37
51
- assert(ctx->external_disable_cnt > 0);
38
- for (region = 0; region < msg->num_fds; region++) {
52
- atomic_dec(&ctx->external_disable_cnt);
39
- g_autofree char *name;
53
+ int old;
40
+ for (region = 0; region < msg->num_fds; region++, suffix++) {
54
+
41
+ g_autofree char *name = g_strdup_printf("remote-mem-%u", suffix);
55
+ old = atomic_fetch_dec(&ctx->external_disable_cnt);
42
subregion = g_new(MemoryRegion, 1);
56
+ assert(old > 0);
43
- name = g_strdup_printf("remote-mem-%u", suffix++);
57
+ if (old == 1) {
44
memory_region_init_ram_from_fd(subregion, NULL,
58
+ /* Kick event loop so it re-arms file descriptors */
45
name, sysmem_info->sizes[region],
59
+ aio_notify(ctx);
46
true, msg->fds[region],
60
+ }
47
diff --git a/hw/remote/proxy.c b/hw/remote/proxy.c
61
}
48
index XXXXXXX..XXXXXXX 100644
62
49
--- a/hw/remote/proxy.c
63
/**
50
+++ b/hw/remote/proxy.c
51
@@ -XXX,XX +XXX,XX @@ static void probe_pci_info(PCIDevice *dev, Error **errp)
52
PCI_BASE_ADDRESS_SPACE_IO : PCI_BASE_ADDRESS_SPACE_MEMORY;
53
54
if (size) {
55
- g_autofree char *name;
56
+ g_autofree char *name = g_strdup_printf("bar-region-%d", i);
57
pdev->region[i].dev = pdev;
58
pdev->region[i].present = true;
59
if (type == PCI_BASE_ADDRESS_SPACE_MEMORY) {
60
pdev->region[i].memory = true;
61
}
62
- name = g_strdup_printf("bar-region-%d", i);
63
memory_region_init_io(&pdev->region[i].mr, OBJECT(pdev),
64
&proxy_mr_ops, &pdev->region[i],
65
name, size);
64
--
66
--
65
2.9.3
67
2.31.1
66
68
67
diff view generated by jsdifflib