import qemu-kvm-7.0.0-13.el9
This commit is contained in:
parent
1371de00cb
commit
3acca8ed8b
2
.gitignore
vendored
2
.gitignore
vendored
@ -1 +1 @@
|
||||
SOURCES/qemu-6.2.0.tar.xz
|
||||
SOURCES/qemu-7.0.0.tar.xz
|
||||
|
@ -1 +1 @@
|
||||
68cd61a466170115b88817e2d52db2cd7a92f43a SOURCES/qemu-6.2.0.tar.xz
|
||||
c3fd2403106c33d0470bc9ba4fb4b946c0402248 SOURCES/qemu-7.0.0.tar.xz
|
||||
|
@ -1,49 +0,0 @@
|
||||
From cc2f3e2ce9e2a9ab9e52e8f44bee4876e69843da Mon Sep 17 00:00:00 2001
|
||||
From: John Snow <jsnow@redhat.com>
|
||||
Date: Wed, 17 Nov 2021 09:51:46 -0500
|
||||
Subject: ui/clipboard: Don't use g_autoptr just to free a variable
|
||||
|
||||
Clang doesn't recognize that the variable is being "used" and will emit
|
||||
a warning:
|
||||
|
||||
../ui/clipboard.c:47:34: error: variable 'old' set but not used [-Werror,-Wunused-but-set-variable]
|
||||
g_autoptr(QemuClipboardInfo) old = NULL;
|
||||
^
|
||||
1 error generated.
|
||||
|
||||
OK, fine. Just do things the old way.
|
||||
|
||||
Signed-off-by: John Snow <jsnow@redhat.com>
|
||||
Signed-off-by: Miroslav Rezanina <mrezanin@redhat.com>
|
||||
|
||||
---
|
||||
|
||||
This is temporary commit from upstream submission necessary for build to pass.
|
||||
We expect proper fix included upstream later.
|
||||
---
|
||||
ui/clipboard.c | 3 ++-
|
||||
1 file changed, 2 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/ui/clipboard.c b/ui/clipboard.c
|
||||
index d7b008d62a..d53576b0f6 100644
|
||||
--- a/ui/clipboard.c
|
||||
+++ b/ui/clipboard.c
|
||||
@@ -44,13 +44,14 @@ void qemu_clipboard_peer_release(QemuClipboardPeer *peer,
|
||||
|
||||
void qemu_clipboard_update(QemuClipboardInfo *info)
|
||||
{
|
||||
- g_autoptr(QemuClipboardInfo) old = NULL;
|
||||
+ QemuClipboardInfo *old = NULL;
|
||||
assert(info->selection < QEMU_CLIPBOARD_SELECTION__COUNT);
|
||||
|
||||
notifier_list_notify(&clipboard_notifiers, info);
|
||||
|
||||
old = cbinfo[info->selection];
|
||||
cbinfo[info->selection] = qemu_clipboard_info_ref(info);
|
||||
+ g_free(old);
|
||||
}
|
||||
|
||||
QemuClipboardInfo *qemu_clipboard_info(QemuClipboardSelection selection)
|
||||
--
|
||||
2.27.0
|
||||
|
@ -1,4 +1,4 @@
|
||||
From 3308eb892f03c7169f712fe88e74dacd6f05b1fe Mon Sep 17 00:00:00 2001
|
||||
From fc113ecd7c99646a7ced0b99570b5927ae6d595f 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
|
||||
@ -13,7 +13,7 @@ several issues are fixed in QEMU tree:
|
||||
|
||||
We disable make check due to issues with some of the tests.
|
||||
|
||||
This rebase is based on qemu-kvm-6.1.0-8.el9
|
||||
This rebase is based on qemu-kvm-6.2.0-13.el9
|
||||
|
||||
Signed-off-by: Miroslav Rezanina <mrezanin@redhat.com>
|
||||
--
|
||||
@ -38,6 +38,18 @@ Rebase changes (6.2.0):
|
||||
- Add -Wno-string-plus-int to extra flags
|
||||
- Updated configure options
|
||||
|
||||
Rebase changes (7.0.0):
|
||||
- Do not use -mlittle CFLAG on ppc64le
|
||||
- Used upstream handling issue with ui/clipboard.c
|
||||
- Use -mlittle-endian on ppc64le instead of deleteing it in configure
|
||||
- Drop --disable-libxml2 option for configure (upstream)
|
||||
- Remove vof roms
|
||||
- Disable AVX2 support
|
||||
- Use internal meson
|
||||
- Disable new configure options (dbus-display and qga-vss)
|
||||
- Change permissions on installing tests/Makefile.include
|
||||
- Remove ssh block driver
|
||||
|
||||
Merged patches (6.0.0):
|
||||
- 605758c902 Limit build on Power to qemu-img and qemu-ga only
|
||||
|
||||
@ -115,27 +127,26 @@ Merged patches (6.2.0):
|
||||
- d2f2ff3c74 spec: Explicitly include compress filter
|
||||
- a7d047f9c2 Move ksmtuned files to separate package
|
||||
|
||||
With rebase new configure options are introducesed. We use two steps
|
||||
configuration - first we disable all options and then enable supported
|
||||
options.
|
||||
|
||||
With 6.2.0, following changes are done:
|
||||
- disabled all audiodev and enable only pa
|
||||
- not use audio-drv-list anymore
|
||||
- disabling oss driver removes oss module (added during rebase to 6.2.0)
|
||||
- disable gettext
|
||||
- disable l2tpv3
|
||||
- enable selinux
|
||||
- enable spice-protocol
|
||||
- added needed BuildRequire
|
||||
- specify used capstone version
|
||||
- specify used fdt version
|
||||
Merged patches (7.0.0):
|
||||
- 098d4d08d0 spec: Rename qemu-kvm-hw-usbredir to qemu-kvm-device-usb-redirect
|
||||
- c2bd0d6834 spec: Split qemu-kvm-ui-opengl
|
||||
- 2c9cda805d spec: Introduce packages for virtio-gpu-* modules (changed as rhel device tree not set)
|
||||
- d0414a3e0b spec: Introduce device-display-virtio-vga* packages
|
||||
- 3534ec46d4 spec: Move usb-host module to separate package
|
||||
- ddc14d4737 spec: Move qtest accel module to tests package
|
||||
- 6f2c4befa6 spec: Extend qemu-kvm-core description
|
||||
- 6f11866e4e (rhel/rhel-9.0.0) Update to qemu-kvm-6.2.0-6.el9
|
||||
- da0a28758f ui/clipboard: fix use-after-free regression
|
||||
- 895d4d52eb spec: Remove qemu-virtiofsd
|
||||
- c8c8c8bd84 spec: Fix obsolete for spice subpackages
|
||||
- d46d2710b2 spec: Obsolete old usb redir subpackage
|
||||
- 6f52a50b68 spec: Obsolete ssh driver
|
||||
|
||||
Signed-off-by: Miroslav Rezanina <mrezanin@redhat.com>
|
||||
---
|
||||
.distro/85-kvm.preset | 5 -
|
||||
.distro/Makefile | 100 +
|
||||
.distro/Makefile.common | 38 +
|
||||
.distro/Makefile.common | 40 +
|
||||
.distro/README.tests | 39 +
|
||||
.distro/ksm.service | 13 -
|
||||
.distro/ksm.sysconfig | 4 -
|
||||
@ -147,7 +158,8 @@ Signed-off-by: Miroslav Rezanina <mrezanin@redhat.com>
|
||||
.distro/kvm-setup.service | 14 -
|
||||
.distro/modules-load.conf | 4 +
|
||||
.distro/qemu-guest-agent.service | 1 -
|
||||
.distro/qemu-kvm.spec.template | 3817 +++++++++++++++++++++++
|
||||
.distro/qemu-kvm.spec.template | 4034 +++++++++++++++++++++++
|
||||
.distro/rpminspect.yaml | 6 +-
|
||||
.distro/scripts/extract_build_cmd.py | 12 +
|
||||
.gitignore | 1 +
|
||||
README.systemtap | 43 +
|
||||
@ -157,7 +169,7 @@ Signed-off-by: Miroslav Rezanina <mrezanin@redhat.com>
|
||||
scripts/systemtap/script.d/qemu_kvm.stp | 1 +
|
||||
tests/check-block.sh | 2 +
|
||||
ui/vnc-auth-sasl.c | 2 +-
|
||||
24 files changed, 4066 insertions(+), 338 deletions(-)
|
||||
25 files changed, 4290 insertions(+), 339 deletions(-)
|
||||
delete mode 100644 .distro/85-kvm.preset
|
||||
create mode 100644 .distro/Makefile
|
||||
create mode 100644 .distro/Makefile.common
|
||||
@ -226,10 +238,10 @@ 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/meson.build b/meson.build
|
||||
index 96de1a6ef9..5f6ba86dbb 100644
|
||||
index 861de93c4f..6f7e430f0f 100644
|
||||
--- a/meson.build
|
||||
+++ b/meson.build
|
||||
@@ -2108,7 +2108,9 @@ if capstone_opt == 'internal'
|
||||
@@ -2394,7 +2394,9 @@ if capstone_opt == 'internal'
|
||||
# Include all configuration defines via a header file, which will wind up
|
||||
# as a dependency on the object file, and thus changes here will result
|
||||
# in a rebuild.
|
||||
@ -271,11 +283,11 @@ 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/tests/check-block.sh b/tests/check-block.sh
|
||||
index f86cb863de..6d38340d49 100755
|
||||
index f59496396c..d900d8b35e 100755
|
||||
--- a/tests/check-block.sh
|
||||
+++ b/tests/check-block.sh
|
||||
@@ -69,6 +69,8 @@ else
|
||||
fi
|
||||
@@ -48,6 +48,8 @@ if LANG=C bash --version | grep -q 'GNU bash, version [123]' ; then
|
||||
skip "bash version too old ==> Not running the qemu-iotests."
|
||||
fi
|
||||
|
||||
+exit 0
|
||||
@ -297,5 +309,5 @@ index 47fdae5b21..2a950caa2a 100644
|
||||
if (saslErr != SASL_OK) {
|
||||
error_setg(errp, "Failed to initialize SASL auth: %s",
|
||||
--
|
||||
2.27.0
|
||||
2.31.1
|
||||
|
@ -1,4 +1,4 @@
|
||||
From af4c83ed637bfda003ae86133413d53cefda3654 Mon Sep 17 00:00:00 2001
|
||||
From 51ec7495d69fe4b4d0b61642ca6c0e7fd7a1032d Mon Sep 17 00:00:00 2001
|
||||
From: Miroslav Rezanina <mrezanin@redhat.com>
|
||||
Date: Thu, 15 Jul 2021 03:22:36 -0400
|
||||
Subject: Enable/disable devices for RHEL
|
||||
@ -12,12 +12,16 @@ Rebase notes (6.1.0):
|
||||
- default-configs moved to configs
|
||||
- Use --with-device-<ARCH> configure option to use rhel configs
|
||||
|
||||
Rebase notes (6.2.0 RC0):
|
||||
Rebase notes (6.2.0):
|
||||
- Add CONFIG_ISA_FDC
|
||||
|
||||
Rebase notes (6.2.0 RC3):
|
||||
- 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
|
||||
|
||||
Merged patches (6.1.0):
|
||||
- c51bf45304 Remove SPICE and QXL from x86_64-rh-devices.mak
|
||||
- 02fc745601 aarch64-rh-devices: add CONFIG_PVPANIC_PCI
|
||||
@ -27,49 +31,50 @@ Merged patches (6.1.0):
|
||||
- 2504d68a7c aarch64: Add USB storage devices
|
||||
- 51c2a3253c disable ac97 audio
|
||||
|
||||
Merged patches (6.2.0 RC0):
|
||||
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
|
||||
---
|
||||
.distro/qemu-kvm.spec.template | 9 +-
|
||||
.../aarch64-softmmu/aarch64-rh-devices.mak | 33 ++++++
|
||||
.distro/qemu-kvm.spec.template | 18 +--
|
||||
.../aarch64-softmmu/aarch64-rh-devices.mak | 34 ++++++
|
||||
.../ppc64-softmmu/ppc64-rh-devices.mak | 35 ++++++
|
||||
configs/devices/rh-virtio.mak | 10 ++
|
||||
.../s390x-softmmu/s390x-rh-devices.mak | 15 +++
|
||||
.../x86_64-softmmu/x86_64-rh-devices.mak | 102 ++++++++++++++++++
|
||||
.../x86_64-upstream-devices.mak | 4 +
|
||||
.../x86_64-softmmu/x86_64-rh-devices.mak | 103 ++++++++++++++++++
|
||||
hw/acpi/ich9.c | 4 +-
|
||||
hw/arm/meson.build | 2 +-
|
||||
hw/block/fdc.c | 10 ++
|
||||
hw/char/parallel.c | 9 ++
|
||||
hw/cpu/meson.build | 5 +-
|
||||
hw/display/cirrus_vga.c | 3 +
|
||||
hw/display/cirrus_vga.c | 5 +-
|
||||
hw/ide/piix.c | 5 +-
|
||||
hw/input/pckbd.c | 2 +
|
||||
hw/net/e1000.c | 2 +
|
||||
hw/ppc/spapr_cpu_core.c | 2 +
|
||||
hw/timer/hpet.c | 8 ++
|
||||
hw/usb/meson.build | 2 +-
|
||||
target/arm/cpu_tcg.c | 10 ++
|
||||
target/ppc/cpu-models.c | 10 ++
|
||||
target/ppc/cpu-models.c | 9 ++
|
||||
target/s390x/cpu_models_sysemu.c | 3 +
|
||||
target/s390x/kvm/kvm.c | 8 ++
|
||||
23 files changed, 283 insertions(+), 10 deletions(-)
|
||||
20 files changed, 269 insertions(+), 15 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
|
||||
create mode 100644 configs/devices/s390x-softmmu/s390x-rh-devices.mak
|
||||
create mode 100644 configs/devices/x86_64-softmmu/x86_64-rh-devices.mak
|
||||
create mode 100644 configs/devices/x86_64-softmmu/x86_64-upstream-devices.mak
|
||||
|
||||
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..cd9c7c5127
|
||||
index 0000000000..5f6ee1de5b
|
||||
--- /dev/null
|
||||
+++ b/configs/devices/aarch64-softmmu/aarch64-rh-devices.mak
|
||||
@@ -0,0 +1,33 @@
|
||||
@@ -0,0 +1,34 @@
|
||||
+include ../rh-virtio.mak
|
||||
+
|
||||
+CONFIG_ARM_GIC_KVM=y
|
||||
+CONFIG_ARM_GICV3_TCG=y
|
||||
+CONFIG_ARM_GIC=y
|
||||
+CONFIG_ARM_SMMUV3=y
|
||||
+CONFIG_ARM_V7M=y
|
||||
@ -180,12 +185,11 @@ index 0000000000..d3b38312e1
|
||||
+CONFIG_WDT_DIAG288=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..1f7a9ab024
|
||||
index 0000000000..d0c9e66641
|
||||
--- /dev/null
|
||||
+++ b/configs/devices/x86_64-softmmu/x86_64-rh-devices.mak
|
||||
@@ -0,0 +1,102 @@
|
||||
@@ -0,0 +1,103 @@
|
||||
+include ../rh-virtio.mak
|
||||
+include x86_64-upstream-devices.mak
|
||||
+
|
||||
+CONFIG_ACPI=y
|
||||
+CONFIG_ACPI_PCI=y
|
||||
@ -274,6 +278,7 @@ index 0000000000..1f7a9ab024
|
||||
+CONFIG_VGA_PCI=y
|
||||
+CONFIG_VHOST_USER=y
|
||||
+CONFIG_VHOST_USER_BLK=y
|
||||
+CONFIG_VIRTIO_MEM=y
|
||||
+CONFIG_VIRTIO_PCI=y
|
||||
+CONFIG_VIRTIO_VGA=y
|
||||
+CONFIG_VMMOUSE=y
|
||||
@ -286,21 +291,12 @@ index 0000000000..1f7a9ab024
|
||||
+CONFIG_TPM_CRB=y
|
||||
+CONFIG_TPM_TIS_ISA=y
|
||||
+CONFIG_TPM_EMULATOR=y
|
||||
diff --git a/configs/devices/x86_64-softmmu/x86_64-upstream-devices.mak b/configs/devices/x86_64-softmmu/x86_64-upstream-devices.mak
|
||||
new file mode 100644
|
||||
index 0000000000..2cd20f54d2
|
||||
--- /dev/null
|
||||
+++ b/configs/devices/x86_64-softmmu/x86_64-upstream-devices.mak
|
||||
@@ -0,0 +1,4 @@
|
||||
+# We need "isa-parallel"
|
||||
+CONFIG_PARALLEL=y
|
||||
+# We need "hpet"
|
||||
+CONFIG_HPET=y
|
||||
+CONFIG_SGX=y
|
||||
diff --git a/hw/acpi/ich9.c b/hw/acpi/ich9.c
|
||||
index ebe08ed831..381ef2ddcf 100644
|
||||
index bd9bbade70..de1e401cdf 100644
|
||||
--- a/hw/acpi/ich9.c
|
||||
+++ b/hw/acpi/ich9.c
|
||||
@@ -438,8 +438,8 @@ void ich9_pm_add_properties(Object *obj, ICH9LPCPMRegs *pm)
|
||||
@@ -435,8 +435,8 @@ void ich9_pm_add_properties(Object *obj, ICH9LPCPMRegs *pm)
|
||||
static const uint32_t gpe0_len = ICH9_PMIO_GPE0_LEN;
|
||||
pm->acpi_memory_hotplug.is_enabled = true;
|
||||
pm->cpu_hotplug_legacy = true;
|
||||
@ -325,10 +321,10 @@ index 721a8eb8be..87ed4dd914 100644
|
||||
arm_ss.add(when: 'CONFIG_PXA2XX', if_true: files('pxa2xx.c', 'pxa2xx_gpio.c', 'pxa2xx_pic.c'))
|
||||
arm_ss.add(when: 'CONFIG_DIGIC', if_true: files('digic.c'))
|
||||
diff --git a/hw/block/fdc.c b/hw/block/fdc.c
|
||||
index 21d18ac2e3..97fa6de423 100644
|
||||
index 347875a0cd..ca1776121f 100644
|
||||
--- a/hw/block/fdc.c
|
||||
+++ b/hw/block/fdc.c
|
||||
@@ -48,6 +48,8 @@
|
||||
@@ -49,6 +49,8 @@
|
||||
#include "qom/object.h"
|
||||
#include "fdc-internal.h"
|
||||
|
||||
@ -337,7 +333,7 @@ index 21d18ac2e3..97fa6de423 100644
|
||||
/********************************************************/
|
||||
/* debug Floppy devices */
|
||||
|
||||
@@ -2337,6 +2339,14 @@ void fdctrl_realize_common(DeviceState *dev, FDCtrl *fdctrl, Error **errp)
|
||||
@@ -2338,6 +2340,14 @@ void fdctrl_realize_common(DeviceState *dev, FDCtrl *fdctrl, Error **errp)
|
||||
FDrive *drive;
|
||||
static int command_tables_inited = 0;
|
||||
|
||||
@ -352,33 +348,6 @@ index 21d18ac2e3..97fa6de423 100644
|
||||
if (fdctrl->fallback == FLOPPY_DRIVE_TYPE_AUTO) {
|
||||
error_setg(errp, "Cannot choose a fallback FDrive type of 'auto'");
|
||||
return;
|
||||
diff --git a/hw/char/parallel.c b/hw/char/parallel.c
|
||||
index b45e67bfbb..e5f108211b 100644
|
||||
--- a/hw/char/parallel.c
|
||||
+++ b/hw/char/parallel.c
|
||||
@@ -29,6 +29,7 @@
|
||||
#include "chardev/char-parallel.h"
|
||||
#include "chardev/char-fe.h"
|
||||
#include "hw/acpi/aml-build.h"
|
||||
+#include "hw/boards.h"
|
||||
#include "hw/irq.h"
|
||||
#include "hw/isa/isa.h"
|
||||
#include "hw/qdev-properties.h"
|
||||
@@ -534,6 +535,14 @@ static void parallel_isa_realizefn(DeviceState *dev, Error **errp)
|
||||
int base;
|
||||
uint8_t dummy;
|
||||
|
||||
+ /* Restricted for Red Hat Enterprise Linux */
|
||||
+ MachineClass *mc = MACHINE_GET_CLASS(qdev_get_machine());
|
||||
+ if (strstr(mc->name, "rhel")) {
|
||||
+ error_setg(errp, "Device %s is not supported with machine type %s",
|
||||
+ object_get_typename(OBJECT(dev)), mc->name);
|
||||
+ return;
|
||||
+ }
|
||||
+
|
||||
if (!qemu_chr_fe_backend_connected(&s->chr)) {
|
||||
error_setg(errp, "Can't create parallel device, empty char device");
|
||||
return;
|
||||
diff --git a/hw/cpu/meson.build b/hw/cpu/meson.build
|
||||
index 9e52fee9e7..bb71c9f3e7 100644
|
||||
--- a/hw/cpu/meson.build
|
||||
@ -394,19 +363,21 @@ index 9e52fee9e7..bb71c9f3e7 100644
|
||||
-specific_ss.add(when: 'CONFIG_A15MPCORE', if_true: files('a15mpcore.c'))
|
||||
+#specific_ss.add(when: 'CONFIG_A15MPCORE', if_true: files('a15mpcore.c'))
|
||||
diff --git a/hw/display/cirrus_vga.c b/hw/display/cirrus_vga.c
|
||||
index fdca6ca659..fa1a7eee51 100644
|
||||
index 3bb6a58698..6447fdb02e 100644
|
||||
--- a/hw/display/cirrus_vga.c
|
||||
+++ b/hw/display/cirrus_vga.c
|
||||
@@ -2945,6 +2945,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;
|
||||
@@ -2945,7 +2945,10 @@ static void pci_cirrus_vga_realize(PCIDevice *dev, Error **errp)
|
||||
PCIDeviceClass *pc = PCI_DEVICE_GET_CLASS(dev);
|
||||
int16_t device_id = pc->device_id;
|
||||
|
||||
- /*
|
||||
+ warn_report("'cirrus-vga' is deprecated, "
|
||||
+ "please use a different VGA card instead");
|
||||
+
|
||||
/* follow real hardware, cirrus card emulated has 4 MB video memory.
|
||||
Also accept 8 MB/16 MB for backward compatibility. */
|
||||
if (s->vga.vram_size_mb != 4 && s->vga.vram_size_mb != 8 &&
|
||||
+ /*
|
||||
* 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 ce89fd0aa3..fbcf802b13 100644
|
||||
--- a/hw/ide/piix.c
|
||||
@ -431,10 +402,10 @@ index ce89fd0aa3..fbcf802b13 100644
|
||||
|
||||
static const TypeInfo piix4_ide_info = {
|
||||
diff --git a/hw/input/pckbd.c b/hw/input/pckbd.c
|
||||
index baba62f357..bc360347ea 100644
|
||||
index 4efdf75620..5143ebaa27 100644
|
||||
--- a/hw/input/pckbd.c
|
||||
+++ b/hw/input/pckbd.c
|
||||
@@ -796,6 +796,8 @@ static void i8042_class_initfn(ObjectClass *klass, void *data)
|
||||
@@ -814,6 +814,8 @@ static void i8042_class_initfn(ObjectClass *klass, void *data)
|
||||
dc->vmsd = &vmstate_kbd_isa;
|
||||
isa->build_aml = i8042_build_aml;
|
||||
set_bit(DEVICE_CATEGORY_INPUT, dc->categories);
|
||||
@ -464,10 +435,10 @@ index f5bc81296d..282d01e374 100644
|
||||
|
||||
static void e1000_register_types(void)
|
||||
diff --git a/hw/ppc/spapr_cpu_core.c b/hw/ppc/spapr_cpu_core.c
|
||||
index 58e7341cb7..8ba34f6a1d 100644
|
||||
index 8a4861f45a..fcb5dfe792 100644
|
||||
--- a/hw/ppc/spapr_cpu_core.c
|
||||
+++ b/hw/ppc/spapr_cpu_core.c
|
||||
@@ -370,10 +370,12 @@ static const TypeInfo spapr_cpu_core_type_infos[] = {
|
||||
@@ -379,10 +379,12 @@ static const TypeInfo spapr_cpu_core_type_infos[] = {
|
||||
.instance_size = sizeof(SpaprCpuCore),
|
||||
.class_size = sizeof(SpaprCpuCoreClass),
|
||||
},
|
||||
@ -480,25 +451,6 @@ index 58e7341cb7..8ba34f6a1d 100644
|
||||
DEFINE_SPAPR_CPU_CORE_TYPE("power7_v2.3"),
|
||||
DEFINE_SPAPR_CPU_CORE_TYPE("power7+_v2.1"),
|
||||
DEFINE_SPAPR_CPU_CORE_TYPE("power8_v2.0"),
|
||||
diff --git a/hw/timer/hpet.c b/hw/timer/hpet.c
|
||||
index 9520471be2..202e032524 100644
|
||||
--- a/hw/timer/hpet.c
|
||||
+++ b/hw/timer/hpet.c
|
||||
@@ -733,6 +733,14 @@ static void hpet_realize(DeviceState *dev, Error **errp)
|
||||
int i;
|
||||
HPETTimer *timer;
|
||||
|
||||
+ /* Restricted for Red Hat Enterprise Linux */
|
||||
+ MachineClass *mc = MACHINE_GET_CLASS(qdev_get_machine());
|
||||
+ if (strstr(mc->name, "rhel")) {
|
||||
+ error_setg(errp, "Device %s is not supported with machine type %s",
|
||||
+ object_get_typename(OBJECT(dev)), mc->name);
|
||||
+ return;
|
||||
+ }
|
||||
+
|
||||
if (!s->intcap) {
|
||||
warn_report("Hpet's intcap not initialized");
|
||||
}
|
||||
diff --git a/hw/usb/meson.build b/hw/usb/meson.build
|
||||
index de853d780d..0776ae6a20 100644
|
||||
--- a/hw/usb/meson.build
|
||||
@ -591,7 +543,7 @@ index 13d0e9b195..3826fa5122 100644
|
||||
{ .name = "max", .initfn = arm_max_initfn },
|
||||
#endif
|
||||
diff --git a/target/ppc/cpu-models.c b/target/ppc/cpu-models.c
|
||||
index 4baa111713..d779c4d1d5 100644
|
||||
index 976be5e0d1..dd78883410 100644
|
||||
--- a/target/ppc/cpu-models.c
|
||||
+++ b/target/ppc/cpu-models.c
|
||||
@@ -66,6 +66,7 @@
|
||||
@ -600,9 +552,9 @@ index 4baa111713..d779c4d1d5 100644
|
||||
|
||||
+#if 0 /* Embedded and 32-bit CPUs disabled for Red Hat Enterprise Linux */
|
||||
/* Embedded PowerPC */
|
||||
/* PowerPC 401 family */
|
||||
POWERPC_DEF("401", CPU_POWERPC_401, 401,
|
||||
@@ -740,8 +741,10 @@
|
||||
/* PowerPC 405 family */
|
||||
/* PowerPC 405 cores */
|
||||
@@ -698,8 +699,10 @@
|
||||
"PowerPC 7447A v1.2 (G4)")
|
||||
POWERPC_DEF("7457a_v1.2", CPU_POWERPC_74x7A_v12, 7455,
|
||||
"PowerPC 7457A v1.2 (G4)")
|
||||
@ -613,7 +565,7 @@ index 4baa111713..d779c4d1d5 100644
|
||||
POWERPC_DEF("970_v2.2", CPU_POWERPC_970_v22, 970,
|
||||
"PowerPC 970 v2.2")
|
||||
POWERPC_DEF("970fx_v1.0", CPU_POWERPC_970FX_v10, 970,
|
||||
@@ -760,6 +763,7 @@
|
||||
@@ -718,6 +721,7 @@
|
||||
"PowerPC 970MP v1.1")
|
||||
POWERPC_DEF("power5+_v2.1", CPU_POWERPC_POWER5P_v21, POWER5P,
|
||||
"POWER5+ v2.1")
|
||||
@ -621,15 +573,7 @@ index 4baa111713..d779c4d1d5 100644
|
||||
POWERPC_DEF("power7_v2.3", CPU_POWERPC_POWER7_v23, POWER7,
|
||||
"POWER7 v2.3")
|
||||
POWERPC_DEF("power7+_v2.1", CPU_POWERPC_POWER7P_v21, POWER7,
|
||||
@@ -784,6 +788,7 @@
|
||||
/* PowerPC CPU aliases */
|
||||
|
||||
PowerPCCPUAlias ppc_cpu_aliases[] = {
|
||||
+#if 0 /* Embedded and 32-bit CPUs disabled for Red Hat Enterprise Linux */
|
||||
{ "403", "403gc" },
|
||||
{ "405", "405d4" },
|
||||
{ "405cr", "405crc" },
|
||||
@@ -942,12 +947,15 @@ PowerPCCPUAlias ppc_cpu_aliases[] = {
|
||||
@@ -897,12 +901,15 @@ PowerPCCPUAlias ppc_cpu_aliases[] = {
|
||||
{ "7447a", "7447a_v1.2" },
|
||||
{ "7457a", "7457a_v1.2" },
|
||||
{ "apollo7pm", "7457a_v1.0" },
|
||||
@ -645,7 +589,7 @@ index 4baa111713..d779c4d1d5 100644
|
||||
{ "power7", "power7_v2.3" },
|
||||
{ "power7+", "power7+_v2.1" },
|
||||
{ "power8e", "power8e_v2.1" },
|
||||
@@ -957,6 +965,7 @@ PowerPCCPUAlias ppc_cpu_aliases[] = {
|
||||
@@ -912,6 +919,7 @@ PowerPCCPUAlias ppc_cpu_aliases[] = {
|
||||
{ "power10", "power10_v2.0" },
|
||||
#endif
|
||||
|
||||
@ -653,7 +597,7 @@ index 4baa111713..d779c4d1d5 100644
|
||||
/* Generic PowerPCs */
|
||||
#if defined(TARGET_PPC64)
|
||||
{ "ppc64", "970fx_v3.1" },
|
||||
@@ -964,5 +973,6 @@ PowerPCCPUAlias ppc_cpu_aliases[] = {
|
||||
@@ -919,5 +927,6 @@ PowerPCCPUAlias ppc_cpu_aliases[] = {
|
||||
{ "ppc32", "604" },
|
||||
{ "ppc", "604" },
|
||||
{ "default", "604" },
|
||||
@ -675,10 +619,10 @@ index 05c3ccaaff..6a04ccab1b 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 5b1fdb55c4..c52434985b 100644
|
||||
index 6acf14d5ec..74f089d87f 100644
|
||||
--- a/target/s390x/kvm/kvm.c
|
||||
+++ b/target/s390x/kvm/kvm.c
|
||||
@@ -2508,6 +2508,14 @@ void kvm_s390_apply_cpu_model(const S390CPUModel *model, Error **errp)
|
||||
@@ -2512,6 +2512,14 @@ void kvm_s390_apply_cpu_model(const S390CPUModel *model, Error **errp)
|
||||
error_setg(errp, "KVM doesn't support CPU models");
|
||||
return;
|
||||
}
|
||||
@ -694,5 +638,5 @@ index 5b1fdb55c4..c52434985b 100644
|
||||
prop.ibc = s390_ibc_from_cpu_model(model);
|
||||
/* configure cpu features indicated via STFL(e) */
|
||||
--
|
||||
2.27.0
|
||||
2.31.1
|
||||
|
@ -1,4 +1,4 @@
|
||||
From ef9b78c3f2810541eac453a3f8a8753763b1378d Mon Sep 17 00:00:00 2001
|
||||
From a525db3951dc68c469d1f51bdc69ab6e75e72c37 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
|
||||
@ -9,14 +9,16 @@ architecture.
|
||||
|
||||
Signed-off-by: Miroslav Rezanina <mrezanin@redhat.com>
|
||||
--
|
||||
Rebase notes (6.2.0 RC0):
|
||||
Rebase notes (6.2.0):
|
||||
- Do not duplicate minimal_version_id for piix4_pm
|
||||
- Remove empty line chunks in serial.c
|
||||
- Remove migration.h include in serial.c
|
||||
|
||||
Rebase notes (6.2.0 RC1):
|
||||
- Update hw_compat_rhel_8_5 (from MR 66)
|
||||
|
||||
Rebase notes (7.0.0):
|
||||
- Remove downstream changes leftovers in hw/rtc/mc146818rtc.c
|
||||
- Remove unnecessary change in hw/usb/hcd-uhci.c
|
||||
|
||||
Merged patches (6.1.0):
|
||||
- f2fb42a3c6 redhat: add missing entries in hw_compat_rhel_8_4
|
||||
- 1949ec258e hw/arm/virt: Disable PL011 clock migration through hw_compat_rhel_8_3
|
||||
@ -27,32 +29,34 @@ Merged patches (6.1.0):
|
||||
- af69d1ca6e Remove RHEL 7.4.0 machine types (only generic changes)
|
||||
- 8f7a74ab78 Remove RHEL 7.5.0 machine types (only generic changes)
|
||||
|
||||
Merged patches (6.2.0 RC0):
|
||||
Merged patches (6.2.0):
|
||||
- d687ac13d2 redhat: Define hw_compat_rhel_8_5
|
||||
|
||||
Merged patches (7.0.0):
|
||||
- ef5afcc86d Fix virtio-net-pci* "vectors" compat
|
||||
- 168f0d56e3 compat: Update hw_compat_rhel_8_5 with 6.2.0 RC2 changes
|
||||
---
|
||||
hw/acpi/piix4.c | 6 +-
|
||||
hw/arm/virt.c | 2 +-
|
||||
hw/core/machine.c | 180 +++++++++++++++++++++++++++++++++++
|
||||
hw/core/machine.c | 186 +++++++++++++++++++++++++++++++++++
|
||||
hw/display/vga-isa.c | 2 +-
|
||||
hw/i386/pc_piix.c | 2 +
|
||||
hw/i386/pc_q35.c | 2 +
|
||||
hw/net/rtl8139.c | 4 +-
|
||||
hw/rtc/mc146818rtc.c | 2 +
|
||||
hw/smbios/smbios.c | 46 ++++++++-
|
||||
hw/timer/i8254_common.c | 2 +-
|
||||
hw/usb/hcd-uhci.c | 4 +-
|
||||
hw/usb/hcd-xhci-pci.c | 59 +++++++++---
|
||||
hw/usb/hcd-xhci-pci.c | 59 ++++++++---
|
||||
hw/usb/hcd-xhci-pci.h | 1 +
|
||||
include/hw/boards.h | 21 ++++
|
||||
include/hw/firmware/smbios.h | 5 +-
|
||||
include/hw/i386/pc.h | 3 +
|
||||
16 files changed, 315 insertions(+), 26 deletions(-)
|
||||
14 files changed, 316 insertions(+), 25 deletions(-)
|
||||
|
||||
diff --git a/hw/acpi/piix4.c b/hw/acpi/piix4.c
|
||||
index f0b5fac44a..8d6011c0a3 100644
|
||||
index fe5625d07a..28544e78c3 100644
|
||||
--- a/hw/acpi/piix4.c
|
||||
+++ b/hw/acpi/piix4.c
|
||||
@@ -278,7 +278,7 @@ static bool piix4_vmstate_need_smbus(void *opaque, int version_id)
|
||||
@@ -287,7 +287,7 @@ static bool vmstate_test_migrate_acpi_index(void *opaque, int version_id)
|
||||
static const VMStateDescription vmstate_acpi = {
|
||||
.name = "piix4_pm",
|
||||
.version_id = 3,
|
||||
@ -61,7 +65,7 @@ index f0b5fac44a..8d6011c0a3 100644
|
||||
.post_load = vmstate_acpi_post_load,
|
||||
.fields = (VMStateField[]) {
|
||||
VMSTATE_PCI_DEVICE(parent_obj, PIIX4PMState),
|
||||
@@ -644,8 +644,8 @@ static void piix4_send_gpe(AcpiDeviceIf *adev, AcpiEventStatusBits ev)
|
||||
@@ -653,8 +653,8 @@ static void piix4_send_gpe(AcpiDeviceIf *adev, AcpiEventStatusBits ev)
|
||||
|
||||
static Property piix4_pm_properties[] = {
|
||||
DEFINE_PROP_UINT32("smb_io_base", PIIX4PMState, smb_io_base, 0),
|
||||
@ -73,23 +77,23 @@ index f0b5fac44a..8d6011c0a3 100644
|
||||
DEFINE_PROP_BOOL(ACPI_PM_PROP_ACPI_PCIHP_BRIDGE, PIIX4PMState,
|
||||
use_acpi_hotplug_bridge, true),
|
||||
diff --git a/hw/arm/virt.c b/hw/arm/virt.c
|
||||
index 30da05dfe0..5de4d9d73b 100644
|
||||
index d2e5ecd234..6a84031fd7 100644
|
||||
--- a/hw/arm/virt.c
|
||||
+++ b/hw/arm/virt.c
|
||||
@@ -1590,7 +1590,7 @@ static void virt_build_smbios(VirtMachineState *vms)
|
||||
@@ -1596,7 +1596,7 @@ static void virt_build_smbios(VirtMachineState *vms)
|
||||
|
||||
smbios_set_defaults("QEMU", product,
|
||||
vmc->smbios_old_sys_ver ? "1.0" : mc->name, false,
|
||||
- true, SMBIOS_ENTRY_POINT_30);
|
||||
+ true, NULL, NULL, SMBIOS_ENTRY_POINT_30);
|
||||
- true, SMBIOS_ENTRY_POINT_TYPE_64);
|
||||
+ true, NULL, NULL, SMBIOS_ENTRY_POINT_TYPE_64);
|
||||
|
||||
smbios_get_tables(MACHINE(vms), NULL, 0,
|
||||
&smbios_tables, &smbios_tables_len,
|
||||
diff --git a/hw/core/machine.c b/hw/core/machine.c
|
||||
index 53a99abc56..53a3caf4fb 100644
|
||||
index 1e23fdc14b..ea430d844e 100644
|
||||
--- a/hw/core/machine.c
|
||||
+++ b/hw/core/machine.c
|
||||
@@ -37,6 +37,186 @@
|
||||
@@ -37,6 +37,192 @@
|
||||
#include "hw/virtio/virtio.h"
|
||||
#include "hw/virtio/virtio-pci.h"
|
||||
|
||||
@ -111,6 +115,8 @@ index 53a99abc56..53a3caf4fb 100644
|
||||
+ { "vhost-vsock-device", "seqpacket", "off" },
|
||||
+ /* hw_compat_rhel_8_5 from hw_compat_6_1 */
|
||||
+ { "vhost-user-vsock-device", "seqpacket", "off" },
|
||||
+ /* hw_compat_rhel_8_5 from hw_compat_6_1 */
|
||||
+ { "nvme-ns", "shared", "off" },
|
||||
+};
|
||||
+const size_t hw_compat_rhel_8_5_len = G_N_ELEMENTS(hw_compat_rhel_8_5);
|
||||
+
|
||||
@ -125,7 +131,11 @@ index 53a99abc56..53a3caf4fb 100644
|
||||
+ /* hw_compat_rhel_8_4 from hw_compat_5_2 */
|
||||
+ { "virtio-blk-device", "report-discard-granularity", "off" },
|
||||
+ /* hw_compat_rhel_8_4 from hw_compat_5_2 */
|
||||
+ { "virtio-net-pci", "vectors", "3"},
|
||||
+ /*
|
||||
+ * Upstream incorrectly had "virtio-net-pci" instead of "virtio-net-pci-base",
|
||||
+ * (https://bugzilla.redhat.com/show_bug.cgi?id=1999141)
|
||||
+ */
|
||||
+ { "virtio-net-pci-base", "vectors", "3"},
|
||||
+};
|
||||
+const size_t hw_compat_rhel_8_4_len = G_N_ELEMENTS(hw_compat_rhel_8_4);
|
||||
+
|
||||
@ -273,14 +283,14 @@ index 53a99abc56..53a3caf4fb 100644
|
||||
+};
|
||||
+const size_t hw_compat_rhel_7_6_len = G_N_ELEMENTS(hw_compat_rhel_7_6);
|
||||
+
|
||||
GlobalProperty hw_compat_6_1[] = {
|
||||
{ "vhost-user-vsock-device", "seqpacket", "off" },
|
||||
{ "nvme-ns", "shared", "off" },
|
||||
GlobalProperty hw_compat_6_2[] = {
|
||||
{ "PIIX4_PM", "x-not-migrate-acpi-index", "on"},
|
||||
};
|
||||
diff --git a/hw/display/vga-isa.c b/hw/display/vga-isa.c
|
||||
index 90851e730b..a91c5d7467 100644
|
||||
index 46abbc5653..505467059b 100644
|
||||
--- a/hw/display/vga-isa.c
|
||||
+++ b/hw/display/vga-isa.c
|
||||
@@ -85,7 +85,7 @@ static void vga_isa_realizefn(DeviceState *dev, Error **errp)
|
||||
@@ -88,7 +88,7 @@ static void vga_isa_realizefn(DeviceState *dev, Error **errp)
|
||||
}
|
||||
|
||||
static Property vga_isa_properties[] = {
|
||||
@ -290,7 +300,7 @@ index 90851e730b..a91c5d7467 100644
|
||||
};
|
||||
|
||||
diff --git a/hw/i386/pc_piix.c b/hw/i386/pc_piix.c
|
||||
index 223dd3e05d..dda3f64f19 100644
|
||||
index b72c03d0a6..c797e98312 100644
|
||||
--- a/hw/i386/pc_piix.c
|
||||
+++ b/hw/i386/pc_piix.c
|
||||
@@ -177,6 +177,8 @@ static void pc_init1(MachineState *machine,
|
||||
@ -299,11 +309,11 @@ index 223dd3e05d..dda3f64f19 100644
|
||||
pcmc->smbios_uuid_encoded,
|
||||
+ pcmc->smbios_stream_product,
|
||||
+ pcmc->smbios_stream_version,
|
||||
SMBIOS_ENTRY_POINT_21);
|
||||
pcms->smbios_entry_point_type);
|
||||
}
|
||||
|
||||
diff --git a/hw/i386/pc_q35.c b/hw/i386/pc_q35.c
|
||||
index e1e100316d..235054a643 100644
|
||||
index 1780f79bc1..b695f88c45 100644
|
||||
--- a/hw/i386/pc_q35.c
|
||||
+++ b/hw/i386/pc_q35.c
|
||||
@@ -200,6 +200,8 @@ static void pc_q35_init(MachineState *machine)
|
||||
@ -312,11 +322,11 @@ index e1e100316d..235054a643 100644
|
||||
pcmc->smbios_uuid_encoded,
|
||||
+ pcmc->smbios_stream_product,
|
||||
+ pcmc->smbios_stream_version,
|
||||
SMBIOS_ENTRY_POINT_21);
|
||||
pcms->smbios_entry_point_type);
|
||||
}
|
||||
|
||||
diff --git a/hw/net/rtl8139.c b/hw/net/rtl8139.c
|
||||
index 90b4fc63ce..3ffb9dd22c 100644
|
||||
index 6b65823b4b..75dacabc43 100644
|
||||
--- a/hw/net/rtl8139.c
|
||||
+++ b/hw/net/rtl8139.c
|
||||
@@ -3179,7 +3179,7 @@ static int rtl8139_pre_save(void *opaque)
|
||||
@ -338,28 +348,8 @@ index 90b4fc63ce..3ffb9dd22c 100644
|
||||
VMSTATE_UINT16(tally_counters.TxAbt, RTL8139State),
|
||||
VMSTATE_UINT16(tally_counters.TxUndrn, RTL8139State),
|
||||
|
||||
diff --git a/hw/rtc/mc146818rtc.c b/hw/rtc/mc146818rtc.c
|
||||
index 4fbafddb22..6c42cc22cd 100644
|
||||
--- a/hw/rtc/mc146818rtc.c
|
||||
+++ b/hw/rtc/mc146818rtc.c
|
||||
@@ -43,6 +43,7 @@
|
||||
#include "qapi/qapi-events-misc-target.h"
|
||||
#include "qapi/visitor.h"
|
||||
#include "hw/rtc/mc146818rtc_regs.h"
|
||||
+#include "migration/migration.h"
|
||||
|
||||
#ifdef TARGET_I386
|
||||
#include "qapi/qapi-commands-misc-target.h"
|
||||
@@ -821,6 +822,7 @@ static int rtc_post_load(void *opaque, int version_id)
|
||||
static bool rtc_irq_reinject_on_ack_count_needed(void *opaque)
|
||||
{
|
||||
RTCState *s = (RTCState *)opaque;
|
||||
+
|
||||
return s->irq_reinject_on_ack_count != 0;
|
||||
}
|
||||
|
||||
diff --git a/hw/smbios/smbios.c b/hw/smbios/smbios.c
|
||||
index 7397e56737..3a4bb894ba 100644
|
||||
index 60349ee402..0edcc98434 100644
|
||||
--- a/hw/smbios/smbios.c
|
||||
+++ b/hw/smbios/smbios.c
|
||||
@@ -57,6 +57,9 @@ static bool smbios_legacy = true;
|
||||
@ -372,16 +362,16 @@ index 7397e56737..3a4bb894ba 100644
|
||||
|
||||
uint8_t *smbios_tables;
|
||||
size_t smbios_tables_len;
|
||||
@@ -619,7 +622,7 @@ static void smbios_build_type_1_table(void)
|
||||
@@ -639,7 +642,7 @@ static void smbios_build_type_1_table(void)
|
||||
|
||||
static void smbios_build_type_2_table(void)
|
||||
{
|
||||
- SMBIOS_BUILD_TABLE_PRE(2, 0x200, false); /* optional */
|
||||
+ SMBIOS_BUILD_TABLE_PRE(2, 0x200, smbios_type2_required);
|
||||
- SMBIOS_BUILD_TABLE_PRE(2, T2_BASE, false); /* optional */
|
||||
+ SMBIOS_BUILD_TABLE_PRE(2, T2_BASE, smbios_type2_required);
|
||||
|
||||
SMBIOS_TABLE_SET_STR(2, manufacturer_str, type2.manufacturer);
|
||||
SMBIOS_TABLE_SET_STR(2, product_str, type2.product);
|
||||
@@ -888,7 +891,10 @@ void smbios_set_cpuid(uint32_t version, uint32_t features)
|
||||
@@ -914,7 +917,10 @@ void smbios_set_cpuid(uint32_t version, uint32_t features)
|
||||
|
||||
void smbios_set_defaults(const char *manufacturer, const char *product,
|
||||
const char *version, bool legacy_mode,
|
||||
@ -393,7 +383,7 @@ index 7397e56737..3a4bb894ba 100644
|
||||
{
|
||||
smbios_have_defaults = true;
|
||||
smbios_legacy = legacy_mode;
|
||||
@@ -909,11 +915,45 @@ void smbios_set_defaults(const char *manufacturer, const char *product,
|
||||
@@ -935,11 +941,45 @@ void smbios_set_defaults(const char *manufacturer, const char *product,
|
||||
g_free(smbios_entries);
|
||||
}
|
||||
|
||||
@ -453,25 +443,6 @@ index 050875b497..32935da46c 100644
|
||||
VMSTATE_STRUCT_ARRAY(channels, PITCommonState, 3, 2,
|
||||
vmstate_pit_channel, PITChannelState),
|
||||
VMSTATE_INT64(channels[0].next_transition_time,
|
||||
diff --git a/hw/usb/hcd-uhci.c b/hw/usb/hcd-uhci.c
|
||||
index d1b5657d72..7930b868fa 100644
|
||||
--- a/hw/usb/hcd-uhci.c
|
||||
+++ b/hw/usb/hcd-uhci.c
|
||||
@@ -1166,11 +1166,13 @@ void usb_uhci_common_realize(PCIDevice *dev, Error **errp)
|
||||
UHCIState *s = UHCI(dev);
|
||||
uint8_t *pci_conf = s->dev.config;
|
||||
int i;
|
||||
+ int irq_pin;
|
||||
|
||||
pci_conf[PCI_CLASS_PROG] = 0x00;
|
||||
/* TODO: reset value should be 0. */
|
||||
pci_conf[USB_SBRN] = USB_RELEASE_1; /* release number */
|
||||
- pci_config_set_interrupt_pin(pci_conf, u->info.irq_pin + 1);
|
||||
+ irq_pin = u->info.irq_pin;
|
||||
+ pci_config_set_interrupt_pin(pci_conf, irq_pin + 1);
|
||||
s->irq = pci_allocate_irq(dev);
|
||||
|
||||
if (s->masterbus) {
|
||||
diff --git a/hw/usb/hcd-xhci-pci.c b/hw/usb/hcd-xhci-pci.c
|
||||
index e934b1a5b1..e18b05e528 100644
|
||||
--- a/hw/usb/hcd-xhci-pci.c
|
||||
@ -584,10 +555,10 @@ index c193f79443..086a1feb1e 100644
|
||||
|
||||
#endif
|
||||
diff --git a/include/hw/boards.h b/include/hw/boards.h
|
||||
index 9c1c190104..b0a6e05b48 100644
|
||||
index c92ac8815c..c90a19b4d1 100644
|
||||
--- a/include/hw/boards.h
|
||||
+++ b/include/hw/boards.h
|
||||
@@ -441,4 +441,25 @@ extern const size_t hw_compat_2_2_len;
|
||||
@@ -449,4 +449,25 @@ extern const size_t hw_compat_2_2_len;
|
||||
extern GlobalProperty hw_compat_2_1[];
|
||||
extern const size_t hw_compat_2_1_len;
|
||||
|
||||
@ -614,10 +585,10 @@ index 9c1c190104..b0a6e05b48 100644
|
||||
+
|
||||
#endif
|
||||
diff --git a/include/hw/firmware/smbios.h b/include/hw/firmware/smbios.h
|
||||
index 5a0dd0c8cf..2cb1ec2bab 100644
|
||||
index 4b7ad77a44..9acff96a86 100644
|
||||
--- a/include/hw/firmware/smbios.h
|
||||
+++ b/include/hw/firmware/smbios.h
|
||||
@@ -278,7 +278,10 @@ void smbios_entry_add(QemuOpts *opts, Error **errp);
|
||||
@@ -272,7 +272,10 @@ void smbios_entry_add(QemuOpts *opts, Error **errp);
|
||||
void smbios_set_cpuid(uint32_t version, uint32_t features);
|
||||
void smbios_set_defaults(const char *manufacturer, const char *product,
|
||||
const char *version, bool legacy_mode,
|
||||
@ -630,10 +601,10 @@ index 5a0dd0c8cf..2cb1ec2bab 100644
|
||||
void smbios_get_tables(MachineState *ms,
|
||||
const struct smbios_phys_mem_area *mem_array,
|
||||
diff --git a/include/hw/i386/pc.h b/include/hw/i386/pc.h
|
||||
index 9ab39e428f..7ccc9a1a07 100644
|
||||
index 1a27de9c8b..91331059d9 100644
|
||||
--- a/include/hw/i386/pc.h
|
||||
+++ b/include/hw/i386/pc.h
|
||||
@@ -107,6 +107,9 @@ struct PCMachineClass {
|
||||
@@ -113,6 +113,9 @@ struct PCMachineClass {
|
||||
bool smbios_defaults;
|
||||
bool smbios_legacy_mode;
|
||||
bool smbios_uuid_encoded;
|
||||
@ -644,5 +615,5 @@ index 9ab39e428f..7ccc9a1a07 100644
|
||||
/* RAM / address space compat: */
|
||||
bool gigabyte_align;
|
||||
--
|
||||
2.27.0
|
||||
2.31.1
|
||||
|
@ -1,4 +1,4 @@
|
||||
From 19d36c4519a1a560cce60b212e3afdf7eb026e45 Mon Sep 17 00:00:00 2001
|
||||
From 697aaa43e3c0f20fc312f06be6c1093f1ba907e1 Mon Sep 17 00:00:00 2001
|
||||
From: Miroslav Rezanina <mrezanin@redhat.com>
|
||||
Date: Fri, 19 Oct 2018 12:53:31 +0200
|
||||
Subject: Add aarch64 machine types
|
||||
@ -13,19 +13,32 @@ Rebase notes (6.1.0):
|
||||
- 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
|
||||
|
||||
Merged patches (6.2.0 RC0):
|
||||
Rebase notes (7.0.0):
|
||||
- Added dtb-kaslr-seed option
|
||||
- Set no_tcg_lpa2 to true
|
||||
|
||||
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
|
||||
---
|
||||
hw/arm/virt.c | 205 +++++++++++++++++++++++++++++++++++++++++-
|
||||
hw/arm/virt.c | 234 +++++++++++++++++++++++++++++++++++++++++-
|
||||
include/hw/arm/virt.h | 8 ++
|
||||
2 files changed, 212 insertions(+), 1 deletion(-)
|
||||
2 files changed, 241 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/hw/arm/virt.c b/hw/arm/virt.c
|
||||
index 5de4d9d73b..7d51824263 100644
|
||||
index 6a84031fd7..e06862d22a 100644
|
||||
--- a/hw/arm/virt.c
|
||||
+++ b/hw/arm/virt.c
|
||||
@@ -79,6 +79,7 @@
|
||||
@@ -80,6 +80,7 @@
|
||||
#include "hw/char/pl011.h"
|
||||
#include "qemu/guest-random.h"
|
||||
|
||||
@ -33,7 +46,7 @@ index 5de4d9d73b..7d51824263 100644
|
||||
#define DEFINE_VIRT_MACHINE_LATEST(major, minor, latest) \
|
||||
static void virt_##major##_##minor##_class_init(ObjectClass *oc, \
|
||||
void *data) \
|
||||
@@ -105,7 +106,48 @@
|
||||
@@ -106,7 +107,48 @@
|
||||
DEFINE_VIRT_MACHINE_LATEST(major, minor, true)
|
||||
#define DEFINE_VIRT_MACHINE(major, minor) \
|
||||
DEFINE_VIRT_MACHINE_LATEST(major, minor, false)
|
||||
@ -83,7 +96,7 @@ index 5de4d9d73b..7d51824263 100644
|
||||
|
||||
/* Number of external interrupt lines to configure the GIC with */
|
||||
#define NUM_IRQS 256
|
||||
@@ -2180,6 +2222,7 @@ static void machvirt_init(MachineState *machine)
|
||||
@@ -2250,6 +2292,7 @@ static void machvirt_init(MachineState *machine)
|
||||
qemu_add_machine_init_done_notifier(&vms->machine_done);
|
||||
}
|
||||
|
||||
@ -91,7 +104,7 @@ index 5de4d9d73b..7d51824263 100644
|
||||
static bool virt_get_secure(Object *obj, Error **errp)
|
||||
{
|
||||
VirtMachineState *vms = VIRT_MACHINE(obj);
|
||||
@@ -2207,6 +2250,7 @@ static void virt_set_virt(Object *obj, bool value, Error **errp)
|
||||
@@ -2277,6 +2320,7 @@ static void virt_set_virt(Object *obj, bool value, Error **errp)
|
||||
|
||||
vms->virt = value;
|
||||
}
|
||||
@ -99,15 +112,15 @@ index 5de4d9d73b..7d51824263 100644
|
||||
|
||||
static bool virt_get_highmem(Object *obj, Error **errp)
|
||||
{
|
||||
@@ -2304,6 +2348,7 @@ static void virt_set_acpi(Object *obj, Visitor *v, const char *name,
|
||||
visit_type_OnOffAuto(v, name, &vms->acpi, errp);
|
||||
@@ -2402,6 +2446,7 @@ static void virt_set_ras(Object *obj, bool value, Error **errp)
|
||||
vms->ras = value;
|
||||
}
|
||||
|
||||
+#if 0 /* Disabled for Red Hat Enterprise Linux */
|
||||
static bool virt_get_ras(Object *obj, Error **errp)
|
||||
static bool virt_get_mte(Object *obj, Error **errp)
|
||||
{
|
||||
VirtMachineState *vms = VIRT_MACHINE(obj);
|
||||
@@ -2331,6 +2376,7 @@ static void virt_set_mte(Object *obj, bool value, Error **errp)
|
||||
@@ -2415,6 +2460,7 @@ static void virt_set_mte(Object *obj, bool value, Error **errp)
|
||||
|
||||
vms->mte = value;
|
||||
}
|
||||
@ -115,7 +128,7 @@ index 5de4d9d73b..7d51824263 100644
|
||||
|
||||
static char *virt_get_gic_version(Object *obj, Error **errp)
|
||||
{
|
||||
@@ -2666,6 +2712,7 @@ static int virt_kvm_type(MachineState *ms, const char *type_str)
|
||||
@@ -2818,6 +2864,7 @@ static int virt_kvm_type(MachineState *ms, const char *type_str)
|
||||
return fixed_ipa ? 0 : requested_pa_size;
|
||||
}
|
||||
|
||||
@ -123,7 +136,7 @@ index 5de4d9d73b..7d51824263 100644
|
||||
static void virt_machine_class_init(ObjectClass *oc, void *data)
|
||||
{
|
||||
MachineClass *mc = MACHINE_CLASS(oc);
|
||||
@@ -3031,3 +3078,159 @@ static void virt_machine_2_6_options(MachineClass *mc)
|
||||
@@ -3206,3 +3253,188 @@ static void virt_machine_2_6_options(MachineClass *mc)
|
||||
vmc->no_pmu = true;
|
||||
}
|
||||
DEFINE_VIRT_MACHINE(2, 6)
|
||||
@ -180,6 +193,30 @@ index 5de4d9d73b..7d51824263 100644
|
||||
+ "Set GIC version. "
|
||||
+ "Valid values are 2, 3, host and max");
|
||||
+
|
||||
+ object_class_property_add_str(oc, "iommu", virt_get_iommu, virt_set_iommu);
|
||||
+ object_class_property_set_description(oc, "iommu",
|
||||
+ "Set the IOMMU type. "
|
||||
+ "Valid values are none and smmuv3");
|
||||
+
|
||||
+ object_class_property_add_bool(oc, "default-bus-bypass-iommu",
|
||||
+ virt_get_default_bus_bypass_iommu,
|
||||
+ virt_set_default_bus_bypass_iommu);
|
||||
+ object_class_property_set_description(oc, "default-bus-bypass-iommu",
|
||||
+ "Set on/off to enable/disable "
|
||||
+ "bypass_iommu for default root bus");
|
||||
+
|
||||
+ object_class_property_add_bool(oc, "ras", virt_get_ras,
|
||||
+ virt_set_ras);
|
||||
+ object_class_property_set_description(oc, "ras",
|
||||
+ "Set on/off to enable/disable reporting host memory errors "
|
||||
+ "to a KVM guest using ACPI and guest external abort exceptions");
|
||||
+
|
||||
+ object_class_property_add_bool(oc, "its", virt_get_its,
|
||||
+ virt_set_its);
|
||||
+ object_class_property_set_description(oc, "its",
|
||||
+ "Set on/off to enable/disable "
|
||||
+ "ITS instantiation");
|
||||
+
|
||||
+ object_class_property_add_str(oc, "x-oem-id",
|
||||
+ virt_get_oem_id,
|
||||
+ virt_set_oem_id);
|
||||
@ -188,6 +225,7 @@ index 5de4d9d73b..7d51824263 100644
|
||||
+ "in ACPI table header."
|
||||
+ "The string may be up to 6 bytes in size");
|
||||
+
|
||||
+
|
||||
+ object_class_property_add_str(oc, "x-oem-table-id",
|
||||
+ virt_get_oem_table_id,
|
||||
+ virt_set_oem_table_id);
|
||||
@ -195,13 +233,13 @@ index 5de4d9d73b..7d51824263 100644
|
||||
+ "Override the default value of field OEM Table ID "
|
||||
+ "in ACPI table header."
|
||||
+ "The string may be up to 8 bytes in size");
|
||||
+ object_class_property_add_bool(oc, "default_bus_bypass_iommu",
|
||||
+ virt_get_default_bus_bypass_iommu,
|
||||
+ virt_set_default_bus_bypass_iommu);
|
||||
+ object_class_property_set_description(oc, "default_bus_bypass_iommu",
|
||||
+ "Set on/off to enable/disable "
|
||||
+ "bypass_iommu for default root bus");
|
||||
+
|
||||
+ object_class_property_add_bool(oc, "dtb-kaslr-seed",
|
||||
+ virt_get_dtb_kaslr_seed,
|
||||
+ virt_set_dtb_kaslr_seed);
|
||||
+ object_class_property_set_description(oc, "dtb-kaslr-seed",
|
||||
+ "Set off to disable passing of kaslr-seed "
|
||||
+ "dtb node to guest");
|
||||
+}
|
||||
+
|
||||
+static void rhel_virt_instance_init(Object *obj)
|
||||
@ -226,19 +264,19 @@ index 5de4d9d73b..7d51824263 100644
|
||||
+ } else {
|
||||
+ /* Default allows ITS instantiation */
|
||||
+ vms->its = true;
|
||||
+ object_property_add_bool(obj, "its", virt_get_its,
|
||||
+ virt_set_its);
|
||||
+ object_property_set_description(obj, "its",
|
||||
+ "Set on/off to enable/disable "
|
||||
+ "ITS instantiation");
|
||||
+
|
||||
+ if (vmc->no_tcg_its) {
|
||||
+ vms->tcg_its = false;
|
||||
+ } else {
|
||||
+ vms->tcg_its = true;
|
||||
+ }
|
||||
+ }
|
||||
+
|
||||
+ /* Default disallows iommu instantiation */
|
||||
+ vms->iommu = VIRT_IOMMU_NONE;
|
||||
+ object_property_add_str(obj, "iommu", virt_get_iommu, virt_set_iommu);
|
||||
+ object_property_set_description(obj, "iommu",
|
||||
+ "Set the IOMMU type. "
|
||||
+ "Valid values are none and smmuv3");
|
||||
+
|
||||
+ /* The default root bus is attached to iommu by default */
|
||||
+ vms->default_bus_bypass_iommu = false;
|
||||
+
|
||||
+ /* Default disallows RAS instantiation and is non-configurable for RHEL */
|
||||
+ vms->ras = false;
|
||||
@ -246,15 +284,15 @@ index 5de4d9d73b..7d51824263 100644
|
||||
+ /* MTE is disabled by default and non-configurable for RHEL */
|
||||
+ vms->mte = false;
|
||||
+
|
||||
+ /* The default root bus is attached to iommu by default */
|
||||
+ vms->default_bus_bypass_iommu = false;
|
||||
+ /* Supply a kaslr-seed by default */
|
||||
+ vms->dtb_kaslr_seed = true;
|
||||
+
|
||||
+ vms->irqmap = a15irqmap;
|
||||
+
|
||||
+ virt_flash_create(vms);
|
||||
+
|
||||
+ vms->oem_id = g_strndup(ACPI_BUILD_APPNAME6, 6);
|
||||
+ vms->oem_table_id = g_strndup(ACPI_BUILD_APPNAME8, 8);
|
||||
+
|
||||
+}
|
||||
+
|
||||
+static const TypeInfo rhel_machine_info = {
|
||||
@ -277,17 +315,21 @@ index 5de4d9d73b..7d51824263 100644
|
||||
+}
|
||||
+type_init(rhel_machine_init);
|
||||
+
|
||||
+static void rhel850_virt_options(MachineClass *mc)
|
||||
+static void rhel900_virt_options(MachineClass *mc)
|
||||
+{
|
||||
+ VirtMachineClass *vmc = VIRT_MACHINE_CLASS(OBJECT_CLASS(mc));
|
||||
+
|
||||
+ compat_props_add(mc->compat_props, arm_rhel_compat, arm_rhel_compat_len);
|
||||
+ compat_props_add(mc->compat_props, hw_compat_rhel_8_5, hw_compat_rhel_8_5_len);
|
||||
+
|
||||
+ /* Disable FEAT_LPA2 since old kernels (<= v5.12) don't boot with that feature */
|
||||
+ vmc->no_tcg_lpa2 = true;
|
||||
+}
|
||||
+DEFINE_RHEL_MACHINE_AS_LATEST(8, 5, 0)
|
||||
+DEFINE_RHEL_MACHINE_AS_LATEST(9, 0, 0)
|
||||
diff --git a/include/hw/arm/virt.h b/include/hw/arm/virt.h
|
||||
index dc6b66ffc8..9364628847 100644
|
||||
index 7e76ee2619..9b1efe8f0e 100644
|
||||
--- a/include/hw/arm/virt.h
|
||||
+++ b/include/hw/arm/virt.h
|
||||
@@ -175,9 +175,17 @@ struct VirtMachineState {
|
||||
@@ -179,9 +179,17 @@ struct VirtMachineState {
|
||||
|
||||
#define VIRT_ECAM_ID(high) (high ? VIRT_HIGH_PCIE_ECAM : VIRT_PCIE_ECAM)
|
||||
|
||||
@ -306,5 +348,5 @@ index dc6b66ffc8..9364628847 100644
|
||||
bool virt_is_acpi_enabled(VirtMachineState *vms);
|
||||
|
||||
--
|
||||
2.27.0
|
||||
2.31.1
|
||||
|
@ -1,4 +1,4 @@
|
||||
From 2d595bc1744fc764ef506fd6ed6555f267d01ea4 Mon Sep 17 00:00:00 2001
|
||||
From f61b3d7dc000886e23943457ee9baf1d4cae43b4 Mon Sep 17 00:00:00 2001
|
||||
From: Miroslav Rezanina <mrezanin@redhat.com>
|
||||
Date: Fri, 19 Oct 2018 13:27:13 +0200
|
||||
Subject: Add ppc64 machine types
|
||||
@ -7,7 +7,7 @@ Adding changes to add RHEL machine types for ppc64 architecture.
|
||||
|
||||
Signed-off-by: Miroslav Rezanina <mrezanin@redhat.com>
|
||||
|
||||
Rebase notes (6.2.0 rc1):
|
||||
Rebase notes (6.2.0):
|
||||
- Fixed rebase conflict relicts
|
||||
- Update machine type compat for 6.2 (from MR 66)
|
||||
|
||||
@ -30,10 +30,10 @@ Merged patches (6.1.0):
|
||||
7 files changed, 313 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/hw/ppc/spapr.c b/hw/ppc/spapr.c
|
||||
index 3b5fd749be..f4bb5f15f0 100644
|
||||
index a4372ba189..5fdf8b506d 100644
|
||||
--- a/hw/ppc/spapr.c
|
||||
+++ b/hw/ppc/spapr.c
|
||||
@@ -1593,6 +1593,9 @@ static void spapr_machine_reset(MachineState *machine)
|
||||
@@ -1622,6 +1622,9 @@ static void spapr_machine_reset(MachineState *machine)
|
||||
|
||||
pef_kvm_reset(machine->cgs, &error_fatal);
|
||||
spapr_caps_apply(spapr);
|
||||
@ -43,7 +43,7 @@ index 3b5fd749be..f4bb5f15f0 100644
|
||||
|
||||
first_ppc_cpu = POWERPC_CPU(first_cpu);
|
||||
if (kvm_enabled() && kvmppc_has_cap_mmu_radix() &&
|
||||
@@ -3288,6 +3291,20 @@ static void spapr_set_host_serial(Object *obj, const char *value, Error **errp)
|
||||
@@ -3317,6 +3320,20 @@ static void spapr_set_host_serial(Object *obj, const char *value, Error **errp)
|
||||
spapr->host_serial = g_strdup(value);
|
||||
}
|
||||
|
||||
@ -64,7 +64,7 @@ index 3b5fd749be..f4bb5f15f0 100644
|
||||
static void spapr_instance_init(Object *obj)
|
||||
{
|
||||
SpaprMachineState *spapr = SPAPR_MACHINE(obj);
|
||||
@@ -3366,6 +3383,12 @@ static void spapr_instance_init(Object *obj)
|
||||
@@ -3395,6 +3412,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");
|
||||
@ -77,7 +77,7 @@ index 3b5fd749be..f4bb5f15f0 100644
|
||||
}
|
||||
|
||||
static void spapr_machine_finalizefn(Object *obj)
|
||||
@@ -4614,6 +4637,7 @@ static void spapr_machine_class_init(ObjectClass *oc, void *data)
|
||||
@@ -4652,6 +4675,7 @@ static void spapr_machine_class_init(ObjectClass *oc, void *data)
|
||||
vmc->client_architecture_support = spapr_vof_client_architecture_support;
|
||||
vmc->quiesce = spapr_vof_quiesce;
|
||||
vmc->setprop = spapr_vof_setprop;
|
||||
@ -85,15 +85,15 @@ index 3b5fd749be..f4bb5f15f0 100644
|
||||
}
|
||||
|
||||
static const TypeInfo spapr_machine_info = {
|
||||
@@ -4665,6 +4689,7 @@ static void spapr_machine_latest_class_options(MachineClass *mc)
|
||||
@@ -4703,6 +4727,7 @@ static void spapr_machine_latest_class_options(MachineClass *mc)
|
||||
} \
|
||||
type_init(spapr_machine_register_##suffix)
|
||||
|
||||
+#if 0 /* Disabled for Red Hat Enterprise Linux */
|
||||
/*
|
||||
* pseries-6.2
|
||||
* pseries-7.0
|
||||
*/
|
||||
@@ -4781,6 +4806,7 @@ static void spapr_machine_4_1_class_options(MachineClass *mc)
|
||||
@@ -4830,6 +4855,7 @@ static void spapr_machine_4_1_class_options(MachineClass *mc)
|
||||
}
|
||||
|
||||
DEFINE_SPAPR_MACHINE(4_1, "4.1", false);
|
||||
@ -101,7 +101,7 @@ index 3b5fd749be..f4bb5f15f0 100644
|
||||
|
||||
/*
|
||||
* pseries-4.0
|
||||
@@ -4800,6 +4826,8 @@ static bool phb_placement_4_0(SpaprMachineState *spapr, uint32_t index,
|
||||
@@ -4849,6 +4875,8 @@ static bool phb_placement_4_0(SpaprMachineState *spapr, uint32_t index,
|
||||
*nv2atsd = 0;
|
||||
return true;
|
||||
}
|
||||
@ -110,7 +110,7 @@ index 3b5fd749be..f4bb5f15f0 100644
|
||||
static void spapr_machine_4_0_class_options(MachineClass *mc)
|
||||
{
|
||||
SpaprMachineClass *smc = SPAPR_MACHINE_CLASS(mc);
|
||||
@@ -5127,6 +5155,221 @@ static void spapr_machine_2_1_class_options(MachineClass *mc)
|
||||
@@ -5176,6 +5204,221 @@ 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);
|
||||
}
|
||||
DEFINE_SPAPR_MACHINE(2_1, "2.1", false);
|
||||
@ -333,10 +333,10 @@ index 3b5fd749be..f4bb5f15f0 100644
|
||||
static void spapr_machine_register_types(void)
|
||||
{
|
||||
diff --git a/hw/ppc/spapr_cpu_core.c b/hw/ppc/spapr_cpu_core.c
|
||||
index 8ba34f6a1d..78eca1c04a 100644
|
||||
index fcb5dfe792..ab8fb5bf62 100644
|
||||
--- a/hw/ppc/spapr_cpu_core.c
|
||||
+++ b/hw/ppc/spapr_cpu_core.c
|
||||
@@ -24,6 +24,7 @@
|
||||
@@ -25,6 +25,7 @@
|
||||
#include "sysemu/reset.h"
|
||||
#include "sysemu/hw_accel.h"
|
||||
#include "qemu/error-report.h"
|
||||
@ -344,7 +344,7 @@ index 8ba34f6a1d..78eca1c04a 100644
|
||||
|
||||
static void spapr_reset_vcpu(PowerPCCPU *cpu)
|
||||
{
|
||||
@@ -250,6 +251,7 @@ static bool spapr_realize_vcpu(PowerPCCPU *cpu, SpaprMachineState *spapr,
|
||||
@@ -259,6 +260,7 @@ static bool spapr_realize_vcpu(PowerPCCPU *cpu, SpaprMachineState *spapr,
|
||||
{
|
||||
CPUPPCState *env = &cpu->env;
|
||||
CPUState *cs = CPU(cpu);
|
||||
@ -352,9 +352,9 @@ index 8ba34f6a1d..78eca1c04a 100644
|
||||
|
||||
if (!qdev_realize(DEVICE(cpu), NULL, errp)) {
|
||||
return false;
|
||||
@@ -261,6 +263,17 @@ static bool spapr_realize_vcpu(PowerPCCPU *cpu, SpaprMachineState *spapr,
|
||||
cpu_ppc_set_vhyp(cpu, PPC_VIRTUAL_HYPERVISOR(spapr));
|
||||
kvmppc_set_papr(cpu);
|
||||
@@ -270,6 +272,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);
|
||||
|
||||
+ if (!smc->has_power9_support &&
|
||||
+ (((spapr->max_compat_pvr &&
|
||||
@ -371,7 +371,7 @@ index 8ba34f6a1d..78eca1c04a 100644
|
||||
qdev_unrealize(DEVICE(cpu));
|
||||
return false;
|
||||
diff --git a/include/hw/ppc/spapr.h b/include/hw/ppc/spapr.h
|
||||
index ee7504b976..fcd5bf9302 100644
|
||||
index f5c33dcc86..4a68e0a901 100644
|
||||
--- a/include/hw/ppc/spapr.h
|
||||
+++ b/include/hw/ppc/spapr.h
|
||||
@@ -154,6 +154,7 @@ struct SpaprMachineClass {
|
||||
@ -382,7 +382,7 @@ index ee7504b976..fcd5bf9302 100644
|
||||
bool (*phb_placement)(SpaprMachineState *spapr, uint32_t index,
|
||||
uint64_t *buid, hwaddr *pio,
|
||||
hwaddr *mmio32, hwaddr *mmio64,
|
||||
@@ -238,6 +239,9 @@ struct SpaprMachineState {
|
||||
@@ -241,6 +242,9 @@ struct SpaprMachineState {
|
||||
/* Set by -boot */
|
||||
char *boot_device;
|
||||
|
||||
@ -418,10 +418,10 @@ index 7949a24f5a..f207a9ba01 100644
|
||||
const CompatInfo *compat = compat_by_pvr(compat_pvr);
|
||||
const CompatInfo *min = compat_by_pvr(min_compat_pvr);
|
||||
diff --git a/target/ppc/cpu.h b/target/ppc/cpu.h
|
||||
index e946da5f3a..23e8b76c85 100644
|
||||
index 047b24ba50..79c5ac50b9 100644
|
||||
--- a/target/ppc/cpu.h
|
||||
+++ b/target/ppc/cpu.h
|
||||
@@ -1401,6 +1401,7 @@ static inline int cpu_mmu_index(CPUPPCState *env, bool ifetch)
|
||||
@@ -1462,6 +1462,7 @@ static inline int cpu_mmu_index(CPUPPCState *env, bool ifetch)
|
||||
|
||||
/* Compatibility modes */
|
||||
#if defined(TARGET_PPC64)
|
||||
@ -524,5 +524,5 @@ index ee9325bf9a..20dbb95989 100644
|
||||
{
|
||||
return -1;
|
||||
--
|
||||
2.27.0
|
||||
2.31.1
|
||||
|
@ -1,4 +1,4 @@
|
||||
From ea22b5ae0a89ef53f31f67bb6845fd6c45d4f412 Mon Sep 17 00:00:00 2001
|
||||
From 680f343e58a50a99d17bc7dedd3ee90980912023 Mon Sep 17 00:00:00 2001
|
||||
From: Miroslav Rezanina <mrezanin@redhat.com>
|
||||
Date: Fri, 19 Oct 2018 13:47:32 +0200
|
||||
Subject: Add s390x machine types
|
||||
@ -11,14 +11,38 @@ Merged patches (6.1.0):
|
||||
- 64a9a5c971 hw/s390x: Remove the RHEL7-only machine type
|
||||
- 395516d62b redhat: s390x: add rhel-8.5.0 compat machine
|
||||
|
||||
Merged patches (6.2.0 RC0):
|
||||
Merged patches (6.2.0):
|
||||
- 3bf66f4520 redhat: Add s390x machine type compatibility update for 6.1 rebase
|
||||
---
|
||||
hw/s390x/s390-virtio-ccw.c | 67 +++++++++++++++++++++++++++++++++++++-
|
||||
1 file changed, 66 insertions(+), 1 deletion(-)
|
||||
|
||||
Merged patches (7.0.0):
|
||||
- e6ff4de4f7 redhat: Add s390x machine type compatibility handling for the rebase to v6.2
|
||||
- 4b0efa7e21 redhat: Add rhel8.6.0 and rhel9.0.0 machine types for s390x
|
||||
- dcc64971bf RHEL: mark old machine types as deprecated (partialy)
|
||||
---
|
||||
hw/core/machine.c | 6 +++
|
||||
hw/s390x/s390-virtio-ccw.c | 104 ++++++++++++++++++++++++++++++++++++-
|
||||
include/hw/boards.h | 2 +
|
||||
3 files changed, 111 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/hw/core/machine.c b/hw/core/machine.c
|
||||
index ea430d844e..77202a3570 100644
|
||||
--- a/hw/core/machine.c
|
||||
+++ b/hw/core/machine.c
|
||||
@@ -37,6 +37,12 @@
|
||||
#include "hw/virtio/virtio.h"
|
||||
#include "hw/virtio/virtio-pci.h"
|
||||
|
||||
+/*
|
||||
+ * RHEL only: machine types for previous major releases are deprecated
|
||||
+ */
|
||||
+const char *rhel_old_machine_deprecation =
|
||||
+ "machine types for previous major releases are deprecated";
|
||||
+
|
||||
/*
|
||||
* Mostly the same as hw_compat_6_0 and hw_compat_6_1
|
||||
*/
|
||||
diff --git a/hw/s390x/s390-virtio-ccw.c b/hw/s390x/s390-virtio-ccw.c
|
||||
index 653587ea62..4af14cb9ca 100644
|
||||
index 90480e7cf9..ec4176a1e0 100644
|
||||
--- a/hw/s390x/s390-virtio-ccw.c
|
||||
+++ b/hw/s390x/s390-virtio-ccw.c
|
||||
@@ -767,7 +767,7 @@ bool css_migration_enabled(void)
|
||||
@ -35,24 +59,61 @@ index 653587ea62..4af14cb9ca 100644
|
||||
type_init(ccw_machine_register_##suffix)
|
||||
|
||||
+#if 0 /* Disabled for Red Hat Enterprise Linux */
|
||||
static void ccw_machine_6_2_instance_options(MachineState *machine)
|
||||
static void ccw_machine_7_0_instance_options(MachineState *machine)
|
||||
{
|
||||
}
|
||||
@@ -1100,6 +1101,70 @@ static void ccw_machine_2_4_class_options(MachineClass *mc)
|
||||
@@ -1115,6 +1116,107 @@ static void ccw_machine_2_4_class_options(MachineClass *mc)
|
||||
compat_props_add(mc->compat_props, compat, G_N_ELEMENTS(compat));
|
||||
}
|
||||
DEFINE_CCW_MACHINE(2_4, "2.4", false);
|
||||
+#endif
|
||||
+
|
||||
+static void ccw_machine_rhel900_instance_options(MachineState *machine)
|
||||
+{
|
||||
+}
|
||||
+
|
||||
+static void ccw_machine_rhel900_class_options(MachineClass *mc)
|
||||
+{
|
||||
+}
|
||||
+DEFINE_CCW_MACHINE(rhel900, "rhel9.0.0", true);
|
||||
+
|
||||
+static void ccw_machine_rhel860_instance_options(MachineState *machine)
|
||||
+{
|
||||
+ /* Note: The -rhel8.6.0 and -rhel9.0.0 machines are technically identical */
|
||||
+ ccw_machine_rhel900_instance_options(machine);
|
||||
+}
|
||||
+
|
||||
+static void ccw_machine_rhel860_class_options(MachineClass *mc)
|
||||
+{
|
||||
+ ccw_machine_rhel900_class_options(mc);
|
||||
+
|
||||
+ /* All RHEL machines for prior major releases are deprecated */
|
||||
+ mc->deprecation_reason = rhel_old_machine_deprecation;
|
||||
+}
|
||||
+DEFINE_CCW_MACHINE(rhel860, "rhel8.6.0", false);
|
||||
+
|
||||
+static void ccw_machine_rhel850_instance_options(MachineState *machine)
|
||||
+{
|
||||
+ static const S390FeatInit qemu_cpu_feat = { S390_FEAT_LIST_QEMU_V6_0 };
|
||||
+
|
||||
+ ccw_machine_rhel860_instance_options(machine);
|
||||
+
|
||||
+ s390_set_qemu_cpu_model(0x2964, 13, 2, qemu_cpu_feat);
|
||||
+
|
||||
+ s390_cpudef_featoff_greater(16, 1, S390_FEAT_NNPA);
|
||||
+ s390_cpudef_featoff_greater(16, 1, S390_FEAT_VECTOR_PACKED_DECIMAL_ENH2);
|
||||
+ s390_cpudef_featoff_greater(16, 1, S390_FEAT_BEAR_ENH);
|
||||
+ s390_cpudef_featoff_greater(16, 1, S390_FEAT_RDP);
|
||||
+ s390_cpudef_featoff_greater(16, 1, S390_FEAT_PAI);
|
||||
+}
|
||||
+
|
||||
+static void ccw_machine_rhel850_class_options(MachineClass *mc)
|
||||
+{
|
||||
+ ccw_machine_rhel860_class_options(mc);
|
||||
+ compat_props_add(mc->compat_props, hw_compat_rhel_8_5, hw_compat_rhel_8_5_len);
|
||||
+ mc->smp_props.prefer_sockets = true;
|
||||
+}
|
||||
+DEFINE_CCW_MACHINE(rhel850, "rhel8.5.0", true);
|
||||
+DEFINE_CCW_MACHINE(rhel850, "rhel8.5.0", false);
|
||||
+
|
||||
+static void ccw_machine_rhel840_instance_options(MachineState *machine)
|
||||
+{
|
||||
@ -109,6 +170,17 @@ index 653587ea62..4af14cb9ca 100644
|
||||
|
||||
static void ccw_machine_register_types(void)
|
||||
{
|
||||
diff --git a/include/hw/boards.h b/include/hw/boards.h
|
||||
index c90a19b4d1..bf59275f18 100644
|
||||
--- a/include/hw/boards.h
|
||||
+++ b/include/hw/boards.h
|
||||
@@ -470,4 +470,6 @@ extern const size_t hw_compat_rhel_8_0_len;
|
||||
extern GlobalProperty hw_compat_rhel_7_6[];
|
||||
extern const size_t hw_compat_rhel_7_6_len;
|
||||
|
||||
+extern const char *rhel_old_machine_deprecation;
|
||||
+
|
||||
#endif
|
||||
--
|
||||
2.27.0
|
||||
2.31.1
|
||||
|
@ -1,4 +1,4 @@
|
||||
From afe0cbc5cdb98998b37cf48e9a1c87a110d9fbb3 Mon Sep 17 00:00:00 2001
|
||||
From 427a575ca57966bc72e1ebf218081da530d435d7 Mon Sep 17 00:00:00 2001
|
||||
From: Miroslav Rezanina <mrezanin@redhat.com>
|
||||
Date: Fri, 19 Oct 2018 13:10:31 +0200
|
||||
Subject: Add x86_64 machine types
|
||||
@ -10,6 +10,9 @@ Signed-off-by: Miroslav Rezanina <mrezanin@redhat.com>
|
||||
Rebase notes (6.1.0):
|
||||
- Update qemu64 cpu spec
|
||||
|
||||
Rebase notes (7.0.0):
|
||||
- Reset alias for all machine-types except latest one
|
||||
|
||||
Merged patches (6.1.0):
|
||||
- 59c284ad3b x86: Add x86 rhel8.5 machine types
|
||||
- a8868b42fe redhat: x86: Enable 'kvm-asyncpf-int' by default
|
||||
@ -19,22 +22,54 @@ Merged patches (6.1.0):
|
||||
- 0215eb3356 Remove RHEL 7.3.0 machine types (only x86_64 changes)
|
||||
- af69d1ca6e Remove RHEL 7.4.0 machine types (only x86_64 changes)
|
||||
- 8f7a74ab78 Remove RHEL 7.5.0 machine types (only x86_64 changes)
|
||||
|
||||
Merged patches (7.0.0):
|
||||
- eae7d8dd3c x86/rhel machine types: Add pc_rhel_8_5_compat
|
||||
- 6762f56469 x86/rhel machine types: Wire compat into q35 and i440fx
|
||||
- 5762101438 rhel machine types/x86: set prefer_sockets
|
||||
- 9ba9ddc632 x86: Add q35 RHEL 8.6.0 machine type
|
||||
- 6110d865e5 x86: Add q35 RHEL 9.0.0 machine type
|
||||
- dcc64971bf RHEL: mark old machine types as deprecated (partialy)
|
||||
- 6b396f182b RHEL: disable "seqpacket" for "vhost-vsock-device" in rhel8.6.0
|
||||
---
|
||||
hw/i386/pc.c | 114 +++++++++++++++++++++++-
|
||||
hw/i386/pc_piix.c | 68 +++++++++++++-
|
||||
hw/i386/pc_q35.c | 177 ++++++++++++++++++++++++++++++++++++-
|
||||
include/hw/boards.h | 2 +
|
||||
include/hw/i386/pc.h | 21 +++++
|
||||
hw/core/machine.c | 10 ++
|
||||
hw/i386/pc.c | 135 +++++++++++++++++++++-
|
||||
hw/i386/pc_piix.c | 79 ++++++++++++-
|
||||
hw/i386/pc_q35.c | 227 ++++++++++++++++++++++++++++++++++++-
|
||||
hw/s390x/s390-virtio-ccw.c | 1 +
|
||||
include/hw/boards.h | 5 +
|
||||
include/hw/i386/pc.h | 24 ++++
|
||||
target/i386/kvm/kvm-cpu.c | 1 +
|
||||
target/i386/kvm/kvm.c | 4 +
|
||||
tests/qtest/pvpanic-test.c | 5 +-
|
||||
8 files changed, 385 insertions(+), 7 deletions(-)
|
||||
10 files changed, 484 insertions(+), 7 deletions(-)
|
||||
|
||||
diff --git a/hw/core/machine.c b/hw/core/machine.c
|
||||
index 77202a3570..28989b6e7b 100644
|
||||
--- a/hw/core/machine.c
|
||||
+++ b/hw/core/machine.c
|
||||
@@ -43,6 +43,16 @@
|
||||
const char *rhel_old_machine_deprecation =
|
||||
"machine types for previous major releases are deprecated";
|
||||
|
||||
+GlobalProperty hw_compat_rhel_8_6[] = {
|
||||
+ /* hw_compat_rhel_8_6 bz 2065589 */
|
||||
+ /*
|
||||
+ * vhost-vsock device in RHEL 8 kernels doesn't support seqpacket, so
|
||||
+ * we need do disable it downstream on the latest hw_compat_rhel_8.
|
||||
+ */
|
||||
+ { "vhost-vsock-device", "seqpacket", "off" },
|
||||
+};
|
||||
+const size_t hw_compat_rhel_8_6_len = G_N_ELEMENTS(hw_compat_rhel_8_6);
|
||||
+
|
||||
/*
|
||||
* Mostly the same as hw_compat_6_0 and hw_compat_6_1
|
||||
*/
|
||||
diff --git a/hw/i386/pc.c b/hw/i386/pc.c
|
||||
index a2ef40ecbc..b6d2db8d04 100644
|
||||
index fd55fc725c..263d882af6 100644
|
||||
--- a/hw/i386/pc.c
|
||||
+++ b/hw/i386/pc.c
|
||||
@@ -371,6 +371,116 @@ GlobalProperty pc_compat_1_4[] = {
|
||||
@@ -375,6 +375,137 @@ GlobalProperty pc_compat_1_4[] = {
|
||||
};
|
||||
const size_t pc_compat_1_4_len = G_N_ELEMENTS(pc_compat_1_4);
|
||||
|
||||
@ -54,6 +89,27 @@ index a2ef40ecbc..b6d2db8d04 100644
|
||||
+};
|
||||
+const size_t pc_rhel_compat_len = G_N_ELEMENTS(pc_rhel_compat);
|
||||
+
|
||||
+GlobalProperty pc_rhel_8_5_compat[] = {
|
||||
+ /* pc_rhel_8_5_compat from pc_compat_6_0 */
|
||||
+ { "qemu64" "-" TYPE_X86_CPU, "family", "6" },
|
||||
+ /* pc_rhel_8_5_compat from pc_compat_6_0 */
|
||||
+ { "qemu64" "-" TYPE_X86_CPU, "model", "6" },
|
||||
+ /* pc_rhel_8_5_compat from pc_compat_6_0 */
|
||||
+ { "qemu64" "-" TYPE_X86_CPU, "stepping", "3" },
|
||||
+ /* pc_rhel_8_5_compat from pc_compat_6_0 */
|
||||
+ { TYPE_X86_CPU, "x-vendor-cpuid-only", "off" },
|
||||
+ /* pc_rhel_8_5_compat from pc_compat_6_0 */
|
||||
+ { "ICH9-LPC", ACPI_PM_PROP_ACPI_PCIHP_BRIDGE, "off" },
|
||||
+
|
||||
+ /* pc_rhel_8_5_compat from pc_compat_6_1 */
|
||||
+ { TYPE_X86_CPU, "hv-version-id-build", "0x1bbc" },
|
||||
+ /* pc_rhel_8_5_compat from pc_compat_6_1 */
|
||||
+ { TYPE_X86_CPU, "hv-version-id-major", "0x0006" },
|
||||
+ /* pc_rhel_8_5_compat from pc_compat_6_1 */
|
||||
+ { TYPE_X86_CPU, "hv-version-id-minor", "0x0001" },
|
||||
+};
|
||||
+const size_t pc_rhel_8_5_compat_len = G_N_ELEMENTS(pc_rhel_8_5_compat);
|
||||
+
|
||||
+GlobalProperty pc_rhel_8_4_compat[] = {
|
||||
+ /* pc_rhel_8_4_compat from pc_compat_5_2 */
|
||||
+ { "ICH9-LPC", "x-smi-cpu-hotunplug", "off" },
|
||||
@ -151,7 +207,7 @@ index a2ef40ecbc..b6d2db8d04 100644
|
||||
GSIState *pc_gsi_create(qemu_irq **irqs, bool pci_enabled)
|
||||
{
|
||||
GSIState *s;
|
||||
@@ -1694,6 +1804,7 @@ static void pc_machine_class_init(ObjectClass *oc, void *data)
|
||||
@@ -1738,6 +1869,7 @@ static void pc_machine_class_init(ObjectClass *oc, void *data)
|
||||
pcmc->pvh_enabled = true;
|
||||
pcmc->kvmclock_create_always = true;
|
||||
assert(!mc->get_hotplug_handler);
|
||||
@ -159,7 +215,7 @@ index a2ef40ecbc..b6d2db8d04 100644
|
||||
mc->get_hotplug_handler = pc_get_hotplug_handler;
|
||||
mc->hotplug_allowed = pc_hotplug_allowed;
|
||||
mc->cpu_index_to_instance_props = x86_cpu_index_to_props;
|
||||
@@ -1704,7 +1815,8 @@ static void pc_machine_class_init(ObjectClass *oc, void *data)
|
||||
@@ -1748,7 +1880,8 @@ static void pc_machine_class_init(ObjectClass *oc, void *data)
|
||||
mc->has_hotpluggable_cpus = true;
|
||||
mc->default_boot_order = "cad";
|
||||
mc->block_default_type = IF_IDE;
|
||||
@ -170,7 +226,7 @@ index a2ef40ecbc..b6d2db8d04 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 dda3f64f19..dabc6c1933 100644
|
||||
index c797e98312..0cacc0d623 100644
|
||||
--- a/hw/i386/pc_piix.c
|
||||
+++ b/hw/i386/pc_piix.c
|
||||
@@ -50,6 +50,7 @@
|
||||
@ -200,7 +256,7 @@ index dda3f64f19..dabc6c1933 100644
|
||||
static void pc_compat_2_3_fn(MachineState *machine)
|
||||
{
|
||||
X86MachineState *x86ms = X86_MACHINE(machine);
|
||||
@@ -951,3 +953,65 @@ static void xenfv_3_1_machine_options(MachineClass *m)
|
||||
@@ -967,3 +969,76 @@ static void xenfv_3_1_machine_options(MachineClass *m)
|
||||
DEFINE_PC_MACHINE(xenfv, "xenfv-3.1", pc_xen_hvm_init,
|
||||
xenfv_3_1_machine_options);
|
||||
#endif
|
||||
@ -224,6 +280,7 @@ index dda3f64f19..dabc6c1933 100644
|
||||
+ compat_props_add(m->compat_props, pc_rhel_compat, pc_rhel_compat_len);
|
||||
+ m->alias = "pc";
|
||||
+ m->is_default = 1;
|
||||
+ m->smp_props.prefer_sockets = true;
|
||||
+}
|
||||
+
|
||||
+static void pc_init_rhel760(MachineState *machine)
|
||||
@ -239,11 +296,21 @@ index dda3f64f19..dabc6c1933 100644
|
||||
+ m->desc = "RHEL 7.6.0 PC (i440FX + PIIX, 1996)";
|
||||
+ m->async_pf_vmexit_disable = true;
|
||||
+ m->smbus_no_migration_support = true;
|
||||
+
|
||||
+ /* All RHEL machines for prior major releases are deprecated */
|
||||
+ m->deprecation_reason = rhel_old_machine_deprecation;
|
||||
+
|
||||
+ pcmc->pvh_enabled = false;
|
||||
+ pcmc->default_cpu_version = CPU_VERSION_LEGACY;
|
||||
+ pcmc->kvmclock_create_always = false;
|
||||
+ /* From pc_i440fx_5_1_machine_options() */
|
||||
+ pcmc->pci_root_uid = 1;
|
||||
+ compat_props_add(m->compat_props, hw_compat_rhel_8_6,
|
||||
+ hw_compat_rhel_8_6_len);
|
||||
+ compat_props_add(m->compat_props, hw_compat_rhel_8_5,
|
||||
+ hw_compat_rhel_8_5_len);
|
||||
+ compat_props_add(m->compat_props, pc_rhel_8_5_compat,
|
||||
+ pc_rhel_8_5_compat_len);
|
||||
+ compat_props_add(m->compat_props, hw_compat_rhel_8_4,
|
||||
+ hw_compat_rhel_8_4_len);
|
||||
+ compat_props_add(m->compat_props, pc_rhel_8_4_compat,
|
||||
@ -267,7 +334,7 @@ index dda3f64f19..dabc6c1933 100644
|
||||
+DEFINE_PC_MACHINE(rhel760, "pc-i440fx-rhel7.6.0", pc_init_rhel760,
|
||||
+ pc_machine_rhel760_options);
|
||||
diff --git a/hw/i386/pc_q35.c b/hw/i386/pc_q35.c
|
||||
index 235054a643..04c911da18 100644
|
||||
index b695f88c45..157160e069 100644
|
||||
--- a/hw/i386/pc_q35.c
|
||||
+++ b/hw/i386/pc_q35.c
|
||||
@@ -197,8 +197,8 @@ static void pc_q35_init(MachineState *machine)
|
||||
@ -289,7 +356,7 @@ index 235054a643..04c911da18 100644
|
||||
static void pc_q35_machine_options(MachineClass *m)
|
||||
{
|
||||
PCMachineClass *pcmc = PC_MACHINE_CLASS(m);
|
||||
@@ -620,3 +621,175 @@ static void pc_q35_2_4_machine_options(MachineClass *m)
|
||||
@@ -631,3 +632,225 @@ static void pc_q35_2_4_machine_options(MachineClass *m)
|
||||
|
||||
DEFINE_Q35_MACHINE(v2_4, "pc-q35-2.4", NULL,
|
||||
pc_q35_2_4_machine_options);
|
||||
@ -318,6 +385,48 @@ index 235054a643..04c911da18 100644
|
||||
+ compat_props_add(m->compat_props, pc_rhel_compat, pc_rhel_compat_len);
|
||||
+}
|
||||
+
|
||||
+static void pc_q35_init_rhel900(MachineState *machine)
|
||||
+{
|
||||
+ pc_q35_init(machine);
|
||||
+}
|
||||
+
|
||||
+static void pc_q35_machine_rhel900_options(MachineClass *m)
|
||||
+{
|
||||
+ PCMachineClass *pcmc = PC_MACHINE_CLASS(m);
|
||||
+ pc_q35_machine_rhel_options(m);
|
||||
+ m->desc = "RHEL-9.0.0 PC (Q35 + ICH9, 2009)";
|
||||
+ pcmc->smbios_stream_product = "RHEL";
|
||||
+ pcmc->smbios_stream_version = "9.0.0";
|
||||
+}
|
||||
+
|
||||
+DEFINE_PC_MACHINE(q35_rhel900, "pc-q35-rhel9.0.0", pc_q35_init_rhel900,
|
||||
+ pc_q35_machine_rhel900_options);
|
||||
+
|
||||
+static void pc_q35_init_rhel860(MachineState *machine)
|
||||
+{
|
||||
+ pc_q35_init(machine);
|
||||
+}
|
||||
+
|
||||
+static void pc_q35_machine_rhel860_options(MachineClass *m)
|
||||
+{
|
||||
+ PCMachineClass *pcmc = PC_MACHINE_CLASS(m);
|
||||
+ pc_q35_machine_rhel900_options(m);
|
||||
+ m->desc = "RHEL-8.6.0 PC (Q35 + ICH9, 2009)";
|
||||
+ m->alias = NULL;
|
||||
+
|
||||
+ /* All RHEL machines for prior major releases are deprecated */
|
||||
+ m->deprecation_reason = rhel_old_machine_deprecation;
|
||||
+
|
||||
+ pcmc->smbios_stream_product = "RHEL-AV";
|
||||
+ pcmc->smbios_stream_version = "8.6.0";
|
||||
+ compat_props_add(m->compat_props, hw_compat_rhel_8_6,
|
||||
+ hw_compat_rhel_8_6_len);
|
||||
+}
|
||||
+
|
||||
+DEFINE_PC_MACHINE(q35_rhel860, "pc-q35-rhel8.6.0", pc_q35_init_rhel860,
|
||||
+ pc_q35_machine_rhel860_options);
|
||||
+
|
||||
+
|
||||
+static void pc_q35_init_rhel850(MachineState *machine)
|
||||
+{
|
||||
+ pc_q35_init(machine);
|
||||
@ -326,10 +435,16 @@ index 235054a643..04c911da18 100644
|
||||
+static void pc_q35_machine_rhel850_options(MachineClass *m)
|
||||
+{
|
||||
+ PCMachineClass *pcmc = PC_MACHINE_CLASS(m);
|
||||
+ pc_q35_machine_rhel_options(m);
|
||||
+ pc_q35_machine_rhel860_options(m);
|
||||
+ m->desc = "RHEL-8.5.0 PC (Q35 + ICH9, 2009)";
|
||||
+ m->alias = NULL;
|
||||
+ pcmc->smbios_stream_product = "RHEL-AV";
|
||||
+ pcmc->smbios_stream_version = "8.5.0";
|
||||
+ compat_props_add(m->compat_props, hw_compat_rhel_8_5,
|
||||
+ hw_compat_rhel_8_5_len);
|
||||
+ compat_props_add(m->compat_props, pc_rhel_8_5_compat,
|
||||
+ pc_rhel_8_5_compat_len);
|
||||
+ m->smp_props.prefer_sockets = true;
|
||||
+}
|
||||
+
|
||||
+DEFINE_PC_MACHINE(q35_rhel850, "pc-q35-rhel8.5.0", pc_q35_init_rhel850,
|
||||
@ -369,6 +484,7 @@ index 235054a643..04c911da18 100644
|
||||
+ PCMachineClass *pcmc = PC_MACHINE_CLASS(m);
|
||||
+ pc_q35_machine_rhel840_options(m);
|
||||
+ m->desc = "RHEL-8.3.0 PC (Q35 + ICH9, 2009)";
|
||||
+ m->alias = NULL;
|
||||
+ pcmc->smbios_stream_product = "RHEL-AV";
|
||||
+ pcmc->smbios_stream_version = "8.3.0";
|
||||
+ compat_props_add(m->compat_props, hw_compat_rhel_8_3,
|
||||
@ -394,6 +510,7 @@ index 235054a643..04c911da18 100644
|
||||
+ PCMachineClass *pcmc = PC_MACHINE_CLASS(m);
|
||||
+ pc_q35_machine_rhel830_options(m);
|
||||
+ m->desc = "RHEL-8.2.0 PC (Q35 + ICH9, 2009)";
|
||||
+ m->alias = NULL;
|
||||
+ m->numa_mem_supported = true;
|
||||
+ m->auto_enable_numa_with_memdev = false;
|
||||
+ pcmc->smbios_stream_product = "RHEL-AV";
|
||||
@ -465,11 +582,23 @@ index 235054a643..04c911da18 100644
|
||||
+
|
||||
+DEFINE_PC_MACHINE(q35_rhel760, "pc-q35-rhel7.6.0", pc_q35_init_rhel760,
|
||||
+ pc_q35_machine_rhel760_options);
|
||||
diff --git a/hw/s390x/s390-virtio-ccw.c b/hw/s390x/s390-virtio-ccw.c
|
||||
index ec4176a1e0..465a2a09d2 100644
|
||||
--- a/hw/s390x/s390-virtio-ccw.c
|
||||
+++ b/hw/s390x/s390-virtio-ccw.c
|
||||
@@ -1136,6 +1136,7 @@ static void ccw_machine_rhel860_instance_options(MachineState *machine)
|
||||
static void ccw_machine_rhel860_class_options(MachineClass *mc)
|
||||
{
|
||||
ccw_machine_rhel900_class_options(mc);
|
||||
+ compat_props_add(mc->compat_props, hw_compat_rhel_8_6, hw_compat_rhel_8_6_len);
|
||||
|
||||
/* All RHEL machines for prior major releases are deprecated */
|
||||
mc->deprecation_reason = rhel_old_machine_deprecation;
|
||||
diff --git a/include/hw/boards.h b/include/hw/boards.h
|
||||
index b0a6e05b48..3c3d2ad450 100644
|
||||
index bf59275f18..d1555665df 100644
|
||||
--- a/include/hw/boards.h
|
||||
+++ b/include/hw/boards.h
|
||||
@@ -263,6 +263,8 @@ struct MachineClass {
|
||||
@@ -266,6 +266,8 @@ struct MachineClass {
|
||||
strList *allowed_dynamic_sysbus_devices;
|
||||
bool auto_enable_numa_with_memhp;
|
||||
bool auto_enable_numa_with_memdev;
|
||||
@ -478,17 +607,30 @@ index b0a6e05b48..3c3d2ad450 100644
|
||||
bool ignore_boot_device_suffixes;
|
||||
bool smbus_no_migration_support;
|
||||
bool nvdimm_supported;
|
||||
@@ -449,6 +451,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_8_6[];
|
||||
+extern const size_t hw_compat_rhel_8_6_len;
|
||||
+
|
||||
extern GlobalProperty hw_compat_rhel_8_5[];
|
||||
extern const size_t hw_compat_rhel_8_5_len;
|
||||
|
||||
diff --git a/include/hw/i386/pc.h b/include/hw/i386/pc.h
|
||||
index 7ccc9a1a07..9689a58b14 100644
|
||||
index 91331059d9..419a6ec24b 100644
|
||||
--- a/include/hw/i386/pc.h
|
||||
+++ b/include/hw/i386/pc.h
|
||||
@@ -280,6 +280,27 @@ extern const size_t pc_compat_1_5_len;
|
||||
@@ -289,6 +289,30 @@ extern const size_t pc_compat_1_5_len;
|
||||
extern GlobalProperty pc_compat_1_4[];
|
||||
extern const size_t pc_compat_1_4_len;
|
||||
|
||||
+extern GlobalProperty pc_rhel_compat[];
|
||||
+extern const size_t pc_rhel_compat_len;
|
||||
+
|
||||
+extern GlobalProperty pc_rhel_8_5_compat[];
|
||||
+extern const size_t pc_rhel_8_5_compat_len;
|
||||
+
|
||||
+extern GlobalProperty pc_rhel_8_4_compat[];
|
||||
+extern const size_t pc_rhel_8_4_compat_len;
|
||||
+
|
||||
@ -511,10 +653,10 @@ index 7ccc9a1a07..9689a58b14 100644
|
||||
* depending on QEMU versions up to QEMU 2.4.
|
||||
*/
|
||||
diff --git a/target/i386/kvm/kvm-cpu.c b/target/i386/kvm/kvm-cpu.c
|
||||
index d95028018e..7b004065ae 100644
|
||||
index 5eb955ce9a..74c1396a93 100644
|
||||
--- a/target/i386/kvm/kvm-cpu.c
|
||||
+++ b/target/i386/kvm/kvm-cpu.c
|
||||
@@ -131,6 +131,7 @@ static PropValue kvm_default_props[] = {
|
||||
@@ -137,6 +137,7 @@ static PropValue kvm_default_props[] = {
|
||||
{ "acpi", "off" },
|
||||
{ "monitor", "off" },
|
||||
{ "svm", "off" },
|
||||
@ -523,10 +665,10 @@ index d95028018e..7b004065ae 100644
|
||||
};
|
||||
|
||||
diff --git a/target/i386/kvm/kvm.c b/target/i386/kvm/kvm.c
|
||||
index 5a698bde19..a668f521ac 100644
|
||||
index 9cf8e03669..6d1e009443 100644
|
||||
--- a/target/i386/kvm/kvm.c
|
||||
+++ b/target/i386/kvm/kvm.c
|
||||
@@ -3336,6 +3336,7 @@ static int kvm_get_msrs(X86CPU *cpu)
|
||||
@@ -3488,6 +3488,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;
|
||||
@ -534,7 +676,7 @@ index 5a698bde19..a668f521ac 100644
|
||||
|
||||
kvm_msr_buf_reset(cpu);
|
||||
|
||||
@@ -3665,6 +3666,9 @@ static int kvm_get_msrs(X86CPU *cpu)
|
||||
@@ -3822,6 +3823,9 @@ static int kvm_get_msrs(X86CPU *cpu)
|
||||
break;
|
||||
case MSR_KVM_ASYNC_PF_EN:
|
||||
env->async_pf_en_msr = msrs[i].data;
|
||||
@ -568,5 +710,5 @@ index 6dcad2db49..580c2c43d2 100644
|
||||
val = qtest_inb(qts, 0x505);
|
||||
g_assert_cmpuint(val, ==, 3);
|
||||
--
|
||||
2.27.0
|
||||
2.31.1
|
||||
|
186
SOURCES/0011-Enable-make-check.patch
Normal file
186
SOURCES/0011-Enable-make-check.patch
Normal file
@ -0,0 +1,186 @@
|
||||
From 5e419e5e0a721bdbbfa6d9b82c8be5c5b3d26a01 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
|
||||
|
||||
Fixing tests after device disabling and machine types changes and enabling
|
||||
make check run during build.
|
||||
|
||||
Signed-off-by: Miroslav Rezanina <mrezanin@redhat.com>
|
||||
---
|
||||
Rebase changes (6.1.0):
|
||||
- removed unnecessary test changes
|
||||
|
||||
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
|
||||
|
||||
Merged patches (6.1.0):
|
||||
- 2f129df7d3 redhat: Enable the 'test-block-iothread' test again
|
||||
---
|
||||
.distro/qemu-kvm.spec.template | 5 ++---
|
||||
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 | 4 ----
|
||||
tests/qtest/usb-hcd-xhci-test.c | 4 ++++
|
||||
tests/qtest/virtio-net-failover.c | 1 +
|
||||
9 files changed, 12 insertions(+), 12 deletions(-)
|
||||
|
||||
diff --git a/tests/qtest/fuzz-e1000e-test.c b/tests/qtest/fuzz-e1000e-test.c
|
||||
index 66229e6096..947fba73b7 100644
|
||||
--- a/tests/qtest/fuzz-e1000e-test.c
|
||||
+++ b/tests/qtest/fuzz-e1000e-test.c
|
||||
@@ -17,7 +17,7 @@ static void test_lp1879531_eth_get_rss_ex_dst_addr(void)
|
||||
{
|
||||
QTestState *s;
|
||||
|
||||
- s = qtest_init("-nographic -monitor none -serial none -M pc-q35-5.0");
|
||||
+ s = qtest_init("-nographic -monitor none -serial none -M pc-q35-rhel8.4.0");
|
||||
|
||||
qtest_outl(s, 0xcf8, 0x80001010);
|
||||
qtest_outl(s, 0xcfc, 0xe1020000);
|
||||
diff --git a/tests/qtest/fuzz-virtio-scsi-test.c b/tests/qtest/fuzz-virtio-scsi-test.c
|
||||
index aaf6d10e18..43727d62ac 100644
|
||||
--- a/tests/qtest/fuzz-virtio-scsi-test.c
|
||||
+++ b/tests/qtest/fuzz-virtio-scsi-test.c
|
||||
@@ -19,7 +19,7 @@ static void test_mmio_oob_from_memory_region_cache(void)
|
||||
{
|
||||
QTestState *s;
|
||||
|
||||
- s = qtest_init("-M pc-q35-5.2 -display none -m 512M "
|
||||
+ s = qtest_init("-M pc-q35-rhel8.4.0 -display none -m 512M "
|
||||
"-device virtio-scsi,num_queues=8,addr=03.0 ");
|
||||
|
||||
qtest_outl(s, 0xcf8, 0x80001811);
|
||||
diff --git a/tests/qtest/intel-hda-test.c b/tests/qtest/intel-hda-test.c
|
||||
index a58c98e4d1..c8387e39ce 100644
|
||||
--- a/tests/qtest/intel-hda-test.c
|
||||
+++ b/tests/qtest/intel-hda-test.c
|
||||
@@ -38,7 +38,7 @@ static void test_issue542_ich6(void)
|
||||
{
|
||||
QTestState *s;
|
||||
|
||||
- s = qtest_init("-nographic -nodefaults -M pc-q35-6.2 "
|
||||
+ s = qtest_init("-nographic -nodefaults -M pc-q35-rhel9.0.0 "
|
||||
"-device intel-hda,id=" HDA_ID CODEC_DEVICES);
|
||||
|
||||
qtest_outl(s, 0xcf8, 0x80000804);
|
||||
diff --git a/tests/qtest/libqos/meson.build b/tests/qtest/libqos/meson.build
|
||||
index e988d15791..46f7dcb81a 100644
|
||||
--- a/tests/qtest/libqos/meson.build
|
||||
+++ b/tests/qtest/libqos/meson.build
|
||||
@@ -41,7 +41,7 @@ libqos_srcs = files('../libqtest.c',
|
||||
'virtio-rng.c',
|
||||
'virtio-scsi.c',
|
||||
'virtio-serial.c',
|
||||
- 'virtio-iommu.c',
|
||||
+# 'virtio-iommu.c',
|
||||
|
||||
# qgraph machines:
|
||||
'aarch64-xlnx-zcu102-machine.c',
|
||||
diff --git a/tests/qtest/lpc-ich9-test.c b/tests/qtest/lpc-ich9-test.c
|
||||
index fe0bef9980..7a9d51579b 100644
|
||||
--- a/tests/qtest/lpc-ich9-test.c
|
||||
+++ b/tests/qtest/lpc-ich9-test.c
|
||||
@@ -15,7 +15,7 @@ static void test_lp1878642_pci_bus_get_irq_level_assert(void)
|
||||
{
|
||||
QTestState *s;
|
||||
|
||||
- s = qtest_init("-M pc-q35-5.0 "
|
||||
+ s = qtest_init("-M pc-q35-rhel8.4.0 "
|
||||
"-nographic -monitor none -serial none");
|
||||
|
||||
qtest_outl(s, 0xcf8, 0x8000f840); /* PMBASE */
|
||||
diff --git a/tests/qtest/meson.build b/tests/qtest/meson.build
|
||||
index d25f82bb5a..67cd32def1 100644
|
||||
--- a/tests/qtest/meson.build
|
||||
+++ b/tests/qtest/meson.build
|
||||
@@ -73,7 +73,6 @@ qtests_i386 = \
|
||||
config_all_devices.has_key('CONFIG_Q35') and \
|
||||
config_all_devices.has_key('CONFIG_VIRTIO_PCI') and \
|
||||
slirp.found() ? ['virtio-net-failover'] : []) + \
|
||||
- (unpack_edk2_blobs ? ['bios-tables-test'] : []) + \
|
||||
qtests_pci + \
|
||||
['fdc-test',
|
||||
'ide-test',
|
||||
@@ -86,7 +85,6 @@ qtests_i386 = \
|
||||
'drive_del-test',
|
||||
'tco-test',
|
||||
'cpu-plug-test',
|
||||
- 'q35-test',
|
||||
'vmgenid-test',
|
||||
'migration-test',
|
||||
'test-x86-cpuid-compat',
|
||||
@@ -216,7 +214,6 @@ qtests_arm = \
|
||||
|
||||
# TODO: once aarch64 TCG is fixed on ARM 32 bit host, make bios-tables-test unconditional
|
||||
qtests_aarch64 = \
|
||||
- (cpu != 'arm' and unpack_edk2_blobs ? ['bios-tables-test'] : []) + \
|
||||
(config_all_devices.has_key('CONFIG_TPM_TIS_SYSBUS') ? ['tpm-tis-device-test'] : []) + \
|
||||
(config_all_devices.has_key('CONFIG_TPM_TIS_SYSBUS') ? ['tpm-tis-device-swtpm-test'] : []) + \
|
||||
(config_all_devices.has_key('CONFIG_XLNX_ZYNQMP_ARM') ? ['xlnx-can-test', 'fuzz-xlnx-dp-test'] : []) + \
|
||||
@@ -231,7 +228,6 @@ qtests_s390x = \
|
||||
(config_host.has_key('CONFIG_POSIX') ? ['test-filter-redirector'] : []) + \
|
||||
['boot-serial-test',
|
||||
'drive_del-test',
|
||||
- 'device-plug-test',
|
||||
'virtio-ccw-test',
|
||||
'cpu-plug-test',
|
||||
'migration-test']
|
||||
diff --git a/tests/qtest/usb-hcd-xhci-test.c b/tests/qtest/usb-hcd-xhci-test.c
|
||||
index 10ef9d2a91..3855873050 100644
|
||||
--- a/tests/qtest/usb-hcd-xhci-test.c
|
||||
+++ b/tests/qtest/usb-hcd-xhci-test.c
|
||||
@@ -21,6 +21,7 @@ static void test_xhci_hotplug(void)
|
||||
usb_test_hotplug(global_qtest, "xhci", "1", NULL);
|
||||
}
|
||||
|
||||
+#if 0 /* Disabled for Red Hat Enterprise Linux */
|
||||
static void test_usb_uas_hotplug(void)
|
||||
{
|
||||
QTestState *qts = global_qtest;
|
||||
@@ -36,6 +37,7 @@ static void test_usb_uas_hotplug(void)
|
||||
qtest_qmp_device_del(qts, "scsihd");
|
||||
qtest_qmp_device_del(qts, "uas");
|
||||
}
|
||||
+#endif
|
||||
|
||||
static void test_usb_ccid_hotplug(void)
|
||||
{
|
||||
@@ -56,7 +58,9 @@ int main(int argc, char **argv)
|
||||
|
||||
qtest_add_func("/xhci/pci/init", test_xhci_init);
|
||||
qtest_add_func("/xhci/pci/hotplug", test_xhci_hotplug);
|
||||
+#if 0 /* Disabled for Red Hat Enterprise Linux */
|
||||
qtest_add_func("/xhci/pci/hotplug/usb-uas", test_usb_uas_hotplug);
|
||||
+#endif
|
||||
qtest_add_func("/xhci/pci/hotplug/usb-ccid", test_usb_ccid_hotplug);
|
||||
|
||||
qtest_start("-device nec-usb-xhci,id=xhci"
|
||||
diff --git a/tests/qtest/virtio-net-failover.c b/tests/qtest/virtio-net-failover.c
|
||||
index 78811f1c92..44de8af00c 100644
|
||||
--- a/tests/qtest/virtio-net-failover.c
|
||||
+++ b/tests/qtest/virtio-net-failover.c
|
||||
@@ -25,6 +25,7 @@
|
||||
#define PCI_SEL_BASE 0x0010
|
||||
|
||||
#define BASE_MACHINE "-M q35 -nodefaults " \
|
||||
+ "-global ICH9-LPC.acpi-pci-hotplug-with-bridge-support=on " \
|
||||
"-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.31.1
|
||||
|
@ -1,376 +0,0 @@
|
||||
From b071f3eaa77dde1567d70b43d0b2975efe380da2 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
|
||||
|
||||
Fixing tests after device disabling and machine types changes and enabling
|
||||
make check run during build.
|
||||
|
||||
Signed-off-by: Miroslav Rezanina <mrezanin@redhat.com>
|
||||
---
|
||||
Rebase changes (6.1.0):
|
||||
- removed unnecessary test changes
|
||||
|
||||
Rebase changes (6.2.0 RC0):
|
||||
- new way of disabling bios-table-test
|
||||
|
||||
Merged patches (6.1.0):
|
||||
- 2f129df7d3 redhat: Enable the 'test-block-iothread' test again
|
||||
---
|
||||
.distro/qemu-kvm.spec.template | 5 ++---
|
||||
tests/qemu-iotests/051 | 8 ++++----
|
||||
tests/qtest/bios-tables-test.c | 6 +++---
|
||||
tests/qtest/boot-serial-test.c | 6 +++++-
|
||||
tests/qtest/cdrom-test.c | 4 ++++
|
||||
tests/qtest/cpu-plug-test.c | 4 ++--
|
||||
tests/qtest/fuzz-e1000e-test.c | 2 +-
|
||||
tests/qtest/fuzz-virtio-scsi-test.c | 2 +-
|
||||
tests/qtest/hd-geo-test.c | 4 ++++
|
||||
tests/qtest/lpc-ich9-test.c | 2 +-
|
||||
tests/qtest/meson.build | 13 ++++---------
|
||||
tests/qtest/prom-env-test.c | 4 ++++
|
||||
tests/qtest/test-x86-cpuid-compat.c | 2 ++
|
||||
tests/qtest/usb-hcd-xhci-test.c | 4 ++++
|
||||
14 files changed, 41 insertions(+), 25 deletions(-)
|
||||
|
||||
diff --git a/tests/qemu-iotests/051 b/tests/qemu-iotests/051
|
||||
index 1d2fa93a11..c8a2815f54 100755
|
||||
--- a/tests/qemu-iotests/051
|
||||
+++ b/tests/qemu-iotests/051
|
||||
@@ -174,9 +174,9 @@ run_qemu -drive if=virtio
|
||||
case "$QEMU_DEFAULT_MACHINE" in
|
||||
pc)
|
||||
run_qemu -drive if=none,id=disk -device ide-cd,drive=disk
|
||||
- run_qemu -drive if=none,id=disk -device lsi53c895a -device scsi-cd,drive=disk
|
||||
+# run_qemu -drive if=none,id=disk -device lsi53c895a -device scsi-cd,drive=disk
|
||||
run_qemu -drive if=none,id=disk -device ide-hd,drive=disk
|
||||
- run_qemu -drive if=none,id=disk -device lsi53c895a -device scsi-hd,drive=disk
|
||||
+# run_qemu -drive if=none,id=disk -device lsi53c895a -device scsi-hd,drive=disk
|
||||
;;
|
||||
*)
|
||||
;;
|
||||
@@ -225,9 +225,9 @@ run_qemu -drive file="$TEST_IMG",if=virtio,readonly=on
|
||||
case "$QEMU_DEFAULT_MACHINE" in
|
||||
pc)
|
||||
run_qemu -drive file="$TEST_IMG",if=none,id=disk,readonly=on -device ide-cd,drive=disk
|
||||
- run_qemu -drive file="$TEST_IMG",if=none,id=disk,readonly=on -device lsi53c895a -device scsi-cd,drive=disk
|
||||
+# run_qemu -drive file="$TEST_IMG",if=none,id=disk,readonly=on -device lsi53c895a -device scsi-cd,drive=disk
|
||||
run_qemu -drive file="$TEST_IMG",if=none,id=disk,readonly=on -device ide-hd,drive=disk
|
||||
- run_qemu -drive file="$TEST_IMG",if=none,id=disk,readonly=on -device lsi53c895a -device scsi-hd,drive=disk
|
||||
+# run_qemu -drive file="$TEST_IMG",if=none,id=disk,readonly=on -device lsi53c895a -device scsi-hd,drive=disk
|
||||
;;
|
||||
*)
|
||||
;;
|
||||
diff --git a/tests/qtest/bios-tables-test.c b/tests/qtest/bios-tables-test.c
|
||||
index 258874167e..62745181a8 100644
|
||||
--- a/tests/qtest/bios-tables-test.c
|
||||
+++ b/tests/qtest/bios-tables-test.c
|
||||
@@ -1371,7 +1371,7 @@ static void test_acpi_virt_tcg_numamem(void)
|
||||
free_test_data(&data);
|
||||
|
||||
}
|
||||
-
|
||||
+#if 0 /* Disabled for Red Hat Enterprise Linux */
|
||||
static void test_acpi_virt_tcg_pxb(void)
|
||||
{
|
||||
test_data data = {
|
||||
@@ -1403,7 +1403,7 @@ static void test_acpi_virt_tcg_pxb(void)
|
||||
|
||||
free_test_data(&data);
|
||||
}
|
||||
-
|
||||
+#endif
|
||||
static void test_acpi_tcg_acpi_hmat(const char *machine)
|
||||
{
|
||||
test_data data;
|
||||
@@ -1644,7 +1644,7 @@ int main(int argc, char *argv[])
|
||||
qtest_add_func("acpi/virt", test_acpi_virt_tcg);
|
||||
qtest_add_func("acpi/virt/numamem", test_acpi_virt_tcg_numamem);
|
||||
qtest_add_func("acpi/virt/memhp", test_acpi_virt_tcg_memhp);
|
||||
- qtest_add_func("acpi/virt/pxb", test_acpi_virt_tcg_pxb);
|
||||
+/* qtest_add_func("acpi/virt/pxb", test_acpi_virt_tcg_pxb); */
|
||||
qtest_add_func("acpi/virt/oem-fields", test_acpi_oem_fields_virt);
|
||||
}
|
||||
}
|
||||
diff --git a/tests/qtest/boot-serial-test.c b/tests/qtest/boot-serial-test.c
|
||||
index 83828ba270..294476b959 100644
|
||||
--- a/tests/qtest/boot-serial-test.c
|
||||
+++ b/tests/qtest/boot-serial-test.c
|
||||
@@ -148,19 +148,23 @@ static testdef_t tests[] = {
|
||||
{ "ppc", "g3beige", "", "PowerPC,750" },
|
||||
{ "ppc", "mac99", "", "PowerPC,G4" },
|
||||
{ "ppc", "sam460ex", "-m 256", "DRAM: 256 MiB" },
|
||||
+#if 0 /* Disabled for Red Hat Enterprise Linux */
|
||||
{ "ppc64", "ppce500", "", "U-Boot" },
|
||||
{ "ppc64", "40p", "-m 192", "Memory: 192M" },
|
||||
{ "ppc64", "mac99", "", "PowerPC,970FX" },
|
||||
+#endif
|
||||
{ "ppc64", "pseries",
|
||||
"-machine " PSERIES_DEFAULT_CAPABILITIES,
|
||||
"Open Firmware" },
|
||||
+#if 0 /* Disabled for Red Hat Enterprise Linux */
|
||||
{ "ppc64", "powernv8", "", "OPAL" },
|
||||
{ "ppc64", "powernv9", "", "OPAL" },
|
||||
{ "ppc64", "sam460ex", "-device e1000", "8086 100e" },
|
||||
+#endif
|
||||
{ "i386", "isapc", "-cpu qemu32 -device sga", "SGABIOS" },
|
||||
{ "i386", "pc", "-device sga", "SGABIOS" },
|
||||
{ "i386", "q35", "-device sga", "SGABIOS" },
|
||||
- { "x86_64", "isapc", "-cpu qemu32 -device sga", "SGABIOS" },
|
||||
+ { "x86_64", "pc", "-cpu qemu32 -device sga", "SGABIOS" },
|
||||
{ "x86_64", "q35", "-device sga", "SGABIOS" },
|
||||
{ "sparc", "LX", "", "TMS390S10" },
|
||||
{ "sparc", "SS-4", "", "MB86904" },
|
||||
diff --git a/tests/qtest/cdrom-test.c b/tests/qtest/cdrom-test.c
|
||||
index 5af944a5fb..69d9bac38a 100644
|
||||
--- a/tests/qtest/cdrom-test.c
|
||||
+++ b/tests/qtest/cdrom-test.c
|
||||
@@ -140,6 +140,7 @@ static void add_x86_tests(void)
|
||||
qtest_add_data_func("cdrom/boot/isapc", "-M isapc "
|
||||
"-drive if=ide,media=cdrom,file=", test_cdboot);
|
||||
}
|
||||
+#if 0 /* Disabled for Red Hat Enterprise Linux */
|
||||
qtest_add_data_func("cdrom/boot/am53c974",
|
||||
"-device am53c974 -device scsi-cd,drive=cd1 "
|
||||
"-drive if=none,id=cd1,format=raw,file=", test_cdboot);
|
||||
@@ -155,6 +156,7 @@ static void add_x86_tests(void)
|
||||
qtest_add_data_func("cdrom/boot/megasas-gen2", "-M q35 "
|
||||
"-device megasas-gen2 -device scsi-cd,drive=cd1 "
|
||||
"-blockdev file,node-name=cd1,filename=", test_cdboot);
|
||||
+#endif
|
||||
}
|
||||
|
||||
static void add_s390x_tests(void)
|
||||
@@ -220,6 +222,7 @@ int main(int argc, char **argv)
|
||||
"magnum", "malta", "pica61", NULL
|
||||
};
|
||||
add_cdrom_param_tests(mips64machines);
|
||||
+#if 0 /* Disabled for Red Hat Enterprise Linux */
|
||||
} else if (g_str_equal(arch, "arm") || g_str_equal(arch, "aarch64")) {
|
||||
const char *armmachines[] = {
|
||||
"realview-eb", "realview-eb-mpcore", "realview-pb-a8",
|
||||
@@ -227,6 +230,7 @@ int main(int argc, char **argv)
|
||||
"vexpress-a9", "virt", NULL
|
||||
};
|
||||
add_cdrom_param_tests(armmachines);
|
||||
+#endif
|
||||
} else {
|
||||
const char *nonemachine[] = { "none", NULL };
|
||||
add_cdrom_param_tests(nonemachine);
|
||||
diff --git a/tests/qtest/cpu-plug-test.c b/tests/qtest/cpu-plug-test.c
|
||||
index a1c689414b..a8f076711c 100644
|
||||
--- a/tests/qtest/cpu-plug-test.c
|
||||
+++ b/tests/qtest/cpu-plug-test.c
|
||||
@@ -110,8 +110,8 @@ static void add_pseries_test_case(const char *mname)
|
||||
char *path;
|
||||
PlugTestData *data;
|
||||
|
||||
- if (!g_str_has_prefix(mname, "pseries-") ||
|
||||
- (g_str_has_prefix(mname, "pseries-2.") && atoi(&mname[10]) < 7)) {
|
||||
+ if (!g_str_has_prefix(mname, "pseries-rhel") ||
|
||||
+ (g_str_has_prefix(mname, "pseries-rhel7.") && atoi(&mname[14]) < 4)) {
|
||||
return;
|
||||
}
|
||||
data = g_new(PlugTestData, 1);
|
||||
diff --git a/tests/qtest/fuzz-e1000e-test.c b/tests/qtest/fuzz-e1000e-test.c
|
||||
index 66229e6096..947fba73b7 100644
|
||||
--- a/tests/qtest/fuzz-e1000e-test.c
|
||||
+++ b/tests/qtest/fuzz-e1000e-test.c
|
||||
@@ -17,7 +17,7 @@ static void test_lp1879531_eth_get_rss_ex_dst_addr(void)
|
||||
{
|
||||
QTestState *s;
|
||||
|
||||
- s = qtest_init("-nographic -monitor none -serial none -M pc-q35-5.0");
|
||||
+ s = qtest_init("-nographic -monitor none -serial none -M pc-q35-rhel8.4.0");
|
||||
|
||||
qtest_outl(s, 0xcf8, 0x80001010);
|
||||
qtest_outl(s, 0xcfc, 0xe1020000);
|
||||
diff --git a/tests/qtest/fuzz-virtio-scsi-test.c b/tests/qtest/fuzz-virtio-scsi-test.c
|
||||
index aaf6d10e18..43727d62ac 100644
|
||||
--- a/tests/qtest/fuzz-virtio-scsi-test.c
|
||||
+++ b/tests/qtest/fuzz-virtio-scsi-test.c
|
||||
@@ -19,7 +19,7 @@ static void test_mmio_oob_from_memory_region_cache(void)
|
||||
{
|
||||
QTestState *s;
|
||||
|
||||
- s = qtest_init("-M pc-q35-5.2 -display none -m 512M "
|
||||
+ s = qtest_init("-M pc-q35-rhel8.4.0 -display none -m 512M "
|
||||
"-device virtio-scsi,num_queues=8,addr=03.0 ");
|
||||
|
||||
qtest_outl(s, 0xcf8, 0x80001811);
|
||||
diff --git a/tests/qtest/hd-geo-test.c b/tests/qtest/hd-geo-test.c
|
||||
index 113126ae06..999ef2aace 100644
|
||||
--- a/tests/qtest/hd-geo-test.c
|
||||
+++ b/tests/qtest/hd-geo-test.c
|
||||
@@ -737,6 +737,7 @@ static void test_override_ide(void)
|
||||
test_override(args, expected);
|
||||
}
|
||||
|
||||
+#if 0 /* Require lsi53c895a - not supported on RHEL */
|
||||
static void test_override_scsi(void)
|
||||
{
|
||||
TestArgs *args = create_args();
|
||||
@@ -781,6 +782,7 @@ static void test_override_scsi_2_controllers(void)
|
||||
add_scsi_disk(args, 3, 1, 0, 1, 2, 0, 1, 0);
|
||||
test_override(args, expected);
|
||||
}
|
||||
+#endif
|
||||
|
||||
static void test_override_virtio_blk(void)
|
||||
{
|
||||
@@ -960,9 +962,11 @@ int main(int argc, char **argv)
|
||||
qtest_add_func("hd-geo/ide/device/user/chst", test_ide_device_user_chst);
|
||||
if (have_qemu_img()) {
|
||||
qtest_add_func("hd-geo/override/ide", test_override_ide);
|
||||
+#if 0 /* Require lsi53c895a - not supported on RHEL */
|
||||
qtest_add_func("hd-geo/override/scsi", test_override_scsi);
|
||||
qtest_add_func("hd-geo/override/scsi_2_controllers",
|
||||
test_override_scsi_2_controllers);
|
||||
+#endif
|
||||
qtest_add_func("hd-geo/override/virtio_blk", test_override_virtio_blk);
|
||||
qtest_add_func("hd-geo/override/zero_chs", test_override_zero_chs);
|
||||
qtest_add_func("hd-geo/override/scsi_hot_unplug",
|
||||
diff --git a/tests/qtest/lpc-ich9-test.c b/tests/qtest/lpc-ich9-test.c
|
||||
index fe0bef9980..7a9d51579b 100644
|
||||
--- a/tests/qtest/lpc-ich9-test.c
|
||||
+++ b/tests/qtest/lpc-ich9-test.c
|
||||
@@ -15,7 +15,7 @@ static void test_lp1878642_pci_bus_get_irq_level_assert(void)
|
||||
{
|
||||
QTestState *s;
|
||||
|
||||
- s = qtest_init("-M pc-q35-5.0 "
|
||||
+ s = qtest_init("-M pc-q35-rhel8.4.0 "
|
||||
"-nographic -monitor none -serial none");
|
||||
|
||||
qtest_outl(s, 0xcf8, 0x8000f840); /* PMBASE */
|
||||
diff --git a/tests/qtest/meson.build b/tests/qtest/meson.build
|
||||
index c9d8458062..049e06c057 100644
|
||||
--- a/tests/qtest/meson.build
|
||||
+++ b/tests/qtest/meson.build
|
||||
@@ -68,7 +68,6 @@ qtests_i386 = \
|
||||
(config_all_devices.has_key('CONFIG_RTL8139_PCI') ? ['rtl8139-test'] : []) + \
|
||||
(config_all_devices.has_key('CONFIG_E1000E_PCI_EXPRESS') ? ['fuzz-e1000e-test'] : []) + \
|
||||
(config_all_devices.has_key('CONFIG_ESP_PCI') ? ['am53c974-test'] : []) + \
|
||||
- (unpack_edk2_blobs ? ['bios-tables-test'] : []) + \
|
||||
qtests_pci + \
|
||||
['fdc-test',
|
||||
'ide-test',
|
||||
@@ -81,7 +80,6 @@ qtests_i386 = \
|
||||
'drive_del-test',
|
||||
'tco-test',
|
||||
'cpu-plug-test',
|
||||
- 'q35-test',
|
||||
'vmgenid-test',
|
||||
'migration-test',
|
||||
'test-x86-cpuid-compat',
|
||||
@@ -130,17 +128,15 @@ qtests_mips64el = \
|
||||
|
||||
qtests_ppc = \
|
||||
(config_all_devices.has_key('CONFIG_ISA_TESTDEV') ? ['endianness-test'] : []) + \
|
||||
- (config_all_devices.has_key('CONFIG_M48T59') ? ['m48t59-test'] : []) + \
|
||||
- ['boot-order-test', 'prom-env-test', 'boot-serial-test'] \
|
||||
+ (config_all_devices.has_key('CONFIG_M48T59') ? ['m48t59-test'] : [])
|
||||
|
||||
qtests_ppc64 = \
|
||||
(config_all_devices.has_key('CONFIG_PSERIES') ? ['device-plug-test'] : []) + \
|
||||
(config_all_devices.has_key('CONFIG_POWERNV') ? ['pnv-xscom-test'] : []) + \
|
||||
(config_all_devices.has_key('CONFIG_PSERIES') ? ['rtas-test'] : []) + \
|
||||
- (slirp.found() ? ['pxe-test', 'test-netfilter'] : []) + \
|
||||
+ (slirp.found() ? ['pxe-test'] : []) + \
|
||||
(config_all_devices.has_key('CONFIG_USB_UHCI') ? ['usb-hcd-uhci-test'] : []) + \
|
||||
(config_all_devices.has_key('CONFIG_USB_XHCI_NEC') ? ['usb-hcd-xhci-test'] : []) + \
|
||||
- (config_host.has_key('CONFIG_POSIX') ? ['test-filter-mirror'] : []) + \
|
||||
qtests_pci + ['migration-test', 'numa-test', 'cpu-plug-test', 'drive_del-test']
|
||||
|
||||
qtests_sh4 = (config_all_devices.has_key('CONFIG_ISA_TESTDEV') ? ['endianness-test'] : [])
|
||||
@@ -186,8 +182,8 @@ qtests_aarch64 = \
|
||||
['arm-cpu-features',
|
||||
'numa-test',
|
||||
'boot-serial-test',
|
||||
- 'xlnx-can-test',
|
||||
- 'fuzz-xlnx-dp-test',
|
||||
+# 'xlnx-can-test',
|
||||
+# 'fuzz-xlnx-dp-test',
|
||||
'migration-test']
|
||||
|
||||
qtests_s390x = \
|
||||
@@ -196,7 +192,6 @@ qtests_s390x = \
|
||||
(config_host.has_key('CONFIG_POSIX') ? ['test-filter-redirector'] : []) + \
|
||||
['boot-serial-test',
|
||||
'drive_del-test',
|
||||
- 'device-plug-test',
|
||||
'virtio-ccw-test',
|
||||
'cpu-plug-test',
|
||||
'migration-test']
|
||||
diff --git a/tests/qtest/prom-env-test.c b/tests/qtest/prom-env-test.c
|
||||
index f41d80154a..f8dc478ce8 100644
|
||||
--- a/tests/qtest/prom-env-test.c
|
||||
+++ b/tests/qtest/prom-env-test.c
|
||||
@@ -89,10 +89,14 @@ int main(int argc, char *argv[])
|
||||
if (!strcmp(arch, "ppc")) {
|
||||
add_tests(ppc_machines);
|
||||
} else if (!strcmp(arch, "ppc64")) {
|
||||
+#if 0 /* Disabled for Red Hat Enterprise Linux */
|
||||
add_tests(ppc_machines);
|
||||
if (g_test_slow()) {
|
||||
+#endif
|
||||
qtest_add_data_func("prom-env/pseries", "pseries", test_machine);
|
||||
+#if 0 /* Disabled for Red Hat Enterprise Linux */
|
||||
}
|
||||
+#endif
|
||||
} else if (!strcmp(arch, "sparc")) {
|
||||
add_tests(sparc_machines);
|
||||
} else if (!strcmp(arch, "sparc64")) {
|
||||
diff --git a/tests/qtest/test-x86-cpuid-compat.c b/tests/qtest/test-x86-cpuid-compat.c
|
||||
index f28848e06e..6b2fd398a2 100644
|
||||
--- a/tests/qtest/test-x86-cpuid-compat.c
|
||||
+++ b/tests/qtest/test-x86-cpuid-compat.c
|
||||
@@ -300,6 +300,7 @@ int main(int argc, char **argv)
|
||||
"-cpu 486,xlevel2=0xC0000002,xstore=on",
|
||||
"xlevel2", 0xC0000002);
|
||||
|
||||
+#if 0 /* Disabled in Red Hat Enterprise Linux */
|
||||
/* Check compatibility of old machine-types that didn't
|
||||
* auto-increase level/xlevel/xlevel2: */
|
||||
|
||||
@@ -350,6 +351,7 @@ int main(int argc, char **argv)
|
||||
add_cpuid_test("x86/cpuid/xlevel-compat/pc-i440fx-2.4/npt-on",
|
||||
"-machine pc-i440fx-2.4 -cpu SandyBridge,svm=on,npt=on",
|
||||
"xlevel", 0x80000008);
|
||||
+#endif
|
||||
|
||||
/* Test feature parsing */
|
||||
add_feature_test("x86/cpuid/features/plus",
|
||||
diff --git a/tests/qtest/usb-hcd-xhci-test.c b/tests/qtest/usb-hcd-xhci-test.c
|
||||
index 10ef9d2a91..3855873050 100644
|
||||
--- a/tests/qtest/usb-hcd-xhci-test.c
|
||||
+++ b/tests/qtest/usb-hcd-xhci-test.c
|
||||
@@ -21,6 +21,7 @@ static void test_xhci_hotplug(void)
|
||||
usb_test_hotplug(global_qtest, "xhci", "1", NULL);
|
||||
}
|
||||
|
||||
+#if 0 /* Disabled for Red Hat Enterprise Linux */
|
||||
static void test_usb_uas_hotplug(void)
|
||||
{
|
||||
QTestState *qts = global_qtest;
|
||||
@@ -36,6 +37,7 @@ static void test_usb_uas_hotplug(void)
|
||||
qtest_qmp_device_del(qts, "scsihd");
|
||||
qtest_qmp_device_del(qts, "uas");
|
||||
}
|
||||
+#endif
|
||||
|
||||
static void test_usb_ccid_hotplug(void)
|
||||
{
|
||||
@@ -56,7 +58,9 @@ int main(int argc, char **argv)
|
||||
|
||||
qtest_add_func("/xhci/pci/init", test_xhci_init);
|
||||
qtest_add_func("/xhci/pci/hotplug", test_xhci_hotplug);
|
||||
+#if 0 /* Disabled for Red Hat Enterprise Linux */
|
||||
qtest_add_func("/xhci/pci/hotplug/usb-uas", test_usb_uas_hotplug);
|
||||
+#endif
|
||||
qtest_add_func("/xhci/pci/hotplug/usb-ccid", test_usb_ccid_hotplug);
|
||||
|
||||
qtest_start("-device nec-usb-xhci,id=xhci"
|
||||
--
|
||||
2.27.0
|
||||
|
@ -1,4 +1,4 @@
|
||||
From 55dcef9d806aa530f10e3ca42eb24d52f850d674 Mon Sep 17 00:00:00 2001
|
||||
From c358fd4c224a9c3f64b4a8fff34cc6b1dc201fa0 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
|
||||
@ -32,7 +32,7 @@ Signed-off-by: Bandan Das <bsd@redhat.com>
|
||||
2 files changed, 29 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/hw/vfio/pci.c b/hw/vfio/pci.c
|
||||
index 7b45353ce2..eb725a3aee 100644
|
||||
index 67a183f17b..1e20f9fd59 100644
|
||||
--- a/hw/vfio/pci.c
|
||||
+++ b/hw/vfio/pci.c
|
||||
@@ -45,6 +45,9 @@
|
||||
@ -45,7 +45,7 @@ index 7b45353ce2..eb725a3aee 100644
|
||||
static void vfio_disable_interrupts(VFIOPCIDevice *vdev);
|
||||
static void vfio_mmap_set_enabled(VFIOPCIDevice *vdev, bool enabled);
|
||||
|
||||
@@ -2807,9 +2810,30 @@ static void vfio_realize(PCIDevice *pdev, Error **errp)
|
||||
@@ -2810,9 +2813,30 @@ static void vfio_realize(PCIDevice *pdev, Error **errp)
|
||||
ssize_t len;
|
||||
struct stat st;
|
||||
int groupid;
|
||||
@ -77,7 +77,7 @@ index 7b45353ce2..eb725a3aee 100644
|
||||
if (!vdev->vbasedev.sysfsdev) {
|
||||
if (!(~vdev->host.domain || ~vdev->host.bus ||
|
||||
~vdev->host.slot || ~vdev->host.function)) {
|
||||
@@ -3246,6 +3270,9 @@ static Property vfio_pci_dev_properties[] = {
|
||||
@@ -3249,6 +3273,9 @@ static 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),
|
||||
@ -100,5 +100,5 @@ index 64777516d1..e0fe6ca97e 100644
|
||||
uint32_t device_id;
|
||||
uint32_t sub_vendor_id;
|
||||
--
|
||||
2.27.0
|
||||
2.31.1
|
||||
|
@ -1,4 +1,4 @@
|
||||
From fcccb5c061b8bbae29de59637c5ad4cf4416281b Mon Sep 17 00:00:00 2001
|
||||
From ba0c7a5f6b9a1f75666db6b3b795ddf03695dc26 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
|
||||
@ -21,10 +21,10 @@ Signed-off-by: Eduardo Habkost <ehabkost@redhat.com>
|
||||
1 file changed, 9 insertions(+)
|
||||
|
||||
diff --git a/softmmu/vl.c b/softmmu/vl.c
|
||||
index 620a1f1367..d46b8fb4ab 100644
|
||||
index 6f646531a0..9d5dab43d2 100644
|
||||
--- a/softmmu/vl.c
|
||||
+++ b/softmmu/vl.c
|
||||
@@ -827,9 +827,17 @@ static void version(void)
|
||||
@@ -831,9 +831,17 @@ static void version(void)
|
||||
QEMU_COPYRIGHT "\n");
|
||||
}
|
||||
|
||||
@ -41,8 +41,8 @@ index 620a1f1367..d46b8fb4ab 100644
|
||||
+ print_rh_warning();
|
||||
printf("usage: %s [options] [disk_image]\n\n"
|
||||
"'disk_image' is a raw hard disk image for IDE hard disk 0\n\n",
|
||||
error_get_progname());
|
||||
@@ -855,6 +863,7 @@ static void help(int exitcode)
|
||||
g_get_prgname());
|
||||
@@ -859,6 +867,7 @@ static void help(int exitcode)
|
||||
"\n"
|
||||
QEMU_HELP_BOTTOM "\n");
|
||||
|
||||
@ -51,5 +51,5 @@ index 620a1f1367..d46b8fb4ab 100644
|
||||
}
|
||||
|
||||
--
|
||||
2.27.0
|
||||
2.31.1
|
||||
|
@ -1,4 +1,4 @@
|
||||
From 354c9ce982e566ddb3c724a57252986dcb7c36db Mon Sep 17 00:00:00 2001
|
||||
From 9ebfd2f6cfa8e79c92e58fd169f90cc768fb865a Mon Sep 17 00:00:00 2001
|
||||
From: Andrew Jones <drjones@redhat.com>
|
||||
Date: Tue, 21 Jan 2014 10:46:52 +0100
|
||||
Subject: globally limit the maximum number of CPUs
|
||||
@ -18,10 +18,10 @@ Signed-off-by: Danilo Cesar Lemes de Paula <ddepaula@redhat.com>
|
||||
1 file changed, 12 insertions(+)
|
||||
|
||||
diff --git a/accel/kvm/kvm-all.c b/accel/kvm/kvm-all.c
|
||||
index eecd8031cf..8f2a53438f 100644
|
||||
index 5f1377ca04..fdf0e4d429 100644
|
||||
--- a/accel/kvm/kvm-all.c
|
||||
+++ b/accel/kvm/kvm-all.c
|
||||
@@ -2423,6 +2423,18 @@ static int kvm_init(MachineState *ms)
|
||||
@@ -2430,6 +2430,18 @@ static int kvm_init(MachineState *ms)
|
||||
soft_vcpus_limit = kvm_recommended_vcpus(s);
|
||||
hard_vcpus_limit = kvm_max_vcpus(s);
|
||||
|
||||
@ -41,5 +41,5 @@ index eecd8031cf..8f2a53438f 100644
|
||||
if (nc->num > soft_vcpus_limit) {
|
||||
warn_report("Number of %s cpus requested (%d) exceeds "
|
||||
--
|
||||
2.27.0
|
||||
2.31.1
|
||||
|
@ -0,0 +1,61 @@
|
||||
From 4b6c8cdc52fdf94d4098d278defb3833dce1d189 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>
|
||||
|
||||
Patchwork-id: 62380
|
||||
O-Subject: [RHEV-7.1 qemu-kvm-rhev PATCHv4] Use qemu-kvm in documentation instead of qemu-system-i386
|
||||
Bugzilla: 1140620
|
||||
RH-Acked-by: Laszlo Ersek <lersek@redhat.com>
|
||||
RH-Acked-by: Markus Armbruster <armbru@redhat.com>
|
||||
RH-Acked-by: Stefan Hajnoczi <stefanha@redhat.com>
|
||||
|
||||
From: Miroslav Rezanina <mrezanin@redhat.com>
|
||||
|
||||
We change the name and location of qemu-kvm binaries. Update documentation
|
||||
to reflect this change. Only architectures available in RHEL are updated.
|
||||
|
||||
Signed-off-by: Miroslav Rezanina <mrezanin@redhat.com>
|
||||
---
|
||||
docs/defs.rst.inc | 4 ++--
|
||||
qemu-options.hx | 10 +++++-----
|
||||
2 files changed, 7 insertions(+), 7 deletions(-)
|
||||
|
||||
diff --git a/docs/defs.rst.inc b/docs/defs.rst.inc
|
||||
index 52d6454b93..d74dbdeca9 100644
|
||||
--- a/docs/defs.rst.inc
|
||||
+++ b/docs/defs.rst.inc
|
||||
@@ -9,7 +9,7 @@
|
||||
but the manpages will end up misrendered with following normal text
|
||||
incorrectly in boldface.
|
||||
|
||||
-.. |qemu_system| replace:: qemu-system-x86_64
|
||||
-.. |qemu_system_x86| replace:: qemu-system-x86_64
|
||||
+.. |qemu_system| replace:: qemu-kvm
|
||||
+.. |qemu_system_x86| replace:: qemu-kvm
|
||||
.. |I2C| replace:: I\ :sup:`2`\ C
|
||||
.. |I2S| replace:: I\ :sup:`2`\ S
|
||||
diff --git a/qemu-options.hx b/qemu-options.hx
|
||||
index 34e9b32a5c..924f61ab6d 100644
|
||||
--- a/qemu-options.hx
|
||||
+++ b/qemu-options.hx
|
||||
@@ -3233,11 +3233,11 @@ SRST
|
||||
|
||||
::
|
||||
|
||||
- qemu -m 512 -object memory-backend-file,id=mem,size=512M,mem-path=/hugetlbfs,share=on \
|
||||
- -numa node,memdev=mem \
|
||||
- -chardev socket,id=chr0,path=/path/to/socket \
|
||||
- -netdev type=vhost-user,id=net0,chardev=chr0 \
|
||||
- -device virtio-net-pci,netdev=net0
|
||||
+ qemu-kvm -m 512 -object memory-backend-file,id=mem,size=512M,mem-path=/hugetlbfs,share=on \
|
||||
+ -numa node,memdev=mem \
|
||||
+ -chardev socket,id=chr0,path=/path/to/socket \
|
||||
+ -netdev type=vhost-user,id=net0,chardev=chr0 \
|
||||
+ -device virtio-net-pci,netdev=net0
|
||||
|
||||
``-netdev vhost-vdpa,vhostdev=/path/to/dev``
|
||||
Establish a vhost-vdpa netdev.
|
||||
--
|
||||
2.31.1
|
||||
|
@ -1,120 +0,0 @@
|
||||
From b057b4ebec0f87f21ba4a15adbb2a1bde7240ed5 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>
|
||||
|
||||
Patchwork-id: 62380
|
||||
O-Subject: [RHEV-7.1 qemu-kvm-rhev PATCHv4] Use qemu-kvm in documentation instead of qemu-system-i386
|
||||
Bugzilla: 1140620
|
||||
RH-Acked-by: Laszlo Ersek <lersek@redhat.com>
|
||||
RH-Acked-by: Markus Armbruster <armbru@redhat.com>
|
||||
RH-Acked-by: Stefan Hajnoczi <stefanha@redhat.com>
|
||||
|
||||
From: Miroslav Rezanina <mrezanin@redhat.com>
|
||||
|
||||
We change the name and location of qemu-kvm binaries. Update documentation
|
||||
to reflect this change. Only architectures available in RHEL are updated.
|
||||
|
||||
Signed-off-by: Miroslav Rezanina <mrezanin@redhat.com>
|
||||
---
|
||||
docs/defs.rst.inc | 4 ++--
|
||||
docs/tools/qemu-trace-stap.rst | 14 +++++++-------
|
||||
qemu-options.hx | 10 +++++-----
|
||||
3 files changed, 14 insertions(+), 14 deletions(-)
|
||||
|
||||
diff --git a/docs/defs.rst.inc b/docs/defs.rst.inc
|
||||
index 52d6454b93..d74dbdeca9 100644
|
||||
--- a/docs/defs.rst.inc
|
||||
+++ b/docs/defs.rst.inc
|
||||
@@ -9,7 +9,7 @@
|
||||
but the manpages will end up misrendered with following normal text
|
||||
incorrectly in boldface.
|
||||
|
||||
-.. |qemu_system| replace:: qemu-system-x86_64
|
||||
-.. |qemu_system_x86| replace:: qemu-system-x86_64
|
||||
+.. |qemu_system| replace:: qemu-kvm
|
||||
+.. |qemu_system_x86| replace:: qemu-kvm
|
||||
.. |I2C| replace:: I\ :sup:`2`\ C
|
||||
.. |I2S| replace:: I\ :sup:`2`\ S
|
||||
diff --git a/docs/tools/qemu-trace-stap.rst b/docs/tools/qemu-trace-stap.rst
|
||||
index d53073b52b..9e93df084f 100644
|
||||
--- a/docs/tools/qemu-trace-stap.rst
|
||||
+++ b/docs/tools/qemu-trace-stap.rst
|
||||
@@ -46,19 +46,19 @@ The following commands are valid:
|
||||
any of the listed names. If no *PATTERN* is given, the all possible
|
||||
probes will be listed.
|
||||
|
||||
- For example, to list all probes available in the ``qemu-system-x86_64``
|
||||
+ For example, to list all probes available in the ``qemu-kvm``
|
||||
binary:
|
||||
|
||||
::
|
||||
|
||||
- $ qemu-trace-stap list qemu-system-x86_64
|
||||
+ $ qemu-trace-stap list qemu-kvm
|
||||
|
||||
To filter the list to only cover probes related to QEMU's cryptographic
|
||||
subsystem, in a binary outside ``$PATH``
|
||||
|
||||
::
|
||||
|
||||
- $ qemu-trace-stap list /opt/qemu/4.0.0/bin/qemu-system-x86_64 'qcrypto*'
|
||||
+ $ qemu-trace-stap list /opt/qemu/4.0.0/bin/qemu-kvm 'qcrypto*'
|
||||
|
||||
.. option:: run OPTIONS BINARY PATTERN...
|
||||
|
||||
@@ -90,18 +90,18 @@ The following commands are valid:
|
||||
Restrict the tracing session so that it only triggers for the process
|
||||
identified by *PID*.
|
||||
|
||||
- For example, to monitor all processes executing ``qemu-system-x86_64``
|
||||
+ For example, to monitor all processes executing ``qemu-kvm``
|
||||
as found on ``$PATH``, displaying all I/O related probes:
|
||||
|
||||
::
|
||||
|
||||
- $ qemu-trace-stap run qemu-system-x86_64 'qio*'
|
||||
+ $ qemu-trace-stap run qemu-kvm 'qio*'
|
||||
|
||||
To monitor only the QEMU process with PID 1732
|
||||
|
||||
::
|
||||
|
||||
- $ qemu-trace-stap run --pid=1732 qemu-system-x86_64 'qio*'
|
||||
+ $ qemu-trace-stap run --pid=1732 qemu-kvm 'qio*'
|
||||
|
||||
To monitor QEMU processes running an alternative binary outside of
|
||||
``$PATH``, displaying verbose information about setup of the
|
||||
@@ -109,7 +109,7 @@ The following commands are valid:
|
||||
|
||||
::
|
||||
|
||||
- $ qemu-trace-stap -v run /opt/qemu/4.0.0/qemu-system-x86_64 'qio*'
|
||||
+ $ qemu-trace-stap -v run /opt/qemu/4.0.0/qemu-kvm 'qio*'
|
||||
|
||||
See also
|
||||
--------
|
||||
diff --git a/qemu-options.hx b/qemu-options.hx
|
||||
index ae2c6dbbfc..94c4a8dbaf 100644
|
||||
--- a/qemu-options.hx
|
||||
+++ b/qemu-options.hx
|
||||
@@ -3150,11 +3150,11 @@ SRST
|
||||
|
||||
::
|
||||
|
||||
- qemu -m 512 -object memory-backend-file,id=mem,size=512M,mem-path=/hugetlbfs,share=on \
|
||||
- -numa node,memdev=mem \
|
||||
- -chardev socket,id=chr0,path=/path/to/socket \
|
||||
- -netdev type=vhost-user,id=net0,chardev=chr0 \
|
||||
- -device virtio-net-pci,netdev=net0
|
||||
+ qemu-kvm -m 512 -object memory-backend-file,id=mem,size=512M,mem-path=/hugetlbfs,share=on \
|
||||
+ -numa node,memdev=mem \
|
||||
+ -chardev socket,id=chr0,path=/path/to/socket \
|
||||
+ -netdev type=vhost-user,id=net0,chardev=chr0 \
|
||||
+ -device virtio-net-pci,netdev=net0
|
||||
|
||||
``-netdev vhost-vdpa,vhostdev=/path/to/dev``
|
||||
Establish a vhost-vdpa netdev.
|
||||
--
|
||||
2.27.0
|
||||
|
@ -1,4 +1,4 @@
|
||||
From 41fe05330d095f69f12973b0540466439e030047 Mon Sep 17 00:00:00 2001
|
||||
From b72e04cb7e417d9e1c973223747ab3a27abda8b4 Mon Sep 17 00:00:00 2001
|
||||
From: Fam Zheng <famz@redhat.com>
|
||||
Date: Wed, 14 Jun 2017 15:37:01 +0200
|
||||
Subject: virtio-scsi: Reject scsi-cd if data plane enabled [RHEL only]
|
||||
@ -42,7 +42,7 @@ Signed-off-by: Danilo C. L. de Paula <ddepaula@redhat.com>
|
||||
1 file changed, 9 insertions(+)
|
||||
|
||||
diff --git a/hw/scsi/virtio-scsi.c b/hw/scsi/virtio-scsi.c
|
||||
index 51fd09522a..a35257c35a 100644
|
||||
index 34a968ecfb..7f6da33a8a 100644
|
||||
--- a/hw/scsi/virtio-scsi.c
|
||||
+++ b/hw/scsi/virtio-scsi.c
|
||||
@@ -896,6 +896,15 @@ static void virtio_scsi_hotplug(HotplugHandler *hotplug_dev, DeviceState *dev,
|
||||
@ -62,5 +62,5 @@ index 51fd09522a..a35257c35a 100644
|
||||
if (blk_op_is_blocked(sd->conf.blk, BLOCK_OP_TYPE_DATAPLANE, errp)) {
|
||||
return;
|
||||
--
|
||||
2.27.0
|
||||
2.31.1
|
||||
|
@ -1,4 +1,4 @@
|
||||
From 295ee942608d48ab167aa76adabf3697c28e6910 Mon Sep 17 00:00:00 2001
|
||||
From 64a06662cdea0ff62efb122be4eab506b2a842d9 Mon Sep 17 00:00:00 2001
|
||||
From: David Gibson <dgibson@redhat.com>
|
||||
Date: Wed, 6 Feb 2019 03:58:56 +0000
|
||||
Subject: BZ1653590: Require at least 64kiB pages for downstream guests & hosts
|
||||
@ -32,10 +32,10 @@ Signed-off-by: Danilo C. L. de Paula <ddepaula@redhat.com>
|
||||
1 file changed, 7 insertions(+)
|
||||
|
||||
diff --git a/hw/ppc/spapr_caps.c b/hw/ppc/spapr_caps.c
|
||||
index ed7c077a0d..48a8efe678 100644
|
||||
index 655ab856a0..6aa7f93df9 100644
|
||||
--- a/hw/ppc/spapr_caps.c
|
||||
+++ b/hw/ppc/spapr_caps.c
|
||||
@@ -332,12 +332,19 @@ bool spapr_check_pagesize(SpaprMachineState *spapr, hwaddr pagesize,
|
||||
@@ -329,12 +329,19 @@ bool spapr_check_pagesize(SpaprMachineState *spapr, hwaddr pagesize,
|
||||
static void cap_hpt_maxpagesize_apply(SpaprMachineState *spapr,
|
||||
uint8_t val, Error **errp)
|
||||
{
|
||||
@ -56,5 +56,5 @@ index ed7c077a0d..48a8efe678 100644
|
||||
spapr_check_pagesize(spapr, qemu_minrampagesize(), errp);
|
||||
}
|
||||
--
|
||||
2.27.0
|
||||
2.31.1
|
||||
|
@ -1,4 +1,4 @@
|
||||
From a3bb2330bbf68faabc57b768cdf3ae2f4f4d86f3 Mon Sep 17 00:00:00 2001
|
||||
From 54f9157a918e1404f2f17ce89a9c8b9088c1bc06 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
|
||||
@ -44,10 +44,10 @@ Rebase notes (6.1.0):
|
||||
2 files changed, 7 insertions(+)
|
||||
|
||||
diff --git a/block/qcow2.c b/block/qcow2.c
|
||||
index d509016756..37d1c26a71 100644
|
||||
index b5c47931ef..a795e457ac 100644
|
||||
--- a/block/qcow2.c
|
||||
+++ b/block/qcow2.c
|
||||
@@ -1336,6 +1336,12 @@ static int coroutine_fn qcow2_do_open(BlockDriverState *bs, QDict *options,
|
||||
@@ -1337,6 +1337,12 @@ static int coroutine_fn qcow2_do_open(BlockDriverState *bs, QDict *options,
|
||||
ret = -ENOTSUP;
|
||||
goto fail;
|
||||
}
|
||||
@ -61,17 +61,17 @@ index d509016756..37d1c26a71 100644
|
||||
s->qcow_version = header.version;
|
||||
|
||||
diff --git a/tests/qemu-iotests/common.filter b/tests/qemu-iotests/common.filter
|
||||
index 2b2b53946c..c5c2dc39bd 100644
|
||||
index cc9f1a5891..6a13757177 100644
|
||||
--- a/tests/qemu-iotests/common.filter
|
||||
+++ b/tests/qemu-iotests/common.filter
|
||||
@@ -82,6 +82,7 @@ _filter_qemu()
|
||||
@@ -83,6 +83,7 @@ _filter_qemu()
|
||||
{
|
||||
$SED -e "s#\\(^\\|(qemu) \\)$(basename $QEMU_PROG):#\1QEMU_PROG:#" \
|
||||
gsed -e "s#\\(^\\|(qemu) \\)$(basename $QEMU_PROG):#\1QEMU_PROG:#" \
|
||||
-e 's#^QEMU [0-9]\+\.[0-9]\+\.[0-9]\+ monitor#QEMU X.Y.Z monitor#' \
|
||||
+ -e "/qcow2 v2 images are deprecated/d" \
|
||||
-e $'s#\r##' # QEMU monitor uses \r\n line endings
|
||||
}
|
||||
|
||||
--
|
||||
2.27.0
|
||||
2.31.1
|
||||
|
135
SOURCES/0019-WRB-Introduce-RHEL-9.0.0-hw-compat-structure.patch
Normal file
135
SOURCES/0019-WRB-Introduce-RHEL-9.0.0-hw-compat-structure.patch
Normal file
@ -0,0 +1,135 @@
|
||||
From 1d6439527aa6ccabb58208c94417778ccc19de39 Mon Sep 17 00:00:00 2001
|
||||
From: Miroslav Rezanina <mrezanin@redhat.com>
|
||||
Date: Wed, 9 Feb 2022 04:16:25 -0500
|
||||
Subject: WRB: Introduce RHEL 9.0.0 hw compat structure
|
||||
|
||||
General compatibility structure for post RHEL 9.0.0 rebase.
|
||||
|
||||
Signed-off-by: Miroslav Rezanina <mrezanin@redhat.com>
|
||||
---
|
||||
hw/core/machine.c | 9 +++++++++
|
||||
hw/i386/pc.c | 6 ++++++
|
||||
hw/i386/pc_piix.c | 4 ++++
|
||||
hw/i386/pc_q35.c | 4 ++++
|
||||
hw/s390x/s390-virtio-ccw.c | 2 ++
|
||||
include/hw/boards.h | 3 +++
|
||||
include/hw/i386/pc.h | 3 +++
|
||||
7 files changed, 31 insertions(+)
|
||||
|
||||
diff --git a/hw/core/machine.c b/hw/core/machine.c
|
||||
index 28989b6e7b..dffc3ef4ab 100644
|
||||
--- a/hw/core/machine.c
|
||||
+++ b/hw/core/machine.c
|
||||
@@ -53,6 +53,15 @@ GlobalProperty hw_compat_rhel_8_6[] = {
|
||||
};
|
||||
const size_t hw_compat_rhel_8_6_len = G_N_ELEMENTS(hw_compat_rhel_8_6);
|
||||
|
||||
+/*
|
||||
+ * Mostly the same as hw_compat_6_2
|
||||
+ */
|
||||
+GlobalProperty hw_compat_rhel_9_0[] = {
|
||||
+ /* hw_compat_rhel_9_0 from hw_compat_6_2 */
|
||||
+ { "PIIX4_PM", "x-not-migrate-acpi-index", "on"},
|
||||
+};
|
||||
+const size_t hw_compat_rhel_9_0_len = G_N_ELEMENTS(hw_compat_rhel_9_0);
|
||||
+
|
||||
/*
|
||||
* Mostly the same as hw_compat_6_0 and hw_compat_6_1
|
||||
*/
|
||||
diff --git a/hw/i386/pc.c b/hw/i386/pc.c
|
||||
index 263d882af6..0886cfe3fe 100644
|
||||
--- a/hw/i386/pc.c
|
||||
+++ b/hw/i386/pc.c
|
||||
@@ -391,6 +391,12 @@ GlobalProperty pc_rhel_compat[] = {
|
||||
};
|
||||
const size_t pc_rhel_compat_len = G_N_ELEMENTS(pc_rhel_compat);
|
||||
|
||||
+GlobalProperty pc_rhel_9_0_compat[] = {
|
||||
+ /* pc_rhel_9_0_compat from pc_compat_6_2 */
|
||||
+ { "virtio-mem", "unplugged-inaccessible", "off" },
|
||||
+};
|
||||
+const size_t pc_rhel_9_0_compat_len = G_N_ELEMENTS(pc_rhel_9_0_compat);
|
||||
+
|
||||
GlobalProperty pc_rhel_8_5_compat[] = {
|
||||
/* pc_rhel_8_5_compat from pc_compat_6_0 */
|
||||
{ "qemu64" "-" TYPE_X86_CPU, "family", "6" },
|
||||
diff --git a/hw/i386/pc_piix.c b/hw/i386/pc_piix.c
|
||||
index 0cacc0d623..dc987fe93b 100644
|
||||
--- a/hw/i386/pc_piix.c
|
||||
+++ b/hw/i386/pc_piix.c
|
||||
@@ -1014,6 +1014,10 @@ static void pc_machine_rhel760_options(MachineClass *m)
|
||||
pcmc->kvmclock_create_always = false;
|
||||
/* From pc_i440fx_5_1_machine_options() */
|
||||
pcmc->pci_root_uid = 1;
|
||||
+ compat_props_add(m->compat_props, hw_compat_rhel_9_0,
|
||||
+ hw_compat_rhel_9_0_len);
|
||||
+ compat_props_add(m->compat_props, pc_rhel_9_0_compat,
|
||||
+ pc_rhel_9_0_compat_len);
|
||||
compat_props_add(m->compat_props, hw_compat_rhel_8_6,
|
||||
hw_compat_rhel_8_6_len);
|
||||
compat_props_add(m->compat_props, hw_compat_rhel_8_5,
|
||||
diff --git a/hw/i386/pc_q35.c b/hw/i386/pc_q35.c
|
||||
index 157160e069..52c253c570 100644
|
||||
--- a/hw/i386/pc_q35.c
|
||||
+++ b/hw/i386/pc_q35.c
|
||||
@@ -669,6 +669,10 @@ static void pc_q35_machine_rhel900_options(MachineClass *m)
|
||||
m->desc = "RHEL-9.0.0 PC (Q35 + ICH9, 2009)";
|
||||
pcmc->smbios_stream_product = "RHEL";
|
||||
pcmc->smbios_stream_version = "9.0.0";
|
||||
+ compat_props_add(m->compat_props, hw_compat_rhel_9_0,
|
||||
+ hw_compat_rhel_9_0_len);
|
||||
+ compat_props_add(m->compat_props, pc_rhel_9_0_compat,
|
||||
+ pc_rhel_9_0_compat_len);
|
||||
}
|
||||
|
||||
DEFINE_PC_MACHINE(q35_rhel900, "pc-q35-rhel9.0.0", pc_q35_init_rhel900,
|
||||
diff --git a/hw/s390x/s390-virtio-ccw.c b/hw/s390x/s390-virtio-ccw.c
|
||||
index 465a2a09d2..08e0f6a79b 100644
|
||||
--- a/hw/s390x/s390-virtio-ccw.c
|
||||
+++ b/hw/s390x/s390-virtio-ccw.c
|
||||
@@ -1118,12 +1118,14 @@ static void ccw_machine_2_4_class_options(MachineClass *mc)
|
||||
DEFINE_CCW_MACHINE(2_4, "2.4", false);
|
||||
#endif
|
||||
|
||||
+
|
||||
static void ccw_machine_rhel900_instance_options(MachineState *machine)
|
||||
{
|
||||
}
|
||||
|
||||
static void ccw_machine_rhel900_class_options(MachineClass *mc)
|
||||
{
|
||||
+ compat_props_add(mc->compat_props, hw_compat_rhel_9_0, hw_compat_rhel_9_0_len);
|
||||
}
|
||||
DEFINE_CCW_MACHINE(rhel900, "rhel9.0.0", true);
|
||||
|
||||
diff --git a/include/hw/boards.h b/include/hw/boards.h
|
||||
index d1555665df..635e45dd71 100644
|
||||
--- a/include/hw/boards.h
|
||||
+++ b/include/hw/boards.h
|
||||
@@ -451,6 +451,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_0[];
|
||||
+extern const size_t hw_compat_rhel_9_0_len;
|
||||
+
|
||||
extern GlobalProperty hw_compat_rhel_8_6[];
|
||||
extern const size_t hw_compat_rhel_8_6_len;
|
||||
|
||||
diff --git a/include/hw/i386/pc.h b/include/hw/i386/pc.h
|
||||
index 419a6ec24b..a492c420b5 100644
|
||||
--- a/include/hw/i386/pc.h
|
||||
+++ b/include/hw/i386/pc.h
|
||||
@@ -292,6 +292,9 @@ extern const size_t pc_compat_1_4_len;
|
||||
extern GlobalProperty pc_rhel_compat[];
|
||||
extern const size_t pc_rhel_compat_len;
|
||||
|
||||
+extern GlobalProperty pc_rhel_9_0_compat[];
|
||||
+extern const size_t pc_rhel_9_0_compat_len;
|
||||
+
|
||||
extern GlobalProperty pc_rhel_8_5_compat[];
|
||||
extern const size_t pc_rhel_8_5_compat_len;
|
||||
|
||||
--
|
||||
2.31.1
|
||||
|
@ -1,46 +0,0 @@
|
||||
From ef5afcc86dc44d1c9d3030a8ceca2018df86c6ec Mon Sep 17 00:00:00 2001
|
||||
From: Eduardo Habkost <ehabkost@redhat.com>
|
||||
Date: Tue, 19 Oct 2021 13:17:06 -0400
|
||||
Subject: Fix virtio-net-pci* "vectors" compat
|
||||
|
||||
RH-Author: Dr. David Alan Gilbert <dgilbert@redhat.com>
|
||||
RH-MergeRequest: 76: 9.0/6.2.0-rc1 x86 machine type fixes
|
||||
RH-Commit: [20/22] ebb570f053f96d3558bac49962dc7dc88296c207
|
||||
RH-Bugzilla: 2025468
|
||||
RH-Acked-by: quintela1 <quintela@redhat.com>
|
||||
RH-Acked-by: Vitaly Kuznetsov <vkuznets@redhat.com>
|
||||
RH-Acked-by: Cornelia Huck <cohuck@redhat.com>
|
||||
|
||||
hw_compat_rhel_8_4 has an issue: it affects only "virtio-net-pci"
|
||||
but not "virtio-net-pci-transitional" and
|
||||
"virtio-net-pci-non-transitional". The solution is to use the
|
||||
"virtio-net-pci-base" type in compat_props.
|
||||
|
||||
An equivalent fix will be submitted for hw_compat_5_2 upstream.
|
||||
|
||||
Signed-off-by: Eduardo Habkost <ehabkost@redhat.com>
|
||||
(cherry picked from commit d45823ab0d0138b2fbaf2ed1e1896d2052f3ccb3)
|
||||
---
|
||||
hw/core/machine.c | 6 +++++-
|
||||
1 file changed, 5 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/hw/core/machine.c b/hw/core/machine.c
|
||||
index 53a3caf4fb..448a8dd127 100644
|
||||
--- a/hw/core/machine.c
|
||||
+++ b/hw/core/machine.c
|
||||
@@ -69,7 +69,11 @@ GlobalProperty hw_compat_rhel_8_4[] = {
|
||||
/* hw_compat_rhel_8_4 from hw_compat_5_2 */
|
||||
{ "virtio-blk-device", "report-discard-granularity", "off" },
|
||||
/* hw_compat_rhel_8_4 from hw_compat_5_2 */
|
||||
- { "virtio-net-pci", "vectors", "3"},
|
||||
+ /*
|
||||
+ * Upstream incorrectly had "virtio-net-pci" instead of "virtio-net-pci-base",
|
||||
+ * (https://bugzilla.redhat.com/show_bug.cgi?id=1999141)
|
||||
+ */
|
||||
+ { "virtio-net-pci-base", "vectors", "3"},
|
||||
};
|
||||
const size_t hw_compat_rhel_8_4_len = G_N_ELEMENTS(hw_compat_rhel_8_4);
|
||||
|
||||
--
|
||||
2.27.0
|
||||
|
@ -0,0 +1,38 @@
|
||||
From c8ad21ca31892f8798cf82508c2b2c61bf3b9895 Mon Sep 17 00:00:00 2001
|
||||
From: Thomas Huth <thuth@redhat.com>
|
||||
Date: Mon, 4 Apr 2022 12:15:50 +0200
|
||||
Subject: redhat: Update s390x machine type compatibility for rebase to QEMU
|
||||
7.0.0
|
||||
|
||||
RH-Author: Thomas Huth <thuth@redhat.com>
|
||||
RH-MergeRequest: 143: Update machine type compatibility for QEMU 7.0.0 update [s390x]
|
||||
RH-Commit: [23/23] 0ecf97d7bdddc50565b5779c64744b353f715cbd
|
||||
RH-Bugzilla: 2064782
|
||||
RH-Acked-by: Cornelia Huck <cohuck@redhat.com>
|
||||
RH-Acked-by: David Hildenbrand <david@redhat.com>
|
||||
|
||||
No s390x-specific machine class property updates required this time,
|
||||
only an update to the default qemu cpu model.
|
||||
|
||||
Signed-off-by: Thomas Huth <thuth@redhat.com>
|
||||
---
|
||||
hw/s390x/s390-virtio-ccw.c | 3 +++
|
||||
1 file changed, 3 insertions(+)
|
||||
|
||||
diff --git a/hw/s390x/s390-virtio-ccw.c b/hw/s390x/s390-virtio-ccw.c
|
||||
index 08e0f6a79b..4a491d4988 100644
|
||||
--- a/hw/s390x/s390-virtio-ccw.c
|
||||
+++ b/hw/s390x/s390-virtio-ccw.c
|
||||
@@ -1121,6 +1121,9 @@ DEFINE_CCW_MACHINE(2_4, "2.4", false);
|
||||
|
||||
static void ccw_machine_rhel900_instance_options(MachineState *machine)
|
||||
{
|
||||
+ static const S390FeatInit qemu_cpu_feat = { S390_FEAT_LIST_QEMU_V6_2 };
|
||||
+
|
||||
+ s390_set_qemu_cpu_model(0x3906, 14, 2, qemu_cpu_feat);
|
||||
}
|
||||
|
||||
static void ccw_machine_rhel900_class_options(MachineClass *mc)
|
||||
--
|
||||
2.31.1
|
||||
|
70
SOURCES/0021-pc-Move-s3-s4-suspend-disabling-to-compat.patch
Normal file
70
SOURCES/0021-pc-Move-s3-s4-suspend-disabling-to-compat.patch
Normal file
@ -0,0 +1,70 @@
|
||||
From 38b89dc24551258b630f09d1c654b6c72b265c79 Mon Sep 17 00:00:00 2001
|
||||
From: "Dr. David Alan Gilbert" <dgilbert@redhat.com>
|
||||
Date: Thu, 14 Apr 2022 14:58:43 +0100
|
||||
Subject: pc: Move s3/s4 suspend disabling to compat
|
||||
|
||||
RH-Author: Dr. David Alan Gilbert <dgilbert@redhat.com>
|
||||
RH-MergeRequest: 155: 7.0 machine type fixes (x86)
|
||||
RH-Commit: [26/26] 7d666032d5f5dab1444ebba085f92f2de4e86699
|
||||
RH-Bugzilla: 2064771
|
||||
|
||||
Our downstream patches currently have tweaks in the C code to disable
|
||||
s3/s4; Thomas pointed out we can just set the property.
|
||||
|
||||
Signed-off-by: Dr. David Alan Gilbert <dgilbert@redhat.com>
|
||||
---
|
||||
hw/acpi/ich9.c | 4 ++--
|
||||
hw/acpi/piix4.c | 4 ++--
|
||||
hw/i386/pc.c | 6 ++++++
|
||||
3 files changed, 10 insertions(+), 4 deletions(-)
|
||||
|
||||
diff --git a/hw/acpi/ich9.c b/hw/acpi/ich9.c
|
||||
index de1e401cdf..bd9bbade70 100644
|
||||
--- a/hw/acpi/ich9.c
|
||||
+++ b/hw/acpi/ich9.c
|
||||
@@ -435,8 +435,8 @@ void ich9_pm_add_properties(Object *obj, ICH9LPCPMRegs *pm)
|
||||
static const uint32_t gpe0_len = ICH9_PMIO_GPE0_LEN;
|
||||
pm->acpi_memory_hotplug.is_enabled = true;
|
||||
pm->cpu_hotplug_legacy = true;
|
||||
- pm->disable_s3 = 1;
|
||||
- pm->disable_s4 = 1;
|
||||
+ pm->disable_s3 = 0;
|
||||
+ pm->disable_s4 = 0;
|
||||
pm->s4_val = 2;
|
||||
pm->use_acpi_hotplug_bridge = true;
|
||||
pm->keep_pci_slot_hpc = true;
|
||||
diff --git a/hw/acpi/piix4.c b/hw/acpi/piix4.c
|
||||
index 28544e78c3..2fb2b43248 100644
|
||||
--- a/hw/acpi/piix4.c
|
||||
+++ b/hw/acpi/piix4.c
|
||||
@@ -653,8 +653,8 @@ static void piix4_send_gpe(AcpiDeviceIf *adev, AcpiEventStatusBits ev)
|
||||
|
||||
static Property piix4_pm_properties[] = {
|
||||
DEFINE_PROP_UINT32("smb_io_base", PIIX4PMState, smb_io_base, 0),
|
||||
- DEFINE_PROP_UINT8(ACPI_PM_PROP_S3_DISABLED, PIIX4PMState, disable_s3, 1),
|
||||
- DEFINE_PROP_UINT8(ACPI_PM_PROP_S4_DISABLED, PIIX4PMState, disable_s4, 1),
|
||||
+ DEFINE_PROP_UINT8(ACPI_PM_PROP_S3_DISABLED, PIIX4PMState, disable_s3, 0),
|
||||
+ DEFINE_PROP_UINT8(ACPI_PM_PROP_S4_DISABLED, PIIX4PMState, disable_s4, 0),
|
||||
DEFINE_PROP_UINT8(ACPI_PM_PROP_S4_VAL, PIIX4PMState, s4_val, 2),
|
||||
DEFINE_PROP_BOOL(ACPI_PM_PROP_ACPI_PCIHP_BRIDGE, PIIX4PMState,
|
||||
use_acpi_hotplug_bridge, true),
|
||||
diff --git a/hw/i386/pc.c b/hw/i386/pc.c
|
||||
index 0886cfe3fe..f98f842f80 100644
|
||||
--- a/hw/i386/pc.c
|
||||
+++ b/hw/i386/pc.c
|
||||
@@ -380,6 +380,12 @@ const size_t pc_compat_1_4_len = G_N_ELEMENTS(pc_compat_1_4);
|
||||
* machine type.
|
||||
*/
|
||||
GlobalProperty pc_rhel_compat[] = {
|
||||
+ /* we don't support s3/s4 suspend */
|
||||
+ { "PIIX4_PM", "disable_s3", "1" },
|
||||
+ { "PIIX4_PM", "disable_s4", "1" },
|
||||
+ { "ICH9-LPC", "disable_s3", "1" },
|
||||
+ { "ICH9-LPC", "disable_s4", "1" },
|
||||
+
|
||||
{ TYPE_X86_CPU, "host-phys-bits", "on" },
|
||||
{ TYPE_X86_CPU, "host-phys-bits-limit", "48" },
|
||||
{ TYPE_X86_CPU, "vmx-entry-load-perf-global-ctrl", "off" },
|
||||
--
|
||||
2.31.1
|
||||
|
@ -1,75 +0,0 @@
|
||||
From eae7d8dd3c3b9aa859a619933f52a4759a42bf66 Mon Sep 17 00:00:00 2001
|
||||
From: "Dr. David Alan Gilbert" <dgilbert@redhat.com>
|
||||
Date: Tue, 23 Nov 2021 17:57:42 +0000
|
||||
Subject: x86/rhel machine types: Add pc_rhel_8_5_compat
|
||||
|
||||
RH-Author: Dr. David Alan Gilbert <dgilbert@redhat.com>
|
||||
RH-MergeRequest: 76: 9.0/6.2.0-rc1 x86 machine type fixes
|
||||
RH-Commit: [21/22] dd23060695bc0ad892bbfa51d93afe31f5d745c7
|
||||
RH-Bugzilla: 2025468
|
||||
RH-Acked-by: quintela1 <quintela@redhat.com>
|
||||
RH-Acked-by: Vitaly Kuznetsov <vkuznets@redhat.com>
|
||||
RH-Acked-by: Cornelia Huck <cohuck@redhat.com>
|
||||
|
||||
Add pc_rhel_8_5_compat as the merge of pc_compat_6_1 and pc_compat_6_0
|
||||
(since 8.5 was based on 6.0).
|
||||
|
||||
Note, x-keep-pci-slot-hpc flipped back and forward, leaving it out
|
||||
looks like it leaves us with the original.
|
||||
|
||||
Signed-off-by: Dr. David Alan Gilbert <dgilbert@redhat.com>
|
||||
Signed-off-by: Miroslav Rezanina <mrezanin@redhat.com>
|
||||
---
|
||||
hw/i386/pc.c | 21 +++++++++++++++++++++
|
||||
include/hw/i386/pc.h | 3 +++
|
||||
2 files changed, 24 insertions(+)
|
||||
|
||||
diff --git a/hw/i386/pc.c b/hw/i386/pc.c
|
||||
index b6d2db8d04..4661473d2a 100644
|
||||
--- a/hw/i386/pc.c
|
||||
+++ b/hw/i386/pc.c
|
||||
@@ -387,6 +387,27 @@ GlobalProperty pc_rhel_compat[] = {
|
||||
};
|
||||
const size_t pc_rhel_compat_len = G_N_ELEMENTS(pc_rhel_compat);
|
||||
|
||||
+GlobalProperty pc_rhel_8_5_compat[] = {
|
||||
+ /* pc_rhel_8_5_compat from pc_compat_6_0 */
|
||||
+ { "qemu64" "-" TYPE_X86_CPU, "family", "6" },
|
||||
+ /* pc_rhel_8_5_compat from pc_compat_6_0 */
|
||||
+ { "qemu64" "-" TYPE_X86_CPU, "model", "6" },
|
||||
+ /* pc_rhel_8_5_compat from pc_compat_6_0 */
|
||||
+ { "qemu64" "-" TYPE_X86_CPU, "stepping", "3" },
|
||||
+ /* pc_rhel_8_5_compat from pc_compat_6_0 */
|
||||
+ { TYPE_X86_CPU, "x-vendor-cpuid-only", "off" },
|
||||
+ /* pc_rhel_8_5_compat from pc_compat_6_0 */
|
||||
+ { "ICH9-LPC", ACPI_PM_PROP_ACPI_PCIHP_BRIDGE, "off" },
|
||||
+
|
||||
+ /* pc_rhel_8_5_compat from pc_compat_6_1 */
|
||||
+ { TYPE_X86_CPU, "hv-version-id-build", "0x1bbc" },
|
||||
+ /* pc_rhel_8_5_compat from pc_compat_6_1 */
|
||||
+ { TYPE_X86_CPU, "hv-version-id-major", "0x0006" },
|
||||
+ /* pc_rhel_8_5_compat from pc_compat_6_1 */
|
||||
+ { TYPE_X86_CPU, "hv-version-id-minor", "0x0001" },
|
||||
+};
|
||||
+const size_t pc_rhel_8_5_compat_len = G_N_ELEMENTS(pc_rhel_8_5_compat);
|
||||
+
|
||||
GlobalProperty pc_rhel_8_4_compat[] = {
|
||||
/* pc_rhel_8_4_compat from pc_compat_5_2 */
|
||||
{ "ICH9-LPC", "x-smi-cpu-hotunplug", "off" },
|
||||
diff --git a/include/hw/i386/pc.h b/include/hw/i386/pc.h
|
||||
index 9689a58b14..afb570ba14 100644
|
||||
--- a/include/hw/i386/pc.h
|
||||
+++ b/include/hw/i386/pc.h
|
||||
@@ -283,6 +283,9 @@ extern const size_t pc_compat_1_4_len;
|
||||
extern GlobalProperty pc_rhel_compat[];
|
||||
extern const size_t pc_rhel_compat_len;
|
||||
|
||||
+extern GlobalProperty pc_rhel_8_5_compat[];
|
||||
+extern const size_t pc_rhel_8_5_compat_len;
|
||||
+
|
||||
extern GlobalProperty pc_rhel_8_4_compat[];
|
||||
extern const size_t pc_rhel_8_4_compat_len;
|
||||
|
||||
--
|
||||
2.27.0
|
||||
|
@ -1,55 +0,0 @@
|
||||
From 6762f5646943c759ece5972f08eb88364cf0a8ad Mon Sep 17 00:00:00 2001
|
||||
From: "Dr. David Alan Gilbert" <dgilbert@redhat.com>
|
||||
Date: Tue, 23 Nov 2021 18:07:49 +0000
|
||||
Subject: x86/rhel machine types: Wire compat into q35 and i440fx
|
||||
|
||||
RH-Author: Dr. David Alan Gilbert <dgilbert@redhat.com>
|
||||
RH-MergeRequest: 76: 9.0/6.2.0-rc1 x86 machine type fixes
|
||||
RH-Commit: [22/22] e2767df0d920773057cb52d346e0106a76cb0a28
|
||||
RH-Bugzilla: 2025468
|
||||
RH-Acked-by: quintela1 <quintela@redhat.com>
|
||||
RH-Acked-by: Vitaly Kuznetsov <vkuznets@redhat.com>
|
||||
RH-Acked-by: Cornelia Huck <cohuck@redhat.com>
|
||||
Wire the pc_rhel_8_5 compat data into both piix and q35
|
||||
to keep the existing machine types compatible.
|
||||
|
||||
Signed-off-by: Dr. David Alan Gilbert <dgilbert@redhat.com>
|
||||
Signed-off-by: Miroslav Rezanina <mrezanin@redhat.com>
|
||||
---
|
||||
hw/i386/pc_piix.c | 4 ++++
|
||||
hw/i386/pc_q35.c | 4 ++++
|
||||
2 files changed, 8 insertions(+)
|
||||
|
||||
diff --git a/hw/i386/pc_piix.c b/hw/i386/pc_piix.c
|
||||
index dabc6c1933..183b5d5464 100644
|
||||
--- a/hw/i386/pc_piix.c
|
||||
+++ b/hw/i386/pc_piix.c
|
||||
@@ -993,6 +993,10 @@ static void pc_machine_rhel760_options(MachineClass *m)
|
||||
pcmc->kvmclock_create_always = false;
|
||||
/* From pc_i440fx_5_1_machine_options() */
|
||||
pcmc->pci_root_uid = 1;
|
||||
+ compat_props_add(m->compat_props, hw_compat_rhel_8_5,
|
||||
+ hw_compat_rhel_8_5_len);
|
||||
+ compat_props_add(m->compat_props, pc_rhel_8_5_compat,
|
||||
+ pc_rhel_8_5_compat_len);
|
||||
compat_props_add(m->compat_props, hw_compat_rhel_8_4,
|
||||
hw_compat_rhel_8_4_len);
|
||||
compat_props_add(m->compat_props, pc_rhel_8_4_compat,
|
||||
diff --git a/hw/i386/pc_q35.c b/hw/i386/pc_q35.c
|
||||
index 04c911da18..0e7e885e78 100644
|
||||
--- a/hw/i386/pc_q35.c
|
||||
+++ b/hw/i386/pc_q35.c
|
||||
@@ -658,6 +658,10 @@ static void pc_q35_machine_rhel850_options(MachineClass *m)
|
||||
m->desc = "RHEL-8.5.0 PC (Q35 + ICH9, 2009)";
|
||||
pcmc->smbios_stream_product = "RHEL-AV";
|
||||
pcmc->smbios_stream_version = "8.5.0";
|
||||
+ compat_props_add(m->compat_props, hw_compat_rhel_8_5,
|
||||
+ hw_compat_rhel_8_5_len);
|
||||
+ compat_props_add(m->compat_props, pc_rhel_8_5_compat,
|
||||
+ pc_rhel_8_5_compat_len);
|
||||
}
|
||||
|
||||
DEFINE_PC_MACHINE(q35_rhel850, "pc-q35-rhel8.5.0", pc_q35_init_rhel850,
|
||||
--
|
||||
2.27.0
|
||||
|
@ -1,50 +0,0 @@
|
||||
From 3b82be3dd3d5254baedf82ba2a6cf0412e84a991 Mon Sep 17 00:00:00 2001
|
||||
From: Eric Auger <eric.auger@redhat.com>
|
||||
Date: Tue, 16 Nov 2021 17:03:07 +0100
|
||||
Subject: redhat: virt-rhel8.5.0: Update machine type compatibility for QEMU
|
||||
6.2.0 update
|
||||
|
||||
RH-Author: Eric Auger <eric.auger@redhat.com>
|
||||
RH-MergeRequest: 75: redhat: virt-rhel8.5.0: Update machine type compatibility for QEMU 6.2.0 update
|
||||
RH-Commit: [21/21] f027d13654944e3d34e3356affe7af952eec2bed
|
||||
RH-Bugzilla: 2022607
|
||||
RH-Acked-by: Gavin Shan <gshan@redhat.com>
|
||||
RH-Acked-by: Miroslav Rezanina <mrezanin@redhat.com>
|
||||
RH-Acked-by: Andrew Jones <drjones@redhat.com>
|
||||
RH-Acked-by: Cornelia Huck <cohuck@redhat.com>
|
||||
RH-Acked-by: Laurent Vivier <lvivier@redhat.com>
|
||||
|
||||
To keep compatibility with 8.5-AV machine type we need to
|
||||
turn few new options on by default:
|
||||
smp_props.prefer_sockets, no_cpu_topology, no_tcg_its
|
||||
|
||||
TESTED: migrate from rhel-av-8.5.0 to rhel-8.6.0 and vice-versa
|
||||
with upstream fix: 33a0c404fb hw/intc/arm_gicv3_its: Revert version
|
||||
increments in vmstate_its
|
||||
|
||||
Signed-off-by: Eric Auger <eric.auger@redhat.com>
|
||||
Signed-off-by: Miroslav Rezanina <mrezanin@redhat.com>
|
||||
---
|
||||
hw/arm/virt.c | 5 +++++
|
||||
1 file changed, 5 insertions(+)
|
||||
|
||||
diff --git a/hw/arm/virt.c b/hw/arm/virt.c
|
||||
index 7d51824263..6ba9a2c2e1 100644
|
||||
--- a/hw/arm/virt.c
|
||||
+++ b/hw/arm/virt.c
|
||||
@@ -3230,7 +3230,12 @@ type_init(rhel_machine_init);
|
||||
|
||||
static void rhel850_virt_options(MachineClass *mc)
|
||||
{
|
||||
+ VirtMachineClass *vmc = VIRT_MACHINE_CLASS(OBJECT_CLASS(mc));
|
||||
+
|
||||
compat_props_add(mc->compat_props, arm_rhel_compat, arm_rhel_compat_len);
|
||||
compat_props_add(mc->compat_props, hw_compat_rhel_8_5, hw_compat_rhel_8_5_len);
|
||||
+ mc->smp_props.prefer_sockets = true;
|
||||
+ vmc->no_cpu_topology = true;
|
||||
+ vmc->no_tcg_its = true;
|
||||
}
|
||||
DEFINE_RHEL_MACHINE_AS_LATEST(8, 5, 0)
|
||||
--
|
||||
2.27.0
|
||||
|
@ -1,58 +0,0 @@
|
||||
From e6ff4de4f7036f88ee63adad6de5ee5dd74f1d99 Mon Sep 17 00:00:00 2001
|
||||
From: Thomas Huth <thuth@redhat.com>
|
||||
Date: Fri, 26 Nov 2021 09:37:11 +0100
|
||||
Subject: redhat: Add s390x machine type compatibility handling for the rebase
|
||||
to v6.2
|
||||
|
||||
RH-Author: Thomas Huth <thuth@redhat.com>
|
||||
RH-MergeRequest: 80: Add s390x machine type compatibility handling for the rebase to v6.2
|
||||
RH-Commit: [26/26] c45cf594604f6dd23954696b9c84d2025e328d11
|
||||
RH-Bugzilla: 2022602
|
||||
RH-Acked-by: David Hildenbrand <david@redhat.com>
|
||||
RH-Acked-by: Laurent Vivier <lvivier@redhat.com>
|
||||
RH-Acked-by: Cornelia Huck <cohuck@redhat.com>
|
||||
|
||||
Add compatibility handling for the rhel8.5.0 machine type (and
|
||||
recursively older, of course).
|
||||
|
||||
Based on the following upstream commits:
|
||||
|
||||
463e50da8b - s390x/cpumodel: Bump up QEMU model to a stripped-down IBM z14 GA2
|
||||
30e398f796 - s390x/cpumodel: Add more feature to gen16 default model
|
||||
4a0af2930a - machine: Prefer cores over sockets in smp parsing since 6.2
|
||||
2b52619994 - machine: Move smp_prefer_sockets to struct SMPCompatProps
|
||||
|
||||
Signed-off-by: Thomas Huth <thuth@redhat.com>
|
||||
---
|
||||
hw/s390x/s390-virtio-ccw.c | 10 ++++++++++
|
||||
1 file changed, 10 insertions(+)
|
||||
|
||||
diff --git a/hw/s390x/s390-virtio-ccw.c b/hw/s390x/s390-virtio-ccw.c
|
||||
index 4af14cb9ca..c654045964 100644
|
||||
--- a/hw/s390x/s390-virtio-ccw.c
|
||||
+++ b/hw/s390x/s390-virtio-ccw.c
|
||||
@@ -1105,11 +1105,21 @@ DEFINE_CCW_MACHINE(2_4, "2.4", false);
|
||||
|
||||
static void ccw_machine_rhel850_instance_options(MachineState *machine)
|
||||
{
|
||||
+ static const S390FeatInit qemu_cpu_feat = { S390_FEAT_LIST_QEMU_V6_0 };
|
||||
+
|
||||
+ s390_set_qemu_cpu_model(0x2964, 13, 2, qemu_cpu_feat);
|
||||
+
|
||||
+ s390_cpudef_featoff_greater(16, 1, S390_FEAT_NNPA);
|
||||
+ s390_cpudef_featoff_greater(16, 1, S390_FEAT_VECTOR_PACKED_DECIMAL_ENH2);
|
||||
+ s390_cpudef_featoff_greater(16, 1, S390_FEAT_BEAR_ENH);
|
||||
+ s390_cpudef_featoff_greater(16, 1, S390_FEAT_RDP);
|
||||
+ s390_cpudef_featoff_greater(16, 1, S390_FEAT_PAI);
|
||||
}
|
||||
|
||||
static void ccw_machine_rhel850_class_options(MachineClass *mc)
|
||||
{
|
||||
compat_props_add(mc->compat_props, hw_compat_rhel_8_5, hw_compat_rhel_8_5_len);
|
||||
+ mc->smp_props.prefer_sockets = true;
|
||||
}
|
||||
DEFINE_CCW_MACHINE(rhel850, "rhel8.5.0", true);
|
||||
|
||||
--
|
||||
2.27.0
|
||||
|
@ -1,31 +0,0 @@
|
||||
From 168f0d56e3a37a7d5fcc59483e2b1181824a23d2 Mon Sep 17 00:00:00 2001
|
||||
From: Miroslav Rezanina <mrezanin@redhat.com>
|
||||
Date: Wed, 24 Nov 2021 23:51:52 -0500
|
||||
Subject: compat: Update hw_compat_rhel_8_5 with 6.2.0 RC2 changes
|
||||
|
||||
In RC2 nvme-ns 'shared' default was changed (commit 916b0f0b52).
|
||||
|
||||
Adding compat record for RHEL 8.5.0 so we keep it off for downstream
|
||||
machinetypes.
|
||||
|
||||
Signed-off-by: Miroslav Rezanina <mrezanin@redhat.com>
|
||||
---
|
||||
hw/core/machine.c | 2 ++
|
||||
1 file changed, 2 insertions(+)
|
||||
|
||||
diff --git a/hw/core/machine.c b/hw/core/machine.c
|
||||
index 448a8dd127..669d3d8b91 100644
|
||||
--- a/hw/core/machine.c
|
||||
+++ b/hw/core/machine.c
|
||||
@@ -55,6 +55,8 @@ GlobalProperty hw_compat_rhel_8_5[] = {
|
||||
{ "vhost-vsock-device", "seqpacket", "off" },
|
||||
/* hw_compat_rhel_8_5 from hw_compat_6_1 */
|
||||
{ "vhost-user-vsock-device", "seqpacket", "off" },
|
||||
+ /* hw_compat_rhel_8_5 from hw_compat_6_1 */
|
||||
+ { "nvme-ns", "shared", "off" },
|
||||
};
|
||||
const size_t hw_compat_rhel_8_5_len = G_N_ELEMENTS(hw_compat_rhel_8_5);
|
||||
|
||||
--
|
||||
2.27.0
|
||||
|
@ -0,0 +1,87 @@
|
||||
From ac346634c5731407baa9de709dbd4d5cc6f45301 Mon Sep 17 00:00:00 2001
|
||||
From: Leonardo Bras <leobras@redhat.com>
|
||||
Date: Mon, 11 Jul 2022 18:11:12 -0300
|
||||
Subject: [PATCH 02/11] Add dirty-sync-missed-zero-copy migration stat
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
RH-Author: Leonardo Brás <leobras@redhat.com>
|
||||
RH-MergeRequest: 111: zero-copy-send fixes & improvements
|
||||
RH-Commit: [2/6] 115035fd0a4e4b9439c91fb0f5d1a2f9244ba369 (LeoBras/centos-qemu-kvm)
|
||||
RH-Bugzilla: 2107466
|
||||
RH-Acked-by: Miroslav Rezanina <mrezanin@redhat.com>
|
||||
RH-Acked-by: Thomas Huth <thuth@redhat.com>
|
||||
RH-Acked-by: Dr. David Alan Gilbert <dgilbert@redhat.com>
|
||||
|
||||
Signed-off-by: Leonardo Bras <leobras@redhat.com>
|
||||
Acked-by: Markus Armbruster <armbru@redhat.com>
|
||||
Acked-by: Peter Xu <peterx@redhat.com>
|
||||
Reviewed-by: Daniel P. Berrangé <berrange@redhat.com>
|
||||
Message-Id: <20220711211112.18951-3-leobras@redhat.com>
|
||||
Signed-off-by: Dr. David Alan Gilbert <dgilbert@redhat.com>
|
||||
(cherry picked from commit cf20c897338067ab4b70a4596fdccaf90c7e29a1)
|
||||
Signed-off-by: Leonardo Bras <leobras@redhat.com>
|
||||
---
|
||||
migration/migration.c | 2 ++
|
||||
monitor/hmp-cmds.c | 5 +++++
|
||||
qapi/migration.json | 7 ++++++-
|
||||
3 files changed, 13 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/migration/migration.c b/migration/migration.c
|
||||
index 8fb3eae910..3a3a7a4a50 100644
|
||||
--- a/migration/migration.c
|
||||
+++ b/migration/migration.c
|
||||
@@ -1017,6 +1017,8 @@ static void populate_ram_info(MigrationInfo *info, MigrationState *s)
|
||||
info->ram->normal_bytes = ram_counters.normal * page_size;
|
||||
info->ram->mbps = s->mbps;
|
||||
info->ram->dirty_sync_count = ram_counters.dirty_sync_count;
|
||||
+ info->ram->dirty_sync_missed_zero_copy =
|
||||
+ ram_counters.dirty_sync_missed_zero_copy;
|
||||
info->ram->postcopy_requests = ram_counters.postcopy_requests;
|
||||
info->ram->page_size = page_size;
|
||||
info->ram->multifd_bytes = ram_counters.multifd_bytes;
|
||||
diff --git a/monitor/hmp-cmds.c b/monitor/hmp-cmds.c
|
||||
index 634968498b..9cec01de38 100644
|
||||
--- a/monitor/hmp-cmds.c
|
||||
+++ b/monitor/hmp-cmds.c
|
||||
@@ -305,6 +305,11 @@ void hmp_info_migrate(Monitor *mon, const QDict *qdict)
|
||||
monitor_printf(mon, "postcopy ram: %" PRIu64 " kbytes\n",
|
||||
info->ram->postcopy_bytes >> 10);
|
||||
}
|
||||
+ if (info->ram->dirty_sync_missed_zero_copy) {
|
||||
+ monitor_printf(mon,
|
||||
+ "Zero-copy-send fallbacks happened: %" PRIu64 " times\n",
|
||||
+ info->ram->dirty_sync_missed_zero_copy);
|
||||
+ }
|
||||
}
|
||||
|
||||
if (info->has_disk) {
|
||||
diff --git a/qapi/migration.json b/qapi/migration.json
|
||||
index 5105790cd0..9b38b3c21c 100644
|
||||
--- a/qapi/migration.json
|
||||
+++ b/qapi/migration.json
|
||||
@@ -55,6 +55,10 @@
|
||||
# @postcopy-bytes: The number of bytes sent during the post-copy phase
|
||||
# (since 7.0).
|
||||
#
|
||||
+# @dirty-sync-missed-zero-copy: Number of times dirty RAM synchronization could
|
||||
+# not avoid copying dirty pages. This is between
|
||||
+# 0 and @dirty-sync-count * @multifd-channels.
|
||||
+# (since 7.1)
|
||||
# Since: 0.14
|
||||
##
|
||||
{ 'struct': 'MigrationStats',
|
||||
@@ -65,7 +69,8 @@
|
||||
'postcopy-requests' : 'int', 'page-size' : 'int',
|
||||
'multifd-bytes' : 'uint64', 'pages-per-second' : 'uint64',
|
||||
'precopy-bytes' : 'uint64', 'downtime-bytes' : 'uint64',
|
||||
- 'postcopy-bytes' : 'uint64' } }
|
||||
+ 'postcopy-bytes' : 'uint64',
|
||||
+ 'dirty-sync-missed-zero-copy' : 'uint64' } }
|
||||
|
||||
##
|
||||
# @XBZRLECacheStats:
|
||||
--
|
||||
2.31.1
|
||||
|
@ -1,28 +0,0 @@
|
||||
From f4f7c62a4658a570d3ad694b64463665fa4b80a7 Mon Sep 17 00:00:00 2001
|
||||
From: Paul Lai <plai@redhat.com>
|
||||
Date: Fri, 21 Jan 2022 13:14:42 -0500
|
||||
Subject: [PATCH 04/12] Enable SGX -- RH Only
|
||||
|
||||
RH-Author: Paul Lai <plai@redhat.com>
|
||||
RH-MergeRequest: 65: Enable SGX and add SGX Numa support
|
||||
RH-Commit: [4/5] 2cd4ee4a429f5e7b1c32e83a10bf488503603795
|
||||
RH-Bugzilla: 2033708
|
||||
RH-Acked-by: Paolo Bonzini <None>
|
||||
RH-Acked-by: Bandan Das <None>
|
||||
RH-Acked-by: Cornelia Huck <cohuck@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 dc03fbb671..327b1bee62 100644
|
||||
--- a/configs/devices/x86_64-softmmu/x86_64-rh-devices.mak
|
||||
+++ b/configs/devices/x86_64-softmmu/x86_64-rh-devices.mak
|
||||
@@ -101,3 +101,4 @@ CONFIG_TPM=y
|
||||
CONFIG_TPM_CRB=y
|
||||
CONFIG_TPM_TIS_ISA=y
|
||||
CONFIG_TPM_EMULATOR=y
|
||||
+CONFIG_SGX=y
|
||||
--
|
||||
2.27.0
|
||||
|
41
SOURCES/kvm-Enable-virtio-iommu-pci-on-aarch64.patch
Normal file
41
SOURCES/kvm-Enable-virtio-iommu-pci-on-aarch64.patch
Normal file
@ -0,0 +1,41 @@
|
||||
From 85781b8745fa1581a66f64011d61a4f0c4e103dc Mon Sep 17 00:00:00 2001
|
||||
From: Eric Auger <eric.auger@redhat.com>
|
||||
Date: Fri, 6 May 2022 17:03:11 +0200
|
||||
Subject: [PATCH 3/5] Enable virtio-iommu-pci on aarch64
|
||||
|
||||
RH-Author: Eric Auger <eric.auger@redhat.com>
|
||||
RH-MergeRequest: 83: Enable virtio-iommu-pci on aarch64
|
||||
RH-Commit: [1/1] 23e5c0832e52c66adf5fd6daccdc3edddc7ecb8b (eauger1/centos-qemu-kvm)
|
||||
RH-Bugzilla: 1477099
|
||||
RH-Acked-by: Gavin Shan <gshan@redhat.com>
|
||||
RH-Acked-by: Andrew Jones <drjones@redhat.com>
|
||||
RH-Acked-by: Cornelia Huck <cohuck@redhat.com>
|
||||
|
||||
Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1477099
|
||||
Brew: https://brewweb.engineering.redhat.com/brew/taskinfo?taskID=45128798
|
||||
Upstream Status: RHEL-only
|
||||
Tested: With virtio-net-pci and virtio-block-pci
|
||||
|
||||
let's enable the virtio-iommu-pci device on aarch64 by
|
||||
turning CONFIG_VIRTIO_IOMMU on.
|
||||
|
||||
Signed-off-by: Eric Auger <eric.auger@redhat.com>
|
||||
---
|
||||
configs/devices/aarch64-softmmu/aarch64-rh-devices.mak | 1 +
|
||||
1 file changed, 1 insertion(+)
|
||||
|
||||
diff --git a/configs/devices/aarch64-softmmu/aarch64-rh-devices.mak b/configs/devices/aarch64-softmmu/aarch64-rh-devices.mak
|
||||
index 187938573f..1618d31b89 100644
|
||||
--- a/configs/devices/aarch64-softmmu/aarch64-rh-devices.mak
|
||||
+++ b/configs/devices/aarch64-softmmu/aarch64-rh-devices.mak
|
||||
@@ -23,6 +23,7 @@ CONFIG_VFIO_PCI=y
|
||||
CONFIG_VIRTIO_MMIO=y
|
||||
CONFIG_VIRTIO_PCI=y
|
||||
CONFIG_VIRTIO_MEM=y
|
||||
+CONFIG_VIRTIO_IOMMU=y
|
||||
CONFIG_XIO3130=y
|
||||
CONFIG_NVDIMM=y
|
||||
CONFIG_ACPI_APEI=y
|
||||
--
|
||||
2.31.1
|
||||
|
41
SOURCES/kvm-Enable-virtio-iommu-pci-on-x86_64.patch
Normal file
41
SOURCES/kvm-Enable-virtio-iommu-pci-on-x86_64.patch
Normal file
@ -0,0 +1,41 @@
|
||||
From c531a39171201f8a1d063e6af752e5d629c1b4bf Mon Sep 17 00:00:00 2001
|
||||
From: Eric Auger <eric.auger@redhat.com>
|
||||
Date: Thu, 9 Jun 2022 11:35:18 +0200
|
||||
Subject: [PATCH 4/6] Enable virtio-iommu-pci on x86_64
|
||||
|
||||
RH-Author: Eric Auger <eric.auger@redhat.com>
|
||||
RH-MergeRequest: 100: Enable virtio-iommu-pci on x86_64
|
||||
RH-Commit: [1/1] a164af477efc7cb9d3d76a0e644f198f7c9fb2b5 (eauger1/centos-qemu-kvm)
|
||||
RH-Bugzilla: 2094252
|
||||
RH-Acked-by: Miroslav Rezanina <mrezanin@redhat.com>
|
||||
RH-Acked-by: MST <mst@redhat.com>
|
||||
RH-Acked-by: Cornelia Huck <cohuck@redhat.com>
|
||||
|
||||
Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=2094252
|
||||
Brew: https://brewweb.engineering.redhat.com/brew/taskinfo?taskID=45871185
|
||||
Upstream Status: RHEL-only
|
||||
Tested: With virtio-net-pci and virtio-block-pci
|
||||
|
||||
let's enable the virtio-iommu-pci device on x86_64 by
|
||||
turning CONFIG_VIRTIO_IOMMU on.
|
||||
|
||||
Signed-off-by: Eric Auger <eric.auger@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 d0c9e66641..3850b9de72 100644
|
||||
--- a/configs/devices/x86_64-softmmu/x86_64-rh-devices.mak
|
||||
+++ b/configs/devices/x86_64-softmmu/x86_64-rh-devices.mak
|
||||
@@ -90,6 +90,7 @@ CONFIG_VHOST_USER_BLK=y
|
||||
CONFIG_VIRTIO_MEM=y
|
||||
CONFIG_VIRTIO_PCI=y
|
||||
CONFIG_VIRTIO_VGA=y
|
||||
+CONFIG_VIRTIO_IOMMU=y
|
||||
CONFIG_VMMOUSE=y
|
||||
CONFIG_VMPORT=y
|
||||
CONFIG_VTD=y
|
||||
--
|
||||
2.31.1
|
||||
|
503
SOURCES/kvm-Introduce-event-loop-base-abstract-class.patch
Normal file
503
SOURCES/kvm-Introduce-event-loop-base-abstract-class.patch
Normal file
@ -0,0 +1,503 @@
|
||||
From 1163da281c178359dd7e1cf1ced5c98caa600f8e Mon Sep 17 00:00:00 2001
|
||||
From: Nicolas Saenz Julienne <nsaenzju@redhat.com>
|
||||
Date: Mon, 25 Apr 2022 09:57:21 +0200
|
||||
Subject: [PATCH 01/16] Introduce event-loop-base abstract class
|
||||
|
||||
RH-Author: Nicolas Saenz Julienne <nsaenzju@redhat.com>
|
||||
RH-MergeRequest: 93: util/thread-pool: Expose minimum and maximum size
|
||||
RH-Commit: [1/3] 5817205d8f56cc4aa98bd5963ecac54a59bad990
|
||||
RH-Bugzilla: 2031024
|
||||
RH-Acked-by: Miroslav Rezanina <mrezanin@redhat.com>
|
||||
RH-Acked-by: Stefano Garzarella <sgarzare@redhat.com>
|
||||
RH-Acked-by: Stefan Hajnoczi <stefanha@redhat.com>
|
||||
|
||||
Introduce the 'event-loop-base' abstract class, it'll hold the
|
||||
properties common to all event loops and provide the necessary hooks for
|
||||
their creation and maintenance. Then have iothread inherit from it.
|
||||
|
||||
EventLoopBaseClass is defined as user creatable and provides a hook for
|
||||
its children to attach themselves to the user creatable class 'complete'
|
||||
function. It also provides an update_params() callback to propagate
|
||||
property changes onto its children.
|
||||
|
||||
The new 'event-loop-base' class will live in the root directory. It is
|
||||
built on its own using the 'link_whole' option (there are no direct
|
||||
function dependencies between the class and its children, it all happens
|
||||
trough 'constructor' magic). And also imposes new compilation
|
||||
dependencies:
|
||||
|
||||
qom <- event-loop-base <- blockdev (iothread.c)
|
||||
|
||||
And in subsequent patches:
|
||||
|
||||
qom <- event-loop-base <- qemuutil (util/main-loop.c)
|
||||
|
||||
All this forced some amount of reordering in meson.build:
|
||||
|
||||
- Moved qom build definition before qemuutil. Doing it the other way
|
||||
around (i.e. moving qemuutil after qom) isn't possible as a lot of
|
||||
core libraries that live in between the two depend on it.
|
||||
|
||||
- Process the 'hw' subdir earlier, as it introduces files into the
|
||||
'qom' source set.
|
||||
|
||||
No functional changes intended.
|
||||
|
||||
Signed-off-by: Nicolas Saenz Julienne <nsaenzju@redhat.com>
|
||||
Reviewed-by: Stefan Hajnoczi <stefanha@redhat.com>
|
||||
Acked-by: Markus Armbruster <armbru@redhat.com>
|
||||
Message-id: 20220425075723.20019-2-nsaenzju@redhat.com
|
||||
Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
|
||||
(cherry picked from commit 7d5983e3c8c40b1d0668faba31d79905c4fadd7d)
|
||||
---
|
||||
event-loop-base.c | 104 +++++++++++++++++++++++++++++++
|
||||
include/sysemu/event-loop-base.h | 36 +++++++++++
|
||||
include/sysemu/iothread.h | 6 +-
|
||||
iothread.c | 65 ++++++-------------
|
||||
meson.build | 23 ++++---
|
||||
qapi/qom.json | 22 +++++--
|
||||
6 files changed, 192 insertions(+), 64 deletions(-)
|
||||
create mode 100644 event-loop-base.c
|
||||
create mode 100644 include/sysemu/event-loop-base.h
|
||||
|
||||
diff --git a/event-loop-base.c b/event-loop-base.c
|
||||
new file mode 100644
|
||||
index 0000000000..a924c73a7c
|
||||
--- /dev/null
|
||||
+++ b/event-loop-base.c
|
||||
@@ -0,0 +1,104 @@
|
||||
+/*
|
||||
+ * QEMU event-loop base
|
||||
+ *
|
||||
+ * Copyright (C) 2022 Red Hat Inc
|
||||
+ *
|
||||
+ * Authors:
|
||||
+ * Stefan Hajnoczi <stefanha@redhat.com>
|
||||
+ * Nicolas Saenz Julienne <nsaenzju@redhat.com>
|
||||
+ *
|
||||
+ * This work is licensed under the terms of the GNU GPL, version 2 or later.
|
||||
+ * See the COPYING file in the top-level directory.
|
||||
+ */
|
||||
+
|
||||
+#include "qemu/osdep.h"
|
||||
+#include "qom/object_interfaces.h"
|
||||
+#include "qapi/error.h"
|
||||
+#include "sysemu/event-loop-base.h"
|
||||
+
|
||||
+typedef struct {
|
||||
+ const char *name;
|
||||
+ ptrdiff_t offset; /* field's byte offset in EventLoopBase struct */
|
||||
+} EventLoopBaseParamInfo;
|
||||
+
|
||||
+static EventLoopBaseParamInfo aio_max_batch_info = {
|
||||
+ "aio-max-batch", offsetof(EventLoopBase, aio_max_batch),
|
||||
+};
|
||||
+
|
||||
+static void event_loop_base_get_param(Object *obj, Visitor *v,
|
||||
+ const char *name, void *opaque, Error **errp)
|
||||
+{
|
||||
+ EventLoopBase *event_loop_base = EVENT_LOOP_BASE(obj);
|
||||
+ EventLoopBaseParamInfo *info = opaque;
|
||||
+ int64_t *field = (void *)event_loop_base + info->offset;
|
||||
+
|
||||
+ visit_type_int64(v, name, field, errp);
|
||||
+}
|
||||
+
|
||||
+static void event_loop_base_set_param(Object *obj, Visitor *v,
|
||||
+ const char *name, void *opaque, Error **errp)
|
||||
+{
|
||||
+ EventLoopBaseClass *bc = EVENT_LOOP_BASE_GET_CLASS(obj);
|
||||
+ EventLoopBase *base = EVENT_LOOP_BASE(obj);
|
||||
+ EventLoopBaseParamInfo *info = opaque;
|
||||
+ int64_t *field = (void *)base + info->offset;
|
||||
+ int64_t value;
|
||||
+
|
||||
+ if (!visit_type_int64(v, name, &value, errp)) {
|
||||
+ return;
|
||||
+ }
|
||||
+
|
||||
+ if (value < 0) {
|
||||
+ error_setg(errp, "%s value must be in range [0, %" PRId64 "]",
|
||||
+ info->name, INT64_MAX);
|
||||
+ return;
|
||||
+ }
|
||||
+
|
||||
+ *field = value;
|
||||
+
|
||||
+ if (bc->update_params) {
|
||||
+ bc->update_params(base, errp);
|
||||
+ }
|
||||
+
|
||||
+ return;
|
||||
+}
|
||||
+
|
||||
+static void event_loop_base_complete(UserCreatable *uc, Error **errp)
|
||||
+{
|
||||
+ EventLoopBaseClass *bc = EVENT_LOOP_BASE_GET_CLASS(uc);
|
||||
+ EventLoopBase *base = EVENT_LOOP_BASE(uc);
|
||||
+
|
||||
+ if (bc->init) {
|
||||
+ bc->init(base, errp);
|
||||
+ }
|
||||
+}
|
||||
+
|
||||
+static void event_loop_base_class_init(ObjectClass *klass, void *class_data)
|
||||
+{
|
||||
+ UserCreatableClass *ucc = USER_CREATABLE_CLASS(klass);
|
||||
+ ucc->complete = event_loop_base_complete;
|
||||
+
|
||||
+ object_class_property_add(klass, "aio-max-batch", "int",
|
||||
+ event_loop_base_get_param,
|
||||
+ event_loop_base_set_param,
|
||||
+ NULL, &aio_max_batch_info);
|
||||
+}
|
||||
+
|
||||
+static const TypeInfo event_loop_base_info = {
|
||||
+ .name = TYPE_EVENT_LOOP_BASE,
|
||||
+ .parent = TYPE_OBJECT,
|
||||
+ .instance_size = sizeof(EventLoopBase),
|
||||
+ .class_size = sizeof(EventLoopBaseClass),
|
||||
+ .class_init = event_loop_base_class_init,
|
||||
+ .abstract = true,
|
||||
+ .interfaces = (InterfaceInfo[]) {
|
||||
+ { TYPE_USER_CREATABLE },
|
||||
+ { }
|
||||
+ }
|
||||
+};
|
||||
+
|
||||
+static void register_types(void)
|
||||
+{
|
||||
+ type_register_static(&event_loop_base_info);
|
||||
+}
|
||||
+type_init(register_types);
|
||||
diff --git a/include/sysemu/event-loop-base.h b/include/sysemu/event-loop-base.h
|
||||
new file mode 100644
|
||||
index 0000000000..8e77d8b69f
|
||||
--- /dev/null
|
||||
+++ b/include/sysemu/event-loop-base.h
|
||||
@@ -0,0 +1,36 @@
|
||||
+/*
|
||||
+ * QEMU event-loop backend
|
||||
+ *
|
||||
+ * Copyright (C) 2022 Red Hat Inc
|
||||
+ *
|
||||
+ * Authors:
|
||||
+ * Nicolas Saenz Julienne <nsaenzju@redhat.com>
|
||||
+ *
|
||||
+ * This work is licensed under the terms of the GNU GPL, version 2 or later.
|
||||
+ * See the COPYING file in the top-level directory.
|
||||
+ */
|
||||
+#ifndef QEMU_EVENT_LOOP_BASE_H
|
||||
+#define QEMU_EVENT_LOOP_BASE_H
|
||||
+
|
||||
+#include "qom/object.h"
|
||||
+#include "block/aio.h"
|
||||
+#include "qemu/typedefs.h"
|
||||
+
|
||||
+#define TYPE_EVENT_LOOP_BASE "event-loop-base"
|
||||
+OBJECT_DECLARE_TYPE(EventLoopBase, EventLoopBaseClass,
|
||||
+ EVENT_LOOP_BASE)
|
||||
+
|
||||
+struct EventLoopBaseClass {
|
||||
+ ObjectClass parent_class;
|
||||
+
|
||||
+ void (*init)(EventLoopBase *base, Error **errp);
|
||||
+ void (*update_params)(EventLoopBase *base, Error **errp);
|
||||
+};
|
||||
+
|
||||
+struct EventLoopBase {
|
||||
+ Object parent;
|
||||
+
|
||||
+ /* AioContext AIO engine parameters */
|
||||
+ int64_t aio_max_batch;
|
||||
+};
|
||||
+#endif
|
||||
diff --git a/include/sysemu/iothread.h b/include/sysemu/iothread.h
|
||||
index 7f714bd136..8f8601d6ab 100644
|
||||
--- a/include/sysemu/iothread.h
|
||||
+++ b/include/sysemu/iothread.h
|
||||
@@ -17,11 +17,12 @@
|
||||
#include "block/aio.h"
|
||||
#include "qemu/thread.h"
|
||||
#include "qom/object.h"
|
||||
+#include "sysemu/event-loop-base.h"
|
||||
|
||||
#define TYPE_IOTHREAD "iothread"
|
||||
|
||||
struct IOThread {
|
||||
- Object parent_obj;
|
||||
+ EventLoopBase parent_obj;
|
||||
|
||||
QemuThread thread;
|
||||
AioContext *ctx;
|
||||
@@ -37,9 +38,6 @@ struct IOThread {
|
||||
int64_t poll_max_ns;
|
||||
int64_t poll_grow;
|
||||
int64_t poll_shrink;
|
||||
-
|
||||
- /* AioContext AIO engine parameters */
|
||||
- int64_t aio_max_batch;
|
||||
};
|
||||
typedef struct IOThread IOThread;
|
||||
|
||||
diff --git a/iothread.c b/iothread.c
|
||||
index 0f98af0f2a..8fa2f3bfb8 100644
|
||||
--- a/iothread.c
|
||||
+++ b/iothread.c
|
||||
@@ -17,6 +17,7 @@
|
||||
#include "qemu/module.h"
|
||||
#include "block/aio.h"
|
||||
#include "block/block.h"
|
||||
+#include "sysemu/event-loop-base.h"
|
||||
#include "sysemu/iothread.h"
|
||||
#include "qapi/error.h"
|
||||
#include "qapi/qapi-commands-misc.h"
|
||||
@@ -152,10 +153,15 @@ static void iothread_init_gcontext(IOThread *iothread)
|
||||
iothread->main_loop = g_main_loop_new(iothread->worker_context, TRUE);
|
||||
}
|
||||
|
||||
-static void iothread_set_aio_context_params(IOThread *iothread, Error **errp)
|
||||
+static void iothread_set_aio_context_params(EventLoopBase *base, Error **errp)
|
||||
{
|
||||
+ IOThread *iothread = IOTHREAD(base);
|
||||
ERRP_GUARD();
|
||||
|
||||
+ if (!iothread->ctx) {
|
||||
+ return;
|
||||
+ }
|
||||
+
|
||||
aio_context_set_poll_params(iothread->ctx,
|
||||
iothread->poll_max_ns,
|
||||
iothread->poll_grow,
|
||||
@@ -166,14 +172,15 @@ static void iothread_set_aio_context_params(IOThread *iothread, Error **errp)
|
||||
}
|
||||
|
||||
aio_context_set_aio_params(iothread->ctx,
|
||||
- iothread->aio_max_batch,
|
||||
+ iothread->parent_obj.aio_max_batch,
|
||||
errp);
|
||||
}
|
||||
|
||||
-static void iothread_complete(UserCreatable *obj, Error **errp)
|
||||
+
|
||||
+static void iothread_init(EventLoopBase *base, Error **errp)
|
||||
{
|
||||
Error *local_error = NULL;
|
||||
- IOThread *iothread = IOTHREAD(obj);
|
||||
+ IOThread *iothread = IOTHREAD(base);
|
||||
char *thread_name;
|
||||
|
||||
iothread->stopping = false;
|
||||
@@ -189,7 +196,7 @@ static void iothread_complete(UserCreatable *obj, Error **errp)
|
||||
*/
|
||||
iothread_init_gcontext(iothread);
|
||||
|
||||
- iothread_set_aio_context_params(iothread, &local_error);
|
||||
+ iothread_set_aio_context_params(base, &local_error);
|
||||
if (local_error) {
|
||||
error_propagate(errp, local_error);
|
||||
aio_context_unref(iothread->ctx);
|
||||
@@ -201,7 +208,7 @@ static void iothread_complete(UserCreatable *obj, Error **errp)
|
||||
* to inherit.
|
||||
*/
|
||||
thread_name = g_strdup_printf("IO %s",
|
||||
- object_get_canonical_path_component(OBJECT(obj)));
|
||||
+ object_get_canonical_path_component(OBJECT(base)));
|
||||
qemu_thread_create(&iothread->thread, thread_name, iothread_run,
|
||||
iothread, QEMU_THREAD_JOINABLE);
|
||||
g_free(thread_name);
|
||||
@@ -226,9 +233,6 @@ static IOThreadParamInfo poll_grow_info = {
|
||||
static IOThreadParamInfo poll_shrink_info = {
|
||||
"poll-shrink", offsetof(IOThread, poll_shrink),
|
||||
};
|
||||
-static IOThreadParamInfo aio_max_batch_info = {
|
||||
- "aio-max-batch", offsetof(IOThread, aio_max_batch),
|
||||
-};
|
||||
|
||||
static void iothread_get_param(Object *obj, Visitor *v,
|
||||
const char *name, IOThreadParamInfo *info, Error **errp)
|
||||
@@ -288,35 +292,12 @@ static void iothread_set_poll_param(Object *obj, Visitor *v,
|
||||
}
|
||||
}
|
||||
|
||||
-static void iothread_get_aio_param(Object *obj, Visitor *v,
|
||||
- const char *name, void *opaque, Error **errp)
|
||||
-{
|
||||
- IOThreadParamInfo *info = opaque;
|
||||
-
|
||||
- iothread_get_param(obj, v, name, info, errp);
|
||||
-}
|
||||
-
|
||||
-static void iothread_set_aio_param(Object *obj, Visitor *v,
|
||||
- const char *name, void *opaque, Error **errp)
|
||||
-{
|
||||
- IOThread *iothread = IOTHREAD(obj);
|
||||
- IOThreadParamInfo *info = opaque;
|
||||
-
|
||||
- if (!iothread_set_param(obj, v, name, info, errp)) {
|
||||
- return;
|
||||
- }
|
||||
-
|
||||
- if (iothread->ctx) {
|
||||
- aio_context_set_aio_params(iothread->ctx,
|
||||
- iothread->aio_max_batch,
|
||||
- errp);
|
||||
- }
|
||||
-}
|
||||
-
|
||||
static void iothread_class_init(ObjectClass *klass, void *class_data)
|
||||
{
|
||||
- UserCreatableClass *ucc = USER_CREATABLE_CLASS(klass);
|
||||
- ucc->complete = iothread_complete;
|
||||
+ EventLoopBaseClass *bc = EVENT_LOOP_BASE_CLASS(klass);
|
||||
+
|
||||
+ bc->init = iothread_init;
|
||||
+ bc->update_params = iothread_set_aio_context_params;
|
||||
|
||||
object_class_property_add(klass, "poll-max-ns", "int",
|
||||
iothread_get_poll_param,
|
||||
@@ -330,23 +311,15 @@ static void iothread_class_init(ObjectClass *klass, void *class_data)
|
||||
iothread_get_poll_param,
|
||||
iothread_set_poll_param,
|
||||
NULL, &poll_shrink_info);
|
||||
- object_class_property_add(klass, "aio-max-batch", "int",
|
||||
- iothread_get_aio_param,
|
||||
- iothread_set_aio_param,
|
||||
- NULL, &aio_max_batch_info);
|
||||
}
|
||||
|
||||
static const TypeInfo iothread_info = {
|
||||
.name = TYPE_IOTHREAD,
|
||||
- .parent = TYPE_OBJECT,
|
||||
+ .parent = TYPE_EVENT_LOOP_BASE,
|
||||
.class_init = iothread_class_init,
|
||||
.instance_size = sizeof(IOThread),
|
||||
.instance_init = iothread_instance_init,
|
||||
.instance_finalize = iothread_instance_finalize,
|
||||
- .interfaces = (InterfaceInfo[]) {
|
||||
- {TYPE_USER_CREATABLE},
|
||||
- {}
|
||||
- },
|
||||
};
|
||||
|
||||
static void iothread_register_types(void)
|
||||
@@ -383,7 +356,7 @@ static int query_one_iothread(Object *object, void *opaque)
|
||||
info->poll_max_ns = iothread->poll_max_ns;
|
||||
info->poll_grow = iothread->poll_grow;
|
||||
info->poll_shrink = iothread->poll_shrink;
|
||||
- info->aio_max_batch = iothread->aio_max_batch;
|
||||
+ info->aio_max_batch = iothread->parent_obj.aio_max_batch;
|
||||
|
||||
QAPI_LIST_APPEND(*tail, info);
|
||||
return 0;
|
||||
diff --git a/meson.build b/meson.build
|
||||
index 6f7e430f0f..b9c919a55e 100644
|
||||
--- a/meson.build
|
||||
+++ b/meson.build
|
||||
@@ -2804,6 +2804,7 @@ subdir('qom')
|
||||
subdir('authz')
|
||||
subdir('crypto')
|
||||
subdir('ui')
|
||||
+subdir('hw')
|
||||
|
||||
|
||||
if enable_modules
|
||||
@@ -2811,6 +2812,18 @@ if enable_modules
|
||||
modulecommon = declare_dependency(link_whole: libmodulecommon, compile_args: '-DBUILD_DSO')
|
||||
endif
|
||||
|
||||
+qom_ss = qom_ss.apply(config_host, strict: false)
|
||||
+libqom = static_library('qom', qom_ss.sources() + genh,
|
||||
+ dependencies: [qom_ss.dependencies()],
|
||||
+ name_suffix: 'fa')
|
||||
+qom = declare_dependency(link_whole: libqom)
|
||||
+
|
||||
+event_loop_base = files('event-loop-base.c')
|
||||
+event_loop_base = static_library('event-loop-base', sources: event_loop_base + genh,
|
||||
+ build_by_default: true)
|
||||
+event_loop_base = declare_dependency(link_whole: event_loop_base,
|
||||
+ dependencies: [qom])
|
||||
+
|
||||
stub_ss = stub_ss.apply(config_all, strict: false)
|
||||
|
||||
util_ss.add_all(trace_ss)
|
||||
@@ -2897,7 +2910,6 @@ subdir('monitor')
|
||||
subdir('net')
|
||||
subdir('replay')
|
||||
subdir('semihosting')
|
||||
-subdir('hw')
|
||||
subdir('tcg')
|
||||
subdir('fpu')
|
||||
subdir('accel')
|
||||
@@ -3022,13 +3034,6 @@ qemu_syms = custom_target('qemu.syms', output: 'qemu.syms',
|
||||
capture: true,
|
||||
command: [undefsym, nm, '@INPUT@'])
|
||||
|
||||
-qom_ss = qom_ss.apply(config_host, strict: false)
|
||||
-libqom = static_library('qom', qom_ss.sources() + genh,
|
||||
- dependencies: [qom_ss.dependencies()],
|
||||
- name_suffix: 'fa')
|
||||
-
|
||||
-qom = declare_dependency(link_whole: libqom)
|
||||
-
|
||||
authz_ss = authz_ss.apply(config_host, strict: false)
|
||||
libauthz = static_library('authz', authz_ss.sources() + genh,
|
||||
dependencies: [authz_ss.dependencies()],
|
||||
@@ -3081,7 +3086,7 @@ libblockdev = static_library('blockdev', blockdev_ss.sources() + genh,
|
||||
build_by_default: false)
|
||||
|
||||
blockdev = declare_dependency(link_whole: [libblockdev],
|
||||
- dependencies: [block])
|
||||
+ dependencies: [block, event_loop_base])
|
||||
|
||||
qmp_ss = qmp_ss.apply(config_host, strict: false)
|
||||
libqmp = static_library('qmp', qmp_ss.sources() + genh,
|
||||
diff --git a/qapi/qom.json b/qapi/qom.json
|
||||
index eeb5395ff3..a2439533c5 100644
|
||||
--- a/qapi/qom.json
|
||||
+++ b/qapi/qom.json
|
||||
@@ -499,6 +499,20 @@
|
||||
'*repeat': 'bool',
|
||||
'*grab-toggle': 'GrabToggleKeys' } }
|
||||
|
||||
+##
|
||||
+# @EventLoopBaseProperties:
|
||||
+#
|
||||
+# Common properties for event loops
|
||||
+#
|
||||
+# @aio-max-batch: maximum number of requests in a batch for the AIO engine,
|
||||
+# 0 means that the engine will use its default.
|
||||
+# (default: 0)
|
||||
+#
|
||||
+# Since: 7.1
|
||||
+##
|
||||
+{ 'struct': 'EventLoopBaseProperties',
|
||||
+ 'data': { '*aio-max-batch': 'int' } }
|
||||
+
|
||||
##
|
||||
# @IothreadProperties:
|
||||
#
|
||||
@@ -516,17 +530,15 @@
|
||||
# algorithm detects it is spending too long polling without
|
||||
# encountering events. 0 selects a default behaviour (default: 0)
|
||||
#
|
||||
-# @aio-max-batch: maximum number of requests in a batch for the AIO engine,
|
||||
-# 0 means that the engine will use its default
|
||||
-# (default:0, since 6.1)
|
||||
+# The @aio-max-batch option is available since 6.1.
|
||||
#
|
||||
# Since: 2.0
|
||||
##
|
||||
{ 'struct': 'IothreadProperties',
|
||||
+ 'base': 'EventLoopBaseProperties',
|
||||
'data': { '*poll-max-ns': 'int',
|
||||
'*poll-grow': 'int',
|
||||
- '*poll-shrink': 'int',
|
||||
- '*aio-max-batch': 'int' } }
|
||||
+ '*poll-shrink': 'int' } }
|
||||
|
||||
##
|
||||
# @MemoryBackendProperties:
|
||||
--
|
||||
2.31.1
|
||||
|
@ -0,0 +1,420 @@
|
||||
From cda3fcf14f2883fea633e25256f6c14a71271adf Mon Sep 17 00:00:00 2001
|
||||
From: Leonardo Bras <leobras@redhat.com>
|
||||
Date: Fri, 13 May 2022 03:28:31 -0300
|
||||
Subject: [PATCH 08/18] QIOChannel: Add flags on io_writev and introduce
|
||||
io_flush callback
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
RH-Author: Leonardo Brás <leobras@redhat.com>
|
||||
RH-MergeRequest: 95: MSG_ZEROCOPY + Multifd
|
||||
RH-Commit: [2/11] 06acfb6b0cb2c25733c2eb198011f7623b5a7024 (LeoBras/centos-qemu-kvm)
|
||||
RH-Bugzilla: 1968509
|
||||
RH-Acked-by: Miroslav Rezanina <mrezanin@redhat.com>
|
||||
RH-Acked-by: Dr. David Alan Gilbert <dgilbert@redhat.com>
|
||||
RH-Acked-by: Peter Xu <peterx@redhat.com>
|
||||
|
||||
Add flags to io_writev and introduce io_flush as optional callback to
|
||||
QIOChannelClass, allowing the implementation of zero copy writes by
|
||||
subclasses.
|
||||
|
||||
How to use them:
|
||||
- Write data using qio_channel_writev*(...,QIO_CHANNEL_WRITE_FLAG_ZERO_COPY),
|
||||
- Wait write completion with qio_channel_flush().
|
||||
|
||||
Notes:
|
||||
As some zero copy write implementations work asynchronously, it's
|
||||
recommended to keep the write buffer untouched until the return of
|
||||
qio_channel_flush(), to avoid the risk of sending an updated buffer
|
||||
instead of the buffer state during write.
|
||||
|
||||
As io_flush callback is optional, if a subclass does not implement it, then:
|
||||
- io_flush will return 0 without changing anything.
|
||||
|
||||
Also, some functions like qio_channel_writev_full_all() were adapted to
|
||||
receive a flag parameter. That allows shared code between zero copy and
|
||||
non-zero copy writev, and also an easier implementation on new flags.
|
||||
|
||||
Signed-off-by: Leonardo Bras <leobras@redhat.com>
|
||||
Reviewed-by: Daniel P. Berrangé <berrange@redhat.com>
|
||||
Reviewed-by: Peter Xu <peterx@redhat.com>
|
||||
Reviewed-by: Juan Quintela <quintela@redhat.com>
|
||||
Message-Id: <20220513062836.965425-3-leobras@redhat.com>
|
||||
Signed-off-by: Dr. David Alan Gilbert <dgilbert@redhat.com>
|
||||
(cherry picked from commit b88651cb4d4fa416fdbb6afaf5b26ec8c035eaad)
|
||||
Signed-off-by: Leonardo Bras <leobras@redhat.com>
|
||||
---
|
||||
chardev/char-io.c | 2 +-
|
||||
hw/remote/mpqemu-link.c | 2 +-
|
||||
include/io/channel.h | 38 +++++++++++++++++++++-
|
||||
io/channel-buffer.c | 1 +
|
||||
io/channel-command.c | 1 +
|
||||
io/channel-file.c | 1 +
|
||||
io/channel-socket.c | 2 ++
|
||||
io/channel-tls.c | 1 +
|
||||
io/channel-websock.c | 1 +
|
||||
io/channel.c | 49 +++++++++++++++++++++++------
|
||||
migration/rdma.c | 1 +
|
||||
scsi/pr-manager-helper.c | 2 +-
|
||||
tests/unit/test-io-channel-socket.c | 1 +
|
||||
13 files changed, 88 insertions(+), 14 deletions(-)
|
||||
|
||||
diff --git a/chardev/char-io.c b/chardev/char-io.c
|
||||
index 8ced184160..4451128cba 100644
|
||||
--- a/chardev/char-io.c
|
||||
+++ b/chardev/char-io.c
|
||||
@@ -122,7 +122,7 @@ int io_channel_send_full(QIOChannel *ioc,
|
||||
|
||||
ret = qio_channel_writev_full(
|
||||
ioc, &iov, 1,
|
||||
- fds, nfds, NULL);
|
||||
+ fds, nfds, 0, NULL);
|
||||
if (ret == QIO_CHANNEL_ERR_BLOCK) {
|
||||
if (offset) {
|
||||
return offset;
|
||||
diff --git a/hw/remote/mpqemu-link.c b/hw/remote/mpqemu-link.c
|
||||
index 7e841820e5..e8f556bd27 100644
|
||||
--- a/hw/remote/mpqemu-link.c
|
||||
+++ b/hw/remote/mpqemu-link.c
|
||||
@@ -69,7 +69,7 @@ bool mpqemu_msg_send(MPQemuMsg *msg, QIOChannel *ioc, Error **errp)
|
||||
}
|
||||
|
||||
if (!qio_channel_writev_full_all(ioc, send, G_N_ELEMENTS(send),
|
||||
- fds, nfds, errp)) {
|
||||
+ fds, nfds, 0, errp)) {
|
||||
ret = true;
|
||||
} else {
|
||||
trace_mpqemu_send_io_error(msg->cmd, msg->size, nfds);
|
||||
diff --git a/include/io/channel.h b/include/io/channel.h
|
||||
index 88988979f8..c680ee7480 100644
|
||||
--- a/include/io/channel.h
|
||||
+++ b/include/io/channel.h
|
||||
@@ -32,12 +32,15 @@ OBJECT_DECLARE_TYPE(QIOChannel, QIOChannelClass,
|
||||
|
||||
#define QIO_CHANNEL_ERR_BLOCK -2
|
||||
|
||||
+#define QIO_CHANNEL_WRITE_FLAG_ZERO_COPY 0x1
|
||||
+
|
||||
typedef enum QIOChannelFeature QIOChannelFeature;
|
||||
|
||||
enum QIOChannelFeature {
|
||||
QIO_CHANNEL_FEATURE_FD_PASS,
|
||||
QIO_CHANNEL_FEATURE_SHUTDOWN,
|
||||
QIO_CHANNEL_FEATURE_LISTEN,
|
||||
+ QIO_CHANNEL_FEATURE_WRITE_ZERO_COPY,
|
||||
};
|
||||
|
||||
|
||||
@@ -104,6 +107,7 @@ struct QIOChannelClass {
|
||||
size_t niov,
|
||||
int *fds,
|
||||
size_t nfds,
|
||||
+ int flags,
|
||||
Error **errp);
|
||||
ssize_t (*io_readv)(QIOChannel *ioc,
|
||||
const struct iovec *iov,
|
||||
@@ -136,6 +140,8 @@ struct QIOChannelClass {
|
||||
IOHandler *io_read,
|
||||
IOHandler *io_write,
|
||||
void *opaque);
|
||||
+ int (*io_flush)(QIOChannel *ioc,
|
||||
+ Error **errp);
|
||||
};
|
||||
|
||||
/* General I/O handling functions */
|
||||
@@ -228,6 +234,7 @@ ssize_t qio_channel_readv_full(QIOChannel *ioc,
|
||||
* @niov: the length of the @iov array
|
||||
* @fds: an array of file handles to send
|
||||
* @nfds: number of file handles in @fds
|
||||
+ * @flags: write flags (QIO_CHANNEL_WRITE_FLAG_*)
|
||||
* @errp: pointer to a NULL-initialized error object
|
||||
*
|
||||
* Write data to the IO channel, reading it from the
|
||||
@@ -260,6 +267,7 @@ ssize_t qio_channel_writev_full(QIOChannel *ioc,
|
||||
size_t niov,
|
||||
int *fds,
|
||||
size_t nfds,
|
||||
+ int flags,
|
||||
Error **errp);
|
||||
|
||||
/**
|
||||
@@ -837,6 +845,7 @@ int qio_channel_readv_full_all(QIOChannel *ioc,
|
||||
* @niov: the length of the @iov array
|
||||
* @fds: an array of file handles to send
|
||||
* @nfds: number of file handles in @fds
|
||||
+ * @flags: write flags (QIO_CHANNEL_WRITE_FLAG_*)
|
||||
* @errp: pointer to a NULL-initialized error object
|
||||
*
|
||||
*
|
||||
@@ -846,6 +855,14 @@ int qio_channel_readv_full_all(QIOChannel *ioc,
|
||||
* to be written, yielding from the current coroutine
|
||||
* if required.
|
||||
*
|
||||
+ * If QIO_CHANNEL_WRITE_FLAG_ZERO_COPY is passed in flags,
|
||||
+ * instead of waiting for all requested data to be written,
|
||||
+ * this function will wait until it's all queued for writing.
|
||||
+ * In this case, if the buffer gets changed between queueing and
|
||||
+ * sending, the updated buffer will be sent. If this is not a
|
||||
+ * desired behavior, it's suggested to call qio_channel_flush()
|
||||
+ * before reusing the buffer.
|
||||
+ *
|
||||
* Returns: 0 if all bytes were written, or -1 on error
|
||||
*/
|
||||
|
||||
@@ -853,6 +870,25 @@ int qio_channel_writev_full_all(QIOChannel *ioc,
|
||||
const struct iovec *iov,
|
||||
size_t niov,
|
||||
int *fds, size_t nfds,
|
||||
- Error **errp);
|
||||
+ int flags, Error **errp);
|
||||
+
|
||||
+/**
|
||||
+ * qio_channel_flush:
|
||||
+ * @ioc: the channel object
|
||||
+ * @errp: pointer to a NULL-initialized error object
|
||||
+ *
|
||||
+ * Will block until every packet queued with
|
||||
+ * qio_channel_writev_full() + QIO_CHANNEL_WRITE_FLAG_ZERO_COPY
|
||||
+ * is sent, or return in case of any error.
|
||||
+ *
|
||||
+ * If not implemented, acts as a no-op, and returns 0.
|
||||
+ *
|
||||
+ * Returns -1 if any error is found,
|
||||
+ * 1 if every send failed to use zero copy.
|
||||
+ * 0 otherwise.
|
||||
+ */
|
||||
+
|
||||
+int qio_channel_flush(QIOChannel *ioc,
|
||||
+ Error **errp);
|
||||
|
||||
#endif /* QIO_CHANNEL_H */
|
||||
diff --git a/io/channel-buffer.c b/io/channel-buffer.c
|
||||
index baa4e2b089..bf52011be2 100644
|
||||
--- a/io/channel-buffer.c
|
||||
+++ b/io/channel-buffer.c
|
||||
@@ -81,6 +81,7 @@ static ssize_t qio_channel_buffer_writev(QIOChannel *ioc,
|
||||
size_t niov,
|
||||
int *fds,
|
||||
size_t nfds,
|
||||
+ int flags,
|
||||
Error **errp)
|
||||
{
|
||||
QIOChannelBuffer *bioc = QIO_CHANNEL_BUFFER(ioc);
|
||||
diff --git a/io/channel-command.c b/io/channel-command.c
|
||||
index 338da73ade..54560464ae 100644
|
||||
--- a/io/channel-command.c
|
||||
+++ b/io/channel-command.c
|
||||
@@ -258,6 +258,7 @@ static ssize_t qio_channel_command_writev(QIOChannel *ioc,
|
||||
size_t niov,
|
||||
int *fds,
|
||||
size_t nfds,
|
||||
+ int flags,
|
||||
Error **errp)
|
||||
{
|
||||
QIOChannelCommand *cioc = QIO_CHANNEL_COMMAND(ioc);
|
||||
diff --git a/io/channel-file.c b/io/channel-file.c
|
||||
index d7cf6d278f..ef6807a6be 100644
|
||||
--- a/io/channel-file.c
|
||||
+++ b/io/channel-file.c
|
||||
@@ -114,6 +114,7 @@ static ssize_t qio_channel_file_writev(QIOChannel *ioc,
|
||||
size_t niov,
|
||||
int *fds,
|
||||
size_t nfds,
|
||||
+ int flags,
|
||||
Error **errp)
|
||||
{
|
||||
QIOChannelFile *fioc = QIO_CHANNEL_FILE(ioc);
|
||||
diff --git a/io/channel-socket.c b/io/channel-socket.c
|
||||
index 7a8d9f69c9..a1be2197ca 100644
|
||||
--- a/io/channel-socket.c
|
||||
+++ b/io/channel-socket.c
|
||||
@@ -525,6 +525,7 @@ static ssize_t qio_channel_socket_writev(QIOChannel *ioc,
|
||||
size_t niov,
|
||||
int *fds,
|
||||
size_t nfds,
|
||||
+ int flags,
|
||||
Error **errp)
|
||||
{
|
||||
QIOChannelSocket *sioc = QIO_CHANNEL_SOCKET(ioc);
|
||||
@@ -620,6 +621,7 @@ static ssize_t qio_channel_socket_writev(QIOChannel *ioc,
|
||||
size_t niov,
|
||||
int *fds,
|
||||
size_t nfds,
|
||||
+ int flags,
|
||||
Error **errp)
|
||||
{
|
||||
QIOChannelSocket *sioc = QIO_CHANNEL_SOCKET(ioc);
|
||||
diff --git a/io/channel-tls.c b/io/channel-tls.c
|
||||
index 2ae1b92fc0..4ce890a538 100644
|
||||
--- a/io/channel-tls.c
|
||||
+++ b/io/channel-tls.c
|
||||
@@ -301,6 +301,7 @@ static ssize_t qio_channel_tls_writev(QIOChannel *ioc,
|
||||
size_t niov,
|
||||
int *fds,
|
||||
size_t nfds,
|
||||
+ int flags,
|
||||
Error **errp)
|
||||
{
|
||||
QIOChannelTLS *tioc = QIO_CHANNEL_TLS(ioc);
|
||||
diff --git a/io/channel-websock.c b/io/channel-websock.c
|
||||
index 55145a6a8c..9619906ac3 100644
|
||||
--- a/io/channel-websock.c
|
||||
+++ b/io/channel-websock.c
|
||||
@@ -1127,6 +1127,7 @@ static ssize_t qio_channel_websock_writev(QIOChannel *ioc,
|
||||
size_t niov,
|
||||
int *fds,
|
||||
size_t nfds,
|
||||
+ int flags,
|
||||
Error **errp)
|
||||
{
|
||||
QIOChannelWebsock *wioc = QIO_CHANNEL_WEBSOCK(ioc);
|
||||
diff --git a/io/channel.c b/io/channel.c
|
||||
index e8b019dc36..0640941ac5 100644
|
||||
--- a/io/channel.c
|
||||
+++ b/io/channel.c
|
||||
@@ -72,18 +72,32 @@ ssize_t qio_channel_writev_full(QIOChannel *ioc,
|
||||
size_t niov,
|
||||
int *fds,
|
||||
size_t nfds,
|
||||
+ int flags,
|
||||
Error **errp)
|
||||
{
|
||||
QIOChannelClass *klass = QIO_CHANNEL_GET_CLASS(ioc);
|
||||
|
||||
- if ((fds || nfds) &&
|
||||
- !qio_channel_has_feature(ioc, QIO_CHANNEL_FEATURE_FD_PASS)) {
|
||||
+ if (fds || nfds) {
|
||||
+ if (!qio_channel_has_feature(ioc, QIO_CHANNEL_FEATURE_FD_PASS)) {
|
||||
+ error_setg_errno(errp, EINVAL,
|
||||
+ "Channel does not support file descriptor passing");
|
||||
+ return -1;
|
||||
+ }
|
||||
+ if (flags & QIO_CHANNEL_WRITE_FLAG_ZERO_COPY) {
|
||||
+ error_setg_errno(errp, EINVAL,
|
||||
+ "Zero Copy does not support file descriptor passing");
|
||||
+ return -1;
|
||||
+ }
|
||||
+ }
|
||||
+
|
||||
+ if ((flags & QIO_CHANNEL_WRITE_FLAG_ZERO_COPY) &&
|
||||
+ !qio_channel_has_feature(ioc, QIO_CHANNEL_FEATURE_WRITE_ZERO_COPY)) {
|
||||
error_setg_errno(errp, EINVAL,
|
||||
- "Channel does not support file descriptor passing");
|
||||
+ "Requested Zero Copy feature is not available");
|
||||
return -1;
|
||||
}
|
||||
|
||||
- return klass->io_writev(ioc, iov, niov, fds, nfds, errp);
|
||||
+ return klass->io_writev(ioc, iov, niov, fds, nfds, flags, errp);
|
||||
}
|
||||
|
||||
|
||||
@@ -217,14 +231,14 @@ int qio_channel_writev_all(QIOChannel *ioc,
|
||||
size_t niov,
|
||||
Error **errp)
|
||||
{
|
||||
- return qio_channel_writev_full_all(ioc, iov, niov, NULL, 0, errp);
|
||||
+ return qio_channel_writev_full_all(ioc, iov, niov, NULL, 0, 0, errp);
|
||||
}
|
||||
|
||||
int qio_channel_writev_full_all(QIOChannel *ioc,
|
||||
const struct iovec *iov,
|
||||
size_t niov,
|
||||
int *fds, size_t nfds,
|
||||
- Error **errp)
|
||||
+ int flags, Error **errp)
|
||||
{
|
||||
int ret = -1;
|
||||
struct iovec *local_iov = g_new(struct iovec, niov);
|
||||
@@ -237,8 +251,10 @@ int qio_channel_writev_full_all(QIOChannel *ioc,
|
||||
|
||||
while (nlocal_iov > 0) {
|
||||
ssize_t len;
|
||||
- len = qio_channel_writev_full(ioc, local_iov, nlocal_iov, fds, nfds,
|
||||
- errp);
|
||||
+
|
||||
+ len = qio_channel_writev_full(ioc, local_iov, nlocal_iov, fds,
|
||||
+ nfds, flags, errp);
|
||||
+
|
||||
if (len == QIO_CHANNEL_ERR_BLOCK) {
|
||||
if (qemu_in_coroutine()) {
|
||||
qio_channel_yield(ioc, G_IO_OUT);
|
||||
@@ -277,7 +293,7 @@ ssize_t qio_channel_writev(QIOChannel *ioc,
|
||||
size_t niov,
|
||||
Error **errp)
|
||||
{
|
||||
- return qio_channel_writev_full(ioc, iov, niov, NULL, 0, errp);
|
||||
+ return qio_channel_writev_full(ioc, iov, niov, NULL, 0, 0, errp);
|
||||
}
|
||||
|
||||
|
||||
@@ -297,7 +313,7 @@ ssize_t qio_channel_write(QIOChannel *ioc,
|
||||
Error **errp)
|
||||
{
|
||||
struct iovec iov = { .iov_base = (char *)buf, .iov_len = buflen };
|
||||
- return qio_channel_writev_full(ioc, &iov, 1, NULL, 0, errp);
|
||||
+ return qio_channel_writev_full(ioc, &iov, 1, NULL, 0, 0, errp);
|
||||
}
|
||||
|
||||
|
||||
@@ -473,6 +489,19 @@ off_t qio_channel_io_seek(QIOChannel *ioc,
|
||||
return klass->io_seek(ioc, offset, whence, errp);
|
||||
}
|
||||
|
||||
+int qio_channel_flush(QIOChannel *ioc,
|
||||
+ Error **errp)
|
||||
+{
|
||||
+ QIOChannelClass *klass = QIO_CHANNEL_GET_CLASS(ioc);
|
||||
+
|
||||
+ if (!klass->io_flush ||
|
||||
+ !qio_channel_has_feature(ioc, QIO_CHANNEL_FEATURE_WRITE_ZERO_COPY)) {
|
||||
+ return 0;
|
||||
+ }
|
||||
+
|
||||
+ return klass->io_flush(ioc, errp);
|
||||
+}
|
||||
+
|
||||
|
||||
static void qio_channel_restart_read(void *opaque)
|
||||
{
|
||||
diff --git a/migration/rdma.c b/migration/rdma.c
|
||||
index ef1e65ec36..672d1958a9 100644
|
||||
--- a/migration/rdma.c
|
||||
+++ b/migration/rdma.c
|
||||
@@ -2840,6 +2840,7 @@ static ssize_t qio_channel_rdma_writev(QIOChannel *ioc,
|
||||
size_t niov,
|
||||
int *fds,
|
||||
size_t nfds,
|
||||
+ int flags,
|
||||
Error **errp)
|
||||
{
|
||||
QIOChannelRDMA *rioc = QIO_CHANNEL_RDMA(ioc);
|
||||
diff --git a/scsi/pr-manager-helper.c b/scsi/pr-manager-helper.c
|
||||
index 451c7631b7..3be52a98d5 100644
|
||||
--- a/scsi/pr-manager-helper.c
|
||||
+++ b/scsi/pr-manager-helper.c
|
||||
@@ -77,7 +77,7 @@ static int pr_manager_helper_write(PRManagerHelper *pr_mgr,
|
||||
iov.iov_base = (void *)buf;
|
||||
iov.iov_len = sz;
|
||||
n_written = qio_channel_writev_full(QIO_CHANNEL(pr_mgr->ioc), &iov, 1,
|
||||
- nfds ? &fd : NULL, nfds, errp);
|
||||
+ nfds ? &fd : NULL, nfds, 0, errp);
|
||||
|
||||
if (n_written <= 0) {
|
||||
assert(n_written != QIO_CHANNEL_ERR_BLOCK);
|
||||
diff --git a/tests/unit/test-io-channel-socket.c b/tests/unit/test-io-channel-socket.c
|
||||
index c49eec1f03..6713886d02 100644
|
||||
--- a/tests/unit/test-io-channel-socket.c
|
||||
+++ b/tests/unit/test-io-channel-socket.c
|
||||
@@ -444,6 +444,7 @@ static void test_io_channel_unix_fd_pass(void)
|
||||
G_N_ELEMENTS(iosend),
|
||||
fdsend,
|
||||
G_N_ELEMENTS(fdsend),
|
||||
+ 0,
|
||||
&error_abort);
|
||||
|
||||
qio_channel_readv_full(dst,
|
||||
--
|
||||
2.35.3
|
||||
|
@ -0,0 +1,56 @@
|
||||
From cb6dc39a5e5d2d981b4b1e983042b3fbb529d5d1 Mon Sep 17 00:00:00 2001
|
||||
From: Leonardo Bras <leobras@redhat.com>
|
||||
Date: Thu, 4 Aug 2022 04:10:43 -0300
|
||||
Subject: [PATCH 06/11] QIOChannelSocket: Add support for MSG_ZEROCOPY + IPV6
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
RH-Author: Leonardo Brás <leobras@redhat.com>
|
||||
RH-MergeRequest: 111: zero-copy-send fixes & improvements
|
||||
RH-Commit: [6/6] 2eb1aba8ebf267a6f67cfba2e489dc88619c7fd4 (LeoBras/centos-qemu-kvm)
|
||||
RH-Bugzilla: 2107466
|
||||
RH-Acked-by: Miroslav Rezanina <mrezanin@redhat.com>
|
||||
RH-Acked-by: Thomas Huth <thuth@redhat.com>
|
||||
RH-Acked-by: Dr. David Alan Gilbert <dgilbert@redhat.com>
|
||||
|
||||
For using MSG_ZEROCOPY, there are two steps:
|
||||
1 - io_writev() the packet, which enqueues the packet for sending, and
|
||||
2 - io_flush(), which gets confirmation that all packets got correctly sent
|
||||
|
||||
Currently, if MSG_ZEROCOPY is used to send packets over IPV6, no error will
|
||||
be reported in (1), but it will fail in the first time (2) happens.
|
||||
|
||||
This happens because (2) currently checks for cmsg_level & cmsg_type
|
||||
associated with IPV4 only, before reporting any error.
|
||||
|
||||
Add checks for cmsg_level & cmsg_type associated with IPV6, and thus enable
|
||||
support for MSG_ZEROCOPY + IPV6
|
||||
|
||||
Fixes: 2bc58ffc29 ("QIOChannelSocket: Implement io_writev zero copy flag & io_flush for CONFIG_LINUX")
|
||||
Signed-off-by: Leonardo Bras <leobras@redhat.com>
|
||||
Signed-off-by: Daniel P. Berrangé <berrange@redhat.com>
|
||||
(cherry picked from commit 5258a7e2c0677d16e9e1d06845f60171adf0b290)
|
||||
Signed-off-by: Leonardo Bras <leobras@redhat.com>
|
||||
---
|
||||
io/channel-socket.c | 4 ++--
|
||||
1 file changed, 2 insertions(+), 2 deletions(-)
|
||||
|
||||
diff --git a/io/channel-socket.c b/io/channel-socket.c
|
||||
index eb7baa2184..efd5f60808 100644
|
||||
--- a/io/channel-socket.c
|
||||
+++ b/io/channel-socket.c
|
||||
@@ -747,8 +747,8 @@ static int qio_channel_socket_flush(QIOChannel *ioc,
|
||||
}
|
||||
|
||||
cm = CMSG_FIRSTHDR(&msg);
|
||||
- if (cm->cmsg_level != SOL_IP &&
|
||||
- cm->cmsg_type != IP_RECVERR) {
|
||||
+ if (cm->cmsg_level != SOL_IP && cm->cmsg_type != IP_RECVERR &&
|
||||
+ cm->cmsg_level != SOL_IPV6 && cm->cmsg_type != IPV6_RECVERR) {
|
||||
error_setg_errno(errp, EPROTOTYPE,
|
||||
"Wrong cmsg in errqueue");
|
||||
return -1;
|
||||
--
|
||||
2.31.1
|
||||
|
@ -0,0 +1,65 @@
|
||||
From 678981c6bb7c964e1591f6f8aba49e9602f64852 Mon Sep 17 00:00:00 2001
|
||||
From: Leonardo Bras <leobras@redhat.com>
|
||||
Date: Mon, 11 Jul 2022 18:11:11 -0300
|
||||
Subject: [PATCH 01/11] QIOChannelSocket: Fix zero-copy flush returning code 1
|
||||
when nothing sent
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
RH-Author: Leonardo Brás <leobras@redhat.com>
|
||||
RH-MergeRequest: 111: zero-copy-send fixes & improvements
|
||||
RH-Commit: [1/6] cebc887cb61de1572d8ae3232cde45e80c339404 (LeoBras/centos-qemu-kvm)
|
||||
RH-Bugzilla: 2107466
|
||||
RH-Acked-by: Miroslav Rezanina <mrezanin@redhat.com>
|
||||
RH-Acked-by: Thomas Huth <thuth@redhat.com>
|
||||
RH-Acked-by: Dr. David Alan Gilbert <dgilbert@redhat.com>
|
||||
|
||||
If flush is called when no buffer was sent with MSG_ZEROCOPY, it currently
|
||||
returns 1. This return code should be used only when Linux fails to use
|
||||
MSG_ZEROCOPY on a lot of sendmsg().
|
||||
|
||||
Fix this by returning early from flush if no sendmsg(...,MSG_ZEROCOPY)
|
||||
was attempted.
|
||||
|
||||
Fixes: 2bc58ffc2926 ("QIOChannelSocket: Implement io_writev zero copy flag & io_flush for CONFIG_LINUX")
|
||||
Signed-off-by: Leonardo Bras <leobras@redhat.com>
|
||||
Reviewed-by: Daniel P. Berrangé <berrange@redhat.com>
|
||||
Acked-by: Daniel P. Berrangé <berrange@redhat.com>
|
||||
Reviewed-by: Juan Quintela <quintela@redhat.com>
|
||||
Reviewed-by: Peter Xu <peterx@redhat.com>
|
||||
Message-Id: <20220711211112.18951-2-leobras@redhat.com>
|
||||
Signed-off-by: Dr. David Alan Gilbert <dgilbert@redhat.com>
|
||||
(cherry picked from commit 927f93e099c4f9184e60a1bc61624ac2d04d0223)
|
||||
Signed-off-by: Leonardo Bras <leobras@redhat.com>
|
||||
---
|
||||
io/channel-socket.c | 8 +++++++-
|
||||
1 file changed, 7 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/io/channel-socket.c b/io/channel-socket.c
|
||||
index 8ae8b212cf..eb7baa2184 100644
|
||||
--- a/io/channel-socket.c
|
||||
+++ b/io/channel-socket.c
|
||||
@@ -717,12 +717,18 @@ static int qio_channel_socket_flush(QIOChannel *ioc,
|
||||
struct cmsghdr *cm;
|
||||
char control[CMSG_SPACE(sizeof(*serr))];
|
||||
int received;
|
||||
- int ret = 1;
|
||||
+ int ret;
|
||||
+
|
||||
+ if (sioc->zero_copy_queued == sioc->zero_copy_sent) {
|
||||
+ return 0;
|
||||
+ }
|
||||
|
||||
msg.msg_control = control;
|
||||
msg.msg_controllen = sizeof(control);
|
||||
memset(control, 0, sizeof(control));
|
||||
|
||||
+ ret = 1;
|
||||
+
|
||||
while (sioc->zero_copy_sent < sioc->zero_copy_queued) {
|
||||
received = recvmsg(sioc->fd, &msg, MSG_ERRQUEUE);
|
||||
if (received < 0) {
|
||||
--
|
||||
2.31.1
|
||||
|
@ -0,0 +1,58 @@
|
||||
From e70f01749addd7d0b7aa7fa4fdedb664f98e6b9b Mon Sep 17 00:00:00 2001
|
||||
From: Leonardo Bras <leobras@redhat.com>
|
||||
Date: Mon, 20 Jun 2022 02:39:43 -0300
|
||||
Subject: [PATCH 16/18] QIOChannelSocket: Fix zero-copy send so socket flush
|
||||
works
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
RH-Author: Leonardo Brás <leobras@redhat.com>
|
||||
RH-MergeRequest: 95: MSG_ZEROCOPY + Multifd
|
||||
RH-Commit: [10/11] a2dfac987e24026b1a78e90b86234ca206b6401f (LeoBras/centos-qemu-kvm)
|
||||
RH-Bugzilla: 1968509
|
||||
RH-Acked-by: Miroslav Rezanina <mrezanin@redhat.com>
|
||||
RH-Acked-by: Dr. David Alan Gilbert <dgilbert@redhat.com>
|
||||
RH-Acked-by: Peter Xu <peterx@redhat.com>
|
||||
|
||||
Somewhere between v6 and v7 the of the zero-copy-send patchset a crucial
|
||||
part of the flushing mechanism got missing: incrementing zero_copy_queued.
|
||||
|
||||
Without that, the flushing interface becomes a no-op, and there is no
|
||||
guarantee the buffer is really sent.
|
||||
|
||||
This can go as bad as causing a corruption in RAM during migration.
|
||||
|
||||
Fixes: 2bc58ffc2926 ("QIOChannelSocket: Implement io_writev zero copy flag & io_flush for CONFIG_LINUX")
|
||||
Reported-by: 徐闯 <xuchuangxclwt@bytedance.com>
|
||||
Signed-off-by: Leonardo Bras <leobras@redhat.com>
|
||||
Reviewed-by: Daniel P. Berrangé <berrange@redhat.com>
|
||||
Reviewed-by: Peter Xu <peterx@redhat.com>
|
||||
Reviewed-by: Juan Quintela <quintela@redhat.com>
|
||||
Signed-off-by: Juan Quintela <quintela@redhat.com>
|
||||
Signed-off-by: Dr. David Alan Gilbert <dgilbert@redhat.com>
|
||||
(cherry picked from commit 4f5a09714c983a3471fd12e3c7f3196e95c650c1)
|
||||
Signed-off-by: Leonardo Bras <leobras@redhat.com>
|
||||
---
|
||||
io/channel-socket.c | 5 +++++
|
||||
1 file changed, 5 insertions(+)
|
||||
|
||||
diff --git a/io/channel-socket.c b/io/channel-socket.c
|
||||
index 7490e5943d..8ae8b212cf 100644
|
||||
--- a/io/channel-socket.c
|
||||
+++ b/io/channel-socket.c
|
||||
@@ -612,6 +612,11 @@ static ssize_t qio_channel_socket_writev(QIOChannel *ioc,
|
||||
"Unable to write to socket");
|
||||
return -1;
|
||||
}
|
||||
+
|
||||
+ if (flags & QIO_CHANNEL_WRITE_FLAG_ZERO_COPY) {
|
||||
+ sioc->zero_copy_queued++;
|
||||
+ }
|
||||
+
|
||||
return ret;
|
||||
}
|
||||
#else /* WIN32 */
|
||||
--
|
||||
2.35.3
|
||||
|
@ -0,0 +1,249 @@
|
||||
From 4aeba0365d30dabe2e70dc172683f0878a4a9621 Mon Sep 17 00:00:00 2001
|
||||
From: Leonardo Bras <leobras@redhat.com>
|
||||
Date: Fri, 13 May 2022 03:28:32 -0300
|
||||
Subject: [PATCH 09/18] QIOChannelSocket: Implement io_writev zero copy flag &
|
||||
io_flush for CONFIG_LINUX
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
RH-Author: Leonardo Brás <leobras@redhat.com>
|
||||
RH-MergeRequest: 95: MSG_ZEROCOPY + Multifd
|
||||
RH-Commit: [3/11] 9afeac1f5ac7675624660a0281726c09c8321180 (LeoBras/centos-qemu-kvm)
|
||||
RH-Bugzilla: 1968509
|
||||
RH-Acked-by: Miroslav Rezanina <mrezanin@redhat.com>
|
||||
RH-Acked-by: Dr. David Alan Gilbert <dgilbert@redhat.com>
|
||||
RH-Acked-by: Peter Xu <peterx@redhat.com>
|
||||
|
||||
For CONFIG_LINUX, implement the new zero copy flag and the optional callback
|
||||
io_flush on QIOChannelSocket, but enables it only when MSG_ZEROCOPY
|
||||
feature is available in the host kernel, which is checked on
|
||||
qio_channel_socket_connect_sync()
|
||||
|
||||
qio_channel_socket_flush() was implemented by counting how many times
|
||||
sendmsg(...,MSG_ZEROCOPY) was successfully called, and then reading the
|
||||
socket's error queue, in order to find how many of them finished sending.
|
||||
Flush will loop until those counters are the same, or until some error occurs.
|
||||
|
||||
Notes on using writev() with QIO_CHANNEL_WRITE_FLAG_ZERO_COPY:
|
||||
1: Buffer
|
||||
- As MSG_ZEROCOPY tells the kernel to use the same user buffer to avoid copying,
|
||||
some caution is necessary to avoid overwriting any buffer before it's sent.
|
||||
If something like this happen, a newer version of the buffer may be sent instead.
|
||||
- If this is a problem, it's recommended to call qio_channel_flush() before freeing
|
||||
or re-using the buffer.
|
||||
|
||||
2: Locked memory
|
||||
- When using MSG_ZERCOCOPY, the buffer memory will be locked after queued, and
|
||||
unlocked after it's sent.
|
||||
- Depending on the size of each buffer, and how often it's sent, it may require
|
||||
a larger amount of locked memory than usually available to non-root user.
|
||||
- If the required amount of locked memory is not available, writev_zero_copy
|
||||
will return an error, which can abort an operation like migration,
|
||||
- Because of this, when an user code wants to add zero copy as a feature, it
|
||||
requires a mechanism to disable it, so it can still be accessible to less
|
||||
privileged users.
|
||||
|
||||
Signed-off-by: Leonardo Bras <leobras@redhat.com>
|
||||
Reviewed-by: Peter Xu <peterx@redhat.com>
|
||||
Reviewed-by: Daniel P. Berrangé <berrange@redhat.com>
|
||||
Reviewed-by: Juan Quintela <quintela@redhat.com>
|
||||
Message-Id: <20220513062836.965425-4-leobras@redhat.com>
|
||||
Signed-off-by: Dr. David Alan Gilbert <dgilbert@redhat.com>
|
||||
(cherry picked from commit 2bc58ffc2926a4efdd03edfb5909861fefc68c3d)
|
||||
Signed-off-by: Leonardo Bras <leobras@redhat.com>
|
||||
---
|
||||
include/io/channel-socket.h | 2 +
|
||||
io/channel-socket.c | 116 ++++++++++++++++++++++++++++++++++--
|
||||
2 files changed, 114 insertions(+), 4 deletions(-)
|
||||
|
||||
diff --git a/include/io/channel-socket.h b/include/io/channel-socket.h
|
||||
index e747e63514..513c428fe4 100644
|
||||
--- a/include/io/channel-socket.h
|
||||
+++ b/include/io/channel-socket.h
|
||||
@@ -47,6 +47,8 @@ struct QIOChannelSocket {
|
||||
socklen_t localAddrLen;
|
||||
struct sockaddr_storage remoteAddr;
|
||||
socklen_t remoteAddrLen;
|
||||
+ ssize_t zero_copy_queued;
|
||||
+ ssize_t zero_copy_sent;
|
||||
};
|
||||
|
||||
|
||||
diff --git a/io/channel-socket.c b/io/channel-socket.c
|
||||
index a1be2197ca..fbd2214d20 100644
|
||||
--- a/io/channel-socket.c
|
||||
+++ b/io/channel-socket.c
|
||||
@@ -26,6 +26,14 @@
|
||||
#include "io/channel-watch.h"
|
||||
#include "trace.h"
|
||||
#include "qapi/clone-visitor.h"
|
||||
+#ifdef CONFIG_LINUX
|
||||
+#include <linux/errqueue.h>
|
||||
+#include <sys/socket.h>
|
||||
+
|
||||
+#if (defined(MSG_ZEROCOPY) && defined(SO_ZEROCOPY))
|
||||
+#define QEMU_MSG_ZEROCOPY
|
||||
+#endif
|
||||
+#endif
|
||||
|
||||
#define SOCKET_MAX_FDS 16
|
||||
|
||||
@@ -55,6 +63,8 @@ qio_channel_socket_new(void)
|
||||
|
||||
sioc = QIO_CHANNEL_SOCKET(object_new(TYPE_QIO_CHANNEL_SOCKET));
|
||||
sioc->fd = -1;
|
||||
+ sioc->zero_copy_queued = 0;
|
||||
+ sioc->zero_copy_sent = 0;
|
||||
|
||||
ioc = QIO_CHANNEL(sioc);
|
||||
qio_channel_set_feature(ioc, QIO_CHANNEL_FEATURE_SHUTDOWN);
|
||||
@@ -154,6 +164,16 @@ int qio_channel_socket_connect_sync(QIOChannelSocket *ioc,
|
||||
return -1;
|
||||
}
|
||||
|
||||
+#ifdef QEMU_MSG_ZEROCOPY
|
||||
+ int ret, v = 1;
|
||||
+ ret = setsockopt(fd, SOL_SOCKET, SO_ZEROCOPY, &v, sizeof(v));
|
||||
+ if (ret == 0) {
|
||||
+ /* Zero copy available on host */
|
||||
+ qio_channel_set_feature(QIO_CHANNEL(ioc),
|
||||
+ QIO_CHANNEL_FEATURE_WRITE_ZERO_COPY);
|
||||
+ }
|
||||
+#endif
|
||||
+
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -534,6 +554,7 @@ static ssize_t qio_channel_socket_writev(QIOChannel *ioc,
|
||||
char control[CMSG_SPACE(sizeof(int) * SOCKET_MAX_FDS)];
|
||||
size_t fdsize = sizeof(int) * nfds;
|
||||
struct cmsghdr *cmsg;
|
||||
+ int sflags = 0;
|
||||
|
||||
memset(control, 0, CMSG_SPACE(sizeof(int) * SOCKET_MAX_FDS));
|
||||
|
||||
@@ -558,15 +579,31 @@ static ssize_t qio_channel_socket_writev(QIOChannel *ioc,
|
||||
memcpy(CMSG_DATA(cmsg), fds, fdsize);
|
||||
}
|
||||
|
||||
+#ifdef QEMU_MSG_ZEROCOPY
|
||||
+ if (flags & QIO_CHANNEL_WRITE_FLAG_ZERO_COPY) {
|
||||
+ sflags = MSG_ZEROCOPY;
|
||||
+ }
|
||||
+#endif
|
||||
+
|
||||
retry:
|
||||
- ret = sendmsg(sioc->fd, &msg, 0);
|
||||
+ ret = sendmsg(sioc->fd, &msg, sflags);
|
||||
if (ret <= 0) {
|
||||
- if (errno == EAGAIN) {
|
||||
+ switch (errno) {
|
||||
+ case EAGAIN:
|
||||
return QIO_CHANNEL_ERR_BLOCK;
|
||||
- }
|
||||
- if (errno == EINTR) {
|
||||
+ case EINTR:
|
||||
goto retry;
|
||||
+#ifdef QEMU_MSG_ZEROCOPY
|
||||
+ case ENOBUFS:
|
||||
+ if (sflags & MSG_ZEROCOPY) {
|
||||
+ error_setg_errno(errp, errno,
|
||||
+ "Process can't lock enough memory for using MSG_ZEROCOPY");
|
||||
+ return -1;
|
||||
+ }
|
||||
+ break;
|
||||
+#endif
|
||||
}
|
||||
+
|
||||
error_setg_errno(errp, errno,
|
||||
"Unable to write to socket");
|
||||
return -1;
|
||||
@@ -660,6 +697,74 @@ static ssize_t qio_channel_socket_writev(QIOChannel *ioc,
|
||||
}
|
||||
#endif /* WIN32 */
|
||||
|
||||
+
|
||||
+#ifdef QEMU_MSG_ZEROCOPY
|
||||
+static int qio_channel_socket_flush(QIOChannel *ioc,
|
||||
+ Error **errp)
|
||||
+{
|
||||
+ QIOChannelSocket *sioc = QIO_CHANNEL_SOCKET(ioc);
|
||||
+ struct msghdr msg = {};
|
||||
+ struct sock_extended_err *serr;
|
||||
+ struct cmsghdr *cm;
|
||||
+ char control[CMSG_SPACE(sizeof(*serr))];
|
||||
+ int received;
|
||||
+ int ret = 1;
|
||||
+
|
||||
+ msg.msg_control = control;
|
||||
+ msg.msg_controllen = sizeof(control);
|
||||
+ memset(control, 0, sizeof(control));
|
||||
+
|
||||
+ while (sioc->zero_copy_sent < sioc->zero_copy_queued) {
|
||||
+ received = recvmsg(sioc->fd, &msg, MSG_ERRQUEUE);
|
||||
+ if (received < 0) {
|
||||
+ switch (errno) {
|
||||
+ case EAGAIN:
|
||||
+ /* Nothing on errqueue, wait until something is available */
|
||||
+ qio_channel_wait(ioc, G_IO_ERR);
|
||||
+ continue;
|
||||
+ case EINTR:
|
||||
+ continue;
|
||||
+ default:
|
||||
+ error_setg_errno(errp, errno,
|
||||
+ "Unable to read errqueue");
|
||||
+ return -1;
|
||||
+ }
|
||||
+ }
|
||||
+
|
||||
+ cm = CMSG_FIRSTHDR(&msg);
|
||||
+ if (cm->cmsg_level != SOL_IP &&
|
||||
+ cm->cmsg_type != IP_RECVERR) {
|
||||
+ error_setg_errno(errp, EPROTOTYPE,
|
||||
+ "Wrong cmsg in errqueue");
|
||||
+ return -1;
|
||||
+ }
|
||||
+
|
||||
+ serr = (void *) CMSG_DATA(cm);
|
||||
+ if (serr->ee_errno != SO_EE_ORIGIN_NONE) {
|
||||
+ error_setg_errno(errp, serr->ee_errno,
|
||||
+ "Error on socket");
|
||||
+ return -1;
|
||||
+ }
|
||||
+ if (serr->ee_origin != SO_EE_ORIGIN_ZEROCOPY) {
|
||||
+ error_setg_errno(errp, serr->ee_origin,
|
||||
+ "Error not from zero copy");
|
||||
+ return -1;
|
||||
+ }
|
||||
+
|
||||
+ /* No errors, count successfully finished sendmsg()*/
|
||||
+ sioc->zero_copy_sent += serr->ee_data - serr->ee_info + 1;
|
||||
+
|
||||
+ /* If any sendmsg() succeeded using zero copy, return 0 at the end */
|
||||
+ if (serr->ee_code != SO_EE_CODE_ZEROCOPY_COPIED) {
|
||||
+ ret = 0;
|
||||
+ }
|
||||
+ }
|
||||
+
|
||||
+ return ret;
|
||||
+}
|
||||
+
|
||||
+#endif /* QEMU_MSG_ZEROCOPY */
|
||||
+
|
||||
static int
|
||||
qio_channel_socket_set_blocking(QIOChannel *ioc,
|
||||
bool enabled,
|
||||
@@ -790,6 +895,9 @@ static void qio_channel_socket_class_init(ObjectClass *klass,
|
||||
ioc_klass->io_set_delay = qio_channel_socket_set_delay;
|
||||
ioc_klass->io_create_watch = qio_channel_socket_create_watch;
|
||||
ioc_klass->io_set_aio_fd_handler = qio_channel_socket_set_aio_fd_handler;
|
||||
+#ifdef QEMU_MSG_ZEROCOPY
|
||||
+ ioc_klass->io_flush = qio_channel_socket_flush;
|
||||
+#endif
|
||||
}
|
||||
|
||||
static const TypeInfo qio_channel_socket_info = {
|
||||
--
|
||||
2.35.3
|
||||
|
@ -0,0 +1,82 @@
|
||||
From 60bf942a58db12c821f2a6a49e2e0b04b99bec30 Mon Sep 17 00:00:00 2001
|
||||
From: Leonardo Bras <leobras@redhat.com>
|
||||
Date: Mon, 20 Jun 2022 02:39:42 -0300
|
||||
Subject: [PATCH 15/18] QIOChannelSocket: Introduce assert and reduce ifdefs to
|
||||
improve readability
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
RH-Author: Leonardo Brás <leobras@redhat.com>
|
||||
RH-MergeRequest: 95: MSG_ZEROCOPY + Multifd
|
||||
RH-Commit: [9/11] eaa02d68301852ccc98bdacc7387d8d03be1cb05 (LeoBras/centos-qemu-kvm)
|
||||
RH-Bugzilla: 1968509
|
||||
RH-Acked-by: Miroslav Rezanina <mrezanin@redhat.com>
|
||||
RH-Acked-by: Dr. David Alan Gilbert <dgilbert@redhat.com>
|
||||
RH-Acked-by: Peter Xu <peterx@redhat.com>
|
||||
|
||||
During implementation of MSG_ZEROCOPY feature, a lot of #ifdefs were
|
||||
introduced, particularly at qio_channel_socket_writev().
|
||||
|
||||
Rewrite some of those changes so it's easier to read.
|
||||
|
||||
Also, introduce an assert to help detect incorrect zero-copy usage is when
|
||||
it's disabled on build.
|
||||
|
||||
Signed-off-by: Leonardo Bras <leobras@redhat.com>
|
||||
Reviewed-by: Daniel P. Berrangé <berrange@redhat.com>
|
||||
Reviewed-by: Juan Quintela <quintela@redhat.com>
|
||||
Reviewed-by: Peter Xu <peterx@redhat.com>
|
||||
Signed-off-by: Juan Quintela <quintela@redhat.com>
|
||||
Signed-off-by: Dr. David Alan Gilbert <dgilbert@redhat.com>
|
||||
dgilbert: Fixed up thinko'd g_assert_unreachable->g_assert_not_reached
|
||||
(cherry picked from commit 803ca43e4c7fcf32f9f68c118301ccd0c83ece3f)
|
||||
Signed-off-by: Leonardo Bras <leobras@redhat.com>
|
||||
---
|
||||
io/channel-socket.c | 14 +++++++++-----
|
||||
1 file changed, 9 insertions(+), 5 deletions(-)
|
||||
|
||||
diff --git a/io/channel-socket.c b/io/channel-socket.c
|
||||
index fbd2214d20..7490e5943d 100644
|
||||
--- a/io/channel-socket.c
|
||||
+++ b/io/channel-socket.c
|
||||
@@ -579,11 +579,17 @@ static ssize_t qio_channel_socket_writev(QIOChannel *ioc,
|
||||
memcpy(CMSG_DATA(cmsg), fds, fdsize);
|
||||
}
|
||||
|
||||
-#ifdef QEMU_MSG_ZEROCOPY
|
||||
if (flags & QIO_CHANNEL_WRITE_FLAG_ZERO_COPY) {
|
||||
+#ifdef QEMU_MSG_ZEROCOPY
|
||||
sflags = MSG_ZEROCOPY;
|
||||
- }
|
||||
+#else
|
||||
+ /*
|
||||
+ * We expect QIOChannel class entry point to have
|
||||
+ * blocked this code path already
|
||||
+ */
|
||||
+ g_assert_not_reached();
|
||||
#endif
|
||||
+ }
|
||||
|
||||
retry:
|
||||
ret = sendmsg(sioc->fd, &msg, sflags);
|
||||
@@ -593,15 +599,13 @@ static ssize_t qio_channel_socket_writev(QIOChannel *ioc,
|
||||
return QIO_CHANNEL_ERR_BLOCK;
|
||||
case EINTR:
|
||||
goto retry;
|
||||
-#ifdef QEMU_MSG_ZEROCOPY
|
||||
case ENOBUFS:
|
||||
- if (sflags & MSG_ZEROCOPY) {
|
||||
+ if (flags & QIO_CHANNEL_WRITE_FLAG_ZERO_COPY) {
|
||||
error_setg_errno(errp, errno,
|
||||
"Process can't lock enough memory for using MSG_ZEROCOPY");
|
||||
return -1;
|
||||
}
|
||||
break;
|
||||
-#endif
|
||||
}
|
||||
|
||||
error_setg_errno(errp, errno,
|
||||
--
|
||||
2.35.3
|
||||
|
@ -1,107 +0,0 @@
|
||||
From 5688fdb9a3ed192b85dca84c47a7ddfd325778d9 Mon Sep 17 00:00:00 2001
|
||||
From: Stefano Garzarella <sgarzare@redhat.com>
|
||||
Date: Thu, 24 Mar 2022 16:04:57 +0100
|
||||
Subject: [PATCH 1/3] RHEL: disable "seqpacket" for "vhost-vsock-device" in
|
||||
rhel8.6.0
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
RH-Author: Stefano Garzarella <sgarzare@redhat.com>
|
||||
RH-MergeRequest: 135: RHEL: disable "seqpacket" for "vhost-vsock-device" in rhel8.6.0 [rhel-9.0.0.z]
|
||||
RH-Commit: [1/1] 5ee0de3110deaa0222c9783c00168b536b0c8934
|
||||
RH-Bugzilla: 2071102
|
||||
RH-Acked-by: Jason Wang <jasowang@redhat.com>
|
||||
RH-Acked-by: Eugenio Pérez <eperezma@redhat.com>
|
||||
RH-Acked-by: Dr. David Alan Gilbert <dgilbert@redhat.com>
|
||||
RH-Acked-by: Stefan Hajnoczi <stefanha@redhat.com>
|
||||
|
||||
vhost-vsock device in RHEL 8 kernels doesn't support seqpacket.
|
||||
To avoid problems when migrating a VM from RHEL 9 host, we need to
|
||||
disable it in rhel8-* machine types.
|
||||
|
||||
Signed-off-by: Stefano Garzarella <sgarzare@redhat.com>
|
||||
---
|
||||
hw/core/machine.c | 10 ++++++++++
|
||||
hw/i386/pc_piix.c | 2 ++
|
||||
hw/i386/pc_q35.c | 2 ++
|
||||
hw/s390x/s390-virtio-ccw.c | 1 +
|
||||
include/hw/boards.h | 3 +++
|
||||
5 files changed, 18 insertions(+)
|
||||
|
||||
diff --git a/hw/core/machine.c b/hw/core/machine.c
|
||||
index 5fae55d6cd..7dcceb904a 100644
|
||||
--- a/hw/core/machine.c
|
||||
+++ b/hw/core/machine.c
|
||||
@@ -43,6 +43,16 @@
|
||||
const char *rhel_old_machine_deprecation =
|
||||
"machine types for previous major releases are deprecated";
|
||||
|
||||
+GlobalProperty hw_compat_rhel_8_6[] = {
|
||||
+ /* hw_compat_rhel_8_6 bz 2065589 */
|
||||
+ /*
|
||||
+ * vhost-vsock device in RHEL 8 kernels doesn't support seqpacket, so
|
||||
+ * we need do disable it downstream on the latest hw_compat_rhel_8.
|
||||
+ */
|
||||
+ { "vhost-vsock-device", "seqpacket", "off" },
|
||||
+};
|
||||
+const size_t hw_compat_rhel_8_6_len = G_N_ELEMENTS(hw_compat_rhel_8_6);
|
||||
+
|
||||
/*
|
||||
* Mostly the same as hw_compat_6_0 and hw_compat_6_1
|
||||
*/
|
||||
diff --git a/hw/i386/pc_piix.c b/hw/i386/pc_piix.c
|
||||
index cf68d7498c..08579366b6 100644
|
||||
--- a/hw/i386/pc_piix.c
|
||||
+++ b/hw/i386/pc_piix.c
|
||||
@@ -998,6 +998,8 @@ static void pc_machine_rhel760_options(MachineClass *m)
|
||||
pcmc->kvmclock_create_always = false;
|
||||
/* From pc_i440fx_5_1_machine_options() */
|
||||
pcmc->pci_root_uid = 1;
|
||||
+ compat_props_add(m->compat_props, hw_compat_rhel_8_6,
|
||||
+ hw_compat_rhel_8_6_len);
|
||||
compat_props_add(m->compat_props, hw_compat_rhel_8_5,
|
||||
hw_compat_rhel_8_5_len);
|
||||
compat_props_add(m->compat_props, pc_rhel_8_5_compat,
|
||||
diff --git a/hw/i386/pc_q35.c b/hw/i386/pc_q35.c
|
||||
index c8e06da084..23dacdd923 100644
|
||||
--- a/hw/i386/pc_q35.c
|
||||
+++ b/hw/i386/pc_q35.c
|
||||
@@ -680,6 +680,8 @@ static void pc_q35_machine_rhel860_options(MachineClass *m)
|
||||
|
||||
pcmc->smbios_stream_product = "RHEL-AV";
|
||||
pcmc->smbios_stream_version = "8.6.0";
|
||||
+ compat_props_add(m->compat_props, hw_compat_rhel_8_6,
|
||||
+ hw_compat_rhel_8_6_len);
|
||||
}
|
||||
|
||||
DEFINE_PC_MACHINE(q35_rhel860, "pc-q35-rhel8.6.0", pc_q35_init_rhel860,
|
||||
diff --git a/hw/s390x/s390-virtio-ccw.c b/hw/s390x/s390-virtio-ccw.c
|
||||
index cc78a315e3..13bfa4253e 100644
|
||||
--- a/hw/s390x/s390-virtio-ccw.c
|
||||
+++ b/hw/s390x/s390-virtio-ccw.c
|
||||
@@ -1121,6 +1121,7 @@ static void ccw_machine_rhel860_instance_options(MachineState *machine)
|
||||
static void ccw_machine_rhel860_class_options(MachineClass *mc)
|
||||
{
|
||||
ccw_machine_rhel900_class_options(mc);
|
||||
+ compat_props_add(mc->compat_props, hw_compat_rhel_8_6, hw_compat_rhel_8_6_len);
|
||||
|
||||
/* All RHEL machines for prior major releases are deprecated */
|
||||
mc->deprecation_reason = rhel_old_machine_deprecation;
|
||||
diff --git a/include/hw/boards.h b/include/hw/boards.h
|
||||
index 21d8d5528e..b9c12c4bf2 100644
|
||||
--- a/include/hw/boards.h
|
||||
+++ b/include/hw/boards.h
|
||||
@@ -443,6 +443,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_8_6[];
|
||||
+extern const size_t hw_compat_rhel_8_6_len;
|
||||
+
|
||||
extern GlobalProperty hw_compat_rhel_8_5[];
|
||||
extern const size_t hw_compat_rhel_8_5_len;
|
||||
|
||||
--
|
||||
2.31.1
|
||||
|
@ -1,110 +0,0 @@
|
||||
From dcc64971bf25e5c2303d551fb2fef448a5e8f4fd Mon Sep 17 00:00:00 2001
|
||||
From: Cornelia Huck <cohuck@redhat.com>
|
||||
Date: Thu, 3 Mar 2022 10:57:37 +0100
|
||||
Subject: [PATCH 1/5] RHEL: mark old machine types as deprecated
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
RH-Author: Cornelia Huck <cohuck@redhat.com>
|
||||
RH-MergeRequest: 119: RHEL: mark old machine types as deprecated
|
||||
RH-Commit: [1/1] 5d7531d23fac5dd67c3cc202f538b25f26393600 (cohuck/qemu-kvm)
|
||||
RH-Bugzilla: 2052050
|
||||
RH-Acked-by: Thomas Huth <thuth@redhat.com>
|
||||
RH-Acked-by: Dr. David Alan Gilbert <dgilbert@redhat.com>
|
||||
RH-Acked-by: Daniel P. Berrangé <berrange@redhat.com>
|
||||
|
||||
We want to make it obvious that we consider machine types for older
|
||||
RHEL major releases to be deprecated; we only carry them for
|
||||
compatibility purposes.
|
||||
|
||||
Let's mark all rhel-7.x and rhel-8.x machine type as deprecated via
|
||||
QEMU's existing deprecation mechanism; those machine types will
|
||||
continue to work as expected, but commands like 'virsh capabilities',
|
||||
'virsh dominfo', or the libvirt log will tag the machine as
|
||||
deprecated.
|
||||
|
||||
Signed-off-by: Cornelia Huck <cohuck@redhat.com>
|
||||
---
|
||||
hw/core/machine.c | 6 ++++++
|
||||
hw/i386/pc_piix.c | 4 ++++
|
||||
hw/i386/pc_q35.c | 4 ++++
|
||||
hw/s390x/s390-virtio-ccw.c | 3 +++
|
||||
include/hw/boards.h | 2 ++
|
||||
5 files changed, 19 insertions(+)
|
||||
|
||||
diff --git a/hw/core/machine.c b/hw/core/machine.c
|
||||
index 669d3d8b91..5fae55d6cd 100644
|
||||
--- a/hw/core/machine.c
|
||||
+++ b/hw/core/machine.c
|
||||
@@ -37,6 +37,12 @@
|
||||
#include "hw/virtio/virtio.h"
|
||||
#include "hw/virtio/virtio-pci.h"
|
||||
|
||||
+/*
|
||||
+ * RHEL only: machine types for previous major releases are deprecated
|
||||
+ */
|
||||
+const char *rhel_old_machine_deprecation =
|
||||
+ "machine types for previous major releases are deprecated";
|
||||
+
|
||||
/*
|
||||
* Mostly the same as hw_compat_6_0 and hw_compat_6_1
|
||||
*/
|
||||
diff --git a/hw/i386/pc_piix.c b/hw/i386/pc_piix.c
|
||||
index fccb7f5fc9..cf68d7498c 100644
|
||||
--- a/hw/i386/pc_piix.c
|
||||
+++ b/hw/i386/pc_piix.c
|
||||
@@ -989,6 +989,10 @@ static void pc_machine_rhel760_options(MachineClass *m)
|
||||
m->desc = "RHEL 7.6.0 PC (i440FX + PIIX, 1996)";
|
||||
m->async_pf_vmexit_disable = true;
|
||||
m->smbus_no_migration_support = true;
|
||||
+
|
||||
+ /* All RHEL machines for prior major releases are deprecated */
|
||||
+ m->deprecation_reason = rhel_old_machine_deprecation;
|
||||
+
|
||||
pcmc->pvh_enabled = false;
|
||||
pcmc->default_cpu_version = CPU_VERSION_LEGACY;
|
||||
pcmc->kvmclock_create_always = false;
|
||||
diff --git a/hw/i386/pc_q35.c b/hw/i386/pc_q35.c
|
||||
index bf9ad32f0e..c8e06da084 100644
|
||||
--- a/hw/i386/pc_q35.c
|
||||
+++ b/hw/i386/pc_q35.c
|
||||
@@ -674,6 +674,10 @@ static void pc_q35_machine_rhel860_options(MachineClass *m)
|
||||
pc_q35_machine_rhel900_options(m);
|
||||
m->desc = "RHEL-8.6.0 PC (Q35 + ICH9, 2009)";
|
||||
m->alias = NULL;
|
||||
+
|
||||
+ /* All RHEL machines for prior major releases are deprecated */
|
||||
+ m->deprecation_reason = rhel_old_machine_deprecation;
|
||||
+
|
||||
pcmc->smbios_stream_product = "RHEL-AV";
|
||||
pcmc->smbios_stream_version = "8.6.0";
|
||||
}
|
||||
diff --git a/hw/s390x/s390-virtio-ccw.c b/hw/s390x/s390-virtio-ccw.c
|
||||
index 9da6e9b1d4..cc78a315e3 100644
|
||||
--- a/hw/s390x/s390-virtio-ccw.c
|
||||
+++ b/hw/s390x/s390-virtio-ccw.c
|
||||
@@ -1121,6 +1121,9 @@ static void ccw_machine_rhel860_instance_options(MachineState *machine)
|
||||
static void ccw_machine_rhel860_class_options(MachineClass *mc)
|
||||
{
|
||||
ccw_machine_rhel900_class_options(mc);
|
||||
+
|
||||
+ /* All RHEL machines for prior major releases are deprecated */
|
||||
+ mc->deprecation_reason = rhel_old_machine_deprecation;
|
||||
}
|
||||
DEFINE_CCW_MACHINE(rhel860, "rhel8.6.0", false);
|
||||
|
||||
diff --git a/include/hw/boards.h b/include/hw/boards.h
|
||||
index 3c3d2ad450..21d8d5528e 100644
|
||||
--- a/include/hw/boards.h
|
||||
+++ b/include/hw/boards.h
|
||||
@@ -464,4 +464,6 @@ extern const size_t hw_compat_rhel_8_0_len;
|
||||
extern GlobalProperty hw_compat_rhel_7_6[];
|
||||
extern const size_t hw_compat_rhel_7_6_len;
|
||||
|
||||
+extern const char *rhel_old_machine_deprecation;
|
||||
+
|
||||
#endif
|
||||
--
|
||||
2.31.1
|
||||
|
237
SOURCES/kvm-RHEL-only-AArch64-Drop-unsupported-CPU-types.patch
Normal file
237
SOURCES/kvm-RHEL-only-AArch64-Drop-unsupported-CPU-types.patch
Normal file
@ -0,0 +1,237 @@
|
||||
From 055edf068196622a3e1868c9e4c991d410272a6d Mon Sep 17 00:00:00 2001
|
||||
From: Andrew Jones <drjones@redhat.com>
|
||||
Date: Wed, 15 Jun 2022 15:28:27 +0200
|
||||
Subject: [PATCH 03/18] RHEL-only: AArch64: Drop unsupported CPU types
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
RH-Author: Daniel P. Berrangé <berrange@redhat.com>
|
||||
RH-MergeRequest: 94: i386, aarch64, s390x: deprecate many named CPU models
|
||||
RH-Commit: [3/6] 21f54c86dc87e5e75a64459b5a385686bc09640c (berrange/centos-src-qemu)
|
||||
RH-Bugzilla: 2060839
|
||||
RH-Acked-by: Thomas Huth <thuth@redhat.com>
|
||||
RH-Acked-by: Miroslav Rezanina <mrezanin@redhat.com>
|
||||
RH-Acked-by: Cornelia Huck <cohuck@redhat.com>
|
||||
|
||||
Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=2066824
|
||||
Upstream Status: RHEL only
|
||||
|
||||
We only need to support AArch64 cpu types and we only need three
|
||||
types:
|
||||
1) A base type to use with TCG, i.e. a cpu type with only base
|
||||
features. 'cortex-a57' serves this role and is currently used
|
||||
by libguestfs.
|
||||
2) The 'max' type, which is for both KVM and TCG and is good for
|
||||
tests that just specify 'max' but run under both. 'max' with
|
||||
TCG also provides the VM with all the CPU features TCG
|
||||
supports, which is good for VMs that need features not
|
||||
provided by the basic cortex-a57.
|
||||
3) The host type which is used with KVM.
|
||||
|
||||
Signed-off-by: Andrew Jones <drjones@redhat.com>
|
||||
---
|
||||
hw/arm/virt.c | 4 ++++
|
||||
target/arm/cpu64.c | 6 ++++++
|
||||
target/arm/cpu_tcg.c | 12 ++----------
|
||||
tests/qtest/arm-cpu-features.c | 6 ++++++
|
||||
4 files changed, 18 insertions(+), 10 deletions(-)
|
||||
|
||||
diff --git a/hw/arm/virt.c b/hw/arm/virt.c
|
||||
index 95d012d6eb..74119976d3 100644
|
||||
--- a/hw/arm/virt.c
|
||||
+++ b/hw/arm/virt.c
|
||||
@@ -239,12 +239,16 @@ static const int a15irqmap[] = {
|
||||
};
|
||||
|
||||
static const char *valid_cpus[] = {
|
||||
+#if 0 /* Disabled for Red Hat Enterprise Linux */
|
||||
ARM_CPU_TYPE_NAME("cortex-a7"),
|
||||
ARM_CPU_TYPE_NAME("cortex-a15"),
|
||||
ARM_CPU_TYPE_NAME("cortex-a53"),
|
||||
+#endif /* disabled for RHEL */
|
||||
ARM_CPU_TYPE_NAME("cortex-a57"),
|
||||
+#if 0 /* Disabled for Red Hat Enterprise Linux */
|
||||
ARM_CPU_TYPE_NAME("cortex-a72"),
|
||||
ARM_CPU_TYPE_NAME("a64fx"),
|
||||
+#endif /* disabled for RHEL */
|
||||
ARM_CPU_TYPE_NAME("host"),
|
||||
ARM_CPU_TYPE_NAME("max"),
|
||||
};
|
||||
diff --git a/target/arm/cpu64.c b/target/arm/cpu64.c
|
||||
index eb44c05822..e80b831073 100644
|
||||
--- a/target/arm/cpu64.c
|
||||
+++ b/target/arm/cpu64.c
|
||||
@@ -146,6 +146,7 @@ static void aarch64_a57_initfn(Object *obj)
|
||||
define_arm_cp_regs(cpu, cortex_a72_a57_a53_cp_reginfo);
|
||||
}
|
||||
|
||||
+#if 0 /* Disabled for Red Hat Enterprise Linux */
|
||||
static void aarch64_a53_initfn(Object *obj)
|
||||
{
|
||||
ARMCPU *cpu = ARM_CPU(obj);
|
||||
@@ -249,6 +250,7 @@ static void aarch64_a72_initfn(Object *obj)
|
||||
cpu->gic_vprebits = 5;
|
||||
define_arm_cp_regs(cpu, cortex_a72_a57_a53_cp_reginfo);
|
||||
}
|
||||
+#endif /* disabled for RHEL */
|
||||
|
||||
void arm_cpu_sve_finalize(ARMCPU *cpu, Error **errp)
|
||||
{
|
||||
@@ -923,6 +925,7 @@ static void aarch64_max_initfn(Object *obj)
|
||||
qdev_property_add_static(DEVICE(obj), &arm_cpu_lpa2_property);
|
||||
}
|
||||
|
||||
+#if 0 /* Disabled for Red Hat Enterprise Linux */
|
||||
static void aarch64_a64fx_initfn(Object *obj)
|
||||
{
|
||||
ARMCPU *cpu = ARM_CPU(obj);
|
||||
@@ -969,12 +972,15 @@ static void aarch64_a64fx_initfn(Object *obj)
|
||||
|
||||
/* TODO: Add A64FX specific HPC extension registers */
|
||||
}
|
||||
+#endif /* disabled for RHEL */
|
||||
|
||||
static const ARMCPUInfo aarch64_cpus[] = {
|
||||
{ .name = "cortex-a57", .initfn = aarch64_a57_initfn },
|
||||
+#if 0 /* Disabled for Red Hat Enterprise Linux */
|
||||
{ .name = "cortex-a53", .initfn = aarch64_a53_initfn },
|
||||
{ .name = "cortex-a72", .initfn = aarch64_a72_initfn },
|
||||
{ .name = "a64fx", .initfn = aarch64_a64fx_initfn },
|
||||
+#endif /* disabled for RHEL */
|
||||
{ .name = "max", .initfn = aarch64_max_initfn },
|
||||
#if defined(CONFIG_KVM) || defined(CONFIG_HVF)
|
||||
{ .name = "host", .initfn = aarch64_host_initfn },
|
||||
diff --git a/target/arm/cpu_tcg.c b/target/arm/cpu_tcg.c
|
||||
index 3826fa5122..74727fc92c 100644
|
||||
--- a/target/arm/cpu_tcg.c
|
||||
+++ b/target/arm/cpu_tcg.c
|
||||
@@ -19,10 +19,10 @@
|
||||
#include "hw/boards.h"
|
||||
#endif
|
||||
|
||||
+#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)
|
||||
|
||||
-#if 0 /* Disabled for Red Hat Enterprise Linux */
|
||||
#if !defined(CONFIG_USER_ONLY) && defined(CONFIG_TCG)
|
||||
static bool arm_v7m_cpu_exec_interrupt(CPUState *cs, int interrupt_request)
|
||||
{
|
||||
@@ -376,7 +376,6 @@ static void cortex_a9_initfn(Object *obj)
|
||||
cpu->ccsidr[1] = 0x200fe019; /* 16k L1 icache. */
|
||||
define_arm_cp_regs(cpu, cortexa9_cp_reginfo);
|
||||
}
|
||||
-#endif /* disabled for RHEL */
|
||||
|
||||
#ifndef CONFIG_USER_ONLY
|
||||
static uint64_t a15_l2ctlr_read(CPUARMState *env, const ARMCPRegInfo *ri)
|
||||
@@ -402,7 +401,6 @@ static const ARMCPRegInfo cortexa15_cp_reginfo[] = {
|
||||
REGINFO_SENTINEL
|
||||
};
|
||||
|
||||
-#if 0 /* Disabled for Red Hat Enterprise Linux */
|
||||
static void cortex_a7_initfn(Object *obj)
|
||||
{
|
||||
ARMCPU *cpu = ARM_CPU(obj);
|
||||
@@ -448,7 +446,6 @@ static void cortex_a7_initfn(Object *obj)
|
||||
cpu->ccsidr[2] = 0x711fe07a; /* 4096K L2 unified cache */
|
||||
define_arm_cp_regs(cpu, cortexa15_cp_reginfo); /* Same as A15 */
|
||||
}
|
||||
-#endif /* disabled for RHEL */
|
||||
|
||||
static void cortex_a15_initfn(Object *obj)
|
||||
{
|
||||
@@ -492,7 +489,6 @@ static void cortex_a15_initfn(Object *obj)
|
||||
define_arm_cp_regs(cpu, cortexa15_cp_reginfo);
|
||||
}
|
||||
|
||||
-#if 0 /* Disabled for Red Hat Enterprise Linux */
|
||||
static void cortex_m0_initfn(Object *obj)
|
||||
{
|
||||
ARMCPU *cpu = ARM_CPU(obj);
|
||||
@@ -933,7 +929,6 @@ static void arm_v7m_class_init(ObjectClass *oc, void *data)
|
||||
|
||||
cc->gdb_core_xml_file = "arm-m-profile.xml";
|
||||
}
|
||||
-#endif /* disabled for RHEL */
|
||||
|
||||
#ifndef TARGET_AARCH64
|
||||
/*
|
||||
@@ -1013,7 +1008,6 @@ static void arm_max_initfn(Object *obj)
|
||||
#endif /* !TARGET_AARCH64 */
|
||||
|
||||
static const ARMCPUInfo arm_tcg_cpus[] = {
|
||||
-#if 0 /* Disabled for Red Hat Enterprise Linux */
|
||||
{ .name = "arm926", .initfn = arm926_initfn },
|
||||
{ .name = "arm946", .initfn = arm946_initfn },
|
||||
{ .name = "arm1026", .initfn = arm1026_initfn },
|
||||
@@ -1029,9 +1023,7 @@ static const ARMCPUInfo arm_tcg_cpus[] = {
|
||||
{ .name = "cortex-a7", .initfn = cortex_a7_initfn },
|
||||
{ .name = "cortex-a8", .initfn = cortex_a8_initfn },
|
||||
{ .name = "cortex-a9", .initfn = cortex_a9_initfn },
|
||||
-#endif /* disabled for RHEL */
|
||||
{ .name = "cortex-a15", .initfn = cortex_a15_initfn },
|
||||
-#if 0 /* Disabled for Red Hat Enterprise Linux */
|
||||
{ .name = "cortex-m0", .initfn = cortex_m0_initfn,
|
||||
.class_init = arm_v7m_class_init },
|
||||
{ .name = "cortex-m3", .initfn = cortex_m3_initfn,
|
||||
@@ -1062,7 +1054,6 @@ static const ARMCPUInfo arm_tcg_cpus[] = {
|
||||
{ .name = "pxa270-b1", .initfn = pxa270b1_initfn },
|
||||
{ .name = "pxa270-c0", .initfn = pxa270c0_initfn },
|
||||
{ .name = "pxa270-c5", .initfn = pxa270c5_initfn },
|
||||
-#endif /* disabled for RHEL */
|
||||
#ifndef TARGET_AARCH64
|
||||
{ .name = "max", .initfn = arm_max_initfn },
|
||||
#endif
|
||||
@@ -1090,3 +1081,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/tests/qtest/arm-cpu-features.c b/tests/qtest/arm-cpu-features.c
|
||||
index f76652143a..fe2a0a070d 100644
|
||||
--- a/tests/qtest/arm-cpu-features.c
|
||||
+++ b/tests/qtest/arm-cpu-features.c
|
||||
@@ -440,8 +440,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 */
|
||||
+#if 0 /* Disabled for Red Hat Enterprise Linux */
|
||||
assert_has_feature_enabled(qts, "cortex-a15", "pmu");
|
||||
assert_has_not_feature(qts, "cortex-a15", "aarch64");
|
||||
+#endif /* disabled for RHEL */
|
||||
|
||||
/* Enabling and disabling pmu should always work. */
|
||||
assert_has_feature_enabled(qts, "max", "pmu");
|
||||
@@ -458,6 +460,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");
|
||||
|
||||
+#if 0 /* Disabled for Red Hat Enterprise Linux */
|
||||
assert_has_feature_enabled(qts, "a64fx", "pmu");
|
||||
assert_has_feature_enabled(qts, "a64fx", "aarch64");
|
||||
/*
|
||||
@@ -470,6 +473,7 @@ static void test_query_cpu_model_expansion(const void *data)
|
||||
"{ 'sve384': true }");
|
||||
assert_error(qts, "a64fx", "cannot enable sve640",
|
||||
"{ 'sve640': true }");
|
||||
+#endif /* disabled for RHEL */
|
||||
|
||||
sve_tests_default(qts, "max");
|
||||
pauth_tests_default(qts, "max");
|
||||
@@ -505,9 +509,11 @@ static void test_query_cpu_model_expansion_kvm(const void *data)
|
||||
QDict *resp;
|
||||
char *error;
|
||||
|
||||
+#if 0 /* Disabled for Red Hat Enterprise Linux */
|
||||
assert_error(qts, "cortex-a15",
|
||||
"We cannot guarantee the CPU type 'cortex-a15' works "
|
||||
"with KVM on this host", NULL);
|
||||
+#endif /* disabled for RHEL */
|
||||
|
||||
assert_has_feature_enabled(qts, "host", "aarch64");
|
||||
|
||||
--
|
||||
2.35.3
|
||||
|
@ -0,0 +1,95 @@
|
||||
From d710394f68eb0b6116dd8ac76f619c192e0d5972 Mon Sep 17 00:00:00 2001
|
||||
From: Andrew Jones <drjones@redhat.com>
|
||||
Date: Wed, 15 Jun 2022 15:28:27 +0200
|
||||
Subject: [PATCH 02/18] RHEL-only: tests/avocado: Switch aarch64 tests from a53
|
||||
to a57
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
RH-Author: Daniel P. Berrangé <berrange@redhat.com>
|
||||
RH-MergeRequest: 94: i386, aarch64, s390x: deprecate many named CPU models
|
||||
RH-Commit: [2/6] e85ef69b42c411a6997e4da10ba05176368769b3 (berrange/centos-src-qemu)
|
||||
RH-Bugzilla: 2060839
|
||||
RH-Acked-by: Thomas Huth <thuth@redhat.com>
|
||||
RH-Acked-by: Miroslav Rezanina <mrezanin@redhat.com>
|
||||
RH-Acked-by: Cornelia Huck <cohuck@redhat.com>
|
||||
|
||||
Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=2066824
|
||||
Upstream Status: RHEL only
|
||||
|
||||
We plan to remove the cortex-a53 from the supported cpu types. Switch
|
||||
all avocado tests that use it to the cortex-a57, which will work the
|
||||
same and we intend to keep. We don't want to try and upstream this
|
||||
change since the better upstream change would be to switch from the
|
||||
a53 to 'max', but the upstream tests also need to use later guest
|
||||
kernels to use 'max' (see qemu upstream commit 0942820408dc
|
||||
("hw/arm/virt: Disable LPA2 for -machine virt-6.2")
|
||||
|
||||
Signed-off-by: Andrew Jones <drjones@redhat.com>
|
||||
---
|
||||
tests/avocado/replay_kernel.py | 2 +-
|
||||
tests/avocado/reverse_debugging.py | 2 +-
|
||||
tests/avocado/tcg_plugins.py | 6 +++---
|
||||
3 files changed, 5 insertions(+), 5 deletions(-)
|
||||
|
||||
diff --git a/tests/avocado/replay_kernel.py b/tests/avocado/replay_kernel.py
|
||||
index 0b2b0dc692..3a7b5f0748 100644
|
||||
--- a/tests/avocado/replay_kernel.py
|
||||
+++ b/tests/avocado/replay_kernel.py
|
||||
@@ -147,7 +147,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 d2921e70c3..66d185ed42 100644
|
||||
--- a/tests/avocado/reverse_debugging.py
|
||||
+++ b/tests/avocado/reverse_debugging.py
|
||||
@@ -198,7 +198,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 642d2e49e3..93b3afd823 100644
|
||||
--- a/tests/avocado/tcg_plugins.py
|
||||
+++ b/tests/avocado/tcg_plugins.py
|
||||
@@ -68,7 +68,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()
|
||||
kernel_command_line = (self.KERNEL_COMMON_COMMAND_LINE +
|
||||
@@ -94,7 +94,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
|
||||
"""
|
||||
kernel_path = self._grab_aarch64_kernel()
|
||||
kernel_command_line = (self.KERNEL_COMMON_COMMAND_LINE +
|
||||
@@ -120,7 +120,7 @@ def test_aarch64_virt_mem_icount(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()
|
||||
kernel_command_line = (self.KERNEL_COMMON_COMMAND_LINE +
|
||||
--
|
||||
2.35.3
|
||||
|
@ -0,0 +1,58 @@
|
||||
From 5ab8613582fd56b847fe75750acb5b7255900b35 Mon Sep 17 00:00:00 2001
|
||||
From: Vitaly Kuznetsov <vkuznets@redhat.com>
|
||||
Date: Thu, 9 Jun 2022 11:55:15 +0200
|
||||
Subject: [PATCH 15/16] Revert "globally limit the maximum number of CPUs"
|
||||
|
||||
RH-Author: Vitaly Kuznetsov <vkuznets@redhat.com>
|
||||
RH-MergeRequest: 99: Revert "globally limit the maximum number of CPUs"
|
||||
RH-Commit: [1/1] 13100d4a2209b2190a3654c1f9cf4ebade1e8d24 (vkuznets/qemu-kvm-c9s)
|
||||
RH-Bugzilla: 2094270
|
||||
RH-Acked-by: Andrew Jones <drjones@redhat.com>
|
||||
RH-Acked-by: Cornelia Huck <cohuck@redhat.com>
|
||||
RH-Acked-by: Thomas Huth <thuth@redhat.com>
|
||||
|
||||
Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=2094270
|
||||
Brew: https://brewweb.engineering.redhat.com/brew/taskinfo?taskID=45871149
|
||||
Upstream Status: RHEL-only
|
||||
Tested: with upstream kernel
|
||||
|
||||
Downstream QEMU carries a patch that sets the hard limit of possible vCPUs
|
||||
to the value that the KVM code of the kernel recommends as soft limit.
|
||||
Upstream KVM code has been changed recently to not use an arbitrary soft
|
||||
limit anymore, but to cap the value on the amount of available physical
|
||||
CPUs of the host. This defeats the purpose of the downstream change in
|
||||
QEMU completely. Drop the downstream-only patch to allow CPU overcommit.
|
||||
|
||||
This reverts commit 6669f6fa677d43144f39d6ad59725b7ba622f1c2.
|
||||
|
||||
Signed-off-by: Vitaly Kuznetsov <vkuznets@redhat.com>
|
||||
---
|
||||
accel/kvm/kvm-all.c | 12 ------------
|
||||
1 file changed, 12 deletions(-)
|
||||
|
||||
diff --git a/accel/kvm/kvm-all.c b/accel/kvm/kvm-all.c
|
||||
index fdf0e4d429..5f1377ca04 100644
|
||||
--- a/accel/kvm/kvm-all.c
|
||||
+++ b/accel/kvm/kvm-all.c
|
||||
@@ -2430,18 +2430,6 @@ static int kvm_init(MachineState *ms)
|
||||
soft_vcpus_limit = kvm_recommended_vcpus(s);
|
||||
hard_vcpus_limit = kvm_max_vcpus(s);
|
||||
|
||||
-#ifdef HOST_PPC64
|
||||
- /*
|
||||
- * On POWER, the kernel advertises a soft limit based on the
|
||||
- * number of CPU threads on the host. We want to allow exceeding
|
||||
- * this for testing purposes, so we don't want to set hard limit
|
||||
- * to soft limit as on x86.
|
||||
- */
|
||||
-#else
|
||||
- /* RHEL doesn't support nr_vcpus > soft_vcpus_limit */
|
||||
- hard_vcpus_limit = soft_vcpus_limit;
|
||||
-#endif
|
||||
-
|
||||
while (nc->name) {
|
||||
if (nc->num > soft_vcpus_limit) {
|
||||
warn_report("Number of %s cpus requested (%d) exceeds "
|
||||
--
|
||||
2.31.1
|
||||
|
134
SOURCES/kvm-Revert-migration-Simplify-unqueue_page.patch
Normal file
134
SOURCES/kvm-Revert-migration-Simplify-unqueue_page.patch
Normal file
@ -0,0 +1,134 @@
|
||||
From 5ea59b17866add54e5ae8c76d3cb472c67e1fa91 Mon Sep 17 00:00:00 2001
|
||||
From: Thomas Huth <thuth@redhat.com>
|
||||
Date: Tue, 2 Aug 2022 08:19:49 +0200
|
||||
Subject: [PATCH 32/32] Revert "migration: Simplify unqueue_page()"
|
||||
|
||||
RH-Author: Thomas Huth <thuth@redhat.com>
|
||||
RH-MergeRequest: 112: Fix postcopy migration on s390x
|
||||
RH-Commit: [2/2] 3913c9ed3f27f4b66245913da29d0c46db0c6567 (thuth/qemu-kvm-cs9)
|
||||
RH-Bugzilla: 2099934
|
||||
RH-Acked-by: Dr. David Alan Gilbert <dgilbert@redhat.com>
|
||||
RH-Acked-by: Cornelia Huck <cohuck@redhat.com>
|
||||
RH-Acked-by: David Hildenbrand <david@redhat.com>
|
||||
RH-Acked-by: Peter Xu <peterx@redhat.com>
|
||||
|
||||
This reverts commit cfd66f30fb0f735df06ff4220e5000290a43dad3.
|
||||
|
||||
The simplification of unqueue_page() introduced a bug that sometimes
|
||||
breaks migration on s390x hosts.
|
||||
|
||||
The problem is not fully understood yet, but since we are already in
|
||||
the freeze for QEMU 7.1 and we need something working there, let's
|
||||
revert this patch for the upcoming release. The optimization can be
|
||||
redone later again in a proper way if necessary.
|
||||
|
||||
Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=2099934
|
||||
Signed-off-by: Thomas Huth <thuth@redhat.com>
|
||||
Message-Id: <20220802061949.331576-1-thuth@redhat.com>
|
||||
Reviewed-by: Dr. David Alan Gilbert <dgilbert@redhat.com>
|
||||
Signed-off-by: Dr. David Alan Gilbert <dgilbert@redhat.com>
|
||||
(cherry picked from commit 777f53c75983dd10756f5dbfc8af50fe11da81c1)
|
||||
Conflicts:
|
||||
migration/trace-events
|
||||
(trivial contextual conflict)
|
||||
Signed-off-by: Thomas Huth <thuth@redhat.com>
|
||||
---
|
||||
migration/ram.c | 37 ++++++++++++++++++++++++++-----------
|
||||
migration/trace-events | 3 ++-
|
||||
2 files changed, 28 insertions(+), 12 deletions(-)
|
||||
|
||||
diff --git a/migration/ram.c b/migration/ram.c
|
||||
index fb6db54642..ee40e4a718 100644
|
||||
--- a/migration/ram.c
|
||||
+++ b/migration/ram.c
|
||||
@@ -1548,7 +1548,6 @@ static RAMBlock *unqueue_page(RAMState *rs, ram_addr_t *offset)
|
||||
{
|
||||
struct RAMSrcPageRequest *entry;
|
||||
RAMBlock *block = NULL;
|
||||
- size_t page_size;
|
||||
|
||||
if (!postcopy_has_request(rs)) {
|
||||
return NULL;
|
||||
@@ -1565,13 +1564,10 @@ static RAMBlock *unqueue_page(RAMState *rs, ram_addr_t *offset)
|
||||
entry = QSIMPLEQ_FIRST(&rs->src_page_requests);
|
||||
block = entry->rb;
|
||||
*offset = entry->offset;
|
||||
- page_size = qemu_ram_pagesize(block);
|
||||
- /* Each page request should only be multiple page size of the ramblock */
|
||||
- assert((entry->len % page_size) == 0);
|
||||
|
||||
- if (entry->len > page_size) {
|
||||
- entry->len -= page_size;
|
||||
- entry->offset += page_size;
|
||||
+ if (entry->len > TARGET_PAGE_SIZE) {
|
||||
+ entry->len -= TARGET_PAGE_SIZE;
|
||||
+ entry->offset += TARGET_PAGE_SIZE;
|
||||
} else {
|
||||
memory_region_unref(block->mr);
|
||||
QSIMPLEQ_REMOVE_HEAD(&rs->src_page_requests, next_req);
|
||||
@@ -1579,9 +1575,6 @@ static RAMBlock *unqueue_page(RAMState *rs, ram_addr_t *offset)
|
||||
migration_consume_urgent_request();
|
||||
}
|
||||
|
||||
- trace_unqueue_page(block->idstr, *offset,
|
||||
- test_bit((*offset >> TARGET_PAGE_BITS), block->bmap));
|
||||
-
|
||||
return block;
|
||||
}
|
||||
|
||||
@@ -1956,8 +1949,30 @@ static bool get_queued_page(RAMState *rs, PageSearchStatus *pss)
|
||||
{
|
||||
RAMBlock *block;
|
||||
ram_addr_t offset;
|
||||
+ bool dirty;
|
||||
+
|
||||
+ do {
|
||||
+ block = unqueue_page(rs, &offset);
|
||||
+ /*
|
||||
+ * We're sending this page, and since it's postcopy nothing else
|
||||
+ * will dirty it, and we must make sure it doesn't get sent again
|
||||
+ * even if this queue request was received after the background
|
||||
+ * search already sent it.
|
||||
+ */
|
||||
+ if (block) {
|
||||
+ unsigned long page;
|
||||
+
|
||||
+ page = offset >> TARGET_PAGE_BITS;
|
||||
+ dirty = test_bit(page, block->bmap);
|
||||
+ if (!dirty) {
|
||||
+ trace_get_queued_page_not_dirty(block->idstr, (uint64_t)offset,
|
||||
+ page);
|
||||
+ } else {
|
||||
+ trace_get_queued_page(block->idstr, (uint64_t)offset, page);
|
||||
+ }
|
||||
+ }
|
||||
|
||||
- block = unqueue_page(rs, &offset);
|
||||
+ } while (block && !dirty);
|
||||
|
||||
if (!block) {
|
||||
/*
|
||||
diff --git a/migration/trace-events b/migration/trace-events
|
||||
index 1aec580e92..09d61ed1f4 100644
|
||||
--- a/migration/trace-events
|
||||
+++ b/migration/trace-events
|
||||
@@ -85,6 +85,8 @@ put_qlist_end(const char *field_name, const char *vmsd_name) "%s(%s)"
|
||||
qemu_file_fclose(void) ""
|
||||
|
||||
# ram.c
|
||||
+get_queued_page(const char *block_name, uint64_t tmp_offset, unsigned long page_abs) "%s/0x%" PRIx64 " page_abs=0x%lx"
|
||||
+get_queued_page_not_dirty(const char *block_name, uint64_t tmp_offset, unsigned long page_abs) "%s/0x%" PRIx64 " page_abs=0x%lx"
|
||||
migration_bitmap_sync_start(void) ""
|
||||
migration_bitmap_sync_end(uint64_t dirty_pages) "dirty_pages %" PRIu64
|
||||
migration_bitmap_clear_dirty(char *str, uint64_t start, uint64_t size, unsigned long page) "rb %s start 0x%"PRIx64" size 0x%"PRIx64" page 0x%lx"
|
||||
@@ -110,7 +112,6 @@ ram_save_iterate_big_wait(uint64_t milliconds, int iterations) "big wait: %" PRI
|
||||
ram_load_complete(int ret, uint64_t seq_iter) "exit_code %d seq iteration %" PRIu64
|
||||
ram_write_tracking_ramblock_start(const char *block_id, size_t page_size, void *addr, size_t length) "%s: page_size: %zu addr: %p length: %zu"
|
||||
ram_write_tracking_ramblock_stop(const char *block_id, size_t page_size, void *addr, size_t length) "%s: page_size: %zu addr: %p length: %zu"
|
||||
-unqueue_page(char *block, uint64_t offset, bool dirty) "ramblock '%s' offset 0x%"PRIx64" dirty %d"
|
||||
|
||||
# multifd.c
|
||||
multifd_new_send_channel_async(uint8_t id) "channel %u"
|
||||
--
|
||||
2.31.1
|
||||
|
@ -1,45 +0,0 @@
|
||||
From 213d2c6d3138f3570bca36edaacfd1ee86b18967 Mon Sep 17 00:00:00 2001
|
||||
From: Gerd Hoffmann <kraxel@redhat.com>
|
||||
Date: Fri, 4 Feb 2022 06:45:51 +0100
|
||||
Subject: [PATCH 1/6] Revert "ui/clipboard: Don't use g_autoptr just to free a
|
||||
variable"
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
RH-Author: Gerd Hoffmann <kraxel@redhat.com>
|
||||
RH-MergeRequest: 75: fix vnc cut+paste crash
|
||||
RH-Commit: [1/4] 0937d15054ad6e902bc22d1872231504f442ddcc (kraxel/centos-qemu-kvm)
|
||||
RH-Bugzilla: 2042820
|
||||
RH-Acked-by: Marc-André Lureau <marcandre.lureau@redhat.com>
|
||||
RH-Acked-by: Daniel P. Berrangé <berrange@redhat.com>
|
||||
RH-Acked-by: Miroslav Rezanina <mrezanin@redhat.com>
|
||||
|
||||
This reverts commit 8df1ea81ee6c674522967d056daa8d3748fa3883.
|
||||
---
|
||||
ui/clipboard.c | 3 +--
|
||||
1 file changed, 1 insertion(+), 2 deletions(-)
|
||||
|
||||
diff --git a/ui/clipboard.c b/ui/clipboard.c
|
||||
index d53576b0f6..d7b008d62a 100644
|
||||
--- a/ui/clipboard.c
|
||||
+++ b/ui/clipboard.c
|
||||
@@ -44,14 +44,13 @@ void qemu_clipboard_peer_release(QemuClipboardPeer *peer,
|
||||
|
||||
void qemu_clipboard_update(QemuClipboardInfo *info)
|
||||
{
|
||||
- QemuClipboardInfo *old = NULL;
|
||||
+ g_autoptr(QemuClipboardInfo) old = NULL;
|
||||
assert(info->selection < QEMU_CLIPBOARD_SELECTION__COUNT);
|
||||
|
||||
notifier_list_notify(&clipboard_notifiers, info);
|
||||
|
||||
old = cbinfo[info->selection];
|
||||
cbinfo[info->selection] = qemu_clipboard_info_ref(info);
|
||||
- g_free(old);
|
||||
}
|
||||
|
||||
QemuClipboardInfo *qemu_clipboard_info(QemuClipboardSelection selection)
|
||||
--
|
||||
2.27.0
|
||||
|
@ -0,0 +1,51 @@
|
||||
From 733acef2caea0758edd74fb634b095ce09bf5914 Mon Sep 17 00:00:00 2001
|
||||
From: Emanuele Giuseppe Esposito <eesposit@redhat.com>
|
||||
Date: Mon, 9 May 2022 03:46:23 -0400
|
||||
Subject: [PATCH 15/16] Revert "virtio-scsi: Reject scsi-cd if data plane
|
||||
enabled [RHEL only]"
|
||||
|
||||
RH-Author: Emanuele Giuseppe Esposito <eesposit@redhat.com>
|
||||
RH-MergeRequest: 91: Revert "virtio-scsi: Reject scsi-cd if data plane enabled [RHEL only]"
|
||||
RH-Commit: [1/1] 1af55d792bc9166e5c86272afe8093c76ab41bb4 (eesposit/qemu-kvm)
|
||||
RH-Bugzilla: 1995710
|
||||
RH-Acked-by: Kevin Wolf <kwolf@redhat.com>
|
||||
RH-Acked-by: Miroslav Rezanina <mrezanin@redhat.com>
|
||||
RH-Acked-by: Stefan Hajnoczi <stefanha@redhat.com>
|
||||
|
||||
This reverts commit 4e17b1126e.
|
||||
|
||||
Over time AioContext usage and coverage has increased, and now block
|
||||
backend is capable of handling AioContext change upon eject and insert.
|
||||
Therefore the above downstream-only commit is not necessary anymore,
|
||||
and can be safely reverted.
|
||||
|
||||
X-downstream-only: true
|
||||
|
||||
Signed-off-by: Emanuele Giuseppe Esposito <eesposit@redhat.com>
|
||||
---
|
||||
hw/scsi/virtio-scsi.c | 9 ---------
|
||||
1 file changed, 9 deletions(-)
|
||||
|
||||
diff --git a/hw/scsi/virtio-scsi.c b/hw/scsi/virtio-scsi.c
|
||||
index 2450c9438c..db54d104be 100644
|
||||
--- a/hw/scsi/virtio-scsi.c
|
||||
+++ b/hw/scsi/virtio-scsi.c
|
||||
@@ -937,15 +937,6 @@ static void virtio_scsi_hotplug(HotplugHandler *hotplug_dev, DeviceState *dev,
|
||||
AioContext *old_context;
|
||||
int ret;
|
||||
|
||||
- /* XXX: Remove this check once block backend is capable of handling
|
||||
- * AioContext change upon eject/insert.
|
||||
- * s->ctx is NULL if ioeventfd is off, s->ctx is qemu_get_aio_context() if
|
||||
- * data plane is not used, both cases are safe for scsi-cd. */
|
||||
- if (s->ctx && s->ctx != qemu_get_aio_context() &&
|
||||
- object_dynamic_cast(OBJECT(dev), "scsi-cd")) {
|
||||
- error_setg(errp, "scsi-cd is not supported by data plane");
|
||||
- return;
|
||||
- }
|
||||
if (s->ctx && !s->dataplane_fenced) {
|
||||
if (blk_op_is_blocked(sd->conf.blk, BLOCK_OP_TYPE_DATAPLANE, errp)) {
|
||||
return;
|
||||
--
|
||||
2.31.1
|
||||
|
@ -1,70 +0,0 @@
|
||||
From 473b05bbdad50dc3877ab6da4ac52b5a4fc7d5e1 Mon Sep 17 00:00:00 2001
|
||||
From: Igor Mammedov <imammedo@redhat.com>
|
||||
Date: Wed, 12 Jan 2022 08:03:31 -0500
|
||||
Subject: [PATCH 11/14] acpi: fix OEM ID/OEM Table ID padding
|
||||
|
||||
RH-Author: Igor Mammedov <imammedo@redhat.com>
|
||||
RH-MergeRequest: 130: acpi: fix QEMU crash when started with SLIC table
|
||||
RH-Commit: [7/10] 276af1aa7650e79f146c75ef4ec19f792e7e163c
|
||||
RH-Bugzilla: 2043531
|
||||
RH-Acked-by: Gerd Hoffmann <kraxel@redhat.com>
|
||||
RH-Acked-by: Miroslav Rezanina <mrezanin@redhat.com>
|
||||
RH-Acked-by: MST <None>
|
||||
|
||||
Commit [2] broke original '\0' padding of OEM ID and OEM Table ID
|
||||
fields in headers of ACPI tables. While it doesn't have impact on
|
||||
default values since QEMU uses 6 and 8 characters long values
|
||||
respectively, it broke usecase where IDs are provided on QEMU CLI.
|
||||
It shouldn't affect guest (but may cause licensing verification
|
||||
issues in guest OS).
|
||||
One of the broken usecases is user supplied SLIC table with IDs
|
||||
shorter than max possible length, where [2] mangles IDs with extra
|
||||
spaces in RSDT and FADT tables whereas guest OS expects those to
|
||||
mirror the respective values of the used SLIC table.
|
||||
|
||||
Fix it by replacing whitespace padding with '\0' padding in
|
||||
accordance with [1] and expectations of guest OS
|
||||
|
||||
1) ACPI spec, v2.0b
|
||||
17.2 AML Grammar Definition
|
||||
...
|
||||
//OEM ID of up to 6 characters. If the OEM ID is
|
||||
//shorter than 6 characters, it can be terminated
|
||||
//with a NULL character.
|
||||
|
||||
2)
|
||||
Fixes: 602b458201 ("acpi: Permit OEM ID and OEM table ID fields to be changed")
|
||||
Resolves: https://gitlab.com/qemu-project/qemu/-/issues/707
|
||||
Reported-by: Dmitry V. Orekhov <dima.orekhov@gmail.com>
|
||||
Signed-off-by: Igor Mammedov <imammedo@redhat.com>
|
||||
Cc: qemu-stable@nongnu.org
|
||||
Message-Id: <20220112130332.1648664-4-imammedo@redhat.com>
|
||||
Reviewed-by: Michael S. Tsirkin <mst@redhat.com>
|
||||
Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
|
||||
Reviewed-by: Ani Sinha <ani@anisinha.ca>
|
||||
Tested-by: Dmitry V. Orekhov dima.orekhov@gmail.com
|
||||
(cherry picked from commit 748c030f360a940fe0c9382c8ca1649096c3a80d)
|
||||
Signed-off-by: Igor Mammedov <imammedo@redhat.com>
|
||||
---
|
||||
hw/acpi/aml-build.c | 4 ++--
|
||||
1 file changed, 2 insertions(+), 2 deletions(-)
|
||||
|
||||
diff --git a/hw/acpi/aml-build.c b/hw/acpi/aml-build.c
|
||||
index b3b3310df3..65148d5b9d 100644
|
||||
--- a/hw/acpi/aml-build.c
|
||||
+++ b/hw/acpi/aml-build.c
|
||||
@@ -1724,9 +1724,9 @@ void acpi_table_begin(AcpiTable *desc, GArray *array)
|
||||
build_append_int_noprefix(array, 0, 4); /* Length */
|
||||
build_append_int_noprefix(array, desc->rev, 1); /* Revision */
|
||||
build_append_int_noprefix(array, 0, 1); /* Checksum */
|
||||
- build_append_padded_str(array, desc->oem_id, 6, ' '); /* OEMID */
|
||||
+ build_append_padded_str(array, desc->oem_id, 6, '\0'); /* OEMID */
|
||||
/* OEM Table ID */
|
||||
- build_append_padded_str(array, desc->oem_table_id, 8, ' ');
|
||||
+ build_append_padded_str(array, desc->oem_table_id, 8, '\0');
|
||||
build_append_int_noprefix(array, 1, 4); /* OEM Revision */
|
||||
g_array_append_vals(array, ACPI_BUILD_APPNAME8, 4); /* Creator ID */
|
||||
build_append_int_noprefix(array, 1, 4); /* Creator Revision */
|
||||
--
|
||||
2.31.1
|
||||
|
@ -1,100 +0,0 @@
|
||||
From 636a09dbe361517ac2b8d810166676b5006a6ca2 Mon Sep 17 00:00:00 2001
|
||||
From: Igor Mammedov <imammedo@redhat.com>
|
||||
Date: Mon, 27 Dec 2021 14:31:17 -0500
|
||||
Subject: [PATCH 05/14] acpi: fix QEMU crash when started with SLIC table
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
RH-Author: Igor Mammedov <imammedo@redhat.com>
|
||||
RH-MergeRequest: 130: acpi: fix QEMU crash when started with SLIC table
|
||||
RH-Commit: [1/10] 67c1d1d2358d0ba746f260dfc3c1cfc165357fd1
|
||||
RH-Bugzilla: 2043531
|
||||
RH-Acked-by: Gerd Hoffmann <kraxel@redhat.com>
|
||||
RH-Acked-by: Miroslav Rezanina <mrezanin@redhat.com>
|
||||
RH-Acked-by: MST <None>
|
||||
|
||||
if QEMU is started with used provided SLIC table blob,
|
||||
|
||||
-acpitable sig=SLIC,oem_id='CRASH ',oem_table_id="ME",oem_rev=00002210,asl_compiler_id="",asl_compiler_rev=00000000,data=/dev/null
|
||||
it will assert with:
|
||||
|
||||
hw/acpi/aml-build.c:61:build_append_padded_str: assertion failed: (len <= maxlen)
|
||||
|
||||
and following backtrace:
|
||||
|
||||
...
|
||||
build_append_padded_str (array=0x555556afe320, str=0x555556afdb2e "CRASH ME", maxlen=0x6, pad=0x20) at hw/acpi/aml-build.c:61
|
||||
acpi_table_begin (desc=0x7fffffffd1b0, array=0x555556afe320) at hw/acpi/aml-build.c:1727
|
||||
build_fadt (tbl=0x555556afe320, linker=0x555557ca3830, f=0x7fffffffd318, oem_id=0x555556afdb2e "CRASH ME", oem_table_id=0x555556afdb34 "ME") at hw/acpi/aml-build.c:2064
|
||||
...
|
||||
|
||||
which happens due to acpi_table_begin() expecting NULL terminated
|
||||
oem_id and oem_table_id strings, which is normally the case, but
|
||||
in case of user provided SLIC table, oem_id points to table's blob
|
||||
directly and as result oem_id became longer than expected.
|
||||
|
||||
Fix issue by handling oem_id consistently and make acpi_get_slic_oem()
|
||||
return NULL terminated strings.
|
||||
|
||||
PS:
|
||||
After [1] refactoring, oem_id semantics became inconsistent, where
|
||||
NULL terminated string was coming from machine and old way pointer
|
||||
into byte array coming from -acpitable option. That used to work
|
||||
since build_header() wasn't expecting NULL terminated string and
|
||||
blindly copied the 1st 6 bytes only.
|
||||
|
||||
However commit [2] broke that by replacing build_header() with
|
||||
acpi_table_begin(), which was expecting NULL terminated string
|
||||
and was checking oem_id size.
|
||||
|
||||
1) 602b45820 ("acpi: Permit OEM ID and OEM table ID fields to be changed")
|
||||
2)
|
||||
Fixes: 4b56e1e4eb08 ("acpi: build_fadt: use acpi_table_begin()/acpi_table_end() instead of build_header()")
|
||||
Resolves: https://gitlab.com/qemu-project/qemu/-/issues/786
|
||||
Signed-off-by: Igor Mammedov <imammedo@redhat.com>
|
||||
Message-Id: <20211227193120.1084176-2-imammedo@redhat.com>
|
||||
Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com>
|
||||
Tested-by: Denis Lisov <dennis.lissov@gmail.com>
|
||||
Tested-by: Alexander Tsoy <alexander@tsoy.me>
|
||||
Cc: qemu-stable@nongnu.org
|
||||
Reviewed-by: Michael S. Tsirkin <mst@redhat.com>
|
||||
Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
|
||||
(cherry picked from commit 8cdb99af45365727ac17f45239a9b8c1d5155c6d)
|
||||
Signed-off-by: Igor Mammedov <imammedo@redhat.com>
|
||||
---
|
||||
hw/acpi/core.c | 4 ++--
|
||||
hw/i386/acpi-build.c | 2 ++
|
||||
2 files changed, 4 insertions(+), 2 deletions(-)
|
||||
|
||||
diff --git a/hw/acpi/core.c b/hw/acpi/core.c
|
||||
index 1e004d0078..3e811bf03c 100644
|
||||
--- a/hw/acpi/core.c
|
||||
+++ b/hw/acpi/core.c
|
||||
@@ -345,8 +345,8 @@ int acpi_get_slic_oem(AcpiSlicOem *oem)
|
||||
struct acpi_table_header *hdr = (void *)(u - sizeof(hdr->_length));
|
||||
|
||||
if (memcmp(hdr->sig, "SLIC", 4) == 0) {
|
||||
- oem->id = hdr->oem_id;
|
||||
- oem->table_id = hdr->oem_table_id;
|
||||
+ oem->id = g_strndup(hdr->oem_id, 6);
|
||||
+ oem->table_id = g_strndup(hdr->oem_table_id, 8);
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
diff --git a/hw/i386/acpi-build.c b/hw/i386/acpi-build.c
|
||||
index 8383b83ee3..0234fe7588 100644
|
||||
--- a/hw/i386/acpi-build.c
|
||||
+++ b/hw/i386/acpi-build.c
|
||||
@@ -2723,6 +2723,8 @@ void acpi_build(AcpiBuildTables *tables, MachineState *machine)
|
||||
|
||||
/* Cleanup memory that's no longer used. */
|
||||
g_array_free(table_offsets, true);
|
||||
+ g_free(slic_oem.id);
|
||||
+ g_free(slic_oem.table_id);
|
||||
}
|
||||
|
||||
static void acpi_ram_update(MemoryRegion *mr, GArray *data)
|
||||
--
|
||||
2.31.1
|
||||
|
@ -1,130 +0,0 @@
|
||||
From a3a4fd1733e71d029e38136366e73ace8e78298b Mon Sep 17 00:00:00 2001
|
||||
From: Igor Mammedov <imammedo@redhat.com>
|
||||
Date: Tue, 1 Mar 2022 10:11:59 -0500
|
||||
Subject: [PATCH 02/14] acpi: pcihp: pcie: set power on cap on parent slot
|
||||
|
||||
RH-Author: Igor Mammedov <imammedo@redhat.com>
|
||||
RH-MergeRequest: 124: RHEL-9.0 Fix broken PCIe device after migration
|
||||
RH-Commit: [2/2] 135602421e5fed803f7d71121380306633d490d8
|
||||
RH-Bugzilla: 2053584
|
||||
RH-Acked-by: Vitaly Kuznetsov <vkuznets@redhat.com>
|
||||
RH-Acked-by: MST <None>
|
||||
RH-Acked-by: Gerd Hoffmann <kraxel@redhat.com>
|
||||
|
||||
on creation a PCIDevice has power turned on at the end of pci_qdev_realize()
|
||||
however later on if PCIe slot isn't populated with any children
|
||||
it's power is turned off. It's fine if native hotplug is used
|
||||
as plug callback will power slot on among other things.
|
||||
However when ACPI hotplug is enabled it replaces native PCIe plug
|
||||
callbacks with ACPI specific ones (acpi_pcihp_device_*plug_cb) and
|
||||
as result slot stays powered off. It works fine as ACPI hotplug
|
||||
on guest side takes care of enumerating/initializing hotplugged
|
||||
device. But when later guest is migrated, call chain introduced by]
|
||||
commit d5daff7d312 (pcie: implement slot power control for pcie root ports)
|
||||
|
||||
pcie_cap_slot_post_load()
|
||||
-> pcie_cap_update_power()
|
||||
-> pcie_set_power_device()
|
||||
-> pci_set_power()
|
||||
-> pci_update_mappings()
|
||||
|
||||
will disable earlier initialized BARs for the hotplugged device
|
||||
in powered off slot due to commit 23786d13441 (pci: implement power state)
|
||||
which disables BARs if power is off.
|
||||
|
||||
Fix it by setting PCI_EXP_SLTCTL_PCC to PCI_EXP_SLTCTL_PWR_ON
|
||||
on slot (root port/downstream port) at the time a device
|
||||
hotplugged into it. As result PCI_EXP_SLTCTL_PWR_ON is migrated
|
||||
to target and above call chain keeps device plugged into it
|
||||
powered on.
|
||||
|
||||
Fixes: d5daff7d312 ("pcie: implement slot power control for pcie root ports")
|
||||
Fixes: 23786d13441 ("pci: implement power state")
|
||||
Fixes: https://bugzilla.redhat.com/show_bug.cgi?id=2053584
|
||||
Suggested-by: "Michael S. Tsirkin" <mst@redhat.com>
|
||||
Signed-off-by: Igor Mammedov <imammedo@redhat.com>
|
||||
Message-Id: <20220301151200.3507298-3-imammedo@redhat.com>
|
||||
Reviewed-by: Michael S. Tsirkin <mst@redhat.com>
|
||||
Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
|
||||
(cherry picked from commit 6b0969f1ec825984cd74619f0730be421b0c46fb)
|
||||
Signed-off-by: Igor Mammedov <imammedo@redhat.com>
|
||||
---
|
||||
hw/acpi/pcihp.c | 12 +++++++++++-
|
||||
hw/pci/pcie.c | 11 +++++++++++
|
||||
include/hw/pci/pcie.h | 1 +
|
||||
3 files changed, 23 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/hw/acpi/pcihp.c b/hw/acpi/pcihp.c
|
||||
index 30405b5113..3d5610e02d 100644
|
||||
--- a/hw/acpi/pcihp.c
|
||||
+++ b/hw/acpi/pcihp.c
|
||||
@@ -32,6 +32,7 @@
|
||||
#include "hw/pci/pci_bridge.h"
|
||||
#include "hw/pci/pci_host.h"
|
||||
#include "hw/pci/pcie_port.h"
|
||||
+#include "hw/pci-bridge/xio3130_downstream.h"
|
||||
#include "hw/i386/acpi-build.h"
|
||||
#include "hw/acpi/acpi.h"
|
||||
#include "hw/pci/pci_bus.h"
|
||||
@@ -341,6 +342,8 @@ void acpi_pcihp_device_plug_cb(HotplugHandler *hotplug_dev, AcpiPciHpState *s,
|
||||
{
|
||||
PCIDevice *pdev = PCI_DEVICE(dev);
|
||||
int slot = PCI_SLOT(pdev->devfn);
|
||||
+ PCIDevice *bridge;
|
||||
+ PCIBus *bus;
|
||||
int bsel;
|
||||
|
||||
/* Don't send event when device is enabled during qemu machine creation:
|
||||
@@ -370,7 +373,14 @@ void acpi_pcihp_device_plug_cb(HotplugHandler *hotplug_dev, AcpiPciHpState *s,
|
||||
return;
|
||||
}
|
||||
|
||||
- bsel = acpi_pcihp_get_bsel(pci_get_bus(pdev));
|
||||
+ bus = pci_get_bus(pdev);
|
||||
+ bridge = pci_bridge_get_device(bus);
|
||||
+ if (object_dynamic_cast(OBJECT(bridge), TYPE_PCIE_ROOT_PORT) ||
|
||||
+ object_dynamic_cast(OBJECT(bridge), TYPE_XIO3130_DOWNSTREAM)) {
|
||||
+ pcie_cap_slot_enable_power(bridge);
|
||||
+ }
|
||||
+
|
||||
+ bsel = acpi_pcihp_get_bsel(bus);
|
||||
g_assert(bsel >= 0);
|
||||
s->acpi_pcihp_pci_status[bsel].up |= (1U << slot);
|
||||
acpi_send_event(DEVICE(hotplug_dev), ACPI_PCI_HOTPLUG_STATUS);
|
||||
diff --git a/hw/pci/pcie.c b/hw/pci/pcie.c
|
||||
index d7d73a31e4..996f0e24fe 100644
|
||||
--- a/hw/pci/pcie.c
|
||||
+++ b/hw/pci/pcie.c
|
||||
@@ -366,6 +366,17 @@ static void hotplug_event_clear(PCIDevice *dev)
|
||||
}
|
||||
}
|
||||
|
||||
+void pcie_cap_slot_enable_power(PCIDevice *dev)
|
||||
+{
|
||||
+ uint8_t *exp_cap = dev->config + dev->exp.exp_cap;
|
||||
+ uint32_t sltcap = pci_get_long(exp_cap + PCI_EXP_SLTCAP);
|
||||
+
|
||||
+ if (sltcap & PCI_EXP_SLTCAP_PCP) {
|
||||
+ pci_set_word_by_mask(exp_cap + PCI_EXP_SLTCTL,
|
||||
+ PCI_EXP_SLTCTL_PCC, PCI_EXP_SLTCTL_PWR_ON);
|
||||
+ }
|
||||
+}
|
||||
+
|
||||
static void pcie_set_power_device(PCIBus *bus, PCIDevice *dev, void *opaque)
|
||||
{
|
||||
bool *power = opaque;
|
||||
diff --git a/include/hw/pci/pcie.h b/include/hw/pci/pcie.h
|
||||
index 6063bee0ec..c27368d077 100644
|
||||
--- a/include/hw/pci/pcie.h
|
||||
+++ b/include/hw/pci/pcie.h
|
||||
@@ -112,6 +112,7 @@ void pcie_cap_slot_write_config(PCIDevice *dev,
|
||||
uint32_t addr, uint32_t val, int len);
|
||||
int pcie_cap_slot_post_load(void *opaque, int version_id);
|
||||
void pcie_cap_slot_push_attention_button(PCIDevice *dev);
|
||||
+void pcie_cap_slot_enable_power(PCIDevice *dev);
|
||||
|
||||
void pcie_cap_root_init(PCIDevice *dev);
|
||||
void pcie_cap_root_reset(PCIDevice *dev);
|
||||
--
|
||||
2.31.1
|
||||
|
@ -1,63 +0,0 @@
|
||||
From 7b973b9cb7b890eaf9a31c99f5c272b513322ac1 Mon Sep 17 00:00:00 2001
|
||||
From: Kevin Wolf <kwolf@redhat.com>
|
||||
Date: Thu, 3 Feb 2022 15:05:33 +0100
|
||||
Subject: [PATCH 1/8] block: Lock AioContext for drain_end in blockdev-reopen
|
||||
|
||||
RH-Author: Kevin Wolf <kwolf@redhat.com>
|
||||
RH-MergeRequest: 73: block: Lock AioContext for drain_end in blockdev-reopen
|
||||
RH-Commit: [1/2] db25e999152b0e4f09decade1ac76b9f56cd9706 (kmwolf/centos-qemu-kvm)
|
||||
RH-Bugzilla: 2046659
|
||||
RH-Acked-by: Sergio Lopez <None>
|
||||
RH-Acked-by: Stefan Hajnoczi <stefanha@redhat.com>
|
||||
RH-Acked-by: Hanna Reitz <hreitz@redhat.com>
|
||||
|
||||
bdrv_subtree_drained_end() requires the caller to hold the AioContext
|
||||
lock for the drained node. Not doing this for nodes outside of the main
|
||||
AioContext leads to crashes when AIO_WAIT_WHILE() needs to wait and
|
||||
tries to temporarily release the lock.
|
||||
|
||||
Fixes: 3908b7a8994fa5ef7a89aa58cd5a02fc58141592
|
||||
Resolves: https://bugzilla.redhat.com/show_bug.cgi?id=2046659
|
||||
Reported-by: Qing Wang <qinwang@redhat.com>
|
||||
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
|
||||
Message-Id: <20220203140534.36522-2-kwolf@redhat.com>
|
||||
Reviewed-by: Hanna Reitz <hreitz@redhat.com>
|
||||
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
|
||||
(cherry picked from commit aba8205be0707b9d108e32254e186ba88107a869)
|
||||
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
|
||||
---
|
||||
blockdev.c | 11 ++++++++++-
|
||||
1 file changed, 10 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/blockdev.c b/blockdev.c
|
||||
index b35072644e..565f6a81fd 100644
|
||||
--- a/blockdev.c
|
||||
+++ b/blockdev.c
|
||||
@@ -3562,6 +3562,7 @@ void qmp_blockdev_reopen(BlockdevOptionsList *reopen_list, Error **errp)
|
||||
{
|
||||
BlockReopenQueue *queue = NULL;
|
||||
GSList *drained = NULL;
|
||||
+ GSList *p;
|
||||
|
||||
/* Add each one of the BDS that we want to reopen to the queue */
|
||||
for (; reopen_list != NULL; reopen_list = reopen_list->next) {
|
||||
@@ -3611,7 +3612,15 @@ void qmp_blockdev_reopen(BlockdevOptionsList *reopen_list, Error **errp)
|
||||
|
||||
fail:
|
||||
bdrv_reopen_queue_free(queue);
|
||||
- g_slist_free_full(drained, (GDestroyNotify) bdrv_subtree_drained_end);
|
||||
+ for (p = drained; p; p = p->next) {
|
||||
+ BlockDriverState *bs = p->data;
|
||||
+ AioContext *ctx = bdrv_get_aio_context(bs);
|
||||
+
|
||||
+ aio_context_acquire(ctx);
|
||||
+ bdrv_subtree_drained_end(bs);
|
||||
+ aio_context_release(ctx);
|
||||
+ }
|
||||
+ g_slist_free(drained);
|
||||
}
|
||||
|
||||
void qmp_blockdev_del(const char *node_name, Error **errp)
|
||||
--
|
||||
2.27.0
|
||||
|
@ -1,129 +0,0 @@
|
||||
From 87f3b10dc600ac12272ee6cdc67571910ea722f6 Mon Sep 17 00:00:00 2001
|
||||
From: Stefan Hajnoczi <stefanha@redhat.com>
|
||||
Date: Tue, 11 Jan 2022 15:36:12 +0000
|
||||
Subject: [PATCH 10/12] block-backend: prevent dangling BDS pointers across
|
||||
aio_poll()
|
||||
|
||||
RH-Author: Hanna Reitz <hreitz@redhat.com>
|
||||
RH-MergeRequest: 71: block-backend: prevent dangling BDS pointers across aio_poll()
|
||||
RH-Commit: [1/2] 1b4cab39bf8c933ab910293a29bfceaa9e821068 (hreitz/qemu-kvm-c-9-s)
|
||||
RH-Bugzilla: 2040123
|
||||
RH-Acked-by: Kevin Wolf <kwolf@redhat.com>
|
||||
RH-Acked-by: Stefan Hajnoczi <stefanha@redhat.com>
|
||||
RH-Acked-by: Emanuele Giuseppe Esposito <eesposit@redhat.com>
|
||||
|
||||
The BlockBackend root child can change when aio_poll() is invoked. This
|
||||
happens when a temporary filter node is removed upon blockjob
|
||||
completion, for example.
|
||||
|
||||
Functions in block/block-backend.c must be aware of this when using a
|
||||
blk_bs() pointer across aio_poll() because the BlockDriverState refcnt
|
||||
may reach 0, resulting in a stale pointer.
|
||||
|
||||
One example is scsi_device_purge_requests(), which calls blk_drain() to
|
||||
wait for in-flight requests to cancel. If the backup blockjob is active,
|
||||
then the BlockBackend root child is a temporary filter BDS owned by the
|
||||
blockjob. The blockjob can complete during bdrv_drained_begin() and the
|
||||
last reference to the BDS is released when the temporary filter node is
|
||||
removed. This results in a use-after-free when blk_drain() calls
|
||||
bdrv_drained_end(bs) on the dangling pointer.
|
||||
|
||||
Explicitly hold a reference to bs across block APIs that invoke
|
||||
aio_poll().
|
||||
|
||||
Buglink: https://bugzilla.redhat.com/show_bug.cgi?id=2021778
|
||||
Buglink: https://bugzilla.redhat.com/show_bug.cgi?id=2036178
|
||||
Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
|
||||
Message-Id: <20220111153613.25453-2-stefanha@redhat.com>
|
||||
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
|
||||
(cherry picked from commit 1e3552dbd28359d35967b7c28dc86cde1bc29205)
|
||||
Signed-off-by: Hanna Reitz <hreitz@redhat.com>
|
||||
---
|
||||
block/block-backend.c | 19 +++++++++++++++++--
|
||||
1 file changed, 17 insertions(+), 2 deletions(-)
|
||||
|
||||
diff --git a/block/block-backend.c b/block/block-backend.c
|
||||
index 12ef80ea17..23e727199b 100644
|
||||
--- a/block/block-backend.c
|
||||
+++ b/block/block-backend.c
|
||||
@@ -822,16 +822,22 @@ BlockBackend *blk_by_public(BlockBackendPublic *public)
|
||||
void blk_remove_bs(BlockBackend *blk)
|
||||
{
|
||||
ThrottleGroupMember *tgm = &blk->public.throttle_group_member;
|
||||
- BlockDriverState *bs;
|
||||
BdrvChild *root;
|
||||
|
||||
notifier_list_notify(&blk->remove_bs_notifiers, blk);
|
||||
if (tgm->throttle_state) {
|
||||
- bs = blk_bs(blk);
|
||||
+ BlockDriverState *bs = blk_bs(blk);
|
||||
+
|
||||
+ /*
|
||||
+ * Take a ref in case blk_bs() changes across bdrv_drained_begin(), for
|
||||
+ * example, if a temporary filter node is removed by a blockjob.
|
||||
+ */
|
||||
+ bdrv_ref(bs);
|
||||
bdrv_drained_begin(bs);
|
||||
throttle_group_detach_aio_context(tgm);
|
||||
throttle_group_attach_aio_context(tgm, qemu_get_aio_context());
|
||||
bdrv_drained_end(bs);
|
||||
+ bdrv_unref(bs);
|
||||
}
|
||||
|
||||
blk_update_root_state(blk);
|
||||
@@ -1705,6 +1711,7 @@ void blk_drain(BlockBackend *blk)
|
||||
BlockDriverState *bs = blk_bs(blk);
|
||||
|
||||
if (bs) {
|
||||
+ bdrv_ref(bs);
|
||||
bdrv_drained_begin(bs);
|
||||
}
|
||||
|
||||
@@ -1714,6 +1721,7 @@ void blk_drain(BlockBackend *blk)
|
||||
|
||||
if (bs) {
|
||||
bdrv_drained_end(bs);
|
||||
+ bdrv_unref(bs);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2044,10 +2052,13 @@ static int blk_do_set_aio_context(BlockBackend *blk, AioContext *new_context,
|
||||
int ret;
|
||||
|
||||
if (bs) {
|
||||
+ bdrv_ref(bs);
|
||||
+
|
||||
if (update_root_node) {
|
||||
ret = bdrv_child_try_set_aio_context(bs, new_context, blk->root,
|
||||
errp);
|
||||
if (ret < 0) {
|
||||
+ bdrv_unref(bs);
|
||||
return ret;
|
||||
}
|
||||
}
|
||||
@@ -2057,6 +2068,8 @@ static int blk_do_set_aio_context(BlockBackend *blk, AioContext *new_context,
|
||||
throttle_group_attach_aio_context(tgm, new_context);
|
||||
bdrv_drained_end(bs);
|
||||
}
|
||||
+
|
||||
+ bdrv_unref(bs);
|
||||
}
|
||||
|
||||
blk->ctx = new_context;
|
||||
@@ -2326,11 +2339,13 @@ void blk_io_limits_disable(BlockBackend *blk)
|
||||
ThrottleGroupMember *tgm = &blk->public.throttle_group_member;
|
||||
assert(tgm->throttle_state);
|
||||
if (bs) {
|
||||
+ bdrv_ref(bs);
|
||||
bdrv_drained_begin(bs);
|
||||
}
|
||||
throttle_group_unregister_tgm(tgm);
|
||||
if (bs) {
|
||||
bdrv_drained_end(bs);
|
||||
+ bdrv_unref(bs);
|
||||
}
|
||||
}
|
||||
|
||||
--
|
||||
2.27.0
|
||||
|
@ -1,56 +0,0 @@
|
||||
From a6b472de71f6ebbe44025e1348c90e6f1f2b2326 Mon Sep 17 00:00:00 2001
|
||||
From: Hanna Reitz <hreitz@redhat.com>
|
||||
Date: Tue, 18 Jan 2022 17:59:59 +0100
|
||||
Subject: [PATCH 06/12] block/io: Update BSC only if want_zero is true
|
||||
|
||||
RH-Author: Hanna Reitz <hreitz@redhat.com>
|
||||
RH-MergeRequest: 69: block/io: Update BSC only if want_zero is true
|
||||
RH-Commit: [1/2] ad19ff86c3420cafe5a9e785ee210e482fbc8cd7 (hreitz/qemu-kvm-c-9-s)
|
||||
RH-Bugzilla: 2041461
|
||||
RH-Acked-by: Eric Blake <eblake@redhat.com>
|
||||
RH-Acked-by: Stefan Hajnoczi <stefanha@redhat.com>
|
||||
RH-Acked-by: Kevin Wolf <kwolf@redhat.com>
|
||||
|
||||
We update the block-status cache whenever we get new information from a
|
||||
bdrv_co_block_status() call to the block driver. However, if we have
|
||||
passed want_zero=false to that call, it may flag areas containing zeroes
|
||||
as data, and so we would update the block-status cache with wrong
|
||||
information.
|
||||
|
||||
Therefore, we should not update the cache with want_zero=false.
|
||||
|
||||
Reported-by: Nir Soffer <nsoffer@redhat.com>
|
||||
Fixes: 0bc329fbb00 ("block: block-status cache for data regions")
|
||||
Reviewed-by: Nir Soffer <nsoffer@redhat.com>
|
||||
Cc: qemu-stable@nongnu.org
|
||||
Signed-off-by: Hanna Reitz <hreitz@redhat.com>
|
||||
Message-Id: <20220118170000.49423-2-hreitz@redhat.com>
|
||||
Reviewed-by: Eric Blake <eblake@redhat.com>
|
||||
Signed-off-by: Eric Blake <eblake@redhat.com>
|
||||
(cherry picked from commit 113b727ce788335cf76f65355d670c9bc130fd75)
|
||||
Signed-off-by: Hanna Reitz <hreitz@redhat.com>
|
||||
---
|
||||
block/io.c | 6 +++++-
|
||||
1 file changed, 5 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/block/io.c b/block/io.c
|
||||
index bb0a254def..4e4cb556c5 100644
|
||||
--- a/block/io.c
|
||||
+++ b/block/io.c
|
||||
@@ -2497,8 +2497,12 @@ static int coroutine_fn bdrv_co_block_status(BlockDriverState *bs,
|
||||
* non-protocol nodes, and then it is never used. However, filling
|
||||
* 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
|
||||
+ * have accurate information about what is zero and what is data.
|
||||
*/
|
||||
- if (ret == (BDRV_BLOCK_DATA | BDRV_BLOCK_OFFSET_VALID) &&
|
||||
+ if (want_zero &&
|
||||
+ ret == (BDRV_BLOCK_DATA | BDRV_BLOCK_OFFSET_VALID) &&
|
||||
QLIST_EMPTY(&bs->children))
|
||||
{
|
||||
/*
|
||||
--
|
||||
2.27.0
|
||||
|
@ -1,52 +0,0 @@
|
||||
From 76b03619435d0b2f0125ee7aa5c94f2b889247de Mon Sep 17 00:00:00 2001
|
||||
From: Hanna Reitz <hreitz@redhat.com>
|
||||
Date: Fri, 4 Feb 2022 12:10:08 +0100
|
||||
Subject: [PATCH 4/8] block/nbd: Assert there are no timers when closed
|
||||
|
||||
RH-Author: Hanna Reitz <hreitz@redhat.com>
|
||||
RH-MergeRequest: 74: block/nbd: Handle AioContext changes
|
||||
RH-Commit: [2/6] 56903457ca35d9c596aeb6827a48f80e8eabd66a (hreitz/qemu-kvm-c-9-s)
|
||||
RH-Bugzilla: 2033626
|
||||
RH-Acked-by: Miroslav Rezanina <mrezanin@redhat.com>
|
||||
RH-Acked-by: Eric Blake <eblake@redhat.com>
|
||||
RH-Acked-by: Stefan Hajnoczi <stefanha@redhat.com>
|
||||
|
||||
Our two timers must not remain armed beyond nbd_clear_bdrvstate(), or
|
||||
they will access freed data when they fire.
|
||||
|
||||
This patch is separate from the patches that actually fix the issue
|
||||
(HEAD^^ and HEAD^) so that you can run the associated regression iotest
|
||||
(281) on a configuration that reproducibly exposes the bug.
|
||||
|
||||
Reviewed-by: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>
|
||||
Signed-off-by: Hanna Reitz <hreitz@redhat.com>
|
||||
Signed-off-by: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>
|
||||
(cherry picked from commit 8a39c381e5e407d2fe5500324323f90a8540fa90)
|
||||
|
||||
Conflict:
|
||||
- block/nbd.c: open_timer was introduced after the 6.2 release (for
|
||||
nbd's @open-timeout parameter), and has not been backported, so drop
|
||||
the assertion that it is NULL
|
||||
|
||||
Signed-off-by: Hanna Reitz <hreitz@redhat.com>
|
||||
---
|
||||
block/nbd.c | 3 +++
|
||||
1 file changed, 3 insertions(+)
|
||||
|
||||
diff --git a/block/nbd.c b/block/nbd.c
|
||||
index b8e5a9b4cc..aab20125d8 100644
|
||||
--- a/block/nbd.c
|
||||
+++ b/block/nbd.c
|
||||
@@ -108,6 +108,9 @@ static void nbd_clear_bdrvstate(BlockDriverState *bs)
|
||||
|
||||
yank_unregister_instance(BLOCKDEV_YANK_INSTANCE(bs->node_name));
|
||||
|
||||
+ /* Must not leave timers behind that would access freed data */
|
||||
+ assert(!s->reconnect_delay_timer);
|
||||
+
|
||||
object_unref(OBJECT(s->tlscreds));
|
||||
qapi_free_SocketAddress(s->saddr);
|
||||
s->saddr = NULL;
|
||||
--
|
||||
2.27.0
|
||||
|
@ -1,54 +0,0 @@
|
||||
From eeb4683ad8c40a03a4e91463ec1d1b651974b744 Mon Sep 17 00:00:00 2001
|
||||
From: Hanna Reitz <hreitz@redhat.com>
|
||||
Date: Fri, 4 Feb 2022 12:10:06 +0100
|
||||
Subject: [PATCH 3/8] block/nbd: Delete reconnect delay timer when done
|
||||
|
||||
RH-Author: Hanna Reitz <hreitz@redhat.com>
|
||||
RH-MergeRequest: 74: block/nbd: Handle AioContext changes
|
||||
RH-Commit: [1/6] 34f92910b6ffd256d781109a2b39737fc6ab449c (hreitz/qemu-kvm-c-9-s)
|
||||
RH-Bugzilla: 2033626
|
||||
RH-Acked-by: Miroslav Rezanina <mrezanin@redhat.com>
|
||||
RH-Acked-by: Eric Blake <eblake@redhat.com>
|
||||
RH-Acked-by: Stefan Hajnoczi <stefanha@redhat.com>
|
||||
|
||||
We start the reconnect delay timer to cancel the reconnection attempt
|
||||
after a while. Once nbd_co_do_establish_connection() has returned, this
|
||||
attempt is over, and we no longer need the timer.
|
||||
|
||||
Delete it before returning from nbd_reconnect_attempt(), so that it does
|
||||
not persist beyond the I/O request that was paused for reconnecting; we
|
||||
do not want it to fire in a drained section, because all sort of things
|
||||
can happen in such a section (e.g. the AioContext might be changed, and
|
||||
we do not want the timer to fire in the wrong context; or the BDS might
|
||||
even be deleted, and so the timer CB would access already-freed data).
|
||||
|
||||
Reviewed-by: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>
|
||||
Signed-off-by: Hanna Reitz <hreitz@redhat.com>
|
||||
Signed-off-by: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>
|
||||
(cherry picked from commit 3ce1fc16bad9c3f8b7b10b451a224d6d76e5c551)
|
||||
Signed-off-by: Hanna Reitz <hreitz@redhat.com>
|
||||
---
|
||||
block/nbd.c | 7 +++++++
|
||||
1 file changed, 7 insertions(+)
|
||||
|
||||
diff --git a/block/nbd.c b/block/nbd.c
|
||||
index 5ef462db1b..b8e5a9b4cc 100644
|
||||
--- a/block/nbd.c
|
||||
+++ b/block/nbd.c
|
||||
@@ -353,6 +353,13 @@ static coroutine_fn void nbd_reconnect_attempt(BDRVNBDState *s)
|
||||
}
|
||||
|
||||
nbd_co_do_establish_connection(s->bs, NULL);
|
||||
+
|
||||
+ /*
|
||||
+ * The reconnect attempt is done (maybe successfully, maybe not), so
|
||||
+ * we no longer need this timer. Delete it so it will not outlive
|
||||
+ * this I/O request (so draining removes all timers).
|
||||
+ */
|
||||
+ reconnect_delay_timer_del(s);
|
||||
}
|
||||
|
||||
static coroutine_fn int nbd_receive_replies(BDRVNBDState *s, uint64_t handle)
|
||||
--
|
||||
2.27.0
|
||||
|
@ -1,107 +0,0 @@
|
||||
From 6d9d86cc4e6149d4c0793e8ceb65dab7535a4561 Mon Sep 17 00:00:00 2001
|
||||
From: Hanna Reitz <hreitz@redhat.com>
|
||||
Date: Fri, 4 Feb 2022 12:10:11 +0100
|
||||
Subject: [PATCH 7/8] block/nbd: Move s->ioc on AioContext change
|
||||
|
||||
RH-Author: Hanna Reitz <hreitz@redhat.com>
|
||||
RH-MergeRequest: 74: block/nbd: Handle AioContext changes
|
||||
RH-Commit: [5/6] b3c1eb21ac70d64fdac6094468a72cfbe50a30a9 (hreitz/qemu-kvm-c-9-s)
|
||||
RH-Bugzilla: 2033626
|
||||
RH-Acked-by: Miroslav Rezanina <mrezanin@redhat.com>
|
||||
RH-Acked-by: Eric Blake <eblake@redhat.com>
|
||||
RH-Acked-by: Stefan Hajnoczi <stefanha@redhat.com>
|
||||
|
||||
s->ioc must always be attached to the NBD node's AioContext. If that
|
||||
context changes, s->ioc must be attached to the new context.
|
||||
|
||||
Buglink: https://bugzilla.redhat.com/show_bug.cgi?id=2033626
|
||||
Reviewed-by: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>
|
||||
Signed-off-by: Hanna Reitz <hreitz@redhat.com>
|
||||
Signed-off-by: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>
|
||||
(cherry picked from commit e15f3a66c830e3fce99c9d56c493c2f7078a1225)
|
||||
|
||||
Conflict:
|
||||
- block/nbd.c: open_timer was added after the 6.2 release, so we need
|
||||
not (and cannot) assert it is NULL here.
|
||||
|
||||
Signed-off-by: Hanna Reitz <hreitz@redhat.com>
|
||||
---
|
||||
block/nbd.c | 41 +++++++++++++++++++++++++++++++++++++++++
|
||||
1 file changed, 41 insertions(+)
|
||||
|
||||
diff --git a/block/nbd.c b/block/nbd.c
|
||||
index aab20125d8..a3896c7f5f 100644
|
||||
--- a/block/nbd.c
|
||||
+++ b/block/nbd.c
|
||||
@@ -2003,6 +2003,38 @@ static void nbd_cancel_in_flight(BlockDriverState *bs)
|
||||
nbd_co_establish_connection_cancel(s->conn);
|
||||
}
|
||||
|
||||
+static void nbd_attach_aio_context(BlockDriverState *bs,
|
||||
+ AioContext *new_context)
|
||||
+{
|
||||
+ BDRVNBDState *s = bs->opaque;
|
||||
+
|
||||
+ /*
|
||||
+ * The reconnect_delay_timer is scheduled in I/O paths when the
|
||||
+ * connection is lost, to cancel the reconnection attempt after a
|
||||
+ * given time. Once this attempt is done (successfully or not),
|
||||
+ * nbd_reconnect_attempt() ensures the timer is deleted before the
|
||||
+ * respective I/O request is resumed.
|
||||
+ * Since the AioContext can only be changed when a node is drained,
|
||||
+ * the reconnect_delay_timer cannot be active here.
|
||||
+ */
|
||||
+ assert(!s->reconnect_delay_timer);
|
||||
+
|
||||
+ if (s->ioc) {
|
||||
+ qio_channel_attach_aio_context(s->ioc, new_context);
|
||||
+ }
|
||||
+}
|
||||
+
|
||||
+static void nbd_detach_aio_context(BlockDriverState *bs)
|
||||
+{
|
||||
+ BDRVNBDState *s = bs->opaque;
|
||||
+
|
||||
+ assert(!s->reconnect_delay_timer);
|
||||
+
|
||||
+ if (s->ioc) {
|
||||
+ qio_channel_detach_aio_context(s->ioc);
|
||||
+ }
|
||||
+}
|
||||
+
|
||||
static BlockDriver bdrv_nbd = {
|
||||
.format_name = "nbd",
|
||||
.protocol_name = "nbd",
|
||||
@@ -2026,6 +2058,9 @@ static BlockDriver bdrv_nbd = {
|
||||
.bdrv_dirname = nbd_dirname,
|
||||
.strong_runtime_opts = nbd_strong_runtime_opts,
|
||||
.bdrv_cancel_in_flight = nbd_cancel_in_flight,
|
||||
+
|
||||
+ .bdrv_attach_aio_context = nbd_attach_aio_context,
|
||||
+ .bdrv_detach_aio_context = nbd_detach_aio_context,
|
||||
};
|
||||
|
||||
static BlockDriver bdrv_nbd_tcp = {
|
||||
@@ -2051,6 +2086,9 @@ static BlockDriver bdrv_nbd_tcp = {
|
||||
.bdrv_dirname = nbd_dirname,
|
||||
.strong_runtime_opts = nbd_strong_runtime_opts,
|
||||
.bdrv_cancel_in_flight = nbd_cancel_in_flight,
|
||||
+
|
||||
+ .bdrv_attach_aio_context = nbd_attach_aio_context,
|
||||
+ .bdrv_detach_aio_context = nbd_detach_aio_context,
|
||||
};
|
||||
|
||||
static BlockDriver bdrv_nbd_unix = {
|
||||
@@ -2076,6 +2114,9 @@ static BlockDriver bdrv_nbd_unix = {
|
||||
.bdrv_dirname = nbd_dirname,
|
||||
.strong_runtime_opts = nbd_strong_runtime_opts,
|
||||
.bdrv_cancel_in_flight = nbd_cancel_in_flight,
|
||||
+
|
||||
+ .bdrv_attach_aio_context = nbd_attach_aio_context,
|
||||
+ .bdrv_detach_aio_context = nbd_detach_aio_context,
|
||||
};
|
||||
|
||||
static void bdrv_nbd_init(void)
|
||||
--
|
||||
2.27.0
|
||||
|
@ -1,71 +0,0 @@
|
||||
From 6989be9d0aa08470f8b287c243dc4bf027d5fbcf Mon Sep 17 00:00:00 2001
|
||||
From: Stefan Hajnoczi <stefanha@redhat.com>
|
||||
Date: Wed, 8 Dec 2021 15:22:46 +0000
|
||||
Subject: [PATCH 1/2] block/nvme: fix infinite loop in nvme_free_req_queue_cb()
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
RH-Author: Stefan Hajnoczi <stefanha@redhat.com>
|
||||
RH-MergeRequest: 58: block/nvme: fix infinite loop in nvme_free_req_queue_cb()
|
||||
RH-Commit: [1/1] 544b3f310d791a20c63b51947de0c6cbb60b0d5b (stefanha/centos-stream-qemu-kvm)
|
||||
RH-Bugzilla: 2024544
|
||||
RH-Acked-by: Kevin Wolf <kwolf@redhat.com>
|
||||
RH-Acked-by: Stefano Garzarella <sgarzare@redhat.com>
|
||||
RH-Acked-by: Hanna Reitz <hreitz@redhat.com>
|
||||
|
||||
When the request free list is exhausted the coroutine waits on
|
||||
q->free_req_queue for the next free request. Whenever a request is
|
||||
completed a BH is scheduled to invoke nvme_free_req_queue_cb() and wake
|
||||
up waiting coroutines.
|
||||
|
||||
1. nvme_get_free_req() waits for a free request:
|
||||
|
||||
while (q->free_req_head == -1) {
|
||||
...
|
||||
trace_nvme_free_req_queue_wait(q->s, q->index);
|
||||
qemu_co_queue_wait(&q->free_req_queue, &q->lock);
|
||||
...
|
||||
}
|
||||
|
||||
2. nvme_free_req_queue_cb() wakes up the coroutine:
|
||||
|
||||
while (qemu_co_enter_next(&q->free_req_queue, &q->lock)) {
|
||||
^--- infinite loop when free_req_head == -1
|
||||
}
|
||||
|
||||
nvme_free_req_queue_cb() and the coroutine form an infinite loop when
|
||||
q->free_req_head == -1. Fix this by checking q->free_req_head in
|
||||
nvme_free_req_queue_cb(). If the free request list is exhausted, don't
|
||||
wake waiting coroutines. Eventually an in-flight request will complete
|
||||
and the BH will be scheduled again, guaranteeing forward progress.
|
||||
|
||||
Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
|
||||
Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com>
|
||||
Message-id: 20211208152246.244585-1-stefanha@redhat.com
|
||||
Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
|
||||
(cherry picked from commit cf4fbc3030c974fff726756a7ceef8386cdf500b)
|
||||
Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
|
||||
---
|
||||
block/nvme.c | 5 +++--
|
||||
1 file changed, 3 insertions(+), 2 deletions(-)
|
||||
|
||||
diff --git a/block/nvme.c b/block/nvme.c
|
||||
index e4f336d79c..fa360b9b3c 100644
|
||||
--- a/block/nvme.c
|
||||
+++ b/block/nvme.c
|
||||
@@ -206,8 +206,9 @@ static void nvme_free_req_queue_cb(void *opaque)
|
||||
NVMeQueuePair *q = opaque;
|
||||
|
||||
qemu_mutex_lock(&q->lock);
|
||||
- while (qemu_co_enter_next(&q->free_req_queue, &q->lock)) {
|
||||
- /* Retry all pending requests */
|
||||
+ while (q->free_req_head != -1 &&
|
||||
+ qemu_co_enter_next(&q->free_req_queue, &q->lock)) {
|
||||
+ /* Retry waiting requests */
|
||||
}
|
||||
qemu_mutex_unlock(&q->lock);
|
||||
}
|
||||
--
|
||||
2.27.0
|
||||
|
@ -1,59 +0,0 @@
|
||||
From d374d5aa4485a0c62d6b48eec64491cae2fd0873 Mon Sep 17 00:00:00 2001
|
||||
From: Peter Lieven <pl@kamp.de>
|
||||
Date: Thu, 13 Jan 2022 15:44:25 +0100
|
||||
Subject: [PATCH 4/5] block/rbd: fix handling of holes in .bdrv_co_block_status
|
||||
|
||||
RH-Author: Stefano Garzarella <sgarzare@redhat.com>
|
||||
RH-MergeRequest: 68: block/rbd: fix handling of holes in .bdrv_co_block_status
|
||||
RH-Commit: [1/2] 8ef178b01885e3c292f7844ccff865b1a8d4faf0 (sgarzarella/qemu-kvm-c-9-s)
|
||||
RH-Bugzilla: 2034791
|
||||
RH-Acked-by: Miroslav Rezanina <mrezanin@redhat.com>
|
||||
RH-Acked-by: Kevin Wolf <kwolf@redhat.com>
|
||||
RH-Acked-by: Hanna Reitz <hreitz@redhat.com>
|
||||
|
||||
the assumption that we can't hit a hole if we do not diff against a snapshot was wrong.
|
||||
|
||||
We can see a hole in an image if we diff against base if there exists an older snapshot
|
||||
of the image and we have discarded blocks in the image where the snapshot has data.
|
||||
|
||||
Fix this by simply handling a hole like an unallocated area. There are no callbacks
|
||||
for unallocated areas so just bail out if we hit a hole.
|
||||
|
||||
Fixes: 0347a8fd4c3faaedf119be04c197804be40a384b
|
||||
Suggested-by: Ilya Dryomov <idryomov@gmail.com>
|
||||
Cc: qemu-stable@nongnu.org
|
||||
Signed-off-by: Peter Lieven <pl@kamp.de>
|
||||
Message-Id: <20220113144426.4036493-2-pl@kamp.de>
|
||||
Reviewed-by: Ilya Dryomov <idryomov@gmail.com>
|
||||
Reviewed-by: Stefano Garzarella <sgarzare@redhat.com>
|
||||
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
|
||||
(cherry picked from commit 9e302f64bb407a9bb097b626da97228c2654cfee)
|
||||
Signed-off-by: Stefano Garzarella <sgarzare@redhat.com>
|
||||
---
|
||||
block/rbd.c | 10 +++++-----
|
||||
1 file changed, 5 insertions(+), 5 deletions(-)
|
||||
|
||||
diff --git a/block/rbd.c b/block/rbd.c
|
||||
index def96292e0..20bb896c4a 100644
|
||||
--- a/block/rbd.c
|
||||
+++ b/block/rbd.c
|
||||
@@ -1279,11 +1279,11 @@ static int qemu_rbd_diff_iterate_cb(uint64_t offs, size_t len,
|
||||
RBDDiffIterateReq *req = opaque;
|
||||
|
||||
assert(req->offs + req->bytes <= offs);
|
||||
- /*
|
||||
- * we do not diff against a snapshot so we should never receive a callback
|
||||
- * for a hole.
|
||||
- */
|
||||
- assert(exists);
|
||||
+
|
||||
+ /* treat a hole like an unallocated area and bail out */
|
||||
+ if (!exists) {
|
||||
+ return 0;
|
||||
+ }
|
||||
|
||||
if (!req->exists && offs > req->offs) {
|
||||
/*
|
||||
--
|
||||
2.27.0
|
||||
|
@ -1,103 +0,0 @@
|
||||
From f035b5250529eed8d12e0b93b1b6d6f2c50003f6 Mon Sep 17 00:00:00 2001
|
||||
From: Peter Lieven <pl@kamp.de>
|
||||
Date: Thu, 13 Jan 2022 15:44:26 +0100
|
||||
Subject: [PATCH 5/5] block/rbd: workaround for ceph issue #53784
|
||||
|
||||
RH-Author: Stefano Garzarella <sgarzare@redhat.com>
|
||||
RH-MergeRequest: 68: block/rbd: fix handling of holes in .bdrv_co_block_status
|
||||
RH-Commit: [2/2] 5feaa2e20a77886cc1a84cdf212ade3dcda28289 (sgarzarella/qemu-kvm-c-9-s)
|
||||
RH-Bugzilla: 2034791
|
||||
RH-Acked-by: Miroslav Rezanina <mrezanin@redhat.com>
|
||||
RH-Acked-by: Kevin Wolf <kwolf@redhat.com>
|
||||
RH-Acked-by: Hanna Reitz <hreitz@redhat.com>
|
||||
|
||||
librbd had a bug until early 2022 that affected all versions of ceph that
|
||||
supported fast-diff. This bug results in reporting of incorrect offsets
|
||||
if the offset parameter to rbd_diff_iterate2 is not object aligned.
|
||||
|
||||
This patch works around this bug for pre Quincy versions of librbd.
|
||||
|
||||
Fixes: 0347a8fd4c3faaedf119be04c197804be40a384b
|
||||
Cc: qemu-stable@nongnu.org
|
||||
Signed-off-by: Peter Lieven <pl@kamp.de>
|
||||
Message-Id: <20220113144426.4036493-3-pl@kamp.de>
|
||||
Reviewed-by: Ilya Dryomov <idryomov@gmail.com>
|
||||
Reviewed-by: Stefano Garzarella <sgarzare@redhat.com>
|
||||
Tested-by: Stefano Garzarella <sgarzare@redhat.com>
|
||||
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
|
||||
(cherry picked from commit fc176116cdea816ceb8dd969080b2b95f58edbc0)
|
||||
Signed-off-by: Stefano Garzarella <sgarzare@redhat.com>
|
||||
---
|
||||
block/rbd.c | 42 ++++++++++++++++++++++++++++++++++++++++--
|
||||
1 file changed, 40 insertions(+), 2 deletions(-)
|
||||
|
||||
diff --git a/block/rbd.c b/block/rbd.c
|
||||
index 20bb896c4a..8f183eba2a 100644
|
||||
--- a/block/rbd.c
|
||||
+++ b/block/rbd.c
|
||||
@@ -1320,6 +1320,7 @@ static int coroutine_fn qemu_rbd_co_block_status(BlockDriverState *bs,
|
||||
int status, r;
|
||||
RBDDiffIterateReq req = { .offs = offset };
|
||||
uint64_t features, flags;
|
||||
+ uint64_t head = 0;
|
||||
|
||||
assert(offset + bytes <= s->image_size);
|
||||
|
||||
@@ -1347,7 +1348,43 @@ static int coroutine_fn qemu_rbd_co_block_status(BlockDriverState *bs,
|
||||
return status;
|
||||
}
|
||||
|
||||
- r = rbd_diff_iterate2(s->image, NULL, offset, bytes, true, true,
|
||||
+#if LIBRBD_VERSION_CODE < LIBRBD_VERSION(1, 17, 0)
|
||||
+ /*
|
||||
+ * librbd had a bug until early 2022 that affected all versions of ceph that
|
||||
+ * supported fast-diff. This bug results in reporting of incorrect offsets
|
||||
+ * if the offset parameter to rbd_diff_iterate2 is not object aligned.
|
||||
+ * Work around this bug by rounding down the offset to object boundaries.
|
||||
+ * This is OK because we call rbd_diff_iterate2 with whole_object = true.
|
||||
+ * However, this workaround only works for non cloned images with default
|
||||
+ * striping.
|
||||
+ *
|
||||
+ * See: https://tracker.ceph.com/issues/53784
|
||||
+ */
|
||||
+
|
||||
+ /* check if RBD image has non-default striping enabled */
|
||||
+ if (features & RBD_FEATURE_STRIPINGV2) {
|
||||
+ return status;
|
||||
+ }
|
||||
+
|
||||
+#pragma GCC diagnostic push
|
||||
+#pragma GCC diagnostic ignored "-Wdeprecated-declarations"
|
||||
+ /*
|
||||
+ * check if RBD image is a clone (= has a parent).
|
||||
+ *
|
||||
+ * rbd_get_parent_info is deprecated from Nautilus onwards, but the
|
||||
+ * replacement rbd_get_parent is not present in Luminous and Mimic.
|
||||
+ */
|
||||
+ if (rbd_get_parent_info(s->image, NULL, 0, NULL, 0, NULL, 0) != -ENOENT) {
|
||||
+ return status;
|
||||
+ }
|
||||
+#pragma GCC diagnostic pop
|
||||
+
|
||||
+ head = req.offs & (s->object_size - 1);
|
||||
+ req.offs -= head;
|
||||
+ bytes += head;
|
||||
+#endif
|
||||
+
|
||||
+ r = rbd_diff_iterate2(s->image, NULL, req.offs, bytes, true, true,
|
||||
qemu_rbd_diff_iterate_cb, &req);
|
||||
if (r < 0 && r != QEMU_RBD_EXIT_DIFF_ITERATE2) {
|
||||
return status;
|
||||
@@ -1366,7 +1403,8 @@ static int coroutine_fn qemu_rbd_co_block_status(BlockDriverState *bs,
|
||||
status = BDRV_BLOCK_ZERO | BDRV_BLOCK_OFFSET_VALID;
|
||||
}
|
||||
|
||||
- *pnum = req.bytes;
|
||||
+ assert(req.bytes > head);
|
||||
+ *pnum = req.bytes - head;
|
||||
return status;
|
||||
}
|
||||
|
||||
--
|
||||
2.27.0
|
||||
|
@ -0,0 +1,41 @@
|
||||
From 3a0e9bb88e82cc76ca5efc0595ce94b5dc34749e Mon Sep 17 00:00:00 2001
|
||||
From: Gavin Shan <gshan@redhat.com>
|
||||
Date: Mon, 25 Apr 2022 13:42:46 +0800
|
||||
Subject: [PATCH 1/2] configs/devices/aarch64-softmmu: Enable CONFIG_VIRTIO_MEM
|
||||
|
||||
RH-Author: Gavin Shan <gshan@redhat.com>
|
||||
RH-MergeRequest: 80: Enable virtio-mem for aarch64
|
||||
RH-Commit: [1/1] 1afbd08da6d7c860da8d617a0a932d3660514878 (gwshan/qemu-rhel-9)
|
||||
RH-Bugzilla: 2044162
|
||||
RH-Acked-by: Cornelia Huck <cohuck@redhat.com>
|
||||
RH-Acked-by: Eric Auger <eric.auger@redhat.com>
|
||||
RH-Acked-by: David Hildenbrand <david@redhat.com>
|
||||
|
||||
Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=2044162
|
||||
|
||||
This enables virtio-mem device on aarch64 since all needed commits
|
||||
are ready.
|
||||
|
||||
b1b87327a9 hw/arm/virt: Support for virtio-mem-pci
|
||||
1263615efe virtio-mem: Correct default THP size for ARM64
|
||||
|
||||
Signed-off-by: Gavin Shan <gshan@redhat.com>
|
||||
---
|
||||
configs/devices/aarch64-softmmu/aarch64-rh-devices.mak | 1 +
|
||||
1 file changed, 1 insertion(+)
|
||||
|
||||
diff --git a/configs/devices/aarch64-softmmu/aarch64-rh-devices.mak b/configs/devices/aarch64-softmmu/aarch64-rh-devices.mak
|
||||
index 5f6ee1de5b..187938573f 100644
|
||||
--- a/configs/devices/aarch64-softmmu/aarch64-rh-devices.mak
|
||||
+++ b/configs/devices/aarch64-softmmu/aarch64-rh-devices.mak
|
||||
@@ -22,6 +22,7 @@ CONFIG_VFIO=y
|
||||
CONFIG_VFIO_PCI=y
|
||||
CONFIG_VIRTIO_MMIO=y
|
||||
CONFIG_VIRTIO_PCI=y
|
||||
+CONFIG_VIRTIO_MEM=y
|
||||
CONFIG_XIO3130=y
|
||||
CONFIG_NVDIMM=y
|
||||
CONFIG_ACPI_APEI=y
|
||||
--
|
||||
2.35.1
|
||||
|
@ -0,0 +1,101 @@
|
||||
From e3cb8849862a9f0dd20f2913d540336a037d43c7 Mon Sep 17 00:00:00 2001
|
||||
From: Kevin Wolf <kwolf@redhat.com>
|
||||
Date: Tue, 10 May 2022 17:10:19 +0200
|
||||
Subject: [PATCH 07/16] coroutine: Rename qemu_coroutine_inc/dec_pool_size()
|
||||
|
||||
RH-Author: Kevin Wolf <kwolf@redhat.com>
|
||||
RH-MergeRequest: 87: coroutine: Fix crashes due to too large pool batch size
|
||||
RH-Commit: [1/2] 6389b11f70225f221784c270d9b90c1ea43ca8fb (kmwolf/centos-qemu-kvm)
|
||||
RH-Bugzilla: 2079938
|
||||
RH-Acked-by: Miroslav Rezanina <mrezanin@redhat.com>
|
||||
RH-Acked-by: Stefan Hajnoczi <stefanha@redhat.com>
|
||||
RH-Acked-by: Stefano Garzarella <sgarzare@redhat.com>
|
||||
|
||||
It's true that these functions currently affect the batch size in which
|
||||
coroutines are reused (i.e. moved from the global release pool to the
|
||||
allocation pool of a specific thread), but this is a bug and will be
|
||||
fixed in a separate patch.
|
||||
|
||||
In fact, the comment in the header file already just promises that it
|
||||
influences the pool size, so reflect this in the name of the functions.
|
||||
As a nice side effect, the shorter function name makes some line
|
||||
wrapping unnecessary.
|
||||
|
||||
Cc: qemu-stable@nongnu.org
|
||||
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
|
||||
Message-Id: <20220510151020.105528-2-kwolf@redhat.com>
|
||||
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
|
||||
(cherry picked from commit 98e3ab35054b946f7c2aba5408822532b0920b53)
|
||||
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
|
||||
---
|
||||
hw/block/virtio-blk.c | 6 ++----
|
||||
include/qemu/coroutine.h | 6 +++---
|
||||
util/qemu-coroutine.c | 4 ++--
|
||||
3 files changed, 7 insertions(+), 9 deletions(-)
|
||||
|
||||
diff --git a/hw/block/virtio-blk.c b/hw/block/virtio-blk.c
|
||||
index 540c38f829..6a1cc41877 100644
|
||||
--- a/hw/block/virtio-blk.c
|
||||
+++ b/hw/block/virtio-blk.c
|
||||
@@ -1215,8 +1215,7 @@ static void virtio_blk_device_realize(DeviceState *dev, Error **errp)
|
||||
for (i = 0; i < conf->num_queues; i++) {
|
||||
virtio_add_queue(vdev, conf->queue_size, virtio_blk_handle_output);
|
||||
}
|
||||
- qemu_coroutine_increase_pool_batch_size(conf->num_queues * conf->queue_size
|
||||
- / 2);
|
||||
+ qemu_coroutine_inc_pool_size(conf->num_queues * conf->queue_size / 2);
|
||||
virtio_blk_data_plane_create(vdev, conf, &s->dataplane, &err);
|
||||
if (err != NULL) {
|
||||
error_propagate(errp, err);
|
||||
@@ -1253,8 +1252,7 @@ static void virtio_blk_device_unrealize(DeviceState *dev)
|
||||
for (i = 0; i < conf->num_queues; i++) {
|
||||
virtio_del_queue(vdev, i);
|
||||
}
|
||||
- qemu_coroutine_decrease_pool_batch_size(conf->num_queues * conf->queue_size
|
||||
- / 2);
|
||||
+ qemu_coroutine_dec_pool_size(conf->num_queues * conf->queue_size / 2);
|
||||
qemu_del_vm_change_state_handler(s->change);
|
||||
blockdev_mark_auto_del(s->blk);
|
||||
virtio_cleanup(vdev);
|
||||
diff --git a/include/qemu/coroutine.h b/include/qemu/coroutine.h
|
||||
index c828a95ee0..5b621d1295 100644
|
||||
--- a/include/qemu/coroutine.h
|
||||
+++ b/include/qemu/coroutine.h
|
||||
@@ -334,12 +334,12 @@ void coroutine_fn yield_until_fd_readable(int fd);
|
||||
/**
|
||||
* Increase coroutine pool size
|
||||
*/
|
||||
-void qemu_coroutine_increase_pool_batch_size(unsigned int additional_pool_size);
|
||||
+void qemu_coroutine_inc_pool_size(unsigned int additional_pool_size);
|
||||
|
||||
/**
|
||||
- * Devcrease coroutine pool size
|
||||
+ * Decrease coroutine pool size
|
||||
*/
|
||||
-void qemu_coroutine_decrease_pool_batch_size(unsigned int additional_pool_size);
|
||||
+void qemu_coroutine_dec_pool_size(unsigned int additional_pool_size);
|
||||
|
||||
#include "qemu/lockable.h"
|
||||
|
||||
diff --git a/util/qemu-coroutine.c b/util/qemu-coroutine.c
|
||||
index c03b2422ff..faca0ca97c 100644
|
||||
--- a/util/qemu-coroutine.c
|
||||
+++ b/util/qemu-coroutine.c
|
||||
@@ -205,12 +205,12 @@ AioContext *coroutine_fn qemu_coroutine_get_aio_context(Coroutine *co)
|
||||
return co->ctx;
|
||||
}
|
||||
|
||||
-void qemu_coroutine_increase_pool_batch_size(unsigned int additional_pool_size)
|
||||
+void qemu_coroutine_inc_pool_size(unsigned int additional_pool_size)
|
||||
{
|
||||
qatomic_add(&pool_batch_size, additional_pool_size);
|
||||
}
|
||||
|
||||
-void qemu_coroutine_decrease_pool_batch_size(unsigned int removing_pool_size)
|
||||
+void qemu_coroutine_dec_pool_size(unsigned int removing_pool_size)
|
||||
{
|
||||
qatomic_sub(&pool_batch_size, removing_pool_size);
|
||||
}
|
||||
--
|
||||
2.31.1
|
||||
|
138
SOURCES/kvm-coroutine-Revert-to-constant-batch-size.patch
Normal file
138
SOURCES/kvm-coroutine-Revert-to-constant-batch-size.patch
Normal file
@ -0,0 +1,138 @@
|
||||
From 345107bfd5537b51f34aaeb97d6161858bb6feee Mon Sep 17 00:00:00 2001
|
||||
From: Kevin Wolf <kwolf@redhat.com>
|
||||
Date: Tue, 10 May 2022 17:10:20 +0200
|
||||
Subject: [PATCH 08/16] coroutine: Revert to constant batch size
|
||||
|
||||
RH-Author: Kevin Wolf <kwolf@redhat.com>
|
||||
RH-MergeRequest: 87: coroutine: Fix crashes due to too large pool batch size
|
||||
RH-Commit: [2/2] 8a8a39af873854cdc8333d1a70f3479a97c3ec7a (kmwolf/centos-qemu-kvm)
|
||||
RH-Bugzilla: 2079938
|
||||
RH-Acked-by: Miroslav Rezanina <mrezanin@redhat.com>
|
||||
RH-Acked-by: Stefan Hajnoczi <stefanha@redhat.com>
|
||||
RH-Acked-by: Stefano Garzarella <sgarzare@redhat.com>
|
||||
|
||||
Commit 4c41c69e changed the way the coroutine pool is sized because for
|
||||
virtio-blk devices with a large queue size and heavy I/O, it was just
|
||||
too small and caused coroutines to be deleted and reallocated soon
|
||||
afterwards. The change made the size dynamic based on the number of
|
||||
queues and the queue size of virtio-blk devices.
|
||||
|
||||
There are two important numbers here: Slightly simplified, when a
|
||||
coroutine terminates, it is generally stored in the global release pool
|
||||
up to a certain pool size, and if the pool is full, it is freed.
|
||||
Conversely, when allocating a new coroutine, the coroutines in the
|
||||
release pool are reused if the pool already has reached a certain
|
||||
minimum size (the batch size), otherwise we allocate new coroutines.
|
||||
|
||||
The problem after commit 4c41c69e is that it not only increases the
|
||||
maximum pool size (which is the intended effect), but also the batch
|
||||
size for reusing coroutines (which is a bug). It means that in cases
|
||||
with many devices and/or a large queue size (which defaults to the
|
||||
number of vcpus for virtio-blk-pci), many thousand coroutines could be
|
||||
sitting in the release pool without being reused.
|
||||
|
||||
This is not only a waste of memory and allocations, but it actually
|
||||
makes the QEMU process likely to hit the vm.max_map_count limit on Linux
|
||||
because each coroutine requires two mappings (its stack and the guard
|
||||
page for the stack), causing it to abort() in qemu_alloc_stack() because
|
||||
when the limit is hit, mprotect() starts to fail with ENOMEM.
|
||||
|
||||
In order to fix the problem, change the batch size back to 64 to avoid
|
||||
uselessly accumulating coroutines in the release pool, but keep the
|
||||
dynamic maximum pool size so that coroutines aren't freed too early
|
||||
in heavy I/O scenarios.
|
||||
|
||||
Note that this fix doesn't strictly make it impossible to hit the limit,
|
||||
but this would only happen if most of the coroutines are actually in use
|
||||
at the same time, not just sitting in a pool. This is the same behaviour
|
||||
as we already had before commit 4c41c69e. Fully preventing this would
|
||||
require allowing qemu_coroutine_create() to return an error, but it
|
||||
doesn't seem to be a scenario that people hit in practice.
|
||||
|
||||
Cc: qemu-stable@nongnu.org
|
||||
Resolves: https://bugzilla.redhat.com/show_bug.cgi?id=2079938
|
||||
Fixes: 4c41c69e05fe28c0f95f8abd2ebf407e95a4f04b
|
||||
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
|
||||
Message-Id: <20220510151020.105528-3-kwolf@redhat.com>
|
||||
Tested-by: Hiroki Narukawa <hnarukaw@yahoo-corp.jp>
|
||||
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
|
||||
(cherry picked from commit 9ec7a59b5aad4b736871c378d30f5ef5ec51cb52)
|
||||
|
||||
Conflicts:
|
||||
util/qemu-coroutine.c
|
||||
|
||||
Trivial merge conflict because we don't have commit ac387a08 downstream.
|
||||
|
||||
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
|
||||
---
|
||||
util/qemu-coroutine.c | 22 ++++++++++++++--------
|
||||
1 file changed, 14 insertions(+), 8 deletions(-)
|
||||
|
||||
diff --git a/util/qemu-coroutine.c b/util/qemu-coroutine.c
|
||||
index faca0ca97c..804f672e0a 100644
|
||||
--- a/util/qemu-coroutine.c
|
||||
+++ b/util/qemu-coroutine.c
|
||||
@@ -20,14 +20,20 @@
|
||||
#include "qemu/coroutine_int.h"
|
||||
#include "block/aio.h"
|
||||
|
||||
-/** Initial batch size is 64, and is increased on demand */
|
||||
+/**
|
||||
+ * The minimal batch size is always 64, coroutines from the release_pool are
|
||||
+ * reused as soon as there are 64 coroutines in it. The maximum pool size starts
|
||||
+ * with 64 and is increased on demand so that coroutines are not deleted even if
|
||||
+ * they are not immediately reused.
|
||||
+ */
|
||||
enum {
|
||||
- POOL_INITIAL_BATCH_SIZE = 64,
|
||||
+ POOL_MIN_BATCH_SIZE = 64,
|
||||
+ POOL_INITIAL_MAX_SIZE = 64,
|
||||
};
|
||||
|
||||
/** Free list to speed up creation */
|
||||
static QSLIST_HEAD(, Coroutine) release_pool = QSLIST_HEAD_INITIALIZER(pool);
|
||||
-static unsigned int pool_batch_size = POOL_INITIAL_BATCH_SIZE;
|
||||
+static unsigned int pool_max_size = POOL_INITIAL_MAX_SIZE;
|
||||
static unsigned int release_pool_size;
|
||||
static __thread QSLIST_HEAD(, Coroutine) alloc_pool = QSLIST_HEAD_INITIALIZER(pool);
|
||||
static __thread unsigned int alloc_pool_size;
|
||||
@@ -51,7 +57,7 @@ Coroutine *qemu_coroutine_create(CoroutineEntry *entry, void *opaque)
|
||||
if (CONFIG_COROUTINE_POOL) {
|
||||
co = QSLIST_FIRST(&alloc_pool);
|
||||
if (!co) {
|
||||
- if (release_pool_size > qatomic_read(&pool_batch_size)) {
|
||||
+ if (release_pool_size > POOL_MIN_BATCH_SIZE) {
|
||||
/* Slow path; a good place to register the destructor, too. */
|
||||
if (!coroutine_pool_cleanup_notifier.notify) {
|
||||
coroutine_pool_cleanup_notifier.notify = coroutine_pool_cleanup;
|
||||
@@ -88,12 +94,12 @@ static void coroutine_delete(Coroutine *co)
|
||||
co->caller = NULL;
|
||||
|
||||
if (CONFIG_COROUTINE_POOL) {
|
||||
- if (release_pool_size < qatomic_read(&pool_batch_size) * 2) {
|
||||
+ if (release_pool_size < qatomic_read(&pool_max_size) * 2) {
|
||||
QSLIST_INSERT_HEAD_ATOMIC(&release_pool, co, pool_next);
|
||||
qatomic_inc(&release_pool_size);
|
||||
return;
|
||||
}
|
||||
- if (alloc_pool_size < qatomic_read(&pool_batch_size)) {
|
||||
+ if (alloc_pool_size < qatomic_read(&pool_max_size)) {
|
||||
QSLIST_INSERT_HEAD(&alloc_pool, co, pool_next);
|
||||
alloc_pool_size++;
|
||||
return;
|
||||
@@ -207,10 +213,10 @@ AioContext *coroutine_fn qemu_coroutine_get_aio_context(Coroutine *co)
|
||||
|
||||
void qemu_coroutine_inc_pool_size(unsigned int additional_pool_size)
|
||||
{
|
||||
- qatomic_add(&pool_batch_size, additional_pool_size);
|
||||
+ qatomic_add(&pool_max_size, additional_pool_size);
|
||||
}
|
||||
|
||||
void qemu_coroutine_dec_pool_size(unsigned int removing_pool_size)
|
||||
{
|
||||
- qatomic_sub(&pool_batch_size, removing_pool_size);
|
||||
+ qatomic_sub(&pool_max_size, removing_pool_size);
|
||||
}
|
||||
--
|
||||
2.31.1
|
||||
|
@ -0,0 +1,132 @@
|
||||
From ffbd90e5f4eba620c7cd631b04f0ed31beb22ffa Mon Sep 17 00:00:00 2001
|
||||
From: Stefan Hajnoczi <stefanha@redhat.com>
|
||||
Date: Tue, 17 May 2022 12:07:56 +0100
|
||||
Subject: [PATCH 1/6] coroutine-ucontext: use QEMU_DEFINE_STATIC_CO_TLS()
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
RH-Author: Stefan Hajnoczi <stefanha@redhat.com>
|
||||
RH-MergeRequest: 89: coroutine: use coroutine TLS macros to protect thread-local variables
|
||||
RH-Commit: [1/3] a9782fe8e919c4bd317b7e8744c7ff57d898add3 (stefanha/centos-stream-qemu-kvm)
|
||||
RH-Bugzilla: 1952483
|
||||
RH-Acked-by: Hanna Reitz <hreitz@redhat.com>
|
||||
RH-Acked-by: Eric Blake <eblake@redhat.com>
|
||||
RH-Acked-by: Kevin Wolf <kwolf@redhat.com>
|
||||
|
||||
Thread-Local Storage variables cannot be used directly from coroutine
|
||||
code because the compiler may optimize TLS variable accesses across
|
||||
qemu_coroutine_yield() calls. When the coroutine is re-entered from
|
||||
another thread the TLS variables from the old thread must no longer be
|
||||
used.
|
||||
|
||||
Use QEMU_DEFINE_STATIC_CO_TLS() for the current and leader variables.
|
||||
|
||||
Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
|
||||
Message-Id: <20220307153853.602859-2-stefanha@redhat.com>
|
||||
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
|
||||
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
|
||||
(cherry picked from commit 34145a307d849d0b6734d0222a7aa0bb9eef7407)
|
||||
Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
|
||||
---
|
||||
util/coroutine-ucontext.c | 38 ++++++++++++++++++++++++--------------
|
||||
1 file changed, 24 insertions(+), 14 deletions(-)
|
||||
|
||||
diff --git a/util/coroutine-ucontext.c b/util/coroutine-ucontext.c
|
||||
index 904b375192..127d5a13c8 100644
|
||||
--- a/util/coroutine-ucontext.c
|
||||
+++ b/util/coroutine-ucontext.c
|
||||
@@ -25,6 +25,7 @@
|
||||
#include "qemu/osdep.h"
|
||||
#include <ucontext.h>
|
||||
#include "qemu/coroutine_int.h"
|
||||
+#include "qemu/coroutine-tls.h"
|
||||
|
||||
#ifdef CONFIG_VALGRIND_H
|
||||
#include <valgrind/valgrind.h>
|
||||
@@ -66,8 +67,8 @@ typedef struct {
|
||||
/**
|
||||
* Per-thread coroutine bookkeeping
|
||||
*/
|
||||
-static __thread CoroutineUContext leader;
|
||||
-static __thread Coroutine *current;
|
||||
+QEMU_DEFINE_STATIC_CO_TLS(Coroutine *, current);
|
||||
+QEMU_DEFINE_STATIC_CO_TLS(CoroutineUContext, leader);
|
||||
|
||||
/*
|
||||
* va_args to makecontext() must be type 'int', so passing
|
||||
@@ -97,14 +98,15 @@ static inline __attribute__((always_inline))
|
||||
void finish_switch_fiber(void *fake_stack_save)
|
||||
{
|
||||
#ifdef CONFIG_ASAN
|
||||
+ CoroutineUContext *leaderp = get_ptr_leader();
|
||||
const void *bottom_old;
|
||||
size_t size_old;
|
||||
|
||||
__sanitizer_finish_switch_fiber(fake_stack_save, &bottom_old, &size_old);
|
||||
|
||||
- if (!leader.stack) {
|
||||
- leader.stack = (void *)bottom_old;
|
||||
- leader.stack_size = size_old;
|
||||
+ if (!leaderp->stack) {
|
||||
+ leaderp->stack = (void *)bottom_old;
|
||||
+ leaderp->stack_size = size_old;
|
||||
}
|
||||
#endif
|
||||
#ifdef CONFIG_TSAN
|
||||
@@ -161,8 +163,10 @@ static void coroutine_trampoline(int i0, int i1)
|
||||
|
||||
/* Initialize longjmp environment and switch back the caller */
|
||||
if (!sigsetjmp(self->env, 0)) {
|
||||
- start_switch_fiber_asan(COROUTINE_YIELD, &fake_stack_save, leader.stack,
|
||||
- leader.stack_size);
|
||||
+ CoroutineUContext *leaderp = get_ptr_leader();
|
||||
+
|
||||
+ start_switch_fiber_asan(COROUTINE_YIELD, &fake_stack_save,
|
||||
+ leaderp->stack, leaderp->stack_size);
|
||||
start_switch_fiber_tsan(&fake_stack_save, self, true); /* true=caller */
|
||||
siglongjmp(*(sigjmp_buf *)co->entry_arg, 1);
|
||||
}
|
||||
@@ -297,7 +301,7 @@ qemu_coroutine_switch(Coroutine *from_, Coroutine *to_,
|
||||
int ret;
|
||||
void *fake_stack_save = NULL;
|
||||
|
||||
- current = to_;
|
||||
+ set_current(to_);
|
||||
|
||||
ret = sigsetjmp(from->env, 0);
|
||||
if (ret == 0) {
|
||||
@@ -315,18 +319,24 @@ qemu_coroutine_switch(Coroutine *from_, Coroutine *to_,
|
||||
|
||||
Coroutine *qemu_coroutine_self(void)
|
||||
{
|
||||
- if (!current) {
|
||||
- current = &leader.base;
|
||||
+ Coroutine *self = get_current();
|
||||
+ CoroutineUContext *leaderp = get_ptr_leader();
|
||||
+
|
||||
+ if (!self) {
|
||||
+ self = &leaderp->base;
|
||||
+ set_current(self);
|
||||
}
|
||||
#ifdef CONFIG_TSAN
|
||||
- if (!leader.tsan_co_fiber) {
|
||||
- leader.tsan_co_fiber = __tsan_get_current_fiber();
|
||||
+ if (!leaderp->tsan_co_fiber) {
|
||||
+ leaderp->tsan_co_fiber = __tsan_get_current_fiber();
|
||||
}
|
||||
#endif
|
||||
- return current;
|
||||
+ return self;
|
||||
}
|
||||
|
||||
bool qemu_in_coroutine(void)
|
||||
{
|
||||
- return current && current->caller;
|
||||
+ Coroutine *self = get_current();
|
||||
+
|
||||
+ return self && self->caller;
|
||||
}
|
||||
--
|
||||
2.31.1
|
||||
|
139
SOURCES/kvm-coroutine-use-QEMU_DEFINE_STATIC_CO_TLS.patch
Normal file
139
SOURCES/kvm-coroutine-use-QEMU_DEFINE_STATIC_CO_TLS.patch
Normal file
@ -0,0 +1,139 @@
|
||||
From 9c2e55d25fec6ffb21e344513b7dbeed7e21f641 Mon Sep 17 00:00:00 2001
|
||||
From: Stefan Hajnoczi <stefanha@redhat.com>
|
||||
Date: Tue, 17 May 2022 12:08:04 +0100
|
||||
Subject: [PATCH 2/6] coroutine: use QEMU_DEFINE_STATIC_CO_TLS()
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
RH-Author: Stefan Hajnoczi <stefanha@redhat.com>
|
||||
RH-MergeRequest: 89: coroutine: use coroutine TLS macros to protect thread-local variables
|
||||
RH-Commit: [2/3] 68a8847e406e2eace6ddc31b0c5676a60600d606 (stefanha/centos-stream-qemu-kvm)
|
||||
RH-Bugzilla: 1952483
|
||||
RH-Acked-by: Hanna Reitz <hreitz@redhat.com>
|
||||
RH-Acked-by: Eric Blake <eblake@redhat.com>
|
||||
RH-Acked-by: Kevin Wolf <kwolf@redhat.com>
|
||||
|
||||
Thread-Local Storage variables cannot be used directly from coroutine
|
||||
code because the compiler may optimize TLS variable accesses across
|
||||
qemu_coroutine_yield() calls. When the coroutine is re-entered from
|
||||
another thread the TLS variables from the old thread must no longer be
|
||||
used.
|
||||
|
||||
Use QEMU_DEFINE_STATIC_CO_TLS() for the current and leader variables.
|
||||
The alloc_pool QSLIST needs a typedef so the return value of
|
||||
get_ptr_alloc_pool() can be stored in a local variable.
|
||||
|
||||
One example of why this code is necessary: a coroutine that yields
|
||||
before calling qemu_coroutine_create() to create another coroutine is
|
||||
affected by the TLS issue.
|
||||
|
||||
Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
|
||||
Message-Id: <20220307153853.602859-3-stefanha@redhat.com>
|
||||
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
|
||||
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
|
||||
(cherry picked from commit ac387a08a9c9f6b36757da912f0339c25f421f90)
|
||||
|
||||
Conflicts:
|
||||
- Context conflicts due to commit 5411171c3ef4 ("coroutine: Revert to
|
||||
constant batch size").
|
||||
|
||||
Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
|
||||
---
|
||||
util/qemu-coroutine.c | 41 ++++++++++++++++++++++++-----------------
|
||||
1 file changed, 24 insertions(+), 17 deletions(-)
|
||||
|
||||
diff --git a/util/qemu-coroutine.c b/util/qemu-coroutine.c
|
||||
index 804f672e0a..4a8bd63ef0 100644
|
||||
--- a/util/qemu-coroutine.c
|
||||
+++ b/util/qemu-coroutine.c
|
||||
@@ -18,6 +18,7 @@
|
||||
#include "qemu/atomic.h"
|
||||
#include "qemu/coroutine.h"
|
||||
#include "qemu/coroutine_int.h"
|
||||
+#include "qemu/coroutine-tls.h"
|
||||
#include "block/aio.h"
|
||||
|
||||
/**
|
||||
@@ -35,17 +36,20 @@ enum {
|
||||
static QSLIST_HEAD(, Coroutine) release_pool = QSLIST_HEAD_INITIALIZER(pool);
|
||||
static unsigned int pool_max_size = POOL_INITIAL_MAX_SIZE;
|
||||
static unsigned int release_pool_size;
|
||||
-static __thread QSLIST_HEAD(, Coroutine) alloc_pool = QSLIST_HEAD_INITIALIZER(pool);
|
||||
-static __thread unsigned int alloc_pool_size;
|
||||
-static __thread Notifier coroutine_pool_cleanup_notifier;
|
||||
+
|
||||
+typedef QSLIST_HEAD(, Coroutine) CoroutineQSList;
|
||||
+QEMU_DEFINE_STATIC_CO_TLS(CoroutineQSList, alloc_pool);
|
||||
+QEMU_DEFINE_STATIC_CO_TLS(unsigned int, alloc_pool_size);
|
||||
+QEMU_DEFINE_STATIC_CO_TLS(Notifier, coroutine_pool_cleanup_notifier);
|
||||
|
||||
static void coroutine_pool_cleanup(Notifier *n, void *value)
|
||||
{
|
||||
Coroutine *co;
|
||||
Coroutine *tmp;
|
||||
+ CoroutineQSList *alloc_pool = get_ptr_alloc_pool();
|
||||
|
||||
- QSLIST_FOREACH_SAFE(co, &alloc_pool, pool_next, tmp) {
|
||||
- QSLIST_REMOVE_HEAD(&alloc_pool, pool_next);
|
||||
+ QSLIST_FOREACH_SAFE(co, alloc_pool, pool_next, tmp) {
|
||||
+ QSLIST_REMOVE_HEAD(alloc_pool, pool_next);
|
||||
qemu_coroutine_delete(co);
|
||||
}
|
||||
}
|
||||
@@ -55,27 +59,30 @@ Coroutine *qemu_coroutine_create(CoroutineEntry *entry, void *opaque)
|
||||
Coroutine *co = NULL;
|
||||
|
||||
if (CONFIG_COROUTINE_POOL) {
|
||||
- co = QSLIST_FIRST(&alloc_pool);
|
||||
+ CoroutineQSList *alloc_pool = get_ptr_alloc_pool();
|
||||
+
|
||||
+ co = QSLIST_FIRST(alloc_pool);
|
||||
if (!co) {
|
||||
if (release_pool_size > POOL_MIN_BATCH_SIZE) {
|
||||
/* Slow path; a good place to register the destructor, too. */
|
||||
- if (!coroutine_pool_cleanup_notifier.notify) {
|
||||
- coroutine_pool_cleanup_notifier.notify = coroutine_pool_cleanup;
|
||||
- qemu_thread_atexit_add(&coroutine_pool_cleanup_notifier);
|
||||
+ Notifier *notifier = get_ptr_coroutine_pool_cleanup_notifier();
|
||||
+ if (!notifier->notify) {
|
||||
+ notifier->notify = coroutine_pool_cleanup;
|
||||
+ qemu_thread_atexit_add(notifier);
|
||||
}
|
||||
|
||||
/* This is not exact; there could be a little skew between
|
||||
* release_pool_size and the actual size of release_pool. But
|
||||
* it is just a heuristic, it does not need to be perfect.
|
||||
*/
|
||||
- alloc_pool_size = qatomic_xchg(&release_pool_size, 0);
|
||||
- QSLIST_MOVE_ATOMIC(&alloc_pool, &release_pool);
|
||||
- co = QSLIST_FIRST(&alloc_pool);
|
||||
+ set_alloc_pool_size(qatomic_xchg(&release_pool_size, 0));
|
||||
+ QSLIST_MOVE_ATOMIC(alloc_pool, &release_pool);
|
||||
+ co = QSLIST_FIRST(alloc_pool);
|
||||
}
|
||||
}
|
||||
if (co) {
|
||||
- QSLIST_REMOVE_HEAD(&alloc_pool, pool_next);
|
||||
- alloc_pool_size--;
|
||||
+ QSLIST_REMOVE_HEAD(alloc_pool, pool_next);
|
||||
+ set_alloc_pool_size(get_alloc_pool_size() - 1);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -99,9 +106,9 @@ static void coroutine_delete(Coroutine *co)
|
||||
qatomic_inc(&release_pool_size);
|
||||
return;
|
||||
}
|
||||
- if (alloc_pool_size < qatomic_read(&pool_max_size)) {
|
||||
- QSLIST_INSERT_HEAD(&alloc_pool, co, pool_next);
|
||||
- alloc_pool_size++;
|
||||
+ if (get_alloc_pool_size() < qatomic_read(&pool_max_size)) {
|
||||
+ QSLIST_INSERT_HEAD(get_ptr_alloc_pool(), co, pool_next);
|
||||
+ set_alloc_pool_size(get_alloc_pool_size() + 1);
|
||||
return;
|
||||
}
|
||||
}
|
||||
--
|
||||
2.31.1
|
||||
|
@ -0,0 +1,99 @@
|
||||
From 336581e6e9ace3f1ddd24ad0a258db9785f9b0ed Mon Sep 17 00:00:00 2001
|
||||
From: Stefan Hajnoczi <stefanha@redhat.com>
|
||||
Date: Tue, 17 May 2022 12:08:12 +0100
|
||||
Subject: [PATCH 3/6] coroutine-win32: use QEMU_DEFINE_STATIC_CO_TLS()
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
RH-Author: Stefan Hajnoczi <stefanha@redhat.com>
|
||||
RH-MergeRequest: 89: coroutine: use coroutine TLS macros to protect thread-local variables
|
||||
RH-Commit: [3/3] 55b35dfdae1bc7d6f614ac9f81a92f5c6431f713 (stefanha/centos-stream-qemu-kvm)
|
||||
RH-Bugzilla: 1952483
|
||||
RH-Acked-by: Hanna Reitz <hreitz@redhat.com>
|
||||
RH-Acked-by: Eric Blake <eblake@redhat.com>
|
||||
RH-Acked-by: Kevin Wolf <kwolf@redhat.com>
|
||||
|
||||
Thread-Local Storage variables cannot be used directly from coroutine
|
||||
code because the compiler may optimize TLS variable accesses across
|
||||
qemu_coroutine_yield() calls. When the coroutine is re-entered from
|
||||
another thread the TLS variables from the old thread must no longer be
|
||||
used.
|
||||
|
||||
Use QEMU_DEFINE_STATIC_CO_TLS() for the current and leader variables.
|
||||
|
||||
I think coroutine-win32.c could get away with __thread because the
|
||||
variables are only used in situations where either the stale value is
|
||||
correct (current) or outside coroutine context (loading leader when
|
||||
current is NULL). Due to the difficulty of being sure that this is
|
||||
really safe in all scenarios it seems worth converting it anyway.
|
||||
|
||||
Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
|
||||
Message-Id: <20220307153853.602859-4-stefanha@redhat.com>
|
||||
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
|
||||
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
|
||||
(cherry picked from commit c1fe694357a328c807ae3cc6961c19e923448fcc)
|
||||
Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
|
||||
---
|
||||
util/coroutine-win32.c | 18 +++++++++++++-----
|
||||
1 file changed, 13 insertions(+), 5 deletions(-)
|
||||
|
||||
diff --git a/util/coroutine-win32.c b/util/coroutine-win32.c
|
||||
index de6bd4fd3e..c02a62c896 100644
|
||||
--- a/util/coroutine-win32.c
|
||||
+++ b/util/coroutine-win32.c
|
||||
@@ -25,6 +25,7 @@
|
||||
#include "qemu/osdep.h"
|
||||
#include "qemu-common.h"
|
||||
#include "qemu/coroutine_int.h"
|
||||
+#include "qemu/coroutine-tls.h"
|
||||
|
||||
typedef struct
|
||||
{
|
||||
@@ -34,8 +35,8 @@ typedef struct
|
||||
CoroutineAction action;
|
||||
} CoroutineWin32;
|
||||
|
||||
-static __thread CoroutineWin32 leader;
|
||||
-static __thread Coroutine *current;
|
||||
+QEMU_DEFINE_STATIC_CO_TLS(CoroutineWin32, leader);
|
||||
+QEMU_DEFINE_STATIC_CO_TLS(Coroutine *, current);
|
||||
|
||||
/* This function is marked noinline to prevent GCC from inlining it
|
||||
* into coroutine_trampoline(). If we allow it to do that then it
|
||||
@@ -52,7 +53,7 @@ qemu_coroutine_switch(Coroutine *from_, Coroutine *to_,
|
||||
CoroutineWin32 *from = DO_UPCAST(CoroutineWin32, base, from_);
|
||||
CoroutineWin32 *to = DO_UPCAST(CoroutineWin32, base, to_);
|
||||
|
||||
- current = to_;
|
||||
+ set_current(to_);
|
||||
|
||||
to->action = action;
|
||||
SwitchToFiber(to->fiber);
|
||||
@@ -89,14 +90,21 @@ void qemu_coroutine_delete(Coroutine *co_)
|
||||
|
||||
Coroutine *qemu_coroutine_self(void)
|
||||
{
|
||||
+ Coroutine *current = get_current();
|
||||
+
|
||||
if (!current) {
|
||||
- current = &leader.base;
|
||||
- leader.fiber = ConvertThreadToFiber(NULL);
|
||||
+ CoroutineWin32 *leader = get_ptr_leader();
|
||||
+
|
||||
+ current = &leader->base;
|
||||
+ set_current(current);
|
||||
+ leader->fiber = ConvertThreadToFiber(NULL);
|
||||
}
|
||||
return current;
|
||||
}
|
||||
|
||||
bool qemu_in_coroutine(void)
|
||||
{
|
||||
+ Coroutine *current = get_current();
|
||||
+
|
||||
return current && current->caller;
|
||||
}
|
||||
--
|
||||
2.31.1
|
||||
|
@ -1,77 +0,0 @@
|
||||
From eb88a12ab1ecfe77bcc0d0067c96fce27a3bde01 Mon Sep 17 00:00:00 2001
|
||||
From: Yang Zhong <yang.zhong@intel.com>
|
||||
Date: Mon, 1 Nov 2021 12:20:08 -0400
|
||||
Subject: [PATCH 03/12] doc: Add the SGX numa description
|
||||
|
||||
RH-Author: Paul Lai <plai@redhat.com>
|
||||
RH-MergeRequest: 65: Enable SGX and add SGX Numa support
|
||||
RH-Commit: [3/5] c27b3f6976cbe92cc3c0e1dab0191cdd25de596a
|
||||
RH-Bugzilla: 2033708
|
||||
RH-Acked-by: Paolo Bonzini <None>
|
||||
RH-Acked-by: Bandan Das <None>
|
||||
RH-Acked-by: Cornelia Huck <cohuck@redhat.com>
|
||||
|
||||
Add the SGX numa reference command and how to check if
|
||||
SGX numa is support or not with multiple EPC sections.
|
||||
|
||||
Signed-off-by: Yang Zhong <yang.zhong@intel.com>
|
||||
Message-Id: <20211101162009.62161-5-yang.zhong@intel.com>
|
||||
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
|
||||
(cherry picked from commit d1889b36098c79e2e6ac90faf3d0dc5ec0057677)
|
||||
Signed-off-by: Paul Lai <plai@redhat.com>
|
||||
---
|
||||
docs/system/i386/sgx.rst | 31 +++++++++++++++++++++++++++----
|
||||
1 file changed, 27 insertions(+), 4 deletions(-)
|
||||
|
||||
diff --git a/docs/system/i386/sgx.rst b/docs/system/i386/sgx.rst
|
||||
index f8fade5ac2..0f0a73f758 100644
|
||||
--- a/docs/system/i386/sgx.rst
|
||||
+++ b/docs/system/i386/sgx.rst
|
||||
@@ -141,8 +141,7 @@ To launch a SGX guest:
|
||||
|qemu_system_x86| \\
|
||||
-cpu host,+sgx-provisionkey \\
|
||||
-object memory-backend-epc,id=mem1,size=64M,prealloc=on \\
|
||||
- -object memory-backend-epc,id=mem2,size=28M \\
|
||||
- -M sgx-epc.0.memdev=mem1,sgx-epc.1.memdev=mem2
|
||||
+ -M sgx-epc.0.memdev=mem1,sgx-epc.0.node=0
|
||||
|
||||
Utilizing SGX in the guest requires a kernel/OS with SGX support.
|
||||
The support can be determined in guest by::
|
||||
@@ -152,8 +151,32 @@ The support can be determined in guest by::
|
||||
and SGX epc info by::
|
||||
|
||||
$ dmesg | grep sgx
|
||||
- [ 1.242142] sgx: EPC section 0x180000000-0x181bfffff
|
||||
- [ 1.242319] sgx: EPC section 0x181c00000-0x1837fffff
|
||||
+ [ 0.182807] sgx: EPC section 0x140000000-0x143ffffff
|
||||
+ [ 0.183695] sgx: [Firmware Bug]: Unable to map EPC section to online node. Fallback to the NUMA node 0.
|
||||
+
|
||||
+To launch a SGX numa guest:
|
||||
+
|
||||
+.. parsed-literal::
|
||||
+
|
||||
+ |qemu_system_x86| \\
|
||||
+ -cpu host,+sgx-provisionkey \\
|
||||
+ -object memory-backend-ram,size=2G,host-nodes=0,policy=bind,id=node0 \\
|
||||
+ -object memory-backend-epc,id=mem0,size=64M,prealloc=on,host-nodes=0,policy=bind \\
|
||||
+ -numa node,nodeid=0,cpus=0-1,memdev=node0 \\
|
||||
+ -object memory-backend-ram,size=2G,host-nodes=1,policy=bind,id=node1 \\
|
||||
+ -object memory-backend-epc,id=mem1,size=28M,prealloc=on,host-nodes=1,policy=bind \\
|
||||
+ -numa node,nodeid=1,cpus=2-3,memdev=node1 \\
|
||||
+ -M sgx-epc.0.memdev=mem0,sgx-epc.0.node=0,sgx-epc.1.memdev=mem1,sgx-epc.1.node=1
|
||||
+
|
||||
+and SGX epc numa info by::
|
||||
+
|
||||
+ $ dmesg | grep sgx
|
||||
+ [ 0.369937] sgx: EPC section 0x180000000-0x183ffffff
|
||||
+ [ 0.370259] sgx: EPC section 0x184000000-0x185bfffff
|
||||
+
|
||||
+ $ dmesg | grep SRAT
|
||||
+ [ 0.009981] ACPI: SRAT: Node 0 PXM 0 [mem 0x180000000-0x183ffffff]
|
||||
+ [ 0.009982] ACPI: SRAT: Node 1 PXM 1 [mem 0x184000000-0x185bfffff]
|
||||
|
||||
References
|
||||
----------
|
||||
--
|
||||
2.27.0
|
||||
|
@ -0,0 +1,179 @@
|
||||
From 8a12049e97149056f61f7748d9869606d282d16e Mon Sep 17 00:00:00 2001
|
||||
From: Gavin Shan <gshan@redhat.com>
|
||||
Date: Wed, 11 May 2022 18:01:35 +0800
|
||||
Subject: [PATCH 06/16] hw/acpi/aml-build: Use existing CPU topology to build
|
||||
PPTT table
|
||||
|
||||
RH-Author: Gavin Shan <gshan@redhat.com>
|
||||
RH-MergeRequest: 86: hw/arm/virt: Fix the default CPU topology
|
||||
RH-Commit: [6/6] 53fa376531c204cf706cc1a7a0499019756106cb (gwshan/qemu-rhel-9)
|
||||
RH-Bugzilla: 2041823
|
||||
RH-Acked-by: Eric Auger <eric.auger@redhat.com>
|
||||
RH-Acked-by: Cornelia Huck <cohuck@redhat.com>
|
||||
RH-Acked-by: Andrew Jones <drjones@redhat.com>
|
||||
|
||||
Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=2041823
|
||||
|
||||
When the PPTT table is built, the CPU topology is re-calculated, but
|
||||
it's unecessary because the CPU topology has been populated in
|
||||
virt_possible_cpu_arch_ids() on arm/virt machine.
|
||||
|
||||
This reworks build_pptt() to avoid by reusing the existing IDs in
|
||||
ms->possible_cpus. Currently, the only user of build_pptt() is
|
||||
arm/virt machine.
|
||||
|
||||
Signed-off-by: Gavin Shan <gshan@redhat.com>
|
||||
Tested-by: Yanan Wang <wangyanan55@huawei.com>
|
||||
Reviewed-by: Yanan Wang <wangyanan55@huawei.com>
|
||||
Acked-by: Igor Mammedov <imammedo@redhat.com>
|
||||
Acked-by: Michael S. Tsirkin <mst@redhat.com>
|
||||
Message-id: 20220503140304.855514-7-gshan@redhat.com
|
||||
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
|
||||
(cherry picked from commit ae9141d4a3265553503bf07d3574b40f84615a34)
|
||||
Signed-off-by: Gavin Shan <gshan@redhat.com>
|
||||
---
|
||||
hw/acpi/aml-build.c | 111 +++++++++++++++++++-------------------------
|
||||
1 file changed, 48 insertions(+), 63 deletions(-)
|
||||
|
||||
diff --git a/hw/acpi/aml-build.c b/hw/acpi/aml-build.c
|
||||
index 4086879ebf..e6bfac95c7 100644
|
||||
--- a/hw/acpi/aml-build.c
|
||||
+++ b/hw/acpi/aml-build.c
|
||||
@@ -2002,86 +2002,71 @@ void build_pptt(GArray *table_data, BIOSLinker *linker, MachineState *ms,
|
||||
const char *oem_id, const char *oem_table_id)
|
||||
{
|
||||
MachineClass *mc = MACHINE_GET_CLASS(ms);
|
||||
- GQueue *list = g_queue_new();
|
||||
- guint pptt_start = table_data->len;
|
||||
- guint parent_offset;
|
||||
- guint length, i;
|
||||
- int uid = 0;
|
||||
- int socket;
|
||||
+ CPUArchIdList *cpus = ms->possible_cpus;
|
||||
+ int64_t socket_id = -1, cluster_id = -1, core_id = -1;
|
||||
+ uint32_t socket_offset = 0, cluster_offset = 0, core_offset = 0;
|
||||
+ uint32_t pptt_start = table_data->len;
|
||||
+ int n;
|
||||
AcpiTable table = { .sig = "PPTT", .rev = 2,
|
||||
.oem_id = oem_id, .oem_table_id = oem_table_id };
|
||||
|
||||
acpi_table_begin(&table, table_data);
|
||||
|
||||
- for (socket = 0; socket < ms->smp.sockets; socket++) {
|
||||
- g_queue_push_tail(list,
|
||||
- GUINT_TO_POINTER(table_data->len - pptt_start));
|
||||
- build_processor_hierarchy_node(
|
||||
- table_data,
|
||||
- /*
|
||||
- * Physical package - represents the boundary
|
||||
- * of a physical package
|
||||
- */
|
||||
- (1 << 0),
|
||||
- 0, socket, NULL, 0);
|
||||
- }
|
||||
-
|
||||
- if (mc->smp_props.clusters_supported) {
|
||||
- length = g_queue_get_length(list);
|
||||
- for (i = 0; i < length; i++) {
|
||||
- int cluster;
|
||||
-
|
||||
- parent_offset = GPOINTER_TO_UINT(g_queue_pop_head(list));
|
||||
- for (cluster = 0; cluster < ms->smp.clusters; cluster++) {
|
||||
- g_queue_push_tail(list,
|
||||
- GUINT_TO_POINTER(table_data->len - pptt_start));
|
||||
- build_processor_hierarchy_node(
|
||||
- table_data,
|
||||
- (0 << 0), /* not a physical package */
|
||||
- parent_offset, cluster, NULL, 0);
|
||||
- }
|
||||
+ /*
|
||||
+ * This works with the assumption that cpus[n].props.*_id has been
|
||||
+ * sorted from top to down levels in mc->possible_cpu_arch_ids().
|
||||
+ * Otherwise, the unexpected and duplicated containers will be
|
||||
+ * created.
|
||||
+ */
|
||||
+ for (n = 0; n < cpus->len; n++) {
|
||||
+ if (cpus->cpus[n].props.socket_id != socket_id) {
|
||||
+ assert(cpus->cpus[n].props.socket_id > socket_id);
|
||||
+ socket_id = cpus->cpus[n].props.socket_id;
|
||||
+ cluster_id = -1;
|
||||
+ core_id = -1;
|
||||
+ socket_offset = table_data->len - pptt_start;
|
||||
+ build_processor_hierarchy_node(table_data,
|
||||
+ (1 << 0), /* Physical package */
|
||||
+ 0, socket_id, NULL, 0);
|
||||
}
|
||||
- }
|
||||
|
||||
- length = g_queue_get_length(list);
|
||||
- for (i = 0; i < length; i++) {
|
||||
- int core;
|
||||
-
|
||||
- parent_offset = GPOINTER_TO_UINT(g_queue_pop_head(list));
|
||||
- for (core = 0; core < ms->smp.cores; core++) {
|
||||
- if (ms->smp.threads > 1) {
|
||||
- g_queue_push_tail(list,
|
||||
- GUINT_TO_POINTER(table_data->len - pptt_start));
|
||||
- build_processor_hierarchy_node(
|
||||
- table_data,
|
||||
- (0 << 0), /* not a physical package */
|
||||
- parent_offset, core, NULL, 0);
|
||||
- } else {
|
||||
- build_processor_hierarchy_node(
|
||||
- table_data,
|
||||
- (1 << 1) | /* ACPI Processor ID valid */
|
||||
- (1 << 3), /* Node is a Leaf */
|
||||
- parent_offset, uid++, NULL, 0);
|
||||
+ if (mc->smp_props.clusters_supported) {
|
||||
+ if (cpus->cpus[n].props.cluster_id != cluster_id) {
|
||||
+ assert(cpus->cpus[n].props.cluster_id > cluster_id);
|
||||
+ cluster_id = cpus->cpus[n].props.cluster_id;
|
||||
+ core_id = -1;
|
||||
+ cluster_offset = table_data->len - pptt_start;
|
||||
+ build_processor_hierarchy_node(table_data,
|
||||
+ (0 << 0), /* Not a physical package */
|
||||
+ socket_offset, cluster_id, NULL, 0);
|
||||
}
|
||||
+ } else {
|
||||
+ cluster_offset = socket_offset;
|
||||
}
|
||||
- }
|
||||
|
||||
- length = g_queue_get_length(list);
|
||||
- for (i = 0; i < length; i++) {
|
||||
- int thread;
|
||||
+ if (ms->smp.threads == 1) {
|
||||
+ build_processor_hierarchy_node(table_data,
|
||||
+ (1 << 1) | /* ACPI Processor ID valid */
|
||||
+ (1 << 3), /* Node is a Leaf */
|
||||
+ cluster_offset, n, NULL, 0);
|
||||
+ } else {
|
||||
+ if (cpus->cpus[n].props.core_id != core_id) {
|
||||
+ assert(cpus->cpus[n].props.core_id > core_id);
|
||||
+ core_id = cpus->cpus[n].props.core_id;
|
||||
+ core_offset = table_data->len - pptt_start;
|
||||
+ build_processor_hierarchy_node(table_data,
|
||||
+ (0 << 0), /* Not a physical package */
|
||||
+ cluster_offset, core_id, NULL, 0);
|
||||
+ }
|
||||
|
||||
- parent_offset = GPOINTER_TO_UINT(g_queue_pop_head(list));
|
||||
- for (thread = 0; thread < ms->smp.threads; thread++) {
|
||||
- build_processor_hierarchy_node(
|
||||
- table_data,
|
||||
+ build_processor_hierarchy_node(table_data,
|
||||
(1 << 1) | /* ACPI Processor ID valid */
|
||||
(1 << 2) | /* Processor is a Thread */
|
||||
(1 << 3), /* Node is a Leaf */
|
||||
- parent_offset, uid++, NULL, 0);
|
||||
+ core_offset, n, NULL, 0);
|
||||
}
|
||||
}
|
||||
|
||||
- g_queue_free(list);
|
||||
acpi_table_end(linker, &table);
|
||||
}
|
||||
|
||||
--
|
||||
2.31.1
|
||||
|
@ -1,61 +0,0 @@
|
||||
From c08c3fbb2bb8494738fd34ec8fc9dc434ce82f4b Mon Sep 17 00:00:00 2001
|
||||
From: Eric Auger <eric.auger@redhat.com>
|
||||
Date: Wed, 2 Feb 2022 12:16:02 +0100
|
||||
Subject: [PATCH 12/12] hw/arm/smmuv3: Fix device reset
|
||||
|
||||
RH-Author: Eric Auger <eric.auger@redhat.com>
|
||||
RH-MergeRequest: 72: hw/arm/smmuv3: Fix device reset
|
||||
RH-Commit: [1/1] 2cfee2f7a03692681224fed96bb4f28406bf460a (eauger1/centos-qemu-kvm)
|
||||
RH-Bugzilla: 2042481
|
||||
RH-Acked-by: Miroslav Rezanina <mrezanin@redhat.com>
|
||||
RH-Acked-by: Peter Xu <peterx@redhat.com>
|
||||
RH-Acked-by: Andrew Jones <drjones@redhat.com>
|
||||
|
||||
branch: c9s
|
||||
Brew: 42958737
|
||||
Upstream: yes
|
||||
|
||||
We currently miss a bunch of register resets in the device reset
|
||||
function. This sometimes prevents the guest from rebooting after
|
||||
a system_reset (with virtio-blk-pci). For instance, we may get
|
||||
the following errors:
|
||||
|
||||
invalid STE
|
||||
smmuv3-iommu-memory-region-0-0 translation failed for iova=0x13a9d2000(SMMU_EVT_C_BAD_STE)
|
||||
Invalid read at addr 0x13A9D2000, size 2, region '(null)', reason: rejected
|
||||
invalid STE
|
||||
smmuv3-iommu-memory-region-0-0 translation failed for iova=0x13a9d2000(SMMU_EVT_C_BAD_STE)
|
||||
Invalid write at addr 0x13A9D2000, size 2, region '(null)', reason: rejected
|
||||
invalid STE
|
||||
|
||||
Signed-off-by: Eric Auger <eric.auger@redhat.com>
|
||||
Message-id: 20220202111602.627429-1-eric.auger@redhat.com
|
||||
Fixes: 10a83cb988 ("hw/arm/smmuv3: Skeleton")
|
||||
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
|
||||
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
|
||||
(cherry picked from commit 43530095e18fd16dcd51a4b385ad2a22c36f5698)
|
||||
Signed-off-by: Eric Auger <eric.auger@redhat.com>
|
||||
---
|
||||
hw/arm/smmuv3.c | 6 ++++++
|
||||
1 file changed, 6 insertions(+)
|
||||
|
||||
diff --git a/hw/arm/smmuv3.c b/hw/arm/smmuv3.c
|
||||
index 01b60bee49..1b5640bb98 100644
|
||||
--- a/hw/arm/smmuv3.c
|
||||
+++ b/hw/arm/smmuv3.c
|
||||
@@ -276,6 +276,12 @@ static void smmuv3_init_regs(SMMUv3State *s)
|
||||
s->features = 0;
|
||||
s->sid_split = 0;
|
||||
s->aidr = 0x1;
|
||||
+ s->cr[0] = 0;
|
||||
+ s->cr0ack = 0;
|
||||
+ s->irq_ctrl = 0;
|
||||
+ s->gerror = 0;
|
||||
+ s->gerrorn = 0;
|
||||
+ s->statusr = 0;
|
||||
}
|
||||
|
||||
static int smmu_get_ste(SMMUv3State *s, dma_addr_t addr, STE *buf,
|
||||
--
|
||||
2.27.0
|
||||
|
@ -1,48 +0,0 @@
|
||||
From 6b0e129f0758ccd076d1ecbf85c8f1e863788981 Mon Sep 17 00:00:00 2001
|
||||
From: Eric Auger <eric.auger@redhat.com>
|
||||
Date: Mon, 20 Dec 2021 10:11:47 +0100
|
||||
Subject: [PATCH 5/6] hw/arm/virt: Add 9.0 machine type and remove 8.5 one
|
||||
|
||||
RH-Author: Eric Auger <eric.auger@redhat.com>
|
||||
RH-MergeRequest: 57: hw/arm/virt: Add 9.0 machine type and remove 8.5 one
|
||||
RH-Commit: [5/6] f573a2fb44882a010e2c6bf5f561f29d54e6e9b5 (eauger1/centos-qemu-kvm)
|
||||
RH-Bugzilla: 2031044
|
||||
RH-Acked-by: Gavin Shan <gshan@redhat.com>
|
||||
RH-Acked-by: Andrew Jones <drjones@redhat.com>
|
||||
RH-Acked-by: Miroslav Rezanina <mrezanin@redhat.com>
|
||||
|
||||
branch: c9s
|
||||
Brew: 42213566
|
||||
Upstream: no
|
||||
|
||||
Add 9.0 machine type and remove 8.5 one.
|
||||
|
||||
Signed-off-by: Eric Auger <eric.auger@redhat.com>
|
||||
---
|
||||
hw/arm/virt.c | 10 ++--------
|
||||
1 file changed, 2 insertions(+), 8 deletions(-)
|
||||
|
||||
diff --git a/hw/arm/virt.c b/hw/arm/virt.c
|
||||
index d433139479..d537706a86 100644
|
||||
--- a/hw/arm/virt.c
|
||||
+++ b/hw/arm/virt.c
|
||||
@@ -3236,14 +3236,8 @@ static void rhel_machine_init(void)
|
||||
}
|
||||
type_init(rhel_machine_init);
|
||||
|
||||
-static void rhel850_virt_options(MachineClass *mc)
|
||||
+static void rhel900_virt_options(MachineClass *mc)
|
||||
{
|
||||
- VirtMachineClass *vmc = VIRT_MACHINE_CLASS(OBJECT_CLASS(mc));
|
||||
-
|
||||
compat_props_add(mc->compat_props, arm_rhel_compat, arm_rhel_compat_len);
|
||||
- compat_props_add(mc->compat_props, hw_compat_rhel_8_5, hw_compat_rhel_8_5_len);
|
||||
- mc->smp_props.prefer_sockets = true;
|
||||
- vmc->no_cpu_topology = true;
|
||||
- vmc->no_tcg_its = true;
|
||||
}
|
||||
-DEFINE_RHEL_MACHINE_AS_LATEST(8, 5, 0)
|
||||
+DEFINE_RHEL_MACHINE_AS_LATEST(9, 0, 0)
|
||||
--
|
||||
2.27.0
|
||||
|
@ -1,88 +0,0 @@
|
||||
From 4098f7b5aea8871a655bab43d5114d067662e6c5 Mon Sep 17 00:00:00 2001
|
||||
From: Eric Auger <eric.auger@redhat.com>
|
||||
Date: Wed, 5 Jan 2022 16:17:10 +0100
|
||||
Subject: [PATCH 6/6] hw/arm/virt: Check no_tcg_its and minor style changes
|
||||
|
||||
RH-Author: Eric Auger <eric.auger@redhat.com>
|
||||
RH-MergeRequest: 57: hw/arm/virt: Add 9.0 machine type and remove 8.5 one
|
||||
RH-Commit: [6/6] 4480d569463fd3f637404539d3bd06b59cafbc88 (eauger1/centos-qemu-kvm)
|
||||
RH-Bugzilla: 2031044
|
||||
RH-Acked-by: Gavin Shan <gshan@redhat.com>
|
||||
RH-Acked-by: Andrew Jones <drjones@redhat.com>
|
||||
RH-Acked-by: Miroslav Rezanina <mrezanin@redhat.com>
|
||||
|
||||
branch: c9s
|
||||
Brew: 42213566
|
||||
Upstream: no
|
||||
|
||||
Truly allow TCG ITS instantiation according to the no_tcg_its
|
||||
class flag. Otherwise it is always set to false.
|
||||
|
||||
We also take benefit of this patch to do some minor non
|
||||
functional style changes to be closer to the upstream code.
|
||||
|
||||
Signed-off-by: Eric Auger <eric.auger@redhat.com>
|
||||
---
|
||||
hw/arm/virt.c | 16 ++++++++++++----
|
||||
1 file changed, 12 insertions(+), 4 deletions(-)
|
||||
|
||||
diff --git a/hw/arm/virt.c b/hw/arm/virt.c
|
||||
index d537706a86..0e691cbe81 100644
|
||||
--- a/hw/arm/virt.c
|
||||
+++ b/hw/arm/virt.c
|
||||
@@ -3163,6 +3163,7 @@ static void rhel_machine_class_init(ObjectClass *oc, void *data)
|
||||
"in ACPI table header."
|
||||
"The string may be up to 6 bytes in size");
|
||||
|
||||
+
|
||||
object_class_property_add_str(oc, "x-oem-table-id",
|
||||
virt_get_oem_table_id,
|
||||
virt_set_oem_table_id);
|
||||
@@ -3170,6 +3171,7 @@ static void rhel_machine_class_init(ObjectClass *oc, void *data)
|
||||
"Override the default value of field OEM Table ID "
|
||||
"in ACPI table header."
|
||||
"The string may be up to 8 bytes in size");
|
||||
+
|
||||
}
|
||||
|
||||
static void rhel_virt_instance_init(Object *obj)
|
||||
@@ -3194,26 +3196,32 @@ static void rhel_virt_instance_init(Object *obj)
|
||||
} else {
|
||||
/* Default allows ITS instantiation */
|
||||
vms->its = true;
|
||||
+
|
||||
+ if (vmc->no_tcg_its) {
|
||||
+ vms->tcg_its = false;
|
||||
+ } else {
|
||||
+ vms->tcg_its = true;
|
||||
+ }
|
||||
}
|
||||
|
||||
/* Default disallows iommu instantiation */
|
||||
vms->iommu = VIRT_IOMMU_NONE;
|
||||
|
||||
+ /* The default root bus is attached to iommu by default */
|
||||
+ vms->default_bus_bypass_iommu = false;
|
||||
+
|
||||
/* Default disallows RAS instantiation and is non-configurable for RHEL */
|
||||
vms->ras = false;
|
||||
|
||||
/* MTE is disabled by default and non-configurable for RHEL */
|
||||
vms->mte = false;
|
||||
|
||||
- /* The default root bus is attached to iommu by default */
|
||||
- vms->default_bus_bypass_iommu = false;
|
||||
-
|
||||
vms->irqmap = a15irqmap;
|
||||
|
||||
virt_flash_create(vms);
|
||||
+
|
||||
vms->oem_id = g_strndup(ACPI_BUILD_APPNAME6, 6);
|
||||
vms->oem_table_id = g_strndup(ACPI_BUILD_APPNAME8, 8);
|
||||
-
|
||||
}
|
||||
|
||||
static const TypeInfo rhel_machine_info = {
|
||||
--
|
||||
2.27.0
|
||||
|
@ -0,0 +1,74 @@
|
||||
From 3b05d3464945295112b5d02d142422f524a52054 Mon Sep 17 00:00:00 2001
|
||||
From: Gavin Shan <gshan@redhat.com>
|
||||
Date: Wed, 11 May 2022 18:01:35 +0800
|
||||
Subject: [PATCH 03/16] hw/arm/virt: Consider SMP configuration in CPU topology
|
||||
|
||||
RH-Author: Gavin Shan <gshan@redhat.com>
|
||||
RH-MergeRequest: 86: hw/arm/virt: Fix the default CPU topology
|
||||
RH-Commit: [3/6] 7125b41f038c2b1cb33377d0ef1222f1ea42b648 (gwshan/qemu-rhel-9)
|
||||
RH-Bugzilla: 2041823
|
||||
RH-Acked-by: Eric Auger <eric.auger@redhat.com>
|
||||
RH-Acked-by: Cornelia Huck <cohuck@redhat.com>
|
||||
RH-Acked-by: Andrew Jones <drjones@redhat.com>
|
||||
|
||||
Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=2041823
|
||||
|
||||
Currently, the SMP configuration isn't considered when the CPU
|
||||
topology is populated. In this case, it's impossible to provide
|
||||
the default CPU-to-NUMA mapping or association based on the socket
|
||||
ID of the given CPU.
|
||||
|
||||
This takes account of SMP configuration when the CPU topology
|
||||
is populated. The die ID for the given CPU isn't assigned since
|
||||
it's not supported on arm/virt machine. Besides, the used SMP
|
||||
configuration in qtest/numa-test/aarch64_numa_cpu() is corrcted
|
||||
to avoid testing failure
|
||||
|
||||
Signed-off-by: Gavin Shan <gshan@redhat.com>
|
||||
Reviewed-by: Yanan Wang <wangyanan55@huawei.com>
|
||||
Acked-by: Igor Mammedov <imammedo@redhat.com>
|
||||
Message-id: 20220503140304.855514-4-gshan@redhat.com
|
||||
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
|
||||
(cherry picked from commit c9ec4cb5e4936f980889e717524e73896b0200ed)
|
||||
Signed-off-by: Gavin Shan <gshan@redhat.com>
|
||||
---
|
||||
hw/arm/virt.c | 15 ++++++++++++++-
|
||||
1 file changed, 14 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/hw/arm/virt.c b/hw/arm/virt.c
|
||||
index 8be12e121d..a87c8d396a 100644
|
||||
--- a/hw/arm/virt.c
|
||||
+++ b/hw/arm/virt.c
|
||||
@@ -2553,6 +2553,7 @@ static const CPUArchIdList *virt_possible_cpu_arch_ids(MachineState *ms)
|
||||
int n;
|
||||
unsigned int max_cpus = ms->smp.max_cpus;
|
||||
VirtMachineState *vms = VIRT_MACHINE(ms);
|
||||
+ MachineClass *mc = MACHINE_GET_CLASS(vms);
|
||||
|
||||
if (ms->possible_cpus) {
|
||||
assert(ms->possible_cpus->len == max_cpus);
|
||||
@@ -2566,8 +2567,20 @@ static const CPUArchIdList *virt_possible_cpu_arch_ids(MachineState *ms)
|
||||
ms->possible_cpus->cpus[n].type = ms->cpu_type;
|
||||
ms->possible_cpus->cpus[n].arch_id =
|
||||
virt_cpu_mp_affinity(vms, n);
|
||||
+
|
||||
+ assert(!mc->smp_props.dies_supported);
|
||||
+ ms->possible_cpus->cpus[n].props.has_socket_id = true;
|
||||
+ ms->possible_cpus->cpus[n].props.socket_id =
|
||||
+ n / (ms->smp.clusters * ms->smp.cores * ms->smp.threads);
|
||||
+ ms->possible_cpus->cpus[n].props.has_cluster_id = true;
|
||||
+ ms->possible_cpus->cpus[n].props.cluster_id =
|
||||
+ (n / (ms->smp.cores * ms->smp.threads)) % ms->smp.clusters;
|
||||
+ ms->possible_cpus->cpus[n].props.has_core_id = true;
|
||||
+ ms->possible_cpus->cpus[n].props.core_id =
|
||||
+ (n / ms->smp.threads) % ms->smp.cores;
|
||||
ms->possible_cpus->cpus[n].props.has_thread_id = true;
|
||||
- ms->possible_cpus->cpus[n].props.thread_id = n;
|
||||
+ ms->possible_cpus->cpus[n].props.thread_id =
|
||||
+ n % ms->smp.threads;
|
||||
}
|
||||
return ms->possible_cpus;
|
||||
}
|
||||
--
|
||||
2.31.1
|
||||
|
@ -1,60 +0,0 @@
|
||||
From 914d9f9eea5d0a944aa93682b03d3189ad37ec9b Mon Sep 17 00:00:00 2001
|
||||
From: Eric Auger <eric.auger@redhat.com>
|
||||
Date: Mon, 20 Dec 2021 15:34:22 +0100
|
||||
Subject: [PATCH 4/6] hw/arm/virt: Expose the 'RAS' option
|
||||
|
||||
RH-Author: Eric Auger <eric.auger@redhat.com>
|
||||
RH-MergeRequest: 57: hw/arm/virt: Add 9.0 machine type and remove 8.5 one
|
||||
RH-Commit: [4/6] c8704564d31b23a0f08a6ced946c9a81e2e72c11 (eauger1/centos-qemu-kvm)
|
||||
RH-Bugzilla: 2031044
|
||||
RH-Acked-by: Gavin Shan <gshan@redhat.com>
|
||||
RH-Acked-by: Andrew Jones <drjones@redhat.com>
|
||||
RH-Acked-by: Miroslav Rezanina <mrezanin@redhat.com>
|
||||
|
||||
branch: c9s
|
||||
Brew: 42213566
|
||||
Upstream: no
|
||||
|
||||
In RHEL9.0 we want to expose the 'RAS' option.
|
||||
|
||||
Signed-off-by: Eric Auger <eric.auger@redhat.com>
|
||||
---
|
||||
hw/arm/virt.c | 8 +++++++-
|
||||
1 file changed, 7 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/hw/arm/virt.c b/hw/arm/virt.c
|
||||
index c99ca93e75..d433139479 100644
|
||||
--- a/hw/arm/virt.c
|
||||
+++ b/hw/arm/virt.c
|
||||
@@ -2348,7 +2348,6 @@ static void virt_set_acpi(Object *obj, Visitor *v, const char *name,
|
||||
visit_type_OnOffAuto(v, name, &vms->acpi, errp);
|
||||
}
|
||||
|
||||
-#if 0 /* Disabled for Red Hat Enterprise Linux */
|
||||
static bool virt_get_ras(Object *obj, Error **errp)
|
||||
{
|
||||
VirtMachineState *vms = VIRT_MACHINE(obj);
|
||||
@@ -2363,6 +2362,7 @@ static void virt_set_ras(Object *obj, bool value, Error **errp)
|
||||
vms->ras = value;
|
||||
}
|
||||
|
||||
+#if 0 /* Disabled for Red Hat Enterprise Linux */
|
||||
static bool virt_get_mte(Object *obj, Error **errp)
|
||||
{
|
||||
VirtMachineState *vms = VIRT_MACHINE(obj);
|
||||
@@ -3143,6 +3143,12 @@ static void rhel_machine_class_init(ObjectClass *oc, void *data)
|
||||
"Set on/off to enable/disable "
|
||||
"bypass_iommu for default root bus");
|
||||
|
||||
+ object_class_property_add_bool(oc, "ras", virt_get_ras,
|
||||
+ virt_set_ras);
|
||||
+ object_class_property_set_description(oc, "ras",
|
||||
+ "Set on/off to enable/disable reporting host memory errors "
|
||||
+ "to a KVM guest using ACPI and guest external abort exceptions");
|
||||
+
|
||||
object_class_property_add_bool(oc, "its", virt_get_its,
|
||||
virt_set_its);
|
||||
object_class_property_set_description(oc, "its",
|
||||
--
|
||||
2.27.0
|
||||
|
88
SOURCES/kvm-hw-arm-virt-Fix-CPU-s-default-NUMA-node-ID.patch
Normal file
88
SOURCES/kvm-hw-arm-virt-Fix-CPU-s-default-NUMA-node-ID.patch
Normal file
@ -0,0 +1,88 @@
|
||||
From 14e49ad3b98f01c1ad6fe456469d40a96a43dc3c Mon Sep 17 00:00:00 2001
|
||||
From: Gavin Shan <gshan@redhat.com>
|
||||
Date: Wed, 11 May 2022 18:01:35 +0800
|
||||
Subject: [PATCH 05/16] hw/arm/virt: Fix CPU's default NUMA node ID
|
||||
|
||||
RH-Author: Gavin Shan <gshan@redhat.com>
|
||||
RH-MergeRequest: 86: hw/arm/virt: Fix the default CPU topology
|
||||
RH-Commit: [5/6] 5336f62bc0c53c0417db1d71ef89544907bc28c0 (gwshan/qemu-rhel-9)
|
||||
RH-Bugzilla: 2041823
|
||||
RH-Acked-by: Eric Auger <eric.auger@redhat.com>
|
||||
RH-Acked-by: Cornelia Huck <cohuck@redhat.com>
|
||||
RH-Acked-by: Andrew Jones <drjones@redhat.com>
|
||||
|
||||
Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=2041823
|
||||
|
||||
When CPU-to-NUMA association isn't explicitly provided by users,
|
||||
the default one is given by mc->get_default_cpu_node_id(). However,
|
||||
the CPU topology isn't fully considered in the default association
|
||||
and this causes CPU topology broken warnings on booting Linux guest.
|
||||
|
||||
For example, the following warning messages are observed when the
|
||||
Linux guest is booted with the following command lines.
|
||||
|
||||
/home/gavin/sandbox/qemu.main/build/qemu-system-aarch64 \
|
||||
-accel kvm -machine virt,gic-version=host \
|
||||
-cpu host \
|
||||
-smp 6,sockets=2,cores=3,threads=1 \
|
||||
-m 1024M,slots=16,maxmem=64G \
|
||||
-object memory-backend-ram,id=mem0,size=128M \
|
||||
-object memory-backend-ram,id=mem1,size=128M \
|
||||
-object memory-backend-ram,id=mem2,size=128M \
|
||||
-object memory-backend-ram,id=mem3,size=128M \
|
||||
-object memory-backend-ram,id=mem4,size=128M \
|
||||
-object memory-backend-ram,id=mem4,size=384M \
|
||||
-numa node,nodeid=0,memdev=mem0 \
|
||||
-numa node,nodeid=1,memdev=mem1 \
|
||||
-numa node,nodeid=2,memdev=mem2 \
|
||||
-numa node,nodeid=3,memdev=mem3 \
|
||||
-numa node,nodeid=4,memdev=mem4 \
|
||||
-numa node,nodeid=5,memdev=mem5
|
||||
:
|
||||
alternatives: patching kernel code
|
||||
BUG: arch topology borken
|
||||
the CLS domain not a subset of the MC domain
|
||||
<the above error log repeats>
|
||||
BUG: arch topology borken
|
||||
the DIE domain not a subset of the NODE domain
|
||||
|
||||
With current implementation of mc->get_default_cpu_node_id(),
|
||||
CPU#0 to CPU#5 are associated with NODE#0 to NODE#5 separately.
|
||||
That's incorrect because CPU#0/1/2 should be associated with same
|
||||
NUMA node because they're seated in same socket.
|
||||
|
||||
This fixes the issue by considering the socket ID when the default
|
||||
CPU-to-NUMA association is provided in virt_possible_cpu_arch_ids().
|
||||
With this applied, no more CPU topology broken warnings are seen
|
||||
from the Linux guest. The 6 CPUs are associated with NODE#0/1, but
|
||||
there are no CPUs associated with NODE#2/3/4/5.
|
||||
|
||||
Signed-off-by: Gavin Shan <gshan@redhat.com>
|
||||
Reviewed-by: Igor Mammedov <imammedo@redhat.com>
|
||||
Reviewed-by: Yanan Wang <wangyanan55@huawei.com>
|
||||
Message-id: 20220503140304.855514-6-gshan@redhat.com
|
||||
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
|
||||
(cherry picked from commit 4c18bc192386dfbca530e7f550e0992df657818a)
|
||||
Signed-off-by: Gavin Shan <gshan@redhat.com>
|
||||
---
|
||||
hw/arm/virt.c | 4 +++-
|
||||
1 file changed, 3 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/hw/arm/virt.c b/hw/arm/virt.c
|
||||
index a87c8d396a..95d012d6eb 100644
|
||||
--- a/hw/arm/virt.c
|
||||
+++ b/hw/arm/virt.c
|
||||
@@ -2545,7 +2545,9 @@ virt_cpu_index_to_props(MachineState *ms, unsigned cpu_index)
|
||||
|
||||
static int64_t virt_get_default_cpu_node_id(const MachineState *ms, int idx)
|
||||
{
|
||||
- return idx % ms->numa_state->num_nodes;
|
||||
+ int64_t socket_id = ms->possible_cpus->cpus[idx].props.socket_id;
|
||||
+
|
||||
+ return socket_id % ms->numa_state->num_nodes;
|
||||
}
|
||||
|
||||
static const CPUArchIdList *virt_possible_cpu_arch_ids(MachineState *ms)
|
||||
--
|
||||
2.31.1
|
||||
|
@ -0,0 +1,56 @@
|
||||
From e25c40735d2f022c07481b548d20476222006657 Mon Sep 17 00:00:00 2001
|
||||
From: Eric Auger <eric.auger@redhat.com>
|
||||
Date: Wed, 4 May 2022 11:11:54 +0200
|
||||
Subject: [PATCH 2/5] hw/arm/virt: Fix missing initialization in
|
||||
instance/class_init()
|
||||
|
||||
RH-Author: Eric Auger <eric.auger@redhat.com>
|
||||
RH-MergeRequest: 82: hw/arm/virt: Remove the dtb-kaslr-seed machine option
|
||||
RH-Commit: [2/2] 22cbbfc30cf57a09b8acfb25d8a4dff2754c630c (eauger1/centos-qemu-kvm)
|
||||
RH-Bugzilla: 2046029
|
||||
RH-Acked-by: Gavin Shan <gshan@redhat.com>
|
||||
RH-Acked-by: Andrew Jones <drjones@redhat.com>
|
||||
RH-Acked-by: Cornelia Huck <cohuck@redhat.com>
|
||||
|
||||
Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=2046029
|
||||
Brew: https://brewweb.engineering.redhat.com/brew/taskinfo?taskID=45133161
|
||||
Upstream Status: RHEL-only
|
||||
Tested: Boot RHEL guest and check migration from 8.6 to 9.1
|
||||
(with custom additions)
|
||||
|
||||
During the 7.0 rebase, the initialization of highmem_mmio and
|
||||
highmem_redists was forgotten in rhel_virt_instance_init().
|
||||
Fix it to match virt_instance_init() code.
|
||||
|
||||
Also mc->smp_props.clusters_supported was missing in
|
||||
rhel_machine_class_init().
|
||||
|
||||
Signed-off-by: Eric Auger <eric.auger@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 bde4f77994..8be12e121d 100644
|
||||
--- a/hw/arm/virt.c
|
||||
+++ b/hw/arm/virt.c
|
||||
@@ -3286,6 +3286,7 @@ static void rhel_machine_class_init(ObjectClass *oc, void *data)
|
||||
hc->unplug_request = virt_machine_device_unplug_request_cb;
|
||||
hc->unplug = virt_machine_device_unplug_cb;
|
||||
mc->nvdimm_supported = true;
|
||||
+ mc->smp_props.clusters_supported = true;
|
||||
mc->auto_enable_numa_with_memhp = true;
|
||||
mc->auto_enable_numa_with_memdev = true;
|
||||
mc->default_ram_id = "mach-virt.ram";
|
||||
@@ -3366,6 +3367,8 @@ static void rhel_virt_instance_init(Object *obj)
|
||||
vms->gic_version = VIRT_GIC_VERSION_NOSEL;
|
||||
|
||||
vms->highmem_ecam = !vmc->no_highmem_ecam;
|
||||
+ vms->highmem_mmio = true;
|
||||
+ vms->highmem_redists = true;
|
||||
|
||||
if (vmc->no_its) {
|
||||
vms->its = false;
|
||||
--
|
||||
2.31.1
|
||||
|
@ -1,81 +0,0 @@
|
||||
From 545076d67ef27203e08538123d8bc3798caf9505 Mon Sep 17 00:00:00 2001
|
||||
From: Eric Auger <eric.auger@redhat.com>
|
||||
Date: Mon, 20 Dec 2021 15:50:44 +0100
|
||||
Subject: [PATCH 1/6] hw/arm/virt: Register "iommu" as a class property
|
||||
|
||||
RH-Author: Eric Auger <eric.auger@redhat.com>
|
||||
RH-MergeRequest: 57: hw/arm/virt: Add 9.0 machine type and remove 8.5 one
|
||||
RH-Commit: [1/6] 2b6a22ebddd2da7505961ff4ffe90424f7489300 (eauger1/centos-qemu-kvm)
|
||||
RH-Bugzilla: 2031044
|
||||
RH-Acked-by: Gavin Shan <gshan@redhat.com>
|
||||
RH-Acked-by: Andrew Jones <drjones@redhat.com>
|
||||
RH-Acked-by: Miroslav Rezanina <mrezanin@redhat.com>
|
||||
|
||||
branch: c9s
|
||||
Brew: 42213566
|
||||
Upstream: no
|
||||
|
||||
Register the "iommu" option as a class property. This mirrors what
|
||||
was done in upstream commit b91def7b ("arm/virt: Register
|
||||
most properties as class properties").
|
||||
|
||||
While we are at it we also move the "x-oem-id" and "x-oem-table-id"
|
||||
registrations at the very end of the rhel_machine_class_init()
|
||||
function. This makes our life easier when comparing with upstream.
|
||||
|
||||
Signed-off-by: Eric Auger <eric.auger@redhat.com>
|
||||
---
|
||||
hw/arm/virt.c | 23 ++++++++++++-----------
|
||||
1 file changed, 12 insertions(+), 11 deletions(-)
|
||||
|
||||
diff --git a/hw/arm/virt.c b/hw/arm/virt.c
|
||||
index 6ba9a2c2e1..7e227b1fa4 100644
|
||||
--- a/hw/arm/virt.c
|
||||
+++ b/hw/arm/virt.c
|
||||
@@ -3131,6 +3131,18 @@ static void rhel_machine_class_init(ObjectClass *oc, void *data)
|
||||
"Set GIC version. "
|
||||
"Valid values are 2, 3, host and max");
|
||||
|
||||
+ object_class_property_add_str(oc, "iommu", virt_get_iommu, virt_set_iommu);
|
||||
+ object_class_property_set_description(oc, "iommu",
|
||||
+ "Set the IOMMU type. "
|
||||
+ "Valid values are none and smmuv3");
|
||||
+
|
||||
+ object_class_property_add_bool(oc, "default_bus_bypass_iommu",
|
||||
+ virt_get_default_bus_bypass_iommu,
|
||||
+ virt_set_default_bus_bypass_iommu);
|
||||
+ object_class_property_set_description(oc, "default_bus_bypass_iommu",
|
||||
+ "Set on/off to enable/disable "
|
||||
+ "bypass_iommu for default root bus");
|
||||
+
|
||||
object_class_property_add_str(oc, "x-oem-id",
|
||||
virt_get_oem_id,
|
||||
virt_set_oem_id);
|
||||
@@ -3146,13 +3158,6 @@ static void rhel_machine_class_init(ObjectClass *oc, void *data)
|
||||
"Override the default value of field OEM Table ID "
|
||||
"in ACPI table header."
|
||||
"The string may be up to 8 bytes in size");
|
||||
- object_class_property_add_bool(oc, "default_bus_bypass_iommu",
|
||||
- virt_get_default_bus_bypass_iommu,
|
||||
- virt_set_default_bus_bypass_iommu);
|
||||
- object_class_property_set_description(oc, "default_bus_bypass_iommu",
|
||||
- "Set on/off to enable/disable "
|
||||
- "bypass_iommu for default root bus");
|
||||
-
|
||||
}
|
||||
|
||||
static void rhel_virt_instance_init(Object *obj)
|
||||
@@ -3186,10 +3191,6 @@ static void rhel_virt_instance_init(Object *obj)
|
||||
|
||||
/* Default disallows iommu instantiation */
|
||||
vms->iommu = VIRT_IOMMU_NONE;
|
||||
- object_property_add_str(obj, "iommu", virt_get_iommu, virt_set_iommu);
|
||||
- object_property_set_description(obj, "iommu",
|
||||
- "Set the IOMMU type. "
|
||||
- "Valid values are none and smmuv3");
|
||||
|
||||
/* Default disallows RAS instantiation and is non-configurable for RHEL */
|
||||
vms->ras = false;
|
||||
--
|
||||
2.27.0
|
||||
|
@ -1,57 +0,0 @@
|
||||
From 789933e2598f9a525c2a638feca974ca1730a859 Mon Sep 17 00:00:00 2001
|
||||
From: Eric Auger <eric.auger@redhat.com>
|
||||
Date: Mon, 20 Dec 2021 16:04:59 +0100
|
||||
Subject: [PATCH 2/6] hw/arm/virt: Register "its" as a class property
|
||||
|
||||
RH-Author: Eric Auger <eric.auger@redhat.com>
|
||||
RH-MergeRequest: 57: hw/arm/virt: Add 9.0 machine type and remove 8.5 one
|
||||
RH-Commit: [2/6] dbd3e994553f00cd19842824f6bd763863a4e484 (eauger1/centos-qemu-kvm)
|
||||
RH-Bugzilla: 2031044
|
||||
RH-Acked-by: Gavin Shan <gshan@redhat.com>
|
||||
RH-Acked-by: Andrew Jones <drjones@redhat.com>
|
||||
RH-Acked-by: Miroslav Rezanina <mrezanin@redhat.com>
|
||||
|
||||
branch: c9s
|
||||
Brew: 42213566
|
||||
Upstream: no
|
||||
|
||||
Register "its" as a class property. This mirrors what was done
|
||||
in commit 27edeeaafe43 ("virt: Register "its" as class property").
|
||||
|
||||
Signed-off-by: Eric Auger <eric.auger@redhat.com>
|
||||
---
|
||||
hw/arm/virt.c | 11 ++++++-----
|
||||
1 file changed, 6 insertions(+), 5 deletions(-)
|
||||
|
||||
diff --git a/hw/arm/virt.c b/hw/arm/virt.c
|
||||
index 7e227b1fa4..984151b7dd 100644
|
||||
--- a/hw/arm/virt.c
|
||||
+++ b/hw/arm/virt.c
|
||||
@@ -3143,6 +3143,12 @@ static void rhel_machine_class_init(ObjectClass *oc, void *data)
|
||||
"Set on/off to enable/disable "
|
||||
"bypass_iommu for default root bus");
|
||||
|
||||
+ object_class_property_add_bool(oc, "its", virt_get_its,
|
||||
+ virt_set_its);
|
||||
+ object_class_property_set_description(oc, "its",
|
||||
+ "Set on/off to enable/disable "
|
||||
+ "ITS instantiation");
|
||||
+
|
||||
object_class_property_add_str(oc, "x-oem-id",
|
||||
virt_get_oem_id,
|
||||
virt_set_oem_id);
|
||||
@@ -3182,11 +3188,6 @@ static void rhel_virt_instance_init(Object *obj)
|
||||
} else {
|
||||
/* Default allows ITS instantiation */
|
||||
vms->its = true;
|
||||
- object_property_add_bool(obj, "its", virt_get_its,
|
||||
- virt_set_its);
|
||||
- object_property_set_description(obj, "its",
|
||||
- "Set on/off to enable/disable "
|
||||
- "ITS instantiation");
|
||||
}
|
||||
|
||||
/* Default disallows iommu instantiation */
|
||||
--
|
||||
2.27.0
|
||||
|
@ -0,0 +1,76 @@
|
||||
From 69f771c3dc641431f3e98497cbd3832edb69284f Mon Sep 17 00:00:00 2001
|
||||
From: Eric Auger <eric.auger@redhat.com>
|
||||
Date: Tue, 3 May 2022 08:56:52 +0200
|
||||
Subject: [PATCH 1/5] hw/arm/virt: Remove the dtb-kaslr-seed machine option
|
||||
|
||||
RH-Author: Eric Auger <eric.auger@redhat.com>
|
||||
RH-MergeRequest: 82: hw/arm/virt: Remove the dtb-kaslr-seed machine option
|
||||
RH-Commit: [1/2] a89dcd7f22e04ae39de99795d3f34cdd0b831bc0 (eauger1/centos-qemu-kvm)
|
||||
RH-Bugzilla: 2046029
|
||||
RH-Acked-by: Gavin Shan <gshan@redhat.com>
|
||||
RH-Acked-by: Andrew Jones <drjones@redhat.com>
|
||||
RH-Acked-by: Cornelia Huck <cohuck@redhat.com>
|
||||
|
||||
Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=2046029
|
||||
Brew: https://brewweb.engineering.redhat.com/brew/taskinfo?taskID=45133161
|
||||
Upstream Status: RHEL-only
|
||||
Tested: Boot RHEL guest and check the option is not available
|
||||
|
||||
In RHEL we do not want to expose the dtb-kaslr-seed virt machine
|
||||
option. Indeed the default 'on' value matches our need as
|
||||
random data in the DTB does not cause any boot failure and we
|
||||
want to support KASLR for the guest.
|
||||
|
||||
Signed-off-by: Eric Auger <eric.auger@redhat.com>
|
||||
|
||||
---
|
||||
---
|
||||
hw/arm/virt.c | 11 +++--------
|
||||
1 file changed, 3 insertions(+), 8 deletions(-)
|
||||
|
||||
diff --git a/hw/arm/virt.c b/hw/arm/virt.c
|
||||
index e06862d22a..bde4f77994 100644
|
||||
--- a/hw/arm/virt.c
|
||||
+++ b/hw/arm/virt.c
|
||||
@@ -2350,6 +2350,7 @@ static void virt_set_its(Object *obj, bool value, Error **errp)
|
||||
vms->its = value;
|
||||
}
|
||||
|
||||
+#if 0 /* Disabled for Red Hat Enterprise Linux */
|
||||
static bool virt_get_dtb_kaslr_seed(Object *obj, Error **errp)
|
||||
{
|
||||
VirtMachineState *vms = VIRT_MACHINE(obj);
|
||||
@@ -2363,6 +2364,7 @@ static void virt_set_dtb_kaslr_seed(Object *obj, bool value, Error **errp)
|
||||
|
||||
vms->dtb_kaslr_seed = value;
|
||||
}
|
||||
+#endif /* disabled for RHEL */
|
||||
|
||||
static char *virt_get_oem_id(Object *obj, Error **errp)
|
||||
{
|
||||
@@ -3346,13 +3348,6 @@ static void rhel_machine_class_init(ObjectClass *oc, void *data)
|
||||
"Override the default value of field OEM Table ID "
|
||||
"in ACPI table header."
|
||||
"The string may be up to 8 bytes in size");
|
||||
-
|
||||
- object_class_property_add_bool(oc, "dtb-kaslr-seed",
|
||||
- virt_get_dtb_kaslr_seed,
|
||||
- virt_set_dtb_kaslr_seed);
|
||||
- object_class_property_set_description(oc, "dtb-kaslr-seed",
|
||||
- "Set off to disable passing of kaslr-seed "
|
||||
- "dtb node to guest");
|
||||
}
|
||||
|
||||
static void rhel_virt_instance_init(Object *obj)
|
||||
@@ -3397,7 +3392,7 @@ static void rhel_virt_instance_init(Object *obj)
|
||||
/* MTE is disabled by default and non-configurable for RHEL */
|
||||
vms->mte = false;
|
||||
|
||||
- /* Supply a kaslr-seed by default */
|
||||
+ /* Supply a kaslr-seed by default and non-configurable for RHEL */
|
||||
vms->dtb_kaslr_seed = true;
|
||||
|
||||
vms->irqmap = a15irqmap;
|
||||
--
|
||||
2.31.1
|
||||
|
@ -1,46 +0,0 @@
|
||||
From 94987c271c3bdc37216c5baa4c5766b9b7f053a1 Mon Sep 17 00:00:00 2001
|
||||
From: Eric Auger <eric.auger@redhat.com>
|
||||
Date: Mon, 20 Dec 2021 15:58:38 +0100
|
||||
Subject: [PATCH 3/6] hw/arm/virt: Rename default_bus_bypass_iommu
|
||||
|
||||
RH-Author: Eric Auger <eric.auger@redhat.com>
|
||||
RH-MergeRequest: 57: hw/arm/virt: Add 9.0 machine type and remove 8.5 one
|
||||
RH-Commit: [3/6] 6b66844ae4629d8c879f7c6abbc5e5017a162e16 (eauger1/centos-qemu-kvm)
|
||||
RH-Bugzilla: 2031044
|
||||
RH-Acked-by: Gavin Shan <gshan@redhat.com>
|
||||
RH-Acked-by: Andrew Jones <drjones@redhat.com>
|
||||
RH-Acked-by: Miroslav Rezanina <mrezanin@redhat.com>
|
||||
|
||||
branch: c9s
|
||||
Brew: 42213566
|
||||
Upstream: no
|
||||
|
||||
Rename "default_bus_bypass_iommu" into "default-bus-bypass-iommu".
|
||||
This mirrors what was done in upstream commit:
|
||||
9dad363a223 ("hw/arm/virt: Rename default_bus_bypass_iommu")
|
||||
|
||||
Signed-off-by: Eric Auger <eric.auger@redhat.com>
|
||||
---
|
||||
hw/arm/virt.c | 4 ++--
|
||||
1 file changed, 2 insertions(+), 2 deletions(-)
|
||||
|
||||
diff --git a/hw/arm/virt.c b/hw/arm/virt.c
|
||||
index 984151b7dd..c99ca93e75 100644
|
||||
--- a/hw/arm/virt.c
|
||||
+++ b/hw/arm/virt.c
|
||||
@@ -3136,10 +3136,10 @@ static void rhel_machine_class_init(ObjectClass *oc, void *data)
|
||||
"Set the IOMMU type. "
|
||||
"Valid values are none and smmuv3");
|
||||
|
||||
- object_class_property_add_bool(oc, "default_bus_bypass_iommu",
|
||||
+ object_class_property_add_bool(oc, "default-bus-bypass-iommu",
|
||||
virt_get_default_bus_bypass_iommu,
|
||||
virt_set_default_bus_bypass_iommu);
|
||||
- object_class_property_set_description(oc, "default_bus_bypass_iommu",
|
||||
+ object_class_property_set_description(oc, "default-bus-bypass-iommu",
|
||||
"Set on/off to enable/disable "
|
||||
"bypass_iommu for default root bus");
|
||||
|
||||
--
|
||||
2.27.0
|
||||
|
@ -0,0 +1,96 @@
|
||||
From 6ee4a8718dcce2d6da43ee200534b75baf1d7bbe Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= <philmd@redhat.com>
|
||||
Date: Thu, 18 Nov 2021 12:57:32 +0100
|
||||
Subject: [PATCH 16/17] hw/block/fdc: Prevent end-of-track overrun
|
||||
(CVE-2021-3507)
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
RH-Author: Jon Maloy <jmaloy@redhat.com>
|
||||
RH-MergeRequest: 107: hw/block/fdc: Prevent end-of-track overrun (CVE-2021-3507)
|
||||
RH-Commit: [1/2] 9ffc5290348884d20b894fa79f4d0c8089247f8b (mrezanin/centos-src-qemu-kvm)
|
||||
RH-Bugzilla: 1951522
|
||||
RH-Acked-by: Hanna Reitz <hreitz@redhat.com>
|
||||
RH-Acked-by: Miroslav Rezanina <mrezanin@redhat.com>
|
||||
|
||||
Per the 82078 datasheet, if the end-of-track (EOT byte in
|
||||
the FIFO) is more than the number of sectors per side, the
|
||||
command is terminated unsuccessfully:
|
||||
|
||||
* 5.2.5 DATA TRANSFER TERMINATION
|
||||
|
||||
The 82078 supports terminal count explicitly through
|
||||
the TC pin and implicitly through the underrun/over-
|
||||
run and end-of-track (EOT) functions. For full sector
|
||||
transfers, the EOT parameter can define the last
|
||||
sector to be transferred in a single or multisector
|
||||
transfer. If the last sector to be transferred is a par-
|
||||
tial sector, the host can stop transferring the data in
|
||||
mid-sector, and the 82078 will continue to complete
|
||||
the sector as if a hardware TC was received. The
|
||||
only difference between these implicit functions and
|
||||
TC is that they return "abnormal termination" result
|
||||
status. Such status indications can be ignored if they
|
||||
were expected.
|
||||
|
||||
* 6.1.3 READ TRACK
|
||||
|
||||
This command terminates when the EOT specified
|
||||
number of sectors have been read. If the 82078
|
||||
does not find an I D Address Mark on the diskette
|
||||
after the second· occurrence of a pulse on the
|
||||
INDX# pin, then it sets the IC code in Status Regis-
|
||||
ter 0 to "01" (Abnormal termination), sets the MA bit
|
||||
in Status Register 1 to "1", and terminates the com-
|
||||
mand.
|
||||
|
||||
* 6.1.6 VERIFY
|
||||
|
||||
Refer to Table 6-6 and Table 6-7 for information
|
||||
concerning the values of MT and EC versus SC and
|
||||
EOT value.
|
||||
|
||||
* Table 6·6. Result Phase Table
|
||||
|
||||
* Table 6-7. Verify Command Result Phase Table
|
||||
|
||||
Fix by aborting the transfer when EOT > # Sectors Per Side.
|
||||
|
||||
Cc: qemu-stable@nongnu.org
|
||||
Cc: Hervé Poussineau <hpoussin@reactos.org>
|
||||
Fixes: baca51faff0 ("floppy driver: disk geometry auto detect")
|
||||
Reported-by: Alexander Bulekov <alxndr@bu.edu>
|
||||
Resolves: https://gitlab.com/qemu-project/qemu/-/issues/339
|
||||
Signed-off-by: Philippe Mathieu-Daudé <philmd@redhat.com>
|
||||
Message-Id: <20211118115733.4038610-2-philmd@redhat.com>
|
||||
Reviewed-by: Hanna Reitz <hreitz@redhat.com>
|
||||
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
|
||||
(cherry picked from commit defac5e2fbddf8423a354ff0454283a2115e1367)
|
||||
Signed-off-by: Jon Maloy <jmaloy@redhat.com>
|
||||
---
|
||||
hw/block/fdc.c | 8 ++++++++
|
||||
1 file changed, 8 insertions(+)
|
||||
|
||||
diff --git a/hw/block/fdc.c b/hw/block/fdc.c
|
||||
index ca1776121f..6481ec0cfb 100644
|
||||
--- a/hw/block/fdc.c
|
||||
+++ b/hw/block/fdc.c
|
||||
@@ -1532,6 +1532,14 @@ static void fdctrl_start_transfer(FDCtrl *fdctrl, int direction)
|
||||
int tmp;
|
||||
fdctrl->data_len = 128 << (fdctrl->fifo[5] > 7 ? 7 : fdctrl->fifo[5]);
|
||||
tmp = (fdctrl->fifo[6] - ks + 1);
|
||||
+ if (tmp < 0) {
|
||||
+ FLOPPY_DPRINTF("invalid EOT: %d\n", tmp);
|
||||
+ fdctrl_stop_transfer(fdctrl, FD_SR0_ABNTERM, FD_SR1_MA, 0x00);
|
||||
+ fdctrl->fifo[3] = kt;
|
||||
+ fdctrl->fifo[4] = kh;
|
||||
+ fdctrl->fifo[5] = ks;
|
||||
+ return;
|
||||
+ }
|
||||
if (fdctrl->fifo[0] & 0x80)
|
||||
tmp += fdctrl->fifo[6];
|
||||
fdctrl->data_len *= tmp;
|
||||
--
|
||||
2.31.1
|
||||
|
95
SOURCES/kvm-hw-virtio-Replace-g_memdup-by-g_memdup2.patch
Normal file
95
SOURCES/kvm-hw-virtio-Replace-g_memdup-by-g_memdup2.patch
Normal file
@ -0,0 +1,95 @@
|
||||
From 4dad0e9abbc843fba4e5fee6e7aa1b0db13f5898 Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Eugenio=20P=C3=A9rez?= <eperezma@redhat.com>
|
||||
Date: Thu, 21 Jul 2022 15:27:35 +0200
|
||||
Subject: [PATCH 03/32] hw/virtio: Replace g_memdup() by g_memdup2()
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
RH-Author: Eugenio Pérez <eperezma@redhat.com>
|
||||
RH-MergeRequest: 108: Net Control Virtqueue shadow Support
|
||||
RH-Commit: [3/27] ae196903eb1a7aebbf999100e997cf82e5024cb6 (eperezmartin/qemu-kvm)
|
||||
RH-Bugzilla: 1939363
|
||||
RH-Acked-by: Stefano Garzarella <sgarzare@redhat.com>
|
||||
RH-Acked-by: Cindy Lu <lulu@redhat.com>
|
||||
RH-Acked-by: Laurent Vivier <lvivier@redhat.com>
|
||||
|
||||
Bugzilla: https://bugzilla.redhat.com/1939363
|
||||
|
||||
Upstream Status: git://git.qemu.org/qemu.git
|
||||
|
||||
commit d792199de55ca5cb5334016884039c740290b5c7
|
||||
Author: Philippe Mathieu-Daudé <f4bug@amsat.org>
|
||||
Date: Thu May 12 19:57:46 2022 +0200
|
||||
|
||||
hw/virtio: Replace g_memdup() by g_memdup2()
|
||||
|
||||
Per https://discourse.gnome.org/t/port-your-module-from-g-memdup-to-g-memdup2-now/5538
|
||||
|
||||
The old API took the size of the memory to duplicate as a guint,
|
||||
whereas most memory functions take memory sizes as a gsize. This
|
||||
made it easy to accidentally pass a gsize to g_memdup(). For large
|
||||
values, that would lead to a silent truncation of the size from 64
|
||||
to 32 bits, and result in a heap area being returned which is
|
||||
significantly smaller than what the caller expects. This can likely
|
||||
be exploited in various modules to cause a heap buffer overflow.
|
||||
|
||||
Replace g_memdup() by the safer g_memdup2() wrapper.
|
||||
|
||||
Acked-by: Jason Wang <jasowang@redhat.com>
|
||||
Acked-by: Eugenio Pérez <eperezma@redhat.com>
|
||||
Signed-off-by: Philippe Mathieu-Daudé <philmd@redhat.com>
|
||||
Message-Id: <20220512175747.142058-6-eperezma@redhat.com>
|
||||
Reviewed-by: Michael S. Tsirkin <mst@redhat.com>
|
||||
Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
|
||||
|
||||
Signed-off-by: Eugenio Pérez <eperezma@redhat.com>
|
||||
---
|
||||
hw/net/virtio-net.c | 3 ++-
|
||||
hw/virtio/virtio-crypto.c | 6 +++---
|
||||
2 files changed, 5 insertions(+), 4 deletions(-)
|
||||
|
||||
diff --git a/hw/net/virtio-net.c b/hw/net/virtio-net.c
|
||||
index 099e65036d..633de61513 100644
|
||||
--- a/hw/net/virtio-net.c
|
||||
+++ b/hw/net/virtio-net.c
|
||||
@@ -1458,7 +1458,8 @@ static void virtio_net_handle_ctrl(VirtIODevice *vdev, VirtQueue *vq)
|
||||
}
|
||||
|
||||
iov_cnt = elem->out_num;
|
||||
- iov2 = iov = g_memdup(elem->out_sg, sizeof(struct iovec) * elem->out_num);
|
||||
+ iov2 = iov = g_memdup2(elem->out_sg,
|
||||
+ sizeof(struct iovec) * elem->out_num);
|
||||
s = iov_to_buf(iov, iov_cnt, 0, &ctrl, sizeof(ctrl));
|
||||
iov_discard_front(&iov, &iov_cnt, sizeof(ctrl));
|
||||
if (s != sizeof(ctrl)) {
|
||||
diff --git a/hw/virtio/virtio-crypto.c b/hw/virtio/virtio-crypto.c
|
||||
index dcd80b904d..0e31e3cc04 100644
|
||||
--- a/hw/virtio/virtio-crypto.c
|
||||
+++ b/hw/virtio/virtio-crypto.c
|
||||
@@ -242,7 +242,7 @@ static void virtio_crypto_handle_ctrl(VirtIODevice *vdev, VirtQueue *vq)
|
||||
}
|
||||
|
||||
out_num = elem->out_num;
|
||||
- out_iov_copy = g_memdup(elem->out_sg, sizeof(out_iov[0]) * out_num);
|
||||
+ out_iov_copy = g_memdup2(elem->out_sg, sizeof(out_iov[0]) * out_num);
|
||||
out_iov = out_iov_copy;
|
||||
|
||||
in_num = elem->in_num;
|
||||
@@ -605,11 +605,11 @@ virtio_crypto_handle_request(VirtIOCryptoReq *request)
|
||||
}
|
||||
|
||||
out_num = elem->out_num;
|
||||
- out_iov_copy = g_memdup(elem->out_sg, sizeof(out_iov[0]) * out_num);
|
||||
+ out_iov_copy = g_memdup2(elem->out_sg, sizeof(out_iov[0]) * out_num);
|
||||
out_iov = out_iov_copy;
|
||||
|
||||
in_num = elem->in_num;
|
||||
- in_iov_copy = g_memdup(elem->in_sg, sizeof(in_iov[0]) * in_num);
|
||||
+ in_iov_copy = g_memdup2(elem->in_sg, sizeof(in_iov[0]) * in_num);
|
||||
in_iov = in_iov_copy;
|
||||
|
||||
if (unlikely(iov_to_buf(out_iov, out_num, 0, &req, sizeof(req))
|
||||
--
|
||||
2.31.1
|
||||
|
@ -1,60 +0,0 @@
|
||||
From 2005e3bb97fba4889829b58331a057b9cb35a65d Mon Sep 17 00:00:00 2001
|
||||
From: Laurent Vivier <lvivier@redhat.com>
|
||||
Date: Fri, 11 Feb 2022 18:02:59 +0100
|
||||
Subject: [PATCH 2/5] hw/virtio: vdpa: Fix leak of host-notifier memory-region
|
||||
|
||||
RH-Author: Laurent Vivier <lvivier@redhat.com>
|
||||
RH-MergeRequest: 123: hw/virtio: vdpa: Fix leak of host-notifier memory-region
|
||||
RH-Commit: [1/1] ddd64cac5c29786edf652f5fa97767b261ccfcdd
|
||||
RH-Bugzilla: 2059786
|
||||
RH-Acked-by: Jason Wang <jasowang@redhat.com>
|
||||
RH-Acked-by: Cindy Lu <lulu@redhat.com>
|
||||
RH-Acked-by: MST <mst@redhat.com>
|
||||
RH-Acked-by: Stefano Garzarella <sgarzare@redhat.com>
|
||||
|
||||
BZ: https://bugzilla.redhat.com/2059786
|
||||
BRANCH: rhel-9.0.0
|
||||
BREW: https://brewweb.engineering.redhat.com/brew/taskinfo?taskID=43688388
|
||||
UPTREAM: Merged
|
||||
|
||||
If call virtio_queue_set_host_notifier_mr fails, should free
|
||||
host-notifier memory-region.
|
||||
|
||||
This problem can trigger a coredump with some vDPA drivers (mlx5,
|
||||
but not with the vdpasim), if we unplug the virtio-net card from
|
||||
the guest after a stop/start.
|
||||
|
||||
The same fix has been done for vhost-user:
|
||||
1f89d3b91e3e ("hw/virtio: Fix leak of host-notifier memory-region")
|
||||
|
||||
Fixes: d0416d487bd5 ("vhost-vdpa: map virtqueue notification area if possible")
|
||||
Cc: jasowang@redhat.com
|
||||
Resolves: https://bugzilla.redhat.com/2027208
|
||||
Signed-off-by: Laurent Vivier <lvivier@redhat.com>
|
||||
Message-Id: <20220211170259.1388734-1-lvivier@redhat.com>
|
||||
Cc: qemu-stable@nongnu.org
|
||||
Acked-by: Jason Wang <jasowang@redhat.com>
|
||||
Reviewed-by: Stefano Garzarella <sgarzare@redhat.com>
|
||||
Reviewed-by: Michael S. Tsirkin <mst@redhat.com>
|
||||
Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
|
||||
(cherry picked from commit 98f7607ecda00dea3cbb2ed7b4427c96846efb83)
|
||||
Signed-off-by: Laurent Vivier <lvivier@redhat.com>
|
||||
---
|
||||
hw/virtio/vhost-vdpa.c | 1 +
|
||||
1 file changed, 1 insertion(+)
|
||||
|
||||
diff --git a/hw/virtio/vhost-vdpa.c b/hw/virtio/vhost-vdpa.c
|
||||
index bcaf00e09f..78da48a333 100644
|
||||
--- a/hw/virtio/vhost-vdpa.c
|
||||
+++ b/hw/virtio/vhost-vdpa.c
|
||||
@@ -415,6 +415,7 @@ static int vhost_vdpa_host_notifier_init(struct vhost_dev *dev, int queue_index)
|
||||
g_free(name);
|
||||
|
||||
if (virtio_queue_set_host_notifier_mr(vdev, queue_index, &n->mr, true)) {
|
||||
+ object_unparent(OBJECT(&n->mr));
|
||||
munmap(addr, page_size);
|
||||
goto err;
|
||||
}
|
||||
--
|
||||
2.31.1
|
||||
|
@ -1,60 +0,0 @@
|
||||
From 575ca409fa21db088c76e57f7285021dd8da1569 Mon Sep 17 00:00:00 2001
|
||||
From: Vitaly Kuznetsov <vkuznets@redhat.com>
|
||||
Date: Wed, 16 Mar 2022 09:36:19 +0100
|
||||
Subject: [PATCH 04/14] i386: Add Icelake-Server-v6 CPU model with 5-level EPT
|
||||
support
|
||||
|
||||
RH-Author: Vitaly Kuznetsov <vkuznets@redhat.com>
|
||||
RH-MergeRequest: 126: i386: Add Icelake-Server-v6 CPU model with 5-level EPT support
|
||||
RH-Commit: [2/2] a047caa01fafd8ca6a5fa0704b379edab91d4ccc
|
||||
RH-Bugzilla: 2038051
|
||||
RH-Acked-by: Igor Mammedov <imammedo@redhat.com>
|
||||
RH-Acked-by: Cornelia Huck <cohuck@redhat.com>
|
||||
RH-Acked-by: Paolo Bonzini <pbonzini@redhat.com>
|
||||
|
||||
Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=2038051
|
||||
Brew: https://brewweb.engineering.redhat.com/brew/taskinfo?taskID=43862630
|
||||
|
||||
commit 12cab535db6440af41ed8dfefe908a594321b6ce
|
||||
Author: Vitaly Kuznetsov <vkuznets@redhat.com>
|
||||
Date: Mon Feb 21 15:53:15 2022 +0100
|
||||
|
||||
i386: Add Icelake-Server-v6 CPU model with 5-level EPT support
|
||||
|
||||
Windows 11 with WSL2 enabled (Hyper-V) fails to boot with Icelake-Server
|
||||
{-v5} CPU model but boots well with '-cpu host'. Apparently, it expects
|
||||
5-level paging and 5-level EPT support to come in pair but QEMU's
|
||||
Icelake-Server CPU model lacks the later. Introduce 'Icelake-Server-v6'
|
||||
CPU model with 'vmx-page-walk-5' enabled by default.
|
||||
|
||||
Signed-off-by: Vitaly Kuznetsov <vkuznets@redhat.com>
|
||||
Message-Id: <20220221145316.576138-1-vkuznets@redhat.com>
|
||||
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
|
||||
|
||||
Signed-off-by: Vitaly Kuznetsov <vkuznets@redhat.com>
|
||||
---
|
||||
target/i386/cpu.c | 8 ++++++++
|
||||
1 file changed, 8 insertions(+)
|
||||
|
||||
diff --git a/target/i386/cpu.c b/target/i386/cpu.c
|
||||
index aa9e636800..6e25d13339 100644
|
||||
--- a/target/i386/cpu.c
|
||||
+++ b/target/i386/cpu.c
|
||||
@@ -3505,6 +3505,14 @@ static const X86CPUDefinition builtin_x86_defs[] = {
|
||||
{ /* end of list */ }
|
||||
},
|
||||
},
|
||||
+ {
|
||||
+ .version = 6,
|
||||
+ .note = "5-level EPT",
|
||||
+ .props = (PropValue[]) {
|
||||
+ { "vmx-page-walk-5", "on" },
|
||||
+ { /* end of list */ }
|
||||
+ },
|
||||
+ },
|
||||
{ /* end of list */ }
|
||||
}
|
||||
},
|
||||
--
|
||||
2.31.1
|
||||
|
@ -0,0 +1,68 @@
|
||||
From 8452a7925e18d6d57e2ac787b192097d4136b104 Mon Sep 17 00:00:00 2001
|
||||
From: Vitaly Kuznetsov <vkuznets@redhat.com>
|
||||
Date: Thu, 18 Aug 2022 17:01:13 +0200
|
||||
Subject: [PATCH 2/2] i386: do kvm_put_msr_feature_control() first thing when
|
||||
vCPU is reset
|
||||
|
||||
RH-Author: Vitaly Kuznetsov <vkuznets@redhat.com>
|
||||
RH-MergeRequest: 217: i386: fix 'system_reset' when the VM is in VMX root operation
|
||||
RH-Bugzilla: 2117546
|
||||
RH-Acked-by: Emanuele Giuseppe Esposito <eesposit@redhat.com>
|
||||
RH-Acked-by: Miroslav Rezanina <mrezanin@redhat.com>
|
||||
RH-Acked-by: Peter Xu <peterx@redhat.com>
|
||||
RH-Commit: [2/2] 08d5992691ba70561ce0a5b7f4504618f96a2ee6
|
||||
|
||||
kvm_put_sregs2() fails to reset 'locked' CR4/CR0 bits upon vCPU reset when
|
||||
it is in VMX root operation. Do kvm_put_msr_feature_control() before
|
||||
kvm_put_sregs2() to (possibly) kick vCPU out of VMX root operation. It also
|
||||
seems logical to do kvm_put_msr_feature_control() before
|
||||
kvm_put_nested_state() and not after it, especially when 'real' nested
|
||||
state is set.
|
||||
|
||||
Signed-off-by: Vitaly Kuznetsov <vkuznets@redhat.com>
|
||||
Message-Id: <20220818150113.479917-3-vkuznets@redhat.com>
|
||||
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
|
||||
(cherry picked from commit 45ed68a1a3a19754ade954d75a3c9d13ff560e5c)
|
||||
Signed-off-by: Vitaly Kuznetsov <vkuznets@redhat.com>
|
||||
---
|
||||
target/i386/kvm/kvm.c | 17 ++++++++++++-----
|
||||
1 file changed, 12 insertions(+), 5 deletions(-)
|
||||
|
||||
diff --git a/target/i386/kvm/kvm.c b/target/i386/kvm/kvm.c
|
||||
index 9feb98fe0b..ef70e2c85f 100644
|
||||
--- a/target/i386/kvm/kvm.c
|
||||
+++ b/target/i386/kvm/kvm.c
|
||||
@@ -4356,6 +4356,18 @@ int kvm_arch_put_registers(CPUState *cpu, int level)
|
||||
|
||||
assert(cpu_is_stopped(cpu) || qemu_cpu_is_self(cpu));
|
||||
|
||||
+ /*
|
||||
+ * Put MSR_IA32_FEATURE_CONTROL first, this ensures the VM gets out of VMX
|
||||
+ * root operation upon vCPU reset. kvm_put_msr_feature_control() should also
|
||||
+ * preceed kvm_put_nested_state() when 'real' nested state is set.
|
||||
+ */
|
||||
+ if (level >= KVM_PUT_RESET_STATE) {
|
||||
+ ret = kvm_put_msr_feature_control(x86_cpu);
|
||||
+ if (ret < 0) {
|
||||
+ return ret;
|
||||
+ }
|
||||
+ }
|
||||
+
|
||||
/* must be before kvm_put_nested_state so that EFER.SVME is set */
|
||||
ret = has_sregs2 ? kvm_put_sregs2(x86_cpu) : kvm_put_sregs(x86_cpu);
|
||||
if (ret < 0) {
|
||||
@@ -4367,11 +4379,6 @@ int kvm_arch_put_registers(CPUState *cpu, int level)
|
||||
if (ret < 0) {
|
||||
return ret;
|
||||
}
|
||||
-
|
||||
- ret = kvm_put_msr_feature_control(x86_cpu);
|
||||
- if (ret < 0) {
|
||||
- return ret;
|
||||
- }
|
||||
}
|
||||
|
||||
if (level == KVM_PUT_FULL_STATE) {
|
||||
--
|
||||
2.31.1
|
||||
|
95
SOURCES/kvm-i386-reset-KVM-nested-state-upon-CPU-reset.patch
Normal file
95
SOURCES/kvm-i386-reset-KVM-nested-state-upon-CPU-reset.patch
Normal file
@ -0,0 +1,95 @@
|
||||
From b84bb71165c97b475548edc1c07decccca53cf16 Mon Sep 17 00:00:00 2001
|
||||
From: Vitaly Kuznetsov <vkuznets@redhat.com>
|
||||
Date: Thu, 18 Aug 2022 17:01:12 +0200
|
||||
Subject: [PATCH 1/2] i386: reset KVM nested state upon CPU reset
|
||||
|
||||
RH-Author: Vitaly Kuznetsov <vkuznets@redhat.com>
|
||||
RH-MergeRequest: 217: i386: fix 'system_reset' when the VM is in VMX root operation
|
||||
RH-Bugzilla: 2117546
|
||||
RH-Acked-by: Emanuele Giuseppe Esposito <eesposit@redhat.com>
|
||||
RH-Acked-by: Miroslav Rezanina <mrezanin@redhat.com>
|
||||
RH-Acked-by: Peter Xu <peterx@redhat.com>
|
||||
RH-Commit: [1/2] b329f053a027761f50187e4ca7fd6b50ac32d2ad
|
||||
|
||||
Make sure env->nested_state is cleaned up when a vCPU is reset, it may
|
||||
be stale after an incoming migration, kvm_arch_put_registers() may
|
||||
end up failing or putting vCPU in a weird state.
|
||||
|
||||
Reviewed-by: Maxim Levitsky <mlevitsk@redhat.com>
|
||||
Signed-off-by: Vitaly Kuznetsov <vkuznets@redhat.com>
|
||||
Message-Id: <20220818150113.479917-2-vkuznets@redhat.com>
|
||||
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
|
||||
(cherry picked from commit 3cafdb67504a34a0305260f0c86a73d5a3fb000b)
|
||||
Signed-off-by: Vitaly Kuznetsov <vkuznets@redhat.com>
|
||||
---
|
||||
target/i386/kvm/kvm.c | 37 +++++++++++++++++++++++++++----------
|
||||
1 file changed, 27 insertions(+), 10 deletions(-)
|
||||
|
||||
diff --git a/target/i386/kvm/kvm.c b/target/i386/kvm/kvm.c
|
||||
index 6d1e009443..9feb98fe0b 100644
|
||||
--- a/target/i386/kvm/kvm.c
|
||||
+++ b/target/i386/kvm/kvm.c
|
||||
@@ -1617,6 +1617,30 @@ static void kvm_init_xsave(CPUX86State *env)
|
||||
env->xsave_buf_len);
|
||||
}
|
||||
|
||||
+static void kvm_init_nested_state(CPUX86State *env)
|
||||
+{
|
||||
+ struct kvm_vmx_nested_state_hdr *vmx_hdr;
|
||||
+ uint32_t size;
|
||||
+
|
||||
+ if (!env->nested_state) {
|
||||
+ return;
|
||||
+ }
|
||||
+
|
||||
+ size = env->nested_state->size;
|
||||
+
|
||||
+ memset(env->nested_state, 0, size);
|
||||
+ env->nested_state->size = size;
|
||||
+
|
||||
+ if (cpu_has_vmx(env)) {
|
||||
+ env->nested_state->format = KVM_STATE_NESTED_FORMAT_VMX;
|
||||
+ vmx_hdr = &env->nested_state->hdr.vmx;
|
||||
+ vmx_hdr->vmxon_pa = -1ull;
|
||||
+ vmx_hdr->vmcs12_pa = -1ull;
|
||||
+ } else if (cpu_has_svm(env)) {
|
||||
+ env->nested_state->format = KVM_STATE_NESTED_FORMAT_SVM;
|
||||
+ }
|
||||
+}
|
||||
+
|
||||
int kvm_arch_init_vcpu(CPUState *cs)
|
||||
{
|
||||
struct {
|
||||
@@ -2044,19 +2068,10 @@ int kvm_arch_init_vcpu(CPUState *cs)
|
||||
assert(max_nested_state_len >= offsetof(struct kvm_nested_state, data));
|
||||
|
||||
if (cpu_has_vmx(env) || cpu_has_svm(env)) {
|
||||
- struct kvm_vmx_nested_state_hdr *vmx_hdr;
|
||||
-
|
||||
env->nested_state = g_malloc0(max_nested_state_len);
|
||||
env->nested_state->size = max_nested_state_len;
|
||||
|
||||
- if (cpu_has_vmx(env)) {
|
||||
- env->nested_state->format = KVM_STATE_NESTED_FORMAT_VMX;
|
||||
- vmx_hdr = &env->nested_state->hdr.vmx;
|
||||
- vmx_hdr->vmxon_pa = -1ull;
|
||||
- vmx_hdr->vmcs12_pa = -1ull;
|
||||
- } else {
|
||||
- env->nested_state->format = KVM_STATE_NESTED_FORMAT_SVM;
|
||||
- }
|
||||
+ kvm_init_nested_state(env);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2121,6 +2136,8 @@ void kvm_arch_reset_vcpu(X86CPU *cpu)
|
||||
/* enabled by default */
|
||||
env->poll_control_msr = 1;
|
||||
|
||||
+ kvm_init_nested_state(env);
|
||||
+
|
||||
sev_es_set_reset_vector(CPU(cpu));
|
||||
}
|
||||
|
||||
--
|
||||
2.31.1
|
||||
|
@ -0,0 +1,52 @@
|
||||
From 447bca651c9156d7aba6b7495c75f19b5e4ed53f Mon Sep 17 00:00:00 2001
|
||||
From: Hanna Reitz <hreitz@redhat.com>
|
||||
Date: Thu, 21 Apr 2022 16:24:35 +0200
|
||||
Subject: [PATCH 07/16] iotests/108: Fix when missing user_allow_other
|
||||
|
||||
RH-Author: Hanna Reitz <hreitz@redhat.com>
|
||||
RH-MergeRequest: 96: qcow2: Improve refcount structure rebuilding
|
||||
RH-Commit: [4/4] a51ab8606fc9d8dea2b6539f4e795d5813892a5c (hreitz/qemu-kvm-c-9-s)
|
||||
RH-Bugzilla: 2072379
|
||||
RH-Acked-by: Miroslav Rezanina <mrezanin@redhat.com>
|
||||
RH-Acked-by: Eric Blake <eblake@redhat.com>
|
||||
RH-Acked-by: Stefan Hajnoczi <stefanha@redhat.com>
|
||||
|
||||
FUSE exports' allow-other option defaults to "auto", which means that it
|
||||
will try passing allow_other as a mount option, and fall back to not
|
||||
using it when an error occurs. We make no effort to hide fusermount's
|
||||
error message (because it would be difficult, and because users might
|
||||
want to know about the fallback occurring), and so when allow_other does
|
||||
not work (primarily when /etc/fuse.conf does not contain
|
||||
user_allow_other), this error message will appear and break the
|
||||
reference output.
|
||||
|
||||
We do not need allow_other here, though, so we can just pass
|
||||
allow-other=off to fix that.
|
||||
|
||||
Reported-by: Markus Armbruster <armbru@redhat.com>
|
||||
Signed-off-by: Hanna Reitz <hreitz@redhat.com>
|
||||
Message-Id: <20220421142435.569600-1-hreitz@redhat.com>
|
||||
Tested-by: Markus Armbruster <armbru@redhat.com>
|
||||
Tested-by: Eric Blake <eblake@redhat.com>
|
||||
(cherry picked from commit 348a0740afc5b313599533eb69bbb2b95d2f1bba)
|
||||
Signed-off-by: Hanna Reitz <hreitz@redhat.com>
|
||||
---
|
||||
tests/qemu-iotests/108 | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
diff --git a/tests/qemu-iotests/108 b/tests/qemu-iotests/108
|
||||
index a3090e2875..4681c7c769 100755
|
||||
--- a/tests/qemu-iotests/108
|
||||
+++ b/tests/qemu-iotests/108
|
||||
@@ -326,7 +326,7 @@ else
|
||||
|
||||
$QSD \
|
||||
--blockdev file,node-name=export-node,filename="$TEST_IMG" \
|
||||
- --export fuse,id=fuse-export,node-name=export-node,mountpoint="$export_mp",writable=on,growable=off \
|
||||
+ --export fuse,id=fuse-export,node-name=export-node,mountpoint="$export_mp",writable=on,growable=off,allow-other=off \
|
||||
--pidfile "$TEST_DIR/qsd.pid" \
|
||||
&
|
||||
|
||||
--
|
||||
2.31.1
|
||||
|
@ -0,0 +1,445 @@
|
||||
From ed69e01352b5e9a06173daab53bfa373c8535732 Mon Sep 17 00:00:00 2001
|
||||
From: Hanna Reitz <hreitz@redhat.com>
|
||||
Date: Tue, 5 Apr 2022 15:46:51 +0200
|
||||
Subject: [PATCH 05/16] iotests/108: Test new refcount rebuild algorithm
|
||||
|
||||
RH-Author: Hanna Reitz <hreitz@redhat.com>
|
||||
RH-MergeRequest: 96: qcow2: Improve refcount structure rebuilding
|
||||
RH-Commit: [2/4] b68310a9fee8465dd3f568c8e867e1b7ae52bdaf (hreitz/qemu-kvm-c-9-s)
|
||||
RH-Bugzilla: 2072379
|
||||
RH-Acked-by: Miroslav Rezanina <mrezanin@redhat.com>
|
||||
RH-Acked-by: Eric Blake <eblake@redhat.com>
|
||||
RH-Acked-by: Stefan Hajnoczi <stefanha@redhat.com>
|
||||
|
||||
One clear problem with how qcow2's refcount structure rebuild algorithm
|
||||
used to be before "qcow2: Improve refcount structure rebuilding" was
|
||||
that it is prone to failure for qcow2 images on block devices: There is
|
||||
generally unused space after the actual image, and if that exceeds what
|
||||
one refblock covers, the old algorithm would invariably write the
|
||||
reftable past the block device's end, which cannot work. The new
|
||||
algorithm does not have this problem.
|
||||
|
||||
Test it with three tests:
|
||||
(1) Create an image with more empty space at the end than what one
|
||||
refblock covers, see whether rebuilding the refcount structures
|
||||
results in a change in the image file length. (It should not.)
|
||||
|
||||
(2) Leave precisely enough space somewhere at the beginning of the image
|
||||
for the new reftable (and the refblock for that place), see whether
|
||||
the new algorithm puts the reftable there. (It should.)
|
||||
|
||||
(3) Test the original problem: Create (something like) a block device
|
||||
with a fixed size, then create a qcow2 image in there, write some
|
||||
data, and then have qemu-img check rebuild the refcount structures.
|
||||
Before HEAD^, the reftable would have been written past the image
|
||||
file end, i.e. outside of what the block device provides, which
|
||||
cannot work. HEAD^ should have fixed that.
|
||||
("Something like a block device" means a loop device if we can use
|
||||
one ("sudo -n losetup" works), or a FUSE block export with
|
||||
growable=false otherwise.)
|
||||
|
||||
Reviewed-by: Eric Blake <eblake@redhat.com>
|
||||
Signed-off-by: Hanna Reitz <hreitz@redhat.com>
|
||||
Message-Id: <20220405134652.19278-3-hreitz@redhat.com>
|
||||
(cherry picked from commit 9ffd6d646d1d5ee9087a8cbf0b7d2f96c5656162)
|
||||
|
||||
Conflicts:
|
||||
- 108: The downstream qemu-storage-daemon does not support --daemonize,
|
||||
so this switch has been replaced by a loop waiting for the PID file to
|
||||
appear
|
||||
|
||||
Signed-off-by: Hanna Reitz <hreitz@redhat.com>
|
||||
---
|
||||
tests/qemu-iotests/108 | 263 ++++++++++++++++++++++++++++++++++++-
|
||||
tests/qemu-iotests/108.out | 81 ++++++++++++
|
||||
2 files changed, 343 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/tests/qemu-iotests/108 b/tests/qemu-iotests/108
|
||||
index 56339ab2c5..a3090e2875 100755
|
||||
--- a/tests/qemu-iotests/108
|
||||
+++ b/tests/qemu-iotests/108
|
||||
@@ -30,13 +30,20 @@ status=1 # failure is the default!
|
||||
|
||||
_cleanup()
|
||||
{
|
||||
- _cleanup_test_img
|
||||
+ _cleanup_test_img
|
||||
+ if [ -f "$TEST_DIR/qsd.pid" ]; then
|
||||
+ qsd_pid=$(cat "$TEST_DIR/qsd.pid")
|
||||
+ kill -KILL "$qsd_pid"
|
||||
+ fusermount -u "$TEST_DIR/fuse-export" &>/dev/null
|
||||
+ fi
|
||||
+ rm -f "$TEST_DIR/fuse-export"
|
||||
}
|
||||
trap "_cleanup; exit \$status" 0 1 2 3 15
|
||||
|
||||
# get standard environment, filters and checks
|
||||
. ./common.rc
|
||||
. ./common.filter
|
||||
+. ./common.qemu
|
||||
|
||||
# This tests qcow2-specific low-level functionality
|
||||
_supported_fmt qcow2
|
||||
@@ -47,6 +54,22 @@ _supported_os Linux
|
||||
# files
|
||||
_unsupported_imgopts 'refcount_bits=\([^1]\|.\([^6]\|$\)\)' data_file
|
||||
|
||||
+# This test either needs sudo -n losetup or FUSE exports to work
|
||||
+if sudo -n losetup &>/dev/null; then
|
||||
+ loopdev=true
|
||||
+else
|
||||
+ loopdev=false
|
||||
+
|
||||
+ # QSD --export fuse will either yield "Parameter 'id' is missing"
|
||||
+ # or "Invalid parameter 'fuse'", depending on whether there is
|
||||
+ # FUSE support or not.
|
||||
+ error=$($QSD --export fuse 2>&1)
|
||||
+ if [[ $error = *"'fuse'"* ]]; then
|
||||
+ _notrun 'Passwordless sudo for losetup or FUSE support required, but' \
|
||||
+ 'neither is available'
|
||||
+ fi
|
||||
+fi
|
||||
+
|
||||
echo
|
||||
echo '=== Repairing an image without any refcount table ==='
|
||||
echo
|
||||
@@ -138,6 +161,244 @@ _make_test_img 64M
|
||||
poke_file "$TEST_IMG" $((0x10008)) "\xff\xff\xff\xff\xff\xff\x00\x00"
|
||||
_check_test_img -r all
|
||||
|
||||
+echo
|
||||
+echo '=== Check rebuilt reftable location ==='
|
||||
+
|
||||
+# In an earlier version of the refcount rebuild algorithm, the
|
||||
+# reftable was generally placed at the image end (unless something was
|
||||
+# allocated in the area covered by the refblock right before the image
|
||||
+# file end, then we would try to place the reftable in that refblock).
|
||||
+# This was later changed so the reftable would be placed in the
|
||||
+# earliest possible location. Test this.
|
||||
+
|
||||
+echo
|
||||
+echo '--- Does the image size increase? ---'
|
||||
+echo
|
||||
+
|
||||
+# First test: Just create some image, write some data to it, and
|
||||
+# resize it so there is free space at the end of the image (enough
|
||||
+# that it spans at least one full refblock, which for cluster_size=512
|
||||
+# images, spans 128k). With the old algorithm, the reftable would
|
||||
+# have then been placed at the end of the image file, but with the new
|
||||
+# one, it will be put in that free space.
|
||||
+# We want to check whether the size of the image file increases due to
|
||||
+# rebuilding the refcount structures (it should not).
|
||||
+
|
||||
+_make_test_img -o 'cluster_size=512' 1M
|
||||
+# Write something
|
||||
+$QEMU_IO -c 'write 0 64k' "$TEST_IMG" | _filter_qemu_io
|
||||
+
|
||||
+# Add free space
|
||||
+file_len=$(stat -c '%s' "$TEST_IMG")
|
||||
+truncate -s $((file_len + 256 * 1024)) "$TEST_IMG"
|
||||
+
|
||||
+# Corrupt the image by saying the image header was not allocated
|
||||
+rt_offset=$(peek_file_be "$TEST_IMG" 48 8)
|
||||
+rb_offset=$(peek_file_be "$TEST_IMG" $rt_offset 8)
|
||||
+poke_file "$TEST_IMG" $rb_offset "\x00\x00"
|
||||
+
|
||||
+# Check whether rebuilding the refcount structures increases the image
|
||||
+# file size
|
||||
+file_len=$(stat -c '%s' "$TEST_IMG")
|
||||
+echo
|
||||
+# The only leaks there can be are the old refcount structures that are
|
||||
+# leaked during rebuilding, no need to clutter the output with them
|
||||
+_check_test_img -r all | grep -v '^Repairing cluster.*refcount=1 reference=0'
|
||||
+echo
|
||||
+post_repair_file_len=$(stat -c '%s' "$TEST_IMG")
|
||||
+
|
||||
+if [[ $file_len -eq $post_repair_file_len ]]; then
|
||||
+ echo 'OK: Image size did not change'
|
||||
+else
|
||||
+ echo 'ERROR: Image size differs' \
|
||||
+ "($file_len before, $post_repair_file_len after)"
|
||||
+fi
|
||||
+
|
||||
+echo
|
||||
+echo '--- Will the reftable occupy a hole specifically left for it? ---'
|
||||
+echo
|
||||
+
|
||||
+# Note: With cluster_size=512, every refblock covers 128k.
|
||||
+# The reftable covers 8M per reftable cluster.
|
||||
+
|
||||
+# Create an image that requires two reftable clusters (just because
|
||||
+# this is more interesting than a single-clustered reftable).
|
||||
+_make_test_img -o 'cluster_size=512' 9M
|
||||
+$QEMU_IO -c 'write 0 8M' "$TEST_IMG" | _filter_qemu_io
|
||||
+
|
||||
+# Writing 8M will have resized the reftable. Unfortunately, doing so
|
||||
+# will leave holes in the file, so we need to fill them up so we can
|
||||
+# be sure the whole file is allocated. Do that by writing
|
||||
+# consecutively smaller chunks starting from 8 MB, until the file
|
||||
+# length increases even with a chunk size of 512. Then we must have
|
||||
+# filled all holes.
|
||||
+ofs=$((8 * 1024 * 1024))
|
||||
+block_len=$((16 * 1024))
|
||||
+while [[ $block_len -ge 512 ]]; do
|
||||
+ file_len=$(stat -c '%s' "$TEST_IMG")
|
||||
+ while [[ $(stat -c '%s' "$TEST_IMG") -eq $file_len ]]; do
|
||||
+ # Do not include this in the reference output, it does not
|
||||
+ # really matter which qemu-io calls we do here exactly
|
||||
+ $QEMU_IO -c "write $ofs $block_len" "$TEST_IMG" >/dev/null
|
||||
+ ofs=$((ofs + block_len))
|
||||
+ done
|
||||
+ block_len=$((block_len / 2))
|
||||
+done
|
||||
+
|
||||
+# Fill up to 9M (do not include this in the reference output either,
|
||||
+# $ofs is random for all we know)
|
||||
+$QEMU_IO -c "write $ofs $((9 * 1024 * 1024 - ofs))" "$TEST_IMG" >/dev/null
|
||||
+
|
||||
+# Make space as follows:
|
||||
+# - For the first refblock: Right at the beginning of the image (this
|
||||
+# refblock is placed in the first place possible),
|
||||
+# - For the reftable somewhere soon afterwards, still near the
|
||||
+# beginning of the image (i.e. covered by the first refblock); the
|
||||
+# reftable too is placed in the first place possible, but only after
|
||||
+# all refblocks have been placed)
|
||||
+# No space is needed for the other refblocks, because no refblock is
|
||||
+# put before the space it covers. In this test case, we do not mind
|
||||
+# if they are placed at the image file's end.
|
||||
+
|
||||
+# Before we make that space, we have to find out the host offset of
|
||||
+# the area that belonged to the two data clusters at guest offset 4k,
|
||||
+# because we expect the reftable to be placed there, and we will have
|
||||
+# to verify that it is.
|
||||
+
|
||||
+l1_offset=$(peek_file_be "$TEST_IMG" 40 8)
|
||||
+l2_offset=$(peek_file_be "$TEST_IMG" $l1_offset 8)
|
||||
+l2_offset=$((l2_offset & 0x00fffffffffffe00))
|
||||
+data_4k_offset=$(peek_file_be "$TEST_IMG" \
|
||||
+ $((l2_offset + 4096 / 512 * 8)) 8)
|
||||
+data_4k_offset=$((data_4k_offset & 0x00fffffffffffe00))
|
||||
+
|
||||
+$QEMU_IO -c "discard 0 512" -c "discard 4k 1k" "$TEST_IMG" | _filter_qemu_io
|
||||
+
|
||||
+# Corrupt the image by saying the image header was not allocated
|
||||
+rt_offset=$(peek_file_be "$TEST_IMG" 48 8)
|
||||
+rb_offset=$(peek_file_be "$TEST_IMG" $rt_offset 8)
|
||||
+poke_file "$TEST_IMG" $rb_offset "\x00\x00"
|
||||
+
|
||||
+echo
|
||||
+# The only leaks there can be are the old refcount structures that are
|
||||
+# leaked during rebuilding, no need to clutter the output with them
|
||||
+_check_test_img -r all | grep -v '^Repairing cluster.*refcount=1 reference=0'
|
||||
+echo
|
||||
+
|
||||
+# Check whether the reftable was put where we expected
|
||||
+rt_offset=$(peek_file_be "$TEST_IMG" 48 8)
|
||||
+if [[ $rt_offset -eq $data_4k_offset ]]; then
|
||||
+ echo 'OK: Reftable is where we expect it'
|
||||
+else
|
||||
+ echo "ERROR: Reftable is at $rt_offset, but was expected at $data_4k_offset"
|
||||
+fi
|
||||
+
|
||||
+echo
|
||||
+echo '--- Rebuilding refcount structures on block devices ---'
|
||||
+echo
|
||||
+
|
||||
+# A block device cannot really grow, at least not during qemu-img
|
||||
+# check. As mentioned in the above cases, rebuilding the refcount
|
||||
+# structure may lead to new refcount structures being written after
|
||||
+# the end of the image, and in the past that happened even if there
|
||||
+# was more than sufficient space in the image. Such post-EOF writes
|
||||
+# will not work on block devices, so test that the new algorithm
|
||||
+# avoids it.
|
||||
+
|
||||
+# If we have passwordless sudo and losetup, we can use those to create
|
||||
+# a block device. Otherwise, we can resort to qemu's FUSE export to
|
||||
+# create a file that isn't growable, which effectively tests the same
|
||||
+# thing.
|
||||
+
|
||||
+_cleanup_test_img
|
||||
+truncate -s $((64 * 1024 * 1024)) "$TEST_IMG"
|
||||
+
|
||||
+if $loopdev; then
|
||||
+ export_mp=$(sudo -n losetup --show -f "$TEST_IMG")
|
||||
+ export_mp_driver=host_device
|
||||
+ sudo -n chmod go+rw "$export_mp"
|
||||
+else
|
||||
+ # Create non-growable FUSE export that is a bit like an empty
|
||||
+ # block device
|
||||
+ export_mp="$TEST_DIR/fuse-export"
|
||||
+ export_mp_driver=file
|
||||
+ touch "$export_mp"
|
||||
+
|
||||
+ $QSD \
|
||||
+ --blockdev file,node-name=export-node,filename="$TEST_IMG" \
|
||||
+ --export fuse,id=fuse-export,node-name=export-node,mountpoint="$export_mp",writable=on,growable=off \
|
||||
+ --pidfile "$TEST_DIR/qsd.pid" \
|
||||
+ &
|
||||
+
|
||||
+ while [ ! -f "$TEST_DIR/qsd.pid" ]; do
|
||||
+ sleep 0.1
|
||||
+ done
|
||||
+fi
|
||||
+
|
||||
+# Now create a qcow2 image on the device -- unfortunately, qemu-img
|
||||
+# create force-creates the file, so we have to resort to the
|
||||
+# blockdev-create job.
|
||||
+_launch_qemu \
|
||||
+ --blockdev $export_mp_driver,node-name=file,filename="$export_mp"
|
||||
+
|
||||
+_send_qemu_cmd \
|
||||
+ $QEMU_HANDLE \
|
||||
+ '{ "execute": "qmp_capabilities" }' \
|
||||
+ 'return'
|
||||
+
|
||||
+# Small cluster size again, so the image needs multiple refblocks
|
||||
+_send_qemu_cmd \
|
||||
+ $QEMU_HANDLE \
|
||||
+ '{ "execute": "blockdev-create",
|
||||
+ "arguments": {
|
||||
+ "job-id": "create",
|
||||
+ "options": {
|
||||
+ "driver": "qcow2",
|
||||
+ "file": "file",
|
||||
+ "size": '$((64 * 1024 * 1024))',
|
||||
+ "cluster-size": 512
|
||||
+ } } }' \
|
||||
+ '"concluded"'
|
||||
+
|
||||
+_send_qemu_cmd \
|
||||
+ $QEMU_HANDLE \
|
||||
+ '{ "execute": "job-dismiss", "arguments": { "id": "create" } }' \
|
||||
+ 'return'
|
||||
+
|
||||
+_send_qemu_cmd \
|
||||
+ $QEMU_HANDLE \
|
||||
+ '{ "execute": "quit" }' \
|
||||
+ 'return'
|
||||
+
|
||||
+wait=y _cleanup_qemu
|
||||
+echo
|
||||
+
|
||||
+# Write some data
|
||||
+$QEMU_IO -c 'write 0 64k' "$export_mp" | _filter_qemu_io
|
||||
+
|
||||
+# Corrupt the image by saying the image header was not allocated
|
||||
+rt_offset=$(peek_file_be "$export_mp" 48 8)
|
||||
+rb_offset=$(peek_file_be "$export_mp" $rt_offset 8)
|
||||
+poke_file "$export_mp" $rb_offset "\x00\x00"
|
||||
+
|
||||
+# Repairing such a simple case should just work
|
||||
+# (We used to put the reftable at the end of the image file, which can
|
||||
+# never work for non-growable devices.)
|
||||
+echo
|
||||
+TEST_IMG="$export_mp" _check_test_img -r all \
|
||||
+ | grep -v '^Repairing cluster.*refcount=1 reference=0'
|
||||
+
|
||||
+if $loopdev; then
|
||||
+ sudo -n losetup -d "$export_mp"
|
||||
+else
|
||||
+ qsd_pid=$(cat "$TEST_DIR/qsd.pid")
|
||||
+ kill -TERM "$qsd_pid"
|
||||
+ # Wait for process to exit (cannot `wait` because the QSD is daemonized)
|
||||
+ while [ -f "$TEST_DIR/qsd.pid" ]; do
|
||||
+ true
|
||||
+ done
|
||||
+fi
|
||||
+
|
||||
# success, all done
|
||||
echo '*** done'
|
||||
rm -f $seq.full
|
||||
diff --git a/tests/qemu-iotests/108.out b/tests/qemu-iotests/108.out
|
||||
index 75bab8dc84..b5401d788d 100644
|
||||
--- a/tests/qemu-iotests/108.out
|
||||
+++ b/tests/qemu-iotests/108.out
|
||||
@@ -105,6 +105,87 @@ The following inconsistencies were found and repaired:
|
||||
0 leaked clusters
|
||||
1 corruptions
|
||||
|
||||
+Double checking the fixed image now...
|
||||
+No errors were found on the image.
|
||||
+
|
||||
+=== Check rebuilt reftable location ===
|
||||
+
|
||||
+--- Does the image size increase? ---
|
||||
+
|
||||
+Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=1048576
|
||||
+wrote 65536/65536 bytes at offset 0
|
||||
+64 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
|
||||
+
|
||||
+ERROR cluster 0 refcount=0 reference=1
|
||||
+Rebuilding refcount structure
|
||||
+The following inconsistencies were found and repaired:
|
||||
+
|
||||
+ 0 leaked clusters
|
||||
+ 1 corruptions
|
||||
+
|
||||
+Double checking the fixed image now...
|
||||
+No errors were found on the image.
|
||||
+
|
||||
+OK: Image size did not change
|
||||
+
|
||||
+--- Will the reftable occupy a hole specifically left for it? ---
|
||||
+
|
||||
+Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=9437184
|
||||
+wrote 8388608/8388608 bytes at offset 0
|
||||
+8 MiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
|
||||
+discard 512/512 bytes at offset 0
|
||||
+512 bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
|
||||
+discard 1024/1024 bytes at offset 4096
|
||||
+1 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
|
||||
+
|
||||
+ERROR cluster 0 refcount=0 reference=1
|
||||
+Rebuilding refcount structure
|
||||
+The following inconsistencies were found and repaired:
|
||||
+
|
||||
+ 0 leaked clusters
|
||||
+ 1 corruptions
|
||||
+
|
||||
+Double checking the fixed image now...
|
||||
+No errors were found on the image.
|
||||
+
|
||||
+OK: Reftable is where we expect it
|
||||
+
|
||||
+--- Rebuilding refcount structures on block devices ---
|
||||
+
|
||||
+{ "execute": "qmp_capabilities" }
|
||||
+{"return": {}}
|
||||
+{ "execute": "blockdev-create",
|
||||
+ "arguments": {
|
||||
+ "job-id": "create",
|
||||
+ "options": {
|
||||
+ "driver": "IMGFMT",
|
||||
+ "file": "file",
|
||||
+ "size": 67108864,
|
||||
+ "cluster-size": 512
|
||||
+ } } }
|
||||
+{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "JOB_STATUS_CHANGE", "data": {"status": "created", "id": "create"}}
|
||||
+{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "JOB_STATUS_CHANGE", "data": {"status": "running", "id": "create"}}
|
||||
+{"return": {}}
|
||||
+{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "JOB_STATUS_CHANGE", "data": {"status": "waiting", "id": "create"}}
|
||||
+{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "JOB_STATUS_CHANGE", "data": {"status": "pending", "id": "create"}}
|
||||
+{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "JOB_STATUS_CHANGE", "data": {"status": "concluded", "id": "create"}}
|
||||
+{ "execute": "job-dismiss", "arguments": { "id": "create" } }
|
||||
+{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "JOB_STATUS_CHANGE", "data": {"status": "null", "id": "create"}}
|
||||
+{"return": {}}
|
||||
+{ "execute": "quit" }
|
||||
+{"return": {}}
|
||||
+{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "SHUTDOWN", "data": {"guest": false, "reason": "host-qmp-quit"}}
|
||||
+
|
||||
+wrote 65536/65536 bytes at offset 0
|
||||
+64 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
|
||||
+
|
||||
+ERROR cluster 0 refcount=0 reference=1
|
||||
+Rebuilding refcount structure
|
||||
+The following inconsistencies were found and repaired:
|
||||
+
|
||||
+ 0 leaked clusters
|
||||
+ 1 corruptions
|
||||
+
|
||||
Double checking the fixed image now...
|
||||
No errors were found on the image.
|
||||
*** done
|
||||
--
|
||||
2.31.1
|
||||
|
@ -1,108 +0,0 @@
|
||||
From 06583ce33fab2976157461ac4503d6f8eeb59e75 Mon Sep 17 00:00:00 2001
|
||||
From: Hanna Reitz <hreitz@redhat.com>
|
||||
Date: Fri, 4 Feb 2022 12:10:12 +0100
|
||||
Subject: [PATCH 8/8] iotests/281: Let NBD connection yield in iothread
|
||||
|
||||
RH-Author: Hanna Reitz <hreitz@redhat.com>
|
||||
RH-MergeRequest: 74: block/nbd: Handle AioContext changes
|
||||
RH-Commit: [6/6] 632b9ef5177a80d1c0c00121e1acc37272076d3e (hreitz/qemu-kvm-c-9-s)
|
||||
RH-Bugzilla: 2033626
|
||||
RH-Acked-by: Miroslav Rezanina <mrezanin@redhat.com>
|
||||
RH-Acked-by: Eric Blake <eblake@redhat.com>
|
||||
RH-Acked-by: Stefan Hajnoczi <stefanha@redhat.com>
|
||||
|
||||
Put an NBD block device into an I/O thread, and then read data from it,
|
||||
hoping that the NBD connection will yield during that read. When it
|
||||
does, the coroutine must be reentered in the block device's I/O thread,
|
||||
which will only happen if the NBD block driver attaches the connection's
|
||||
QIOChannel to the new AioContext. It did not do that after 4ddb5d2fde
|
||||
("block/nbd: drop connection_co") and prior to "block/nbd: Move s->ioc
|
||||
on AioContext change", which would cause an assertion failure.
|
||||
|
||||
To improve our chances of yielding, the NBD server is throttled to
|
||||
reading 64 kB/s, and the NBD client reads 128 kB, so it should yield at
|
||||
some point.
|
||||
|
||||
Reviewed-by: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>
|
||||
Signed-off-by: Hanna Reitz <hreitz@redhat.com>
|
||||
Signed-off-by: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>
|
||||
(cherry picked from commit 8cfbe929e8c26050f0a4580a1606a370a947d4ce)
|
||||
Signed-off-by: Hanna Reitz <hreitz@redhat.com>
|
||||
---
|
||||
tests/qemu-iotests/281 | 28 +++++++++++++++++++++++++---
|
||||
tests/qemu-iotests/281.out | 4 ++--
|
||||
2 files changed, 27 insertions(+), 5 deletions(-)
|
||||
|
||||
diff --git a/tests/qemu-iotests/281 b/tests/qemu-iotests/281
|
||||
index 13c588be75..b2ead7f388 100755
|
||||
--- a/tests/qemu-iotests/281
|
||||
+++ b/tests/qemu-iotests/281
|
||||
@@ -253,8 +253,9 @@ class TestYieldingAndTimers(iotests.QMPTestCase):
|
||||
self.create_nbd_export()
|
||||
|
||||
# Simple VM with an NBD block device connected to the NBD export
|
||||
- # provided by the QSD
|
||||
+ # provided by the QSD, and an (initially unused) iothread
|
||||
self.vm = iotests.VM()
|
||||
+ self.vm.add_object('iothread,id=iothr')
|
||||
self.vm.add_blockdev('nbd,node-name=nbd,server.type=unix,' +
|
||||
f'server.path={self.sock},export=exp,' +
|
||||
'reconnect-delay=1')
|
||||
@@ -293,19 +294,40 @@ class TestYieldingAndTimers(iotests.QMPTestCase):
|
||||
# thus not see the error, and so the test will pass.)
|
||||
time.sleep(2)
|
||||
|
||||
+ def test_yield_in_iothread(self):
|
||||
+ # Move the NBD node to the I/O thread; the NBD block driver should
|
||||
+ # attach the connection's QIOChannel to that thread's AioContext, too
|
||||
+ result = self.vm.qmp('x-blockdev-set-iothread',
|
||||
+ node_name='nbd', iothread='iothr')
|
||||
+ self.assert_qmp(result, 'return', {})
|
||||
+
|
||||
+ # Do some I/O that will be throttled by the QSD, so that the network
|
||||
+ # connection hopefully will yield here. When it is resumed, it must
|
||||
+ # then be resumed in the I/O thread's AioContext.
|
||||
+ result = self.vm.qmp('human-monitor-command',
|
||||
+ command_line='qemu-io nbd "read 0 128K"')
|
||||
+ self.assert_qmp(result, 'return', '')
|
||||
+
|
||||
def create_nbd_export(self):
|
||||
assert self.qsd is None
|
||||
|
||||
- # Simple NBD export of a null-co BDS
|
||||
+ # Export a throttled null-co BDS: Reads are throttled (max 64 kB/s),
|
||||
+ # writes are not.
|
||||
self.qsd = QemuStorageDaemon(
|
||||
+ '--object',
|
||||
+ 'throttle-group,id=thrgr,x-bps-read=65536,x-bps-read-max=65536',
|
||||
+
|
||||
'--blockdev',
|
||||
'null-co,node-name=null,read-zeroes=true',
|
||||
|
||||
+ '--blockdev',
|
||||
+ 'throttle,node-name=thr,file=null,throttle-group=thrgr',
|
||||
+
|
||||
'--nbd-server',
|
||||
f'addr.type=unix,addr.path={self.sock}',
|
||||
|
||||
'--export',
|
||||
- 'nbd,id=exp,node-name=null,name=exp,writable=true'
|
||||
+ 'nbd,id=exp,node-name=thr,name=exp,writable=true'
|
||||
)
|
||||
|
||||
def stop_nbd_export(self):
|
||||
diff --git a/tests/qemu-iotests/281.out b/tests/qemu-iotests/281.out
|
||||
index 914e3737bd..3f8a935a08 100644
|
||||
--- a/tests/qemu-iotests/281.out
|
||||
+++ b/tests/qemu-iotests/281.out
|
||||
@@ -1,5 +1,5 @@
|
||||
-.....
|
||||
+......
|
||||
----------------------------------------------------------------------
|
||||
-Ran 5 tests
|
||||
+Ran 6 tests
|
||||
|
||||
OK
|
||||
--
|
||||
2.27.0
|
||||
|
@ -1,174 +0,0 @@
|
||||
From 3d2d7a46713d362d2ff5137841e689593da976a3 Mon Sep 17 00:00:00 2001
|
||||
From: Hanna Reitz <hreitz@redhat.com>
|
||||
Date: Fri, 4 Feb 2022 12:10:10 +0100
|
||||
Subject: [PATCH 6/8] iotests/281: Test lingering timers
|
||||
|
||||
RH-Author: Hanna Reitz <hreitz@redhat.com>
|
||||
RH-MergeRequest: 74: block/nbd: Handle AioContext changes
|
||||
RH-Commit: [4/6] d228ba3fcdfaab2d54dd5b023688a1c055cce2c2 (hreitz/qemu-kvm-c-9-s)
|
||||
RH-Bugzilla: 2033626
|
||||
RH-Acked-by: Miroslav Rezanina <mrezanin@redhat.com>
|
||||
RH-Acked-by: Eric Blake <eblake@redhat.com>
|
||||
RH-Acked-by: Stefan Hajnoczi <stefanha@redhat.com>
|
||||
|
||||
Prior to "block/nbd: Delete reconnect delay timer when done" and
|
||||
"block/nbd: Delete open timer when done", both of those timers would
|
||||
remain scheduled even after successfully (re-)connecting to the server,
|
||||
and they would not even be deleted when the BDS is deleted.
|
||||
|
||||
This test constructs exactly this situation:
|
||||
(1) Configure an @open-timeout, so the open timer is armed, and
|
||||
(2) Configure a @reconnect-delay and trigger a reconnect situation
|
||||
(which succeeds immediately), so the reconnect delay timer is armed.
|
||||
Then we immediately delete the BDS, and sleep for longer than the
|
||||
@open-timeout and @reconnect-delay. Prior to said patches, this caused
|
||||
one (or both) of the timer CBs to access already-freed data.
|
||||
|
||||
Accessing freed data may or may not crash, so this test can produce
|
||||
false successes, but I do not know how to show the problem in a better
|
||||
or more reliable way. If you run this test on "block/nbd: Assert there
|
||||
are no timers when closed" and without the fix patches mentioned above,
|
||||
you should reliably see an assertion failure.
|
||||
(But all other tests that use the reconnect delay timer (264 and 277)
|
||||
will fail in that configuration, too; as will nbd-reconnect-on-open,
|
||||
which uses the open timer.)
|
||||
|
||||
Remove this test from the quick group because of the two second sleep
|
||||
this patch introduces.
|
||||
|
||||
(I decided to put this test case into 281, because the main bug this
|
||||
series addresses is in the interaction of the NBD block driver and I/O
|
||||
threads, which is precisely the scope of 281. The test case for that
|
||||
other bug will also be put into the test class added here.
|
||||
|
||||
Also, excuse the test class's name, I couldn't come up with anything
|
||||
better. The "yield" part will make sense two patches from now.)
|
||||
|
||||
Reviewed-by: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>
|
||||
Signed-off-by: Hanna Reitz <hreitz@redhat.com>
|
||||
Signed-off-by: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>
|
||||
(cherry picked from commit eaf1e85d4ddefdbd197f393fa9c5acc7ba8133b0)
|
||||
|
||||
Conflict:
|
||||
- @open-timeout was introduced after the 6.2 release, and has not been
|
||||
backported. Consequently, there is no open_timer, and we can (and
|
||||
must) drop the respective parts of the test here.
|
||||
|
||||
Signed-off-by: Hanna Reitz <hreitz@redhat.com>
|
||||
---
|
||||
tests/qemu-iotests/281 | 73 ++++++++++++++++++++++++++++++++++++--
|
||||
tests/qemu-iotests/281.out | 4 +--
|
||||
2 files changed, 73 insertions(+), 4 deletions(-)
|
||||
|
||||
diff --git a/tests/qemu-iotests/281 b/tests/qemu-iotests/281
|
||||
index 956698083f..13c588be75 100755
|
||||
--- a/tests/qemu-iotests/281
|
||||
+++ b/tests/qemu-iotests/281
|
||||
@@ -1,5 +1,5 @@
|
||||
#!/usr/bin/env python3
|
||||
-# group: rw quick
|
||||
+# group: rw
|
||||
#
|
||||
# Test cases for blockdev + IOThread interactions
|
||||
#
|
||||
@@ -20,8 +20,9 @@
|
||||
#
|
||||
|
||||
import os
|
||||
+import time
|
||||
import iotests
|
||||
-from iotests import qemu_img
|
||||
+from iotests import qemu_img, QemuStorageDaemon
|
||||
|
||||
image_len = 64 * 1024 * 1024
|
||||
|
||||
@@ -243,6 +244,74 @@ class TestBlockdevBackupAbort(iotests.QMPTestCase):
|
||||
# Hangs on failure, we expect this error.
|
||||
self.assert_qmp(result, 'error/class', 'GenericError')
|
||||
|
||||
+# Test for RHBZ#2033626
|
||||
+class TestYieldingAndTimers(iotests.QMPTestCase):
|
||||
+ sock = os.path.join(iotests.sock_dir, 'nbd.sock')
|
||||
+ qsd = None
|
||||
+
|
||||
+ def setUp(self):
|
||||
+ self.create_nbd_export()
|
||||
+
|
||||
+ # Simple VM with an NBD block device connected to the NBD export
|
||||
+ # provided by the QSD
|
||||
+ self.vm = iotests.VM()
|
||||
+ self.vm.add_blockdev('nbd,node-name=nbd,server.type=unix,' +
|
||||
+ f'server.path={self.sock},export=exp,' +
|
||||
+ 'reconnect-delay=1')
|
||||
+
|
||||
+ self.vm.launch()
|
||||
+
|
||||
+ def tearDown(self):
|
||||
+ self.stop_nbd_export()
|
||||
+ self.vm.shutdown()
|
||||
+
|
||||
+ def test_timers_with_blockdev_del(self):
|
||||
+ # Stop and restart the NBD server, and do some I/O on the client to
|
||||
+ # trigger a reconnect and start the reconnect delay timer
|
||||
+ self.stop_nbd_export()
|
||||
+ self.create_nbd_export()
|
||||
+
|
||||
+ result = self.vm.qmp('human-monitor-command',
|
||||
+ command_line='qemu-io nbd "write 0 512"')
|
||||
+ self.assert_qmp(result, 'return', '')
|
||||
+
|
||||
+ # Reconnect is done, so the reconnect delay timer should be gone.
|
||||
+ # (But there used to be a bug where it remained active, for which this
|
||||
+ # is a regression test.)
|
||||
+
|
||||
+ # Delete the BDS to see whether the timer is gone. If it is not,
|
||||
+ # it will remain active, fire later, and then access freed data.
|
||||
+ # (Or, with "block/nbd: Assert there are no timers when closed"
|
||||
+ # applied, the assertion added in that patch will fail.)
|
||||
+ result = self.vm.qmp('blockdev-del', node_name='nbd')
|
||||
+ self.assert_qmp(result, 'return', {})
|
||||
+
|
||||
+ # Give the timer some time to fire (it has a timeout of 1 s).
|
||||
+ # (Sleeping in an iotest may ring some alarm bells, but note that if
|
||||
+ # the timing is off here, the test will just always pass. If we kill
|
||||
+ # the VM too early, then we just kill the timer before it can fire,
|
||||
+ # thus not see the error, and so the test will pass.)
|
||||
+ time.sleep(2)
|
||||
+
|
||||
+ def create_nbd_export(self):
|
||||
+ assert self.qsd is None
|
||||
+
|
||||
+ # Simple NBD export of a null-co BDS
|
||||
+ self.qsd = QemuStorageDaemon(
|
||||
+ '--blockdev',
|
||||
+ 'null-co,node-name=null,read-zeroes=true',
|
||||
+
|
||||
+ '--nbd-server',
|
||||
+ f'addr.type=unix,addr.path={self.sock}',
|
||||
+
|
||||
+ '--export',
|
||||
+ 'nbd,id=exp,node-name=null,name=exp,writable=true'
|
||||
+ )
|
||||
+
|
||||
+ def stop_nbd_export(self):
|
||||
+ self.qsd.stop()
|
||||
+ self.qsd = None
|
||||
+
|
||||
if __name__ == '__main__':
|
||||
iotests.main(supported_fmts=['qcow2'],
|
||||
supported_protocols=['file'])
|
||||
diff --git a/tests/qemu-iotests/281.out b/tests/qemu-iotests/281.out
|
||||
index 89968f35d7..914e3737bd 100644
|
||||
--- a/tests/qemu-iotests/281.out
|
||||
+++ b/tests/qemu-iotests/281.out
|
||||
@@ -1,5 +1,5 @@
|
||||
-....
|
||||
+.....
|
||||
----------------------------------------------------------------------
|
||||
-Ran 4 tests
|
||||
+Ran 5 tests
|
||||
|
||||
OK
|
||||
--
|
||||
2.27.0
|
||||
|
@ -1,106 +0,0 @@
|
||||
From 37593348e7d95580fb2b0009dcb026c07367f1f8 Mon Sep 17 00:00:00 2001
|
||||
From: Kevin Wolf <kwolf@redhat.com>
|
||||
Date: Thu, 3 Feb 2022 15:05:34 +0100
|
||||
Subject: [PATCH 2/8] iotests: Test blockdev-reopen with iothreads and
|
||||
throttling
|
||||
|
||||
RH-Author: Kevin Wolf <kwolf@redhat.com>
|
||||
RH-MergeRequest: 73: block: Lock AioContext for drain_end in blockdev-reopen
|
||||
RH-Commit: [2/2] d19d5fa9efa4813ece75708436891041754ab910 (kmwolf/centos-qemu-kvm)
|
||||
RH-Bugzilla: 2046659
|
||||
RH-Acked-by: Sergio Lopez <None>
|
||||
RH-Acked-by: Stefan Hajnoczi <stefanha@redhat.com>
|
||||
RH-Acked-by: Hanna Reitz <hreitz@redhat.com>
|
||||
|
||||
The 'throttle' block driver implements .bdrv_co_drain_end, so
|
||||
blockdev-reopen will have to wait for it to complete in the polling
|
||||
loop at the end of qmp_blockdev_reopen(). This makes AIO_WAIT_WHILE()
|
||||
release the AioContext lock, which causes a crash if the lock hasn't
|
||||
correctly been taken.
|
||||
|
||||
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
|
||||
Message-Id: <20220203140534.36522-3-kwolf@redhat.com>
|
||||
Reviewed-by: Hanna Reitz <hreitz@redhat.com>
|
||||
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
|
||||
(cherry picked from commit ee810602376125ca0e0afd6b7c715e13740978ea)
|
||||
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
|
||||
---
|
||||
tests/qemu-iotests/245 | 36 +++++++++++++++++++++++++++++++++---
|
||||
tests/qemu-iotests/245.out | 4 ++--
|
||||
2 files changed, 35 insertions(+), 5 deletions(-)
|
||||
|
||||
diff --git a/tests/qemu-iotests/245 b/tests/qemu-iotests/245
|
||||
index 24ac43f70e..8cbed7821b 100755
|
||||
--- a/tests/qemu-iotests/245
|
||||
+++ b/tests/qemu-iotests/245
|
||||
@@ -1138,12 +1138,13 @@ class TestBlockdevReopen(iotests.QMPTestCase):
|
||||
self.assertEqual(self.get_node('hd1'), None)
|
||||
self.assert_qmp(self.get_node('hd2'), 'ro', True)
|
||||
|
||||
- def run_test_iothreads(self, iothread_a, iothread_b, errmsg = None):
|
||||
- opts = hd_opts(0)
|
||||
+ def run_test_iothreads(self, iothread_a, iothread_b, errmsg = None,
|
||||
+ opts_a = None, opts_b = None):
|
||||
+ opts = opts_a or hd_opts(0)
|
||||
result = self.vm.qmp('blockdev-add', conv_keys = False, **opts)
|
||||
self.assert_qmp(result, 'return', {})
|
||||
|
||||
- opts2 = hd_opts(2)
|
||||
+ opts2 = opts_b or hd_opts(2)
|
||||
result = self.vm.qmp('blockdev-add', conv_keys = False, **opts2)
|
||||
self.assert_qmp(result, 'return', {})
|
||||
|
||||
@@ -1194,6 +1195,35 @@ class TestBlockdevReopen(iotests.QMPTestCase):
|
||||
def test_iothreads_switch_overlay(self):
|
||||
self.run_test_iothreads('', 'iothread0')
|
||||
|
||||
+ def test_iothreads_with_throttling(self):
|
||||
+ # Create a throttle-group object
|
||||
+ opts = { 'qom-type': 'throttle-group', 'id': 'group0',
|
||||
+ 'limits': { 'iops-total': 1000 } }
|
||||
+ result = self.vm.qmp('object-add', conv_keys = False, **opts)
|
||||
+ self.assert_qmp(result, 'return', {})
|
||||
+
|
||||
+ # Options with a throttle filter between format and protocol
|
||||
+ opts = [
|
||||
+ {
|
||||
+ 'driver': iotests.imgfmt,
|
||||
+ 'node-name': f'hd{idx}',
|
||||
+ 'file' : {
|
||||
+ 'node-name': f'hd{idx}-throttle',
|
||||
+ 'driver': 'throttle',
|
||||
+ 'throttle-group': 'group0',
|
||||
+ 'file': {
|
||||
+ 'driver': 'file',
|
||||
+ 'node-name': f'hd{idx}-file',
|
||||
+ 'filename': hd_path[idx],
|
||||
+ },
|
||||
+ },
|
||||
+ }
|
||||
+ for idx in (0, 2)
|
||||
+ ]
|
||||
+
|
||||
+ self.run_test_iothreads('iothread0', 'iothread0', None,
|
||||
+ opts[0], opts[1])
|
||||
+
|
||||
if __name__ == '__main__':
|
||||
iotests.activate_logging()
|
||||
iotests.main(supported_fmts=["qcow2"],
|
||||
diff --git a/tests/qemu-iotests/245.out b/tests/qemu-iotests/245.out
|
||||
index 4eced19294..a4e04a3266 100644
|
||||
--- a/tests/qemu-iotests/245.out
|
||||
+++ b/tests/qemu-iotests/245.out
|
||||
@@ -17,8 +17,8 @@ read 1/1 bytes at offset 262152
|
||||
read 1/1 bytes at offset 262160
|
||||
1 bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
|
||||
|
||||
-...............
|
||||
+................
|
||||
----------------------------------------------------------------------
|
||||
-Ran 25 tests
|
||||
+Ran 26 tests
|
||||
|
||||
OK
|
||||
--
|
||||
2.27.0
|
||||
|
@ -1,81 +0,0 @@
|
||||
From 51f691acd8042351d005873996d7bf4c7b045508 Mon Sep 17 00:00:00 2001
|
||||
From: Kevin Wolf <kwolf@redhat.com>
|
||||
Date: Fri, 17 Dec 2021 17:46:53 +0100
|
||||
Subject: [PATCH 08/12] iotests: Test qemu-img convert of zeroed data cluster
|
||||
|
||||
RH-Author: Kevin Wolf <kwolf@redhat.com>
|
||||
RH-MergeRequest: 70: qemu-img convert: Fix sparseness of output image
|
||||
RH-Commit: [1/2] 0770582c553ac6b0f18c035f9a0238599d4763cc (kmwolf/centos-qemu-kvm)
|
||||
RH-Bugzilla: 1882917
|
||||
RH-Acked-by: Eric Blake <eblake@redhat.com>
|
||||
RH-Acked-by: Stefan Hajnoczi <stefanha@redhat.com>
|
||||
RH-Acked-by: Hanna Reitz <hreitz@redhat.com>
|
||||
|
||||
This demonstrates what happens when the block status changes in
|
||||
sub-min_sparse granularity, but all of the parts are zeroed out. The
|
||||
alignment logic in is_allocated_sectors() prevents that the target image
|
||||
remains fully sparse as expected, but turns it into a data cluster of
|
||||
explicit zeros.
|
||||
|
||||
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
|
||||
Signed-off-by: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>
|
||||
Message-Id: <20211217164654.1184218-2-vsementsov@virtuozzo.com>
|
||||
Tested-by: Peter Lieven <pl@kamp.de>
|
||||
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
|
||||
(cherry picked from commit 51cd8bddd63540514d44808f7920811439baa253)
|
||||
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
|
||||
---
|
||||
tests/qemu-iotests/122 | 1 +
|
||||
tests/qemu-iotests/122.out | 10 ++++++++--
|
||||
2 files changed, 9 insertions(+), 2 deletions(-)
|
||||
|
||||
diff --git a/tests/qemu-iotests/122 b/tests/qemu-iotests/122
|
||||
index efb260d822..be0f6b79e5 100755
|
||||
--- a/tests/qemu-iotests/122
|
||||
+++ b/tests/qemu-iotests/122
|
||||
@@ -251,6 +251,7 @@ $QEMU_IO -c "write -P 0 0 64k" "$TEST_IMG" 2>&1 | _filter_qemu_io | _filter_test
|
||||
$QEMU_IO -c "write 0 1k" "$TEST_IMG" 2>&1 | _filter_qemu_io | _filter_testdir
|
||||
$QEMU_IO -c "write 8k 1k" "$TEST_IMG" 2>&1 | _filter_qemu_io | _filter_testdir
|
||||
$QEMU_IO -c "write 17k 1k" "$TEST_IMG" 2>&1 | _filter_qemu_io | _filter_testdir
|
||||
+$QEMU_IO -c "write -P 0 65k 1k" "$TEST_IMG" 2>&1 | _filter_qemu_io | _filter_testdir
|
||||
|
||||
for min_sparse in 4k 8k; do
|
||||
echo
|
||||
diff --git a/tests/qemu-iotests/122.out b/tests/qemu-iotests/122.out
|
||||
index 8fbdac2b39..69b8e8b803 100644
|
||||
--- a/tests/qemu-iotests/122.out
|
||||
+++ b/tests/qemu-iotests/122.out
|
||||
@@ -192,6 +192,8 @@ wrote 1024/1024 bytes at offset 8192
|
||||
1 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
|
||||
wrote 1024/1024 bytes at offset 17408
|
||||
1 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
|
||||
+wrote 1024/1024 bytes at offset 66560
|
||||
+1 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
|
||||
|
||||
convert -S 4k
|
||||
[{ "start": 0, "length": 4096, "depth": 0, "present": true, "zero": false, "data": true, "offset": OFFSET},
|
||||
@@ -199,7 +201,9 @@ convert -S 4k
|
||||
{ "start": 8192, "length": 4096, "depth": 0, "present": true, "zero": false, "data": true, "offset": OFFSET},
|
||||
{ "start": 12288, "length": 4096, "depth": 0, "present": false, "zero": true, "data": false},
|
||||
{ "start": 16384, "length": 4096, "depth": 0, "present": true, "zero": false, "data": true, "offset": OFFSET},
|
||||
-{ "start": 20480, "length": 67088384, "depth": 0, "present": false, "zero": true, "data": false}]
|
||||
+{ "start": 20480, "length": 46080, "depth": 0, "present": false, "zero": true, "data": false},
|
||||
+{ "start": 66560, "length": 1024, "depth": 0, "present": true, "zero": false, "data": true, "offset": OFFSET},
|
||||
+{ "start": 67584, "length": 67041280, "depth": 0, "present": false, "zero": true, "data": false}]
|
||||
|
||||
convert -c -S 4k
|
||||
[{ "start": 0, "length": 1024, "depth": 0, "present": true, "zero": false, "data": true},
|
||||
@@ -211,7 +215,9 @@ convert -c -S 4k
|
||||
|
||||
convert -S 8k
|
||||
[{ "start": 0, "length": 24576, "depth": 0, "present": true, "zero": false, "data": true, "offset": OFFSET},
|
||||
-{ "start": 24576, "length": 67084288, "depth": 0, "present": false, "zero": true, "data": false}]
|
||||
+{ "start": 24576, "length": 41984, "depth": 0, "present": false, "zero": true, "data": false},
|
||||
+{ "start": 66560, "length": 1024, "depth": 0, "present": true, "zero": false, "data": true, "offset": OFFSET},
|
||||
+{ "start": 67584, "length": 67041280, "depth": 0, "present": false, "zero": true, "data": false}]
|
||||
|
||||
convert -c -S 8k
|
||||
[{ "start": 0, "length": 1024, "depth": 0, "present": true, "zero": false, "data": true},
|
||||
--
|
||||
2.27.0
|
||||
|
@ -1,197 +0,0 @@
|
||||
From 89fe89491f89a7526ba864a9d94d3de930261d69 Mon Sep 17 00:00:00 2001
|
||||
From: Hanna Reitz <hreitz@redhat.com>
|
||||
Date: Tue, 18 Jan 2022 18:00:00 +0100
|
||||
Subject: [PATCH 07/12] iotests/block-status-cache: New test
|
||||
|
||||
RH-Author: Hanna Reitz <hreitz@redhat.com>
|
||||
RH-MergeRequest: 69: block/io: Update BSC only if want_zero is true
|
||||
RH-Commit: [2/2] 3c5a55aca1ac7a71c175a124d63bcf7a4430a022 (hreitz/qemu-kvm-c-9-s)
|
||||
RH-Bugzilla: 2041461
|
||||
RH-Acked-by: Eric Blake <eblake@redhat.com>
|
||||
RH-Acked-by: Stefan Hajnoczi <stefanha@redhat.com>
|
||||
RH-Acked-by: Kevin Wolf <kwolf@redhat.com>
|
||||
|
||||
Add a new test to verify that want_zero=false block-status calls do not
|
||||
pollute the block-status cache for want_zero=true calls.
|
||||
|
||||
We check want_zero=true calls and their results using `qemu-img map`
|
||||
(over NBD), and want_zero=false calls also using `qemu-img map` over
|
||||
NBD, but using the qemu:allocation-depth context.
|
||||
|
||||
(This test case cannot be integrated into nbd-qemu-allocation, because
|
||||
that is a qcow2 test, and this is a raw test.)
|
||||
|
||||
Signed-off-by: Hanna Reitz <hreitz@redhat.com>
|
||||
Message-Id: <20220118170000.49423-3-hreitz@redhat.com>
|
||||
Reviewed-by: Nir Soffer <nsoffer@redhat.com>
|
||||
Reviewed-by: Eric Blake <eblake@redhat.com>
|
||||
Tested-by: Eric Blake <eblake@redhat.com>
|
||||
Signed-off-by: Eric Blake <eblake@redhat.com>
|
||||
(cherry picked from commit 6384dd534d742123d26c008d9794b20bc41359d5)
|
||||
Signed-off-by: Hanna Reitz <hreitz@redhat.com>
|
||||
---
|
||||
tests/qemu-iotests/tests/block-status-cache | 139 ++++++++++++++++++
|
||||
.../qemu-iotests/tests/block-status-cache.out | 5 +
|
||||
2 files changed, 144 insertions(+)
|
||||
create mode 100755 tests/qemu-iotests/tests/block-status-cache
|
||||
create mode 100644 tests/qemu-iotests/tests/block-status-cache.out
|
||||
|
||||
diff --git a/tests/qemu-iotests/tests/block-status-cache b/tests/qemu-iotests/tests/block-status-cache
|
||||
new file mode 100755
|
||||
index 0000000000..6fa10bb8f8
|
||||
--- /dev/null
|
||||
+++ b/tests/qemu-iotests/tests/block-status-cache
|
||||
@@ -0,0 +1,139 @@
|
||||
+#!/usr/bin/env python3
|
||||
+# group: rw quick
|
||||
+#
|
||||
+# Test cases for the block-status cache.
|
||||
+#
|
||||
+# Copyright (C) 2022 Red Hat, Inc.
|
||||
+#
|
||||
+# This program is free software; you can redistribute it and/or modify
|
||||
+# it under the terms of the GNU General Public License as published by
|
||||
+# the Free Software Foundation; either version 2 of the License, or
|
||||
+# (at your option) any later version.
|
||||
+#
|
||||
+# This program is distributed in the hope that it will be useful,
|
||||
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
+# GNU General Public License for more details.
|
||||
+#
|
||||
+# You should have received a copy of the GNU General Public License
|
||||
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
+#
|
||||
+
|
||||
+import os
|
||||
+import signal
|
||||
+import iotests
|
||||
+from iotests import qemu_img_create, qemu_img_pipe, qemu_nbd
|
||||
+
|
||||
+
|
||||
+image_size = 1 * 1024 * 1024
|
||||
+test_img = os.path.join(iotests.test_dir, 'test.img')
|
||||
+
|
||||
+nbd_pidfile = os.path.join(iotests.test_dir, 'nbd.pid')
|
||||
+nbd_sock = os.path.join(iotests.sock_dir, 'nbd.sock')
|
||||
+
|
||||
+
|
||||
+class TestBscWithNbd(iotests.QMPTestCase):
|
||||
+ def setUp(self) -> None:
|
||||
+ """Just create an empty image with a read-only NBD server on it"""
|
||||
+ assert qemu_img_create('-f', iotests.imgfmt, test_img,
|
||||
+ str(image_size)) == 0
|
||||
+
|
||||
+ # Pass --allocation-depth to enable the qemu:allocation-depth context,
|
||||
+ # which we are going to query to provoke a block-status inquiry with
|
||||
+ # want_zero=false.
|
||||
+ assert qemu_nbd(f'--socket={nbd_sock}',
|
||||
+ f'--format={iotests.imgfmt}',
|
||||
+ '--persistent',
|
||||
+ '--allocation-depth',
|
||||
+ '--read-only',
|
||||
+ f'--pid-file={nbd_pidfile}',
|
||||
+ test_img) \
|
||||
+ == 0
|
||||
+
|
||||
+ def tearDown(self) -> None:
|
||||
+ with open(nbd_pidfile, encoding='utf-8') as f:
|
||||
+ pid = int(f.read())
|
||||
+ os.kill(pid, signal.SIGTERM)
|
||||
+ os.remove(nbd_pidfile)
|
||||
+ os.remove(test_img)
|
||||
+
|
||||
+ def test_with_zero_bug(self) -> None:
|
||||
+ """
|
||||
+ Verify that the block-status cache is not corrupted by a
|
||||
+ want_zero=false call.
|
||||
+ We can provoke a want_zero=false call with `qemu-img map` over NBD with
|
||||
+ x-dirty-bitmap=qemu:allocation-depth, so we first run a normal `map`
|
||||
+ (which results in want_zero=true), then using said
|
||||
+ qemu:allocation-depth context, and finally another normal `map` to
|
||||
+ verify that the cache has not been corrupted.
|
||||
+ """
|
||||
+
|
||||
+ nbd_img_opts = f'driver=nbd,server.type=unix,server.path={nbd_sock}'
|
||||
+ nbd_img_opts_alloc_depth = nbd_img_opts + \
|
||||
+ ',x-dirty-bitmap=qemu:allocation-depth'
|
||||
+
|
||||
+ # Normal map, results in want_zero=true.
|
||||
+ # This will probably detect an allocated data sector first (qemu likes
|
||||
+ # to allocate the first sector to facilitate alignment probing), and
|
||||
+ # then the rest to be zero. The BSC will thus contain (if anything)
|
||||
+ # one range covering the first sector.
|
||||
+ map_pre = qemu_img_pipe('map', '--output=json', '--image-opts',
|
||||
+ nbd_img_opts)
|
||||
+
|
||||
+ # qemu:allocation-depth maps for want_zero=false.
|
||||
+ # want_zero=false should (with the file driver, which the server is
|
||||
+ # using) report everything as data. While this is sufficient for
|
||||
+ # want_zero=false, this is nothing that should end up in the
|
||||
+ # block-status cache.
|
||||
+ # Due to a bug, this information did end up in the cache, though, and
|
||||
+ # this would lead to wrong information being returned on subsequent
|
||||
+ # want_zero=true calls.
|
||||
+ #
|
||||
+ # We need to run this map twice: On the first call, we probably still
|
||||
+ # have the first sector in the cache, and so this will be served from
|
||||
+ # the cache; and only the subsequent range will be queried from the
|
||||
+ # block driver. This subsequent range will then be entered into the
|
||||
+ # cache.
|
||||
+ # If we did a want_zero=true call at this point, we would thus get
|
||||
+ # correct information: The first sector is not covered by the cache, so
|
||||
+ # we would get fresh block-status information from the driver, which
|
||||
+ # would return a data range, and this would then go into the cache,
|
||||
+ # evicting the wrong range from the want_zero=false call before.
|
||||
+ #
|
||||
+ # Therefore, we need a second want_zero=false map to reproduce:
|
||||
+ # Since the first sector is not in the cache, the query for its status
|
||||
+ # will go to the driver, which will return a result that reports the
|
||||
+ # whole image to be a single data area. This result will then go into
|
||||
+ # the cache, and so the cache will then report the whole image to
|
||||
+ # contain data.
|
||||
+ #
|
||||
+ # Note that once the cache reports the whole image to contain data, any
|
||||
+ # subsequent map operation will be served from the cache, and so we can
|
||||
+ # never loop too many times here.
|
||||
+ for _ in range(2):
|
||||
+ # (Ignore the result, this is just to contaminate the cache)
|
||||
+ qemu_img_pipe('map', '--output=json', '--image-opts',
|
||||
+ nbd_img_opts_alloc_depth)
|
||||
+
|
||||
+ # Now let's see whether the cache reports everything as data, or
|
||||
+ # whether we get correct information (i.e. the same as we got on our
|
||||
+ # first attempt).
|
||||
+ map_post = qemu_img_pipe('map', '--output=json', '--image-opts',
|
||||
+ nbd_img_opts)
|
||||
+
|
||||
+ if map_pre != map_post:
|
||||
+ print('ERROR: Map information differs before and after querying ' +
|
||||
+ 'qemu:allocation-depth')
|
||||
+ print('Before:')
|
||||
+ print(map_pre)
|
||||
+ print('After:')
|
||||
+ print(map_post)
|
||||
+
|
||||
+ self.fail("Map information differs")
|
||||
+
|
||||
+
|
||||
+if __name__ == '__main__':
|
||||
+ # The block-status cache only works on the protocol layer, so to test it,
|
||||
+ # we can only use the raw format
|
||||
+ iotests.main(supported_fmts=['raw'],
|
||||
+ supported_protocols=['file'])
|
||||
diff --git a/tests/qemu-iotests/tests/block-status-cache.out b/tests/qemu-iotests/tests/block-status-cache.out
|
||||
new file mode 100644
|
||||
index 0000000000..ae1213e6f8
|
||||
--- /dev/null
|
||||
+++ b/tests/qemu-iotests/tests/block-status-cache.out
|
||||
@@ -0,0 +1,5 @@
|
||||
+.
|
||||
+----------------------------------------------------------------------
|
||||
+Ran 1 tests
|
||||
+
|
||||
+OK
|
||||
--
|
||||
2.27.0
|
||||
|
@ -1,196 +0,0 @@
|
||||
From 300f912d4a5afe4ecca9c68a71429fbc9966ec34 Mon Sep 17 00:00:00 2001
|
||||
From: Hanna Reitz <hreitz@redhat.com>
|
||||
Date: Tue, 11 Jan 2022 15:36:13 +0000
|
||||
Subject: [PATCH 11/12] iotests/stream-error-on-reset: New test
|
||||
|
||||
RH-Author: Hanna Reitz <hreitz@redhat.com>
|
||||
RH-MergeRequest: 71: block-backend: prevent dangling BDS pointers across aio_poll()
|
||||
RH-Commit: [2/2] 3167f31b91eb433f338564201f4ef336e39f7f7d (hreitz/qemu-kvm-c-9-s)
|
||||
RH-Bugzilla: 2040123
|
||||
RH-Acked-by: Kevin Wolf <kwolf@redhat.com>
|
||||
RH-Acked-by: Stefan Hajnoczi <stefanha@redhat.com>
|
||||
RH-Acked-by: Emanuele Giuseppe Esposito <eesposit@redhat.com>
|
||||
|
||||
Test the following scenario:
|
||||
- Simple stream block in two-layer backing chain (base and top)
|
||||
- The job is drained via blk_drain(), then an error occurs while the job
|
||||
settles the ongoing request
|
||||
- And so the job completes while in blk_drain()
|
||||
|
||||
This was reported as a segfault, but is fixed by "block-backend: prevent
|
||||
dangling BDS pointers across aio_poll()".
|
||||
|
||||
Buglink: https://bugzilla.redhat.com/show_bug.cgi?id=2036178
|
||||
Signed-off-by: Hanna Reitz <hreitz@redhat.com>
|
||||
Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
|
||||
Message-Id: <20220111153613.25453-3-stefanha@redhat.com>
|
||||
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
|
||||
(cherry picked from commit 2ca1d5d6b91f8a52a5c651f660b2f58c94bf97ba)
|
||||
Signed-off-by: Hanna Reitz <hreitz@redhat.com>
|
||||
---
|
||||
.../qemu-iotests/tests/stream-error-on-reset | 140 ++++++++++++++++++
|
||||
.../tests/stream-error-on-reset.out | 5 +
|
||||
2 files changed, 145 insertions(+)
|
||||
create mode 100755 tests/qemu-iotests/tests/stream-error-on-reset
|
||||
create mode 100644 tests/qemu-iotests/tests/stream-error-on-reset.out
|
||||
|
||||
diff --git a/tests/qemu-iotests/tests/stream-error-on-reset b/tests/qemu-iotests/tests/stream-error-on-reset
|
||||
new file mode 100755
|
||||
index 0000000000..7eaedb24d7
|
||||
--- /dev/null
|
||||
+++ b/tests/qemu-iotests/tests/stream-error-on-reset
|
||||
@@ -0,0 +1,140 @@
|
||||
+#!/usr/bin/env python3
|
||||
+# group: rw quick
|
||||
+#
|
||||
+# Test what happens when a stream job completes in a blk_drain().
|
||||
+#
|
||||
+# Copyright (C) 2022 Red Hat, Inc.
|
||||
+#
|
||||
+# This program is free software; you can redistribute it and/or modify
|
||||
+# it under the terms of the GNU General Public License as published by
|
||||
+# the Free Software Foundation; either version 2 of the License, or
|
||||
+# (at your option) any later version.
|
||||
+#
|
||||
+# This program is distributed in the hope that it will be useful,
|
||||
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
+# GNU General Public License for more details.
|
||||
+#
|
||||
+# You should have received a copy of the GNU General Public License
|
||||
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
+#
|
||||
+
|
||||
+import os
|
||||
+import iotests
|
||||
+from iotests import imgfmt, qemu_img_create, qemu_io_silent, QMPTestCase
|
||||
+
|
||||
+
|
||||
+image_size = 1 * 1024 * 1024
|
||||
+data_size = 64 * 1024
|
||||
+base = os.path.join(iotests.test_dir, 'base.img')
|
||||
+top = os.path.join(iotests.test_dir, 'top.img')
|
||||
+
|
||||
+
|
||||
+# We want to test completing a stream job in a blk_drain().
|
||||
+#
|
||||
+# The blk_drain() we are going to use is a virtio-scsi device resetting,
|
||||
+# which we can trigger by resetting the system.
|
||||
+#
|
||||
+# In order to have the block job complete on drain, we (1) throttle its
|
||||
+# base image so we can start the drain after it has begun, but before it
|
||||
+# completes, and (2) make it encounter an I/O error on the ensuing write.
|
||||
+# (If it completes regularly, the completion happens after the drain for
|
||||
+# some reason.)
|
||||
+
|
||||
+class TestStreamErrorOnReset(QMPTestCase):
|
||||
+ def setUp(self) -> None:
|
||||
+ """
|
||||
+ Create two images:
|
||||
+ - base image {base} with {data_size} bytes allocated
|
||||
+ - top image {top} without any data allocated
|
||||
+
|
||||
+ And the following VM configuration:
|
||||
+ - base image throttled to {data_size}
|
||||
+ - top image with a blkdebug configuration so the first write access
|
||||
+ to it will result in an error
|
||||
+ - top image is attached to a virtio-scsi device
|
||||
+ """
|
||||
+ assert qemu_img_create('-f', imgfmt, base, str(image_size)) == 0
|
||||
+ assert qemu_io_silent('-c', f'write 0 {data_size}', base) == 0
|
||||
+ assert qemu_img_create('-f', imgfmt, top, str(image_size)) == 0
|
||||
+
|
||||
+ self.vm = iotests.VM()
|
||||
+ self.vm.add_args('-accel', 'tcg') # Make throttling work properly
|
||||
+ self.vm.add_object(self.vm.qmp_to_opts({
|
||||
+ 'qom-type': 'throttle-group',
|
||||
+ 'id': 'thrgr',
|
||||
+ 'x-bps-total': str(data_size)
|
||||
+ }))
|
||||
+ self.vm.add_blockdev(self.vm.qmp_to_opts({
|
||||
+ 'driver': imgfmt,
|
||||
+ 'node-name': 'base',
|
||||
+ 'file': {
|
||||
+ 'driver': 'throttle',
|
||||
+ 'throttle-group': 'thrgr',
|
||||
+ 'file': {
|
||||
+ 'driver': 'file',
|
||||
+ 'filename': base
|
||||
+ }
|
||||
+ }
|
||||
+ }))
|
||||
+ self.vm.add_blockdev(self.vm.qmp_to_opts({
|
||||
+ 'driver': imgfmt,
|
||||
+ 'node-name': 'top',
|
||||
+ 'file': {
|
||||
+ 'driver': 'blkdebug',
|
||||
+ 'node-name': 'top-blkdebug',
|
||||
+ 'inject-error': [{
|
||||
+ 'event': 'pwritev',
|
||||
+ 'immediately': 'true',
|
||||
+ 'once': 'true'
|
||||
+ }],
|
||||
+ 'image': {
|
||||
+ 'driver': 'file',
|
||||
+ 'filename': top
|
||||
+ }
|
||||
+ },
|
||||
+ 'backing': 'base'
|
||||
+ }))
|
||||
+ self.vm.add_device(self.vm.qmp_to_opts({
|
||||
+ 'driver': 'virtio-scsi',
|
||||
+ 'id': 'vscsi'
|
||||
+ }))
|
||||
+ self.vm.add_device(self.vm.qmp_to_opts({
|
||||
+ 'driver': 'scsi-hd',
|
||||
+ 'bus': 'vscsi.0',
|
||||
+ 'drive': 'top'
|
||||
+ }))
|
||||
+ self.vm.launch()
|
||||
+
|
||||
+ def tearDown(self) -> None:
|
||||
+ self.vm.shutdown()
|
||||
+ os.remove(top)
|
||||
+ os.remove(base)
|
||||
+
|
||||
+ def test_stream_error_on_reset(self) -> None:
|
||||
+ # Launch a stream job, which will take at least a second to
|
||||
+ # complete, because the base image is throttled (so we can
|
||||
+ # get in between it having started and it having completed)
|
||||
+ res = self.vm.qmp('block-stream', job_id='stream', device='top')
|
||||
+ self.assert_qmp(res, 'return', {})
|
||||
+
|
||||
+ while True:
|
||||
+ ev = self.vm.event_wait('JOB_STATUS_CHANGE')
|
||||
+ if ev['data']['status'] == 'running':
|
||||
+ # Once the stream job is running, reset the system, which
|
||||
+ # forces the virtio-scsi device to be reset, thus draining
|
||||
+ # the stream job, and making it complete. Completing
|
||||
+ # inside of that drain should not result in a segfault.
|
||||
+ res = self.vm.qmp('system_reset')
|
||||
+ self.assert_qmp(res, 'return', {})
|
||||
+ elif ev['data']['status'] == 'null':
|
||||
+ # The test is done once the job is gone
|
||||
+ break
|
||||
+
|
||||
+
|
||||
+if __name__ == '__main__':
|
||||
+ # Passes with any format with backing file support, but qed and
|
||||
+ # qcow1 do not seem to exercise the used-to-be problematic code
|
||||
+ # path, so there is no point in having them in this list
|
||||
+ iotests.main(supported_fmts=['qcow2', 'vmdk'],
|
||||
+ supported_protocols=['file'])
|
||||
diff --git a/tests/qemu-iotests/tests/stream-error-on-reset.out b/tests/qemu-iotests/tests/stream-error-on-reset.out
|
||||
new file mode 100644
|
||||
index 0000000000..ae1213e6f8
|
||||
--- /dev/null
|
||||
+++ b/tests/qemu-iotests/tests/stream-error-on-reset.out
|
||||
@@ -0,0 +1,5 @@
|
||||
+.
|
||||
+----------------------------------------------------------------------
|
||||
+Ran 1 tests
|
||||
+
|
||||
+OK
|
||||
--
|
||||
2.27.0
|
||||
|
@ -1,92 +0,0 @@
|
||||
From c21502a220d107261c9a8627158f357489d86543 Mon Sep 17 00:00:00 2001
|
||||
From: Hanna Reitz <hreitz@redhat.com>
|
||||
Date: Fri, 4 Feb 2022 12:10:09 +0100
|
||||
Subject: [PATCH 5/8] iotests.py: Add QemuStorageDaemon class
|
||||
|
||||
RH-Author: Hanna Reitz <hreitz@redhat.com>
|
||||
RH-MergeRequest: 74: block/nbd: Handle AioContext changes
|
||||
RH-Commit: [3/6] 5da1cda4d025c1bd7029ed8071b4ccf25459a878 (hreitz/qemu-kvm-c-9-s)
|
||||
RH-Bugzilla: 2033626
|
||||
RH-Acked-by: Miroslav Rezanina <mrezanin@redhat.com>
|
||||
RH-Acked-by: Eric Blake <eblake@redhat.com>
|
||||
RH-Acked-by: Stefan Hajnoczi <stefanha@redhat.com>
|
||||
|
||||
This is a rather simple class that allows creating a QSD instance
|
||||
running in the background and stopping it when no longer needed.
|
||||
|
||||
The __del__ handler is a safety net for when something goes so wrong in
|
||||
a test that e.g. the tearDown() method is not called (e.g. setUp()
|
||||
launches the QSD, but then launching a VM fails). We do not want the
|
||||
QSD to continue running after the test has failed, so __del__() will
|
||||
take care to kill it.
|
||||
|
||||
Reviewed-by: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>
|
||||
Signed-off-by: Hanna Reitz <hreitz@redhat.com>
|
||||
Signed-off-by: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>
|
||||
(cherry picked from commit 091dc7b2b5553a529bff9a7bf9ad3bc85bc5bdcd)
|
||||
Signed-off-by: Hanna Reitz <hreitz@redhat.com>
|
||||
---
|
||||
tests/qemu-iotests/iotests.py | 40 +++++++++++++++++++++++++++++++++++
|
||||
1 file changed, 40 insertions(+)
|
||||
|
||||
diff --git a/tests/qemu-iotests/iotests.py b/tests/qemu-iotests/iotests.py
|
||||
index 83bfedb902..a51b5ce8cd 100644
|
||||
--- a/tests/qemu-iotests/iotests.py
|
||||
+++ b/tests/qemu-iotests/iotests.py
|
||||
@@ -72,6 +72,8 @@
|
||||
qemu_prog = os.environ.get('QEMU_PROG', 'qemu')
|
||||
qemu_opts = os.environ.get('QEMU_OPTIONS', '').strip().split(' ')
|
||||
|
||||
+qsd_prog = os.environ.get('QSD_PROG', 'qemu-storage-daemon')
|
||||
+
|
||||
gdb_qemu_env = os.environ.get('GDB_OPTIONS')
|
||||
qemu_gdb = []
|
||||
if gdb_qemu_env:
|
||||
@@ -312,6 +314,44 @@ def cmd(self, cmd):
|
||||
return self._read_output()
|
||||
|
||||
|
||||
+class QemuStorageDaemon:
|
||||
+ def __init__(self, *args: str, instance_id: str = 'a'):
|
||||
+ assert '--pidfile' not in args
|
||||
+ self.pidfile = os.path.join(test_dir, f'qsd-{instance_id}-pid')
|
||||
+ all_args = [qsd_prog] + list(args) + ['--pidfile', self.pidfile]
|
||||
+
|
||||
+ # Cannot use with here, we want the subprocess to stay around
|
||||
+ # pylint: disable=consider-using-with
|
||||
+ self._p = subprocess.Popen(all_args)
|
||||
+ while not os.path.exists(self.pidfile):
|
||||
+ if self._p.poll() is not None:
|
||||
+ cmd = ' '.join(all_args)
|
||||
+ raise RuntimeError(
|
||||
+ 'qemu-storage-daemon terminated with exit code ' +
|
||||
+ f'{self._p.returncode}: {cmd}')
|
||||
+
|
||||
+ time.sleep(0.01)
|
||||
+
|
||||
+ with open(self.pidfile, encoding='utf-8') as f:
|
||||
+ self._pid = int(f.read().strip())
|
||||
+
|
||||
+ assert self._pid == self._p.pid
|
||||
+
|
||||
+ def stop(self, kill_signal=15):
|
||||
+ self._p.send_signal(kill_signal)
|
||||
+ self._p.wait()
|
||||
+ self._p = None
|
||||
+
|
||||
+ try:
|
||||
+ os.remove(self.pidfile)
|
||||
+ except OSError:
|
||||
+ pass
|
||||
+
|
||||
+ def __del__(self):
|
||||
+ if self._p is not None:
|
||||
+ self.stop(kill_signal=9)
|
||||
+
|
||||
+
|
||||
def qemu_nbd(*args):
|
||||
'''Run qemu-nbd in daemon mode and return the parent's exit code'''
|
||||
return subprocess.call(qemu_nbd_args + ['--fork'] + list(args))
|
||||
--
|
||||
2.27.0
|
||||
|
62
SOURCES/kvm-kvm-don-t-use-perror-without-useful-errno.patch
Normal file
62
SOURCES/kvm-kvm-don-t-use-perror-without-useful-errno.patch
Normal file
@ -0,0 +1,62 @@
|
||||
From 9ddefaedf423ec03eadaf17496c14e0d7b2381c8 Mon Sep 17 00:00:00 2001
|
||||
From: Cornelia Huck <cohuck@redhat.com>
|
||||
Date: Thu, 28 Jul 2022 16:24:46 +0200
|
||||
Subject: [PATCH 30/32] kvm: don't use perror() without useful errno
|
||||
|
||||
RH-Author: Cornelia Huck <cohuck@redhat.com>
|
||||
RH-MergeRequest: 110: kvm: don't use perror() without useful errno
|
||||
RH-Commit: [1/1] 20e51aac6767c1f89f74c7d692d1fb7689eff5f0 (cohuck/qemu-kvm-c9s)
|
||||
RH-Bugzilla: 2095608
|
||||
RH-Acked-by: Eric Auger <eric.auger@redhat.com>
|
||||
RH-Acked-by: Thomas Huth <thuth@redhat.com>
|
||||
RH-Acked-by: Gavin Shan <gshan@redhat.com>
|
||||
|
||||
perror() is designed to append the decoded errno value to a
|
||||
string. This, however, only makes sense if we called something that
|
||||
actually sets errno prior to that.
|
||||
|
||||
For the callers that check for split irqchip support that is not the
|
||||
case, and we end up with confusing error messages that end in
|
||||
"success". Use error_report() instead.
|
||||
|
||||
Signed-off-by: Cornelia Huck <cohuck@redhat.com>
|
||||
Message-Id: <20220728142446.438177-1-cohuck@redhat.com>
|
||||
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
|
||||
|
||||
https://bugzilla.redhat.com/show_bug.cgi?id=2095608
|
||||
(cherry picked from commit 47c182fe8b03c0c40059fb95840923e65c9bdb4f)
|
||||
Signed-off-by: Cornelia Huck <cohuck@redhat.com>
|
||||
---
|
||||
accel/kvm/kvm-all.c | 2 +-
|
||||
target/arm/kvm.c | 2 +-
|
||||
2 files changed, 2 insertions(+), 2 deletions(-)
|
||||
|
||||
diff --git a/accel/kvm/kvm-all.c b/accel/kvm/kvm-all.c
|
||||
index 5f1377ca04..e9c7947640 100644
|
||||
--- a/accel/kvm/kvm-all.c
|
||||
+++ b/accel/kvm/kvm-all.c
|
||||
@@ -2254,7 +2254,7 @@ static void kvm_irqchip_create(KVMState *s)
|
||||
ret = kvm_arch_irqchip_create(s);
|
||||
if (ret == 0) {
|
||||
if (s->kernel_irqchip_split == ON_OFF_AUTO_ON) {
|
||||
- perror("Split IRQ chip mode not supported.");
|
||||
+ error_report("Split IRQ chip mode not supported.");
|
||||
exit(1);
|
||||
} else {
|
||||
ret = kvm_vm_ioctl(s, KVM_CREATE_IRQCHIP);
|
||||
diff --git a/target/arm/kvm.c b/target/arm/kvm.c
|
||||
index bbf1ce7ba3..0a2ba1f8e3 100644
|
||||
--- a/target/arm/kvm.c
|
||||
+++ b/target/arm/kvm.c
|
||||
@@ -960,7 +960,7 @@ void kvm_arch_init_irq_routing(KVMState *s)
|
||||
int kvm_arch_irqchip_create(KVMState *s)
|
||||
{
|
||||
if (kvm_kernel_irqchip_split()) {
|
||||
- perror("-machine kernel_irqchip=split is not supported on ARM.");
|
||||
+ error_report("-machine kernel_irqchip=split is not supported on ARM.");
|
||||
exit(1);
|
||||
}
|
||||
|
||||
--
|
||||
2.31.1
|
||||
|
@ -1,17 +1,16 @@
|
||||
From 0cd0c916715c43f71cf249bafa2829b42aa67267 Mon Sep 17 00:00:00 2001
|
||||
From 49d9c9dced7278517105e9cfec34ea4af716432d Mon Sep 17 00:00:00 2001
|
||||
From: Stefan Hajnoczi <stefanha@redhat.com>
|
||||
Date: Thu, 9 Jun 2022 17:47:12 +0100
|
||||
Subject: [PATCH 2/2] linux-aio: explain why max batch is checked in
|
||||
Subject: [PATCH 6/6] linux-aio: explain why max batch is checked in
|
||||
laio_io_unplug()
|
||||
|
||||
RH-Author: Stefan Hajnoczi <stefanha@redhat.com>
|
||||
RH-MergeRequest: 210: linux-aio: fix unbalanced plugged counter in laio_io_unplug()
|
||||
RH-Bugzilla: 2109569
|
||||
RH-Acked-by: Hanna Reitz <hreitz@redhat.com>
|
||||
RH-MergeRequest: 102: linux-aio: fix unbalanced plugged counter in laio_io_unplug()
|
||||
RH-Commit: [2/2] b3d6421086bde50d4baad2343b2df89c5f66950e (stefanha/centos-stream-qemu-kvm)
|
||||
RH-Bugzilla: 2092788
|
||||
RH-Acked-by: Miroslav Rezanina <mrezanin@redhat.com>
|
||||
RH-Acked-by: Kevin Wolf <kwolf@redhat.com>
|
||||
RH-Acked-by: Stefano Garzarella <sgarzare@redhat.com>
|
||||
RH-Acked-by: Alberto Faria <None>
|
||||
RH-Commit: [2/2] caed03e006e8004d3c0670b24e4454a94274d7d9
|
||||
|
||||
It may not be obvious why laio_io_unplug() checks max batch. I discussed
|
||||
this with Stefano and have added a comment summarizing the reason.
|
||||
@ -29,10 +28,10 @@ Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
|
||||
1 file changed, 6 insertions(+)
|
||||
|
||||
diff --git a/block/linux-aio.c b/block/linux-aio.c
|
||||
index 77f17ad596..85650c4222 100644
|
||||
index 6078da7e42..9c2393a2f7 100644
|
||||
--- a/block/linux-aio.c
|
||||
+++ b/block/linux-aio.c
|
||||
@@ -362,6 +362,12 @@ void laio_io_unplug(BlockDriverState *bs, LinuxAioState *s,
|
||||
@@ -365,6 +365,12 @@ void laio_io_unplug(BlockDriverState *bs, LinuxAioState *s,
|
||||
assert(s->io_q.plugged);
|
||||
s->io_q.plugged--;
|
||||
|
||||
|
@ -1,17 +1,16 @@
|
||||
From 9c5a68878b3c6ec16c94dfcfe388a830df8deb2f Mon Sep 17 00:00:00 2001
|
||||
From e7326c3a7e0fc022aa5c0ae07bc1e19ad1b6f2ed Mon Sep 17 00:00:00 2001
|
||||
From: Stefan Hajnoczi <stefanha@redhat.com>
|
||||
Date: Thu, 9 Jun 2022 17:47:11 +0100
|
||||
Subject: [PATCH 1/2] linux-aio: fix unbalanced plugged counter in
|
||||
Subject: [PATCH 5/6] linux-aio: fix unbalanced plugged counter in
|
||||
laio_io_unplug()
|
||||
|
||||
RH-Author: Stefan Hajnoczi <stefanha@redhat.com>
|
||||
RH-MergeRequest: 210: linux-aio: fix unbalanced plugged counter in laio_io_unplug()
|
||||
RH-Bugzilla: 2109569
|
||||
RH-Acked-by: Hanna Reitz <hreitz@redhat.com>
|
||||
RH-MergeRequest: 102: linux-aio: fix unbalanced plugged counter in laio_io_unplug()
|
||||
RH-Commit: [1/2] 8a71da371c72521f1d70b8767ee564575e0d522b (stefanha/centos-stream-qemu-kvm)
|
||||
RH-Bugzilla: 2092788
|
||||
RH-Acked-by: Miroslav Rezanina <mrezanin@redhat.com>
|
||||
RH-Acked-by: Kevin Wolf <kwolf@redhat.com>
|
||||
RH-Acked-by: Stefano Garzarella <sgarzare@redhat.com>
|
||||
RH-Acked-by: Alberto Faria <None>
|
||||
RH-Commit: [1/2] bc1fa9b401cffb712f09935aba861d1a0bf74421
|
||||
|
||||
Every laio_io_plug() call has a matching laio_io_unplug() call. There is
|
||||
a plugged counter that tracks the number of levels of plugging and
|
||||
@ -37,10 +36,10 @@ Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
|
||||
1 file changed, 3 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/block/linux-aio.c b/block/linux-aio.c
|
||||
index f53ae72e21..77f17ad596 100644
|
||||
index 4c423fcccf..6078da7e42 100644
|
||||
--- a/block/linux-aio.c
|
||||
+++ b/block/linux-aio.c
|
||||
@@ -360,8 +360,10 @@ void laio_io_unplug(BlockDriverState *bs, LinuxAioState *s,
|
||||
@@ -363,8 +363,10 @@ void laio_io_unplug(BlockDriverState *bs, LinuxAioState *s,
|
||||
uint64_t dev_max_batch)
|
||||
{
|
||||
assert(s->io_q.plugged);
|
||||
|
@ -1,97 +0,0 @@
|
||||
From b169059c8fbf15c3ffeec0f68b938cb9febd8db7 Mon Sep 17 00:00:00 2001
|
||||
From: Peter Xu <peterx@redhat.com>
|
||||
Date: Tue, 30 Nov 2021 16:00:28 +0800
|
||||
Subject: [PATCH 5/6] memory: Fix incorrect calls of log_global_start/stop
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
RH-Author: Peter Xu <peterx@redhat.com>
|
||||
RH-MergeRequest: 77: memory: Fix qemu crash on continuous migrations of stopped VM
|
||||
RH-Commit: [1/2] 6271ee689266b24d29d4c87f60e5b096ef5f5d63 (peterx/qemu-kvm)
|
||||
RH-Bugzilla: 2044818
|
||||
RH-Acked-by: Paolo Bonzini <None>
|
||||
RH-Acked-by: David Hildenbrand <david@redhat.com>
|
||||
RH-Acked-by: quintela1 <quintela@redhat.com>
|
||||
|
||||
We should only call the log_global_start/stop when the global dirty track
|
||||
bitmask changes from zero<->non-zero.
|
||||
|
||||
No real issue reported for this yet probably because no immediate user to
|
||||
enable both dirty rate measurement and migration at the same time. However
|
||||
it'll be good to be prepared for it.
|
||||
|
||||
Fixes: 63b41db4bc ("memory: make global_dirty_tracking a bitmask")
|
||||
Cc: qemu-stable@nongnu.org
|
||||
Cc: Hyman Huang <huangy81@chinatelecom.cn>
|
||||
Cc: Paolo Bonzini <pbonzini@redhat.com>
|
||||
Cc: Dr. David Alan Gilbert <dgilbert@redhat.com>
|
||||
Cc: Juan Quintela <quintela@redhat.com>
|
||||
Cc: David Hildenbrand <david@redhat.com>
|
||||
Signed-off-by: Peter Xu <peterx@redhat.com>
|
||||
Reviewed-by: David Hildenbrand <david@redhat.com>
|
||||
Message-Id: <20211130080028.6474-1-peterx@redhat.com>
|
||||
Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
|
||||
(cherry picked from commit 7b0538ed3a22ce30817f818449d10701fb0821f9)
|
||||
Signed-off-by: Peter Xu <peterx@redhat.com>
|
||||
---
|
||||
softmmu/memory.c | 27 ++++++++++++++-------------
|
||||
1 file changed, 14 insertions(+), 13 deletions(-)
|
||||
|
||||
diff --git a/softmmu/memory.c b/softmmu/memory.c
|
||||
index 7340e19ff5..81d4bf1454 100644
|
||||
--- a/softmmu/memory.c
|
||||
+++ b/softmmu/memory.c
|
||||
@@ -2773,6 +2773,8 @@ static VMChangeStateEntry *vmstate_change;
|
||||
|
||||
void memory_global_dirty_log_start(unsigned int flags)
|
||||
{
|
||||
+ unsigned int old_flags = global_dirty_tracking;
|
||||
+
|
||||
if (vmstate_change) {
|
||||
qemu_del_vm_change_state_handler(vmstate_change);
|
||||
vmstate_change = NULL;
|
||||
@@ -2781,15 +2783,14 @@ void memory_global_dirty_log_start(unsigned int flags)
|
||||
assert(flags && !(flags & (~GLOBAL_DIRTY_MASK)));
|
||||
assert(!(global_dirty_tracking & flags));
|
||||
global_dirty_tracking |= flags;
|
||||
-
|
||||
trace_global_dirty_changed(global_dirty_tracking);
|
||||
|
||||
- MEMORY_LISTENER_CALL_GLOBAL(log_global_start, Forward);
|
||||
-
|
||||
- /* Refresh DIRTY_MEMORY_MIGRATION bit. */
|
||||
- memory_region_transaction_begin();
|
||||
- memory_region_update_pending = true;
|
||||
- memory_region_transaction_commit();
|
||||
+ if (!old_flags) {
|
||||
+ MEMORY_LISTENER_CALL_GLOBAL(log_global_start, Forward);
|
||||
+ memory_region_transaction_begin();
|
||||
+ memory_region_update_pending = true;
|
||||
+ memory_region_transaction_commit();
|
||||
+ }
|
||||
}
|
||||
|
||||
static void memory_global_dirty_log_do_stop(unsigned int flags)
|
||||
@@ -2800,12 +2801,12 @@ static void memory_global_dirty_log_do_stop(unsigned int flags)
|
||||
|
||||
trace_global_dirty_changed(global_dirty_tracking);
|
||||
|
||||
- /* Refresh DIRTY_MEMORY_MIGRATION bit. */
|
||||
- memory_region_transaction_begin();
|
||||
- memory_region_update_pending = true;
|
||||
- memory_region_transaction_commit();
|
||||
-
|
||||
- MEMORY_LISTENER_CALL_GLOBAL(log_global_stop, Reverse);
|
||||
+ if (!global_dirty_tracking) {
|
||||
+ memory_region_transaction_begin();
|
||||
+ memory_region_update_pending = true;
|
||||
+ memory_region_transaction_commit();
|
||||
+ MEMORY_LISTENER_CALL_GLOBAL(log_global_stop, Reverse);
|
||||
+ }
|
||||
}
|
||||
|
||||
static void memory_vm_change_state_handler(void *opaque, bool running,
|
||||
--
|
||||
2.27.0
|
||||
|
@ -1,156 +0,0 @@
|
||||
From b3ed8e344c733bc8c2223c1b9e424a9fbcea56d4 Mon Sep 17 00:00:00 2001
|
||||
From: Peter Xu <peterx@redhat.com>
|
||||
Date: Mon, 7 Feb 2022 20:30:19 +0800
|
||||
Subject: [PATCH 6/6] memory: Fix qemu crash on starting dirty log twice with
|
||||
stopped VM
|
||||
|
||||
RH-Author: Peter Xu <peterx@redhat.com>
|
||||
RH-MergeRequest: 77: memory: Fix qemu crash on continuous migrations of stopped VM
|
||||
RH-Commit: [2/2] 98ed2ef6226ec80a1896ebb554015aded0dc0c18 (peterx/qemu-kvm)
|
||||
RH-Bugzilla: 2044818
|
||||
RH-Acked-by: Paolo Bonzini <None>
|
||||
RH-Acked-by: David Hildenbrand <david@redhat.com>
|
||||
RH-Acked-by: quintela1 <quintela@redhat.com>
|
||||
|
||||
QEMU can now easily crash with two continuous migration carried out:
|
||||
|
||||
(qemu) migrate -d exec:cat>out
|
||||
(qemu) migrate_cancel
|
||||
(qemu) migrate -d exec:cat>out
|
||||
[crash] ../softmmu/memory.c:2782: memory_global_dirty_log_start: Assertion
|
||||
`!(global_dirty_tracking & flags)' failed.
|
||||
|
||||
It's because memory API provides a way to postpone dirty log stop if the VM is
|
||||
stopped, and that'll be re-done until the next VM start. It was added in 2017
|
||||
with commit 1931076077 ("migration: optimize the downtime", 2017-08-01).
|
||||
|
||||
However the recent work on allowing dirty tracking to be bitmask broke it,
|
||||
which is commit 63b41db4bc ("memory: make global_dirty_tracking a bitmask",
|
||||
2021-11-01).
|
||||
|
||||
The fix proposed in this patch contains two things:
|
||||
|
||||
(1) Instead of passing over the flags to postpone stop dirty track, we add a
|
||||
global variable (along with current vmstate_change variable) to record
|
||||
what flags to stop dirty tracking.
|
||||
|
||||
(2) When start dirty tracking, instead if remove the vmstate hook directly,
|
||||
we also execute the postponed stop process so that we make sure all the
|
||||
starts and stops will be paired.
|
||||
|
||||
This procedure is overlooked in the bitmask-ify work in 2021.
|
||||
|
||||
Cc: Hyman Huang <huangy81@chinatelecom.cn>
|
||||
Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=2044818
|
||||
Fixes: 63b41db4bc ("memory: make global_dirty_tracking a bitmask")
|
||||
Signed-off-by: Peter Xu <peterx@redhat.com>
|
||||
Message-Id: <20220207123019.27223-1-peterx@redhat.com>
|
||||
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
|
||||
(cherry picked from commit a5c90c61a118027b86155cffdf4fe4e2e9de1020)
|
||||
Signed-off-by: Peter Xu <peterx@redhat.com>
|
||||
---
|
||||
softmmu/memory.c | 61 +++++++++++++++++++++++++++++++++++-------------
|
||||
1 file changed, 45 insertions(+), 16 deletions(-)
|
||||
|
||||
diff --git a/softmmu/memory.c b/softmmu/memory.c
|
||||
index 81d4bf1454..0311e362ee 100644
|
||||
--- a/softmmu/memory.c
|
||||
+++ b/softmmu/memory.c
|
||||
@@ -2769,19 +2769,32 @@ void memory_global_after_dirty_log_sync(void)
|
||||
MEMORY_LISTENER_CALL_GLOBAL(log_global_after_sync, Forward);
|
||||
}
|
||||
|
||||
+/*
|
||||
+ * Dirty track stop flags that are postponed due to VM being stopped. Should
|
||||
+ * only be used within vmstate_change hook.
|
||||
+ */
|
||||
+static unsigned int postponed_stop_flags;
|
||||
static VMChangeStateEntry *vmstate_change;
|
||||
+static void memory_global_dirty_log_stop_postponed_run(void);
|
||||
|
||||
void memory_global_dirty_log_start(unsigned int flags)
|
||||
{
|
||||
- unsigned int old_flags = global_dirty_tracking;
|
||||
+ unsigned int old_flags;
|
||||
+
|
||||
+ assert(flags && !(flags & (~GLOBAL_DIRTY_MASK)));
|
||||
|
||||
if (vmstate_change) {
|
||||
- qemu_del_vm_change_state_handler(vmstate_change);
|
||||
- vmstate_change = NULL;
|
||||
+ /* If there is postponed stop(), operate on it first */
|
||||
+ postponed_stop_flags &= ~flags;
|
||||
+ memory_global_dirty_log_stop_postponed_run();
|
||||
}
|
||||
|
||||
- assert(flags && !(flags & (~GLOBAL_DIRTY_MASK)));
|
||||
- assert(!(global_dirty_tracking & flags));
|
||||
+ flags &= ~global_dirty_tracking;
|
||||
+ if (!flags) {
|
||||
+ return;
|
||||
+ }
|
||||
+
|
||||
+ old_flags = global_dirty_tracking;
|
||||
global_dirty_tracking |= flags;
|
||||
trace_global_dirty_changed(global_dirty_tracking);
|
||||
|
||||
@@ -2809,29 +2822,45 @@ static void memory_global_dirty_log_do_stop(unsigned int flags)
|
||||
}
|
||||
}
|
||||
|
||||
+/*
|
||||
+ * Execute the postponed dirty log stop operations if there is, then reset
|
||||
+ * everything (including the flags and the vmstate change hook).
|
||||
+ */
|
||||
+static void memory_global_dirty_log_stop_postponed_run(void)
|
||||
+{
|
||||
+ /* This must be called with the vmstate handler registered */
|
||||
+ assert(vmstate_change);
|
||||
+
|
||||
+ /* Note: postponed_stop_flags can be cleared in log start routine */
|
||||
+ if (postponed_stop_flags) {
|
||||
+ memory_global_dirty_log_do_stop(postponed_stop_flags);
|
||||
+ postponed_stop_flags = 0;
|
||||
+ }
|
||||
+
|
||||
+ qemu_del_vm_change_state_handler(vmstate_change);
|
||||
+ vmstate_change = NULL;
|
||||
+}
|
||||
+
|
||||
static void memory_vm_change_state_handler(void *opaque, bool running,
|
||||
RunState state)
|
||||
{
|
||||
- unsigned int flags = (unsigned int)(uintptr_t)opaque;
|
||||
if (running) {
|
||||
- memory_global_dirty_log_do_stop(flags);
|
||||
-
|
||||
- if (vmstate_change) {
|
||||
- qemu_del_vm_change_state_handler(vmstate_change);
|
||||
- vmstate_change = NULL;
|
||||
- }
|
||||
+ memory_global_dirty_log_stop_postponed_run();
|
||||
}
|
||||
}
|
||||
|
||||
void memory_global_dirty_log_stop(unsigned int flags)
|
||||
{
|
||||
if (!runstate_is_running()) {
|
||||
+ /* Postpone the dirty log stop, e.g., to when VM starts again */
|
||||
if (vmstate_change) {
|
||||
- return;
|
||||
+ /* Batch with previous postponed flags */
|
||||
+ postponed_stop_flags |= flags;
|
||||
+ } else {
|
||||
+ postponed_stop_flags = flags;
|
||||
+ vmstate_change = qemu_add_vm_change_state_handler(
|
||||
+ memory_vm_change_state_handler, NULL);
|
||||
}
|
||||
- vmstate_change = qemu_add_vm_change_state_handler(
|
||||
- memory_vm_change_state_handler,
|
||||
- (void *)(uintptr_t)flags);
|
||||
return;
|
||||
}
|
||||
|
||||
--
|
||||
2.27.0
|
||||
|
154
SOURCES/kvm-meson-create-have_vhost_-variables.patch
Normal file
154
SOURCES/kvm-meson-create-have_vhost_-variables.patch
Normal file
@ -0,0 +1,154 @@
|
||||
From 51c310097832724bafac26aed81399da40128400 Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Eugenio=20P=C3=A9rez?= <eperezma@redhat.com>
|
||||
Date: Thu, 21 Jul 2022 15:50:43 +0200
|
||||
Subject: [PATCH 05/32] meson: create have_vhost_* variables
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
RH-Author: Eugenio Pérez <eperezma@redhat.com>
|
||||
RH-MergeRequest: 108: Net Control Virtqueue shadow Support
|
||||
RH-Commit: [5/27] 3b30f89e6d639923dc9d9a92a4261bb4509e5c83 (eperezmartin/qemu-kvm)
|
||||
RH-Bugzilla: 1939363
|
||||
RH-Acked-by: Stefano Garzarella <sgarzare@redhat.com>
|
||||
RH-Acked-by: Cindy Lu <lulu@redhat.com>
|
||||
RH-Acked-by: Laurent Vivier <lvivier@redhat.com>
|
||||
|
||||
Bugzilla: https://bugzilla.redhat.com/1939363
|
||||
|
||||
Upstream Status: git://git.qemu.org/qemu.git
|
||||
|
||||
commit 2a3129a37652e5e81d12f6e16dd3c447f09831f9
|
||||
Author: Paolo Bonzini <pbonzini@redhat.com>
|
||||
Date: Wed Apr 20 17:34:05 2022 +0200
|
||||
|
||||
meson: create have_vhost_* variables
|
||||
|
||||
When using Meson options rather than config-host.h, the "when" clauses
|
||||
have to be changed to if statements (which is not necessarily great,
|
||||
though at least it highlights which parts of the build are per-target
|
||||
and which are not).
|
||||
|
||||
Do that before moving vhost logic to meson.build, though for now
|
||||
the variables are just based on config-host.mak data.
|
||||
|
||||
Reviewed-by: Marc-André Lureau <marcandre.lureau@redhat.com>
|
||||
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
|
||||
|
||||
Signed-off-by: Eugenio Pérez <eperezma@redhat.com>
|
||||
---
|
||||
meson.build | 30 ++++++++++++++++++++----------
|
||||
tests/meson.build | 2 +-
|
||||
tools/meson.build | 2 +-
|
||||
3 files changed, 22 insertions(+), 12 deletions(-)
|
||||
|
||||
diff --git a/meson.build b/meson.build
|
||||
index 13e3323380..735f538497 100644
|
||||
--- a/meson.build
|
||||
+++ b/meson.build
|
||||
@@ -298,6 +298,15 @@ have_tpm = get_option('tpm') \
|
||||
.require(targetos != 'windows', error_message: 'TPM emulation only available on POSIX systems') \
|
||||
.allowed()
|
||||
|
||||
+# vhost
|
||||
+have_vhost_user = 'CONFIG_VHOST_USER' in config_host
|
||||
+have_vhost_vdpa = 'CONFIG_VHOST_VDPA' in config_host
|
||||
+have_vhost_kernel = 'CONFIG_VHOST_KERNEL' in config_host
|
||||
+have_vhost_net_user = 'CONFIG_VHOST_NET_USER' in config_host
|
||||
+have_vhost_net_vdpa = 'CONFIG_VHOST_NET_VDPA' in config_host
|
||||
+have_vhost_net = 'CONFIG_VHOST_NET' in config_host
|
||||
+have_vhost_user_crypto = 'CONFIG_VHOST_CRYPTO' in config_host
|
||||
+
|
||||
# Target-specific libraries and flags
|
||||
libm = cc.find_library('m', required: false)
|
||||
threads = dependency('threads')
|
||||
@@ -1335,7 +1344,7 @@ has_statx_mnt_id = cc.links(statx_mnt_id_test)
|
||||
have_vhost_user_blk_server = get_option('vhost_user_blk_server') \
|
||||
.require(targetos == 'linux',
|
||||
error_message: 'vhost_user_blk_server requires linux') \
|
||||
- .require('CONFIG_VHOST_USER' in config_host,
|
||||
+ .require(have_vhost_user,
|
||||
error_message: 'vhost_user_blk_server requires vhost-user support') \
|
||||
.disable_auto_if(not have_system) \
|
||||
.allowed()
|
||||
@@ -2116,9 +2125,9 @@ host_kconfig = \
|
||||
(have_ivshmem ? ['CONFIG_IVSHMEM=y'] : []) + \
|
||||
('CONFIG_OPENGL' in config_host ? ['CONFIG_OPENGL=y'] : []) + \
|
||||
(x11.found() ? ['CONFIG_X11=y'] : []) + \
|
||||
- ('CONFIG_VHOST_USER' in config_host ? ['CONFIG_VHOST_USER=y'] : []) + \
|
||||
- ('CONFIG_VHOST_VDPA' in config_host ? ['CONFIG_VHOST_VDPA=y'] : []) + \
|
||||
- ('CONFIG_VHOST_KERNEL' in config_host ? ['CONFIG_VHOST_KERNEL=y'] : []) + \
|
||||
+ (have_vhost_user ? ['CONFIG_VHOST_USER=y'] : []) + \
|
||||
+ (have_vhost_vdpa ? ['CONFIG_VHOST_VDPA=y'] : []) + \
|
||||
+ (have_vhost_kernel ? ['CONFIG_VHOST_KERNEL=y'] : []) + \
|
||||
(have_virtfs ? ['CONFIG_VIRTFS=y'] : []) + \
|
||||
('CONFIG_LINUX' in config_host ? ['CONFIG_LINUX=y'] : []) + \
|
||||
('CONFIG_PVRDMA' in config_host ? ['CONFIG_PVRDMA=y'] : []) + \
|
||||
@@ -2799,7 +2808,7 @@ if have_system or have_user
|
||||
endif
|
||||
|
||||
vhost_user = not_found
|
||||
-if targetos == 'linux' and 'CONFIG_VHOST_USER' in config_host
|
||||
+if targetos == 'linux' and have_vhost_user
|
||||
libvhost_user = subproject('libvhost-user')
|
||||
vhost_user = libvhost_user.get_variable('vhost_user_dep')
|
||||
endif
|
||||
@@ -3386,7 +3395,7 @@ if have_tools
|
||||
dependencies: qemuutil,
|
||||
install: true)
|
||||
|
||||
- if 'CONFIG_VHOST_USER' in config_host
|
||||
+ if have_vhost_user
|
||||
subdir('contrib/vhost-user-blk')
|
||||
subdir('contrib/vhost-user-gpu')
|
||||
subdir('contrib/vhost-user-input')
|
||||
@@ -3516,15 +3525,16 @@ if 'simple' in get_option('trace_backends')
|
||||
endif
|
||||
summary_info += {'D-Bus display': dbus_display}
|
||||
summary_info += {'QOM debugging': get_option('qom_cast_debug')}
|
||||
-summary_info += {'vhost-kernel support': config_host.has_key('CONFIG_VHOST_KERNEL')}
|
||||
-summary_info += {'vhost-net support': config_host.has_key('CONFIG_VHOST_NET')}
|
||||
-summary_info += {'vhost-crypto support': config_host.has_key('CONFIG_VHOST_CRYPTO')}
|
||||
+summary_info += {'vhost-kernel support': have_vhost_kernel}
|
||||
+summary_info += {'vhost-net support': have_vhost_net}
|
||||
+summary_info += {'vhost-user support': have_vhost_user}
|
||||
+summary_info += {'vhost-user-crypto support': have_vhost_user_crypto}
|
||||
summary_info += {'vhost-scsi support': config_host.has_key('CONFIG_VHOST_SCSI')}
|
||||
summary_info += {'vhost-vsock support': config_host.has_key('CONFIG_VHOST_VSOCK')}
|
||||
-summary_info += {'vhost-user support': config_host.has_key('CONFIG_VHOST_USER')}
|
||||
summary_info += {'vhost-user-blk server support': have_vhost_user_blk_server}
|
||||
summary_info += {'vhost-user-fs support': config_host.has_key('CONFIG_VHOST_USER_FS')}
|
||||
summary_info += {'vhost-vdpa support': config_host.has_key('CONFIG_VHOST_VDPA')}
|
||||
+summary_info += {'vhost-vdpa support': have_vhost_vdpa}
|
||||
summary_info += {'build guest agent': have_ga}
|
||||
summary(summary_info, bool_yn: true, section: 'Configurable features')
|
||||
|
||||
diff --git a/tests/meson.build b/tests/meson.build
|
||||
index 1d05109eb4..bbe41c8559 100644
|
||||
--- a/tests/meson.build
|
||||
+++ b/tests/meson.build
|
||||
@@ -70,7 +70,7 @@ test_deps = {
|
||||
'test-qht-par': qht_bench,
|
||||
}
|
||||
|
||||
-if have_tools and 'CONFIG_VHOST_USER' in config_host and 'CONFIG_LINUX' in config_host
|
||||
+if have_tools and have_vhost_user and 'CONFIG_LINUX' in config_host
|
||||
executable('vhost-user-bridge',
|
||||
sources: files('vhost-user-bridge.c'),
|
||||
dependencies: [qemuutil, vhost_user])
|
||||
diff --git a/tools/meson.build b/tools/meson.build
|
||||
index 46977af84f..10eb3a043f 100644
|
||||
--- a/tools/meson.build
|
||||
+++ b/tools/meson.build
|
||||
@@ -3,7 +3,7 @@ have_virtiofsd = get_option('virtiofsd') \
|
||||
error_message: 'virtiofsd requires Linux') \
|
||||
.require(seccomp.found() and libcap_ng.found(),
|
||||
error_message: 'virtiofsd requires libcap-ng-devel and seccomp-devel') \
|
||||
- .require('CONFIG_VHOST_USER' in config_host,
|
||||
+ .require(have_vhost_user,
|
||||
error_message: 'virtiofsd needs vhost-user-support') \
|
||||
.disable_auto_if(not have_tools and not have_system) \
|
||||
.allowed()
|
||||
--
|
||||
2.31.1
|
||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user