diff --git a/kvm-block-Never-drop-BLOCK_IO_ERROR-with-action-stop-for.patch b/kvm-block-Never-drop-BLOCK_IO_ERROR-with-action-stop-for.patch new file mode 100644 index 0000000..ecd825d --- /dev/null +++ b/kvm-block-Never-drop-BLOCK_IO_ERROR-with-action-stop-for.patch @@ -0,0 +1,98 @@ +From 2704bca029bc3c7a3e430d3af8b7696d7d2b1e37 Mon Sep 17 00:00:00 2001 +From: Kevin Wolf +Date: Wed, 4 Mar 2026 13:28:00 +0100 +Subject: [PATCH 2/2] block: Never drop BLOCK_IO_ERROR with action=stop for + rate limiting + +RH-Author: Kevin Wolf +RH-MergeRequest: 472: block: Never drop BLOCK_IO_ERROR with action=stop for rate limiting +RH-Jira: RHEL-144004 +RH-Acked-by: Hanna Czenczek +RH-Acked-by: Stefan Hajnoczi +RH-Commit: [1/1] 96b29a65a4a49fb159970892124e5b4bbdcdfeb7 (kmwolf/centos-qemu-kvm) + +Commit 2155d2dd introduced rate limiting for BLOCK_IO_ERROR to emit an +event only once a second. This makes sense for cases in which the guest +keeps running and can submit more requests that would possibly also fail +because there is a problem with the backend. + +However, if the error policy is configured so that the VM is stopped on +errors, this is both unnecessary because stopping the VM means that the +guest can't issue more requests and in fact harmful because stopping the +VM is an important state change that management tools need to keep track +of even if it happens more than once in a given second. If an event is +dropped, the management tool would see a VM randomly going to paused +state without an associated error, so it has a hard time deciding how to +handle the situation. + +This patch disables rate limiting for action=stop by not relying on the +event type alone any more in monitor_qapi_event_queue_no_reenter(), but +checking action for BLOCK_IO_ERROR, too. If the error is reported to the +guest or ignored, the rate limiting stays in place. + +Fixes: 2155d2dd7f73 ('block-backend: per-device throttling of BLOCK_IO_ERROR reports') +Signed-off-by: Kevin Wolf +Message-ID: <20260304122800.51923-1-kwolf@redhat.com> +Signed-off-by: Kevin Wolf +(cherry picked from commit 544ddbb6373d61292a0e2dc269809cd6bd5edec6) +Signed-off-by: Kevin Wolf +--- + monitor/monitor.c | 21 ++++++++++++++++++++- + qapi/block-core.json | 2 +- + 2 files changed, 21 insertions(+), 2 deletions(-) + +diff --git a/monitor/monitor.c b/monitor/monitor.c +index c5a5d30877..ae7cf64de0 100644 +--- a/monitor/monitor.c ++++ b/monitor/monitor.c +@@ -363,14 +363,33 @@ monitor_qapi_event_queue_no_reenter(QAPIEvent event, QDict *qdict) + { + MonitorQAPIEventConf *evconf; + MonitorQAPIEventState *evstate; ++ bool throttled; + + assert(event < QAPI_EVENT__MAX); + evconf = &monitor_qapi_event_conf[event]; + trace_monitor_protocol_event_queue(event, qdict, evconf->rate); ++ throttled = evconf->rate; ++ ++ /* ++ * Rate limit BLOCK_IO_ERROR only for action != "stop". ++ * ++ * If the VM is stopped after an I/O error, this is important information ++ * for the management tool to keep track of the state of QEMU and we can't ++ * merge any events. At the same time, stopping the VM means that the guest ++ * can't send additional requests and the number of events is already ++ * limited, so we can do without rate limiting. ++ */ ++ if (event == QAPI_EVENT_BLOCK_IO_ERROR) { ++ QDict *data = qobject_to(QDict, qdict_get(qdict, "data")); ++ const char *action = qdict_get_str(data, "action"); ++ if (!strcmp(action, "stop")) { ++ throttled = false; ++ } ++ } + + QEMU_LOCK_GUARD(&monitor_lock); + +- if (!evconf->rate) { ++ if (!throttled) { + /* Unthrottled event */ + monitor_qapi_event_emit(event, qdict); + } else { +diff --git a/qapi/block-core.json b/qapi/block-core.json +index 2c037183f0..0236936139 100644 +--- a/qapi/block-core.json ++++ b/qapi/block-core.json +@@ -5783,7 +5783,7 @@ + # .. note:: If action is "stop", a `STOP` event will eventually follow + # the `BLOCK_IO_ERROR` event. + # +-# .. note:: This event is rate-limited. ++# .. note:: This event is rate-limited, except if action is "stop". + # + # Since: 0.13 + # +-- +2.47.3 + diff --git a/kvm-hw-uefi-add-variable-digest-to-vmstate.patch b/kvm-hw-uefi-add-variable-digest-to-vmstate.patch new file mode 100644 index 0000000..d9c8a13 --- /dev/null +++ b/kvm-hw-uefi-add-variable-digest-to-vmstate.patch @@ -0,0 +1,89 @@ +From b12eac2c22066ee4ff568a4108b38d7bdcd958cc Mon Sep 17 00:00:00 2001 +From: Gerd Hoffmann +Date: Wed, 4 Mar 2026 08:05:34 +0100 +Subject: [PATCH 1/2] hw/uefi: add variable digest to vmstate +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +RH-Author: Gerd Hoffmann +RH-MergeRequest: 471: hw/uefi: add variable digest to vmstate +RH-Jira: RHEL-153058 +RH-Acked-by: Peter Xu +RH-Acked-by: Miroslav Rezanina +RH-Commit: [1/1] c300b30db6bafaacd11b8383531f04873bc8b428 (kraxel.rh/centos-src-qemu-kvm) + +Add digest to vmstate if needed. Also clear digest before loading +to make sure it is initialized. + +Fixes: db1ecfb473ac ("hw/uefi: add var-service-vars.c") +Signed-off-by: Gerd Hoffmann +Reviewed-by: Philippe Mathieu-Daudé +Message-ID: <20260304075954.584423-1-kraxel@redhat.com> +Signed-off-by: Philippe Mathieu-Daudé +(cherry picked from commit b28c3ad1d63c2fe167b6f93fad1616ecd769e599) + +Resolves: RHEL-153058 +--- + hw/uefi/var-service-vars.c | 36 ++++++++++++++++++++++++++++++++++++ + 1 file changed, 36 insertions(+) + +diff --git a/hw/uefi/var-service-vars.c b/hw/uefi/var-service-vars.c +index 8533533ea5..ed4e0a6494 100644 +--- a/hw/uefi/var-service-vars.c ++++ b/hw/uefi/var-service-vars.c +@@ -37,8 +37,40 @@ const VMStateDescription vmstate_uefi_time = { + }, + }; + ++static int uefi_vars_pre_load(void *opaque) ++{ ++ uefi_variable *var = opaque; ++ ++ /* clear digest which is optional in the live migration data stream */ ++ var->digest = NULL; ++ var->digest_size = 0; ++ return 0; ++} ++ ++static bool uefi_vars_digest_is_needed(void *opaque) ++{ ++ uefi_variable *var = opaque; ++ ++ if ((var->attributes & EFI_VARIABLE_TIME_BASED_AUTHENTICATED_WRITE_ACCESS) && ++ !uefi_vars_is_sb_any(var)) { ++ return true; ++ } ++ return false; ++} ++ ++const VMStateDescription vmstate_uefi_variable_digest = { ++ .name = "uefi-variable-digest", ++ .needed = uefi_vars_digest_is_needed, ++ .fields = (VMStateField[]) { ++ VMSTATE_UINT32(digest_size, uefi_variable), ++ VMSTATE_VBUFFER_ALLOC_UINT32(digest, uefi_variable, 0, NULL, digest_size), ++ VMSTATE_END_OF_LIST() ++ }, ++}; ++ + const VMStateDescription vmstate_uefi_variable = { + .name = "uefi-variable", ++ .pre_load = uefi_vars_pre_load, + .fields = (VMStateField[]) { + VMSTATE_UINT8_ARRAY_V(guid.data, uefi_variable, sizeof(QemuUUID), 0), + VMSTATE_UINT32(name_size, uefi_variable), +@@ -49,6 +81,10 @@ const VMStateDescription vmstate_uefi_variable = { + VMSTATE_STRUCT(time, uefi_variable, 0, vmstate_uefi_time, efi_time), + VMSTATE_END_OF_LIST() + }, ++ .subsections = (const VMStateDescription * const []) { ++ &vmstate_uefi_variable_digest, ++ NULL ++ } + }; + + uefi_variable *uefi_vars_find_variable(uefi_vars_state *uv, QemuUUID guid, +-- +2.47.3 + diff --git a/qemu-kvm.spec b/qemu-kvm.spec index 9f2940a..99c9045 100644 --- a/qemu-kvm.spec +++ b/qemu-kvm.spec @@ -158,7 +158,7 @@ Obsoletes: %{name}-block-ssh <= %{epoch}:%{version} \ Summary: QEMU is a machine emulator and virtualizer Name: qemu-kvm Version: 10.1.0 -Release: 13%{?rcrel}%{?dist}%{?cc_suffix}.alma.1 +Release: 14%{?rcrel}%{?dist}%{?cc_suffix}.alma.1 # Epoch because we pushed a qemu-1.0 package. AIUI this can't ever be dropped # Epoch 15 used for RHEL 8 # Epoch 17 used for RHEL 9 (due to release versioning offset in RHEL 8.5) @@ -423,6 +423,10 @@ Patch126: kvm-docs-add-SCSI-migrate-pr-documentation.patch # For RHEL-134989 - Hotplugged interface device can not be shown in the guest # For RHEL-146584 - [RHEL-10.2][ARM]: Unable to Check the mem prefetched size on Guest Patch127: kvm-Revert-hw-arm-virt-Use-ACPI-PCI-hotplug-by-default-f.patch +# For RHEL-153058 - Qemu crashes with "double free" during restore --reset-nvram with uefi-vars secure boot +Patch128: kvm-hw-uefi-add-variable-digest-to-vmstate.patch +# For RHEL-144004 - [rhel-10] Regression in BLOCK_IO_ERROR event delivery with (w|r)error setting of 'stop' or 'enospc' due to event rate limiting +Patch129: kvm-block-Never-drop-BLOCK_IO_ERROR-with-action-stop-for.patch # AlmaLinux Patch Patch2001: 2001-Add-ppc64-support.patch @@ -1551,12 +1555,20 @@ useradd -r -u 107 -g qemu -G kvm -d / -s /sbin/nologin \ %endif %changelog -* Fri Feb 20 2026 Eduard Abdullin - 18:10.1.0-13.alma.1 +* Thu Mar 19 2026 Eduard Abdullin - 18:10.1.0-14.alma.1 - Enable QXL device build - Enable building for ppc64le - Re-added Spice support - Don't remove slof.bin for ppc64le +* Wed Mar 18 2026 Miroslav Rezanina - 10.1.0-14 +- kvm-hw-uefi-add-variable-digest-to-vmstate.patch [RHEL-153058] +- kvm-block-Never-drop-BLOCK_IO_ERROR-with-action-stop-for.patch [RHEL-144004] +- Resolves: RHEL-153058 + (Qemu crashes with "double free" during restore --reset-nvram with uefi-vars secure boot) +- Resolves: RHEL-144004 + ([rhel-10] Regression in BLOCK_IO_ERROR event delivery with (w|r)error setting of 'stop' or 'enospc' due to event rate limiting) + * Thu Feb 19 2026 Miroslav Rezanina - 10.1.0-13 - kvm-vhost-user-make-vhost_set_vring_file-synchronous.patch [RHEL-147425] - kvm-scsi-generalize-scsi_SG_IO_FROM_DEV-to-scsi_SG_IO.patch [RHEL-132749]