From 1048755cbc6c227b308e268c511a75d484e10c85 Mon Sep 17 00:00:00 2001 From: Miroslav Rezanina Date: Mon, 15 Jul 2024 01:41:56 -0400 Subject: [PATCH] * Mon Jul 15 2024 Miroslav Rezanina - 9.0.0-7 - kvm-hw-virtio-Fix-the-de-initialization-of-vhost-user-de.patch [RHEL-40708] - kvm-hw-arm-virt-Avoid-unexpected-warning-from-Linux-gues.patch [RHEL-39936] - Resolves: RHEL-40708 ([RHEL9.5.0][virtio_fs][s390x] after hot-unplug the vhost-user-fs-ccw device, the device is failed to hot-plug again ) - Resolves: RHEL-39936 (ARCH_DMA_MINALIGN smaller than CTR_EL0.CWG (128 < 256) on FUJITSU) --- ...d-unexpected-warning-from-Linux-gues.patch | 120 ++++++++++++++++++ ...e-de-initialization-of-vhost-user-de.patch | 108 ++++++++++++++++ qemu-kvm.spec | 14 +- 3 files changed, 241 insertions(+), 1 deletion(-) create mode 100644 kvm-hw-arm-virt-Avoid-unexpected-warning-from-Linux-gues.patch create mode 100644 kvm-hw-virtio-Fix-the-de-initialization-of-vhost-user-de.patch diff --git a/kvm-hw-arm-virt-Avoid-unexpected-warning-from-Linux-gues.patch b/kvm-hw-arm-virt-Avoid-unexpected-warning-from-Linux-gues.patch new file mode 100644 index 0000000..29991d5 --- /dev/null +++ b/kvm-hw-arm-virt-Avoid-unexpected-warning-from-Linux-gues.patch @@ -0,0 +1,120 @@ +From 41c4083269ec772b406c6c57b496ca2011f928c7 Mon Sep 17 00:00:00 2001 +From: Zhenyu Zhang +Date: Tue, 9 Jul 2024 23:08:59 -0400 +Subject: [PATCH 2/2] hw/arm/virt: Avoid unexpected warning from Linux guest on + host with Fujitsu CPUs + +RH-Author: zhenyzha +RH-MergeRequest: 256: hw/arm/virt: Avoid unexpected warning from Linux guest on host with Fujitsu CPUs +RH-Jira: RHEL-39936 +RH-Acked-by: Gavin Shan +RH-Acked-by: Sebastian Ott +RH-Acked-by: Cornelia Huck +RH-Commit: [1/1] fdf156fd05b219a06e2e2ca409fff0f728c1e2cf (zhenyzha/qemu-kvm) + +JIRA: https://issues.redhat.com/browse/RHEL-39936 + +Multiple warning messages and corresponding backtraces are observed when Linux +guest is booted on the host with Fujitsu CPUs. One of them is shown as below. + +[ 0.032443] ------------[ cut here ]------------ +[ 0.032446] uart-pl011 9000000.pl011: ARCH_DMA_MINALIGN smaller than +CTR_EL0.CWG (128 < 256) +[ 0.032454] WARNING: CPU: 0 PID: 1 at arch/arm64/mm/dma-mapping.c:54 +arch_setup_dma_ops+0xbc/0xcc +[ 0.032470] Modules linked in: +[ 0.032475] CPU: 0 PID: 1 Comm: swapper/0 Not tainted 5.14.0-452.el9.aarch64 +[ 0.032481] Hardware name: linux,dummy-virt (DT) +[ 0.032484] pstate: 60400005 (nZCv daif +PAN -UAO -TCO -DIT -SSBS BTYPE=--) +[ 0.032490] pc : arch_setup_dma_ops+0xbc/0xcc +[ 0.032496] lr : arch_setup_dma_ops+0xbc/0xcc +[ 0.032501] sp : ffff80008003b860 +[ 0.032503] x29: ffff80008003b860 x28: 0000000000000000 x27: ffffaae4b949049c +[ 0.032510] x26: 0000000000000000 x25: 0000000000000000 x24: 0000000000000000 +[ 0.032517] x23: 0000000000000100 x22: 0000000000000000 x21: 0000000000000000 +[ 0.032523] x20: 0000000100000000 x19: ffff2f06c02ea400 x18: ffffffffffffffff +[ 0.032529] x17: 00000000208a5f76 x16: 000000006589dbcb x15: ffffaae4ba071c89 +[ 0.032535] x14: 0000000000000000 x13: ffffaae4ba071c84 x12: 455f525443206e61 +[ 0.032541] x11: 68742072656c6c61 x10: 0000000000000029 x9 : ffffaae4b7d21da4 +[ 0.032547] x8 : 0000000000000029 x7 : 4c414e494d5f414d x6 : 0000000000000029 +[ 0.032553] x5 : 000000000000000f x4 : ffffaae4b9617a00 x3 : 0000000000000001 +[ 0.032558] x2 : 0000000000000000 x1 : 0000000000000000 x0 : ffff2f06c029be40 +[ 0.032564] Call trace: +[ 0.032566] arch_setup_dma_ops+0xbc/0xcc +[ 0.032572] of_dma_configure_id+0x138/0x300 +[ 0.032591] amba_dma_configure+0x34/0xc0 +[ 0.032600] really_probe+0x78/0x3dc +[ 0.032614] __driver_probe_device+0x108/0x160 +[ 0.032619] driver_probe_device+0x44/0x114 +[ 0.032624] __device_attach_driver+0xb8/0x14c +[ 0.032629] bus_for_each_drv+0x88/0xe4 +[ 0.032634] __device_attach+0xb0/0x1e0 +[ 0.032638] device_initial_probe+0x18/0x20 +[ 0.032643] bus_probe_device+0xa8/0xb0 +[ 0.032648] device_add+0x4b4/0x6c0 +[ 0.032652] amba_device_try_add.part.0+0x48/0x360 +[ 0.032657] amba_device_add+0x104/0x144 +[ 0.032662] of_amba_device_create.isra.0+0x100/0x1c4 +[ 0.032666] of_platform_bus_create+0x294/0x35c +[ 0.032669] of_platform_populate+0x5c/0x150 +[ 0.032672] of_platform_default_populate_init+0xd0/0xec +[ 0.032697] do_one_initcall+0x4c/0x2e0 +[ 0.032701] do_initcalls+0x100/0x13c +[ 0.032707] kernel_init_freeable+0x1c8/0x21c +[ 0.032712] kernel_init+0x28/0x140 +[ 0.032731] ret_from_fork+0x10/0x20 +[ 0.032735] ---[ end trace 0000000000000000 ]--- + +In Linux, a check is applied to every device which is exposed through +device-tree node. The warning message is raised when the device isn't +DMA coherent and the cache line size is larger than ARCH_DMA_MINALIGN +(128 bytes). The cache line is sorted from CTR_EL0[CWG], which corresponds +to 256 bytes on the guest CPUs. The DMA coherent capability is claimed +through 'dma-coherent' in their device-tree nodes or parent nodes. +This happens even when the device doesn't implement or use DMA at all, +for legacy reasons. + +Fix the issue by adding 'dma-coherent' property to the device-tree root +node, meaning all devices are capable of DMA coherent by default. +This both suppresses the spurious kernel warnings and also guards +against possible future QEMU bugs where we add a DMA-capable device +and forget to mark it as dma-coherent. + +Signed-off-by: Zhenyu Zhang +Reviewed-by: Gavin Shan +Reviewed-by: Donald Dutile +Message-id: 20240612020506.307793-1-zhenyzha@redhat.com +[PMM: tweaked commit message] +Signed-off-by: Peter Maydell +(cherry picked from commit dda533087ad5559674ff486e7031c88dc01e0abd) +Signed-off-by: Zhenyu Zhang +--- + hw/arm/virt.c | 11 +++++++++++ + 1 file changed, 11 insertions(+) + +diff --git a/hw/arm/virt.c b/hw/arm/virt.c +index 3f0496cdb9..6ece67f11d 100644 +--- a/hw/arm/virt.c ++++ b/hw/arm/virt.c +@@ -330,6 +330,17 @@ static void create_fdt(VirtMachineState *vms) + qemu_fdt_setprop_cell(fdt, "/", "#size-cells", 0x2); + qemu_fdt_setprop_string(fdt, "/", "model", "linux,dummy-virt"); + ++ /* ++ * For QEMU, all DMA is coherent. Advertising this in the root node ++ * has two benefits: ++ * ++ * - It avoids potential bugs where we forget to mark a DMA ++ * capable device as being dma-coherent ++ * - It avoids spurious warnings from the Linux kernel about ++ * devices which can't do DMA at all ++ */ ++ qemu_fdt_setprop(fdt, "/", "dma-coherent", NULL, 0); ++ + /* /chosen must exist for load_dtb to fill in necessary properties later */ + qemu_fdt_add_subnode(fdt, "/chosen"); + if (vms->dtb_randomness) { +-- +2.39.3 + diff --git a/kvm-hw-virtio-Fix-the-de-initialization-of-vhost-user-de.patch b/kvm-hw-virtio-Fix-the-de-initialization-of-vhost-user-de.patch new file mode 100644 index 0000000..7b2e1b6 --- /dev/null +++ b/kvm-hw-virtio-Fix-the-de-initialization-of-vhost-user-de.patch @@ -0,0 +1,108 @@ +From c554f8768a18ceba173aedbd582c1cae43a41e2c Mon Sep 17 00:00:00 2001 +From: Thomas Huth +Date: Tue, 18 Jun 2024 14:19:58 +0200 +Subject: [PATCH 1/2] hw/virtio: Fix the de-initialization of vhost-user + devices +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +RH-Author: Thomas Huth +RH-MergeRequest: 255: hw/virtio: Fix the de-initialization of vhost-user devices +RH-Jira: RHEL-40708 +RH-Acked-by: Cédric Le Goater +RH-Acked-by: Miroslav Rezanina +RH-Commit: [1/1] c7815a249ec135993f45934cab1c1f2c038b80ea (thuth/qemu-kvm-cs9) + +JIRA: https://issues.redhat.com/browse/RHEL-40708 + +The unrealize functions of the various vhost-user devices are +calling the corresponding vhost_*_set_status() functions with a +status of 0 to shut down the device correctly. + +Now these vhost_*_set_status() functions all follow this scheme: + + bool should_start = virtio_device_should_start(vdev, status); + + if (vhost_dev_is_started(&vvc->vhost_dev) == should_start) { + return; + } + + if (should_start) { + /* ... do the initialization stuff ... */ + } else { + /* ... do the cleanup stuff ... */ + } + +The problem here is virtio_device_should_start(vdev, 0) currently +always returns "true" since it internally only looks at vdev->started +instead of looking at the "status" parameter. Thus once the device +got started once, virtio_device_should_start() always returns true +and thus the vhost_*_set_status() functions return early, without +ever doing any clean-up when being called with status == 0. This +causes e.g. problems when trying to hot-plug and hot-unplug a vhost +user devices multiple times since the de-initialization step is +completely skipped during the unplug operation. + +This bug has been introduced in commit 9f6bcfd99f ("hw/virtio: move +vm_running check to virtio_device_started") which replaced + + should_start = status & VIRTIO_CONFIG_S_DRIVER_OK; + +with + + should_start = virtio_device_started(vdev, status); + +which later got replaced by virtio_device_should_start(). This blocked +the possibility to set should_start to false in case the status flag +VIRTIO_CONFIG_S_DRIVER_OK was not set. + +Fix it by adjusting the virtio_device_should_start() function to +only consider the status flag instead of vdev->started. Since this +function is only used in the various vhost_*_set_status() functions +for exactly the same purpose, it should be fine to fix it in this +central place there without any risk to change the behavior of other +code. + +Fixes: 9f6bcfd99f ("hw/virtio: move vm_running check to virtio_device_started") +Buglink: https://issues.redhat.com/browse/RHEL-40708 +Signed-off-by: Thomas Huth +Message-Id: <20240618121958.88673-1-thuth@redhat.com> +Reviewed-by: Manos Pitsidianakis +Reviewed-by: Michael S. Tsirkin +Signed-off-by: Michael S. Tsirkin +(cherry picked from commit d72479b11797c28893e1e3fc565497a9cae5ca16) +Signed-off-by: Thomas Huth +--- + include/hw/virtio/virtio.h | 8 ++++---- + 1 file changed, 4 insertions(+), 4 deletions(-) + +diff --git a/include/hw/virtio/virtio.h b/include/hw/virtio/virtio.h +index 7d5ffdc145..2eafad17b8 100644 +--- a/include/hw/virtio/virtio.h ++++ b/include/hw/virtio/virtio.h +@@ -470,9 +470,9 @@ static inline bool virtio_device_started(VirtIODevice *vdev, uint8_t status) + * @vdev - the VirtIO device + * @status - the devices status bits + * +- * This is similar to virtio_device_started() but also encapsulates a +- * check on the VM status which would prevent a device starting +- * anyway. ++ * This is similar to virtio_device_started() but ignores vdev->started ++ * and also encapsulates a check on the VM status which would prevent a ++ * device from starting anyway. + */ + static inline bool virtio_device_should_start(VirtIODevice *vdev, uint8_t status) + { +@@ -480,7 +480,7 @@ static inline bool virtio_device_should_start(VirtIODevice *vdev, uint8_t status + return false; + } + +- return virtio_device_started(vdev, status); ++ return status & VIRTIO_CONFIG_S_DRIVER_OK; + } + + static inline void virtio_set_started(VirtIODevice *vdev, bool started) +-- +2.39.3 + diff --git a/qemu-kvm.spec b/qemu-kvm.spec index 9be90b4..65a1cc7 100644 --- a/qemu-kvm.spec +++ b/qemu-kvm.spec @@ -149,7 +149,7 @@ Obsoletes: %{name}-block-ssh <= %{epoch}:%{version} \ Summary: QEMU is a machine emulator and virtualizer Name: qemu-kvm Version: 9.0.0 -Release: 6%{?rcrel}%{?dist}%{?cc_suffix} +Release: 7%{?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) @@ -224,6 +224,10 @@ Patch32: kvm-iotests-244-Don-t-store-data-file-with-protocol-in-i.patch Patch33: kvm-iotests-270-Don-t-store-data-file-with-json-prefix-i.patch # For RHEL-35611 - CVE-2024-4467 qemu-kvm: QEMU: 'qemu-img info' leads to host file read/write [rhel-9.5] Patch34: kvm-block-Parse-filenames-only-when-explicitly-requested.patch +# For RHEL-40708 - [RHEL9.5.0][virtio_fs][s390x] after hot-unplug the vhost-user-fs-ccw device, the device is failed to hot-plug again +Patch35: kvm-hw-virtio-Fix-the-de-initialization-of-vhost-user-de.patch +# For RHEL-39936 - ARCH_DMA_MINALIGN smaller than CTR_EL0.CWG (128 < 256) on FUJITSU +Patch36: kvm-hw-arm-virt-Avoid-unexpected-warning-from-Linux-gues.patch %if %{have_clang} BuildRequires: clang @@ -1290,6 +1294,14 @@ useradd -r -u 107 -g qemu -G kvm -d / -s /sbin/nologin \ %endif %changelog +* Mon Jul 15 2024 Miroslav Rezanina - 9.0.0-7 +- kvm-hw-virtio-Fix-the-de-initialization-of-vhost-user-de.patch [RHEL-40708] +- kvm-hw-arm-virt-Avoid-unexpected-warning-from-Linux-gues.patch [RHEL-39936] +- Resolves: RHEL-40708 + ([RHEL9.5.0][virtio_fs][s390x] after hot-unplug the vhost-user-fs-ccw device, the device is failed to hot-plug again ) +- Resolves: RHEL-39936 + (ARCH_DMA_MINALIGN smaller than CTR_EL0.CWG (128 < 256) on FUJITSU) + * Thu Jul 04 2024 Miroslav Rezanina - 9.0.0-6 - kvm-qcow2-Don-t-open-data_file-with-BDRV_O_NO_IO.patch [RHEL-35611] - kvm-iotests-244-Don-t-store-data-file-with-protocol-in-i.patch [RHEL-35611]