- vdpa-dev: Fix initialisation order to restore VDUSE compatibility - tcg: Allow top bit of SIMD_DATA_BITS to be set in simd_desc() - migration: fix-possible-int-overflow - target/m68k: Map FPU exceptions to FPSR register - qemu-options: Fix CXL Fixed Memory Window interleave-granularity typo - hvf: arm: Fix encodings for ID_AA64PFR1_EL1 and debug System registers - hw/intc/arm_gic: Fix handling of NS view of GICC_APR<n> - qio: Inherit follow_coroutine_ctx across TLS - target/riscv: Fix the element agnostic function problem - accel/tcg: Fix typo causing tb->page_addr[1] to not be recorded - tcg/loongarch64: Fix tcg_out_movi vs some pcrel pointers - migration: Fix file migration with fdset - ui/vnc: don't return an empty SASL mechlist to the client - target/arm: Fix FJCVTZS vs flush-to-zero - hw/ppc/e500: Prefer QOM cast - sphinx/qapidoc: Fix to generate doc for explicit, unboxed arguments - hw/ppc/e500: Remove unused "irqs" parameter - hw/ppc/e500: Add missing device tree properties to i2c controller node - hw/i386/amd_iommu: Don't leak memory in amdvi_update_iotlb() - hw/arm/mps2-tz.c: fix RX/TX interrupts order - target/i386: csv: Add support to migrate the incoming context for CSV3 guest - target/i386: csv: Add support to migrate the outgoing context for CSV3 guest - target/i386: csv: Add support to migrate the incoming page for CSV3 guest - target/i386: csv: Add support to migrate the outgoing page for CSV3 guest - linux-headers: update kernel headers to include CSV3 migration cmds - vfio: Only map shared region for CSV3 virtual machine - vga: Force full update for CSV3 guest - target/i386: csv: Load initial image to private memory for CSV3 guest - target/i386: csv: Do not register/unregister guest secure memory for CSV3 guest - target/i386: cpu: Populate CPUID 0x8000_001F when CSV3 is active - target/i386: csv: Add command to load vmcb to CSV3 guest memory - target/i386: csv: Add command to load data to CSV3 guest memory - target/i386: csv: Add command to initialize CSV3 context - target/i386: csv: Add CSV3 context - next-kbd: convert to use qemu_input_handler_register() - qemu/bswap: Undefine CPU_CONVERT() once done - exec/memop: Remove unused memop_big_endian() helper - hw/nvme: fix handling of over-committed queues - 9pfs: fix crash on 'Treaddir' request - hw/misc/psp: Pin the hugepage memory specified by mem2 during use for psp - hw/misc: support tkm use mem2 memory - hw/i386: add mem2 option for qemu - kvm: add support for guest physical bits - target/i386: add guest-phys-bits cpu property Signed-off-by: Jiabo Feng <fengjiabo1@huawei.com> (cherry picked from commit f45f35e88509a4ffa9f62332ee9601e9fe1f8d09)
122 lines
4.4 KiB
Diff
122 lines
4.4 KiB
Diff
From 4dccc6603af2cd3deefb6ac94c3e7aec4b60485d Mon Sep 17 00:00:00 2001
|
|
From: Eric Blake <eblake@redhat.com>
|
|
Date: Fri, 17 May 2024 21:50:14 -0500
|
|
Subject: [PATCH] qio: Inherit follow_coroutine_ctx across TLS
|
|
MIME-Version: 1.0
|
|
Content-Type: text/plain; charset=UTF-8
|
|
Content-Transfer-Encoding: 8bit
|
|
|
|
Since qemu 8.2, the combination of NBD + TLS + iothread crashes on an
|
|
assertion failure:
|
|
|
|
qemu-kvm: ../io/channel.c:534: void qio_channel_restart_read(void *): Assertion `qemu_get_current_aio_context() == qemu_coroutine_get_aio_context(co)' failed.
|
|
|
|
It turns out that when we removed AioContext locking, we did so by
|
|
having NBD tell its qio channels that it wanted to opt in to
|
|
qio_channel_set_follow_coroutine_ctx(); but while we opted in on the
|
|
main channel, we did not opt in on the TLS wrapper channel.
|
|
qemu-iotests has coverage of NBD+iothread and NBD+TLS, but apparently
|
|
no coverage of NBD+TLS+iothread, or we would have noticed this
|
|
regression sooner. (I'll add that in the next patch)
|
|
|
|
But while we could manually opt in to the TLS channel in nbd/server.c
|
|
(a one-line change), it is more generic if all qio channels that wrap
|
|
other channels inherit the follow status, in the same way that they
|
|
inherit feature bits.
|
|
|
|
CC: Stefan Hajnoczi <stefanha@redhat.com>
|
|
CC: Daniel P. Berrangé <berrange@redhat.com>
|
|
CC: qemu-stable@nongnu.org
|
|
Fixes: https://issues.redhat.com/browse/RHEL-34786
|
|
Fixes: 06e0f098 ("io: follow coroutine AioContext in qio_channel_yield()", v8.2.0)
|
|
Signed-off-by: Eric Blake <eblake@redhat.com>
|
|
Reviewed-by: Stefan Hajnoczi <stefanha@redhat.com>
|
|
Reviewed-by: Daniel P. Berrangé <berrange@redhat.com>
|
|
Message-ID: <20240518025246.791593-5-eblake@redhat.com>
|
|
(cherry picked from commit 199e84de1c903ba5aa1f7256310bbc4a20dd930b)
|
|
Signed-off-by: zhujun2 <zhujun2_yewu@cmss.chinamobile.com>
|
|
---
|
|
io/channel-tls.c | 26 +++++++++++++++-----------
|
|
io/channel-websock.c | 1 +
|
|
2 files changed, 16 insertions(+), 11 deletions(-)
|
|
|
|
diff --git a/io/channel-tls.c b/io/channel-tls.c
|
|
index 58fe1aceee..a8ad89c3d1 100644
|
|
--- a/io/channel-tls.c
|
|
+++ b/io/channel-tls.c
|
|
@@ -69,37 +69,40 @@ qio_channel_tls_new_server(QIOChannel *master,
|
|
const char *aclname,
|
|
Error **errp)
|
|
{
|
|
- QIOChannelTLS *ioc;
|
|
+ QIOChannelTLS *tioc;
|
|
+ QIOChannel *ioc;
|
|
|
|
- ioc = QIO_CHANNEL_TLS(object_new(TYPE_QIO_CHANNEL_TLS));
|
|
+ tioc = QIO_CHANNEL_TLS(object_new(TYPE_QIO_CHANNEL_TLS));
|
|
+ ioc = QIO_CHANNEL(tioc);
|
|
|
|
- ioc->master = master;
|
|
+ tioc->master = master;
|
|
+ ioc->follow_coroutine_ctx = master->follow_coroutine_ctx;
|
|
if (qio_channel_has_feature(master, QIO_CHANNEL_FEATURE_SHUTDOWN)) {
|
|
- qio_channel_set_feature(QIO_CHANNEL(ioc), QIO_CHANNEL_FEATURE_SHUTDOWN);
|
|
+ qio_channel_set_feature(ioc, QIO_CHANNEL_FEATURE_SHUTDOWN);
|
|
}
|
|
object_ref(OBJECT(master));
|
|
|
|
- ioc->session = qcrypto_tls_session_new(
|
|
+ tioc->session = qcrypto_tls_session_new(
|
|
creds,
|
|
NULL,
|
|
aclname,
|
|
QCRYPTO_TLS_CREDS_ENDPOINT_SERVER,
|
|
errp);
|
|
- if (!ioc->session) {
|
|
+ if (!tioc->session) {
|
|
goto error;
|
|
}
|
|
|
|
qcrypto_tls_session_set_callbacks(
|
|
- ioc->session,
|
|
+ tioc->session,
|
|
qio_channel_tls_write_handler,
|
|
qio_channel_tls_read_handler,
|
|
- ioc);
|
|
+ tioc);
|
|
|
|
- trace_qio_channel_tls_new_server(ioc, master, creds, aclname);
|
|
- return ioc;
|
|
+ trace_qio_channel_tls_new_server(tioc, master, creds, aclname);
|
|
+ return tioc;
|
|
|
|
error:
|
|
- object_unref(OBJECT(ioc));
|
|
+ object_unref(OBJECT(tioc));
|
|
return NULL;
|
|
}
|
|
|
|
@@ -116,6 +119,7 @@ qio_channel_tls_new_client(QIOChannel *master,
|
|
ioc = QIO_CHANNEL(tioc);
|
|
|
|
tioc->master = master;
|
|
+ ioc->follow_coroutine_ctx = master->follow_coroutine_ctx;
|
|
if (qio_channel_has_feature(master, QIO_CHANNEL_FEATURE_SHUTDOWN)) {
|
|
qio_channel_set_feature(ioc, QIO_CHANNEL_FEATURE_SHUTDOWN);
|
|
}
|
|
diff --git a/io/channel-websock.c b/io/channel-websock.c
|
|
index a12acc27cf..de39f0d182 100644
|
|
--- a/io/channel-websock.c
|
|
+++ b/io/channel-websock.c
|
|
@@ -883,6 +883,7 @@ qio_channel_websock_new_server(QIOChannel *master)
|
|
ioc = QIO_CHANNEL(wioc);
|
|
|
|
wioc->master = master;
|
|
+ ioc->follow_coroutine_ctx = master->follow_coroutine_ctx;
|
|
if (qio_channel_has_feature(master, QIO_CHANNEL_FEATURE_SHUTDOWN)) {
|
|
qio_channel_set_feature(ioc, QIO_CHANNEL_FEATURE_SHUTDOWN);
|
|
}
|
|
--
|
|
2.41.0.windows.1
|
|
|