SHA256
1
0
forked from pool/qemu
qemu/coroutine-use-QEMU_DEFINE_STATIC_CO_TLS.patch
Dario Faggioli 5a11d17157 Accepting request 979381 from home:dfaggioli:experimental:Virtualization
- Substantial rework of the spec file:
  * the 'make check' testsuite now runs in the %check section of
    the main package, not in a subpackage
  * switched from %setup to %autosetup
  * rearranged the content in order to minimize the use of %if,
    %ifarch, etc
- Some tests are having issues when run in OBS. They seem to be due to
  race conditions, triggered by resource constraints on the OBS workers.
  Let's disable them for now, while we investigate  and try to fix them.
* Patches added:
  Disable-some-tests-that-have-problems-in.patch
- Revert an upstream commit that add some qtests that are problematic
  for GCC12+LTO
* Patches added:
  Revert-8dcb404bff6d9147765d7dd3e9c849337.patch
- _multibuild: disable the build of qemu-testsuite. We are going
  to run 'make check' as part of the %check phase of the main (qemu)
  package, so we do not need a dedicated build any longer.
- Get rid of downstream patches breaking s390 modules. Replace
  them with the upstream proposed and Acked (but never committed)
  solution (bsc#1199015)
* Patches added:
  modules-generates-per-target-modinfo.patch
  modules-introduces-module_kconfig-direct.patch
* Patches dropped:
  Fix-the-module-building-problem-for-s390.patch
  modules-quick-fix-a-fundamental-error-in.patch
- backport patches for having coroutine work well when LTO is used
* Patches added:
  coroutine-ucontext-use-QEMU_DEFINE_STATI.patch
  coroutine-use-QEMU_DEFINE_STATIC_CO_TLS.patch
  coroutine-win32-use-QEMU_DEFINE_STATIC_C.patch
- seabios: drop patch that changes python in python2. Just
  go to python3 directly.
* Patches dropped:
  seabios-use-python2-explicitly-as-needed.patch
- Make temp dir (for update_git.sh) configurable
- Added new subpackages (audio-dbus, ui-dbus)
- Update to v7.0.0. For full release notese, see:
  * https://wiki.qemu.org/ChangeLog/7.0
  Be sure to also check the following pages:
  * https://qemu-project.gitlab.io/qemu/about/removed-features.html
  * https://qemu-project.gitlab.io/qemu/about/deprecated.html
  Some notable changes:
  * [ARM] The virt board has gained a new control knob to disable passing a RNG seed in the DTB (dtb-kaslr-seed)
  * [ARM] The AST2600 SoC now supports a dummy version of the i3c device
  * [ARM] The virt board can now run guests with KVM on hosts with restricted IPA ranges
  * [ARM] The virt board now supports virtio-mem-pci
  * [ARM] The virt board now supports specifying the guest CPU topology
  * [ARM] On the virt board, we now enable PAuth when using KVM or hvf and the host CPU supports it
  * [RISC-V] Add support for ratified 1.0 Vector extension
  * [RISC-V] Support for the Zve64f and Zve32f extensions
  * [RISC-V] Drop support for draft 0.7.1 Vector extension
  * [RISC-V] Support Zfhmin and Zfh extensions
  * [RISC-V] RISC-V KVM support
  * [RISC-V] Mark Hypervisor extension as non experimental
  * [RISC-V] Enable Hypervisor extension by default
  * [x86] Support for Intel AMX.
  * [PCI/PCIe] Q35: fix PCIe device becoming disabled after migration when ACPI based PCI hotplug is used (6b0969f1ec)
  * [PCI/PCIe] initial bits of SR/IOV support (250346169)
  * [PCI/PCIe] arm/virt: fixed PXB interrupt routing (e609301b45)
  * [PCI/PCIe] arm/virt: support for virtio-mem-pci (b1b87327a9)
  * [virtiofs] Fix for CVE-2022-0358 - behaviour with supplementary groups and SGID directories
  * [virtiofs] Improved security label support
  * [virtiofs] The virtiofsd in qemu is now starting to be deprecated; please start using and contributing to Rust virtiofsd
  * Patches Added:
    intc-exynos4210_gic-replace-snprintf-wit.patch
  * Patches dropped:
    Python-aqmp-fix-type-definitions-for-myp.patch
    acpi-validate-hotplug-selector-on-access.patch
    block-backend-Retain-permissions-after-m.patch
    brotli-fix-actual-variable-array-paramet.patch
    doc-Add-the-SGX-numa-description.patch
    hw-i386-amd_iommu-Fix-maybe-uninitialize.patch
    hw-intc-exynos4210_gic-provide-more-room.patch
    hw-nvme-fix-CVE-2021-3929.patch
    hw-nvram-at24-return-0xff-if-1-byte-addr.patch
    iotest-065-explicit-compression-type.patch
    iotest-214-explicit-compression-type.patch
    iotest-302-use-img_info_log-helper.patch
    iotest-303-explicit-compression-type.patch
    iotest-39-use-_qcow2_dump_header.patch
    iotests-60-more-accurate-set-dirty-bit-i.patch
    iotests-MRCE-Write-data-to-source.patch
    iotests-bash-tests-filter-compression-ty.patch
    iotests-common.rc-introduce-_qcow2_dump_.patch
    iotests-declare-lack-of-support-for-comp.patch
    iotests-drop-qemu_img_verbose-helper.patch
    iotests-massive-use-_qcow2_dump_header.patch
    iotests-specify-some-unsupported_imgopts.patch
    iotests.py-filter-out-successful-output-.patch
    iotests.py-img_info_log-rename-imgopts-a.patch
    iotests.py-implement-unsupported_imgopts.patch
    iotests.py-qemu_img-create-support-IMGOP.patch
    iotests.py-rewrite-default-luks-support-.patch
    meson-build-all-modules-by-default.patch
    numa-Enable-numa-for-SGX-EPC-sections.patch
    numa-Support-SGX-numa-in-the-monitor-and.patch
    python-aqmp-Fix-negotiation-with-pre-oob.patch
    python-aqmp-add-SocketAddrT-to-package-r.patch
    python-aqmp-add-__del__-method-to-legacy.patch
    python-aqmp-add-_session_guard.patch
    python-aqmp-add-socket-bind-step-to-lega.patch
    python-aqmp-add-start_server-and-accept-.patch
    python-aqmp-copy-type-definitions-from-q.patch
    python-aqmp-drop-_bind_hack.patch
    python-aqmp-fix-docstring-typo.patch
    python-aqmp-fix-race-condition-in-legacy.patch
    python-aqmp-handle-asyncio.TimeoutError-.patch
    python-aqmp-refactor-_do_accept-into-two.patch
    python-aqmp-remove-_new_session-and-_est.patch
    python-aqmp-rename-AQMPError-to-QMPError.patch
    python-aqmp-rename-accept-to-start_serve.patch
    python-aqmp-split-_client_connected_cb-o.patch
    python-aqmp-squelch-pylint-warning-for-t.patch
    python-aqmp-stop-the-server-during-disco.patch
    python-introduce-qmp-shell-wrap-convenie.patch
    python-machine-raise-VMLaunchFailure-exc.patch
    python-move-qmp-shell-under-the-AQMP-pac.patch
    python-move-qmp-utilities-to-python-qemu.patch
    python-qmp-switch-qmp-shell-to-AQMP.patch
    python-support-recording-QMP-session-to-.patch
    python-upgrade-mypy-to-0.780.patch
    qcow2-simple-case-support-for-downgradin.patch
    qemu-binfmt-conf.sh-should-use-F-as-shor.patch
    tests-qemu-iotests-040-Skip-TestCommitWi.patch
    tests-qemu-iotests-Fix-051-for-binaries-.patch
    tests-qemu-iotests-testrunner-Quote-case.patch
    tools-virtiofsd-Add-rseq-syscall-to-the-.patch
    virtiofsd-Drop-membership-of-all-supplem.patch
    block-qdict-Fix-Werror-maybe-uninitializ.patch

OBS-URL: https://build.opensuse.org/request/show/979381
OBS-URL: https://build.opensuse.org/package/show/Virtualization/qemu?expand=0&rev=717
2022-05-26 17:31:38 +00:00

125 lines
5.1 KiB
Diff

From: Stefan Hajnoczi <stefanha@redhat.com>
Date: Mon, 7 Mar 2022 15:38:52 +0000
Subject: coroutine: use QEMU_DEFINE_STATIC_CO_TLS()
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Git-commit: ac387a08a9c9f6b36757da912f0339c25f421f90
Thread-Local Storage variables cannot be used directly from coroutine
code because the compiler may optimize TLS variable accesses across
qemu_coroutine_yield() calls. When the coroutine is re-entered from
another thread the TLS variables from the old thread must no longer be
used.
Use QEMU_DEFINE_STATIC_CO_TLS() for the current and leader variables.
The alloc_pool QSLIST needs a typedef so the return value of
get_ptr_alloc_pool() can be stored in a local variable.
One example of why this code is necessary: a coroutine that yields
before calling qemu_coroutine_create() to create another coroutine is
affected by the TLS issue.
Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
Message-Id: <20220307153853.602859-3-stefanha@redhat.com>
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
[DF: see: https://bugzilla.redhat.com/show_bug.cgi?id=1952483]
Signed-off-by: Dario Faggioli <dfaggioli@suse.com>
---
util/qemu-coroutine.c | 41 ++++++++++++++++++++++++-----------------
1 file changed, 24 insertions(+), 17 deletions(-)
diff --git a/util/qemu-coroutine.c b/util/qemu-coroutine.c
index c03b2422ff686e7138bf7bf0abba..f3e8300c8d2ec64fc16fa562a518 100644
--- a/util/qemu-coroutine.c
+++ b/util/qemu-coroutine.c
@@ -18,6 +18,7 @@
#include "qemu/atomic.h"
#include "qemu/coroutine.h"
#include "qemu/coroutine_int.h"
+#include "qemu/coroutine-tls.h"
#include "block/aio.h"
/** Initial batch size is 64, and is increased on demand */
@@ -29,17 +30,20 @@ enum {
static QSLIST_HEAD(, Coroutine) release_pool = QSLIST_HEAD_INITIALIZER(pool);
static unsigned int pool_batch_size = POOL_INITIAL_BATCH_SIZE;
static unsigned int release_pool_size;
-static __thread QSLIST_HEAD(, Coroutine) alloc_pool = QSLIST_HEAD_INITIALIZER(pool);
-static __thread unsigned int alloc_pool_size;
-static __thread Notifier coroutine_pool_cleanup_notifier;
+
+typedef QSLIST_HEAD(, Coroutine) CoroutineQSList;
+QEMU_DEFINE_STATIC_CO_TLS(CoroutineQSList, alloc_pool);
+QEMU_DEFINE_STATIC_CO_TLS(unsigned int, alloc_pool_size);
+QEMU_DEFINE_STATIC_CO_TLS(Notifier, coroutine_pool_cleanup_notifier);
static void coroutine_pool_cleanup(Notifier *n, void *value)
{
Coroutine *co;
Coroutine *tmp;
+ CoroutineQSList *alloc_pool = get_ptr_alloc_pool();
- QSLIST_FOREACH_SAFE(co, &alloc_pool, pool_next, tmp) {
- QSLIST_REMOVE_HEAD(&alloc_pool, pool_next);
+ QSLIST_FOREACH_SAFE(co, alloc_pool, pool_next, tmp) {
+ QSLIST_REMOVE_HEAD(alloc_pool, pool_next);
qemu_coroutine_delete(co);
}
}
@@ -49,27 +53,30 @@ Coroutine *qemu_coroutine_create(CoroutineEntry *entry, void *opaque)
Coroutine *co = NULL;
if (CONFIG_COROUTINE_POOL) {
- co = QSLIST_FIRST(&alloc_pool);
+ CoroutineQSList *alloc_pool = get_ptr_alloc_pool();
+
+ co = QSLIST_FIRST(alloc_pool);
if (!co) {
if (release_pool_size > qatomic_read(&pool_batch_size)) {
/* Slow path; a good place to register the destructor, too. */
- if (!coroutine_pool_cleanup_notifier.notify) {
- coroutine_pool_cleanup_notifier.notify = coroutine_pool_cleanup;
- qemu_thread_atexit_add(&coroutine_pool_cleanup_notifier);
+ Notifier *notifier = get_ptr_coroutine_pool_cleanup_notifier();
+ if (!notifier->notify) {
+ notifier->notify = coroutine_pool_cleanup;
+ qemu_thread_atexit_add(notifier);
}
/* This is not exact; there could be a little skew between
* release_pool_size and the actual size of release_pool. But
* it is just a heuristic, it does not need to be perfect.
*/
- alloc_pool_size = qatomic_xchg(&release_pool_size, 0);
- QSLIST_MOVE_ATOMIC(&alloc_pool, &release_pool);
- co = QSLIST_FIRST(&alloc_pool);
+ set_alloc_pool_size(qatomic_xchg(&release_pool_size, 0));
+ QSLIST_MOVE_ATOMIC(alloc_pool, &release_pool);
+ co = QSLIST_FIRST(alloc_pool);
}
}
if (co) {
- QSLIST_REMOVE_HEAD(&alloc_pool, pool_next);
- alloc_pool_size--;
+ QSLIST_REMOVE_HEAD(alloc_pool, pool_next);
+ set_alloc_pool_size(get_alloc_pool_size() - 1);
}
}
@@ -93,9 +100,9 @@ static void coroutine_delete(Coroutine *co)
qatomic_inc(&release_pool_size);
return;
}
- if (alloc_pool_size < qatomic_read(&pool_batch_size)) {
- QSLIST_INSERT_HEAD(&alloc_pool, co, pool_next);
- alloc_pool_size++;
+ if (get_alloc_pool_size() < qatomic_read(&pool_batch_size)) {
+ QSLIST_INSERT_HEAD(get_ptr_alloc_pool(), co, pool_next);
+ set_alloc_pool_size(get_alloc_pool_size() + 1);
return;
}
}