From 7d7aec1bd3fc777fa836ccefd5a18a3e42f2f8c5 Mon Sep 17 00:00:00 2001 From: Jon Maloy Date: Tue, 27 Jan 2026 10:25:57 -0500 Subject: [PATCH] * Tue Jan 27 2026 Jon Maloy - 10.1.0-12 - kvm-block-Improve-comments-in-BlockLimits.patch [RHEL-132989] - kvm-block-Expose-block-limits-for-images-in-QMP.patch [RHEL-132989] - kvm-qemu-img-info-Optionally-show-block-limits.patch [RHEL-132989] - kvm-qemu-img-info-Add-cache-mode-option.patch [RHEL-132989] - kvm-hw-intc-ioapic-Fix-ACCEL_KERNEL_GSI_IRQFD_POSSIBLE-t.patch [RHEL-140187] - kvm-q35-increase-default-tseg-size.patch [RHEL-139057] - Resolves: RHEL-132989 (Expose block limits of block nodes in QMP and qemu-img [rhel-9]) - Resolves: RHEL-140187 (Intel IOMMU VM freezes: "call_irq_handler: 3.37 No irq handler for vector"[rhel-9.8]) - Resolves: RHEL-139057 ([qemu, rhel-9] increase default TSEG size) --- ...xpose-block-limits-for-images-in-QMP.patch | 255 ++++++++++++++++++ ...lock-Improve-comments-in-BlockLimits.patch | 98 +++++++ ...ix-ACCEL_KERNEL_GSI_IRQFD_POSSIBLE-t.patch | 68 +++++ kvm-q35-increase-default-tseg-size.patch | 62 +++++ kvm-qemu-img-info-Add-cache-mode-option.patch | 153 +++++++++++ ...mg-info-Optionally-show-block-limits.patch | 240 +++++++++++++++++ qemu-kvm.spec | 28 +- 7 files changed, 903 insertions(+), 1 deletion(-) create mode 100644 kvm-block-Expose-block-limits-for-images-in-QMP.patch create mode 100644 kvm-block-Improve-comments-in-BlockLimits.patch create mode 100644 kvm-hw-intc-ioapic-Fix-ACCEL_KERNEL_GSI_IRQFD_POSSIBLE-t.patch create mode 100644 kvm-q35-increase-default-tseg-size.patch create mode 100644 kvm-qemu-img-info-Add-cache-mode-option.patch create mode 100644 kvm-qemu-img-info-Optionally-show-block-limits.patch diff --git a/kvm-block-Expose-block-limits-for-images-in-QMP.patch b/kvm-block-Expose-block-limits-for-images-in-QMP.patch new file mode 100644 index 0000000..6ec490c --- /dev/null +++ b/kvm-block-Expose-block-limits-for-images-in-QMP.patch @@ -0,0 +1,255 @@ +From 8524b4a772f47d2be59ce2f07c7c6d5a8af056d0 Mon Sep 17 00:00:00 2001 +From: Kevin Wolf +Date: Fri, 24 Oct 2025 14:30:38 +0200 +Subject: [PATCH 2/6] block: Expose block limits for images in QMP + +RH-Author: Kevin Wolf +RH-MergeRequest: 440: block: Expose block limits in monitor and qemu-img info +RH-Jira: RHEL-132989 +RH-Acked-by: Hanna Czenczek +RH-Acked-by: Stefan Hajnoczi +RH-Commit: [2/4] 2c68f297c55a64249fd10ab2e06ae9446096a0a9 (kmwolf/centos-qemu-kvm) + +This information can be useful both for debugging and for management +tools trying to configure guest devices with the optimal limits +(possibly across multiple hosts). There is no reason not to make it +available, so just add it to BlockNodeInfo. + +Signed-off-by: Kevin Wolf +Reviewed-by: Eric Blake +Reviewed-by: Hanna Czenczek +Message-ID: <20251024123041.51254-3-kwolf@redhat.com> +Signed-off-by: Kevin Wolf +(cherry picked from commit d2634e18286a5772f04cc724e64f8b16a2124587) +Signed-off-by: Kevin Wolf +--- + block/qapi.c | 34 ++++++++++++++-- + qapi/block-core.json | 66 ++++++++++++++++++++++++++++++++ + tests/qemu-iotests/184 | 5 ++- + tests/qemu-iotests/184.out | 8 ---- + tests/qemu-iotests/common.filter | 3 +- + 5 files changed, 102 insertions(+), 14 deletions(-) + +diff --git a/block/qapi.c b/block/qapi.c +index 12fbf8d1b7..54521d0a68 100644 +--- a/block/qapi.c ++++ b/block/qapi.c +@@ -235,7 +235,8 @@ int bdrv_query_snapshot_info_list(BlockDriverState *bs, + * in @info, setting @errp on error. + */ + static void GRAPH_RDLOCK +-bdrv_do_query_node_info(BlockDriverState *bs, BlockNodeInfo *info, Error **errp) ++bdrv_do_query_node_info(BlockDriverState *bs, BlockNodeInfo *info, bool limits, ++ Error **errp) + { + int64_t size; + const char *backing_filename; +@@ -269,6 +270,33 @@ bdrv_do_query_node_info(BlockDriverState *bs, BlockNodeInfo *info, Error **errp) + info->dirty_flag = bdi.is_dirty; + info->has_dirty_flag = true; + } ++ ++ if (limits) { ++ info->limits = g_new(BlockLimitsInfo, 1); ++ *info->limits = (BlockLimitsInfo) { ++ .request_alignment = bs->bl.request_alignment, ++ .has_max_discard = bs->bl.max_pdiscard != 0, ++ .max_discard = bs->bl.max_pdiscard, ++ .has_discard_alignment = bs->bl.pdiscard_alignment != 0, ++ .discard_alignment = bs->bl.pdiscard_alignment, ++ .has_max_write_zeroes = bs->bl.max_pwrite_zeroes != 0, ++ .max_write_zeroes = bs->bl.max_pwrite_zeroes, ++ .has_write_zeroes_alignment = bs->bl.pwrite_zeroes_alignment != 0, ++ .write_zeroes_alignment = bs->bl.pwrite_zeroes_alignment, ++ .has_opt_transfer = bs->bl.opt_transfer != 0, ++ .opt_transfer = bs->bl.opt_transfer, ++ .has_max_transfer = bs->bl.max_transfer != 0, ++ .max_transfer = bs->bl.max_transfer, ++ .has_max_hw_transfer = bs->bl.max_hw_transfer != 0, ++ .max_hw_transfer = bs->bl.max_hw_transfer, ++ .max_iov = bs->bl.max_iov, ++ .has_max_hw_iov = bs->bl.max_hw_iov != 0, ++ .max_hw_iov = bs->bl.max_hw_iov, ++ .min_mem_alignment = bs->bl.min_mem_alignment, ++ .opt_mem_alignment = bs->bl.opt_mem_alignment, ++ }; ++ } ++ + info->format_specific = bdrv_get_specific_info(bs, &err); + if (err) { + error_propagate(errp, err); +@@ -343,7 +371,7 @@ void bdrv_query_image_info(BlockDriverState *bs, + ImageInfo *info; + + info = g_new0(ImageInfo, 1); +- bdrv_do_query_node_info(bs, qapi_ImageInfo_base(info), errp); ++ bdrv_do_query_node_info(bs, qapi_ImageInfo_base(info), true, errp); + if (*errp) { + goto fail; + } +@@ -397,7 +425,7 @@ void bdrv_query_block_graph_info(BlockDriverState *bs, + BdrvChild *c; + + info = g_new0(BlockGraphInfo, 1); +- bdrv_do_query_node_info(bs, qapi_BlockGraphInfo_base(info), errp); ++ bdrv_do_query_node_info(bs, qapi_BlockGraphInfo_base(info), false, errp); + if (*errp) { + goto fail; + } +diff --git a/qapi/block-core.json b/qapi/block-core.json +index dc6eb4ae23..2c037183f0 100644 +--- a/qapi/block-core.json ++++ b/qapi/block-core.json +@@ -275,6 +275,69 @@ + 'file': 'ImageInfoSpecificFileWrapper' + } } + ++## ++# @BlockLimitsInfo: ++# ++# @request-alignment: Alignment requirement, in bytes, for ++# offset/length of I/O requests. ++# ++# @max-discard: Maximum number of bytes that can be discarded at once. ++# If not present, there is no specific maximum. ++# ++# @discard-alignment: Optimal alignment for discard requests in bytes. ++# Note that this doesn't have to be a power of two. If not ++# present, discards don't have a alignment requirement different ++# from @request-alignment. ++# ++# @max-write-zeroes: Maximum number of bytes that can be zeroed out at ++# once. If not present, there is no specific maximum. ++# ++# @write-zeroes-alignment: Optimal alignment for write zeroes requests ++# in bytes. Note that this doesn't have to be a power of two. If ++# not present, write_zeroes doesn't have a alignment requirement ++# different from @request-alignment. ++# ++# @opt-transfer: Optimal transfer length in bytes. If not present, ++# there is no preferred size. ++# ++# @max-transfer: Maximal transfer length in bytes. If not present, ++# there is no specific maximum. ++# ++# @max-hw-transfer: Maximal hardware transfer length in bytes. ++# Applies whenever transfers to the device bypass the kernel I/O ++# scheduler, for example with SG_IO. If not present, there is no ++# specific maximum. ++# ++# @max-iov: Maximum number of scatter/gather elements ++# ++# @max-hw-iov: Maximum number of scatter/gather elements allowed by ++# the hardware. Applies whenever transfers to the device bypass ++# the kernel I/O scheduler, for example with SG_IO. If not ++# present, the hardware limits is unknown and @max-iov is always ++# used. ++# ++# @min-mem-alignment: Minimal required memory alignment in bytes for ++# zero-copy I/O to succeed. For unaligned requests, a bounce ++# buffer will be used. ++# ++# @opt-mem-alignment: Optimal memory alignment in bytes. This is the ++# alignment used for any buffer allocations QEMU performs ++# internally. ++## ++{ 'struct': 'BlockLimitsInfo', ++ 'data': { 'request-alignment': 'uint32', ++ '*max-discard': 'uint64', ++ '*discard-alignment': 'uint32', ++ '*max-write-zeroes': 'uint64', ++ '*write-zeroes-alignment': 'uint32', ++ '*opt-transfer': 'uint32', ++ '*max-transfer': 'uint32', ++ '*max-hw-transfer': 'uint32', ++ 'max-iov': 'int', ++ '*max-hw-iov': 'int', ++ 'min-mem-alignment': 'size', ++ 'opt-mem-alignment': 'size' } } ++ + ## + # @BlockNodeInfo: + # +@@ -304,6 +367,8 @@ + # + # @snapshots: list of VM snapshots + # ++# @limits: block limits that are used for I/O on the node (Since 10.2) ++# + # @format-specific: structure supplying additional format-specific + # information (since 1.7) + # +@@ -315,6 +380,7 @@ + '*cluster-size': 'int', '*encrypted': 'bool', '*compressed': 'bool', + '*backing-filename': 'str', '*full-backing-filename': 'str', + '*backing-filename-format': 'str', '*snapshots': ['SnapshotInfo'], ++ '*limits': 'BlockLimitsInfo', + '*format-specific': 'ImageInfoSpecific' } } + + ## +diff --git a/tests/qemu-iotests/184 b/tests/qemu-iotests/184 +index e4cbcd8634..6d0afe9d38 100755 +--- a/tests/qemu-iotests/184 ++++ b/tests/qemu-iotests/184 +@@ -45,8 +45,9 @@ do_run_qemu() + + run_qemu() + { +- do_run_qemu "$@" 2>&1 | _filter_testdir | _filter_qemu | _filter_qmp\ +- | _filter_qemu_io | _filter_generated_node_ids ++ do_run_qemu "$@" 2>&1 | _filter_testdir | _filter_qemu | _filter_qmp \ ++ | _filter_qemu_io | _filter_generated_node_ids \ ++ | _filter_img_info + } + + test_throttle=$($QEMU_IMG --help|grep throttle) +diff --git a/tests/qemu-iotests/184.out b/tests/qemu-iotests/184.out +index ef99bb2e9a..52692b6b3b 100644 +--- a/tests/qemu-iotests/184.out ++++ b/tests/qemu-iotests/184.out +@@ -41,12 +41,6 @@ Testing: + }, + "iops_wr": 0, + "ro": false, +- "children": [ +- { +- "node-name": "disk0", +- "child": "file" +- } +- ], + "node-name": "throttle0", + "backing_file_depth": 1, + "drv": "throttle", +@@ -75,8 +69,6 @@ Testing: + }, + "iops_wr": 0, + "ro": false, +- "children": [ +- ], + "node-name": "disk0", + "backing_file_depth": 0, + "drv": "null-co", +diff --git a/tests/qemu-iotests/common.filter b/tests/qemu-iotests/common.filter +index 35c0fc0d20..cd8b506dba 100644 +--- a/tests/qemu-iotests/common.filter ++++ b/tests/qemu-iotests/common.filter +@@ -230,6 +230,7 @@ _filter_img_info() + discard=0 + regex_json_spec_start='^ *"format-specific": \{' + regex_json_child_start='^ *"children": \[' ++ regex_json_limit_start='^ *"limits": \{' + gsed -e "s#$REMOTE_TEST_DIR#TEST_DIR#g" \ + -e "s#$IMGPROTO:$TEST_DIR#TEST_DIR#g" \ + -e "s#$TEST_DIR#TEST_DIR#g" \ +@@ -262,7 +263,7 @@ _filter_img_info() + discard=1 + elif [[ $line =~ "Child node '/" ]]; then + discard=1 +- elif [[ $line =~ $regex_json_spec_start ]]; then ++ elif [[ $line =~ $regex_json_spec_start || $line =~ $regex_json_limit_start ]]; then + discard=2 + regex_json_end="^${line%%[^ ]*}\\},? *$" + elif [[ $line =~ $regex_json_child_start ]]; then +-- +2.52.0 + diff --git a/kvm-block-Improve-comments-in-BlockLimits.patch b/kvm-block-Improve-comments-in-BlockLimits.patch new file mode 100644 index 0000000..dc686d7 --- /dev/null +++ b/kvm-block-Improve-comments-in-BlockLimits.patch @@ -0,0 +1,98 @@ +From 43ef7d6a38dd596315f1b66c5736df5d732abc95 Mon Sep 17 00:00:00 2001 +From: Kevin Wolf +Date: Fri, 24 Oct 2025 14:30:37 +0200 +Subject: [PATCH 1/6] block: Improve comments in BlockLimits + +RH-Author: Kevin Wolf +RH-MergeRequest: 440: block: Expose block limits in monitor and qemu-img info +RH-Jira: RHEL-132989 +RH-Acked-by: Hanna Czenczek +RH-Acked-by: Stefan Hajnoczi +RH-Commit: [1/4] 89b5ee003a4c87cd7736b9ca674baffdd92e38e5 (kmwolf/centos-qemu-kvm) + +Patches to expose the limits in QAPI have made clear that the existing +documentation of BlockLimits could be improved: The meaning of +min_mem_alignment and opt_mem_alignment could be clearer, and talking +about better alignment values isn't helpful when we only detect these +values and never choose them. + +Make the changes in the BlockLimits documentation now, so that the +patches exposing the fields in QAPI can use descriptions consistent with +it. + +Signed-off-by: Kevin Wolf +Message-ID: <20251024123041.51254-2-kwolf@redhat.com> +Reviewed-by: Eric Blake +Signed-off-by: Kevin Wolf +(cherry picked from commit 46dd683d56b1328cb2bc923914bfd7ac590064f7) +Signed-off-by: Kevin Wolf +--- + include/block/block_int-common.h | 30 +++++++++++++++++------------- + 1 file changed, 17 insertions(+), 13 deletions(-) + +diff --git a/include/block/block_int-common.h b/include/block/block_int-common.h +index 034c0634c8..5206f32d53 100644 +--- a/include/block/block_int-common.h ++++ b/include/block/block_int-common.h +@@ -817,10 +817,10 @@ typedef struct BlockLimits { + int64_t max_pdiscard; + + /* +- * Optimal alignment for discard requests in bytes. A power of 2 +- * is best but not mandatory. Must be a multiple of +- * bl.request_alignment, and must be less than max_pdiscard if +- * that is set. May be 0 if bl.request_alignment is good enough ++ * Optimal alignment for discard requests in bytes. Note that this doesn't ++ * have to be a power of two. Must be a multiple of bl.request_alignment, ++ * and must be less than max_pdiscard if that is set. May be 0 if ++ * bl.request_alignment is good enough. + */ + uint32_t pdiscard_alignment; + +@@ -831,11 +831,10 @@ typedef struct BlockLimits { + int64_t max_pwrite_zeroes; + + /* +- * Optimal alignment for write zeroes requests in bytes. A power +- * of 2 is best but not mandatory. Must be a multiple of +- * bl.request_alignment, and must be less than max_pwrite_zeroes +- * if that is set. May be 0 if bl.request_alignment is good +- * enough ++ * Optimal alignment for write zeroes requests in bytes. Note that this ++ * doesn't have to be a power of two. Must be a multiple of ++ * bl.request_alignment, and must be less than max_pwrite_zeroes if that is ++ * set. May be 0 if bl.request_alignment is good enough. + */ + uint32_t pwrite_zeroes_alignment; + +@@ -863,18 +862,23 @@ typedef struct BlockLimits { + uint64_t max_hw_transfer; + + /* +- * Maximal number of scatter/gather elements allowed by the hardware. ++ * Maximum number of scatter/gather elements allowed by the hardware. + * Applies whenever transfers to the device bypass the kernel I/O + * scheduler, for example with SG_IO. If larger than max_iov + * or if zero, blk_get_max_hw_iov will fall back to max_iov. + */ + int max_hw_iov; + +- +- /* memory alignment, in bytes so that no bounce buffer is needed */ ++ /* ++ * Minimal required memory alignment in bytes for zero-copy I/O to succeed. ++ * For unaligned requests, a bounce buffer will be used. ++ */ + size_t min_mem_alignment; + +- /* memory alignment, in bytes, for bounce buffer */ ++ /* ++ * Optimal memory alignment in bytes. This is the alignment used for any ++ * buffer allocations QEMU performs internally. ++ */ + size_t opt_mem_alignment; + + /* maximum number of iovec elements */ +-- +2.52.0 + diff --git a/kvm-hw-intc-ioapic-Fix-ACCEL_KERNEL_GSI_IRQFD_POSSIBLE-t.patch b/kvm-hw-intc-ioapic-Fix-ACCEL_KERNEL_GSI_IRQFD_POSSIBLE-t.patch new file mode 100644 index 0000000..cd68a7f --- /dev/null +++ b/kvm-hw-intc-ioapic-Fix-ACCEL_KERNEL_GSI_IRQFD_POSSIBLE-t.patch @@ -0,0 +1,68 @@ +From b10f6682b2a1462efb83ba6f407d9450e82b63ac Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?C=C3=A9dric=20Le=20Goater?= +Date: Thu, 6 Nov 2025 11:51:48 +0100 +Subject: [PATCH 5/6] hw/intc/ioapic: Fix ACCEL_KERNEL_GSI_IRQFD_POSSIBLE typo +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +RH-Author: Cédric Le Goater +RH-MergeRequest: 453: hw/intc/ioapic: Fix ACCEL_KERNEL_GSI_IRQFD_POSSIBLE typo +RH-Jira: RHEL-140187 +RH-Acked-by: Thomas Huth +RH-Acked-by: Igor Mammedov +RH-Commit: [1/1] 2a6d42467dceb8abf7679f1b73f1491bbf67ebc1 (clegoate/qemu-kvm-centos) + +Commit 638ac1c78457 introduced a regression in interrupt remapping +when running a VM configured with an intel-iommu device and an +assigned PCI VF. During boot, Linux reports repeated messages : + + [ 15.416794] __common_interrupt: 2.37 No irq handler for vector + [ 15.417266] __common_interrupt: 2.37 No irq handler for vector + [ 15.417733] __common_interrupt: 2.37 No irq handler for vector + [ 15.418202] __common_interrupt: 2.37 No irq handler for vector + [ 15.418670] __common_interrupt: 2.37 No irq handler for vector + +and may eventually hang. + +The issue is caused by the incorrect use of the macro +ACCEL_KERNEL_GSI_IRQFD_POSSIBLE, which should instead be +ACCEL_GSI_IRQFD_POSSIBLE. + +Fixes: 638ac1c78457 ("hw/intc: Generalize APIC helper names from kvm_* to accel_*") +Cc: Magnus Kulke +Signed-off-by: Cédric Le Goater +Reviewed-by: Philippe Mathieu-Daudé +Message-ID: <20251106105148.737093-1-clg@redhat.com> +Signed-off-by: Philippe Mathieu-Daudé +(cherry picked from commit 3abfbb571143ba865488b6c11f8ad75dda97d1a3) +Signed-off-by: Cédric Le Goater +--- + hw/intc/ioapic.c | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +diff --git a/hw/intc/ioapic.c b/hw/intc/ioapic.c +index e431d00311..38e4384648 100644 +--- a/hw/intc/ioapic.c ++++ b/hw/intc/ioapic.c +@@ -216,7 +216,7 @@ static void ioapic_update_kvm_routes(IOAPICCommonState *s) + #endif + } + +-#ifdef ACCEL_KERNEL_GSI_IRQFD_POSSIBLE ++#ifdef ACCEL_GSI_IRQFD_POSSIBLE + static void ioapic_iec_notifier(void *private, bool global, + uint32_t index, uint32_t mask) + { +@@ -434,7 +434,7 @@ static const MemoryRegionOps ioapic_io_ops = { + + static void ioapic_machine_done_notify(Notifier *notifier, void *data) + { +-#ifdef ACCEL_KERNEL_GSI_IRQFD_POSSIBLE ++#ifdef ACCEL_GSI_IRQFD_POSSIBLE + IOAPICCommonState *s = container_of(notifier, IOAPICCommonState, + machine_done); + +-- +2.52.0 + diff --git a/kvm-q35-increase-default-tseg-size.patch b/kvm-q35-increase-default-tseg-size.patch new file mode 100644 index 0000000..1225adc --- /dev/null +++ b/kvm-q35-increase-default-tseg-size.patch @@ -0,0 +1,62 @@ +From 2b12179e5fffa2d5eba61d828eb2a3f3c96864fb Mon Sep 17 00:00:00 2001 +From: Gerd Hoffmann +Date: Thu, 6 Nov 2025 11:56:40 +0100 +Subject: [PATCH 6/6] q35: increase default tseg size + +RH-Author: Gerd Hoffmann +RH-MergeRequest: 448: q35: increase default tseg size +RH-Jira: RHEL-139057 +RH-Acked-by: Igor Mammedov +RH-Acked-by: Jon Maloy +RH-Commit: [1/1] f69fba674307d2f1822045ddb41012d8b826724e (kraxel.rh/centos-src-qemu-kvm) + +With virtual machines becoming larger (more CPUs, more memory) the +memory needed by the SMM code in OVMF to manage page tables and vcpu +state grows too. + +Default SMM memory (aka TSEG) size is 16 MB, and this often is not +enough. Bump it to 64 MB for new machine types. + +Signed-off-by: Gerd Hoffmann +Reviewed-by: Michael S. Tsirkin +Signed-off-by: Michael S. Tsirkin +Message-Id: <20251106105640.1642109-1-kraxel@redhat.com> +(cherry picked from commit fa4136387928749d5a1b4fa3606ae0ce6dce75aa) + +[ RHEL: drop compat property update for upstream machine types ] +[ RHEL: add compat property for rhel 9.6 + older machine types ] + +Resolves: RHEL-139057 +--- + hw/i386/pc.c | 1 + + hw/pci-host/q35.c | 2 +- + 2 files changed, 2 insertions(+), 1 deletion(-) + +diff --git a/hw/i386/pc.c b/hw/i386/pc.c +index dc3f140fdc..1f4154de5e 100644 +--- a/hw/i386/pc.c ++++ b/hw/i386/pc.c +@@ -299,6 +299,7 @@ const size_t pc_rhel_compat_len = G_N_ELEMENTS(pc_rhel_compat); + + GlobalProperty pc_rhel_9_8_compat[] = { + /* pc_rhel_10_2_compat from pc_compat_10_0 */ ++ { "mch", "extended-tseg-mbytes", "16" }, + { TYPE_X86_CPU, "x-consistent-cache", "false" }, + { TYPE_X86_CPU, "x-vendor-cpuid-only-v2", "false" }, + { TYPE_X86_CPU, "x-arch-cap-always-on", "true" }, +diff --git a/hw/pci-host/q35.c b/hw/pci-host/q35.c +index 1951ae440c..a708758d36 100644 +--- a/hw/pci-host/q35.c ++++ b/hw/pci-host/q35.c +@@ -663,7 +663,7 @@ static void mch_realize(PCIDevice *d, Error **errp) + + static const Property mch_props[] = { + DEFINE_PROP_UINT16("extended-tseg-mbytes", MCHPCIState, ext_tseg_mbytes, +- 16), ++ 64), + DEFINE_PROP_BOOL("smbase-smram", MCHPCIState, has_smram_at_smbase, true), + }; + +-- +2.52.0 + diff --git a/kvm-qemu-img-info-Add-cache-mode-option.patch b/kvm-qemu-img-info-Add-cache-mode-option.patch new file mode 100644 index 0000000..7f0704d --- /dev/null +++ b/kvm-qemu-img-info-Add-cache-mode-option.patch @@ -0,0 +1,153 @@ +From e06931af04484b3900ab07f966df49dc1086734d Mon Sep 17 00:00:00 2001 +From: Kevin Wolf +Date: Fri, 24 Oct 2025 14:30:40 +0200 +Subject: [PATCH 4/6] qemu-img info: Add cache mode option + +RH-Author: Kevin Wolf +RH-MergeRequest: 440: block: Expose block limits in monitor and qemu-img info +RH-Jira: RHEL-132989 +RH-Acked-by: Hanna Czenczek +RH-Acked-by: Stefan Hajnoczi +RH-Commit: [4/4] 3b4c5546694ba39d46f18646dc1fce7a6d937e0f (kmwolf/centos-qemu-kvm) + +When querying block limits, different cache modes (in particular +O_DIRECT or not) can result in different limits. Add an option to +'qemu-img info' that allows the user to specify a cache mode, so that +they can get the block limits for the cache mode they intend to use with +their VM. + +Signed-off-by: Kevin Wolf +Message-ID: <20251024123041.51254-5-kwolf@redhat.com> +Reviewed-by: Eric Blake +Signed-off-by: Kevin Wolf +(cherry picked from commit 911992fd6ec7a84c7cc82831b4bcd8a2ca5ccc76) +Signed-off-by: Kevin Wolf +--- + docs/tools/qemu-img.rst | 2 +- + qemu-img-cmds.hx | 4 ++-- + qemu-img.c | 25 +++++++++++++++++++++---- + 3 files changed, 24 insertions(+), 7 deletions(-) + +diff --git a/docs/tools/qemu-img.rst b/docs/tools/qemu-img.rst +index fdc9ea9cf2..558b0eb84d 100644 +--- a/docs/tools/qemu-img.rst ++++ b/docs/tools/qemu-img.rst +@@ -503,7 +503,7 @@ Command description: + + The size syntax is similar to :manpage:`dd(1)`'s size syntax. + +-.. option:: info [--object OBJECTDEF] [--image-opts] [-f FMT] [--output=OFMT] [--backing-chain] [--limits] [-U] FILENAME ++.. option:: info [--object OBJECTDEF] [--image-opts] [-f FMT] [--output=OFMT] [--backing-chain] [--limits] [-t CACHE] [-U] FILENAME + + Give information about the disk image *FILENAME*. Use it in + particular to know the size reserved on disk which can be different +diff --git a/qemu-img-cmds.hx b/qemu-img-cmds.hx +index 74b66f9d42..6bc8265cfb 100644 +--- a/qemu-img-cmds.hx ++++ b/qemu-img-cmds.hx +@@ -66,9 +66,9 @@ SRST + ERST + + DEF("info", img_info, +- "info [--object objectdef] [--image-opts] [-f fmt] [--output=ofmt] [--backing-chain] [--limits] [-U] filename") ++ "info [--object objectdef] [--image-opts] [-f fmt] [--output=ofmt] [--backing-chain] [--limits] [-t CACHE] [-U] filename") + SRST +-.. option:: info [--object OBJECTDEF] [--image-opts] [-f FMT] [--output=OFMT] [--backing-chain] [--limits] [-U] FILENAME ++.. option:: info [--object OBJECTDEF] [--image-opts] [-f FMT] [--output=OFMT] [--backing-chain] [--limits] [-t CACHE] [-U] FILENAME + ERST + + DEF("map", img_map, +diff --git a/qemu-img.c b/qemu-img.c +index 5cdbeda969..a7791896c1 100644 +--- a/qemu-img.c ++++ b/qemu-img.c +@@ -3003,6 +3003,7 @@ static gboolean str_equal_func(gconstpointer a, gconstpointer b) + static BlockGraphInfoList *collect_image_info_list(bool image_opts, + const char *filename, + const char *fmt, ++ const char *cache, + bool chain, bool limits, + bool force_share) + { +@@ -3010,6 +3011,15 @@ static BlockGraphInfoList *collect_image_info_list(bool image_opts, + BlockGraphInfoList **tail = &head; + GHashTable *filenames; + Error *err = NULL; ++ int cache_flags = 0; ++ bool writethrough = false; ++ int ret; ++ ++ ret = bdrv_parse_cache_mode(cache, &cache_flags, &writethrough); ++ if (ret < 0) { ++ error_report("Invalid cache option: %s", cache); ++ return NULL; ++ } + + filenames = g_hash_table_new_full(g_str_hash, str_equal_func, NULL, NULL); + +@@ -3026,8 +3036,8 @@ static BlockGraphInfoList *collect_image_info_list(bool image_opts, + g_hash_table_insert(filenames, (gpointer)filename, NULL); + + blk = img_open(image_opts, filename, fmt, +- BDRV_O_NO_BACKING | BDRV_O_NO_IO, false, false, +- force_share); ++ BDRV_O_NO_BACKING | BDRV_O_NO_IO | cache_flags, ++ writethrough, false, force_share); + if (!blk) { + goto err; + } +@@ -3087,6 +3097,7 @@ static int img_info(const img_cmd_t *ccmd, int argc, char **argv) + OutputFormat output_format = OFORMAT_HUMAN; + bool chain = false; + const char *filename, *fmt; ++ const char *cache = BDRV_DEFAULT_CACHE; + BlockGraphInfoList *list; + bool image_opts = false; + bool force_share = false; +@@ -3099,13 +3110,14 @@ static int img_info(const img_cmd_t *ccmd, int argc, char **argv) + {"format", required_argument, 0, 'f'}, + {"image-opts", no_argument, 0, OPTION_IMAGE_OPTS}, + {"backing-chain", no_argument, 0, OPTION_BACKING_CHAIN}, ++ {"cache", required_argument, 0, 't'}, + {"force-share", no_argument, 0, 'U'}, + {"limits", no_argument, 0, OPTION_LIMITS}, + {"output", required_argument, 0, OPTION_OUTPUT}, + {"object", required_argument, 0, OPTION_OBJECT}, + {0, 0, 0, 0} + }; +- c = getopt_long(argc, argv, "hf:U", long_options, NULL); ++ c = getopt_long(argc, argv, "hf:t:U", long_options, NULL); + if (c == -1) { + break; + } +@@ -3121,6 +3133,8 @@ static int img_info(const img_cmd_t *ccmd, int argc, char **argv) + " (incompatible with -f|--format)\n" + " --backing-chain\n" + " display information about the backing chain for copy-on-write overlays\n" ++" -t, --cache CACHE\n" ++" cache mode for FILE (default: " BDRV_DEFAULT_CACHE ")\n" + " -U, --force-share\n" + " open image in shared mode for concurrent access\n" + " --limits\n" +@@ -3143,6 +3157,9 @@ static int img_info(const img_cmd_t *ccmd, int argc, char **argv) + case OPTION_BACKING_CHAIN: + chain = true; + break; ++ case 't': ++ cache = optarg; ++ break; + case 'U': + force_share = true; + break; +@@ -3164,7 +3181,7 @@ static int img_info(const img_cmd_t *ccmd, int argc, char **argv) + } + filename = argv[optind++]; + +- list = collect_image_info_list(image_opts, filename, fmt, chain, ++ list = collect_image_info_list(image_opts, filename, fmt, cache, chain, + limits, force_share); + if (!list) { + return 1; +-- +2.52.0 + diff --git a/kvm-qemu-img-info-Optionally-show-block-limits.patch b/kvm-qemu-img-info-Optionally-show-block-limits.patch new file mode 100644 index 0000000..109c224 --- /dev/null +++ b/kvm-qemu-img-info-Optionally-show-block-limits.patch @@ -0,0 +1,240 @@ +From f0a73f74d818259aeef128bd2a230a5db1381994 Mon Sep 17 00:00:00 2001 +From: Kevin Wolf +Date: Fri, 24 Oct 2025 14:30:39 +0200 +Subject: [PATCH 3/6] qemu-img info: Optionally show block limits + +RH-Author: Kevin Wolf +RH-MergeRequest: 440: block: Expose block limits in monitor and qemu-img info +RH-Jira: RHEL-132989 +RH-Acked-by: Hanna Czenczek +RH-Acked-by: Stefan Hajnoczi +RH-Commit: [3/4] 86bbedcb5b2cfffd1da1640aff391127e87c7228 (kmwolf/centos-qemu-kvm) + +Add a new --limits option to 'qemu-img info' that displays the block +limits for the image and all of its children, making the information +more accessible for human users than in QMP. This option is not enabled +by default because it can be a lot of output that isn't usually relevant +if you're not specifically trying to diagnose some I/O problem. + +This makes the same information automatically also available in HMP +'info block -v'. + +Signed-off-by: Kevin Wolf +Reviewed-by: Eric Blake +Reviewed-by: Hanna Czenczek +Message-ID: <20251024123041.51254-4-kwolf@redhat.com> +Signed-off-by: Kevin Wolf +(cherry picked from commit 5b4b3bfdfc28d2398f34194d260d6eef9a9048b4) +Signed-off-by: Kevin Wolf +--- + block/qapi.c | 34 ++++++++++++++++++++++++++++++++-- + docs/tools/qemu-img.rst | 6 +++++- + include/block/qapi.h | 2 +- + qemu-img-cmds.hx | 4 ++-- + qemu-img.c | 15 ++++++++++++--- + 5 files changed, 52 insertions(+), 9 deletions(-) + +diff --git a/block/qapi.c b/block/qapi.c +index 54521d0a68..9f5771e019 100644 +--- a/block/qapi.c ++++ b/block/qapi.c +@@ -417,6 +417,7 @@ fail: + */ + void bdrv_query_block_graph_info(BlockDriverState *bs, + BlockGraphInfo **p_info, ++ bool limits, + Error **errp) + { + ERRP_GUARD(); +@@ -425,7 +426,7 @@ void bdrv_query_block_graph_info(BlockDriverState *bs, + BdrvChild *c; + + info = g_new0(BlockGraphInfo, 1); +- bdrv_do_query_node_info(bs, qapi_BlockGraphInfo_base(info), false, errp); ++ bdrv_do_query_node_info(bs, qapi_BlockGraphInfo_base(info), limits, errp); + if (*errp) { + goto fail; + } +@@ -439,7 +440,7 @@ void bdrv_query_block_graph_info(BlockDriverState *bs, + QAPI_LIST_APPEND(children_list_tail, c_info); + + c_info->name = g_strdup(c->name); +- bdrv_query_block_graph_info(c->bs, &c_info->info, errp); ++ bdrv_query_block_graph_info(c->bs, &c_info->info, limits, errp); + if (*errp) { + goto fail; + } +@@ -936,6 +937,29 @@ void bdrv_image_info_specific_dump(ImageInfoSpecific *info_spec, + visit_free(v); + } + ++/** ++ * Dumps the given BlockLimitsInfo object in a human-readable form, ++ * prepending an optional prefix if the dump is not empty. ++ */ ++static void bdrv_image_info_limits_dump(BlockLimitsInfo *limits, ++ const char *prefix, ++ int indentation) ++{ ++ QObject *obj; ++ Visitor *v = qobject_output_visitor_new(&obj); ++ ++ visit_type_BlockLimitsInfo(v, NULL, &limits, &error_abort); ++ visit_complete(v, &obj); ++ if (!qobject_is_empty_dump(obj)) { ++ if (prefix) { ++ qemu_printf("%*s%s", indentation * 4, "", prefix); ++ } ++ dump_qobject(indentation + 1, obj); ++ } ++ qobject_unref(obj); ++ visit_free(v); ++} ++ + /** + * Print the given @info object in human-readable form. Every field is indented + * using the given @indentation (four spaces per indentation level). +@@ -1011,6 +1035,12 @@ void bdrv_node_info_dump(BlockNodeInfo *info, int indentation, bool protocol) + } + } + ++ if (info->limits) { ++ bdrv_image_info_limits_dump(info->limits, ++ "Block limits:\n", ++ indentation); ++ } ++ + if (info->has_snapshots) { + SnapshotInfoList *elem; + +diff --git a/docs/tools/qemu-img.rst b/docs/tools/qemu-img.rst +index 5e7b85079d..fdc9ea9cf2 100644 +--- a/docs/tools/qemu-img.rst ++++ b/docs/tools/qemu-img.rst +@@ -503,7 +503,7 @@ Command description: + + The size syntax is similar to :manpage:`dd(1)`'s size syntax. + +-.. option:: info [--object OBJECTDEF] [--image-opts] [-f FMT] [--output=OFMT] [--backing-chain] [-U] FILENAME ++.. option:: info [--object OBJECTDEF] [--image-opts] [-f FMT] [--output=OFMT] [--backing-chain] [--limits] [-U] FILENAME + + Give information about the disk image *FILENAME*. Use it in + particular to know the size reserved on disk which can be different +@@ -571,6 +571,10 @@ Command description: + ``ImageInfoSpecific*`` QAPI object (e.g. ``ImageInfoSpecificQCow2`` + for qcow2 images). + ++ *Block limits* ++ The block limits for I/O that QEMU detected for the image. ++ This information is only shown if the ``--limits`` option was specified. ++ + .. option:: map [--object OBJECTDEF] [--image-opts] [-f FMT] [--start-offset=OFFSET] [--max-length=LEN] [--output=OFMT] [-U] FILENAME + + Dump the metadata of image *FILENAME* and its backing file chain. +diff --git a/include/block/qapi.h b/include/block/qapi.h +index 54c48de26a..be554e53dc 100644 +--- a/include/block/qapi.h ++++ b/include/block/qapi.h +@@ -42,7 +42,7 @@ bdrv_query_image_info(BlockDriverState *bs, ImageInfo **p_info, bool flat, + bool skip_implicit_filters, Error **errp); + void GRAPH_RDLOCK + bdrv_query_block_graph_info(BlockDriverState *bs, BlockGraphInfo **p_info, +- Error **errp); ++ bool limits, Error **errp); + + void bdrv_snapshot_dump(QEMUSnapshotInfo *sn); + void bdrv_image_info_specific_dump(ImageInfoSpecific *info_spec, +diff --git a/qemu-img-cmds.hx b/qemu-img-cmds.hx +index 2c5a8a28f9..74b66f9d42 100644 +--- a/qemu-img-cmds.hx ++++ b/qemu-img-cmds.hx +@@ -66,9 +66,9 @@ SRST + ERST + + DEF("info", img_info, +- "info [--object objectdef] [--image-opts] [-f fmt] [--output=ofmt] [--backing-chain] [-U] filename") ++ "info [--object objectdef] [--image-opts] [-f fmt] [--output=ofmt] [--backing-chain] [--limits] [-U] filename") + SRST +-.. option:: info [--object OBJECTDEF] [--image-opts] [-f FMT] [--output=OFMT] [--backing-chain] [-U] FILENAME ++.. option:: info [--object OBJECTDEF] [--image-opts] [-f FMT] [--output=OFMT] [--backing-chain] [--limits] [-U] FILENAME + ERST + + DEF("map", img_map, +diff --git a/qemu-img.c b/qemu-img.c +index 7a162fdc08..5cdbeda969 100644 +--- a/qemu-img.c ++++ b/qemu-img.c +@@ -86,6 +86,7 @@ enum { + OPTION_BITMAPS = 275, + OPTION_FORCE = 276, + OPTION_SKIP_BROKEN = 277, ++ OPTION_LIMITS = 278, + }; + + typedef enum OutputFormat { +@@ -3002,7 +3003,8 @@ static gboolean str_equal_func(gconstpointer a, gconstpointer b) + static BlockGraphInfoList *collect_image_info_list(bool image_opts, + const char *filename, + const char *fmt, +- bool chain, bool force_share) ++ bool chain, bool limits, ++ bool force_share) + { + BlockGraphInfoList *head = NULL; + BlockGraphInfoList **tail = &head; +@@ -3039,7 +3041,7 @@ static BlockGraphInfoList *collect_image_info_list(bool image_opts, + * the chain manually here. + */ + bdrv_graph_rdlock_main_loop(); +- bdrv_query_block_graph_info(bs, &info, &err); ++ bdrv_query_block_graph_info(bs, &info, limits, &err); + bdrv_graph_rdunlock_main_loop(); + + if (err) { +@@ -3088,6 +3090,7 @@ static int img_info(const img_cmd_t *ccmd, int argc, char **argv) + BlockGraphInfoList *list; + bool image_opts = false; + bool force_share = false; ++ bool limits = false; + + fmt = NULL; + for(;;) { +@@ -3097,6 +3100,7 @@ static int img_info(const img_cmd_t *ccmd, int argc, char **argv) + {"image-opts", no_argument, 0, OPTION_IMAGE_OPTS}, + {"backing-chain", no_argument, 0, OPTION_BACKING_CHAIN}, + {"force-share", no_argument, 0, 'U'}, ++ {"limits", no_argument, 0, OPTION_LIMITS}, + {"output", required_argument, 0, OPTION_OUTPUT}, + {"object", required_argument, 0, OPTION_OBJECT}, + {0, 0, 0, 0} +@@ -3119,6 +3123,8 @@ static int img_info(const img_cmd_t *ccmd, int argc, char **argv) + " display information about the backing chain for copy-on-write overlays\n" + " -U, --force-share\n" + " open image in shared mode for concurrent access\n" ++" --limits\n" ++" show detected block limits (may depend on options, e.g. cache mode)\n" + " --output human|json\n" + " specify output format (default: human)\n" + " --object OBJDEF\n" +@@ -3140,6 +3146,9 @@ static int img_info(const img_cmd_t *ccmd, int argc, char **argv) + case 'U': + force_share = true; + break; ++ case OPTION_LIMITS: ++ limits = true; ++ break; + case OPTION_OUTPUT: + output_format = parse_output_format(argv[0], optarg); + break; +@@ -3156,7 +3165,7 @@ static int img_info(const img_cmd_t *ccmd, int argc, char **argv) + filename = argv[optind++]; + + list = collect_image_info_list(image_opts, filename, fmt, chain, +- force_share); ++ limits, force_share); + if (!list) { + return 1; + } +-- +2.52.0 + diff --git a/qemu-kvm.spec b/qemu-kvm.spec index a4eb948..95942c9 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: 10.1.0 -Release: 11%{?rcrel}%{?dist}%{?cc_suffix} +Release: 12%{?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) @@ -296,6 +296,18 @@ Patch75: kvm-accel-mshv-use-return-value-of-handle_pio_str_read.patch Patch76: kvm-monitor-generalize-query-mshv-info-mshv-to-query-acc.patch # For RHEL-138240 - QEMU crashes when stopping source VM during live migration [rhel-9] Patch77: kvm-block-Fix-BDS-use-after-free-during-shutdown.patch +# For RHEL-132989 - Expose block limits of block nodes in QMP and qemu-img [rhel-9] +Patch78: kvm-block-Improve-comments-in-BlockLimits.patch +# For RHEL-132989 - Expose block limits of block nodes in QMP and qemu-img [rhel-9] +Patch79: kvm-block-Expose-block-limits-for-images-in-QMP.patch +# For RHEL-132989 - Expose block limits of block nodes in QMP and qemu-img [rhel-9] +Patch80: kvm-qemu-img-info-Optionally-show-block-limits.patch +# For RHEL-132989 - Expose block limits of block nodes in QMP and qemu-img [rhel-9] +Patch81: kvm-qemu-img-info-Add-cache-mode-option.patch +# For RHEL-140187 - Intel IOMMU VM freezes: "call_irq_handler: 3.37 No irq handler for vector"[rhel-9.8] +Patch82: kvm-hw-intc-ioapic-Fix-ACCEL_KERNEL_GSI_IRQFD_POSSIBLE-t.patch +# For RHEL-139057 - [qemu, rhel-9] increase default TSEG size +Patch83: kvm-q35-increase-default-tseg-size.patch # For RHEL-11424 - [IBM 9.6 FEAT] KVM: Full boot order support - qemu part @@ -2010,6 +2022,20 @@ useradd -r -u 107 -g qemu -G kvm -d / -s /sbin/nologin \ %endif %changelog +* Tue Jan 27 2026 Jon Maloy - 10.1.0-12 +- kvm-block-Improve-comments-in-BlockLimits.patch [RHEL-132989] +- kvm-block-Expose-block-limits-for-images-in-QMP.patch [RHEL-132989] +- kvm-qemu-img-info-Optionally-show-block-limits.patch [RHEL-132989] +- kvm-qemu-img-info-Add-cache-mode-option.patch [RHEL-132989] +- kvm-hw-intc-ioapic-Fix-ACCEL_KERNEL_GSI_IRQFD_POSSIBLE-t.patch [RHEL-140187] +- kvm-q35-increase-default-tseg-size.patch [RHEL-139057] +- Resolves: RHEL-132989 + (Expose block limits of block nodes in QMP and qemu-img [rhel-9]) +- Resolves: RHEL-140187 + (Intel IOMMU VM freezes: "call_irq_handler: 3.37 No irq handler for vector"[rhel-9.8]) +- Resolves: RHEL-139057 + ([qemu, rhel-9] increase default TSEG size) + * Mon Jan 19 2026 Jon Maloy - 10.1.0-11 - kvm-block-Fix-BDS-use-after-free-during-shutdown.patch [RHEL-138240] - Resolves: RHEL-138240