From 7b35fb448519b05eb956d30d15b9354554b1e504 Mon Sep 17 00:00:00 2001 From: Miroslav Rezanina Date: Mon, 20 Jan 2025 05:18:29 -0500 Subject: [PATCH] * Mon Jan 20 2025 Miroslav Rezanina - 9.1.0-11 - kvm-target-i386-Make-sure-SynIC-state-is-really-updated-.patch [RHEL-73002] - kvm-hw-virtio-fix-crash-in-processing-balloon-stats.patch [RHEL-73835] - kvm-qga-Add-log-to-guest-fsfreeze-thaw-command.patch [RHEL-74361] - kvm-qemu-ga-Optimize-freeze-hook-script-logic-of-logging.patch [RHEL-74461] - Resolves: RHEL-73002 (kvm-unti kvm-hyperv_synic test is stuck on AMD with COS9 [rhel-10]) - Resolves: RHEL-73835 (VM crashes when requesting domstats [rhel-10]) - Resolves: RHEL-74361 (qemu-ga logs only "guest-fsfreeze called" (but not "guest-fsthaw called")) - Resolves: RHEL-74461 (fsfreeze hooks doesn't log error on system logs when running hook fails [rhel-10]) --- ...ix-crash-in-processing-balloon-stats.patch | 102 ++++++++++++++++++ ...-freeze-hook-script-logic-of-logging.patch | 80 ++++++++++++++ ...d-log-to-guest-fsfreeze-thaw-command.patch | 54 ++++++++++ ...-sure-SynIC-state-is-really-updated-.patch | 64 +++++++++++ qemu-kvm.spec | 24 ++++- 5 files changed, 323 insertions(+), 1 deletion(-) create mode 100644 kvm-hw-virtio-fix-crash-in-processing-balloon-stats.patch create mode 100644 kvm-qemu-ga-Optimize-freeze-hook-script-logic-of-logging.patch create mode 100644 kvm-qga-Add-log-to-guest-fsfreeze-thaw-command.patch create mode 100644 kvm-target-i386-Make-sure-SynIC-state-is-really-updated-.patch diff --git a/kvm-hw-virtio-fix-crash-in-processing-balloon-stats.patch b/kvm-hw-virtio-fix-crash-in-processing-balloon-stats.patch new file mode 100644 index 0000000..31bbbbe --- /dev/null +++ b/kvm-hw-virtio-fix-crash-in-processing-balloon-stats.patch @@ -0,0 +1,102 @@ +From 58ad1bbfe399cecf0f05ebc70d2d3189fb78851d Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Daniel=20P=2E=20Berrang=C3=A9?= +Date: Fri, 29 Nov 2024 13:55:05 +0000 +Subject: [PATCH 2/4] hw/virtio: fix crash in processing balloon stats +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +RH-Author: Thomas Huth +RH-MergeRequest: 322: hw/virtio: fix crash in processing balloon stats +RH-Jira: RHEL-73835 +RH-Acked-by: Cédric Le Goater +RH-Acked-by: Daniel P. Berrangé +RH-Commit: [1/1] 7a0f9b816b1ce5f82ae6d0f4686fbb2ca0632e00 (thuth/qemu-kvm-cs9) + +balloon_stats_get_all will iterate over guest stats upto the max +VIRTIO_BALLOON_S_NR value, calling visit_type_uint64 to populate +the QObject dict. The dict keys are obtained from the static +array balloon_stat_names which is VIRTIO_BALLOON_S_NR in size. + +Unfortunately the way that array is declared results in any +unassigned stats getting a NULL name, which will then cause +visit_type_uint64 to trigger an assert in qobject_output_add_obj. + +The balloon_stat_names array was fortunately fully populated with +names until recently: + + commit 0d2eeef77a33315187df8519491a900bde4a3d83 + Author: Bibo Mao + Date: Mon Oct 28 10:38:09 2024 +0800 + + linux-headers: Update to Linux v6.12-rc5 + +pulled a change to include/standard-headers/linux/virtio_balloon.h +which increased VIRTIO_BALLOON_S_NR by 6, and failed to add the new +names to balloon_stat_names. + +This commit fills in the missing names, and uses a static assert to +guarantee that any future changes to VIRTIO_BALLOON_S_NR will cause +a build failure until balloon_stat_names is updated. + +This problem was detected by the Cockpit Project's automated +integration tests on QEMU 9.2.0-rc1. + +Fixes: https://bugzilla.redhat.com/show_bug.cgi?id=2329448 +Fixes: 0d2eeef77a3 ("linux-headers: Update to Linux v6.12-rc5") +Reported-by: Martin Pitt +Reviewed-by: Richard W.M. Jones +Signed-off-by: Daniel P. Berrangé +Reviewed-by: David Hildenbrand +Reviewed-by: Michael Tokarev +Acked-by: Michael S. Tsirkin +Message-ID: <20241129135507.699030-2-berrange@redhat.com> +Signed-off-by: Philippe Mathieu-Daudé +(cherry picked from commit bff1050a5630ce5da6f43ed002725d52140bb9e6) +Signed-off-by: Thomas Huth +--- + hw/virtio/virtio-balloon.c | 16 +++++++++++++++- + 1 file changed, 15 insertions(+), 1 deletion(-) + +diff --git a/hw/virtio/virtio-balloon.c b/hw/virtio/virtio-balloon.c +index 609e39a821..afd2ad6dd6 100644 +--- a/hw/virtio/virtio-balloon.c ++++ b/hw/virtio/virtio-balloon.c +@@ -167,19 +167,33 @@ static void balloon_deflate_page(VirtIOBalloon *balloon, + } + } + ++/* ++ * All stats upto VIRTIO_BALLOON_S_NR /must/ have a ++ * non-NULL name declared here, since these are used ++ * as keys for populating the QDict with stats ++ */ + static const char *balloon_stat_names[] = { + [VIRTIO_BALLOON_S_SWAP_IN] = "stat-swap-in", + [VIRTIO_BALLOON_S_SWAP_OUT] = "stat-swap-out", + [VIRTIO_BALLOON_S_MAJFLT] = "stat-major-faults", + [VIRTIO_BALLOON_S_MINFLT] = "stat-minor-faults", + [VIRTIO_BALLOON_S_MEMFREE] = "stat-free-memory", ++ + [VIRTIO_BALLOON_S_MEMTOT] = "stat-total-memory", + [VIRTIO_BALLOON_S_AVAIL] = "stat-available-memory", + [VIRTIO_BALLOON_S_CACHES] = "stat-disk-caches", + [VIRTIO_BALLOON_S_HTLB_PGALLOC] = "stat-htlb-pgalloc", + [VIRTIO_BALLOON_S_HTLB_PGFAIL] = "stat-htlb-pgfail", +- [VIRTIO_BALLOON_S_NR] = NULL ++ ++ [VIRTIO_BALLOON_S_OOM_KILL] = "stat-oom-kills", ++ [VIRTIO_BALLOON_S_ALLOC_STALL] = "stat-alloc-stalls", ++ [VIRTIO_BALLOON_S_ASYNC_SCAN] = "stat-async-scans", ++ [VIRTIO_BALLOON_S_DIRECT_SCAN] = "stat-direct-scans", ++ [VIRTIO_BALLOON_S_ASYNC_RECLAIM] = "stat-async-reclaims", ++ ++ [VIRTIO_BALLOON_S_DIRECT_RECLAIM] = "stat-direct-reclaims", + }; ++G_STATIC_ASSERT(G_N_ELEMENTS(balloon_stat_names) == VIRTIO_BALLOON_S_NR); + + /* + * reset_stats - Mark all items in the stats array as unset +-- +2.39.3 + diff --git a/kvm-qemu-ga-Optimize-freeze-hook-script-logic-of-logging.patch b/kvm-qemu-ga-Optimize-freeze-hook-script-logic-of-logging.patch new file mode 100644 index 0000000..51eda58 --- /dev/null +++ b/kvm-qemu-ga-Optimize-freeze-hook-script-logic-of-logging.patch @@ -0,0 +1,80 @@ +From 14fc984df8059560815cc1f55f058569fe480832 Mon Sep 17 00:00:00 2001 +From: Dehan Meng +Date: Wed, 25 Dec 2024 16:37:44 +0800 +Subject: [PATCH 4/4] qemu-ga: Optimize freeze-hook script logic of logging + error + +RH-Author: 6-dehan +RH-MergeRequest: 326: qemu-ga: Optimize freeze-hook script logic of logging error +RH-Jira: RHEL-74461 +RH-Acked-by: Konstantin Kostiuk +RH-Acked-by: Yan Vugenfirer +RH-Commit: [1/1] f133428aa9b511a93e528823e8253a41d46e1de5 (6-dehan/centos-qemu-kvm) + +Make sure the error log of fsfreeze hooks +when freeze/thaw/snapshot could be logged +to system logs if the default logfile of +qga can't be written or other situations + +Reviewed-by: Konstantin Kostiuk +Reviewed-by: Yan Vugenfirer +Signed-off-by: Dehan Meng +--- + scripts/qemu-guest-agent/fsfreeze-hook | 36 +++++++++++++++++++++++--- + 1 file changed, 32 insertions(+), 4 deletions(-) + +diff --git a/scripts/qemu-guest-agent/fsfreeze-hook b/scripts/qemu-guest-agent/fsfreeze-hook +index 70536ba3e3..d5d8d4daf8 100755 +--- a/scripts/qemu-guest-agent/fsfreeze-hook ++++ b/scripts/qemu-guest-agent/fsfreeze-hook +@@ -19,15 +19,43 @@ is_ignored_file() { + return 1 + } + ++USE_SYSLOG=0 ++# if log file is not writable, fallback to syslog ++[ ! -w "$LOGFILE" ] && USE_SYSLOG=1 ++# try to update log file and fallback to syslog if it fails ++touch "$LOGFILE" &>/dev/null || USE_SYSLOG=1 ++ ++# Ensure the log file is writable, fallback to syslog if not ++log_message() { ++ local message="$1" ++ if [ "$USE_SYSLOG" -eq 0 ]; then ++ printf "%s: %s\n" "$(date)" "$message" >>"$LOGFILE" ++ else ++ logger -t qemu-ga-freeze-hook "$message" ++ fi ++} ++ + # Iterate executables in directory "fsfreeze-hook.d" with the specified args + [ ! -d "$FSFREEZE_D" ] && exit 0 ++ + for file in "$FSFREEZE_D"/* ; do + is_ignored_file "$file" && continue + [ -x "$file" ] || continue +- printf "$(date): execute $file $@\n" >>$LOGFILE +- "$file" "$@" >>$LOGFILE 2>&1 +- STATUS=$? +- printf "$(date): $file finished with status=$STATUS\n" >>$LOGFILE ++ ++ log_message "Executing $file $@" ++ if [ "$USE_SYSLOG" -eq 0 ]; then ++ "$file" "$@" >>"$LOGFILE" 2>&1 ++ STATUS=$? ++ else ++ "$file" "$@" 2>&1 | logger -t qemu-ga-freeze-hook ++ STATUS=${PIPESTATUS[0]} ++ fi ++ ++ if [ $STATUS -ne 0 ]; then ++ log_message "Error: $file finished with status=$STATUS" ++ else ++ log_message "$file finished successfully" ++ fi + done + + exit 0 +-- +2.39.3 + diff --git a/kvm-qga-Add-log-to-guest-fsfreeze-thaw-command.patch b/kvm-qga-Add-log-to-guest-fsfreeze-thaw-command.patch new file mode 100644 index 0000000..ae1d2c6 --- /dev/null +++ b/kvm-qga-Add-log-to-guest-fsfreeze-thaw-command.patch @@ -0,0 +1,54 @@ +From 53cc229c86bd0c555cdf68adb75918bec6c525fb Mon Sep 17 00:00:00 2001 +From: Konstantin Kostiuk +Date: Mon, 16 Dec 2024 17:45:52 +0200 +Subject: [PATCH 3/4] qga: Add log to guest-fsfreeze-thaw command +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +RH-Author: 6-dehan +RH-MergeRequest: 325: qga: Add log to guest-fsfreeze-thaw command +RH-Jira: RHEL-74361 +RH-Acked-by: Konstantin Kostiuk +RH-Acked-by: Yan Vugenfirer +RH-Commit: [1/1] a6f5a87f592136857fb76b8261d1de98f1d28772 (6-dehan/centos-qemu-kvm) + +Signed-off-by: Konstantin Kostiuk +Reviewed-by: Daniel P. Berrangé +--- + qga/commands-posix.c | 2 ++ + qga/commands-win32.c | 3 +++ + 2 files changed, 5 insertions(+) + +diff --git a/qga/commands-posix.c b/qga/commands-posix.c +index c2bd0b4316..49e40f9127 100644 +--- a/qga/commands-posix.c ++++ b/qga/commands-posix.c +@@ -806,8 +806,10 @@ int64_t qmp_guest_fsfreeze_thaw(Error **errp) + int ret; + + ret = qmp_guest_fsfreeze_do_thaw(errp); ++ + if (ret >= 0) { + ga_unset_frozen(ga_state); ++ slog("guest-fsthaw called"); + execute_fsfreeze_hook(FSFREEZE_HOOK_THAW, errp); + } else { + ret = 0; +diff --git a/qga/commands-win32.c b/qga/commands-win32.c +index 61b36da469..1aea6cd167 100644 +--- a/qga/commands-win32.c ++++ b/qga/commands-win32.c +@@ -1273,6 +1273,9 @@ int64_t qmp_guest_fsfreeze_thaw(Error **errp) + qga_vss_fsfreeze(&i, false, NULL, errp); + + ga_unset_frozen(ga_state); ++ ++ slog("guest-fsthaw called"); ++ + return i; + } + +-- +2.39.3 + diff --git a/kvm-target-i386-Make-sure-SynIC-state-is-really-updated-.patch b/kvm-target-i386-Make-sure-SynIC-state-is-really-updated-.patch new file mode 100644 index 0000000..fd18705 --- /dev/null +++ b/kvm-target-i386-Make-sure-SynIC-state-is-really-updated-.patch @@ -0,0 +1,64 @@ +From 327e8c65d28dc357c02b508e6485e7c57d4d1efa Mon Sep 17 00:00:00 2001 +From: Vitaly Kuznetsov +Date: Tue, 7 Jan 2025 13:43:32 +0100 +Subject: [PATCH 1/4] target/i386: Make sure SynIC state is really updated + before KVM_RUN + +RH-Author: Vitaly Kuznetsov +RH-MergeRequest: 314: target/i386: Make sure SynIC state is really updated before KVM_RUN +RH-Jira: RHEL-73002 +RH-Acked-by: Paolo Bonzini +RH-Acked-by: Maxim Levitsky +RH-Commit: [1/1] 2d8f7605e3efd3c76d16a2cb9e7c0898786fb4e9 (vkuznets/qemu-kvm) + +'hyperv_synic' test from KVM unittests was observed to be flaky on certain +hardware (hangs sometimes). Debugging shows that the problem happens in +hyperv_sint_route_new() when the test tries to set up a new SynIC +route. The function bails out on: + + if (!synic->sctl_enabled) { + goto cleanup; + } + +but the test writes to HV_X64_MSR_SCONTROL just before it starts +establishing SINT routes. Further investigation shows that +synic_update() (called from async_synic_update()) happens after the SINT +setup attempt and not before. Apparently, the comment before +async_safe_run_on_cpu() in kvm_hv_handle_exit() does not correctly describe +the guarantees async_safe_run_on_cpu() gives. In particular, async worked +added to a CPU is actually processed from qemu_wait_io_event() which is not +always called before KVM_RUN, i.e. kvm_cpu_exec() checks whether an exit +request is pending for a CPU and if not, keeps running the vCPU until it +meets an exit it can't handle internally. Hyper-V specific MSR writes are +not automatically trigger an exit. + +Fix the issue by simply raising an exit request for the vCPU where SynIC +update was queued. This is not a performance critical path as SynIC state +does not get updated so often (and async_safe_run_on_cpu() is a big hammer +anyways). + +Reported-by: Jan Richter +Signed-off-by: Vitaly Kuznetsov +Link: https://lore.kernel.org/r/20240917160051.2637594-4-vkuznets@redhat.com +Signed-off-by: Paolo Bonzini +(cherry picked from commit d3177e2e4353824a650434c57471615d43507500) +Signed-off-by: Vitaly Kuznetsov +--- + target/i386/kvm/hyperv.c | 1 + + 1 file changed, 1 insertion(+) + +diff --git a/target/i386/kvm/hyperv.c b/target/i386/kvm/hyperv.c +index b94f12acc2..70b89cacf9 100644 +--- a/target/i386/kvm/hyperv.c ++++ b/target/i386/kvm/hyperv.c +@@ -80,6 +80,7 @@ int kvm_hv_handle_exit(X86CPU *cpu, struct kvm_hyperv_exit *exit) + * necessary because memory hierarchy is being changed + */ + async_safe_run_on_cpu(CPU(cpu), async_synic_update, RUN_ON_CPU_NULL); ++ cpu_exit(CPU(cpu)); + + return EXCP_INTERRUPT; + case KVM_EXIT_HYPERV_HCALL: { +-- +2.39.3 + diff --git a/qemu-kvm.spec b/qemu-kvm.spec index accbade..74ba548 100644 --- a/qemu-kvm.spec +++ b/qemu-kvm.spec @@ -143,7 +143,7 @@ Obsoletes: %{name}-block-ssh <= %{epoch}:%{version} \ Summary: QEMU is a machine emulator and virtualizer Name: qemu-kvm Version: 9.1.0 -Release: 10%{?rcrel}%{?dist}%{?cc_suffix} +Release: 11%{?rcrel}%{?dist}%{?cc_suffix} # 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) @@ -410,6 +410,14 @@ Patch116: kvm-pc-q35-Bump-max_cpus-to-4096-vcpus.patch Patch117: kvm-vhost-fail-device-start-if-iotlb-update-fails.patch # For RHEL-69500 - [Stable_Guest_ABI][USO][9.6.0-machine-type]From 10.0 to RHEL.9.6.0 the guest with 9.6 machine type only, the guest crashed with - qemu-kvm: Features 0x1c0010130afffa7 unsupported. Allowed features: 0x10179bfffe7 Patch118: kvm-virtio-net-disable-USO-for-all-RHEL9.patch +# For RHEL-73002 - kvm-unti kvm-hyperv_synic test is stuck on AMD with COS9 [rhel-10] +Patch119: kvm-target-i386-Make-sure-SynIC-state-is-really-updated-.patch +# For RHEL-73835 - VM crashes when requesting domstats [rhel-10] +Patch120: kvm-hw-virtio-fix-crash-in-processing-balloon-stats.patch +# For RHEL-74361 - qemu-ga logs only "guest-fsfreeze called" (but not "guest-fsthaw called") +Patch121: kvm-qga-Add-log-to-guest-fsfreeze-thaw-command.patch +# For RHEL-74461 - fsfreeze hooks doesn't log error on system logs when running hook fails [rhel-10] +Patch122: kvm-qemu-ga-Optimize-freeze-hook-script-logic-of-logging.patch %if %{have_clang} BuildRequires: clang @@ -1476,6 +1484,20 @@ useradd -r -u 107 -g qemu -G kvm -d / -s /sbin/nologin \ %endif %changelog +* Mon Jan 20 2025 Miroslav Rezanina - 9.1.0-11 +- kvm-target-i386-Make-sure-SynIC-state-is-really-updated-.patch [RHEL-73002] +- kvm-hw-virtio-fix-crash-in-processing-balloon-stats.patch [RHEL-73835] +- kvm-qga-Add-log-to-guest-fsfreeze-thaw-command.patch [RHEL-74361] +- kvm-qemu-ga-Optimize-freeze-hook-script-logic-of-logging.patch [RHEL-74461] +- Resolves: RHEL-73002 + (kvm-unti kvm-hyperv_synic test is stuck on AMD with COS9 [rhel-10]) +- Resolves: RHEL-73835 + (VM crashes when requesting domstats [rhel-10]) +- Resolves: RHEL-74361 + (qemu-ga logs only "guest-fsfreeze called" (but not "guest-fsthaw called")) +- Resolves: RHEL-74461 + (fsfreeze hooks doesn't log error on system logs when running hook fails [rhel-10]) + * Mon Jan 13 2025 Miroslav Rezanina - 9.1.0-10 - kvm-qdev-Fix-set_pci_devfn-to-visit-option-only-once.patch [RHEL-43412] - kvm-tests-avocado-hotplug_blk-Fix-addr-in-device_add-com.patch [RHEL-43412]