Merge tag 'pull-glibc-20251216' of https://github.com/legoater/qemu into staging Fix const qualifier build errors with recent glibc # -----BEGIN PGP SIGNATURE----- # # iQIzBAABCAAdFiEEoPZlSPBIlev+awtgUaNDx8/77KEFAmlBXyEACgkQUaNDx8/7 # 7KHemxAAjOKuYG7LCZv6iPd0ezgErAyKuIDstgNn4x3KKA75sfEMJZINwLBaTXcy # l/DWOoZP3s9ciMJTBY1JdgkbVJ1LDDsf94rTUbZoNjrOocNSXypHNpVbYxuw3Ntf # vBhQ8gOdR62Ny/2ndmF525L0ir0pGd9lgy9I9fnZ2xQO6QxklInaJjfw8In0+l+t # mf1sUW8ltSWZs1tWpGaEUKnEyxs2iFYP83yvPSs1O0WAgPSBqPkLIkHp+QJJcdUV # f5IPfXPWrbgbjkSLyo8EbYwmegTHcXdSEvQxOm3hnSN+0HCMd5oTNcKbjdTaTcgk # DaUl39PJ09CB24orNMXEZakD7p3lFBVB5Yfr87dDujILTtpPtKAVZMt+X/b0chqj # g43L3m5pqu34zMWvGDOSgU+8azip11Wy4MG/yWsgMKVXMAPBf3oOunZVkQY/dqeI # eqX1Hvh7qXHcinuZKAKBefPUqKyoaOKDk3PtUVjW1p4iLC3f5MMOl4SKe8R/hKoe # xRz+SAcS8TJgrcnaKm1mMUDnqXorHb0IxUYCc/i0CVNJsVclmGI5rwLRMwEDAIIy # GOfMHMFUhtFzhVC+tbIcAe8QDnrzR6hvxBvEeunZ/lZtTjtlSPyZklRqKEpXjU4i # ME1Vj6wRIpI9jb5fcJCFy+ZTxQ94c8T8mHsXMfTSWcZzUlFC1/s= # =rEBR # -----END PGP SIGNATURE----- # gpg: Signature made Wed 17 Dec 2025 12:31:13 AM AEDT # gpg: using RSA key A0F66548F04895EBFE6B0B6051A343C7CFFBECA1 # gpg: Good signature from "Cédric Le Goater <clg@redhat.com>" [full] # gpg: aka "Cédric Le Goater <clg@kaod.org>" [full] * tag 'pull-glibc-20251216' of https://github.com/legoater/qemu: gdbstub: Fix const qualifier build errors with recent glibc monitor: Fix const qualifier build errors with recent glibc tests/vhost-user-bridge.c: Fix const qualifier build errors with recent glibc i386: Fix const qualifier build errors with recent glibc Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
diff --git a/block/nvme.c b/block/nvme.c index 919e14c..c3d3b99 100644 --- a/block/nvme.c +++ b/block/nvme.c
@@ -1200,36 +1200,26 @@ typedef struct { Coroutine *co; - bool skip_yield; int ret; + AioContext *ctx; } NVMeCoData; +static void nvme_rw_cb_bh(void *opaque) +{ + NVMeCoData *data = opaque; + qemu_coroutine_enter(data->co); +} + /* Put into NVMeRequest.cb, so runs in the BDS's main AioContext */ static void nvme_rw_cb(void *opaque, int ret) { NVMeCoData *data = opaque; - data->ret = ret; - - if (data->co == qemu_coroutine_self()) { - /* - * Fast path: We are inside of the request coroutine (through - * nvme_submit_command, nvme_deferred_fn, nvme_process_completion). - * We can set data->skip_yield here to keep the coroutine from - * yielding, and then we don't need to schedule a BH to wake it. - */ - data->skip_yield = true; - } else { - /* - * Safe to call: The case where we run in the request coroutine is - * handled above, so we must be independent of it; and without - * skip_yield set, the coroutine will yield. - * No need to release NVMeQueuePair.lock (we are called without it - * held). (Note: If we enter the coroutine here, @data will - * probably be dangling once aio_co_wake() returns.) - */ - aio_co_wake(data->co); + if (!data->co) { + /* The rw coroutine hasn't yielded, don't try to enter. */ + return; } + replay_bh_schedule_oneshot_event(data->ctx, nvme_rw_cb_bh, data); } static coroutine_fn int nvme_co_prw_aligned(BlockDriverState *bs, @@ -1253,7 +1243,7 @@ .cdw12 = cpu_to_le32(cdw12), }; NVMeCoData data = { - .co = qemu_coroutine_self(), + .ctx = bdrv_get_aio_context(bs), .ret = -EINPROGRESS, }; @@ -1270,7 +1260,9 @@ return r; } nvme_submit_command(ioq, req, &cmd, nvme_rw_cb, &data); - if (!data.skip_yield) { + + data.co = qemu_coroutine_self(); + while (data.ret == -EINPROGRESS) { qemu_coroutine_yield(); } @@ -1366,7 +1358,7 @@ .nsid = cpu_to_le32(s->nsid), }; NVMeCoData data = { - .co = qemu_coroutine_self(), + .ctx = bdrv_get_aio_context(bs), .ret = -EINPROGRESS, }; @@ -1374,7 +1366,9 @@ req = nvme_get_free_req(ioq); assert(req); nvme_submit_command(ioq, req, &cmd, nvme_rw_cb, &data); - if (!data.skip_yield) { + + data.co = qemu_coroutine_self(); + if (data.ret == -EINPROGRESS) { qemu_coroutine_yield(); } @@ -1415,7 +1409,7 @@ }; NVMeCoData data = { - .co = qemu_coroutine_self(), + .ctx = bdrv_get_aio_context(bs), .ret = -EINPROGRESS, }; @@ -1435,7 +1429,9 @@ assert(req); nvme_submit_command(ioq, req, &cmd, nvme_rw_cb, &data); - if (!data.skip_yield) { + + data.co = qemu_coroutine_self(); + while (data.ret == -EINPROGRESS) { qemu_coroutine_yield(); } @@ -1463,7 +1459,7 @@ }; NVMeCoData data = { - .co = qemu_coroutine_self(), + .ctx = bdrv_get_aio_context(bs), .ret = -EINPROGRESS, }; @@ -1508,7 +1504,9 @@ trace_nvme_dsm(s, offset, bytes); nvme_submit_command(ioq, req, &cmd, nvme_rw_cb, &data); - if (!data.skip_yield) { + + data.co = qemu_coroutine_self(); + while (data.ret == -EINPROGRESS) { qemu_coroutine_yield(); }
diff --git a/blockdev.c b/blockdev.c index dbd1d4d..6e86c62 100644 --- a/blockdev.c +++ b/blockdev.c
@@ -686,6 +686,7 @@ GLOBAL_STATE_CODE(); QTAILQ_FOREACH_SAFE(bs, &monitor_bdrv_states, monitor_list, next_bs) { + QTAILQ_REMOVE(&monitor_bdrv_states, bs, monitor_list); bdrv_unref(bs); } }
diff --git a/tests/qemu-iotests/common.rc b/tests/qemu-iotests/common.rc index 10d83d8..c0f8f0f 100644 --- a/tests/qemu-iotests/common.rc +++ b/tests/qemu-iotests/common.rc
@@ -1008,7 +1008,7 @@ else FILENAME="$TEST_IMG_FILE" fi - if [ -e "FILENAME" ]; then + if [ -e "$FILENAME" ]; then echo "unwilling to overwrite existing file" exit 1 fi