* Wed Oct 22 2025 Miroslav Rezanina <mrezanin@redhat.com> - 10.1.0-1
- Rebase to QEMU 10.1.0 - Resolves: RHEL-117664 (Rebase qemu-kvm to QEMU 10.1)
This commit is contained in:
parent
1c20335723
commit
f3b86471cd
1
.gitignore
vendored
1
.gitignore
vendored
@ -30,3 +30,4 @@
|
||||
/qemu-8.2.0.tar.xz
|
||||
/qemu-9.0.0.tar.xz
|
||||
/qemu-9.1.0.tar.xz
|
||||
/qemu-10.1.0.tar.xz
|
||||
|
||||
@ -1,7 +1,7 @@
|
||||
From cbd36e2ba7f3e96ce441c7cfbf92017a7ba3bfe8 Mon Sep 17 00:00:00 2001
|
||||
From da33f839919c0a7b3bedc5d9986e4054b6533a73 Mon Sep 17 00:00:00 2001
|
||||
From: Miroslav Rezanina <mrezanin@redhat.com>
|
||||
Date: Wed, 26 May 2021 10:56:02 +0200
|
||||
Subject: Initial redhat build
|
||||
Subject: [PATCH] Initial redhat build
|
||||
|
||||
This patch introduces redhat build structure in redhat subdirectory. In addition,
|
||||
several issues are fixed in QEMU tree:
|
||||
@ -208,28 +208,12 @@ Merged patches (9.0.0 rc0):
|
||||
|
||||
Signed-off-by: Miroslav Rezanina <mrezanin@redhat.com>
|
||||
---
|
||||
.distro/Makefile | 101 +
|
||||
.distro/Makefile.common | 42 +
|
||||
.distro/README.tests | 39 +
|
||||
.distro/modules-load.conf | 4 +
|
||||
.distro/qemu-guest-agent.service | 1 -
|
||||
.distro/qemu-kvm.spec.template | 5351 +++++++++++++++++++++++
|
||||
.distro/rpminspect.yaml | 6 +-
|
||||
.distro/scripts/extract_build_cmd.py | 12 +
|
||||
.distro/scripts/frh.py | 4 +-
|
||||
.distro/scripts/process-patches.sh | 6 +-
|
||||
.gitignore | 1 +
|
||||
README.systemtap | 43 +
|
||||
scripts/qemu-guest-agent/fsfreeze-hook | 2 +-
|
||||
scripts/systemtap/conf.d/qemu_kvm.conf | 4 +
|
||||
scripts/systemtap/script.d/qemu_kvm.stp | 1 +
|
||||
ui/vnc-auth-sasl.c | 2 +-
|
||||
16 files changed, 5612 insertions(+), 7 deletions(-)
|
||||
create mode 100644 .distro/Makefile
|
||||
create mode 100644 .distro/Makefile.common
|
||||
create mode 100644 .distro/README.tests
|
||||
create mode 100644 .distro/modules-load.conf
|
||||
create mode 100644 .distro/qemu-kvm.spec.template
|
||||
README.systemtap | 43 +++++++++++++++++++++++++
|
||||
scripts/qemu-guest-agent/fsfreeze-hook | 4 +--
|
||||
scripts/systemtap/conf.d/qemu_kvm.conf | 4 +++
|
||||
scripts/systemtap/script.d/qemu_kvm.stp | 1 +
|
||||
ui/vnc-auth-sasl.c | 2 +-
|
||||
5 files changed, 51 insertions(+), 3 deletions(-)
|
||||
create mode 100644 README.systemtap
|
||||
create mode 100644 scripts/systemtap/conf.d/qemu_kvm.conf
|
||||
create mode 100644 scripts/systemtap/script.d/qemu_kvm.stp
|
||||
@ -284,14 +268,16 @@ index 0000000000..ad913fc990
|
||||
+3. Translate the trace record to readable format.
|
||||
+ # /usr/share/qemu-kvm/simpletrace.py --no-header /usr/share/qemu-kvm/trace-events /tmp/trace.log
|
||||
diff --git a/scripts/qemu-guest-agent/fsfreeze-hook b/scripts/qemu-guest-agent/fsfreeze-hook
|
||||
index 13aafd4845..e9b84ec028 100755
|
||||
index c1feb6f5ce..d5d8d4daf8 100755
|
||||
--- a/scripts/qemu-guest-agent/fsfreeze-hook
|
||||
+++ b/scripts/qemu-guest-agent/fsfreeze-hook
|
||||
@@ -8,7 +8,7 @@
|
||||
@@ -7,8 +7,8 @@
|
||||
# "freeze" argument before the filesystem is frozen. And for fsfreeze-thaw
|
||||
# request, it is issued with "thaw" argument after filesystem is thawed.
|
||||
|
||||
LOGFILE=/var/log/qga-fsfreeze-hook.log
|
||||
-LOGFILE=/var/log/qga-fsfreeze-hook.log
|
||||
-FSFREEZE_D=$(dirname -- "$0")/fsfreeze-hook.d
|
||||
+LOGFILE=/var/log/qemu-ga/qga-fsfreeze-hook.log
|
||||
+FSFREEZE_D=$(dirname -- "$(realpath $0)")/fsfreeze-hook.d
|
||||
|
||||
# Check whether file $1 is a backup or rpm-generated file and should be ignored
|
||||
@ -314,7 +300,7 @@ index 0000000000..c04abf9449
|
||||
@@ -0,0 +1 @@
|
||||
+probe qemu.kvm.simpletrace.handle_qmp_command,qemu.kvm.simpletrace.monitor_protocol_*,qemu.kvm.simpletrace.migrate_set_state {}
|
||||
diff --git a/ui/vnc-auth-sasl.c b/ui/vnc-auth-sasl.c
|
||||
index 47fdae5b21..2a950caa2a 100644
|
||||
index 3f4cfc471d..09dafba18d 100644
|
||||
--- a/ui/vnc-auth-sasl.c
|
||||
+++ b/ui/vnc-auth-sasl.c
|
||||
@@ -42,7 +42,7 @@
|
||||
@ -326,6 +312,3 @@ index 47fdae5b21..2a950caa2a 100644
|
||||
|
||||
if (saslErr != SASL_OK) {
|
||||
error_setg(errp, "Failed to initialize SASL auth: %s",
|
||||
--
|
||||
2.39.3
|
||||
|
||||
@ -1,104 +1,17 @@
|
||||
From f9c7b0f1176bc2a0ddd97de6e0fbc1055eab7b57 Mon Sep 17 00:00:00 2001
|
||||
From 8ac25eec353dc7b5458e9ad9832c0c909d54c808 Mon Sep 17 00:00:00 2001
|
||||
From: Miroslav Rezanina <mrezanin@redhat.com>
|
||||
Date: Wed, 7 Dec 2022 03:05:48 -0500
|
||||
Subject: Enable/disable devices for RHEL
|
||||
Subject: [PATCH] Enable/disable devices for RHEL
|
||||
|
||||
This commit adds all changes related to changes in supported devices.
|
||||
|
||||
Signed-off-by: Miroslav Rezanina <mrezanin@redhat.com>
|
||||
--
|
||||
Rebase notes (6.1.0):
|
||||
- Added CONFIG_TPM (except s390x)
|
||||
- default-configs moved to configs
|
||||
- Use --with-device-<ARCH> configure option to use rhel configs
|
||||
|
||||
Rebase notes (6.2.0):
|
||||
- Add CONFIG_ISA_FDC
|
||||
- Do not remove -no-hpet documentation
|
||||
|
||||
Rebase notes (7.0.0):
|
||||
- Added CONFIG_ARM_GIC_TCG option for aarch64
|
||||
- Fixes necessary for layout change fixes
|
||||
- Renamed CONFIG_ARM_GIC_TCG to CONFIG_ARM_GICV3_TCG
|
||||
- Removed upstream devices
|
||||
|
||||
Rebase notes (7.1.0):
|
||||
- Added CONFIG_VHOST_VSOCK and CONFIG_VHOST_USER_VSOCK configs
|
||||
- Added CONFIG_CXL and CONFIG_CXL_MEM_DEVICE for aarch64 and x86_64
|
||||
- Added CONFIG_VHOST_USER_FS option (all archs)
|
||||
|
||||
Rebase notes (7.2.0):
|
||||
- Removed disabling a15mpcore.c as no longer needed
|
||||
|
||||
Rebase notes (8.0.0):
|
||||
- Rename CONFIG_ACPI_X86_ICH to CONFIG_ACPI_ICH9
|
||||
- Inlude qemu/error-report.h in hw/display/cirrus_vga.c
|
||||
- Change virtiofsd dependency version
|
||||
|
||||
Rebase notes (8.1.0):
|
||||
- Added CONFIG_PCIE_PCI_BRIDGE for x86_64
|
||||
- Disabling tcg cpus for aarch64
|
||||
- Disable CONFIG_ARM_V7M and remove related hack
|
||||
- Moved aarch64 tcg cpu disabling from arm machine type commit
|
||||
|
||||
Rebase notes (8.2.0):
|
||||
- Disabled new a710 arm64 tcg cpu
|
||||
- No longer needed hack for removal of i2c-echo
|
||||
- Disable new neoverse-v2
|
||||
- Removed CONFIG_OPENGL from x86_64 config file
|
||||
|
||||
Rebase notes (9.0.0 rc0):
|
||||
- Split CONFIG_IDE_QDEV to CONFIG_IDE_DEV and CONFIG_IDE_BUS (upstream change)
|
||||
|
||||
Rebase notes (9.0.0 rc1):
|
||||
- Do not compile armv7 cpu types
|
||||
|
||||
Rebase notes (9.1.0 rc0):
|
||||
- Return value added for kvm_s390_apply_cpu_model
|
||||
- Added new USB_HID and USB_HUB options
|
||||
|
||||
Rebase notes (9.1.0 rc1):
|
||||
- Fix disabling cpus in valid_cpy_types
|
||||
|
||||
Merged patches (6.1.0):
|
||||
- c51bf45304 Remove SPICE and QXL from x86_64-rh-devices.mak
|
||||
- 02fc745601 aarch64-rh-devices: add CONFIG_PVPANIC_PCI
|
||||
- f2fe835153 aarch64-rh-devices: add CONFIG_PXB
|
||||
- b5431733ad disable CONFIG_USB_STORAGE_BOT
|
||||
- 478ba0cdf6 Disable TPM passthrough
|
||||
- 2504d68a7c aarch64: Add USB storage devices
|
||||
- 51c2a3253c disable ac97 audio
|
||||
|
||||
Merged patches (6.2.0):
|
||||
- 9f2f9fa2ba disable sga device
|
||||
|
||||
Merged patches (7.0.0):
|
||||
- fd7c45a5a8 redhat: Enable virtio-mem as tech-preview on x86-64
|
||||
- c9e68ea451 Enable SGX -- RH Only
|
||||
|
||||
Merged patches (7.1.0):
|
||||
- 38b89dc245 pc: Move s3/s4 suspend disabling to compat (only hw/acpi/ich9.c chunk)
|
||||
- 8f663466c6 configs/devices/aarch64-softmmu: Enable CONFIG_VIRTIO_MEM
|
||||
- 1bf372717a Enable virtio-iommu-pci on aarch64
|
||||
- ae3f269458 Enable virtio-iommu-pci on x86_64
|
||||
|
||||
Merged patches (8.1.0):
|
||||
- 8173d2eaba Disable unwanted new devices
|
||||
|
||||
Merged patches (8.2.0):
|
||||
- b29f66431f Enable igb on x86_64
|
||||
|
||||
Merged patches (9.0.0 rc0):
|
||||
- 3889ede5d9 Compile IOMMUFD on x86_64
|
||||
- 0beb18451f Compile IOMMUFD on s390x
|
||||
- 2b4b13f70d Compile IOMMUFD object on aarch64
|
||||
---
|
||||
.distro/qemu-kvm.spec.template | 18 +--
|
||||
.../aarch64-softmmu/aarch64-rh-devices.mak | 44 +++++++
|
||||
.../aarch64-softmmu/aarch64-rh-devices.mak | 45 +++++++
|
||||
.../ppc64-softmmu/ppc64-rh-devices.mak | 37 ++++++
|
||||
configs/devices/rh-virtio.mak | 10 ++
|
||||
.../s390x-softmmu/s390x-rh-devices.mak | 19 +++
|
||||
.../x86_64-softmmu/x86_64-rh-devices.mak | 114 ++++++++++++++++++
|
||||
.../s390x-softmmu/s390x-rh-devices.mak | 20 +++
|
||||
.../x86_64-softmmu/x86_64-rh-devices.mak | 117 ++++++++++++++++++
|
||||
hw/arm/virt.c | 4 +
|
||||
hw/block/fdc.c | 10 ++
|
||||
hw/cxl/meson.build | 3 +-
|
||||
@ -110,17 +23,17 @@ Merged patches (9.0.0 rc0):
|
||||
hw/usb/meson.build | 2 +-
|
||||
hw/virtio/meson.build | 6 +-
|
||||
target/arm/arm-qmp-cmds.c | 2 +
|
||||
target/arm/cpu.c | 4 +
|
||||
target/arm/cpu.h | 3 +
|
||||
target/arm/cpu64.c | 12 +-
|
||||
target/arm/cpu.h | 2 +
|
||||
target/arm/cpu64.c | 7 +-
|
||||
target/arm/tcg/cpu32.c | 2 +
|
||||
target/arm/tcg/cpu64.c | 8 ++
|
||||
target/arm/tcg/meson.build | 4 +-
|
||||
target/arm/tcg/meson.build | 2 +-
|
||||
target/i386/cpu.c | 4 +
|
||||
target/ppc/cpu-models.c | 9 ++
|
||||
target/s390x/cpu_models_sysemu.c | 3 +
|
||||
target/s390x/cpu_models_system.c | 3 +
|
||||
target/s390x/kvm/kvm.c | 8 ++
|
||||
tests/qtest/arm-cpu-features.c | 4 +
|
||||
27 files changed, 325 insertions(+), 16 deletions(-)
|
||||
26 files changed, 313 insertions(+), 7 deletions(-)
|
||||
create mode 100644 configs/devices/aarch64-softmmu/aarch64-rh-devices.mak
|
||||
create mode 100644 configs/devices/ppc64-softmmu/ppc64-rh-devices.mak
|
||||
create mode 100644 configs/devices/rh-virtio.mak
|
||||
@ -129,20 +42,21 @@ Merged patches (9.0.0 rc0):
|
||||
|
||||
diff --git a/configs/devices/aarch64-softmmu/aarch64-rh-devices.mak b/configs/devices/aarch64-softmmu/aarch64-rh-devices.mak
|
||||
new file mode 100644
|
||||
index 0000000000..c7e4fdc25a
|
||||
index 0000000000..840f3a3674
|
||||
--- /dev/null
|
||||
+++ b/configs/devices/aarch64-softmmu/aarch64-rh-devices.mak
|
||||
@@ -0,0 +1,44 @@
|
||||
@@ -0,0 +1,45 @@
|
||||
+include ../rh-virtio.mak
|
||||
+
|
||||
+CONFIG_ARM_GIC_KVM=y
|
||||
+CONFIG_ARM_GICV3_TCG=y
|
||||
+CONFIG_ARM_GICV3=y
|
||||
+CONFIG_ARM_GIC=y
|
||||
+CONFIG_ARM_SMMUV3=y
|
||||
+CONFIG_ARM_VIRT=y
|
||||
+CONFIG_CXL=y
|
||||
+CONFIG_CXL_MEM_DEVICE=y
|
||||
+CONFIG_EDID=y
|
||||
+CONFIG_PCI_BRIDGE=y
|
||||
+CONFIG_PCIE_PORT=y
|
||||
+CONFIG_PCIE_PCI_BRIDGE=y
|
||||
+CONFIG_PCI_DEVICES=y
|
||||
@ -238,10 +152,10 @@ index 0000000000..94ede1b5f6
|
||||
+CONFIG_VIRTIO_SERIAL=y
|
||||
diff --git a/configs/devices/s390x-softmmu/s390x-rh-devices.mak b/configs/devices/s390x-softmmu/s390x-rh-devices.mak
|
||||
new file mode 100644
|
||||
index 0000000000..24cf6dbd03
|
||||
index 0000000000..834281d872
|
||||
--- /dev/null
|
||||
+++ b/configs/devices/s390x-softmmu/s390x-rh-devices.mak
|
||||
@@ -0,0 +1,19 @@
|
||||
@@ -0,0 +1,20 @@
|
||||
+include ../rh-virtio.mak
|
||||
+
|
||||
+CONFIG_PCI=y
|
||||
@ -256,6 +170,7 @@ index 0000000000..24cf6dbd03
|
||||
+CONFIG_VFIO_PCI=y
|
||||
+CONFIG_VHOST_USER=y
|
||||
+CONFIG_VIRTIO_CCW=y
|
||||
+CONFIG_VIRTIO_MEM=y
|
||||
+CONFIG_WDT_DIAG288=y
|
||||
+CONFIG_VHOST_VSOCK=y
|
||||
+CONFIG_VHOST_USER_VSOCK=y
|
||||
@ -263,10 +178,10 @@ index 0000000000..24cf6dbd03
|
||||
+CONFIG_IOMMUFD=y
|
||||
diff --git a/configs/devices/x86_64-softmmu/x86_64-rh-devices.mak b/configs/devices/x86_64-softmmu/x86_64-rh-devices.mak
|
||||
new file mode 100644
|
||||
index 0000000000..3e5f693b62
|
||||
index 0000000000..8d3d9fc645
|
||||
--- /dev/null
|
||||
+++ b/configs/devices/x86_64-softmmu/x86_64-rh-devices.mak
|
||||
@@ -0,0 +1,114 @@
|
||||
@@ -0,0 +1,117 @@
|
||||
+include ../rh-virtio.mak
|
||||
+
|
||||
+CONFIG_ACPI=y
|
||||
@ -329,6 +244,7 @@ index 0000000000..3e5f693b62
|
||||
+CONFIG_PCSPK=y
|
||||
+CONFIG_PC_ACPI=y
|
||||
+CONFIG_PC_PCI=y
|
||||
+CONFIG_PCI_BRIDGE=y
|
||||
+CONFIG_PCIE_PCI_BRIDGE=y
|
||||
+CONFIG_PFLASH_CFI01=y
|
||||
+CONFIG_PVPANIC_ISA=y
|
||||
@ -342,6 +258,7 @@ index 0000000000..3e5f693b62
|
||||
+CONFIG_SEV=y
|
||||
+CONFIG_SMBIOS=y
|
||||
+CONFIG_SMBUS_EEPROM=y
|
||||
+CONFIG_TDX=y
|
||||
+CONFIG_TEST_DEVICES=y
|
||||
+CONFIG_USB=y
|
||||
+CONFIG_USB_EHCI=y
|
||||
@ -366,6 +283,7 @@ index 0000000000..3e5f693b62
|
||||
+CONFIG_VIRTIO_PCI=y
|
||||
+CONFIG_VIRTIO_VGA=y
|
||||
+CONFIG_VIRTIO_IOMMU=y
|
||||
+CONFIG_AMD_IOMMU=y
|
||||
+CONFIG_VMMOUSE=y
|
||||
+CONFIG_VMPORT=y
|
||||
+CONFIG_VTD=y
|
||||
@ -382,10 +300,10 @@ index 0000000000..3e5f693b62
|
||||
+CONFIG_VHOST_USER_FS=y
|
||||
+CONFIG_IOMMUFD=y
|
||||
diff --git a/hw/arm/virt.c b/hw/arm/virt.c
|
||||
index 687fe0bb8b..eea7d2d038 100644
|
||||
index ef6be3660f..b525e00365 100644
|
||||
--- a/hw/arm/virt.c
|
||||
+++ b/hw/arm/virt.c
|
||||
@@ -3032,6 +3032,7 @@ static void virt_machine_class_init(ObjectClass *oc, void *data)
|
||||
@@ -3183,6 +3183,7 @@ static void virt_machine_class_init(ObjectClass *oc, const void *data)
|
||||
MachineClass *mc = MACHINE_CLASS(oc);
|
||||
HotplugHandlerClass *hc = HOTPLUG_HANDLER_CLASS(oc);
|
||||
static const char * const valid_cpu_types[] = {
|
||||
@ -393,7 +311,7 @@ index 687fe0bb8b..eea7d2d038 100644
|
||||
#ifdef CONFIG_TCG
|
||||
ARM_CPU_TYPE_NAME("cortex-a7"),
|
||||
ARM_CPU_TYPE_NAME("cortex-a15"),
|
||||
@@ -3047,8 +3048,11 @@ static void virt_machine_class_init(ObjectClass *oc, void *data)
|
||||
@@ -3198,8 +3199,11 @@ static void virt_machine_class_init(ObjectClass *oc, const void *data)
|
||||
ARM_CPU_TYPE_NAME("neoverse-n2"),
|
||||
#endif /* TARGET_AARCH64 */
|
||||
#endif /* CONFIG_TCG */
|
||||
@ -406,7 +324,7 @@ index 687fe0bb8b..eea7d2d038 100644
|
||||
#if defined(CONFIG_KVM) || defined(CONFIG_HVF)
|
||||
ARM_CPU_TYPE_NAME("host"),
|
||||
diff --git a/hw/block/fdc.c b/hw/block/fdc.c
|
||||
index 6dd94e98bc..a05757fc9a 100644
|
||||
index d0f08c7be5..7f61684294 100644
|
||||
--- a/hw/block/fdc.c
|
||||
+++ b/hw/block/fdc.c
|
||||
@@ -49,6 +49,8 @@
|
||||
@ -418,7 +336,7 @@ index 6dd94e98bc..a05757fc9a 100644
|
||||
/********************************************************/
|
||||
/* debug Floppy devices */
|
||||
|
||||
@@ -2346,6 +2348,14 @@ void fdctrl_realize_common(DeviceState *dev, FDCtrl *fdctrl, Error **errp)
|
||||
@@ -2345,6 +2347,14 @@ void fdctrl_realize_common(DeviceState *dev, FDCtrl *fdctrl, Error **errp)
|
||||
FDrive *drive;
|
||||
static int command_tables_inited = 0;
|
||||
|
||||
@ -448,17 +366,17 @@ index 3e375f61a9..613adb3ebb 100644
|
||||
if_false: files(
|
||||
'cxl-host-stubs.c',
|
||||
diff --git a/hw/display/cirrus_vga.c b/hw/display/cirrus_vga.c
|
||||
index 150883a971..497365bd80 100644
|
||||
index ef08694626..e2ae9f0c60 100644
|
||||
--- a/hw/display/cirrus_vga.c
|
||||
+++ b/hw/display/cirrus_vga.c
|
||||
@@ -36,6 +36,7 @@
|
||||
#include "qemu/module.h"
|
||||
@@ -37,6 +37,7 @@
|
||||
#include "qemu/units.h"
|
||||
#include "qemu/log.h"
|
||||
#include "system/reset.h"
|
||||
+#include "qemu/error-report.h"
|
||||
#include "sysemu/reset.h"
|
||||
#include "qapi/error.h"
|
||||
#include "trace.h"
|
||||
#include "hw/pci/pci_device.h"
|
||||
@@ -2946,6 +2947,9 @@ static void pci_cirrus_vga_realize(PCIDevice *dev, Error **errp)
|
||||
PCIDeviceClass *pc = PCI_DEVICE_GET_CLASS(dev);
|
||||
int16_t device_id = pc->device_id;
|
||||
@ -470,10 +388,10 @@ index 150883a971..497365bd80 100644
|
||||
* Follow real hardware, cirrus card emulated has 4 MB video memory.
|
||||
* Also accept 8 MB/16 MB for backward compatibility.
|
||||
diff --git a/hw/ide/piix.c b/hw/ide/piix.c
|
||||
index 80efc633d3..9cb82b8eea 100644
|
||||
index a0f2709c69..8c3962443b 100644
|
||||
--- a/hw/ide/piix.c
|
||||
+++ b/hw/ide/piix.c
|
||||
@@ -191,7 +191,8 @@ static void piix3_ide_class_init(ObjectClass *klass, void *data)
|
||||
@@ -191,7 +191,8 @@ static void piix3_ide_class_init(ObjectClass *klass, const void *data)
|
||||
k->device_id = PCI_DEVICE_ID_INTEL_82371SB_1;
|
||||
k->class_id = PCI_CLASS_STORAGE_IDE;
|
||||
set_bit(DEVICE_CATEGORY_STORAGE, dc->categories);
|
||||
@ -483,7 +401,7 @@ index 80efc633d3..9cb82b8eea 100644
|
||||
}
|
||||
|
||||
static const TypeInfo piix3_ide_info = {
|
||||
@@ -215,6 +216,8 @@ static void piix4_ide_class_init(ObjectClass *klass, void *data)
|
||||
@@ -215,6 +216,8 @@ static void piix4_ide_class_init(ObjectClass *klass, const void *data)
|
||||
k->class_id = PCI_CLASS_STORAGE_IDE;
|
||||
set_bit(DEVICE_CATEGORY_STORAGE, dc->categories);
|
||||
dc->hotpluggable = false;
|
||||
@ -493,10 +411,10 @@ index 80efc633d3..9cb82b8eea 100644
|
||||
|
||||
static const TypeInfo piix4_ide_info = {
|
||||
diff --git a/hw/input/pckbd.c b/hw/input/pckbd.c
|
||||
index 74f10b640f..2e85ecf476 100644
|
||||
index 71f5f976e9..794078ed84 100644
|
||||
--- a/hw/input/pckbd.c
|
||||
+++ b/hw/input/pckbd.c
|
||||
@@ -952,6 +952,8 @@ static void i8042_class_initfn(ObjectClass *klass, void *data)
|
||||
@@ -950,6 +950,8 @@ static void i8042_class_initfn(ObjectClass *klass, const void *data)
|
||||
dc->vmsd = &vmstate_kbd_isa;
|
||||
adevc->build_dev_aml = i8042_build_aml;
|
||||
set_bit(DEVICE_CATEGORY_INPUT, dc->categories);
|
||||
@ -506,10 +424,10 @@ index 74f10b640f..2e85ecf476 100644
|
||||
|
||||
static const TypeInfo i8042_info = {
|
||||
diff --git a/hw/net/e1000.c b/hw/net/e1000.c
|
||||
index 5012b96464..b435e54228 100644
|
||||
index a80a7b0cdb..7eb5a3b19d 100644
|
||||
--- a/hw/net/e1000.c
|
||||
+++ b/hw/net/e1000.c
|
||||
@@ -1746,6 +1746,7 @@ static const E1000Info e1000_devices[] = {
|
||||
@@ -1732,6 +1732,7 @@ static const E1000Info e1000_devices[] = {
|
||||
.revision = 0x03,
|
||||
.phy_id2 = E1000_PHY_ID2_8254xx_DEFAULT,
|
||||
},
|
||||
@ -517,7 +435,7 @@ index 5012b96464..b435e54228 100644
|
||||
{
|
||||
.name = "e1000-82544gc",
|
||||
.device_id = E1000_DEV_ID_82544GC_COPPER,
|
||||
@@ -1758,6 +1759,7 @@ static const E1000Info e1000_devices[] = {
|
||||
@@ -1744,6 +1745,7 @@ static const E1000Info e1000_devices[] = {
|
||||
.revision = 0x03,
|
||||
.phy_id2 = E1000_PHY_ID2_8254xx_DEFAULT,
|
||||
},
|
||||
@ -526,10 +444,10 @@ index 5012b96464..b435e54228 100644
|
||||
|
||||
static void e1000_register_types(void)
|
||||
diff --git a/hw/ppc/spapr_cpu_core.c b/hw/ppc/spapr_cpu_core.c
|
||||
index 56090abcd1..0bf7c52077 100644
|
||||
index 4952f9bd2c..aaee248290 100644
|
||||
--- a/hw/ppc/spapr_cpu_core.c
|
||||
+++ b/hw/ppc/spapr_cpu_core.c
|
||||
@@ -399,10 +399,12 @@ static const TypeInfo spapr_cpu_core_type_infos[] = {
|
||||
@@ -401,10 +401,12 @@ static const TypeInfo spapr_cpu_core_type_infos[] = {
|
||||
.instance_size = sizeof(SpaprCpuCore),
|
||||
.class_size = sizeof(SpaprCpuCoreClass),
|
||||
},
|
||||
@ -543,10 +461,10 @@ index 56090abcd1..0bf7c52077 100644
|
||||
DEFINE_SPAPR_CPU_CORE_TYPE("power7p_v2.1"),
|
||||
DEFINE_SPAPR_CPU_CORE_TYPE("power8_v2.0"),
|
||||
diff --git a/hw/usb/meson.build b/hw/usb/meson.build
|
||||
index d7de1003e3..1cdc0a1ba0 100644
|
||||
index 17360a5b5a..3c4fdfc31d 100644
|
||||
--- a/hw/usb/meson.build
|
||||
+++ b/hw/usb/meson.build
|
||||
@@ -55,7 +55,7 @@ system_ss.add(when: 'CONFIG_USB_SMARTCARD', if_true: files('dev-smartcard-reader
|
||||
@@ -53,7 +53,7 @@ system_ss.add(when: 'CONFIG_USB_SMARTCARD', if_true: files('dev-smartcard-reader
|
||||
if cacard.found()
|
||||
usbsmartcard_ss = ss.source_set()
|
||||
usbsmartcard_ss.add(when: 'CONFIG_USB_SMARTCARD',
|
||||
@ -556,10 +474,10 @@ index d7de1003e3..1cdc0a1ba0 100644
|
||||
endif
|
||||
|
||||
diff --git a/hw/virtio/meson.build b/hw/virtio/meson.build
|
||||
index 621fc65454..c38bdd6fa4 100644
|
||||
index 3ea7b3cec8..3102d68bec 100644
|
||||
--- a/hw/virtio/meson.build
|
||||
+++ b/hw/virtio/meson.build
|
||||
@@ -20,7 +20,8 @@ if have_vhost
|
||||
@@ -22,7 +22,8 @@ if have_vhost
|
||||
system_virtio_ss.add(files('vhost-user-base.c'))
|
||||
|
||||
# MMIO Stubs
|
||||
@ -569,7 +487,7 @@ index 621fc65454..c38bdd6fa4 100644
|
||||
system_virtio_ss.add(when: 'CONFIG_VHOST_USER_GPIO', if_true: files('vhost-user-gpio.c'))
|
||||
system_virtio_ss.add(when: 'CONFIG_VHOST_USER_I2C', if_true: files('vhost-user-i2c.c'))
|
||||
system_virtio_ss.add(when: 'CONFIG_VHOST_USER_RNG', if_true: files('vhost-user-rng.c'))
|
||||
@@ -28,7 +29,8 @@ if have_vhost
|
||||
@@ -30,7 +31,8 @@ if have_vhost
|
||||
system_virtio_ss.add(when: 'CONFIG_VHOST_USER_INPUT', if_true: files('vhost-user-input.c'))
|
||||
|
||||
# PCI Stubs
|
||||
@ -580,10 +498,10 @@ index 621fc65454..c38bdd6fa4 100644
|
||||
if_true: files('vhost-user-gpio-pci.c'))
|
||||
system_virtio_ss.add(when: ['CONFIG_VIRTIO_PCI', 'CONFIG_VHOST_USER_I2C'],
|
||||
diff --git a/target/arm/arm-qmp-cmds.c b/target/arm/arm-qmp-cmds.c
|
||||
index 3cc8cc738b..6f21fea1f5 100644
|
||||
index d292c974c4..9bb68866e1 100644
|
||||
--- a/target/arm/arm-qmp-cmds.c
|
||||
+++ b/target/arm/arm-qmp-cmds.c
|
||||
@@ -223,6 +223,7 @@ CpuModelExpansionInfo *qmp_query_cpu_model_expansion(CpuModelExpansionType type,
|
||||
@@ -225,6 +225,7 @@ CpuModelExpansionInfo *qmp_query_cpu_model_expansion(CpuModelExpansionType type,
|
||||
static void arm_cpu_add_definition(gpointer data, gpointer user_data)
|
||||
{
|
||||
ObjectClass *oc = data;
|
||||
@ -591,7 +509,7 @@ index 3cc8cc738b..6f21fea1f5 100644
|
||||
CpuDefinitionInfoList **cpu_list = user_data;
|
||||
CpuDefinitionInfo *info;
|
||||
const char *typename;
|
||||
@@ -231,6 +232,7 @@ static void arm_cpu_add_definition(gpointer data, gpointer user_data)
|
||||
@@ -233,6 +234,7 @@ static void arm_cpu_add_definition(gpointer data, gpointer user_data)
|
||||
info = g_malloc0(sizeof(*info));
|
||||
info->name = cpu_model_from_type(typename);
|
||||
info->q_typename = g_strdup(typename);
|
||||
@ -599,47 +517,24 @@ index 3cc8cc738b..6f21fea1f5 100644
|
||||
|
||||
QAPI_LIST_PREPEND(*cpu_list, info);
|
||||
}
|
||||
diff --git a/target/arm/cpu.c b/target/arm/cpu.c
|
||||
index 19191c2391..465f423d25 100644
|
||||
--- a/target/arm/cpu.c
|
||||
+++ b/target/arm/cpu.c
|
||||
@@ -2726,6 +2726,10 @@ static void cpu_register_class_init(ObjectClass *oc, void *data)
|
||||
|
||||
acc->info = data;
|
||||
cc->gdb_core_xml_file = "arm-core.xml";
|
||||
+
|
||||
+ if (acc->info->deprecation_note) {
|
||||
+ cc->deprecation_note = acc->info->deprecation_note;
|
||||
+ }
|
||||
}
|
||||
|
||||
void arm_cpu_register(const ARMCPUInfo *info)
|
||||
diff --git a/target/arm/cpu.h b/target/arm/cpu.h
|
||||
index 9a3fd59562..1261eae94d 100644
|
||||
index dc9b6dce4c..dc0da8b0ae 100644
|
||||
--- a/target/arm/cpu.h
|
||||
+++ b/target/arm/cpu.h
|
||||
@@ -35,6 +35,8 @@
|
||||
#define KVM_HAVE_MCE_INJECTION 1
|
||||
#endif
|
||||
@@ -34,6 +34,8 @@
|
||||
#include "target/arm/gtimer.h"
|
||||
#include "target/arm/cpu-sysregs.h"
|
||||
|
||||
+#define RHEL_CPU_DEPRECATION "use 'host' / 'max'"
|
||||
+
|
||||
#define EXCP_UDEF 1 /* undefined instruction */
|
||||
#define EXCP_SWI 2 /* software interrupt */
|
||||
#define EXCP_PREFETCH_ABORT 3
|
||||
@@ -1110,6 +1112,7 @@ typedef struct ARMCPUInfo {
|
||||
const char *name;
|
||||
void (*initfn)(Object *obj);
|
||||
void (*class_init)(ObjectClass *oc, void *data);
|
||||
+ const char *deprecation_note;
|
||||
} ARMCPUInfo;
|
||||
|
||||
/**
|
||||
diff --git a/target/arm/cpu64.c b/target/arm/cpu64.c
|
||||
index 262a1d6c0b..800514d3fc 100644
|
||||
index 26cf7e6dfa..051d5d653b 100644
|
||||
--- a/target/arm/cpu64.c
|
||||
+++ b/target/arm/cpu64.c
|
||||
@@ -653,6 +653,7 @@ static void aarch64_a57_initfn(Object *obj)
|
||||
@@ -698,6 +698,7 @@ static void aarch64_a57_initfn(Object *obj)
|
||||
define_cortex_a72_a57_a53_cp_reginfo(cpu);
|
||||
}
|
||||
|
||||
@ -647,7 +542,7 @@ index 262a1d6c0b..800514d3fc 100644
|
||||
static void aarch64_a53_initfn(Object *obj)
|
||||
{
|
||||
ARMCPU *cpu = ARM_CPU(obj);
|
||||
@@ -710,6 +711,7 @@ static void aarch64_a53_initfn(Object *obj)
|
||||
@@ -759,6 +760,7 @@ static void aarch64_a53_initfn(Object *obj)
|
||||
cpu->gic_pribits = 5;
|
||||
define_cortex_a72_a57_a53_cp_reginfo(cpu);
|
||||
}
|
||||
@ -655,7 +550,7 @@ index 262a1d6c0b..800514d3fc 100644
|
||||
|
||||
static void aarch64_host_initfn(Object *obj)
|
||||
{
|
||||
@@ -748,8 +750,11 @@ static void aarch64_max_initfn(Object *obj)
|
||||
@@ -797,8 +799,11 @@ static void aarch64_max_initfn(Object *obj)
|
||||
}
|
||||
|
||||
static const ARMCPUInfo aarch64_cpus[] = {
|
||||
@ -668,39 +563,25 @@ index 262a1d6c0b..800514d3fc 100644
|
||||
{ .name = "max", .initfn = aarch64_max_initfn },
|
||||
#if defined(CONFIG_KVM) || defined(CONFIG_HVF)
|
||||
{ .name = "host", .initfn = aarch64_host_initfn },
|
||||
@@ -820,8 +825,13 @@ static void aarch64_cpu_instance_init(Object *obj)
|
||||
static void cpu_register_class_init(ObjectClass *oc, void *data)
|
||||
{
|
||||
ARMCPUClass *acc = ARM_CPU_CLASS(oc);
|
||||
+ CPUClass *cc = CPU_CLASS(oc);
|
||||
|
||||
acc->info = data;
|
||||
+
|
||||
+ if (acc->info->deprecation_note) {
|
||||
+ cc->deprecation_note = acc->info->deprecation_note;
|
||||
+ }
|
||||
}
|
||||
|
||||
void aarch64_cpu_register(const ARMCPUInfo *info)
|
||||
diff --git a/target/arm/tcg/cpu32.c b/target/arm/tcg/cpu32.c
|
||||
index 20c2737f17..7e66fb6f14 100644
|
||||
index a2a23eae0d..c362759d65 100644
|
||||
--- a/target/arm/tcg/cpu32.c
|
||||
+++ b/target/arm/tcg/cpu32.c
|
||||
@@ -120,6 +120,7 @@ void aa32_max_features(ARMCPU *cpu)
|
||||
cpu->isar.id_dfr1 = t;
|
||||
@@ -115,6 +115,7 @@ void aa32_max_features(ARMCPU *cpu)
|
||||
FIELD_DP32_IDREG(isar, ID_DFR1, HPMN0, 1); /* FEAT_HPMN0 */
|
||||
}
|
||||
|
||||
+#if 0 /* Disabled for Red Hat Enterprise Linux */
|
||||
/* CPU models. These are not needed for the AArch64 linux-user build. */
|
||||
#if !defined(CONFIG_USER_ONLY) || !defined(TARGET_AARCH64)
|
||||
|
||||
@@ -1066,3 +1067,4 @@ static void arm_tcg_cpu_register_types(void)
|
||||
@@ -1084,3 +1085,4 @@ static void arm_tcg_cpu_register_types(void)
|
||||
type_init(arm_tcg_cpu_register_types)
|
||||
|
||||
#endif /* !CONFIG_USER_ONLY || !TARGET_AARCH64 */
|
||||
+#endif /* disabled for RHEL */
|
||||
diff --git a/target/arm/tcg/cpu64.c b/target/arm/tcg/cpu64.c
|
||||
index fe232eb306..2678047488 100644
|
||||
index 35cddbafa4..c7c464a0af 100644
|
||||
--- a/target/arm/tcg/cpu64.c
|
||||
+++ b/target/arm/tcg/cpu64.c
|
||||
@@ -29,6 +29,7 @@
|
||||
@ -708,10 +589,10 @@ index fe232eb306..2678047488 100644
|
||||
#include "cpregs.h"
|
||||
|
||||
+#if 0 /* Disabled for Red Hat Enterprise Linux */
|
||||
static uint64_t make_ccsidr64(unsigned assoc, unsigned linesize,
|
||||
unsigned cachesize)
|
||||
static void aarch64_a35_initfn(Object *obj)
|
||||
{
|
||||
@@ -135,6 +136,7 @@ static void aarch64_a35_initfn(Object *obj)
|
||||
ARMCPU *cpu = ARM_CPU(obj);
|
||||
@@ -113,6 +114,7 @@ static void aarch64_a35_initfn(Object *obj)
|
||||
/* These values are the same with A53/A57/A72. */
|
||||
define_cortex_a72_a57_a53_cp_reginfo(cpu);
|
||||
}
|
||||
@ -719,15 +600,15 @@ index fe232eb306..2678047488 100644
|
||||
|
||||
static void cpu_max_get_sve_max_vq(Object *obj, Visitor *v, const char *name,
|
||||
void *opaque, Error **errp)
|
||||
@@ -224,6 +226,7 @@ static void cpu_max_get_l0gptsz(Object *obj, Visitor *v, const char *name,
|
||||
static Property arm_cpu_lpa2_property =
|
||||
@@ -199,6 +201,7 @@ static void cpu_max_get_l0gptsz(Object *obj, Visitor *v, const char *name,
|
||||
static const Property arm_cpu_lpa2_property =
|
||||
DEFINE_PROP_BOOL("lpa2", ARMCPU, prop_lpa2, true);
|
||||
|
||||
+#if 0 /* Disabled for Red Hat Enterprise Linux */
|
||||
static void aarch64_a55_initfn(Object *obj)
|
||||
{
|
||||
ARMCPU *cpu = ARM_CPU(obj);
|
||||
@@ -1074,6 +1077,7 @@ static void aarch64_neoverse_n2_initfn(Object *obj)
|
||||
@@ -1080,6 +1083,7 @@ static void aarch64_neoverse_n2_initfn(Object *obj)
|
||||
aarch64_add_pauth_properties(obj);
|
||||
aarch64_add_sve_properties(obj);
|
||||
}
|
||||
@ -735,7 +616,7 @@ index fe232eb306..2678047488 100644
|
||||
|
||||
/*
|
||||
* -cpu max: a CPU with as many features enabled as our emulation supports.
|
||||
@@ -1295,6 +1299,7 @@ void aarch64_max_tcg_initfn(Object *obj)
|
||||
@@ -1310,6 +1314,7 @@ void aarch64_max_tcg_initfn(Object *obj)
|
||||
qdev_property_add_static(DEVICE(obj), &arm_cpu_lpa2_property);
|
||||
}
|
||||
|
||||
@ -743,7 +624,7 @@ index fe232eb306..2678047488 100644
|
||||
static const ARMCPUInfo aarch64_cpus[] = {
|
||||
{ .name = "cortex-a35", .initfn = aarch64_a35_initfn },
|
||||
{ .name = "cortex-a55", .initfn = aarch64_a55_initfn },
|
||||
@@ -1306,14 +1311,17 @@ static const ARMCPUInfo aarch64_cpus[] = {
|
||||
@@ -1321,14 +1326,17 @@ static const ARMCPUInfo aarch64_cpus[] = {
|
||||
{ .name = "neoverse-v1", .initfn = aarch64_neoverse_v1_initfn },
|
||||
{ .name = "neoverse-n2", .initfn = aarch64_neoverse_n2_initfn },
|
||||
};
|
||||
@ -755,26 +636,63 @@ index fe232eb306..2678047488 100644
|
||||
size_t i;
|
||||
|
||||
for (i = 0; i < ARRAY_SIZE(aarch64_cpus); ++i) {
|
||||
aarch64_cpu_register(&aarch64_cpus[i]);
|
||||
arm_cpu_register(&aarch64_cpus[i]);
|
||||
}
|
||||
+#endif
|
||||
}
|
||||
|
||||
type_init(aarch64_cpu_register_types)
|
||||
diff --git a/target/arm/tcg/meson.build b/target/arm/tcg/meson.build
|
||||
index 508932a249..7a12d7bfba 100644
|
||||
index 895facdc30..f1a9e01c51 100644
|
||||
--- a/target/arm/tcg/meson.build
|
||||
+++ b/target/arm/tcg/meson.build
|
||||
@@ -58,5 +58,5 @@ arm_system_ss.add(files(
|
||||
@@ -53,7 +53,7 @@ arm_system_ss.add(files(
|
||||
'psci.c',
|
||||
))
|
||||
|
||||
-arm_system_ss.add(when: 'CONFIG_ARM_V7M', if_true: files('cpu-v7m.c'))
|
||||
-arm_user_ss.add(when: 'TARGET_AARCH64', if_false: files('cpu-v7m.c'))
|
||||
+#arm_system_ss.add(when: 'CONFIG_ARM_V7M', if_true: files('cpu-v7m.c'))
|
||||
+#arm_user_ss.add(when: 'TARGET_AARCH64', if_false: files('cpu-v7m.c'))
|
||||
arm_user_ss.add(when: 'TARGET_AARCH64', if_false: files('cpu-v7m.c'))
|
||||
|
||||
arm_common_ss.add(zlib)
|
||||
diff --git a/target/i386/cpu.c b/target/i386/cpu.c
|
||||
index 6d85149e6e..ac1c06c3f9 100644
|
||||
--- a/target/i386/cpu.c
|
||||
+++ b/target/i386/cpu.c
|
||||
@@ -3163,6 +3163,7 @@ static const CPUCaches xeon_srf_cache_info = {
|
||||
},
|
||||
};
|
||||
|
||||
+#if 0 /* Disabled for Red Hat Enterprise Linux */
|
||||
static const CPUCaches yongfeng_cache_info = {
|
||||
.l1d_cache = &(CPUCacheInfo) {
|
||||
/* CPUID 0x4.0x0.EAX */
|
||||
@@ -3261,6 +3262,7 @@ static const CPUCaches yongfeng_cache_info = {
|
||||
.share_level = CPU_TOPOLOGY_LEVEL_DIE,
|
||||
},
|
||||
};
|
||||
+#endif
|
||||
|
||||
/* The following VMX features are not supported by KVM and are left out in the
|
||||
* CPU definitions:
|
||||
@@ -6420,6 +6422,7 @@ static const X86CPUDefinition builtin_x86_defs[] = {
|
||||
{ /* end of list */ }
|
||||
}
|
||||
},
|
||||
+#if 0 /* Disabled for Red Hat Enterprise Linux */
|
||||
{
|
||||
.name = "YongFeng",
|
||||
.level = 0x1F,
|
||||
@@ -6565,6 +6568,7 @@ static const X86CPUDefinition builtin_x86_defs[] = {
|
||||
{ /* end of list */ }
|
||||
}
|
||||
},
|
||||
+#endif /* Disabled for RHEL */
|
||||
{
|
||||
.name = "EPYC-Turin",
|
||||
.level = 0xd,
|
||||
diff --git a/target/ppc/cpu-models.c b/target/ppc/cpu-models.c
|
||||
index f2301b43f7..f77ebfcc81 100644
|
||||
index ea86ea202a..a545ff5f16 100644
|
||||
--- a/target/ppc/cpu-models.c
|
||||
+++ b/target/ppc/cpu-models.c
|
||||
@@ -66,6 +66,7 @@
|
||||
@ -804,7 +722,7 @@ index f2301b43f7..f77ebfcc81 100644
|
||||
POWERPC_DEF("power7_v2.3", CPU_POWERPC_POWER7_v23, POWER7,
|
||||
"POWER7 v2.3")
|
||||
POWERPC_DEF("power7p_v2.1", CPU_POWERPC_POWER7P_v21, POWER7,
|
||||
@@ -894,13 +898,16 @@ PowerPCCPUAlias ppc_cpu_aliases[] = {
|
||||
@@ -896,13 +900,16 @@ PowerPCCPUAlias ppc_cpu_aliases[] = {
|
||||
{ "7447a", "7447a_v1.2" },
|
||||
{ "7457a", "7457a_v1.2" },
|
||||
{ "apollo7pm", "7457a_v1.0" },
|
||||
@ -821,8 +739,8 @@ index f2301b43f7..f77ebfcc81 100644
|
||||
{ "power7", "power7_v2.3" },
|
||||
{ "power7+", "power7p_v2.1" },
|
||||
{ "power7+_v2.1", "power7p_v2.1" },
|
||||
@@ -911,12 +918,14 @@ PowerPCCPUAlias ppc_cpu_aliases[] = {
|
||||
{ "power10", "power10_v2.0" },
|
||||
@@ -914,12 +921,14 @@ PowerPCCPUAlias ppc_cpu_aliases[] = {
|
||||
{ "power11", "power11_v2.0" },
|
||||
#endif
|
||||
|
||||
+#if 0 /* Disabled for Red Hat Enterprise Linux */
|
||||
@ -836,10 +754,10 @@ index f2301b43f7..f77ebfcc81 100644
|
||||
|
||||
{ NULL, NULL }
|
||||
};
|
||||
diff --git a/target/s390x/cpu_models_sysemu.c b/target/s390x/cpu_models_sysemu.c
|
||||
index f6df691b66..72572726b8 100644
|
||||
--- a/target/s390x/cpu_models_sysemu.c
|
||||
+++ b/target/s390x/cpu_models_sysemu.c
|
||||
diff --git a/target/s390x/cpu_models_system.c b/target/s390x/cpu_models_system.c
|
||||
index 5b84604867..7e06c75e6f 100644
|
||||
--- a/target/s390x/cpu_models_system.c
|
||||
+++ b/target/s390x/cpu_models_system.c
|
||||
@@ -34,6 +34,9 @@ static void check_unavailable_features(const S390CPUModel *max_model,
|
||||
(max_model->def->gen == model->def->gen &&
|
||||
max_model->def->ec_ga < model->def->ec_ga)) {
|
||||
@ -851,10 +769,10 @@ index f6df691b66..72572726b8 100644
|
||||
|
||||
/* detect missing features if any to properly report them */
|
||||
diff --git a/target/s390x/kvm/kvm.c b/target/s390x/kvm/kvm.c
|
||||
index 94181d9281..45c23758e7 100644
|
||||
index 491cc5f975..d40811ef2c 100644
|
||||
--- a/target/s390x/kvm/kvm.c
|
||||
+++ b/target/s390x/kvm/kvm.c
|
||||
@@ -2566,6 +2566,14 @@ bool kvm_s390_apply_cpu_model(const S390CPUModel *model, Error **errp)
|
||||
@@ -2552,6 +2552,14 @@ bool kvm_s390_apply_cpu_model(const S390CPUModel *model, Error **errp)
|
||||
error_setg(errp, "KVM doesn't support CPU models");
|
||||
return false;
|
||||
}
|
||||
@ -870,10 +788,10 @@ index 94181d9281..45c23758e7 100644
|
||||
prop.ibc = s390_ibc_from_cpu_model(model);
|
||||
/* configure cpu features indicated via STFL(e) */
|
||||
diff --git a/tests/qtest/arm-cpu-features.c b/tests/qtest/arm-cpu-features.c
|
||||
index cfd6f77353..3016e6233c 100644
|
||||
index eb8ddebffb..2d3304bb4a 100644
|
||||
--- a/tests/qtest/arm-cpu-features.c
|
||||
+++ b/tests/qtest/arm-cpu-features.c
|
||||
@@ -452,8 +452,10 @@ static void test_query_cpu_model_expansion(const void *data)
|
||||
@@ -459,8 +459,10 @@ static void test_query_cpu_model_expansion(const void *data)
|
||||
assert_error(qts, "host", "The CPU type 'host' requires KVM", NULL);
|
||||
|
||||
/* Test expected feature presence/absence for some cpu types */
|
||||
@ -884,7 +802,7 @@ index cfd6f77353..3016e6233c 100644
|
||||
|
||||
/* Enabling and disabling pmu should always work. */
|
||||
assert_has_feature_enabled(qts, "max", "pmu");
|
||||
@@ -470,6 +472,7 @@ static void test_query_cpu_model_expansion(const void *data)
|
||||
@@ -477,6 +479,7 @@ static void test_query_cpu_model_expansion(const void *data)
|
||||
assert_has_feature_enabled(qts, "cortex-a57", "pmu");
|
||||
assert_has_feature_enabled(qts, "cortex-a57", "aarch64");
|
||||
|
||||
@ -892,7 +810,7 @@ index cfd6f77353..3016e6233c 100644
|
||||
assert_has_feature_enabled(qts, "a64fx", "pmu");
|
||||
assert_has_feature_enabled(qts, "a64fx", "aarch64");
|
||||
/*
|
||||
@@ -482,6 +485,7 @@ static void test_query_cpu_model_expansion(const void *data)
|
||||
@@ -489,6 +492,7 @@ static void test_query_cpu_model_expansion(const void *data)
|
||||
"{ 'sve384': true }");
|
||||
assert_error(qts, "a64fx", "cannot enable sve640",
|
||||
"{ 'sve640': true }");
|
||||
@ -900,6 +818,3 @@ index cfd6f77353..3016e6233c 100644
|
||||
|
||||
sve_tests_default(qts, "max");
|
||||
pauth_tests_default(qts, "max");
|
||||
--
|
||||
2.39.3
|
||||
|
||||
@ -1,7 +1,7 @@
|
||||
From dc310c3f76c0d986ec4dc5a548a8ff37a85d61cf Mon Sep 17 00:00:00 2001
|
||||
From 553a21117e86d4a72d2032bab9247b00f7592e3b Mon Sep 17 00:00:00 2001
|
||||
From: Miroslav Rezanina <mrezanin@redhat.com>
|
||||
Date: Fri, 11 Jan 2019 09:54:45 +0100
|
||||
Subject: Machine type related general changes
|
||||
Subject: [PATCH] Machine type related general changes
|
||||
|
||||
This patch is first part of original "Add RHEL machine types" patch we
|
||||
split to allow easier review. It contains changes not related to any
|
||||
@ -76,22 +76,23 @@ Merged patches (9.1.0 rc0):
|
||||
- 770eeed61e rhel 9.4.0 machine type compat for virtio-gpu migration
|
||||
---
|
||||
hw/acpi/piix4.c | 2 +-
|
||||
hw/arm/virt.c | 3 +-
|
||||
hw/core/machine.c | 281 +++++++++++++++++++++++++++++++++++
|
||||
hw/arm/virt.c | 11 +-
|
||||
hw/core/machine.c | 298 +++++++++++++++++++++++++++++++++++
|
||||
hw/i386/fw_cfg.c | 3 +-
|
||||
hw/net/rtl8139.c | 4 +-
|
||||
hw/smbios/smbios.c | 46 +++++-
|
||||
hw/timer/i8254_common.c | 2 +-
|
||||
hw/usb/hcd-xhci-pci.c | 59 ++++++--
|
||||
hw/usb/hcd-xhci-pci.c | 54 +++++--
|
||||
hw/usb/hcd-xhci-pci.h | 1 +
|
||||
hw/virtio/virtio-mem.c | 3 +-
|
||||
include/hw/boards.h | 43 ++++++
|
||||
include/hw/arm/virt.h | 1 +
|
||||
include/hw/boards.h | 46 ++++++
|
||||
include/hw/firmware/smbios.h | 4 +-
|
||||
include/hw/i386/pc.h | 3 +
|
||||
13 files changed, 430 insertions(+), 24 deletions(-)
|
||||
14 files changed, 454 insertions(+), 24 deletions(-)
|
||||
|
||||
diff --git a/hw/acpi/piix4.c b/hw/acpi/piix4.c
|
||||
index debe1adb84..e8ddcd716e 100644
|
||||
index 7a18f18dda..2b3678b8c6 100644
|
||||
--- a/hw/acpi/piix4.c
|
||||
+++ b/hw/acpi/piix4.c
|
||||
@@ -245,7 +245,7 @@ static bool vmstate_test_migrate_acpi_index(void *opaque, int version_id)
|
||||
@ -104,26 +105,40 @@ index debe1adb84..e8ddcd716e 100644
|
||||
.fields = (const VMStateField[]) {
|
||||
VMSTATE_PCI_DEVICE(parent_obj, PIIX4PMState),
|
||||
diff --git a/hw/arm/virt.c b/hw/arm/virt.c
|
||||
index eea7d2d038..b2aa3f1355 100644
|
||||
index b525e00365..6a6b841f91 100644
|
||||
--- a/hw/arm/virt.c
|
||||
+++ b/hw/arm/virt.c
|
||||
@@ -1699,7 +1699,8 @@ static void virt_build_smbios(VirtMachineState *vms)
|
||||
@@ -1749,13 +1749,22 @@ static void virt_build_smbios(VirtMachineState *vms)
|
||||
uint8_t *smbios_tables, *smbios_anchor;
|
||||
size_t smbios_tables_len, smbios_anchor_len;
|
||||
struct smbios_phys_mem_area mem_array;
|
||||
+ const char *manufacturer = "QEMU";
|
||||
const char *product = "QEMU Virtual Machine";
|
||||
+ const char *version = vmc->smbios_old_sys_ver ? "1.0" : mc->name;
|
||||
|
||||
if (kvm_enabled()) {
|
||||
product = "KVM Virtual Machine";
|
||||
}
|
||||
|
||||
smbios_set_defaults("QEMU", product,
|
||||
- vmc->smbios_old_sys_ver ? "1.0" : mc->name);
|
||||
+ vmc->smbios_old_sys_ver ? "1.0" : mc->name,
|
||||
- smbios_set_defaults("QEMU", product, mc->name);
|
||||
+ if (!vmc->manufacturer_product_compat) {
|
||||
+ manufacturer = "Red Hat";
|
||||
+ product = "KVM";
|
||||
+ version = mc->desc;
|
||||
+ }
|
||||
+
|
||||
+ smbios_set_defaults(manufacturer, product, version,
|
||||
+ NULL, NULL);
|
||||
|
||||
/* build the array of physical mem area from base_memmap */
|
||||
mem_array.address = vms->memmap[VIRT_MEM].base;
|
||||
diff --git a/hw/core/machine.c b/hw/core/machine.c
|
||||
index 27dcda0248..f7fed78e4b 100644
|
||||
index bd47527479..7a7317941b 100644
|
||||
--- a/hw/core/machine.c
|
||||
+++ b/hw/core/machine.c
|
||||
@@ -305,6 +305,287 @@ GlobalProperty hw_compat_2_1[] = {
|
||||
@@ -288,6 +288,304 @@ GlobalProperty hw_compat_2_6[] = {
|
||||
};
|
||||
const size_t hw_compat_2_1_len = G_N_ELEMENTS(hw_compat_2_1);
|
||||
const size_t hw_compat_2_6_len = G_N_ELEMENTS(hw_compat_2_6);
|
||||
|
||||
+/*
|
||||
+ * RHEL only: machine types for previous major releases are deprecated
|
||||
@ -131,6 +146,23 @@ index 27dcda0248..f7fed78e4b 100644
|
||||
+const char *rhel_old_machine_deprecation =
|
||||
+ "machine types for previous major releases are deprecated";
|
||||
+
|
||||
+GlobalProperty hw_compat_rhel_9_6[] = {
|
||||
+ /* hw_compat_rhel_9_6 from hw_compat_9_0 */
|
||||
+ {"arm-cpu", "backcompat-cntfrq", "true" },
|
||||
+ /* hw_compat_rhel_9_6 from hw_compat_9_0 */
|
||||
+ { "scsi-hd", "migrate-emulated-scsi-request", "false" },
|
||||
+ /* hw_compat_rhel_9_6 from hw_compat_9_0 */
|
||||
+ { "scsi-cd", "migrate-emulated-scsi-request", "false" },
|
||||
+ /* hw_compat_rhel_9_6 from hw_compat_9_0 */
|
||||
+ {"vfio-pci", "skip-vsc-check", "false" },
|
||||
+ /* hw_compat_rhel_9_6 from hw_compat_9_0 */
|
||||
+ { "virtio-pci", "x-pcie-pm-no-soft-reset", "off" },
|
||||
+ /* hw_compat_rhel_9_6 from hw_compat_9_0 */
|
||||
+ {"sd-card", "spec_version", "2" },
|
||||
+};
|
||||
+const size_t hw_compat_rhel_9_6_len = G_N_ELEMENTS(hw_compat_rhel_9_6);
|
||||
+
|
||||
+
|
||||
+GlobalProperty hw_compat_rhel_9_5[] = {
|
||||
+ /* hw_compat_rhel_9_5 from hw_compat_8_2 */
|
||||
+ { "migration", "zero-page-detection", "legacy"},
|
||||
@ -410,10 +442,10 @@ index 27dcda0248..f7fed78e4b 100644
|
||||
|
||||
static char *machine_get_kernel(Object *obj, Error **errp)
|
||||
diff --git a/hw/i386/fw_cfg.c b/hw/i386/fw_cfg.c
|
||||
index 0e4494627c..33ef280420 100644
|
||||
index 5c0bcd5f8a..07df7281d2 100644
|
||||
--- a/hw/i386/fw_cfg.c
|
||||
+++ b/hw/i386/fw_cfg.c
|
||||
@@ -73,7 +73,8 @@ void fw_cfg_build_smbios(PCMachineState *pcms, FWCfgState *fw_cfg,
|
||||
@@ -75,7 +75,8 @@ void fw_cfg_build_smbios(PCMachineState *pcms, FWCfgState *fw_cfg,
|
||||
|
||||
if (pcmc->smbios_defaults) {
|
||||
/* These values are guest ABI, do not change */
|
||||
@ -424,10 +456,10 @@ index 0e4494627c..33ef280420 100644
|
||||
|
||||
/* tell smbios about cpuid version and features */
|
||||
diff --git a/hw/net/rtl8139.c b/hw/net/rtl8139.c
|
||||
index 03a204ef8a..f2fe057535 100644
|
||||
index 324fb932aa..f1def02bfb 100644
|
||||
--- a/hw/net/rtl8139.c
|
||||
+++ b/hw/net/rtl8139.c
|
||||
@@ -3173,7 +3173,7 @@ static int rtl8139_pre_save(void *opaque)
|
||||
@@ -3172,7 +3172,7 @@ static int rtl8139_pre_save(void *opaque)
|
||||
|
||||
static const VMStateDescription vmstate_rtl8139 = {
|
||||
.name = "rtl8139",
|
||||
@ -436,7 +468,7 @@ index 03a204ef8a..f2fe057535 100644
|
||||
.minimum_version_id = 3,
|
||||
.post_load = rtl8139_post_load,
|
||||
.pre_save = rtl8139_pre_save,
|
||||
@@ -3254,7 +3254,9 @@ static const VMStateDescription vmstate_rtl8139 = {
|
||||
@@ -3253,7 +3253,9 @@ static const VMStateDescription vmstate_rtl8139 = {
|
||||
VMSTATE_UINT32(tally_counters.TxMCol, RTL8139State),
|
||||
VMSTATE_UINT64(tally_counters.RxOkPhy, RTL8139State),
|
||||
VMSTATE_UINT64(tally_counters.RxOkBrd, RTL8139State),
|
||||
@ -447,10 +479,10 @@ index 03a204ef8a..f2fe057535 100644
|
||||
VMSTATE_UINT16(tally_counters.TxUndrn, RTL8139State),
|
||||
|
||||
diff --git a/hw/smbios/smbios.c b/hw/smbios/smbios.c
|
||||
index a394514264..88642ccce0 100644
|
||||
index 1ac063cfb4..03f7a00ed1 100644
|
||||
--- a/hw/smbios/smbios.c
|
||||
+++ b/hw/smbios/smbios.c
|
||||
@@ -38,6 +38,10 @@ size_t usr_blobs_len;
|
||||
@@ -39,6 +39,10 @@ size_t usr_blobs_len;
|
||||
static unsigned usr_table_max;
|
||||
static unsigned usr_table_cnt;
|
||||
|
||||
@ -461,7 +493,7 @@ index a394514264..88642ccce0 100644
|
||||
uint8_t *smbios_tables;
|
||||
size_t smbios_tables_len;
|
||||
unsigned smbios_table_max;
|
||||
@@ -626,7 +630,7 @@ static void smbios_build_type_1_table(void)
|
||||
@@ -627,7 +631,7 @@ static void smbios_build_type_1_table(void)
|
||||
|
||||
static void smbios_build_type_2_table(void)
|
||||
{
|
||||
@ -470,7 +502,7 @@ index a394514264..88642ccce0 100644
|
||||
|
||||
SMBIOS_TABLE_SET_STR(2, manufacturer_str, type2.manufacturer);
|
||||
SMBIOS_TABLE_SET_STR(2, product_str, type2.product);
|
||||
@@ -1014,15 +1018,51 @@ void smbios_set_default_processor_family(uint16_t processor_family)
|
||||
@@ -1015,15 +1019,51 @@ void smbios_set_default_processor_family(uint16_t processor_family)
|
||||
}
|
||||
|
||||
void smbios_set_defaults(const char *manufacturer, const char *product,
|
||||
@ -525,7 +557,7 @@ index a394514264..88642ccce0 100644
|
||||
SMBIOS_SET_DEFAULT(type3.manufacturer, manufacturer);
|
||||
SMBIOS_SET_DEFAULT(type3.version, version);
|
||||
diff --git a/hw/timer/i8254_common.c b/hw/timer/i8254_common.c
|
||||
index 28fdabc321..bad13ec224 100644
|
||||
index ad091594cd..debf9f0c67 100644
|
||||
--- a/hw/timer/i8254_common.c
|
||||
+++ b/hw/timer/i8254_common.c
|
||||
@@ -229,7 +229,7 @@ static const VMStateDescription vmstate_pit_common = {
|
||||
@ -538,10 +570,10 @@ index 28fdabc321..bad13ec224 100644
|
||||
vmstate_pit_channel, PITChannelState),
|
||||
VMSTATE_INT64(channels[0].next_transition_time,
|
||||
diff --git a/hw/usb/hcd-xhci-pci.c b/hw/usb/hcd-xhci-pci.c
|
||||
index 264d7ebb77..2b9a3e06d4 100644
|
||||
index b93c80b09d..f4a2f1a1de 100644
|
||||
--- a/hw/usb/hcd-xhci-pci.c
|
||||
+++ b/hw/usb/hcd-xhci-pci.c
|
||||
@@ -104,6 +104,33 @@ static int xhci_pci_vmstate_post_load(void *opaque, int version_id)
|
||||
@@ -120,6 +120,33 @@ static int xhci_pci_vmstate_post_load(void *opaque, int version_id)
|
||||
return 0;
|
||||
}
|
||||
|
||||
@ -575,7 +607,7 @@ index 264d7ebb77..2b9a3e06d4 100644
|
||||
static void usb_xhci_pci_realize(struct PCIDevice *dev, Error **errp)
|
||||
{
|
||||
int ret;
|
||||
@@ -125,23 +152,12 @@ static void usb_xhci_pci_realize(struct PCIDevice *dev, Error **errp)
|
||||
@@ -144,23 +171,12 @@ static void usb_xhci_pci_realize(struct PCIDevice *dev, Error **errp)
|
||||
s->xhci.nec_quirks = true;
|
||||
}
|
||||
|
||||
@ -602,7 +634,7 @@ index 264d7ebb77..2b9a3e06d4 100644
|
||||
}
|
||||
pci_register_bar(dev, 0,
|
||||
PCI_BASE_ADDRESS_SPACE_MEMORY |
|
||||
@@ -153,6 +169,14 @@ static void usb_xhci_pci_realize(struct PCIDevice *dev, Error **errp)
|
||||
@@ -172,6 +188,14 @@ static void usb_xhci_pci_realize(struct PCIDevice *dev, Error **errp)
|
||||
assert(ret > 0);
|
||||
}
|
||||
|
||||
@ -617,42 +649,32 @@ index 264d7ebb77..2b9a3e06d4 100644
|
||||
if (s->msix != ON_OFF_AUTO_OFF) {
|
||||
/* TODO check for errors, and should fail when msix=on */
|
||||
msix_init(dev, s->xhci.numintrs,
|
||||
@@ -197,11 +221,18 @@ static void xhci_instance_init(Object *obj)
|
||||
qdev_alias_all_properties(DEVICE(&s->xhci), obj);
|
||||
}
|
||||
|
||||
+static Property xhci_pci_properties[] = {
|
||||
@@ -221,6 +245,8 @@ static const Property xhci_pci_properties[] = {
|
||||
DEFINE_PROP_ON_OFF_AUTO("msix", XHCIPciState, msix, ON_OFF_AUTO_AUTO),
|
||||
DEFINE_PROP_BOOL("conditional-intr-mapping", XHCIPciState,
|
||||
conditional_intr_mapping, false),
|
||||
+ /* RH bz 1912846 */
|
||||
+ DEFINE_PROP_BOOL("x-rh-late-msi-cap", XHCIPciState, rh_late_msi_cap, true),
|
||||
+ DEFINE_PROP_END_OF_LIST()
|
||||
+};
|
||||
+
|
||||
static void xhci_class_init(ObjectClass *klass, void *data)
|
||||
{
|
||||
PCIDeviceClass *k = PCI_DEVICE_CLASS(klass);
|
||||
DeviceClass *dc = DEVICE_CLASS(klass);
|
||||
};
|
||||
|
||||
+ device_class_set_props(dc, xhci_pci_properties);
|
||||
dc->reset = xhci_pci_reset;
|
||||
dc->vmsd = &vmstate_xhci_pci;
|
||||
set_bit(DEVICE_CATEGORY_USB, dc->categories);
|
||||
static void xhci_class_init(ObjectClass *klass, const void *data)
|
||||
diff --git a/hw/usb/hcd-xhci-pci.h b/hw/usb/hcd-xhci-pci.h
|
||||
index 08f70ce97c..1be7527c1b 100644
|
||||
index 5b61ae8455..3170db064b 100644
|
||||
--- a/hw/usb/hcd-xhci-pci.h
|
||||
+++ b/hw/usb/hcd-xhci-pci.h
|
||||
@@ -40,6 +40,7 @@ typedef struct XHCIPciState {
|
||||
XHCIState xhci;
|
||||
@@ -41,6 +41,7 @@ typedef struct XHCIPciState {
|
||||
OnOffAuto msi;
|
||||
OnOffAuto msix;
|
||||
bool conditional_intr_mapping;
|
||||
+ bool rh_late_msi_cap; /* bz 1912846 */
|
||||
} XHCIPciState;
|
||||
|
||||
#endif
|
||||
diff --git a/hw/virtio/virtio-mem.c b/hw/virtio/virtio-mem.c
|
||||
index ef64bf1b4a..ba11aa4646 100644
|
||||
index c46f6f9c3e..1805597879 100644
|
||||
--- a/hw/virtio/virtio-mem.c
|
||||
+++ b/hw/virtio/virtio-mem.c
|
||||
@@ -1694,8 +1694,9 @@ static Property virtio_mem_properties[] = {
|
||||
@@ -1699,8 +1699,9 @@ static const Property virtio_mem_properties[] = {
|
||||
#endif
|
||||
DEFINE_PROP_BOOL(VIRTIO_MEM_EARLY_MIGRATION_PROP, VirtIOMEM,
|
||||
early_migration, true),
|
||||
@ -660,17 +682,32 @@ index ef64bf1b4a..ba11aa4646 100644
|
||||
DEFINE_PROP_BOOL(VIRTIO_MEM_DYNAMIC_MEMSLOTS_PROP, VirtIOMEM,
|
||||
- dynamic_memslots, false),
|
||||
+ dynamic_memslots, true),
|
||||
DEFINE_PROP_END_OF_LIST(),
|
||||
};
|
||||
|
||||
static uint64_t virtio_mem_rdm_get_min_granularity(const RamDiscardManager *rdm,
|
||||
diff --git a/include/hw/arm/virt.h b/include/hw/arm/virt.h
|
||||
index 365a28b082..94c79d6c6d 100644
|
||||
--- a/include/hw/arm/virt.h
|
||||
+++ b/include/hw/arm/virt.h
|
||||
@@ -132,6 +132,7 @@ struct VirtMachineClass {
|
||||
bool no_tcg_lpa2;
|
||||
bool no_ns_el2_virt_timer_irq;
|
||||
bool no_nested_smmu;
|
||||
+ bool manufacturer_product_compat;
|
||||
};
|
||||
|
||||
struct VirtMachineState {
|
||||
diff --git a/include/hw/boards.h b/include/hw/boards.h
|
||||
index 48ff6d8b93..ccfc3e10eb 100644
|
||||
index f94713e6e2..1ec852293a 100644
|
||||
--- a/include/hw/boards.h
|
||||
+++ b/include/hw/boards.h
|
||||
@@ -822,4 +822,47 @@ extern const size_t hw_compat_2_2_len;
|
||||
extern GlobalProperty hw_compat_2_1[];
|
||||
extern const size_t hw_compat_2_1_len;
|
||||
@@ -863,4 +863,50 @@ extern const size_t hw_compat_2_7_len;
|
||||
extern GlobalProperty hw_compat_2_6[];
|
||||
extern const size_t hw_compat_2_6_len;
|
||||
|
||||
+extern GlobalProperty hw_compat_rhel_9_6[];
|
||||
+extern const size_t hw_compat_rhel_9_6_len;
|
||||
+
|
||||
+extern GlobalProperty hw_compat_rhel_9_5[];
|
||||
+extern const size_t hw_compat_rhel_9_5_len;
|
||||
+
|
||||
@ -731,7 +768,7 @@ index f066ab7262..e805d25fbe 100644
|
||||
uint8_t *smbios_get_table_legacy(size_t *length, Error **errp);
|
||||
void smbios_get_tables(MachineState *ms,
|
||||
diff --git a/include/hw/i386/pc.h b/include/hw/i386/pc.h
|
||||
index 4e55d7ef6e..8776a3c937 100644
|
||||
index 79b72c54dd..3b4ea24c20 100644
|
||||
--- a/include/hw/i386/pc.h
|
||||
+++ b/include/hw/i386/pc.h
|
||||
@@ -103,6 +103,9 @@ struct PCMachineClass {
|
||||
@ -744,6 +781,3 @@ index 4e55d7ef6e..8776a3c937 100644
|
||||
|
||||
/* RAM / address space compat: */
|
||||
bool gigabyte_align;
|
||||
--
|
||||
2.39.3
|
||||
|
||||
@ -1,7 +1,7 @@
|
||||
From 8781d75adf542ea09e62a0cafd0c79875015a272 Mon Sep 17 00:00:00 2001
|
||||
From 4648464c6648b8ba6f196a394fa1d622155d063f Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Daniel=20P=2E=20Berrang=C3=A9?= <berrange@redhat.com>
|
||||
Date: Wed, 3 Jul 2024 13:32:32 +0100
|
||||
Subject: meson: temporarily disable -Wunused-function
|
||||
Subject: [PATCH] meson: temporarily disable -Wunused-function
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
@ -20,10 +20,10 @@ Rebase notes (9.1.0 rc0)
|
||||
1 file changed, 1 insertion(+)
|
||||
|
||||
diff --git a/meson.build b/meson.build
|
||||
index fbda17c987..161d496d55 100644
|
||||
index 50c774a195..0e0120a613 100644
|
||||
--- a/meson.build
|
||||
+++ b/meson.build
|
||||
@@ -651,6 +651,7 @@ warn_flags = [
|
||||
@@ -757,6 +757,7 @@ warn_flags = [
|
||||
'-Wno-string-plus-int',
|
||||
'-Wno-tautological-type-limit-compare',
|
||||
'-Wno-typedef-redefinition',
|
||||
@ -31,6 +31,3 @@ index fbda17c987..161d496d55 100644
|
||||
]
|
||||
|
||||
if host_os != 'darwin'
|
||||
--
|
||||
2.39.3
|
||||
|
||||
@ -1,8 +1,8 @@
|
||||
From c5e6c533f498a698ef6797f58f3f8aced62476fd Mon Sep 17 00:00:00 2001
|
||||
From f37d0232b038edd22b87e24100e9bce0f5103bb7 Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Daniel=20P=2E=20Berrang=C3=A9?= <berrange@redhat.com>
|
||||
Date: Wed, 3 Jul 2024 13:25:13 +0100
|
||||
Subject: Remove upstream machine type versions for aarch64, s390x and x86_64
|
||||
architectures
|
||||
Subject: [PATCH] Remove upstream machine type versions for aarch64, s390x and
|
||||
x86_64 architectures
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
@ -24,72 +24,72 @@ Rebase notes (9.1.0 rc0)
|
||||
5 files changed, 13 insertions(+)
|
||||
|
||||
diff --git a/hw/arm/virt.c b/hw/arm/virt.c
|
||||
index b2aa3f1355..5396e7cb24 100644
|
||||
index 6a6b841f91..e454b29de6 100644
|
||||
--- a/hw/arm/virt.c
|
||||
+++ b/hw/arm/virt.c
|
||||
@@ -3306,6 +3306,7 @@ static void machvirt_machine_init(void)
|
||||
@@ -3468,6 +3468,7 @@ static void machvirt_machine_init(void)
|
||||
}
|
||||
type_init(machvirt_machine_init);
|
||||
|
||||
+#if 0 /* Disabled for Red Hat Enterprise Linux */
|
||||
static void virt_machine_9_1_options(MachineClass *mc)
|
||||
static void virt_machine_10_1_options(MachineClass *mc)
|
||||
{
|
||||
}
|
||||
@@ -3552,3 +3553,4 @@ static void virt_machine_2_6_options(MachineClass *mc)
|
||||
vmc->no_pmu = true;
|
||||
@@ -3643,3 +3644,4 @@ static void virt_machine_4_1_options(MachineClass *mc)
|
||||
mc->auto_enable_numa_with_memhp = false;
|
||||
}
|
||||
DEFINE_VIRT_MACHINE(2, 6)
|
||||
DEFINE_VIRT_MACHINE(4, 1)
|
||||
+#endif /* disabled for RHEL */
|
||||
diff --git a/hw/i386/pc_piix.c b/hw/i386/pc_piix.c
|
||||
index 347afa4c37..67107b174a 100644
|
||||
index c03324281b..acf010e20f 100644
|
||||
--- a/hw/i386/pc_piix.c
|
||||
+++ b/hw/i386/pc_piix.c
|
||||
@@ -448,6 +448,7 @@ static void pc_i440fx_init(MachineState *machine)
|
||||
#define DEFINE_I440FX_MACHINE(major, minor) \
|
||||
DEFINE_PC_VER_MACHINE(pc_i440fx, "pc-i440fx", pc_i440fx_init, major, minor);
|
||||
@@ -475,6 +475,7 @@ static void pc_i440fx_init(MachineState *machine)
|
||||
#define DEFINE_I440FX_MACHINE_AS_LATEST(major, minor) \
|
||||
DEFINE_PC_VER_MACHINE(pc_i440fx, "pc-i440fx", pc_i440fx_init, true, "pc", major, minor);
|
||||
|
||||
+#if 0 /* Disabled for Red Hat Enterprise Linux */
|
||||
static void pc_i440fx_machine_options(MachineClass *m)
|
||||
{
|
||||
PCMachineClass *pcmc = PC_MACHINE_CLASS(m);
|
||||
@@ -775,6 +776,7 @@ static void pc_i440fx_machine_2_4_options(MachineClass *m)
|
||||
@@ -802,6 +803,7 @@ static void pc_i440fx_machine_2_6_options(MachineClass *m)
|
||||
}
|
||||
|
||||
DEFINE_I440FX_MACHINE(2, 4);
|
||||
DEFINE_I440FX_MACHINE(2, 6);
|
||||
+#endif /* Disabled for Red Hat Enterprise Linux */
|
||||
|
||||
#ifdef CONFIG_ISAPC
|
||||
static void isapc_machine_options(MachineClass *m)
|
||||
diff --git a/hw/i386/pc_q35.c b/hw/i386/pc_q35.c
|
||||
index f2d8edfa84..5fb283f2df 100644
|
||||
index b309b2b378..2203ffd67e 100644
|
||||
--- a/hw/i386/pc_q35.c
|
||||
+++ b/hw/i386/pc_q35.c
|
||||
@@ -356,6 +356,7 @@ static void pc_q35_machine_options(MachineClass *m)
|
||||
@@ -374,6 +374,7 @@ static void pc_q35_machine_options(MachineClass *m)
|
||||
pc_q35_compat_defaults, pc_q35_compat_defaults_len);
|
||||
}
|
||||
|
||||
+#if 0 /* Disabled for Red Hat Enterprise Linux */
|
||||
static void pc_q35_machine_9_1_options(MachineClass *m)
|
||||
static void pc_q35_machine_10_1_options(MachineClass *m)
|
||||
{
|
||||
pc_q35_machine_options(m);
|
||||
@@ -668,3 +669,4 @@ static void pc_q35_machine_2_4_options(MachineClass *m)
|
||||
@@ -685,3 +686,4 @@ static void pc_q35_machine_2_6_options(MachineClass *m)
|
||||
}
|
||||
|
||||
DEFINE_Q35_MACHINE(2, 4);
|
||||
DEFINE_Q35_MACHINE(2, 6);
|
||||
+#endif /* Disabled for Red Hat Enterprise Linux */
|
||||
diff --git a/hw/ppc/spapr.c b/hw/ppc/spapr.c
|
||||
index 370d7c35d3..b48a2afc38 100644
|
||||
index 1855a3cd8d..6a5f75af7d 100644
|
||||
--- a/hw/ppc/spapr.c
|
||||
+++ b/hw/ppc/spapr.c
|
||||
@@ -4837,6 +4837,7 @@ static void spapr_machine_latest_class_options(MachineClass *mc)
|
||||
#define DEFINE_SPAPR_MACHINE_TAGGED(major, minor, tag) \
|
||||
DEFINE_SPAPR_MACHINE_IMPL(false, major, minor, _, tag)
|
||||
@@ -4793,6 +4793,7 @@ static void spapr_machine_9_2_class_options(MachineClass *mc)
|
||||
|
||||
DEFINE_SPAPR_MACHINE(9, 2);
|
||||
|
||||
+#if 0 /* Disabled for Red Hat Enterprise Linux */
|
||||
/*
|
||||
* pseries-9.1
|
||||
*/
|
||||
@@ -5041,6 +5042,7 @@ static void spapr_machine_4_1_class_options(MachineClass *mc)
|
||||
@@ -4999,6 +5000,7 @@ static void spapr_machine_4_1_class_options(MachineClass *mc)
|
||||
}
|
||||
|
||||
DEFINE_SPAPR_MACHINE(4, 1);
|
||||
@ -97,7 +97,7 @@ index 370d7c35d3..b48a2afc38 100644
|
||||
|
||||
/*
|
||||
* pseries-4.0
|
||||
@@ -5056,6 +5058,8 @@ static bool phb_placement_4_0(SpaprMachineState *spapr, uint32_t index,
|
||||
@@ -5014,6 +5016,8 @@ static bool phb_placement_4_0(SpaprMachineState *spapr, uint32_t index,
|
||||
}
|
||||
return true;
|
||||
}
|
||||
@ -106,34 +106,31 @@ index 370d7c35d3..b48a2afc38 100644
|
||||
static void spapr_machine_4_0_class_options(MachineClass *mc)
|
||||
{
|
||||
SpaprMachineClass *smc = SPAPR_MACHINE_CLASS(mc);
|
||||
@@ -5380,6 +5384,7 @@ static void spapr_machine_2_1_class_options(MachineClass *mc)
|
||||
compat_props_add(mc->compat_props, hw_compat_2_1, hw_compat_2_1_len);
|
||||
@@ -5066,6 +5070,7 @@ static void spapr_machine_3_0_class_options(MachineClass *mc)
|
||||
}
|
||||
DEFINE_SPAPR_MACHINE(2, 1);
|
||||
|
||||
DEFINE_SPAPR_MACHINE(3, 0);
|
||||
+#endif /* disabled for RHEL */
|
||||
|
||||
static void spapr_machine_register_types(void)
|
||||
{
|
||||
diff --git a/hw/s390x/s390-virtio-ccw.c b/hw/s390x/s390-virtio-ccw.c
|
||||
index c483ff8064..86bfc9d2eb 100644
|
||||
index a79bd13275..022376376e 100644
|
||||
--- a/hw/s390x/s390-virtio-ccw.c
|
||||
+++ b/hw/s390x/s390-virtio-ccw.c
|
||||
@@ -871,6 +871,7 @@ static const TypeInfo ccw_machine_info = {
|
||||
@@ -911,6 +911,7 @@ static const TypeInfo ccw_machine_info = {
|
||||
DEFINE_CCW_MACHINE_IMPL(false, major, minor)
|
||||
|
||||
|
||||
+#if 0 /* Disabled for Red Hat Enterprise Linux */
|
||||
static void ccw_machine_9_1_instance_options(MachineState *machine)
|
||||
static void ccw_machine_10_1_instance_options(MachineState *machine)
|
||||
{
|
||||
}
|
||||
@@ -1305,6 +1306,7 @@ static void ccw_machine_2_4_class_options(MachineClass *mc)
|
||||
DEFINE_CCW_MACHINE(2, 4);
|
||||
|
||||
#endif
|
||||
@@ -1166,6 +1167,7 @@ static void ccw_machine_4_2_class_options(MachineClass *mc)
|
||||
compat_props_add(mc->compat_props, hw_compat_4_2, hw_compat_4_2_len);
|
||||
}
|
||||
DEFINE_CCW_MACHINE(4, 2);
|
||||
+#endif /* disabled for RHEL */
|
||||
|
||||
static void ccw_machine_register_types(void)
|
||||
{
|
||||
--
|
||||
2.39.3
|
||||
|
||||
@ -1,7 +1,7 @@
|
||||
From 3cb90f2fec9096ddde4038e037e82a9c44614791 Mon Sep 17 00:00:00 2001
|
||||
From 86f1871df0119909cedf16ee3c3e7b64382bc22a Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Daniel=20P=2E=20Berrang=C3=A9?= <berrange@redhat.com>
|
||||
Date: Wed, 3 Jul 2024 15:27:03 +0100
|
||||
Subject: Adapt versioned machine type macros for RHEL
|
||||
Subject: [PATCH] Adapt versioned machine type macros for RHEL
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
@ -20,19 +20,33 @@ The versioned machine type macros are changed thus:
|
||||
Signed-off-by: Daniel P. Berrangé <berrange@redhat.com>
|
||||
Signed-off-by: Miroslav Rezanina <mrezanin@redhat.com>
|
||||
---
|
||||
.distro/Makefile.common | 1 +
|
||||
.distro/qemu-kvm.spec.template | 1 +
|
||||
include/hw/boards.h | 60 +++++++++++-----------------------
|
||||
meson.build | 1 +
|
||||
meson_options.txt | 2 ++
|
||||
scripts/meson-buildoptions.sh | 2 ++
|
||||
6 files changed, 26 insertions(+), 41 deletions(-)
|
||||
docs/conf.py | 4 ++--
|
||||
include/hw/boards.h | 39 ++++++++++++++---------------------
|
||||
meson.build | 1 +
|
||||
meson_options.txt | 2 ++
|
||||
scripts/meson-buildoptions.sh | 2 ++
|
||||
5 files changed, 23 insertions(+), 25 deletions(-)
|
||||
|
||||
diff --git a/docs/conf.py b/docs/conf.py
|
||||
index f892a6e1da..0b8861e4bf 100644
|
||||
--- a/docs/conf.py
|
||||
+++ b/docs/conf.py
|
||||
@@ -140,8 +140,8 @@
|
||||
# MACHINE_VER_DELETION_MAJOR & MACHINE_VER_DEPRECATION_MAJOR
|
||||
# defined in include/hw/boards.h and the introductory text in
|
||||
# docs/about/deprecated.rst
|
||||
-ver_machine_deprecation_version = "%d.%d.0" % (major - 3, minor)
|
||||
-ver_machine_deletion_version = "%d.%d.0" % (major - 6, minor)
|
||||
+ver_machine_deprecation_version = "%d.%d.0" % (major - 1, minor)
|
||||
+ver_machine_deletion_version = "%d.%d.0" % (major - 2, minor)
|
||||
|
||||
# The language for content autogenerated by Sphinx. Refer to documentation
|
||||
# for a list of supported languages.
|
||||
diff --git a/include/hw/boards.h b/include/hw/boards.h
|
||||
index ccfc3e10eb..7f7eb4ec40 100644
|
||||
index 1ec852293a..ba3978402f 100644
|
||||
--- a/include/hw/boards.h
|
||||
+++ b/include/hw/boards.h
|
||||
@@ -548,16 +548,16 @@ struct MachineState {
|
||||
@@ -577,16 +577,16 @@ struct MachineState {
|
||||
* "{prefix}-{major}.{minor}.{micro}-{tag}"
|
||||
*/
|
||||
#define _MACHINE_VER_TYPE_NAME2(prefix, major, minor) \
|
||||
@ -53,7 +67,7 @@ index ccfc3e10eb..7f7eb4ec40 100644
|
||||
|
||||
#define MACHINE_VER_TYPE_NAME(prefix, ...) \
|
||||
_MACHINE_VER_PICK(__VA_ARGS__, \
|
||||
@@ -585,16 +585,16 @@ struct MachineState {
|
||||
@@ -614,16 +614,16 @@ struct MachineState {
|
||||
* {prefix}_machine_{major}_{minor}_{micro}_{tag}_{sym}
|
||||
*/
|
||||
#define _MACHINE_VER_SYM2(sym, prefix, major, minor) \
|
||||
@ -74,15 +88,9 @@ index ccfc3e10eb..7f7eb4ec40 100644
|
||||
|
||||
#define MACHINE_VER_SYM(sym, prefix, ...) \
|
||||
_MACHINE_VER_PICK(__VA_ARGS__, \
|
||||
@@ -605,26 +605,22 @@ struct MachineState {
|
||||
|
||||
|
||||
/*
|
||||
- * How many years/major releases for each phase
|
||||
- * of the life cycle. Assumes use of versioning
|
||||
- * scheme where major is bumped each year
|
||||
+ * How many RHEL major releases for each phase
|
||||
+ * of the life cycle.
|
||||
@@ -642,17 +642,16 @@ struct MachineState {
|
||||
* and ver_machine_deletion_version logic in docs/conf.py and
|
||||
* the text in docs/about/deprecated.rst
|
||||
*/
|
||||
-#define MACHINE_VER_DELETION_MAJOR 6
|
||||
-#define MACHINE_VER_DEPRECATION_MAJOR 3
|
||||
@ -100,15 +108,23 @@ index ccfc3e10eb..7f7eb4ec40 100644
|
||||
+ "machines from the previous RHEL major release are " \
|
||||
+ "subject to deletion in the next RHEL major release"
|
||||
|
||||
#define _MACHINE_VER_IS_CURRENT_EXPIRED(cutoff, major, minor) \
|
||||
(((QEMU_VERSION_MAJOR - major) > cutoff) || \
|
||||
@@ -683,12 +682,7 @@ struct MachineState {
|
||||
* If this ever changes the logic below will need modifying....
|
||||
*/
|
||||
#define _MACHINE_VER_IS_EXPIRED_IMPL(cutoff, major, minor) \
|
||||
- (((QEMU_VERSION_MAJOR - major) > cutoff) || \
|
||||
- (((QEMU_VERSION_MAJOR - major) == cutoff) && \
|
||||
- (QEMU_VERSION_MINOR - minor) >= 0))
|
||||
- ((QEMU_VERSION_MICRO < 50 && \
|
||||
- _MACHINE_VER_IS_CURRENT_EXPIRED(cutoff, major, minor)) || \
|
||||
- (QEMU_VERSION_MICRO >= 50 && QEMU_VERSION_MINOR < 2 && \
|
||||
- _MACHINE_VER_IS_NEXT_MINOR_EXPIRED(cutoff, major, minor)) || \
|
||||
- (QEMU_VERSION_MICRO >= 50 && QEMU_VERSION_MINOR == 2 && \
|
||||
- _MACHINE_VER_IS_NEXT_MAJOR_EXPIRED(cutoff, major, minor)))
|
||||
+ ((RHEL_VERSION - major) >= cutoff)
|
||||
|
||||
#define _MACHINE_VER_IS_EXPIRED2(cutoff, major, minor) \
|
||||
_MACHINE_VER_IS_EXPIRED_IMPL(cutoff, major, minor)
|
||||
@@ -686,32 +682,14 @@ struct MachineState {
|
||||
@@ -750,10 +744,9 @@ struct MachineState {
|
||||
* This must be unconditionally used in the register
|
||||
* method for all machine types which support versioning.
|
||||
*
|
||||
@ -116,40 +132,17 @@ index ccfc3e10eb..7f7eb4ec40 100644
|
||||
- * suitable period of time has passed, it will cause
|
||||
- * execution of the method to return, avoiding registration
|
||||
- * of the machine
|
||||
- *
|
||||
- * The new deprecation and deletion policy for versioned
|
||||
- * machine types was introduced in QEMU 9.1.0.
|
||||
- *
|
||||
- * Under the new policy a number of old machine types (any
|
||||
- * prior to 2.12) would be liable for immediate deletion
|
||||
- * which would be a violation of our historical deprecation
|
||||
- * and removal policy
|
||||
- *
|
||||
- * Thus deletions are temporarily gated on existance of
|
||||
- * the env variable "QEMU_DELETE_MACHINES" / QEMU version
|
||||
- * number >= 10.1.0. This gate can be deleted in the 10.1.0
|
||||
- * dev cycle
|
||||
+ * It will automatically avoid registration of machines
|
||||
+ * that should have been deleted at the start of this
|
||||
+ * RHEL release
|
||||
*/
|
||||
#define MACHINE_VER_DELETION(...) \
|
||||
do { \
|
||||
if (MACHINE_VER_SHOULD_DELETE(__VA_ARGS__)) { \
|
||||
- if (getenv("QEMU_DELETE_MACHINES") || \
|
||||
- QEMU_VERSION_MAJOR > 10 || (QEMU_VERSION_MAJOR == 10 && \
|
||||
- QEMU_VERSION_MINOR >= 1)) { \
|
||||
- return; \
|
||||
- } \
|
||||
+ return; \
|
||||
} \
|
||||
} while (0)
|
||||
|
||||
diff --git a/meson.build b/meson.build
|
||||
index 161d496d55..2de5ab024f 100644
|
||||
index 0e0120a613..23494666d9 100644
|
||||
--- a/meson.build
|
||||
+++ b/meson.build
|
||||
@@ -2440,6 +2440,7 @@ config_host_data.set('QEMU_VERSION', '"@0@"'.format(meson.project_version()))
|
||||
@@ -2636,6 +2636,7 @@ config_host_data.set('QEMU_VERSION', '"@0@"'.format(meson.project_version()))
|
||||
config_host_data.set('QEMU_VERSION_MAJOR', meson.project_version().split('.')[0])
|
||||
config_host_data.set('QEMU_VERSION_MINOR', meson.project_version().split('.')[1])
|
||||
config_host_data.set('QEMU_VERSION_MICRO', meson.project_version().split('.')[2])
|
||||
@ -158,7 +151,7 @@ index 161d496d55..2de5ab024f 100644
|
||||
config_host_data.set_quoted('CONFIG_HOST_DSOSUF', host_dsosuf)
|
||||
config_host_data.set('HAVE_HOST_BLOCK_DEVICE', have_host_block_device)
|
||||
diff --git a/meson_options.txt b/meson_options.txt
|
||||
index 0269fa0f16..aa2ba0baef 100644
|
||||
index fff1521e58..f45d7ded45 100644
|
||||
--- a/meson_options.txt
|
||||
+++ b/meson_options.txt
|
||||
@@ -2,6 +2,8 @@
|
||||
@ -171,25 +164,22 @@ index 0269fa0f16..aa2ba0baef 100644
|
||||
description: 'Suffix for QEMU data/modules/config directories (can be empty)')
|
||||
option('docdir', type : 'string', value : 'share/doc',
|
||||
diff --git a/scripts/meson-buildoptions.sh b/scripts/meson-buildoptions.sh
|
||||
index c97079a38c..5f0cbfc725 100644
|
||||
index 0ebe6bc52a..4146dbc88d 100644
|
||||
--- a/scripts/meson-buildoptions.sh
|
||||
+++ b/scripts/meson-buildoptions.sh
|
||||
@@ -71,6 +71,7 @@ meson_options_help() {
|
||||
printf "%s\n" ' "manufacturer" name for qemu-ga registry entries'
|
||||
@@ -75,6 +75,7 @@ meson_options_help() {
|
||||
printf "%s\n" ' [QEMU]'
|
||||
printf "%s\n" ' --qemu-ga-version=VALUE version number for qemu-ga installer'
|
||||
printf "%s\n" ' --rtsig-map=VALUE default value of QEMU_RTSIG_MAP [NULL]'
|
||||
+ printf "%s\n" ' --rhel-version=VALUE RHEL major/minor version [0.0]'
|
||||
printf "%s\n" ' --smbd=VALUE Path to smbd for slirp networking'
|
||||
printf "%s\n" ' --sysconfdir=VALUE Sysconf data directory [etc]'
|
||||
printf "%s\n" ' --tls-priority=VALUE Default TLS protocol/cipher priority string'
|
||||
@@ -450,6 +451,7 @@ _meson_option_parse() {
|
||||
@@ -465,6 +466,7 @@ _meson_option_parse() {
|
||||
--disable-relocatable) printf "%s" -Drelocatable=false ;;
|
||||
--enable-replication) printf "%s" -Dreplication=enabled ;;
|
||||
--disable-replication) printf "%s" -Dreplication=disabled ;;
|
||||
+ --rhel-version=*) quote_sh "-Drhel_version=$2" ;;
|
||||
--enable-rng-none) printf "%s" -Drng_none=true ;;
|
||||
--disable-rng-none) printf "%s" -Drng_none=false ;;
|
||||
--enable-rutabaga-gfx) printf "%s" -Drutabaga_gfx=enabled ;;
|
||||
--
|
||||
2.39.3
|
||||
|
||||
--rtsig-map=*) quote_sh "-Drtsig_map=$2" ;;
|
||||
@ -1,7 +1,7 @@
|
||||
From f25d2c0298d8d6328cb0071926d477f647a512fc Mon Sep 17 00:00:00 2001
|
||||
From 45028f888ffc2b43276c2d77b72fbd85effdc838 Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Daniel=20P=2E=20Berrang=C3=A9?= <berrange@redhat.com>
|
||||
Date: Wed, 3 Jul 2024 18:45:58 +0100
|
||||
Subject: Increase deletion schedule to 3 releases
|
||||
Subject: [PATCH] Increase deletion schedule to 3 releases
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
@ -16,18 +16,15 @@ Signed-off-by: Daniel P. Berrangé <berrange@redhat.com>
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
diff --git a/include/hw/boards.h b/include/hw/boards.h
|
||||
index 7f7eb4ec40..32c4642f5a 100644
|
||||
index ba3978402f..1e03667fd1 100644
|
||||
--- a/include/hw/boards.h
|
||||
+++ b/include/hw/boards.h
|
||||
@@ -608,7 +608,7 @@ struct MachineState {
|
||||
* How many RHEL major releases for each phase
|
||||
* of the life cycle.
|
||||
@@ -642,7 +642,7 @@ struct MachineState {
|
||||
* and ver_machine_deletion_version logic in docs/conf.py and
|
||||
* the text in docs/about/deprecated.rst
|
||||
*/
|
||||
-#define MACHINE_VER_DELETION_MAJOR 2
|
||||
+#define MACHINE_VER_DELETION_MAJOR 3
|
||||
#define MACHINE_VER_DEPRECATION_MAJOR 1
|
||||
|
||||
/*
|
||||
--
|
||||
2.39.3
|
||||
|
||||
@ -1,105 +1,35 @@
|
||||
From a2e5218bbe2e39712e06c5d8a51f836807c1cae9 Mon Sep 17 00:00:00 2001
|
||||
From bd6640b6a7ea4339dbb5aa1e9a6c36f2efc59085 Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Daniel=20P=2E=20Berrang=C3=A9?= <berrange@redhat.com>
|
||||
Date: Wed, 3 Jul 2024 13:25:47 +0100
|
||||
Subject: Add downstream aarch64 versioned 'virt' machine types
|
||||
Subject: [PATCH] Add downstream aarch64 versioned 'virt' machine types
|
||||
|
||||
Adding changes to add RHEL machine types for aarch64 architecture.
|
||||
|
||||
Signed-off-by: Miroslav Rezanina <mrezanin@redhat.com>
|
||||
---
|
||||
Rebase notes (6.1.0):
|
||||
- Use CONFIG_TPM check when using TPM structures
|
||||
- Add support for default_bus_bypass_iommu
|
||||
- ea4c0b32d9 arm/virt: Register highmem and gic-version as class properties
|
||||
- 895e1fa86a hw/arm/virt: Add 8.5 and 9.0 machine types and remove older ones
|
||||
|
||||
Rebase notes (7.0.0):
|
||||
- Added dtb-kaslr-seed option
|
||||
- Set no_tcg_lpa2 to true
|
||||
|
||||
Rebase notes (7.1.0):
|
||||
- replace dtb_kaslr_seed by dtb_randomness
|
||||
- Updated dtb_randomness comment
|
||||
|
||||
Rebase notes (7.2.0):
|
||||
- Disabled cortex-a35
|
||||
|
||||
Rebase notes (8.0.0):
|
||||
- Moved changed code from target/arm/helper.c to target/arm/arm-qmp-cmds.c
|
||||
|
||||
Rebase notes (8.1.0):
|
||||
- Added setting default_nic
|
||||
|
||||
Rebase notes (9.0.0 rc0):
|
||||
- call arm_virt_compat_set on rhel type class_init
|
||||
|
||||
Rebase notes (9.1.0 rc0):
|
||||
- Merge copy+pasted base machine definition back with upstream
|
||||
base machine definition to reduce RHEL delta, as is done with
|
||||
other targets
|
||||
- Convert to new DEFINE_VIRT_MACHINE macros
|
||||
|
||||
Rebase notes (9.1.0 rc1):
|
||||
- do not remove cpu_valid_types
|
||||
|
||||
Rebase notes (9.1.0 rc2):
|
||||
- Use preprocessing to remove unwanted code instead of removal
|
||||
|
||||
Merged patches (6.2.0):
|
||||
- 9a3d4fde0e hw/arm/virt: Remove 9.0 machine type
|
||||
- f7d04d6695 hw: arm: virt: Add hw_compat_rhel_8_5 to 8.5 machine type
|
||||
|
||||
Merged patches (7.0.0):
|
||||
- 3b82be3dd3 redhat: virt-rhel8.5.0: Update machine type compatibility for QEMU 6.2.0 update
|
||||
- c354a86c9b hw/arm/virt: Register "iommu" as a class property
|
||||
- c1a2630dc9 hw/arm/virt: Register "its" as a class property
|
||||
- 9d8c61dc93 hw/arm/virt: Rename default_bus_bypass_iommu
|
||||
- a1d1b6eeb6 hw/arm/virt: Expose the 'RAS' option
|
||||
- 47f8fe1b82 hw/arm/virt: Add 9.0 machine type and remove 8.5 one
|
||||
- ed2346788f hw/arm/virt: Check no_tcg_its and minor style changes
|
||||
|
||||
Merged patches (7.0.0):
|
||||
- f79b31bdef hw/arm/virt: Remove the dtb-kaslr-seed machine option
|
||||
- b6fca85f4a hw/arm/virt: Fix missing initialization in instance/class_init()
|
||||
|
||||
Merged patches (7.1.0):
|
||||
- ac97dd4f9f RHEL-only: AArch64: Drop unsupported CPU types
|
||||
- e9c0a70664 target/arm: deprecate named CPU models
|
||||
|
||||
Merged patches (7.2.0):
|
||||
- 0be2889fa2 Introduce upstream 7.0 compat changes (only applicable parts)
|
||||
|
||||
Merged patches (8.0.0):
|
||||
- c1a21266d8 redhat: aarch64: add rhel9.2.0 virt machine type
|
||||
- d97cd7c513 redhat: fix virt-rhel9.2.0 compat props
|
||||
|
||||
Merged patches (8.1.0):
|
||||
- bd5d81d286 Add RHEL 9.2.0 compat structure (arm part)
|
||||
- c07f666086 hw/arm/virt: Validate cluster and NUMA node boundary for RHEL machines
|
||||
|
||||
Merged patches (8.2.0):
|
||||
- 4ee284aca9 Add machine types compat bits. (partial)
|
||||
|
||||
Merged patches (9.0.0 rc0):
|
||||
- 117068376a hw/arm/virt: Fix compats
|
||||
- 8bcccfabc4 hw/arm/virt: Add properties to disable high memory regions
|
||||
0005a8b93a hw/arm/virt: deprecate virt-rhel9.{0,2}.0 machine types
|
||||
|
||||
Merged patches (9.1.0 rc0):
|
||||
- 043ad5ce97 Add upstream compatibility bits (partial)
|
||||
- 092cb319ea hw/arm/virt: Fix spurious call to arm_virt_compat_set()
|
||||
---
|
||||
hw/arm/virt.c | 101 ++++++++++++++++++++++++++++++++++++++++----------
|
||||
1 file changed, 81 insertions(+), 20 deletions(-)
|
||||
hw/arm/virt.c | 131 ++++++++++++++++++++++++++++++++++++++------
|
||||
hw/core/machine.c | 15 +++--
|
||||
include/hw/boards.h | 3 +
|
||||
3 files changed, 125 insertions(+), 24 deletions(-)
|
||||
|
||||
diff --git a/hw/arm/virt.c b/hw/arm/virt.c
|
||||
index 5396e7cb24..903c0f2e9f 100644
|
||||
index e454b29de6..21ab9257e7 100644
|
||||
--- a/hw/arm/virt.c
|
||||
+++ b/hw/arm/virt.c
|
||||
@@ -90,6 +90,22 @@ static GlobalProperty arm_virt_compat[] = {
|
||||
@@ -97,6 +97,32 @@ static GlobalProperty arm_virt_compat[] = {
|
||||
};
|
||||
static const size_t arm_virt_compat_len = G_N_ELEMENTS(arm_virt_compat);
|
||||
|
||||
+/*
|
||||
+ * RHEL9 kernels have pauth disabled while RHEL10 has it enabled,
|
||||
+ * since qemu will setup the VM with pauth when KVM supports it we
|
||||
+ * have to disable it for virt-rhel9* to support upgrades / migration.
|
||||
+ */
|
||||
+GlobalProperty arm_rhel9_compat[] = {
|
||||
+ {TYPE_ARM_CPU, "pauth", "off", .optional = true},
|
||||
+};
|
||||
+const size_t arm_rhel9_compat_len = G_N_ELEMENTS(arm_rhel9_compat);
|
||||
+
|
||||
+/*
|
||||
+ * This variable is for changes to properties that are RHEL specific,
|
||||
+ * different to the current upstream and to be applied to the latest
|
||||
@ -119,16 +49,20 @@ index 5396e7cb24..903c0f2e9f 100644
|
||||
/*
|
||||
* This cannot be called from the virt_machine_class_init() because
|
||||
* TYPE_VIRT_MACHINE is abstract and mc->compat_props g_ptr_array_new()
|
||||
@@ -99,6 +115,8 @@ static void arm_virt_compat_set(MachineClass *mc)
|
||||
@@ -106,6 +132,12 @@ static void arm_virt_compat_set(MachineClass *mc)
|
||||
{
|
||||
compat_props_add(mc->compat_props, arm_virt_compat,
|
||||
arm_virt_compat_len);
|
||||
+ compat_props_add(mc->compat_props, arm_rhel_compat,
|
||||
+ arm_rhel_compat_len);
|
||||
+ compat_props_add(mc->compat_props, arm_rhel9_compat,
|
||||
+ arm_rhel9_compat_len);
|
||||
+ compat_props_add(mc->compat_props, hw_compat_rhel_9,
|
||||
+ hw_compat_rhel_9_len);
|
||||
}
|
||||
|
||||
#define DEFINE_VIRT_MACHINE_IMPL(latest, ...) \
|
||||
@@ -109,10 +127,11 @@ static void arm_virt_compat_set(MachineClass *mc)
|
||||
@@ -116,10 +148,11 @@ static void arm_virt_compat_set(MachineClass *mc)
|
||||
MachineClass *mc = MACHINE_CLASS(oc); \
|
||||
arm_virt_compat_set(mc); \
|
||||
MACHINE_VER_SYM(options, virt, __VA_ARGS__)(mc); \
|
||||
@ -141,7 +75,7 @@ index 5396e7cb24..903c0f2e9f 100644
|
||||
} \
|
||||
} \
|
||||
static const TypeInfo MACHINE_VER_SYM(info, virt, __VA_ARGS__) = \
|
||||
@@ -128,10 +147,10 @@ static void arm_virt_compat_set(MachineClass *mc)
|
||||
@@ -135,10 +168,10 @@ static void arm_virt_compat_set(MachineClass *mc)
|
||||
} \
|
||||
type_init(MACHINE_VER_SYM(register, virt, __VA_ARGS__));
|
||||
|
||||
@ -156,7 +90,22 @@ index 5396e7cb24..903c0f2e9f 100644
|
||||
|
||||
|
||||
/* Number of external interrupt lines to configure the GIC with */
|
||||
@@ -2434,6 +2453,7 @@ static void machvirt_init(MachineState *machine)
|
||||
@@ -1746,12 +1779,13 @@ static void virt_build_smbios(VirtMachineState *vms)
|
||||
{
|
||||
MachineClass *mc = MACHINE_GET_CLASS(vms);
|
||||
MachineState *ms = MACHINE(vms);
|
||||
+ VirtMachineClass *vmc = VIRT_MACHINE_GET_CLASS(vms);
|
||||
uint8_t *smbios_tables, *smbios_anchor;
|
||||
size_t smbios_tables_len, smbios_anchor_len;
|
||||
struct smbios_phys_mem_area mem_array;
|
||||
const char *manufacturer = "QEMU";
|
||||
const char *product = "QEMU Virtual Machine";
|
||||
- const char *version = vmc->smbios_old_sys_ver ? "1.0" : mc->name;
|
||||
+ const char *version = mc->name;
|
||||
|
||||
if (kvm_enabled()) {
|
||||
product = "KVM Virtual Machine";
|
||||
@@ -2526,6 +2560,7 @@ static void machvirt_init(MachineState *machine)
|
||||
qemu_add_machine_init_done_notifier(&vms->machine_done);
|
||||
}
|
||||
|
||||
@ -164,7 +113,7 @@ index 5396e7cb24..903c0f2e9f 100644
|
||||
static bool virt_get_secure(Object *obj, Error **errp)
|
||||
{
|
||||
VirtMachineState *vms = VIRT_MACHINE(obj);
|
||||
@@ -2461,6 +2481,7 @@ static void virt_set_virt(Object *obj, bool value, Error **errp)
|
||||
@@ -2553,6 +2588,7 @@ static void virt_set_virt(Object *obj, bool value, Error **errp)
|
||||
|
||||
vms->virt = value;
|
||||
}
|
||||
@ -172,7 +121,7 @@ index 5396e7cb24..903c0f2e9f 100644
|
||||
|
||||
static bool virt_get_highmem(Object *obj, Error **errp)
|
||||
{
|
||||
@@ -2476,6 +2497,7 @@ static void virt_set_highmem(Object *obj, bool value, Error **errp)
|
||||
@@ -2568,6 +2604,7 @@ static void virt_set_highmem(Object *obj, bool value, Error **errp)
|
||||
vms->highmem = value;
|
||||
}
|
||||
|
||||
@ -180,7 +129,7 @@ index 5396e7cb24..903c0f2e9f 100644
|
||||
static bool virt_get_compact_highmem(Object *obj, Error **errp)
|
||||
{
|
||||
VirtMachineState *vms = VIRT_MACHINE(obj);
|
||||
@@ -2489,6 +2511,7 @@ static void virt_set_compact_highmem(Object *obj, bool value, Error **errp)
|
||||
@@ -2581,6 +2618,7 @@ static void virt_set_compact_highmem(Object *obj, bool value, Error **errp)
|
||||
|
||||
vms->highmem_compact = value;
|
||||
}
|
||||
@ -188,7 +137,7 @@ index 5396e7cb24..903c0f2e9f 100644
|
||||
|
||||
static bool virt_get_highmem_redists(Object *obj, Error **errp)
|
||||
{
|
||||
@@ -2547,6 +2570,7 @@ static void virt_set_its(Object *obj, bool value, Error **errp)
|
||||
@@ -2673,6 +2711,7 @@ static void virt_set_its(Object *obj, bool value, Error **errp)
|
||||
vms->its = value;
|
||||
}
|
||||
|
||||
@ -196,7 +145,7 @@ index 5396e7cb24..903c0f2e9f 100644
|
||||
static bool virt_get_dtb_randomness(Object *obj, Error **errp)
|
||||
{
|
||||
VirtMachineState *vms = VIRT_MACHINE(obj);
|
||||
@@ -2560,6 +2584,7 @@ static void virt_set_dtb_randomness(Object *obj, bool value, Error **errp)
|
||||
@@ -2686,6 +2725,7 @@ static void virt_set_dtb_randomness(Object *obj, bool value, Error **errp)
|
||||
|
||||
vms->dtb_randomness = value;
|
||||
}
|
||||
@ -204,7 +153,7 @@ index 5396e7cb24..903c0f2e9f 100644
|
||||
|
||||
static char *virt_get_oem_id(Object *obj, Error **errp)
|
||||
{
|
||||
@@ -2643,6 +2668,7 @@ static void virt_set_ras(Object *obj, bool value, Error **errp)
|
||||
@@ -2769,6 +2809,7 @@ static void virt_set_ras(Object *obj, bool value, Error **errp)
|
||||
vms->ras = value;
|
||||
}
|
||||
|
||||
@ -212,7 +161,7 @@ index 5396e7cb24..903c0f2e9f 100644
|
||||
static bool virt_get_mte(Object *obj, Error **errp)
|
||||
{
|
||||
VirtMachineState *vms = VIRT_MACHINE(obj);
|
||||
@@ -2656,6 +2682,7 @@ static void virt_set_mte(Object *obj, bool value, Error **errp)
|
||||
@@ -2782,6 +2823,7 @@ static void virt_set_mte(Object *obj, bool value, Error **errp)
|
||||
|
||||
vms->mte = value;
|
||||
}
|
||||
@ -220,7 +169,7 @@ index 5396e7cb24..903c0f2e9f 100644
|
||||
|
||||
static char *virt_get_gic_version(Object *obj, Error **errp)
|
||||
{
|
||||
@@ -3063,16 +3090,10 @@ static void virt_machine_class_init(ObjectClass *oc, void *data)
|
||||
@@ -3222,17 +3264,17 @@ static void virt_machine_class_init(ObjectClass *oc, const void *data)
|
||||
NULL
|
||||
};
|
||||
|
||||
@ -231,16 +180,20 @@ index 5396e7cb24..903c0f2e9f 100644
|
||||
- * configuration of the particular instance.
|
||||
- */
|
||||
- mc->max_cpus = 512;
|
||||
- machine_class_allow_dynamic_sysbus_dev(mc, TYPE_VFIO_CALXEDA_XGMAC);
|
||||
- machine_class_allow_dynamic_sysbus_dev(mc, TYPE_VFIO_AMD_XGBE);
|
||||
- machine_class_allow_dynamic_sysbus_dev(mc, TYPE_RAMFB_DEVICE);
|
||||
- machine_class_allow_dynamic_sysbus_dev(mc, TYPE_VFIO_PLATFORM);
|
||||
+ /* Maximum supported VCPU count for all virt-rhel* machines */
|
||||
+ mc->max_cpus = 384;
|
||||
+#if 0 /* Disabled for Red Hat Enterprise Linux */
|
||||
machine_class_allow_dynamic_sysbus_dev(mc, TYPE_VFIO_CALXEDA_XGMAC);
|
||||
machine_class_allow_dynamic_sysbus_dev(mc, TYPE_VFIO_AMD_XGBE);
|
||||
- machine_class_allow_dynamic_sysbus_dev(mc, TYPE_RAMFB_DEVICE);
|
||||
machine_class_allow_dynamic_sysbus_dev(mc, TYPE_VFIO_PLATFORM);
|
||||
machine_class_allow_dynamic_sysbus_dev(mc, TYPE_UEFI_VARS_SYSBUS);
|
||||
+#endif
|
||||
+ machine_class_allow_dynamic_sysbus_dev(mc, TYPE_RAMFB_DEVICE);
|
||||
#ifdef CONFIG_TPM
|
||||
machine_class_allow_dynamic_sysbus_dev(mc, TYPE_TPM_TIS_SYSBUS);
|
||||
#endif
|
||||
@@ -3083,11 +3104,7 @@ static void virt_machine_class_init(ObjectClass *oc, void *data)
|
||||
@@ -3243,11 +3285,7 @@ static void virt_machine_class_init(ObjectClass *oc, const void *data)
|
||||
mc->minimum_page_bits = 12;
|
||||
mc->possible_cpu_arch_ids = virt_possible_cpu_arch_ids;
|
||||
mc->cpu_index_to_instance_props = virt_cpu_index_to_props;
|
||||
@ -253,7 +206,7 @@ index 5396e7cb24..903c0f2e9f 100644
|
||||
mc->valid_cpu_types = valid_cpu_types;
|
||||
mc->get_default_cpu_node_id = virt_get_default_cpu_node_id;
|
||||
mc->kvm_type = virt_kvm_type;
|
||||
@@ -3111,6 +3128,7 @@ static void virt_machine_class_init(ObjectClass *oc, void *data)
|
||||
@@ -3272,6 +3310,7 @@ static void virt_machine_class_init(ObjectClass *oc, const void *data)
|
||||
NULL, NULL);
|
||||
object_class_property_set_description(oc, "acpi",
|
||||
"Enable ACPI");
|
||||
@ -261,7 +214,7 @@ index 5396e7cb24..903c0f2e9f 100644
|
||||
object_class_property_add_bool(oc, "secure", virt_get_secure,
|
||||
virt_set_secure);
|
||||
object_class_property_set_description(oc, "secure",
|
||||
@@ -3123,6 +3141,7 @@ static void virt_machine_class_init(ObjectClass *oc, void *data)
|
||||
@@ -3284,6 +3323,7 @@ static void virt_machine_class_init(ObjectClass *oc, const void *data)
|
||||
"Set on/off to enable/disable emulating a "
|
||||
"guest CPU which implements the ARM "
|
||||
"Virtualization Extensions");
|
||||
@ -269,7 +222,7 @@ index 5396e7cb24..903c0f2e9f 100644
|
||||
|
||||
object_class_property_add_bool(oc, "highmem", virt_get_highmem,
|
||||
virt_set_highmem);
|
||||
@@ -3130,12 +3149,14 @@ static void virt_machine_class_init(ObjectClass *oc, void *data)
|
||||
@@ -3291,12 +3331,14 @@ static void virt_machine_class_init(ObjectClass *oc, const void *data)
|
||||
"Set on/off to enable/disable using "
|
||||
"physical address space above 32 bits");
|
||||
|
||||
@ -284,7 +237,7 @@ index 5396e7cb24..903c0f2e9f 100644
|
||||
|
||||
object_class_property_add_bool(oc, "highmem-redists",
|
||||
virt_get_highmem_redists,
|
||||
@@ -3163,7 +3184,7 @@ static void virt_machine_class_init(ObjectClass *oc, void *data)
|
||||
@@ -3332,7 +3374,7 @@ static void virt_machine_class_init(ObjectClass *oc, const void *data)
|
||||
virt_set_gic_version);
|
||||
object_class_property_set_description(oc, "gic-version",
|
||||
"Set GIC version. "
|
||||
@ -293,7 +246,7 @@ index 5396e7cb24..903c0f2e9f 100644
|
||||
|
||||
object_class_property_add_str(oc, "iommu", virt_get_iommu, virt_set_iommu);
|
||||
object_class_property_set_description(oc, "iommu",
|
||||
@@ -3183,11 +3204,13 @@ static void virt_machine_class_init(ObjectClass *oc, void *data)
|
||||
@@ -3352,11 +3394,13 @@ static void virt_machine_class_init(ObjectClass *oc, const void *data)
|
||||
"Set on/off to enable/disable reporting host memory errors "
|
||||
"to a KVM guest using ACPI and guest external abort exceptions");
|
||||
|
||||
@ -307,7 +260,7 @@ index 5396e7cb24..903c0f2e9f 100644
|
||||
|
||||
object_class_property_add_bool(oc, "its", virt_get_its,
|
||||
virt_set_its);
|
||||
@@ -3195,6 +3218,7 @@ static void virt_machine_class_init(ObjectClass *oc, void *data)
|
||||
@@ -3364,6 +3408,7 @@ static void virt_machine_class_init(ObjectClass *oc, const void *data)
|
||||
"Set on/off to enable/disable "
|
||||
"ITS instantiation");
|
||||
|
||||
@ -315,7 +268,7 @@ index 5396e7cb24..903c0f2e9f 100644
|
||||
object_class_property_add_bool(oc, "dtb-randomness",
|
||||
virt_get_dtb_randomness,
|
||||
virt_set_dtb_randomness);
|
||||
@@ -3207,6 +3231,7 @@ static void virt_machine_class_init(ObjectClass *oc, void *data)
|
||||
@@ -3376,6 +3421,7 @@ static void virt_machine_class_init(ObjectClass *oc, const void *data)
|
||||
virt_set_dtb_randomness);
|
||||
object_class_property_set_description(oc, "dtb-kaslr-seed",
|
||||
"Deprecated synonym of dtb-randomness");
|
||||
@ -323,16 +276,29 @@ index 5396e7cb24..903c0f2e9f 100644
|
||||
|
||||
object_class_property_add_str(oc, "x-oem-id",
|
||||
virt_get_oem_id,
|
||||
@@ -3554,3 +3579,39 @@ static void virt_machine_2_6_options(MachineClass *mc)
|
||||
@@ -3645,3 +3691,52 @@ static void virt_machine_4_1_options(MachineClass *mc)
|
||||
}
|
||||
DEFINE_VIRT_MACHINE(2, 6)
|
||||
DEFINE_VIRT_MACHINE(4, 1)
|
||||
#endif /* disabled for RHEL */
|
||||
+
|
||||
+static void virt_rhel_machine_9_6_0_options(MachineClass *mc)
|
||||
+{
|
||||
+}
|
||||
+DEFINE_VIRT_MACHINE_AS_LATEST(9, 6, 0)
|
||||
+
|
||||
+static void virt_rhel_machine_9_4_0_options(MachineClass *mc)
|
||||
+{
|
||||
+ VirtMachineClass *vmc = VIRT_MACHINE_CLASS(OBJECT_CLASS(mc));
|
||||
+ virt_rhel_machine_9_6_0_options(mc);
|
||||
+
|
||||
+ /* From virt_machine_9_0_options() */
|
||||
+ mc->smbios_memory_device_size = 16 * GiB;
|
||||
+ vmc->manufacturer_product_compat = true;
|
||||
+
|
||||
+ compat_props_add(mc->compat_props, hw_compat_rhel_9_6, hw_compat_rhel_9_6_len);
|
||||
+ compat_props_add(mc->compat_props, hw_compat_rhel_9_5, hw_compat_rhel_9_5_len);
|
||||
+}
|
||||
+DEFINE_VIRT_MACHINE_AS_LATEST(9, 4, 0)
|
||||
+DEFINE_VIRT_MACHINE(9, 4, 0)
|
||||
+
|
||||
+static void virt_rhel_machine_9_2_0_options(MachineClass *mc)
|
||||
+{
|
||||
@ -363,6 +329,50 @@ index 5396e7cb24..903c0f2e9f 100644
|
||||
+ vmc->no_highmem_compact = true;
|
||||
+}
|
||||
+DEFINE_VIRT_MACHINE(9, 0, 0)
|
||||
--
|
||||
2.39.3
|
||||
|
||||
diff --git a/hw/core/machine.c b/hw/core/machine.c
|
||||
index 7a7317941b..2e69dc40f0 100644
|
||||
--- a/hw/core/machine.c
|
||||
+++ b/hw/core/machine.c
|
||||
@@ -288,6 +288,15 @@ GlobalProperty hw_compat_2_6[] = {
|
||||
};
|
||||
const size_t hw_compat_2_6_len = G_N_ELEMENTS(hw_compat_2_6);
|
||||
|
||||
+/* Apply this to all RHEL9 boards going backward and forward */
|
||||
+GlobalProperty hw_compat_rhel_9[] = {
|
||||
+ /* supported by userspace, but RHEL 9 *kernels* do not support USO. */
|
||||
+ { TYPE_VIRTIO_NET, "host_uso", "off"},
|
||||
+ { TYPE_VIRTIO_NET, "guest_uso4", "off"},
|
||||
+ { TYPE_VIRTIO_NET, "guest_uso6", "off"},
|
||||
+};
|
||||
+const size_t hw_compat_rhel_9_len = G_N_ELEMENTS(hw_compat_rhel_9);
|
||||
+
|
||||
/*
|
||||
* RHEL only: machine types for previous major releases are deprecated
|
||||
*/
|
||||
@@ -324,12 +333,6 @@ GlobalProperty hw_compat_rhel_9_5[] = {
|
||||
const size_t hw_compat_rhel_9_5_len = G_N_ELEMENTS(hw_compat_rhel_9_5);
|
||||
|
||||
GlobalProperty hw_compat_rhel_9_4[] = {
|
||||
- /* hw_compat_rhel_9_4 from hw_compat_8_0 */
|
||||
- { TYPE_VIRTIO_NET, "host_uso", "off"},
|
||||
- /* hw_compat_rhel_9_4 from hw_compat_8_0 */
|
||||
- { TYPE_VIRTIO_NET, "guest_uso4", "off"},
|
||||
- /* hw_compat_rhel_9_4 from hw_compat_8_0 */
|
||||
- { TYPE_VIRTIO_NET, "guest_uso6", "off"},
|
||||
/* hw_compat_rhel_9_4 from hw_compat_8_1 */
|
||||
{ TYPE_PCI_BRIDGE, "x-pci-express-writeable-slt-bug", "true" },
|
||||
/* hw_compat_rhel_9_4 from hw_compat_8_1 */
|
||||
diff --git a/include/hw/boards.h b/include/hw/boards.h
|
||||
index 1e03667fd1..025f6899a7 100644
|
||||
--- a/include/hw/boards.h
|
||||
+++ b/include/hw/boards.h
|
||||
@@ -856,6 +856,9 @@ extern const size_t hw_compat_2_7_len;
|
||||
extern GlobalProperty hw_compat_2_6[];
|
||||
extern const size_t hw_compat_2_6_len;
|
||||
|
||||
+extern GlobalProperty hw_compat_rhel_9[];
|
||||
+extern const size_t hw_compat_rhel_9_len;
|
||||
+
|
||||
extern GlobalProperty hw_compat_rhel_9_6[];
|
||||
extern const size_t hw_compat_rhel_9_6_len;
|
||||
|
||||
@ -1,7 +1,7 @@
|
||||
From 676f3da2fc29ae71ed4189483b86e3c6496b8905 Mon Sep 17 00:00:00 2001
|
||||
From b6f5f329f080993e5f8e26ca376331479bef4ca7 Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Daniel=20P=2E=20Berrang=C3=A9?= <berrange@redhat.com>
|
||||
Date: Wed, 3 Jul 2024 13:44:31 +0100
|
||||
Subject: Add downstream ppc64 versioned 'spapr' machine types
|
||||
Subject: [PATCH] Add downstream ppc64 versioned 'spapr' machine types
|
||||
|
||||
Adding changes to add RHEL machine types for ppc64 architecture.
|
||||
|
||||
@ -34,13 +34,13 @@ Merged patches (7.1.0):
|
||||
target/ppc/cpu.h | 1 +
|
||||
target/ppc/kvm.c | 27 +++++
|
||||
target/ppc/kvm_ppc.h | 13 ++
|
||||
7 files changed, 317 insertions(+), 6 deletions(-)
|
||||
7 files changed, 318 insertions(+), 5 deletions(-)
|
||||
|
||||
diff --git a/hw/ppc/spapr.c b/hw/ppc/spapr.c
|
||||
index b48a2afc38..29e66f1b3f 100644
|
||||
index 6a5f75af7d..17b6bc6157 100644
|
||||
--- a/hw/ppc/spapr.c
|
||||
+++ b/hw/ppc/spapr.c
|
||||
@@ -1746,6 +1746,13 @@ static void spapr_machine_reset(MachineState *machine, ShutdownCause reason)
|
||||
@@ -1717,6 +1717,13 @@ static void spapr_machine_reset(MachineState *machine, ResetType type)
|
||||
}
|
||||
spapr_caps_apply(spapr);
|
||||
spapr_nested_reset(spapr);
|
||||
@ -54,7 +54,7 @@ index b48a2afc38..29e66f1b3f 100644
|
||||
|
||||
first_ppc_cpu = POWERPC_CPU(first_cpu);
|
||||
if (kvm_enabled() && kvmppc_has_cap_mmu_radix() &&
|
||||
@@ -3452,6 +3459,20 @@ static void spapr_set_host_serial(Object *obj, const char *value, Error **errp)
|
||||
@@ -3408,6 +3415,20 @@ static void spapr_set_host_serial(Object *obj, const char *value, Error **errp)
|
||||
spapr->host_serial = g_strdup(value);
|
||||
}
|
||||
|
||||
@ -75,7 +75,7 @@ index b48a2afc38..29e66f1b3f 100644
|
||||
static void spapr_instance_init(Object *obj)
|
||||
{
|
||||
SpaprMachineState *spapr = SPAPR_MACHINE(obj);
|
||||
@@ -3530,6 +3551,12 @@ static void spapr_instance_init(Object *obj)
|
||||
@@ -3486,6 +3507,12 @@ static void spapr_instance_init(Object *obj)
|
||||
spapr_get_host_serial, spapr_set_host_serial);
|
||||
object_property_set_description(obj, "host-serial",
|
||||
"Host serial number to advertise in guest device tree");
|
||||
@ -88,7 +88,7 @@ index b48a2afc38..29e66f1b3f 100644
|
||||
}
|
||||
|
||||
static void spapr_machine_finalizefn(Object *obj)
|
||||
@@ -4775,6 +4802,7 @@ static void spapr_machine_class_init(ObjectClass *oc, void *data)
|
||||
@@ -4701,6 +4728,7 @@ static void spapr_machine_class_init(ObjectClass *oc, const void *data)
|
||||
vmc->client_architecture_support = spapr_vof_client_architecture_support;
|
||||
vmc->quiesce = spapr_vof_quiesce;
|
||||
vmc->setprop = spapr_vof_setprop;
|
||||
@ -96,7 +96,7 @@ index b48a2afc38..29e66f1b3f 100644
|
||||
}
|
||||
|
||||
static const TypeInfo spapr_machine_info = {
|
||||
@@ -4830,12 +4858,12 @@ static void spapr_machine_latest_class_options(MachineClass *mc)
|
||||
@@ -4756,11 +4784,14 @@ static void spapr_machine_latest_class_options(MachineClass *mc)
|
||||
} \
|
||||
type_init(MACHINE_VER_SYM(register, spapr, __VA_ARGS__))
|
||||
|
||||
@ -104,8 +104,6 @@ index b48a2afc38..29e66f1b3f 100644
|
||||
- DEFINE_SPAPR_MACHINE_IMPL(true, major, minor)
|
||||
-#define DEFINE_SPAPR_MACHINE(major, minor) \
|
||||
- DEFINE_SPAPR_MACHINE_IMPL(false, major, minor)
|
||||
-#define DEFINE_SPAPR_MACHINE_TAGGED(major, minor, tag) \
|
||||
- DEFINE_SPAPR_MACHINE_IMPL(false, major, minor, _, tag)
|
||||
+#define DEFINE_SPAPR_MACHINE_AS_LATEST(major, minor, micro) \
|
||||
+ DEFINE_SPAPR_MACHINE_IMPL(true, major, minor, micro)
|
||||
+#define DEFINE_SPAPR_MACHINE(major, minor, micro) \
|
||||
@ -113,10 +111,20 @@ index b48a2afc38..29e66f1b3f 100644
|
||||
+#define DEFINE_SPAPR_MACHINE_TAGGED(major, minor, micro, tag) \
|
||||
+ DEFINE_SPAPR_MACHINE_IMPL(false, major, minor, micro, _, tag)
|
||||
|
||||
#if 0 /* Disabled for Red Hat Enterprise Linux */
|
||||
+#if 0 /* Disabled for Red Hat Enterprise Linux */
|
||||
/*
|
||||
@@ -5386,6 +5414,220 @@ static void spapr_machine_2_1_class_options(MachineClass *mc)
|
||||
DEFINE_SPAPR_MACHINE(2, 1);
|
||||
* pseries-10.1
|
||||
*/
|
||||
@@ -4793,7 +4824,6 @@ static void spapr_machine_9_2_class_options(MachineClass *mc)
|
||||
|
||||
DEFINE_SPAPR_MACHINE(9, 2);
|
||||
|
||||
-#if 0 /* Disabled for Red Hat Enterprise Linux */
|
||||
/*
|
||||
* pseries-9.1
|
||||
*/
|
||||
@@ -5072,6 +5102,220 @@ static void spapr_machine_3_0_class_options(MachineClass *mc)
|
||||
DEFINE_SPAPR_MACHINE(3, 0);
|
||||
#endif /* disabled for RHEL */
|
||||
|
||||
+static void spapr_rhel_machine_default_class_options(MachineClass *mc)
|
||||
@ -337,18 +345,18 @@ index b48a2afc38..29e66f1b3f 100644
|
||||
{
|
||||
type_register_static(&spapr_machine_info);
|
||||
diff --git a/hw/ppc/spapr_cpu_core.c b/hw/ppc/spapr_cpu_core.c
|
||||
index 0bf7c52077..c845f4acef 100644
|
||||
index aaee248290..e70317c6bc 100644
|
||||
--- a/hw/ppc/spapr_cpu_core.c
|
||||
+++ b/hw/ppc/spapr_cpu_core.c
|
||||
@@ -25,6 +25,7 @@
|
||||
#include "sysemu/reset.h"
|
||||
#include "sysemu/hw_accel.h"
|
||||
#include "system/reset.h"
|
||||
#include "system/hw_accel.h"
|
||||
#include "qemu/error-report.h"
|
||||
+#include "cpu-models.h"
|
||||
|
||||
static void spapr_reset_vcpu(PowerPCCPU *cpu)
|
||||
{
|
||||
@@ -264,6 +265,7 @@ static bool spapr_realize_vcpu(PowerPCCPU *cpu, SpaprMachineState *spapr,
|
||||
@@ -268,6 +269,7 @@ static bool spapr_realize_vcpu(PowerPCCPU *cpu, SpaprMachineState *spapr,
|
||||
{
|
||||
CPUPPCState *env = &cpu->env;
|
||||
CPUState *cs = CPU(cpu);
|
||||
@ -356,7 +364,7 @@ index 0bf7c52077..c845f4acef 100644
|
||||
|
||||
if (!qdev_realize(DEVICE(cpu), NULL, errp)) {
|
||||
return false;
|
||||
@@ -280,6 +282,17 @@ static bool spapr_realize_vcpu(PowerPCCPU *cpu, SpaprMachineState *spapr,
|
||||
@@ -286,6 +288,17 @@ static bool spapr_realize_vcpu(PowerPCCPU *cpu, SpaprMachineState *spapr,
|
||||
/* Set time-base frequency to 512 MHz. vhyp must be set first. */
|
||||
cpu_ppc_tb_init(env, SPAPR_TIMEBASE_FREQ);
|
||||
|
||||
@ -375,10 +383,10 @@ index 0bf7c52077..c845f4acef 100644
|
||||
qdev_unrealize(DEVICE(cpu));
|
||||
return false;
|
||||
diff --git a/include/hw/ppc/spapr.h b/include/hw/ppc/spapr.h
|
||||
index f6de3e9972..fc48348747 100644
|
||||
index 39bd5bd5ed..1bce0a59e0 100644
|
||||
--- a/include/hw/ppc/spapr.h
|
||||
+++ b/include/hw/ppc/spapr.h
|
||||
@@ -157,6 +157,7 @@ struct SpaprMachineClass {
|
||||
@@ -156,6 +156,7 @@ struct SpaprMachineClass {
|
||||
bool pre_5_2_numa_associativity;
|
||||
bool pre_6_2_numa_affinity;
|
||||
|
||||
@ -397,10 +405,10 @@ index f6de3e9972..fc48348747 100644
|
||||
char *kvm_type;
|
||||
char *host_model;
|
||||
diff --git a/target/ppc/compat.c b/target/ppc/compat.c
|
||||
index ebef2cccec..ab7ed76806 100644
|
||||
index 55de3bd5d5..1bf6994da7 100644
|
||||
--- a/target/ppc/compat.c
|
||||
+++ b/target/ppc/compat.c
|
||||
@@ -114,6 +114,17 @@ static const CompatInfo *compat_by_pvr(uint32_t pvr)
|
||||
@@ -121,6 +121,17 @@ static const CompatInfo *compat_by_pvr(uint32_t pvr)
|
||||
return NULL;
|
||||
}
|
||||
|
||||
@ -419,10 +427,10 @@ index ebef2cccec..ab7ed76806 100644
|
||||
uint32_t min_compat_pvr, uint32_t max_compat_pvr)
|
||||
{
|
||||
diff --git a/target/ppc/cpu.h b/target/ppc/cpu.h
|
||||
index 321ed2da75..e35a997628 100644
|
||||
index 6b90543811..774565054b 100644
|
||||
--- a/target/ppc/cpu.h
|
||||
+++ b/target/ppc/cpu.h
|
||||
@@ -1673,6 +1673,7 @@ static inline int ppc_env_mmu_index(CPUPPCState *env, bool ifetch)
|
||||
@@ -1684,6 +1684,7 @@ static inline int ppc_env_mmu_index(CPUPPCState *env, bool ifetch)
|
||||
|
||||
/* Compatibility modes */
|
||||
#if defined(TARGET_PPC64)
|
||||
@ -431,26 +439,26 @@ index 321ed2da75..e35a997628 100644
|
||||
uint32_t min_compat_pvr, uint32_t max_compat_pvr);
|
||||
bool ppc_type_check_compat(const char *cputype, uint32_t compat_pvr,
|
||||
diff --git a/target/ppc/kvm.c b/target/ppc/kvm.c
|
||||
index 907dba60d1..c942ff55b2 100644
|
||||
index 015658049e..d2d442ff5e 100644
|
||||
--- a/target/ppc/kvm.c
|
||||
+++ b/target/ppc/kvm.c
|
||||
@@ -92,6 +92,7 @@ static int cap_large_decr;
|
||||
static int cap_fwnmi;
|
||||
@@ -93,6 +93,7 @@ static int cap_fwnmi;
|
||||
static int cap_rpt_invalidate;
|
||||
static int cap_ail_mode_3;
|
||||
static int cap_dawr1;
|
||||
+static int cap_ppc_secure_guest;
|
||||
|
||||
#ifdef CONFIG_PSERIES
|
||||
static int cap_papr;
|
||||
@@ -150,6 +151,7 @@ int kvm_arch_init(MachineState *ms, KVMState *s)
|
||||
@@ -151,6 +152,7 @@ int kvm_arch_init(MachineState *ms, KVMState *s)
|
||||
cap_resize_hpt = kvm_vm_check_extension(s, KVM_CAP_SPAPR_RESIZE_HPT);
|
||||
kvmppc_get_cpu_characteristics(s);
|
||||
cap_ppc_nested_kvm_hv = kvm_vm_check_extension(s, KVM_CAP_PPC_NESTED_HV);
|
||||
+ cap_ppc_secure_guest = kvm_vm_check_extension(s, KVM_CAP_PPC_SECURE_GUEST);
|
||||
cap_large_decr = kvmppc_get_dec_bits();
|
||||
cap_fwnmi = kvm_vm_check_extension(s, KVM_CAP_PPC_FWNMI);
|
||||
/*
|
||||
@@ -2597,6 +2599,16 @@ bool kvmppc_supports_ail_3(void)
|
||||
cap_dawr1 = kvm_vm_check_extension(s, KVM_CAP_PPC_DAWR1);
|
||||
@@ -2613,6 +2615,16 @@ bool kvmppc_supports_ail_3(void)
|
||||
return cap_ail_mode_3;
|
||||
}
|
||||
|
||||
@ -467,7 +475,7 @@ index 907dba60d1..c942ff55b2 100644
|
||||
PowerPCCPUClass *kvm_ppc_get_host_cpu_class(void)
|
||||
{
|
||||
uint32_t host_pvr = mfpvr();
|
||||
@@ -3012,3 +3024,18 @@ static void kvm_cpu_accel_register_types(void)
|
||||
@@ -3028,3 +3040,18 @@ static void kvm_cpu_accel_register_types(void)
|
||||
type_register_static(&kvm_cpu_accel_type_info);
|
||||
}
|
||||
type_init(kvm_cpu_accel_register_types);
|
||||
@ -487,7 +495,7 @@ index 907dba60d1..c942ff55b2 100644
|
||||
+ }
|
||||
+}
|
||||
diff --git a/target/ppc/kvm_ppc.h b/target/ppc/kvm_ppc.h
|
||||
index 1975fb5ee6..d1017f98be 100644
|
||||
index a1d9ce9f9a..2176f7fa6c 100644
|
||||
--- a/target/ppc/kvm_ppc.h
|
||||
+++ b/target/ppc/kvm_ppc.h
|
||||
@@ -46,6 +46,7 @@ int kvmppc_booke_watchdog_enable(PowerPCCPU *cpu);
|
||||
@ -498,7 +506,7 @@ index 1975fb5ee6..d1017f98be 100644
|
||||
bool kvmppc_spapr_use_multitce(void);
|
||||
int kvmppc_spapr_enable_inkernel_multitce(void);
|
||||
void *kvmppc_create_spapr_tce(uint32_t liobn, uint32_t page_shift,
|
||||
@@ -79,6 +80,8 @@ int kvmppc_enable_cap_large_decr(PowerPCCPU *cpu, int enable);
|
||||
@@ -81,6 +82,8 @@ int kvmppc_enable_cap_large_decr(PowerPCCPU *cpu, int enable);
|
||||
int kvmppc_has_cap_rpt_invalidate(void);
|
||||
bool kvmppc_supports_ail_3(void);
|
||||
int kvmppc_enable_hwrng(void);
|
||||
@ -507,7 +515,7 @@ index 1975fb5ee6..d1017f98be 100644
|
||||
int kvmppc_put_books_sregs(PowerPCCPU *cpu);
|
||||
PowerPCCPUClass *kvm_ppc_get_host_cpu_class(void);
|
||||
void kvmppc_check_papr_resize_hpt(Error **errp);
|
||||
@@ -427,6 +430,16 @@ static inline bool kvmppc_supports_ail_3(void)
|
||||
@@ -437,6 +440,16 @@ static inline bool kvmppc_supports_ail_3(void)
|
||||
return false;
|
||||
}
|
||||
|
||||
@ -524,6 +532,3 @@ index 1975fb5ee6..d1017f98be 100644
|
||||
static inline int kvmppc_enable_hwrng(void)
|
||||
{
|
||||
return -1;
|
||||
--
|
||||
2.39.3
|
||||
|
||||
@ -1,7 +1,8 @@
|
||||
From 450ae6631771593689f7f9c3eb2081e93d3e75c5 Mon Sep 17 00:00:00 2001
|
||||
From 8cd6ae0377f5b07272d17a9b30455a6f9d141c54 Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Daniel=20P=2E=20Berrang=C3=A9?= <berrange@redhat.com>
|
||||
Date: Wed, 3 Jul 2024 13:44:36 +0100
|
||||
Subject: Add downstream s390x versioned 's390-ccw-virtio' machine types
|
||||
Subject: [PATCH] Add downstream s390x versioned 's390-ccw-virtio' machine
|
||||
types
|
||||
|
||||
Adding changes to add RHEL machine types for s390x architecture.
|
||||
|
||||
@ -48,26 +49,26 @@ Merged patches (8.2.0):
|
||||
Merged patches (9.1.0 rc0):
|
||||
- 043ad5ce97 Add upstream compatibility bits (partial)
|
||||
---
|
||||
hw/s390x/s390-virtio-ccw.c | 164 ++++++++++++++++++++++++++++++-
|
||||
target/s390x/cpu_models.c | 11 +++
|
||||
hw/s390x/s390-virtio-ccw.c | 184 ++++++++++++++++++++++++++++++-
|
||||
target/s390x/cpu_models.c | 11 ++
|
||||
target/s390x/cpu_models.h | 2 +
|
||||
target/s390x/cpu_models_sysemu.c | 2 +
|
||||
4 files changed, 174 insertions(+), 5 deletions(-)
|
||||
target/s390x/cpu_models_system.c | 2 +
|
||||
4 files changed, 194 insertions(+), 5 deletions(-)
|
||||
|
||||
diff --git a/hw/s390x/s390-virtio-ccw.c b/hw/s390x/s390-virtio-ccw.c
|
||||
index 86bfc9d2eb..72e1279db9 100644
|
||||
index 022376376e..46161d16a5 100644
|
||||
--- a/hw/s390x/s390-virtio-ccw.c
|
||||
+++ b/hw/s390x/s390-virtio-ccw.c
|
||||
@@ -837,7 +837,7 @@ static const TypeInfo ccw_machine_info = {
|
||||
@@ -883,7 +883,7 @@ static const TypeInfo ccw_machine_info = {
|
||||
{ \
|
||||
MachineClass *mc = MACHINE_CLASS(oc); \
|
||||
MACHINE_VER_SYM(class_options, ccw, __VA_ARGS__)(mc); \
|
||||
- mc->desc = "Virtual s390x machine (version " MACHINE_VER_STR(__VA_ARGS__) ")"; \
|
||||
+ mc->desc = "Virtual s390x machine (version rhel" MACHINE_VER_STR(__VA_ARGS__) ")"; \
|
||||
mc->init = MACHINE_VER_SYM(mach_init, ccw, __VA_ARGS__); \
|
||||
MACHINE_VER_DEPRECATION(__VA_ARGS__); \
|
||||
if (latest) { \
|
||||
mc->alias = "s390-ccw-virtio"; \
|
||||
@@ -864,11 +864,11 @@ static const TypeInfo ccw_machine_info = {
|
||||
@@ -904,11 +904,11 @@ static const TypeInfo ccw_machine_info = {
|
||||
} \
|
||||
type_init(MACHINE_VER_SYM(register, ccw, __VA_ARGS__))
|
||||
|
||||
@ -83,19 +84,39 @@ index 86bfc9d2eb..72e1279db9 100644
|
||||
|
||||
|
||||
#if 0 /* Disabled for Red Hat Enterprise Linux */
|
||||
@@ -1308,6 +1308,160 @@ DEFINE_CCW_MACHINE(2, 4);
|
||||
#endif
|
||||
@@ -1169,6 +1169,180 @@ static void ccw_machine_4_2_class_options(MachineClass *mc)
|
||||
DEFINE_CCW_MACHINE(4, 2);
|
||||
#endif /* disabled for RHEL */
|
||||
|
||||
+static void ccw_rhel_machine_9_6_0_instance_options(MachineState *machine)
|
||||
+{
|
||||
+}
|
||||
+
|
||||
+static void ccw_rhel_machine_9_6_0_class_options(MachineClass *mc)
|
||||
+{
|
||||
+ /* NB: remember to move this line to the *latest* RHEL 9 machine */
|
||||
+ compat_props_add(mc->compat_props, hw_compat_rhel_9, hw_compat_rhel_9_len);
|
||||
+}
|
||||
+DEFINE_CCW_MACHINE_AS_LATEST(9, 6, 0);
|
||||
+
|
||||
+static void ccw_rhel_machine_9_4_0_instance_options(MachineState *machine)
|
||||
+{
|
||||
+ ccw_rhel_machine_9_6_0_instance_options(machine);
|
||||
+}
|
||||
+
|
||||
+static void ccw_rhel_machine_9_4_0_class_options(MachineClass *mc)
|
||||
+{
|
||||
+ static GlobalProperty compat[] = {
|
||||
+ { TYPE_QEMU_S390_FLIC, "migrate-all-state", "off", },
|
||||
+ };
|
||||
+
|
||||
+ ccw_rhel_machine_9_6_0_class_options(mc);
|
||||
+
|
||||
+ compat_props_add(mc->compat_props, hw_compat_rhel_9_6, hw_compat_rhel_9_6_len);
|
||||
+ compat_props_add(mc->compat_props, hw_compat_rhel_9_5, hw_compat_rhel_9_5_len);
|
||||
+ compat_props_add(mc->compat_props, compat, G_N_ELEMENTS(compat));
|
||||
+}
|
||||
+DEFINE_CCW_MACHINE_AS_LATEST(9, 4, 0);
|
||||
+DEFINE_CCW_MACHINE(9, 4, 0);
|
||||
+
|
||||
+static void ccw_rhel_machine_9_2_0_instance_options(MachineState *machine)
|
||||
+{
|
||||
@ -217,7 +238,7 @@ index 86bfc9d2eb..72e1279db9 100644
|
||||
+
|
||||
+static void ccw_rhel_machine_7_6_0_instance_options(MachineState *machine)
|
||||
+{
|
||||
+ static const S390FeatInit qemu_cpu_feat = { S390_FEAT_LIST_QEMU_V3_1 };
|
||||
+ static const S390FeatInit qemu_cpu_feat = { };
|
||||
+
|
||||
+ ccw_rhel_machine_8_2_0_instance_options(machine);
|
||||
+
|
||||
@ -245,7 +266,7 @@ index 86bfc9d2eb..72e1279db9 100644
|
||||
{
|
||||
type_register_static(&ccw_machine_info);
|
||||
diff --git a/target/s390x/cpu_models.c b/target/s390x/cpu_models.c
|
||||
index a27f4b6f79..9ee30310c6 100644
|
||||
index 954a7a99a9..570630a4dd 100644
|
||||
--- a/target/s390x/cpu_models.c
|
||||
+++ b/target/s390x/cpu_models.c
|
||||
@@ -47,6 +47,9 @@
|
||||
@ -258,8 +279,8 @@ index a27f4b6f79..9ee30310c6 100644
|
||||
static S390CPUDef s390_cpu_defs[] = {
|
||||
/*
|
||||
* Linux requires at least z10 nowadays, and IBM only supports recent CPUs
|
||||
@@ -871,22 +874,30 @@ static void s390_host_cpu_model_class_init(ObjectClass *oc, void *data)
|
||||
static void s390_base_cpu_model_class_init(ObjectClass *oc, void *data)
|
||||
@@ -931,22 +934,30 @@ static void s390_host_cpu_model_class_init(ObjectClass *oc, const void *data)
|
||||
static void s390_base_cpu_model_class_init(ObjectClass *oc, const void *data)
|
||||
{
|
||||
S390CPUClass *xcc = S390_CPU_CLASS(oc);
|
||||
+ CPUClass *cc = CPU_CLASS(oc);
|
||||
@ -274,7 +295,7 @@ index a27f4b6f79..9ee30310c6 100644
|
||||
+ }
|
||||
}
|
||||
|
||||
static void s390_cpu_model_class_init(ObjectClass *oc, void *data)
|
||||
static void s390_cpu_model_class_init(ObjectClass *oc, const void *data)
|
||||
{
|
||||
S390CPUClass *xcc = S390_CPU_CLASS(oc);
|
||||
+ CPUClass *cc = CPU_CLASS(oc);
|
||||
@ -288,9 +309,9 @@ index a27f4b6f79..9ee30310c6 100644
|
||||
+ }
|
||||
}
|
||||
|
||||
static void s390_qemu_cpu_model_class_init(ObjectClass *oc, void *data)
|
||||
static void s390_qemu_cpu_model_class_init(ObjectClass *oc, const void *data)
|
||||
diff --git a/target/s390x/cpu_models.h b/target/s390x/cpu_models.h
|
||||
index 71d4bc2dd4..d6c7c2cb50 100644
|
||||
index f701bc0b53..670a567c67 100644
|
||||
--- a/target/s390x/cpu_models.h
|
||||
+++ b/target/s390x/cpu_models.h
|
||||
@@ -38,6 +38,8 @@ typedef struct S390CPUDef {
|
||||
@ -302,10 +323,10 @@ index 71d4bc2dd4..d6c7c2cb50 100644
|
||||
} S390CPUDef;
|
||||
|
||||
/* CPU model based on a CPU definition */
|
||||
diff --git a/target/s390x/cpu_models_sysemu.c b/target/s390x/cpu_models_sysemu.c
|
||||
index 72572726b8..707d546ca1 100644
|
||||
--- a/target/s390x/cpu_models_sysemu.c
|
||||
+++ b/target/s390x/cpu_models_sysemu.c
|
||||
diff --git a/target/s390x/cpu_models_system.c b/target/s390x/cpu_models_system.c
|
||||
index 7e06c75e6f..5fe1c6dd42 100644
|
||||
--- a/target/s390x/cpu_models_system.c
|
||||
+++ b/target/s390x/cpu_models_system.c
|
||||
@@ -59,6 +59,7 @@ static void create_cpu_model_list(ObjectClass *klass, void *opaque)
|
||||
CpuDefinitionInfo *info;
|
||||
char *name = g_strdup(object_class_get_name(klass));
|
||||
@ -322,6 +343,3 @@ index 72572726b8..707d546ca1 100644
|
||||
/* check for unavailable features */
|
||||
if (cpu_list_data->model) {
|
||||
Object *obj;
|
||||
--
|
||||
2.39.3
|
||||
|
||||
@ -1,7 +1,7 @@
|
||||
From a7d5687a80eca95a1c39b73bebb9d478f3adfb0c Mon Sep 17 00:00:00 2001
|
||||
From f730e8ae9b16a6fd9c2a77965228706a9bd61cb3 Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Daniel=20P=2E=20Berrang=C3=A9?= <berrange@redhat.com>
|
||||
Date: Wed, 3 Jul 2024 13:44:41 +0100
|
||||
Subject: Add downstream x86_64 versioned 'pc' & 'q35' machine types
|
||||
Subject: [PATCH] Add downstream x86_64 versioned 'pc' & 'q35' machine types
|
||||
|
||||
Adding changes to add RHEL machine types for x86_64 architecture.
|
||||
|
||||
@ -77,22 +77,22 @@ Merged patches (9.1.0 rc2):
|
||||
- 0b6825631a i386/sev: Don't allow automatic fallback to legacy KVM_SEV*_INIT (partial)
|
||||
---
|
||||
hw/i386/fw_cfg.c | 2 +-
|
||||
hw/i386/pc.c | 167 +++++++++++++++++++++++++++++-
|
||||
hw/i386/pc_piix.c | 105 ++++++++++++++++++-
|
||||
hw/i386/pc_q35.c | 207 +++++++++++++++++++++++++++++++++++--
|
||||
hw/i386/pc.c | 175 ++++++++++++++++++++++++++-
|
||||
hw/i386/pc_piix.c | 120 ++++++++++++++++++-
|
||||
hw/i386/pc_q35.c | 237 +++++++++++++++++++++++++++++++++++--
|
||||
include/hw/boards.h | 2 +
|
||||
include/hw/i386/pc.h | 36 +++++++
|
||||
include/hw/i386/pc.h | 39 ++++++
|
||||
target/i386/cpu.c | 21 ++++
|
||||
target/i386/kvm/kvm-cpu.c | 1 +
|
||||
target/i386/kvm/kvm.c | 4 +
|
||||
tests/qtest/pvpanic-test.c | 5 +-
|
||||
10 files changed, 537 insertions(+), 13 deletions(-)
|
||||
10 files changed, 589 insertions(+), 17 deletions(-)
|
||||
|
||||
diff --git a/hw/i386/fw_cfg.c b/hw/i386/fw_cfg.c
|
||||
index 33ef280420..a322709ffa 100644
|
||||
index 07df7281d2..8009f5f31f 100644
|
||||
--- a/hw/i386/fw_cfg.c
|
||||
+++ b/hw/i386/fw_cfg.c
|
||||
@@ -73,7 +73,7 @@ void fw_cfg_build_smbios(PCMachineState *pcms, FWCfgState *fw_cfg,
|
||||
@@ -75,7 +75,7 @@ void fw_cfg_build_smbios(PCMachineState *pcms, FWCfgState *fw_cfg,
|
||||
|
||||
if (pcmc->smbios_defaults) {
|
||||
/* These values are guest ABI, do not change */
|
||||
@ -102,10 +102,10 @@ index 33ef280420..a322709ffa 100644
|
||||
}
|
||||
|
||||
diff --git a/hw/i386/pc.c b/hw/i386/pc.c
|
||||
index 7779c88a91..fa0e42d072 100644
|
||||
index 2f58e73d33..1b351085c0 100644
|
||||
--- a/hw/i386/pc.c
|
||||
+++ b/hw/i386/pc.c
|
||||
@@ -276,6 +276,169 @@ const size_t pc_compat_2_4_len = G_N_ELEMENTS(pc_compat_2_4);
|
||||
@@ -273,6 +273,177 @@ const size_t pc_compat_2_6_len = G_N_ELEMENTS(pc_compat_2_6);
|
||||
*/
|
||||
#define PC_FW_DATA (0x20000 + 0x8000)
|
||||
|
||||
@ -131,6 +131,14 @@ index 7779c88a91..fa0e42d072 100644
|
||||
+};
|
||||
+const size_t pc_rhel_compat_len = G_N_ELEMENTS(pc_rhel_compat);
|
||||
+
|
||||
+GlobalProperty pc_rhel_9_6_compat[] = {
|
||||
+ /* pc_rhel_9_6_compat from pc_compat_9_0 */
|
||||
+ { TYPE_X86_CPU, "x-amd-topoext-features-only", "false" },
|
||||
+ { TYPE_X86_CPU, "x-l1-cache-per-thread", "false" },
|
||||
+ { TYPE_X86_CPU, "legacy-multi-node", "on" },
|
||||
+};
|
||||
+const size_t pc_rhel_9_6_compat_len = G_N_ELEMENTS(pc_rhel_9_6_compat);
|
||||
+
|
||||
+GlobalProperty pc_rhel_9_5_compat[] = {
|
||||
+ /* pc_rhel_9_5_compat from pc_compat_pc_9_0 (backported from 9.1) */
|
||||
+ { TYPE_X86_CPU, "guest-phys-bits", "0" },
|
||||
@ -275,7 +283,7 @@ index 7779c88a91..fa0e42d072 100644
|
||||
GSIState *pc_gsi_create(qemu_irq **irqs, bool pci_enabled)
|
||||
{
|
||||
GSIState *s;
|
||||
@@ -1767,6 +1930,7 @@ static void pc_machine_class_init(ObjectClass *oc, void *data)
|
||||
@@ -1754,6 +1925,7 @@ static void pc_machine_class_init(ObjectClass *oc, const void *data)
|
||||
pcmc->kvmclock_create_always = true;
|
||||
x86mc->apic_xrupt_override = true;
|
||||
assert(!mc->get_hotplug_handler);
|
||||
@ -283,7 +291,7 @@ index 7779c88a91..fa0e42d072 100644
|
||||
mc->get_hotplug_handler = pc_get_hotplug_handler;
|
||||
mc->hotplug_allowed = pc_hotplug_allowed;
|
||||
mc->auto_enable_numa_with_memhp = true;
|
||||
@@ -1774,7 +1938,8 @@ static void pc_machine_class_init(ObjectClass *oc, void *data)
|
||||
@@ -1761,7 +1933,8 @@ static void pc_machine_class_init(ObjectClass *oc, const void *data)
|
||||
mc->has_hotpluggable_cpus = true;
|
||||
mc->default_boot_order = "cad";
|
||||
mc->block_default_type = IF_IDE;
|
||||
@ -294,29 +302,34 @@ index 7779c88a91..fa0e42d072 100644
|
||||
mc->wakeup = pc_machine_wakeup;
|
||||
hc->pre_plug = pc_machine_device_pre_plug_cb;
|
||||
diff --git a/hw/i386/pc_piix.c b/hw/i386/pc_piix.c
|
||||
index 67107b174a..c93e78e896 100644
|
||||
index acf010e20f..d9fd4d207e 100644
|
||||
--- a/hw/i386/pc_piix.c
|
||||
+++ b/hw/i386/pc_piix.c
|
||||
@@ -52,6 +52,7 @@
|
||||
@@ -53,6 +53,7 @@
|
||||
#include "qapi/error.h"
|
||||
#include "qemu/error-report.h"
|
||||
#include "sysemu/xen.h"
|
||||
#include "system/xen.h"
|
||||
+#include "migration/migration.h"
|
||||
#ifdef CONFIG_XEN
|
||||
#include <xen/hvm/hvm_info_table.h>
|
||||
#include "hw/xen/xen_pt.h"
|
||||
@@ -445,8 +446,8 @@ static void pc_i440fx_init(MachineState *machine)
|
||||
@@ -469,11 +470,11 @@ static void pc_i440fx_init(MachineState *machine)
|
||||
pc_init1(machine, TYPE_I440FX_PCI_DEVICE);
|
||||
}
|
||||
|
||||
-#define DEFINE_I440FX_MACHINE(major, minor) \
|
||||
- DEFINE_PC_VER_MACHINE(pc_i440fx, "pc-i440fx", pc_i440fx_init, major, minor);
|
||||
- DEFINE_PC_VER_MACHINE(pc_i440fx, "pc-i440fx", pc_i440fx_init, false, NULL, major, minor);
|
||||
+#define DEFINE_I440FX_MACHINE(major, minor, micro) \
|
||||
+ DEFINE_PC_VER_MACHINE(pc_i440fx, "pc-i440fx", pc_i440fx_init, major, minor, micro);
|
||||
+ DEFINE_PC_VER_MACHINE(pc_i440fx, "pc-i440fx", pc_i440fx_init, false, NULL, major, minor, micro);
|
||||
|
||||
-#define DEFINE_I440FX_MACHINE_AS_LATEST(major, minor) \
|
||||
- DEFINE_PC_VER_MACHINE(pc_i440fx, "pc-i440fx", pc_i440fx_init, true, "pc", major, minor);
|
||||
+#define DEFINE_I440FX_MACHINE_AS_LATEST(major, minor, micro) \
|
||||
+ DEFINE_PC_VER_MACHINE(pc_i440fx, "pc-i440fx", pc_i440fx_init, true, "pc", major, minor, micro);
|
||||
|
||||
#if 0 /* Disabled for Red Hat Enterprise Linux */
|
||||
static void pc_i440fx_machine_options(MachineClass *m)
|
||||
@@ -826,3 +827,103 @@ static void xenfv_machine_3_1_options(MachineClass *m)
|
||||
@@ -853,3 +854,114 @@ static void xenfv_machine_3_1_options(MachineClass *m)
|
||||
DEFINE_PC_MACHINE(xenfv, "xenfv-3.1", pc_xen_hvm_init,
|
||||
xenfv_machine_3_1_options);
|
||||
#endif
|
||||
@ -365,6 +378,9 @@ index 67107b174a..c93e78e896 100644
|
||||
+ pcmc->broken_32bit_mem_addr_check = true;
|
||||
+ /* Introduced in QEMU 8.2 */
|
||||
+ pcmc->default_south_bridge = TYPE_PIIX3_DEVICE;
|
||||
+ /* From pc_i440fx_machine_9_0_options() */
|
||||
+ m->smbios_memory_device_size = 16 * GiB;
|
||||
+ pcmc->isa_bios_alias = false;
|
||||
+
|
||||
+ object_class_property_add_enum(oc, "x-south-bridge", "PCSouthBridgeOption",
|
||||
+ &PCSouthBridgeOption_lookup,
|
||||
@ -373,6 +389,10 @@ index 67107b174a..c93e78e896 100644
|
||||
+ object_class_property_set_description(oc, "x-south-bridge",
|
||||
+ "Use a different south bridge than PIIX3");
|
||||
+
|
||||
+ compat_props_add(m->compat_props, hw_compat_rhel_9_6,
|
||||
+ hw_compat_rhel_9_6_len);
|
||||
+ compat_props_add(m->compat_props, pc_rhel_9_6_compat,
|
||||
+ pc_rhel_9_6_compat_len);
|
||||
+ compat_props_add(m->compat_props, pc_rhel_9_5_compat,
|
||||
+ pc_rhel_9_5_compat_len);
|
||||
+ compat_props_add(m->compat_props, hw_compat_rhel_9_5,
|
||||
@ -417,14 +437,34 @@ index 67107b174a..c93e78e896 100644
|
||||
+ compat_props_add(m->compat_props, pc_rhel_8_0_compat, pc_rhel_8_0_compat_len);
|
||||
+ compat_props_add(m->compat_props, hw_compat_rhel_7_6, hw_compat_rhel_7_6_len);
|
||||
+ compat_props_add(m->compat_props, pc_rhel_7_6_compat, pc_rhel_7_6_compat_len);
|
||||
+ compat_props_add(m->compat_props, hw_compat_rhel_9, hw_compat_rhel_9_len);
|
||||
+
|
||||
+ compat_props_add(m->compat_props,
|
||||
+ pc_piix_compat_defaults, pc_piix_compat_defaults_len);
|
||||
+}
|
||||
+
|
||||
+DEFINE_I440FX_MACHINE(7, 6, 0);
|
||||
+DEFINE_I440FX_MACHINE_AS_LATEST(7, 6, 0);
|
||||
diff --git a/hw/i386/pc_q35.c b/hw/i386/pc_q35.c
|
||||
index 5fb283f2df..76f0ac1acd 100644
|
||||
index 2203ffd67e..3165d9bbfe 100644
|
||||
--- a/hw/i386/pc_q35.c
|
||||
+++ b/hw/i386/pc_q35.c
|
||||
@@ -338,20 +338,19 @@ static void pc_q35_machine_options(MachineClass *m)
|
||||
@@ -340,11 +340,11 @@ static void pc_q35_init(MachineState *machine)
|
||||
#endif
|
||||
}
|
||||
|
||||
-#define DEFINE_Q35_MACHINE(major, minor) \
|
||||
- DEFINE_PC_VER_MACHINE(pc_q35, "pc-q35", pc_q35_init, false, NULL, major, minor);
|
||||
+#define DEFINE_Q35_MACHINE(major, minor, micro) \
|
||||
+ DEFINE_PC_VER_MACHINE(pc_q35, "pc-q35", pc_q35_init, false, NULL, major, minor, micro);
|
||||
|
||||
-#define DEFINE_Q35_MACHINE_AS_LATEST(major, minor) \
|
||||
- DEFINE_PC_VER_MACHINE(pc_q35, "pc-q35", pc_q35_init, false, "q35", major, minor);
|
||||
+#define DEFINE_Q35_MACHINE_AS_LATEST(major, minor, micro) \
|
||||
+ DEFINE_PC_VER_MACHINE(pc_q35, "pc-q35", pc_q35_init, false, "q35", major, minor, micro);
|
||||
|
||||
#define DEFINE_Q35_MACHINE_BUGFIX(major, minor, micro) \
|
||||
DEFINE_PC_VER_MACHINE(pc_q35, "pc-q35", pc_q35_init, false, NULL, major, minor, micro);
|
||||
@@ -355,21 +355,21 @@ static void pc_q35_machine_options(MachineClass *m)
|
||||
pcmc->pci_root_uid = 0;
|
||||
pcmc->default_cpu_version = 1;
|
||||
|
||||
@ -438,42 +478,67 @@ index 5fb283f2df..76f0ac1acd 100644
|
||||
m->default_nic = "e1000e";
|
||||
- m->default_kernel_irqchip_split = false;
|
||||
m->no_floppy = 1;
|
||||
- m->max_cpus = 4096;
|
||||
m->max_cpus = 4096;
|
||||
- m->no_parallel = !module_object_class_by_name(TYPE_ISA_PARALLEL);
|
||||
+ m->max_cpus = 710;
|
||||
+ m->no_parallel = 1;
|
||||
+ m->alias = "q35";
|
||||
machine_class_allow_dynamic_sysbus_dev(m, TYPE_AMD_IOMMU_DEVICE);
|
||||
machine_class_allow_dynamic_sysbus_dev(m, TYPE_INTEL_IOMMU_DEVICE);
|
||||
machine_class_allow_dynamic_sysbus_dev(m, TYPE_RAMFB_DEVICE);
|
||||
- machine_class_allow_dynamic_sysbus_dev(m, TYPE_VMBUS_BRIDGE);
|
||||
+ m->alias = "q35";
|
||||
machine_class_allow_dynamic_sysbus_dev(m, TYPE_VMBUS_BRIDGE);
|
||||
machine_class_allow_dynamic_sysbus_dev(m, TYPE_UEFI_VARS_X64);
|
||||
+ compat_props_add(m->compat_props, pc_rhel_compat, pc_rhel_compat_len);
|
||||
compat_props_add(m->compat_props,
|
||||
pc_q35_compat_defaults, pc_q35_compat_defaults_len);
|
||||
}
|
||||
@@ -670,3 +669,197 @@ static void pc_q35_machine_2_4_options(MachineClass *m)
|
||||
@@ -687,3 +687,222 @@ static void pc_q35_machine_2_6_options(MachineClass *m)
|
||||
|
||||
DEFINE_Q35_MACHINE(2, 4);
|
||||
DEFINE_Q35_MACHINE(2, 6);
|
||||
#endif /* Disabled for Red Hat Enterprise Linux */
|
||||
+
|
||||
+/* Red Hat Enterprise Linux machine types */
|
||||
+
|
||||
+static void pc_q35_rhel_machine_9_4_0_options(MachineClass *m)
|
||||
+static void pc_q35_rhel_machine_9_6_0_options(MachineClass *m)
|
||||
+{
|
||||
+ PCMachineClass *pcmc = PC_MACHINE_CLASS(m);
|
||||
+ pc_q35_machine_options(m);
|
||||
+ m->desc = "RHEL-9.6.0 PC (Q35 + ICH9, 2009)";
|
||||
+ pcmc->smbios_stream_product = "RHEL";
|
||||
+ pcmc->smbios_stream_version = "9.6.0";
|
||||
+
|
||||
+ /* NB: remember to move this line to the *latest* RHEL 9 machine */
|
||||
+ compat_props_add(m->compat_props, hw_compat_rhel_9, hw_compat_rhel_9_len);
|
||||
+}
|
||||
+
|
||||
+DEFINE_Q35_MACHINE_AS_LATEST(9, 6, 0);
|
||||
+
|
||||
+static void pc_q35_rhel_machine_9_4_0_options(MachineClass *m)
|
||||
+{
|
||||
+ PCMachineClass *pcmc = PC_MACHINE_CLASS(m);
|
||||
+ pc_q35_rhel_machine_9_6_0_options(m);
|
||||
+
|
||||
+ /* older RHEL machines continue to support 710 vcpus */
|
||||
+ m->max_cpus = 710;
|
||||
+ m->desc = "RHEL-9.4.0 PC (Q35 + ICH9, 2009)";
|
||||
+ m->alias = NULL;
|
||||
+ pcmc->smbios_stream_product = "RHEL";
|
||||
+ pcmc->smbios_stream_version = "9.4.0";
|
||||
+ pcmc->isa_bios_alias = false;
|
||||
+
|
||||
+ /* From pc_q35_machine_9_0_options() */
|
||||
+ pcmc->isa_bios_alias = false;
|
||||
+ m->smbios_memory_device_size = 16 * GiB;
|
||||
+
|
||||
+ compat_props_add(m->compat_props, hw_compat_rhel_9_6,
|
||||
+ hw_compat_rhel_9_6_len);
|
||||
+ compat_props_add(m->compat_props, pc_rhel_9_6_compat,
|
||||
+ pc_rhel_9_6_compat_len);
|
||||
+ compat_props_add(m->compat_props, pc_rhel_9_5_compat,
|
||||
+ pc_rhel_9_5_compat_len);
|
||||
+ compat_props_add(m->compat_props, hw_compat_rhel_9_5,
|
||||
+ hw_compat_rhel_9_5_len);
|
||||
+}
|
||||
+
|
||||
+DEFINE_Q35_MACHINE_BUGFIX(9, 4, 0);
|
||||
+DEFINE_Q35_MACHINE(9, 4, 0);
|
||||
+
|
||||
+static void pc_q35_rhel_machine_9_2_0_options(MachineClass *m)
|
||||
+{
|
||||
@ -501,7 +566,7 @@ index 5fb283f2df..76f0ac1acd 100644
|
||||
+ pc_rhel_9_2_compat_len);
|
||||
+}
|
||||
+
|
||||
+DEFINE_Q35_MACHINE_BUGFIX(9, 2, 0);
|
||||
+DEFINE_Q35_MACHINE(9, 2, 0);
|
||||
+
|
||||
+static void pc_q35_rhel_machine_9_0_0_options(MachineClass *m)
|
||||
+{
|
||||
@ -520,7 +585,7 @@ index 5fb283f2df..76f0ac1acd 100644
|
||||
+ pc_rhel_9_0_compat_len);
|
||||
+}
|
||||
+
|
||||
+DEFINE_Q35_MACHINE_BUGFIX(9, 0, 0);
|
||||
+DEFINE_Q35_MACHINE(9, 0, 0);
|
||||
+
|
||||
+static void pc_q35_rhel_machine_8_6_0_options(MachineClass *m)
|
||||
+{
|
||||
@ -535,7 +600,7 @@ index 5fb283f2df..76f0ac1acd 100644
|
||||
+ hw_compat_rhel_8_6_len);
|
||||
+}
|
||||
+
|
||||
+DEFINE_Q35_MACHINE_BUGFIX(8, 6, 0);
|
||||
+DEFINE_Q35_MACHINE(8, 6, 0);
|
||||
+
|
||||
+static void pc_q35_rhel_machine_8_5_0_options(MachineClass *m)
|
||||
+{
|
||||
@ -552,7 +617,7 @@ index 5fb283f2df..76f0ac1acd 100644
|
||||
+ m->smp_props.prefer_sockets = true;
|
||||
+}
|
||||
+
|
||||
+DEFINE_Q35_MACHINE_BUGFIX(8, 5, 0);
|
||||
+DEFINE_Q35_MACHINE(8, 5, 0);
|
||||
+
|
||||
+static void pc_q35_rhel_machine_8_4_0_options(MachineClass *m)
|
||||
+{
|
||||
@ -568,7 +633,7 @@ index 5fb283f2df..76f0ac1acd 100644
|
||||
+ pc_rhel_8_4_compat_len);
|
||||
+}
|
||||
+
|
||||
+DEFINE_Q35_MACHINE_BUGFIX(8, 4, 0);
|
||||
+DEFINE_Q35_MACHINE(8, 4, 0);
|
||||
+
|
||||
+static void pc_q35_rhel_machine_8_3_0_options(MachineClass *m)
|
||||
+{
|
||||
@ -588,7 +653,7 @@ index 5fb283f2df..76f0ac1acd 100644
|
||||
+ pcmc->pci_root_uid = 1;
|
||||
+}
|
||||
+
|
||||
+DEFINE_Q35_MACHINE_BUGFIX(8, 3, 0);
|
||||
+DEFINE_Q35_MACHINE(8, 3, 0);
|
||||
+
|
||||
+static void pc_q35_rhel_machine_8_2_0_options(MachineClass *m)
|
||||
+{
|
||||
@ -606,7 +671,7 @@ index 5fb283f2df..76f0ac1acd 100644
|
||||
+ pc_rhel_8_2_compat_len);
|
||||
+}
|
||||
+
|
||||
+DEFINE_Q35_MACHINE_BUGFIX(8, 2, 0);
|
||||
+DEFINE_Q35_MACHINE(8, 2, 0);
|
||||
+
|
||||
+static void pc_q35_rhel_machine_8_1_0_options(MachineClass *m)
|
||||
+{
|
||||
@ -620,7 +685,7 @@ index 5fb283f2df..76f0ac1acd 100644
|
||||
+ compat_props_add(m->compat_props, pc_rhel_8_1_compat, pc_rhel_8_1_compat_len);
|
||||
+}
|
||||
+
|
||||
+DEFINE_Q35_MACHINE_BUGFIX(8, 1, 0);
|
||||
+DEFINE_Q35_MACHINE(8, 1, 0);
|
||||
+
|
||||
+static void pc_q35_rhel_machine_8_0_0_options(MachineClass *m)
|
||||
+{
|
||||
@ -635,7 +700,7 @@ index 5fb283f2df..76f0ac1acd 100644
|
||||
+ compat_props_add(m->compat_props, pc_rhel_8_0_compat, pc_rhel_8_0_compat_len);
|
||||
+}
|
||||
+
|
||||
+DEFINE_Q35_MACHINE_BUGFIX(8, 0, 0);
|
||||
+DEFINE_Q35_MACHINE(8, 0, 0);
|
||||
+
|
||||
+static void pc_q35_rhel_machine_7_6_0_options(MachineClass *m)
|
||||
+{
|
||||
@ -647,13 +712,13 @@ index 5fb283f2df..76f0ac1acd 100644
|
||||
+ compat_props_add(m->compat_props, pc_rhel_7_6_compat, pc_rhel_7_6_compat_len);
|
||||
+}
|
||||
+
|
||||
+DEFINE_Q35_MACHINE_BUGFIX(7, 6, 0);
|
||||
+DEFINE_Q35_MACHINE(7, 6, 0);
|
||||
+
|
||||
diff --git a/include/hw/boards.h b/include/hw/boards.h
|
||||
index 32c4642f5a..85b43e3d0d 100644
|
||||
index 025f6899a7..ad077677f4 100644
|
||||
--- a/include/hw/boards.h
|
||||
+++ b/include/hw/boards.h
|
||||
@@ -289,6 +289,8 @@ struct MachineClass {
|
||||
@@ -308,6 +308,8 @@ struct MachineClass {
|
||||
strList *allowed_dynamic_sysbus_devices;
|
||||
bool auto_enable_numa_with_memhp;
|
||||
bool auto_enable_numa_with_memdev;
|
||||
@ -663,16 +728,19 @@ index 32c4642f5a..85b43e3d0d 100644
|
||||
bool smbus_no_migration_support;
|
||||
bool nvdimm_supported;
|
||||
diff --git a/include/hw/i386/pc.h b/include/hw/i386/pc.h
|
||||
index 8776a3c937..75c9271cdd 100644
|
||||
index 3b4ea24c20..75c797bb0e 100644
|
||||
--- a/include/hw/i386/pc.h
|
||||
+++ b/include/hw/i386/pc.h
|
||||
@@ -302,6 +302,42 @@ extern const size_t pc_compat_2_4_len;
|
||||
extern GlobalProperty pc_compat_2_3[];
|
||||
extern const size_t pc_compat_2_3_len;
|
||||
@@ -301,6 +301,45 @@ extern const size_t pc_compat_2_7_len;
|
||||
extern GlobalProperty pc_compat_2_6[];
|
||||
extern const size_t pc_compat_2_6_len;
|
||||
|
||||
+extern GlobalProperty pc_rhel_compat[];
|
||||
+extern const size_t pc_rhel_compat_len;
|
||||
+
|
||||
+extern GlobalProperty pc_rhel_9_6_compat[];
|
||||
+extern const size_t pc_rhel_9_6_compat_len;
|
||||
+
|
||||
+extern GlobalProperty pc_rhel_9_5_compat[];
|
||||
+extern const size_t pc_rhel_9_5_compat_len;
|
||||
+
|
||||
@ -707,13 +775,13 @@ index 8776a3c937..75c9271cdd 100644
|
||||
+extern const size_t pc_rhel_7_6_compat_len;
|
||||
+
|
||||
#define DEFINE_PC_MACHINE(suffix, namestr, initfn, optsfn) \
|
||||
static void pc_machine_##suffix##_class_init(ObjectClass *oc, void *data) \
|
||||
{ \
|
||||
static void pc_machine_##suffix##_class_init(ObjectClass *oc, \
|
||||
const void *data) \
|
||||
diff --git a/target/i386/cpu.c b/target/i386/cpu.c
|
||||
index 85ef7452c0..ed278dd4a1 100644
|
||||
index ac1c06c3f9..2c4ddd7c63 100644
|
||||
--- a/target/i386/cpu.c
|
||||
+++ b/target/i386/cpu.c
|
||||
@@ -2411,9 +2411,13 @@ static const CPUCaches epyc_genoa_cache_info = {
|
||||
@@ -3292,9 +3292,13 @@ static const CPUCaches yongfeng_cache_info = {
|
||||
* PT in VMX operation
|
||||
*/
|
||||
|
||||
@ -727,7 +795,7 @@ index 85ef7452c0..ed278dd4a1 100644
|
||||
.level = 0xd,
|
||||
.vendor = CPUID_VENDOR_AMD,
|
||||
.family = 15,
|
||||
@@ -2434,6 +2438,7 @@ static const X86CPUDefinition builtin_x86_defs[] = {
|
||||
@@ -3315,6 +3319,7 @@ static const X86CPUDefinition builtin_x86_defs[] = {
|
||||
},
|
||||
{
|
||||
.name = "phenom",
|
||||
@ -735,7 +803,7 @@ index 85ef7452c0..ed278dd4a1 100644
|
||||
.level = 5,
|
||||
.vendor = CPUID_VENDOR_AMD,
|
||||
.family = 16,
|
||||
@@ -2466,6 +2471,7 @@ static const X86CPUDefinition builtin_x86_defs[] = {
|
||||
@@ -3347,6 +3352,7 @@ static const X86CPUDefinition builtin_x86_defs[] = {
|
||||
},
|
||||
{
|
||||
.name = "core2duo",
|
||||
@ -743,7 +811,7 @@ index 85ef7452c0..ed278dd4a1 100644
|
||||
.level = 10,
|
||||
.vendor = CPUID_VENDOR_INTEL,
|
||||
.family = 6,
|
||||
@@ -2508,6 +2514,7 @@ static const X86CPUDefinition builtin_x86_defs[] = {
|
||||
@@ -3389,6 +3395,7 @@ static const X86CPUDefinition builtin_x86_defs[] = {
|
||||
},
|
||||
{
|
||||
.name = "kvm64",
|
||||
@ -751,7 +819,7 @@ index 85ef7452c0..ed278dd4a1 100644
|
||||
.level = 0xd,
|
||||
.vendor = CPUID_VENDOR_INTEL,
|
||||
.family = 15,
|
||||
@@ -2549,6 +2556,7 @@ static const X86CPUDefinition builtin_x86_defs[] = {
|
||||
@@ -3430,6 +3437,7 @@ static const X86CPUDefinition builtin_x86_defs[] = {
|
||||
},
|
||||
{
|
||||
.name = "qemu32",
|
||||
@ -759,7 +827,7 @@ index 85ef7452c0..ed278dd4a1 100644
|
||||
.level = 4,
|
||||
.vendor = CPUID_VENDOR_INTEL,
|
||||
.family = 6,
|
||||
@@ -2563,6 +2571,7 @@ static const X86CPUDefinition builtin_x86_defs[] = {
|
||||
@@ -3444,6 +3452,7 @@ static const X86CPUDefinition builtin_x86_defs[] = {
|
||||
},
|
||||
{
|
||||
.name = "kvm32",
|
||||
@ -767,7 +835,7 @@ index 85ef7452c0..ed278dd4a1 100644
|
||||
.level = 5,
|
||||
.vendor = CPUID_VENDOR_INTEL,
|
||||
.family = 15,
|
||||
@@ -2593,6 +2602,7 @@ static const X86CPUDefinition builtin_x86_defs[] = {
|
||||
@@ -3474,6 +3483,7 @@ static const X86CPUDefinition builtin_x86_defs[] = {
|
||||
},
|
||||
{
|
||||
.name = "coreduo",
|
||||
@ -775,7 +843,7 @@ index 85ef7452c0..ed278dd4a1 100644
|
||||
.level = 10,
|
||||
.vendor = CPUID_VENDOR_INTEL,
|
||||
.family = 6,
|
||||
@@ -2626,6 +2636,7 @@ static const X86CPUDefinition builtin_x86_defs[] = {
|
||||
@@ -3507,6 +3517,7 @@ static const X86CPUDefinition builtin_x86_defs[] = {
|
||||
},
|
||||
{
|
||||
.name = "486",
|
||||
@ -783,7 +851,7 @@ index 85ef7452c0..ed278dd4a1 100644
|
||||
.level = 1,
|
||||
.vendor = CPUID_VENDOR_INTEL,
|
||||
.family = 4,
|
||||
@@ -2638,6 +2649,7 @@ static const X86CPUDefinition builtin_x86_defs[] = {
|
||||
@@ -3520,6 +3531,7 @@ static const X86CPUDefinition builtin_x86_defs[] = {
|
||||
},
|
||||
{
|
||||
.name = "pentium",
|
||||
@ -791,7 +859,7 @@ index 85ef7452c0..ed278dd4a1 100644
|
||||
.level = 1,
|
||||
.vendor = CPUID_VENDOR_INTEL,
|
||||
.family = 5,
|
||||
@@ -2650,6 +2662,7 @@ static const X86CPUDefinition builtin_x86_defs[] = {
|
||||
@@ -3533,6 +3545,7 @@ static const X86CPUDefinition builtin_x86_defs[] = {
|
||||
},
|
||||
{
|
||||
.name = "pentium2",
|
||||
@ -799,7 +867,7 @@ index 85ef7452c0..ed278dd4a1 100644
|
||||
.level = 2,
|
||||
.vendor = CPUID_VENDOR_INTEL,
|
||||
.family = 6,
|
||||
@@ -2662,6 +2675,7 @@ static const X86CPUDefinition builtin_x86_defs[] = {
|
||||
@@ -3546,6 +3559,7 @@ static const X86CPUDefinition builtin_x86_defs[] = {
|
||||
},
|
||||
{
|
||||
.name = "pentium3",
|
||||
@ -807,7 +875,7 @@ index 85ef7452c0..ed278dd4a1 100644
|
||||
.level = 3,
|
||||
.vendor = CPUID_VENDOR_INTEL,
|
||||
.family = 6,
|
||||
@@ -2674,6 +2688,7 @@ static const X86CPUDefinition builtin_x86_defs[] = {
|
||||
@@ -3559,6 +3573,7 @@ static const X86CPUDefinition builtin_x86_defs[] = {
|
||||
},
|
||||
{
|
||||
.name = "athlon",
|
||||
@ -815,7 +883,7 @@ index 85ef7452c0..ed278dd4a1 100644
|
||||
.level = 2,
|
||||
.vendor = CPUID_VENDOR_AMD,
|
||||
.family = 6,
|
||||
@@ -2689,6 +2704,7 @@ static const X86CPUDefinition builtin_x86_defs[] = {
|
||||
@@ -3574,6 +3589,7 @@ static const X86CPUDefinition builtin_x86_defs[] = {
|
||||
},
|
||||
{
|
||||
.name = "n270",
|
||||
@ -823,7 +891,7 @@ index 85ef7452c0..ed278dd4a1 100644
|
||||
.level = 10,
|
||||
.vendor = CPUID_VENDOR_INTEL,
|
||||
.family = 6,
|
||||
@@ -2714,6 +2730,7 @@ static const X86CPUDefinition builtin_x86_defs[] = {
|
||||
@@ -3599,6 +3615,7 @@ static const X86CPUDefinition builtin_x86_defs[] = {
|
||||
},
|
||||
{
|
||||
.name = "Conroe",
|
||||
@ -831,7 +899,7 @@ index 85ef7452c0..ed278dd4a1 100644
|
||||
.level = 10,
|
||||
.vendor = CPUID_VENDOR_INTEL,
|
||||
.family = 6,
|
||||
@@ -2754,6 +2771,7 @@ static const X86CPUDefinition builtin_x86_defs[] = {
|
||||
@@ -3639,6 +3656,7 @@ static const X86CPUDefinition builtin_x86_defs[] = {
|
||||
},
|
||||
{
|
||||
.name = "Penryn",
|
||||
@ -839,7 +907,7 @@ index 85ef7452c0..ed278dd4a1 100644
|
||||
.level = 10,
|
||||
.vendor = CPUID_VENDOR_INTEL,
|
||||
.family = 6,
|
||||
@@ -4762,6 +4780,7 @@ static const X86CPUDefinition builtin_x86_defs[] = {
|
||||
@@ -5846,6 +5864,7 @@ static const X86CPUDefinition builtin_x86_defs[] = {
|
||||
},
|
||||
{
|
||||
.name = "Opteron_G1",
|
||||
@ -847,7 +915,7 @@ index 85ef7452c0..ed278dd4a1 100644
|
||||
.level = 5,
|
||||
.vendor = CPUID_VENDOR_AMD,
|
||||
.family = 15,
|
||||
@@ -4782,6 +4801,7 @@ static const X86CPUDefinition builtin_x86_defs[] = {
|
||||
@@ -5866,6 +5885,7 @@ static const X86CPUDefinition builtin_x86_defs[] = {
|
||||
},
|
||||
{
|
||||
.name = "Opteron_G2",
|
||||
@ -855,7 +923,7 @@ index 85ef7452c0..ed278dd4a1 100644
|
||||
.level = 5,
|
||||
.vendor = CPUID_VENDOR_AMD,
|
||||
.family = 15,
|
||||
@@ -4804,6 +4824,7 @@ static const X86CPUDefinition builtin_x86_defs[] = {
|
||||
@@ -5888,6 +5908,7 @@ static const X86CPUDefinition builtin_x86_defs[] = {
|
||||
},
|
||||
{
|
||||
.name = "Opteron_G3",
|
||||
@ -864,10 +932,10 @@ index 85ef7452c0..ed278dd4a1 100644
|
||||
.vendor = CPUID_VENDOR_AMD,
|
||||
.family = 16,
|
||||
diff --git a/target/i386/kvm/kvm-cpu.c b/target/i386/kvm/kvm-cpu.c
|
||||
index 6bf8dcfc60..684e731cbc 100644
|
||||
index 89a7953659..74c0b036e3 100644
|
||||
--- a/target/i386/kvm/kvm-cpu.c
|
||||
+++ b/target/i386/kvm/kvm-cpu.c
|
||||
@@ -178,6 +178,7 @@ static PropValue kvm_default_props[] = {
|
||||
@@ -175,6 +175,7 @@ static PropValue kvm_default_props[] = {
|
||||
{ "acpi", "off" },
|
||||
{ "monitor", "off" },
|
||||
{ "svm", "off" },
|
||||
@ -876,10 +944,10 @@ index 6bf8dcfc60..684e731cbc 100644
|
||||
};
|
||||
|
||||
diff --git a/target/i386/kvm/kvm.c b/target/i386/kvm/kvm.c
|
||||
index 2fa88ef1e3..2b28c18693 100644
|
||||
index 369626f8c8..0eb39d22d6 100644
|
||||
--- a/target/i386/kvm/kvm.c
|
||||
+++ b/target/i386/kvm/kvm.c
|
||||
@@ -4244,6 +4244,7 @@ static int kvm_get_msrs(X86CPU *cpu)
|
||||
@@ -4389,6 +4389,7 @@ static int kvm_get_msrs(X86CPU *cpu)
|
||||
struct kvm_msr_entry *msrs = cpu->kvm_msr_buf->entries;
|
||||
int ret, i;
|
||||
uint64_t mtrr_top_bits;
|
||||
@ -887,7 +955,7 @@ index 2fa88ef1e3..2b28c18693 100644
|
||||
|
||||
kvm_msr_buf_reset(cpu);
|
||||
|
||||
@@ -4636,6 +4637,9 @@ static int kvm_get_msrs(X86CPU *cpu)
|
||||
@@ -4786,6 +4787,9 @@ static int kvm_get_msrs(X86CPU *cpu)
|
||||
break;
|
||||
case MSR_KVM_ASYNC_PF_EN:
|
||||
env->async_pf_en_msr = msrs[i].data;
|
||||
@ -898,7 +966,7 @@ index 2fa88ef1e3..2b28c18693 100644
|
||||
case MSR_KVM_ASYNC_PF_INT:
|
||||
env->async_pf_int_msr = msrs[i].data;
|
||||
diff --git a/tests/qtest/pvpanic-test.c b/tests/qtest/pvpanic-test.c
|
||||
index d49d2ba931..c18f63e255 100644
|
||||
index 5606baf47b..094c56b0cd 100644
|
||||
--- a/tests/qtest/pvpanic-test.c
|
||||
+++ b/tests/qtest/pvpanic-test.c
|
||||
@@ -18,7 +18,7 @@ static void test_panic_nopause(void)
|
||||
@ -920,6 +988,3 @@ index d49d2ba931..c18f63e255 100644
|
||||
|
||||
val = qtest_inb(qts, 0x505);
|
||||
g_assert_cmpuint(val, ==, PVPANIC_EVENTS);
|
||||
--
|
||||
2.39.3
|
||||
|
||||
@ -1,7 +1,7 @@
|
||||
From 2698c3de00b8736553112a037c7ffb5f5d9086b1 Mon Sep 17 00:00:00 2001
|
||||
From b96d91774d7358316cff003d0891c1cbc3857a3d Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Daniel=20P=2E=20Berrang=C3=A9?= <berrange@redhat.com>
|
||||
Date: Wed, 3 Jul 2024 13:47:04 +0100
|
||||
Subject: Revert "meson: temporarily disable -Wunused-function"
|
||||
Subject: [PATCH] Revert "meson: temporarily disable -Wunused-function"
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
@ -16,10 +16,10 @@ Signed-off-by: Daniel P. Berrangé <berrange@redhat.com>
|
||||
1 file changed, 1 deletion(-)
|
||||
|
||||
diff --git a/meson.build b/meson.build
|
||||
index 2de5ab024f..b3529aa0e1 100644
|
||||
index 23494666d9..ef2e5be6e2 100644
|
||||
--- a/meson.build
|
||||
+++ b/meson.build
|
||||
@@ -651,7 +651,6 @@ warn_flags = [
|
||||
@@ -757,7 +757,6 @@ warn_flags = [
|
||||
'-Wno-string-plus-int',
|
||||
'-Wno-tautological-type-limit-compare',
|
||||
'-Wno-typedef-redefinition',
|
||||
@ -27,6 +27,3 @@ index 2de5ab024f..b3529aa0e1 100644
|
||||
]
|
||||
|
||||
if host_os != 'darwin'
|
||||
--
|
||||
2.39.3
|
||||
|
||||
@ -1,121 +1,78 @@
|
||||
From b877c7926d84e264bcfa57e6797f997d400fb19d Mon Sep 17 00:00:00 2001
|
||||
From b442024a21912abc44edf9d305f1bdce863c6a3a Mon Sep 17 00:00:00 2001
|
||||
From: Miroslav Rezanina <mrezanin@redhat.com>
|
||||
Date: Wed, 2 Sep 2020 09:39:41 +0200
|
||||
Subject: Enable make check
|
||||
Subject: [PATCH] Enable make check
|
||||
|
||||
Fixing tests after device disabling and machine types changes and enabling
|
||||
make check run during build.
|
||||
|
||||
Signed-off-by: Miroslav Rezanina <mrezanin@redhat.com>
|
||||
|
||||
fix test
|
||||
---
|
||||
Rebase changes (6.1.0):
|
||||
- removed unnecessary test changes
|
||||
tests/functional/meson.build | 2 +-
|
||||
tests/functional/test_aarch64_tcg_plugins.py | 2 +-
|
||||
.../functional/test_x86_cpu_model_versions.py | 3 +-
|
||||
tests/qemu-iotests/meson.build | 34 +++++++++----------
|
||||
tests/qemu-iotests/testenv.py | 3 ++
|
||||
tests/qtest/arm-cpu-features.c | 2 ++
|
||||
tests/qtest/fuzz-e1000e-test.c | 2 +-
|
||||
tests/qtest/fuzz-virtio-scsi-test.c | 2 +-
|
||||
tests/qtest/intel-hda-test.c | 2 +-
|
||||
tests/qtest/libqos/meson.build | 2 +-
|
||||
tests/qtest/lpc-ich9-test.c | 2 +-
|
||||
tests/qtest/meson.build | 2 --
|
||||
tests/qtest/pvpanic-test.c | 2 +-
|
||||
tests/qtest/virtio-net-failover.c | 1 +
|
||||
14 files changed, 33 insertions(+), 28 deletions(-)
|
||||
|
||||
Rebase changes (6.2.0):
|
||||
- new way of disabling bios-table-test
|
||||
|
||||
Rebase changes (7.0.0):
|
||||
- Disable testing virtio-iommu-pci
|
||||
- Rename default_bus_bypass_iommu property to default-bus-bypass-iommu
|
||||
- Disable qtest-bios-table for aarch64
|
||||
- Removed redhat chunks for boot-serial-test.c, cdrom-test.c and cpu-plug-test.c qtests
|
||||
- Do not disable boot-order-test, prom-env-test and boot-serial-test qtests
|
||||
- Use rhel machine type for new intel hda qtest
|
||||
- Remove unnecessary changes in iotest 051
|
||||
- Remove changes in bios-tables-test.c and prom-env-test.c qtests
|
||||
|
||||
Rebase changes (7.1.0):
|
||||
- Disable bcm2835-dma-test (added upstream)
|
||||
|
||||
Rebase changes (8.0.0):
|
||||
- Removed chunks for disabling bios-table-test (protected upstream)
|
||||
- Disable new qemu-iotests execution
|
||||
- Revert change in tco qtest (blocking test run)
|
||||
|
||||
Rebase changes (8.1.0):
|
||||
- Do not disable device-plug-test for s390x
|
||||
|
||||
Rebase changes (8.2.0 rc1):
|
||||
- Remove unneeded hack in qtest/usb-hcd-xhci-test.c
|
||||
|
||||
Rebase changes (9.1.0 rc0):
|
||||
- use q35 for new pvpanic test
|
||||
|
||||
Merged patches (6.1.0):
|
||||
- 2f129df7d3 redhat: Enable the 'test-block-iothread' test again
|
||||
|
||||
Merged patches (7.1.0):
|
||||
- 64d736640e RHEL-only: tests/avocado: Switch aarch64 tests from a53 to a57
|
||||
|
||||
Merged patches (8.1.0):
|
||||
- f468163234 iotests: Use alternative CPU type that is not deprecated in RHEL
|
||||
---
|
||||
.distro/Makefile | 2 +-
|
||||
.distro/qemu-kvm.spec.template | 4 ++--
|
||||
.distro/scripts/process-patches.sh | 3 +++
|
||||
tests/avocado/replay_kernel.py | 2 +-
|
||||
tests/avocado/reverse_debugging.py | 2 +-
|
||||
tests/avocado/tcg_plugins.py | 4 ++--
|
||||
tests/qemu-iotests/meson.build | 34 ++++++++++++++---------------
|
||||
tests/qemu-iotests/testenv.py | 3 +++
|
||||
tests/qtest/fuzz-e1000e-test.c | 2 +-
|
||||
tests/qtest/fuzz-virtio-scsi-test.c | 2 +-
|
||||
tests/qtest/intel-hda-test.c | 2 +-
|
||||
tests/qtest/libqos/meson.build | 2 +-
|
||||
tests/qtest/lpc-ich9-test.c | 2 +-
|
||||
tests/qtest/meson.build | 1 -
|
||||
tests/qtest/pvpanic-test.c | 2 +-
|
||||
tests/qtest/virtio-net-failover.c | 1 +
|
||||
16 files changed, 37 insertions(+), 31 deletions(-)
|
||||
|
||||
diff --git a/tests/avocado/replay_kernel.py b/tests/avocado/replay_kernel.py
|
||||
index e22c200a36..cb7ca19b1b 100644
|
||||
--- a/tests/avocado/replay_kernel.py
|
||||
+++ b/tests/avocado/replay_kernel.py
|
||||
@@ -193,7 +193,7 @@ def test_aarch64_virt(self):
|
||||
"""
|
||||
:avocado: tags=arch:aarch64
|
||||
:avocado: tags=machine:virt
|
||||
- :avocado: tags=cpu:cortex-a53
|
||||
+ :avocado: tags=cpu:cortex-a57
|
||||
"""
|
||||
kernel_url = ('https://archives.fedoraproject.org/pub/archive/fedora'
|
||||
'/linux/releases/29/Everything/aarch64/os/images/pxeboot'
|
||||
diff --git a/tests/avocado/reverse_debugging.py b/tests/avocado/reverse_debugging.py
|
||||
index f24287cd0a..3880b81df6 100644
|
||||
--- a/tests/avocado/reverse_debugging.py
|
||||
+++ b/tests/avocado/reverse_debugging.py
|
||||
@@ -228,7 +228,7 @@ def test_aarch64_virt(self):
|
||||
"""
|
||||
:avocado: tags=arch:aarch64
|
||||
:avocado: tags=machine:virt
|
||||
- :avocado: tags=cpu:cortex-a53
|
||||
+ :avocado: tags=cpu:cortex-a57
|
||||
"""
|
||||
kernel_url = ('https://archives.fedoraproject.org/pub/archive/fedora'
|
||||
'/linux/releases/29/Everything/aarch64/os/images/pxeboot'
|
||||
diff --git a/tests/avocado/tcg_plugins.py b/tests/avocado/tcg_plugins.py
|
||||
index a6ff457e27..5172ee9b9e 100644
|
||||
--- a/tests/avocado/tcg_plugins.py
|
||||
+++ b/tests/avocado/tcg_plugins.py
|
||||
@@ -66,7 +66,7 @@ def test_aarch64_virt_insn(self):
|
||||
:avocado: tags=accel:tcg
|
||||
:avocado: tags=arch:aarch64
|
||||
:avocado: tags=machine:virt
|
||||
- :avocado: tags=cpu:cortex-a53
|
||||
+ :avocado: tags=cpu:cortex-a57
|
||||
"""
|
||||
kernel_path = self._grab_aarch64_kernel()
|
||||
diff --git a/tests/functional/meson.build b/tests/functional/meson.build
|
||||
index 311c6f1806..c7f9051c90 100644
|
||||
--- a/tests/functional/meson.build
|
||||
+++ b/tests/functional/meson.build
|
||||
@@ -319,7 +319,7 @@ tests_sparc64_system_thorough = [
|
||||
|
||||
tests_x86_64_system_quick = [
|
||||
'cpu_queries',
|
||||
- 'mem_addr_space',
|
||||
+# 'mem_addr_space',
|
||||
'migration',
|
||||
'pc_cpu_hotplug_props',
|
||||
'virtio_version',
|
||||
diff --git a/tests/functional/test_aarch64_tcg_plugins.py b/tests/functional/test_aarch64_tcg_plugins.py
|
||||
index cb7e9298fb..a5560cedb9 100755
|
||||
--- a/tests/functional/test_aarch64_tcg_plugins.py
|
||||
+++ b/tests/functional/test_aarch64_tcg_plugins.py
|
||||
@@ -64,7 +64,7 @@ class PluginKernelNormal(PluginKernelBase):
|
||||
|
||||
def test_aarch64_virt_insn(self):
|
||||
self.set_machine('virt')
|
||||
- self.cpu='cortex-a53'
|
||||
+ self.cpu='cortex-a57'
|
||||
kernel_path = self.ASSET_KERNEL.fetch()
|
||||
kernel_command_line = (self.KERNEL_COMMON_COMMAND_LINE +
|
||||
@@ -96,7 +96,7 @@ def test_aarch64_virt_insn_icount(self):
|
||||
:avocado: tags=accel:tcg
|
||||
:avocado: tags=arch:aarch64
|
||||
:avocado: tags=machine:virt
|
||||
- :avocado: tags=cpu:cortex-a53
|
||||
+ :avocado: tags=cpu:cortex-a57
|
||||
'console=ttyAMA0')
|
||||
diff --git a/tests/functional/test_x86_cpu_model_versions.py b/tests/functional/test_x86_cpu_model_versions.py
|
||||
index 36c968f1c0..01213d9c14 100755
|
||||
--- a/tests/functional/test_x86_cpu_model_versions.py
|
||||
+++ b/tests/functional/test_x86_cpu_model_versions.py
|
||||
@@ -23,7 +23,7 @@
|
||||
|
||||
import re
|
||||
|
||||
-from qemu_test import QemuSystemTest
|
||||
+from qemu_test import QemuSystemTest, skipFlakyTest
|
||||
|
||||
class X86CPUModelAliases(QemuSystemTest):
|
||||
"""
|
||||
@@ -72,6 +72,7 @@ def validate_variant_aliases(self, cpus):
|
||||
self.assertNotIn("EPYC-IBPB-v1", cpus,
|
||||
"EPYC-IBPB shouldn't be versioned")
|
||||
|
||||
+ @skipFlakyTest("Incompatible with RHEL 7.6.0 machine")
|
||||
def test_unversioned_alias(self):
|
||||
"""
|
||||
kernel_path = self._grab_aarch64_kernel()
|
||||
kernel_command_line = (self.KERNEL_COMMON_COMMAND_LINE +
|
||||
Check if unversioned CPU model is an alias pointing to right version
|
||||
diff --git a/tests/qemu-iotests/meson.build b/tests/qemu-iotests/meson.build
|
||||
index fad340ad59..3c0d5241f6 100644
|
||||
--- a/tests/qemu-iotests/meson.build
|
||||
@ -160,10 +117,10 @@ index fad340ad59..3c0d5241f6 100644
|
||||
+# endforeach
|
||||
endforeach
|
||||
diff --git a/tests/qemu-iotests/testenv.py b/tests/qemu-iotests/testenv.py
|
||||
index c8848f2ec2..d515e5b8b0 100644
|
||||
index 6326e46b7b..bc849ae9cf 100644
|
||||
--- a/tests/qemu-iotests/testenv.py
|
||||
+++ b/tests/qemu-iotests/testenv.py
|
||||
@@ -249,6 +249,9 @@ def __init__(self, source_dir: str, build_dir: str,
|
||||
@@ -252,6 +252,9 @@ def __init__(self, source_dir: str, build_dir: str,
|
||||
if self.qemu_prog.endswith(f'qemu-system-{suffix}'):
|
||||
self.qemu_options += f' -machine {machine}'
|
||||
|
||||
@ -173,6 +130,26 @@ index c8848f2ec2..d515e5b8b0 100644
|
||||
# QEMU_DEFAULT_MACHINE
|
||||
self.qemu_default_machine = get_default_machine(self.qemu_prog)
|
||||
|
||||
diff --git a/tests/qtest/arm-cpu-features.c b/tests/qtest/arm-cpu-features.c
|
||||
index 2d3304bb4a..ddb9fd1a4b 100644
|
||||
--- a/tests/qtest/arm-cpu-features.c
|
||||
+++ b/tests/qtest/arm-cpu-features.c
|
||||
@@ -416,6 +416,7 @@ static void sve_tests_sve_off_kvm(const void *data)
|
||||
|
||||
static void pauth_tests_default(QTestState *qts, const char *cpu_type)
|
||||
{
|
||||
+#if 0 /* Disabled for Red Hat Enterprise Linux */
|
||||
assert_has_feature_enabled(qts, cpu_type, "pauth");
|
||||
assert_has_feature_disabled(qts, cpu_type, "pauth-impdef");
|
||||
assert_has_feature_disabled(qts, cpu_type, "pauth-qarma3");
|
||||
@@ -428,6 +429,7 @@ static void pauth_tests_default(QTestState *qts, const char *cpu_type)
|
||||
assert_set_feature(qts, cpu_type, "pauth-qarma3", false);
|
||||
assert_set_feature(qts, cpu_type, "pauth-qarma5", true);
|
||||
assert_set_feature(qts, cpu_type, "pauth-qarma5", false);
|
||||
+#endif /* disabled for RHEL */
|
||||
assert_error(qts, cpu_type,
|
||||
"cannot enable pauth-impdef, pauth-qarma3 or pauth-qarma5 without pauth",
|
||||
"{ 'pauth': false, 'pauth-impdef': true }");
|
||||
diff --git a/tests/qtest/fuzz-e1000e-test.c b/tests/qtest/fuzz-e1000e-test.c
|
||||
index 5052883fb6..b5286f4b12 100644
|
||||
--- a/tests/qtest/fuzz-e1000e-test.c
|
||||
@ -213,10 +190,10 @@ index 663bb6c485..2efc43e3f7 100644
|
||||
"-device intel-hda,id=" HDA_ID CODEC_DEVICES);
|
||||
|
||||
diff --git a/tests/qtest/libqos/meson.build b/tests/qtest/libqos/meson.build
|
||||
index 1b2b2dbb22..86afbddb58 100644
|
||||
index 1ddaf7b095..1cb403e90d 100644
|
||||
--- a/tests/qtest/libqos/meson.build
|
||||
+++ b/tests/qtest/libqos/meson.build
|
||||
@@ -44,7 +44,7 @@ libqos_srcs = files(
|
||||
@@ -43,7 +43,7 @@ libqos_srcs = files(
|
||||
'virtio-rng.c',
|
||||
'virtio-scsi.c',
|
||||
'virtio-serial.c',
|
||||
@ -239,19 +216,23 @@ index 8ac95b89f7..cd2102555c 100644
|
||||
|
||||
qtest_outl(s, 0xcf8, 0x8000f840); /* PMBASE */
|
||||
diff --git a/tests/qtest/meson.build b/tests/qtest/meson.build
|
||||
index 2f0d3ef080..44ee791508 100644
|
||||
index 669d07c06b..b6b1e920bc 100644
|
||||
--- a/tests/qtest/meson.build
|
||||
+++ b/tests/qtest/meson.build
|
||||
@@ -102,7 +102,6 @@ qtests_i386 = \
|
||||
'drive_del-test',
|
||||
'tco-test',
|
||||
'cpu-plug-test',
|
||||
- 'q35-test',
|
||||
'vmgenid-test',
|
||||
'migration-test',
|
||||
'test-x86-cpuid-compat',
|
||||
@@ -90,11 +90,9 @@ qtests_i386 = \
|
||||
(config_all_devices.has_key('CONFIG_LSI_SCSI_PCI') ? ['fuzz-lsi53c895a-test'] : []) + \
|
||||
(config_all_devices.has_key('CONFIG_VIRTIO_SCSI') ? ['fuzz-virtio-scsi-test'] : []) + \
|
||||
(config_all_devices.has_key('CONFIG_VIRTIO_BALLOON') ? ['virtio-balloon-test'] : []) + \
|
||||
- (config_all_devices.has_key('CONFIG_Q35') ? ['q35-test'] : []) + \
|
||||
(config_all_devices.has_key('CONFIG_SB16') ? ['fuzz-sb16-test'] : []) + \
|
||||
(config_all_devices.has_key('CONFIG_SDHCI_PCI') ? ['fuzz-sdcard-test'] : []) + \
|
||||
(config_all_devices.has_key('CONFIG_ESP_PCI') ? ['am53c974-test'] : []) + \
|
||||
- (config_all_devices.has_key('CONFIG_VTD') ? ['intel-iommu-test'] : []) + \
|
||||
(host_os != 'windows' and \
|
||||
config_all_devices.has_key('CONFIG_ACPI_ERST') ? ['erst-test'] : []) + \
|
||||
(config_all_devices.has_key('CONFIG_PCIE_PORT') and \
|
||||
diff --git a/tests/qtest/pvpanic-test.c b/tests/qtest/pvpanic-test.c
|
||||
index c18f63e255..57fb129ae4 100644
|
||||
index 094c56b0cd..338f94dcd9 100644
|
||||
--- a/tests/qtest/pvpanic-test.c
|
||||
+++ b/tests/qtest/pvpanic-test.c
|
||||
@@ -65,7 +65,7 @@ static void test_pvshutdown(void)
|
||||
@ -264,10 +245,10 @@ index c18f63e255..57fb129ae4 100644
|
||||
val = qtest_inb(qts, 0x505);
|
||||
g_assert_cmpuint(val, ==, PVPANIC_EVENTS);
|
||||
diff --git a/tests/qtest/virtio-net-failover.c b/tests/qtest/virtio-net-failover.c
|
||||
index 73dfabc272..a9dd304781 100644
|
||||
index 5baf81c3e6..aa87bf5698 100644
|
||||
--- a/tests/qtest/virtio-net-failover.c
|
||||
+++ b/tests/qtest/virtio-net-failover.c
|
||||
@@ -26,6 +26,7 @@
|
||||
@@ -27,6 +27,7 @@
|
||||
#define PCI_SEL_BASE 0x0010
|
||||
|
||||
#define BASE_MACHINE "-M q35 -nodefaults " \
|
||||
@ -275,6 +256,3 @@ index 73dfabc272..a9dd304781 100644
|
||||
"-device pcie-root-port,id=root0,addr=0x1,bus=pcie.0,chassis=1 " \
|
||||
"-device pcie-root-port,id=root1,addr=0x2,bus=pcie.0,chassis=2 "
|
||||
|
||||
--
|
||||
2.39.3
|
||||
|
||||
@ -1,7 +1,7 @@
|
||||
From a30996377bd8b1316cd79ac482b4f9ae9a50c31d Mon Sep 17 00:00:00 2001
|
||||
From e4d1359a325c1c91fff5c8701ddaa5c74266bb39 Mon Sep 17 00:00:00 2001
|
||||
From: Bandan Das <bsd@redhat.com>
|
||||
Date: Tue, 3 Dec 2013 20:05:13 +0100
|
||||
Subject: vfio: cap number of devices that can be assigned
|
||||
Date: Mon, 29 Sep 2025 11:47:21 +0200
|
||||
Subject: [PATCH] vfio: cap number of devices that can be assigned
|
||||
|
||||
RH-Author: Bandan Das <bsd@redhat.com>
|
||||
Message-id: <1386101113-31560-3-git-send-email-bsd@redhat.com>
|
||||
@ -30,15 +30,42 @@ Signed-off-by: Bandan Das <bsd@redhat.com>
|
||||
Rebase changes (8.2.0):
|
||||
- Update to upstream changes
|
||||
---
|
||||
hw/vfio/pci.c | 31 ++++++++++++++++++++++++++++++-
|
||||
hw/vfio/pci.h | 1 +
|
||||
2 files changed, 31 insertions(+), 1 deletion(-)
|
||||
hw/vfio/container.c | 14 ++++++++++++++
|
||||
hw/vfio/pci.c | 21 +++++++++++++++++++++
|
||||
hw/vfio/pci.h | 1 +
|
||||
include/hw/vfio/vfio-device.h | 1 +
|
||||
4 files changed, 37 insertions(+)
|
||||
|
||||
diff --git a/hw/vfio/container.c b/hw/vfio/container.c
|
||||
index 3e13feaa74..b912b9396b 100644
|
||||
--- a/hw/vfio/container.c
|
||||
+++ b/hw/vfio/container.c
|
||||
@@ -44,6 +44,20 @@ typedef QLIST_HEAD(VFIOGroupList, VFIOGroup) VFIOGroupList;
|
||||
static VFIOGroupList vfio_group_list =
|
||||
QLIST_HEAD_INITIALIZER(vfio_group_list);
|
||||
|
||||
+int vfio_device_count(void)
|
||||
+{
|
||||
+ int i = 0;
|
||||
+ VFIOGroup *group;
|
||||
+ VFIODevice *vbasedev_iter;
|
||||
+
|
||||
+ QLIST_FOREACH(group, &vfio_group_list, next) {
|
||||
+ QLIST_FOREACH(vbasedev_iter, &group->device_list, next) {
|
||||
+ i++;
|
||||
+ }
|
||||
+ }
|
||||
+ return i;
|
||||
+}
|
||||
+
|
||||
static int vfio_ram_block_discard_disable(VFIOContainer *container, bool state)
|
||||
{
|
||||
switch (container->iommu_type) {
|
||||
diff --git a/hw/vfio/pci.c b/hw/vfio/pci.c
|
||||
index 2407720c35..82a47edc89 100644
|
||||
index 07257d0fa0..48da233cb2 100644
|
||||
--- a/hw/vfio/pci.c
|
||||
+++ b/hw/vfio/pci.c
|
||||
@@ -50,6 +50,9 @@
|
||||
@@ -52,6 +52,9 @@
|
||||
/* Protected by BQL */
|
||||
static KVMRouteChange vfio_route_change;
|
||||
|
||||
@ -48,14 +75,7 @@ index 2407720c35..82a47edc89 100644
|
||||
static void vfio_disable_interrupts(VFIOPCIDevice *vdev);
|
||||
static void vfio_mmap_set_enabled(VFIOPCIDevice *vdev, bool enabled);
|
||||
static void vfio_msi_disable_common(VFIOPCIDevice *vdev);
|
||||
@@ -2963,10 +2966,33 @@ static void vfio_realize(PCIDevice *pdev, Error **errp)
|
||||
ERRP_GUARD();
|
||||
VFIOPCIDevice *vdev = VFIO_PCI(pdev);
|
||||
VFIODevice *vbasedev = &vdev->vbasedev;
|
||||
- int i, ret;
|
||||
+ int ret, i = 0;
|
||||
+ VFIODevice *vbasedev_iter;
|
||||
+ VFIOGroup *group;
|
||||
@@ -3355,6 +3358,21 @@ static void vfio_pci_realize(PCIDevice *pdev, Error **errp)
|
||||
char uuid[UUID_STR_LEN];
|
||||
g_autofree char *name = NULL;
|
||||
|
||||
@ -68,13 +88,7 @@ index 2407720c35..82a47edc89 100644
|
||||
+ device_limit = vdev->assigned_device_limit;
|
||||
+ }
|
||||
+
|
||||
+ QLIST_FOREACH(group, &vfio_group_list, next) {
|
||||
+ QLIST_FOREACH(vbasedev_iter, &group->device_list, next) {
|
||||
+ i++;
|
||||
+ }
|
||||
+ }
|
||||
+
|
||||
+ if (i >= vdev->assigned_device_limit) {
|
||||
+ if (vfio_device_count() >= vdev->assigned_device_limit) {
|
||||
+ error_setg(errp, "Maximum supported vfio devices (%d) "
|
||||
+ "already attached", vdev->assigned_device_limit);
|
||||
+ return;
|
||||
@ -83,7 +97,7 @@ index 2407720c35..82a47edc89 100644
|
||||
if (vbasedev->fd < 0 && !vbasedev->sysfsdev) {
|
||||
if (!(~vdev->host.domain || ~vdev->host.bus ||
|
||||
~vdev->host.slot || ~vdev->host.function)) {
|
||||
@@ -3388,6 +3414,9 @@ static Property vfio_pci_dev_properties[] = {
|
||||
@@ -3687,6 +3705,9 @@ static const Property vfio_pci_dev_properties[] = {
|
||||
DEFINE_PROP_BOOL("x-no-kvm-msix", VFIOPCIDevice, no_kvm_msix, false),
|
||||
DEFINE_PROP_BOOL("x-no-geforce-quirks", VFIOPCIDevice,
|
||||
no_geforce_quirks, false),
|
||||
@ -94,10 +108,10 @@ index 2407720c35..82a47edc89 100644
|
||||
false),
|
||||
DEFINE_PROP_BOOL("x-no-vfio-ioeventfd", VFIOPCIDevice, no_vfio_ioeventfd,
|
||||
diff --git a/hw/vfio/pci.h b/hw/vfio/pci.h
|
||||
index bf67df2fbc..0d3c93fb2e 100644
|
||||
index 810a842f4a..81555d8774 100644
|
||||
--- a/hw/vfio/pci.h
|
||||
+++ b/hw/vfio/pci.h
|
||||
@@ -142,6 +142,7 @@ struct VFIOPCIDevice {
|
||||
@@ -145,6 +145,7 @@ struct VFIOPCIDevice {
|
||||
EventNotifier err_notifier;
|
||||
EventNotifier req_notifier;
|
||||
int (*resetfn)(struct VFIOPCIDevice *);
|
||||
@ -105,6 +119,15 @@ index bf67df2fbc..0d3c93fb2e 100644
|
||||
uint32_t vendor_id;
|
||||
uint32_t device_id;
|
||||
uint32_t sub_vendor_id;
|
||||
--
|
||||
2.39.3
|
||||
|
||||
diff --git a/include/hw/vfio/vfio-device.h b/include/hw/vfio/vfio-device.h
|
||||
index 6e4d5ccdac..9290774299 100644
|
||||
--- a/include/hw/vfio/vfio-device.h
|
||||
+++ b/include/hw/vfio/vfio-device.h
|
||||
@@ -140,6 +140,7 @@ struct VFIODeviceOps {
|
||||
#define strwriteerror(ret) \
|
||||
(ret < 0 ? strerror(-ret) : "short write")
|
||||
|
||||
+int vfio_device_count(void);
|
||||
void vfio_device_irq_disable(VFIODevice *vbasedev, int index);
|
||||
void vfio_device_irq_unmask(VFIODevice *vbasedev, int index);
|
||||
void vfio_device_irq_mask(VFIODevice *vbasedev, int index);
|
||||
@ -1,7 +1,7 @@
|
||||
From d2a73465e69118a37a2bbc487b6faa30c9b5a81f Mon Sep 17 00:00:00 2001
|
||||
From f4b2577d0920e0472760138b1f39e65c818eba63 Mon Sep 17 00:00:00 2001
|
||||
From: Eduardo Habkost <ehabkost@redhat.com>
|
||||
Date: Wed, 4 Dec 2013 18:53:17 +0100
|
||||
Subject: Add support statement to -help output
|
||||
Subject: [PATCH] Add support statement to -help output
|
||||
|
||||
RH-Author: Eduardo Habkost <ehabkost@redhat.com>
|
||||
Message-id: <1386183197-27761-1-git-send-email-ehabkost@redhat.com>
|
||||
@ -21,10 +21,10 @@ Signed-off-by: Eduardo Habkost <ehabkost@redhat.com>
|
||||
1 file changed, 9 insertions(+)
|
||||
|
||||
diff --git a/system/vl.c b/system/vl.c
|
||||
index 01b8b8e77a..5359231bf5 100644
|
||||
index 3b7057e6c6..d3e6158753 100644
|
||||
--- a/system/vl.c
|
||||
+++ b/system/vl.c
|
||||
@@ -877,9 +877,17 @@ static void version(void)
|
||||
@@ -872,9 +872,17 @@ static void version(void)
|
||||
QEMU_COPYRIGHT "\n");
|
||||
}
|
||||
|
||||
@ -42,7 +42,7 @@ index 01b8b8e77a..5359231bf5 100644
|
||||
printf("usage: %s [options] [disk_image]\n\n"
|
||||
"'disk_image' is a raw hard disk image for IDE hard disk 0\n\n",
|
||||
g_get_prgname());
|
||||
@@ -905,6 +913,7 @@ static void help(int exitcode)
|
||||
@@ -900,6 +908,7 @@ static void help(int exitcode)
|
||||
"\n"
|
||||
QEMU_HELP_BOTTOM "\n");
|
||||
|
||||
@ -50,6 +50,3 @@ index 01b8b8e77a..5359231bf5 100644
|
||||
exit(exitcode);
|
||||
}
|
||||
|
||||
--
|
||||
2.39.3
|
||||
|
||||
@ -1,7 +1,7 @@
|
||||
From ca0507cfda11a73cb4311fc0b3a934ce8b40c5e9 Mon Sep 17 00:00:00 2001
|
||||
From b03b18b6e37a79c180cd7ba31ae378d0fa331f7c Mon Sep 17 00:00:00 2001
|
||||
From: Miroslav Rezanina <mrezanin@redhat.com>
|
||||
Date: Wed, 8 Jul 2020 08:35:50 +0200
|
||||
Subject: Use qemu-kvm in documentation instead of qemu-system-<arch>
|
||||
Subject: [PATCH] Use qemu-kvm in documentation instead of qemu-system-<arch>
|
||||
|
||||
Patchwork-id: 62380
|
||||
O-Subject: [RHEV-7.1 qemu-kvm-rhev PATCHv4] Use qemu-kvm in documentation instead of qemu-system-i386
|
||||
@ -36,10 +36,10 @@ index 52d6454b93..d74dbdeca9 100644
|
||||
.. |I2C| replace:: I\ :sup:`2`\ C
|
||||
.. |I2S| replace:: I\ :sup:`2`\ S
|
||||
diff --git a/qemu-options.hx b/qemu-options.hx
|
||||
index d94e2cbbae..a7444abc7f 100644
|
||||
index ab23f14d21..3837456a61 100644
|
||||
--- a/qemu-options.hx
|
||||
+++ b/qemu-options.hx
|
||||
@@ -3688,11 +3688,11 @@ SRST
|
||||
@@ -3858,11 +3858,11 @@ SRST
|
||||
|
||||
::
|
||||
|
||||
@ -56,6 +56,3 @@ index d94e2cbbae..a7444abc7f 100644
|
||||
|
||||
``-netdev vhost-vdpa[,vhostdev=/path/to/dev][,vhostfd=h]``
|
||||
Establish a vhost-vdpa netdev.
|
||||
--
|
||||
2.39.3
|
||||
|
||||
@ -1,7 +1,7 @@
|
||||
From 3fbdf1e92fe0dbabb59b611dfb3ad906edf80979 Mon Sep 17 00:00:00 2001
|
||||
From 0407a816af91b00b3c537599377273f85a66f2ba Mon Sep 17 00:00:00 2001
|
||||
From: Kevin Wolf <kwolf@redhat.com>
|
||||
Date: Fri, 20 Aug 2021 18:25:12 +0200
|
||||
Subject: qcow2: Deprecation warning when opening v2 images rw
|
||||
Subject: [PATCH] qcow2: Deprecation warning when opening v2 images rw
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
@ -35,16 +35,13 @@ Signed-off-by: Kevin Wolf <kwolf@redhat.com>
|
||||
patch_name: kvm-qcow2-Deprecation-warning-when-opening-v2-images-rw.patch
|
||||
present_in_specfile: true
|
||||
location_in_specfile: 116
|
||||
---
|
||||
Rebase notes (6.1.0):
|
||||
- Replace bs->read_only with bdrv_is_read_only
|
||||
---
|
||||
block/qcow2.c | 6 ++++++
|
||||
tests/qemu-iotests/common.filter | 1 +
|
||||
2 files changed, 7 insertions(+)
|
||||
|
||||
diff --git a/block/qcow2.c b/block/qcow2.c
|
||||
index 70b19730a3..a4cffb628c 100644
|
||||
index 4aa9f9e068..6df65aab93 100644
|
||||
--- a/block/qcow2.c
|
||||
+++ b/block/qcow2.c
|
||||
@@ -1358,6 +1358,12 @@ qcow2_do_open(BlockDriverState *bs, QDict *options, int flags,
|
||||
@ -61,7 +58,7 @@ index 70b19730a3..a4cffb628c 100644
|
||||
s->qcow_version = header.version;
|
||||
|
||||
diff --git a/tests/qemu-iotests/common.filter b/tests/qemu-iotests/common.filter
|
||||
index fc3c64bcb8..4b238954d5 100644
|
||||
index 511a55b1e8..35c0fc0d20 100644
|
||||
--- a/tests/qemu-iotests/common.filter
|
||||
+++ b/tests/qemu-iotests/common.filter
|
||||
@@ -83,6 +83,7 @@ _filter_qemu()
|
||||
@ -72,6 +69,3 @@ index fc3c64bcb8..4b238954d5 100644
|
||||
-e $'s#\r##' # QEMU monitor uses \r\n line endings
|
||||
}
|
||||
|
||||
--
|
||||
2.39.3
|
||||
|
||||
@ -1,7 +1,7 @@
|
||||
From 3cb78d36244833d5e11e88de33bbdbe93a641e16 Mon Sep 17 00:00:00 2001
|
||||
From bf3e2ead4f851f66ab1c9ce5cd13d8a73267dce4 Mon Sep 17 00:00:00 2001
|
||||
From: Paolo Bonzini <pbonzini@redhat.com>
|
||||
Date: Fri, 18 Jul 2025 18:03:50 +0200
|
||||
Subject: [PATCH 110/115] redhat: allow 5-level paging for TDX VMs
|
||||
Subject: [PATCH] redhat: allow 5-level paging for TDX VMs
|
||||
|
||||
RH-Author: Paolo Bonzini <pbonzini@redhat.com>
|
||||
RH-MergeRequest: 391: TDX support, including attestation and device assignment
|
||||
@ -12,12 +12,16 @@ RH-Acked-by: David Hildenbrand <david@redhat.com>
|
||||
RH-Commit: [110/115] dd69bc652e2a735234165832ea4bc674753d7fb7 (bonzini/rhel-qemu-kvm)
|
||||
|
||||
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
|
||||
|
||||
Patch-name: kvm-redhat-allow-5-level-paging-for-TDX-VMs.patch
|
||||
Patch-id: 387
|
||||
Patch-present-in-specfile: True
|
||||
---
|
||||
target/i386/kvm/tdx.c | 1 +
|
||||
1 file changed, 1 insertion(+)
|
||||
|
||||
diff --git a/target/i386/kvm/tdx.c b/target/i386/kvm/tdx.c
|
||||
index 2ff5211794..e65b1727cf 100644
|
||||
index dbf0fa2c91..91fe19b7d4 100644
|
||||
--- a/target/i386/kvm/tdx.c
|
||||
+++ b/target/i386/kvm/tdx.c
|
||||
@@ -754,6 +754,7 @@ static void tdx_cpu_instance_init(X86ConfidentialGuest *cg, CPUState *cpu)
|
||||
@ -28,6 +32,3 @@ index 2ff5211794..e65b1727cf 100644
|
||||
|
||||
/* invtsc is fixed1 for TD guest */
|
||||
object_property_set_bool(OBJECT(cpu), "invtsc", true, &error_abort);
|
||||
--
|
||||
2.50.1
|
||||
|
||||
155
0019-Add-upstream-compat-bits.patch
Normal file
155
0019-Add-upstream-compat-bits.patch
Normal file
@ -0,0 +1,155 @@
|
||||
From 512d36fc33342330362861f68c102504d37f5ff9 Mon Sep 17 00:00:00 2001
|
||||
From: Miroslav Rezanina <mrezanin@redhat.com>
|
||||
Date: Tue, 30 Sep 2025 12:22:25 +0200
|
||||
Subject: [PATCH] Add upstream compat bits
|
||||
|
||||
Adding copied upstream compatibility bits
|
||||
---
|
||||
hw/arm/virt.c | 1 +
|
||||
hw/core/machine.c | 22 ++++++++++++++++++++++
|
||||
hw/i386/pc.c | 12 ++++++++++++
|
||||
hw/i386/pc_piix.c | 4 ++++
|
||||
hw/i386/pc_q35.c | 4 ++++
|
||||
hw/s390x/s390-virtio-ccw.c | 1 +
|
||||
include/hw/boards.h | 3 +++
|
||||
include/hw/i386/pc.h | 3 +++
|
||||
8 files changed, 50 insertions(+)
|
||||
|
||||
diff --git a/hw/arm/virt.c b/hw/arm/virt.c
|
||||
index 21ab9257e7..cb303e263b 100644
|
||||
--- a/hw/arm/virt.c
|
||||
+++ b/hw/arm/virt.c
|
||||
@@ -3694,6 +3694,7 @@ DEFINE_VIRT_MACHINE(4, 1)
|
||||
|
||||
static void virt_rhel_machine_9_6_0_options(MachineClass *mc)
|
||||
{
|
||||
+ compat_props_add(mc->compat_props, hw_compat_rhel_9_8, hw_compat_rhel_9_8_len);
|
||||
}
|
||||
DEFINE_VIRT_MACHINE_AS_LATEST(9, 6, 0)
|
||||
|
||||
diff --git a/hw/core/machine.c b/hw/core/machine.c
|
||||
index 2e69dc40f0..f774a6ebdb 100644
|
||||
--- a/hw/core/machine.c
|
||||
+++ b/hw/core/machine.c
|
||||
@@ -303,6 +303,28 @@ const size_t hw_compat_rhel_9_len = G_N_ELEMENTS(hw_compat_rhel_9);
|
||||
const char *rhel_old_machine_deprecation =
|
||||
"machine types for previous major releases are deprecated";
|
||||
|
||||
+GlobalProperty hw_compat_rhel_9_8[] = {
|
||||
+ /* hw_compat_rhel_9_8 from hw_compat_9_1 */
|
||||
+ { TYPE_PCI_DEVICE, "x-pcie-ext-tag", "false" },
|
||||
+ /* hw_compat_rhel_9_8 from hw_compat_9_2 */
|
||||
+ {"arm-cpu", "backcompat-pauth-default-use-qarma5", "true"},
|
||||
+ /* hw_compat_rhel_9_8 from hw_compat_9_2 */
|
||||
+ { "virtio-balloon-pci", "vectors", "0" },
|
||||
+ /* hw_compat_rhel_9_8 from hw_compat_9_2 */
|
||||
+ { "virtio-balloon-pci-transitional", "vectors", "0" },
|
||||
+ /* hw_compat_rhel_9_8 from hw_compat_9_2 */
|
||||
+ { "virtio-balloon-pci-non-transitional", "vectors", "0" },
|
||||
+ /* hw_compat_rhel_9_8 from hw_compat_9_2 */
|
||||
+ { "virtio-mem-pci", "vectors", "0" },
|
||||
+ /* hw_compat_rhel_9_8 from hw_compat_9_2 */
|
||||
+ { "migration", "multifd-clean-tls-termination", "false" },
|
||||
+ /* hw_compat_rhel_9_8 from hw_compat_9_2 */
|
||||
+ { "migration", "send-switchover-start", "off"},
|
||||
+ /* hw_compat_rhel_9_8 from hw_compat_9_2 */
|
||||
+ { "vfio-pci", "x-migration-multifd-transfer", "off" },
|
||||
+};
|
||||
+const size_t hw_compat_rhel_9_8_len = G_N_ELEMENTS(hw_compat_rhel_9_8);
|
||||
+
|
||||
GlobalProperty hw_compat_rhel_9_6[] = {
|
||||
/* hw_compat_rhel_9_6 from hw_compat_9_0 */
|
||||
{"arm-cpu", "backcompat-cntfrq", "true" },
|
||||
diff --git a/hw/i386/pc.c b/hw/i386/pc.c
|
||||
index 1b351085c0..79a6105f8b 100644
|
||||
--- a/hw/i386/pc.c
|
||||
+++ b/hw/i386/pc.c
|
||||
@@ -295,6 +295,18 @@ GlobalProperty pc_rhel_compat[] = {
|
||||
};
|
||||
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 */
|
||||
+ { TYPE_X86_CPU, "x-consistent-cache", "false" },
|
||||
+ { TYPE_X86_CPU, "x-vendor-cpuid-only-v2", "false" },
|
||||
+ /* pc_rhel_9_8_compat from pc_compat_9_1 */
|
||||
+ { "ICH9-LPC", "x-smi-swsmi-timer", "off" },
|
||||
+ { "ICH9-LPC", "x-smi-periodic-timer", "off" },
|
||||
+ { TYPE_INTEL_IOMMU_DEVICE, "stale-tm", "on" },
|
||||
+ { TYPE_INTEL_IOMMU_DEVICE, "aw-bits", "39" },
|
||||
+};
|
||||
+const size_t pc_rhel_9_8_compat_len = G_N_ELEMENTS(pc_rhel_9_8_compat);
|
||||
+
|
||||
GlobalProperty pc_rhel_9_6_compat[] = {
|
||||
/* pc_rhel_9_6_compat from pc_compat_9_0 */
|
||||
{ TYPE_X86_CPU, "x-amd-topoext-features-only", "false" },
|
||||
diff --git a/hw/i386/pc_piix.c b/hw/i386/pc_piix.c
|
||||
index d9fd4d207e..1a46c16e19 100644
|
||||
--- a/hw/i386/pc_piix.c
|
||||
+++ b/hw/i386/pc_piix.c
|
||||
@@ -910,6 +910,10 @@ static void pc_i440fx_rhel_machine_7_6_0_options(MachineClass *m)
|
||||
object_class_property_set_description(oc, "x-south-bridge",
|
||||
"Use a different south bridge than PIIX3");
|
||||
|
||||
+ compat_props_add(m->compat_props, hw_compat_rhel_9_8,
|
||||
+ hw_compat_rhel_9_8_len);
|
||||
+ compat_props_add(m->compat_props, pc_rhel_9_8_compat,
|
||||
+ pc_rhel_9_8_compat_len);
|
||||
compat_props_add(m->compat_props, hw_compat_rhel_9_6,
|
||||
hw_compat_rhel_9_6_len);
|
||||
compat_props_add(m->compat_props, pc_rhel_9_6_compat,
|
||||
diff --git a/hw/i386/pc_q35.c b/hw/i386/pc_q35.c
|
||||
index 3165d9bbfe..a241f27c93 100644
|
||||
--- a/hw/i386/pc_q35.c
|
||||
+++ b/hw/i386/pc_q35.c
|
||||
@@ -700,6 +700,10 @@ static void pc_q35_rhel_machine_9_6_0_options(MachineClass *m)
|
||||
|
||||
/* NB: remember to move this line to the *latest* RHEL 9 machine */
|
||||
compat_props_add(m->compat_props, hw_compat_rhel_9, hw_compat_rhel_9_len);
|
||||
+ compat_props_add(m->compat_props, hw_compat_rhel_9_8,
|
||||
+ hw_compat_rhel_9_8_len);
|
||||
+ compat_props_add(m->compat_props, pc_rhel_9_8_compat,
|
||||
+ pc_rhel_9_8_compat_len);
|
||||
}
|
||||
|
||||
DEFINE_Q35_MACHINE_AS_LATEST(9, 6, 0);
|
||||
diff --git a/hw/s390x/s390-virtio-ccw.c b/hw/s390x/s390-virtio-ccw.c
|
||||
index 46161d16a5..d5d32f6a75 100644
|
||||
--- a/hw/s390x/s390-virtio-ccw.c
|
||||
+++ b/hw/s390x/s390-virtio-ccw.c
|
||||
@@ -1177,6 +1177,7 @@ static void ccw_rhel_machine_9_6_0_class_options(MachineClass *mc)
|
||||
{
|
||||
/* NB: remember to move this line to the *latest* RHEL 9 machine */
|
||||
compat_props_add(mc->compat_props, hw_compat_rhel_9, hw_compat_rhel_9_len);
|
||||
+ compat_props_add(mc->compat_props, hw_compat_rhel_9_8, hw_compat_rhel_9_8_len);
|
||||
}
|
||||
DEFINE_CCW_MACHINE_AS_LATEST(9, 6, 0);
|
||||
|
||||
diff --git a/include/hw/boards.h b/include/hw/boards.h
|
||||
index ad077677f4..0a5ee450c1 100644
|
||||
--- a/include/hw/boards.h
|
||||
+++ b/include/hw/boards.h
|
||||
@@ -864,6 +864,9 @@ extern const size_t hw_compat_rhel_9_len;
|
||||
extern GlobalProperty hw_compat_rhel_9_6[];
|
||||
extern const size_t hw_compat_rhel_9_6_len;
|
||||
|
||||
+extern GlobalProperty hw_compat_rhel_9_8[];
|
||||
+extern const size_t hw_compat_rhel_9_8_len;
|
||||
+
|
||||
extern GlobalProperty hw_compat_rhel_9_5[];
|
||||
extern const size_t hw_compat_rhel_9_5_len;
|
||||
|
||||
diff --git a/include/hw/i386/pc.h b/include/hw/i386/pc.h
|
||||
index 75c797bb0e..38c8471afc 100644
|
||||
--- a/include/hw/i386/pc.h
|
||||
+++ b/include/hw/i386/pc.h
|
||||
@@ -304,6 +304,9 @@ extern const size_t pc_compat_2_6_len;
|
||||
extern GlobalProperty pc_rhel_compat[];
|
||||
extern const size_t pc_rhel_compat_len;
|
||||
|
||||
+extern GlobalProperty pc_rhel_9_8_compat[];
|
||||
+extern const size_t pc_rhel_9_8_compat_len;
|
||||
+
|
||||
extern GlobalProperty pc_rhel_9_6_compat[];
|
||||
extern const size_t pc_rhel_9_6_compat_len;
|
||||
|
||||
@ -0,0 +1,68 @@
|
||||
From c1918fcb1e6a7772f3e8c23657c1fb521dce5805 Mon Sep 17 00:00:00 2001
|
||||
From: Thomas Huth <thuth@redhat.com>
|
||||
Date: Wed, 1 Oct 2025 09:23:06 +0200
|
||||
Subject: [PATCH] Revert "hw/s390x/s390-virtio-ccw: Remove the deprecated 4.1
|
||||
machine type"
|
||||
|
||||
JIRA: https://issues.redhat.com/browse/RHEL-105900
|
||||
Upstream status: downstream-only
|
||||
|
||||
This reverts commit 6ad3a47f15624176434490e895ac244375322607.
|
||||
|
||||
We still need the code for the old machine types since the -rhel7.6.0
|
||||
machine type is based on these old upstream machine types.
|
||||
|
||||
Signed-off-by: Thomas Huth <thuth@redhat.com>
|
||||
---
|
||||
hw/s390x/s390-virtio-ccw.c | 15 +++++++++++++++
|
||||
target/s390x/gen-features.c | 4 ++++
|
||||
2 files changed, 19 insertions(+)
|
||||
|
||||
diff --git a/hw/s390x/s390-virtio-ccw.c b/hw/s390x/s390-virtio-ccw.c
|
||||
index d5d32f6a75..0ff4114d2a 100644
|
||||
--- a/hw/s390x/s390-virtio-ccw.c
|
||||
+++ b/hw/s390x/s390-virtio-ccw.c
|
||||
@@ -1167,6 +1167,21 @@ static void ccw_machine_4_2_class_options(MachineClass *mc)
|
||||
compat_props_add(mc->compat_props, hw_compat_4_2, hw_compat_4_2_len);
|
||||
}
|
||||
DEFINE_CCW_MACHINE(4, 2);
|
||||
+
|
||||
+static void ccw_machine_4_1_instance_options(MachineState *machine)
|
||||
+{
|
||||
+ static const S390FeatInit qemu_cpu_feat = { S390_FEAT_LIST_QEMU_V4_1 };
|
||||
+ ccw_machine_4_2_instance_options(machine);
|
||||
+ s390_set_qemu_cpu_model(0x2964, 13, 2, qemu_cpu_feat);
|
||||
+}
|
||||
+
|
||||
+static void ccw_machine_4_1_class_options(MachineClass *mc)
|
||||
+{
|
||||
+ ccw_machine_4_2_class_options(mc);
|
||||
+ compat_props_add(mc->compat_props, hw_compat_4_1, hw_compat_4_1_len);
|
||||
+}
|
||||
+DEFINE_CCW_MACHINE(4, 1);
|
||||
+
|
||||
#endif /* disabled for RHEL */
|
||||
|
||||
static void ccw_rhel_machine_9_6_0_instance_options(MachineState *machine)
|
||||
diff --git a/target/s390x/gen-features.c b/target/s390x/gen-features.c
|
||||
index 8218e6470e..a814ece82f 100644
|
||||
--- a/target/s390x/gen-features.c
|
||||
+++ b/target/s390x/gen-features.c
|
||||
@@ -884,6 +884,9 @@ static uint16_t qemu_MIN[] = {
|
||||
*/
|
||||
S390_FEAT_FLOATING_POINT_EXT,
|
||||
S390_FEAT_ZPCI,
|
||||
+};
|
||||
+
|
||||
+static uint16_t qemu_V4_1[] = {
|
||||
S390_FEAT_STFLE_53,
|
||||
S390_FEAT_VECTOR,
|
||||
};
|
||||
@@ -1046,6 +1049,7 @@ static FeatGroupDefSpec FeatGroupDef[] = {
|
||||
*******************************/
|
||||
static FeatGroupDefSpec QemuFeatDef[] = {
|
||||
QEMU_FEAT_INITIALIZER(MIN),
|
||||
+ QEMU_FEAT_INITIALIZER(V4_1),
|
||||
QEMU_FEAT_INITIALIZER(V6_0),
|
||||
QEMU_FEAT_INITIALIZER(V6_2),
|
||||
QEMU_FEAT_INITIALIZER(V7_0),
|
||||
@ -0,0 +1,67 @@
|
||||
From 0a6b205fed327c4649c6204a2e8c3b12b29c8459 Mon Sep 17 00:00:00 2001
|
||||
From: Thomas Huth <thuth@redhat.com>
|
||||
Date: Wed, 1 Oct 2025 10:47:08 +0200
|
||||
Subject: [PATCH] Revert "hw/s390x/s390-virtio-ccw: Remove the deprecated 4.0
|
||||
machine type"
|
||||
|
||||
JIRA: https://issues.redhat.com/browse/RHEL-105900
|
||||
Upstream status: downstream-only
|
||||
|
||||
This reverts commit 1b432c51cd12e778079ee0cfd7e4c51aad928c65.
|
||||
|
||||
We still need the code for the old machine types since the -rhel7.6.0
|
||||
machine type is based on these old upstream machine types.
|
||||
|
||||
Signed-off-by: Thomas Huth <thuth@redhat.com>
|
||||
---
|
||||
hw/s390x/s390-virtio-ccw.c | 14 ++++++++++++++
|
||||
target/s390x/gen-features.c | 4 ++++
|
||||
2 files changed, 18 insertions(+)
|
||||
|
||||
diff --git a/hw/s390x/s390-virtio-ccw.c b/hw/s390x/s390-virtio-ccw.c
|
||||
index 0ff4114d2a..ff2efc1b93 100644
|
||||
--- a/hw/s390x/s390-virtio-ccw.c
|
||||
+++ b/hw/s390x/s390-virtio-ccw.c
|
||||
@@ -1182,6 +1182,20 @@ static void ccw_machine_4_1_class_options(MachineClass *mc)
|
||||
}
|
||||
DEFINE_CCW_MACHINE(4, 1);
|
||||
|
||||
+static void ccw_machine_4_0_instance_options(MachineState *machine)
|
||||
+{
|
||||
+ static const S390FeatInit qemu_cpu_feat = { S390_FEAT_LIST_QEMU_V4_0 };
|
||||
+ ccw_machine_4_1_instance_options(machine);
|
||||
+ s390_set_qemu_cpu_model(0x2827, 12, 2, qemu_cpu_feat);
|
||||
+}
|
||||
+
|
||||
+static void ccw_machine_4_0_class_options(MachineClass *mc)
|
||||
+{
|
||||
+ ccw_machine_4_1_class_options(mc);
|
||||
+ compat_props_add(mc->compat_props, hw_compat_4_0, hw_compat_4_0_len);
|
||||
+}
|
||||
+DEFINE_CCW_MACHINE(4, 0);
|
||||
+
|
||||
#endif /* disabled for RHEL */
|
||||
|
||||
static void ccw_rhel_machine_9_6_0_instance_options(MachineState *machine)
|
||||
diff --git a/target/s390x/gen-features.c b/target/s390x/gen-features.c
|
||||
index a814ece82f..4346b92431 100644
|
||||
--- a/target/s390x/gen-features.c
|
||||
+++ b/target/s390x/gen-features.c
|
||||
@@ -878,6 +878,9 @@ static uint16_t qemu_MIN[] = {
|
||||
S390_FEAT_ADAPTER_INT_SUPPRESSION,
|
||||
S390_FEAT_MSA_EXT_3,
|
||||
S390_FEAT_MSA_EXT_4,
|
||||
+};
|
||||
+
|
||||
+static uint16_t qemu_V4_0[] = {
|
||||
/*
|
||||
* Only BFP bits are implemented (HFP, DFP, PFPO and DIVIDE TO INTEGER not
|
||||
* implemented yet).
|
||||
@@ -1049,6 +1052,7 @@ static FeatGroupDefSpec FeatGroupDef[] = {
|
||||
*******************************/
|
||||
static FeatGroupDefSpec QemuFeatDef[] = {
|
||||
QEMU_FEAT_INITIALIZER(MIN),
|
||||
+ QEMU_FEAT_INITIALIZER(V4_0),
|
||||
QEMU_FEAT_INITIALIZER(V4_1),
|
||||
QEMU_FEAT_INITIALIZER(V6_0),
|
||||
QEMU_FEAT_INITIALIZER(V6_2),
|
||||
@ -1,43 +0,0 @@
|
||||
From 8c62f120efeedfcdc43fece9f65b4c1b5b0a06e6 Mon Sep 17 00:00:00 2001
|
||||
From: Dehan Meng <demeng@redhat.com>
|
||||
Date: Wed, 21 Aug 2024 14:55:01 +0800
|
||||
Subject: qemu-guest-agent: Update the logfile path of qga-fsfreeze-hook.log
|
||||
|
||||
RH-Author: 6-dehan <None>
|
||||
RH-MergeRequest: 265: qemu-guest-agent: Update the logfile path of qga-fsfreeze-hook.log
|
||||
RH-Jira: RHEL-52250
|
||||
RH-Acked-by: Konstantin Kostiuk <None>
|
||||
RH-Acked-by: Miroslav Rezanina <mrezanin@redhat.com>
|
||||
RH-Commit: [1/1] 7c5cfb882dbc277becb7daa2c5d6b8eff3d601b2 (6-dehan/src_centosupstream_qemu-kvm)
|
||||
|
||||
selinux context 'system_u:object_r:virt_qemu_ga_log_t:s0', it
|
||||
should be changed to '/var/log/qemu-ga/qga-fsfreeze-hook.log'. And
|
||||
it's worth to mention that this is RHEL-only change for matching
|
||||
existing SELinux boolean and policy.
|
||||
|
||||
Jira: https://issues.redhat.com/browse/RHEL-52250
|
||||
Signed-off-by: Dehan Meng <demeng@redhat.com>
|
||||
|
||||
Patch-name: kvm-qemu-guest-agent-Update-the-logfile-path-of-qga-fsfr.patch
|
||||
Patch-id: 137
|
||||
Patch-present-in-specfile: True
|
||||
---
|
||||
scripts/qemu-guest-agent/fsfreeze-hook | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
diff --git a/scripts/qemu-guest-agent/fsfreeze-hook b/scripts/qemu-guest-agent/fsfreeze-hook
|
||||
index e9b84ec028..70536ba3e3 100755
|
||||
--- a/scripts/qemu-guest-agent/fsfreeze-hook
|
||||
+++ b/scripts/qemu-guest-agent/fsfreeze-hook
|
||||
@@ -7,7 +7,7 @@
|
||||
# "freeze" argument before the filesystem is frozen. And for fsfreeze-thaw
|
||||
# request, it is issued with "thaw" argument after filesystem is thawed.
|
||||
|
||||
-LOGFILE=/var/log/qga-fsfreeze-hook.log
|
||||
+LOGFILE=/var/log/qemu-ga/qga-fsfreeze-hook.log
|
||||
FSFREEZE_D=$(dirname -- "$(realpath $0)")/fsfreeze-hook.d
|
||||
|
||||
# Check whether file $1 is a backup or rpm-generated file and should be ignored
|
||||
--
|
||||
2.39.3
|
||||
|
||||
@ -0,0 +1,69 @@
|
||||
From 98acfd50ce2a7e540c89196020f70a1e95071f1d Mon Sep 17 00:00:00 2001
|
||||
From: Thomas Huth <thuth@redhat.com>
|
||||
Date: Wed, 1 Oct 2025 11:42:35 +0200
|
||||
Subject: [PATCH] Revert "hw/s390x/s390-virtio-ccw: Remove the deprecated 3.1
|
||||
machine type"
|
||||
|
||||
This reverts commit 3b912daea079445aad40d8e189c40597b229cf10.
|
||||
|
||||
JIRA: https://issues.redhat.com/browse/RHEL-105900
|
||||
Upstream status: downstream-only
|
||||
|
||||
We still need the code for the old machine types since the -rhel7.6.0
|
||||
machine type is based on these old upstream machine types.
|
||||
|
||||
Signed-off-by: Thomas Huth <thuth@redhat.com>
|
||||
---
|
||||
hw/s390x/s390-virtio-ccw.c | 16 ++++++++++++++++
|
||||
target/s390x/gen-features.c | 4 ++++
|
||||
2 files changed, 20 insertions(+)
|
||||
|
||||
diff --git a/hw/s390x/s390-virtio-ccw.c b/hw/s390x/s390-virtio-ccw.c
|
||||
index ff2efc1b93..40d9c209f4 100644
|
||||
--- a/hw/s390x/s390-virtio-ccw.c
|
||||
+++ b/hw/s390x/s390-virtio-ccw.c
|
||||
@@ -1196,6 +1196,22 @@ static void ccw_machine_4_0_class_options(MachineClass *mc)
|
||||
}
|
||||
DEFINE_CCW_MACHINE(4, 0);
|
||||
|
||||
+static void ccw_machine_3_1_instance_options(MachineState *machine)
|
||||
+{
|
||||
+ static const S390FeatInit qemu_cpu_feat = { S390_FEAT_LIST_QEMU_V3_1 };
|
||||
+ ccw_machine_4_0_instance_options(machine);
|
||||
+ s390_cpudef_featoff_greater(14, 1, S390_FEAT_MULTIPLE_EPOCH);
|
||||
+ s390_cpudef_group_featoff_greater(14, 1, S390_FEAT_GROUP_MULTIPLE_EPOCH_PTFF);
|
||||
+ s390_set_qemu_cpu_model(0x2827, 12, 2, qemu_cpu_feat);
|
||||
+}
|
||||
+
|
||||
+static void ccw_machine_3_1_class_options(MachineClass *mc)
|
||||
+{
|
||||
+ ccw_machine_4_0_class_options(mc);
|
||||
+ compat_props_add(mc->compat_props, hw_compat_3_1, hw_compat_3_1_len);
|
||||
+}
|
||||
+DEFINE_CCW_MACHINE(3, 1);
|
||||
+
|
||||
#endif /* disabled for RHEL */
|
||||
|
||||
static void ccw_rhel_machine_9_6_0_instance_options(MachineState *machine)
|
||||
diff --git a/target/s390x/gen-features.c b/target/s390x/gen-features.c
|
||||
index 4346b92431..754fc843d2 100644
|
||||
--- a/target/s390x/gen-features.c
|
||||
+++ b/target/s390x/gen-features.c
|
||||
@@ -849,6 +849,9 @@ static uint16_t qemu_MIN[] = {
|
||||
S390_FEAT_GROUP_PLO,
|
||||
S390_FEAT_ESAN3,
|
||||
S390_FEAT_ZARCH,
|
||||
+};
|
||||
+
|
||||
+static uint16_t qemu_V3_1[] = {
|
||||
S390_FEAT_DAT_ENH,
|
||||
S390_FEAT_IDTE_SEGMENT,
|
||||
S390_FEAT_STFLE,
|
||||
@@ -1052,6 +1055,7 @@ static FeatGroupDefSpec FeatGroupDef[] = {
|
||||
*******************************/
|
||||
static FeatGroupDefSpec QemuFeatDef[] = {
|
||||
QEMU_FEAT_INITIALIZER(MIN),
|
||||
+ QEMU_FEAT_INITIALIZER(V3_1),
|
||||
QEMU_FEAT_INITIALIZER(V4_0),
|
||||
QEMU_FEAT_INITIALIZER(V4_1),
|
||||
QEMU_FEAT_INITIALIZER(V6_0),
|
||||
@ -1,109 +0,0 @@
|
||||
From 2b6f52a948d4ee1bbaadec56151a6c30782693a2 Mon Sep 17 00:00:00 2001
|
||||
From: Miroslav Rezanina <mrezanin@redhat.com>
|
||||
Date: Wed, 15 May 2024 01:41:13 -0400
|
||||
Subject: Add upstream compatibility bits
|
||||
|
||||
---
|
||||
hw/arm/virt.c | 1 +
|
||||
hw/core/machine.c | 17 +++++++++++++++++
|
||||
hw/i386/pc_piix.c | 2 ++
|
||||
hw/i386/pc_q35.c | 2 ++
|
||||
hw/s390x/s390-virtio-ccw.c | 1 +
|
||||
include/hw/boards.h | 3 +++
|
||||
6 files changed, 26 insertions(+)
|
||||
|
||||
diff --git a/hw/arm/virt.c b/hw/arm/virt.c
|
||||
index 903c0f2e9f..3c776b5011 100644
|
||||
--- a/hw/arm/virt.c
|
||||
+++ b/hw/arm/virt.c
|
||||
@@ -3582,6 +3582,7 @@ DEFINE_VIRT_MACHINE(2, 6)
|
||||
|
||||
static void virt_rhel_machine_9_4_0_options(MachineClass *mc)
|
||||
{
|
||||
+ compat_props_add(mc->compat_props, hw_compat_rhel_9_6, hw_compat_rhel_9_6_len);
|
||||
compat_props_add(mc->compat_props, hw_compat_rhel_9_5, hw_compat_rhel_9_5_len);
|
||||
}
|
||||
DEFINE_VIRT_MACHINE_AS_LATEST(9, 4, 0)
|
||||
diff --git a/hw/core/machine.c b/hw/core/machine.c
|
||||
index f7fed78e4b..add42660f8 100644
|
||||
--- a/hw/core/machine.c
|
||||
+++ b/hw/core/machine.c
|
||||
@@ -311,6 +311,23 @@ const size_t hw_compat_2_1_len = G_N_ELEMENTS(hw_compat_2_1);
|
||||
const char *rhel_old_machine_deprecation =
|
||||
"machine types for previous major releases are deprecated";
|
||||
|
||||
+GlobalProperty hw_compat_rhel_9_6[] = {
|
||||
+ /* hw_compat_rhel_9_6 from hw_compat_9_0 */
|
||||
+ {"arm-cpu", "backcompat-cntfrq", "true" },
|
||||
+ /* hw_compat_rhel_9_6 from hw_compat_9_0 */
|
||||
+ { "scsi-hd", "migrate-emulated-scsi-request", "false" },
|
||||
+ /* hw_compat_rhel_9_6 from hw_compat_9_0 */
|
||||
+ { "scsi-cd", "migrate-emulated-scsi-request", "false" },
|
||||
+ /* hw_compat_rhel_9_6 from hw_compat_9_0 */
|
||||
+ {"vfio-pci", "skip-vsc-check", "false" },
|
||||
+ /* hw_compat_rhel_9_6 from hw_compat_9_0 */
|
||||
+ { "virtio-pci", "x-pcie-pm-no-soft-reset", "off" },
|
||||
+ /* hw_compat_rhel_9_6 from hw_compat_9_0 */
|
||||
+ {"sd-card", "spec_version", "2" },
|
||||
+};
|
||||
+const size_t hw_compat_rhel_9_6_len = G_N_ELEMENTS(hw_compat_rhel_9_6);
|
||||
+
|
||||
+
|
||||
GlobalProperty hw_compat_rhel_9_5[] = {
|
||||
/* hw_compat_rhel_9_5 from hw_compat_8_2 */
|
||||
{ "migration", "zero-page-detection", "legacy"},
|
||||
diff --git a/hw/i386/pc_piix.c b/hw/i386/pc_piix.c
|
||||
index c93e78e896..80323cc08c 100644
|
||||
--- a/hw/i386/pc_piix.c
|
||||
+++ b/hw/i386/pc_piix.c
|
||||
@@ -880,6 +880,8 @@ static void pc_i440fx_rhel_machine_7_6_0_options(MachineClass *m)
|
||||
object_class_property_set_description(oc, "x-south-bridge",
|
||||
"Use a different south bridge than PIIX3");
|
||||
|
||||
+ compat_props_add(m->compat_props, hw_compat_rhel_9_6,
|
||||
+ hw_compat_rhel_9_6_len);
|
||||
compat_props_add(m->compat_props, pc_rhel_9_5_compat,
|
||||
pc_rhel_9_5_compat_len);
|
||||
compat_props_add(m->compat_props, hw_compat_rhel_9_5,
|
||||
diff --git a/hw/i386/pc_q35.c b/hw/i386/pc_q35.c
|
||||
index 76f0ac1acd..4580b2266e 100644
|
||||
--- a/hw/i386/pc_q35.c
|
||||
+++ b/hw/i386/pc_q35.c
|
||||
@@ -681,6 +681,8 @@ static void pc_q35_rhel_machine_9_4_0_options(MachineClass *m)
|
||||
pcmc->smbios_stream_version = "9.4.0";
|
||||
pcmc->isa_bios_alias = false;
|
||||
|
||||
+ compat_props_add(m->compat_props, hw_compat_rhel_9_6,
|
||||
+ hw_compat_rhel_9_6_len);
|
||||
compat_props_add(m->compat_props, pc_rhel_9_5_compat,
|
||||
pc_rhel_9_5_compat_len);
|
||||
compat_props_add(m->compat_props, hw_compat_rhel_9_5,
|
||||
diff --git a/hw/s390x/s390-virtio-ccw.c b/hw/s390x/s390-virtio-ccw.c
|
||||
index 72e1279db9..f884528639 100644
|
||||
--- a/hw/s390x/s390-virtio-ccw.c
|
||||
+++ b/hw/s390x/s390-virtio-ccw.c
|
||||
@@ -1314,6 +1314,7 @@ static void ccw_rhel_machine_9_4_0_instance_options(MachineState *machine)
|
||||
|
||||
static void ccw_rhel_machine_9_4_0_class_options(MachineClass *mc)
|
||||
{
|
||||
+ compat_props_add(mc->compat_props, hw_compat_rhel_9_6, hw_compat_rhel_9_6_len);
|
||||
compat_props_add(mc->compat_props, hw_compat_rhel_9_5, hw_compat_rhel_9_5_len);
|
||||
}
|
||||
DEFINE_CCW_MACHINE_AS_LATEST(9, 4, 0);
|
||||
diff --git a/include/hw/boards.h b/include/hw/boards.h
|
||||
index 85b43e3d0d..ffefc0a625 100644
|
||||
--- a/include/hw/boards.h
|
||||
+++ b/include/hw/boards.h
|
||||
@@ -802,6 +802,9 @@ extern const size_t hw_compat_2_2_len;
|
||||
extern GlobalProperty hw_compat_2_1[];
|
||||
extern const size_t hw_compat_2_1_len;
|
||||
|
||||
+extern GlobalProperty hw_compat_rhel_9_6[];
|
||||
+extern const size_t hw_compat_rhel_9_6_len;
|
||||
+
|
||||
extern GlobalProperty hw_compat_rhel_9_5[];
|
||||
extern const size_t hw_compat_rhel_9_5_len;
|
||||
|
||||
--
|
||||
2.39.3
|
||||
|
||||
30
0023-redhat-Fix-rhel7.6.0-machine-type.patch
Normal file
30
0023-redhat-Fix-rhel7.6.0-machine-type.patch
Normal file
@ -0,0 +1,30 @@
|
||||
From 0ba6c63f629423702bc836ae1a740f72d71aee99 Mon Sep 17 00:00:00 2001
|
||||
From: Thomas Huth <thuth@redhat.com>
|
||||
Date: Wed, 1 Oct 2025 13:57:59 +0200
|
||||
Subject: [PATCH] redhat: Fix -rhel7.6.0 machine type
|
||||
|
||||
JIRA: https://issues.redhat.com/browse/RHEL-105900
|
||||
|
||||
During the rebase to QEMU 10.1, we lost the S390_FEAT_LIST_QEMU_V3_1
|
||||
setting for the -rhel7.6.0 machine type. Now that the upstream
|
||||
patches that removed this setting got reverted, we can re-establish
|
||||
it for the -rhel7.6.0 machine.
|
||||
|
||||
Signed-off-by: Thomas Huth <thuth@redhat.com>
|
||||
---
|
||||
hw/s390x/s390-virtio-ccw.c | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
diff --git a/hw/s390x/s390-virtio-ccw.c b/hw/s390x/s390-virtio-ccw.c
|
||||
index 40d9c209f4..79fe544224 100644
|
||||
--- a/hw/s390x/s390-virtio-ccw.c
|
||||
+++ b/hw/s390x/s390-virtio-ccw.c
|
||||
@@ -1365,7 +1365,7 @@ DEFINE_CCW_MACHINE(8, 2, 0);
|
||||
|
||||
static void ccw_rhel_machine_7_6_0_instance_options(MachineState *machine)
|
||||
{
|
||||
- static const S390FeatInit qemu_cpu_feat = { };
|
||||
+ static const S390FeatInit qemu_cpu_feat = { S390_FEAT_LIST_QEMU_V3_1 };
|
||||
|
||||
ccw_rhel_machine_8_2_0_instance_options(machine);
|
||||
|
||||
@ -1,37 +0,0 @@
|
||||
From 492900c0b6a99f157249c2706c2f2ef5f67d20df Mon Sep 17 00:00:00 2001
|
||||
From: Thomas Huth <thuth@redhat.com>
|
||||
Date: Mon, 26 Aug 2024 14:27:49 +0200
|
||||
Subject: redhat: Add QEMU 9.1 compat handling to the s390x machine types
|
||||
|
||||
JIRA: https://issues.redhat.com/browse/RHEL-52323
|
||||
|
||||
Upstream changed the amount of information that is migrated for
|
||||
the S390 interrupt controller (FLIC), so we have to switch on
|
||||
a compatibility property for older machine types.
|
||||
|
||||
Signed-off-by: Thomas Huth <thuth@redhat.com>
|
||||
---
|
||||
hw/s390x/s390-virtio-ccw.c | 5 +++++
|
||||
1 file changed, 5 insertions(+)
|
||||
|
||||
diff --git a/hw/s390x/s390-virtio-ccw.c b/hw/s390x/s390-virtio-ccw.c
|
||||
index f884528639..4b7290f7a8 100644
|
||||
--- a/hw/s390x/s390-virtio-ccw.c
|
||||
+++ b/hw/s390x/s390-virtio-ccw.c
|
||||
@@ -1314,8 +1314,13 @@ static void ccw_rhel_machine_9_4_0_instance_options(MachineState *machine)
|
||||
|
||||
static void ccw_rhel_machine_9_4_0_class_options(MachineClass *mc)
|
||||
{
|
||||
+ static GlobalProperty compat[] = {
|
||||
+ { TYPE_QEMU_S390_FLIC, "migrate-all-state", "off", },
|
||||
+ };
|
||||
+
|
||||
compat_props_add(mc->compat_props, hw_compat_rhel_9_6, hw_compat_rhel_9_6_len);
|
||||
compat_props_add(mc->compat_props, hw_compat_rhel_9_5, hw_compat_rhel_9_5_len);
|
||||
+ compat_props_add(mc->compat_props, compat, G_N_ELEMENTS(compat));
|
||||
}
|
||||
DEFINE_CCW_MACHINE_AS_LATEST(9, 4, 0);
|
||||
|
||||
--
|
||||
2.39.3
|
||||
|
||||
@ -0,0 +1,41 @@
|
||||
From 8c4b23a9759821f5b543cda3af3a443583c6484b Mon Sep 17 00:00:00 2001
|
||||
From: Thomas Huth <thuth@redhat.com>
|
||||
Date: Wed, 1 Oct 2025 16:12:28 +0200
|
||||
Subject: [PATCH] redhat: Compatibility handling for the
|
||||
s390-ccw-virtio-rhel9.6.0 machine
|
||||
|
||||
JIRA: https://issues.redhat.com/browse/RHEL-105900
|
||||
Upstream status: downstream-only
|
||||
|
||||
Add the compatiblity handling for the -rhel9.6.0 machine types (and
|
||||
older) after the rebase to QEMU 10.1. This adds the settings from
|
||||
the upstream machine types of QEMU 9.2 and 10.0 to the downstream
|
||||
machine types.
|
||||
|
||||
Signed-off-by: Thomas Huth <thuth@redhat.com>
|
||||
---
|
||||
hw/s390x/s390-virtio-ccw.c | 8 ++++++++
|
||||
1 file changed, 8 insertions(+)
|
||||
|
||||
diff --git a/hw/s390x/s390-virtio-ccw.c b/hw/s390x/s390-virtio-ccw.c
|
||||
index 79fe544224..906d45c813 100644
|
||||
--- a/hw/s390x/s390-virtio-ccw.c
|
||||
+++ b/hw/s390x/s390-virtio-ccw.c
|
||||
@@ -1220,9 +1220,17 @@ static void ccw_rhel_machine_9_6_0_instance_options(MachineState *machine)
|
||||
|
||||
static void ccw_rhel_machine_9_6_0_class_options(MachineClass *mc)
|
||||
{
|
||||
+ S390CcwMachineClass *s390mc = S390_CCW_MACHINE_CLASS(mc);
|
||||
+ static GlobalProperty compat[] = {
|
||||
+ { TYPE_S390_PCI_DEVICE, "relaxed-translation", "off", },
|
||||
+ };
|
||||
+
|
||||
+ s390mc->use_cpi = false;
|
||||
+
|
||||
/* NB: remember to move this line to the *latest* RHEL 9 machine */
|
||||
compat_props_add(mc->compat_props, hw_compat_rhel_9, hw_compat_rhel_9_len);
|
||||
compat_props_add(mc->compat_props, hw_compat_rhel_9_8, hw_compat_rhel_9_8_len);
|
||||
+ compat_props_add(mc->compat_props, compat, G_N_ELEMENTS(compat));
|
||||
}
|
||||
DEFINE_CCW_MACHINE_AS_LATEST(9, 6, 0);
|
||||
|
||||
@ -0,0 +1,60 @@
|
||||
From 9719dea4ff535eee322019ef4e768adbb8eff254 Mon Sep 17 00:00:00 2001
|
||||
From: Thomas Huth <thuth@redhat.com>
|
||||
Date: Thu, 2 Oct 2025 09:09:20 +0200
|
||||
Subject: [PATCH] redhat: Add new s390-ccw-virtio-rhel9.8.0 machine type
|
||||
|
||||
JIRA: https://issues.redhat.com/browse/RHEL-105900
|
||||
Upstream status: downstream-only
|
||||
|
||||
Add a new machine type for RHEL 9.8.0. This machine type now has the
|
||||
"control-program identification" and the relaxed PCI translation
|
||||
features turned on.
|
||||
|
||||
Signed-off-by: Thomas Huth <thuth@redhat.com>
|
||||
---
|
||||
hw/s390x/s390-virtio-ccw.c | 18 +++++++++++++++---
|
||||
1 file changed, 15 insertions(+), 3 deletions(-)
|
||||
|
||||
diff --git a/hw/s390x/s390-virtio-ccw.c b/hw/s390x/s390-virtio-ccw.c
|
||||
index 906d45c813..0939adf1ab 100644
|
||||
--- a/hw/s390x/s390-virtio-ccw.c
|
||||
+++ b/hw/s390x/s390-virtio-ccw.c
|
||||
@@ -1214,8 +1214,20 @@ DEFINE_CCW_MACHINE(3, 1);
|
||||
|
||||
#endif /* disabled for RHEL */
|
||||
|
||||
+static void ccw_rhel_machine_9_8_0_instance_options(MachineState *machine)
|
||||
+{
|
||||
+}
|
||||
+
|
||||
+static void ccw_rhel_machine_9_8_0_class_options(MachineClass *mc)
|
||||
+{
|
||||
+ /* NB: remember to move this line to the *latest* RHEL 9 machine */
|
||||
+ compat_props_add(mc->compat_props, hw_compat_rhel_9, hw_compat_rhel_9_len);
|
||||
+}
|
||||
+DEFINE_CCW_MACHINE_AS_LATEST(9, 8, 0);
|
||||
+
|
||||
static void ccw_rhel_machine_9_6_0_instance_options(MachineState *machine)
|
||||
{
|
||||
+ ccw_rhel_machine_9_8_0_instance_options(machine);
|
||||
}
|
||||
|
||||
static void ccw_rhel_machine_9_6_0_class_options(MachineClass *mc)
|
||||
@@ -1225,14 +1237,14 @@ static void ccw_rhel_machine_9_6_0_class_options(MachineClass *mc)
|
||||
{ TYPE_S390_PCI_DEVICE, "relaxed-translation", "off", },
|
||||
};
|
||||
|
||||
+ ccw_rhel_machine_9_8_0_class_options(mc);
|
||||
+
|
||||
s390mc->use_cpi = false;
|
||||
|
||||
- /* NB: remember to move this line to the *latest* RHEL 9 machine */
|
||||
- compat_props_add(mc->compat_props, hw_compat_rhel_9, hw_compat_rhel_9_len);
|
||||
compat_props_add(mc->compat_props, hw_compat_rhel_9_8, hw_compat_rhel_9_8_len);
|
||||
compat_props_add(mc->compat_props, compat, G_N_ELEMENTS(compat));
|
||||
}
|
||||
-DEFINE_CCW_MACHINE_AS_LATEST(9, 6, 0);
|
||||
+DEFINE_CCW_MACHINE(9, 6, 0);
|
||||
|
||||
static void ccw_rhel_machine_9_4_0_instance_options(MachineState *machine)
|
||||
{
|
||||
@ -1,55 +0,0 @@
|
||||
From 1ceaf6413ec7cb19ea2b6147ec91c776c7c5df40 Mon Sep 17 00:00:00 2001
|
||||
From: Thomas Huth <thuth@redhat.com>
|
||||
Date: Mon, 26 Aug 2024 14:42:24 +0200
|
||||
Subject: redhat: Add rhel9.6.0 machine type
|
||||
|
||||
JIRA: https://issues.redhat.com/browse/RHEL-52323
|
||||
|
||||
Add a new machine type to enable the latest features by default.
|
||||
|
||||
Signed-off-by: Thomas Huth <thuth@redhat.com>
|
||||
---
|
||||
hw/s390x/s390-virtio-ccw.c | 14 +++++++++++++-
|
||||
1 file changed, 13 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/hw/s390x/s390-virtio-ccw.c b/hw/s390x/s390-virtio-ccw.c
|
||||
index 4b7290f7a8..a4a6ffa053 100644
|
||||
--- a/hw/s390x/s390-virtio-ccw.c
|
||||
+++ b/hw/s390x/s390-virtio-ccw.c
|
||||
@@ -1308,8 +1308,18 @@ DEFINE_CCW_MACHINE(2, 4);
|
||||
#endif
|
||||
#endif /* disabled for RHEL */
|
||||
|
||||
+static void ccw_rhel_machine_9_6_0_instance_options(MachineState *machine)
|
||||
+{
|
||||
+}
|
||||
+
|
||||
+static void ccw_rhel_machine_9_6_0_class_options(MachineClass *mc)
|
||||
+{
|
||||
+}
|
||||
+DEFINE_CCW_MACHINE_AS_LATEST(9, 6, 0);
|
||||
+
|
||||
static void ccw_rhel_machine_9_4_0_instance_options(MachineState *machine)
|
||||
{
|
||||
+ ccw_rhel_machine_9_6_0_instance_options(machine);
|
||||
}
|
||||
|
||||
static void ccw_rhel_machine_9_4_0_class_options(MachineClass *mc)
|
||||
@@ -1318,11 +1328,13 @@ static void ccw_rhel_machine_9_4_0_class_options(MachineClass *mc)
|
||||
{ TYPE_QEMU_S390_FLIC, "migrate-all-state", "off", },
|
||||
};
|
||||
|
||||
+ ccw_rhel_machine_9_6_0_class_options(mc);
|
||||
+
|
||||
compat_props_add(mc->compat_props, hw_compat_rhel_9_6, hw_compat_rhel_9_6_len);
|
||||
compat_props_add(mc->compat_props, hw_compat_rhel_9_5, hw_compat_rhel_9_5_len);
|
||||
compat_props_add(mc->compat_props, compat, G_N_ELEMENTS(compat));
|
||||
}
|
||||
-DEFINE_CCW_MACHINE_AS_LATEST(9, 4, 0);
|
||||
+DEFINE_CCW_MACHINE(9, 4, 0);
|
||||
|
||||
static void ccw_rhel_machine_9_2_0_instance_options(MachineState *machine)
|
||||
{
|
||||
--
|
||||
2.39.3
|
||||
|
||||
32
0026-hw-core-machine-rhel-machine-types-compat-fix.patch
Normal file
32
0026-hw-core-machine-rhel-machine-types-compat-fix.patch
Normal file
@ -0,0 +1,32 @@
|
||||
From fda4591f6ca6bcec0728583086622bef4bda4ff4 Mon Sep 17 00:00:00 2001
|
||||
From: Sebastian Ott <sebott@redhat.com>
|
||||
Date: Wed, 15 Oct 2025 16:39:16 +0200
|
||||
Subject: [PATCH] hw/core/machine: rhel machine types compat fix
|
||||
|
||||
Incorporate hw_compat_10_0 to downstream compat bits.
|
||||
|
||||
Signed-off-by: Sebastian Ott <sebott@redhat.com>
|
||||
---
|
||||
hw/core/machine.c | 9 +++++++++
|
||||
1 file changed, 9 insertions(+)
|
||||
|
||||
diff --git a/hw/core/machine.c b/hw/core/machine.c
|
||||
index f774a6ebdb..c10c733b7d 100644
|
||||
--- a/hw/core/machine.c
|
||||
+++ b/hw/core/machine.c
|
||||
@@ -322,6 +322,15 @@ GlobalProperty hw_compat_rhel_9_8[] = {
|
||||
{ "migration", "send-switchover-start", "off"},
|
||||
/* hw_compat_rhel_9_8 from hw_compat_9_2 */
|
||||
{ "vfio-pci", "x-migration-multifd-transfer", "off" },
|
||||
+ /* hw_compat_rhel_9_8 from hw_compat_10_0 */
|
||||
+ { "scsi-hd", "dpofua", "off" },
|
||||
+ /* hw_compat_rhel_9_8 from hw_compat_10_0 */
|
||||
+ { "vfio-pci", "x-migration-load-config-after-iter", "off" },
|
||||
+ /* hw_compat_rhel_9_8 from hw_compat_10_0 */
|
||||
+ { "ramfb", "use-legacy-x86-rom", "true"},
|
||||
+ /* hw_compat_rhel_9_8 from hw_compat_10_0 */
|
||||
+ { "vfio-pci-nohotplug", "use-legacy-x86-rom", "true" },
|
||||
+
|
||||
};
|
||||
const size_t hw_compat_rhel_9_8_len = G_N_ELEMENTS(hw_compat_rhel_9_8);
|
||||
|
||||
@ -1,43 +0,0 @@
|
||||
From f35f400c9255be5fbb0158c6885a96ef23e7fb86 Mon Sep 17 00:00:00 2001
|
||||
From: Sebastian Ott <sebott@redhat.com>
|
||||
Date: Thu, 5 Sep 2024 12:54:34 +0200
|
||||
Subject: x86: ensure compatibility of pc-q35-rhel9* and pc-i440fx-rhel7.6.0
|
||||
|
||||
Signed-off-by: Sebastian Ott <sebott@redhat.com>
|
||||
---
|
||||
hw/i386/pc_piix.c | 3 +++
|
||||
hw/i386/pc_q35.c | 3 +++
|
||||
2 files changed, 6 insertions(+)
|
||||
|
||||
diff --git a/hw/i386/pc_piix.c b/hw/i386/pc_piix.c
|
||||
index 80323cc08c..656abb5d39 100644
|
||||
--- a/hw/i386/pc_piix.c
|
||||
+++ b/hw/i386/pc_piix.c
|
||||
@@ -872,6 +872,9 @@ static void pc_i440fx_rhel_machine_7_6_0_options(MachineClass *m)
|
||||
pcmc->broken_32bit_mem_addr_check = true;
|
||||
/* Introduced in QEMU 8.2 */
|
||||
pcmc->default_south_bridge = TYPE_PIIX3_DEVICE;
|
||||
+ /* From pc_i440fx_machine_9_0_options() */
|
||||
+ m->smbios_memory_device_size = 16 * GiB;
|
||||
+ pcmc->isa_bios_alias = false;
|
||||
|
||||
object_class_property_add_enum(oc, "x-south-bridge", "PCSouthBridgeOption",
|
||||
&PCSouthBridgeOption_lookup,
|
||||
diff --git a/hw/i386/pc_q35.c b/hw/i386/pc_q35.c
|
||||
index 4580b2266e..5cfed8b62f 100644
|
||||
--- a/hw/i386/pc_q35.c
|
||||
+++ b/hw/i386/pc_q35.c
|
||||
@@ -679,7 +679,10 @@ static void pc_q35_rhel_machine_9_4_0_options(MachineClass *m)
|
||||
m->desc = "RHEL-9.4.0 PC (Q35 + ICH9, 2009)";
|
||||
pcmc->smbios_stream_product = "RHEL";
|
||||
pcmc->smbios_stream_version = "9.4.0";
|
||||
+
|
||||
+ /* From pc_q35_machine_9_0_options() */
|
||||
pcmc->isa_bios_alias = false;
|
||||
+ m->smbios_memory_device_size = 16 * GiB;
|
||||
|
||||
compat_props_add(m->compat_props, hw_compat_rhel_9_6,
|
||||
hw_compat_rhel_9_6_len);
|
||||
--
|
||||
2.39.3
|
||||
|
||||
@ -1,27 +0,0 @@
|
||||
From 9c65a3e2e15c96b3b74d7c7846dbd60b13474370 Mon Sep 17 00:00:00 2001
|
||||
From: Sebastian Ott <sebott@redhat.com>
|
||||
Date: Thu, 5 Sep 2024 13:02:32 +0200
|
||||
Subject: arm: ensure compatibility of virt-rhel9*
|
||||
|
||||
Signed-off-by: Sebastian Ott <sebott@redhat.com>
|
||||
---
|
||||
hw/arm/virt.c | 3 +++
|
||||
1 file changed, 3 insertions(+)
|
||||
|
||||
diff --git a/hw/arm/virt.c b/hw/arm/virt.c
|
||||
index 3c776b5011..1af1c9e170 100644
|
||||
--- a/hw/arm/virt.c
|
||||
+++ b/hw/arm/virt.c
|
||||
@@ -3582,6 +3582,9 @@ DEFINE_VIRT_MACHINE(2, 6)
|
||||
|
||||
static void virt_rhel_machine_9_4_0_options(MachineClass *mc)
|
||||
{
|
||||
+ /* From virt_machine_9_0_options() */
|
||||
+ mc->smbios_memory_device_size = 16 * GiB;
|
||||
+
|
||||
compat_props_add(mc->compat_props, hw_compat_rhel_9_6, hw_compat_rhel_9_6_len);
|
||||
compat_props_add(mc->compat_props, hw_compat_rhel_9_5, hw_compat_rhel_9_5_len);
|
||||
}
|
||||
--
|
||||
2.39.3
|
||||
|
||||
26
0027-arm-rhel-machine-type-compat-fix.patch
Normal file
26
0027-arm-rhel-machine-type-compat-fix.patch
Normal file
@ -0,0 +1,26 @@
|
||||
From 0a8d8f3826fdb4160cbb6e401daa58abdc914873 Mon Sep 17 00:00:00 2001
|
||||
From: Sebastian Ott <sebott@redhat.com>
|
||||
Date: Thu, 16 Oct 2025 16:12:37 +0200
|
||||
Subject: [PATCH] arm: rhel machine type compat fix
|
||||
|
||||
Ensure compat of virt-rhel9.6.0 - same change as for virt-9.1 upstream.
|
||||
|
||||
Signed-off-by: Sebastian Ott <sebott@redhat.com>
|
||||
---
|
||||
hw/arm/virt.c | 3 +++
|
||||
1 file changed, 3 insertions(+)
|
||||
|
||||
diff --git a/hw/arm/virt.c b/hw/arm/virt.c
|
||||
index cb303e263b..d3bab67991 100644
|
||||
--- a/hw/arm/virt.c
|
||||
+++ b/hw/arm/virt.c
|
||||
@@ -3694,6 +3694,9 @@ DEFINE_VIRT_MACHINE(4, 1)
|
||||
|
||||
static void virt_rhel_machine_9_6_0_options(MachineClass *mc)
|
||||
{
|
||||
+ VirtMachineClass *vmc = VIRT_MACHINE_CLASS(OBJECT_CLASS(mc));
|
||||
+
|
||||
+ vmc->no_nested_smmu = true;
|
||||
compat_props_add(mc->compat_props, hw_compat_rhel_9_8, hw_compat_rhel_9_8_len);
|
||||
}
|
||||
DEFINE_VIRT_MACHINE_AS_LATEST(9, 6, 0)
|
||||
@ -1,41 +0,0 @@
|
||||
From 005be8f390c038ab9674103e1644dc1549c434a9 Mon Sep 17 00:00:00 2001
|
||||
From: Sebastian Ott <sebott@redhat.com>
|
||||
Date: Thu, 5 Sep 2024 13:11:23 +0200
|
||||
Subject: arm: create new virt machine type for rhel 9.6
|
||||
|
||||
Signed-off-by: Sebastian Ott <sebott@redhat.com>
|
||||
---
|
||||
hw/arm/virt.c | 9 ++++++++-
|
||||
1 file changed, 8 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/hw/arm/virt.c b/hw/arm/virt.c
|
||||
index 1af1c9e170..bf05499a12 100644
|
||||
--- a/hw/arm/virt.c
|
||||
+++ b/hw/arm/virt.c
|
||||
@@ -3580,15 +3580,22 @@ static void virt_machine_2_6_options(MachineClass *mc)
|
||||
DEFINE_VIRT_MACHINE(2, 6)
|
||||
#endif /* disabled for RHEL */
|
||||
|
||||
+static void virt_rhel_machine_9_6_0_options(MachineClass *mc)
|
||||
+{
|
||||
+}
|
||||
+DEFINE_VIRT_MACHINE_AS_LATEST(9, 6, 0)
|
||||
+
|
||||
static void virt_rhel_machine_9_4_0_options(MachineClass *mc)
|
||||
{
|
||||
+ virt_rhel_machine_9_6_0_options(mc);
|
||||
+
|
||||
/* From virt_machine_9_0_options() */
|
||||
mc->smbios_memory_device_size = 16 * GiB;
|
||||
|
||||
compat_props_add(mc->compat_props, hw_compat_rhel_9_6, hw_compat_rhel_9_6_len);
|
||||
compat_props_add(mc->compat_props, hw_compat_rhel_9_5, hw_compat_rhel_9_5_len);
|
||||
}
|
||||
-DEFINE_VIRT_MACHINE_AS_LATEST(9, 4, 0)
|
||||
+DEFINE_VIRT_MACHINE(9, 4, 0)
|
||||
|
||||
static void virt_rhel_machine_9_2_0_options(MachineClass *mc)
|
||||
{
|
||||
--
|
||||
2.39.3
|
||||
|
||||
125
0028-target-i386-add-compatibility-property-for-arch_capa.patch
Normal file
125
0028-target-i386-add-compatibility-property-for-arch_capa.patch
Normal file
@ -0,0 +1,125 @@
|
||||
From f12894cd72bfe359ed3438fad9f28cc2d282ab0b Mon Sep 17 00:00:00 2001
|
||||
From: Paolo Bonzini <pbonzini@redhat.com>
|
||||
Date: Thu, 9 Oct 2025 16:47:10 +0200
|
||||
Subject: [PATCH] target/i386: add compatibility property for arch_capabilities
|
||||
|
||||
JIRA: https://issues.redhat.com/browse/RHEL-120257
|
||||
|
||||
Prior to v10.1, if requested by user, arch-capabilities is always on
|
||||
despite the fact that CPUID advertises it to be off/unvailable.
|
||||
This causes a migration issue for VMs that are run on a machine
|
||||
without arch-capabilities and expect this feature to be present
|
||||
on the destination host with QEMU 10.1.
|
||||
|
||||
Add a compatibility property to restore the legacy behavior for all
|
||||
machines with version prior to 10.1.
|
||||
|
||||
To preserve the functionality (added by 10.1) of turning off
|
||||
ARCH_CAPABILITIES where Windows does not like it, use directly
|
||||
the guest CPU vendor: x86_cpu_get_supported_feature_word is not
|
||||
KVM-specific and therefore should not necessarily use the host
|
||||
CPUID.
|
||||
|
||||
Co-authored-by: Hector Cao <hector.cao@canonical.com>
|
||||
Signed-off-by: Hector Cao <hector.cao@canonical.com>
|
||||
Fixes: d3a24134e37 ("target/i386: do not expose ARCH_CAPABILITIES on AMD CPU", 2025-07-17)
|
||||
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
|
||||
(cherry picked from commit e9efa4a77168ac2816bf9471f878252ce6224710)
|
||||
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
|
||||
---
|
||||
hw/i386/pc.c | 2 ++
|
||||
target/i386/cpu.c | 17 +++++++++++++++++
|
||||
target/i386/cpu.h | 6 ++++++
|
||||
target/i386/kvm/kvm.c | 6 +-----
|
||||
4 files changed, 26 insertions(+), 5 deletions(-)
|
||||
|
||||
diff --git a/hw/i386/pc.c b/hw/i386/pc.c
|
||||
index 79a6105f8b..ee8c221505 100644
|
||||
--- a/hw/i386/pc.c
|
||||
+++ b/hw/i386/pc.c
|
||||
@@ -84,6 +84,7 @@
|
||||
GlobalProperty pc_compat_10_0[] = {
|
||||
{ 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" },
|
||||
};
|
||||
const size_t pc_compat_10_0_len = G_N_ELEMENTS(pc_compat_10_0);
|
||||
|
||||
@@ -299,6 +300,7 @@ GlobalProperty pc_rhel_9_8_compat[] = {
|
||||
/* pc_rhel_10_2_compat from pc_compat_10_0 */
|
||||
{ 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" },
|
||||
/* pc_rhel_9_8_compat from pc_compat_9_1 */
|
||||
{ "ICH9-LPC", "x-smi-swsmi-timer", "off" },
|
||||
{ "ICH9-LPC", "x-smi-periodic-timer", "off" },
|
||||
diff --git a/target/i386/cpu.c b/target/i386/cpu.c
|
||||
index 2c4ddd7c63..9fb70ac344 100644
|
||||
--- a/target/i386/cpu.c
|
||||
+++ b/target/i386/cpu.c
|
||||
@@ -7564,6 +7564,20 @@ uint64_t x86_cpu_get_supported_feature_word(X86CPU *cpu, FeatureWord w)
|
||||
#endif
|
||||
break;
|
||||
|
||||
+ case FEAT_7_0_EDX:
|
||||
+ /*
|
||||
+ * Windows does not like ARCH_CAPABILITIES on AMD machines at all.
|
||||
+ * Do not show the fake ARCH_CAPABILITIES MSR that KVM sets up,
|
||||
+ * except if needed for migration.
|
||||
+ *
|
||||
+ * When arch_cap_always_on is removed, this tweak can move to
|
||||
+ * kvm_arch_get_supported_cpuid.
|
||||
+ */
|
||||
+ if (cpu && IS_AMD_CPU(&cpu->env) && !cpu->arch_cap_always_on) {
|
||||
+ unavail = CPUID_7_0_EDX_ARCH_CAPABILITIES;
|
||||
+ }
|
||||
+ break;
|
||||
+
|
||||
default:
|
||||
break;
|
||||
}
|
||||
@@ -10029,6 +10043,9 @@ static const Property x86_cpu_properties[] = {
|
||||
true),
|
||||
DEFINE_PROP_BOOL("x-l1-cache-per-thread", X86CPU, l1_cache_per_core, true),
|
||||
DEFINE_PROP_BOOL("x-force-cpuid-0x1f", X86CPU, force_cpuid_0x1f, false),
|
||||
+
|
||||
+ DEFINE_PROP_BOOL("x-arch-cap-always-on", X86CPU,
|
||||
+ arch_cap_always_on, false),
|
||||
};
|
||||
|
||||
#ifndef CONFIG_USER_ONLY
|
||||
diff --git a/target/i386/cpu.h b/target/i386/cpu.h
|
||||
index f977fc49a7..b966bc997c 100644
|
||||
--- a/target/i386/cpu.h
|
||||
+++ b/target/i386/cpu.h
|
||||
@@ -2314,6 +2314,12 @@ struct ArchCPU {
|
||||
/* Forcefully disable KVM PV features not exposed in guest CPUIDs */
|
||||
bool kvm_pv_enforce_cpuid;
|
||||
|
||||
+ /*
|
||||
+ * Expose arch-capabilities unconditionally even on AMD models, for backwards
|
||||
+ * compatibility with QEMU <10.1.
|
||||
+ */
|
||||
+ bool arch_cap_always_on;
|
||||
+
|
||||
/* Number of physical address bits supported */
|
||||
uint32_t phys_bits;
|
||||
|
||||
diff --git a/target/i386/kvm/kvm.c b/target/i386/kvm/kvm.c
|
||||
index 0eb39d22d6..baa2f80beb 100644
|
||||
--- a/target/i386/kvm/kvm.c
|
||||
+++ b/target/i386/kvm/kvm.c
|
||||
@@ -503,12 +503,8 @@ uint32_t kvm_arch_get_supported_cpuid(KVMState *s, uint32_t function,
|
||||
* Linux v4.17-v4.20 incorrectly return ARCH_CAPABILITIES on SVM hosts.
|
||||
* We can detect the bug by checking if MSR_IA32_ARCH_CAPABILITIES is
|
||||
* returned by KVM_GET_MSR_INDEX_LIST.
|
||||
- *
|
||||
- * But also, because Windows does not like ARCH_CAPABILITIES on AMD
|
||||
- * mcahines at all, do not show the fake ARCH_CAPABILITIES MSR that
|
||||
- * KVM sets up.
|
||||
*/
|
||||
- if (!has_msr_arch_capabs || !(edx & CPUID_7_0_EDX_ARCH_CAPABILITIES)) {
|
||||
+ if (!has_msr_arch_capabs) {
|
||||
ret &= ~CPUID_7_0_EDX_ARCH_CAPABILITIES;
|
||||
}
|
||||
} else if (function == 7 && index == 1 && reg == R_EAX) {
|
||||
106
0029-target-i386-add-compatibility-property-for-pdcm-feat.patch
Normal file
106
0029-target-i386-add-compatibility-property-for-pdcm-feat.patch
Normal file
@ -0,0 +1,106 @@
|
||||
From 61b2a83e3d0aef9683eed3ada16ef183b027b44d Mon Sep 17 00:00:00 2001
|
||||
From: Paolo Bonzini <pbonzini@redhat.com>
|
||||
Date: Thu, 9 Oct 2025 16:47:47 +0200
|
||||
Subject: [PATCH] target/i386: add compatibility property for pdcm feature
|
||||
|
||||
JIRA: https://issues.redhat.com/browse/RHEL-120257
|
||||
|
||||
The pdcm feature is supposed to be disabled when PMU is not
|
||||
available. Up until v10.1, pdcm feature is enabled even when PMU
|
||||
is off. This behavior has been fixed but this change breaks the
|
||||
migration of VMs that are run with QEMU < 10.0 and expect the pdcm
|
||||
feature to be enabled on the destination host.
|
||||
|
||||
This commit restores the legacy behavior for machines with version
|
||||
prior to 10.1 to allow the migration from older QEMU to QEMU 10.1.
|
||||
|
||||
Signed-off-by: Hector Cao <hector.cao@canonical.com>
|
||||
Link: https://lore.kernel.org/r/20250910115733.21149-3-hector.cao@canonical.com
|
||||
Fixes: e68ec298090 ("i386/cpu: Move adjustment of CPUID_EXT_PDCM before feature_dependencies[] check", 2025-06-20)
|
||||
[Move property from migration object to CPU. - Paolo]
|
||||
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
|
||||
(cherry picked from commit 6529f31e0dccadb532c80b36e3efe7aef83f9cad)
|
||||
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
|
||||
---
|
||||
hw/i386/pc.c | 2 ++
|
||||
target/i386/cpu.c | 15 ++++++++++++---
|
||||
target/i386/cpu.h | 6 ++++++
|
||||
3 files changed, 20 insertions(+), 3 deletions(-)
|
||||
|
||||
diff --git a/hw/i386/pc.c b/hw/i386/pc.c
|
||||
index ee8c221505..dc3f140fdc 100644
|
||||
--- a/hw/i386/pc.c
|
||||
+++ b/hw/i386/pc.c
|
||||
@@ -85,6 +85,7 @@ GlobalProperty pc_compat_10_0[] = {
|
||||
{ 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" },
|
||||
+ { TYPE_X86_CPU, "x-pdcm-on-even-without-pmu", "true" },
|
||||
};
|
||||
const size_t pc_compat_10_0_len = G_N_ELEMENTS(pc_compat_10_0);
|
||||
|
||||
@@ -301,6 +302,7 @@ GlobalProperty pc_rhel_9_8_compat[] = {
|
||||
{ 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" },
|
||||
+ { TYPE_X86_CPU, "x-pdcm-on-even-without-pmu", "true" },
|
||||
/* pc_rhel_9_8_compat from pc_compat_9_1 */
|
||||
{ "ICH9-LPC", "x-smi-swsmi-timer", "off" },
|
||||
{ "ICH9-LPC", "x-smi-periodic-timer", "off" },
|
||||
diff --git a/target/i386/cpu.c b/target/i386/cpu.c
|
||||
index 9fb70ac344..1c8e0154d1 100644
|
||||
--- a/target/i386/cpu.c
|
||||
+++ b/target/i386/cpu.c
|
||||
@@ -7933,6 +7933,11 @@ void cpu_x86_cpuid(CPUX86State *env, uint32_t index, uint32_t count,
|
||||
/* Fixup overflow: max value for bits 23-16 is 255. */
|
||||
*ebx |= MIN(num, 255) << 16;
|
||||
}
|
||||
+ if (cpu->pdcm_on_even_without_pmu) {
|
||||
+ if (!cpu->enable_pmu) {
|
||||
+ *ecx &= ~CPUID_EXT_PDCM;
|
||||
+ }
|
||||
+ }
|
||||
break;
|
||||
case 2: { /* cache info: needed for Pentium Pro compatibility */
|
||||
const CPUCaches *caches;
|
||||
@@ -8983,9 +8988,11 @@ void x86_cpu_expand_features(X86CPU *cpu, Error **errp)
|
||||
}
|
||||
}
|
||||
|
||||
- /* PDCM is fixed1 bit for TDX */
|
||||
- if (!cpu->enable_pmu && !is_tdx_vm()) {
|
||||
- env->features[FEAT_1_ECX] &= ~CPUID_EXT_PDCM;
|
||||
+ if (!cpu->pdcm_on_even_without_pmu) {
|
||||
+ /* PDCM is fixed1 bit for TDX */
|
||||
+ if (!cpu->enable_pmu && !is_tdx_vm()) {
|
||||
+ env->features[FEAT_1_ECX] &= ~CPUID_EXT_PDCM;
|
||||
+ }
|
||||
}
|
||||
|
||||
for (i = 0; i < ARRAY_SIZE(feature_dependencies); i++) {
|
||||
@@ -10046,6 +10053,8 @@ static const Property x86_cpu_properties[] = {
|
||||
|
||||
DEFINE_PROP_BOOL("x-arch-cap-always-on", X86CPU,
|
||||
arch_cap_always_on, false),
|
||||
+ DEFINE_PROP_BOOL("x-pdcm-on-even-without-pmu", X86CPU,
|
||||
+ pdcm_on_even_without_pmu, false),
|
||||
};
|
||||
|
||||
#ifndef CONFIG_USER_ONLY
|
||||
diff --git a/target/i386/cpu.h b/target/i386/cpu.h
|
||||
index b966bc997c..2187e61654 100644
|
||||
--- a/target/i386/cpu.h
|
||||
+++ b/target/i386/cpu.h
|
||||
@@ -2320,6 +2320,12 @@ struct ArchCPU {
|
||||
*/
|
||||
bool arch_cap_always_on;
|
||||
|
||||
+ /*
|
||||
+ * Backwards compatibility with QEMU <10.1. The PDCM feature is now disabled when
|
||||
+ * PMU is not available, but prior to 10.1 it was enabled even if PMU is off.
|
||||
+ */
|
||||
+ bool pdcm_on_even_without_pmu;
|
||||
+
|
||||
/* Number of physical address bits supported */
|
||||
uint32_t phys_bits;
|
||||
|
||||
@ -1,42 +0,0 @@
|
||||
From 826f14b90a0ad2427e4e80232c0fbaea80600650 Mon Sep 17 00:00:00 2001
|
||||
From: Sebastian Ott <sebott@redhat.com>
|
||||
Date: Thu, 5 Sep 2024 13:31:12 +0200
|
||||
Subject: x86: create new pc-q35 machine type for rhel 9.6
|
||||
|
||||
Signed-off-by: Sebastian Ott <sebott@redhat.com>
|
||||
---
|
||||
hw/i386/pc_q35.c | 14 +++++++++++++-
|
||||
1 file changed, 13 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/hw/i386/pc_q35.c b/hw/i386/pc_q35.c
|
||||
index 5cfed8b62f..7606007bda 100644
|
||||
--- a/hw/i386/pc_q35.c
|
||||
+++ b/hw/i386/pc_q35.c
|
||||
@@ -672,11 +672,23 @@ DEFINE_Q35_MACHINE(2, 4);
|
||||
|
||||
/* Red Hat Enterprise Linux machine types */
|
||||
|
||||
-static void pc_q35_rhel_machine_9_4_0_options(MachineClass *m)
|
||||
+static void pc_q35_rhel_machine_9_6_0_options(MachineClass *m)
|
||||
{
|
||||
PCMachineClass *pcmc = PC_MACHINE_CLASS(m);
|
||||
pc_q35_machine_options(m);
|
||||
+ m->desc = "RHEL-9.6.0 PC (Q35 + ICH9, 2009)";
|
||||
+ pcmc->smbios_stream_product = "RHEL";
|
||||
+ pcmc->smbios_stream_version = "9.6.0";
|
||||
+}
|
||||
+
|
||||
+DEFINE_Q35_MACHINE_BUGFIX(9, 6, 0);
|
||||
+
|
||||
+static void pc_q35_rhel_machine_9_4_0_options(MachineClass *m)
|
||||
+{
|
||||
+ PCMachineClass *pcmc = PC_MACHINE_CLASS(m);
|
||||
+ pc_q35_rhel_machine_9_6_0_options(m);
|
||||
m->desc = "RHEL-9.4.0 PC (Q35 + ICH9, 2009)";
|
||||
+ m->alias = NULL;
|
||||
pcmc->smbios_stream_product = "RHEL";
|
||||
pcmc->smbios_stream_version = "9.4.0";
|
||||
|
||||
--
|
||||
2.39.3
|
||||
|
||||
38
0030-arm-create-new-virt-machine-type-for-rhel-9.8.patch
Normal file
38
0030-arm-create-new-virt-machine-type-for-rhel-9.8.patch
Normal file
@ -0,0 +1,38 @@
|
||||
From 13ccc4660a956a0c2b25558a85b6152c9b366181 Mon Sep 17 00:00:00 2001
|
||||
From: Shaoqin Huang <shahuang@redhat.com>
|
||||
Date: Thu, 9 Oct 2025 02:38:45 -0400
|
||||
Subject: [PATCH] arm: create new virt machine type for rhel 9.8
|
||||
|
||||
Upstream Status: RHEL only
|
||||
JIRA: https://issues.redhat.com/browse/RHEL-105903
|
||||
|
||||
Signed-off-by: Shaoqin Huang <shahuang@redhat.com>
|
||||
---
|
||||
hw/arm/virt.c | 7 ++++++-
|
||||
1 file changed, 6 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/hw/arm/virt.c b/hw/arm/virt.c
|
||||
index d3bab67991..b8699cb9a2 100644
|
||||
--- a/hw/arm/virt.c
|
||||
+++ b/hw/arm/virt.c
|
||||
@@ -3692,6 +3692,11 @@ static void virt_machine_4_1_options(MachineClass *mc)
|
||||
DEFINE_VIRT_MACHINE(4, 1)
|
||||
#endif /* disabled for RHEL */
|
||||
|
||||
+static void virt_rhel_machine_9_8_0_options(MachineClass *mc)
|
||||
+{
|
||||
+}
|
||||
+DEFINE_VIRT_MACHINE_AS_LATEST(9, 8, 0)
|
||||
+
|
||||
static void virt_rhel_machine_9_6_0_options(MachineClass *mc)
|
||||
{
|
||||
VirtMachineClass *vmc = VIRT_MACHINE_CLASS(OBJECT_CLASS(mc));
|
||||
@@ -3699,7 +3704,7 @@ static void virt_rhel_machine_9_6_0_options(MachineClass *mc)
|
||||
vmc->no_nested_smmu = true;
|
||||
compat_props_add(mc->compat_props, hw_compat_rhel_9_8, hw_compat_rhel_9_8_len);
|
||||
}
|
||||
-DEFINE_VIRT_MACHINE_AS_LATEST(9, 6, 0)
|
||||
+DEFINE_VIRT_MACHINE(9, 6, 0)
|
||||
|
||||
static void virt_rhel_machine_9_4_0_options(MachineClass *mc)
|
||||
{
|
||||
@ -1,90 +0,0 @@
|
||||
From d6a415e7a62ca1bc21f1833f4251f512b2072a93 Mon Sep 17 00:00:00 2001
|
||||
From: Shaoqin Huang <shahuang@redhat.com>
|
||||
Date: Wed, 22 May 2024 03:23:28 -0400
|
||||
Subject: hw/arm/virt: Fix Manufacturer and Product Name in emulated SMBIOS
|
||||
mode
|
||||
|
||||
Status: RHEL-only
|
||||
|
||||
In vm, when run 'dmidecode -t system', it outputs different Manufacturer
|
||||
and Product Name on x86_64 and aarch64 system. For example:
|
||||
|
||||
For aarch64 vm:
|
||||
Manufacturer: QEMU
|
||||
Product Name: KVM Virtual Machine
|
||||
|
||||
For x86_64 vm:
|
||||
Manufacturer: Red Hat
|
||||
Product Name: KVM
|
||||
|
||||
Fixing this issue by changing Manufacturer to 'Red Hat' and Product
|
||||
Name to 'KVM' on aarch64 platform. Thus the output is aligned on both
|
||||
x86_64 and aarch64 platform.
|
||||
|
||||
To keep the compatability, this only apply for the RHEL9.6 machine
|
||||
type. For RHEL9.4 machine type, it still keep the old Manufacturer and
|
||||
Product Name.
|
||||
|
||||
Signed-off-by: Shaoqin Huang <shahuang@redhat.com>
|
||||
---
|
||||
hw/arm/virt.c | 14 ++++++++++++--
|
||||
include/hw/arm/virt.h | 1 +
|
||||
2 files changed, 13 insertions(+), 2 deletions(-)
|
||||
|
||||
diff --git a/hw/arm/virt.c b/hw/arm/virt.c
|
||||
index bf05499a12..c50bff2a6c 100644
|
||||
--- a/hw/arm/virt.c
|
||||
+++ b/hw/arm/virt.c
|
||||
@@ -1711,14 +1711,21 @@ static void virt_build_smbios(VirtMachineState *vms)
|
||||
uint8_t *smbios_tables, *smbios_anchor;
|
||||
size_t smbios_tables_len, smbios_anchor_len;
|
||||
struct smbios_phys_mem_area mem_array;
|
||||
+ const char *manufacturer = "QEMU";
|
||||
const char *product = "QEMU Virtual Machine";
|
||||
+ const char *version = vmc->smbios_old_sys_ver ? "1.0" : mc->name;
|
||||
|
||||
if (kvm_enabled()) {
|
||||
product = "KVM Virtual Machine";
|
||||
}
|
||||
|
||||
- smbios_set_defaults("QEMU", product,
|
||||
- vmc->smbios_old_sys_ver ? "1.0" : mc->name,
|
||||
+ if (!vmc->manufacturer_product_compat) {
|
||||
+ manufacturer = "Red Hat";
|
||||
+ product = "KVM";
|
||||
+ version = mc->desc;
|
||||
+ }
|
||||
+
|
||||
+ smbios_set_defaults(manufacturer, product, version,
|
||||
NULL, NULL);
|
||||
|
||||
/* build the array of physical mem area from base_memmap */
|
||||
@@ -3587,10 +3594,13 @@ DEFINE_VIRT_MACHINE_AS_LATEST(9, 6, 0)
|
||||
|
||||
static void virt_rhel_machine_9_4_0_options(MachineClass *mc)
|
||||
{
|
||||
+ VirtMachineClass *vmc = VIRT_MACHINE_CLASS(OBJECT_CLASS(mc));
|
||||
+
|
||||
virt_rhel_machine_9_6_0_options(mc);
|
||||
|
||||
/* From virt_machine_9_0_options() */
|
||||
mc->smbios_memory_device_size = 16 * GiB;
|
||||
+ vmc->manufacturer_product_compat = true;
|
||||
|
||||
compat_props_add(mc->compat_props, hw_compat_rhel_9_6, hw_compat_rhel_9_6_len);
|
||||
compat_props_add(mc->compat_props, hw_compat_rhel_9_5, hw_compat_rhel_9_5_len);
|
||||
diff --git a/include/hw/arm/virt.h b/include/hw/arm/virt.h
|
||||
index a4d937ed45..2fc30a7626 100644
|
||||
--- a/include/hw/arm/virt.h
|
||||
+++ b/include/hw/arm/virt.h
|
||||
@@ -134,6 +134,7 @@ struct VirtMachineClass {
|
||||
bool no_cpu_topology;
|
||||
bool no_tcg_lpa2;
|
||||
bool no_ns_el2_virt_timer_irq;
|
||||
+ bool manufacturer_product_compat;
|
||||
};
|
||||
|
||||
struct VirtMachineState {
|
||||
--
|
||||
2.39.3
|
||||
|
||||
@ -1,38 +0,0 @@
|
||||
From 0608561efc441f234d9aaf45f1867ffb5c43cffe Mon Sep 17 00:00:00 2001
|
||||
From: John Allen <john.allen@amd.com>
|
||||
Date: Wed, 11 Jun 2025 15:41:14 -0500
|
||||
Subject: [PATCH 26/57] Enable amd-iommu device
|
||||
|
||||
RH-Author: John Allen <None>
|
||||
RH-MergeRequest: 380: Add ability to manually specify the AMDVI-PCI device
|
||||
RH-Jira: RHEL-70925
|
||||
RH-Acked-by: Miroslav Rezanina <mrezanin@redhat.com>
|
||||
RH-Commit: [3/3] 852500a18275e14bcd94d598ccd0ee33b76578dc (johnalle/qemu-kvm-fork)
|
||||
|
||||
Now that the amdvi-pci device that amd-iommu creates can be specified
|
||||
manually, amd-iommu device can be enabled.
|
||||
|
||||
JIRA: https://issues.redhat.com/browse/RHEL-70925
|
||||
|
||||
Upstream: RHEL ONLY
|
||||
|
||||
Signed-off-by: John Allen <johnalle@redhat.com>
|
||||
---
|
||||
configs/devices/x86_64-softmmu/x86_64-rh-devices.mak | 1 +
|
||||
1 file changed, 1 insertion(+)
|
||||
|
||||
diff --git a/configs/devices/x86_64-softmmu/x86_64-rh-devices.mak b/configs/devices/x86_64-softmmu/x86_64-rh-devices.mak
|
||||
index 3e5f693b62..2b15fdc2db 100644
|
||||
--- a/configs/devices/x86_64-softmmu/x86_64-rh-devices.mak
|
||||
+++ b/configs/devices/x86_64-softmmu/x86_64-rh-devices.mak
|
||||
@@ -97,6 +97,7 @@ CONFIG_VIRTIO_MEM=y
|
||||
CONFIG_VIRTIO_PCI=y
|
||||
CONFIG_VIRTIO_VGA=y
|
||||
CONFIG_VIRTIO_IOMMU=y
|
||||
+CONFIG_AMD_IOMMU=y
|
||||
CONFIG_VMMOUSE=y
|
||||
CONFIG_VMPORT=y
|
||||
CONFIG_VTD=y
|
||||
--
|
||||
2.39.3
|
||||
|
||||
@ -1,49 +0,0 @@
|
||||
From f9dfed0e5fd03ee6fa7364801db7d101bf085a79 Mon Sep 17 00:00:00 2001
|
||||
From: Peter Xu <peterx@redhat.com>
|
||||
Date: Tue, 17 Sep 2024 12:38:33 -0400
|
||||
Subject: [PATCH 6/9] KVM: Define KVM_MEMSLOTS_NUM_MAX_DEFAULT
|
||||
|
||||
RH-Author: Peter Xu <peterx@redhat.com>
|
||||
RH-MergeRequest: 284: KVM: Dynamic sized kvm memslots array
|
||||
RH-Jira: RHEL-57682
|
||||
RH-Acked-by: Juraj Marcin <None>
|
||||
RH-Commit: [5/7] c95bdaa406e76b943882fd75c4d345ca5fc397d4 (peterx/qemu-kvm)
|
||||
|
||||
Make the default max nr_slots a macro, it's only used when KVM reports
|
||||
nothing.
|
||||
|
||||
Reviewed-by: David Hildenbrand <david@redhat.com>
|
||||
Signed-off-by: Peter Xu <peterx@redhat.com>
|
||||
Link: https://lore.kernel.org/r/20240917163835.194664-3-peterx@redhat.com
|
||||
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
|
||||
(cherry picked from commit b34a908c8f24eedb0a8e5ff486b059b58fd793f4)
|
||||
Signed-off-by: Peter Xu <peterx@redhat.com>
|
||||
---
|
||||
accel/kvm/kvm-all.c | 4 +++-
|
||||
1 file changed, 3 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/accel/kvm/kvm-all.c b/accel/kvm/kvm-all.c
|
||||
index 44bf4180fa..3900de8883 100644
|
||||
--- a/accel/kvm/kvm-all.c
|
||||
+++ b/accel/kvm/kvm-all.c
|
||||
@@ -71,6 +71,8 @@
|
||||
|
||||
/* Default num of memslots to be allocated when VM starts */
|
||||
#define KVM_MEMSLOTS_NR_ALLOC_DEFAULT 16
|
||||
+/* Default max allowed memslots if kernel reported nothing */
|
||||
+#define KVM_MEMSLOTS_NR_MAX_DEFAULT 32
|
||||
|
||||
struct KVMParkedVcpu {
|
||||
unsigned long vcpu_id;
|
||||
@@ -2617,7 +2619,7 @@ static int kvm_init(MachineState *ms)
|
||||
|
||||
/* If unspecified, use the default value */
|
||||
if (!s->nr_slots) {
|
||||
- s->nr_slots = 32;
|
||||
+ s->nr_slots_max = KVM_MEMSLOTS_NR_MAX_DEFAULT;
|
||||
}
|
||||
|
||||
s->nr_as = kvm_check_extension(s, KVM_CAP_MULTI_ADDRESS_SPACE);
|
||||
--
|
||||
2.39.3
|
||||
|
||||
@ -1,250 +0,0 @@
|
||||
From 9813dc1d19a6afedbab382b79e72691190e42fcf Mon Sep 17 00:00:00 2001
|
||||
From: Peter Xu <peterx@redhat.com>
|
||||
Date: Tue, 17 Sep 2024 12:38:32 -0400
|
||||
Subject: [PATCH 5/9] KVM: Dynamic sized kvm memslots array
|
||||
|
||||
RH-Author: Peter Xu <peterx@redhat.com>
|
||||
RH-MergeRequest: 284: KVM: Dynamic sized kvm memslots array
|
||||
RH-Jira: RHEL-57682
|
||||
RH-Acked-by: Juraj Marcin <None>
|
||||
RH-Commit: [4/7] 04d74707873b28a50b1e1bc08e4788c79455518c (peterx/qemu-kvm)
|
||||
|
||||
Zhiyi reported an infinite loop issue in VFIO use case. The cause of that
|
||||
was a separate discussion, however during that I found a regression of
|
||||
dirty sync slowness when profiling.
|
||||
|
||||
Each KVMMemoryListerner maintains an array of kvm memslots. Currently it's
|
||||
statically allocated to be the max supported by the kernel. However after
|
||||
Linux commit 4fc096a99e ("KVM: Raise the maximum number of user memslots"),
|
||||
the max supported memslots reported now grows to some number large enough
|
||||
so that it may not be wise to always statically allocate with the max
|
||||
reported.
|
||||
|
||||
What's worse, QEMU kvm code still walks all the allocated memslots entries
|
||||
to do any form of lookups. It can drastically slow down all memslot
|
||||
operations because each of such loop can run over 32K times on the new
|
||||
kernels.
|
||||
|
||||
Fix this issue by making the memslots to be allocated dynamically.
|
||||
|
||||
Here the initial size was set to 16 because it should cover the basic VM
|
||||
usages, so that the hope is the majority VM use case may not even need to
|
||||
grow at all (e.g. if one starts a VM with ./qemu-system-x86_64 by default
|
||||
it'll consume 9 memslots), however not too large to waste memory.
|
||||
|
||||
There can also be even better way to address this, but so far this is the
|
||||
simplest and should be already better even than before we grow the max
|
||||
supported memslots. For example, in the case of above issue when VFIO was
|
||||
attached on a 32GB system, there are only ~10 memslots used. So it could
|
||||
be good enough as of now.
|
||||
|
||||
In the above VFIO context, measurement shows that the precopy dirty sync
|
||||
shrinked from ~86ms to ~3ms after this patch applied. It should also apply
|
||||
to any KVM enabled VM even without VFIO.
|
||||
|
||||
NOTE: we don't have a FIXES tag for this patch because there's no real
|
||||
commit that regressed this in QEMU. Such behavior existed for a long time,
|
||||
but only start to be a problem when the kernel reports very large
|
||||
nr_slots_max value. However that's pretty common now (the kernel change
|
||||
was merged in 2021) so we attached cc:stable because we'll want this change
|
||||
to be backported to stable branches.
|
||||
|
||||
Cc: qemu-stable <qemu-stable@nongnu.org>
|
||||
Reported-by: Zhiyi Guo <zhguo@redhat.com>
|
||||
Tested-by: Zhiyi Guo <zhguo@redhat.com>
|
||||
Signed-off-by: Peter Xu <peterx@redhat.com>
|
||||
Acked-by: David Hildenbrand <david@redhat.com>
|
||||
Reviewed-by: Fabiano Rosas <farosas@suse.de>
|
||||
Link: https://lore.kernel.org/r/20240917163835.194664-2-peterx@redhat.com
|
||||
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
|
||||
(cherry picked from commit 5504a8126115d173687b37e657312a8ffe29fc0c)
|
||||
Signed-off-by: Peter Xu <peterx@redhat.com>
|
||||
---
|
||||
accel/kvm/kvm-all.c | 87 +++++++++++++++++++++++++++++++++-------
|
||||
accel/kvm/trace-events | 1 +
|
||||
include/sysemu/kvm_int.h | 1 +
|
||||
3 files changed, 74 insertions(+), 15 deletions(-)
|
||||
|
||||
diff --git a/accel/kvm/kvm-all.c b/accel/kvm/kvm-all.c
|
||||
index de709fbc43..44bf4180fa 100644
|
||||
--- a/accel/kvm/kvm-all.c
|
||||
+++ b/accel/kvm/kvm-all.c
|
||||
@@ -69,6 +69,9 @@
|
||||
#define KVM_GUESTDBG_BLOCKIRQ 0
|
||||
#endif
|
||||
|
||||
+/* Default num of memslots to be allocated when VM starts */
|
||||
+#define KVM_MEMSLOTS_NR_ALLOC_DEFAULT 16
|
||||
+
|
||||
struct KVMParkedVcpu {
|
||||
unsigned long vcpu_id;
|
||||
int kvm_fd;
|
||||
@@ -165,6 +168,57 @@ void kvm_resample_fd_notify(int gsi)
|
||||
}
|
||||
}
|
||||
|
||||
+/**
|
||||
+ * kvm_slots_grow(): Grow the slots[] array in the KVMMemoryListener
|
||||
+ *
|
||||
+ * @kml: The KVMMemoryListener* to grow the slots[] array
|
||||
+ * @nr_slots_new: The new size of slots[] array
|
||||
+ *
|
||||
+ * Returns: True if the array grows larger, false otherwise.
|
||||
+ */
|
||||
+static bool kvm_slots_grow(KVMMemoryListener *kml, unsigned int nr_slots_new)
|
||||
+{
|
||||
+ unsigned int i, cur = kml->nr_slots_allocated;
|
||||
+ KVMSlot *slots;
|
||||
+
|
||||
+ if (nr_slots_new > kvm_state->nr_slots) {
|
||||
+ nr_slots_new = kvm_state->nr_slots;
|
||||
+ }
|
||||
+
|
||||
+ if (cur >= nr_slots_new) {
|
||||
+ /* Big enough, no need to grow, or we reached max */
|
||||
+ return false;
|
||||
+ }
|
||||
+
|
||||
+ if (cur == 0) {
|
||||
+ slots = g_new0(KVMSlot, nr_slots_new);
|
||||
+ } else {
|
||||
+ assert(kml->slots);
|
||||
+ slots = g_renew(KVMSlot, kml->slots, nr_slots_new);
|
||||
+ /*
|
||||
+ * g_renew() doesn't initialize extended buffers, however kvm
|
||||
+ * memslots require fields to be zero-initialized. E.g. pointers,
|
||||
+ * memory_size field, etc.
|
||||
+ */
|
||||
+ memset(&slots[cur], 0x0, sizeof(slots[0]) * (nr_slots_new - cur));
|
||||
+ }
|
||||
+
|
||||
+ for (i = cur; i < nr_slots_new; i++) {
|
||||
+ slots[i].slot = i;
|
||||
+ }
|
||||
+
|
||||
+ kml->slots = slots;
|
||||
+ kml->nr_slots_allocated = nr_slots_new;
|
||||
+ trace_kvm_slots_grow(cur, nr_slots_new);
|
||||
+
|
||||
+ return true;
|
||||
+}
|
||||
+
|
||||
+static bool kvm_slots_double(KVMMemoryListener *kml)
|
||||
+{
|
||||
+ return kvm_slots_grow(kml, kml->nr_slots_allocated * 2);
|
||||
+}
|
||||
+
|
||||
unsigned int kvm_get_max_memslots(void)
|
||||
{
|
||||
KVMState *s = KVM_STATE(current_accel());
|
||||
@@ -193,15 +247,26 @@ unsigned int kvm_get_free_memslots(void)
|
||||
/* Called with KVMMemoryListener.slots_lock held */
|
||||
static KVMSlot *kvm_get_free_slot(KVMMemoryListener *kml)
|
||||
{
|
||||
- KVMState *s = kvm_state;
|
||||
+ unsigned int n;
|
||||
int i;
|
||||
|
||||
- for (i = 0; i < s->nr_slots; i++) {
|
||||
+ for (i = 0; i < kml->nr_slots_allocated; i++) {
|
||||
if (kml->slots[i].memory_size == 0) {
|
||||
return &kml->slots[i];
|
||||
}
|
||||
}
|
||||
|
||||
+ /*
|
||||
+ * If no free slots, try to grow first by doubling. Cache the old size
|
||||
+ * here to avoid another round of search: if the grow succeeded, it
|
||||
+ * means slots[] now must have the existing "n" slots occupied,
|
||||
+ * followed by one or more free slots starting from slots[n].
|
||||
+ */
|
||||
+ n = kml->nr_slots_allocated;
|
||||
+ if (kvm_slots_double(kml)) {
|
||||
+ return &kml->slots[n];
|
||||
+ }
|
||||
+
|
||||
return NULL;
|
||||
}
|
||||
|
||||
@@ -222,10 +287,9 @@ static KVMSlot *kvm_lookup_matching_slot(KVMMemoryListener *kml,
|
||||
hwaddr start_addr,
|
||||
hwaddr size)
|
||||
{
|
||||
- KVMState *s = kvm_state;
|
||||
int i;
|
||||
|
||||
- for (i = 0; i < s->nr_slots; i++) {
|
||||
+ for (i = 0; i < kml->nr_slots_allocated; i++) {
|
||||
KVMSlot *mem = &kml->slots[i];
|
||||
|
||||
if (start_addr == mem->start_addr && size == mem->memory_size) {
|
||||
@@ -267,7 +331,7 @@ int kvm_physical_memory_addr_from_host(KVMState *s, void *ram,
|
||||
int i, ret = 0;
|
||||
|
||||
kvm_slots_lock();
|
||||
- for (i = 0; i < s->nr_slots; i++) {
|
||||
+ for (i = 0; i < kml->nr_slots_allocated; i++) {
|
||||
KVMSlot *mem = &kml->slots[i];
|
||||
|
||||
if (ram >= mem->ram && ram < mem->ram + mem->memory_size) {
|
||||
@@ -1071,7 +1135,7 @@ static int kvm_physical_log_clear(KVMMemoryListener *kml,
|
||||
|
||||
kvm_slots_lock();
|
||||
|
||||
- for (i = 0; i < s->nr_slots; i++) {
|
||||
+ for (i = 0; i < kml->nr_slots_allocated; i++) {
|
||||
mem = &kml->slots[i];
|
||||
/* Discard slots that are empty or do not overlap the section */
|
||||
if (!mem->memory_size ||
|
||||
@@ -1719,12 +1783,8 @@ static void kvm_log_sync_global(MemoryListener *l, bool last_stage)
|
||||
/* Flush all kernel dirty addresses into KVMSlot dirty bitmap */
|
||||
kvm_dirty_ring_flush();
|
||||
|
||||
- /*
|
||||
- * TODO: make this faster when nr_slots is big while there are
|
||||
- * only a few used slots (small VMs).
|
||||
- */
|
||||
kvm_slots_lock();
|
||||
- for (i = 0; i < s->nr_slots; i++) {
|
||||
+ for (i = 0; i < kml->nr_slots_allocated; i++) {
|
||||
mem = &kml->slots[i];
|
||||
if (mem->memory_size && mem->flags & KVM_MEM_LOG_DIRTY_PAGES) {
|
||||
kvm_slot_sync_dirty_pages(mem);
|
||||
@@ -1839,12 +1899,9 @@ void kvm_memory_listener_register(KVMState *s, KVMMemoryListener *kml,
|
||||
{
|
||||
int i;
|
||||
|
||||
- kml->slots = g_new0(KVMSlot, s->nr_slots);
|
||||
kml->as_id = as_id;
|
||||
|
||||
- for (i = 0; i < s->nr_slots; i++) {
|
||||
- kml->slots[i].slot = i;
|
||||
- }
|
||||
+ kvm_slots_grow(kml, KVM_MEMSLOTS_NR_ALLOC_DEFAULT);
|
||||
|
||||
QSIMPLEQ_INIT(&kml->transaction_add);
|
||||
QSIMPLEQ_INIT(&kml->transaction_del);
|
||||
diff --git a/accel/kvm/trace-events b/accel/kvm/trace-events
|
||||
index 37626c1ac5..ad2ae6fca5 100644
|
||||
--- a/accel/kvm/trace-events
|
||||
+++ b/accel/kvm/trace-events
|
||||
@@ -36,3 +36,4 @@ kvm_io_window_exit(void) ""
|
||||
kvm_run_exit_system_event(int cpu_index, uint32_t event_type) "cpu_index %d, system_even_type %"PRIu32
|
||||
kvm_convert_memory(uint64_t start, uint64_t size, const char *msg) "start 0x%" PRIx64 " size 0x%" PRIx64 " %s"
|
||||
kvm_memory_fault(uint64_t start, uint64_t size, uint64_t flags) "start 0x%" PRIx64 " size 0x%" PRIx64 " flags 0x%" PRIx64
|
||||
+kvm_slots_grow(unsigned int old, unsigned int new) "%u -> %u"
|
||||
diff --git a/include/sysemu/kvm_int.h b/include/sysemu/kvm_int.h
|
||||
index 1d8fb1473b..48e496b3d4 100644
|
||||
--- a/include/sysemu/kvm_int.h
|
||||
+++ b/include/sysemu/kvm_int.h
|
||||
@@ -46,6 +46,7 @@ typedef struct KVMMemoryListener {
|
||||
MemoryListener listener;
|
||||
KVMSlot *slots;
|
||||
unsigned int nr_used_slots;
|
||||
+ unsigned int nr_slots_allocated;
|
||||
int as_id;
|
||||
QSIMPLEQ_HEAD(, KVMMemoryUpdate) transaction_add;
|
||||
QSIMPLEQ_HEAD(, KVMMemoryUpdate) transaction_del;
|
||||
--
|
||||
2.39.3
|
||||
|
||||
@ -1,72 +0,0 @@
|
||||
From 6c0a0d9734c507af2c84aa33eb1624f35e1f51fb Mon Sep 17 00:00:00 2001
|
||||
From: Peter Xu <peterx@redhat.com>
|
||||
Date: Tue, 17 Sep 2024 12:38:34 -0400
|
||||
Subject: [PATCH 7/9] KVM: Rename KVMMemoryListener.nr_used_slots to
|
||||
nr_slots_used
|
||||
|
||||
RH-Author: Peter Xu <peterx@redhat.com>
|
||||
RH-MergeRequest: 284: KVM: Dynamic sized kvm memslots array
|
||||
RH-Jira: RHEL-57682
|
||||
RH-Acked-by: Juraj Marcin <None>
|
||||
RH-Commit: [6/7] 74e9576751e0adeb8113a5e8e495b4b1285b0d76 (peterx/qemu-kvm)
|
||||
|
||||
This will make all nr_slots counters to be named in the same manner.
|
||||
|
||||
Reviewed-by: David Hildenbrand <david@redhat.com>
|
||||
Signed-off-by: Peter Xu <peterx@redhat.com>
|
||||
Link: https://lore.kernel.org/r/20240917163835.194664-4-peterx@redhat.com
|
||||
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
|
||||
(cherry picked from commit dbdc00ba5b136bba80d850f61cc79a9cafaae1cd)
|
||||
Signed-off-by: Peter Xu <peterx@redhat.com>
|
||||
---
|
||||
accel/kvm/kvm-all.c | 6 +++---
|
||||
include/sysemu/kvm_int.h | 2 +-
|
||||
2 files changed, 4 insertions(+), 4 deletions(-)
|
||||
|
||||
diff --git a/accel/kvm/kvm-all.c b/accel/kvm/kvm-all.c
|
||||
index 3900de8883..e414d015c9 100644
|
||||
--- a/accel/kvm/kvm-all.c
|
||||
+++ b/accel/kvm/kvm-all.c
|
||||
@@ -239,7 +239,7 @@ unsigned int kvm_get_free_memslots(void)
|
||||
if (!s->as[i].ml) {
|
||||
continue;
|
||||
}
|
||||
- used_slots = MAX(used_slots, s->as[i].ml->nr_used_slots);
|
||||
+ used_slots = MAX(used_slots, s->as[i].ml->nr_slots_used);
|
||||
}
|
||||
kvm_slots_unlock();
|
||||
|
||||
@@ -1516,7 +1516,7 @@ static void kvm_set_phys_mem(KVMMemoryListener *kml,
|
||||
}
|
||||
start_addr += slot_size;
|
||||
size -= slot_size;
|
||||
- kml->nr_used_slots--;
|
||||
+ kml->nr_slots_used--;
|
||||
} while (size);
|
||||
return;
|
||||
}
|
||||
@@ -1555,7 +1555,7 @@ static void kvm_set_phys_mem(KVMMemoryListener *kml,
|
||||
ram_start_offset += slot_size;
|
||||
ram += slot_size;
|
||||
size -= slot_size;
|
||||
- kml->nr_used_slots++;
|
||||
+ kml->nr_slots_used++;
|
||||
} while (size);
|
||||
}
|
||||
|
||||
diff --git a/include/sysemu/kvm_int.h b/include/sysemu/kvm_int.h
|
||||
index 48e496b3d4..b705dfc9b4 100644
|
||||
--- a/include/sysemu/kvm_int.h
|
||||
+++ b/include/sysemu/kvm_int.h
|
||||
@@ -45,7 +45,7 @@ typedef struct KVMMemoryUpdate {
|
||||
typedef struct KVMMemoryListener {
|
||||
MemoryListener listener;
|
||||
KVMSlot *slots;
|
||||
- unsigned int nr_used_slots;
|
||||
+ unsigned int nr_slots_used;
|
||||
unsigned int nr_slots_allocated;
|
||||
int as_id;
|
||||
QSIMPLEQ_HEAD(, KVMMemoryUpdate) transaction_add;
|
||||
--
|
||||
2.39.3
|
||||
|
||||
@ -1,89 +0,0 @@
|
||||
From 5b731abd3a932fe9a21f83f3849a3b3769906e19 Mon Sep 17 00:00:00 2001
|
||||
From: Peter Xu <peterx@redhat.com>
|
||||
Date: Tue, 17 Sep 2024 12:38:35 -0400
|
||||
Subject: [PATCH 8/9] KVM: Rename KVMState->nr_slots to nr_slots_max
|
||||
|
||||
RH-Author: Peter Xu <peterx@redhat.com>
|
||||
RH-MergeRequest: 284: KVM: Dynamic sized kvm memslots array
|
||||
RH-Jira: RHEL-57682
|
||||
RH-Acked-by: Juraj Marcin <None>
|
||||
RH-Commit: [7/7] 43471483e7380119ba6415bff6d8ee6c69aa9cd7 (peterx/qemu-kvm)
|
||||
|
||||
This value used to reflect the maximum supported memslots from KVM kernel.
|
||||
Rename it to be clearer.
|
||||
|
||||
Reviewed-by: David Hildenbrand <david@redhat.com>
|
||||
Signed-off-by: Peter Xu <peterx@redhat.com>
|
||||
Link: https://lore.kernel.org/r/20240917163835.194664-5-peterx@redhat.com
|
||||
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
|
||||
(cherry picked from commit 943c742868c739c0b14fd996bad3adf744156fec)
|
||||
Signed-off-by: Peter Xu <peterx@redhat.com>
|
||||
---
|
||||
accel/kvm/kvm-all.c | 12 ++++++------
|
||||
include/sysemu/kvm_int.h | 4 ++--
|
||||
2 files changed, 8 insertions(+), 8 deletions(-)
|
||||
|
||||
diff --git a/accel/kvm/kvm-all.c b/accel/kvm/kvm-all.c
|
||||
index e414d015c9..49dedda47e 100644
|
||||
--- a/accel/kvm/kvm-all.c
|
||||
+++ b/accel/kvm/kvm-all.c
|
||||
@@ -183,8 +183,8 @@ static bool kvm_slots_grow(KVMMemoryListener *kml, unsigned int nr_slots_new)
|
||||
unsigned int i, cur = kml->nr_slots_allocated;
|
||||
KVMSlot *slots;
|
||||
|
||||
- if (nr_slots_new > kvm_state->nr_slots) {
|
||||
- nr_slots_new = kvm_state->nr_slots;
|
||||
+ if (nr_slots_new > kvm_state->nr_slots_max) {
|
||||
+ nr_slots_new = kvm_state->nr_slots_max;
|
||||
}
|
||||
|
||||
if (cur >= nr_slots_new) {
|
||||
@@ -225,7 +225,7 @@ unsigned int kvm_get_max_memslots(void)
|
||||
{
|
||||
KVMState *s = KVM_STATE(current_accel());
|
||||
|
||||
- return s->nr_slots;
|
||||
+ return s->nr_slots_max;
|
||||
}
|
||||
|
||||
unsigned int kvm_get_free_memslots(void)
|
||||
@@ -243,7 +243,7 @@ unsigned int kvm_get_free_memslots(void)
|
||||
}
|
||||
kvm_slots_unlock();
|
||||
|
||||
- return s->nr_slots - used_slots;
|
||||
+ return s->nr_slots_max - used_slots;
|
||||
}
|
||||
|
||||
/* Called with KVMMemoryListener.slots_lock held */
|
||||
@@ -2615,10 +2615,10 @@ static int kvm_init(MachineState *ms)
|
||||
(kvm_supported_memory_attributes & KVM_MEMORY_ATTRIBUTE_PRIVATE);
|
||||
|
||||
kvm_immediate_exit = kvm_check_extension(s, KVM_CAP_IMMEDIATE_EXIT);
|
||||
- s->nr_slots = kvm_check_extension(s, KVM_CAP_NR_MEMSLOTS);
|
||||
+ s->nr_slots_max = kvm_check_extension(s, KVM_CAP_NR_MEMSLOTS);
|
||||
|
||||
/* If unspecified, use the default value */
|
||||
- if (!s->nr_slots) {
|
||||
+ if (!s->nr_slots_max) {
|
||||
s->nr_slots_max = KVM_MEMSLOTS_NR_MAX_DEFAULT;
|
||||
}
|
||||
|
||||
diff --git a/include/sysemu/kvm_int.h b/include/sysemu/kvm_int.h
|
||||
index b705dfc9b4..2c57194b6b 100644
|
||||
--- a/include/sysemu/kvm_int.h
|
||||
+++ b/include/sysemu/kvm_int.h
|
||||
@@ -103,8 +103,8 @@ struct KVMDirtyRingReaper {
|
||||
struct KVMState
|
||||
{
|
||||
AccelState parent_obj;
|
||||
-
|
||||
- int nr_slots;
|
||||
+ /* Max number of KVM slots supported */
|
||||
+ int nr_slots_max;
|
||||
int fd;
|
||||
int vmfd;
|
||||
int coalesced_mmio;
|
||||
--
|
||||
2.39.3
|
||||
|
||||
@ -1,143 +0,0 @@
|
||||
From e27a9d1e5194243084efe4405fe50463442f0fe3 Mon Sep 17 00:00:00 2001
|
||||
From: Ani Sinha <anisinha@redhat.com>
|
||||
Date: Thu, 12 Sep 2024 11:48:38 +0530
|
||||
Subject: [PATCH 4/9] accel/kvm: refactor dirty ring setup
|
||||
|
||||
RH-Author: Peter Xu <peterx@redhat.com>
|
||||
RH-MergeRequest: 284: KVM: Dynamic sized kvm memslots array
|
||||
RH-Jira: RHEL-57682
|
||||
RH-Acked-by: Juraj Marcin <None>
|
||||
RH-Commit: [3/7] 226ae9826237887fc55f75b9175524f12b4fa4a9 (peterx/qemu-kvm)
|
||||
|
||||
Refactor setting up of dirty ring code in kvm_init() so that is can be
|
||||
reused in the future patchsets.
|
||||
|
||||
Signed-off-by: Ani Sinha <anisinha@redhat.com>
|
||||
Link: https://lore.kernel.org/r/20240912061838.4501-1-anisinha@redhat.com
|
||||
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
|
||||
(cherry picked from commit 28ed7f9761eb273e7dedcfdc0507d158106d0451)
|
||||
Signed-off-by: Peter Xu <peterx@redhat.com>
|
||||
---
|
||||
accel/kvm/kvm-all.c | 88 +++++++++++++++++++++++++--------------------
|
||||
1 file changed, 50 insertions(+), 38 deletions(-)
|
||||
|
||||
diff --git a/accel/kvm/kvm-all.c b/accel/kvm/kvm-all.c
|
||||
index 4f96d8b45e..de709fbc43 100644
|
||||
--- a/accel/kvm/kvm-all.c
|
||||
+++ b/accel/kvm/kvm-all.c
|
||||
@@ -2439,6 +2439,55 @@ static int find_kvm_machine_type(MachineState *ms)
|
||||
return type;
|
||||
}
|
||||
|
||||
+static int kvm_setup_dirty_ring(KVMState *s)
|
||||
+{
|
||||
+ uint64_t dirty_log_manual_caps;
|
||||
+ int ret;
|
||||
+
|
||||
+ /*
|
||||
+ * Enable KVM dirty ring if supported, otherwise fall back to
|
||||
+ * dirty logging mode
|
||||
+ */
|
||||
+ ret = kvm_dirty_ring_init(s);
|
||||
+ if (ret < 0) {
|
||||
+ return ret;
|
||||
+ }
|
||||
+
|
||||
+ /*
|
||||
+ * KVM_CAP_MANUAL_DIRTY_LOG_PROTECT2 is not needed when dirty ring is
|
||||
+ * enabled. More importantly, KVM_DIRTY_LOG_INITIALLY_SET will assume no
|
||||
+ * page is wr-protected initially, which is against how kvm dirty ring is
|
||||
+ * usage - kvm dirty ring requires all pages are wr-protected at the very
|
||||
+ * beginning. Enabling this feature for dirty ring causes data corruption.
|
||||
+ *
|
||||
+ * TODO: Without KVM_CAP_MANUAL_DIRTY_LOG_PROTECT2 and kvm clear dirty log,
|
||||
+ * we may expect a higher stall time when starting the migration. In the
|
||||
+ * future we can enable KVM_CLEAR_DIRTY_LOG to work with dirty ring too:
|
||||
+ * instead of clearing dirty bit, it can be a way to explicitly wr-protect
|
||||
+ * guest pages.
|
||||
+ */
|
||||
+ if (!s->kvm_dirty_ring_size) {
|
||||
+ dirty_log_manual_caps =
|
||||
+ kvm_check_extension(s, KVM_CAP_MANUAL_DIRTY_LOG_PROTECT2);
|
||||
+ dirty_log_manual_caps &= (KVM_DIRTY_LOG_MANUAL_PROTECT_ENABLE |
|
||||
+ KVM_DIRTY_LOG_INITIALLY_SET);
|
||||
+ s->manual_dirty_log_protect = dirty_log_manual_caps;
|
||||
+ if (dirty_log_manual_caps) {
|
||||
+ ret = kvm_vm_enable_cap(s, KVM_CAP_MANUAL_DIRTY_LOG_PROTECT2, 0,
|
||||
+ dirty_log_manual_caps);
|
||||
+ if (ret) {
|
||||
+ warn_report("Trying to enable capability %"PRIu64" of "
|
||||
+ "KVM_CAP_MANUAL_DIRTY_LOG_PROTECT2 but failed. "
|
||||
+ "Falling back to the legacy mode. ",
|
||||
+ dirty_log_manual_caps);
|
||||
+ s->manual_dirty_log_protect = 0;
|
||||
+ }
|
||||
+ }
|
||||
+ }
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
static int kvm_init(MachineState *ms)
|
||||
{
|
||||
MachineClass *mc = MACHINE_GET_CLASS(ms);
|
||||
@@ -2458,7 +2507,6 @@ static int kvm_init(MachineState *ms)
|
||||
const KVMCapabilityInfo *missing_cap;
|
||||
int ret;
|
||||
int type;
|
||||
- uint64_t dirty_log_manual_caps;
|
||||
|
||||
qemu_mutex_init(&kml_slots_lock);
|
||||
|
||||
@@ -2570,47 +2618,11 @@ static int kvm_init(MachineState *ms)
|
||||
s->coalesced_pio = s->coalesced_mmio &&
|
||||
kvm_check_extension(s, KVM_CAP_COALESCED_PIO);
|
||||
|
||||
- /*
|
||||
- * Enable KVM dirty ring if supported, otherwise fall back to
|
||||
- * dirty logging mode
|
||||
- */
|
||||
- ret = kvm_dirty_ring_init(s);
|
||||
+ ret = kvm_setup_dirty_ring(s);
|
||||
if (ret < 0) {
|
||||
goto err;
|
||||
}
|
||||
|
||||
- /*
|
||||
- * KVM_CAP_MANUAL_DIRTY_LOG_PROTECT2 is not needed when dirty ring is
|
||||
- * enabled. More importantly, KVM_DIRTY_LOG_INITIALLY_SET will assume no
|
||||
- * page is wr-protected initially, which is against how kvm dirty ring is
|
||||
- * usage - kvm dirty ring requires all pages are wr-protected at the very
|
||||
- * beginning. Enabling this feature for dirty ring causes data corruption.
|
||||
- *
|
||||
- * TODO: Without KVM_CAP_MANUAL_DIRTY_LOG_PROTECT2 and kvm clear dirty log,
|
||||
- * we may expect a higher stall time when starting the migration. In the
|
||||
- * future we can enable KVM_CLEAR_DIRTY_LOG to work with dirty ring too:
|
||||
- * instead of clearing dirty bit, it can be a way to explicitly wr-protect
|
||||
- * guest pages.
|
||||
- */
|
||||
- if (!s->kvm_dirty_ring_size) {
|
||||
- dirty_log_manual_caps =
|
||||
- kvm_check_extension(s, KVM_CAP_MANUAL_DIRTY_LOG_PROTECT2);
|
||||
- dirty_log_manual_caps &= (KVM_DIRTY_LOG_MANUAL_PROTECT_ENABLE |
|
||||
- KVM_DIRTY_LOG_INITIALLY_SET);
|
||||
- s->manual_dirty_log_protect = dirty_log_manual_caps;
|
||||
- if (dirty_log_manual_caps) {
|
||||
- ret = kvm_vm_enable_cap(s, KVM_CAP_MANUAL_DIRTY_LOG_PROTECT2, 0,
|
||||
- dirty_log_manual_caps);
|
||||
- if (ret) {
|
||||
- warn_report("Trying to enable capability %"PRIu64" of "
|
||||
- "KVM_CAP_MANUAL_DIRTY_LOG_PROTECT2 but failed. "
|
||||
- "Falling back to the legacy mode. ",
|
||||
- dirty_log_manual_caps);
|
||||
- s->manual_dirty_log_protect = 0;
|
||||
- }
|
||||
- }
|
||||
- }
|
||||
-
|
||||
#ifdef KVM_CAP_VCPU_EVENTS
|
||||
s->vcpu_events = kvm_check_extension(s, KVM_CAP_VCPU_EVENTS);
|
||||
#endif
|
||||
--
|
||||
2.39.3
|
||||
|
||||
@ -1,141 +0,0 @@
|
||||
From 4114553452f7187283aefa001bc8342fc65b6b72 Mon Sep 17 00:00:00 2001
|
||||
From: John Allen <john.allen@amd.com>
|
||||
Date: Wed, 11 Dec 2024 15:06:48 -0600
|
||||
Subject: [PATCH 04/57] amd_iommu: Add support for pass though mode
|
||||
|
||||
RH-Author: John Allen <None>
|
||||
RH-MergeRequest: 303: Interrupt Remap support for emulated amd viommu
|
||||
RH-Jira: RHEL-66202
|
||||
RH-Acked-by: Miroslav Rezanina <mrezanin@redhat.com>
|
||||
RH-Commit: [2/5] 0434fefd554baf27fb9d93026af513c621f8cdb0 (johnalle/qemu-kvm-fork)
|
||||
|
||||
JIRA: https://issues.redhat.com/browse/RHEL-66202
|
||||
|
||||
commit c1f46999ef506d9854534560a94d02cf3cf9edd1
|
||||
Author: Suravee Suthikulpanit <suravee.suthikulpanit@amd.com>
|
||||
Date: Fri Sep 27 12:29:10 2024 -0500
|
||||
|
||||
amd_iommu: Add support for pass though mode
|
||||
|
||||
Introduce 'nodma' shared memory region to support PT mode
|
||||
so that for each device, we only create an alias to shared memory
|
||||
region when DMA-remapping is disabled.
|
||||
|
||||
Reviewed-by: Alejandro Jimenez <alejandro.j.jimenez@oracle.com>
|
||||
Signed-off-by: Suravee Suthikulpanit <suravee.suthikulpanit@amd.com>
|
||||
Signed-off-by: Santosh Shukla <santosh.shukla@amd.com>
|
||||
Message-Id: <20240927172913.121477-3-santosh.shukla@amd.com>
|
||||
Reviewed-by: Michael S. Tsirkin <mst@redhat.com>
|
||||
Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
|
||||
|
||||
Signed-off-by: John Allen <john.allen@amd.com>
|
||||
---
|
||||
hw/i386/amd_iommu.c | 49 ++++++++++++++++++++++++++++++++++++---------
|
||||
hw/i386/amd_iommu.h | 2 ++
|
||||
2 files changed, 42 insertions(+), 9 deletions(-)
|
||||
|
||||
diff --git a/hw/i386/amd_iommu.c b/hw/i386/amd_iommu.c
|
||||
index 148b5ee51d..567cb8adc9 100644
|
||||
--- a/hw/i386/amd_iommu.c
|
||||
+++ b/hw/i386/amd_iommu.c
|
||||
@@ -60,8 +60,9 @@ struct AMDVIAddressSpace {
|
||||
uint8_t bus_num; /* bus number */
|
||||
uint8_t devfn; /* device function */
|
||||
AMDVIState *iommu_state; /* AMDVI - one per machine */
|
||||
- MemoryRegion root; /* AMDVI Root memory map region */
|
||||
+ MemoryRegion root; /* AMDVI Root memory map region */
|
||||
IOMMUMemoryRegion iommu; /* Device's address translation region */
|
||||
+ MemoryRegion iommu_nodma; /* Alias of shared nodma memory region */
|
||||
MemoryRegion iommu_ir; /* Device's interrupt remapping region */
|
||||
AddressSpace as; /* device's corresponding address space */
|
||||
};
|
||||
@@ -1412,6 +1413,7 @@ static AddressSpace *amdvi_host_dma_iommu(PCIBus *bus, void *opaque, int devfn)
|
||||
AMDVIState *s = opaque;
|
||||
AMDVIAddressSpace **iommu_as, *amdvi_dev_as;
|
||||
int bus_num = pci_bus_num(bus);
|
||||
+ X86IOMMUState *x86_iommu = X86_IOMMU_DEVICE(s);
|
||||
|
||||
iommu_as = s->address_spaces[bus_num];
|
||||
|
||||
@@ -1436,13 +1438,13 @@ static AddressSpace *amdvi_host_dma_iommu(PCIBus *bus, void *opaque, int devfn)
|
||||
* Memory region relationships looks like (Address range shows
|
||||
* only lower 32 bits to make it short in length...):
|
||||
*
|
||||
- * |-----------------+-------------------+----------|
|
||||
- * | Name | Address range | Priority |
|
||||
- * |-----------------+-------------------+----------+
|
||||
- * | amdvi_root | 00000000-ffffffff | 0 |
|
||||
- * | amdvi_iommu | 00000000-ffffffff | 1 |
|
||||
- * | amdvi_iommu_ir | fee00000-feefffff | 64 |
|
||||
- * |-----------------+-------------------+----------|
|
||||
+ * |--------------------+-------------------+----------|
|
||||
+ * | Name | Address range | Priority |
|
||||
+ * |--------------------+-------------------+----------+
|
||||
+ * | amdvi-root | 00000000-ffffffff | 0 |
|
||||
+ * | amdvi-iommu_nodma | 00000000-ffffffff | 0 |
|
||||
+ * | amdvi-iommu_ir | fee00000-feefffff | 64 |
|
||||
+ * |--------------------+-------------------+----------|
|
||||
*/
|
||||
memory_region_init_iommu(&amdvi_dev_as->iommu,
|
||||
sizeof(amdvi_dev_as->iommu),
|
||||
@@ -1461,7 +1463,25 @@ static AddressSpace *amdvi_host_dma_iommu(PCIBus *bus, void *opaque, int devfn)
|
||||
64);
|
||||
memory_region_add_subregion_overlap(&amdvi_dev_as->root, 0,
|
||||
MEMORY_REGION(&amdvi_dev_as->iommu),
|
||||
- 1);
|
||||
+ 0);
|
||||
+
|
||||
+ /* Build the DMA Disabled alias to shared memory */
|
||||
+ memory_region_init_alias(&amdvi_dev_as->iommu_nodma, OBJECT(s),
|
||||
+ "amdvi-sys", &s->mr_sys, 0,
|
||||
+ memory_region_size(&s->mr_sys));
|
||||
+ memory_region_add_subregion_overlap(&amdvi_dev_as->root, 0,
|
||||
+ &amdvi_dev_as->iommu_nodma,
|
||||
+ 0);
|
||||
+
|
||||
+ if (!x86_iommu->pt_supported) {
|
||||
+ memory_region_set_enabled(&amdvi_dev_as->iommu_nodma, false);
|
||||
+ memory_region_set_enabled(MEMORY_REGION(&amdvi_dev_as->iommu),
|
||||
+ true);
|
||||
+ } else {
|
||||
+ memory_region_set_enabled(MEMORY_REGION(&amdvi_dev_as->iommu),
|
||||
+ false);
|
||||
+ memory_region_set_enabled(&amdvi_dev_as->iommu_nodma, true);
|
||||
+ }
|
||||
}
|
||||
return &iommu_as[devfn]->as;
|
||||
}
|
||||
@@ -1602,6 +1622,17 @@ static void amdvi_sysbus_realize(DeviceState *dev, Error **errp)
|
||||
"amdvi-mmio", AMDVI_MMIO_SIZE);
|
||||
memory_region_add_subregion(get_system_memory(), AMDVI_BASE_ADDR,
|
||||
&s->mr_mmio);
|
||||
+
|
||||
+ /* Create the share memory regions by all devices */
|
||||
+ memory_region_init(&s->mr_sys, OBJECT(s), "amdvi-sys", UINT64_MAX);
|
||||
+
|
||||
+ /* set up the DMA disabled memory region */
|
||||
+ memory_region_init_alias(&s->mr_nodma, OBJECT(s),
|
||||
+ "amdvi-nodma", get_system_memory(), 0,
|
||||
+ memory_region_size(get_system_memory()));
|
||||
+ memory_region_add_subregion_overlap(&s->mr_sys, 0,
|
||||
+ &s->mr_nodma, 0);
|
||||
+
|
||||
pci_setup_iommu(bus, &amdvi_iommu_ops, s);
|
||||
amdvi_init(s);
|
||||
}
|
||||
diff --git a/hw/i386/amd_iommu.h b/hw/i386/amd_iommu.h
|
||||
index e5c2ae94f2..be417e51c4 100644
|
||||
--- a/hw/i386/amd_iommu.h
|
||||
+++ b/hw/i386/amd_iommu.h
|
||||
@@ -354,6 +354,8 @@ struct AMDVIState {
|
||||
uint32_t pprlog_tail; /* ppr log tail */
|
||||
|
||||
MemoryRegion mr_mmio; /* MMIO region */
|
||||
+ MemoryRegion mr_sys;
|
||||
+ MemoryRegion mr_nodma;
|
||||
uint8_t mmior[AMDVI_MMIO_SIZE]; /* read/write MMIO */
|
||||
uint8_t w1cmask[AMDVI_MMIO_SIZE]; /* read/write 1 clear mask */
|
||||
uint8_t romask[AMDVI_MMIO_SIZE]; /* MMIO read/only mask */
|
||||
--
|
||||
2.39.3
|
||||
|
||||
@ -1,66 +0,0 @@
|
||||
From 0397ebacdba6539147d9986255c3f81cbfdabf1e Mon Sep 17 00:00:00 2001
|
||||
From: John Allen <john.allen@amd.com>
|
||||
Date: Wed, 11 Dec 2024 15:07:03 -0600
|
||||
Subject: [PATCH 07/57] amd_iommu: Check APIC ID > 255 for XTSup
|
||||
|
||||
RH-Author: John Allen <None>
|
||||
RH-MergeRequest: 303: Interrupt Remap support for emulated amd viommu
|
||||
RH-Jira: RHEL-66202
|
||||
RH-Acked-by: Miroslav Rezanina <mrezanin@redhat.com>
|
||||
RH-Commit: [5/5] f39b3e3cdefc2b562f1ad2ef939a37bf404f355a (johnalle/qemu-kvm-fork)
|
||||
|
||||
JIRA: https://issues.redhat.com/browse/RHEL-66202
|
||||
|
||||
commit b12cb3819baf6d9ee8140d4dd6d36fa829e2c6d9
|
||||
Author: Suravee Suthikulpanit <suravee.suthikulpanit@amd.com>
|
||||
Date: Fri Sep 27 12:29:13 2024 -0500
|
||||
|
||||
amd_iommu: Check APIC ID > 255 for XTSup
|
||||
|
||||
The XTSup mode enables x2APIC support for AMD IOMMU, which is needed
|
||||
to support vcpu w/ APIC ID > 255.
|
||||
|
||||
Reviewed-by: Alejandro Jimenez <alejandro.j.jimenez@oracle.com>
|
||||
Signed-off-by: Suravee Suthikulpanit <suravee.suthikulpanit@amd.com>
|
||||
Signed-off-by: Santosh Shukla <santosh.shukla@amd.com>
|
||||
Message-Id: <20240927172913.121477-6-santosh.shukla@amd.com>
|
||||
Reviewed-by: Michael S. Tsirkin <mst@redhat.com>
|
||||
Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
|
||||
|
||||
Signed-off-by: John Allen <john.allen@amd.com>
|
||||
---
|
||||
hw/i386/amd_iommu.c | 11 +++++++++++
|
||||
1 file changed, 11 insertions(+)
|
||||
|
||||
diff --git a/hw/i386/amd_iommu.c b/hw/i386/amd_iommu.c
|
||||
index 82d76dfca9..d804656ea8 100644
|
||||
--- a/hw/i386/amd_iommu.c
|
||||
+++ b/hw/i386/amd_iommu.c
|
||||
@@ -32,6 +32,7 @@
|
||||
#include "trace.h"
|
||||
#include "hw/i386/apic-msidef.h"
|
||||
#include "hw/qdev-properties.h"
|
||||
+#include "kvm/kvm_i386.h"
|
||||
|
||||
/* used AMD-Vi MMIO registers */
|
||||
const char *amdvi_mmio_low[] = {
|
||||
@@ -1651,6 +1652,16 @@ static void amdvi_sysbus_realize(DeviceState *dev, Error **errp)
|
||||
memory_region_add_subregion_overlap(&s->mr_sys, AMDVI_INT_ADDR_FIRST,
|
||||
&s->mr_ir, 1);
|
||||
|
||||
+ /* AMD IOMMU with x2APIC mode requires xtsup=on */
|
||||
+ if (x86ms->apic_id_limit > 255 && !s->xtsup) {
|
||||
+ error_report("AMD IOMMU with x2APIC confguration requires xtsup=on");
|
||||
+ exit(EXIT_FAILURE);
|
||||
+ }
|
||||
+ if (s->xtsup && kvm_irqchip_is_split() && !kvm_enable_x2apic()) {
|
||||
+ error_report("AMD IOMMU xtsup=on requires support on the KVM side");
|
||||
+ exit(EXIT_FAILURE);
|
||||
+ }
|
||||
+
|
||||
pci_setup_iommu(bus, &amdvi_iommu_ops, s);
|
||||
amdvi_init(s);
|
||||
}
|
||||
--
|
||||
2.39.3
|
||||
|
||||
@ -1,94 +0,0 @@
|
||||
From f733325d3d91576ae9f6e341faabc301542fc6c8 Mon Sep 17 00:00:00 2001
|
||||
From: John Allen <john.allen@amd.com>
|
||||
Date: Wed, 11 Dec 2024 15:06:44 -0600
|
||||
Subject: [PATCH 03/57] amd_iommu: Rename variable mmio to mr_mmio
|
||||
|
||||
RH-Author: John Allen <None>
|
||||
RH-MergeRequest: 303: Interrupt Remap support for emulated amd viommu
|
||||
RH-Jira: RHEL-66202
|
||||
RH-Acked-by: Miroslav Rezanina <mrezanin@redhat.com>
|
||||
RH-Commit: [1/5] 1996a48efb7210d4d1e0b929be2d115d672e1a02 (johnalle/qemu-kvm-fork)
|
||||
|
||||
JIRA: https://issues.redhat.com/browse/RHEL-66202
|
||||
|
||||
commit 2e6f051cfc58e69dcb392cd245d8f01b0c2e963f
|
||||
Author: Suravee Suthikulpanit <suravee.suthikulpanit@amd.com>
|
||||
Date: Fri Sep 27 12:29:09 2024 -0500
|
||||
|
||||
amd_iommu: Rename variable mmio to mr_mmio
|
||||
|
||||
Rename the MMIO memory region variable 'mmio' to 'mr_mmio'
|
||||
so to correctly name align with struct AMDVIState::variable type.
|
||||
|
||||
No functional change intended.
|
||||
|
||||
Reviewed-by: Alejandro Jimenez <alejandro.j.jimenez@oracle.com>
|
||||
Signed-off-by: Suravee Suthikulpanit <suravee.suthikulpanit@amd.com>
|
||||
Signed-off-by: Santosh Shukla <santosh.shukla@amd.com>
|
||||
Message-Id: <20240927172913.121477-2-santosh.shukla@amd.com>
|
||||
Reviewed-by: Michael S. Tsirkin <mst@redhat.com>
|
||||
Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
|
||||
|
||||
Signed-off-by: John Allen <john.allen@amd.com>
|
||||
---
|
||||
hw/i386/acpi-build.c | 4 ++--
|
||||
hw/i386/amd_iommu.c | 6 +++---
|
||||
hw/i386/amd_iommu.h | 2 +-
|
||||
3 files changed, 6 insertions(+), 6 deletions(-)
|
||||
|
||||
diff --git a/hw/i386/acpi-build.c b/hw/i386/acpi-build.c
|
||||
index 5d4bd2b710..032fb1f904 100644
|
||||
--- a/hw/i386/acpi-build.c
|
||||
+++ b/hw/i386/acpi-build.c
|
||||
@@ -2397,7 +2397,7 @@ build_amd_iommu(GArray *table_data, BIOSLinker *linker, const char *oem_id,
|
||||
/* Capability offset */
|
||||
build_append_int_noprefix(table_data, s->pci.capab_offset, 2);
|
||||
/* IOMMU base address */
|
||||
- build_append_int_noprefix(table_data, s->mmio.addr, 8);
|
||||
+ build_append_int_noprefix(table_data, s->mr_mmio.addr, 8);
|
||||
/* PCI Segment Group */
|
||||
build_append_int_noprefix(table_data, 0, 2);
|
||||
/* IOMMU info */
|
||||
@@ -2432,7 +2432,7 @@ build_amd_iommu(GArray *table_data, BIOSLinker *linker, const char *oem_id,
|
||||
/* Capability offset */
|
||||
build_append_int_noprefix(table_data, s->pci.capab_offset, 2);
|
||||
/* IOMMU base address */
|
||||
- build_append_int_noprefix(table_data, s->mmio.addr, 8);
|
||||
+ build_append_int_noprefix(table_data, s->mr_mmio.addr, 8);
|
||||
/* PCI Segment Group */
|
||||
build_append_int_noprefix(table_data, 0, 2);
|
||||
/* IOMMU info */
|
||||
diff --git a/hw/i386/amd_iommu.c b/hw/i386/amd_iommu.c
|
||||
index 87643d2891..148b5ee51d 100644
|
||||
--- a/hw/i386/amd_iommu.c
|
||||
+++ b/hw/i386/amd_iommu.c
|
||||
@@ -1598,10 +1598,10 @@ static void amdvi_sysbus_realize(DeviceState *dev, Error **errp)
|
||||
x86ms->ioapic_as = amdvi_host_dma_iommu(bus, s, AMDVI_IOAPIC_SB_DEVID);
|
||||
|
||||
/* set up MMIO */
|
||||
- memory_region_init_io(&s->mmio, OBJECT(s), &mmio_mem_ops, s, "amdvi-mmio",
|
||||
- AMDVI_MMIO_SIZE);
|
||||
+ memory_region_init_io(&s->mr_mmio, OBJECT(s), &mmio_mem_ops, s,
|
||||
+ "amdvi-mmio", AMDVI_MMIO_SIZE);
|
||||
memory_region_add_subregion(get_system_memory(), AMDVI_BASE_ADDR,
|
||||
- &s->mmio);
|
||||
+ &s->mr_mmio);
|
||||
pci_setup_iommu(bus, &amdvi_iommu_ops, s);
|
||||
amdvi_init(s);
|
||||
}
|
||||
diff --git a/hw/i386/amd_iommu.h b/hw/i386/amd_iommu.h
|
||||
index 73619fe9ea..e5c2ae94f2 100644
|
||||
--- a/hw/i386/amd_iommu.h
|
||||
+++ b/hw/i386/amd_iommu.h
|
||||
@@ -353,7 +353,7 @@ struct AMDVIState {
|
||||
uint32_t pprlog_head; /* ppr log head */
|
||||
uint32_t pprlog_tail; /* ppr log tail */
|
||||
|
||||
- MemoryRegion mmio; /* MMIO region */
|
||||
+ MemoryRegion mr_mmio; /* MMIO region */
|
||||
uint8_t mmior[AMDVI_MMIO_SIZE]; /* read/write MMIO */
|
||||
uint8_t w1cmask[AMDVI_MMIO_SIZE]; /* read/write 1 clear mask */
|
||||
uint8_t romask[AMDVI_MMIO_SIZE]; /* MMIO read/only mask */
|
||||
--
|
||||
2.39.3
|
||||
|
||||
@ -1,81 +0,0 @@
|
||||
From 17ce6ac0d8edb04ba79bb39d3f695cd0506a9dc2 Mon Sep 17 00:00:00 2001
|
||||
From: John Allen <john.allen@amd.com>
|
||||
Date: Wed, 11 Dec 2024 15:06:59 -0600
|
||||
Subject: [PATCH 06/57] amd_iommu: Send notification when invalidate interrupt
|
||||
entry cache
|
||||
|
||||
RH-Author: John Allen <None>
|
||||
RH-MergeRequest: 303: Interrupt Remap support for emulated amd viommu
|
||||
RH-Jira: RHEL-66202
|
||||
RH-Acked-by: Miroslav Rezanina <mrezanin@redhat.com>
|
||||
RH-Commit: [4/5] d57e8fb4e69f3c01d32673bf658aae5067d6b969 (johnalle/qemu-kvm-fork)
|
||||
|
||||
JIRA: https://issues.redhat.com/browse/RHEL-66202
|
||||
|
||||
commit f84aad4d718b83d2a4d90485992e5421430032e1
|
||||
Author: Suravee Suthikulpanit <suravee.suthikulpanit@amd.com>
|
||||
Date: Fri Sep 27 12:29:12 2024 -0500
|
||||
|
||||
amd_iommu: Send notification when invalidate interrupt entry cache
|
||||
|
||||
In order to support AMD IOMMU interrupt remapping emulation with PCI
|
||||
pass-through devices, QEMU needs to notify VFIO when guest IOMMU driver
|
||||
updates and invalidate the guest interrupt remapping table (IRT), and
|
||||
communicate information so that the host IOMMU driver can update
|
||||
the shadowed interrupt remapping table in the host IOMMU.
|
||||
|
||||
Therefore, send notification when guest IOMMU emulates the IRT
|
||||
invalidation commands.
|
||||
|
||||
Reviewed-by: Alejandro Jimenez <alejandro.j.jimenez@oracle.com>
|
||||
Signed-off-by: Suravee Suthikulpanit <suravee.suthikulpanit@amd.com>
|
||||
Signed-off-by: Santosh Shukla <santosh.shukla@amd.com>
|
||||
Message-Id: <20240927172913.121477-5-santosh.shukla@amd.com>
|
||||
Reviewed-by: Michael S. Tsirkin <mst@redhat.com>
|
||||
Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
|
||||
|
||||
Signed-off-by: John Allen <john.allen@amd.com>
|
||||
---
|
||||
hw/i386/amd_iommu.c | 12 ++++++++++++
|
||||
1 file changed, 12 insertions(+)
|
||||
|
||||
diff --git a/hw/i386/amd_iommu.c b/hw/i386/amd_iommu.c
|
||||
index 8fcf5eacb4..82d76dfca9 100644
|
||||
--- a/hw/i386/amd_iommu.c
|
||||
+++ b/hw/i386/amd_iommu.c
|
||||
@@ -431,6 +431,12 @@ static void amdvi_complete_ppr(AMDVIState *s, uint64_t *cmd)
|
||||
trace_amdvi_ppr_exec();
|
||||
}
|
||||
|
||||
+static void amdvi_intremap_inval_notify_all(AMDVIState *s, bool global,
|
||||
+ uint32_t index, uint32_t mask)
|
||||
+{
|
||||
+ x86_iommu_iec_notify_all(X86_IOMMU_DEVICE(s), global, index, mask);
|
||||
+}
|
||||
+
|
||||
static void amdvi_inval_all(AMDVIState *s, uint64_t *cmd)
|
||||
{
|
||||
if (extract64(cmd[0], 0, 60) || cmd[1]) {
|
||||
@@ -438,6 +444,9 @@ static void amdvi_inval_all(AMDVIState *s, uint64_t *cmd)
|
||||
s->cmdbuf + s->cmdbuf_head);
|
||||
}
|
||||
|
||||
+ /* Notify global invalidation */
|
||||
+ amdvi_intremap_inval_notify_all(s, true, 0, 0);
|
||||
+
|
||||
amdvi_iotlb_reset(s);
|
||||
trace_amdvi_all_inval();
|
||||
}
|
||||
@@ -486,6 +495,9 @@ static void amdvi_inval_inttable(AMDVIState *s, uint64_t *cmd)
|
||||
return;
|
||||
}
|
||||
|
||||
+ /* Notify global invalidation */
|
||||
+ amdvi_intremap_inval_notify_all(s, true, 0, 0);
|
||||
+
|
||||
trace_amdvi_intr_inval();
|
||||
}
|
||||
|
||||
--
|
||||
2.39.3
|
||||
|
||||
@ -1,105 +0,0 @@
|
||||
From 4859d41adfaae8933e074dcefdc81edd3832c914 Mon Sep 17 00:00:00 2001
|
||||
From: John Allen <john.allen@amd.com>
|
||||
Date: Wed, 11 Dec 2024 15:06:55 -0600
|
||||
Subject: [PATCH 05/57] amd_iommu: Use shared memory region for Interrupt
|
||||
Remapping
|
||||
|
||||
RH-Author: John Allen <None>
|
||||
RH-MergeRequest: 303: Interrupt Remap support for emulated amd viommu
|
||||
RH-Jira: RHEL-66202
|
||||
RH-Acked-by: Miroslav Rezanina <mrezanin@redhat.com>
|
||||
RH-Commit: [3/5] 48c0513c80257bfbd12c2cf3bab2503bd95d0b1c (johnalle/qemu-kvm-fork)
|
||||
|
||||
JIRA: https://issues.redhat.com/browse/RHEL-66202
|
||||
|
||||
commit 9fc9dbac61ddde7d8df37e84c8e02cec249d3222
|
||||
Author: Suravee Suthikulpanit <suravee.suthikulpanit@amd.com>
|
||||
Date: Fri Sep 27 12:29:11 2024 -0500
|
||||
|
||||
amd_iommu: Use shared memory region for Interrupt Remapping
|
||||
|
||||
Use shared memory region for interrupt remapping which can be
|
||||
aliased by all devices.
|
||||
|
||||
Reviewed-by: Alejandro Jimenez <alejandro.j.jimenez@oracle.com>
|
||||
Signed-off-by: Suravee Suthikulpanit <suravee.suthikulpanit@amd.com>
|
||||
Signed-off-by: Santosh Shukla <santosh.shukla@amd.com>
|
||||
Message-Id: <20240927172913.121477-4-santosh.shukla@amd.com>
|
||||
Reviewed-by: Michael S. Tsirkin <mst@redhat.com>
|
||||
Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
|
||||
|
||||
Signed-off-by: John Allen <john.allen@amd.com>
|
||||
---
|
||||
hw/i386/amd_iommu.c | 22 ++++++++++++++--------
|
||||
hw/i386/amd_iommu.h | 1 +
|
||||
2 files changed, 15 insertions(+), 8 deletions(-)
|
||||
|
||||
diff --git a/hw/i386/amd_iommu.c b/hw/i386/amd_iommu.c
|
||||
index 567cb8adc9..8fcf5eacb4 100644
|
||||
--- a/hw/i386/amd_iommu.c
|
||||
+++ b/hw/i386/amd_iommu.c
|
||||
@@ -1443,7 +1443,7 @@ static AddressSpace *amdvi_host_dma_iommu(PCIBus *bus, void *opaque, int devfn)
|
||||
* |--------------------+-------------------+----------+
|
||||
* | amdvi-root | 00000000-ffffffff | 0 |
|
||||
* | amdvi-iommu_nodma | 00000000-ffffffff | 0 |
|
||||
- * | amdvi-iommu_ir | fee00000-feefffff | 64 |
|
||||
+ * | amdvi-iommu_ir | fee00000-feefffff | 1 |
|
||||
* |--------------------+-------------------+----------|
|
||||
*/
|
||||
memory_region_init_iommu(&amdvi_dev_as->iommu,
|
||||
@@ -1454,13 +1454,6 @@ static AddressSpace *amdvi_host_dma_iommu(PCIBus *bus, void *opaque, int devfn)
|
||||
memory_region_init(&amdvi_dev_as->root, OBJECT(s),
|
||||
"amdvi_root", UINT64_MAX);
|
||||
address_space_init(&amdvi_dev_as->as, &amdvi_dev_as->root, name);
|
||||
- memory_region_init_io(&amdvi_dev_as->iommu_ir, OBJECT(s),
|
||||
- &amdvi_ir_ops, s, "amd_iommu_ir",
|
||||
- AMDVI_INT_ADDR_SIZE);
|
||||
- memory_region_add_subregion_overlap(&amdvi_dev_as->root,
|
||||
- AMDVI_INT_ADDR_FIRST,
|
||||
- &amdvi_dev_as->iommu_ir,
|
||||
- 64);
|
||||
memory_region_add_subregion_overlap(&amdvi_dev_as->root, 0,
|
||||
MEMORY_REGION(&amdvi_dev_as->iommu),
|
||||
0);
|
||||
@@ -1472,6 +1465,13 @@ static AddressSpace *amdvi_host_dma_iommu(PCIBus *bus, void *opaque, int devfn)
|
||||
memory_region_add_subregion_overlap(&amdvi_dev_as->root, 0,
|
||||
&amdvi_dev_as->iommu_nodma,
|
||||
0);
|
||||
+ /* Build the Interrupt Remapping alias to shared memory */
|
||||
+ memory_region_init_alias(&amdvi_dev_as->iommu_ir, OBJECT(s),
|
||||
+ "amdvi-ir", &s->mr_ir, 0,
|
||||
+ memory_region_size(&s->mr_ir));
|
||||
+ memory_region_add_subregion_overlap(MEMORY_REGION(&amdvi_dev_as->iommu),
|
||||
+ AMDVI_INT_ADDR_FIRST,
|
||||
+ &amdvi_dev_as->iommu_ir, 1);
|
||||
|
||||
if (!x86_iommu->pt_supported) {
|
||||
memory_region_set_enabled(&amdvi_dev_as->iommu_nodma, false);
|
||||
@@ -1633,6 +1633,12 @@ static void amdvi_sysbus_realize(DeviceState *dev, Error **errp)
|
||||
memory_region_add_subregion_overlap(&s->mr_sys, 0,
|
||||
&s->mr_nodma, 0);
|
||||
|
||||
+ /* set up the Interrupt Remapping memory region */
|
||||
+ memory_region_init_io(&s->mr_ir, OBJECT(s), &amdvi_ir_ops,
|
||||
+ s, "amdvi-ir", AMDVI_INT_ADDR_SIZE);
|
||||
+ memory_region_add_subregion_overlap(&s->mr_sys, AMDVI_INT_ADDR_FIRST,
|
||||
+ &s->mr_ir, 1);
|
||||
+
|
||||
pci_setup_iommu(bus, &amdvi_iommu_ops, s);
|
||||
amdvi_init(s);
|
||||
}
|
||||
diff --git a/hw/i386/amd_iommu.h b/hw/i386/amd_iommu.h
|
||||
index be417e51c4..e0dac4d9a9 100644
|
||||
--- a/hw/i386/amd_iommu.h
|
||||
+++ b/hw/i386/amd_iommu.h
|
||||
@@ -356,6 +356,7 @@ struct AMDVIState {
|
||||
MemoryRegion mr_mmio; /* MMIO region */
|
||||
MemoryRegion mr_sys;
|
||||
MemoryRegion mr_nodma;
|
||||
+ MemoryRegion mr_ir;
|
||||
uint8_t mmior[AMDVI_MMIO_SIZE]; /* read/write MMIO */
|
||||
uint8_t w1cmask[AMDVI_MMIO_SIZE]; /* read/write 1 clear mask */
|
||||
uint8_t romask[AMDVI_MMIO_SIZE]; /* MMIO read/only mask */
|
||||
--
|
||||
2.39.3
|
||||
|
||||
@ -1,53 +0,0 @@
|
||||
From 173beb6698538dcffefab36772e107ffb0b4fbbd Mon Sep 17 00:00:00 2001
|
||||
From: Shaoqin Huang <shahuang@redhat.com>
|
||||
Date: Mon, 28 Apr 2025 04:34:27 -0400
|
||||
Subject: [PATCH 2/5] arm: Use arm_virt_compat_set() to apply the compat
|
||||
|
||||
RH-Author: Shaoqin Huang <shahuang@redhat.com>
|
||||
RH-MergeRequest: 353: virtio-net: disable USO for virt-rhel9.6
|
||||
RH-Jira: RHEL-80313
|
||||
RH-Acked-by: Thomas Huth <thuth@redhat.com>
|
||||
RH-Acked-by: Eric Auger <eric.auger@redhat.com>
|
||||
RH-Commit: [2/2] 6e7a158e65296928040e70622b3cee59e45c1c36 (shahuang/qemu-kvm)
|
||||
|
||||
JIRA: https://issues.redhat.com/browse/RHEL-80313
|
||||
Upstream Status: RHEL only
|
||||
|
||||
Since the pauth and uso both should apply for the latest machine type,
|
||||
move them to the arm_virt_compat_set() which applies the compat to all
|
||||
machine types automatically.
|
||||
|
||||
Signed-off-by: Shaoqin Huang <shahuang@redhat.com>
|
||||
---
|
||||
hw/arm/virt.c | 8 ++++----
|
||||
1 file changed, 4 insertions(+), 4 deletions(-)
|
||||
|
||||
diff --git a/hw/arm/virt.c b/hw/arm/virt.c
|
||||
index 896deaa025..2aef94e776 100644
|
||||
--- a/hw/arm/virt.c
|
||||
+++ b/hw/arm/virt.c
|
||||
@@ -127,6 +127,10 @@ static void arm_virt_compat_set(MachineClass *mc)
|
||||
arm_virt_compat_len);
|
||||
compat_props_add(mc->compat_props, arm_rhel_compat,
|
||||
arm_rhel_compat_len);
|
||||
+ compat_props_add(mc->compat_props, arm_rhel9_compat,
|
||||
+ arm_rhel9_compat_len);
|
||||
+ compat_props_add(mc->compat_props, hw_compat_rhel_9,
|
||||
+ hw_compat_rhel_9_len);
|
||||
}
|
||||
|
||||
#define DEFINE_VIRT_MACHINE_IMPL(latest, ...) \
|
||||
@@ -3599,10 +3603,6 @@ DEFINE_VIRT_MACHINE(2, 6)
|
||||
|
||||
static void virt_rhel_machine_9_6_0_options(MachineClass *mc)
|
||||
{
|
||||
- compat_props_add(mc->compat_props, arm_rhel9_compat, arm_rhel9_compat_len);
|
||||
-
|
||||
- /* NB: remember to move this line to the *latest* RHEL 9 machine */
|
||||
- compat_props_add(mc->compat_props, hw_compat_rhel_9, hw_compat_rhel_9_len);
|
||||
}
|
||||
DEFINE_VIRT_MACHINE_AS_LATEST(9, 6, 0)
|
||||
|
||||
--
|
||||
2.48.1
|
||||
|
||||
@ -1,60 +0,0 @@
|
||||
From 664e672182e39516f26e5f6b10784e42c9dd9864 Mon Sep 17 00:00:00 2001
|
||||
From: Sebastian Ott <sebott@redhat.com>
|
||||
Date: Wed, 22 Jan 2025 06:01:21 -0500
|
||||
Subject: [PATCH 10/11] arm: disable pauth for virt-rhel9*
|
||||
|
||||
RH-Author: Sebastian Ott <sebott@redhat.com>
|
||||
RH-MergeRequest: 330: arm: disable pauth for virt-rhel9*
|
||||
RH-Jira: RHEL-75782
|
||||
RH-Acked-by: Eric Auger <eric.auger@redhat.com>
|
||||
RH-Acked-by: Kashyap Chamarthy <None>
|
||||
RH-Acked-by: Gavin Shan <gshan@redhat.com>
|
||||
RH-Commit: [1/2] 6b30d9a755f06d6823b8a874babf12a1b5fc3295 (seott1/cos-qemu-kvm)
|
||||
|
||||
RHEL9 kernels have pauth disabled while RHEL10 has it enabled,
|
||||
since qemu will setup the VM/VCPU with pauth when KVM supports it
|
||||
the guest visible ID registers will change when a RHEL9 qemu is
|
||||
used on a RHEL10 kernel (e.g. in a container on a host with pauth
|
||||
support).
|
||||
|
||||
Make sure that virt-rhel9* machine types in RHEL9 stay the same
|
||||
independent of the kernel.
|
||||
|
||||
Signed-off-by: Sebastian Ott <sebott@redhat.com>
|
||||
JIRA: https://issues.redhat.com/browse/RHEL-75782
|
||||
---
|
||||
hw/arm/virt.c | 11 +++++++++++
|
||||
1 file changed, 11 insertions(+)
|
||||
|
||||
diff --git a/hw/arm/virt.c b/hw/arm/virt.c
|
||||
index c50bff2a6c..c5270a5abc 100644
|
||||
--- a/hw/arm/virt.c
|
||||
+++ b/hw/arm/virt.c
|
||||
@@ -90,6 +90,16 @@ static GlobalProperty arm_virt_compat[] = {
|
||||
};
|
||||
static const size_t arm_virt_compat_len = G_N_ELEMENTS(arm_virt_compat);
|
||||
|
||||
+/*
|
||||
+ * RHEL9 kernels have pauth disabled while RHEL10 has it enabled,
|
||||
+ * since qemu will setup the VM with pauth when KVM supports it we
|
||||
+ * have to disable it for virt-rhel9* to support upgrades / migration.
|
||||
+ */
|
||||
+GlobalProperty arm_rhel9_compat[] = {
|
||||
+ {TYPE_ARM_CPU, "pauth", "off", .optional = true},
|
||||
+};
|
||||
+const size_t arm_rhel9_compat_len = G_N_ELEMENTS(arm_rhel9_compat);
|
||||
+
|
||||
/*
|
||||
* This variable is for changes to properties that are RHEL specific,
|
||||
* different to the current upstream and to be applied to the latest
|
||||
@@ -3589,6 +3599,7 @@ DEFINE_VIRT_MACHINE(2, 6)
|
||||
|
||||
static void virt_rhel_machine_9_6_0_options(MachineClass *mc)
|
||||
{
|
||||
+ compat_props_add(mc->compat_props, arm_rhel9_compat, arm_rhel9_compat_len);
|
||||
}
|
||||
DEFINE_VIRT_MACHINE_AS_LATEST(9, 6, 0)
|
||||
|
||||
--
|
||||
2.48.0
|
||||
|
||||
@ -1,317 +0,0 @@
|
||||
From 454a498569318365a16ed65bd2110daef5bb3fc3 Mon Sep 17 00:00:00 2001
|
||||
From: Kevin Wolf <kwolf@redhat.com>
|
||||
Date: Tue, 4 Feb 2025 22:13:52 +0100
|
||||
Subject: [PATCH 08/23] block: Add 'active' field to BlockDeviceInfo
|
||||
|
||||
RH-Author: Kevin Wolf <kwolf@redhat.com>
|
||||
RH-MergeRequest: 339: QMP command for block device reactivation after migration
|
||||
RH-Jira: RHEL-54296 RHEL-78397
|
||||
RH-Acked-by: Eric Blake <eblake@redhat.com>
|
||||
RH-Acked-by: Stefan Hajnoczi <stefanha@redhat.com>
|
||||
RH-Commit: [7/22] 6309d1a9ac2a7a21013cfe71dc40474cbdc89464 (kmwolf/centos-qemu-kvm)
|
||||
|
||||
This allows querying from QMP (and also HMP) whether an image is
|
||||
currently active or inactive (in the sense of BDRV_O_INACTIVE).
|
||||
|
||||
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
|
||||
Acked-by: Fabiano Rosas <farosas@suse.de>
|
||||
Reviewed-by: Eric Blake <eblake@redhat.com>
|
||||
Reviewed-by: Stefan Hajnoczi <stefanha@redhat.com>
|
||||
Message-ID: <20250204211407.381505-2-kwolf@redhat.com>
|
||||
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
|
||||
(cherry picked from commit aec81049c2daa8a97b89e59f03733b21ae0f8c2d)
|
||||
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
|
||||
---
|
||||
block.c | 4 ++++
|
||||
block/monitor/block-hmp-cmds.c | 5 +++--
|
||||
block/qapi.c | 1 +
|
||||
include/block/block-global-state.h | 3 +++
|
||||
qapi/block-core.json | 6 +++++-
|
||||
tests/qemu-iotests/184.out | 2 ++
|
||||
tests/qemu-iotests/191.out | 16 ++++++++++++++++
|
||||
tests/qemu-iotests/273.out | 5 +++++
|
||||
8 files changed, 39 insertions(+), 3 deletions(-)
|
||||
|
||||
diff --git a/block.c b/block.c
|
||||
index c317de9eaa..c94d78eefd 100644
|
||||
--- a/block.c
|
||||
+++ b/block.c
|
||||
@@ -6824,6 +6824,10 @@ void bdrv_init_with_whitelist(void)
|
||||
bdrv_init();
|
||||
}
|
||||
|
||||
+bool bdrv_is_inactive(BlockDriverState *bs) {
|
||||
+ return bs->open_flags & BDRV_O_INACTIVE;
|
||||
+}
|
||||
+
|
||||
int bdrv_activate(BlockDriverState *bs, Error **errp)
|
||||
{
|
||||
BdrvChild *child, *parent;
|
||||
diff --git a/block/monitor/block-hmp-cmds.c b/block/monitor/block-hmp-cmds.c
|
||||
index bdf2eb50b6..cc832549e1 100644
|
||||
--- a/block/monitor/block-hmp-cmds.c
|
||||
+++ b/block/monitor/block-hmp-cmds.c
|
||||
@@ -630,11 +630,12 @@ static void print_block_info(Monitor *mon, BlockInfo *info,
|
||||
}
|
||||
|
||||
if (inserted) {
|
||||
- monitor_printf(mon, ": %s (%s%s%s)\n",
|
||||
+ monitor_printf(mon, ": %s (%s%s%s%s)\n",
|
||||
inserted->file,
|
||||
inserted->drv,
|
||||
inserted->ro ? ", read-only" : "",
|
||||
- inserted->encrypted ? ", encrypted" : "");
|
||||
+ inserted->encrypted ? ", encrypted" : "",
|
||||
+ inserted->active ? "" : ", inactive");
|
||||
} else {
|
||||
monitor_printf(mon, ": [not inserted]\n");
|
||||
}
|
||||
diff --git a/block/qapi.c b/block/qapi.c
|
||||
index 2b5793f1d9..709170e63d 100644
|
||||
--- a/block/qapi.c
|
||||
+++ b/block/qapi.c
|
||||
@@ -63,6 +63,7 @@ BlockDeviceInfo *bdrv_block_device_info(BlockBackend *blk,
|
||||
info->file = g_strdup(bs->filename);
|
||||
info->ro = bdrv_is_read_only(bs);
|
||||
info->drv = g_strdup(bs->drv->format_name);
|
||||
+ info->active = !bdrv_is_inactive(bs);
|
||||
info->encrypted = bs->encrypted;
|
||||
|
||||
info->cache = g_new(BlockdevCacheInfo, 1);
|
||||
diff --git a/include/block/block-global-state.h b/include/block/block-global-state.h
|
||||
index bd7cecd1cf..a826bf5f78 100644
|
||||
--- a/include/block/block-global-state.h
|
||||
+++ b/include/block/block-global-state.h
|
||||
@@ -175,6 +175,9 @@ BlockDriverState * GRAPH_RDLOCK
|
||||
check_to_replace_node(BlockDriverState *parent_bs, const char *node_name,
|
||||
Error **errp);
|
||||
|
||||
+
|
||||
+bool GRAPH_RDLOCK bdrv_is_inactive(BlockDriverState *bs);
|
||||
+
|
||||
int no_coroutine_fn GRAPH_RDLOCK
|
||||
bdrv_activate(BlockDriverState *bs, Error **errp);
|
||||
|
||||
diff --git a/qapi/block-core.json b/qapi/block-core.json
|
||||
index aa40d44f1d..92af032744 100644
|
||||
--- a/qapi/block-core.json
|
||||
+++ b/qapi/block-core.json
|
||||
@@ -486,6 +486,10 @@
|
||||
# @backing_file_depth: number of files in the backing file chain
|
||||
# (since: 1.2)
|
||||
#
|
||||
+# @active: true if the backend is active; typical cases for inactive backends
|
||||
+# are on the migration source instance after migration completes and on the
|
||||
+# destination before it completes. (since: 10.0)
|
||||
+#
|
||||
# @encrypted: true if the backing device is encrypted
|
||||
#
|
||||
# @detect_zeroes: detect and optimize zero writes (Since 2.1)
|
||||
@@ -556,7 +560,7 @@
|
||||
{ 'struct': 'BlockDeviceInfo',
|
||||
'data': { 'file': 'str', '*node-name': 'str', 'ro': 'bool', 'drv': 'str',
|
||||
'*backing_file': 'str', 'backing_file_depth': 'int',
|
||||
- 'encrypted': 'bool',
|
||||
+ 'active': 'bool', 'encrypted': 'bool',
|
||||
'detect_zeroes': 'BlockdevDetectZeroesOptions',
|
||||
'bps': 'int', 'bps_rd': 'int', 'bps_wr': 'int',
|
||||
'iops': 'int', 'iops_rd': 'int', 'iops_wr': 'int',
|
||||
diff --git a/tests/qemu-iotests/184.out b/tests/qemu-iotests/184.out
|
||||
index e8f631f853..52692b6b3b 100644
|
||||
--- a/tests/qemu-iotests/184.out
|
||||
+++ b/tests/qemu-iotests/184.out
|
||||
@@ -26,6 +26,7 @@ Testing:
|
||||
{
|
||||
"iops_rd": 0,
|
||||
"detect_zeroes": "off",
|
||||
+ "active": true,
|
||||
"image": {
|
||||
"backing-image": {
|
||||
"virtual-size": 1073741824,
|
||||
@@ -59,6 +60,7 @@ Testing:
|
||||
{
|
||||
"iops_rd": 0,
|
||||
"detect_zeroes": "off",
|
||||
+ "active": true,
|
||||
"image": {
|
||||
"virtual-size": 1073741824,
|
||||
"filename": "null-co://",
|
||||
diff --git a/tests/qemu-iotests/191.out b/tests/qemu-iotests/191.out
|
||||
index c3309e4bc6..2a72ca7106 100644
|
||||
--- a/tests/qemu-iotests/191.out
|
||||
+++ b/tests/qemu-iotests/191.out
|
||||
@@ -114,6 +114,7 @@ wrote 65536/65536 bytes at offset 1048576
|
||||
{
|
||||
"iops_rd": 0,
|
||||
"detect_zeroes": "off",
|
||||
+ "active": true,
|
||||
"image": {
|
||||
"backing-image": {
|
||||
"virtual-size": 67108864,
|
||||
@@ -155,6 +156,7 @@ wrote 65536/65536 bytes at offset 1048576
|
||||
{
|
||||
"iops_rd": 0,
|
||||
"detect_zeroes": "off",
|
||||
+ "active": true,
|
||||
"image": {
|
||||
"virtual-size": 197120,
|
||||
"filename": "TEST_DIR/t.IMGFMT.ovl2",
|
||||
@@ -183,6 +185,7 @@ wrote 65536/65536 bytes at offset 1048576
|
||||
{
|
||||
"iops_rd": 0,
|
||||
"detect_zeroes": "off",
|
||||
+ "active": true,
|
||||
"image": {
|
||||
"backing-image": {
|
||||
"virtual-size": 67108864,
|
||||
@@ -224,6 +227,7 @@ wrote 65536/65536 bytes at offset 1048576
|
||||
{
|
||||
"iops_rd": 0,
|
||||
"detect_zeroes": "off",
|
||||
+ "active": true,
|
||||
"image": {
|
||||
"virtual-size": 197120,
|
||||
"filename": "TEST_DIR/t.IMGFMT",
|
||||
@@ -252,6 +256,7 @@ wrote 65536/65536 bytes at offset 1048576
|
||||
{
|
||||
"iops_rd": 0,
|
||||
"detect_zeroes": "off",
|
||||
+ "active": true,
|
||||
"image": {
|
||||
"backing-image": {
|
||||
"virtual-size": 67108864,
|
||||
@@ -293,6 +298,7 @@ wrote 65536/65536 bytes at offset 1048576
|
||||
{
|
||||
"iops_rd": 0,
|
||||
"detect_zeroes": "off",
|
||||
+ "active": true,
|
||||
"image": {
|
||||
"virtual-size": 393216,
|
||||
"filename": "TEST_DIR/t.IMGFMT.mid",
|
||||
@@ -321,6 +327,7 @@ wrote 65536/65536 bytes at offset 1048576
|
||||
{
|
||||
"iops_rd": 0,
|
||||
"detect_zeroes": "off",
|
||||
+ "active": true,
|
||||
"image": {
|
||||
"virtual-size": 67108864,
|
||||
"filename": "TEST_DIR/t.IMGFMT.base",
|
||||
@@ -350,6 +357,7 @@ wrote 65536/65536 bytes at offset 1048576
|
||||
{
|
||||
"iops_rd": 0,
|
||||
"detect_zeroes": "off",
|
||||
+ "active": true,
|
||||
"image": {
|
||||
"virtual-size": 393216,
|
||||
"filename": "TEST_DIR/t.IMGFMT.base",
|
||||
@@ -521,6 +529,7 @@ wrote 65536/65536 bytes at offset 1048576
|
||||
{
|
||||
"iops_rd": 0,
|
||||
"detect_zeroes": "off",
|
||||
+ "active": true,
|
||||
"image": {
|
||||
"backing-image": {
|
||||
"virtual-size": 67108864,
|
||||
@@ -562,6 +571,7 @@ wrote 65536/65536 bytes at offset 1048576
|
||||
{
|
||||
"iops_rd": 0,
|
||||
"detect_zeroes": "off",
|
||||
+ "active": true,
|
||||
"image": {
|
||||
"virtual-size": 197120,
|
||||
"filename": "TEST_DIR/t.IMGFMT.ovl2",
|
||||
@@ -590,6 +600,7 @@ wrote 65536/65536 bytes at offset 1048576
|
||||
{
|
||||
"iops_rd": 0,
|
||||
"detect_zeroes": "off",
|
||||
+ "active": true,
|
||||
"image": {
|
||||
"backing-image": {
|
||||
"backing-image": {
|
||||
@@ -642,6 +653,7 @@ wrote 65536/65536 bytes at offset 1048576
|
||||
{
|
||||
"iops_rd": 0,
|
||||
"detect_zeroes": "off",
|
||||
+ "active": true,
|
||||
"image": {
|
||||
"virtual-size": 197120,
|
||||
"filename": "TEST_DIR/t.IMGFMT.ovl3",
|
||||
@@ -670,6 +682,7 @@ wrote 65536/65536 bytes at offset 1048576
|
||||
{
|
||||
"iops_rd": 0,
|
||||
"detect_zeroes": "off",
|
||||
+ "active": true,
|
||||
"image": {
|
||||
"virtual-size": 67108864,
|
||||
"filename": "TEST_DIR/t.IMGFMT.base",
|
||||
@@ -699,6 +712,7 @@ wrote 65536/65536 bytes at offset 1048576
|
||||
{
|
||||
"iops_rd": 0,
|
||||
"detect_zeroes": "off",
|
||||
+ "active": true,
|
||||
"image": {
|
||||
"virtual-size": 393216,
|
||||
"filename": "TEST_DIR/t.IMGFMT.base",
|
||||
@@ -727,6 +741,7 @@ wrote 65536/65536 bytes at offset 1048576
|
||||
{
|
||||
"iops_rd": 0,
|
||||
"detect_zeroes": "off",
|
||||
+ "active": true,
|
||||
"image": {
|
||||
"backing-image": {
|
||||
"virtual-size": 67108864,
|
||||
@@ -768,6 +783,7 @@ wrote 65536/65536 bytes at offset 1048576
|
||||
{
|
||||
"iops_rd": 0,
|
||||
"detect_zeroes": "off",
|
||||
+ "active": true,
|
||||
"image": {
|
||||
"virtual-size": 197120,
|
||||
"filename": "TEST_DIR/t.IMGFMT",
|
||||
diff --git a/tests/qemu-iotests/273.out b/tests/qemu-iotests/273.out
|
||||
index 71843f02de..c19753c685 100644
|
||||
--- a/tests/qemu-iotests/273.out
|
||||
+++ b/tests/qemu-iotests/273.out
|
||||
@@ -23,6 +23,7 @@ Testing: -blockdev file,node-name=base,filename=TEST_DIR/t.IMGFMT.base -blockdev
|
||||
{
|
||||
"iops_rd": 0,
|
||||
"detect_zeroes": "off",
|
||||
+ "active": true,
|
||||
"image": {
|
||||
"backing-image": {
|
||||
"backing-image": {
|
||||
@@ -74,6 +75,7 @@ Testing: -blockdev file,node-name=base,filename=TEST_DIR/t.IMGFMT.base -blockdev
|
||||
{
|
||||
"iops_rd": 0,
|
||||
"detect_zeroes": "off",
|
||||
+ "active": true,
|
||||
"image": {
|
||||
"virtual-size": 197120,
|
||||
"filename": "TEST_DIR/t.IMGFMT",
|
||||
@@ -102,6 +104,7 @@ Testing: -blockdev file,node-name=base,filename=TEST_DIR/t.IMGFMT.base -blockdev
|
||||
{
|
||||
"iops_rd": 0,
|
||||
"detect_zeroes": "off",
|
||||
+ "active": true,
|
||||
"image": {
|
||||
"backing-image": {
|
||||
"virtual-size": 197120,
|
||||
@@ -142,6 +145,7 @@ Testing: -blockdev file,node-name=base,filename=TEST_DIR/t.IMGFMT.base -blockdev
|
||||
{
|
||||
"iops_rd": 0,
|
||||
"detect_zeroes": "off",
|
||||
+ "active": true,
|
||||
"image": {
|
||||
"virtual-size": 197120,
|
||||
"filename": "TEST_DIR/t.IMGFMT.mid",
|
||||
@@ -170,6 +174,7 @@ Testing: -blockdev file,node-name=base,filename=TEST_DIR/t.IMGFMT.base -blockdev
|
||||
{
|
||||
"iops_rd": 0,
|
||||
"detect_zeroes": "off",
|
||||
+ "active": true,
|
||||
"image": {
|
||||
"virtual-size": 197120,
|
||||
"filename": "TEST_DIR/t.IMGFMT.base",
|
||||
--
|
||||
2.48.1
|
||||
|
||||
@ -1,187 +0,0 @@
|
||||
From c6c40cc92fbb91d704d3739bb78bfd936f111625 Mon Sep 17 00:00:00 2001
|
||||
From: Kevin Wolf <kwolf@redhat.com>
|
||||
Date: Tue, 4 Feb 2025 22:13:59 +0100
|
||||
Subject: [PATCH 15/23] block: Add blockdev-set-active QMP command
|
||||
|
||||
RH-Author: Kevin Wolf <kwolf@redhat.com>
|
||||
RH-MergeRequest: 339: QMP command for block device reactivation after migration
|
||||
RH-Jira: RHEL-54296 RHEL-78397
|
||||
RH-Acked-by: Eric Blake <eblake@redhat.com>
|
||||
RH-Acked-by: Stefan Hajnoczi <stefanha@redhat.com>
|
||||
RH-Commit: [14/22] e494fb6df6c363b6266e5fb7d09c31b3e7694f04 (kmwolf/centos-qemu-kvm)
|
||||
|
||||
The system emulator tries to automatically activate and inactivate block
|
||||
nodes at the right point during migration. However, there are still
|
||||
cases where it's necessary that the user can do this manually.
|
||||
|
||||
Images are only activated on the destination VM of a migration when the
|
||||
VM is actually resumed. If the VM was paused, this doesn't happen
|
||||
automatically. The user may want to perform some operation on a block
|
||||
device (e.g. taking a snapshot or starting a block job) without also
|
||||
resuming the VM yet. This is an example where a manual command is
|
||||
necessary.
|
||||
|
||||
Another example is VM migration when the image files are opened by an
|
||||
external qemu-storage-daemon instance on each side. In this case, the
|
||||
process that needs to hand over the images isn't even part of the
|
||||
migration and can't know when the migration completes. Management tools
|
||||
need a way to explicitly inactivate images on the source and activate
|
||||
them on the destination.
|
||||
|
||||
This adds a new blockdev-set-active QMP command that lets the user
|
||||
change the status of individual nodes (this is necessary in
|
||||
qemu-storage-daemon because it could be serving multiple VMs and only
|
||||
one of them migrates at a time). For convenience, operating on all
|
||||
devices (like QEMU does automatically during migration) is offered as an
|
||||
option, too, and can be used in the context of single VM.
|
||||
|
||||
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
|
||||
Acked-by: Fabiano Rosas <farosas@suse.de>
|
||||
Reviewed-by: Eric Blake <eblake@redhat.com>
|
||||
Reviewed-by: Stefan Hajnoczi <stefanha@redhat.com>
|
||||
Message-ID: <20250204211407.381505-9-kwolf@redhat.com>
|
||||
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
|
||||
(cherry picked from commit 8cd37207f8a90c5f995283ecf95f1cb5f7518a77)
|
||||
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
|
||||
---
|
||||
block.c | 21 ++++++++++++++++++++
|
||||
blockdev.c | 32 ++++++++++++++++++++++++++++++
|
||||
include/block/block-global-state.h | 3 +++
|
||||
qapi/block-core.json | 32 ++++++++++++++++++++++++++++++
|
||||
4 files changed, 88 insertions(+)
|
||||
|
||||
diff --git a/block.c b/block.c
|
||||
index fd2ac177ef..2140a5d3b7 100644
|
||||
--- a/block.c
|
||||
+++ b/block.c
|
||||
@@ -7052,6 +7052,27 @@ bdrv_inactivate_recurse(BlockDriverState *bs, bool top_level)
|
||||
return 0;
|
||||
}
|
||||
|
||||
+int bdrv_inactivate(BlockDriverState *bs, Error **errp)
|
||||
+{
|
||||
+ int ret;
|
||||
+
|
||||
+ GLOBAL_STATE_CODE();
|
||||
+ GRAPH_RDLOCK_GUARD_MAINLOOP();
|
||||
+
|
||||
+ if (bdrv_has_bds_parent(bs, true)) {
|
||||
+ error_setg(errp, "Node has active parent node");
|
||||
+ return -EPERM;
|
||||
+ }
|
||||
+
|
||||
+ ret = bdrv_inactivate_recurse(bs, true);
|
||||
+ if (ret < 0) {
|
||||
+ error_setg_errno(errp, -ret, "Failed to inactivate node");
|
||||
+ return ret;
|
||||
+ }
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
int bdrv_inactivate_all(void)
|
||||
{
|
||||
BlockDriverState *bs = NULL;
|
||||
diff --git a/blockdev.c b/blockdev.c
|
||||
index 81430122df..70046b6690 100644
|
||||
--- a/blockdev.c
|
||||
+++ b/blockdev.c
|
||||
@@ -3468,6 +3468,38 @@ void qmp_blockdev_del(const char *node_name, Error **errp)
|
||||
bdrv_unref(bs);
|
||||
}
|
||||
|
||||
+void qmp_blockdev_set_active(const char *node_name, bool active, Error **errp)
|
||||
+{
|
||||
+ int ret;
|
||||
+
|
||||
+ GLOBAL_STATE_CODE();
|
||||
+ GRAPH_RDLOCK_GUARD_MAINLOOP();
|
||||
+
|
||||
+ if (!node_name) {
|
||||
+ if (active) {
|
||||
+ bdrv_activate_all(errp);
|
||||
+ } else {
|
||||
+ ret = bdrv_inactivate_all();
|
||||
+ if (ret < 0) {
|
||||
+ error_setg_errno(errp, -ret, "Failed to inactivate all nodes");
|
||||
+ }
|
||||
+ }
|
||||
+ } else {
|
||||
+ BlockDriverState *bs = bdrv_find_node(node_name);
|
||||
+ if (!bs) {
|
||||
+ error_setg(errp, "Failed to find node with node-name='%s'",
|
||||
+ node_name);
|
||||
+ return;
|
||||
+ }
|
||||
+
|
||||
+ if (active) {
|
||||
+ bdrv_activate(bs, errp);
|
||||
+ } else {
|
||||
+ bdrv_inactivate(bs, errp);
|
||||
+ }
|
||||
+ }
|
||||
+}
|
||||
+
|
||||
static BdrvChild * GRAPH_RDLOCK
|
||||
bdrv_find_child(BlockDriverState *parent_bs, const char *child_name)
|
||||
{
|
||||
diff --git a/include/block/block-global-state.h b/include/block/block-global-state.h
|
||||
index a826bf5f78..9be34b3c99 100644
|
||||
--- a/include/block/block-global-state.h
|
||||
+++ b/include/block/block-global-state.h
|
||||
@@ -184,6 +184,9 @@ bdrv_activate(BlockDriverState *bs, Error **errp);
|
||||
int coroutine_fn no_co_wrapper_bdrv_rdlock
|
||||
bdrv_co_activate(BlockDriverState *bs, Error **errp);
|
||||
|
||||
+int no_coroutine_fn
|
||||
+bdrv_inactivate(BlockDriverState *bs, Error **errp);
|
||||
+
|
||||
void bdrv_activate_all(Error **errp);
|
||||
int bdrv_inactivate_all(void);
|
||||
|
||||
diff --git a/qapi/block-core.json b/qapi/block-core.json
|
||||
index 6ec603aa6f..c1af3d1f7d 100644
|
||||
--- a/qapi/block-core.json
|
||||
+++ b/qapi/block-core.json
|
||||
@@ -4930,6 +4930,38 @@
|
||||
{ 'command': 'blockdev-del', 'data': { 'node-name': 'str' },
|
||||
'allow-preconfig': true }
|
||||
|
||||
+##
|
||||
+# @blockdev-set-active:
|
||||
+#
|
||||
+# Activate or inactivate a block device. Use this to manage the handover of
|
||||
+# block devices on migration with qemu-storage-daemon.
|
||||
+#
|
||||
+# Activating a node automatically activates all of its child nodes first.
|
||||
+# Inactivating a node automatically inactivates any of its child nodes that are
|
||||
+# not in use by a still active node.
|
||||
+#
|
||||
+# @node-name: Name of the graph node to activate or inactivate. By default, all
|
||||
+# nodes are affected by the operation.
|
||||
+#
|
||||
+# @active: true if the nodes should be active when the command returns success,
|
||||
+# false if they should be inactive.
|
||||
+#
|
||||
+# Since: 10.0
|
||||
+#
|
||||
+# .. qmp-example::
|
||||
+#
|
||||
+# -> { "execute": "blockdev-set-active",
|
||||
+# "arguments": {
|
||||
+# "node-name": "node0",
|
||||
+# "active": false
|
||||
+# }
|
||||
+# }
|
||||
+# <- { "return": {} }
|
||||
+##
|
||||
+{ 'command': 'blockdev-set-active',
|
||||
+ 'data': { '*node-name': 'str', 'active': 'bool' },
|
||||
+ 'allow-preconfig': true }
|
||||
+
|
||||
##
|
||||
# @BlockdevCreateOptionsFile:
|
||||
#
|
||||
--
|
||||
2.48.1
|
||||
|
||||
@ -1,145 +0,0 @@
|
||||
From f2cd96a040dd7863484d22a3995a2904605dadde Mon Sep 17 00:00:00 2001
|
||||
From: Eric Blake <eblake@redhat.com>
|
||||
Date: Fri, 9 May 2025 15:40:21 -0500
|
||||
Subject: [PATCH 06/16] block: Add new bdrv_co_is_all_zeroes() function
|
||||
|
||||
RH-Author: Eric Blake <eblake@redhat.com>
|
||||
RH-MergeRequest: 365: blockdev-mirror: More efficient handling of sparse mirrors
|
||||
RH-Jira: RHEL-82906 RHEL-83015
|
||||
RH-Acked-by: Stefan Hajnoczi <stefanha@redhat.com>
|
||||
RH-Acked-by: Jon Maloy <jmaloy@redhat.com>
|
||||
RH-Commit: [4/14] aabcba8323df698a72842f299e9242a5eee3aea6 (ebblake/centos-qemu-kvm)
|
||||
|
||||
There are some optimizations that require knowing if an image starts
|
||||
out as reading all zeroes, such as making blockdev-mirror faster by
|
||||
skipping the copying of source zeroes to the destination. The
|
||||
existing bdrv_co_is_zero_fast() is a good building block for answering
|
||||
this question, but it tends to give an answer of 0 for a file we just
|
||||
created via QMP 'blockdev-create' or similar (such as 'qemu-img create
|
||||
-f raw'). Why? Because file-posix.c insists on allocating a tiny
|
||||
header to any file rather than leaving it 100% sparse, due to some
|
||||
filesystems that are unable to answer alignment probes on a hole. But
|
||||
teaching file-posix.c to read the tiny header doesn't scale - the
|
||||
problem of a small header is also visible when libvirt sets up an NBD
|
||||
client to a just-created file on a migration destination host.
|
||||
|
||||
So, we need a wrapper function that handles a bit more complexity in a
|
||||
common manner for all block devices - when the BDS is mostly a hole,
|
||||
but has a small non-hole header, it is still worth the time to read
|
||||
that header and check if it reads as all zeroes before giving up and
|
||||
returning a pessimistic answer.
|
||||
|
||||
Signed-off-by: Eric Blake <eblake@redhat.com>
|
||||
Reviewed-by: Stefan Hajnoczi <stefanha@redhat.com>
|
||||
Message-ID: <20250509204341.3553601-19-eblake@redhat.com>
|
||||
(cherry picked from commit 52726096707c5c8b90597c445de897fa64d56e73)
|
||||
Conflicts:
|
||||
block/io.c - context with header names
|
||||
Jira: https://issues.redhat.com/browse/RHEL-82906
|
||||
Jira: https://issues.redhat.com/browse/RHEL-83015
|
||||
Signed-off-by: Eric Blake <eblake@redhat.com>
|
||||
---
|
||||
block/io.c | 62 ++++++++++++++++++++++++++++++++++++++++
|
||||
include/block/block-io.h | 2 ++
|
||||
2 files changed, 64 insertions(+)
|
||||
|
||||
diff --git a/block/io.c b/block/io.c
|
||||
index 293c5dd393..1f01337599 100644
|
||||
--- a/block/io.c
|
||||
+++ b/block/io.c
|
||||
@@ -38,10 +38,14 @@
|
||||
#include "qemu/error-report.h"
|
||||
#include "qemu/main-loop.h"
|
||||
#include "sysemu/replay.h"
|
||||
+#include "qemu/units.h"
|
||||
|
||||
/* Maximum bounce buffer for copy-on-read and write zeroes, in bytes */
|
||||
#define MAX_BOUNCE_BUFFER (32768 << BDRV_SECTOR_BITS)
|
||||
|
||||
+/* Maximum read size for checking if data reads as zero, in bytes */
|
||||
+#define MAX_ZERO_CHECK_BUFFER (128 * KiB)
|
||||
+
|
||||
static void coroutine_fn GRAPH_RDLOCK
|
||||
bdrv_parent_cb_resize(BlockDriverState *bs);
|
||||
|
||||
@@ -2774,6 +2778,64 @@ int coroutine_fn bdrv_co_is_zero_fast(BlockDriverState *bs, int64_t offset,
|
||||
return 1;
|
||||
}
|
||||
|
||||
+/*
|
||||
+ * Check @bs (and its backing chain) to see if the entire image is known
|
||||
+ * to read as zeroes.
|
||||
+ * Return 1 if that is the case, 0 otherwise and -errno on error.
|
||||
+ * This test is meant to be fast rather than accurate so returning 0
|
||||
+ * does not guarantee non-zero data; however, a return of 1 is reliable,
|
||||
+ * and this function can report 1 in more cases than bdrv_co_is_zero_fast.
|
||||
+ */
|
||||
+int coroutine_fn bdrv_co_is_all_zeroes(BlockDriverState *bs)
|
||||
+{
|
||||
+ int ret;
|
||||
+ int64_t pnum, bytes;
|
||||
+ char *buf;
|
||||
+ QEMUIOVector local_qiov;
|
||||
+ IO_CODE();
|
||||
+
|
||||
+ bytes = bdrv_co_getlength(bs);
|
||||
+ if (bytes < 0) {
|
||||
+ return bytes;
|
||||
+ }
|
||||
+
|
||||
+ /* First probe - see if the entire image reads as zero */
|
||||
+ ret = bdrv_co_common_block_status_above(bs, NULL, false, BDRV_WANT_ZERO,
|
||||
+ 0, bytes, &pnum, NULL, NULL,
|
||||
+ NULL);
|
||||
+ if (ret < 0) {
|
||||
+ return ret;
|
||||
+ }
|
||||
+ if (ret & BDRV_BLOCK_ZERO) {
|
||||
+ return bdrv_co_is_zero_fast(bs, pnum, bytes - pnum);
|
||||
+ }
|
||||
+
|
||||
+ /*
|
||||
+ * Because of the way 'blockdev-create' works, raw files tend to
|
||||
+ * be created with a non-sparse region at the front to make
|
||||
+ * alignment probing easier. If the block starts with only a
|
||||
+ * small allocated region, it is still worth the effort to see if
|
||||
+ * the rest of the image is still sparse, coupled with manually
|
||||
+ * reading the first region to see if it reads zero after all.
|
||||
+ */
|
||||
+ if (pnum > MAX_ZERO_CHECK_BUFFER) {
|
||||
+ return 0;
|
||||
+ }
|
||||
+ ret = bdrv_co_is_zero_fast(bs, pnum, bytes - pnum);
|
||||
+ if (ret <= 0) {
|
||||
+ return ret;
|
||||
+ }
|
||||
+ /* Only the head of the image is unknown, and it's small. Read it. */
|
||||
+ buf = qemu_blockalign(bs, pnum);
|
||||
+ qemu_iovec_init_buf(&local_qiov, buf, pnum);
|
||||
+ ret = bdrv_driver_preadv(bs, 0, pnum, &local_qiov, 0, 0);
|
||||
+ if (ret >= 0) {
|
||||
+ ret = buffer_is_zero(buf, pnum);
|
||||
+ }
|
||||
+ qemu_vfree(buf);
|
||||
+ return ret;
|
||||
+}
|
||||
+
|
||||
int coroutine_fn bdrv_co_is_allocated(BlockDriverState *bs, int64_t offset,
|
||||
int64_t bytes, int64_t *pnum)
|
||||
{
|
||||
diff --git a/include/block/block-io.h b/include/block/block-io.h
|
||||
index b49e0537dd..b99cc98d26 100644
|
||||
--- a/include/block/block-io.h
|
||||
+++ b/include/block/block-io.h
|
||||
@@ -161,6 +161,8 @@ bdrv_is_allocated_above(BlockDriverState *bs, BlockDriverState *base,
|
||||
|
||||
int coroutine_fn GRAPH_RDLOCK
|
||||
bdrv_co_is_zero_fast(BlockDriverState *bs, int64_t offset, int64_t bytes);
|
||||
+int coroutine_fn GRAPH_RDLOCK
|
||||
+bdrv_co_is_all_zeroes(BlockDriverState *bs);
|
||||
|
||||
int GRAPH_RDLOCK
|
||||
bdrv_apply_auto_read_only(BlockDriverState *bs, const char *errmsg,
|
||||
--
|
||||
2.48.1
|
||||
|
||||
@ -1,102 +0,0 @@
|
||||
From d44250363b08e627e06a9afe288d02a3d995afc0 Mon Sep 17 00:00:00 2001
|
||||
From: Kevin Wolf <kwolf@redhat.com>
|
||||
Date: Tue, 4 Feb 2025 22:13:58 +0100
|
||||
Subject: [PATCH 14/23] block: Add option to create inactive nodes
|
||||
|
||||
RH-Author: Kevin Wolf <kwolf@redhat.com>
|
||||
RH-MergeRequest: 339: QMP command for block device reactivation after migration
|
||||
RH-Jira: RHEL-54296 RHEL-78397
|
||||
RH-Acked-by: Eric Blake <eblake@redhat.com>
|
||||
RH-Acked-by: Stefan Hajnoczi <stefanha@redhat.com>
|
||||
RH-Commit: [13/22] 45b01b9c09d5f12715e4977cab6140d2cac90714 (kmwolf/centos-qemu-kvm)
|
||||
|
||||
In QEMU, nodes are automatically created inactive while expecting an
|
||||
incoming migration (i.e. RUN_STATE_INMIGRATE). In qemu-storage-daemon,
|
||||
the notion of runstates doesn't exist. It also wouldn't necessarily make
|
||||
sense to introduce it because a single daemon can serve multiple VMs
|
||||
that can be in different states.
|
||||
|
||||
Therefore, allow the user to explicitly open images as inactive with a
|
||||
new option. The default is as before: Nodes are usually active, except
|
||||
when created during RUN_STATE_INMIGRATE.
|
||||
|
||||
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
|
||||
Acked-by: Fabiano Rosas <farosas@suse.de>
|
||||
Reviewed-by: Eric Blake <eblake@redhat.com>
|
||||
Reviewed-by: Stefan Hajnoczi <stefanha@redhat.com>
|
||||
Message-ID: <20250204211407.381505-8-kwolf@redhat.com>
|
||||
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
|
||||
(cherry picked from commit faecd16fe5c65a25b5b55b5edbe4322cec5a9d96)
|
||||
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
|
||||
---
|
||||
block.c | 9 +++++++++
|
||||
include/block/block-common.h | 1 +
|
||||
qapi/block-core.json | 6 ++++++
|
||||
3 files changed, 16 insertions(+)
|
||||
|
||||
diff --git a/block.c b/block.c
|
||||
index bedd54deaa..fd2ac177ef 100644
|
||||
--- a/block.c
|
||||
+++ b/block.c
|
||||
@@ -1573,6 +1573,10 @@ static void update_flags_from_options(int *flags, QemuOpts *opts)
|
||||
if (qemu_opt_get_bool_del(opts, BDRV_OPT_AUTO_READ_ONLY, false)) {
|
||||
*flags |= BDRV_O_AUTO_RDONLY;
|
||||
}
|
||||
+
|
||||
+ if (!qemu_opt_get_bool_del(opts, BDRV_OPT_ACTIVE, true)) {
|
||||
+ *flags |= BDRV_O_INACTIVE;
|
||||
+ }
|
||||
}
|
||||
|
||||
static void update_options_from_flags(QDict *options, int flags)
|
||||
@@ -1799,6 +1803,11 @@ QemuOptsList bdrv_runtime_opts = {
|
||||
.type = QEMU_OPT_BOOL,
|
||||
.help = "Ignore flush requests",
|
||||
},
|
||||
+ {
|
||||
+ .name = BDRV_OPT_ACTIVE,
|
||||
+ .type = QEMU_OPT_BOOL,
|
||||
+ .help = "Node is activated",
|
||||
+ },
|
||||
{
|
||||
.name = BDRV_OPT_READ_ONLY,
|
||||
.type = QEMU_OPT_BOOL,
|
||||
diff --git a/include/block/block-common.h b/include/block/block-common.h
|
||||
index 338fe5ff7a..7030669f04 100644
|
||||
--- a/include/block/block-common.h
|
||||
+++ b/include/block/block-common.h
|
||||
@@ -257,6 +257,7 @@ typedef enum {
|
||||
#define BDRV_OPT_AUTO_READ_ONLY "auto-read-only"
|
||||
#define BDRV_OPT_DISCARD "discard"
|
||||
#define BDRV_OPT_FORCE_SHARE "force-share"
|
||||
+#define BDRV_OPT_ACTIVE "active"
|
||||
|
||||
|
||||
#define BDRV_SECTOR_BITS 9
|
||||
diff --git a/qapi/block-core.json b/qapi/block-core.json
|
||||
index 92af032744..6ec603aa6f 100644
|
||||
--- a/qapi/block-core.json
|
||||
+++ b/qapi/block-core.json
|
||||
@@ -4668,6 +4668,11 @@
|
||||
#
|
||||
# @cache: cache-related options
|
||||
#
|
||||
+# @active: whether the block node should be activated (default: true).
|
||||
+# Having inactive block nodes is useful primarily for migration because it
|
||||
+# allows opening an image on the destination while the source is still
|
||||
+# holding locks for it. (Since 10.0)
|
||||
+#
|
||||
# @read-only: whether the block device should be read-only (default:
|
||||
# false). Note that some block drivers support only read-only
|
||||
# access, either generally or in certain configurations. In this
|
||||
@@ -4694,6 +4699,7 @@
|
||||
'*node-name': 'str',
|
||||
'*discard': 'BlockdevDiscardOptions',
|
||||
'*cache': 'BlockdevCacheOptions',
|
||||
+ '*active': 'bool',
|
||||
'*read-only': 'bool',
|
||||
'*auto-read-only': 'bool',
|
||||
'*force-share': 'bool',
|
||||
--
|
||||
2.48.1
|
||||
|
||||
@ -1,80 +0,0 @@
|
||||
From f7f73025679c5d001256d87bc47566d1db4e98c7 Mon Sep 17 00:00:00 2001
|
||||
From: Kevin Wolf <kwolf@redhat.com>
|
||||
Date: Tue, 4 Feb 2025 22:13:53 +0100
|
||||
Subject: [PATCH 09/23] block: Allow inactivating already inactive nodes
|
||||
|
||||
RH-Author: Kevin Wolf <kwolf@redhat.com>
|
||||
RH-MergeRequest: 339: QMP command for block device reactivation after migration
|
||||
RH-Jira: RHEL-54296 RHEL-78397
|
||||
RH-Acked-by: Eric Blake <eblake@redhat.com>
|
||||
RH-Acked-by: Stefan Hajnoczi <stefanha@redhat.com>
|
||||
RH-Commit: [8/22] 781a749ae61e038b5b562407b01d53a1bfba598c (kmwolf/centos-qemu-kvm)
|
||||
|
||||
What we wanted to catch with the assertion is cases where the recursion
|
||||
finds that a child was inactive before its parent. This should never
|
||||
happen. But if the user tries to inactivate an image that is already
|
||||
inactive, that's harmless and we don't want to fail the assertion.
|
||||
|
||||
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
|
||||
Acked-by: Fabiano Rosas <farosas@suse.de>
|
||||
Reviewed-by: Eric Blake <eblake@redhat.com>
|
||||
Reviewed-by: Stefan Hajnoczi <stefanha@redhat.com>
|
||||
Message-ID: <20250204211407.381505-3-kwolf@redhat.com>
|
||||
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
|
||||
(cherry picked from commit a6490ec9d56b9e95a13918813585a3a9891710bc)
|
||||
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
|
||||
---
|
||||
block.c | 16 ++++++++++++----
|
||||
1 file changed, 12 insertions(+), 4 deletions(-)
|
||||
|
||||
diff --git a/block.c b/block.c
|
||||
index c94d78eefd..a2aa454312 100644
|
||||
--- a/block.c
|
||||
+++ b/block.c
|
||||
@@ -6959,7 +6959,8 @@ bdrv_has_bds_parent(BlockDriverState *bs, bool only_active)
|
||||
return false;
|
||||
}
|
||||
|
||||
-static int GRAPH_RDLOCK bdrv_inactivate_recurse(BlockDriverState *bs)
|
||||
+static int GRAPH_RDLOCK
|
||||
+bdrv_inactivate_recurse(BlockDriverState *bs, bool top_level)
|
||||
{
|
||||
BdrvChild *child, *parent;
|
||||
int ret;
|
||||
@@ -6977,7 +6978,14 @@ static int GRAPH_RDLOCK bdrv_inactivate_recurse(BlockDriverState *bs)
|
||||
return 0;
|
||||
}
|
||||
|
||||
- assert(!(bs->open_flags & BDRV_O_INACTIVE));
|
||||
+ /*
|
||||
+ * Inactivating an already inactive node on user request is harmless, but if
|
||||
+ * a child is already inactive before its parent, that's bad.
|
||||
+ */
|
||||
+ if (bs->open_flags & BDRV_O_INACTIVE) {
|
||||
+ assert(top_level);
|
||||
+ return 0;
|
||||
+ }
|
||||
|
||||
/* Inactivate this node */
|
||||
if (bs->drv->bdrv_inactivate) {
|
||||
@@ -7014,7 +7022,7 @@ static int GRAPH_RDLOCK bdrv_inactivate_recurse(BlockDriverState *bs)
|
||||
|
||||
/* Recursively inactivate children */
|
||||
QLIST_FOREACH(child, &bs->children, next) {
|
||||
- ret = bdrv_inactivate_recurse(child->bs);
|
||||
+ ret = bdrv_inactivate_recurse(child->bs, false);
|
||||
if (ret < 0) {
|
||||
return ret;
|
||||
}
|
||||
@@ -7039,7 +7047,7 @@ int bdrv_inactivate_all(void)
|
||||
if (bdrv_has_bds_parent(bs, false)) {
|
||||
continue;
|
||||
}
|
||||
- ret = bdrv_inactivate_recurse(bs);
|
||||
+ ret = bdrv_inactivate_recurse(bs, true);
|
||||
if (ret < 0) {
|
||||
bdrv_next_cleanup(&it);
|
||||
break;
|
||||
--
|
||||
2.48.1
|
||||
|
||||
@ -1,46 +0,0 @@
|
||||
From 0f0968badaa11f4ac56f8ee93cbe11f9a6d5fc95 Mon Sep 17 00:00:00 2001
|
||||
From: Kevin Wolf <kwolf@redhat.com>
|
||||
Date: Tue, 4 Feb 2025 22:13:56 +0100
|
||||
Subject: [PATCH 12/23] block: Don't attach inactive child to active node
|
||||
|
||||
RH-Author: Kevin Wolf <kwolf@redhat.com>
|
||||
RH-MergeRequest: 339: QMP command for block device reactivation after migration
|
||||
RH-Jira: RHEL-54296 RHEL-78397
|
||||
RH-Acked-by: Eric Blake <eblake@redhat.com>
|
||||
RH-Acked-by: Stefan Hajnoczi <stefanha@redhat.com>
|
||||
RH-Commit: [11/22] 1ca560728b97bd1d5f7498a7e5d23e2d8bb0808d (kmwolf/centos-qemu-kvm)
|
||||
|
||||
An active node makes unrestricted use of its children and would possibly
|
||||
run into assertion failures when it operates on an inactive child node.
|
||||
|
||||
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
|
||||
Acked-by: Fabiano Rosas <farosas@suse.de>
|
||||
Reviewed-by: Eric Blake <eblake@redhat.com>
|
||||
Reviewed-by: Stefan Hajnoczi <stefanha@redhat.com>
|
||||
Message-ID: <20250204211407.381505-6-kwolf@redhat.com>
|
||||
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
|
||||
(cherry picked from commit 9b81361aedcc47905de5e91f68221de89c6f5467)
|
||||
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
|
||||
---
|
||||
block.c | 5 +++++
|
||||
1 file changed, 5 insertions(+)
|
||||
|
||||
diff --git a/block.c b/block.c
|
||||
index a2aa454312..41e72e6965 100644
|
||||
--- a/block.c
|
||||
+++ b/block.c
|
||||
@@ -3183,6 +3183,11 @@ bdrv_attach_child_noperm(BlockDriverState *parent_bs,
|
||||
child_bs->node_name, child_name, parent_bs->node_name);
|
||||
return NULL;
|
||||
}
|
||||
+ if (bdrv_is_inactive(child_bs) && !bdrv_is_inactive(parent_bs)) {
|
||||
+ error_setg(errp, "Inactive '%s' can't be a %s child of active '%s'",
|
||||
+ child_bs->node_name, child_name, parent_bs->node_name);
|
||||
+ return NULL;
|
||||
+ }
|
||||
|
||||
bdrv_get_cumulative_perm(parent_bs, &perm, &shared_perm);
|
||||
bdrv_child_perm(parent_bs, child_bs, NULL, child_role, NULL,
|
||||
--
|
||||
2.48.1
|
||||
|
||||
@ -1,52 +0,0 @@
|
||||
From bc9b651ce0f36da5a5b6eb8631e7040e59ea2493 Mon Sep 17 00:00:00 2001
|
||||
From: Kevin Wolf <kwolf@redhat.com>
|
||||
Date: Tue, 4 Feb 2025 22:14:02 +0100
|
||||
Subject: [PATCH 18/23] block: Drain nodes before inactivating them
|
||||
|
||||
RH-Author: Kevin Wolf <kwolf@redhat.com>
|
||||
RH-MergeRequest: 339: QMP command for block device reactivation after migration
|
||||
RH-Jira: RHEL-54296 RHEL-78397
|
||||
RH-Acked-by: Eric Blake <eblake@redhat.com>
|
||||
RH-Acked-by: Stefan Hajnoczi <stefanha@redhat.com>
|
||||
RH-Commit: [17/22] f0fec0f51ed033038b565297a7217cbf61ab70f7 (kmwolf/centos-qemu-kvm)
|
||||
|
||||
So far the assumption has always been that if we try to inactivate a
|
||||
node, it is already idle. This doesn't hold true any more if we allow
|
||||
inactivating exported nodes because we can't know when new external
|
||||
requests come in.
|
||||
|
||||
Drain the node around setting BDRV_O_INACTIVE so that requests can't
|
||||
start operating on an active node and then in the middle it suddenly
|
||||
becomes inactive. With this change, it's enough for exports to check
|
||||
for new requests that they operate on an active node (or, like reads,
|
||||
are allowed even on an inactive node).
|
||||
|
||||
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
|
||||
Acked-by: Fabiano Rosas <farosas@suse.de>
|
||||
Message-ID: <20250204211407.381505-12-kwolf@redhat.com>
|
||||
Reviewed-by: Stefan Hajnoczi <stefanha@redhat.com>
|
||||
Reviewed-by: Eric Blake <eblake@redhat.com>
|
||||
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
|
||||
(cherry picked from commit 2849092a0024405e74c96f0a5ec41bb182ec8538)
|
||||
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
|
||||
---
|
||||
block.c | 2 ++
|
||||
1 file changed, 2 insertions(+)
|
||||
|
||||
diff --git a/block.c b/block.c
|
||||
index 2140a5d3b7..38cb8481a8 100644
|
||||
--- a/block.c
|
||||
+++ b/block.c
|
||||
@@ -7032,7 +7032,9 @@ bdrv_inactivate_recurse(BlockDriverState *bs, bool top_level)
|
||||
return -EPERM;
|
||||
}
|
||||
|
||||
+ bdrv_drained_begin(bs);
|
||||
bs->open_flags |= BDRV_O_INACTIVE;
|
||||
+ bdrv_drained_end(bs);
|
||||
|
||||
/*
|
||||
* Update permissions, they may differ for inactive nodes.
|
||||
--
|
||||
2.48.1
|
||||
|
||||
@ -1,689 +0,0 @@
|
||||
From 26f5d221dd16137bed3527ee120cdf085e2c7e23 Mon Sep 17 00:00:00 2001
|
||||
From: Eric Blake <eblake@redhat.com>
|
||||
Date: Fri, 9 May 2025 15:40:18 -0500
|
||||
Subject: [PATCH 03/16] block: Expand block status mode from bool to flags
|
||||
|
||||
RH-Author: Eric Blake <eblake@redhat.com>
|
||||
RH-MergeRequest: 365: blockdev-mirror: More efficient handling of sparse mirrors
|
||||
RH-Jira: RHEL-82906 RHEL-83015
|
||||
RH-Acked-by: Stefan Hajnoczi <stefanha@redhat.com>
|
||||
RH-Acked-by: Jon Maloy <jmaloy@redhat.com>
|
||||
RH-Commit: [1/14] 9de5245def80e9815ed306e4abce9caec56cef6f (ebblake/centos-qemu-kvm)
|
||||
|
||||
This patch is purely mechanical, changing bool want_zero into an
|
||||
unsigned int for bitwise-or of flags. As of this patch, all
|
||||
implementations are unchanged (the old want_zero==true is now
|
||||
mode==BDRV_WANT_PRECISE which is a superset of BDRV_WANT_ZERO); but
|
||||
the callers in io.c that used to pass want_zero==false are now
|
||||
prepared for future driver changes that can now distinguish bewteen
|
||||
BDRV_WANT_ZERO vs. BDRV_WANT_ALLOCATED. The next patch will actually
|
||||
change the file-posix driver along those lines, now that we have
|
||||
more-specific hints.
|
||||
|
||||
As for the background why this patch is useful: right now, the
|
||||
file-posix driver recognizes that if allocation is being queried, the
|
||||
entire image can be reported as allocated (there is no backing file to
|
||||
refer to) - but this throws away information on whether the entire
|
||||
image reads as zero (trivially true if lseek(SEEK_HOLE) at offset 0
|
||||
returns -ENXIO, a bit more complicated to prove if the raw file was
|
||||
created with 'qemu-img create' since we intentionally allocate a small
|
||||
chunk of all-zero data to help with alignment probing). Later patches
|
||||
will add a generic algorithm for seeing if an entire file reads as
|
||||
zeroes.
|
||||
|
||||
Signed-off-by: Eric Blake <eblake@redhat.com>
|
||||
Reviewed-by: Stefan Hajnoczi <stefanha@redhat.com>
|
||||
Message-ID: <20250509204341.3553601-16-eblake@redhat.com>
|
||||
(cherry picked from commit c33159dec79069514f78faecfe268439226b0f5b)
|
||||
Jira: https://issues.redhat.com/browse/RHEL-82906
|
||||
Jira: https://issues.redhat.com/browse/RHEL-83015
|
||||
Signed-off-by: Eric Blake <eblake@redhat.com>
|
||||
---
|
||||
block/blkdebug.c | 6 ++--
|
||||
block/copy-before-write.c | 4 +--
|
||||
block/coroutines.h | 4 +--
|
||||
block/file-posix.c | 4 +--
|
||||
block/gluster.c | 4 +--
|
||||
block/io.c | 51 ++++++++++++++++----------------
|
||||
block/iscsi.c | 6 ++--
|
||||
block/nbd.c | 4 +--
|
||||
block/null.c | 6 ++--
|
||||
block/parallels.c | 6 ++--
|
||||
block/qcow.c | 2 +-
|
||||
block/qcow2.c | 6 ++--
|
||||
block/qed.c | 6 ++--
|
||||
block/quorum.c | 4 +--
|
||||
block/raw-format.c | 4 +--
|
||||
block/rbd.c | 6 ++--
|
||||
block/snapshot-access.c | 4 +--
|
||||
block/vdi.c | 4 +--
|
||||
block/vmdk.c | 2 +-
|
||||
block/vpc.c | 2 +-
|
||||
block/vvfat.c | 6 ++--
|
||||
include/block/block-common.h | 11 +++++++
|
||||
include/block/block_int-common.h | 27 +++++++++--------
|
||||
include/block/block_int-io.h | 4 +--
|
||||
tests/unit/test-block-iothread.c | 2 +-
|
||||
25 files changed, 99 insertions(+), 86 deletions(-)
|
||||
|
||||
diff --git a/block/blkdebug.c b/block/blkdebug.c
|
||||
index c95c818c38..736ae2b56b 100644
|
||||
--- a/block/blkdebug.c
|
||||
+++ b/block/blkdebug.c
|
||||
@@ -751,9 +751,9 @@ blkdebug_co_pdiscard(BlockDriverState *bs, int64_t offset, int64_t bytes)
|
||||
}
|
||||
|
||||
static int coroutine_fn GRAPH_RDLOCK
|
||||
-blkdebug_co_block_status(BlockDriverState *bs, bool want_zero, int64_t offset,
|
||||
- int64_t bytes, int64_t *pnum, int64_t *map,
|
||||
- BlockDriverState **file)
|
||||
+blkdebug_co_block_status(BlockDriverState *bs, unsigned int mode,
|
||||
+ int64_t offset, int64_t bytes, int64_t *pnum,
|
||||
+ int64_t *map, BlockDriverState **file)
|
||||
{
|
||||
int err;
|
||||
|
||||
diff --git a/block/copy-before-write.c b/block/copy-before-write.c
|
||||
index 853e01a1eb..36488cdeca 100644
|
||||
--- a/block/copy-before-write.c
|
||||
+++ b/block/copy-before-write.c
|
||||
@@ -290,8 +290,8 @@ cbw_co_preadv_snapshot(BlockDriverState *bs, int64_t offset, int64_t bytes,
|
||||
}
|
||||
|
||||
static int coroutine_fn GRAPH_RDLOCK
|
||||
-cbw_co_snapshot_block_status(BlockDriverState *bs,
|
||||
- bool want_zero, int64_t offset, int64_t bytes,
|
||||
+cbw_co_snapshot_block_status(BlockDriverState *bs, unsigned int mode,
|
||||
+ int64_t offset, int64_t bytes,
|
||||
int64_t *pnum, int64_t *map,
|
||||
BlockDriverState **file)
|
||||
{
|
||||
diff --git a/block/coroutines.h b/block/coroutines.h
|
||||
index f3226682d6..811ef12e43 100644
|
||||
--- a/block/coroutines.h
|
||||
+++ b/block/coroutines.h
|
||||
@@ -47,7 +47,7 @@ int coroutine_fn GRAPH_RDLOCK
|
||||
bdrv_co_common_block_status_above(BlockDriverState *bs,
|
||||
BlockDriverState *base,
|
||||
bool include_base,
|
||||
- bool want_zero,
|
||||
+ unsigned int mode,
|
||||
int64_t offset,
|
||||
int64_t bytes,
|
||||
int64_t *pnum,
|
||||
@@ -78,7 +78,7 @@ int co_wrapper_mixed_bdrv_rdlock
|
||||
bdrv_common_block_status_above(BlockDriverState *bs,
|
||||
BlockDriverState *base,
|
||||
bool include_base,
|
||||
- bool want_zero,
|
||||
+ unsigned int mode,
|
||||
int64_t offset,
|
||||
int64_t bytes,
|
||||
int64_t *pnum,
|
||||
diff --git a/block/file-posix.c b/block/file-posix.c
|
||||
index f17a3f4d10..9ca55620ca 100644
|
||||
--- a/block/file-posix.c
|
||||
+++ b/block/file-posix.c
|
||||
@@ -3277,7 +3277,7 @@ static int find_allocation(BlockDriverState *bs, off_t start,
|
||||
* well exceed it.
|
||||
*/
|
||||
static int coroutine_fn raw_co_block_status(BlockDriverState *bs,
|
||||
- bool want_zero,
|
||||
+ unsigned int mode,
|
||||
int64_t offset,
|
||||
int64_t bytes, int64_t *pnum,
|
||||
int64_t *map,
|
||||
@@ -3293,7 +3293,7 @@ static int coroutine_fn raw_co_block_status(BlockDriverState *bs,
|
||||
return ret;
|
||||
}
|
||||
|
||||
- if (!want_zero) {
|
||||
+ if (mode != BDRV_WANT_PRECISE) {
|
||||
*pnum = bytes;
|
||||
*map = offset;
|
||||
*file = bs;
|
||||
diff --git a/block/gluster.c b/block/gluster.c
|
||||
index f8b415f381..ae5c45666b 100644
|
||||
--- a/block/gluster.c
|
||||
+++ b/block/gluster.c
|
||||
@@ -1466,7 +1466,7 @@ exit:
|
||||
* (Based on raw_co_block_status() from file-posix.c.)
|
||||
*/
|
||||
static int coroutine_fn qemu_gluster_co_block_status(BlockDriverState *bs,
|
||||
- bool want_zero,
|
||||
+ unsigned int mode,
|
||||
int64_t offset,
|
||||
int64_t bytes,
|
||||
int64_t *pnum,
|
||||
@@ -1483,7 +1483,7 @@ static int coroutine_fn qemu_gluster_co_block_status(BlockDriverState *bs,
|
||||
return ret;
|
||||
}
|
||||
|
||||
- if (!want_zero) {
|
||||
+ if (mode != BDRV_WANT_PRECISE) {
|
||||
*pnum = bytes;
|
||||
*map = offset;
|
||||
*file = bs;
|
||||
diff --git a/block/io.c b/block/io.c
|
||||
index 3e189837a1..daaafe00d7 100644
|
||||
--- a/block/io.c
|
||||
+++ b/block/io.c
|
||||
@@ -2360,10 +2360,8 @@ int bdrv_flush_all(void)
|
||||
* Drivers not implementing the functionality are assumed to not support
|
||||
* backing files, hence all their sectors are reported as allocated.
|
||||
*
|
||||
- * If 'want_zero' is true, the caller is querying for mapping
|
||||
- * purposes, with a focus on valid BDRV_BLOCK_OFFSET_VALID, _DATA, and
|
||||
- * _ZERO where possible; otherwise, the result favors larger 'pnum',
|
||||
- * with a focus on accurate BDRV_BLOCK_ALLOCATED.
|
||||
+ * 'mode' serves as a hint as to which results are favored; see the
|
||||
+ * BDRV_WANT_* macros for details.
|
||||
*
|
||||
* If 'offset' is beyond the end of the disk image the return value is
|
||||
* BDRV_BLOCK_EOF and 'pnum' is set to 0.
|
||||
@@ -2383,7 +2381,7 @@ int bdrv_flush_all(void)
|
||||
* set to the host mapping and BDS corresponding to the guest offset.
|
||||
*/
|
||||
static int coroutine_fn GRAPH_RDLOCK
|
||||
-bdrv_co_do_block_status(BlockDriverState *bs, bool want_zero,
|
||||
+bdrv_co_do_block_status(BlockDriverState *bs, unsigned int mode,
|
||||
int64_t offset, int64_t bytes,
|
||||
int64_t *pnum, int64_t *map, BlockDriverState **file)
|
||||
{
|
||||
@@ -2472,7 +2470,7 @@ bdrv_co_do_block_status(BlockDriverState *bs, bool want_zero,
|
||||
local_file = bs;
|
||||
local_map = aligned_offset;
|
||||
} else {
|
||||
- ret = bs->drv->bdrv_co_block_status(bs, want_zero, aligned_offset,
|
||||
+ ret = bs->drv->bdrv_co_block_status(bs, mode, aligned_offset,
|
||||
aligned_bytes, pnum, &local_map,
|
||||
&local_file);
|
||||
|
||||
@@ -2484,10 +2482,10 @@ bdrv_co_do_block_status(BlockDriverState *bs, bool want_zero,
|
||||
* the cache requires an RCU update, so double check here to avoid
|
||||
* such an update if possible.
|
||||
*
|
||||
- * Check want_zero, because we only want to update the cache when we
|
||||
+ * Check mode, because we only want to update the cache when we
|
||||
* have accurate information about what is zero and what is data.
|
||||
*/
|
||||
- if (want_zero &&
|
||||
+ if (mode == BDRV_WANT_PRECISE &&
|
||||
ret == (BDRV_BLOCK_DATA | BDRV_BLOCK_OFFSET_VALID) &&
|
||||
QLIST_EMPTY(&bs->children))
|
||||
{
|
||||
@@ -2544,7 +2542,7 @@ bdrv_co_do_block_status(BlockDriverState *bs, bool want_zero,
|
||||
|
||||
if (ret & BDRV_BLOCK_RAW) {
|
||||
assert(ret & BDRV_BLOCK_OFFSET_VALID && local_file);
|
||||
- ret = bdrv_co_do_block_status(local_file, want_zero, local_map,
|
||||
+ ret = bdrv_co_do_block_status(local_file, mode, local_map,
|
||||
*pnum, pnum, &local_map, &local_file);
|
||||
goto out;
|
||||
}
|
||||
@@ -2556,7 +2554,7 @@ bdrv_co_do_block_status(BlockDriverState *bs, bool want_zero,
|
||||
|
||||
if (!cow_bs) {
|
||||
ret |= BDRV_BLOCK_ZERO;
|
||||
- } else if (want_zero) {
|
||||
+ } else if (mode == BDRV_WANT_PRECISE) {
|
||||
int64_t size2 = bdrv_co_getlength(cow_bs);
|
||||
|
||||
if (size2 >= 0 && offset >= size2) {
|
||||
@@ -2565,14 +2563,14 @@ bdrv_co_do_block_status(BlockDriverState *bs, bool want_zero,
|
||||
}
|
||||
}
|
||||
|
||||
- if (want_zero && ret & BDRV_BLOCK_RECURSE &&
|
||||
+ if (mode == BDRV_WANT_PRECISE && ret & BDRV_BLOCK_RECURSE &&
|
||||
local_file && local_file != bs &&
|
||||
(ret & BDRV_BLOCK_DATA) && !(ret & BDRV_BLOCK_ZERO) &&
|
||||
(ret & BDRV_BLOCK_OFFSET_VALID)) {
|
||||
int64_t file_pnum;
|
||||
int ret2;
|
||||
|
||||
- ret2 = bdrv_co_do_block_status(local_file, want_zero, local_map,
|
||||
+ ret2 = bdrv_co_do_block_status(local_file, mode, local_map,
|
||||
*pnum, &file_pnum, NULL, NULL);
|
||||
if (ret2 >= 0) {
|
||||
/* Ignore errors. This is just providing extra information, it
|
||||
@@ -2623,7 +2621,7 @@ int coroutine_fn
|
||||
bdrv_co_common_block_status_above(BlockDriverState *bs,
|
||||
BlockDriverState *base,
|
||||
bool include_base,
|
||||
- bool want_zero,
|
||||
+ unsigned int mode,
|
||||
int64_t offset,
|
||||
int64_t bytes,
|
||||
int64_t *pnum,
|
||||
@@ -2650,7 +2648,7 @@ bdrv_co_common_block_status_above(BlockDriverState *bs,
|
||||
return 0;
|
||||
}
|
||||
|
||||
- ret = bdrv_co_do_block_status(bs, want_zero, offset, bytes, pnum,
|
||||
+ ret = bdrv_co_do_block_status(bs, mode, offset, bytes, pnum,
|
||||
map, file);
|
||||
++*depth;
|
||||
if (ret < 0 || *pnum == 0 || ret & BDRV_BLOCK_ALLOCATED || bs == base) {
|
||||
@@ -2667,7 +2665,7 @@ bdrv_co_common_block_status_above(BlockDriverState *bs,
|
||||
for (p = bdrv_filter_or_cow_bs(bs); include_base || p != base;
|
||||
p = bdrv_filter_or_cow_bs(p))
|
||||
{
|
||||
- ret = bdrv_co_do_block_status(p, want_zero, offset, bytes, pnum,
|
||||
+ ret = bdrv_co_do_block_status(p, mode, offset, bytes, pnum,
|
||||
map, file);
|
||||
++*depth;
|
||||
if (ret < 0) {
|
||||
@@ -2730,7 +2728,8 @@ int coroutine_fn bdrv_co_block_status_above(BlockDriverState *bs,
|
||||
BlockDriverState **file)
|
||||
{
|
||||
IO_CODE();
|
||||
- return bdrv_co_common_block_status_above(bs, base, false, true, offset,
|
||||
+ return bdrv_co_common_block_status_above(bs, base, false,
|
||||
+ BDRV_WANT_PRECISE, offset,
|
||||
bytes, pnum, map, file, NULL);
|
||||
}
|
||||
|
||||
@@ -2761,8 +2760,9 @@ int coroutine_fn bdrv_co_is_zero_fast(BlockDriverState *bs, int64_t offset,
|
||||
return 1;
|
||||
}
|
||||
|
||||
- ret = bdrv_co_common_block_status_above(bs, NULL, false, false, offset,
|
||||
- bytes, &pnum, NULL, NULL, NULL);
|
||||
+ ret = bdrv_co_common_block_status_above(bs, NULL, false, BDRV_WANT_ZERO,
|
||||
+ offset, bytes, &pnum, NULL, NULL,
|
||||
+ NULL);
|
||||
|
||||
if (ret < 0) {
|
||||
return ret;
|
||||
@@ -2778,9 +2778,9 @@ int coroutine_fn bdrv_co_is_allocated(BlockDriverState *bs, int64_t offset,
|
||||
int64_t dummy;
|
||||
IO_CODE();
|
||||
|
||||
- ret = bdrv_co_common_block_status_above(bs, bs, true, false, offset,
|
||||
- bytes, pnum ? pnum : &dummy, NULL,
|
||||
- NULL, NULL);
|
||||
+ ret = bdrv_co_common_block_status_above(bs, bs, true, BDRV_WANT_ALLOCATED,
|
||||
+ offset, bytes, pnum ? pnum : &dummy,
|
||||
+ NULL, NULL, NULL);
|
||||
if (ret < 0) {
|
||||
return ret;
|
||||
}
|
||||
@@ -2813,7 +2813,8 @@ int coroutine_fn bdrv_co_is_allocated_above(BlockDriverState *bs,
|
||||
int ret;
|
||||
IO_CODE();
|
||||
|
||||
- ret = bdrv_co_common_block_status_above(bs, base, include_base, false,
|
||||
+ ret = bdrv_co_common_block_status_above(bs, base, include_base,
|
||||
+ BDRV_WANT_ALLOCATED,
|
||||
offset, bytes, pnum, NULL, NULL,
|
||||
&depth);
|
||||
if (ret < 0) {
|
||||
@@ -3710,8 +3711,8 @@ bdrv_co_preadv_snapshot(BdrvChild *child, int64_t offset, int64_t bytes,
|
||||
}
|
||||
|
||||
int coroutine_fn
|
||||
-bdrv_co_snapshot_block_status(BlockDriverState *bs,
|
||||
- bool want_zero, int64_t offset, int64_t bytes,
|
||||
+bdrv_co_snapshot_block_status(BlockDriverState *bs, unsigned int mode,
|
||||
+ int64_t offset, int64_t bytes,
|
||||
int64_t *pnum, int64_t *map,
|
||||
BlockDriverState **file)
|
||||
{
|
||||
@@ -3729,7 +3730,7 @@ bdrv_co_snapshot_block_status(BlockDriverState *bs,
|
||||
}
|
||||
|
||||
bdrv_inc_in_flight(bs);
|
||||
- ret = drv->bdrv_co_snapshot_block_status(bs, want_zero, offset, bytes,
|
||||
+ ret = drv->bdrv_co_snapshot_block_status(bs, mode, offset, bytes,
|
||||
pnum, map, file);
|
||||
bdrv_dec_in_flight(bs);
|
||||
|
||||
diff --git a/block/iscsi.c b/block/iscsi.c
|
||||
index 979bf90cb7..d7caa4b363 100644
|
||||
--- a/block/iscsi.c
|
||||
+++ b/block/iscsi.c
|
||||
@@ -694,9 +694,9 @@ out_unlock:
|
||||
|
||||
|
||||
static int coroutine_fn iscsi_co_block_status(BlockDriverState *bs,
|
||||
- bool want_zero, int64_t offset,
|
||||
- int64_t bytes, int64_t *pnum,
|
||||
- int64_t *map,
|
||||
+ unsigned int mode,
|
||||
+ int64_t offset, int64_t bytes,
|
||||
+ int64_t *pnum, int64_t *map,
|
||||
BlockDriverState **file)
|
||||
{
|
||||
IscsiLun *iscsilun = bs->opaque;
|
||||
diff --git a/block/nbd.c b/block/nbd.c
|
||||
index d464315766..a359aa236e 100644
|
||||
--- a/block/nbd.c
|
||||
+++ b/block/nbd.c
|
||||
@@ -1397,8 +1397,8 @@ nbd_client_co_pdiscard(BlockDriverState *bs, int64_t offset, int64_t bytes)
|
||||
}
|
||||
|
||||
static int coroutine_fn GRAPH_RDLOCK nbd_client_co_block_status(
|
||||
- BlockDriverState *bs, bool want_zero, int64_t offset, int64_t bytes,
|
||||
- int64_t *pnum, int64_t *map, BlockDriverState **file)
|
||||
+ BlockDriverState *bs, unsigned int mode, int64_t offset,
|
||||
+ int64_t bytes, int64_t *pnum, int64_t *map, BlockDriverState **file)
|
||||
{
|
||||
int ret, request_ret;
|
||||
NBDExtent64 extent = { 0 };
|
||||
diff --git a/block/null.c b/block/null.c
|
||||
index 4730acc1eb..95021230c8 100644
|
||||
--- a/block/null.c
|
||||
+++ b/block/null.c
|
||||
@@ -227,9 +227,9 @@ static int null_reopen_prepare(BDRVReopenState *reopen_state,
|
||||
}
|
||||
|
||||
static int coroutine_fn null_co_block_status(BlockDriverState *bs,
|
||||
- bool want_zero, int64_t offset,
|
||||
- int64_t bytes, int64_t *pnum,
|
||||
- int64_t *map,
|
||||
+ unsigned int mode,
|
||||
+ int64_t offset, int64_t bytes,
|
||||
+ int64_t *pnum, int64_t *map,
|
||||
BlockDriverState **file)
|
||||
{
|
||||
BDRVNullState *s = bs->opaque;
|
||||
diff --git a/block/parallels.c b/block/parallels.c
|
||||
index 9205a0864f..22ea7834fd 100644
|
||||
--- a/block/parallels.c
|
||||
+++ b/block/parallels.c
|
||||
@@ -416,9 +416,9 @@ parallels_co_flush_to_os(BlockDriverState *bs)
|
||||
}
|
||||
|
||||
static int coroutine_fn GRAPH_RDLOCK
|
||||
-parallels_co_block_status(BlockDriverState *bs, bool want_zero, int64_t offset,
|
||||
- int64_t bytes, int64_t *pnum, int64_t *map,
|
||||
- BlockDriverState **file)
|
||||
+parallels_co_block_status(BlockDriverState *bs, unsigned int mode,
|
||||
+ int64_t offset, int64_t bytes, int64_t *pnum,
|
||||
+ int64_t *map, BlockDriverState **file)
|
||||
{
|
||||
BDRVParallelsState *s = bs->opaque;
|
||||
int count;
|
||||
diff --git a/block/qcow.c b/block/qcow.c
|
||||
index c2f89db055..2e18c42d8f 100644
|
||||
--- a/block/qcow.c
|
||||
+++ b/block/qcow.c
|
||||
@@ -530,7 +530,7 @@ get_cluster_offset(BlockDriverState *bs, uint64_t offset, int allocate,
|
||||
}
|
||||
|
||||
static int coroutine_fn GRAPH_RDLOCK
|
||||
-qcow_co_block_status(BlockDriverState *bs, bool want_zero,
|
||||
+qcow_co_block_status(BlockDriverState *bs, unsigned int mode,
|
||||
int64_t offset, int64_t bytes, int64_t *pnum,
|
||||
int64_t *map, BlockDriverState **file)
|
||||
{
|
||||
diff --git a/block/qcow2.c b/block/qcow2.c
|
||||
index a4cffb628c..788da07fee 100644
|
||||
--- a/block/qcow2.c
|
||||
+++ b/block/qcow2.c
|
||||
@@ -2147,9 +2147,9 @@ static void qcow2_join_options(QDict *options, QDict *old_options)
|
||||
}
|
||||
|
||||
static int coroutine_fn GRAPH_RDLOCK
|
||||
-qcow2_co_block_status(BlockDriverState *bs, bool want_zero, int64_t offset,
|
||||
- int64_t count, int64_t *pnum, int64_t *map,
|
||||
- BlockDriverState **file)
|
||||
+qcow2_co_block_status(BlockDriverState *bs, unsigned int mode,
|
||||
+ int64_t offset, int64_t count, int64_t *pnum,
|
||||
+ int64_t *map, BlockDriverState **file)
|
||||
{
|
||||
BDRVQcow2State *s = bs->opaque;
|
||||
uint64_t host_offset;
|
||||
diff --git a/block/qed.c b/block/qed.c
|
||||
index fa5bc11085..b135e981e5 100644
|
||||
--- a/block/qed.c
|
||||
+++ b/block/qed.c
|
||||
@@ -832,9 +832,9 @@ fail:
|
||||
}
|
||||
|
||||
static int coroutine_fn GRAPH_RDLOCK
|
||||
-bdrv_qed_co_block_status(BlockDriverState *bs, bool want_zero, int64_t pos,
|
||||
- int64_t bytes, int64_t *pnum, int64_t *map,
|
||||
- BlockDriverState **file)
|
||||
+bdrv_qed_co_block_status(BlockDriverState *bs, unsigned int mode,
|
||||
+ int64_t pos, int64_t bytes, int64_t *pnum,
|
||||
+ int64_t *map, BlockDriverState **file)
|
||||
{
|
||||
BDRVQEDState *s = bs->opaque;
|
||||
size_t len = MIN(bytes, SIZE_MAX);
|
||||
diff --git a/block/quorum.c b/block/quorum.c
|
||||
index db8fe891c4..bb4ed9483e 100644
|
||||
--- a/block/quorum.c
|
||||
+++ b/block/quorum.c
|
||||
@@ -1226,7 +1226,7 @@ static void quorum_child_perm(BlockDriverState *bs, BdrvChild *c,
|
||||
* region contains zeroes, and BDRV_BLOCK_DATA otherwise.
|
||||
*/
|
||||
static int coroutine_fn GRAPH_RDLOCK
|
||||
-quorum_co_block_status(BlockDriverState *bs, bool want_zero,
|
||||
+quorum_co_block_status(BlockDriverState *bs, unsigned int mode,
|
||||
int64_t offset, int64_t count,
|
||||
int64_t *pnum, int64_t *map, BlockDriverState **file)
|
||||
{
|
||||
@@ -1238,7 +1238,7 @@ quorum_co_block_status(BlockDriverState *bs, bool want_zero,
|
||||
for (i = 0; i < s->num_children; i++) {
|
||||
int64_t bytes;
|
||||
ret = bdrv_co_common_block_status_above(s->children[i]->bs, NULL, false,
|
||||
- want_zero, offset, count,
|
||||
+ mode, offset, count,
|
||||
&bytes, NULL, NULL, NULL);
|
||||
if (ret < 0) {
|
||||
quorum_report_bad(QUORUM_OP_TYPE_READ, offset, count,
|
||||
diff --git a/block/raw-format.c b/block/raw-format.c
|
||||
index ac7e8495f6..623bca87a6 100644
|
||||
--- a/block/raw-format.c
|
||||
+++ b/block/raw-format.c
|
||||
@@ -283,8 +283,8 @@ fail:
|
||||
}
|
||||
|
||||
static int coroutine_fn GRAPH_RDLOCK
|
||||
-raw_co_block_status(BlockDriverState *bs, bool want_zero, int64_t offset,
|
||||
- int64_t bytes, int64_t *pnum, int64_t *map,
|
||||
+raw_co_block_status(BlockDriverState *bs, unsigned int mode,
|
||||
+ int64_t offset, int64_t bytes, int64_t *pnum, int64_t *map,
|
||||
BlockDriverState **file)
|
||||
{
|
||||
BDRVRawState *s = bs->opaque;
|
||||
diff --git a/block/rbd.c b/block/rbd.c
|
||||
index 9c0fd0cb3f..627f8eb05a 100644
|
||||
--- a/block/rbd.c
|
||||
+++ b/block/rbd.c
|
||||
@@ -1504,9 +1504,9 @@ static int qemu_rbd_diff_iterate_cb(uint64_t offs, size_t len,
|
||||
}
|
||||
|
||||
static int coroutine_fn qemu_rbd_co_block_status(BlockDriverState *bs,
|
||||
- bool want_zero, int64_t offset,
|
||||
- int64_t bytes, int64_t *pnum,
|
||||
- int64_t *map,
|
||||
+ unsigned int mode,
|
||||
+ int64_t offset, int64_t bytes,
|
||||
+ int64_t *pnum, int64_t *map,
|
||||
BlockDriverState **file)
|
||||
{
|
||||
BDRVRBDState *s = bs->opaque;
|
||||
diff --git a/block/snapshot-access.c b/block/snapshot-access.c
|
||||
index 84d0d13f86..972b8f2e68 100644
|
||||
--- a/block/snapshot-access.c
|
||||
+++ b/block/snapshot-access.c
|
||||
@@ -41,11 +41,11 @@ snapshot_access_co_preadv_part(BlockDriverState *bs,
|
||||
|
||||
static int coroutine_fn GRAPH_RDLOCK
|
||||
snapshot_access_co_block_status(BlockDriverState *bs,
|
||||
- bool want_zero, int64_t offset,
|
||||
+ unsigned int mode, int64_t offset,
|
||||
int64_t bytes, int64_t *pnum,
|
||||
int64_t *map, BlockDriverState **file)
|
||||
{
|
||||
- return bdrv_co_snapshot_block_status(bs->file->bs, want_zero, offset,
|
||||
+ return bdrv_co_snapshot_block_status(bs->file->bs, mode, offset,
|
||||
bytes, pnum, map, file);
|
||||
}
|
||||
|
||||
diff --git a/block/vdi.c b/block/vdi.c
|
||||
index 6363da08ce..028fe68488 100644
|
||||
--- a/block/vdi.c
|
||||
+++ b/block/vdi.c
|
||||
@@ -521,8 +521,8 @@ static int vdi_reopen_prepare(BDRVReopenState *state,
|
||||
}
|
||||
|
||||
static int coroutine_fn GRAPH_RDLOCK
|
||||
-vdi_co_block_status(BlockDriverState *bs, bool want_zero, int64_t offset,
|
||||
- int64_t bytes, int64_t *pnum, int64_t *map,
|
||||
+vdi_co_block_status(BlockDriverState *bs, unsigned int mode,
|
||||
+ int64_t offset, int64_t bytes, int64_t *pnum, int64_t *map,
|
||||
BlockDriverState **file)
|
||||
{
|
||||
BDRVVdiState *s = (BDRVVdiState *)bs->opaque;
|
||||
diff --git a/block/vmdk.c b/block/vmdk.c
|
||||
index 78f6433607..6f1af82078 100644
|
||||
--- a/block/vmdk.c
|
||||
+++ b/block/vmdk.c
|
||||
@@ -1777,7 +1777,7 @@ static inline uint64_t vmdk_find_offset_in_cluster(VmdkExtent *extent,
|
||||
}
|
||||
|
||||
static int coroutine_fn GRAPH_RDLOCK
|
||||
-vmdk_co_block_status(BlockDriverState *bs, bool want_zero,
|
||||
+vmdk_co_block_status(BlockDriverState *bs, unsigned int mode,
|
||||
int64_t offset, int64_t bytes, int64_t *pnum,
|
||||
int64_t *map, BlockDriverState **file)
|
||||
{
|
||||
diff --git a/block/vpc.c b/block/vpc.c
|
||||
index d95a204612..0dd641b614 100644
|
||||
--- a/block/vpc.c
|
||||
+++ b/block/vpc.c
|
||||
@@ -721,7 +721,7 @@ fail:
|
||||
}
|
||||
|
||||
static int coroutine_fn GRAPH_RDLOCK
|
||||
-vpc_co_block_status(BlockDriverState *bs, bool want_zero,
|
||||
+vpc_co_block_status(BlockDriverState *bs, unsigned int mode,
|
||||
int64_t offset, int64_t bytes,
|
||||
int64_t *pnum, int64_t *map,
|
||||
BlockDriverState **file)
|
||||
diff --git a/block/vvfat.c b/block/vvfat.c
|
||||
index 8ffe8b3b9b..d59231357e 100644
|
||||
--- a/block/vvfat.c
|
||||
+++ b/block/vvfat.c
|
||||
@@ -3135,9 +3135,9 @@ vvfat_co_pwritev(BlockDriverState *bs, int64_t offset, int64_t bytes,
|
||||
}
|
||||
|
||||
static int coroutine_fn vvfat_co_block_status(BlockDriverState *bs,
|
||||
- bool want_zero, int64_t offset,
|
||||
- int64_t bytes, int64_t *n,
|
||||
- int64_t *map,
|
||||
+ unsigned int mode,
|
||||
+ int64_t offset, int64_t bytes,
|
||||
+ int64_t *n, int64_t *map,
|
||||
BlockDriverState **file)
|
||||
{
|
||||
*n = bytes;
|
||||
diff --git a/include/block/block-common.h b/include/block/block-common.h
|
||||
index 7030669f04..5beee6402b 100644
|
||||
--- a/include/block/block-common.h
|
||||
+++ b/include/block/block-common.h
|
||||
@@ -333,6 +333,17 @@ typedef enum {
|
||||
#define BDRV_BLOCK_RECURSE 0x40
|
||||
#define BDRV_BLOCK_COMPRESSED 0x80
|
||||
|
||||
+/*
|
||||
+ * Block status hints: the bitwise-or of these flags emphasize what
|
||||
+ * the caller hopes to learn, and some drivers may be able to give
|
||||
+ * faster answers by doing less work when the hint permits.
|
||||
+ */
|
||||
+#define BDRV_WANT_ZERO BDRV_BLOCK_ZERO
|
||||
+#define BDRV_WANT_OFFSET_VALID BDRV_BLOCK_OFFSET_VALID
|
||||
+#define BDRV_WANT_ALLOCATED BDRV_BLOCK_ALLOCATED
|
||||
+#define BDRV_WANT_PRECISE (BDRV_WANT_ZERO | BDRV_WANT_OFFSET_VALID | \
|
||||
+ BDRV_WANT_OFFSET_VALID)
|
||||
+
|
||||
typedef QTAILQ_HEAD(BlockReopenQueue, BlockReopenQueueEntry) BlockReopenQueue;
|
||||
|
||||
typedef struct BDRVReopenState {
|
||||
diff --git a/include/block/block_int-common.h b/include/block/block_int-common.h
|
||||
index ebb4e56a50..a9c0daa2a4 100644
|
||||
--- a/include/block/block_int-common.h
|
||||
+++ b/include/block/block_int-common.h
|
||||
@@ -608,15 +608,16 @@ struct BlockDriver {
|
||||
* according to the current layer, and should only need to set
|
||||
* BDRV_BLOCK_DATA, BDRV_BLOCK_ZERO, BDRV_BLOCK_OFFSET_VALID,
|
||||
* and/or BDRV_BLOCK_RAW; if the current layer defers to a backing
|
||||
- * layer, the result should be 0 (and not BDRV_BLOCK_ZERO). See
|
||||
- * block.h for the overall meaning of the bits. As a hint, the
|
||||
- * flag want_zero is true if the caller cares more about precise
|
||||
- * mappings (favor accurate _OFFSET_VALID/_ZERO) or false for
|
||||
- * overall allocation (favor larger *pnum, perhaps by reporting
|
||||
- * _DATA instead of _ZERO). The block layer guarantees input
|
||||
- * clamped to bdrv_getlength() and aligned to request_alignment,
|
||||
- * as well as non-NULL pnum, map, and file; in turn, the driver
|
||||
- * must return an error or set pnum to an aligned non-zero value.
|
||||
+ * layer, the result should be 0 (and not BDRV_BLOCK_ZERO). The
|
||||
+ * caller will synthesize BDRV_BLOCK_ALLOCATED based on the
|
||||
+ * non-zero results. See block.h for the overall meaning of the
|
||||
+ * bits. As a hint, the flags in @mode may include a bitwise-or
|
||||
+ * of BDRV_WANT_ALLOCATED, BDRV_WANT_OFFSET_VALID, or
|
||||
+ * BDRV_WANT_ZERO based on what the caller is looking for in the
|
||||
+ * results. The block layer guarantees input clamped to
|
||||
+ * bdrv_getlength() and aligned to request_alignment, as well as
|
||||
+ * non-NULL pnum, map, and file; in turn, the driver must return
|
||||
+ * an error or set pnum to an aligned non-zero value.
|
||||
*
|
||||
* Note that @bytes is just a hint on how big of a region the
|
||||
* caller wants to inspect. It is not a limit on *pnum.
|
||||
@@ -628,8 +629,8 @@ struct BlockDriver {
|
||||
* to clamping *pnum for return to its caller.
|
||||
*/
|
||||
int coroutine_fn GRAPH_RDLOCK_PTR (*bdrv_co_block_status)(
|
||||
- BlockDriverState *bs,
|
||||
- bool want_zero, int64_t offset, int64_t bytes, int64_t *pnum,
|
||||
+ BlockDriverState *bs, unsigned int mode,
|
||||
+ int64_t offset, int64_t bytes, int64_t *pnum,
|
||||
int64_t *map, BlockDriverState **file);
|
||||
|
||||
/*
|
||||
@@ -653,8 +654,8 @@ struct BlockDriver {
|
||||
QEMUIOVector *qiov, size_t qiov_offset);
|
||||
|
||||
int coroutine_fn GRAPH_RDLOCK_PTR (*bdrv_co_snapshot_block_status)(
|
||||
- BlockDriverState *bs, bool want_zero, int64_t offset, int64_t bytes,
|
||||
- int64_t *pnum, int64_t *map, BlockDriverState **file);
|
||||
+ BlockDriverState *bs, unsigned int mode, int64_t offset,
|
||||
+ int64_t bytes, int64_t *pnum, int64_t *map, BlockDriverState **file);
|
||||
|
||||
int coroutine_fn GRAPH_RDLOCK_PTR (*bdrv_co_pdiscard_snapshot)(
|
||||
BlockDriverState *bs, int64_t offset, int64_t bytes);
|
||||
diff --git a/include/block/block_int-io.h b/include/block/block_int-io.h
|
||||
index 4a7cf2b4fd..4f94eb3c5a 100644
|
||||
--- a/include/block/block_int-io.h
|
||||
+++ b/include/block/block_int-io.h
|
||||
@@ -38,8 +38,8 @@
|
||||
int coroutine_fn GRAPH_RDLOCK bdrv_co_preadv_snapshot(BdrvChild *child,
|
||||
int64_t offset, int64_t bytes, QEMUIOVector *qiov, size_t qiov_offset);
|
||||
int coroutine_fn GRAPH_RDLOCK bdrv_co_snapshot_block_status(
|
||||
- BlockDriverState *bs, bool want_zero, int64_t offset, int64_t bytes,
|
||||
- int64_t *pnum, int64_t *map, BlockDriverState **file);
|
||||
+ BlockDriverState *bs, unsigned int mode, int64_t offset,
|
||||
+ int64_t bytes, int64_t *pnum, int64_t *map, BlockDriverState **file);
|
||||
int coroutine_fn GRAPH_RDLOCK bdrv_co_pdiscard_snapshot(BlockDriverState *bs,
|
||||
int64_t offset, int64_t bytes);
|
||||
|
||||
diff --git a/tests/unit/test-block-iothread.c b/tests/unit/test-block-iothread.c
|
||||
index 3766d5de6b..373b72fdd8 100644
|
||||
--- a/tests/unit/test-block-iothread.c
|
||||
+++ b/tests/unit/test-block-iothread.c
|
||||
@@ -63,7 +63,7 @@ bdrv_test_co_truncate(BlockDriverState *bs, int64_t offset, bool exact,
|
||||
}
|
||||
|
||||
static int coroutine_fn bdrv_test_co_block_status(BlockDriverState *bs,
|
||||
- bool want_zero,
|
||||
+ unsigned int mode,
|
||||
int64_t offset, int64_t count,
|
||||
int64_t *pnum, int64_t *map,
|
||||
BlockDriverState **file)
|
||||
--
|
||||
2.48.1
|
||||
|
||||
@ -1,68 +0,0 @@
|
||||
From eed2b4b40553cae162407b375f18c935f5025c53 Mon Sep 17 00:00:00 2001
|
||||
From: Kevin Wolf <kwolf@redhat.com>
|
||||
Date: Tue, 4 Feb 2025 22:13:57 +0100
|
||||
Subject: [PATCH 13/23] block: Fix crash on block_resize on inactive node
|
||||
|
||||
RH-Author: Kevin Wolf <kwolf@redhat.com>
|
||||
RH-MergeRequest: 339: QMP command for block device reactivation after migration
|
||||
RH-Jira: RHEL-54296 RHEL-78397
|
||||
RH-Acked-by: Eric Blake <eblake@redhat.com>
|
||||
RH-Acked-by: Stefan Hajnoczi <stefanha@redhat.com>
|
||||
RH-Commit: [12/22] e352c665f68a865859cc62fe1ed6e4044407b8e3 (kmwolf/centos-qemu-kvm)
|
||||
|
||||
In order for block_resize to fail gracefully on an inactive node instead
|
||||
of crashing with an assertion failure in bdrv_co_write_req_prepare()
|
||||
(called from bdrv_co_truncate()), we need to check for inactive nodes
|
||||
also when they are attached as a root node and make sure that
|
||||
BLK_PERM_RESIZE isn't among the permissions allowed for inactive nodes.
|
||||
To this effect, don't enumerate the permissions that are incompatible
|
||||
with inactive nodes any more, but allow only BLK_PERM_CONSISTENT_READ
|
||||
for them.
|
||||
|
||||
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
|
||||
Acked-by: Fabiano Rosas <farosas@suse.de>
|
||||
Reviewed-by: Eric Blake <eblake@redhat.com>
|
||||
Reviewed-by: Stefan Hajnoczi <stefanha@redhat.com>
|
||||
Message-ID: <20250204211407.381505-7-kwolf@redhat.com>
|
||||
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
|
||||
(cherry picked from commit 8c2c72a33581987af8d8c484d03af3cd69b9e10a)
|
||||
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
|
||||
---
|
||||
block.c | 7 +++++++
|
||||
block/block-backend.c | 2 +-
|
||||
2 files changed, 8 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/block.c b/block.c
|
||||
index 41e72e6965..bedd54deaa 100644
|
||||
--- a/block.c
|
||||
+++ b/block.c
|
||||
@@ -3077,6 +3077,13 @@ bdrv_attach_child_common(BlockDriverState *child_bs,
|
||||
assert(child_class->get_parent_desc);
|
||||
GLOBAL_STATE_CODE();
|
||||
|
||||
+ if (bdrv_is_inactive(child_bs) && (perm & ~BLK_PERM_CONSISTENT_READ)) {
|
||||
+ g_autofree char *perm_names = bdrv_perm_names(perm);
|
||||
+ error_setg(errp, "Permission '%s' unavailable on inactive node",
|
||||
+ perm_names);
|
||||
+ return NULL;
|
||||
+ }
|
||||
+
|
||||
new_child = g_new(BdrvChild, 1);
|
||||
*new_child = (BdrvChild) {
|
||||
.bs = NULL,
|
||||
diff --git a/block/block-backend.c b/block/block-backend.c
|
||||
index db6f9b92a3..356db1b703 100644
|
||||
--- a/block/block-backend.c
|
||||
+++ b/block/block-backend.c
|
||||
@@ -253,7 +253,7 @@ static bool blk_can_inactivate(BlockBackend *blk)
|
||||
* guest. For block job BBs that satisfy this, we can just allow
|
||||
* it. This is the case for mirror job source, which is required
|
||||
* by libvirt non-shared block migration. */
|
||||
- if (!(blk->perm & (BLK_PERM_WRITE | BLK_PERM_WRITE_UNCHANGED))) {
|
||||
+ if (!(blk->perm & ~BLK_PERM_CONSISTENT_READ)) {
|
||||
return true;
|
||||
}
|
||||
|
||||
--
|
||||
2.48.1
|
||||
|
||||
@ -1,68 +0,0 @@
|
||||
From 6f4a7e3489a104137f60e034157cf687e4c3158f Mon Sep 17 00:00:00 2001
|
||||
From: Kevin Wolf <kwolf@redhat.com>
|
||||
Date: Tue, 4 Feb 2025 22:13:54 +0100
|
||||
Subject: [PATCH 10/23] block: Inactivate external snapshot overlays when
|
||||
necessary
|
||||
|
||||
RH-Author: Kevin Wolf <kwolf@redhat.com>
|
||||
RH-MergeRequest: 339: QMP command for block device reactivation after migration
|
||||
RH-Jira: RHEL-54296 RHEL-78397
|
||||
RH-Acked-by: Eric Blake <eblake@redhat.com>
|
||||
RH-Acked-by: Stefan Hajnoczi <stefanha@redhat.com>
|
||||
RH-Commit: [9/22] 59b39138f0da734d497f3a58d458992abc348978 (kmwolf/centos-qemu-kvm)
|
||||
|
||||
Putting an active block node on top of an inactive one is strictly
|
||||
speaking an invalid configuration and the next patch will turn it into a
|
||||
hard error.
|
||||
|
||||
However, taking a snapshot while disk images are inactive after
|
||||
completing migration has an important use case: After migrating to a
|
||||
file, taking an external snapshot is what is needed to take a full VM
|
||||
snapshot.
|
||||
|
||||
In order for this to keep working after the later patches, change
|
||||
creating a snapshot such that it automatically inactivates an overlay
|
||||
that is added on top of an already inactive node.
|
||||
|
||||
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
|
||||
Acked-by: Fabiano Rosas <farosas@suse.de>
|
||||
Reviewed-by: Eric Blake <eblake@redhat.com>
|
||||
Reviewed-by: Stefan Hajnoczi <stefanha@redhat.com>
|
||||
Message-ID: <20250204211407.381505-4-kwolf@redhat.com>
|
||||
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
|
||||
(cherry picked from commit e80210ffb24c4e47650344ba77ce3ed354af596c)
|
||||
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
|
||||
---
|
||||
blockdev.c | 16 ++++++++++++++++
|
||||
1 file changed, 16 insertions(+)
|
||||
|
||||
diff --git a/blockdev.c b/blockdev.c
|
||||
index 835064ed03..81430122df 100644
|
||||
--- a/blockdev.c
|
||||
+++ b/blockdev.c
|
||||
@@ -1497,6 +1497,22 @@ static void external_snapshot_action(TransactionAction *action,
|
||||
return;
|
||||
}
|
||||
|
||||
+ /*
|
||||
+ * Older QEMU versions have allowed adding an active parent node to an
|
||||
+ * inactive child node. This is unsafe in the general case, but there is an
|
||||
+ * important use case, which is taking a VM snapshot with migration to file
|
||||
+ * and then adding an external snapshot while the VM is still stopped and
|
||||
+ * images are inactive. Requiring the user to explicitly create the overlay
|
||||
+ * as inactive would break compatibility, so just do it automatically here
|
||||
+ * to keep this working.
|
||||
+ */
|
||||
+ if (bdrv_is_inactive(state->old_bs) && !bdrv_is_inactive(state->new_bs)) {
|
||||
+ ret = bdrv_inactivate(state->new_bs, errp);
|
||||
+ if (ret < 0) {
|
||||
+ return;
|
||||
+ }
|
||||
+ }
|
||||
+
|
||||
ret = bdrv_append(state->new_bs, state->old_bs, errp);
|
||||
if (ret < 0) {
|
||||
return;
|
||||
--
|
||||
2.48.1
|
||||
|
||||
@ -1,90 +0,0 @@
|
||||
From 9f8158e56beae4221e91feb5a98cb4db9076cac4 Mon Sep 17 00:00:00 2001
|
||||
From: Eric Blake <eblake@redhat.com>
|
||||
Date: Fri, 9 May 2025 15:40:20 -0500
|
||||
Subject: [PATCH 05/16] block: Let bdrv_co_is_zero_fast consolidate adjacent
|
||||
extents
|
||||
|
||||
RH-Author: Eric Blake <eblake@redhat.com>
|
||||
RH-MergeRequest: 365: blockdev-mirror: More efficient handling of sparse mirrors
|
||||
RH-Jira: RHEL-82906 RHEL-83015
|
||||
RH-Acked-by: Stefan Hajnoczi <stefanha@redhat.com>
|
||||
RH-Acked-by: Jon Maloy <jmaloy@redhat.com>
|
||||
RH-Commit: [3/14] 98bf9ff773d9a36f8a8e294e38629e3f20c41334 (ebblake/centos-qemu-kvm)
|
||||
|
||||
Some BDS drivers have a cap on how much block status they can supply
|
||||
in one query (for example, NBD talking to an older server cannot
|
||||
inspect more than 4G per query; and qcow2 tends to cap its answers
|
||||
rather than cross a cluster boundary of an L1 table). Although the
|
||||
existing callers of bdrv_co_is_zero_fast are not passing in that large
|
||||
of a 'bytes' parameter, an upcoming caller wants to query the entire
|
||||
image at once, and will thus benefit from being able to treat adjacent
|
||||
zero regions in a coalesced manner, rather than claiming the region is
|
||||
non-zero merely because pnum was truncated and didn't match the
|
||||
incoming bytes.
|
||||
|
||||
While refactoring this into a loop, note that there is no need to
|
||||
assign pnum prior to calling bdrv_co_common_block_status_above() (it
|
||||
is guaranteed to be assigned deeper in the callstack).
|
||||
|
||||
Signed-off-by: Eric Blake <eblake@redhat.com>
|
||||
Reviewed-by: Stefan Hajnoczi <stefanha@redhat.com>
|
||||
Message-ID: <20250509204341.3553601-18-eblake@redhat.com>
|
||||
(cherry picked from commit 31bf15d97dd1d205a3b264675f9a1b3bd1939068)
|
||||
Jira: https://issues.redhat.com/browse/RHEL-82906
|
||||
Jira: https://issues.redhat.com/browse/RHEL-83015
|
||||
Signed-off-by: Eric Blake <eblake@redhat.com>
|
||||
---
|
||||
block/io.c | 27 +++++++++++++++------------
|
||||
1 file changed, 15 insertions(+), 12 deletions(-)
|
||||
|
||||
diff --git a/block/io.c b/block/io.c
|
||||
index daaafe00d7..293c5dd393 100644
|
||||
--- a/block/io.c
|
||||
+++ b/block/io.c
|
||||
@@ -2747,28 +2747,31 @@ int coroutine_fn bdrv_co_block_status(BlockDriverState *bs, int64_t offset,
|
||||
* by @offset and @bytes is known to read as zeroes.
|
||||
* Return 1 if that is the case, 0 otherwise and -errno on error.
|
||||
* This test is meant to be fast rather than accurate so returning 0
|
||||
- * does not guarantee non-zero data.
|
||||
+ * does not guarantee non-zero data; but a return of 1 is reliable.
|
||||
*/
|
||||
int coroutine_fn bdrv_co_is_zero_fast(BlockDriverState *bs, int64_t offset,
|
||||
int64_t bytes)
|
||||
{
|
||||
int ret;
|
||||
- int64_t pnum = bytes;
|
||||
+ int64_t pnum;
|
||||
IO_CODE();
|
||||
|
||||
- if (!bytes) {
|
||||
- return 1;
|
||||
- }
|
||||
-
|
||||
- ret = bdrv_co_common_block_status_above(bs, NULL, false, BDRV_WANT_ZERO,
|
||||
- offset, bytes, &pnum, NULL, NULL,
|
||||
- NULL);
|
||||
+ while (bytes) {
|
||||
+ ret = bdrv_co_common_block_status_above(bs, NULL, false,
|
||||
+ BDRV_WANT_ZERO, offset, bytes,
|
||||
+ &pnum, NULL, NULL, NULL);
|
||||
|
||||
- if (ret < 0) {
|
||||
- return ret;
|
||||
+ if (ret < 0) {
|
||||
+ return ret;
|
||||
+ }
|
||||
+ if (!(ret & BDRV_BLOCK_ZERO)) {
|
||||
+ return 0;
|
||||
+ }
|
||||
+ offset += pnum;
|
||||
+ bytes -= pnum;
|
||||
}
|
||||
|
||||
- return (pnum == bytes) && (ret & BDRV_BLOCK_ZERO);
|
||||
+ return 1;
|
||||
}
|
||||
|
||||
int coroutine_fn bdrv_co_is_allocated(BlockDriverState *bs, int64_t offset,
|
||||
--
|
||||
2.48.1
|
||||
|
||||
@ -1,66 +0,0 @@
|
||||
From 9ab8c39284c0fc2d9d685706b2d788ab02930a08 Mon Sep 17 00:00:00 2001
|
||||
From: Kevin Wolf <kwolf@redhat.com>
|
||||
Date: Tue, 4 Feb 2025 22:14:00 +0100
|
||||
Subject: [PATCH 16/23] block: Support inactive nodes in blk_insert_bs()
|
||||
|
||||
RH-Author: Kevin Wolf <kwolf@redhat.com>
|
||||
RH-MergeRequest: 339: QMP command for block device reactivation after migration
|
||||
RH-Jira: RHEL-54296 RHEL-78397
|
||||
RH-Acked-by: Eric Blake <eblake@redhat.com>
|
||||
RH-Acked-by: Stefan Hajnoczi <stefanha@redhat.com>
|
||||
RH-Commit: [15/22] 17405266afeddc47f73828816d0b8c1ab5ece462 (kmwolf/centos-qemu-kvm)
|
||||
|
||||
Device models have a relatively complex way to set up their block
|
||||
backends, in which blk_attach_dev() sets blk->disable_perm = true.
|
||||
We want to support inactive images in exports, too, so that
|
||||
qemu-storage-daemon can be used with migration. Because they don't use
|
||||
blk_attach_dev(), they need another way to set this flag. The most
|
||||
convenient is to do this automatically when an inactive node is attached
|
||||
to a BlockBackend that can be inactivated.
|
||||
|
||||
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
|
||||
Acked-by: Fabiano Rosas <farosas@suse.de>
|
||||
Reviewed-by: Eric Blake <eblake@redhat.com>
|
||||
Reviewed-by: Stefan Hajnoczi <stefanha@redhat.com>
|
||||
Message-ID: <20250204211407.381505-10-kwolf@redhat.com>
|
||||
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
|
||||
(cherry picked from commit c1c5c7cc4ef6c45ca769c640566fd40d2cb7d5c1)
|
||||
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
|
||||
---
|
||||
block/block-backend.c | 14 ++++++++++++--
|
||||
1 file changed, 12 insertions(+), 2 deletions(-)
|
||||
|
||||
diff --git a/block/block-backend.c b/block/block-backend.c
|
||||
index 356db1b703..4a5a1c1f6a 100644
|
||||
--- a/block/block-backend.c
|
||||
+++ b/block/block-backend.c
|
||||
@@ -909,14 +909,24 @@ void blk_remove_bs(BlockBackend *blk)
|
||||
int blk_insert_bs(BlockBackend *blk, BlockDriverState *bs, Error **errp)
|
||||
{
|
||||
ThrottleGroupMember *tgm = &blk->public.throttle_group_member;
|
||||
+ uint64_t perm, shared_perm;
|
||||
|
||||
GLOBAL_STATE_CODE();
|
||||
bdrv_ref(bs);
|
||||
bdrv_graph_wrlock();
|
||||
+
|
||||
+ if ((bs->open_flags & BDRV_O_INACTIVE) && blk_can_inactivate(blk)) {
|
||||
+ blk->disable_perm = true;
|
||||
+ perm = 0;
|
||||
+ shared_perm = BLK_PERM_ALL;
|
||||
+ } else {
|
||||
+ perm = blk->perm;
|
||||
+ shared_perm = blk->shared_perm;
|
||||
+ }
|
||||
+
|
||||
blk->root = bdrv_root_attach_child(bs, "root", &child_root,
|
||||
BDRV_CHILD_FILTERED | BDRV_CHILD_PRIMARY,
|
||||
- blk->perm, blk->shared_perm,
|
||||
- blk, errp);
|
||||
+ perm, shared_perm, blk, errp);
|
||||
bdrv_graph_wrunlock();
|
||||
if (blk->root == NULL) {
|
||||
return -EPERM;
|
||||
--
|
||||
2.48.1
|
||||
|
||||
@ -1,135 +0,0 @@
|
||||
From 22de4ba6cec94a38cd56156d9114f06dc4d2a5a5 Mon Sep 17 00:00:00 2001
|
||||
From: Kevin Wolf <kwolf@redhat.com>
|
||||
Date: Tue, 4 Feb 2025 22:14:03 +0100
|
||||
Subject: [PATCH 19/23] block/export: Add option to allow export of inactive
|
||||
nodes
|
||||
|
||||
RH-Author: Kevin Wolf <kwolf@redhat.com>
|
||||
RH-MergeRequest: 339: QMP command for block device reactivation after migration
|
||||
RH-Jira: RHEL-54296 RHEL-78397
|
||||
RH-Acked-by: Eric Blake <eblake@redhat.com>
|
||||
RH-Acked-by: Stefan Hajnoczi <stefanha@redhat.com>
|
||||
RH-Commit: [18/22] 985eadb03f27d046b89ffeef1fb36ef2e4579552 (kmwolf/centos-qemu-kvm)
|
||||
|
||||
Add an option in BlockExportOptions to allow creating an export on an
|
||||
inactive node without activating the node. This mode needs to be
|
||||
explicitly supported by the export type (so that it doesn't perform any
|
||||
operations that are forbidden for inactive nodes), so this patch alone
|
||||
doesn't allow this option to be successfully used yet.
|
||||
|
||||
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
|
||||
Acked-by: Fabiano Rosas <farosas@suse.de>
|
||||
Reviewed-by: Eric Blake <eblake@redhat.com>
|
||||
Reviewed-by: Stefan Hajnoczi <stefanha@redhat.com>
|
||||
Message-ID: <20250204211407.381505-13-kwolf@redhat.com>
|
||||
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
|
||||
(cherry picked from commit 1600ef01ab1296ca8230daa6bc41ba983751f646)
|
||||
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
|
||||
---
|
||||
block/export/export.c | 31 +++++++++++++++++++++----------
|
||||
include/block/export.h | 3 +++
|
||||
qapi/block-export.json | 10 +++++++++-
|
||||
3 files changed, 33 insertions(+), 11 deletions(-)
|
||||
|
||||
diff --git a/block/export/export.c b/block/export/export.c
|
||||
index 23a86efcdb..71af65b3e5 100644
|
||||
--- a/block/export/export.c
|
||||
+++ b/block/export/export.c
|
||||
@@ -75,6 +75,7 @@ static const BlockExportDriver *blk_exp_find_driver(BlockExportType type)
|
||||
BlockExport *blk_exp_add(BlockExportOptions *export, Error **errp)
|
||||
{
|
||||
bool fixed_iothread = export->has_fixed_iothread && export->fixed_iothread;
|
||||
+ bool allow_inactive = export->has_allow_inactive && export->allow_inactive;
|
||||
const BlockExportDriver *drv;
|
||||
BlockExport *exp = NULL;
|
||||
BlockDriverState *bs;
|
||||
@@ -138,17 +139,24 @@ BlockExport *blk_exp_add(BlockExportOptions *export, Error **errp)
|
||||
}
|
||||
}
|
||||
|
||||
- /*
|
||||
- * Block exports are used for non-shared storage migration. Make sure
|
||||
- * that BDRV_O_INACTIVE is cleared and the image is ready for write
|
||||
- * access since the export could be available before migration handover.
|
||||
- * ctx was acquired in the caller.
|
||||
- */
|
||||
bdrv_graph_rdlock_main_loop();
|
||||
- ret = bdrv_activate(bs, errp);
|
||||
- if (ret < 0) {
|
||||
- bdrv_graph_rdunlock_main_loop();
|
||||
- goto fail;
|
||||
+ if (allow_inactive) {
|
||||
+ if (!drv->supports_inactive) {
|
||||
+ error_setg(errp, "Export type does not support inactive exports");
|
||||
+ bdrv_graph_rdunlock_main_loop();
|
||||
+ goto fail;
|
||||
+ }
|
||||
+ } else {
|
||||
+ /*
|
||||
+ * Block exports are used for non-shared storage migration. Make sure
|
||||
+ * that BDRV_O_INACTIVE is cleared and the image is ready for write
|
||||
+ * access since the export could be available before migration handover.
|
||||
+ */
|
||||
+ ret = bdrv_activate(bs, errp);
|
||||
+ if (ret < 0) {
|
||||
+ bdrv_graph_rdunlock_main_loop();
|
||||
+ goto fail;
|
||||
+ }
|
||||
}
|
||||
bdrv_graph_rdunlock_main_loop();
|
||||
|
||||
@@ -162,6 +170,9 @@ BlockExport *blk_exp_add(BlockExportOptions *export, Error **errp)
|
||||
if (!fixed_iothread) {
|
||||
blk_set_allow_aio_context_change(blk, true);
|
||||
}
|
||||
+ if (allow_inactive) {
|
||||
+ blk_set_force_allow_inactivate(blk);
|
||||
+ }
|
||||
|
||||
ret = blk_insert_bs(blk, bs, errp);
|
||||
if (ret < 0) {
|
||||
diff --git a/include/block/export.h b/include/block/export.h
|
||||
index f2fe0f8078..4bd9531d4d 100644
|
||||
--- a/include/block/export.h
|
||||
+++ b/include/block/export.h
|
||||
@@ -29,6 +29,9 @@ typedef struct BlockExportDriver {
|
||||
*/
|
||||
size_t instance_size;
|
||||
|
||||
+ /* True if the export type supports running on an inactive node */
|
||||
+ bool supports_inactive;
|
||||
+
|
||||
/* Creates and starts a new block export */
|
||||
int (*create)(BlockExport *, BlockExportOptions *, Error **);
|
||||
|
||||
diff --git a/qapi/block-export.json b/qapi/block-export.json
|
||||
index ce33fe378d..117b05d13c 100644
|
||||
--- a/qapi/block-export.json
|
||||
+++ b/qapi/block-export.json
|
||||
@@ -372,6 +372,13 @@
|
||||
# cannot be moved to the iothread. The default is false.
|
||||
# (since: 5.2)
|
||||
#
|
||||
+# @allow-inactive: If true, the export allows the exported node to be inactive.
|
||||
+# If it is created for an inactive block node, the node remains inactive. If
|
||||
+# the export type doesn't support running on an inactive node, an error is
|
||||
+# returned. If false, inactive block nodes are automatically activated before
|
||||
+# creating the export and trying to inactivate them later fails.
|
||||
+# (since: 10.0; default: false)
|
||||
+#
|
||||
# Since: 4.2
|
||||
##
|
||||
{ 'union': 'BlockExportOptions',
|
||||
@@ -381,7 +388,8 @@
|
||||
'*iothread': 'str',
|
||||
'node-name': 'str',
|
||||
'*writable': 'bool',
|
||||
- '*writethrough': 'bool' },
|
||||
+ '*writethrough': 'bool',
|
||||
+ '*allow-inactive': 'bool' },
|
||||
'discriminator': 'type',
|
||||
'data': {
|
||||
'nbd': 'BlockExportOptionsNbd',
|
||||
--
|
||||
2.48.1
|
||||
|
||||
@ -1,50 +0,0 @@
|
||||
From 0cced76da63a886e6aaaa96a2c40620db27cb8cc Mon Sep 17 00:00:00 2001
|
||||
From: Kevin Wolf <kwolf@redhat.com>
|
||||
Date: Tue, 4 Feb 2025 22:14:01 +0100
|
||||
Subject: [PATCH 17/23] block/export: Don't ignore image activation error in
|
||||
blk_exp_add()
|
||||
|
||||
RH-Author: Kevin Wolf <kwolf@redhat.com>
|
||||
RH-MergeRequest: 339: QMP command for block device reactivation after migration
|
||||
RH-Jira: RHEL-54296 RHEL-78397
|
||||
RH-Acked-by: Eric Blake <eblake@redhat.com>
|
||||
RH-Acked-by: Stefan Hajnoczi <stefanha@redhat.com>
|
||||
RH-Commit: [16/22] 86e791a19948c88a3512bb7ba3bd3ed0f03a2a18 (kmwolf/centos-qemu-kvm)
|
||||
|
||||
Currently, block exports can't handle inactive images correctly.
|
||||
Incoming write requests would run into assertion failures. Make sure
|
||||
that we return an error when creating an export can't activate the
|
||||
image.
|
||||
|
||||
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
|
||||
Acked-by: Fabiano Rosas <farosas@suse.de>
|
||||
Reviewed-by: Eric Blake <eblake@redhat.com>
|
||||
Reviewed-by: Stefan Hajnoczi <stefanha@redhat.com>
|
||||
Message-ID: <20250204211407.381505-11-kwolf@redhat.com>
|
||||
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
|
||||
(cherry picked from commit 69f28176ca0af850db23a1c6364f0c8525b20801)
|
||||
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
|
||||
---
|
||||
block/export/export.c | 6 +++++-
|
||||
1 file changed, 5 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/block/export/export.c b/block/export/export.c
|
||||
index 6d51ae8ed7..23a86efcdb 100644
|
||||
--- a/block/export/export.c
|
||||
+++ b/block/export/export.c
|
||||
@@ -145,7 +145,11 @@ BlockExport *blk_exp_add(BlockExportOptions *export, Error **errp)
|
||||
* ctx was acquired in the caller.
|
||||
*/
|
||||
bdrv_graph_rdlock_main_loop();
|
||||
- bdrv_activate(bs, NULL);
|
||||
+ ret = bdrv_activate(bs, errp);
|
||||
+ if (ret < 0) {
|
||||
+ bdrv_graph_rdunlock_main_loop();
|
||||
+ goto fail;
|
||||
+ }
|
||||
bdrv_graph_rdunlock_main_loop();
|
||||
|
||||
perm = BLK_PERM_CONSISTENT_READ;
|
||||
--
|
||||
2.48.1
|
||||
|
||||
@ -1,74 +0,0 @@
|
||||
From e629a362860977161e43ed80bb59d1d05a06b2f2 Mon Sep 17 00:00:00 2001
|
||||
From: Stefan Hajnoczi <stefanha@redhat.com>
|
||||
Date: Thu, 17 Apr 2025 11:05:28 -0400
|
||||
Subject: [PATCH 4/5] block/io: skip head/tail requests on EINVAL
|
||||
|
||||
RH-Author: Stefan Hajnoczi <stefanha@redhat.com>
|
||||
RH-MergeRequest: 355: file-posix: probe discard alignment on Linux block devices
|
||||
RH-Jira: RHEL-86032
|
||||
RH-Acked-by: Kevin Wolf <kwolf@redhat.com>
|
||||
RH-Acked-by: Eric Blake <eblake@redhat.com>
|
||||
RH-Commit: [2/3] 0028fb11f18e16e2aba9506eabb2383c406d17b5 (stefanha/centos-stream-qemu-kvm)
|
||||
|
||||
When guests send misaligned discard requests, the block layer breaks
|
||||
them up into a misaligned head, an aligned main body, and a misaligned
|
||||
tail.
|
||||
|
||||
The file-posix block driver on Linux returns -EINVAL on misaligned
|
||||
discard requests. This causes bdrv_co_pdiscard() to fail and guests
|
||||
configured with werror=stop will pause.
|
||||
|
||||
Add a special case for misaligned head/tail requests. Simply continue
|
||||
when EINVAL is encountered so that the aligned main body of the request
|
||||
can be completed and the guest is not paused. This is the best we can do
|
||||
when guest discard limits do not match the host discard limits.
|
||||
|
||||
Fixes: https://issues.redhat.com/browse/RHEL-86032
|
||||
Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
|
||||
Reviewed-by: Hanna Czenczek <hreitz@redhat.com>
|
||||
Message-ID: <20250417150528.76470-3-stefanha@redhat.com>
|
||||
Reviewed-by: Kevin Wolf <kwolf@redhat.com>
|
||||
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
|
||||
(cherry picked from commit 4733cb0833c4b223f92ec0136980eeb5239ecb87)
|
||||
Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
|
||||
---
|
||||
block/io.c | 15 ++++++++++-----
|
||||
1 file changed, 10 insertions(+), 5 deletions(-)
|
||||
|
||||
diff --git a/block/io.c b/block/io.c
|
||||
index 301514c880..3e189837a1 100644
|
||||
--- a/block/io.c
|
||||
+++ b/block/io.c
|
||||
@@ -3105,11 +3105,12 @@ int coroutine_fn bdrv_co_pdiscard(BdrvChild *child, int64_t offset,
|
||||
/* Invalidate the cached block-status data range if this discard overlaps */
|
||||
bdrv_bsc_invalidate_range(bs, offset, bytes);
|
||||
|
||||
- /* Discard is advisory, but some devices track and coalesce
|
||||
+ /*
|
||||
+ * Discard is advisory, but some devices track and coalesce
|
||||
* unaligned requests, so we must pass everything down rather than
|
||||
- * round here. Still, most devices will just silently ignore
|
||||
- * unaligned requests (by returning -ENOTSUP), so we must fragment
|
||||
- * the request accordingly. */
|
||||
+ * round here. Still, most devices reject unaligned requests with
|
||||
+ * -EINVAL or -ENOTSUP, so we must fragment the request accordingly.
|
||||
+ */
|
||||
align = MAX(bs->bl.pdiscard_alignment, bs->bl.request_alignment);
|
||||
assert(align % bs->bl.request_alignment == 0);
|
||||
head = offset % align;
|
||||
@@ -3176,7 +3177,11 @@ int coroutine_fn bdrv_co_pdiscard(BdrvChild *child, int64_t offset,
|
||||
}
|
||||
}
|
||||
if (ret && ret != -ENOTSUP) {
|
||||
- goto out;
|
||||
+ if (ret == -EINVAL && (offset % align != 0 || num % align != 0)) {
|
||||
+ /* Silently skip rejected unaligned head/tail requests */
|
||||
+ } else {
|
||||
+ goto out; /* bail out */
|
||||
+ }
|
||||
}
|
||||
|
||||
offset += num;
|
||||
--
|
||||
2.48.1
|
||||
|
||||
@ -1,48 +0,0 @@
|
||||
From d38bdce712f572e1920e3344132ff6600d657de2 Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Daniel=20P=2E=20Berrang=C3=A9?= <berrange@redhat.com>
|
||||
Date: Tue, 10 Jun 2025 13:36:41 +0100
|
||||
Subject: [PATCH 29/57] block: skip automatic zero-init of large array in
|
||||
ioq_submit
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
RH-Author: Stefan Hajnoczi <stefanha@redhat.com>
|
||||
RH-MergeRequest: 382: Solve -ftrivial-auto-var-init performance regression with QEMU_UNINITIALIZED
|
||||
RH-Jira: RHEL-99888
|
||||
RH-Acked-by: Miroslav Rezanina <mrezanin@redhat.com>
|
||||
RH-Commit: [3/30] 301a08b3acdcd95634dec5dab1d96fcfe3abf3be (stefanha/centos-stream-qemu-kvm)
|
||||
|
||||
The 'ioq_submit' method has a struct array that is 8k in size.
|
||||
Skip the automatic zero-init of this array to eliminate the
|
||||
performance overhead in the I/O hot path.
|
||||
|
||||
The 'iocbs' array will selectively initialized when processing
|
||||
the I/O data.
|
||||
|
||||
Signed-off-by: Daniel P. Berrangé <berrange@redhat.com>
|
||||
Reviewed-by: Stefan Hajnoczi <stefanha@redhat.com>
|
||||
Message-id: 20250610123709.835102-4-berrange@redhat.com
|
||||
Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
|
||||
(cherry picked from commit 83750c1da807c973b0b11d977d61df7e41122d03)
|
||||
Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
|
||||
---
|
||||
block/linux-aio.c | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
diff --git a/block/linux-aio.c b/block/linux-aio.c
|
||||
index e3b5ec9aba..26d9f086d2 100644
|
||||
--- a/block/linux-aio.c
|
||||
+++ b/block/linux-aio.c
|
||||
@@ -291,7 +291,7 @@ static void ioq_submit(LinuxAioState *s)
|
||||
{
|
||||
int ret, len;
|
||||
struct qemu_laiocb *aiocb;
|
||||
- struct iocb *iocbs[MAX_EVENTS];
|
||||
+ QEMU_UNINITIALIZED struct iocb *iocbs[MAX_EVENTS];
|
||||
QSIMPLEQ_HEAD(, qemu_laiocb) completed;
|
||||
|
||||
do {
|
||||
--
|
||||
2.39.3
|
||||
|
||||
@ -1,49 +0,0 @@
|
||||
From 1e8798a3adbbfc42167aaba0ee18175deac37193 Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Daniel=20P=2E=20Berrang=C3=A9?= <berrange@redhat.com>
|
||||
Date: Tue, 10 Jun 2025 13:36:42 +0100
|
||||
Subject: [PATCH 30/57] chardev/char-fd: skip automatic zero-init of large
|
||||
array
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
RH-Author: Stefan Hajnoczi <stefanha@redhat.com>
|
||||
RH-MergeRequest: 382: Solve -ftrivial-auto-var-init performance regression with QEMU_UNINITIALIZED
|
||||
RH-Jira: RHEL-99888
|
||||
RH-Acked-by: Miroslav Rezanina <mrezanin@redhat.com>
|
||||
RH-Commit: [4/30] b16fe5c9af4756e1856cd330df02a1a09d9f33ea (stefanha/centos-stream-qemu-kvm)
|
||||
|
||||
The 'fd_chr_read' method has a 4k byte array used for copying
|
||||
data between the socket and device. Skip the automatic zero-init
|
||||
of this array to eliminate the performance overhead in the I/O
|
||||
hot path.
|
||||
|
||||
The 'buf' array will be fully initialized when reading data off
|
||||
the network socket.
|
||||
|
||||
Signed-off-by: Daniel P. Berrangé <berrange@redhat.com>
|
||||
Reviewed-by: Stefan Hajnoczi <stefanha@redhat.com>
|
||||
Message-id: 20250610123709.835102-5-berrange@redhat.com
|
||||
Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
|
||||
(cherry picked from commit a503bdc22b91869e3bf45522e36b122889465306)
|
||||
Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
|
||||
---
|
||||
chardev/char-fd.c | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
diff --git a/chardev/char-fd.c b/chardev/char-fd.c
|
||||
index d2c4923359..8dd662c066 100644
|
||||
--- a/chardev/char-fd.c
|
||||
+++ b/chardev/char-fd.c
|
||||
@@ -50,7 +50,7 @@ static gboolean fd_chr_read(QIOChannel *chan, GIOCondition cond, void *opaque)
|
||||
Chardev *chr = CHARDEV(opaque);
|
||||
FDChardev *s = FD_CHARDEV(opaque);
|
||||
int len;
|
||||
- uint8_t buf[CHR_READ_BUF_LEN];
|
||||
+ QEMU_UNINITIALIZED uint8_t buf[CHR_READ_BUF_LEN];
|
||||
ssize_t ret;
|
||||
|
||||
len = sizeof(buf);
|
||||
--
|
||||
2.39.3
|
||||
|
||||
@ -1,49 +0,0 @@
|
||||
From 74311b0ee8e211fccff211b975e4ae9236c063dc Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Daniel=20P=2E=20Berrang=C3=A9?= <berrange@redhat.com>
|
||||
Date: Tue, 10 Jun 2025 13:36:43 +0100
|
||||
Subject: [PATCH 31/57] chardev/char-pty: skip automatic zero-init of large
|
||||
array
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
RH-Author: Stefan Hajnoczi <stefanha@redhat.com>
|
||||
RH-MergeRequest: 382: Solve -ftrivial-auto-var-init performance regression with QEMU_UNINITIALIZED
|
||||
RH-Jira: RHEL-99888
|
||||
RH-Acked-by: Miroslav Rezanina <mrezanin@redhat.com>
|
||||
RH-Commit: [5/30] a3b8458c30f485551093f292c00c20b0e118df77 (stefanha/centos-stream-qemu-kvm)
|
||||
|
||||
The 'pty_chr_read' method has a 4k byte array used for copying
|
||||
data between the PTY and device. Skip the automatic zero-init
|
||||
of this array to eliminate the performance overhead in the I/O
|
||||
hot path.
|
||||
|
||||
The 'buf' array will be fully initialized when reading data off
|
||||
the PTY.
|
||||
|
||||
Signed-off-by: Daniel P. Berrangé <berrange@redhat.com>
|
||||
Reviewed-by: Stefan Hajnoczi <stefanha@redhat.com>
|
||||
Message-id: 20250610123709.835102-6-berrange@redhat.com
|
||||
Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
|
||||
(cherry picked from commit 45bb7fb21c8d18294a9f92da99d01ab3c67c7df2)
|
||||
Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
|
||||
---
|
||||
chardev/char-pty.c | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
diff --git a/chardev/char-pty.c b/chardev/char-pty.c
|
||||
index cc2f7617fe..3319ad215d 100644
|
||||
--- a/chardev/char-pty.c
|
||||
+++ b/chardev/char-pty.c
|
||||
@@ -152,7 +152,7 @@ static gboolean pty_chr_read(QIOChannel *chan, GIOCondition cond, void *opaque)
|
||||
Chardev *chr = CHARDEV(opaque);
|
||||
PtyChardev *s = PTY_CHARDEV(opaque);
|
||||
gsize len;
|
||||
- uint8_t buf[CHR_READ_BUF_LEN];
|
||||
+ QEMU_UNINITIALIZED uint8_t buf[CHR_READ_BUF_LEN];
|
||||
ssize_t ret;
|
||||
|
||||
len = sizeof(buf);
|
||||
--
|
||||
2.39.3
|
||||
|
||||
@ -1,49 +0,0 @@
|
||||
From d56a8ce56f0de70ab2de266a80e25cf309e72fda Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Daniel=20P=2E=20Berrang=C3=A9?= <berrange@redhat.com>
|
||||
Date: Tue, 10 Jun 2025 13:36:44 +0100
|
||||
Subject: [PATCH 32/57] chardev/char-socket: skip automatic zero-init of large
|
||||
array
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
RH-Author: Stefan Hajnoczi <stefanha@redhat.com>
|
||||
RH-MergeRequest: 382: Solve -ftrivial-auto-var-init performance regression with QEMU_UNINITIALIZED
|
||||
RH-Jira: RHEL-99888
|
||||
RH-Acked-by: Miroslav Rezanina <mrezanin@redhat.com>
|
||||
RH-Commit: [6/30] 86a2ac03efa1838fb30931c38945ee77de9bbe06 (stefanha/centos-stream-qemu-kvm)
|
||||
|
||||
The 'tcp_chr_read' method has a 4k byte array used for copying
|
||||
data between the socket and device. Skip the automatic zero-init
|
||||
of this array to eliminate the performance overhead in the I/O
|
||||
hot path.
|
||||
|
||||
The 'buf' array will be fully initialized when reading data off
|
||||
the network socket.
|
||||
|
||||
Signed-off-by: Daniel P. Berrangé <berrange@redhat.com>
|
||||
Reviewed-by: Stefan Hajnoczi <stefanha@redhat.com>
|
||||
Message-id: 20250610123709.835102-7-berrange@redhat.com
|
||||
Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
|
||||
(cherry picked from commit 9a23075cef1ac6e73a95a489ac72f41c573ceb9b)
|
||||
Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
|
||||
---
|
||||
chardev/char-socket.c | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
diff --git a/chardev/char-socket.c b/chardev/char-socket.c
|
||||
index 1ca9441b1b..99d644e89f 100644
|
||||
--- a/chardev/char-socket.c
|
||||
+++ b/chardev/char-socket.c
|
||||
@@ -497,7 +497,7 @@ static gboolean tcp_chr_read(QIOChannel *chan, GIOCondition cond, void *opaque)
|
||||
{
|
||||
Chardev *chr = CHARDEV(opaque);
|
||||
SocketChardev *s = SOCKET_CHARDEV(opaque);
|
||||
- uint8_t buf[CHR_READ_BUF_LEN];
|
||||
+ QEMU_UNINITIALIZED uint8_t buf[CHR_READ_BUF_LEN];
|
||||
int len, size;
|
||||
|
||||
if ((s->state != TCP_CHARDEV_STATE_CONNECTED) ||
|
||||
--
|
||||
2.39.3
|
||||
|
||||
@ -1,48 +0,0 @@
|
||||
From dd4ab64754a52f1e50273cb8153567b0d2f382de Mon Sep 17 00:00:00 2001
|
||||
From: Paolo Bonzini <pbonzini@redhat.com>
|
||||
Date: Fri, 18 Jul 2025 18:03:48 +0200
|
||||
Subject: [PATCH 071/115] cpu: Don't set vcpu_dirty when guest_state_protected
|
||||
|
||||
RH-Author: Paolo Bonzini <pbonzini@redhat.com>
|
||||
RH-MergeRequest: 391: TDX support, including attestation and device assignment
|
||||
RH-Jira: RHEL-15710 RHEL-20798 RHEL-49728
|
||||
RH-Acked-by: Yash Mankad <None>
|
||||
RH-Acked-by: Peter Xu <peterx@redhat.com>
|
||||
RH-Acked-by: David Hildenbrand <david@redhat.com>
|
||||
RH-Commit: [71/115] c876a59ee5bbfccea9837ac373a2e664354db3ae (bonzini/rhel-qemu-kvm)
|
||||
|
||||
QEMU calls kvm_arch_put_registers() when vcpu_dirty is true in
|
||||
kvm_vcpu_exec(). However, for confidential guest, like TDX, putting
|
||||
registers is disallowed due to guest state is protected.
|
||||
|
||||
Only set vcpu_dirty to true with guest state is not protected when
|
||||
creating the vcpu.
|
||||
|
||||
Signed-off-by: Xiaoyao Li <xiaoyao.li@intel.com>
|
||||
Reviewed-by: Zhao Liu <zhao1.liu@intel.com>
|
||||
Link: https://lore.kernel.org/r/20250508150002.689633-43-xiaoyao.li@intel.com
|
||||
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
|
||||
(cherry picked from commit b4b7fb5a773e1d2215c2aaa99789eca51914b78f)
|
||||
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
|
||||
---
|
||||
accel/kvm/kvm-all.c | 4 +++-
|
||||
1 file changed, 3 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/accel/kvm/kvm-all.c b/accel/kvm/kvm-all.c
|
||||
index c1605bc4fa..43c10c82f6 100644
|
||||
--- a/accel/kvm/kvm-all.c
|
||||
+++ b/accel/kvm/kvm-all.c
|
||||
@@ -456,7 +456,9 @@ int kvm_create_vcpu(CPUState *cpu)
|
||||
|
||||
cpu->kvm_fd = kvm_fd;
|
||||
cpu->kvm_state = s;
|
||||
- cpu->vcpu_dirty = true;
|
||||
+ if (!s->guest_state_protected) {
|
||||
+ cpu->vcpu_dirty = true;
|
||||
+ }
|
||||
cpu->dirty_pages = 0;
|
||||
cpu->throttle_us_per_full = 0;
|
||||
|
||||
--
|
||||
2.50.1
|
||||
|
||||
@ -1,76 +0,0 @@
|
||||
From c57b5e38fd95a68f36a342e19ba7ccb6cbb07948 Mon Sep 17 00:00:00 2001
|
||||
From: Paolo Bonzini <pbonzini@redhat.com>
|
||||
Date: Fri, 18 Jul 2025 18:03:44 +0200
|
||||
Subject: [PATCH 014/115] cpu: Remove nr_cores from struct CPUState
|
||||
|
||||
RH-Author: Paolo Bonzini <pbonzini@redhat.com>
|
||||
RH-MergeRequest: 391: TDX support, including attestation and device assignment
|
||||
RH-Jira: RHEL-15710 RHEL-20798 RHEL-49728
|
||||
RH-Acked-by: Yash Mankad <None>
|
||||
RH-Acked-by: Peter Xu <peterx@redhat.com>
|
||||
RH-Acked-by: David Hildenbrand <david@redhat.com>
|
||||
RH-Commit: [14/115] 80f6414c5f8f5e963b0f2251147b8a1ca04f55e4 (bonzini/rhel-qemu-kvm)
|
||||
|
||||
There is no user of it now, remove it.
|
||||
|
||||
Signed-off-by: Xiaoyao Li <xiaoyao.li@intel.com>
|
||||
Reviewed-by: Zhao Liu <zhao1.liu@intel.com>
|
||||
Link: https://lore.kernel.org/r/20241219110125.1266461-9-xiaoyao.li@intel.com
|
||||
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
|
||||
(cherry picked from commit 6e090ffe0d188e1f09d4efcd10d82158f92abfbb)
|
||||
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
|
||||
(cherry picked from commit d4c699c310519b99bedf1bdb516cab230d5d846c)
|
||||
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
|
||||
---
|
||||
hw/core/cpu-common.c | 1 -
|
||||
include/hw/core/cpu.h | 2 --
|
||||
system/cpus.c | 1 -
|
||||
3 files changed, 4 deletions(-)
|
||||
|
||||
diff --git a/hw/core/cpu-common.c b/hw/core/cpu-common.c
|
||||
index 7982ecd39a..1ac8ab488f 100644
|
||||
--- a/hw/core/cpu-common.c
|
||||
+++ b/hw/core/cpu-common.c
|
||||
@@ -242,7 +242,6 @@ static void cpu_common_initfn(Object *obj)
|
||||
cpu->cluster_index = UNASSIGNED_CLUSTER_INDEX;
|
||||
/* user-mode doesn't have configurable SMP topology */
|
||||
/* the default value is changed by qemu_init_vcpu() for system-mode */
|
||||
- cpu->nr_cores = 1;
|
||||
cpu->nr_threads = 1;
|
||||
cpu->cflags_next_tb = -1;
|
||||
|
||||
diff --git a/include/hw/core/cpu.h b/include/hw/core/cpu.h
|
||||
index 1c9c775df6..d90e3b3f2c 100644
|
||||
--- a/include/hw/core/cpu.h
|
||||
+++ b/include/hw/core/cpu.h
|
||||
@@ -402,7 +402,6 @@ struct qemu_work_item;
|
||||
* Under TCG this value is propagated to @tcg_cflags.
|
||||
* See TranslationBlock::TCG CF_CLUSTER_MASK.
|
||||
* @tcg_cflags: Pre-computed cflags for this cpu.
|
||||
- * @nr_cores: Number of cores within this CPU package.
|
||||
* @nr_threads: Number of threads within this CPU core.
|
||||
* @thread: Host thread details, only live once @created is #true
|
||||
* @sem: WIN32 only semaphore used only for qtest
|
||||
@@ -461,7 +460,6 @@ struct CPUState {
|
||||
CPUClass *cc;
|
||||
/*< public >*/
|
||||
|
||||
- int nr_cores;
|
||||
int nr_threads;
|
||||
|
||||
struct QemuThread *thread;
|
||||
diff --git a/system/cpus.c b/system/cpus.c
|
||||
index 1c818ff682..909d8128e8 100644
|
||||
--- a/system/cpus.c
|
||||
+++ b/system/cpus.c
|
||||
@@ -666,7 +666,6 @@ void qemu_init_vcpu(CPUState *cpu)
|
||||
{
|
||||
MachineState *ms = MACHINE(qdev_get_machine());
|
||||
|
||||
- cpu->nr_cores = machine_topo_get_cores_per_socket(ms);
|
||||
cpu->nr_threads = ms->smp.threads;
|
||||
cpu->stopped = true;
|
||||
cpu->random_seed = qemu_guest_random_seed_thread_part1();
|
||||
--
|
||||
2.50.1
|
||||
|
||||
@ -1,74 +0,0 @@
|
||||
From 4df071fec89ab867f8e2d970de48256034e4b286 Mon Sep 17 00:00:00 2001
|
||||
From: Paolo Bonzini <pbonzini@redhat.com>
|
||||
Date: Fri, 18 Jul 2025 18:29:04 +0200
|
||||
Subject: [PATCH 005/115] crypto: Define macros for hash algorithm digest
|
||||
lengths
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
RH-Author: Paolo Bonzini <pbonzini@redhat.com>
|
||||
RH-MergeRequest: 391: TDX support, including attestation and device assignment
|
||||
RH-Jira: RHEL-15710 RHEL-20798 RHEL-49728
|
||||
RH-Acked-by: Yash Mankad <None>
|
||||
RH-Acked-by: Peter Xu <peterx@redhat.com>
|
||||
RH-Acked-by: David Hildenbrand <david@redhat.com>
|
||||
RH-Commit: [5/115] f5f6e0c3cd10baf7a490b67dd6c0542bddba8dfe (bonzini/rhel-qemu-kvm)
|
||||
|
||||
Reviewed-by: Daniel P. Berrangé <berrange@redhat.com>
|
||||
Signed-off-by: Dorjoy Chowdhury <dorjoychy111@gmail.com>
|
||||
Signed-off-by: Daniel P. Berrangé <berrange@redhat.com>
|
||||
(cherry picked from commit 5d04de7de54e163b056980be10ee1c281a600276)
|
||||
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
|
||||
---
|
||||
crypto/hash.c | 14 +++++++-------
|
||||
include/crypto/hash.h | 8 ++++++++
|
||||
2 files changed, 15 insertions(+), 7 deletions(-)
|
||||
|
||||
diff --git a/crypto/hash.c b/crypto/hash.c
|
||||
index b0f8228bdc..8087f5dae6 100644
|
||||
--- a/crypto/hash.c
|
||||
+++ b/crypto/hash.c
|
||||
@@ -23,13 +23,13 @@
|
||||
#include "hashpriv.h"
|
||||
|
||||
static size_t qcrypto_hash_alg_size[QCRYPTO_HASH_ALG__MAX] = {
|
||||
- [QCRYPTO_HASH_ALG_MD5] = 16,
|
||||
- [QCRYPTO_HASH_ALG_SHA1] = 20,
|
||||
- [QCRYPTO_HASH_ALG_SHA224] = 28,
|
||||
- [QCRYPTO_HASH_ALG_SHA256] = 32,
|
||||
- [QCRYPTO_HASH_ALG_SHA384] = 48,
|
||||
- [QCRYPTO_HASH_ALG_SHA512] = 64,
|
||||
- [QCRYPTO_HASH_ALG_RIPEMD160] = 20,
|
||||
+ [QCRYPTO_HASH_ALG_MD5] = QCRYPTO_HASH_DIGEST_LEN_MD5,
|
||||
+ [QCRYPTO_HASH_ALG_SHA1] = QCRYPTO_HASH_DIGEST_LEN_SHA1,
|
||||
+ [QCRYPTO_HASH_ALG_SHA224] = QCRYPTO_HASH_DIGEST_LEN_SHA224,
|
||||
+ [QCRYPTO_HASH_ALG_SHA256] = QCRYPTO_HASH_DIGEST_LEN_SHA256,
|
||||
+ [QCRYPTO_HASH_ALG_SHA384] = QCRYPTO_HASH_DIGEST_LEN_SHA384,
|
||||
+ [QCRYPTO_HASH_ALG_SHA512] = QCRYPTO_HASH_DIGEST_LEN_SHA512,
|
||||
+ [QCRYPTO_HASH_ALG_RIPEMD160] = QCRYPTO_HASH_DIGEST_LEN_RIPEMD160,
|
||||
};
|
||||
|
||||
size_t qcrypto_hash_digest_len(QCryptoHashAlgorithm alg)
|
||||
diff --git a/include/crypto/hash.h b/include/crypto/hash.h
|
||||
index 54d87aa2a1..a113cc3b04 100644
|
||||
--- a/include/crypto/hash.h
|
||||
+++ b/include/crypto/hash.h
|
||||
@@ -23,6 +23,14 @@
|
||||
|
||||
#include "qapi/qapi-types-crypto.h"
|
||||
|
||||
+#define QCRYPTO_HASH_DIGEST_LEN_MD5 16
|
||||
+#define QCRYPTO_HASH_DIGEST_LEN_SHA1 20
|
||||
+#define QCRYPTO_HASH_DIGEST_LEN_SHA224 28
|
||||
+#define QCRYPTO_HASH_DIGEST_LEN_SHA256 32
|
||||
+#define QCRYPTO_HASH_DIGEST_LEN_SHA384 48
|
||||
+#define QCRYPTO_HASH_DIGEST_LEN_SHA512 64
|
||||
+#define QCRYPTO_HASH_DIGEST_LEN_RIPEMD160 20
|
||||
+
|
||||
/* See also "QCryptoHashAlgorithm" defined in qapi/crypto.json */
|
||||
|
||||
/**
|
||||
--
|
||||
2.50.1
|
||||
|
||||
@ -1,222 +0,0 @@
|
||||
From a9c7bbb7a32ba2ea5cd76b87c41f1fbdd789fb3b Mon Sep 17 00:00:00 2001
|
||||
From: Paolo Bonzini <pbonzini@redhat.com>
|
||||
Date: Fri, 18 Jul 2025 18:03:48 +0200
|
||||
Subject: [PATCH 084/115] docs: Add TDX documentation
|
||||
|
||||
RH-Author: Paolo Bonzini <pbonzini@redhat.com>
|
||||
RH-MergeRequest: 391: TDX support, including attestation and device assignment
|
||||
RH-Jira: RHEL-15710 RHEL-20798 RHEL-49728
|
||||
RH-Acked-by: Yash Mankad <None>
|
||||
RH-Acked-by: Peter Xu <peterx@redhat.com>
|
||||
RH-Acked-by: David Hildenbrand <david@redhat.com>
|
||||
RH-Commit: [84/115] 4f9930f4415e7195bf5bbbcc0d79cfc6aaa385e1 (bonzini/rhel-qemu-kvm)
|
||||
|
||||
Add docs/system/i386/tdx.rst for TDX support, and add tdx in
|
||||
confidential-guest-support.rst
|
||||
|
||||
Signed-off-by: Xiaoyao Li <xiaoyao.li@intel.com>
|
||||
Link: https://lore.kernel.org/r/20250508150002.689633-56-xiaoyao.li@intel.com
|
||||
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
|
||||
(cherry picked from commit dc1424319311f86449c6825ceec2364ee645a363)
|
||||
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
|
||||
---
|
||||
docs/system/confidential-guest-support.rst | 1 +
|
||||
docs/system/i386/tdx.rst | 161 +++++++++++++++++++++
|
||||
docs/system/target-i386.rst | 1 +
|
||||
3 files changed, 163 insertions(+)
|
||||
create mode 100644 docs/system/i386/tdx.rst
|
||||
|
||||
diff --git a/docs/system/confidential-guest-support.rst b/docs/system/confidential-guest-support.rst
|
||||
index 0c490dbda2..66129fbab6 100644
|
||||
--- a/docs/system/confidential-guest-support.rst
|
||||
+++ b/docs/system/confidential-guest-support.rst
|
||||
@@ -38,6 +38,7 @@ Supported mechanisms
|
||||
Currently supported confidential guest mechanisms are:
|
||||
|
||||
* AMD Secure Encrypted Virtualization (SEV) (see :doc:`i386/amd-memory-encryption`)
|
||||
+* Intel Trust Domain Extension (TDX) (see :doc:`i386/tdx`)
|
||||
* POWER Protected Execution Facility (PEF) (see :ref:`power-papr-protected-execution-facility-pef`)
|
||||
* s390x Protected Virtualization (PV) (see :doc:`s390x/protvirt`)
|
||||
|
||||
diff --git a/docs/system/i386/tdx.rst b/docs/system/i386/tdx.rst
|
||||
new file mode 100644
|
||||
index 0000000000..8131750b64
|
||||
--- /dev/null
|
||||
+++ b/docs/system/i386/tdx.rst
|
||||
@@ -0,0 +1,161 @@
|
||||
+Intel Trusted Domain eXtension (TDX)
|
||||
+====================================
|
||||
+
|
||||
+Intel Trusted Domain eXtensions (TDX) refers to an Intel technology that extends
|
||||
+Virtual Machine Extensions (VMX) and Multi-Key Total Memory Encryption (MKTME)
|
||||
+with a new kind of virtual machine guest called a Trust Domain (TD). A TD runs
|
||||
+in a CPU mode that is designed to protect the confidentiality of its memory
|
||||
+contents and its CPU state from any other software, including the hosting
|
||||
+Virtual Machine Monitor (VMM), unless explicitly shared by the TD itself.
|
||||
+
|
||||
+Prerequisites
|
||||
+-------------
|
||||
+
|
||||
+To run TD, the physical machine needs to have TDX module loaded and initialized
|
||||
+while KVM hypervisor has TDX support and has TDX enabled. If those requirements
|
||||
+are met, the ``KVM_CAP_VM_TYPES`` will report the support of ``KVM_X86_TDX_VM``.
|
||||
+
|
||||
+Trust Domain Virtual Firmware (TDVF)
|
||||
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
+
|
||||
+Trust Domain Virtual Firmware (TDVF) is required to provide TD services to boot
|
||||
+TD Guest OS. TDVF needs to be copied to guest private memory and measured before
|
||||
+the TD boots.
|
||||
+
|
||||
+KVM vcpu ioctl ``KVM_TDX_INIT_MEM_REGION`` can be used to populate the TDVF
|
||||
+content into its private memory.
|
||||
+
|
||||
+Since TDX doesn't support readonly memslot, TDVF cannot be mapped as pflash
|
||||
+device and it actually works as RAM. "-bios" option is chosen to load TDVF.
|
||||
+
|
||||
+OVMF is the opensource firmware that implements the TDVF support. Thus the
|
||||
+command line to specify and load TDVF is ``-bios OVMF.fd``
|
||||
+
|
||||
+Feature Configuration
|
||||
+---------------------
|
||||
+
|
||||
+Unlike non-TDX VM, the CPU features (enumerated by CPU or MSR) of a TD are not
|
||||
+under full control of VMM. VMM can only configure part of features of a TD on
|
||||
+``KVM_TDX_INIT_VM`` command of VM scope ``MEMORY_ENCRYPT_OP`` ioctl.
|
||||
+
|
||||
+The configurable features have three types:
|
||||
+
|
||||
+- Attributes:
|
||||
+ - PKS (bit 30) controls whether Supervisor Protection Keys is exposed to TD,
|
||||
+ which determines related CPUID bit and CR4 bit;
|
||||
+ - PERFMON (bit 63) controls whether PMU is exposed to TD.
|
||||
+
|
||||
+- XSAVE related features (XFAM):
|
||||
+ XFAM is a 64b mask, which has the same format as XCR0 or IA32_XSS MSR. It
|
||||
+ determines the set of extended features available for use by the guest TD.
|
||||
+
|
||||
+- CPUID features:
|
||||
+ Only some bits of some CPUID leaves are directly configurable by VMM.
|
||||
+
|
||||
+What features can be configured is reported via TDX capabilities.
|
||||
+
|
||||
+TDX capabilities
|
||||
+~~~~~~~~~~~~~~~~
|
||||
+
|
||||
+The VM scope ``MEMORY_ENCRYPT_OP`` ioctl provides command ``KVM_TDX_CAPABILITIES``
|
||||
+to get the TDX capabilities from KVM. It returns a data structure of
|
||||
+``struct kvm_tdx_capabilities``, which tells the supported configuration of
|
||||
+attributes, XFAM and CPUIDs.
|
||||
+
|
||||
+TD attributes
|
||||
+~~~~~~~~~~~~~
|
||||
+
|
||||
+QEMU supports configuring raw 64-bit TD attributes directly via "attributes"
|
||||
+property of "tdx-guest" object. Note, it's users' responsibility to provide a
|
||||
+valid value because some bits may not supported by current QEMU or KVM yet.
|
||||
+
|
||||
+QEMU also supports the configuration of individual attribute bits that are
|
||||
+supported by it, via properties of "tdx-guest" object.
|
||||
+E.g., "sept-ve-disable" (bit 28).
|
||||
+
|
||||
+MSR based features
|
||||
+~~~~~~~~~~~~~~~~~~
|
||||
+
|
||||
+Current KVM doesn't support MSR based feature (e.g., MSR_IA32_ARCH_CAPABILITIES)
|
||||
+configuration for TDX, and it's a future work to enable it in QEMU when KVM adds
|
||||
+support of it.
|
||||
+
|
||||
+Feature check
|
||||
+~~~~~~~~~~~~~
|
||||
+
|
||||
+QEMU checks if the final (CPU) features, determined by given cpu model and
|
||||
+explicit feature adjustment of "+featureA/-featureB", can be supported or not.
|
||||
+It can produce feature not supported warning like
|
||||
+
|
||||
+ "warning: host doesn't support requested feature: CPUID.07H:EBX.intel-pt [bit 25]"
|
||||
+
|
||||
+It can also produce warning like
|
||||
+
|
||||
+ "warning: TDX forcibly sets the feature: CPUID.80000007H:EDX.invtsc [bit 8]"
|
||||
+
|
||||
+if the fixed-1 feature is requested to be disabled explicitly. This is newly
|
||||
+added to QEMU for TDX because TDX has fixed-1 features that are forcibly enabled
|
||||
+by TDX module and VMM cannot disable them.
|
||||
+
|
||||
+Launching a TD (TDX VM)
|
||||
+-----------------------
|
||||
+
|
||||
+To launch a TD, the necessary command line options are tdx-guest object and
|
||||
+split kernel-irqchip, as below:
|
||||
+
|
||||
+.. parsed-literal::
|
||||
+
|
||||
+ |qemu_system_x86| \\
|
||||
+ -accel kvm \\
|
||||
+ -cpu host \\
|
||||
+ -object tdx-guest,id=tdx0 \\
|
||||
+ -machine ...,confidential-guest-support=tdx0 \\
|
||||
+ -bios OVMF.fd \\
|
||||
+
|
||||
+Restrictions
|
||||
+------------
|
||||
+
|
||||
+ - kernel-irqchip must be split;
|
||||
+
|
||||
+ This is set by default for TDX guest if kernel-irqchip is left on its default
|
||||
+ 'auto' setting.
|
||||
+
|
||||
+ - No readonly support for private memory;
|
||||
+
|
||||
+ - No SMM support: SMM support requires manipulating the guest register states
|
||||
+ which is not allowed;
|
||||
+
|
||||
+Debugging
|
||||
+---------
|
||||
+
|
||||
+Bit 0 of TD attributes, is DEBUG bit, which decides if the TD runs in off-TD
|
||||
+debug mode. When in off-TD debug mode, TD's VCPU state and private memory are
|
||||
+accessible via given SEAMCALLs. This requires KVM to expose APIs to invoke those
|
||||
+SEAMCALLs and corresonponding QEMU change.
|
||||
+
|
||||
+It's targeted as future work.
|
||||
+
|
||||
+TD attestation
|
||||
+--------------
|
||||
+
|
||||
+In TD guest, the attestation process is used to verify the TDX guest
|
||||
+trustworthiness to other entities before provisioning secrets to the guest.
|
||||
+
|
||||
+TD attestation is initiated first by calling TDG.MR.REPORT inside TD to get the
|
||||
+REPORT. Then the REPORT data needs to be converted into a remotely verifiable
|
||||
+Quote by SGX Quoting Enclave (QE).
|
||||
+
|
||||
+It's a future work in QEMU to add support of TD attestation since it lacks
|
||||
+support in current KVM.
|
||||
+
|
||||
+Live Migration
|
||||
+--------------
|
||||
+
|
||||
+Future work.
|
||||
+
|
||||
+References
|
||||
+----------
|
||||
+
|
||||
+- `TDX Homepage <https://www.intel.com/content/www/us/en/developer/articles/technical/intel-trust-domain-extensions.html>`__
|
||||
+
|
||||
+- `SGX QE <https://github.com/intel/SGXDataCenterAttestationPrimitives/tree/master/QuoteGeneration>`__
|
||||
diff --git a/docs/system/target-i386.rst b/docs/system/target-i386.rst
|
||||
index 1b8a1f248a..4d58cdbc4e 100644
|
||||
--- a/docs/system/target-i386.rst
|
||||
+++ b/docs/system/target-i386.rst
|
||||
@@ -29,6 +29,7 @@ Architectural features
|
||||
i386/kvm-pv
|
||||
i386/sgx
|
||||
i386/amd-memory-encryption
|
||||
+ i386/tdx
|
||||
|
||||
OS requirements
|
||||
~~~~~~~~~~~~~~~
|
||||
--
|
||||
2.50.1
|
||||
|
||||
@ -1,53 +0,0 @@
|
||||
From 389c3c6b4215c9be3fd784c73af0e9795e796380 Mon Sep 17 00:00:00 2001
|
||||
From: Eric Auger <eric.auger@redhat.com>
|
||||
Date: Tue, 18 Feb 2025 19:25:35 +0100
|
||||
Subject: [PATCH 5/9] docs/devel/reset: Document reset expectations for DMA and
|
||||
IOMMU
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
RH-Author: Eric Auger <eric.auger@redhat.com>
|
||||
RH-MergeRequest: 341: Fix vIOMMU reset order
|
||||
RH-Jira: RHEL-7188
|
||||
RH-Acked-by: Peter Xu <peterx@redhat.com>
|
||||
RH-Acked-by: Donald Dutile <None>
|
||||
RH-Acked-by: Cédric Le Goater <clg@redhat.com>
|
||||
RH-Commit: [5/5] be8b9d9e34a2b301430dfa229c6785ab17d3fb16 (eauger1/centos-qemu-kvm)
|
||||
|
||||
To avoid any translation faults, the IOMMUs are expected to be
|
||||
reset after the devices they protect. Document that we expect
|
||||
DMA requests to be stopped during the 'enter' or 'hold' phase
|
||||
while IOMMUs should be reset during the 'exit' phase.
|
||||
|
||||
Signed-off-by: Eric Auger <eric.auger@redhat.com>
|
||||
Reviewed-by: Zhenzhong Duan <zhenzhong.duan@intel.com>
|
||||
Message-Id: <20250218182737.76722-6-eric.auger@redhat.com>
|
||||
Reviewed-by: Peter Xu <peterx@redhat.com>
|
||||
Reviewed-by: Michael S. Tsirkin <mst@redhat.com>
|
||||
Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
|
||||
(cherry picked from commit dd6d545e8f2d9a0e8a8c287ec16469f03ef5c198)
|
||||
Signed-off-by: Eric Auger <eric.auger@redhat.com>
|
||||
---
|
||||
docs/devel/reset.rst | 5 +++++
|
||||
1 file changed, 5 insertions(+)
|
||||
|
||||
diff --git a/docs/devel/reset.rst b/docs/devel/reset.rst
|
||||
index 9746a4e8a0..24ab630465 100644
|
||||
--- a/docs/devel/reset.rst
|
||||
+++ b/docs/devel/reset.rst
|
||||
@@ -123,6 +123,11 @@ The *exit* phase is executed only when the last reset operation ends. Therefore
|
||||
the object does not need to care how many of reset controllers it has and how
|
||||
many of them have started a reset.
|
||||
|
||||
+DMA capable devices are expected to cancel all outstanding DMA operations
|
||||
+during either 'enter' or 'hold' phases. IOMMUs are expected to reset during
|
||||
+the 'exit' phase and this sequencing makes sure no outstanding DMA request
|
||||
+will fault.
|
||||
+
|
||||
|
||||
Handling reset in a resettable object
|
||||
-------------------------------------
|
||||
--
|
||||
2.48.1
|
||||
|
||||
@ -1,76 +0,0 @@
|
||||
From 38df1fff536527bf47e190d000d8c05679f0f220 Mon Sep 17 00:00:00 2001
|
||||
From: Jared Rossi <jrossi@linux.ibm.com>
|
||||
Date: Sat, 19 Oct 2024 21:29:52 -0400
|
||||
Subject: [PATCH 19/27] docs/system: Update documentation for s390x IPL
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
RH-Author: Thomas Huth <thuth@redhat.com>
|
||||
RH-MergeRequest: 277: Full boot order support for s390x [CentOS 9]
|
||||
RH-Jira: RHEL-11424
|
||||
RH-Acked-by: Cédric Le Goater <clg@redhat.com>
|
||||
RH-Acked-by: Miroslav Rezanina <mrezanin@redhat.com>
|
||||
RH-Commit: [19/23] feefab248336e1744eeb6bdf86e9033fe8184b3a (thuth/qemu-kvm-cs9)
|
||||
|
||||
Update docs to show that s390x PC BIOS can support more than one boot device.
|
||||
|
||||
Signed-off-by: Jared Rossi <jrossi@linux.ibm.com>
|
||||
Reviewed-by: Thomas Huth <thuth@redhat.com>
|
||||
Message-ID: <20241020012953.1380075-19-jrossi@linux.ibm.com>
|
||||
Signed-off-by: Thomas Huth <thuth@redhat.com>
|
||||
(cherry picked from commit 0bd107138ff0b171e3cd314dbc200950bcab2b05)
|
||||
---
|
||||
docs/system/bootindex.rst | 7 ++++---
|
||||
docs/system/s390x/bootdevices.rst | 9 ++++++---
|
||||
2 files changed, 10 insertions(+), 6 deletions(-)
|
||||
|
||||
diff --git a/docs/system/bootindex.rst b/docs/system/bootindex.rst
|
||||
index 8b057f812f..988f7b3beb 100644
|
||||
--- a/docs/system/bootindex.rst
|
||||
+++ b/docs/system/bootindex.rst
|
||||
@@ -49,10 +49,11 @@ Limitations
|
||||
-----------
|
||||
|
||||
Some firmware has limitations on which devices can be considered for
|
||||
-booting. For instance, the PC BIOS boot specification allows only one
|
||||
-disk to be bootable. If boot from disk fails for some reason, the BIOS
|
||||
+booting. For instance, the x86 PC BIOS boot specification allows only one
|
||||
+disk to be bootable. If boot from disk fails for some reason, the x86 BIOS
|
||||
won't retry booting from other disk. It can still try to boot from
|
||||
-floppy or net, though.
|
||||
+floppy or net, though. In the case of s390x BIOS, the BIOS will try up to
|
||||
+8 total devices, any number of which may be disks.
|
||||
|
||||
Sometimes, firmware cannot map the device path QEMU wants firmware to
|
||||
boot from to a boot method. It doesn't happen for devices the firmware
|
||||
diff --git a/docs/system/s390x/bootdevices.rst b/docs/system/s390x/bootdevices.rst
|
||||
index c97efb8fc0..1a1a764c1c 100644
|
||||
--- a/docs/system/s390x/bootdevices.rst
|
||||
+++ b/docs/system/s390x/bootdevices.rst
|
||||
@@ -6,9 +6,7 @@ Booting with bootindex parameter
|
||||
|
||||
For classical mainframe guests (i.e. LPAR or z/VM installations), you always
|
||||
have to explicitly specify the disk where you want to boot from (or "IPL" from,
|
||||
-in s390x-speak -- IPL means "Initial Program Load"). In particular, there can
|
||||
-also be only one boot device according to the architecture specification, thus
|
||||
-specifying multiple boot devices is not possible (yet).
|
||||
+in s390x-speak -- IPL means "Initial Program Load").
|
||||
|
||||
So for booting an s390x guest in QEMU, you should always mark the
|
||||
device where you want to boot from with the ``bootindex`` property, for
|
||||
@@ -17,6 +15,11 @@ example::
|
||||
qemu-system-s390x -drive if=none,id=dr1,file=guest.qcow2 \
|
||||
-device virtio-blk,drive=dr1,bootindex=1
|
||||
|
||||
+Multiple devices may have a bootindex. The lowest bootindex is assigned to the
|
||||
+device to IPL first. If the IPL fails for the first, the device with the second
|
||||
+lowest bootindex will be tried and so on until IPL is successful or there are no
|
||||
+remaining boot devices to try.
|
||||
+
|
||||
For booting from a CD-ROM ISO image (which needs to include El-Torito boot
|
||||
information in order to be bootable), it is recommended to specify a ``scsi-cd``
|
||||
device, for example like this::
|
||||
--
|
||||
2.39.3
|
||||
|
||||
@ -1,45 +0,0 @@
|
||||
From 5a0451f82a143dbaa0f75543a75c8e4560ac477f Mon Sep 17 00:00:00 2001
|
||||
From: Thomas Huth <thuth@redhat.com>
|
||||
Date: Mon, 11 Nov 2024 11:55:06 +0100
|
||||
Subject: [PATCH 03/10] docs/system/bootindex: Make it clear that s390x can
|
||||
also boot from virtio-net
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
RH-Author: Thomas Huth <thuth@redhat.com>
|
||||
RH-MergeRequest: 298: [c9s] Fixes for the new s390x "boot order" feature
|
||||
RH-Jira: RHEL-68440
|
||||
RH-Acked-by: Cédric Le Goater <clg@redhat.com>
|
||||
RH-Acked-by: Miroslav Rezanina <mrezanin@redhat.com>
|
||||
RH-Commit: [2/8] 2921f4532ad7b0891dea251a4d768776170c6271 (thuth/qemu-kvm-cs9)
|
||||
|
||||
Let's make it clear that s390x can also boot from virtio-net, to avoid
|
||||
that people think that s390x can only boot from disk devices.
|
||||
|
||||
Reported-by: Boris Fiuczynski <fiuczy@linux.ibm.com>
|
||||
Message-ID: <20241111105506.264640-1-thuth@redhat.com>
|
||||
Reviewed-by: Prasad Pandit <pjp@fedoraproject.org>
|
||||
Reviewed-by: Boris Fiuczynski <fiuczy@linux.ibm.com>
|
||||
Signed-off-by: Thomas Huth <thuth@redhat.com>
|
||||
(cherry picked from commit b8c5fdc6588f82d95807be0eb2215d215a3ba16e)
|
||||
---
|
||||
docs/system/bootindex.rst | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
diff --git a/docs/system/bootindex.rst b/docs/system/bootindex.rst
|
||||
index 988f7b3beb..5e1b33ee22 100644
|
||||
--- a/docs/system/bootindex.rst
|
||||
+++ b/docs/system/bootindex.rst
|
||||
@@ -53,7 +53,7 @@ booting. For instance, the x86 PC BIOS boot specification allows only one
|
||||
disk to be bootable. If boot from disk fails for some reason, the x86 BIOS
|
||||
won't retry booting from other disk. It can still try to boot from
|
||||
floppy or net, though. In the case of s390x BIOS, the BIOS will try up to
|
||||
-8 total devices, any number of which may be disks.
|
||||
+8 total devices, any number of which may be disks or virtio-net devices.
|
||||
|
||||
Sometimes, firmware cannot map the device path QEMU wants firmware to
|
||||
boot from to a boot method. It doesn't happen for devices the firmware
|
||||
--
|
||||
2.39.3
|
||||
|
||||
@ -1,65 +0,0 @@
|
||||
From 255d789ab8fbc5a79236e0943a222371ceded164 Mon Sep 17 00:00:00 2001
|
||||
From: Jared Rossi <jrossi@linux.ibm.com>
|
||||
Date: Thu, 14 Nov 2024 19:27:42 -0500
|
||||
Subject: [PATCH 02/10] docs/system/s390x/bootdevices: Update loadparm
|
||||
documentation
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
RH-Author: Thomas Huth <thuth@redhat.com>
|
||||
RH-MergeRequest: 298: [c9s] Fixes for the new s390x "boot order" feature
|
||||
RH-Jira: RHEL-68440
|
||||
RH-Acked-by: Cédric Le Goater <clg@redhat.com>
|
||||
RH-Acked-by: Miroslav Rezanina <mrezanin@redhat.com>
|
||||
RH-Commit: [1/8] df997bcf56bad83b5d4832dbf6c3298abd15b249 (thuth/qemu-kvm-cs9)
|
||||
|
||||
Update documentation to include per-device loadparm support.
|
||||
|
||||
Signed-off-by: Jared Rossi <jrossi@linux.ibm.com>
|
||||
Reviewed-by: Thomas Huth <thuth@redhat.com>
|
||||
Message-ID: <20241115002742.3576842-1-jrossi@linux.ibm.com>
|
||||
Signed-off-by: Thomas Huth <thuth@redhat.com>
|
||||
(cherry picked from commit 0271fdc650b212533b8aeaecbedfe8ccf6bbbef3)
|
||||
---
|
||||
docs/system/s390x/bootdevices.rst | 24 +++++++++++++++++++++++-
|
||||
1 file changed, 23 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/docs/system/s390x/bootdevices.rst b/docs/system/s390x/bootdevices.rst
|
||||
index 1a1a764c1c..97b3914785 100644
|
||||
--- a/docs/system/s390x/bootdevices.rst
|
||||
+++ b/docs/system/s390x/bootdevices.rst
|
||||
@@ -79,7 +79,29 @@ The second way to use this parameter is to use a number in the range from 0
|
||||
to 31. The numbers that can be used here correspond to the numbers that are
|
||||
shown when using the ``PROMPT`` option, and the s390-ccw bios will then try
|
||||
to automatically boot the kernel that is associated with the given number.
|
||||
-Note that ``0`` can be used to boot the default entry.
|
||||
+Note that ``0`` can be used to boot the default entry. If the machine
|
||||
+``loadparm`` is not assigned a value, then the default entry is used.
|
||||
+
|
||||
+By default, the machine ``loadparm`` applies to all boot devices. If multiple
|
||||
+devices are assigned a ``bootindex`` and the ``loadparm`` is to be different
|
||||
+between them, an independent ``loadparm`` may be assigned on a per-device basis.
|
||||
+
|
||||
+An example guest using per-device ``loadparm``::
|
||||
+
|
||||
+ qemu-system-s390x -drive if=none,id=dr1,file=primary.qcow2 \
|
||||
+ -device virtio-blk,drive=dr1,bootindex=1 \
|
||||
+ -drive if=none,id=dr2,file=secondary.qcow2 \
|
||||
+ -device virtio-blk,drive=dr2,bootindex=2,loadparm=3
|
||||
+
|
||||
+In this case, the primary boot device will attempt to IPL using the default
|
||||
+entry (because no ``loadparm`` is specified for this device or for the
|
||||
+machine). If that device fails to boot, the secondary device will attempt to
|
||||
+IPL using entry number 3.
|
||||
+
|
||||
+If a ``loadparm`` is specified on both the machine and a device, the per-device
|
||||
+value will superseded the machine value. Per-device ``loadparm`` values are
|
||||
+only used for devices with an assigned ``bootindex``. The machine ``loadparm``
|
||||
+is used when attempting to boot without a ``bootindex``.
|
||||
|
||||
|
||||
Booting from a network device
|
||||
--
|
||||
2.39.3
|
||||
|
||||
@ -1,66 +0,0 @@
|
||||
From 63c705bdd8d8f17860988d22aa29a238e9fae631 Mon Sep 17 00:00:00 2001
|
||||
From: Jared Rossi <jrossi@linux.ibm.com>
|
||||
Date: Sat, 19 Oct 2024 21:29:40 -0400
|
||||
Subject: [PATCH 07/27] docs/system/s390x/bootdevices: Update the documentation
|
||||
about network booting
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
RH-Author: Thomas Huth <thuth@redhat.com>
|
||||
RH-MergeRequest: 277: Full boot order support for s390x [CentOS 9]
|
||||
RH-Jira: RHEL-11424
|
||||
RH-Acked-by: Cédric Le Goater <clg@redhat.com>
|
||||
RH-Acked-by: Miroslav Rezanina <mrezanin@redhat.com>
|
||||
RH-Commit: [7/23] 31b1f484e98304c385adbefb6eb50b501d179268 (thuth/qemu-kvm-cs9)
|
||||
|
||||
Remove the information about the separate s390-netboot.img from
|
||||
the documentation.
|
||||
|
||||
Co-authored by: Thomas Huth <thuth@redhat.com>
|
||||
Signed-off-by: Jared Rossi <jrossi@linux.ibm.com>
|
||||
Message-ID: <20241020012953.1380075-7-jrossi@linux.ibm.com>
|
||||
Signed-off-by: Thomas Huth <thuth@redhat.com>
|
||||
(cherry picked from commit ab2691b6c7ff360875e0af86ff463278f17786f5)
|
||||
---
|
||||
docs/system/s390x/bootdevices.rst | 20 +++++++-------------
|
||||
1 file changed, 7 insertions(+), 13 deletions(-)
|
||||
|
||||
diff --git a/docs/system/s390x/bootdevices.rst b/docs/system/s390x/bootdevices.rst
|
||||
index 1a7a18b43b..c97efb8fc0 100644
|
||||
--- a/docs/system/s390x/bootdevices.rst
|
||||
+++ b/docs/system/s390x/bootdevices.rst
|
||||
@@ -82,23 +82,17 @@ Note that ``0`` can be used to boot the default entry.
|
||||
Booting from a network device
|
||||
-----------------------------
|
||||
|
||||
-Beside the normal guest firmware (which is loaded from the file ``s390-ccw.img``
|
||||
-in the data directory of QEMU, or via the ``-bios`` option), QEMU ships with
|
||||
-a small TFTP network bootloader firmware for virtio-net-ccw devices, too. This
|
||||
-firmware is loaded from a file called ``s390-netboot.img`` in the QEMU data
|
||||
-directory. In case you want to load it from a different filename instead,
|
||||
-you can specify it via the ``-global s390-ipl.netboot_fw=filename``
|
||||
-command line option.
|
||||
-
|
||||
-The ``bootindex`` property is especially important for booting via the network.
|
||||
-If you don't specify the ``bootindex`` property here, the network bootloader
|
||||
-firmware code won't get loaded into the guest memory so that the network boot
|
||||
-will fail. For a successful network boot, try something like this::
|
||||
+The firmware that ships with QEMU includes a small TFTP network bootloader
|
||||
+for virtio-net-ccw devices. The ``bootindex`` property is especially
|
||||
+important for booting via the network. If you don't specify the ``bootindex``
|
||||
+property here, the network bootloader won't be taken into consideration and
|
||||
+the network boot will fail. For a successful network boot, try something
|
||||
+like this::
|
||||
|
||||
qemu-system-s390x -netdev user,id=n1,tftp=...,bootfile=... \
|
||||
-device virtio-net-ccw,netdev=n1,bootindex=1
|
||||
|
||||
-The network bootloader firmware also has basic support for pxelinux.cfg-style
|
||||
+The network bootloader also has basic support for pxelinux.cfg-style
|
||||
configuration files. See the `PXELINUX Configuration page
|
||||
<https://wiki.syslinux.org/wiki/index.php?title=PXELINUX#Configuration>`__
|
||||
for details how to set up the configuration file on your TFTP server.
|
||||
--
|
||||
2.39.3
|
||||
|
||||
@ -1,42 +0,0 @@
|
||||
From d565fe385b3c45a41fa8e25942220aff38a04fc3 Mon Sep 17 00:00:00 2001
|
||||
From: Kevin Wolf <kwolf@redhat.com>
|
||||
Date: Tue, 29 Apr 2025 17:05:41 +0200
|
||||
Subject: [PATCH 2/3] file-posix: Define DM_MPATH_PROBE_PATHS
|
||||
|
||||
RH-Author: Kevin Wolf <kwolf@redhat.com>
|
||||
RH-MergeRequest: 372: file-posix: Fix multipath failover with SCSI passthrough [9.7]
|
||||
RH-Jira: RHEL-95408
|
||||
RH-Acked-by: Hanna Czenczek <hreitz@redhat.com>
|
||||
RH-Acked-by: Stefan Hajnoczi <stefanha@redhat.com>
|
||||
RH-Commit: [1/2] 7615906833a6bb2b4645fa5cd60d78aa9631cb7c (kmwolf/centos-qemu-kvm)
|
||||
|
||||
While the kernel side isn't merged yet and we're still using old kernel
|
||||
headers, just define DM_MPATH_PROBE_PATHS manually.
|
||||
|
||||
This is a downstream-only patch that can be removed after the next minor
|
||||
release.
|
||||
|
||||
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
|
||||
---
|
||||
block/file-posix.c | 5 +++++
|
||||
1 file changed, 5 insertions(+)
|
||||
|
||||
diff --git a/block/file-posix.c b/block/file-posix.c
|
||||
index 0cb4e922c0..6a5c506549 100644
|
||||
--- a/block/file-posix.c
|
||||
+++ b/block/file-posix.c
|
||||
@@ -134,6 +134,11 @@
|
||||
#define RAW_LOCK_PERM_BASE 100
|
||||
#define RAW_LOCK_SHARED_BASE 200
|
||||
|
||||
+/* TODO Remove this when the kernel side is merged */
|
||||
+#if !defined(DM_MPATH_PROBE_PATHS) && defined(DM_GET_TARGET_VERSION)
|
||||
+#define DM_MPATH_PROBE_PATHS _IO(DM_IOCTL, DM_GET_TARGET_VERSION_CMD + 1)
|
||||
+#endif
|
||||
+
|
||||
typedef struct BDRVRawState {
|
||||
int fd;
|
||||
bool use_lock;
|
||||
--
|
||||
2.48.1
|
||||
|
||||
@ -1,46 +0,0 @@
|
||||
From 3515c6541f71817727a3a8b18ec5252644b51bc0 Mon Sep 17 00:00:00 2001
|
||||
From: Kevin Wolf <kwolf@redhat.com>
|
||||
Date: Tue, 29 Apr 2025 17:56:54 +0200
|
||||
Subject: [PATCH 5/5] file-posix: Fix crash on discard_granularity == 0
|
||||
|
||||
RH-Author: Stefan Hajnoczi <stefanha@redhat.com>
|
||||
RH-MergeRequest: 355: file-posix: probe discard alignment on Linux block devices
|
||||
RH-Jira: RHEL-86032
|
||||
RH-Acked-by: Kevin Wolf <kwolf@redhat.com>
|
||||
RH-Acked-by: Eric Blake <eblake@redhat.com>
|
||||
RH-Commit: [3/3] b8139a4c5b19efff1f15c314447a6abb89db0ae7 (stefanha/centos-stream-qemu-kvm)
|
||||
|
||||
Block devices that don't support discard have a discard_granularity of
|
||||
0. Currently, this results in a division by zero when we try to make
|
||||
sure that it's a multiple of request_alignment. Only try to update
|
||||
bs->bl.pdiscard_alignment when we got a non-zero discard_granularity
|
||||
from sysfs.
|
||||
|
||||
Fixes: f605796aae4 ('file-posix: probe discard alignment on Linux block devices')
|
||||
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
|
||||
Reviewed-by: Stefan Hajnoczi <stefanha@redhat.com>
|
||||
Reviewed-by: Eric Blake <eblake@redhat.com>
|
||||
Message-ID: <20250429155654.102735-1-kwolf@redhat.com>
|
||||
Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
|
||||
(cherry picked from commit 71a30d54e6ab1d5c102a8bee2c263414697402ea)
|
||||
Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
|
||||
---
|
||||
block/file-posix.c | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
diff --git a/block/file-posix.c b/block/file-posix.c
|
||||
index 3d5b024459..0cb4e922c0 100644
|
||||
--- a/block/file-posix.c
|
||||
+++ b/block/file-posix.c
|
||||
@@ -1565,7 +1565,7 @@ static void raw_refresh_limits(BlockDriverState *bs, Error **errp)
|
||||
int ret;
|
||||
|
||||
ret = hdev_get_pdiscard_alignment(&st, &dalign);
|
||||
- if (ret == 0) {
|
||||
+ if (ret == 0 && dalign != 0) {
|
||||
uint32_t ralign = bs->bl.request_alignment;
|
||||
|
||||
/* Probably never happens, but handle it just in case */
|
||||
--
|
||||
2.48.1
|
||||
|
||||
@ -1,215 +0,0 @@
|
||||
From 95c651ba1177bd88dbd9b52fe2ec8fedadcdb5c8 Mon Sep 17 00:00:00 2001
|
||||
From: Kevin Wolf <kwolf@redhat.com>
|
||||
Date: Thu, 22 May 2025 15:08:03 +0200
|
||||
Subject: [PATCH 3/3] file-posix: Probe paths and retry SG_IO on potential path
|
||||
errors
|
||||
|
||||
RH-Author: Kevin Wolf <kwolf@redhat.com>
|
||||
RH-MergeRequest: 372: file-posix: Fix multipath failover with SCSI passthrough [9.7]
|
||||
RH-Jira: RHEL-95408
|
||||
RH-Acked-by: Hanna Czenczek <hreitz@redhat.com>
|
||||
RH-Acked-by: Stefan Hajnoczi <stefanha@redhat.com>
|
||||
RH-Commit: [2/2] 4312e9ec609e511afdfb6634e1d2370032d41543 (kmwolf/centos-qemu-kvm)
|
||||
|
||||
When scsi-block is used on a host multipath device, it runs into the
|
||||
problem that the kernel dm-mpath doesn't know anything about SCSI or
|
||||
SG_IO and therefore can't decide if a SG_IO request returned an error
|
||||
and needs to be retried on a different path. Instead of getting working
|
||||
failover, an error is returned to scsi-block and handled according to
|
||||
the configured error policy. Obviously, this is not what users want,
|
||||
they want working failover.
|
||||
|
||||
QEMU can parse the SG_IO result and determine whether this could have
|
||||
been a path error, but just retrying the same request could just send it
|
||||
to the same failing path again and result in the same error.
|
||||
|
||||
With a kernel that supports the DM_MPATH_PROBE_PATHS ioctl on dm-mpath
|
||||
block devices (queued in the device mapper tree for Linux 6.16), we can
|
||||
tell the kernel to probe all paths and tell us if any usable paths
|
||||
remained. If so, we can now retry the SG_IO ioctl and expect it to be
|
||||
sent to a working path.
|
||||
|
||||
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
|
||||
Message-ID: <20250522130803.34738-1-kwolf@redhat.com>
|
||||
Reviewed-by: Stefan Hajnoczi <stefanha@redhat.com>
|
||||
Reviewed-by: Hanna Czenczek <hreitz@redhat.com>
|
||||
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
|
||||
(cherry picked from commit bf627788ef17721955bfcfba84209a07ae5f54ea)
|
||||
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
|
||||
---
|
||||
block/file-posix.c | 115 ++++++++++++++++++++++++++++++++++++++++++++-
|
||||
1 file changed, 114 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/block/file-posix.c b/block/file-posix.c
|
||||
index 6a5c506549..f17a3f4d10 100644
|
||||
--- a/block/file-posix.c
|
||||
+++ b/block/file-posix.c
|
||||
@@ -41,6 +41,7 @@
|
||||
|
||||
#include "scsi/pr-manager.h"
|
||||
#include "scsi/constants.h"
|
||||
+#include "scsi/utils.h"
|
||||
|
||||
#if defined(__APPLE__) && (__MACH__)
|
||||
#include <sys/ioctl.h>
|
||||
@@ -72,6 +73,7 @@
|
||||
#include <linux/blkzoned.h>
|
||||
#endif
|
||||
#include <linux/cdrom.h>
|
||||
+#include <linux/dm-ioctl.h>
|
||||
#include <linux/fd.h>
|
||||
#include <linux/fs.h>
|
||||
#include <linux/hdreg.h>
|
||||
@@ -139,6 +141,22 @@
|
||||
#define DM_MPATH_PROBE_PATHS _IO(DM_IOCTL, DM_GET_TARGET_VERSION_CMD + 1)
|
||||
#endif
|
||||
|
||||
+/*
|
||||
+ * Multiple retries are mostly meant for two separate scenarios:
|
||||
+ *
|
||||
+ * - DM_MPATH_PROBE_PATHS returns success, but before SG_IO completes, another
|
||||
+ * path goes down.
|
||||
+ *
|
||||
+ * - DM_MPATH_PROBE_PATHS failed all paths in the current path group, so we have
|
||||
+ * to send another SG_IO to switch to another path group to probe the paths in
|
||||
+ * it.
|
||||
+ *
|
||||
+ * Even if each path is in a separate path group (path_grouping_policy set to
|
||||
+ * failover), it's rare to have more than eight path groups - and even then
|
||||
+ * pretty unlikely that only bad path groups would be chosen in eight retries.
|
||||
+ */
|
||||
+#define SG_IO_MAX_RETRIES 8
|
||||
+
|
||||
typedef struct BDRVRawState {
|
||||
int fd;
|
||||
bool use_lock;
|
||||
@@ -166,6 +184,7 @@ typedef struct BDRVRawState {
|
||||
bool use_linux_aio:1;
|
||||
bool has_laio_fdsync:1;
|
||||
bool use_linux_io_uring:1;
|
||||
+ bool use_mpath:1;
|
||||
int page_cache_inconsistent; /* errno from fdatasync failure */
|
||||
bool has_fallocate;
|
||||
bool needs_alignment;
|
||||
@@ -4248,15 +4267,105 @@ hdev_open_Mac_error:
|
||||
/* Since this does ioctl the device must be already opened */
|
||||
bs->sg = hdev_is_sg(bs);
|
||||
|
||||
+ /* sg devices aren't even block devices and can't use dm-mpath */
|
||||
+ s->use_mpath = !bs->sg;
|
||||
+
|
||||
return ret;
|
||||
}
|
||||
|
||||
#if defined(__linux__)
|
||||
+#if defined(DM_MPATH_PROBE_PATHS)
|
||||
+static bool coroutine_fn sgio_path_error(int ret, sg_io_hdr_t *io_hdr)
|
||||
+{
|
||||
+ if (ret < 0) {
|
||||
+ switch (ret) {
|
||||
+ case -ENODEV:
|
||||
+ return true;
|
||||
+ case -EAGAIN:
|
||||
+ /*
|
||||
+ * The device is probably suspended. This happens while the dm table
|
||||
+ * is reloaded, e.g. because a path is added or removed. This is an
|
||||
+ * operation that should complete within 1ms, so just wait a bit and
|
||||
+ * retry.
|
||||
+ *
|
||||
+ * If the device was suspended for another reason, we'll wait and
|
||||
+ * retry SG_IO_MAX_RETRIES times. This is a tolerable delay before
|
||||
+ * we return an error and potentially stop the VM.
|
||||
+ */
|
||||
+ qemu_co_sleep_ns(QEMU_CLOCK_REALTIME, 1000000);
|
||||
+ return true;
|
||||
+ default:
|
||||
+ return false;
|
||||
+ }
|
||||
+ }
|
||||
+
|
||||
+ if (io_hdr->host_status != SCSI_HOST_OK) {
|
||||
+ return true;
|
||||
+ }
|
||||
+
|
||||
+ switch (io_hdr->status) {
|
||||
+ case GOOD:
|
||||
+ case CONDITION_GOOD:
|
||||
+ case INTERMEDIATE_GOOD:
|
||||
+ case INTERMEDIATE_C_GOOD:
|
||||
+ case RESERVATION_CONFLICT:
|
||||
+ case COMMAND_TERMINATED:
|
||||
+ return false;
|
||||
+ case CHECK_CONDITION:
|
||||
+ return !scsi_sense_buf_is_guest_recoverable(io_hdr->sbp,
|
||||
+ io_hdr->mx_sb_len);
|
||||
+ default:
|
||||
+ return true;
|
||||
+ }
|
||||
+}
|
||||
+
|
||||
+static bool coroutine_fn hdev_co_ioctl_sgio_retry(RawPosixAIOData *acb, int ret)
|
||||
+{
|
||||
+ BDRVRawState *s = acb->bs->opaque;
|
||||
+ RawPosixAIOData probe_acb;
|
||||
+
|
||||
+ if (!s->use_mpath) {
|
||||
+ return false;
|
||||
+ }
|
||||
+
|
||||
+ if (!sgio_path_error(ret, acb->ioctl.buf)) {
|
||||
+ return false;
|
||||
+ }
|
||||
+
|
||||
+ probe_acb = (RawPosixAIOData) {
|
||||
+ .bs = acb->bs,
|
||||
+ .aio_type = QEMU_AIO_IOCTL,
|
||||
+ .aio_fildes = s->fd,
|
||||
+ .aio_offset = 0,
|
||||
+ .ioctl = {
|
||||
+ .buf = NULL,
|
||||
+ .cmd = DM_MPATH_PROBE_PATHS,
|
||||
+ },
|
||||
+ };
|
||||
+
|
||||
+ ret = raw_thread_pool_submit(handle_aiocb_ioctl, &probe_acb);
|
||||
+ if (ret == -ENOTTY) {
|
||||
+ s->use_mpath = false;
|
||||
+ } else if (ret == -EAGAIN) {
|
||||
+ /* The device might be suspended for a table reload, worth retrying */
|
||||
+ return true;
|
||||
+ }
|
||||
+
|
||||
+ return ret == 0;
|
||||
+}
|
||||
+#else
|
||||
+static bool coroutine_fn hdev_co_ioctl_sgio_retry(RawPosixAIOData *acb, int ret)
|
||||
+{
|
||||
+ return false;
|
||||
+}
|
||||
+#endif /* DM_MPATH_PROBE_PATHS */
|
||||
+
|
||||
static int coroutine_fn
|
||||
hdev_co_ioctl(BlockDriverState *bs, unsigned long int req, void *buf)
|
||||
{
|
||||
BDRVRawState *s = bs->opaque;
|
||||
RawPosixAIOData acb;
|
||||
+ int retries = SG_IO_MAX_RETRIES;
|
||||
int ret;
|
||||
|
||||
ret = fd_open(bs);
|
||||
@@ -4284,7 +4393,11 @@ hdev_co_ioctl(BlockDriverState *bs, unsigned long int req, void *buf)
|
||||
},
|
||||
};
|
||||
|
||||
- return raw_thread_pool_submit(handle_aiocb_ioctl, &acb);
|
||||
+ do {
|
||||
+ ret = raw_thread_pool_submit(handle_aiocb_ioctl, &acb);
|
||||
+ } while (req == SG_IO && retries-- && hdev_co_ioctl_sgio_retry(&acb, ret));
|
||||
+
|
||||
+ return ret;
|
||||
}
|
||||
#endif /* linux */
|
||||
|
||||
--
|
||||
2.48.1
|
||||
|
||||
@ -1,64 +0,0 @@
|
||||
From 39e0c370357a414abacd64fb6a172e7b25eb4d82 Mon Sep 17 00:00:00 2001
|
||||
From: Eric Blake <eblake@redhat.com>
|
||||
Date: Fri, 9 May 2025 15:40:19 -0500
|
||||
Subject: [PATCH 04/16] file-posix, gluster: Handle zero block status hint
|
||||
better
|
||||
|
||||
RH-Author: Eric Blake <eblake@redhat.com>
|
||||
RH-MergeRequest: 365: blockdev-mirror: More efficient handling of sparse mirrors
|
||||
RH-Jira: RHEL-82906 RHEL-83015
|
||||
RH-Acked-by: Stefan Hajnoczi <stefanha@redhat.com>
|
||||
RH-Acked-by: Jon Maloy <jmaloy@redhat.com>
|
||||
RH-Commit: [2/14] 1f7b47ce5f5fb321aee41a16accf5bce3d1bfe95 (ebblake/centos-qemu-kvm)
|
||||
|
||||
Although the previous patch to change 'bool want_zero' into a bitmask
|
||||
made no semantic change, it is now time to differentiate. When the
|
||||
caller specifically wants to know what parts of the file read as zero,
|
||||
we need to use lseek and actually reporting holes, rather than
|
||||
short-circuiting and advertising full allocation.
|
||||
|
||||
This change will be utilized in later patches to let mirroring
|
||||
optimize for the case when the destination already reads as zeroes.
|
||||
|
||||
Signed-off-by: Eric Blake <eblake@redhat.com>
|
||||
Reviewed-by: Stefan Hajnoczi <stefanha@redhat.com>
|
||||
Message-ID: <20250509204341.3553601-17-eblake@redhat.com>
|
||||
(cherry picked from commit a6a0a7fb0e327d17594c971b4a39de14e025b415)
|
||||
Jira: https://issues.redhat.com/browse/RHEL-82906
|
||||
Jira: https://issues.redhat.com/browse/RHEL-83015
|
||||
Signed-off-by: Eric Blake <eblake@redhat.com>
|
||||
---
|
||||
block/file-posix.c | 3 ++-
|
||||
block/gluster.c | 2 +-
|
||||
2 files changed, 3 insertions(+), 2 deletions(-)
|
||||
|
||||
diff --git a/block/file-posix.c b/block/file-posix.c
|
||||
index 9ca55620ca..ce5da2b4c2 100644
|
||||
--- a/block/file-posix.c
|
||||
+++ b/block/file-posix.c
|
||||
@@ -3293,7 +3293,8 @@ static int coroutine_fn raw_co_block_status(BlockDriverState *bs,
|
||||
return ret;
|
||||
}
|
||||
|
||||
- if (mode != BDRV_WANT_PRECISE) {
|
||||
+ if (!(mode & BDRV_WANT_ZERO)) {
|
||||
+ /* There is no backing file - all bytes are allocated in this file. */
|
||||
*pnum = bytes;
|
||||
*map = offset;
|
||||
*file = bs;
|
||||
diff --git a/block/gluster.c b/block/gluster.c
|
||||
index ae5c45666b..175c70164c 100644
|
||||
--- a/block/gluster.c
|
||||
+++ b/block/gluster.c
|
||||
@@ -1483,7 +1483,7 @@ static int coroutine_fn qemu_gluster_co_block_status(BlockDriverState *bs,
|
||||
return ret;
|
||||
}
|
||||
|
||||
- if (mode != BDRV_WANT_PRECISE) {
|
||||
+ if (!(mode & BDRV_WANT_ZERO)) {
|
||||
*pnum = bytes;
|
||||
*map = offset;
|
||||
*file = bs;
|
||||
--
|
||||
2.48.1
|
||||
|
||||
@ -1,131 +0,0 @@
|
||||
From 29ae77d77cabc3582267cb8a7c4fe10d279a21e6 Mon Sep 17 00:00:00 2001
|
||||
From: Stefan Hajnoczi <stefanha@redhat.com>
|
||||
Date: Thu, 17 Apr 2025 11:05:27 -0400
|
||||
Subject: [PATCH 3/5] file-posix: probe discard alignment on Linux block
|
||||
devices
|
||||
|
||||
RH-Author: Stefan Hajnoczi <stefanha@redhat.com>
|
||||
RH-MergeRequest: 355: file-posix: probe discard alignment on Linux block devices
|
||||
RH-Jira: RHEL-86032
|
||||
RH-Acked-by: Kevin Wolf <kwolf@redhat.com>
|
||||
RH-Acked-by: Eric Blake <eblake@redhat.com>
|
||||
RH-Commit: [1/3] bb3c17b0da6edeb209874e97d4e2c3b1762a1749 (stefanha/centos-stream-qemu-kvm)
|
||||
|
||||
Populate the pdiscard_alignment block limit so the block layer is able
|
||||
align discard requests correctly.
|
||||
|
||||
Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
|
||||
Message-ID: <20250417150528.76470-2-stefanha@redhat.com>
|
||||
Reviewed-by: Kevin Wolf <kwolf@redhat.com>
|
||||
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
|
||||
(cherry picked from commit f605796aae42885034400c83ed6a9b07cd6d6481)
|
||||
Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
|
||||
---
|
||||
block/file-posix.c | 67 +++++++++++++++++++++++++++++++++++++++++++++-
|
||||
1 file changed, 66 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/block/file-posix.c b/block/file-posix.c
|
||||
index ff928b5e85..3d5b024459 100644
|
||||
--- a/block/file-posix.c
|
||||
+++ b/block/file-posix.c
|
||||
@@ -1268,10 +1268,10 @@ static int get_sysfs_zoned_model(struct stat *st, BlockZoneModel *zoned)
|
||||
}
|
||||
#endif /* defined(CONFIG_BLKZONED) */
|
||||
|
||||
+#ifdef CONFIG_LINUX
|
||||
/*
|
||||
* Get a sysfs attribute value as a long integer.
|
||||
*/
|
||||
-#ifdef CONFIG_LINUX
|
||||
static long get_sysfs_long_val(struct stat *st, const char *attribute)
|
||||
{
|
||||
g_autofree char *str = NULL;
|
||||
@@ -1291,6 +1291,30 @@ static long get_sysfs_long_val(struct stat *st, const char *attribute)
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
+
|
||||
+/*
|
||||
+ * Get a sysfs attribute value as a uint32_t.
|
||||
+ */
|
||||
+static int get_sysfs_u32_val(struct stat *st, const char *attribute,
|
||||
+ uint32_t *u32)
|
||||
+{
|
||||
+ g_autofree char *str = NULL;
|
||||
+ const char *end;
|
||||
+ unsigned int val;
|
||||
+ int ret;
|
||||
+
|
||||
+ ret = get_sysfs_str_val(st, attribute, &str);
|
||||
+ if (ret < 0) {
|
||||
+ return ret;
|
||||
+ }
|
||||
+
|
||||
+ /* The file is ended with '\n', pass 'end' to accept that. */
|
||||
+ ret = qemu_strtoui(str, &end, 10, &val);
|
||||
+ if (ret == 0 && end && *end == '\0') {
|
||||
+ *u32 = val;
|
||||
+ }
|
||||
+ return ret;
|
||||
+}
|
||||
#endif
|
||||
|
||||
static int hdev_get_max_segments(int fd, struct stat *st)
|
||||
@@ -1310,6 +1334,23 @@ static int hdev_get_max_segments(int fd, struct stat *st)
|
||||
#endif
|
||||
}
|
||||
|
||||
+/*
|
||||
+ * Fills in *dalign with the discard alignment and returns 0 on success,
|
||||
+ * -errno otherwise.
|
||||
+ */
|
||||
+static int hdev_get_pdiscard_alignment(struct stat *st, uint32_t *dalign)
|
||||
+{
|
||||
+#ifdef CONFIG_LINUX
|
||||
+ /*
|
||||
+ * Note that Linux "discard_granularity" is QEMU "discard_alignment". Linux
|
||||
+ * "discard_alignment" is something else.
|
||||
+ */
|
||||
+ return get_sysfs_u32_val(st, "discard_granularity", dalign);
|
||||
+#else
|
||||
+ return -ENOTSUP;
|
||||
+#endif
|
||||
+}
|
||||
+
|
||||
#if defined(CONFIG_BLKZONED)
|
||||
/*
|
||||
* If the reset_all flag is true, then the wps of zone whose state is
|
||||
@@ -1519,6 +1560,30 @@ static void raw_refresh_limits(BlockDriverState *bs, Error **errp)
|
||||
}
|
||||
}
|
||||
|
||||
+ if (S_ISBLK(st.st_mode)) {
|
||||
+ uint32_t dalign = 0;
|
||||
+ int ret;
|
||||
+
|
||||
+ ret = hdev_get_pdiscard_alignment(&st, &dalign);
|
||||
+ if (ret == 0) {
|
||||
+ uint32_t ralign = bs->bl.request_alignment;
|
||||
+
|
||||
+ /* Probably never happens, but handle it just in case */
|
||||
+ if (dalign < ralign && (ralign % dalign == 0)) {
|
||||
+ dalign = ralign;
|
||||
+ }
|
||||
+
|
||||
+ /* The block layer requires a multiple of request_alignment */
|
||||
+ if (dalign % ralign != 0) {
|
||||
+ error_setg(errp, "Invalid pdiscard_alignment limit %u is not a "
|
||||
+ "multiple of request_alignment %u", dalign, ralign);
|
||||
+ return;
|
||||
+ }
|
||||
+
|
||||
+ bs->bl.pdiscard_alignment = dalign;
|
||||
+ }
|
||||
+ }
|
||||
+
|
||||
raw_refresh_zoned_limits(bs, &st, errp);
|
||||
}
|
||||
|
||||
--
|
||||
2.48.1
|
||||
|
||||
@ -1,233 +0,0 @@
|
||||
From 43245dc5a297d6c4097a0191af4f818e416a3f45 Mon Sep 17 00:00:00 2001
|
||||
From: Paolo Bonzini <pbonzini@redhat.com>
|
||||
Date: Fri, 18 Jul 2025 18:03:46 +0200
|
||||
Subject: [PATCH 051/115] headers: Add definitions from UEFI spec for volumes,
|
||||
resources, etc...
|
||||
|
||||
RH-Author: Paolo Bonzini <pbonzini@redhat.com>
|
||||
RH-MergeRequest: 391: TDX support, including attestation and device assignment
|
||||
RH-Jira: RHEL-15710 RHEL-20798 RHEL-49728
|
||||
RH-Acked-by: Yash Mankad <None>
|
||||
RH-Acked-by: Peter Xu <peterx@redhat.com>
|
||||
RH-Acked-by: David Hildenbrand <david@redhat.com>
|
||||
RH-Commit: [51/115] c44f8b832aa268a5b2d3e98a8ce6bfbda7e1c684 (bonzini/rhel-qemu-kvm)
|
||||
|
||||
Add UEFI definitions for literals, enums, structs, GUIDs, etc... that
|
||||
will be used by TDX to build the UEFI Hand-Off Block (HOB) that is passed
|
||||
to the Trusted Domain Virtual Firmware (TDVF).
|
||||
|
||||
All values come from the UEFI specification [1], PI spec [2] and TDVF
|
||||
design guide[3].
|
||||
|
||||
[1] UEFI Specification v2.1.0 https://uefi.org/sites/default/files/resources/UEFI_Spec_2_10_Aug29.pdf
|
||||
[2] UEFI PI spec v1.8 https://uefi.org/sites/default/files/resources/UEFI_PI_Spec_1_8_March3.pdf
|
||||
[3] https://software.intel.com/content/dam/develop/external/us/en/documents/tdx-virtual-firmware-design-guide-rev-1.pdf
|
||||
|
||||
Signed-off-by: Xiaoyao Li <xiaoyao.li@intel.com>
|
||||
Acked-by: Gerd Hoffmann <kraxel@redhat.com>
|
||||
Reviewed-by: Zhao Liu <zhao1.liu@intel.com>
|
||||
Link: https://lore.kernel.org/r/20250508150002.689633-23-xiaoyao.li@intel.com
|
||||
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
|
||||
(cherry picked from commit 88aa6576e4ab40b538f543852128cb17fce37f87)
|
||||
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
|
||||
---
|
||||
include/standard-headers/uefi/uefi.h | 187 +++++++++++++++++++++++++++
|
||||
1 file changed, 187 insertions(+)
|
||||
create mode 100644 include/standard-headers/uefi/uefi.h
|
||||
|
||||
diff --git a/include/standard-headers/uefi/uefi.h b/include/standard-headers/uefi/uefi.h
|
||||
new file mode 100644
|
||||
index 0000000000..5256349ec0
|
||||
--- /dev/null
|
||||
+++ b/include/standard-headers/uefi/uefi.h
|
||||
@@ -0,0 +1,187 @@
|
||||
+/*
|
||||
+ * Copyright (C) 2025 Intel Corporation
|
||||
+ *
|
||||
+ * Author: Isaku Yamahata <isaku.yamahata at gmail.com>
|
||||
+ * <isaku.yamahata at intel.com>
|
||||
+ * Xiaoyao Li <xiaoyao.li@intel.com>
|
||||
+ *
|
||||
+ * SPDX-License-Identifier: GPL-2.0-or-later
|
||||
+ */
|
||||
+
|
||||
+#ifndef HW_I386_UEFI_H
|
||||
+#define HW_I386_UEFI_H
|
||||
+
|
||||
+/***************************************************************************/
|
||||
+/*
|
||||
+ * basic EFI definitions
|
||||
+ * supplemented with UEFI Specification Version 2.8 (Errata A)
|
||||
+ * released February 2020
|
||||
+ */
|
||||
+/* UEFI integer is little endian */
|
||||
+
|
||||
+typedef struct {
|
||||
+ uint32_t Data1;
|
||||
+ uint16_t Data2;
|
||||
+ uint16_t Data3;
|
||||
+ uint8_t Data4[8];
|
||||
+} EFI_GUID;
|
||||
+
|
||||
+typedef enum {
|
||||
+ EfiReservedMemoryType,
|
||||
+ EfiLoaderCode,
|
||||
+ EfiLoaderData,
|
||||
+ EfiBootServicesCode,
|
||||
+ EfiBootServicesData,
|
||||
+ EfiRuntimeServicesCode,
|
||||
+ EfiRuntimeServicesData,
|
||||
+ EfiConventionalMemory,
|
||||
+ EfiUnusableMemory,
|
||||
+ EfiACPIReclaimMemory,
|
||||
+ EfiACPIMemoryNVS,
|
||||
+ EfiMemoryMappedIO,
|
||||
+ EfiMemoryMappedIOPortSpace,
|
||||
+ EfiPalCode,
|
||||
+ EfiPersistentMemory,
|
||||
+ EfiUnacceptedMemoryType,
|
||||
+ EfiMaxMemoryType
|
||||
+} EFI_MEMORY_TYPE;
|
||||
+
|
||||
+#define EFI_HOB_HANDOFF_TABLE_VERSION 0x0009
|
||||
+
|
||||
+#define EFI_HOB_TYPE_HANDOFF 0x0001
|
||||
+#define EFI_HOB_TYPE_MEMORY_ALLOCATION 0x0002
|
||||
+#define EFI_HOB_TYPE_RESOURCE_DESCRIPTOR 0x0003
|
||||
+#define EFI_HOB_TYPE_GUID_EXTENSION 0x0004
|
||||
+#define EFI_HOB_TYPE_FV 0x0005
|
||||
+#define EFI_HOB_TYPE_CPU 0x0006
|
||||
+#define EFI_HOB_TYPE_MEMORY_POOL 0x0007
|
||||
+#define EFI_HOB_TYPE_FV2 0x0009
|
||||
+#define EFI_HOB_TYPE_LOAD_PEIM_UNUSED 0x000A
|
||||
+#define EFI_HOB_TYPE_UEFI_CAPSULE 0x000B
|
||||
+#define EFI_HOB_TYPE_FV3 0x000C
|
||||
+#define EFI_HOB_TYPE_UNUSED 0xFFFE
|
||||
+#define EFI_HOB_TYPE_END_OF_HOB_LIST 0xFFFF
|
||||
+
|
||||
+typedef struct {
|
||||
+ uint16_t HobType;
|
||||
+ uint16_t HobLength;
|
||||
+ uint32_t Reserved;
|
||||
+} EFI_HOB_GENERIC_HEADER;
|
||||
+
|
||||
+typedef uint64_t EFI_PHYSICAL_ADDRESS;
|
||||
+typedef uint32_t EFI_BOOT_MODE;
|
||||
+
|
||||
+typedef struct {
|
||||
+ EFI_HOB_GENERIC_HEADER Header;
|
||||
+ uint32_t Version;
|
||||
+ EFI_BOOT_MODE BootMode;
|
||||
+ EFI_PHYSICAL_ADDRESS EfiMemoryTop;
|
||||
+ EFI_PHYSICAL_ADDRESS EfiMemoryBottom;
|
||||
+ EFI_PHYSICAL_ADDRESS EfiFreeMemoryTop;
|
||||
+ EFI_PHYSICAL_ADDRESS EfiFreeMemoryBottom;
|
||||
+ EFI_PHYSICAL_ADDRESS EfiEndOfHobList;
|
||||
+} EFI_HOB_HANDOFF_INFO_TABLE;
|
||||
+
|
||||
+#define EFI_RESOURCE_SYSTEM_MEMORY 0x00000000
|
||||
+#define EFI_RESOURCE_MEMORY_MAPPED_IO 0x00000001
|
||||
+#define EFI_RESOURCE_IO 0x00000002
|
||||
+#define EFI_RESOURCE_FIRMWARE_DEVICE 0x00000003
|
||||
+#define EFI_RESOURCE_MEMORY_MAPPED_IO_PORT 0x00000004
|
||||
+#define EFI_RESOURCE_MEMORY_RESERVED 0x00000005
|
||||
+#define EFI_RESOURCE_IO_RESERVED 0x00000006
|
||||
+#define EFI_RESOURCE_MEMORY_UNACCEPTED 0x00000007
|
||||
+#define EFI_RESOURCE_MAX_MEMORY_TYPE 0x00000008
|
||||
+
|
||||
+#define EFI_RESOURCE_ATTRIBUTE_PRESENT 0x00000001
|
||||
+#define EFI_RESOURCE_ATTRIBUTE_INITIALIZED 0x00000002
|
||||
+#define EFI_RESOURCE_ATTRIBUTE_TESTED 0x00000004
|
||||
+#define EFI_RESOURCE_ATTRIBUTE_SINGLE_BIT_ECC 0x00000008
|
||||
+#define EFI_RESOURCE_ATTRIBUTE_MULTIPLE_BIT_ECC 0x00000010
|
||||
+#define EFI_RESOURCE_ATTRIBUTE_ECC_RESERVED_1 0x00000020
|
||||
+#define EFI_RESOURCE_ATTRIBUTE_ECC_RESERVED_2 0x00000040
|
||||
+#define EFI_RESOURCE_ATTRIBUTE_READ_PROTECTED 0x00000080
|
||||
+#define EFI_RESOURCE_ATTRIBUTE_WRITE_PROTECTED 0x00000100
|
||||
+#define EFI_RESOURCE_ATTRIBUTE_EXECUTION_PROTECTED 0x00000200
|
||||
+#define EFI_RESOURCE_ATTRIBUTE_UNCACHEABLE 0x00000400
|
||||
+#define EFI_RESOURCE_ATTRIBUTE_WRITE_COMBINEABLE 0x00000800
|
||||
+#define EFI_RESOURCE_ATTRIBUTE_WRITE_THROUGH_CACHEABLE 0x00001000
|
||||
+#define EFI_RESOURCE_ATTRIBUTE_WRITE_BACK_CACHEABLE 0x00002000
|
||||
+#define EFI_RESOURCE_ATTRIBUTE_16_BIT_IO 0x00004000
|
||||
+#define EFI_RESOURCE_ATTRIBUTE_32_BIT_IO 0x00008000
|
||||
+#define EFI_RESOURCE_ATTRIBUTE_64_BIT_IO 0x00010000
|
||||
+#define EFI_RESOURCE_ATTRIBUTE_UNCACHED_EXPORTED 0x00020000
|
||||
+#define EFI_RESOURCE_ATTRIBUTE_READ_ONLY_PROTECTED 0x00040000
|
||||
+#define EFI_RESOURCE_ATTRIBUTE_READ_ONLY_PROTECTABLE 0x00080000
|
||||
+#define EFI_RESOURCE_ATTRIBUTE_READ_PROTECTABLE 0x00100000
|
||||
+#define EFI_RESOURCE_ATTRIBUTE_WRITE_PROTECTABLE 0x00200000
|
||||
+#define EFI_RESOURCE_ATTRIBUTE_EXECUTION_PROTECTABLE 0x00400000
|
||||
+#define EFI_RESOURCE_ATTRIBUTE_PERSISTENT 0x00800000
|
||||
+#define EFI_RESOURCE_ATTRIBUTE_PERSISTABLE 0x01000000
|
||||
+#define EFI_RESOURCE_ATTRIBUTE_MORE_RELIABLE 0x02000000
|
||||
+
|
||||
+typedef uint32_t EFI_RESOURCE_TYPE;
|
||||
+typedef uint32_t EFI_RESOURCE_ATTRIBUTE_TYPE;
|
||||
+
|
||||
+typedef struct {
|
||||
+ EFI_HOB_GENERIC_HEADER Header;
|
||||
+ EFI_GUID Owner;
|
||||
+ EFI_RESOURCE_TYPE ResourceType;
|
||||
+ EFI_RESOURCE_ATTRIBUTE_TYPE ResourceAttribute;
|
||||
+ EFI_PHYSICAL_ADDRESS PhysicalStart;
|
||||
+ uint64_t ResourceLength;
|
||||
+} EFI_HOB_RESOURCE_DESCRIPTOR;
|
||||
+
|
||||
+typedef struct {
|
||||
+ EFI_HOB_GENERIC_HEADER Header;
|
||||
+ EFI_GUID Name;
|
||||
+
|
||||
+ /* guid specific data follows */
|
||||
+} EFI_HOB_GUID_TYPE;
|
||||
+
|
||||
+typedef struct {
|
||||
+ EFI_HOB_GENERIC_HEADER Header;
|
||||
+ EFI_PHYSICAL_ADDRESS BaseAddress;
|
||||
+ uint64_t Length;
|
||||
+} EFI_HOB_FIRMWARE_VOLUME;
|
||||
+
|
||||
+typedef struct {
|
||||
+ EFI_HOB_GENERIC_HEADER Header;
|
||||
+ EFI_PHYSICAL_ADDRESS BaseAddress;
|
||||
+ uint64_t Length;
|
||||
+ EFI_GUID FvName;
|
||||
+ EFI_GUID FileName;
|
||||
+} EFI_HOB_FIRMWARE_VOLUME2;
|
||||
+
|
||||
+typedef struct {
|
||||
+ EFI_HOB_GENERIC_HEADER Header;
|
||||
+ EFI_PHYSICAL_ADDRESS BaseAddress;
|
||||
+ uint64_t Length;
|
||||
+ uint32_t AuthenticationStatus;
|
||||
+ bool ExtractedFv;
|
||||
+ EFI_GUID FvName;
|
||||
+ EFI_GUID FileName;
|
||||
+} EFI_HOB_FIRMWARE_VOLUME3;
|
||||
+
|
||||
+typedef struct {
|
||||
+ EFI_HOB_GENERIC_HEADER Header;
|
||||
+ uint8_t SizeOfMemorySpace;
|
||||
+ uint8_t SizeOfIoSpace;
|
||||
+ uint8_t Reserved[6];
|
||||
+} EFI_HOB_CPU;
|
||||
+
|
||||
+typedef struct {
|
||||
+ EFI_HOB_GENERIC_HEADER Header;
|
||||
+} EFI_HOB_MEMORY_POOL;
|
||||
+
|
||||
+typedef struct {
|
||||
+ EFI_HOB_GENERIC_HEADER Header;
|
||||
+
|
||||
+ EFI_PHYSICAL_ADDRESS BaseAddress;
|
||||
+ uint64_t Length;
|
||||
+} EFI_HOB_UEFI_CAPSULE;
|
||||
+
|
||||
+#define EFI_HOB_OWNER_ZERO \
|
||||
+ ((EFI_GUID){ 0x00000000, 0x0000, 0x0000, \
|
||||
+ { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } })
|
||||
+
|
||||
+#endif
|
||||
--
|
||||
2.50.1
|
||||
|
||||
@ -1,61 +0,0 @@
|
||||
From 34266f76ec5c96aceee89d1dd25c338af81f99dc Mon Sep 17 00:00:00 2001
|
||||
From: Gavin Shan <gshan@redhat.com>
|
||||
Date: Wed, 20 Nov 2024 17:13:44 +1000
|
||||
Subject: [PATCH 2/2] hostmem: Apply merge property after the memory region is
|
||||
initialized
|
||||
|
||||
RH-Author: Gavin Shan <gshan@redhat.com>
|
||||
RH-MergeRequest: 296: hostmem: Apply merge property after the memory region is initialized
|
||||
RH-Jira: RHEL-68289
|
||||
RH-Acked-by: David Hildenbrand <david@redhat.com>
|
||||
RH-Acked-by: Eric Auger <eric.auger@redhat.com>
|
||||
RH-Acked-by: Sebastian Ott <sebott@redhat.com>
|
||||
RH-Commit: [1/1] fc01302c3299a15fd523247e5a3df0957becba6a (gwshan/qemu-centos)
|
||||
|
||||
JIRA: https://issues.redhat.com/browse/RHEL-68289
|
||||
|
||||
The semantic change has been introduced by commit 5becdc0ab0 ("hostmem:
|
||||
simplify the code for merge and dump properties") even it clarifies that
|
||||
no senmatic change has been introduced. After the commit, the merge
|
||||
property can be applied even the corresponding memory region isn't
|
||||
initialized yet. This leads to crash dump by the following command
|
||||
lines.
|
||||
|
||||
# /home/gavin/sandbox/qemu.main/build/qemu-system-aarch64 \
|
||||
-accel kvm -machine virt -cpu host \
|
||||
-object memory-backend-ram,id=mem-memN0,size=4096M,merge=off
|
||||
:
|
||||
qemu-system-aarch64: ../system/memory.c:2419: memory_region_get_ram_ptr: \
|
||||
Assertion `mr->ram_block' failed.
|
||||
|
||||
Fix it by applying the merge property only when the memory region is
|
||||
initialized.
|
||||
|
||||
Message-ID: <20240915233117.478169-1-gshan@redhat.com>
|
||||
Fixes: 5becdc0ab083 ("hostmem: simplify the code for merge and dump properties")
|
||||
Reported-by: Zhenyu Zhang <zhenyzha@redhat.com>
|
||||
Tested-by: Zhenyu Zhang <zhenyzha@redhat.com>
|
||||
Signed-off-by: Gavin Shan <gshan@redhat.com>
|
||||
Signed-off-by: David Hildenbrand <david@redhat.com>
|
||||
(cherry picked from commit 78c8f780d3f0d6d17aa93d6f99ff72960080fdd7)
|
||||
Signed-off-by: Gavin Shan <gshan@redhat.com>
|
||||
---
|
||||
backends/hostmem.c | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
diff --git a/backends/hostmem.c b/backends/hostmem.c
|
||||
index 4e5576a4ad..181446626a 100644
|
||||
--- a/backends/hostmem.c
|
||||
+++ b/backends/hostmem.c
|
||||
@@ -178,7 +178,7 @@ static void host_memory_backend_set_merge(Object *obj, bool value, Error **errp)
|
||||
return;
|
||||
}
|
||||
|
||||
- if (!host_memory_backend_mr_inited(backend) &&
|
||||
+ if (host_memory_backend_mr_inited(backend) &&
|
||||
value != backend->merge) {
|
||||
void *ptr = memory_region_get_ram_ptr(&backend->mr);
|
||||
uint64_t sz = memory_region_size(&backend->mr);
|
||||
--
|
||||
2.45.1
|
||||
|
||||
@ -1,221 +0,0 @@
|
||||
From 7aa02e169dde52b4a7f6ec832a3fe55027fbd5e2 Mon Sep 17 00:00:00 2001
|
||||
From: Thomas Huth <thuth@redhat.com>
|
||||
Date: Fri, 15 Nov 2024 15:12:02 +0100
|
||||
Subject: [PATCH 05/10] hw: Add "loadparm" property to scsi disk devices for
|
||||
booting on s390x
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
RH-Author: Thomas Huth <thuth@redhat.com>
|
||||
RH-MergeRequest: 298: [c9s] Fixes for the new s390x "boot order" feature
|
||||
RH-Jira: RHEL-68440
|
||||
RH-Acked-by: Cédric Le Goater <clg@redhat.com>
|
||||
RH-Acked-by: Miroslav Rezanina <mrezanin@redhat.com>
|
||||
RH-Commit: [4/8] 7e3444e1fda776ca3b6de246b2dd696edf4980dd (thuth/qemu-kvm-cs9)
|
||||
|
||||
While adding the new flexible boot order feature on s390x recently,
|
||||
we missed to add the "loadparm" property to the scsi-hd and scsi-cd
|
||||
devices. This property is required on s390x to pass the information
|
||||
to the boot loader about which kernel should be started or whether
|
||||
the boot menu should be shown. But even more serious: The missing
|
||||
property is now causing trouble with the corresponding libvirt patches
|
||||
that assume that the "loadparm" property is either settable for all
|
||||
bootable devices (when the "boot order" feature is implemented in
|
||||
QEMU), or none (meaning the behaviour of older QEMUs that only allowed
|
||||
one "loadparm" at the machine level). To fix this broken situation,
|
||||
let's implement the "loadparm" property in for the SCSI devices, too.
|
||||
|
||||
Message-ID: <20241115141202.1877294-1-thuth@redhat.com>
|
||||
Acked-by: Eric Farman <farman@linux.ibm.com>
|
||||
Signed-off-by: Thomas Huth <thuth@redhat.com>
|
||||
(cherry picked from commit 429442e52d94f890fa194a151e8cd649b04e9e63)
|
||||
---
|
||||
hw/core/qdev-properties-system.c | 26 +++++++++++++++++
|
||||
hw/s390x/ipl.c | 19 ++++---------
|
||||
hw/scsi/scsi-disk.c | 43 +++++++++++++++++++++++++++++
|
||||
include/hw/qdev-properties-system.h | 3 ++
|
||||
4 files changed, 78 insertions(+), 13 deletions(-)
|
||||
|
||||
diff --git a/hw/core/qdev-properties-system.c b/hw/core/qdev-properties-system.c
|
||||
index f13350b4fb..5cd527cdba 100644
|
||||
--- a/hw/core/qdev-properties-system.c
|
||||
+++ b/hw/core/qdev-properties-system.c
|
||||
@@ -58,6 +58,32 @@ static bool check_prop_still_unset(Object *obj, const char *name,
|
||||
return false;
|
||||
}
|
||||
|
||||
+bool qdev_prop_sanitize_s390x_loadparm(uint8_t *loadparm, const char *str,
|
||||
+ Error **errp)
|
||||
+{
|
||||
+ int i, len;
|
||||
+
|
||||
+ len = strlen(str);
|
||||
+ if (len > 8) {
|
||||
+ error_setg(errp, "'loadparm' can only contain up to 8 characters");
|
||||
+ return false;
|
||||
+ }
|
||||
+
|
||||
+ for (i = 0; i < len; i++) {
|
||||
+ uint8_t c = qemu_toupper(str[i]); /* mimic HMC */
|
||||
+
|
||||
+ if (qemu_isalnum(c) || c == '.' || c == ' ') {
|
||||
+ loadparm[i] = c;
|
||||
+ } else {
|
||||
+ error_setg(errp,
|
||||
+ "invalid character in 'loadparm': '%c' (ASCII 0x%02x)",
|
||||
+ c, c);
|
||||
+ return false;
|
||||
+ }
|
||||
+ }
|
||||
+
|
||||
+ return true;
|
||||
+}
|
||||
|
||||
/* --- drive --- */
|
||||
|
||||
diff --git a/hw/s390x/ipl.c b/hw/s390x/ipl.c
|
||||
index 5fbd43c346..8101825dfe 100644
|
||||
--- a/hw/s390x/ipl.c
|
||||
+++ b/hw/s390x/ipl.c
|
||||
@@ -418,21 +418,9 @@ static uint64_t s390_ipl_map_iplb_chain(IplParameterBlock *iplb_chain)
|
||||
|
||||
void s390_ipl_fmt_loadparm(uint8_t *loadparm, char *str, Error **errp)
|
||||
{
|
||||
- int i;
|
||||
-
|
||||
/* Initialize the loadparm with spaces */
|
||||
memset(loadparm, ' ', LOADPARM_LEN);
|
||||
- for (i = 0; i < LOADPARM_LEN && str[i]; i++) {
|
||||
- uint8_t c = qemu_toupper(str[i]); /* mimic HMC */
|
||||
-
|
||||
- if (qemu_isalnum(c) || c == '.' || c == ' ') {
|
||||
- loadparm[i] = c;
|
||||
- } else {
|
||||
- error_setg(errp, "LOADPARM: invalid character '%c' (ASCII 0x%02x)",
|
||||
- c, c);
|
||||
- return;
|
||||
- }
|
||||
- }
|
||||
+ qdev_prop_sanitize_s390x_loadparm(loadparm, str, errp);
|
||||
}
|
||||
|
||||
void s390_ipl_convert_loadparm(char *ascii_lp, uint8_t *ebcdic_lp)
|
||||
@@ -452,6 +440,7 @@ static bool s390_build_iplb(DeviceState *dev_st, IplParameterBlock *iplb)
|
||||
SCSIDevice *sd;
|
||||
int devtype;
|
||||
uint8_t *lp;
|
||||
+ g_autofree void *scsi_lp = NULL;
|
||||
|
||||
/*
|
||||
* Currently allow IPL only from CCW devices.
|
||||
@@ -463,6 +452,10 @@ static bool s390_build_iplb(DeviceState *dev_st, IplParameterBlock *iplb)
|
||||
switch (devtype) {
|
||||
case CCW_DEVTYPE_SCSI:
|
||||
sd = SCSI_DEVICE(dev_st);
|
||||
+ scsi_lp = object_property_get_str(OBJECT(sd), "loadparm", NULL);
|
||||
+ if (scsi_lp && strlen(scsi_lp) > 0) {
|
||||
+ lp = scsi_lp;
|
||||
+ }
|
||||
iplb->len = cpu_to_be32(S390_IPLB_MIN_QEMU_SCSI_LEN);
|
||||
iplb->blk0_len =
|
||||
cpu_to_be32(S390_IPLB_MIN_QEMU_SCSI_LEN - S390_IPLB_HEADER_LEN);
|
||||
diff --git a/hw/scsi/scsi-disk.c b/hw/scsi/scsi-disk.c
|
||||
index 4d94b2b816..7566a5f531 100644
|
||||
--- a/hw/scsi/scsi-disk.c
|
||||
+++ b/hw/scsi/scsi-disk.c
|
||||
@@ -32,6 +32,7 @@
|
||||
#include "migration/vmstate.h"
|
||||
#include "hw/scsi/emulation.h"
|
||||
#include "scsi/constants.h"
|
||||
+#include "sysemu/arch_init.h"
|
||||
#include "sysemu/block-backend.h"
|
||||
#include "sysemu/blockdev.h"
|
||||
#include "hw/block/block.h"
|
||||
@@ -111,6 +112,7 @@ struct SCSIDiskState {
|
||||
char *vendor;
|
||||
char *product;
|
||||
char *device_id;
|
||||
+ char *loadparm; /* only for s390x */
|
||||
bool tray_open;
|
||||
bool tray_locked;
|
||||
/*
|
||||
@@ -3135,6 +3137,43 @@ BlockAIOCB *scsi_dma_writev(int64_t offset, QEMUIOVector *iov,
|
||||
return blk_aio_pwritev(s->qdev.conf.blk, offset, iov, 0, cb, cb_opaque);
|
||||
}
|
||||
|
||||
+static char *scsi_property_get_loadparm(Object *obj, Error **errp)
|
||||
+{
|
||||
+ return g_strdup(SCSI_DISK_BASE(obj)->loadparm);
|
||||
+}
|
||||
+
|
||||
+static void scsi_property_set_loadparm(Object *obj, const char *value,
|
||||
+ Error **errp)
|
||||
+{
|
||||
+ void *lp_str;
|
||||
+
|
||||
+ if (object_property_get_int(obj, "bootindex", NULL) < 0) {
|
||||
+ error_setg(errp, "'loadparm' is only valid for boot devices");
|
||||
+ return;
|
||||
+ }
|
||||
+
|
||||
+ lp_str = g_malloc0(strlen(value));
|
||||
+ if (!qdev_prop_sanitize_s390x_loadparm(lp_str, value, errp)) {
|
||||
+ g_free(lp_str);
|
||||
+ return;
|
||||
+ }
|
||||
+ SCSI_DISK_BASE(obj)->loadparm = lp_str;
|
||||
+}
|
||||
+
|
||||
+static void scsi_property_add_specifics(DeviceClass *dc)
|
||||
+{
|
||||
+ ObjectClass *oc = OBJECT_CLASS(dc);
|
||||
+
|
||||
+ /* The loadparm property is only supported on s390x */
|
||||
+ if (arch_type & QEMU_ARCH_S390X) {
|
||||
+ object_class_property_add_str(oc, "loadparm",
|
||||
+ scsi_property_get_loadparm,
|
||||
+ scsi_property_set_loadparm);
|
||||
+ object_class_property_set_description(oc, "loadparm",
|
||||
+ "load parameter (s390x only)");
|
||||
+ }
|
||||
+}
|
||||
+
|
||||
static void scsi_disk_base_class_initfn(ObjectClass *klass, void *data)
|
||||
{
|
||||
DeviceClass *dc = DEVICE_CLASS(klass);
|
||||
@@ -3218,6 +3257,8 @@ static void scsi_hd_class_initfn(ObjectClass *klass, void *data)
|
||||
dc->desc = "virtual SCSI disk";
|
||||
device_class_set_props(dc, scsi_hd_properties);
|
||||
dc->vmsd = &vmstate_scsi_disk_state;
|
||||
+
|
||||
+ scsi_property_add_specifics(dc);
|
||||
}
|
||||
|
||||
static const TypeInfo scsi_hd_info = {
|
||||
@@ -3258,6 +3299,8 @@ static void scsi_cd_class_initfn(ObjectClass *klass, void *data)
|
||||
dc->desc = "virtual SCSI CD-ROM";
|
||||
device_class_set_props(dc, scsi_cd_properties);
|
||||
dc->vmsd = &vmstate_scsi_disk_state;
|
||||
+
|
||||
+ scsi_property_add_specifics(dc);
|
||||
}
|
||||
|
||||
static const TypeInfo scsi_cd_info = {
|
||||
diff --git a/include/hw/qdev-properties-system.h b/include/hw/qdev-properties-system.h
|
||||
index 438f65389f..88e4257ad0 100644
|
||||
--- a/include/hw/qdev-properties-system.h
|
||||
+++ b/include/hw/qdev-properties-system.h
|
||||
@@ -3,6 +3,9 @@
|
||||
|
||||
#include "hw/qdev-properties.h"
|
||||
|
||||
+bool qdev_prop_sanitize_s390x_loadparm(uint8_t *loadparm, const char *str,
|
||||
+ Error **errp);
|
||||
+
|
||||
extern const PropertyInfo qdev_prop_chr;
|
||||
extern const PropertyInfo qdev_prop_macaddr;
|
||||
extern const PropertyInfo qdev_prop_reserved_region;
|
||||
--
|
||||
2.39.3
|
||||
|
||||
@ -1,123 +0,0 @@
|
||||
From a3dfbe30e930c8d794057e45fffd91a9b0e6afd0 Mon Sep 17 00:00:00 2001
|
||||
From: Eric Auger <eric.auger@redhat.com>
|
||||
Date: Tue, 18 Feb 2025 19:25:33 +0100
|
||||
Subject: [PATCH 3/9] hw/arm/smmuv3: Move reset to exit phase
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
RH-Author: Eric Auger <eric.auger@redhat.com>
|
||||
RH-MergeRequest: 341: Fix vIOMMU reset order
|
||||
RH-Jira: RHEL-7188
|
||||
RH-Acked-by: Peter Xu <peterx@redhat.com>
|
||||
RH-Acked-by: Donald Dutile <None>
|
||||
RH-Acked-by: Cédric Le Goater <clg@redhat.com>
|
||||
RH-Commit: [3/5] e291cb45c32e0fab49b200c275553bbe76b97264 (eauger1/centos-qemu-kvm)
|
||||
|
||||
Currently the iommu may be reset before the devices
|
||||
it protects. For example this happens with virtio-scsi-pci.
|
||||
when system_reset is issued from qmp monitor: spurious
|
||||
"virtio: zero sized buffers are not allowed" warnings can
|
||||
be observed. This happens because outstanding DMA requests
|
||||
are still happening while the SMMU gets reset.
|
||||
|
||||
This can also happen with VFIO devices. In that case
|
||||
spurious DMA translation faults can be observed on host.
|
||||
|
||||
Make sure the SMMU is reset in the 'exit' phase after
|
||||
all DMA capable devices have been reset during the 'enter'
|
||||
or 'hold' phase.
|
||||
|
||||
Signed-off-by: Eric Auger <eric.auger@redhat.com>
|
||||
Reviewed-by: Zhenzhong Duan <zhenzhong.duan@intel.com>
|
||||
|
||||
Message-Id: <20250218182737.76722-4-eric.auger@redhat.com>
|
||||
Reviewed-by: Peter Xu <peterx@redhat.com>
|
||||
Reviewed-by: Michael S. Tsirkin <mst@redhat.com>
|
||||
Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
|
||||
(cherry picked from commit e39e3f8b8dea856f141e9945167d2b18021ef445)
|
||||
Signed-off-by: Eric Auger <eric.auger@redhat.com>
|
||||
---
|
||||
hw/arm/smmu-common.c | 9 +++++++--
|
||||
hw/arm/smmuv3.c | 14 ++++++++++----
|
||||
hw/arm/trace-events | 1 +
|
||||
3 files changed, 18 insertions(+), 6 deletions(-)
|
||||
|
||||
diff --git a/hw/arm/smmu-common.c b/hw/arm/smmu-common.c
|
||||
index 3f82728758..f4210fcbc1 100644
|
||||
--- a/hw/arm/smmu-common.c
|
||||
+++ b/hw/arm/smmu-common.c
|
||||
@@ -924,7 +924,12 @@ static void smmu_base_realize(DeviceState *dev, Error **errp)
|
||||
}
|
||||
}
|
||||
|
||||
-static void smmu_base_reset_hold(Object *obj, ResetType type)
|
||||
+/*
|
||||
+ * Make sure the IOMMU is reset in 'exit' phase after
|
||||
+ * all outstanding DMA requests have been quiesced during
|
||||
+ * the 'enter' or 'hold' reset phases
|
||||
+ */
|
||||
+static void smmu_base_reset_exit(Object *obj, ResetType type)
|
||||
{
|
||||
SMMUState *s = ARM_SMMU(obj);
|
||||
|
||||
@@ -950,7 +955,7 @@ static void smmu_base_class_init(ObjectClass *klass, void *data)
|
||||
device_class_set_props(dc, smmu_dev_properties);
|
||||
device_class_set_parent_realize(dc, smmu_base_realize,
|
||||
&sbc->parent_realize);
|
||||
- rc->phases.hold = smmu_base_reset_hold;
|
||||
+ rc->phases.exit = smmu_base_reset_exit;
|
||||
}
|
||||
|
||||
static const TypeInfo smmu_base_info = {
|
||||
diff --git a/hw/arm/smmuv3.c b/hw/arm/smmuv3.c
|
||||
index 3971976389..2e90570915 100644
|
||||
--- a/hw/arm/smmuv3.c
|
||||
+++ b/hw/arm/smmuv3.c
|
||||
@@ -1870,13 +1870,19 @@ static void smmu_init_irq(SMMUv3State *s, SysBusDevice *dev)
|
||||
}
|
||||
}
|
||||
|
||||
-static void smmu_reset_hold(Object *obj, ResetType type)
|
||||
+/*
|
||||
+ * Make sure the IOMMU is reset in 'exit' phase after
|
||||
+ * all outstanding DMA requests have been quiesced during
|
||||
+ * the 'enter' or 'hold' reset phases
|
||||
+ */
|
||||
+static void smmu_reset_exit(Object *obj, ResetType type)
|
||||
{
|
||||
SMMUv3State *s = ARM_SMMUV3(obj);
|
||||
SMMUv3Class *c = ARM_SMMUV3_GET_CLASS(s);
|
||||
|
||||
- if (c->parent_phases.hold) {
|
||||
- c->parent_phases.hold(obj, type);
|
||||
+ trace_smmu_reset_exit();
|
||||
+ if (c->parent_phases.exit) {
|
||||
+ c->parent_phases.exit(obj, type);
|
||||
}
|
||||
|
||||
smmuv3_init_regs(s);
|
||||
@@ -1999,7 +2005,7 @@ static void smmuv3_class_init(ObjectClass *klass, void *data)
|
||||
SMMUv3Class *c = ARM_SMMUV3_CLASS(klass);
|
||||
|
||||
dc->vmsd = &vmstate_smmuv3;
|
||||
- resettable_class_set_parent_phases(rc, NULL, smmu_reset_hold, NULL,
|
||||
+ resettable_class_set_parent_phases(rc, NULL, NULL, smmu_reset_exit,
|
||||
&c->parent_phases);
|
||||
device_class_set_parent_realize(dc, smmu_realize,
|
||||
&c->parent_realize);
|
||||
diff --git a/hw/arm/trace-events b/hw/arm/trace-events
|
||||
index be6c8f720b..79ef347e3e 100644
|
||||
--- a/hw/arm/trace-events
|
||||
+++ b/hw/arm/trace-events
|
||||
@@ -56,6 +56,7 @@ smmuv3_config_cache_inv(uint32_t sid) "Config cache INV for sid=0x%x"
|
||||
smmuv3_notify_flag_add(const char *iommu) "ADD SMMUNotifier node for iommu mr=%s"
|
||||
smmuv3_notify_flag_del(const char *iommu) "DEL SMMUNotifier node for iommu mr=%s"
|
||||
smmuv3_inv_notifiers_iova(const char *name, int asid, int vmid, uint64_t iova, uint8_t tg, uint64_t num_pages, int stage) "iommu mr=%s asid=%d vmid=%d iova=0x%"PRIx64" tg=%d num_pages=0x%"PRIx64" stage=%d"
|
||||
+smmu_reset_exit(void) ""
|
||||
|
||||
# strongarm.c
|
||||
strongarm_uart_update_parameters(const char *label, int speed, char parity, int data_bits, int stop_bits) "%s speed=%d parity=%c data=%d stop=%d"
|
||||
--
|
||||
2.48.1
|
||||
|
||||
@ -1,57 +0,0 @@
|
||||
From 2018f62f2242d8d4a970d83ebef9b3c2bccf6fda Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Daniel=20P=2E=20Berrang=C3=A9?= <berrange@redhat.com>
|
||||
Date: Tue, 10 Jun 2025 13:36:45 +0100
|
||||
Subject: [PATCH 33/57] hw/audio/ac97: skip automatic zero-init of large arrays
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
RH-Author: Stefan Hajnoczi <stefanha@redhat.com>
|
||||
RH-MergeRequest: 382: Solve -ftrivial-auto-var-init performance regression with QEMU_UNINITIALIZED
|
||||
RH-Jira: RHEL-99888
|
||||
RH-Acked-by: Miroslav Rezanina <mrezanin@redhat.com>
|
||||
RH-Commit: [7/30] 4a6b59a9b9122d9f89e99b3e44df19e6d92ed941 (stefanha/centos-stream-qemu-kvm)
|
||||
|
||||
The 'read_audio' & 'write_audio' methods have a 4k byte array used
|
||||
for copying data between the audio backend and device. Skip the
|
||||
automatic zero-init of these arrays to eliminate the performance
|
||||
overhead in the I/O hot path.
|
||||
|
||||
The 'tmpbuf' array will be fully initialized when reading data from
|
||||
the audio backend and/or device memory.
|
||||
|
||||
Signed-off-by: Daniel P. Berrangé <berrange@redhat.com>
|
||||
Reviewed-by: Stefan Hajnoczi <stefanha@redhat.com>
|
||||
Message-id: 20250610123709.835102-8-berrange@redhat.com
|
||||
Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
|
||||
(cherry picked from commit 2553d2d26a9d0f46386bf8c37d184567e5cede6c)
|
||||
Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
|
||||
---
|
||||
hw/audio/ac97.c | 4 ++--
|
||||
1 file changed, 2 insertions(+), 2 deletions(-)
|
||||
|
||||
diff --git a/hw/audio/ac97.c b/hw/audio/ac97.c
|
||||
index 3f0053f94d..681b5752a1 100644
|
||||
--- a/hw/audio/ac97.c
|
||||
+++ b/hw/audio/ac97.c
|
||||
@@ -886,7 +886,7 @@ static void nabm_writel(void *opaque, uint32_t addr, uint32_t val)
|
||||
static int write_audio(AC97LinkState *s, AC97BusMasterRegs *r,
|
||||
int max, int *stop)
|
||||
{
|
||||
- uint8_t tmpbuf[4096];
|
||||
+ QEMU_UNINITIALIZED uint8_t tmpbuf[4096];
|
||||
uint32_t addr = r->bd.addr;
|
||||
uint32_t temp = r->picb << 1;
|
||||
uint32_t written = 0;
|
||||
@@ -959,7 +959,7 @@ static void write_bup(AC97LinkState *s, int elapsed)
|
||||
static int read_audio(AC97LinkState *s, AC97BusMasterRegs *r,
|
||||
int max, int *stop)
|
||||
{
|
||||
- uint8_t tmpbuf[4096];
|
||||
+ QEMU_UNINITIALIZED uint8_t tmpbuf[4096];
|
||||
uint32_t addr = r->bd.addr;
|
||||
uint32_t temp = r->picb << 1;
|
||||
uint32_t nread = 0;
|
||||
--
|
||||
2.39.3
|
||||
|
||||
@ -1,59 +0,0 @@
|
||||
From bd32bb22fb324a37b31ed9ac3387524f6f4ea5be Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Daniel=20P=2E=20Berrang=C3=A9?= <berrange@redhat.com>
|
||||
Date: Tue, 10 Jun 2025 13:36:46 +0100
|
||||
Subject: [PATCH 34/57] hw/audio/cs4231a: skip automatic zero-init of large
|
||||
arrays
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
RH-Author: Stefan Hajnoczi <stefanha@redhat.com>
|
||||
RH-MergeRequest: 382: Solve -ftrivial-auto-var-init performance regression with QEMU_UNINITIALIZED
|
||||
RH-Jira: RHEL-99888
|
||||
RH-Acked-by: Miroslav Rezanina <mrezanin@redhat.com>
|
||||
RH-Commit: [8/30] 6c454bcc2927e49896c62718287fb9e4b37b3bb9 (stefanha/centos-stream-qemu-kvm)
|
||||
|
||||
The 'cs_write_audio' method has a pair of byte arrays, one 4k in size
|
||||
and one 8k, which are used in converting audio samples. Skip the
|
||||
automatic zero-init of these arrays to eliminate the performance
|
||||
overhead in the I/O hot path.
|
||||
|
||||
The 'tmpbuf' array will be fully initialized when reading a block of
|
||||
data from the guest. The 'linbuf' array will be fully initialized
|
||||
when converting the audio samples.
|
||||
|
||||
Signed-off-by: Daniel P. Berrangé <berrange@redhat.com>
|
||||
Reviewed-by: Stefan Hajnoczi <stefanha@redhat.com>
|
||||
Message-id: 20250610123709.835102-9-berrange@redhat.com
|
||||
Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
|
||||
(cherry picked from commit ca2cc0385d97cea66cd54ee42553f385c403d4a6)
|
||||
Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
|
||||
---
|
||||
hw/audio/cs4231a.c | 4 ++--
|
||||
1 file changed, 2 insertions(+), 2 deletions(-)
|
||||
|
||||
diff --git a/hw/audio/cs4231a.c b/hw/audio/cs4231a.c
|
||||
index 9ef57f042d..5c312642cc 100644
|
||||
--- a/hw/audio/cs4231a.c
|
||||
+++ b/hw/audio/cs4231a.c
|
||||
@@ -528,7 +528,7 @@ static int cs_write_audio (CSState *s, int nchan, int dma_pos,
|
||||
int dma_len, int len)
|
||||
{
|
||||
int temp, net;
|
||||
- uint8_t tmpbuf[4096];
|
||||
+ QEMU_UNINITIALIZED uint8_t tmpbuf[4096];
|
||||
IsaDmaClass *k = ISADMA_GET_CLASS(s->isa_dma);
|
||||
|
||||
temp = len;
|
||||
@@ -547,7 +547,7 @@ static int cs_write_audio (CSState *s, int nchan, int dma_pos,
|
||||
copied = k->read_memory(s->isa_dma, nchan, tmpbuf, dma_pos, to_copy);
|
||||
if (s->tab) {
|
||||
int i;
|
||||
- int16_t linbuf[4096];
|
||||
+ QEMU_UNINITIALIZED int16_t linbuf[4096];
|
||||
|
||||
for (i = 0; i < copied; ++i)
|
||||
linbuf[i] = s->tab[tmpbuf[i]];
|
||||
--
|
||||
2.39.3
|
||||
|
||||
@ -1,49 +0,0 @@
|
||||
From cb12ddc6ed836091aa7724e2f77ab79cd9089cad Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Daniel=20P=2E=20Berrang=C3=A9?= <berrange@redhat.com>
|
||||
Date: Tue, 10 Jun 2025 13:36:47 +0100
|
||||
Subject: [PATCH 35/57] hw/audio/es1370: skip automatic zero-init of large
|
||||
array
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
RH-Author: Stefan Hajnoczi <stefanha@redhat.com>
|
||||
RH-MergeRequest: 382: Solve -ftrivial-auto-var-init performance regression with QEMU_UNINITIALIZED
|
||||
RH-Jira: RHEL-99888
|
||||
RH-Acked-by: Miroslav Rezanina <mrezanin@redhat.com>
|
||||
RH-Commit: [9/30] b992e4247d8d31dc09f9dc7671e7a532558174ec (stefanha/centos-stream-qemu-kvm)
|
||||
|
||||
The 'es1370_transfer_audio' method has a 4k byte array used for
|
||||
copying data between the audio backend and device. Skip the automatic
|
||||
zero-init of this array to eliminate the performance overhead in
|
||||
the I/O hot path.
|
||||
|
||||
The 'tmpbuf' array will be fully initialized when reading data from
|
||||
the audio backend and/or device memory.
|
||||
|
||||
Signed-off-by: Daniel P. Berrangé <berrange@redhat.com>
|
||||
Reviewed-by: Stefan Hajnoczi <stefanha@redhat.com>
|
||||
Message-id: 20250610123709.835102-10-berrange@redhat.com
|
||||
Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
|
||||
(cherry picked from commit 8236e206084b832d1d7ec947a4798b818f4cdf1f)
|
||||
Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
|
||||
---
|
||||
hw/audio/es1370.c | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
diff --git a/hw/audio/es1370.c b/hw/audio/es1370.c
|
||||
index 4ab61d3b9d..6aea934f54 100644
|
||||
--- a/hw/audio/es1370.c
|
||||
+++ b/hw/audio/es1370.c
|
||||
@@ -604,7 +604,7 @@ static uint64_t es1370_read(void *opaque, hwaddr addr, unsigned size)
|
||||
static void es1370_transfer_audio (ES1370State *s, struct chan *d, int loop_sel,
|
||||
int max, bool *irq)
|
||||
{
|
||||
- uint8_t tmpbuf[4096];
|
||||
+ QEMU_UNINITIALIZED uint8_t tmpbuf[4096];
|
||||
size_t to_transfer;
|
||||
uint32_t addr = d->frame_addr;
|
||||
int sc = d->scount & 0xffff;
|
||||
--
|
||||
2.39.3
|
||||
|
||||
@ -1,48 +0,0 @@
|
||||
From 9ad7091d82fd0577488f27ab54bb7851fe957020 Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Daniel=20P=2E=20Berrang=C3=A9?= <berrange@redhat.com>
|
||||
Date: Tue, 10 Jun 2025 13:36:48 +0100
|
||||
Subject: [PATCH 36/57] hw/audio/gus: skip automatic zero-init of large array
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
RH-Author: Stefan Hajnoczi <stefanha@redhat.com>
|
||||
RH-MergeRequest: 382: Solve -ftrivial-auto-var-init performance regression with QEMU_UNINITIALIZED
|
||||
RH-Jira: RHEL-99888
|
||||
RH-Acked-by: Miroslav Rezanina <mrezanin@redhat.com>
|
||||
RH-Commit: [10/30] 366953d0417ac31e3060fdc327fe8dade3375bf0 (stefanha/centos-stream-qemu-kvm)
|
||||
|
||||
The 'GUS_read_DMA' method has a 4k byte array used for copying
|
||||
data between the audio backend and device. Skip the automatic
|
||||
zero-init of this array to eliminate the performance overhead in
|
||||
the I/O hot path.
|
||||
|
||||
The 'tmpbuf' array will be fully initialized when reading data
|
||||
from device memory.
|
||||
|
||||
Signed-off-by: Daniel P. Berrangé <berrange@redhat.com>
|
||||
Reviewed-by: Stefan Hajnoczi <stefanha@redhat.com>
|
||||
Message-id: 20250610123709.835102-11-berrange@redhat.com
|
||||
Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
|
||||
(cherry picked from commit 2e438da4929018c62609381e1156aac0b2fe3de3)
|
||||
Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
|
||||
---
|
||||
hw/audio/gus.c | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
diff --git a/hw/audio/gus.c b/hw/audio/gus.c
|
||||
index 4beb3fd74e..e8b0b85d44 100644
|
||||
--- a/hw/audio/gus.c
|
||||
+++ b/hw/audio/gus.c
|
||||
@@ -183,7 +183,7 @@ static int GUS_read_DMA (void *opaque, int nchan, int dma_pos, int dma_len)
|
||||
{
|
||||
GUSState *s = opaque;
|
||||
IsaDmaClass *k = ISADMA_GET_CLASS(s->isa_dma);
|
||||
- char tmpbuf[4096];
|
||||
+ QEMU_UNINITIALIZED char tmpbuf[4096];
|
||||
int pos = dma_pos, mode, left = dma_len - dma_pos;
|
||||
|
||||
ldebug ("read DMA %#x %d\n", dma_pos, dma_len);
|
||||
--
|
||||
2.39.3
|
||||
|
||||
@ -1,50 +0,0 @@
|
||||
From 5cf61823cbe80b1ace2f5bdb9cc1971956425b98 Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Daniel=20P=2E=20Berrang=C3=A9?= <berrange@redhat.com>
|
||||
Date: Tue, 10 Jun 2025 13:36:49 +0100
|
||||
Subject: [PATCH 37/57] hw/audio/marvell_88w8618: skip automatic zero-init of
|
||||
large array
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
RH-Author: Stefan Hajnoczi <stefanha@redhat.com>
|
||||
RH-MergeRequest: 382: Solve -ftrivial-auto-var-init performance regression with QEMU_UNINITIALIZED
|
||||
RH-Jira: RHEL-99888
|
||||
RH-Acked-by: Miroslav Rezanina <mrezanin@redhat.com>
|
||||
RH-Commit: [11/30] e09cdb76430552081168873dadfef1b5c8f74327 (stefanha/centos-stream-qemu-kvm)
|
||||
|
||||
The 'mv88w8618_audio_callback' method has a 4k byte array used for
|
||||
copying data between the audio backend and device. Skip the automatic
|
||||
zero-init of this array to eliminate the performance overhead in
|
||||
the I/O hot path.
|
||||
|
||||
The 'buf' array will be fully initialized when reading data from
|
||||
device memory.
|
||||
|
||||
Signed-off-by: Daniel P. Berrangé <berrange@redhat.com>
|
||||
Reviewed-by: Stefan Hajnoczi <stefanha@redhat.com>
|
||||
Message-id: 20250610123709.835102-12-berrange@redhat.com
|
||||
[Fixed hw/audio/gus in commit message --Stefan]
|
||||
Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
|
||||
(cherry picked from commit 5b6cd5c5df4229972d8a0fd9dd9a089a1644d6ba)
|
||||
Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
|
||||
---
|
||||
hw/audio/marvell_88w8618.c | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
diff --git a/hw/audio/marvell_88w8618.c b/hw/audio/marvell_88w8618.c
|
||||
index cc285444bc..b7b4b27272 100644
|
||||
--- a/hw/audio/marvell_88w8618.c
|
||||
+++ b/hw/audio/marvell_88w8618.c
|
||||
@@ -66,7 +66,7 @@ static void mv88w8618_audio_callback(void *opaque, int free_out, int free_in)
|
||||
{
|
||||
mv88w8618_audio_state *s = opaque;
|
||||
int16_t *codec_buffer;
|
||||
- int8_t buf[4096];
|
||||
+ QEMU_UNINITIALIZED int8_t buf[4096];
|
||||
int8_t *mem_buffer;
|
||||
int pos, block_size;
|
||||
|
||||
--
|
||||
2.39.3
|
||||
|
||||
@ -1,48 +0,0 @@
|
||||
From 0b4d59d75edd49ef99f0a82fbcbe360c5b48e4f8 Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Daniel=20P=2E=20Berrang=C3=A9?= <berrange@redhat.com>
|
||||
Date: Tue, 10 Jun 2025 13:36:50 +0100
|
||||
Subject: [PATCH 38/57] hw/audio/sb16: skip automatic zero-init of large array
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
RH-Author: Stefan Hajnoczi <stefanha@redhat.com>
|
||||
RH-MergeRequest: 382: Solve -ftrivial-auto-var-init performance regression with QEMU_UNINITIALIZED
|
||||
RH-Jira: RHEL-99888
|
||||
RH-Acked-by: Miroslav Rezanina <mrezanin@redhat.com>
|
||||
RH-Commit: [12/30] 6475d67546bf04745636b317e965bcd89b6fb2d2 (stefanha/centos-stream-qemu-kvm)
|
||||
|
||||
The 'write_audio' method has a 4k byte array used for copying data
|
||||
between the audio backend and device. Skip the automatic zero-init
|
||||
of this array to eliminate the performance overhead in the I/O hot
|
||||
path.
|
||||
|
||||
The 'tmpbuf' array will be fully initialized when reading data from
|
||||
device memory.
|
||||
|
||||
Signed-off-by: Daniel P. Berrangé <berrange@redhat.com>
|
||||
Reviewed-by: Stefan Hajnoczi <stefanha@redhat.com>
|
||||
Message-id: 20250610123709.835102-13-berrange@redhat.com
|
||||
Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
|
||||
(cherry picked from commit 30c82f6657c1ee9fbb5473924b4d3273f214bd6f)
|
||||
Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
|
||||
---
|
||||
hw/audio/sb16.c | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
diff --git a/hw/audio/sb16.c b/hw/audio/sb16.c
|
||||
index fd76e78d18..04c818ed3d 100644
|
||||
--- a/hw/audio/sb16.c
|
||||
+++ b/hw/audio/sb16.c
|
||||
@@ -1181,7 +1181,7 @@ static int write_audio (SB16State *s, int nchan, int dma_pos,
|
||||
IsaDma *isa_dma = nchan == s->dma ? s->isa_dma : s->isa_hdma;
|
||||
IsaDmaClass *k = ISADMA_GET_CLASS(isa_dma);
|
||||
int temp, net;
|
||||
- uint8_t tmpbuf[4096];
|
||||
+ QEMU_UNINITIALIZED uint8_t tmpbuf[4096];
|
||||
|
||||
temp = len;
|
||||
net = 0;
|
||||
--
|
||||
2.39.3
|
||||
|
||||
@ -1,49 +0,0 @@
|
||||
From 35332282ef8bd06f59206266006eff222ffe6bec Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Daniel=20P=2E=20Berrang=C3=A9?= <berrange@redhat.com>
|
||||
Date: Tue, 10 Jun 2025 13:36:51 +0100
|
||||
Subject: [PATCH 39/57] hw/audio/via-ac97: skip automatic zero-init of large
|
||||
array
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
RH-Author: Stefan Hajnoczi <stefanha@redhat.com>
|
||||
RH-MergeRequest: 382: Solve -ftrivial-auto-var-init performance regression with QEMU_UNINITIALIZED
|
||||
RH-Jira: RHEL-99888
|
||||
RH-Acked-by: Miroslav Rezanina <mrezanin@redhat.com>
|
||||
RH-Commit: [13/30] 6391a04b29fcbb8bcdbce2c6b786758fc34f0d71 (stefanha/centos-stream-qemu-kvm)
|
||||
|
||||
The 'out_cb' method has a 4k byte array used for copying data
|
||||
between the audio backend and device. Skip the automatic zero-init
|
||||
of this array to eliminate the performance overhead in the I/O hot
|
||||
path.
|
||||
|
||||
The 'tmpbuf' array will be fully initialized when reading data from
|
||||
device memory.
|
||||
|
||||
Signed-off-by: Daniel P. Berrangé <berrange@redhat.com>
|
||||
Reviewed-by: Stefan Hajnoczi <stefanha@redhat.com>
|
||||
Message-id: 20250610123709.835102-14-berrange@redhat.com
|
||||
Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
|
||||
(cherry picked from commit bb71d9fe1419f44529c91d1b09464718d157e647)
|
||||
Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
|
||||
---
|
||||
hw/audio/via-ac97.c | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
diff --git a/hw/audio/via-ac97.c b/hw/audio/via-ac97.c
|
||||
index 4c127a1def..e8fcf44e5d 100644
|
||||
--- a/hw/audio/via-ac97.c
|
||||
+++ b/hw/audio/via-ac97.c
|
||||
@@ -175,7 +175,7 @@ static void out_cb(void *opaque, int avail)
|
||||
ViaAC97SGDChannel *c = &s->aur;
|
||||
int temp, to_copy, copied;
|
||||
bool stop = false;
|
||||
- uint8_t tmpbuf[4096];
|
||||
+ QEMU_UNINITIALIZED uint8_t tmpbuf[4096];
|
||||
|
||||
if (c->stat & STAT_PAUSED) {
|
||||
return;
|
||||
--
|
||||
2.39.3
|
||||
|
||||
@ -1,69 +0,0 @@
|
||||
From 6aa786b145f484ed6e2e8a1a5089ad6e150306a8 Mon Sep 17 00:00:00 2001
|
||||
From: Sana Sharm <sansshar@redhat.com>
|
||||
Date: Fri, 3 Jan 2025 13:27:20 -0500
|
||||
Subject: [PATCH 19/19] hw/char/pl011: Use correct masks for IBRD and FBRD
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
RH-Author: sansshar <None>
|
||||
RH-MergeRequest: 310: hw/char/pl011: Use correct masks for IBRD and FBRD
|
||||
RH-Jira: RHEL-67107
|
||||
RH-Acked-by: Miroslav Rezanina <mrezanin@redhat.com>
|
||||
RH-Commit: [1/1] 4c7174da1dff8de3d7e2d88d84973eb69d6fc28a (sansshar/qemu-kvm-centos)
|
||||
|
||||
Brew build id: 5098441
|
||||
|
||||
In commit b88cfee90268cad we defined masks for the IBRD and FBRD
|
||||
integer and fractional baud rate divider registers, to prevent the
|
||||
guest from writing invalid values which could cause division-by-zero.
|
||||
Unfortunately we got the mask values the wrong way around: the FBRD
|
||||
register is six bits and the IBRD register is 16 bits, not
|
||||
vice-versa.
|
||||
|
||||
You would only run into this bug if you programmed the UART to a baud
|
||||
rate of less than 9600, because for 9600 baud and above the IBRD
|
||||
value will fit into 6 bits, as per the table in
|
||||
https://developer.arm.com/documentation/ddi0183/g/programmers-model/register-descriptions/fractional-baud-rate-register--uartfbrd
|
||||
|
||||
The only visible effects would be that the value read back from
|
||||
the register by the guest would be truncated, and we would
|
||||
print an incorrect baud rate in the debug logs.
|
||||
|
||||
Cc: qemu-stable@nongnu.org
|
||||
Fixes: b88cfee90268 ("hw/char/pl011: Avoid division-by-zero in pl011_get_baudrate()")
|
||||
Resolves: https://gitlab.com/qemu-project/qemu/-/issues/2610
|
||||
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
|
||||
Reviewed-by: Alex Bennée <alex.bennee@linaro.org>
|
||||
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
|
||||
Reviewed-by: Gavin Shan <gshan@redhat.com>
|
||||
Message-id: 20241007144732.2491331-1-peter.maydell@linaro.org
|
||||
(cherry picked from commit cd247eae16ab1b9ce97fd34c000c1b883feeda45)
|
||||
Signed-off-by: Sana Sharma <sansshar@redhat.com>
|
||||
|
||||
Changes to be committed:
|
||||
modified: hw/char/pl011.c
|
||||
---
|
||||
hw/char/pl011.c | 4 ++--
|
||||
1 file changed, 2 insertions(+), 2 deletions(-)
|
||||
|
||||
diff --git a/hw/char/pl011.c b/hw/char/pl011.c
|
||||
index f8078aa216..949e9d0e0d 100644
|
||||
--- a/hw/char/pl011.c
|
||||
+++ b/hw/char/pl011.c
|
||||
@@ -88,10 +88,10 @@ DeviceState *pl011_create(hwaddr addr, qemu_irq irq, Chardev *chr)
|
||||
#define CR_LBE (1 << 7)
|
||||
|
||||
/* Integer Baud Rate Divider, UARTIBRD */
|
||||
-#define IBRD_MASK 0x3f
|
||||
+#define IBRD_MASK 0xffff
|
||||
|
||||
/* Fractional Baud Rate Divider, UARTFBRD */
|
||||
-#define FBRD_MASK 0xffff
|
||||
+#define FBRD_MASK 0x3f
|
||||
|
||||
static const unsigned char pl011_id_arm[8] =
|
||||
{ 0x11, 0x10, 0x14, 0x00, 0x0d, 0xf0, 0x05, 0xb1 };
|
||||
--
|
||||
2.39.3
|
||||
|
||||
@ -1,49 +0,0 @@
|
||||
From b0c16a93460c2dfe834a9f439d25dc833dfb7427 Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Daniel=20P=2E=20Berrang=C3=A9?= <berrange@redhat.com>
|
||||
Date: Tue, 10 Jun 2025 13:36:52 +0100
|
||||
Subject: [PATCH 40/57] hw/char/sclpconsole-lm: skip automatic zero-init of
|
||||
large array
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
RH-Author: Stefan Hajnoczi <stefanha@redhat.com>
|
||||
RH-MergeRequest: 382: Solve -ftrivial-auto-var-init performance regression with QEMU_UNINITIALIZED
|
||||
RH-Jira: RHEL-99888
|
||||
RH-Acked-by: Miroslav Rezanina <mrezanin@redhat.com>
|
||||
RH-Commit: [14/30] 1491e0147a799ec523fa67fd49649722a07299e7 (stefanha/centos-stream-qemu-kvm)
|
||||
|
||||
The 'process_mdb' method has a 4k byte array used for copying data
|
||||
between the guest and the chardev backend. Skip the automatic zero-init
|
||||
of this array to eliminate the performance overhead in the I/O hot
|
||||
path.
|
||||
|
||||
The 'buffer' array will be selectively initialized when data is converted
|
||||
between EBCDIC and ASCII.
|
||||
|
||||
Signed-off-by: Daniel P. Berrangé <berrange@redhat.com>
|
||||
Reviewed-by: Stefan Hajnoczi <stefanha@redhat.com>
|
||||
Message-id: 20250610123709.835102-15-berrange@redhat.com
|
||||
Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
|
||||
(cherry picked from commit 8b1dac1ad57082611419b0e2f347acd96115d25f)
|
||||
Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
|
||||
---
|
||||
hw/char/sclpconsole-lm.c | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
diff --git a/hw/char/sclpconsole-lm.c b/hw/char/sclpconsole-lm.c
|
||||
index 7719f438f6..19e64b92f6 100644
|
||||
--- a/hw/char/sclpconsole-lm.c
|
||||
+++ b/hw/char/sclpconsole-lm.c
|
||||
@@ -214,7 +214,7 @@ static int process_mdb(SCLPEvent *event, MDBO *mdbo)
|
||||
{
|
||||
int rc;
|
||||
int len;
|
||||
- uint8_t buffer[SIZE_BUFFER];
|
||||
+ QEMU_UNINITIALIZED uint8_t buffer[SIZE_BUFFER];
|
||||
|
||||
len = be16_to_cpu(mdbo->length);
|
||||
len -= sizeof(mdbo->length) + sizeof(mdbo->type)
|
||||
--
|
||||
2.39.3
|
||||
|
||||
@ -1,49 +0,0 @@
|
||||
From 7b5624efccf55184278c6f4924efc2141df460f0 Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Daniel=20P=2E=20Berrang=C3=A9?= <berrange@redhat.com>
|
||||
Date: Tue, 10 Jun 2025 13:36:54 +0100
|
||||
Subject: [PATCH 42/57] hw/display/vmware_vga: skip automatic zero-init of
|
||||
large struct
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
RH-Author: Stefan Hajnoczi <stefanha@redhat.com>
|
||||
RH-MergeRequest: 382: Solve -ftrivial-auto-var-init performance regression with QEMU_UNINITIALIZED
|
||||
RH-Jira: RHEL-99888
|
||||
RH-Acked-by: Miroslav Rezanina <mrezanin@redhat.com>
|
||||
RH-Commit: [16/30] 4aaf459d4356bf28164be742889b9a78d3656703 (stefanha/centos-stream-qemu-kvm)
|
||||
|
||||
The 'vmsvga_fifo_run' method has a struct which is a little over 20k
|
||||
in size, used for holding image data for cursor changes. Skip the
|
||||
automatic zero-init of this struct to eliminate the performance
|
||||
overhead in the I/O hot path.
|
||||
|
||||
The cursor variable will be fully initialized only when processing
|
||||
a cursor definition message from the guest.
|
||||
|
||||
Signed-off-by: Daniel P. Berrangé <berrange@redhat.com>
|
||||
Reviewed-by: Stefan Hajnoczi <stefanha@redhat.com>
|
||||
Message-id: 20250610123709.835102-17-berrange@redhat.com
|
||||
Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
|
||||
(cherry picked from commit 7048e70f391df76d009eecca25f8027858f9f304)
|
||||
Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
|
||||
---
|
||||
hw/display/vmware_vga.c | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
diff --git a/hw/display/vmware_vga.c b/hw/display/vmware_vga.c
|
||||
index 3db3ff98f7..69afe98a2f 100644
|
||||
--- a/hw/display/vmware_vga.c
|
||||
+++ b/hw/display/vmware_vga.c
|
||||
@@ -618,7 +618,7 @@ static void vmsvga_fifo_run(struct vmsvga_state_s *s)
|
||||
uint32_t cmd, colour;
|
||||
int args, len, maxloop = 1024;
|
||||
int x, y, dx, dy, width, height;
|
||||
- struct vmsvga_cursor_definition_s cursor;
|
||||
+ QEMU_UNINITIALIZED struct vmsvga_cursor_definition_s cursor;
|
||||
uint32_t cmd_start;
|
||||
|
||||
len = vmsvga_fifo_length(s);
|
||||
--
|
||||
2.39.3
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user