temporary rebase for 8.3.0
This commit is contained in:
parent
f2ba548f96
commit
d0bd08660b
14
.gitignore
vendored
14
.gitignore
vendored
@ -1 +1,13 @@
|
||||
/qemu-*.tar.xz
|
||||
/qemu-3.1.0.tar.xz
|
||||
/qemu-4.0.0.tar.xz
|
||||
/qemu-4.1.0-rc4.tar.xz
|
||||
/qemu-4.1.0.tar.xz
|
||||
/qemu-4.2.0-rc1.tar.xz
|
||||
/qemu-4.2.0-rc4.tar.xz
|
||||
/qemu-4.2.0.tar.xz
|
||||
/qemu-5.0.0-rc0.tar.xz
|
||||
/qemu-5.0.0-rc1.tar.xz
|
||||
/qemu-5.0.0-rc2.tar.xz
|
||||
/qemu-5.0.0-rc3.tar.xz
|
||||
/qemu-5.0.0-rc4.tar.xz
|
||||
/qemu-5.0.0.tar.xz
|
||||
|
16975
0001-redhat-Adding-slirp-to-the-exploded-tree.patch
Normal file
16975
0001-redhat-Adding-slirp-to-the-exploded-tree.patch
Normal file
File diff suppressed because it is too large
Load Diff
@ -1,4 +1,4 @@
|
||||
From 4df157781801c50224373be57fa3c8c3741c0535 Mon Sep 17 00:00:00 2001
|
||||
From 4b7f57db366243eeafc0528d3cff4fa6967e7522 Mon Sep 17 00:00:00 2001
|
||||
From: Miroslav Rezanina <mrezanin@redhat.com>
|
||||
Date: Fri, 12 Oct 2018 07:31:11 +0200
|
||||
Subject: Initial redhat build
|
||||
@ -10,10 +10,8 @@ several issues are fixed in QEMU tree:
|
||||
- As we use qemu-kvm as name in all places, this is updated to be consistent
|
||||
- Man page renamed from qemu to qemu-kvm
|
||||
- man page is installed using make install so we have to fix it in qemu tree
|
||||
- Use "/share/qemu-kvm" as SHARE_SUFFIX
|
||||
- We reconfigured our share to qemu-kvm to be consistent with used name
|
||||
|
||||
This rebase includes changes up to qemu-kvm-4.1.0-18.el8
|
||||
This rebase includes changes up to qemu-kvm-4.2.0-20.el8
|
||||
|
||||
Rebase notes (3.1.0):
|
||||
- added new configure options
|
||||
@ -49,6 +47,44 @@ Rebase notes (4.2.0):
|
||||
- Removed spapr-rtas.bin (upstream)
|
||||
- Require newer SLOF (20191022)
|
||||
|
||||
Rebase notes (weekly-200115):
|
||||
- Added index.html (upstream)
|
||||
|
||||
Rebase notes (weekly-200122):
|
||||
- Use python3 for virtio_seg_max_adjust.py test
|
||||
- Removed qemu-trace-stap shebang from spec file
|
||||
|
||||
Rebase notes (weekly-200129):
|
||||
- Ship docs/qemu-kvm/system help files (added upstream)
|
||||
|
||||
Rebase notes (weekly-200212):
|
||||
- Added virtiofsd.1 (upstream)
|
||||
|
||||
Rebase notes (weekly-200219):
|
||||
- Use out-of-tree build
|
||||
|
||||
Rebase notes (weekly-200226):
|
||||
- added tools documentation (upstream)
|
||||
|
||||
Rebase notes (weekly-200304):
|
||||
- Update local build
|
||||
|
||||
Rebase notes (weekly-200311):
|
||||
- Add docs/qemu-kvm/user help files (added upstream)
|
||||
- Removing installed qemu-storage-daemon (added upstream)
|
||||
|
||||
Rebase notes (weekly-200318):
|
||||
- Removing opensbi-riscv32-sifive_u-fw_jump.bin (added upstream)
|
||||
|
||||
Rebase notes (weekly-200325):
|
||||
- Disable iotests (moved from Enable make check commit)
|
||||
|
||||
Rebase notes (5.0.0 rc2):
|
||||
- Added missing configure options
|
||||
|
||||
Rebase notes (5.0.0 rc3):
|
||||
- Reorder configure options
|
||||
|
||||
Merged patches (3.1.0):
|
||||
- 01f0c9f RHEL8: Add disable configure options to qemu spec file
|
||||
- Spec file cleanups
|
||||
@ -71,30 +107,35 @@ Merged patches (4.2.0):
|
||||
- 69e1fb2 enable virgla
|
||||
- d4f6115 enable virgl, for real this time ...
|
||||
|
||||
Signed-off-by: Danilo C. L. de Paula <ddepaula@redhat.com>
|
||||
Merged patches (weekly-200205):
|
||||
- 5edf6bd Add support for rh-brew-module
|
||||
- f77d52d redhat: ship virtiofsd vhost-user device backend
|
||||
|
||||
Conflicts:
|
||||
gdbstub.c
|
||||
---
|
||||
.gitignore | 1 +
|
||||
Makefile | 3 +-
|
||||
configure | 1 +
|
||||
os-posix.c | 2 +-
|
||||
redhat/Makefile | 82 +
|
||||
redhat/Makefile.common | 51 +
|
||||
redhat/README.tests | 39 +
|
||||
redhat/qemu-kvm.spec.template | 2434 +++++++++++++++++++++++++++++
|
||||
redhat/scripts/process-patches.sh | 7 +-
|
||||
tests/Makefile.include | 2 +-
|
||||
ui/vnc.c | 2 +-
|
||||
11 files changed, 2615 insertions(+), 9 deletions(-)
|
||||
.gitignore | 1 +
|
||||
Makefile | 3 +-
|
||||
configure | 1 +
|
||||
redhat/Makefile | 88 ++
|
||||
redhat/Makefile.common | 51 +
|
||||
redhat/README.tests | 39 +
|
||||
redhat/qemu-kvm.spec.template | 2820 +++++++++++++++++++++++++++++++++++
|
||||
redhat/scripts/extract_build_cmd.py | 2 +-
|
||||
redhat/scripts/process-patches.sh | 7 +-
|
||||
tests/check-block.sh | 2 +
|
||||
ui/vnc.c | 2 +-
|
||||
11 files changed, 3008 insertions(+), 8 deletions(-)
|
||||
create mode 100644 redhat/Makefile
|
||||
create mode 100644 redhat/Makefile.common
|
||||
create mode 100644 redhat/README.tests
|
||||
create mode 100644 redhat/qemu-kvm.spec.template
|
||||
|
||||
diff --git a/Makefile b/Makefile
|
||||
index b437a346d7..086727dbb9 100644
|
||||
index 34275f5..aee2e8e 100644
|
||||
--- a/Makefile
|
||||
+++ b/Makefile
|
||||
@@ -512,6 +512,7 @@ CAP_CFLAGS += -DCAPSTONE_HAS_ARM
|
||||
@@ -548,6 +548,7 @@ CAP_CFLAGS += -DCAPSTONE_HAS_ARM
|
||||
CAP_CFLAGS += -DCAPSTONE_HAS_ARM64
|
||||
CAP_CFLAGS += -DCAPSTONE_HAS_POWERPC
|
||||
CAP_CFLAGS += -DCAPSTONE_HAS_X86
|
||||
@ -102,20 +143,20 @@ index b437a346d7..086727dbb9 100644
|
||||
|
||||
.PHONY: capstone/all
|
||||
capstone/all: .git-submodule-status
|
||||
@@ -826,7 +827,7 @@ install-doc: $(DOCS) install-sphinxdocs
|
||||
@@ -883,7 +884,7 @@ install-doc: $(DOCS) install-sphinxdocs
|
||||
$(INSTALL_DATA) docs/interop/qemu-qmp-ref.txt "$(DESTDIR)$(qemu_docdir)"
|
||||
ifdef CONFIG_POSIX
|
||||
$(INSTALL_DIR) "$(DESTDIR)$(mandir)/man1"
|
||||
- $(INSTALL_DATA) qemu.1 "$(DESTDIR)$(mandir)/man1"
|
||||
+ $(INSTALL_DATA) qemu.1 "$(DESTDIR)$(mandir)/man1/qemu-kvm.1"
|
||||
- $(INSTALL_DATA) $(MANUAL_BUILDDIR)/system/qemu.1 "$(DESTDIR)$(mandir)/man1"
|
||||
+ $(INSTALL_DATA) $(MANUAL_BUILDDIR)/system/qemu.1 "$(DESTDIR)$(mandir)/man1/qemu-kvm.1"
|
||||
$(INSTALL_DIR) "$(DESTDIR)$(mandir)/man7"
|
||||
$(INSTALL_DATA) docs/interop/qemu-qmp-ref.7 "$(DESTDIR)$(mandir)/man7"
|
||||
$(INSTALL_DATA) docs/qemu-block-drivers.7 "$(DESTDIR)$(mandir)/man7"
|
||||
$(INSTALL_DATA) $(MANUAL_BUILDDIR)/system/qemu-block-drivers.7 "$(DESTDIR)$(mandir)/man7"
|
||||
diff --git a/configure b/configure
|
||||
index 6099be1d84..16564f8ccc 100755
|
||||
index 23b5e93..1b40d7e 100755
|
||||
--- a/configure
|
||||
+++ b/configure
|
||||
@@ -2424,6 +2424,7 @@ if test "$seccomp" != "no" ; then
|
||||
@@ -2538,6 +2538,7 @@ if test "$seccomp" != "no" ; then
|
||||
seccomp="no"
|
||||
fi
|
||||
fi
|
||||
@ -123,37 +164,24 @@ index 6099be1d84..16564f8ccc 100755
|
||||
##########################################
|
||||
# xen probe
|
||||
|
||||
diff --git a/os-posix.c b/os-posix.c
|
||||
index 86cffd2c7d..1c9f86768d 100644
|
||||
--- a/os-posix.c
|
||||
+++ b/os-posix.c
|
||||
@@ -83,7 +83,7 @@ void os_setup_signal_handling(void)
|
||||
/* Find a likely location for support files using the location of the binary.
|
||||
For installed binaries this will be "$bindir/../share/qemu". When
|
||||
running from the build tree this will be "$bindir/../pc-bios". */
|
||||
-#define SHARE_SUFFIX "/share/qemu"
|
||||
+#define SHARE_SUFFIX "/share/qemu-kvm"
|
||||
#define BUILD_SUFFIX "/pc-bios"
|
||||
char *os_find_datadir(void)
|
||||
{
|
||||
diff --git a/tests/Makefile.include b/tests/Makefile.include
|
||||
index 8566f5f119..b483790cf3 100644
|
||||
--- a/tests/Makefile.include
|
||||
+++ b/tests/Makefile.include
|
||||
@@ -1194,7 +1194,7 @@ check-acceptance: check-venv $(TESTS_RESULTS_DIR)
|
||||
check-qapi-schema: check-tests/qapi-schema/frontend check-tests/qapi-schema/doc-good.texi
|
||||
check-qtest: $(patsubst %,check-qtest-%, $(QTEST_TARGETS))
|
||||
check-block: $(patsubst %,check-%, $(check-block-y))
|
||||
-check: check-block check-qapi-schema check-unit check-softfloat check-qtest check-decodetree
|
||||
+check: check-qapi-schema check-unit check-softfloat check-qtest check-decodetree
|
||||
check-clean:
|
||||
rm -rf $(check-unit-y) tests/*.o $(QEMU_IOTESTS_HELPERS-y)
|
||||
rm -rf $(sort $(foreach target,$(SYSEMU_TARGET_LIST), $(check-qtest-$(target)-y)) $(check-qtest-generic-y))
|
||||
diff --git a/tests/check-block.sh b/tests/check-block.sh
|
||||
index ad320c2..1f26083 100755
|
||||
--- a/tests/check-block.sh
|
||||
+++ b/tests/check-block.sh
|
||||
@@ -43,6 +43,8 @@ if ! (sed --version | grep 'GNU sed') > /dev/null 2>&1 ; then
|
||||
fi
|
||||
fi
|
||||
|
||||
+exit 0
|
||||
+
|
||||
cd tests/qemu-iotests
|
||||
|
||||
ret=0
|
||||
diff --git a/ui/vnc.c b/ui/vnc.c
|
||||
index 87b8045afe..ecf6276f5b 100644
|
||||
index 1d7138a..1fc55b7 100644
|
||||
--- a/ui/vnc.c
|
||||
+++ b/ui/vnc.c
|
||||
@@ -3987,7 +3987,7 @@ void vnc_display_open(const char *id, Error **errp)
|
||||
@@ -3972,7 +3972,7 @@ void vnc_display_open(const char *id, Error **errp)
|
||||
|
||||
#ifdef CONFIG_VNC_SASL
|
||||
if (sasl) {
|
||||
@ -163,5 +191,5 @@ index 87b8045afe..ecf6276f5b 100644
|
||||
if (saslErr != SASL_OK) {
|
||||
error_setg(errp, "Failed to initialize SASL auth: %s",
|
||||
--
|
||||
2.21.0
|
||||
1.8.3.1
|
||||
|
||||
|
@ -1,4 +1,4 @@
|
||||
From 67511676246cce57becbd2dcf5abccf08d9ef737 Mon Sep 17 00:00:00 2001
|
||||
From db33b6f22ff44edfb3ca54ef7bf051ccfc53e479 Mon Sep 17 00:00:00 2001
|
||||
From: Miroslav Rezanina <mrezanin@redhat.com>
|
||||
Date: Mon, 11 Jan 2016 11:53:33 +0100
|
||||
Subject: Enable/disable devices for RHEL
|
||||
@ -39,6 +39,12 @@ Rebase notes (4.2.0-rc3):
|
||||
- Disabled ccid-card-emulated (patch 92566)
|
||||
- Disabled vfio-pci-igd-lpc-bridge (patch 92565)
|
||||
|
||||
Rebase notes (weekly-200205):
|
||||
- added CONFIG_PCI_EXPRESS on ppc64 (due to upstream dependency)
|
||||
|
||||
Rebase notes (weekly-200226):
|
||||
- Added CONFIG_NVDIMM
|
||||
|
||||
Merged patches (qemu 3.1.0):
|
||||
- d51e082 Re-enable CONFIG_HYPERV_TESTDEV
|
||||
- 4b889f3 Declare cirrus-vga as deprecated
|
||||
@ -57,82 +63,72 @@ Merged patches (4.1.0):
|
||||
Merged patches (4.2.0):
|
||||
- f7587dd RHEL: disable hostmem-memfd
|
||||
|
||||
Signed-off-by: Danilo C. L. de Paula <ddepaula@redhat.com>
|
||||
Merged patches (weekly-200108):
|
||||
- 4543a3c i386: Remove cpu64-rhel6 CPU model
|
||||
|
||||
Conflicts:
|
||||
target/arm/cpu.c
|
||||
---
|
||||
Makefile.objs | 4 +-
|
||||
backends/Makefile.objs | 3 +-
|
||||
default-configs/aarch64-rh-devices.mak | 20 +++++
|
||||
default-configs/aarch64-softmmu.mak | 10 ++-
|
||||
default-configs/ppc64-rh-devices.mak | 32 ++++++++
|
||||
default-configs/ppc64-softmmu.mak | 8 +-
|
||||
default-configs/rh-virtio.mak | 10 +++
|
||||
default-configs/s390x-rh-devices.mak | 15 ++++
|
||||
default-configs/aarch64-rh-devices.mak | 21 +++++++
|
||||
default-configs/aarch64-softmmu.mak | 10 ++--
|
||||
default-configs/ppc64-rh-devices.mak | 34 +++++++++++
|
||||
default-configs/ppc64-softmmu.mak | 10 ++--
|
||||
default-configs/rh-virtio.mak | 10 ++++
|
||||
default-configs/s390x-rh-devices.mak | 15 +++++
|
||||
default-configs/s390x-softmmu.mak | 4 +-
|
||||
default-configs/x86_64-rh-devices.mak | 100 +++++++++++++++++++++++++
|
||||
default-configs/x86_64-rh-devices.mak | 100 +++++++++++++++++++++++++++++++++
|
||||
default-configs/x86_64-softmmu.mak | 4 +-
|
||||
hw/acpi/ich9.c | 4 +-
|
||||
hw/arm/Makefile.objs | 2 +-
|
||||
hw/block/fdc.c | 10 +++
|
||||
hw/bt/Makefile.objs | 4 +-
|
||||
hw/block/fdc.c | 10 ++++
|
||||
hw/bt/Makefile.objs | 3 +
|
||||
hw/cpu/Makefile.objs | 5 +-
|
||||
hw/display/Makefile.objs | 5 +-
|
||||
hw/display/cirrus_vga.c | 3 +
|
||||
hw/ide/piix.c | 5 +-
|
||||
hw/input/pckbd.c | 2 +
|
||||
hw/net/e1000.c | 2 +
|
||||
hw/pci-host/i440fx.c | 4 +
|
||||
hw/ppc/spapr_cpu_core.c | 2 +
|
||||
hw/usb/Makefile.objs | 4 +-
|
||||
hw/vfio/pci-quirks.c | 9 +++
|
||||
hw/vfio/pci.c | 5 ++
|
||||
qemu-options.hx | 7 +-
|
||||
qemu-options.hx | 4 --
|
||||
redhat/qemu-kvm.spec.template | 5 +-
|
||||
target/arm/cpu.c | 4 +-
|
||||
target/i386/cpu.c | 35 +++++++--
|
||||
target/ppc/cpu-models.c | 10 +++
|
||||
softmmu/vl.c | 2 +-
|
||||
target/arm/cpu.c | 3 +
|
||||
target/i386/cpu.c | 17 +++---
|
||||
target/ppc/cpu-models.c | 10 ++++
|
||||
target/s390x/cpu_models.c | 3 +
|
||||
target/s390x/kvm.c | 8 ++
|
||||
target/s390x/kvm.c | 8 +++
|
||||
util/memfd.c | 2 +-
|
||||
vl.c | 8 +-
|
||||
35 files changed, 317 insertions(+), 41 deletions(-)
|
||||
32 files changed, 281 insertions(+), 36 deletions(-)
|
||||
create mode 100644 default-configs/aarch64-rh-devices.mak
|
||||
create mode 100644 default-configs/ppc64-rh-devices.mak
|
||||
create mode 100644 default-configs/rh-virtio.mak
|
||||
create mode 100644 default-configs/s390x-rh-devices.mak
|
||||
create mode 100644 default-configs/x86_64-rh-devices.mak
|
||||
create mode 100644 hw/bt/Makefile.objs
|
||||
|
||||
diff --git a/Makefile.objs b/Makefile.objs
|
||||
index 11ba1a36bd..fcf63e1096 100644
|
||||
--- a/Makefile.objs
|
||||
+++ b/Makefile.objs
|
||||
@@ -65,8 +65,8 @@ common-obj-y += replay/
|
||||
|
||||
common-obj-y += ui/
|
||||
common-obj-m += ui/
|
||||
-common-obj-y += bt-host.o bt-vhci.o
|
||||
-bt-host.o-cflags := $(BLUEZ_CFLAGS)
|
||||
+#common-obj-y += bt-host.o bt-vhci.o
|
||||
+#bt-host.o-cflags := $(BLUEZ_CFLAGS)
|
||||
|
||||
common-obj-y += dma-helpers.o
|
||||
common-obj-y += vl.o
|
||||
diff --git a/backends/Makefile.objs b/backends/Makefile.objs
|
||||
index f0691116e8..f328d404bf 100644
|
||||
index 28a847c..0eda216 100644
|
||||
--- a/backends/Makefile.objs
|
||||
+++ b/backends/Makefile.objs
|
||||
@@ -16,4 +16,5 @@ endif
|
||||
@@ -16,7 +16,8 @@ endif
|
||||
|
||||
common-obj-$(call land,$(CONFIG_VHOST_USER),$(CONFIG_VIRTIO)) += vhost-user.o
|
||||
|
||||
-common-obj-$(CONFIG_LINUX) += hostmem-memfd.o
|
||||
+# RHEL: disable memfd
|
||||
+# common-obj-$(CONFIG_LINUX) += hostmem-memfd.o
|
||||
|
||||
common-obj-$(CONFIG_GIO) += dbus-vmstate.o
|
||||
dbus-vmstate.o-cflags = $(GIO_CFLAGS)
|
||||
diff --git a/default-configs/aarch64-rh-devices.mak b/default-configs/aarch64-rh-devices.mak
|
||||
new file mode 100644
|
||||
index 0000000000..a1ed641174
|
||||
index 0000000..0d756a2
|
||||
--- /dev/null
|
||||
+++ b/default-configs/aarch64-rh-devices.mak
|
||||
@@ -0,0 +1,20 @@
|
||||
@@ -0,0 +1,21 @@
|
||||
+include rh-virtio.mak
|
||||
+
|
||||
+CONFIG_ARM_GIC_KVM=y
|
||||
@ -153,8 +149,9 @@ index 0000000000..a1ed641174
|
||||
+CONFIG_VIRTIO_MMIO=y
|
||||
+CONFIG_VIRTIO_PCI=y
|
||||
+CONFIG_XIO3130=y
|
||||
+CONFIG_NVDIMM=y
|
||||
diff --git a/default-configs/aarch64-softmmu.mak b/default-configs/aarch64-softmmu.mak
|
||||
index 958b1e08e4..8f6867d48a 100644
|
||||
index 958b1e0..8f6867d 100644
|
||||
--- a/default-configs/aarch64-softmmu.mak
|
||||
+++ b/default-configs/aarch64-softmmu.mak
|
||||
@@ -1,8 +1,10 @@
|
||||
@ -174,17 +171,19 @@ index 958b1e08e4..8f6867d48a 100644
|
||||
+include aarch64-rh-devices.mak
|
||||
diff --git a/default-configs/ppc64-rh-devices.mak b/default-configs/ppc64-rh-devices.mak
|
||||
new file mode 100644
|
||||
index 0000000000..35f2106d06
|
||||
index 0000000..ecbe53f
|
||||
--- /dev/null
|
||||
+++ b/default-configs/ppc64-rh-devices.mak
|
||||
@@ -0,0 +1,32 @@
|
||||
@@ -0,0 +1,34 @@
|
||||
+include rh-virtio.mak
|
||||
+
|
||||
+CONFIG_DIMM=y
|
||||
+CONFIG_MEM_DEVICE=y
|
||||
+CONFIG_NVDIMM=y
|
||||
+CONFIG_PCI=y
|
||||
+CONFIG_PCI_DEVICES=y
|
||||
+CONFIG_PCI_TESTDEV=y
|
||||
+CONFIG_PCI_EXPRESS=y
|
||||
+CONFIG_PSERIES=y
|
||||
+CONFIG_SCSI=y
|
||||
+CONFIG_SPAPR_VSCSI=y
|
||||
@ -211,10 +210,10 @@ index 0000000000..35f2106d06
|
||||
+CONFIG_XIVE_SPAPR=y
|
||||
+CONFIG_XIVE_KVM=y
|
||||
diff --git a/default-configs/ppc64-softmmu.mak b/default-configs/ppc64-softmmu.mak
|
||||
index cca52665d9..fec354f327 100644
|
||||
index ae0841f..040e557 100644
|
||||
--- a/default-configs/ppc64-softmmu.mak
|
||||
+++ b/default-configs/ppc64-softmmu.mak
|
||||
@@ -1,10 +1,12 @@
|
||||
@@ -1,11 +1,13 @@
|
||||
# Default configuration for ppc64-softmmu
|
||||
|
||||
# Include all 32-bit boards
|
||||
@ -227,12 +226,14 @@ index cca52665d9..fec354f327 100644
|
||||
|
||||
# For pSeries
|
||||
-CONFIG_PSERIES=y
|
||||
-CONFIG_NVDIMM=y
|
||||
+#CONFIG_PSERIES=y
|
||||
+#CONFIG_NVDIMM=y
|
||||
+
|
||||
+include ppc64-rh-devices.mak
|
||||
diff --git a/default-configs/rh-virtio.mak b/default-configs/rh-virtio.mak
|
||||
new file mode 100644
|
||||
index 0000000000..94ede1b5f6
|
||||
index 0000000..94ede1b
|
||||
--- /dev/null
|
||||
+++ b/default-configs/rh-virtio.mak
|
||||
@@ -0,0 +1,10 @@
|
||||
@ -248,7 +249,7 @@ index 0000000000..94ede1b5f6
|
||||
+CONFIG_VIRTIO_SERIAL=y
|
||||
diff --git a/default-configs/s390x-rh-devices.mak b/default-configs/s390x-rh-devices.mak
|
||||
new file mode 100644
|
||||
index 0000000000..c3c73fe752
|
||||
index 0000000..c3c73fe
|
||||
--- /dev/null
|
||||
+++ b/default-configs/s390x-rh-devices.mak
|
||||
@@ -0,0 +1,15 @@
|
||||
@ -268,7 +269,7 @@ index 0000000000..c3c73fe752
|
||||
+CONFIG_VIRTIO_CCW=y
|
||||
+CONFIG_WDT_DIAG288=y
|
||||
diff --git a/default-configs/s390x-softmmu.mak b/default-configs/s390x-softmmu.mak
|
||||
index f2287a133f..3e2e388e91 100644
|
||||
index f2287a1..3e2e388 100644
|
||||
--- a/default-configs/s390x-softmmu.mak
|
||||
+++ b/default-configs/s390x-softmmu.mak
|
||||
@@ -10,4 +10,6 @@
|
||||
@ -281,7 +282,7 @@ index f2287a133f..3e2e388e91 100644
|
||||
+include s390x-rh-devices.mak
|
||||
diff --git a/default-configs/x86_64-rh-devices.mak b/default-configs/x86_64-rh-devices.mak
|
||||
new file mode 100644
|
||||
index 0000000000..d59b6d9bb5
|
||||
index 0000000..d59b6d9
|
||||
--- /dev/null
|
||||
+++ b/default-configs/x86_64-rh-devices.mak
|
||||
@@ -0,0 +1,100 @@
|
||||
@ -386,7 +387,7 @@ index 0000000000..d59b6d9bb5
|
||||
+CONFIG_TPM_EMULATOR=y
|
||||
+CONFIG_TPM_PASSTHROUGH=y
|
||||
diff --git a/default-configs/x86_64-softmmu.mak b/default-configs/x86_64-softmmu.mak
|
||||
index 64b2ee2960..b5de7e5279 100644
|
||||
index 64b2ee2..b5de7e5 100644
|
||||
--- a/default-configs/x86_64-softmmu.mak
|
||||
+++ b/default-configs/x86_64-softmmu.mak
|
||||
@@ -1,3 +1,5 @@
|
||||
@ -397,10 +398,10 @@ index 64b2ee2960..b5de7e5279 100644
|
||||
+
|
||||
+include x86_64-rh-devices.mak
|
||||
diff --git a/hw/acpi/ich9.c b/hw/acpi/ich9.c
|
||||
index 2034dd749e..ab203ad448 100644
|
||||
index 336cace..ae86900 100644
|
||||
--- a/hw/acpi/ich9.c
|
||||
+++ b/hw/acpi/ich9.c
|
||||
@@ -449,8 +449,8 @@ void ich9_pm_add_properties(Object *obj, ICH9LPCPMRegs *pm, Error **errp)
|
||||
@@ -374,8 +374,8 @@ void ich9_pm_add_properties(Object *obj, ICH9LPCPMRegs *pm, Error **errp)
|
||||
static const uint32_t gpe0_len = ICH9_PMIO_GPE0_LEN;
|
||||
pm->acpi_memory_hotplug.is_enabled = true;
|
||||
pm->cpu_hotplug_legacy = true;
|
||||
@ -412,10 +413,10 @@ index 2034dd749e..ab203ad448 100644
|
||||
|
||||
object_property_add_uint32_ptr(obj, ACPI_PM_PROP_PM_IO_BASE,
|
||||
diff --git a/hw/arm/Makefile.objs b/hw/arm/Makefile.objs
|
||||
index fe749f65fd..2aa1a9efdd 100644
|
||||
index 534a6a1..bd62442 100644
|
||||
--- a/hw/arm/Makefile.objs
|
||||
+++ b/hw/arm/Makefile.objs
|
||||
@@ -27,7 +27,7 @@ obj-$(CONFIG_VEXPRESS) += vexpress.o
|
||||
@@ -28,7 +28,7 @@ obj-$(CONFIG_VEXPRESS) += vexpress.o
|
||||
obj-$(CONFIG_ZYNQ) += xilinx_zynq.o
|
||||
obj-$(CONFIG_SABRELITE) += sabrelite.o
|
||||
|
||||
@ -425,7 +426,7 @@ index fe749f65fd..2aa1a9efdd 100644
|
||||
obj-$(CONFIG_PXA2XX) += pxa2xx.o pxa2xx_gpio.o pxa2xx_pic.o
|
||||
obj-$(CONFIG_DIGIC) += digic.o
|
||||
diff --git a/hw/block/fdc.c b/hw/block/fdc.c
|
||||
index ac5d31e8c1..e925bac002 100644
|
||||
index 9628cc1..37989fe 100644
|
||||
--- a/hw/block/fdc.c
|
||||
+++ b/hw/block/fdc.c
|
||||
@@ -46,6 +46,8 @@
|
||||
@ -437,7 +438,7 @@ index ac5d31e8c1..e925bac002 100644
|
||||
/********************************************************/
|
||||
/* debug Floppy devices */
|
||||
|
||||
@@ -2638,6 +2640,14 @@ static void fdctrl_realize_common(DeviceState *dev, FDCtrl *fdctrl,
|
||||
@@ -2613,6 +2615,14 @@ static void fdctrl_realize_common(DeviceState *dev, FDCtrl *fdctrl,
|
||||
int i, j;
|
||||
static int command_tables_inited = 0;
|
||||
|
||||
@ -451,19 +452,18 @@ index ac5d31e8c1..e925bac002 100644
|
||||
+
|
||||
if (fdctrl->fallback == FLOPPY_DRIVE_TYPE_AUTO) {
|
||||
error_setg(errp, "Cannot choose a fallback FDrive type of 'auto'");
|
||||
}
|
||||
return;
|
||||
diff --git a/hw/bt/Makefile.objs b/hw/bt/Makefile.objs
|
||||
index 867a7d2e8a..e678e9ee3c 100644
|
||||
--- a/hw/bt/Makefile.objs
|
||||
new file mode 100644
|
||||
index 0000000..e678e9e
|
||||
--- /dev/null
|
||||
+++ b/hw/bt/Makefile.objs
|
||||
@@ -1,3 +1,3 @@
|
||||
-common-obj-y += core.o l2cap.o sdp.o hci.o hid.o
|
||||
-common-obj-y += hci-csr.o
|
||||
@@ -0,0 +1,3 @@
|
||||
+#common-obj-y += core.o l2cap.o sdp.o hci.o hid.o
|
||||
+#common-obj-y += hci-csr.o
|
||||
|
||||
+
|
||||
diff --git a/hw/cpu/Makefile.objs b/hw/cpu/Makefile.objs
|
||||
index 8db9e8a7b3..1601ea93c7 100644
|
||||
index 8db9e8a..1601ea9 100644
|
||||
--- a/hw/cpu/Makefile.objs
|
||||
+++ b/hw/cpu/Makefile.objs
|
||||
@@ -1,5 +1,6 @@
|
||||
@ -476,7 +476,7 @@ index 8db9e8a7b3..1601ea93c7 100644
|
||||
+common-obj-y += core.o
|
||||
+# cluster.o
|
||||
diff --git a/hw/display/Makefile.objs b/hw/display/Makefile.objs
|
||||
index f2182e3bef..3d0cda1b52 100644
|
||||
index 77a7d62..68c793e 100644
|
||||
--- a/hw/display/Makefile.objs
|
||||
+++ b/hw/display/Makefile.objs
|
||||
@@ -1,8 +1,9 @@
|
||||
@ -492,10 +492,10 @@ index f2182e3bef..3d0cda1b52 100644
|
||||
common-obj-$(CONFIG_ADS7846) += ads7846.o
|
||||
common-obj-$(CONFIG_VGA_CIRRUS) += cirrus_vga.o
|
||||
diff --git a/hw/display/cirrus_vga.c b/hw/display/cirrus_vga.c
|
||||
index cd283e53b4..93afa26fda 100644
|
||||
index 1f29731..cac9e40 100644
|
||||
--- a/hw/display/cirrus_vga.c
|
||||
+++ b/hw/display/cirrus_vga.c
|
||||
@@ -2975,6 +2975,9 @@ static void pci_cirrus_vga_realize(PCIDevice *dev, Error **errp)
|
||||
@@ -2973,6 +2973,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;
|
||||
|
||||
@ -506,10 +506,10 @@ index cd283e53b4..93afa26fda 100644
|
||||
Also accept 8 MB/16 MB for backward compatibility. */
|
||||
if (s->vga.vram_size_mb != 4 && s->vga.vram_size_mb != 8 &&
|
||||
diff --git a/hw/ide/piix.c b/hw/ide/piix.c
|
||||
index db313dd3b1..e14858ca64 100644
|
||||
index 3b2de4c..980c35e 100644
|
||||
--- a/hw/ide/piix.c
|
||||
+++ b/hw/ide/piix.c
|
||||
@@ -251,7 +251,8 @@ static void piix3_ide_class_init(ObjectClass *klass, void *data)
|
||||
@@ -221,7 +221,8 @@ static void piix3_ide_class_init(ObjectClass *klass, void *data)
|
||||
k->device_id = PCI_DEVICE_ID_INTEL_82371SB_1;
|
||||
k->class_id = PCI_CLASS_STORAGE_IDE;
|
||||
set_bit(DEVICE_CATEGORY_STORAGE, dc->categories);
|
||||
@ -519,7 +519,7 @@ index db313dd3b1..e14858ca64 100644
|
||||
}
|
||||
|
||||
static const TypeInfo piix3_ide_info = {
|
||||
@@ -279,6 +280,8 @@ static void piix4_ide_class_init(ObjectClass *klass, void *data)
|
||||
@@ -250,6 +251,8 @@ static void piix4_ide_class_init(ObjectClass *klass, void *data)
|
||||
k->class_id = PCI_CLASS_STORAGE_IDE;
|
||||
set_bit(DEVICE_CATEGORY_STORAGE, dc->categories);
|
||||
dc->hotpluggable = false;
|
||||
@ -529,10 +529,10 @@ index db313dd3b1..e14858ca64 100644
|
||||
|
||||
static const TypeInfo piix4_ide_info = {
|
||||
diff --git a/hw/input/pckbd.c b/hw/input/pckbd.c
|
||||
index f0acfd86f7..390eb6579c 100644
|
||||
index 60a4130..b2f1f91 100644
|
||||
--- a/hw/input/pckbd.c
|
||||
+++ b/hw/input/pckbd.c
|
||||
@@ -571,6 +571,8 @@ static void i8042_class_initfn(ObjectClass *klass, void *data)
|
||||
@@ -568,6 +568,8 @@ static void i8042_class_initfn(ObjectClass *klass, void *data)
|
||||
dc->realize = i8042_realizefn;
|
||||
dc->vmsd = &vmstate_kbd_isa;
|
||||
set_bit(DEVICE_CATEGORY_INPUT, dc->categories);
|
||||
@ -542,10 +542,10 @@ index f0acfd86f7..390eb6579c 100644
|
||||
|
||||
static const TypeInfo i8042_info = {
|
||||
diff --git a/hw/net/e1000.c b/hw/net/e1000.c
|
||||
index a73f8d404e..fc73fdd6fa 100644
|
||||
index 2a69eee..af3ec17 100644
|
||||
--- a/hw/net/e1000.c
|
||||
+++ b/hw/net/e1000.c
|
||||
@@ -1795,6 +1795,7 @@ static const E1000Info e1000_devices[] = {
|
||||
@@ -1797,6 +1797,7 @@ static const E1000Info e1000_devices[] = {
|
||||
.revision = 0x03,
|
||||
.phy_id2 = E1000_PHY_ID2_8254xx_DEFAULT,
|
||||
},
|
||||
@ -553,7 +553,7 @@ index a73f8d404e..fc73fdd6fa 100644
|
||||
{
|
||||
.name = "e1000-82544gc",
|
||||
.device_id = E1000_DEV_ID_82544GC_COPPER,
|
||||
@@ -1807,6 +1808,7 @@ static const E1000Info e1000_devices[] = {
|
||||
@@ -1809,6 +1810,7 @@ static const E1000Info e1000_devices[] = {
|
||||
.revision = 0x03,
|
||||
.phy_id2 = E1000_PHY_ID2_8254xx_DEFAULT,
|
||||
},
|
||||
@ -561,41 +561,11 @@ index a73f8d404e..fc73fdd6fa 100644
|
||||
};
|
||||
|
||||
static void e1000_register_types(void)
|
||||
diff --git a/hw/pci-host/i440fx.c b/hw/pci-host/i440fx.c
|
||||
index f27131102d..17f10efae2 100644
|
||||
--- a/hw/pci-host/i440fx.c
|
||||
+++ b/hw/pci-host/i440fx.c
|
||||
@@ -386,6 +386,7 @@ static const TypeInfo i440fx_info = {
|
||||
},
|
||||
};
|
||||
|
||||
+#if 0 /* Disabled in Red Hat Enterprise Linux */
|
||||
/* IGD Passthrough Host Bridge. */
|
||||
typedef struct {
|
||||
uint8_t offset;
|
||||
@@ -469,6 +470,7 @@ static const TypeInfo igd_passthrough_i440fx_info = {
|
||||
.instance_size = sizeof(PCII440FXState),
|
||||
.class_init = igd_passthrough_i440fx_class_init,
|
||||
};
|
||||
+#endif
|
||||
|
||||
static const char *i440fx_pcihost_root_bus_path(PCIHostState *host_bridge,
|
||||
PCIBus *rootbus)
|
||||
@@ -514,7 +516,9 @@ static const TypeInfo i440fx_pcihost_info = {
|
||||
static void i440fx_register_types(void)
|
||||
{
|
||||
type_register_static(&i440fx_info);
|
||||
+#if 0 /* Disabled in Red Hat Enterprise Linux */
|
||||
type_register_static(&igd_passthrough_i440fx_info);
|
||||
+#endif
|
||||
type_register_static(&i440fx_pcihost_info);
|
||||
}
|
||||
|
||||
diff --git a/hw/ppc/spapr_cpu_core.c b/hw/ppc/spapr_cpu_core.c
|
||||
index 8339c4c0f8..301cd7b4e4 100644
|
||||
index ac1c109..542c19e 100644
|
||||
--- a/hw/ppc/spapr_cpu_core.c
|
||||
+++ b/hw/ppc/spapr_cpu_core.c
|
||||
@@ -403,10 +403,12 @@ static const TypeInfo spapr_cpu_core_type_infos[] = {
|
||||
@@ -399,10 +399,12 @@ static const TypeInfo spapr_cpu_core_type_infos[] = {
|
||||
.instance_size = sizeof(SpaprCpuCore),
|
||||
.class_size = sizeof(SpaprCpuCoreClass),
|
||||
},
|
||||
@ -609,10 +579,10 @@ index 8339c4c0f8..301cd7b4e4 100644
|
||||
DEFINE_SPAPR_CPU_CORE_TYPE("power7+_v2.1"),
|
||||
DEFINE_SPAPR_CPU_CORE_TYPE("power8_v2.0"),
|
||||
diff --git a/hw/usb/Makefile.objs b/hw/usb/Makefile.objs
|
||||
index 303ac084a0..700a91886e 100644
|
||||
index 66835e5..1b03645 100644
|
||||
--- a/hw/usb/Makefile.objs
|
||||
+++ b/hw/usb/Makefile.objs
|
||||
@@ -30,7 +30,9 @@ common-obj-$(CONFIG_USB_BLUETOOTH) += dev-bluetooth.o
|
||||
@@ -29,7 +29,9 @@ common-obj-$(CONFIG_USB_NETWORK) += dev-network.o
|
||||
ifeq ($(CONFIG_USB_SMARTCARD),y)
|
||||
common-obj-y += dev-smartcard-reader.o
|
||||
common-obj-$(CONFIG_SMARTCARD) += smartcard.mo
|
||||
@ -623,76 +593,11 @@ index 303ac084a0..700a91886e 100644
|
||||
smartcard.mo-cflags := $(SMARTCARD_CFLAGS)
|
||||
smartcard.mo-libs := $(SMARTCARD_LIBS)
|
||||
endif
|
||||
diff --git a/hw/vfio/pci-quirks.c b/hw/vfio/pci-quirks.c
|
||||
index 136f3a9ad6..4505ffe48a 100644
|
||||
--- a/hw/vfio/pci-quirks.c
|
||||
+++ b/hw/vfio/pci-quirks.c
|
||||
@@ -1166,6 +1166,7 @@ static void vfio_probe_rtl8168_bar2_quirk(VFIOPCIDevice *vdev, int nr)
|
||||
trace_vfio_quirk_rtl8168_probe(vdev->vbasedev.name);
|
||||
}
|
||||
|
||||
+#if 0 /* Disabled for Red Hat Enterprise Linux */
|
||||
/*
|
||||
* Intel IGD support
|
||||
*
|
||||
@@ -1239,6 +1240,7 @@ static int igd_gen(VFIOPCIDevice *vdev)
|
||||
|
||||
return 8; /* Assume newer is compatible */
|
||||
}
|
||||
+#endif
|
||||
|
||||
typedef struct VFIOIGDQuirk {
|
||||
struct VFIOPCIDevice *vdev;
|
||||
@@ -1311,6 +1313,7 @@ typedef struct {
|
||||
uint8_t len;
|
||||
} IGDHostInfo;
|
||||
|
||||
+#if 0 /* Disabled for Red Hat Enterprise Linux */
|
||||
static const IGDHostInfo igd_host_bridge_infos[] = {
|
||||
{PCI_REVISION_ID, 2},
|
||||
{PCI_SUBSYSTEM_VENDOR_ID, 2},
|
||||
@@ -1559,9 +1562,11 @@ static const MemoryRegionOps vfio_igd_index_quirk = {
|
||||
.write = vfio_igd_quirk_index_write,
|
||||
.endianness = DEVICE_LITTLE_ENDIAN,
|
||||
};
|
||||
+#endif
|
||||
|
||||
static void vfio_probe_igd_bar4_quirk(VFIOPCIDevice *vdev, int nr)
|
||||
{
|
||||
+#if 0 /* Disabled for Red Hat Enterprise Linux */
|
||||
struct vfio_region_info *rom = NULL, *opregion = NULL,
|
||||
*host = NULL, *lpc = NULL;
|
||||
VFIOQuirk *quirk;
|
||||
@@ -1572,6 +1577,7 @@ static void vfio_probe_igd_bar4_quirk(VFIOPCIDevice *vdev, int nr)
|
||||
uint32_t gmch;
|
||||
uint16_t cmd_orig, cmd;
|
||||
Error *err = NULL;
|
||||
+#endif
|
||||
|
||||
/*
|
||||
* This must be an Intel VGA device at address 00:02.0 for us to even
|
||||
@@ -1585,6 +1591,8 @@ static void vfio_probe_igd_bar4_quirk(VFIOPCIDevice *vdev, int nr)
|
||||
return;
|
||||
}
|
||||
|
||||
+#if 0 /* Disabled for Red Hat Enterprise Linux */
|
||||
+
|
||||
/*
|
||||
* We need to create an LPC/ISA bridge at PCI bus address 00:1f.0 that we
|
||||
* can stuff host values into, so if there's already one there and it's not
|
||||
@@ -1809,6 +1817,7 @@ out:
|
||||
g_free(opregion);
|
||||
g_free(host);
|
||||
g_free(lpc);
|
||||
+#endif
|
||||
}
|
||||
|
||||
/*
|
||||
diff --git a/hw/vfio/pci.c b/hw/vfio/pci.c
|
||||
index 2d40b396f2..c8534d3035 100644
|
||||
index 5e75a95..e265d77 100644
|
||||
--- a/hw/vfio/pci.c
|
||||
+++ b/hw/vfio/pci.c
|
||||
@@ -3220,6 +3220,7 @@ static const TypeInfo vfio_pci_dev_info = {
|
||||
@@ -3222,6 +3222,7 @@ static const TypeInfo vfio_pci_dev_info = {
|
||||
},
|
||||
};
|
||||
|
||||
@ -700,7 +605,7 @@ index 2d40b396f2..c8534d3035 100644
|
||||
static Property vfio_pci_dev_nohotplug_properties[] = {
|
||||
DEFINE_PROP_BOOL("ramfb", VFIOPCIDevice, enable_ramfb, false),
|
||||
DEFINE_PROP_END_OF_LIST(),
|
||||
@@ -3239,11 +3240,15 @@ static const TypeInfo vfio_pci_nohotplug_dev_info = {
|
||||
@@ -3241,11 +3242,15 @@ static const TypeInfo vfio_pci_nohotplug_dev_info = {
|
||||
.instance_size = sizeof(VFIOPCIDevice),
|
||||
.class_init = vfio_pci_nohotplug_dev_class_init,
|
||||
};
|
||||
@ -717,57 +622,59 @@ index 2d40b396f2..c8534d3035 100644
|
||||
|
||||
type_init(register_vfio_pci_dev_type)
|
||||
diff --git a/qemu-options.hx b/qemu-options.hx
|
||||
index 65c9473b73..fc17aca631 100644
|
||||
index 292d4e7..1df25ae 100644
|
||||
--- a/qemu-options.hx
|
||||
+++ b/qemu-options.hx
|
||||
@@ -2111,11 +2111,6 @@ ETEXI
|
||||
@@ -2239,10 +2239,6 @@ ERST
|
||||
|
||||
DEF("no-hpet", 0, QEMU_OPTION_no_hpet,
|
||||
"-no-hpet disable HPET\n", QEMU_ARCH_I386)
|
||||
-STEXI
|
||||
-@item -no-hpet
|
||||
-@findex -no-hpet
|
||||
-Disable HPET support.
|
||||
-ETEXI
|
||||
-SRST
|
||||
-``-no-hpet``
|
||||
- Disable HPET support.
|
||||
-ERST
|
||||
|
||||
DEF("acpitable", HAS_ARG, QEMU_OPTION_acpitable,
|
||||
"-acpitable [sig=str][,rev=n][,oem_id=str][,oem_table_id=str][,oem_rev=n][,asl_compiler_id=str][,asl_compiler_rev=n][,{data|file}=file1[:file2]...]\n"
|
||||
@@ -3125,6 +3120,7 @@ STEXI
|
||||
ETEXI
|
||||
DEFHEADING()
|
||||
|
||||
+#if 0
|
||||
DEFHEADING(Bluetooth(R) options:)
|
||||
STEXI
|
||||
@table @option
|
||||
@@ -3203,6 +3199,7 @@ STEXI
|
||||
@end table
|
||||
ETEXI
|
||||
DEFHEADING()
|
||||
+#endif
|
||||
|
||||
#ifdef CONFIG_TPM
|
||||
DEFHEADING(TPM device options:)
|
||||
diff --git a/softmmu/vl.c b/softmmu/vl.c
|
||||
index afd2615..00f7604 100644
|
||||
--- a/softmmu/vl.c
|
||||
+++ b/softmmu/vl.c
|
||||
@@ -144,7 +144,7 @@ static Chardev **serial_hds;
|
||||
Chardev *parallel_hds[MAX_PARALLEL_PORTS];
|
||||
int win2k_install_hack = 0;
|
||||
int singlestep = 0;
|
||||
-int no_hpet = 0;
|
||||
+int no_hpet = 1; /* Always disabled for Red Hat Enterprise Linux */
|
||||
int fd_bootchk = 1;
|
||||
static int no_reboot;
|
||||
int no_shutdown = 0;
|
||||
diff --git a/target/arm/cpu.c b/target/arm/cpu.c
|
||||
index 7a4ac9339b..3788fc3c4a 100644
|
||||
index 5d64adf..f1d18b8 100644
|
||||
--- a/target/arm/cpu.c
|
||||
+++ b/target/arm/cpu.c
|
||||
@@ -2744,7 +2744,9 @@ static void arm_cpu_register_types(void)
|
||||
type_register_static(&idau_interface_type_info);
|
||||
@@ -2904,6 +2904,9 @@ static void arm_cpu_register_types(void)
|
||||
|
||||
while (info->name) {
|
||||
- cpu_register(info);
|
||||
arm_cpu_register(info);
|
||||
+ /* RHEL specific: Filter out unsupported cpu models */
|
||||
+ if (!strcmp(info->name, "cortex-a15"))
|
||||
+ cpu_register(info);
|
||||
+ if (!strcmp(info->name, "cortex-a15-arm-cpu"))
|
||||
+ arm_cpu_register(info);
|
||||
info++;
|
||||
}
|
||||
|
||||
diff --git a/target/i386/cpu.c b/target/i386/cpu.c
|
||||
index 69f518a21a..1b7880ae3a 100644
|
||||
index 9c256ab..26a8584 100644
|
||||
--- a/target/i386/cpu.c
|
||||
+++ b/target/i386/cpu.c
|
||||
@@ -1835,14 +1835,14 @@ static X86CPUDefinition builtin_x86_defs[] = {
|
||||
@@ -1801,20 +1801,21 @@ static CPUCaches epyc_rome_cache_info = {
|
||||
|
||||
static X86CPUDefinition builtin_x86_defs[] = {
|
||||
{
|
||||
+ /* qemu64 is the default CPU model for all machine-types */
|
||||
.name = "qemu64",
|
||||
.level = 0xd,
|
||||
.vendor = CPUID_VENDOR_AMD,
|
||||
.family = 6,
|
||||
.model = 6,
|
||||
.stepping = 3,
|
||||
@ -790,34 +697,8 @@ index 69f518a21a..1b7880ae3a 100644
|
||||
.features[FEAT_8000_0001_ECX] =
|
||||
CPUID_EXT3_LAHF_LM | CPUID_EXT3_SVM,
|
||||
.xlevel = 0x8000000A,
|
||||
@@ -2128,6 +2128,25 @@ static X86CPUDefinition builtin_x86_defs[] = {
|
||||
.xlevel = 0x80000008,
|
||||
.model_id = "Intel(R) Atom(TM) CPU N270 @ 1.60GHz",
|
||||
},
|
||||
+ {
|
||||
+ .name = "cpu64-rhel6",
|
||||
+ .level = 4,
|
||||
+ .vendor = CPUID_VENDOR_AMD,
|
||||
+ .family = 6,
|
||||
+ .model = 13,
|
||||
+ .stepping = 3,
|
||||
+ .features[FEAT_1_EDX] = CPUID_SSE2 | CPUID_SSE | CPUID_FXSR |
|
||||
+ CPUID_MMX | CPUID_CLFLUSH | CPUID_PSE36 | CPUID_PAT | CPUID_CMOV |
|
||||
+ CPUID_MCA | CPUID_PGE | CPUID_MTRR | CPUID_SEP | CPUID_APIC |
|
||||
+ CPUID_CX8 | CPUID_MCE | CPUID_PAE | CPUID_MSR | CPUID_TSC |
|
||||
+ CPUID_PSE | CPUID_DE | CPUID_FP87,
|
||||
+ .features[FEAT_1_ECX] = CPUID_EXT_CX16 | CPUID_EXT_SSE3,
|
||||
+ .features[FEAT_8000_0001_EDX] = CPUID_EXT2_LM | CPUID_EXT2_NX | CPUID_EXT2_SYSCALL,
|
||||
+ .features[FEAT_8000_0001_ECX] = CPUID_EXT3_SSE4A | CPUID_EXT3_ABM |
|
||||
+ CPUID_EXT3_SVM | CPUID_EXT3_LAHF_LM,
|
||||
+ .xlevel = 0x8000000A,
|
||||
+ .model_id = "QEMU Virtual CPU version (cpu64-rhel6)",
|
||||
+ },
|
||||
{
|
||||
.name = "Conroe",
|
||||
.level = 10,
|
||||
diff --git a/target/ppc/cpu-models.c b/target/ppc/cpu-models.c
|
||||
index 086548e9b9..1bbf378c18 100644
|
||||
index 4ad1686..16b2185 100644
|
||||
--- a/target/ppc/cpu-models.c
|
||||
+++ b/target/ppc/cpu-models.c
|
||||
@@ -66,6 +66,7 @@
|
||||
@ -847,7 +728,7 @@ index 086548e9b9..1bbf378c18 100644
|
||||
POWERPC_DEF("power7_v2.3", CPU_POWERPC_POWER7_v23, POWER7,
|
||||
"POWER7 v2.3")
|
||||
POWERPC_DEF("power7+_v2.1", CPU_POWERPC_POWER7P_v21, POWER7,
|
||||
@@ -780,6 +784,7 @@
|
||||
@@ -782,6 +786,7 @@
|
||||
/* PowerPC CPU aliases */
|
||||
|
||||
PowerPCCPUAlias ppc_cpu_aliases[] = {
|
||||
@ -855,7 +736,7 @@ index 086548e9b9..1bbf378c18 100644
|
||||
{ "403", "403gc" },
|
||||
{ "405", "405d4" },
|
||||
{ "405cr", "405crc" },
|
||||
@@ -938,12 +943,15 @@ PowerPCCPUAlias ppc_cpu_aliases[] = {
|
||||
@@ -940,12 +945,15 @@ PowerPCCPUAlias ppc_cpu_aliases[] = {
|
||||
{ "7447a", "7447a_v1.2" },
|
||||
{ "7457a", "7457a_v1.2" },
|
||||
{ "apollo7pm", "7457a_v1.0" },
|
||||
@ -871,15 +752,15 @@ index 086548e9b9..1bbf378c18 100644
|
||||
{ "power7", "power7_v2.3" },
|
||||
{ "power7+", "power7+_v2.1" },
|
||||
{ "power8e", "power8e_v2.1" },
|
||||
@@ -952,6 +960,7 @@ PowerPCCPUAlias ppc_cpu_aliases[] = {
|
||||
{ "power9", "power9_v2.0" },
|
||||
@@ -955,6 +963,7 @@ PowerPCCPUAlias ppc_cpu_aliases[] = {
|
||||
{ "power10", "power10_v1.0" },
|
||||
#endif
|
||||
|
||||
+#if 0 /* Disabled for Red Hat Enterprise Linux */
|
||||
/* Generic PowerPCs */
|
||||
#if defined(TARGET_PPC64)
|
||||
{ "ppc64", "970fx_v3.1" },
|
||||
@@ -959,5 +968,6 @@ PowerPCCPUAlias ppc_cpu_aliases[] = {
|
||||
@@ -962,5 +971,6 @@ PowerPCCPUAlias ppc_cpu_aliases[] = {
|
||||
{ "ppc32", "604" },
|
||||
{ "ppc", "604" },
|
||||
{ "default", "604" },
|
||||
@ -887,7 +768,7 @@ index 086548e9b9..1bbf378c18 100644
|
||||
{ NULL, NULL }
|
||||
};
|
||||
diff --git a/target/s390x/cpu_models.c b/target/s390x/cpu_models.c
|
||||
index 7e92fb2e15..be718220d7 100644
|
||||
index 7c32180..88bf4a9 100644
|
||||
--- a/target/s390x/cpu_models.c
|
||||
+++ b/target/s390x/cpu_models.c
|
||||
@@ -404,6 +404,9 @@ static void check_unavailable_features(const S390CPUModel *max_model,
|
||||
@ -901,10 +782,10 @@ index 7e92fb2e15..be718220d7 100644
|
||||
|
||||
/* detect missing features if any to properly report them */
|
||||
diff --git a/target/s390x/kvm.c b/target/s390x/kvm.c
|
||||
index 0c9d14b4b1..a02d569537 100644
|
||||
index 69881a0..9802878 100644
|
||||
--- a/target/s390x/kvm.c
|
||||
+++ b/target/s390x/kvm.c
|
||||
@@ -2387,6 +2387,14 @@ void kvm_s390_apply_cpu_model(const S390CPUModel *model, Error **errp)
|
||||
@@ -2494,6 +2494,14 @@ void kvm_s390_apply_cpu_model(const S390CPUModel *model, Error **errp)
|
||||
error_setg(errp, "KVM doesn't support CPU models");
|
||||
return;
|
||||
}
|
||||
@ -920,7 +801,7 @@ index 0c9d14b4b1..a02d569537 100644
|
||||
prop.ibc = s390_ibc_from_cpu_model(model);
|
||||
/* configure cpu features indicated via STFL(e) */
|
||||
diff --git a/util/memfd.c b/util/memfd.c
|
||||
index 4a3c07e0be..3303ec9da4 100644
|
||||
index 4a3c07e..3303ec9 100644
|
||||
--- a/util/memfd.c
|
||||
+++ b/util/memfd.c
|
||||
@@ -193,7 +193,7 @@ bool qemu_memfd_alloc_check(void)
|
||||
@ -932,63 +813,6 @@ index 4a3c07e0be..3303ec9da4 100644
|
||||
int mfd = memfd_create("test", flags | MFD_CLOEXEC);
|
||||
|
||||
if (mfd >= 0) {
|
||||
diff --git a/vl.c b/vl.c
|
||||
index 6a65a64bfd..668a34577e 100644
|
||||
--- a/vl.c
|
||||
+++ b/vl.c
|
||||
@@ -166,7 +166,7 @@ Chardev *parallel_hds[MAX_PARALLEL_PORTS];
|
||||
int win2k_install_hack = 0;
|
||||
int singlestep = 0;
|
||||
int acpi_enabled = 1;
|
||||
-int no_hpet = 0;
|
||||
+int no_hpet = 1; /* Always disabled for Red Hat Enterprise Linux */
|
||||
int fd_bootchk = 1;
|
||||
static int no_reboot;
|
||||
int no_shutdown = 0;
|
||||
@@ -914,6 +914,7 @@ static void configure_rtc(QemuOpts *opts)
|
||||
}
|
||||
}
|
||||
|
||||
+#if 0 // Disabled for Red Hat Enterprise Linux
|
||||
/***********************************************************/
|
||||
/* Bluetooth support */
|
||||
static int nb_hcis;
|
||||
@@ -1035,6 +1036,7 @@ static int bt_parse(const char *opt)
|
||||
error_report("bad bluetooth parameter '%s'", opt);
|
||||
return 1;
|
||||
}
|
||||
+#endif
|
||||
|
||||
static int parse_name(void *opaque, QemuOpts *opts, Error **errp)
|
||||
{
|
||||
@@ -3128,6 +3130,7 @@ int main(int argc, char **argv, char **envp)
|
||||
}
|
||||
break;
|
||||
#endif
|
||||
+#if 0 /* Disabled for Red Hat Enterprise Linux */
|
||||
case QEMU_OPTION_bt:
|
||||
warn_report("The bluetooth subsystem is deprecated and will "
|
||||
"be removed soon. If the bluetooth subsystem is "
|
||||
@@ -3135,6 +3138,7 @@ int main(int argc, char **argv, char **envp)
|
||||
"qemu-devel@nongnu.org with your usecase.");
|
||||
add_device_config(DEV_BT, optarg);
|
||||
break;
|
||||
+#endif
|
||||
case QEMU_OPTION_audio_help:
|
||||
audio_legacy_help();
|
||||
exit (0);
|
||||
@@ -4282,9 +4286,11 @@ int main(int argc, char **argv, char **envp)
|
||||
|
||||
tpm_init();
|
||||
|
||||
+#if 0 // Disabled for Red Hat Enterprise Linux
|
||||
/* init the bluetooth world */
|
||||
if (foreach_device_config(DEV_BT, bt_parse))
|
||||
exit(1);
|
||||
+#endif
|
||||
|
||||
if (!xen_enabled()) {
|
||||
/* On 32-bit hosts, QEMU is limited by virtual address space */
|
||||
--
|
||||
2.21.0
|
||||
1.8.3.1
|
||||
|
||||
|
@ -1,4 +1,4 @@
|
||||
From 113078b23a4747b07eb363719d7cbc0af403dd2a Mon Sep 17 00:00:00 2001
|
||||
From 799c934a1ec957ae2e163f367f5f7550949178da 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
|
||||
@ -33,33 +33,42 @@ Merged patches (4.2.0):
|
||||
- ca4a5e8 virtio: Make disable-legacy/disable-modern compat properties optional
|
||||
- compat: Generic hw_compat_rhel_8_1 (patch 93040/92956)
|
||||
|
||||
Signed-off-by: Danilo C. L. de Paula <ddepaula@redhat.com>
|
||||
Merged patches (weekly-200318):
|
||||
- e6c3fbf hw/smbios: set new default SMBIOS fields for Windows driver support (partialy)
|
||||
|
||||
Merged patches (weekly-200506):
|
||||
- 8f9f4d8 compat: disable 'edid' for virtio-gpu-ccw
|
||||
---
|
||||
hw/acpi/ich9.c | 16 ++++
|
||||
hw/acpi/piix4.c | 5 +-
|
||||
hw/char/serial.c | 16 ++++
|
||||
hw/core/machine.c | 170 ++++++++++++++++++++++++++++++++++++++++
|
||||
hw/display/vga-isa.c | 2 +-
|
||||
hw/net/e1000e.c | 21 +++++
|
||||
hw/net/rtl8139.c | 4 +-
|
||||
hw/rtc/mc146818rtc.c | 6 ++
|
||||
hw/smbios/smbios.c | 1 +
|
||||
hw/timer/i8254_common.c | 2 +-
|
||||
hw/usb/hcd-uhci.c | 4 +-
|
||||
hw/usb/hcd-xhci.c | 20 +++++
|
||||
hw/usb/hcd-xhci.h | 2 +
|
||||
include/hw/acpi/ich9.h | 3 +
|
||||
include/hw/boards.h | 24 ++++++
|
||||
include/hw/usb.h | 4 +
|
||||
migration/migration.c | 2 +
|
||||
migration/migration.h | 5 ++
|
||||
18 files changed, 301 insertions(+), 6 deletions(-)
|
||||
hw/acpi/ich9.c | 16 ++++
|
||||
hw/acpi/piix4.c | 5 +-
|
||||
hw/arm/virt.c | 2 +-
|
||||
hw/char/serial.c | 16 ++++
|
||||
hw/core/machine.c | 170 +++++++++++++++++++++++++++++++++++++++++++
|
||||
hw/display/vga-isa.c | 2 +-
|
||||
hw/i386/pc_piix.c | 2 +
|
||||
hw/i386/pc_q35.c | 2 +
|
||||
hw/net/e1000e.c | 21 ++++++
|
||||
hw/net/rtl8139.c | 4 +-
|
||||
hw/rtc/mc146818rtc.c | 6 ++
|
||||
hw/smbios/smbios.c | 46 +++++++++++-
|
||||
hw/timer/i8254_common.c | 2 +-
|
||||
hw/usb/hcd-uhci.c | 4 +-
|
||||
hw/usb/hcd-xhci.c | 20 +++++
|
||||
hw/usb/hcd-xhci.h | 2 +
|
||||
include/hw/acpi/ich9.h | 3 +
|
||||
include/hw/boards.h | 24 ++++++
|
||||
include/hw/firmware/smbios.h | 5 +-
|
||||
include/hw/i386/pc.h | 3 +
|
||||
include/hw/usb.h | 4 +
|
||||
migration/migration.c | 2 +
|
||||
migration/migration.h | 5 ++
|
||||
23 files changed, 355 insertions(+), 11 deletions(-)
|
||||
|
||||
diff --git a/hw/acpi/ich9.c b/hw/acpi/ich9.c
|
||||
index ab203ad448..7ec26884e8 100644
|
||||
index ae86900..9a8a627 100644
|
||||
--- a/hw/acpi/ich9.c
|
||||
+++ b/hw/acpi/ich9.c
|
||||
@@ -444,6 +444,18 @@ static void ich9_pm_set_enable_tco(Object *obj, bool value, Error **errp)
|
||||
@@ -369,6 +369,18 @@ static void ich9_pm_set_enable_tco(Object *obj, bool value, Error **errp)
|
||||
s->pm.enable_tco = value;
|
||||
}
|
||||
|
||||
@ -78,7 +87,7 @@ index ab203ad448..7ec26884e8 100644
|
||||
void ich9_pm_add_properties(Object *obj, ICH9LPCPMRegs *pm, Error **errp)
|
||||
{
|
||||
static const uint32_t gpe0_len = ICH9_PMIO_GPE0_LEN;
|
||||
@@ -468,6 +480,10 @@ void ich9_pm_add_properties(Object *obj, ICH9LPCPMRegs *pm, Error **errp)
|
||||
@@ -393,6 +405,10 @@ void ich9_pm_add_properties(Object *obj, ICH9LPCPMRegs *pm, Error **errp)
|
||||
ich9_pm_get_cpu_hotplug_legacy,
|
||||
ich9_pm_set_cpu_hotplug_legacy,
|
||||
NULL);
|
||||
@ -86,14 +95,14 @@ index ab203ad448..7ec26884e8 100644
|
||||
+ ich9_pm_get_force_rev1_fadt,
|
||||
+ ich9_pm_set_force_rev1_fadt,
|
||||
+ NULL);
|
||||
object_property_add(obj, ACPI_PM_PROP_S3_DISABLED, "uint8",
|
||||
ich9_pm_get_disable_s3,
|
||||
ich9_pm_set_disable_s3,
|
||||
object_property_add_uint8_ptr(obj, ACPI_PM_PROP_S3_DISABLED,
|
||||
&pm->disable_s3, OBJ_PROP_FLAG_READWRITE,
|
||||
NULL);
|
||||
diff --git a/hw/acpi/piix4.c b/hw/acpi/piix4.c
|
||||
index 93aec2dd2c..3a26193cbe 100644
|
||||
index 964d6f5..b8458ba 100644
|
||||
--- a/hw/acpi/piix4.c
|
||||
+++ b/hw/acpi/piix4.c
|
||||
@@ -274,6 +274,7 @@ static const VMStateDescription vmstate_acpi = {
|
||||
@@ -275,6 +275,7 @@ static const VMStateDescription vmstate_acpi = {
|
||||
.name = "piix4_pm",
|
||||
.version_id = 3,
|
||||
.minimum_version_id = 3,
|
||||
@ -101,7 +110,7 @@ index 93aec2dd2c..3a26193cbe 100644
|
||||
.post_load = vmstate_acpi_post_load,
|
||||
.fields = (VMStateField[]) {
|
||||
VMSTATE_PCI_DEVICE(parent_obj, PIIX4PMState),
|
||||
@@ -627,8 +628,8 @@ static void piix4_send_gpe(AcpiDeviceIf *adev, AcpiEventStatusBits ev)
|
||||
@@ -628,8 +629,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),
|
||||
@ -112,19 +121,32 @@ index 93aec2dd2c..3a26193cbe 100644
|
||||
DEFINE_PROP_UINT8(ACPI_PM_PROP_S4_VAL, PIIX4PMState, s4_val, 2),
|
||||
DEFINE_PROP_BOOL("acpi-pci-hotplug-with-bridge-support", PIIX4PMState,
|
||||
use_acpi_pci_hotplug, true),
|
||||
diff --git a/hw/arm/virt.c b/hw/arm/virt.c
|
||||
index 171e690..25e6839 100644
|
||||
--- a/hw/arm/virt.c
|
||||
+++ b/hw/arm/virt.c
|
||||
@@ -1436,7 +1436,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);
|
||||
|
||||
smbios_get_tables(MACHINE(vms), NULL, 0, &smbios_tables, &smbios_tables_len,
|
||||
&smbios_anchor, &smbios_anchor_len);
|
||||
diff --git a/hw/char/serial.c b/hw/char/serial.c
|
||||
index b4aa250950..0012f0e44d 100644
|
||||
index c822a9a..0c7f1ff 100644
|
||||
--- a/hw/char/serial.c
|
||||
+++ b/hw/char/serial.c
|
||||
@@ -34,6 +34,7 @@
|
||||
#include "sysemu/runstate.h"
|
||||
@@ -35,6 +35,7 @@
|
||||
#include "qemu/error-report.h"
|
||||
#include "trace.h"
|
||||
#include "hw/qdev-properties.h"
|
||||
+#include "migration/migration.h"
|
||||
|
||||
//#define DEBUG_SERIAL
|
||||
|
||||
@@ -703,6 +704,9 @@ static int serial_post_load(void *opaque, int version_id)
|
||||
@@ -704,6 +705,9 @@ static int serial_post_load(void *opaque, int version_id)
|
||||
static bool serial_thr_ipending_needed(void *opaque)
|
||||
{
|
||||
SerialState *s = opaque;
|
||||
@ -134,7 +156,7 @@ index b4aa250950..0012f0e44d 100644
|
||||
|
||||
if (s->ier & UART_IER_THRI) {
|
||||
bool expected_value = ((s->iir & UART_IIR_ID) == UART_IIR_THRI);
|
||||
@@ -784,6 +788,10 @@ static const VMStateDescription vmstate_serial_xmit_fifo = {
|
||||
@@ -785,6 +789,10 @@ static const VMStateDescription vmstate_serial_xmit_fifo = {
|
||||
static bool serial_fifo_timeout_timer_needed(void *opaque)
|
||||
{
|
||||
SerialState *s = (SerialState *)opaque;
|
||||
@ -145,7 +167,7 @@ index b4aa250950..0012f0e44d 100644
|
||||
return timer_pending(s->fifo_timeout_timer);
|
||||
}
|
||||
|
||||
@@ -801,6 +809,10 @@ static const VMStateDescription vmstate_serial_fifo_timeout_timer = {
|
||||
@@ -802,6 +810,10 @@ static const VMStateDescription vmstate_serial_fifo_timeout_timer = {
|
||||
static bool serial_timeout_ipending_needed(void *opaque)
|
||||
{
|
||||
SerialState *s = (SerialState *)opaque;
|
||||
@ -156,7 +178,7 @@ index b4aa250950..0012f0e44d 100644
|
||||
return s->timeout_ipending != 0;
|
||||
}
|
||||
|
||||
@@ -818,6 +830,10 @@ static const VMStateDescription vmstate_serial_timeout_ipending = {
|
||||
@@ -819,6 +831,10 @@ static const VMStateDescription vmstate_serial_timeout_ipending = {
|
||||
static bool serial_poll_needed(void *opaque)
|
||||
{
|
||||
SerialState *s = (SerialState *)opaque;
|
||||
@ -168,12 +190,12 @@ index b4aa250950..0012f0e44d 100644
|
||||
}
|
||||
|
||||
diff --git a/hw/core/machine.c b/hw/core/machine.c
|
||||
index 1689ad3bf8..e0e0eec8bf 100644
|
||||
index c1a444c..af407cc 100644
|
||||
--- a/hw/core/machine.c
|
||||
+++ b/hw/core/machine.c
|
||||
@@ -27,6 +27,176 @@
|
||||
#include "hw/pci/pci.h"
|
||||
@@ -28,6 +28,176 @@
|
||||
#include "hw/mem/nvdimm.h"
|
||||
#include "migration/vmstate.h"
|
||||
|
||||
+/*
|
||||
+ * The same as hw_compat_4_1
|
||||
@ -220,7 +242,7 @@ index 1689ad3bf8..e0e0eec8bf 100644
|
||||
+ /* hw_compat_rhel_8_0 from hw_compat_4_0 */
|
||||
+ { "virtio-vga", "edid", "false" },
|
||||
+ /* hw_compat_rhel_8_0 from hw_compat_4_0 */
|
||||
+ { "virtio-gpu-pci", "edid", "false" },
|
||||
+ { "virtio-gpu-device", "edid", "false" },
|
||||
+ /* hw_compat_rhel_8_0 from hw_compat_4_0 */
|
||||
+ { "virtio-device", "use-started", "false" },
|
||||
+ /* hw_compat_rhel_8_0 from hw_compat_3_1 - that was added in 4.1 */
|
||||
@ -345,14 +367,14 @@ index 1689ad3bf8..e0e0eec8bf 100644
|
||||
+};
|
||||
+const size_t hw_compat_rhel_7_1_len = G_N_ELEMENTS(hw_compat_rhel_7_1);
|
||||
+
|
||||
GlobalProperty hw_compat_4_1[] = {
|
||||
{ "virtio-pci", "x-pcie-flr-init", "off" },
|
||||
};
|
||||
GlobalProperty hw_compat_4_2[] = {
|
||||
{ "virtio-blk-device", "queue-size", "128"},
|
||||
{ "virtio-scsi-device", "virtqueue_size", "128"},
|
||||
diff --git a/hw/display/vga-isa.c b/hw/display/vga-isa.c
|
||||
index 873e5e9706..d1a2efe47e 100644
|
||||
index 0633ed3..b703e9e 100644
|
||||
--- a/hw/display/vga-isa.c
|
||||
+++ b/hw/display/vga-isa.c
|
||||
@@ -82,7 +82,7 @@ static void vga_isa_realizefn(DeviceState *dev, Error **errp)
|
||||
@@ -84,7 +84,7 @@ static void vga_isa_realizefn(DeviceState *dev, Error **errp)
|
||||
}
|
||||
|
||||
static Property vga_isa_properties[] = {
|
||||
@ -361,8 +383,34 @@ index 873e5e9706..d1a2efe47e 100644
|
||||
DEFINE_PROP_END_OF_LIST(),
|
||||
};
|
||||
|
||||
diff --git a/hw/i386/pc_piix.c b/hw/i386/pc_piix.c
|
||||
index b75087d..b255d56 100644
|
||||
--- a/hw/i386/pc_piix.c
|
||||
+++ b/hw/i386/pc_piix.c
|
||||
@@ -177,6 +177,8 @@ static void pc_init1(MachineState *machine,
|
||||
smbios_set_defaults("QEMU", "Standard PC (i440FX + PIIX, 1996)",
|
||||
mc->name, pcmc->smbios_legacy_mode,
|
||||
pcmc->smbios_uuid_encoded,
|
||||
+ pcmc->smbios_stream_product,
|
||||
+ pcmc->smbios_stream_version,
|
||||
SMBIOS_ENTRY_POINT_21);
|
||||
}
|
||||
|
||||
diff --git a/hw/i386/pc_q35.c b/hw/i386/pc_q35.c
|
||||
index d2806c1..461e1cd 100644
|
||||
--- a/hw/i386/pc_q35.c
|
||||
+++ b/hw/i386/pc_q35.c
|
||||
@@ -202,6 +202,8 @@ static void pc_q35_init(MachineState *machine)
|
||||
smbios_set_defaults("QEMU", "Standard PC (Q35 + ICH9, 2009)",
|
||||
mc->name, pcmc->smbios_legacy_mode,
|
||||
pcmc->smbios_uuid_encoded,
|
||||
+ pcmc->smbios_stream_product,
|
||||
+ pcmc->smbios_stream_version,
|
||||
SMBIOS_ENTRY_POINT_21);
|
||||
}
|
||||
|
||||
diff --git a/hw/net/e1000e.c b/hw/net/e1000e.c
|
||||
index b69fd7d8ad..d8be50a1ce 100644
|
||||
index 79ba158..311dbe0 100644
|
||||
--- a/hw/net/e1000e.c
|
||||
+++ b/hw/net/e1000e.c
|
||||
@@ -79,6 +79,11 @@ typedef struct E1000EState {
|
||||
@ -436,10 +484,10 @@ index b69fd7d8ad..d8be50a1ce 100644
|
||||
e1000e_prop_disable_vnet, bool),
|
||||
DEFINE_PROP_SIGNED("subsys_ven", E1000EState, subsys_ven,
|
||||
diff --git a/hw/net/rtl8139.c b/hw/net/rtl8139.c
|
||||
index 88a97d756d..21d80e96cf 100644
|
||||
index 70aca7e..0950cee 100644
|
||||
--- a/hw/net/rtl8139.c
|
||||
+++ b/hw/net/rtl8139.c
|
||||
@@ -3177,7 +3177,7 @@ static int rtl8139_pre_save(void *opaque)
|
||||
@@ -3179,7 +3179,7 @@ static int rtl8139_pre_save(void *opaque)
|
||||
|
||||
static const VMStateDescription vmstate_rtl8139 = {
|
||||
.name = "rtl8139",
|
||||
@ -448,7 +496,7 @@ index 88a97d756d..21d80e96cf 100644
|
||||
.minimum_version_id = 3,
|
||||
.post_load = rtl8139_post_load,
|
||||
.pre_save = rtl8139_pre_save,
|
||||
@@ -3258,7 +3258,9 @@ static const VMStateDescription vmstate_rtl8139 = {
|
||||
@@ -3260,7 +3260,9 @@ static const VMStateDescription vmstate_rtl8139 = {
|
||||
VMSTATE_UINT32(tally_counters.TxMCol, RTL8139State),
|
||||
VMSTATE_UINT64(tally_counters.RxOkPhy, RTL8139State),
|
||||
VMSTATE_UINT64(tally_counters.RxOkBrd, RTL8139State),
|
||||
@ -459,7 +507,7 @@ index 88a97d756d..21d80e96cf 100644
|
||||
VMSTATE_UINT16(tally_counters.TxUndrn, RTL8139State),
|
||||
|
||||
diff --git a/hw/rtc/mc146818rtc.c b/hw/rtc/mc146818rtc.c
|
||||
index 74ae74bc5c..73820517df 100644
|
||||
index d18c099..8a3bd68 100644
|
||||
--- a/hw/rtc/mc146818rtc.c
|
||||
+++ b/hw/rtc/mc146818rtc.c
|
||||
@@ -42,6 +42,7 @@
|
||||
@ -483,19 +531,89 @@ index 74ae74bc5c..73820517df 100644
|
||||
}
|
||||
|
||||
diff --git a/hw/smbios/smbios.c b/hw/smbios/smbios.c
|
||||
index 11d476c4a2..e6e9355384 100644
|
||||
index ffd9872..7818b90 100644
|
||||
--- a/hw/smbios/smbios.c
|
||||
+++ b/hw/smbios/smbios.c
|
||||
@@ -777,6 +777,7 @@ void smbios_set_defaults(const char *manufacturer, const char *product,
|
||||
@@ -56,6 +56,9 @@ static bool smbios_legacy = true;
|
||||
static bool smbios_uuid_encoded = true;
|
||||
/* end: legacy structures & constants for <= 2.0 machines */
|
||||
|
||||
+/* Set to true for modern Windows 10 HardwareID-6 compat */
|
||||
+static bool smbios_type2_required;
|
||||
+
|
||||
|
||||
uint8_t *smbios_tables;
|
||||
size_t smbios_tables_len;
|
||||
@@ -531,7 +534,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_TABLE_SET_STR(2, manufacturer_str, type2.manufacturer);
|
||||
SMBIOS_TABLE_SET_STR(2, product_str, type2.product);
|
||||
@@ -752,7 +755,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,
|
||||
- bool uuid_encoded, SmbiosEntryPointType ep_type)
|
||||
+ bool uuid_encoded,
|
||||
+ const char *stream_product,
|
||||
+ const char *stream_version,
|
||||
+ SmbiosEntryPointType ep_type)
|
||||
{
|
||||
smbios_have_defaults = true;
|
||||
smbios_legacy = legacy_mode;
|
||||
@@ -773,11 +779,45 @@ void smbios_set_defaults(const char *manufacturer, const char *product,
|
||||
g_free(smbios_entries);
|
||||
}
|
||||
|
||||
+ /*
|
||||
+ * If @stream_product & @stream_version are non-NULL, then
|
||||
+ * we're following rules for new Windows driver support.
|
||||
+ * The data we have to report is defined in this doc:
|
||||
+ *
|
||||
+ * https://docs.microsoft.com/en-us/windows-hardware/drivers/install/specifying-hardware-ids-for-a-computer
|
||||
+ *
|
||||
+ * The Windows drivers are written to expect use of the
|
||||
+ * scheme documented as "HardwareID-6" against Windows 10,
|
||||
+ * which uses SMBIOS System (Type 1) and Base Board (Type 2)
|
||||
+ * tables and will match on
|
||||
+ *
|
||||
+ * System Manufacturer = Red Hat (@manufacturer)
|
||||
+ * System SKU Number = 8.2.0 (@stream_version)
|
||||
+ * Baseboard Manufacturer = Red Hat (@manufacturer)
|
||||
+ * Baseboard Product = RHEL-AV (@stream_product)
|
||||
+ *
|
||||
+ * NB, SKU must be changed with each RHEL-AV release
|
||||
+ *
|
||||
+ * Other fields can be freely used by applications using
|
||||
+ * QEMU. For example apps can use the "System product"
|
||||
+ * and "System version" to identify themselves.
|
||||
+ *
|
||||
+ * We get 'System Manufacturer' and 'Baseboard Manufacturer'
|
||||
+ */
|
||||
SMBIOS_SET_DEFAULT(type1.manufacturer, manufacturer);
|
||||
SMBIOS_SET_DEFAULT(type1.product, product);
|
||||
SMBIOS_SET_DEFAULT(type1.version, version);
|
||||
+ SMBIOS_SET_DEFAULT(type1.family, "Red Hat Enterprise Linux");
|
||||
+ if (stream_version != NULL) {
|
||||
+ SMBIOS_SET_DEFAULT(type1.sku, stream_version);
|
||||
+ }
|
||||
SMBIOS_SET_DEFAULT(type2.manufacturer, manufacturer);
|
||||
SMBIOS_SET_DEFAULT(type2.product, product);
|
||||
- SMBIOS_SET_DEFAULT(type2.product, product);
|
||||
+ if (stream_product != NULL) {
|
||||
+ SMBIOS_SET_DEFAULT(type2.product, stream_product);
|
||||
+ smbios_type2_required = true;
|
||||
+ } else {
|
||||
+ SMBIOS_SET_DEFAULT(type2.product, product);
|
||||
+ }
|
||||
SMBIOS_SET_DEFAULT(type2.version, version);
|
||||
SMBIOS_SET_DEFAULT(type3.manufacturer, manufacturer);
|
||||
SMBIOS_SET_DEFAULT(type3.version, version);
|
||||
diff --git a/hw/timer/i8254_common.c b/hw/timer/i8254_common.c
|
||||
index 050875b497..32935da46c 100644
|
||||
index 050875b..32935da 100644
|
||||
--- a/hw/timer/i8254_common.c
|
||||
+++ b/hw/timer/i8254_common.c
|
||||
@@ -231,7 +231,7 @@ static const VMStateDescription vmstate_pit_common = {
|
||||
@ -508,7 +626,7 @@ index 050875b497..32935da46c 100644
|
||||
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 23507ad3b5..9fd87a7ad9 100644
|
||||
index 37f7beb..2741edc 100644
|
||||
--- a/hw/usb/hcd-uhci.c
|
||||
+++ b/hw/usb/hcd-uhci.c
|
||||
@@ -1219,12 +1219,14 @@ static void usb_uhci_common_realize(PCIDevice *dev, Error **errp)
|
||||
@ -528,10 +646,10 @@ index 23507ad3b5..9fd87a7ad9 100644
|
||||
if (s->masterbus) {
|
||||
USBPort *ports[NB_PORTS];
|
||||
diff --git a/hw/usb/hcd-xhci.c b/hw/usb/hcd-xhci.c
|
||||
index 80988bb305..8fed2eedd6 100644
|
||||
index b330e36..b25cce8 100644
|
||||
--- a/hw/usb/hcd-xhci.c
|
||||
+++ b/hw/usb/hcd-xhci.c
|
||||
@@ -3590,9 +3590,27 @@ static const VMStateDescription vmstate_xhci_slot = {
|
||||
@@ -3600,9 +3600,27 @@ static const VMStateDescription vmstate_xhci_slot = {
|
||||
}
|
||||
};
|
||||
|
||||
@ -559,7 +677,7 @@ index 80988bb305..8fed2eedd6 100644
|
||||
.fields = (VMStateField[]) {
|
||||
VMSTATE_UINT32(type, XHCIEvent),
|
||||
VMSTATE_UINT32(ccode, XHCIEvent),
|
||||
@@ -3601,6 +3619,8 @@ static const VMStateDescription vmstate_xhci_event = {
|
||||
@@ -3611,6 +3629,8 @@ static const VMStateDescription vmstate_xhci_event = {
|
||||
VMSTATE_UINT32(flags, XHCIEvent),
|
||||
VMSTATE_UINT8(slotid, XHCIEvent),
|
||||
VMSTATE_UINT8(epid, XHCIEvent),
|
||||
@ -569,7 +687,7 @@ index 80988bb305..8fed2eedd6 100644
|
||||
}
|
||||
};
|
||||
diff --git a/hw/usb/hcd-xhci.h b/hw/usb/hcd-xhci.h
|
||||
index 2fad4df2a7..f554b671e3 100644
|
||||
index 2fad4df..f554b67 100644
|
||||
--- a/hw/usb/hcd-xhci.h
|
||||
+++ b/hw/usb/hcd-xhci.h
|
||||
@@ -157,6 +157,8 @@ typedef struct XHCIEvent {
|
||||
@ -582,7 +700,7 @@ index 2fad4df2a7..f554b671e3 100644
|
||||
|
||||
typedef struct XHCIInterrupter {
|
||||
diff --git a/include/hw/acpi/ich9.h b/include/hw/acpi/ich9.h
|
||||
index 41568d1837..1a23ccc412 100644
|
||||
index 41568d1..1a23ccc 100644
|
||||
--- a/include/hw/acpi/ich9.h
|
||||
+++ b/include/hw/acpi/ich9.h
|
||||
@@ -61,6 +61,9 @@ typedef struct ICH9LPCPMRegs {
|
||||
@ -596,10 +714,10 @@ index 41568d1837..1a23ccc412 100644
|
||||
|
||||
#define ACPI_PM_PROP_TCO_ENABLED "enable_tco"
|
||||
diff --git a/include/hw/boards.h b/include/hw/boards.h
|
||||
index de45087f34..6f85a0e032 100644
|
||||
index fd4d62b..0046ab5 100644
|
||||
--- a/include/hw/boards.h
|
||||
+++ b/include/hw/boards.h
|
||||
@@ -377,4 +377,28 @@ extern const size_t hw_compat_2_2_len;
|
||||
@@ -369,4 +369,28 @@ extern const size_t hw_compat_2_2_len;
|
||||
extern GlobalProperty hw_compat_2_1[];
|
||||
extern const size_t hw_compat_2_1_len;
|
||||
|
||||
@ -628,8 +746,38 @@ index de45087f34..6f85a0e032 100644
|
||||
+extern const size_t hw_compat_rhel_7_1_len;
|
||||
+
|
||||
#endif
|
||||
diff --git a/include/hw/firmware/smbios.h b/include/hw/firmware/smbios.h
|
||||
index 02a0ced..67e38a1 100644
|
||||
--- a/include/hw/firmware/smbios.h
|
||||
+++ b/include/hw/firmware/smbios.h
|
||||
@@ -267,7 +267,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,
|
||||
- bool uuid_encoded, SmbiosEntryPointType ep_type);
|
||||
+ bool uuid_encoded,
|
||||
+ const char *stream_product,
|
||||
+ const char *stream_version,
|
||||
+ SmbiosEntryPointType ep_type);
|
||||
uint8_t *smbios_get_table_legacy(MachineState *ms, size_t *length);
|
||||
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 05e1945..811c3d5 100644
|
||||
--- a/include/hw/i386/pc.h
|
||||
+++ b/include/hw/i386/pc.h
|
||||
@@ -100,6 +100,9 @@ typedef struct PCMachineClass {
|
||||
bool smbios_defaults;
|
||||
bool smbios_legacy_mode;
|
||||
bool smbios_uuid_encoded;
|
||||
+ /* New fields needed for Windows HardwareID-6 matching */
|
||||
+ const char *smbios_stream_product;
|
||||
+ const char *smbios_stream_version;
|
||||
|
||||
/* RAM / address space compat: */
|
||||
bool gigabyte_align;
|
||||
diff --git a/include/hw/usb.h b/include/hw/usb.h
|
||||
index c24d968a19..b353438ea0 100644
|
||||
index c24d968..b353438 100644
|
||||
--- a/include/hw/usb.h
|
||||
+++ b/include/hw/usb.h
|
||||
@@ -605,4 +605,8 @@ int usb_get_quirks(uint16_t vendor_id, uint16_t product_id,
|
||||
@ -642,10 +790,10 @@ index c24d968a19..b353438ea0 100644
|
||||
+
|
||||
#endif
|
||||
diff --git a/migration/migration.c b/migration/migration.c
|
||||
index 354ad072fa..30c53c623b 100644
|
||||
index 177cce9..2864560 100644
|
||||
--- a/migration/migration.c
|
||||
+++ b/migration/migration.c
|
||||
@@ -121,6 +121,8 @@ enum mig_rp_message_type {
|
||||
@@ -128,6 +128,8 @@ enum mig_rp_message_type {
|
||||
MIG_RP_MSG_MAX
|
||||
};
|
||||
|
||||
@ -655,10 +803,10 @@ index 354ad072fa..30c53c623b 100644
|
||||
migrations at once. For now we don't need to add
|
||||
dynamic creation of migration */
|
||||
diff --git a/migration/migration.h b/migration/migration.h
|
||||
index 79b3dda146..0b1b0d4df5 100644
|
||||
index 507284e..0baa337 100644
|
||||
--- a/migration/migration.h
|
||||
+++ b/migration/migration.h
|
||||
@@ -335,6 +335,11 @@ void init_dirty_bitmap_incoming_migration(void);
|
||||
@@ -339,6 +339,11 @@ void init_dirty_bitmap_incoming_migration(void);
|
||||
void migrate_add_address(SocketAddress *address);
|
||||
|
||||
int foreach_not_ignored_block(RAMBlockIterFunc func, void *opaque);
|
||||
@ -671,5 +819,5 @@ index 79b3dda146..0b1b0d4df5 100644
|
||||
#define qemu_ram_foreach_block \
|
||||
#warning "Use foreach_not_ignored_block in migration code"
|
||||
--
|
||||
2.21.0
|
||||
1.8.3.1
|
||||
|
||||
|
@ -1,4 +1,4 @@
|
||||
From 49164264d9928f73961acbbe4d56d8dfa23d8099 Mon Sep 17 00:00:00 2001
|
||||
From a373b0198f9268478a5211efb6a545d9c598b364 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
|
||||
@ -7,14 +7,14 @@ Adding changes to add RHEL machine types for aarch64 architecture.
|
||||
|
||||
Signed-off-by: Miroslav Rezanina <mrezanin@redhat.com>
|
||||
|
||||
Rebase changes (4.0.0):
|
||||
Rebase notes (4.0.0):
|
||||
- Use upstream compat handling
|
||||
|
||||
Rebase changes (4.1.0-rc0):
|
||||
Rebase notes (4.1.0-rc0):
|
||||
- Removed a15memmap (upstream)
|
||||
- Use virt_flash_create in rhel800_virt_instance_init
|
||||
|
||||
Rebase changes (4.2.0-rc0):
|
||||
Rebase notes (4.2.0-rc0):
|
||||
- Set numa_mem_supported
|
||||
|
||||
Rebase notes (4.2.0-rc3):
|
||||
@ -23,6 +23,12 @@ Rebase notes (4.2.0-rc3):
|
||||
- aarch64: virt: Allow PCDIMM instantiation (patch 92247)
|
||||
- aarch64: virt: Enhance the comment related to gic-version (patch 92248)
|
||||
|
||||
Rebase notes (weekly-200226):
|
||||
- Set default_ram_id in rhel_machine_class_init
|
||||
|
||||
Rebase notes (5.0.0-rc1):
|
||||
- Added setting acpi properties
|
||||
|
||||
Merged patches (4.0.0):
|
||||
- 7bfdb4c aarch64: Add virt-rhel8.0.0 machine type for ARM
|
||||
- 3433e69 aarch64: Set virt-rhel8.0.0 max_cpus to 512
|
||||
@ -31,26 +37,24 @@ Merged patches (4.0.0):
|
||||
Merged patches (4.1.0):
|
||||
- c3e39ef aarch64: Add virt-rhel8.1.0 machine type for ARM
|
||||
- 59a46d1 aarch64: Allow ARM VIRT iommu option in RHEL8.1 machine
|
||||
|
||||
Signed-off-by: Danilo C. L. de Paula <ddepaula@redhat.com>
|
||||
---
|
||||
hw/arm/virt.c | 161 +++++++++++++++++++++++++++++++++++++++++-
|
||||
include/hw/arm/virt.h | 11 +++
|
||||
2 files changed, 171 insertions(+), 1 deletion(-)
|
||||
hw/arm/virt.c | 169 +++++++++++++++++++++++++++++++++++++++++++++++++-
|
||||
include/hw/arm/virt.h | 11 ++++
|
||||
2 files changed, 179 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/hw/arm/virt.c b/hw/arm/virt.c
|
||||
index d4bedc2607..e10839100e 100644
|
||||
index 25e6839..1387ff6 100644
|
||||
--- a/hw/arm/virt.c
|
||||
+++ b/hw/arm/virt.c
|
||||
@@ -72,6 +72,7 @@
|
||||
#include "hw/mem/nvdimm.h"
|
||||
#include "hw/acpi/generic_event_device.h"
|
||||
@@ -79,6 +79,7 @@
|
||||
#include "hw/char/pl011.h"
|
||||
#include "qemu/guest-random.h"
|
||||
|
||||
+#if 0 /* Disabled for Red Hat Enterprise Linux */
|
||||
#define DEFINE_VIRT_MACHINE_LATEST(major, minor, latest) \
|
||||
static void virt_##major##_##minor##_class_init(ObjectClass *oc, \
|
||||
void *data) \
|
||||
@@ -98,7 +99,49 @@
|
||||
@@ -105,7 +106,49 @@
|
||||
DEFINE_VIRT_MACHINE_LATEST(major, minor, true)
|
||||
#define DEFINE_VIRT_MACHINE(major, minor) \
|
||||
DEFINE_VIRT_MACHINE_LATEST(major, minor, false)
|
||||
@ -101,7 +105,7 @@ index d4bedc2607..e10839100e 100644
|
||||
|
||||
/* Number of external interrupt lines to configure the GIC with */
|
||||
#define NUM_IRQS 256
|
||||
@@ -1763,6 +1806,7 @@ static void machvirt_init(MachineState *machine)
|
||||
@@ -1914,6 +1957,7 @@ static void machvirt_init(MachineState *machine)
|
||||
qemu_add_machine_init_done_notifier(&vms->machine_done);
|
||||
}
|
||||
|
||||
@ -109,7 +113,7 @@ index d4bedc2607..e10839100e 100644
|
||||
static bool virt_get_secure(Object *obj, Error **errp)
|
||||
{
|
||||
VirtMachineState *vms = VIRT_MACHINE(obj);
|
||||
@@ -1791,6 +1835,7 @@ static void virt_set_virt(Object *obj, bool value, Error **errp)
|
||||
@@ -1942,6 +1986,7 @@ static void virt_set_virt(Object *obj, bool value, Error **errp)
|
||||
vms->virt = value;
|
||||
}
|
||||
|
||||
@ -117,7 +121,7 @@ index d4bedc2607..e10839100e 100644
|
||||
static bool virt_get_highmem(Object *obj, Error **errp)
|
||||
{
|
||||
VirtMachineState *vms = VIRT_MACHINE(obj);
|
||||
@@ -2022,6 +2067,7 @@ static int virt_kvm_type(MachineState *ms, const char *type_str)
|
||||
@@ -2218,6 +2263,7 @@ static int virt_kvm_type(MachineState *ms, const char *type_str)
|
||||
return requested_pa_size > 40 ? requested_pa_size : 0;
|
||||
}
|
||||
|
||||
@ -125,7 +129,7 @@ index d4bedc2607..e10839100e 100644
|
||||
static void virt_machine_class_init(ObjectClass *oc, void *data)
|
||||
{
|
||||
MachineClass *mc = MACHINE_CLASS(oc);
|
||||
@@ -2258,3 +2304,116 @@ static void virt_machine_2_6_options(MachineClass *mc)
|
||||
@@ -2478,3 +2524,124 @@ static void virt_machine_2_6_options(MachineClass *mc)
|
||||
vmc->no_pmu = true;
|
||||
}
|
||||
DEFINE_VIRT_MACHINE(2, 6)
|
||||
@ -159,7 +163,15 @@ index d4bedc2607..e10839100e 100644
|
||||
+ hc->plug = virt_machine_device_plug_cb;
|
||||
+ hc->unplug_request = virt_machine_device_unplug_request_cb;
|
||||
+ mc->numa_mem_supported = true;
|
||||
+ mc->nvdimm_supported = true;
|
||||
+ mc->auto_enable_numa_with_memhp = true;
|
||||
+ mc->default_ram_id = "mach-virt.ram";
|
||||
+
|
||||
+ object_class_property_add(oc, "acpi", "OnOffAuto",
|
||||
+ virt_get_acpi, virt_set_acpi,
|
||||
+ NULL, NULL, &error_abort);
|
||||
+ object_class_property_set_description(oc, "acpi",
|
||||
+ "Enable ACPI", &error_abort);
|
||||
+}
|
||||
+
|
||||
+static const TypeInfo rhel_machine_info = {
|
||||
@ -243,10 +255,10 @@ index d4bedc2607..e10839100e 100644
|
||||
+}
|
||||
+DEFINE_RHEL_MACHINE_AS_LATEST(8, 2, 0)
|
||||
diff --git a/include/hw/arm/virt.h b/include/hw/arm/virt.h
|
||||
index 0b41083e9d..53fdf16563 100644
|
||||
index 6d67ace..e44e25c 100644
|
||||
--- a/include/hw/arm/virt.h
|
||||
+++ b/include/hw/arm/virt.h
|
||||
@@ -142,6 +142,7 @@ typedef struct {
|
||||
@@ -156,6 +156,7 @@ typedef struct {
|
||||
|
||||
#define VIRT_ECAM_ID(high) (high ? VIRT_HIGH_PCIE_ECAM : VIRT_PCIE_ECAM)
|
||||
|
||||
@ -254,7 +266,7 @@ index 0b41083e9d..53fdf16563 100644
|
||||
#define TYPE_VIRT_MACHINE MACHINE_TYPE_NAME("virt")
|
||||
#define VIRT_MACHINE(obj) \
|
||||
OBJECT_CHECK(VirtMachineState, (obj), TYPE_VIRT_MACHINE)
|
||||
@@ -150,6 +151,16 @@ typedef struct {
|
||||
@@ -164,6 +165,16 @@ typedef struct {
|
||||
#define VIRT_MACHINE_CLASS(klass) \
|
||||
OBJECT_CLASS_CHECK(VirtMachineClass, klass, TYPE_VIRT_MACHINE)
|
||||
|
||||
@ -269,8 +281,8 @@ index 0b41083e9d..53fdf16563 100644
|
||||
+#endif
|
||||
+
|
||||
void virt_acpi_setup(VirtMachineState *vms);
|
||||
bool virt_is_acpi_enabled(VirtMachineState *vms);
|
||||
|
||||
/* Return the number of used redistributor regions */
|
||||
--
|
||||
2.21.0
|
||||
1.8.3.1
|
||||
|
||||
|
@ -1,4 +1,4 @@
|
||||
From 136eae41007e2e5b0d693cc656f3ec36cbabf16f Mon Sep 17 00:00:00 2001
|
||||
From c50a71e2a577b532a904e70d23f7533aca0b3a6f 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
|
||||
@ -31,36 +31,37 @@ Merged patches (4.2.0):
|
||||
- redhat: update pseries-rhel-7.6.0 machine type (patch 93039)
|
||||
- redhat: define pseries-rhel8.2.0 machine type (patch 93041)
|
||||
|
||||
Signed-off-by: Danilo C. L. de Paula <ddepaula@redhat.com>
|
||||
Merged patches (weekly-200226):
|
||||
- eb121ff spapr: Enable DD2.3 accelerated count cache flush in pseries-5.0 machine (partial)
|
||||
---
|
||||
hw/ppc/spapr.c | 278 ++++++++++++++++++++++++++++++++++++++++
|
||||
hw/ppc/spapr_cpu_core.c | 13 ++
|
||||
hw/ppc/spapr.c | 280 ++++++++++++++++++++++++++++++++++++++++++++++++
|
||||
hw/ppc/spapr_cpu_core.c | 13 +++
|
||||
include/hw/ppc/spapr.h | 1 +
|
||||
target/ppc/compat.c | 13 +-
|
||||
target/ppc/compat.c | 13 ++-
|
||||
target/ppc/cpu.h | 1 +
|
||||
5 files changed, 305 insertions(+), 1 deletion(-)
|
||||
5 files changed, 307 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/hw/ppc/spapr.c b/hw/ppc/spapr.c
|
||||
index e076f6023c..8749c72066 100644
|
||||
index 9a2bd50..20b3437 100644
|
||||
--- a/hw/ppc/spapr.c
|
||||
+++ b/hw/ppc/spapr.c
|
||||
@@ -4447,6 +4447,7 @@ static void spapr_machine_class_init(ObjectClass *oc, void *data)
|
||||
smc->linux_pci_probe = true;
|
||||
@@ -4549,6 +4549,7 @@ static void spapr_machine_class_init(ObjectClass *oc, void *data)
|
||||
smc->smp_threads_vsmt = true;
|
||||
smc->nr_xirqs = SPAPR_NR_XIRQS;
|
||||
xfc->match_nvt = spapr_match_nvt;
|
||||
+ smc->has_power9_support = true;
|
||||
}
|
||||
|
||||
static const TypeInfo spapr_machine_info = {
|
||||
@@ -4491,6 +4492,7 @@ static const TypeInfo spapr_machine_info = {
|
||||
@@ -4599,6 +4600,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-4.2
|
||||
* pseries-5.0
|
||||
*/
|
||||
@@ -4520,6 +4522,7 @@ static void spapr_machine_4_1_class_options(MachineClass *mc)
|
||||
@@ -4645,6 +4647,7 @@ static void spapr_machine_4_1_class_options(MachineClass *mc)
|
||||
}
|
||||
|
||||
DEFINE_SPAPR_MACHINE(4_1, "4.1", false);
|
||||
@ -68,7 +69,7 @@ index e076f6023c..8749c72066 100644
|
||||
|
||||
/*
|
||||
* pseries-4.0
|
||||
@@ -4536,6 +4539,7 @@ static void phb_placement_4_0(SpaprMachineState *spapr, uint32_t index,
|
||||
@@ -4661,6 +4664,7 @@ static void phb_placement_4_0(SpaprMachineState *spapr, uint32_t index,
|
||||
*nv2atsd = 0;
|
||||
}
|
||||
|
||||
@ -76,7 +77,7 @@ index e076f6023c..8749c72066 100644
|
||||
static void spapr_machine_4_0_class_options(MachineClass *mc)
|
||||
{
|
||||
SpaprMachineClass *smc = SPAPR_MACHINE_CLASS(mc);
|
||||
@@ -4695,6 +4699,7 @@ DEFINE_SPAPR_MACHINE(2_8, "2.8", false);
|
||||
@@ -4820,6 +4824,7 @@ DEFINE_SPAPR_MACHINE(2_8, "2.8", false);
|
||||
/*
|
||||
* pseries-2.7
|
||||
*/
|
||||
@ -84,7 +85,7 @@ index e076f6023c..8749c72066 100644
|
||||
|
||||
static void phb_placement_2_7(SpaprMachineState *spapr, uint32_t index,
|
||||
uint64_t *buid, hwaddr *pio,
|
||||
@@ -4749,6 +4754,7 @@ static void phb_placement_2_7(SpaprMachineState *spapr, uint32_t index,
|
||||
@@ -4874,6 +4879,7 @@ static void phb_placement_2_7(SpaprMachineState *spapr, uint32_t index,
|
||||
*nv2atsd = 0;
|
||||
}
|
||||
|
||||
@ -92,7 +93,7 @@ index e076f6023c..8749c72066 100644
|
||||
static void spapr_machine_2_7_class_options(MachineClass *mc)
|
||||
{
|
||||
SpaprMachineClass *smc = SPAPR_MACHINE_CLASS(mc);
|
||||
@@ -4863,6 +4869,278 @@ static void spapr_machine_2_1_class_options(MachineClass *mc)
|
||||
@@ -4988,6 +4994,280 @@ 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);
|
||||
@ -131,6 +132,8 @@ index e076f6023c..8749c72066 100644
|
||||
+ hw_compat_rhel_8_1_len);
|
||||
+ compat_props_add(mc->compat_props, compat, G_N_ELEMENTS(compat));
|
||||
+
|
||||
+ /* from pseries-4.2 */
|
||||
+ smc->default_caps.caps[SPAPR_CAP_CCF_ASSIST] = SPAPR_CAP_OFF;
|
||||
+}
|
||||
+
|
||||
+DEFINE_SPAPR_MACHINE(rhel810, "rhel8.1.0", false);
|
||||
@ -372,7 +375,7 @@ index e076f6023c..8749c72066 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 301cd7b4e4..ba5a8fb82b 100644
|
||||
index 542c19e..916ab0e 100644
|
||||
--- a/hw/ppc/spapr_cpu_core.c
|
||||
+++ b/hw/ppc/spapr_cpu_core.c
|
||||
@@ -24,6 +24,7 @@
|
||||
@ -383,7 +386,7 @@ index 301cd7b4e4..ba5a8fb82b 100644
|
||||
|
||||
static void spapr_reset_vcpu(PowerPCCPU *cpu)
|
||||
{
|
||||
@@ -242,6 +243,7 @@ static void spapr_realize_vcpu(PowerPCCPU *cpu, SpaprMachineState *spapr,
|
||||
@@ -238,6 +239,7 @@ static void spapr_realize_vcpu(PowerPCCPU *cpu, SpaprMachineState *spapr,
|
||||
CPUPPCState *env = &cpu->env;
|
||||
CPUState *cs = CPU(cpu);
|
||||
Error *local_err = NULL;
|
||||
@ -391,7 +394,7 @@ index 301cd7b4e4..ba5a8fb82b 100644
|
||||
|
||||
object_property_set_bool(OBJECT(cpu), true, "realized", &local_err);
|
||||
if (local_err) {
|
||||
@@ -254,6 +256,17 @@ static void spapr_realize_vcpu(PowerPCCPU *cpu, SpaprMachineState *spapr,
|
||||
@@ -250,6 +252,17 @@ static void spapr_realize_vcpu(PowerPCCPU *cpu, SpaprMachineState *spapr,
|
||||
cpu_ppc_set_vhyp(cpu, PPC_VIRTUAL_HYPERVISOR(spapr));
|
||||
kvmppc_set_papr(cpu);
|
||||
|
||||
@ -410,22 +413,22 @@ index 301cd7b4e4..ba5a8fb82b 100644
|
||||
goto error_intc_create;
|
||||
}
|
||||
diff --git a/include/hw/ppc/spapr.h b/include/hw/ppc/spapr.h
|
||||
index d5ab5ea7b2..aa89cc4a95 100644
|
||||
index 42d64a0..c03611f 100644
|
||||
--- a/include/hw/ppc/spapr.h
|
||||
+++ b/include/hw/ppc/spapr.h
|
||||
@@ -125,6 +125,7 @@ struct SpaprMachineClass {
|
||||
bool linux_pci_probe;
|
||||
@@ -128,6 +128,7 @@ struct SpaprMachineClass {
|
||||
bool smp_threads_vsmt; /* set VSMT to smp_threads by default */
|
||||
hwaddr rma_limit; /* clamp the RMA to this size */
|
||||
|
||||
+ bool has_power9_support;
|
||||
void (*phb_placement)(SpaprMachineState *spapr, uint32_t index,
|
||||
uint64_t *buid, hwaddr *pio,
|
||||
hwaddr *mmio32, hwaddr *mmio64,
|
||||
diff --git a/target/ppc/compat.c b/target/ppc/compat.c
|
||||
index 7de4bf3122..3e2e35342d 100644
|
||||
index f48df25..34e3d0f 100644
|
||||
--- a/target/ppc/compat.c
|
||||
+++ b/target/ppc/compat.c
|
||||
@@ -105,8 +105,19 @@ static const CompatInfo *compat_by_pvr(uint32_t pvr)
|
||||
@@ -114,8 +114,19 @@ static const CompatInfo *compat_by_pvr(uint32_t pvr)
|
||||
return NULL;
|
||||
}
|
||||
|
||||
@ -447,10 +450,10 @@ index 7de4bf3122..3e2e35342d 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 e3e82327b7..5c53801cfd 100644
|
||||
index 88d9449..0d7f5f5 100644
|
||||
--- a/target/ppc/cpu.h
|
||||
+++ b/target/ppc/cpu.h
|
||||
@@ -1367,6 +1367,7 @@ static inline int cpu_mmu_index(CPUPPCState *env, bool ifetch)
|
||||
@@ -1323,6 +1323,7 @@ static inline int cpu_mmu_index(CPUPPCState *env, bool ifetch)
|
||||
|
||||
/* Compatibility modes */
|
||||
#if defined(TARGET_PPC64)
|
||||
@ -459,5 +462,5 @@ index e3e82327b7..5c53801cfd 100644
|
||||
uint32_t min_compat_pvr, uint32_t max_compat_pvr);
|
||||
bool ppc_type_check_compat(const char *cputype, uint32_t compat_pvr,
|
||||
--
|
||||
2.21.0
|
||||
1.8.3.1
|
||||
|
||||
|
@ -1,4 +1,4 @@
|
||||
From 0842700b3a01891c316e9169fa651f26714cafa5 Mon Sep 17 00:00:00 2001
|
||||
From 349c332a69933b977b40f4a2198236611d002818 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
|
||||
@ -20,17 +20,15 @@ Merged patches (4.2.0):
|
||||
- fb192e5 redhat: s390x: Rename s390-ccw-virtio-rhel8.0.0 to s390-ccw-virtio-rhel8.1.0
|
||||
- a9b22e8 redhat: s390x: Add proper compatibility options for the -rhel7.6.0 machine
|
||||
- hw/s390x: Add the s390-ccw-virtio-rhel8.2.0 machine types (patch 92954)
|
||||
|
||||
Signed-off-by: Danilo C. L. de Paula <ddepaula@redhat.com>
|
||||
---
|
||||
hw/s390x/s390-virtio-ccw.c | 70 +++++++++++++++++++++++++++++++++++++-
|
||||
1 file changed, 69 insertions(+), 1 deletion(-)
|
||||
hw/s390x/s390-virtio-ccw.c | 71 +++++++++++++++++++++++++++++++++++++++++++++-
|
||||
1 file changed, 70 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/hw/s390x/s390-virtio-ccw.c b/hw/s390x/s390-virtio-ccw.c
|
||||
index d3edeef0ad..c2c83d2fce 100644
|
||||
index 45292fb..1b3a04c 100644
|
||||
--- a/hw/s390x/s390-virtio-ccw.c
|
||||
+++ b/hw/s390x/s390-virtio-ccw.c
|
||||
@@ -615,7 +615,7 @@ bool css_migration_enabled(void)
|
||||
@@ -777,7 +777,7 @@ bool css_migration_enabled(void)
|
||||
{ \
|
||||
MachineClass *mc = MACHINE_CLASS(oc); \
|
||||
ccw_machine_##suffix##_class_options(mc); \
|
||||
@ -38,16 +36,16 @@ index d3edeef0ad..c2c83d2fce 100644
|
||||
+ mc->desc = "VirtIO-ccw based S390 machine " verstr; \
|
||||
if (latest) { \
|
||||
mc->alias = "s390-ccw-virtio"; \
|
||||
mc->is_default = 1; \
|
||||
@@ -639,6 +639,7 @@ bool css_migration_enabled(void)
|
||||
mc->is_default = true; \
|
||||
@@ -801,6 +801,7 @@ bool css_migration_enabled(void)
|
||||
} \
|
||||
type_init(ccw_machine_register_##suffix)
|
||||
|
||||
+#if 0 /* Disabled for Red Hat Enterprise Linux */
|
||||
static void ccw_machine_4_2_instance_options(MachineState *machine)
|
||||
static void ccw_machine_5_0_instance_options(MachineState *machine)
|
||||
{
|
||||
}
|
||||
@@ -866,6 +867,73 @@ static void ccw_machine_2_4_class_options(MachineClass *mc)
|
||||
@@ -1041,6 +1042,74 @@ 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);
|
||||
@ -59,6 +57,7 @@ index d3edeef0ad..c2c83d2fce 100644
|
||||
+
|
||||
+static void ccw_machine_rhel820_class_options(MachineClass *mc)
|
||||
+{
|
||||
+ mc->fixup_ram_size = s390_fixup_ram_size;
|
||||
+}
|
||||
+DEFINE_CCW_MACHINE(rhel820, "rhel8.2.0", true);
|
||||
+
|
||||
@ -122,5 +121,5 @@ index d3edeef0ad..c2c83d2fce 100644
|
||||
static void ccw_machine_register_types(void)
|
||||
{
|
||||
--
|
||||
2.21.0
|
||||
1.8.3.1
|
||||
|
||||
|
@ -1,4 +1,4 @@
|
||||
From 2ebaeca6e26950f401a8169d1324be2bafd11741 Mon Sep 17 00:00:00 2001
|
||||
From 9da7d3c4b5a90c155ea4227c412b0ebd4d2a9b87 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
|
||||
@ -37,23 +37,27 @@ Merged patches (4.2.0):
|
||||
- 0784125 x86 machine types: add pc-q35-rhel8.1.0
|
||||
- machines/x86: Add rhel 8.2 machine type (patch 92959)
|
||||
|
||||
Signed-off-by: Danilo C. L. de Paula <ddepaula@redhat.com>
|
||||
Merged patches (weekly-200122):
|
||||
- 481357e RHEL: hw/i386: disable nested PERF_GLOBAL_CTRL MSR support
|
||||
|
||||
Merged patches (weekly-200318):
|
||||
- e6c3fbf hw/smbios: set new default SMBIOS fields for Windows driver support (partialy)
|
||||
---
|
||||
hw/i386/acpi-build.c | 3 +
|
||||
hw/i386/pc.c | 263 ++++++++++++++++++++++++++++++++++++++++++-
|
||||
hw/i386/pc_piix.c | 210 +++++++++++++++++++++++++++++++++-
|
||||
hw/i386/pc_q35.c | 156 ++++++++++++++++++++++++-
|
||||
hw/i386/pc.c | 265 ++++++++++++++++++++++++++++++++++++++++++++++++++-
|
||||
hw/i386/pc_piix.c | 210 +++++++++++++++++++++++++++++++++++++++-
|
||||
hw/i386/pc_q35.c | 162 ++++++++++++++++++++++++++++++-
|
||||
include/hw/boards.h | 2 +
|
||||
include/hw/i386/pc.h | 33 ++++++
|
||||
target/i386/cpu.c | 9 +-
|
||||
include/hw/i386/pc.h | 33 +++++++
|
||||
target/i386/cpu.c | 3 +-
|
||||
target/i386/kvm.c | 4 +
|
||||
8 files changed, 673 insertions(+), 7 deletions(-)
|
||||
8 files changed, 675 insertions(+), 7 deletions(-)
|
||||
|
||||
diff --git a/hw/i386/acpi-build.c b/hw/i386/acpi-build.c
|
||||
index 12ff55fcfb..64001893ab 100644
|
||||
index 2e15f68..8dbf49b 100644
|
||||
--- a/hw/i386/acpi-build.c
|
||||
+++ b/hw/i386/acpi-build.c
|
||||
@@ -204,6 +204,9 @@ static void acpi_get_pm_info(MachineState *machine, AcpiPmInfo *pm)
|
||||
@@ -213,6 +213,9 @@ static void acpi_get_pm_info(MachineState *machine, AcpiPmInfo *pm)
|
||||
pm->fadt.reset_reg = r;
|
||||
pm->fadt.reset_val = 0xf;
|
||||
pm->fadt.flags |= 1 << ACPI_FADT_F_RESET_REG_SUP;
|
||||
@ -64,10 +68,10 @@ index 12ff55fcfb..64001893ab 100644
|
||||
}
|
||||
|
||||
diff --git a/hw/i386/pc.c b/hw/i386/pc.c
|
||||
index ac08e63604..61e70e4811 100644
|
||||
index f6b8431..2ed002f 100644
|
||||
--- a/hw/i386/pc.c
|
||||
+++ b/hw/i386/pc.c
|
||||
@@ -344,6 +344,261 @@ GlobalProperty pc_compat_1_4[] = {
|
||||
@@ -341,6 +341,263 @@ GlobalProperty pc_compat_1_4[] = {
|
||||
};
|
||||
const size_t pc_compat_1_4_len = G_N_ELEMENTS(pc_compat_1_4);
|
||||
|
||||
@ -78,6 +82,8 @@ index ac08e63604..61e70e4811 100644
|
||||
+GlobalProperty pc_rhel_compat[] = {
|
||||
+ { 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" },
|
||||
+ { TYPE_X86_CPU, "vmx-exit-load-perf-global-ctrl", "off" },
|
||||
+ /* bz 1508330 */
|
||||
+ { "vfio-pci", "x-no-geforce-quirks", "on" },
|
||||
+};
|
||||
@ -326,10 +332,10 @@ index ac08e63604..61e70e4811 100644
|
||||
+};
|
||||
+const size_t pc_rhel_7_0_compat_len = G_N_ELEMENTS(pc_rhel_7_0_compat);
|
||||
+
|
||||
void gsi_handler(void *opaque, int n, int level)
|
||||
GSIState *pc_gsi_create(qemu_irq **irqs, bool pci_enabled)
|
||||
{
|
||||
GSIState *s = opaque;
|
||||
@@ -1225,7 +1480,8 @@ void pc_memory_init(PCMachineState *pcms,
|
||||
GSIState *s;
|
||||
@@ -1031,7 +1288,8 @@ void pc_memory_init(PCMachineState *pcms,
|
||||
option_rom_mr = g_malloc(sizeof(*option_rom_mr));
|
||||
memory_region_init_ram(option_rom_mr, NULL, "pc.rom", PC_ROM_SIZE,
|
||||
&error_fatal);
|
||||
@ -339,7 +345,7 @@ index ac08e63604..61e70e4811 100644
|
||||
memory_region_set_readonly(option_rom_mr, true);
|
||||
}
|
||||
memory_region_add_subregion_overlap(rom_memory,
|
||||
@@ -2198,6 +2454,8 @@ static void pc_machine_class_init(ObjectClass *oc, void *data)
|
||||
@@ -1937,6 +2195,8 @@ static void pc_machine_class_init(ObjectClass *oc, void *data)
|
||||
pcmc->linuxboot_dma_enabled = true;
|
||||
pcmc->pvh_enabled = true;
|
||||
assert(!mc->get_hotplug_handler);
|
||||
@ -348,7 +354,7 @@ index ac08e63604..61e70e4811 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;
|
||||
@@ -2209,7 +2467,8 @@ static void pc_machine_class_init(ObjectClass *oc, void *data)
|
||||
@@ -1948,7 +2208,8 @@ static void pc_machine_class_init(ObjectClass *oc, void *data)
|
||||
mc->hot_add_cpu = pc_hot_add_cpu;
|
||||
mc->smp_parse = pc_smp_parse;
|
||||
mc->block_default_type = IF_IDE;
|
||||
@ -359,7 +365,7 @@ index ac08e63604..61e70e4811 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 1bd70d1abb..bd7fdb99bb 100644
|
||||
index b255d56..8eb64d1 100644
|
||||
--- a/hw/i386/pc_piix.c
|
||||
+++ b/hw/i386/pc_piix.c
|
||||
@@ -53,6 +53,7 @@
|
||||
@ -370,7 +376,7 @@ index 1bd70d1abb..bd7fdb99bb 100644
|
||||
#ifdef CONFIG_XEN
|
||||
#include <xen/hvm/hvm_info_table.h>
|
||||
#include "hw/xen/xen_pt.h"
|
||||
@@ -173,8 +174,8 @@ static void pc_init1(MachineState *machine,
|
||||
@@ -174,8 +175,8 @@ static void pc_init1(MachineState *machine,
|
||||
if (pcmc->smbios_defaults) {
|
||||
MachineClass *mc = MACHINE_GET_CLASS(machine);
|
||||
/* These values are guest ABI, do not change */
|
||||
@ -379,19 +385,19 @@ index 1bd70d1abb..bd7fdb99bb 100644
|
||||
+ smbios_set_defaults("Red Hat", "KVM",
|
||||
+ mc->desc, pcmc->smbios_legacy_mode,
|
||||
pcmc->smbios_uuid_encoded,
|
||||
SMBIOS_ENTRY_POINT_21);
|
||||
}
|
||||
@@ -307,6 +308,7 @@ else {
|
||||
pcmc->smbios_stream_product,
|
||||
pcmc->smbios_stream_version,
|
||||
@@ -312,6 +313,7 @@ static void pc_init1(MachineState *machine,
|
||||
* hw_compat_*, pc_compat_*, or * pc_*_machine_options().
|
||||
*/
|
||||
|
||||
+#if 0 /* Disabled for Red Hat Enterprise Linux */
|
||||
static void pc_compat_2_3_fn(MachineState *machine)
|
||||
{
|
||||
PCMachineState *pcms = PC_MACHINE(machine);
|
||||
@@ -1026,3 +1028,207 @@ static void xenfv_machine_options(MachineClass *m)
|
||||
DEFINE_PC_MACHINE(xenfv, "xenfv", pc_xen_hvm_init,
|
||||
xenfv_machine_options);
|
||||
X86MachineState *x86ms = X86_MACHINE(machine);
|
||||
@@ -975,3 +977,207 @@ 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
|
||||
+#endif /* Disabled for Red Hat Enterprise Linux */
|
||||
+
|
||||
@ -598,10 +604,10 @@ index 1bd70d1abb..bd7fdb99bb 100644
|
||||
+DEFINE_PC_MACHINE(rhel700, "pc-i440fx-rhel7.0.0", pc_init_rhel700,
|
||||
+ pc_machine_rhel700_options);
|
||||
diff --git a/hw/i386/pc_q35.c b/hw/i386/pc_q35.c
|
||||
index 385e5cffb1..7531d8ed76 100644
|
||||
index 461e1cd..f5ae759 100644
|
||||
--- a/hw/i386/pc_q35.c
|
||||
+++ b/hw/i386/pc_q35.c
|
||||
@@ -197,8 +197,8 @@ static void pc_q35_init(MachineState *machine)
|
||||
@@ -199,8 +199,8 @@ static void pc_q35_init(MachineState *machine)
|
||||
|
||||
if (pcmc->smbios_defaults) {
|
||||
/* These values are guest ABI, do not change */
|
||||
@ -610,9 +616,9 @@ index 385e5cffb1..7531d8ed76 100644
|
||||
+ smbios_set_defaults("Red Hat", "KVM",
|
||||
+ mc->desc, pcmc->smbios_legacy_mode,
|
||||
pcmc->smbios_uuid_encoded,
|
||||
SMBIOS_ENTRY_POINT_21);
|
||||
}
|
||||
@@ -330,6 +330,7 @@ static void pc_q35_init(MachineState *machine)
|
||||
pcmc->smbios_stream_product,
|
||||
pcmc->smbios_stream_version,
|
||||
@@ -335,6 +335,7 @@ static void pc_q35_init(MachineState *machine)
|
||||
DEFINE_PC_MACHINE(suffix, name, pc_init_##suffix, optionfn)
|
||||
|
||||
|
||||
@ -620,7 +626,7 @@ index 385e5cffb1..7531d8ed76 100644
|
||||
static void pc_q35_machine_options(MachineClass *m)
|
||||
{
|
||||
PCMachineClass *pcmc = PC_MACHINE_CLASS(m);
|
||||
@@ -533,3 +534,154 @@ static void pc_q35_2_4_machine_options(MachineClass *m)
|
||||
@@ -549,3 +550,160 @@ 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);
|
||||
@ -655,8 +661,11 @@ index 385e5cffb1..7531d8ed76 100644
|
||||
+
|
||||
+static void pc_q35_machine_rhel820_options(MachineClass *m)
|
||||
+{
|
||||
+ PCMachineClass *pcmc = PC_MACHINE_CLASS(m);
|
||||
+ pc_q35_machine_rhel_options(m);
|
||||
+ m->desc = "RHEL-8.2.0 PC (Q35 + ICH9, 2009)";
|
||||
+ pcmc->smbios_stream_product = "RHEL-AV";
|
||||
+ pcmc->smbios_stream_version = "8.2.0";
|
||||
+}
|
||||
+
|
||||
+DEFINE_PC_MACHINE(q35_rhel820, "pc-q35-rhel8.2.0", pc_q35_init_rhel820,
|
||||
@ -669,9 +678,12 @@ index 385e5cffb1..7531d8ed76 100644
|
||||
+
|
||||
+static void pc_q35_machine_rhel810_options(MachineClass *m)
|
||||
+{
|
||||
+ PCMachineClass *pcmc = PC_MACHINE_CLASS(m);
|
||||
+ pc_q35_machine_rhel820_options(m);
|
||||
+ m->desc = "RHEL-8.1.0 PC (Q35 + ICH9, 2009)";
|
||||
+ m->alias = NULL;
|
||||
+ pcmc->smbios_stream_product = NULL;
|
||||
+ pcmc->smbios_stream_version = NULL;
|
||||
+ compat_props_add(m->compat_props, hw_compat_rhel_8_1, hw_compat_rhel_8_1_len);
|
||||
+ compat_props_add(m->compat_props, pc_rhel_8_1_compat, pc_rhel_8_1_compat_len);
|
||||
+}
|
||||
@ -776,10 +788,10 @@ index 385e5cffb1..7531d8ed76 100644
|
||||
+DEFINE_PC_MACHINE(q35_rhel730, "pc-q35-rhel7.3.0", pc_q35_init_rhel730,
|
||||
+ pc_q35_machine_rhel730_options);
|
||||
diff --git a/include/hw/boards.h b/include/hw/boards.h
|
||||
index 6f85a0e032..2920bdef5b 100644
|
||||
index 0046ab5..d81225b 100644
|
||||
--- a/include/hw/boards.h
|
||||
+++ b/include/hw/boards.h
|
||||
@@ -222,6 +222,8 @@ struct MachineClass {
|
||||
@@ -207,6 +207,8 @@ struct MachineClass {
|
||||
const char **valid_cpu_types;
|
||||
strList *allowed_dynamic_sysbus_devices;
|
||||
bool auto_enable_numa_with_memhp;
|
||||
@ -789,10 +801,10 @@ index 6f85a0e032..2920bdef5b 100644
|
||||
int nb_nodes, ram_addr_t size);
|
||||
bool ignore_boot_device_suffixes;
|
||||
diff --git a/include/hw/i386/pc.h b/include/hw/i386/pc.h
|
||||
index 1f86eba3f9..2e362c8faa 100644
|
||||
index 811c3d5..5b90f8b 100644
|
||||
--- a/include/hw/i386/pc.h
|
||||
+++ b/include/hw/i386/pc.h
|
||||
@@ -124,6 +124,9 @@ typedef struct PCMachineClass {
|
||||
@@ -118,6 +118,9 @@ typedef struct PCMachineClass {
|
||||
|
||||
/* use PVH to load kernels that support this feature */
|
||||
bool pvh_enabled;
|
||||
@ -802,7 +814,7 @@ index 1f86eba3f9..2e362c8faa 100644
|
||||
} PCMachineClass;
|
||||
|
||||
#define TYPE_PC_MACHINE "generic-pc-machine"
|
||||
@@ -300,6 +303,36 @@ extern const size_t pc_compat_1_5_len;
|
||||
@@ -260,6 +263,36 @@ extern const size_t pc_compat_1_5_len;
|
||||
extern GlobalProperty pc_compat_1_4[];
|
||||
extern const size_t pc_compat_1_4_len;
|
||||
|
||||
@ -840,20 +852,10 @@ index 1f86eba3f9..2e362c8faa 100644
|
||||
* depending on QEMU versions up to QEMU 2.4.
|
||||
*/
|
||||
diff --git a/target/i386/cpu.c b/target/i386/cpu.c
|
||||
index 1b7880ae3a..790db778ab 100644
|
||||
index 26a8584..dc4d1c9 100644
|
||||
--- a/target/i386/cpu.c
|
||||
+++ b/target/i386/cpu.c
|
||||
@@ -1829,11 +1829,17 @@ static CPUCaches epyc_cache_info = {
|
||||
|
||||
static X86CPUDefinition builtin_x86_defs[] = {
|
||||
{
|
||||
+ /* qemu64 is the default CPU model for all *-rhel7.* machine-types.
|
||||
+ * The default on RHEL-6 was cpu64-rhel6.
|
||||
+ * libvirt assumes that qemu64 is the default for _all_ machine-types,
|
||||
+ * so we should try to keep qemu64 and cpu64-rhel6 as similar as
|
||||
+ * possible.
|
||||
+ */
|
||||
.name = "qemu64",
|
||||
@@ -1806,7 +1806,7 @@ static X86CPUDefinition builtin_x86_defs[] = {
|
||||
.level = 0xd,
|
||||
.vendor = CPUID_VENDOR_AMD,
|
||||
.family = 6,
|
||||
@ -862,7 +864,7 @@ index 1b7880ae3a..790db778ab 100644
|
||||
.stepping = 3,
|
||||
.features[FEAT_1_EDX] = CPUID_SSE2 | CPUID_SSE | CPUID_FXSR |
|
||||
CPUID_MMX | CPUID_CLFLUSH | CPUID_PSE36 | CPUID_PAT | CPUID_CMOV |
|
||||
@@ -3932,6 +3938,7 @@ static PropValue kvm_default_props[] = {
|
||||
@@ -4085,6 +4085,7 @@ static PropValue kvm_default_props[] = {
|
||||
{ "acpi", "off" },
|
||||
{ "monitor", "off" },
|
||||
{ "svm", "off" },
|
||||
@ -871,10 +873,10 @@ index 1b7880ae3a..790db778ab 100644
|
||||
};
|
||||
|
||||
diff --git a/target/i386/kvm.c b/target/i386/kvm.c
|
||||
index 1d10046a6c..86d9a1f364 100644
|
||||
index 4901c6d..e41cff2 100644
|
||||
--- a/target/i386/kvm.c
|
||||
+++ b/target/i386/kvm.c
|
||||
@@ -3079,6 +3079,7 @@ static int kvm_get_msrs(X86CPU *cpu)
|
||||
@@ -3113,6 +3113,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;
|
||||
@ -882,7 +884,7 @@ index 1d10046a6c..86d9a1f364 100644
|
||||
|
||||
kvm_msr_buf_reset(cpu);
|
||||
|
||||
@@ -3388,6 +3389,9 @@ static int kvm_get_msrs(X86CPU *cpu)
|
||||
@@ -3422,6 +3423,9 @@ static int kvm_get_msrs(X86CPU *cpu)
|
||||
break;
|
||||
case MSR_KVM_ASYNC_PF_EN:
|
||||
env->async_pf_en_msr = msrs[i].data;
|
||||
@ -893,5 +895,5 @@ index 1d10046a6c..86d9a1f364 100644
|
||||
case MSR_KVM_PV_EOI_EN:
|
||||
env->pv_eoi_en_msr = msrs[i].data;
|
||||
--
|
||||
2.21.0
|
||||
1.8.3.1
|
||||
|
||||
|
@ -1,4 +1,4 @@
|
||||
From 154215041df085271a780a2989f4f481226e3e34 Mon Sep 17 00:00:00 2001
|
||||
From 0114b7010c87be70014b170ffdf66e1317f6becc Mon Sep 17 00:00:00 2001
|
||||
From: Miroslav Rezanina <mrezanin@redhat.com>
|
||||
Date: Fri, 19 Oct 2018 13:48:41 +0200
|
||||
Subject: Enable make check
|
||||
@ -22,185 +22,36 @@ Rebase changes (4.1.0-rc1):
|
||||
Rebase changes (4.2.0-rc0):
|
||||
- partially disable hd-geo-test (requires lsi53c895a)
|
||||
|
||||
Rebase changes (weekly-200129):
|
||||
- Disable qtest/q35-test (uses upstream machine types)
|
||||
|
||||
Rebased changes (weekly-200212):
|
||||
- Do not run iotests on make check
|
||||
|
||||
Merged patches (4.0.0):
|
||||
- f7ffd13 Remove 7 qcow2 and luks iotests that are taking > 25 sec to run during the fast train build proce
|
||||
|
||||
Merged patches (4.1.0-rc0):
|
||||
- 41288ff redhat: Remove raw iotest 205
|
||||
|
||||
Signed-off-by: Danilo C. L. de Paula <ddepaula@redhat.com>
|
||||
---
|
||||
redhat/qemu-kvm.spec.template | 2 +-
|
||||
tests/Makefile.include | 10 +++++-----
|
||||
tests/boot-serial-test.c | 6 +++++-
|
||||
tests/cpu-plug-test.c | 4 ++--
|
||||
tests/e1000-test.c | 2 ++
|
||||
tests/hd-geo-test.c | 4 ++++
|
||||
tests/prom-env-test.c | 4 ++++
|
||||
tests/qemu-iotests/051 | 12 ++++++------
|
||||
tests/qemu-iotests/group | 4 ++--
|
||||
tests/test-x86-cpuid-compat.c | 2 ++
|
||||
tests/usb-hcd-xhci-test.c | 4 ++++
|
||||
11 files changed, 37 insertions(+), 17 deletions(-)
|
||||
redhat/qemu-kvm.spec.template | 2 +-
|
||||
tests/qemu-iotests/051 | 12 ++++++------
|
||||
tests/qemu-iotests/group | 4 ++--
|
||||
tests/qtest/Makefile.include | 12 ++++++------
|
||||
tests/qtest/boot-serial-test.c | 6 +++++-
|
||||
tests/qtest/cpu-plug-test.c | 4 ++--
|
||||
tests/qtest/e1000-test.c | 2 ++
|
||||
tests/qtest/hd-geo-test.c | 4 ++++
|
||||
tests/qtest/prom-env-test.c | 4 ++++
|
||||
tests/qtest/test-x86-cpuid-compat.c | 2 ++
|
||||
tests/qtest/usb-hcd-xhci-test.c | 4 ++++
|
||||
11 files changed, 38 insertions(+), 18 deletions(-)
|
||||
|
||||
diff --git a/tests/Makefile.include b/tests/Makefile.include
|
||||
index b483790cf3..53bdbdfee0 100644
|
||||
--- a/tests/Makefile.include
|
||||
+++ b/tests/Makefile.include
|
||||
@@ -172,7 +172,7 @@ check-qtest-i386-y += tests/ide-test$(EXESUF)
|
||||
check-qtest-i386-y += tests/ahci-test$(EXESUF)
|
||||
check-qtest-i386-y += tests/hd-geo-test$(EXESUF)
|
||||
check-qtest-i386-y += tests/boot-order-test$(EXESUF)
|
||||
-check-qtest-i386-y += tests/bios-tables-test$(EXESUF)
|
||||
+#check-qtest-i386-y += tests/bios-tables-test$(EXESUF)
|
||||
check-qtest-i386-$(CONFIG_SGA) += tests/boot-serial-test$(EXESUF)
|
||||
check-qtest-i386-$(CONFIG_SLIRP) += tests/pxe-test$(EXESUF)
|
||||
check-qtest-i386-y += tests/rtc-test$(EXESUF)
|
||||
@@ -230,7 +230,7 @@ check-qtest-mips64el-$(CONFIG_VGA) += tests/display-vga-test$(EXESUF)
|
||||
check-qtest-moxie-y += tests/boot-serial-test$(EXESUF)
|
||||
|
||||
check-qtest-ppc-$(CONFIG_ISA_TESTDEV) = tests/endianness-test$(EXESUF)
|
||||
-check-qtest-ppc-y += tests/boot-order-test$(EXESUF)
|
||||
+#check-qtest-ppc-y += tests/boot-order-test$(EXESUF)
|
||||
check-qtest-ppc-y += tests/prom-env-test$(EXESUF)
|
||||
check-qtest-ppc-y += tests/drive_del-test$(EXESUF)
|
||||
check-qtest-ppc-y += tests/boot-serial-test$(EXESUF)
|
||||
@@ -244,8 +244,8 @@ check-qtest-ppc64-$(CONFIG_PSERIES) += tests/rtas-test$(EXESUF)
|
||||
check-qtest-ppc64-$(CONFIG_SLIRP) += tests/pxe-test$(EXESUF)
|
||||
check-qtest-ppc64-$(CONFIG_USB_UHCI) += tests/usb-hcd-uhci-test$(EXESUF)
|
||||
check-qtest-ppc64-$(CONFIG_USB_XHCI_NEC) += tests/usb-hcd-xhci-test$(EXESUF)
|
||||
-check-qtest-ppc64-$(CONFIG_SLIRP) += tests/test-netfilter$(EXESUF)
|
||||
-check-qtest-ppc64-$(CONFIG_POSIX) += tests/test-filter-mirror$(EXESUF)
|
||||
+#check-qtest-ppc64-$(CONFIG_SLIRP) += tests/test-netfilter$(EXESUF)
|
||||
+#check-qtest-ppc64-$(CONFIG_POSIX) += tests/test-filter-mirror$(EXESUF)
|
||||
check-qtest-ppc64-$(CONFIG_RTL8139_PCI) += tests/test-filter-redirector$(EXESUF)
|
||||
check-qtest-ppc64-$(CONFIG_VGA) += tests/display-vga-test$(EXESUF)
|
||||
check-qtest-ppc64-y += tests/numa-test$(EXESUF)
|
||||
@@ -291,7 +291,7 @@ check-qtest-s390x-$(CONFIG_SLIRP) += tests/test-netfilter$(EXESUF)
|
||||
check-qtest-s390x-$(CONFIG_POSIX) += tests/test-filter-mirror$(EXESUF)
|
||||
check-qtest-s390x-$(CONFIG_POSIX) += tests/test-filter-redirector$(EXESUF)
|
||||
check-qtest-s390x-y += tests/drive_del-test$(EXESUF)
|
||||
-check-qtest-s390x-y += tests/device-plug-test$(EXESUF)
|
||||
+#check-qtest-s390x-y += tests/device-plug-test$(EXESUF)
|
||||
check-qtest-s390x-y += tests/virtio-ccw-test$(EXESUF)
|
||||
check-qtest-s390x-y += tests/cpu-plug-test$(EXESUF)
|
||||
check-qtest-s390x-y += tests/migration-test$(EXESUF)
|
||||
diff --git a/tests/boot-serial-test.c b/tests/boot-serial-test.c
|
||||
index d3a54a0ba5..33ce72b89c 100644
|
||||
--- a/tests/boot-serial-test.c
|
||||
+++ b/tests/boot-serial-test.c
|
||||
@@ -108,19 +108,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 cap-cfpc=broken,cap-sbbc=broken,cap-ibs=broken",
|
||||
"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/cpu-plug-test.c b/tests/cpu-plug-test.c
|
||||
index 30e514bbfb..a04beae1c6 100644
|
||||
--- a/tests/cpu-plug-test.c
|
||||
+++ b/tests/cpu-plug-test.c
|
||||
@@ -185,8 +185,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/e1000-test.c b/tests/e1000-test.c
|
||||
index c387984ef6..c89112d6f8 100644
|
||||
--- a/tests/e1000-test.c
|
||||
+++ b/tests/e1000-test.c
|
||||
@@ -22,9 +22,11 @@ struct QE1000 {
|
||||
|
||||
static const char *models[] = {
|
||||
"e1000",
|
||||
+#if 0 /* Disabled for Red Hat Enterprise Linux */
|
||||
"e1000-82540em",
|
||||
"e1000-82544gc",
|
||||
"e1000-82545em",
|
||||
+#endif
|
||||
};
|
||||
|
||||
static void *e1000_get_driver(void *obj, const char *interface)
|
||||
diff --git a/tests/hd-geo-test.c b/tests/hd-geo-test.c
|
||||
index 7e86c5416c..cc068bad87 100644
|
||||
--- a/tests/hd-geo-test.c
|
||||
+++ b/tests/hd-geo-test.c
|
||||
@@ -732,6 +732,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();
|
||||
@@ -776,6 +777,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)
|
||||
{
|
||||
@@ -951,9 +953,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/prom-env-test.c b/tests/prom-env-test.c
|
||||
index 61bc1d1e7b..028d45c7d7 100644
|
||||
--- a/tests/prom-env-test.c
|
||||
+++ b/tests/prom-env-test.c
|
||||
@@ -88,10 +88,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/qemu-iotests/051 b/tests/qemu-iotests/051
|
||||
index 53bcdbc911..b387e0c233 100755
|
||||
index 034d3a3..aadc413 100755
|
||||
--- a/tests/qemu-iotests/051
|
||||
+++ b/tests/qemu-iotests/051
|
||||
@@ -181,11 +181,11 @@ run_qemu -drive if=virtio
|
||||
@@ -183,11 +183,11 @@ run_qemu -drive if=virtio
|
||||
case "$QEMU_DEFAULT_MACHINE" in
|
||||
pc)
|
||||
run_qemu -drive if=none,id=disk -device ide-cd,drive=disk
|
||||
@ -215,7 +66,7 @@ index 53bcdbc911..b387e0c233 100755
|
||||
;;
|
||||
*)
|
||||
;;
|
||||
@@ -234,11 +234,11 @@ run_qemu -drive file="$TEST_IMG",if=virtio,readonly=on
|
||||
@@ -236,11 +236,11 @@ 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
|
||||
@ -231,7 +82,7 @@ index 53bcdbc911..b387e0c233 100755
|
||||
*)
|
||||
;;
|
||||
diff --git a/tests/qemu-iotests/group b/tests/qemu-iotests/group
|
||||
index 6b10a6a762..06cc734b26 100644
|
||||
index 1710470..0711b66 100644
|
||||
--- a/tests/qemu-iotests/group
|
||||
+++ b/tests/qemu-iotests/group
|
||||
@@ -92,7 +92,7 @@
|
||||
@ -252,10 +103,172 @@ index 6b10a6a762..06cc734b26 100644
|
||||
# 100 was removed, do not reuse
|
||||
101 rw quick
|
||||
102 rw quick
|
||||
diff --git a/tests/test-x86-cpuid-compat.c b/tests/test-x86-cpuid-compat.c
|
||||
index 772287bdb4..e7c075ed98 100644
|
||||
--- a/tests/test-x86-cpuid-compat.c
|
||||
+++ b/tests/test-x86-cpuid-compat.c
|
||||
diff --git a/tests/qtest/Makefile.include b/tests/qtest/Makefile.include
|
||||
index 9e5a51d..0732f59 100644
|
||||
--- a/tests/qtest/Makefile.include
|
||||
+++ b/tests/qtest/Makefile.include
|
||||
@@ -29,7 +29,7 @@ check-qtest-i386-y += ide-test
|
||||
check-qtest-i386-$(CONFIG_TOOLS) += ahci-test
|
||||
check-qtest-i386-y += hd-geo-test
|
||||
check-qtest-i386-y += boot-order-test
|
||||
-check-qtest-i386-y += bios-tables-test
|
||||
+#check-qtest-i386-y += bios-tables-test
|
||||
check-qtest-i386-$(CONFIG_SGA) += boot-serial-test
|
||||
check-qtest-i386-$(CONFIG_SLIRP) += pxe-test
|
||||
check-qtest-i386-y += rtc-test
|
||||
@@ -51,7 +51,7 @@ check-qtest-i386-$(CONFIG_USB_UHCI) += usb-hcd-uhci-test
|
||||
check-qtest-i386-$(call land,$(CONFIG_USB_EHCI),$(CONFIG_USB_UHCI)) += usb-hcd-ehci-test
|
||||
check-qtest-i386-$(CONFIG_USB_XHCI_NEC) += usb-hcd-xhci-test
|
||||
check-qtest-i386-y += cpu-plug-test
|
||||
-check-qtest-i386-y += q35-test
|
||||
+#check-qtest-i386-y += q35-test
|
||||
check-qtest-i386-y += vmgenid-test
|
||||
check-qtest-i386-$(CONFIG_TPM_CRB) += tpm-crb-swtpm-test
|
||||
check-qtest-i386-$(CONFIG_TPM_CRB) += tpm-crb-test
|
||||
@@ -88,7 +88,7 @@ check-qtest-mips64el-$(CONFIG_VGA) += display-vga-test
|
||||
check-qtest-moxie-y += boot-serial-test
|
||||
|
||||
check-qtest-ppc-$(CONFIG_ISA_TESTDEV) = endianness-test
|
||||
-check-qtest-ppc-y += boot-order-test
|
||||
+#check-qtest-ppc-y += boot-order-test
|
||||
check-qtest-ppc-y += prom-env-test
|
||||
check-qtest-ppc-y += drive_del-test
|
||||
check-qtest-ppc-y += boot-serial-test
|
||||
@@ -102,8 +102,8 @@ check-qtest-ppc64-$(CONFIG_PSERIES) += rtas-test
|
||||
check-qtest-ppc64-$(CONFIG_SLIRP) += pxe-test
|
||||
check-qtest-ppc64-$(CONFIG_USB_UHCI) += usb-hcd-uhci-test
|
||||
check-qtest-ppc64-$(CONFIG_USB_XHCI_NEC) += usb-hcd-xhci-test
|
||||
-check-qtest-ppc64-$(CONFIG_SLIRP) += test-netfilter
|
||||
-check-qtest-ppc64-$(CONFIG_POSIX) += test-filter-mirror
|
||||
+#check-qtest-ppc64-$(CONFIG_SLIRP) += test-netfilter
|
||||
+#check-qtest-ppc64-$(CONFIG_POSIX) += test-filter-mirror
|
||||
check-qtest-ppc64-$(CONFIG_RTL8139_PCI) += test-filter-redirector
|
||||
check-qtest-ppc64-$(CONFIG_VGA) += display-vga-test
|
||||
check-qtest-ppc64-y += numa-test
|
||||
@@ -152,7 +152,7 @@ check-qtest-s390x-$(CONFIG_SLIRP) += test-netfilter
|
||||
check-qtest-s390x-$(CONFIG_POSIX) += test-filter-mirror
|
||||
check-qtest-s390x-$(CONFIG_POSIX) += test-filter-redirector
|
||||
check-qtest-s390x-y += drive_del-test
|
||||
-check-qtest-s390x-y += device-plug-test
|
||||
+#check-qtest-s390x-y += device-plug-test
|
||||
check-qtest-s390x-y += virtio-ccw-test
|
||||
check-qtest-s390x-y += cpu-plug-test
|
||||
check-qtest-s390x-y += migration-test
|
||||
diff --git a/tests/qtest/boot-serial-test.c b/tests/qtest/boot-serial-test.c
|
||||
index 85a3614..1c18441 100644
|
||||
--- a/tests/qtest/boot-serial-test.c
|
||||
+++ b/tests/qtest/boot-serial-test.c
|
||||
@@ -109,19 +109,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/cpu-plug-test.c b/tests/qtest/cpu-plug-test.c
|
||||
index e8ffbbc..fda7269 100644
|
||||
--- a/tests/qtest/cpu-plug-test.c
|
||||
+++ b/tests/qtest/cpu-plug-test.c
|
||||
@@ -181,8 +181,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/e1000-test.c b/tests/qtest/e1000-test.c
|
||||
index c387984..c89112d 100644
|
||||
--- a/tests/qtest/e1000-test.c
|
||||
+++ b/tests/qtest/e1000-test.c
|
||||
@@ -22,9 +22,11 @@ struct QE1000 {
|
||||
|
||||
static const char *models[] = {
|
||||
"e1000",
|
||||
+#if 0 /* Disabled for Red Hat Enterprise Linux */
|
||||
"e1000-82540em",
|
||||
"e1000-82544gc",
|
||||
"e1000-82545em",
|
||||
+#endif
|
||||
};
|
||||
|
||||
static void *e1000_get_driver(void *obj, const char *interface)
|
||||
diff --git a/tests/qtest/hd-geo-test.c b/tests/qtest/hd-geo-test.c
|
||||
index 48e8e02..6496196 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/prom-env-test.c b/tests/qtest/prom-env-test.c
|
||||
index 60e6ec3..f9d6adc 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 772287b..e7c075e 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",
|
||||
"xlevel2", 0xC0000002);
|
||||
@ -272,10 +285,10 @@ index 772287bdb4..e7c075ed98 100644
|
||||
|
||||
/* Test feature parsing */
|
||||
add_feature_test("x86/cpuid/features/plus",
|
||||
diff --git a/tests/usb-hcd-xhci-test.c b/tests/usb-hcd-xhci-test.c
|
||||
index 10ef9d2a91..3855873050 100644
|
||||
--- a/tests/usb-hcd-xhci-test.c
|
||||
+++ b/tests/usb-hcd-xhci-test.c
|
||||
diff --git a/tests/qtest/usb-hcd-xhci-test.c b/tests/qtest/usb-hcd-xhci-test.c
|
||||
index 10ef9d2..3855873 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);
|
||||
}
|
||||
@ -303,5 +316,5 @@ index 10ef9d2a91..3855873050 100644
|
||||
|
||||
qtest_start("-device nec-usb-xhci,id=xhci"
|
||||
--
|
||||
2.21.0
|
||||
1.8.3.1
|
||||
|
||||
|
@ -1,4 +1,4 @@
|
||||
From de433da59448eaad4ac1b902d07d57b57f922aff Mon Sep 17 00:00:00 2001
|
||||
From e77808a25ee638b717e1507a1e55cbf8350afbfd 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
|
||||
@ -35,14 +35,13 @@ Merged patches (2.9.0):
|
||||
|
||||
(cherry picked from commit 9fa3c9fc6dfcde76d80db1aa601b2d577f72ceec)
|
||||
(cherry picked from commit 3cb35556dc7d994f203d732fe952f95fcdb03c0a)
|
||||
Signed-off-by: Danilo C. L. de Paula <ddepaula@redhat.com>
|
||||
---
|
||||
hw/vfio/pci.c | 29 ++++++++++++++++++++++++++++-
|
||||
hw/vfio/pci.h | 1 +
|
||||
2 files changed, 29 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/hw/vfio/pci.c b/hw/vfio/pci.c
|
||||
index c8534d3035..309535f306 100644
|
||||
index e265d77..41d00a3 100644
|
||||
--- a/hw/vfio/pci.c
|
||||
+++ b/hw/vfio/pci.c
|
||||
@@ -47,6 +47,9 @@
|
||||
@ -87,7 +86,7 @@ index c8534d3035..309535f306 100644
|
||||
if (!vdev->vbasedev.sysfsdev) {
|
||||
if (!(~vdev->host.domain || ~vdev->host.bus ||
|
||||
~vdev->host.slot || ~vdev->host.function)) {
|
||||
@@ -3167,6 +3191,9 @@ static Property vfio_pci_dev_properties[] = {
|
||||
@@ -3169,6 +3193,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),
|
||||
@ -98,7 +97,7 @@ index c8534d3035..309535f306 100644
|
||||
false),
|
||||
DEFINE_PROP_BOOL("x-no-vfio-ioeventfd", VFIOPCIDevice, no_vfio_ioeventfd,
|
||||
diff --git a/hw/vfio/pci.h b/hw/vfio/pci.h
|
||||
index 35626cd63e..0cd4803aee 100644
|
||||
index 0da7a20..5d2b0d2 100644
|
||||
--- a/hw/vfio/pci.h
|
||||
+++ b/hw/vfio/pci.h
|
||||
@@ -135,6 +135,7 @@ typedef struct VFIOPCIDevice {
|
||||
@ -110,5 +109,5 @@ index 35626cd63e..0cd4803aee 100644
|
||||
uint32_t device_id;
|
||||
uint32_t sub_vendor_id;
|
||||
--
|
||||
2.21.0
|
||||
1.8.3.1
|
||||
|
||||
|
@ -1,4 +1,4 @@
|
||||
From 2754dd8da8975757753fd491985d5e7b36966106 Mon Sep 17 00:00:00 2001
|
||||
From 8b189d52c8b8e2c251d76c7b00dc4a2a0a570bf8 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
|
||||
@ -18,16 +18,15 @@ as unsupported by Red Hat, and advising users to use libvirt instead.
|
||||
Signed-off-by: Eduardo Habkost <ehabkost@redhat.com>
|
||||
(cherry picked from commit 2a07700936e39856cc9f149c6a6517f0715536a6)
|
||||
(cherry picked from commit 5dd2f4706e2fef945771949e59a8fcc1b5452de9)
|
||||
Signed-off-by: Danilo C. L. de Paula <ddepaula@redhat.com>
|
||||
---
|
||||
vl.c | 9 +++++++++
|
||||
softmmu/vl.c | 9 +++++++++
|
||||
1 file changed, 9 insertions(+)
|
||||
|
||||
diff --git a/vl.c b/vl.c
|
||||
index 668a34577e..9f3e7e7733 100644
|
||||
--- a/vl.c
|
||||
+++ b/vl.c
|
||||
@@ -1822,9 +1822,17 @@ static void version(void)
|
||||
diff --git a/softmmu/vl.c b/softmmu/vl.c
|
||||
index 00f7604..5ba8c19 100644
|
||||
--- a/softmmu/vl.c
|
||||
+++ b/softmmu/vl.c
|
||||
@@ -1674,9 +1674,17 @@ static void version(void)
|
||||
QEMU_COPYRIGHT "\n");
|
||||
}
|
||||
|
||||
@ -45,7 +44,7 @@ index 668a34577e..9f3e7e7733 100644
|
||||
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());
|
||||
@@ -1841,6 +1849,7 @@ static void help(int exitcode)
|
||||
@@ -1693,6 +1701,7 @@ static void help(int exitcode)
|
||||
"\n"
|
||||
QEMU_HELP_BOTTOM "\n");
|
||||
|
||||
@ -54,5 +53,5 @@ index 668a34577e..9f3e7e7733 100644
|
||||
}
|
||||
|
||||
--
|
||||
2.21.0
|
||||
1.8.3.1
|
||||
|
||||
|
@ -1,4 +1,4 @@
|
||||
From c9c3cf721b0e9e359418f64c2a5121c3f8b5d27a Mon Sep 17 00:00:00 2001
|
||||
From e0aee69fcafe1c3656db2676b8a0d379a48c299c 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
|
||||
@ -74,18 +74,16 @@ The recommended vcpu max limit (KVM_CAP_NR_VCPUS) should be used instead
|
||||
of the actual max vcpu limit (KVM_CAP_MAX_VCPUS) to give an error.
|
||||
|
||||
This commit matches the limit to current KVM_CAP_NR_VCPUS value.
|
||||
|
||||
Signed-off-by: Danilo C. L. de Paula <ddepaula@redhat.com>
|
||||
---
|
||||
accel/kvm/kvm-all.c | 12 ++++++++++++
|
||||
vl.c | 18 ++++++++++++++++++
|
||||
softmmu/vl.c | 18 ++++++++++++++++++
|
||||
2 files changed, 30 insertions(+)
|
||||
|
||||
diff --git a/accel/kvm/kvm-all.c b/accel/kvm/kvm-all.c
|
||||
index ca00daa2f5..dc3ed7f04e 100644
|
||||
index 439a4ef..6f804b8 100644
|
||||
--- a/accel/kvm/kvm-all.c
|
||||
+++ b/accel/kvm/kvm-all.c
|
||||
@@ -1943,6 +1943,18 @@ static int kvm_init(MachineState *ms)
|
||||
@@ -1975,6 +1975,18 @@ static int kvm_init(MachineState *ms)
|
||||
soft_vcpus_limit = kvm_recommended_vcpus(s);
|
||||
hard_vcpus_limit = kvm_max_vcpus(s);
|
||||
|
||||
@ -104,11 +102,11 @@ index ca00daa2f5..dc3ed7f04e 100644
|
||||
while (nc->name) {
|
||||
if (nc->num > soft_vcpus_limit) {
|
||||
warn_report("Number of %s cpus requested (%d) exceeds "
|
||||
diff --git a/vl.c b/vl.c
|
||||
index 9f3e7e7733..1550aa2aaa 100644
|
||||
--- a/vl.c
|
||||
+++ b/vl.c
|
||||
@@ -134,6 +134,8 @@ int main(int argc, char **argv)
|
||||
diff --git a/softmmu/vl.c b/softmmu/vl.c
|
||||
index 5ba8c19..e98ab6b 100644
|
||||
--- a/softmmu/vl.c
|
||||
+++ b/softmmu/vl.c
|
||||
@@ -115,6 +115,8 @@
|
||||
|
||||
#define MAX_VIRTIO_CONSOLES 1
|
||||
|
||||
@ -117,8 +115,8 @@ index 9f3e7e7733..1550aa2aaa 100644
|
||||
static const char *data_dir[16];
|
||||
static int data_dir_idx;
|
||||
const char *bios_name = NULL;
|
||||
@@ -1339,6 +1341,20 @@ static MachineClass *find_default_machine(GSList *machines)
|
||||
return NULL;
|
||||
@@ -1177,6 +1179,20 @@ static MachineClass *find_default_machine(GSList *machines)
|
||||
return default_machineclass;
|
||||
}
|
||||
|
||||
+/* Maximum number of CPUs limited for Red Hat Enterprise Linux */
|
||||
@ -138,7 +136,7 @@ index 9f3e7e7733..1550aa2aaa 100644
|
||||
static int machine_help_func(QemuOpts *opts, MachineState *machine)
|
||||
{
|
||||
ObjectProperty *prop;
|
||||
@@ -3857,6 +3873,8 @@ int main(int argc, char **argv, char **envp)
|
||||
@@ -3829,6 +3845,8 @@ void qemu_init(int argc, char **argv, char **envp)
|
||||
"mutually exclusive");
|
||||
exit(EXIT_FAILURE);
|
||||
}
|
||||
@ -148,5 +146,5 @@ index 9f3e7e7733..1550aa2aaa 100644
|
||||
configure_rtc(qemu_find_opts_singleton("rtc"));
|
||||
|
||||
--
|
||||
2.21.0
|
||||
1.8.3.1
|
||||
|
||||
|
@ -1,4 +1,4 @@
|
||||
From 26128b3ede339e292a3c50a84e3248af46ecd0ec Mon Sep 17 00:00:00 2001
|
||||
From 565cee8e4965ece9e0c271cad813263b606b3e65 Mon Sep 17 00:00:00 2001
|
||||
From: Miroslav Rezanina <mrezanin@redhat.com>
|
||||
Date: Thu, 8 Oct 2015 09:50:17 +0200
|
||||
Subject: Add support for simpletrace
|
||||
@ -16,30 +16,31 @@ Rebase notes (2.9.0):
|
||||
Rebase notes (2.8.0):
|
||||
- Changed tracetool.py parameters
|
||||
|
||||
Rebase notes (weekly-200219):
|
||||
- Removed python shenigan (done upstream)
|
||||
|
||||
Merged patches (2.3.0):
|
||||
- db959d6 redhat/qemu-kvm.spec.template: Install qemu-kvm-simpletrace.stp
|
||||
- 5292fc3 trace: add SystemTap init scripts for simpletrace bridge
|
||||
- eda9e5e simpletrace: install simpletrace.py
|
||||
- 85c4c8f trace: add systemtap-initscript README file to RPM
|
||||
|
||||
Signed-off-by: Danilo C. L. de Paula <ddepaula@redhat.com>
|
||||
---
|
||||
.gitignore | 2 ++
|
||||
Makefile | 4 +++
|
||||
README.systemtap | 43 +++++++++++++++++++++++++
|
||||
redhat/qemu-kvm.spec.template | 26 ++++++++++++++-
|
||||
README.systemtap | 43 +++++++++++++++++++++++++++++++++
|
||||
redhat/qemu-kvm.spec.template | 25 ++++++++++++++++++-
|
||||
scripts/systemtap/conf.d/qemu_kvm.conf | 4 +++
|
||||
scripts/systemtap/script.d/qemu_kvm.stp | 1 +
|
||||
6 files changed, 79 insertions(+), 1 deletion(-)
|
||||
6 files changed, 78 insertions(+), 1 deletion(-)
|
||||
create mode 100644 README.systemtap
|
||||
create mode 100644 scripts/systemtap/conf.d/qemu_kvm.conf
|
||||
create mode 100644 scripts/systemtap/script.d/qemu_kvm.stp
|
||||
|
||||
diff --git a/Makefile b/Makefile
|
||||
index 086727dbb9..4254950f7f 100644
|
||||
index aee2e8e..ded56e5 100644
|
||||
--- a/Makefile
|
||||
+++ b/Makefile
|
||||
@@ -939,6 +939,10 @@ endif
|
||||
@@ -999,6 +999,10 @@ endif
|
||||
$(INSTALL_DATA) $(SRC_PATH)/pc-bios/keymaps/$$x "$(DESTDIR)$(qemu_datadir)/keymaps"; \
|
||||
done
|
||||
$(INSTALL_DATA) $(BUILD_DIR)/trace-events-all "$(DESTDIR)$(qemu_datadir)/trace-events-all"
|
||||
@ -52,7 +53,7 @@ index 086727dbb9..4254950f7f 100644
|
||||
ctags:
|
||||
diff --git a/README.systemtap b/README.systemtap
|
||||
new file mode 100644
|
||||
index 0000000000..ad913fc990
|
||||
index 0000000..ad913fc
|
||||
--- /dev/null
|
||||
+++ b/README.systemtap
|
||||
@@ -0,0 +1,43 @@
|
||||
@ -101,7 +102,7 @@ index 0000000000..ad913fc990
|
||||
+ # /usr/share/qemu-kvm/simpletrace.py --no-header /usr/share/qemu-kvm/trace-events /tmp/trace.log
|
||||
diff --git a/scripts/systemtap/conf.d/qemu_kvm.conf b/scripts/systemtap/conf.d/qemu_kvm.conf
|
||||
new file mode 100644
|
||||
index 0000000000..372d8160a4
|
||||
index 0000000..372d816
|
||||
--- /dev/null
|
||||
+++ b/scripts/systemtap/conf.d/qemu_kvm.conf
|
||||
@@ -0,0 +1,4 @@
|
||||
@ -111,11 +112,11 @@ index 0000000000..372d8160a4
|
||||
+qemu_kvm_OPT="-s4" # per-CPU buffer size, in megabytes
|
||||
diff --git a/scripts/systemtap/script.d/qemu_kvm.stp b/scripts/systemtap/script.d/qemu_kvm.stp
|
||||
new file mode 100644
|
||||
index 0000000000..c04abf9449
|
||||
index 0000000..c04abf9
|
||||
--- /dev/null
|
||||
+++ b/scripts/systemtap/script.d/qemu_kvm.stp
|
||||
@@ -0,0 +1 @@
|
||||
+probe qemu.kvm.simpletrace.handle_qmp_command,qemu.kvm.simpletrace.monitor_protocol_*,qemu.kvm.simpletrace.migrate_set_state {}
|
||||
--
|
||||
2.21.0
|
||||
1.8.3.1
|
||||
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -1,4 +1,4 @@
|
||||
From b13a7d3527c5c91e7a50236de30a2244b8453911 Mon Sep 17 00:00:00 2001
|
||||
From 50d4f1973a86696cb7487173cbdbc68453445c54 Mon Sep 17 00:00:00 2001
|
||||
From: "Dr. David Alan Gilbert" <dgilbert@redhat.com>
|
||||
Date: Fri, 5 May 2017 19:06:14 +0200
|
||||
Subject: usb-xhci: Fix PCI capability order
|
||||
@ -56,16 +56,15 @@ Conflicts:
|
||||
|
||||
(cherry picked from commit a42f86dc906cc7d2c16d02bf125ed76847b469cb)
|
||||
(cherry picked from commit 992ab2e4f6e15d3e51bc716763aa8d6f45c6d29d)
|
||||
Signed-off-by: Danilo C. L. de Paula <ddepaula@redhat.com>
|
||||
---
|
||||
hw/usb/hcd-xhci.c | 12 ++++++------
|
||||
1 file changed, 6 insertions(+), 6 deletions(-)
|
||||
|
||||
diff --git a/hw/usb/hcd-xhci.c b/hw/usb/hcd-xhci.c
|
||||
index 8fed2eedd6..d2b9744030 100644
|
||||
index b25cce8..9582d81 100644
|
||||
--- a/hw/usb/hcd-xhci.c
|
||||
+++ b/hw/usb/hcd-xhci.c
|
||||
@@ -3403,6 +3403,12 @@ static void usb_xhci_realize(struct PCIDevice *dev, Error **errp)
|
||||
@@ -3413,6 +3413,12 @@ static void usb_xhci_realize(struct PCIDevice *dev, Error **errp)
|
||||
xhci->max_pstreams_mask = 0;
|
||||
}
|
||||
|
||||
@ -78,7 +77,7 @@ index 8fed2eedd6..d2b9744030 100644
|
||||
if (xhci->msi != ON_OFF_AUTO_OFF) {
|
||||
ret = msi_init(dev, 0x70, xhci->numintrs, true, false, &err);
|
||||
/* Any error other than -ENOTSUP(board's MSI support is broken)
|
||||
@@ -3451,12 +3457,6 @@ static void usb_xhci_realize(struct PCIDevice *dev, Error **errp)
|
||||
@@ -3461,12 +3467,6 @@ static void usb_xhci_realize(struct PCIDevice *dev, Error **errp)
|
||||
PCI_BASE_ADDRESS_SPACE_MEMORY|PCI_BASE_ADDRESS_MEM_TYPE_64,
|
||||
&xhci->mem);
|
||||
|
||||
@ -92,5 +91,5 @@ index 8fed2eedd6..d2b9744030 100644
|
||||
/* TODO check for errors, and should fail when msix=on */
|
||||
msix_init(dev, xhci->numintrs,
|
||||
--
|
||||
2.21.0
|
||||
1.8.3.1
|
||||
|
||||
|
@ -1,4 +1,4 @@
|
||||
From 3fab8f5e8a9e190c1ed6916ac13c7c4d65e874b7 Mon Sep 17 00:00:00 2001
|
||||
From 5d9529f40e7cc092a57f9203aad22f3644a2b6d6 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]
|
||||
@ -45,10 +45,10 @@ 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 e8b2b64d09..54108c0056 100644
|
||||
index 472bbd2..ba2dac8 100644
|
||||
--- a/hw/scsi/virtio-scsi.c
|
||||
+++ b/hw/scsi/virtio-scsi.c
|
||||
@@ -808,6 +808,15 @@ static void virtio_scsi_hotplug(HotplugHandler *hotplug_dev, DeviceState *dev,
|
||||
@@ -814,6 +814,15 @@ static void virtio_scsi_hotplug(HotplugHandler *hotplug_dev, DeviceState *dev,
|
||||
SCSIDevice *sd = SCSI_DEVICE(dev);
|
||||
int ret;
|
||||
|
||||
@ -65,5 +65,5 @@ index e8b2b64d09..54108c0056 100644
|
||||
if (blk_op_is_blocked(sd->conf.blk, BLOCK_OP_TYPE_DATAPLANE, errp)) {
|
||||
return;
|
||||
--
|
||||
2.21.0
|
||||
1.8.3.1
|
||||
|
||||
|
@ -1,4 +1,4 @@
|
||||
From 148e9e80a3a430615b552075082fad22d007d851 Mon Sep 17 00:00:00 2001
|
||||
From 3ea4a35afce28805241b3be3c11de605600ecda1 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,7 +32,7 @@ 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 481dfd2a27..805f38533e 100644
|
||||
index eb54f94..ecefb08 100644
|
||||
--- a/hw/ppc/spapr_caps.c
|
||||
+++ b/hw/ppc/spapr_caps.c
|
||||
@@ -351,12 +351,19 @@ void spapr_check_pagesize(SpaprMachineState *spapr, hwaddr pagesize,
|
||||
@ -56,5 +56,5 @@ index 481dfd2a27..805f38533e 100644
|
||||
spapr_check_pagesize(spapr, qemu_minrampagesize(), errp);
|
||||
}
|
||||
--
|
||||
2.21.0
|
||||
1.8.3.1
|
||||
|
||||
|
@ -1,61 +0,0 @@
|
||||
From ab9ebc29bb9bb142e73a160750a451d40bfe9746 Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= <philmd@redhat.com>
|
||||
Date: Mon, 16 Sep 2019 17:07:00 +0100
|
||||
Subject: Using ip_deq after m_free might read pointers from an allocation
|
||||
reuse.
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
RH-Author: Philippe Mathieu-Daudé <philmd@redhat.com>
|
||||
Message-id: <20190916170700.647-2-philmd@redhat.com>
|
||||
Patchwork-id: 90470
|
||||
O-Subject: [RHEL-AV-8.1.0 qemu-kvm PATCH 1/1] Using ip_deq after m_free might read pointers from an allocation reuse.
|
||||
Bugzilla: 1749737
|
||||
RH-Acked-by: Danilo de Paula <ddepaula@redhat.com>
|
||||
RH-Acked-by: John Snow <jsnow@redhat.com>
|
||||
|
||||
From: Samuel Thibault <samuel.thibault@ens-lyon.org>
|
||||
|
||||
This would be difficult to exploit, but that is still related with
|
||||
CVE-2019-14378 which generates fragmented IP packets that would trigger this
|
||||
issue and at least produce a DoS.
|
||||
|
||||
Signed-off-by: Samuel Thibault <samuel.thibault@ens-lyon.org>
|
||||
(cherry picked from libslirp commit c59279437eda91841b9d26079c70b8a540d41204)
|
||||
Signed-off-by: Philippe Mathieu-Daudé <philmd@redhat.com>
|
||||
|
||||
Signed-off-by: Danilo C. L. de Paula <ddepaula@redhat.com>
|
||||
---
|
||||
slirp/src/ip_input.c | 7 +++++--
|
||||
1 file changed, 5 insertions(+), 2 deletions(-)
|
||||
|
||||
diff --git a/slirp/src/ip_input.c b/slirp/src/ip_input.c
|
||||
index 8c75d91495..df1c846ade 100644
|
||||
--- a/slirp/src/ip_input.c
|
||||
+++ b/slirp/src/ip_input.c
|
||||
@@ -292,6 +292,7 @@ static struct ip *ip_reass(Slirp *slirp, struct ip *ip, struct ipq *fp)
|
||||
*/
|
||||
while (q != (struct ipasfrag *)&fp->frag_link &&
|
||||
ip->ip_off + ip->ip_len > q->ipf_off) {
|
||||
+ struct ipasfrag *prev;
|
||||
i = (ip->ip_off + ip->ip_len) - q->ipf_off;
|
||||
if (i < q->ipf_len) {
|
||||
q->ipf_len -= i;
|
||||
@@ -299,9 +300,11 @@ static struct ip *ip_reass(Slirp *slirp, struct ip *ip, struct ipq *fp)
|
||||
m_adj(dtom(slirp, q), i);
|
||||
break;
|
||||
}
|
||||
+ prev = q;
|
||||
q = q->ipf_next;
|
||||
- m_free(dtom(slirp, q->ipf_prev));
|
||||
- ip_deq(q->ipf_prev);
|
||||
+ ip_deq(prev);
|
||||
+ m_free(dtom(slirp, prev));
|
||||
+
|
||||
}
|
||||
|
||||
insert:
|
||||
--
|
||||
2.21.0
|
||||
|
@ -1,8 +1,7 @@
|
||||
From 371d312300251c0dc24522607b06b7e47e760b53 Mon Sep 17 00:00:00 2001
|
||||
From f07c3ee209b3897efebb4cf008c88a390205a5dd Mon Sep 17 00:00:00 2001
|
||||
From: Kevin Wolf <kwolf@redhat.com>
|
||||
Date: Fri, 13 Mar 2020 12:34:32 +0000
|
||||
Subject: [PATCH 12/20] block: Versioned x-blockdev-reopen API with feature
|
||||
flag
|
||||
Subject: block: Versioned x-blockdev-reopen API with feature flag
|
||||
|
||||
RH-Author: Kevin Wolf <kwolf@redhat.com>
|
||||
Message-id: <20200313123439.10548-7-kwolf@redhat.com>
|
||||
@ -30,10 +29,10 @@ Signed-off-by: Danilo C. L. de Paula <ddepaula@redhat.com>
|
||||
1 file changed, 8 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/qapi/block-core.json b/qapi/block-core.json
|
||||
index 0cf68fe..a1e85b0 100644
|
||||
index 943df19..50b99fb 100644
|
||||
--- a/qapi/block-core.json
|
||||
+++ b/qapi/block-core.json
|
||||
@@ -4202,10 +4202,17 @@
|
||||
@@ -4126,10 +4126,17 @@
|
||||
# image does not have a default backing file name as part of its
|
||||
# metadata.
|
||||
#
|
@ -1,53 +0,0 @@
|
||||
From 481357ea8ae32b6894860c296cf6a2898260195f Mon Sep 17 00:00:00 2001
|
||||
From: Paolo Bonzini <pbonzini@redhat.com>
|
||||
Date: Fri, 17 Jan 2020 13:18:27 +0100
|
||||
Subject: [PATCH 4/4] RHEL: hw/i386: disable nested PERF_GLOBAL_CTRL MSR
|
||||
support
|
||||
|
||||
RH-Author: Paolo Bonzini <pbonzini@redhat.com>
|
||||
Message-id: <20200117131827.20361-1-pbonzini@redhat.com>
|
||||
Patchwork-id: 93405
|
||||
O-Subject: [RHEL-AV-8.2.0 qemu-kvm PATCH v3] RHEL: hw/i386: disable nested PERF_GLOBAL_CTRL MSR support
|
||||
Bugzilla: 1559846
|
||||
RH-Acked-by: Vitaly Kuznetsov <vkuznets@redhat.com>
|
||||
RH-Acked-by: Laszlo Ersek <lersek@redhat.com>
|
||||
RH-Acked-by: Miroslav Rezanina <mrezanin@redhat.com>
|
||||
|
||||
BZ: 1559846
|
||||
BRANCH: rhel-av-8.2.0
|
||||
BREW: 25775160
|
||||
UPSTREAM: RHEL only
|
||||
|
||||
Nested PERF_GLOBAL_CTRL support is not present in the 8.2 kernel. Drop the
|
||||
features via compat properties, they will be moved to 8.2 machine type compat
|
||||
properties in the 8.3 timeframe.
|
||||
|
||||
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
|
||||
---
|
||||
No change, for v2 I mistakenly wrote "origin/rhel-av-8.2.0" as the
|
||||
branch. :(
|
||||
|
||||
hw/i386/pc.c | 2 ++
|
||||
1 file changed, 2 insertions(+)
|
||||
|
||||
Signed-off-by: Miroslav Rezanina <mrezanin@redhat.com>
|
||||
---
|
||||
hw/i386/pc.c | 2 ++
|
||||
1 file changed, 2 insertions(+)
|
||||
|
||||
diff --git a/hw/i386/pc.c b/hw/i386/pc.c
|
||||
index 61e70e4..73a0f11 100644
|
||||
--- a/hw/i386/pc.c
|
||||
+++ b/hw/i386/pc.c
|
||||
@@ -351,6 +351,8 @@ const size_t pc_compat_1_4_len = G_N_ELEMENTS(pc_compat_1_4);
|
||||
GlobalProperty pc_rhel_compat[] = {
|
||||
{ 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" },
|
||||
+ { TYPE_X86_CPU, "vmx-exit-load-perf-global-ctrl", "off" },
|
||||
/* bz 1508330 */
|
||||
{ "vfio-pci", "x-no-geforce-quirks", "on" },
|
||||
};
|
||||
--
|
||||
1.8.3.1
|
||||
|
@ -1,115 +0,0 @@
|
||||
From c477581ccc6962651d4d6c702a6c3e2fcc5e4205 Mon Sep 17 00:00:00 2001
|
||||
From: "Dr. David Alan Gilbert" <dgilbert@redhat.com>
|
||||
Date: Thu, 2 Jan 2020 11:56:51 +0000
|
||||
Subject: [PATCH 2/2] kvm: Reallocate dirty_bmap when we change a slot
|
||||
|
||||
RH-Author: Dr. David Alan Gilbert <dgilbert@redhat.com>
|
||||
Message-id: <20200102115651.140177-1-dgilbert@redhat.com>
|
||||
Patchwork-id: 93256
|
||||
O-Subject: [RHEL-AV-8.2.0 qemu-kvm PATCH 1/1] kvm: Reallocate dirty_bmap when we change a slot
|
||||
Bugzilla: 1772774
|
||||
RH-Acked-by: Peter Xu <peterx@redhat.com>
|
||||
RH-Acked-by: Stefan Hajnoczi <stefanha@redhat.com>
|
||||
RH-Acked-by: Laszlo Ersek <lersek@redhat.com>
|
||||
|
||||
From: "Dr. David Alan Gilbert" <dgilbert@redhat.com>
|
||||
|
||||
bz: https://bugzilla.redhat.com/show_bug.cgi?id=1772774
|
||||
brew: https://brewweb.engineering.redhat.com/brew/taskinfo?taskID=25575691
|
||||
branch: rhel-av-8.2.0
|
||||
|
||||
kvm_set_phys_mem can be called to reallocate a slot by something the
|
||||
guest does (e.g. writing to PAM and other chipset registers).
|
||||
This can happen in the middle of a migration, and if we're unlucky
|
||||
it can now happen between the split 'sync' and 'clear'; the clear
|
||||
asserts if there's no bmap to clear. Recreate the bmap whenever
|
||||
we change the slot, keeping the clear path happy.
|
||||
|
||||
Typically this is triggered by the guest rebooting during a migrate.
|
||||
|
||||
Corresponds to:
|
||||
https://bugzilla.redhat.com/show_bug.cgi?id=1772774
|
||||
https://bugzilla.redhat.com/show_bug.cgi?id=1771032
|
||||
|
||||
Signed-off-by: Dr. David Alan Gilbert <dgilbert@redhat.com>
|
||||
Reviewed-by: Peter Xu <peterx@redhat.com>
|
||||
(cherry picked from commit 9b3a31c745b61758aaa5466a3a9fc0526d409188)
|
||||
Signed-off-by: Danilo C. L. de Paula <ddepaula@redhat.com>
|
||||
---
|
||||
accel/kvm/kvm-all.c | 44 +++++++++++++++++++++++++++++---------------
|
||||
1 file changed, 29 insertions(+), 15 deletions(-)
|
||||
|
||||
diff --git a/accel/kvm/kvm-all.c b/accel/kvm/kvm-all.c
|
||||
index dc3ed7f..5007bda 100644
|
||||
--- a/accel/kvm/kvm-all.c
|
||||
+++ b/accel/kvm/kvm-all.c
|
||||
@@ -518,6 +518,27 @@ static int kvm_get_dirty_pages_log_range(MemoryRegionSection *section,
|
||||
|
||||
#define ALIGN(x, y) (((x)+(y)-1) & ~((y)-1))
|
||||
|
||||
+/* Allocate the dirty bitmap for a slot */
|
||||
+static void kvm_memslot_init_dirty_bitmap(KVMSlot *mem)
|
||||
+{
|
||||
+ /*
|
||||
+ * XXX bad kernel interface alert
|
||||
+ * For dirty bitmap, kernel allocates array of size aligned to
|
||||
+ * bits-per-long. But for case when the kernel is 64bits and
|
||||
+ * the userspace is 32bits, userspace can't align to the same
|
||||
+ * bits-per-long, since sizeof(long) is different between kernel
|
||||
+ * and user space. This way, userspace will provide buffer which
|
||||
+ * may be 4 bytes less than the kernel will use, resulting in
|
||||
+ * userspace memory corruption (which is not detectable by valgrind
|
||||
+ * too, in most cases).
|
||||
+ * So for now, let's align to 64 instead of HOST_LONG_BITS here, in
|
||||
+ * a hope that sizeof(long) won't become >8 any time soon.
|
||||
+ */
|
||||
+ hwaddr bitmap_size = ALIGN(((mem->memory_size) >> TARGET_PAGE_BITS),
|
||||
+ /*HOST_LONG_BITS*/ 64) / 8;
|
||||
+ mem->dirty_bmap = g_malloc0(bitmap_size);
|
||||
+}
|
||||
+
|
||||
/**
|
||||
* kvm_physical_sync_dirty_bitmap - Sync dirty bitmap from kernel space
|
||||
*
|
||||
@@ -550,23 +571,9 @@ static int kvm_physical_sync_dirty_bitmap(KVMMemoryListener *kml,
|
||||
goto out;
|
||||
}
|
||||
|
||||
- /* XXX bad kernel interface alert
|
||||
- * For dirty bitmap, kernel allocates array of size aligned to
|
||||
- * bits-per-long. But for case when the kernel is 64bits and
|
||||
- * the userspace is 32bits, userspace can't align to the same
|
||||
- * bits-per-long, since sizeof(long) is different between kernel
|
||||
- * and user space. This way, userspace will provide buffer which
|
||||
- * may be 4 bytes less than the kernel will use, resulting in
|
||||
- * userspace memory corruption (which is not detectable by valgrind
|
||||
- * too, in most cases).
|
||||
- * So for now, let's align to 64 instead of HOST_LONG_BITS here, in
|
||||
- * a hope that sizeof(long) won't become >8 any time soon.
|
||||
- */
|
||||
if (!mem->dirty_bmap) {
|
||||
- hwaddr bitmap_size = ALIGN(((mem->memory_size) >> TARGET_PAGE_BITS),
|
||||
- /*HOST_LONG_BITS*/ 64) / 8;
|
||||
/* Allocate on the first log_sync, once and for all */
|
||||
- mem->dirty_bmap = g_malloc0(bitmap_size);
|
||||
+ kvm_memslot_init_dirty_bitmap(mem);
|
||||
}
|
||||
|
||||
d.dirty_bitmap = mem->dirty_bmap;
|
||||
@@ -1067,6 +1074,13 @@ static void kvm_set_phys_mem(KVMMemoryListener *kml,
|
||||
mem->ram = ram;
|
||||
mem->flags = kvm_mem_flags(mr);
|
||||
|
||||
+ if (mem->flags & KVM_MEM_LOG_DIRTY_PAGES) {
|
||||
+ /*
|
||||
+ * Reallocate the bmap; it means it doesn't disappear in
|
||||
+ * middle of a migrate.
|
||||
+ */
|
||||
+ kvm_memslot_init_dirty_bitmap(mem);
|
||||
+ }
|
||||
err = kvm_set_user_memory_region(kml, mem, true);
|
||||
if (err) {
|
||||
fprintf(stderr, "%s: error registering slot: %s\n", __func__,
|
||||
--
|
||||
1.8.3.1
|
||||
|
@ -1,121 +0,0 @@
|
||||
From 71b5267ed33f9e60bc98acbabcbed62f01a96ff4 Mon Sep 17 00:00:00 2001
|
||||
From: Kevin Wolf <kwolf@redhat.com>
|
||||
Date: Mon, 30 Mar 2020 11:19:23 +0100
|
||||
Subject: [PATCH 3/4] Revert "mirror: Don't let an operation wait for itself"
|
||||
|
||||
RH-Author: Kevin Wolf <kwolf@redhat.com>
|
||||
Message-id: <20200330111924.22938-2-kwolf@redhat.com>
|
||||
Patchwork-id: 94464
|
||||
O-Subject: [RHEL-AV-8.2.0 qemu-kvm PATCH 1/2] Revert "mirror: Don't let an operation wait for itself"
|
||||
Bugzilla: 1794692
|
||||
RH-Acked-by: Maxim Levitsky <mlevitsk@redhat.com>
|
||||
RH-Acked-by: Danilo de Paula <ddepaula@redhat.com>
|
||||
RH-Acked-by: Max Reitz <mreitz@redhat.com>
|
||||
|
||||
This reverts commit 7e6c4ff792734e196c8ca82564c56b5e7c6288ca.
|
||||
|
||||
The fix was incomplete as it only protected against requests waiting for
|
||||
themselves, but not against requests waiting for each other. We need a
|
||||
different solution.
|
||||
|
||||
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
|
||||
Message-Id: <20200326153628.4869-2-kwolf@redhat.com>
|
||||
Reviewed-by: Eric Blake <eblake@redhat.com>
|
||||
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
|
||||
(cherry picked from commit 9178f4fe5f083064f5c91f04d98c815ce5a5af1c)
|
||||
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
|
||||
Signed-off-by: Danilo C. L. de Paula <ddepaula@redhat.com>
|
||||
---
|
||||
block/mirror.c | 21 +++++++++------------
|
||||
1 file changed, 9 insertions(+), 12 deletions(-)
|
||||
|
||||
diff --git a/block/mirror.c b/block/mirror.c
|
||||
index cacbc70..8959e42 100644
|
||||
--- a/block/mirror.c
|
||||
+++ b/block/mirror.c
|
||||
@@ -283,14 +283,11 @@ static int mirror_cow_align(MirrorBlockJob *s, int64_t *offset,
|
||||
}
|
||||
|
||||
static inline void coroutine_fn
|
||||
-mirror_wait_for_any_operation(MirrorBlockJob *s, MirrorOp *self, bool active)
|
||||
+mirror_wait_for_any_operation(MirrorBlockJob *s, bool active)
|
||||
{
|
||||
MirrorOp *op;
|
||||
|
||||
QTAILQ_FOREACH(op, &s->ops_in_flight, next) {
|
||||
- if (self == op) {
|
||||
- continue;
|
||||
- }
|
||||
/* Do not wait on pseudo ops, because it may in turn wait on
|
||||
* some other operation to start, which may in fact be the
|
||||
* caller of this function. Since there is only one pseudo op
|
||||
@@ -305,10 +302,10 @@ mirror_wait_for_any_operation(MirrorBlockJob *s, MirrorOp *self, bool active)
|
||||
}
|
||||
|
||||
static inline void coroutine_fn
|
||||
-mirror_wait_for_free_in_flight_slot(MirrorBlockJob *s, MirrorOp *self)
|
||||
+mirror_wait_for_free_in_flight_slot(MirrorBlockJob *s)
|
||||
{
|
||||
/* Only non-active operations use up in-flight slots */
|
||||
- mirror_wait_for_any_operation(s, self, false);
|
||||
+ mirror_wait_for_any_operation(s, false);
|
||||
}
|
||||
|
||||
/* Perform a mirror copy operation.
|
||||
@@ -351,7 +348,7 @@ static void coroutine_fn mirror_co_read(void *opaque)
|
||||
|
||||
while (s->buf_free_count < nb_chunks) {
|
||||
trace_mirror_yield_in_flight(s, op->offset, s->in_flight);
|
||||
- mirror_wait_for_free_in_flight_slot(s, op);
|
||||
+ mirror_wait_for_free_in_flight_slot(s);
|
||||
}
|
||||
|
||||
/* Now make a QEMUIOVector taking enough granularity-sized chunks
|
||||
@@ -558,7 +555,7 @@ static uint64_t coroutine_fn mirror_iteration(MirrorBlockJob *s)
|
||||
|
||||
while (s->in_flight >= MAX_IN_FLIGHT) {
|
||||
trace_mirror_yield_in_flight(s, offset, s->in_flight);
|
||||
- mirror_wait_for_free_in_flight_slot(s, pseudo_op);
|
||||
+ mirror_wait_for_free_in_flight_slot(s);
|
||||
}
|
||||
|
||||
if (s->ret < 0) {
|
||||
@@ -612,7 +609,7 @@ static void mirror_free_init(MirrorBlockJob *s)
|
||||
static void coroutine_fn mirror_wait_for_all_io(MirrorBlockJob *s)
|
||||
{
|
||||
while (s->in_flight > 0) {
|
||||
- mirror_wait_for_free_in_flight_slot(s, NULL);
|
||||
+ mirror_wait_for_free_in_flight_slot(s);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -797,7 +794,7 @@ static int coroutine_fn mirror_dirty_init(MirrorBlockJob *s)
|
||||
if (s->in_flight >= MAX_IN_FLIGHT) {
|
||||
trace_mirror_yield(s, UINT64_MAX, s->buf_free_count,
|
||||
s->in_flight);
|
||||
- mirror_wait_for_free_in_flight_slot(s, NULL);
|
||||
+ mirror_wait_for_free_in_flight_slot(s);
|
||||
continue;
|
||||
}
|
||||
|
||||
@@ -950,7 +947,7 @@ static int coroutine_fn mirror_run(Job *job, Error **errp)
|
||||
/* Do not start passive operations while there are active
|
||||
* writes in progress */
|
||||
while (s->in_active_write_counter) {
|
||||
- mirror_wait_for_any_operation(s, NULL, true);
|
||||
+ mirror_wait_for_any_operation(s, true);
|
||||
}
|
||||
|
||||
if (s->ret < 0) {
|
||||
@@ -976,7 +973,7 @@ static int coroutine_fn mirror_run(Job *job, Error **errp)
|
||||
if (s->in_flight >= MAX_IN_FLIGHT || s->buf_free_count == 0 ||
|
||||
(cnt == 0 && s->in_flight > 0)) {
|
||||
trace_mirror_yield(s, cnt, s->buf_free_count, s->in_flight);
|
||||
- mirror_wait_for_free_in_flight_slot(s, NULL);
|
||||
+ mirror_wait_for_free_in_flight_slot(s);
|
||||
continue;
|
||||
} else if (cnt != 0) {
|
||||
delay_ns = mirror_iteration(s);
|
||||
--
|
||||
1.8.3.1
|
||||
|
@ -1,63 +0,0 @@
|
||||
From ceb6d97674b8bc9a072db1be4167411bc0ee48d7 Mon Sep 17 00:00:00 2001
|
||||
From: "Dr. David Alan Gilbert" <dgilbert@redhat.com>
|
||||
Date: Mon, 27 Jan 2020 19:02:02 +0100
|
||||
Subject: [PATCH 091/116] Virtiofsd: fix memory leak on fuse queueinfo
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
RH-Author: Dr. David Alan Gilbert <dgilbert@redhat.com>
|
||||
Message-id: <20200127190227.40942-88-dgilbert@redhat.com>
|
||||
Patchwork-id: 93542
|
||||
O-Subject: [RHEL-AV-8.2 qemu-kvm PATCH 087/112] Virtiofsd: fix memory leak on fuse queueinfo
|
||||
Bugzilla: 1694164
|
||||
RH-Acked-by: Philippe Mathieu-Daudé <philmd@redhat.com>
|
||||
RH-Acked-by: Stefan Hajnoczi <stefanha@redhat.com>
|
||||
RH-Acked-by: Sergio Lopez Pascual <slp@redhat.com>
|
||||
|
||||
From: Liu Bo <bo.liu@linux.alibaba.com>
|
||||
|
||||
For fuse's queueinfo, both queueinfo array and queueinfos are allocated in
|
||||
fv_queue_set_started() but not cleaned up when the daemon process quits.
|
||||
|
||||
This fixes the leak in proper places.
|
||||
|
||||
Signed-off-by: Liu Bo <bo.liu@linux.alibaba.com>
|
||||
Signed-off-by: Eric Ren <renzhen@linux.alibaba.com>
|
||||
Reviewed-by: Misono Tomohiro <misono.tomohiro@jp.fujitsu.com>
|
||||
Signed-off-by: Dr. David Alan Gilbert <dgilbert@redhat.com>
|
||||
(cherry picked from commit 740b0b700a6338a1cf60c26229651ac5f6724944)
|
||||
Signed-off-by: Miroslav Rezanina <mrezanin@redhat.com>
|
||||
---
|
||||
tools/virtiofsd/fuse_virtio.c | 8 ++++++++
|
||||
1 file changed, 8 insertions(+)
|
||||
|
||||
diff --git a/tools/virtiofsd/fuse_virtio.c b/tools/virtiofsd/fuse_virtio.c
|
||||
index b7948de..fb8d6d1 100644
|
||||
--- a/tools/virtiofsd/fuse_virtio.c
|
||||
+++ b/tools/virtiofsd/fuse_virtio.c
|
||||
@@ -625,6 +625,8 @@ static void fv_queue_cleanup_thread(struct fv_VuDev *vud, int qidx)
|
||||
}
|
||||
close(ourqi->kill_fd);
|
||||
ourqi->kick_fd = -1;
|
||||
+ free(vud->qi[qidx]);
|
||||
+ vud->qi[qidx] = NULL;
|
||||
}
|
||||
|
||||
/* Callback from libvhost-user on start or stop of a queue */
|
||||
@@ -884,6 +886,12 @@ int virtio_session_mount(struct fuse_session *se)
|
||||
void virtio_session_close(struct fuse_session *se)
|
||||
{
|
||||
close(se->vu_socketfd);
|
||||
+
|
||||
+ if (!se->virtio_dev) {
|
||||
+ return;
|
||||
+ }
|
||||
+
|
||||
+ free(se->virtio_dev->qi);
|
||||
free(se->virtio_dev);
|
||||
se->virtio_dev = NULL;
|
||||
}
|
||||
--
|
||||
1.8.3.1
|
||||
|
@ -1,62 +0,0 @@
|
||||
From 0d5a09173eb75b7e56122c2aefb2646a2be58400 Mon Sep 17 00:00:00 2001
|
||||
From: Peter Xu <peterx@redhat.com>
|
||||
Date: Fri, 31 Jan 2020 17:12:57 +0000
|
||||
Subject: [PATCH 15/15] apic: Use 32bit APIC ID for migration instance ID
|
||||
|
||||
RH-Author: Peter Xu <peterx@redhat.com>
|
||||
Message-id: <20200131171257.1066593-4-peterx@redhat.com>
|
||||
Patchwork-id: 93628
|
||||
O-Subject: [RHEL-AV-8.2.0 qemu-kvm PATCH 3/3] apic: Use 32bit APIC ID for migration instance ID
|
||||
Bugzilla: 1529231
|
||||
RH-Acked-by: Eduardo Habkost <ehabkost@redhat.com>
|
||||
RH-Acked-by: Juan Quintela <quintela@redhat.com>
|
||||
RH-Acked-by: Dr. David Alan Gilbert <dgilbert@redhat.com>
|
||||
|
||||
Migration is silently broken now with x2apic config like this:
|
||||
|
||||
-smp 200,maxcpus=288,sockets=2,cores=72,threads=2 \
|
||||
-device intel-iommu,intremap=on,eim=on
|
||||
|
||||
After migration, the guest kernel could hang at anything, due to
|
||||
x2apic bit not migrated correctly in IA32_APIC_BASE on some vcpus, so
|
||||
any operations related to x2apic could be broken then (e.g., RDMSR on
|
||||
x2apic MSRs could fail because KVM would think that the vcpu hasn't
|
||||
enabled x2apic at all).
|
||||
|
||||
The issue is that the x2apic bit was never applied correctly for vcpus
|
||||
whose ID > 255 when migrate completes, and that's because when we
|
||||
migrate APIC we use the APICCommonState.id as instance ID of the
|
||||
migration stream, while that's too short for x2apic.
|
||||
|
||||
Let's use the newly introduced initial_apic_id for that.
|
||||
|
||||
Signed-off-by: Peter Xu <peterx@redhat.com>
|
||||
Reviewed-by: Juan Quintela <quintela@redhat.com>
|
||||
Reviewed-by: Eduardo Habkost <ehabkost@redhat.com>
|
||||
Signed-off-by: Juan Quintela <quintela@redhat.com>
|
||||
(cherry picked from commit 0ab994867c365db21e15f9503922c79234d8e40e)
|
||||
Signed-off-by: Peter Xu <peterx@redhat.com>
|
||||
Signed-off-by: Danilo C. L. de Paula <ddepaula@redhat.com>
|
||||
---
|
||||
hw/intc/apic_common.c | 5 ++++-
|
||||
1 file changed, 4 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/hw/intc/apic_common.c b/hw/intc/apic_common.c
|
||||
index 54b8731..b5dbeb6 100644
|
||||
--- a/hw/intc/apic_common.c
|
||||
+++ b/hw/intc/apic_common.c
|
||||
@@ -268,7 +268,10 @@ static void apic_common_realize(DeviceState *dev, Error **errp)
|
||||
APICCommonState *s = APIC_COMMON(dev);
|
||||
APICCommonClass *info;
|
||||
static DeviceState *vapic;
|
||||
- uint32_t instance_id = s->id;
|
||||
+ uint32_t instance_id = s->initial_apic_id;
|
||||
+
|
||||
+ /* Normally initial APIC ID should be no more than hundreds */
|
||||
+ assert(instance_id != VMSTATE_INSTANCE_ID_ANY);
|
||||
|
||||
info = APIC_COMMON_GET_CLASS(s);
|
||||
info->realize(dev, errp);
|
||||
--
|
||||
1.8.3.1
|
||||
|
@ -1,57 +0,0 @@
|
||||
From 619b3aac9790a7ca7c01846144395a318a9ab250 Mon Sep 17 00:00:00 2001
|
||||
From: Kevin Wolf <kwolf@redhat.com>
|
||||
Date: Wed, 8 Apr 2020 17:29:14 +0100
|
||||
Subject: [PATCH 3/6] backup: don't acquire aio_context in backup_clean
|
||||
|
||||
RH-Author: Kevin Wolf <kwolf@redhat.com>
|
||||
Message-id: <20200408172917.18712-4-kwolf@redhat.com>
|
||||
Patchwork-id: 94596
|
||||
O-Subject: [RHEL-AV-8.2.0 qemu-kvm PATCH 3/6] backup: don't acquire aio_context in backup_clean
|
||||
Bugzilla: 1817621
|
||||
RH-Acked-by: Eric Blake <eblake@redhat.com>
|
||||
RH-Acked-by: Danilo de Paula <ddepaula@redhat.com>
|
||||
RH-Acked-by: Max Reitz <mreitz@redhat.com>
|
||||
|
||||
From: Stefan Reiter <s.reiter@proxmox.com>
|
||||
|
||||
All code-paths leading to backup_clean (via job_clean) have the job's
|
||||
context already acquired. The job's context is guaranteed to be the same
|
||||
as the one used by backup_top via backup_job_create.
|
||||
|
||||
Since the previous logic effectively acquired the lock twice, this
|
||||
broke cleanup of backups for disks using IO threads, since the BDRV_POLL_WHILE
|
||||
in bdrv_backup_top_drop -> bdrv_do_drained_begin would only release the lock
|
||||
once, thus deadlocking with the IO thread.
|
||||
|
||||
This is a partial revert of 0abf2581717a19.
|
||||
|
||||
Signed-off-by: Stefan Reiter <s.reiter@proxmox.com>
|
||||
Reviewed-by: Max Reitz <mreitz@redhat.com>
|
||||
Message-Id: <20200407115651.69472-4-s.reiter@proxmox.com>
|
||||
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
|
||||
(cherry picked from commit eca0f3524a4eb57d03a56b0cbcef5527a0981ce4)
|
||||
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
|
||||
Signed-off-by: Danilo C. L. de Paula <ddepaula@redhat.com>
|
||||
---
|
||||
block/backup.c | 4 ----
|
||||
1 file changed, 4 deletions(-)
|
||||
|
||||
diff --git a/block/backup.c b/block/backup.c
|
||||
index 1383e21..ec50946 100644
|
||||
--- a/block/backup.c
|
||||
+++ b/block/backup.c
|
||||
@@ -135,11 +135,7 @@ static void backup_abort(Job *job)
|
||||
static void backup_clean(Job *job)
|
||||
{
|
||||
BackupBlockJob *s = container_of(job, BackupBlockJob, common.job);
|
||||
- AioContext *aio_context = bdrv_get_aio_context(s->backup_top);
|
||||
-
|
||||
- aio_context_acquire(aio_context);
|
||||
bdrv_backup_top_drop(s->backup_top);
|
||||
- aio_context_release(aio_context);
|
||||
}
|
||||
|
||||
void backup_do_checkpoint(BlockJob *job, Error **errp)
|
||||
--
|
||||
1.8.3.1
|
||||
|
@ -1,56 +0,0 @@
|
||||
From bc78ee07bf400cbff0021367e05d308870471710 Mon Sep 17 00:00:00 2001
|
||||
From: Sergio Lopez Pascual <slp@redhat.com>
|
||||
Date: Fri, 7 Feb 2020 11:27:45 +0000
|
||||
Subject: [PATCH 12/18] backup-top: Begin drain earlier
|
||||
|
||||
RH-Author: Sergio Lopez Pascual <slp@redhat.com>
|
||||
Message-id: <20200207112749.25073-6-slp@redhat.com>
|
||||
Patchwork-id: 93757
|
||||
O-Subject: [RHEL-AV-8.2.0 qemu-kvm PATCH v2 5/9] backup-top: Begin drain earlier
|
||||
Bugzilla: 1745606 1746217 1773517 1779036 1782111 1782175 1783965
|
||||
RH-Acked-by: Stefano Garzarella <sgarzare@redhat.com>
|
||||
RH-Acked-by: Paolo Bonzini <pbonzini@redhat.com>
|
||||
RH-Acked-by: Max Reitz <mreitz@redhat.com>
|
||||
RH-Acked-by: Stefan Hajnoczi <stefanha@redhat.com>
|
||||
|
||||
From: Max Reitz <mreitz@redhat.com>
|
||||
|
||||
When dropping backup-top, we need to drain the node before freeing the
|
||||
BlockCopyState. Otherwise, requests may still be in flight and then the
|
||||
assertion in shres_destroy() will fail.
|
||||
|
||||
(This becomes visible in intermittent failure of 056.)
|
||||
|
||||
Cc: qemu-stable@nongnu.org
|
||||
Signed-off-by: Max Reitz <mreitz@redhat.com>
|
||||
Message-id: 20191219182638.104621-1-mreitz@redhat.com
|
||||
Signed-off-by: Max Reitz <mreitz@redhat.com>
|
||||
(cherry picked from commit 503ca1262bab2c11c533a4816d1ff4297d4f58a6)
|
||||
Signed-off-by: Sergio Lopez <slp@redhat.com>
|
||||
Signed-off-by: Danilo C. L. de Paula <ddepaula@redhat.com>
|
||||
---
|
||||
block/backup-top.c | 4 ++--
|
||||
1 file changed, 2 insertions(+), 2 deletions(-)
|
||||
|
||||
diff --git a/block/backup-top.c b/block/backup-top.c
|
||||
index 7cdb1f8..818d3f2 100644
|
||||
--- a/block/backup-top.c
|
||||
+++ b/block/backup-top.c
|
||||
@@ -257,12 +257,12 @@ void bdrv_backup_top_drop(BlockDriverState *bs)
|
||||
BDRVBackupTopState *s = bs->opaque;
|
||||
AioContext *aio_context = bdrv_get_aio_context(bs);
|
||||
|
||||
- block_copy_state_free(s->bcs);
|
||||
-
|
||||
aio_context_acquire(aio_context);
|
||||
|
||||
bdrv_drained_begin(bs);
|
||||
|
||||
+ block_copy_state_free(s->bcs);
|
||||
+
|
||||
s->active = false;
|
||||
bdrv_child_refresh_perms(bs, bs->backing, &error_abort);
|
||||
bdrv_replace_node(bs, backing_bs(bs), &error_abort);
|
||||
--
|
||||
1.8.3.1
|
||||
|
@ -1,116 +0,0 @@
|
||||
From 0ef6691ce8964bb2bbd677756c4e594793ca3ad8 Mon Sep 17 00:00:00 2001
|
||||
From: Kevin Wolf <kwolf@redhat.com>
|
||||
Date: Fri, 7 Feb 2020 11:24:01 +0000
|
||||
Subject: [PATCH 04/18] block: Activate recursively even for already active
|
||||
nodes
|
||||
|
||||
RH-Author: Kevin Wolf <kwolf@redhat.com>
|
||||
Message-id: <20200207112404.25198-4-kwolf@redhat.com>
|
||||
Patchwork-id: 93749
|
||||
O-Subject: [RHEL-AV-8.2.0 qemu-kvm PATCH v2 3/6] block: Activate recursively even for already active nodes
|
||||
Bugzilla: 1781637
|
||||
RH-Acked-by: Sergio Lopez Pascual <slp@redhat.com>
|
||||
RH-Acked-by: Max Reitz <mreitz@redhat.com>
|
||||
RH-Acked-by: Stefan Hajnoczi <stefanha@redhat.com>
|
||||
|
||||
bdrv_invalidate_cache_all() assumes that all nodes in a given subtree
|
||||
are either active or inactive when it starts. Therefore, as soon as it
|
||||
arrives at an already active node, it stops.
|
||||
|
||||
However, this assumption is wrong. For example, it's possible to take a
|
||||
snapshot of an inactive node, which results in an active overlay over an
|
||||
inactive backing file. The active overlay is probably also the root node
|
||||
of an inactive BlockBackend (blk->disable_perm == true).
|
||||
|
||||
In this case, bdrv_invalidate_cache_all() does not need to do anything
|
||||
to activate the overlay node, but it still needs to recurse into the
|
||||
children and the parents to make sure that after returning success,
|
||||
really everything is activated.
|
||||
|
||||
Cc: qemu-stable@nongnu.org
|
||||
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
|
||||
Reviewed-by: Max Reitz <mreitz@redhat.com>
|
||||
(cherry picked from commit 7bb4941ace471fc7dd6ded4749b95b9622baa6ed)
|
||||
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
|
||||
Signed-off-by: Danilo C. L. de Paula <ddepaula@redhat.com>
|
||||
---
|
||||
block.c | 50 ++++++++++++++++++++++++--------------------------
|
||||
1 file changed, 24 insertions(+), 26 deletions(-)
|
||||
|
||||
diff --git a/block.c b/block.c
|
||||
index 473eb6e..2e5e8b6 100644
|
||||
--- a/block.c
|
||||
+++ b/block.c
|
||||
@@ -5335,10 +5335,6 @@ static void coroutine_fn bdrv_co_invalidate_cache(BlockDriverState *bs,
|
||||
return;
|
||||
}
|
||||
|
||||
- if (!(bs->open_flags & BDRV_O_INACTIVE)) {
|
||||
- return;
|
||||
- }
|
||||
-
|
||||
QLIST_FOREACH(child, &bs->children, next) {
|
||||
bdrv_co_invalidate_cache(child->bs, &local_err);
|
||||
if (local_err) {
|
||||
@@ -5360,34 +5356,36 @@ static void coroutine_fn bdrv_co_invalidate_cache(BlockDriverState *bs,
|
||||
* just keep the extended permissions for the next time that an activation
|
||||
* of the image is tried.
|
||||
*/
|
||||
- bs->open_flags &= ~BDRV_O_INACTIVE;
|
||||
- bdrv_get_cumulative_perm(bs, &perm, &shared_perm);
|
||||
- ret = bdrv_check_perm(bs, NULL, perm, shared_perm, NULL, NULL, &local_err);
|
||||
- if (ret < 0) {
|
||||
- bs->open_flags |= BDRV_O_INACTIVE;
|
||||
- error_propagate(errp, local_err);
|
||||
- return;
|
||||
- }
|
||||
- bdrv_set_perm(bs, perm, shared_perm);
|
||||
-
|
||||
- if (bs->drv->bdrv_co_invalidate_cache) {
|
||||
- bs->drv->bdrv_co_invalidate_cache(bs, &local_err);
|
||||
- if (local_err) {
|
||||
+ if (bs->open_flags & BDRV_O_INACTIVE) {
|
||||
+ bs->open_flags &= ~BDRV_O_INACTIVE;
|
||||
+ bdrv_get_cumulative_perm(bs, &perm, &shared_perm);
|
||||
+ ret = bdrv_check_perm(bs, NULL, perm, shared_perm, NULL, NULL, &local_err);
|
||||
+ if (ret < 0) {
|
||||
bs->open_flags |= BDRV_O_INACTIVE;
|
||||
error_propagate(errp, local_err);
|
||||
return;
|
||||
}
|
||||
- }
|
||||
+ bdrv_set_perm(bs, perm, shared_perm);
|
||||
|
||||
- FOR_EACH_DIRTY_BITMAP(bs, bm) {
|
||||
- bdrv_dirty_bitmap_skip_store(bm, false);
|
||||
- }
|
||||
+ if (bs->drv->bdrv_co_invalidate_cache) {
|
||||
+ bs->drv->bdrv_co_invalidate_cache(bs, &local_err);
|
||||
+ if (local_err) {
|
||||
+ bs->open_flags |= BDRV_O_INACTIVE;
|
||||
+ error_propagate(errp, local_err);
|
||||
+ return;
|
||||
+ }
|
||||
+ }
|
||||
|
||||
- ret = refresh_total_sectors(bs, bs->total_sectors);
|
||||
- if (ret < 0) {
|
||||
- bs->open_flags |= BDRV_O_INACTIVE;
|
||||
- error_setg_errno(errp, -ret, "Could not refresh total sector count");
|
||||
- return;
|
||||
+ FOR_EACH_DIRTY_BITMAP(bs, bm) {
|
||||
+ bdrv_dirty_bitmap_skip_store(bm, false);
|
||||
+ }
|
||||
+
|
||||
+ ret = refresh_total_sectors(bs, bs->total_sectors);
|
||||
+ if (ret < 0) {
|
||||
+ bs->open_flags |= BDRV_O_INACTIVE;
|
||||
+ error_setg_errno(errp, -ret, "Could not refresh total sector count");
|
||||
+ return;
|
||||
+ }
|
||||
}
|
||||
|
||||
QLIST_FOREACH(parent, &bs->parents, next_parent) {
|
||||
--
|
||||
1.8.3.1
|
||||
|
@ -1,84 +0,0 @@
|
||||
From f17b37b58a57d849d2ff5fa04f149d9415803a39 Mon Sep 17 00:00:00 2001
|
||||
From: Kevin Wolf <kwolf@redhat.com>
|
||||
Date: Wed, 8 Apr 2020 17:29:17 +0100
|
||||
Subject: [PATCH 6/6] block: Fix blk->in_flight during blk_wait_while_drained()
|
||||
|
||||
RH-Author: Kevin Wolf <kwolf@redhat.com>
|
||||
Message-id: <20200408172917.18712-7-kwolf@redhat.com>
|
||||
Patchwork-id: 94599
|
||||
O-Subject: [RHEL-AV-8.2.0 qemu-kvm PATCH 6/6] block: Fix blk->in_flight during blk_wait_while_drained()
|
||||
Bugzilla: 1817621
|
||||
RH-Acked-by: Eric Blake <eblake@redhat.com>
|
||||
RH-Acked-by: Danilo de Paula <ddepaula@redhat.com>
|
||||
RH-Acked-by: Max Reitz <mreitz@redhat.com>
|
||||
|
||||
Waiting in blk_wait_while_drained() while blk->in_flight is increased
|
||||
for the current request is wrong because it will cause the drain
|
||||
operation to deadlock.
|
||||
|
||||
This patch makes sure that blk_wait_while_drained() is called with
|
||||
blk->in_flight increased exactly once for the current request, and that
|
||||
it temporarily decreases the counter while it waits.
|
||||
|
||||
Fixes: cf3129323f900ef5ddbccbe86e4fa801e88c566e
|
||||
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
|
||||
Reviewed-by: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>
|
||||
Reviewed-by: Max Reitz <mreitz@redhat.com>
|
||||
Message-Id: <20200407121259.21350-4-kwolf@redhat.com>
|
||||
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
|
||||
(cherry picked from commit 7f16476fab14fc32388e0ebae793f64673848efa)
|
||||
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
|
||||
Signed-off-by: Danilo C. L. de Paula <ddepaula@redhat.com>
|
||||
---
|
||||
block/block-backend.c | 17 +++++------------
|
||||
1 file changed, 5 insertions(+), 12 deletions(-)
|
||||
|
||||
diff --git a/block/block-backend.c b/block/block-backend.c
|
||||
index 610dbfa..38ae413 100644
|
||||
--- a/block/block-backend.c
|
||||
+++ b/block/block-backend.c
|
||||
@@ -1140,10 +1140,15 @@ static int blk_check_byte_request(BlockBackend *blk, int64_t offset,
|
||||
return 0;
|
||||
}
|
||||
|
||||
+/* To be called between exactly one pair of blk_inc/dec_in_flight() */
|
||||
static void coroutine_fn blk_wait_while_drained(BlockBackend *blk)
|
||||
{
|
||||
+ assert(blk->in_flight > 0);
|
||||
+
|
||||
if (blk->quiesce_counter && !blk->disable_request_queuing) {
|
||||
+ blk_dec_in_flight(blk);
|
||||
qemu_co_queue_wait(&blk->queued_requests, NULL);
|
||||
+ blk_inc_in_flight(blk);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1418,12 +1423,6 @@ static void blk_aio_read_entry(void *opaque)
|
||||
BlkRwCo *rwco = &acb->rwco;
|
||||
QEMUIOVector *qiov = rwco->iobuf;
|
||||
|
||||
- if (rwco->blk->quiesce_counter) {
|
||||
- blk_dec_in_flight(rwco->blk);
|
||||
- blk_wait_while_drained(rwco->blk);
|
||||
- blk_inc_in_flight(rwco->blk);
|
||||
- }
|
||||
-
|
||||
assert(qiov->size == acb->bytes);
|
||||
rwco->ret = blk_do_preadv(rwco->blk, rwco->offset, acb->bytes,
|
||||
qiov, rwco->flags);
|
||||
@@ -1436,12 +1435,6 @@ static void blk_aio_write_entry(void *opaque)
|
||||
BlkRwCo *rwco = &acb->rwco;
|
||||
QEMUIOVector *qiov = rwco->iobuf;
|
||||
|
||||
- if (rwco->blk->quiesce_counter) {
|
||||
- blk_dec_in_flight(rwco->blk);
|
||||
- blk_wait_while_drained(rwco->blk);
|
||||
- blk_inc_in_flight(rwco->blk);
|
||||
- }
|
||||
-
|
||||
assert(!qiov || qiov->size == acb->bytes);
|
||||
rwco->ret = blk_do_pwritev_part(rwco->blk, rwco->offset, acb->bytes,
|
||||
qiov, 0, rwco->flags);
|
||||
--
|
||||
1.8.3.1
|
||||
|
@ -1,91 +0,0 @@
|
||||
From 5774af5a3c713d0c93010c30453812eae6a749cd Mon Sep 17 00:00:00 2001
|
||||
From: Kevin Wolf <kwolf@redhat.com>
|
||||
Date: Fri, 13 Mar 2020 12:34:37 +0000
|
||||
Subject: [PATCH 17/20] block: Fix cross-AioContext blockdev-snapshot
|
||||
|
||||
RH-Author: Kevin Wolf <kwolf@redhat.com>
|
||||
Message-id: <20200313123439.10548-12-kwolf@redhat.com>
|
||||
Patchwork-id: 94286
|
||||
O-Subject: [RHEL-AV-8.2.0 qemu-kvm PATCH v2 11/13] block: Fix cross-AioContext blockdev-snapshot
|
||||
Bugzilla: 1790482 1805143
|
||||
RH-Acked-by: John Snow <jsnow@redhat.com>
|
||||
RH-Acked-by: Daniel P. Berrange <berrange@redhat.com>
|
||||
RH-Acked-by: Peter Krempa <pkrempa@redhat.com>
|
||||
|
||||
external_snapshot_prepare() tries to move the overlay to the AioContext
|
||||
of the backing file (the snapshotted node). However, it's possible that
|
||||
this doesn't work, but the backing file can instead be moved to the
|
||||
overlay's AioContext (e.g. opening the backing chain for a mirror
|
||||
target).
|
||||
|
||||
bdrv_append() already indirectly uses bdrv_attach_node(), which takes
|
||||
care to move nodes to make sure they use the same AioContext and which
|
||||
tries both directions.
|
||||
|
||||
So the problem has a simple fix: Just delete the unnecessary extra
|
||||
bdrv_try_set_aio_context() call in external_snapshot_prepare() and
|
||||
instead assert in bdrv_append() that both nodes were indeed moved to the
|
||||
same AioContext.
|
||||
|
||||
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
|
||||
Message-Id: <20200310113831.27293-6-kwolf@redhat.com>
|
||||
Tested-by: Peter Krempa <pkrempa@redhat.com>
|
||||
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
|
||||
(cherry picked from commit 30dd65f307b647eef8156c4a33bd007823ef85cb)
|
||||
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
|
||||
Signed-off-by: Danilo C. L. de Paula <ddepaula@redhat.com>
|
||||
---
|
||||
block.c | 1 +
|
||||
blockdev.c | 16 ----------------
|
||||
2 files changed, 1 insertion(+), 16 deletions(-)
|
||||
|
||||
diff --git a/block.c b/block.c
|
||||
index 354d388..ec29b1e 100644
|
||||
--- a/block.c
|
||||
+++ b/block.c
|
||||
@@ -4327,6 +4327,7 @@ void bdrv_replace_node(BlockDriverState *from, BlockDriverState *to,
|
||||
bdrv_ref(from);
|
||||
|
||||
assert(qemu_get_current_aio_context() == qemu_get_aio_context());
|
||||
+ assert(bdrv_get_aio_context(from) == bdrv_get_aio_context(to));
|
||||
bdrv_drained_begin(from);
|
||||
|
||||
/* Put all parents into @list and calculate their cumulative permissions */
|
||||
diff --git a/blockdev.c b/blockdev.c
|
||||
index 7918533..c8d4b51 100644
|
||||
--- a/blockdev.c
|
||||
+++ b/blockdev.c
|
||||
@@ -1535,9 +1535,7 @@ static void external_snapshot_prepare(BlkActionState *common,
|
||||
DO_UPCAST(ExternalSnapshotState, common, common);
|
||||
TransactionAction *action = common->action;
|
||||
AioContext *aio_context;
|
||||
- AioContext *old_context;
|
||||
uint64_t perm, shared;
|
||||
- int ret;
|
||||
|
||||
/* 'blockdev-snapshot' and 'blockdev-snapshot-sync' have similar
|
||||
* purpose but a different set of parameters */
|
||||
@@ -1678,20 +1676,6 @@ static void external_snapshot_prepare(BlkActionState *common,
|
||||
goto out;
|
||||
}
|
||||
|
||||
- /* Honor bdrv_try_set_aio_context() context acquisition requirements. */
|
||||
- old_context = bdrv_get_aio_context(state->new_bs);
|
||||
- aio_context_release(aio_context);
|
||||
- aio_context_acquire(old_context);
|
||||
-
|
||||
- ret = bdrv_try_set_aio_context(state->new_bs, aio_context, errp);
|
||||
-
|
||||
- aio_context_release(old_context);
|
||||
- aio_context_acquire(aio_context);
|
||||
-
|
||||
- if (ret < 0) {
|
||||
- goto out;
|
||||
- }
|
||||
-
|
||||
/* This removes our old bs and adds the new bs. This is an operation that
|
||||
* can fail, so we need to do it in .prepare; undoing it for abort is
|
||||
* always possible. */
|
||||
--
|
||||
1.8.3.1
|
||||
|
@ -1,60 +0,0 @@
|
||||
From 05452efd7e0fb0522099ae09a396f8f97e66014a Mon Sep 17 00:00:00 2001
|
||||
From: Maxim Levitsky <mlevitsk@redhat.com>
|
||||
Date: Wed, 11 Mar 2020 10:51:47 +0000
|
||||
Subject: [PATCH 06/20] block: Fix leak in bdrv_create_file_fallback()
|
||||
|
||||
RH-Author: Maxim Levitsky <mlevitsk@redhat.com>
|
||||
Message-id: <20200311105147.13208-7-mlevitsk@redhat.com>
|
||||
Patchwork-id: 94229
|
||||
O-Subject: [RHEL-AV-8.2.0 qemu-kvm PATCH v2 6/6] block: Fix leak in bdrv_create_file_fallback()
|
||||
Bugzilla: 1640894
|
||||
RH-Acked-by: Stefano Garzarella <sgarzare@redhat.com>
|
||||
RH-Acked-by: John Snow <jsnow@redhat.com>
|
||||
RH-Acked-by: Max Reitz <mreitz@redhat.com>
|
||||
|
||||
From: Max Reitz <mreitz@redhat.com>
|
||||
|
||||
@options is leaked by the first two return statements in this function.
|
||||
|
||||
Note that blk_new_open() takes the reference to @options even on
|
||||
failure, so all we need to do to fix the leak is to move the QDict
|
||||
allocation down to where we actually need it.
|
||||
|
||||
Reported-by: Coverity (CID 1419884)
|
||||
Fixes: fd17146cd93d1704cd96d7c2757b325fc7aac6fd
|
||||
("block: Generic file creation fallback")
|
||||
Signed-off-by: Max Reitz <mreitz@redhat.com>
|
||||
Message-Id: <20200225155618.133412-1-mreitz@redhat.com>
|
||||
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
|
||||
(cherry picked from commit eeea1faa099f82328f5831cf252f8ce0a59a9287)
|
||||
Signed-off-by: Maxim Levitsky <mlevitsk@redhat.com>
|
||||
|
||||
Signed-off-by: Danilo C. L. de Paula <ddepaula@redhat.com>
|
||||
---
|
||||
block.c | 3 ++-
|
||||
1 file changed, 2 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/block.c b/block.c
|
||||
index 3beec7f..e1a4e38 100644
|
||||
--- a/block.c
|
||||
+++ b/block.c
|
||||
@@ -600,7 +600,7 @@ static int bdrv_create_file_fallback(const char *filename, BlockDriver *drv,
|
||||
QemuOpts *opts, Error **errp)
|
||||
{
|
||||
BlockBackend *blk;
|
||||
- QDict *options = qdict_new();
|
||||
+ QDict *options;
|
||||
int64_t size = 0;
|
||||
char *buf = NULL;
|
||||
PreallocMode prealloc;
|
||||
@@ -623,6 +623,7 @@ static int bdrv_create_file_fallback(const char *filename, BlockDriver *drv,
|
||||
return -ENOTSUP;
|
||||
}
|
||||
|
||||
+ options = qdict_new();
|
||||
qdict_put_str(options, "driver", drv->format_name);
|
||||
|
||||
blk = blk_new_open(filename, NULL, options,
|
||||
--
|
||||
1.8.3.1
|
||||
|
@ -1,227 +0,0 @@
|
||||
From 882d09226b7f45b72c5b7763c4c4aba182e0f8a1 Mon Sep 17 00:00:00 2001
|
||||
From: Maxim Levitsky <mlevitsk@redhat.com>
|
||||
Date: Wed, 11 Mar 2020 10:51:43 +0000
|
||||
Subject: [PATCH 02/20] block: Generic file creation fallback
|
||||
|
||||
RH-Author: Maxim Levitsky <mlevitsk@redhat.com>
|
||||
Message-id: <20200311105147.13208-3-mlevitsk@redhat.com>
|
||||
Patchwork-id: 94227
|
||||
O-Subject: [RHEL-AV-8.2.0 qemu-kvm PATCH v2 2/6] block: Generic file creation fallback
|
||||
Bugzilla: 1640894
|
||||
RH-Acked-by: Stefano Garzarella <sgarzare@redhat.com>
|
||||
RH-Acked-by: John Snow <jsnow@redhat.com>
|
||||
RH-Acked-by: Max Reitz <mreitz@redhat.com>
|
||||
|
||||
From: Max Reitz <mreitz@redhat.com>
|
||||
|
||||
If a protocol driver does not support image creation, we can see whether
|
||||
maybe the file exists already. If so, just truncating it will be
|
||||
sufficient.
|
||||
|
||||
Signed-off-by: Max Reitz <mreitz@redhat.com>
|
||||
Message-Id: <20200122164532.178040-3-mreitz@redhat.com>
|
||||
Signed-off-by: Max Reitz <mreitz@redhat.com>
|
||||
(cherry picked from commit fd17146cd93d1704cd96d7c2757b325fc7aac6fd)
|
||||
Signed-off-by: Maxim Levitsky <mlevitsk@redhat.com>
|
||||
Signed-off-by: Danilo C. L. de Paula <ddepaula@redhat.com>
|
||||
---
|
||||
block.c | 159 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-----
|
||||
1 file changed, 147 insertions(+), 12 deletions(-)
|
||||
|
||||
diff --git a/block.c b/block.c
|
||||
index 2e5e8b6..3beec7f 100644
|
||||
--- a/block.c
|
||||
+++ b/block.c
|
||||
@@ -532,20 +532,139 @@ out:
|
||||
return ret;
|
||||
}
|
||||
|
||||
-int bdrv_create_file(const char *filename, QemuOpts *opts, Error **errp)
|
||||
+/**
|
||||
+ * Helper function for bdrv_create_file_fallback(): Resize @blk to at
|
||||
+ * least the given @minimum_size.
|
||||
+ *
|
||||
+ * On success, return @blk's actual length.
|
||||
+ * Otherwise, return -errno.
|
||||
+ */
|
||||
+static int64_t create_file_fallback_truncate(BlockBackend *blk,
|
||||
+ int64_t minimum_size, Error **errp)
|
||||
{
|
||||
- BlockDriver *drv;
|
||||
+ Error *local_err = NULL;
|
||||
+ int64_t size;
|
||||
+ int ret;
|
||||
+
|
||||
+ ret = blk_truncate(blk, minimum_size, false, PREALLOC_MODE_OFF, &local_err);
|
||||
+ if (ret < 0 && ret != -ENOTSUP) {
|
||||
+ error_propagate(errp, local_err);
|
||||
+ return ret;
|
||||
+ }
|
||||
+
|
||||
+ size = blk_getlength(blk);
|
||||
+ if (size < 0) {
|
||||
+ error_free(local_err);
|
||||
+ error_setg_errno(errp, -size,
|
||||
+ "Failed to inquire the new image file's length");
|
||||
+ return size;
|
||||
+ }
|
||||
+
|
||||
+ if (size < minimum_size) {
|
||||
+ /* Need to grow the image, but we failed to do that */
|
||||
+ error_propagate(errp, local_err);
|
||||
+ return -ENOTSUP;
|
||||
+ }
|
||||
+
|
||||
+ error_free(local_err);
|
||||
+ local_err = NULL;
|
||||
+
|
||||
+ return size;
|
||||
+}
|
||||
+
|
||||
+/**
|
||||
+ * Helper function for bdrv_create_file_fallback(): Zero the first
|
||||
+ * sector to remove any potentially pre-existing image header.
|
||||
+ */
|
||||
+static int create_file_fallback_zero_first_sector(BlockBackend *blk,
|
||||
+ int64_t current_size,
|
||||
+ Error **errp)
|
||||
+{
|
||||
+ int64_t bytes_to_clear;
|
||||
+ int ret;
|
||||
+
|
||||
+ bytes_to_clear = MIN(current_size, BDRV_SECTOR_SIZE);
|
||||
+ if (bytes_to_clear) {
|
||||
+ ret = blk_pwrite_zeroes(blk, 0, bytes_to_clear, BDRV_REQ_MAY_UNMAP);
|
||||
+ if (ret < 0) {
|
||||
+ error_setg_errno(errp, -ret,
|
||||
+ "Failed to clear the new image's first sector");
|
||||
+ return ret;
|
||||
+ }
|
||||
+ }
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+static int bdrv_create_file_fallback(const char *filename, BlockDriver *drv,
|
||||
+ QemuOpts *opts, Error **errp)
|
||||
+{
|
||||
+ BlockBackend *blk;
|
||||
+ QDict *options = qdict_new();
|
||||
+ int64_t size = 0;
|
||||
+ char *buf = NULL;
|
||||
+ PreallocMode prealloc;
|
||||
Error *local_err = NULL;
|
||||
int ret;
|
||||
|
||||
+ size = qemu_opt_get_size_del(opts, BLOCK_OPT_SIZE, 0);
|
||||
+ buf = qemu_opt_get_del(opts, BLOCK_OPT_PREALLOC);
|
||||
+ prealloc = qapi_enum_parse(&PreallocMode_lookup, buf,
|
||||
+ PREALLOC_MODE_OFF, &local_err);
|
||||
+ g_free(buf);
|
||||
+ if (local_err) {
|
||||
+ error_propagate(errp, local_err);
|
||||
+ return -EINVAL;
|
||||
+ }
|
||||
+
|
||||
+ if (prealloc != PREALLOC_MODE_OFF) {
|
||||
+ error_setg(errp, "Unsupported preallocation mode '%s'",
|
||||
+ PreallocMode_str(prealloc));
|
||||
+ return -ENOTSUP;
|
||||
+ }
|
||||
+
|
||||
+ qdict_put_str(options, "driver", drv->format_name);
|
||||
+
|
||||
+ blk = blk_new_open(filename, NULL, options,
|
||||
+ BDRV_O_RDWR | BDRV_O_RESIZE, errp);
|
||||
+ if (!blk) {
|
||||
+ error_prepend(errp, "Protocol driver '%s' does not support image "
|
||||
+ "creation, and opening the image failed: ",
|
||||
+ drv->format_name);
|
||||
+ return -EINVAL;
|
||||
+ }
|
||||
+
|
||||
+ size = create_file_fallback_truncate(blk, size, errp);
|
||||
+ if (size < 0) {
|
||||
+ ret = size;
|
||||
+ goto out;
|
||||
+ }
|
||||
+
|
||||
+ ret = create_file_fallback_zero_first_sector(blk, size, errp);
|
||||
+ if (ret < 0) {
|
||||
+ goto out;
|
||||
+ }
|
||||
+
|
||||
+ ret = 0;
|
||||
+out:
|
||||
+ blk_unref(blk);
|
||||
+ return ret;
|
||||
+}
|
||||
+
|
||||
+int bdrv_create_file(const char *filename, QemuOpts *opts, Error **errp)
|
||||
+{
|
||||
+ BlockDriver *drv;
|
||||
+
|
||||
drv = bdrv_find_protocol(filename, true, errp);
|
||||
if (drv == NULL) {
|
||||
return -ENOENT;
|
||||
}
|
||||
|
||||
- ret = bdrv_create(drv, filename, opts, &local_err);
|
||||
- error_propagate(errp, local_err);
|
||||
- return ret;
|
||||
+ if (drv->bdrv_co_create_opts) {
|
||||
+ return bdrv_create(drv, filename, opts, errp);
|
||||
+ } else {
|
||||
+ return bdrv_create_file_fallback(filename, drv, opts, errp);
|
||||
+ }
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -1422,6 +1541,24 @@ QemuOptsList bdrv_runtime_opts = {
|
||||
},
|
||||
};
|
||||
|
||||
+static QemuOptsList fallback_create_opts = {
|
||||
+ .name = "fallback-create-opts",
|
||||
+ .head = QTAILQ_HEAD_INITIALIZER(fallback_create_opts.head),
|
||||
+ .desc = {
|
||||
+ {
|
||||
+ .name = BLOCK_OPT_SIZE,
|
||||
+ .type = QEMU_OPT_SIZE,
|
||||
+ .help = "Virtual disk size"
|
||||
+ },
|
||||
+ {
|
||||
+ .name = BLOCK_OPT_PREALLOC,
|
||||
+ .type = QEMU_OPT_STRING,
|
||||
+ .help = "Preallocation mode (allowed values: off)"
|
||||
+ },
|
||||
+ { /* end of list */ }
|
||||
+ }
|
||||
+};
|
||||
+
|
||||
/*
|
||||
* Common part for opening disk images and files
|
||||
*
|
||||
@@ -5743,14 +5880,12 @@ void bdrv_img_create(const char *filename, const char *fmt,
|
||||
return;
|
||||
}
|
||||
|
||||
- if (!proto_drv->create_opts) {
|
||||
- error_setg(errp, "Protocol driver '%s' does not support image creation",
|
||||
- proto_drv->format_name);
|
||||
- return;
|
||||
- }
|
||||
-
|
||||
create_opts = qemu_opts_append(create_opts, drv->create_opts);
|
||||
- create_opts = qemu_opts_append(create_opts, proto_drv->create_opts);
|
||||
+ if (proto_drv->create_opts) {
|
||||
+ create_opts = qemu_opts_append(create_opts, proto_drv->create_opts);
|
||||
+ } else {
|
||||
+ create_opts = qemu_opts_append(create_opts, &fallback_create_opts);
|
||||
+ }
|
||||
|
||||
/* Create parameter list with default values */
|
||||
opts = qemu_opts_create(create_opts, NULL, 0, &error_abort);
|
||||
--
|
||||
1.8.3.1
|
||||
|
@ -1,295 +0,0 @@
|
||||
From 52cc1d1cd2f695c5761d65baec961d14552a79ed Mon Sep 17 00:00:00 2001
|
||||
From: Kevin Wolf <kwolf@redhat.com>
|
||||
Date: Wed, 8 Apr 2020 17:29:16 +0100
|
||||
Subject: [PATCH 5/6] block: Increase BB.in_flight for coroutine and sync
|
||||
interfaces
|
||||
|
||||
RH-Author: Kevin Wolf <kwolf@redhat.com>
|
||||
Message-id: <20200408172917.18712-6-kwolf@redhat.com>
|
||||
Patchwork-id: 94600
|
||||
O-Subject: [RHEL-AV-8.2.0 qemu-kvm PATCH 5/6] block: Increase BB.in_flight for coroutine and sync interfaces
|
||||
Bugzilla: 1817621
|
||||
RH-Acked-by: Eric Blake <eblake@redhat.com>
|
||||
RH-Acked-by: Danilo de Paula <ddepaula@redhat.com>
|
||||
RH-Acked-by: Max Reitz <mreitz@redhat.com>
|
||||
|
||||
External callers of blk_co_*() and of the synchronous blk_*() functions
|
||||
don't currently increase the BlockBackend.in_flight counter, but calls
|
||||
from blk_aio_*() do, so there is an inconsistency whether the counter
|
||||
has been increased or not.
|
||||
|
||||
This patch moves the actual operations to static functions that can
|
||||
later know they will always be called with in_flight increased exactly
|
||||
once, even for external callers using the blk_co_*() coroutine
|
||||
interfaces.
|
||||
|
||||
If the public blk_co_*() interface is unused, remove it.
|
||||
|
||||
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
|
||||
Message-Id: <20200407121259.21350-3-kwolf@redhat.com>
|
||||
Reviewed-by: Max Reitz <mreitz@redhat.com>
|
||||
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
|
||||
(cherry picked from commit fbb92b6798894d3bf62fe3578d99fa62c720b242)
|
||||
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
|
||||
Signed-off-by: Danilo C. L. de Paula <ddepaula@redhat.com>
|
||||
---
|
||||
block/block-backend.c | 103 ++++++++++++++++++++++++++++++++---------
|
||||
include/sysemu/block-backend.h | 1 -
|
||||
2 files changed, 80 insertions(+), 24 deletions(-)
|
||||
|
||||
diff --git a/block/block-backend.c b/block/block-backend.c
|
||||
index 17b2e87..610dbfa 100644
|
||||
--- a/block/block-backend.c
|
||||
+++ b/block/block-backend.c
|
||||
@@ -1147,9 +1147,10 @@ static void coroutine_fn blk_wait_while_drained(BlockBackend *blk)
|
||||
}
|
||||
}
|
||||
|
||||
-int coroutine_fn blk_co_preadv(BlockBackend *blk, int64_t offset,
|
||||
- unsigned int bytes, QEMUIOVector *qiov,
|
||||
- BdrvRequestFlags flags)
|
||||
+/* To be called between exactly one pair of blk_inc/dec_in_flight() */
|
||||
+static int coroutine_fn
|
||||
+blk_do_preadv(BlockBackend *blk, int64_t offset, unsigned int bytes,
|
||||
+ QEMUIOVector *qiov, BdrvRequestFlags flags)
|
||||
{
|
||||
int ret;
|
||||
BlockDriverState *bs;
|
||||
@@ -1178,10 +1179,24 @@ int coroutine_fn blk_co_preadv(BlockBackend *blk, int64_t offset,
|
||||
return ret;
|
||||
}
|
||||
|
||||
-int coroutine_fn blk_co_pwritev_part(BlockBackend *blk, int64_t offset,
|
||||
- unsigned int bytes,
|
||||
- QEMUIOVector *qiov, size_t qiov_offset,
|
||||
- BdrvRequestFlags flags)
|
||||
+int coroutine_fn blk_co_preadv(BlockBackend *blk, int64_t offset,
|
||||
+ unsigned int bytes, QEMUIOVector *qiov,
|
||||
+ BdrvRequestFlags flags)
|
||||
+{
|
||||
+ int ret;
|
||||
+
|
||||
+ blk_inc_in_flight(blk);
|
||||
+ ret = blk_do_preadv(blk, offset, bytes, qiov, flags);
|
||||
+ blk_dec_in_flight(blk);
|
||||
+
|
||||
+ return ret;
|
||||
+}
|
||||
+
|
||||
+/* To be called between exactly one pair of blk_inc/dec_in_flight() */
|
||||
+static int coroutine_fn
|
||||
+blk_do_pwritev_part(BlockBackend *blk, int64_t offset, unsigned int bytes,
|
||||
+ QEMUIOVector *qiov, size_t qiov_offset,
|
||||
+ BdrvRequestFlags flags)
|
||||
{
|
||||
int ret;
|
||||
BlockDriverState *bs;
|
||||
@@ -1214,6 +1229,20 @@ int coroutine_fn blk_co_pwritev_part(BlockBackend *blk, int64_t offset,
|
||||
return ret;
|
||||
}
|
||||
|
||||
+int coroutine_fn blk_co_pwritev_part(BlockBackend *blk, int64_t offset,
|
||||
+ unsigned int bytes,
|
||||
+ QEMUIOVector *qiov, size_t qiov_offset,
|
||||
+ BdrvRequestFlags flags)
|
||||
+{
|
||||
+ int ret;
|
||||
+
|
||||
+ blk_inc_in_flight(blk);
|
||||
+ ret = blk_do_pwritev_part(blk, offset, bytes, qiov, qiov_offset, flags);
|
||||
+ blk_dec_in_flight(blk);
|
||||
+
|
||||
+ return ret;
|
||||
+}
|
||||
+
|
||||
int coroutine_fn blk_co_pwritev(BlockBackend *blk, int64_t offset,
|
||||
unsigned int bytes, QEMUIOVector *qiov,
|
||||
BdrvRequestFlags flags)
|
||||
@@ -1234,7 +1263,7 @@ static void blk_read_entry(void *opaque)
|
||||
BlkRwCo *rwco = opaque;
|
||||
QEMUIOVector *qiov = rwco->iobuf;
|
||||
|
||||
- rwco->ret = blk_co_preadv(rwco->blk, rwco->offset, qiov->size,
|
||||
+ rwco->ret = blk_do_preadv(rwco->blk, rwco->offset, qiov->size,
|
||||
qiov, rwco->flags);
|
||||
aio_wait_kick();
|
||||
}
|
||||
@@ -1244,8 +1273,8 @@ static void blk_write_entry(void *opaque)
|
||||
BlkRwCo *rwco = opaque;
|
||||
QEMUIOVector *qiov = rwco->iobuf;
|
||||
|
||||
- rwco->ret = blk_co_pwritev(rwco->blk, rwco->offset, qiov->size,
|
||||
- qiov, rwco->flags);
|
||||
+ rwco->ret = blk_do_pwritev_part(rwco->blk, rwco->offset, qiov->size,
|
||||
+ qiov, 0, rwco->flags);
|
||||
aio_wait_kick();
|
||||
}
|
||||
|
||||
@@ -1262,6 +1291,7 @@ static int blk_prw(BlockBackend *blk, int64_t offset, uint8_t *buf,
|
||||
.ret = NOT_DONE,
|
||||
};
|
||||
|
||||
+ blk_inc_in_flight(blk);
|
||||
if (qemu_in_coroutine()) {
|
||||
/* Fast-path if already in coroutine context */
|
||||
co_entry(&rwco);
|
||||
@@ -1270,6 +1300,7 @@ static int blk_prw(BlockBackend *blk, int64_t offset, uint8_t *buf,
|
||||
bdrv_coroutine_enter(blk_bs(blk), co);
|
||||
BDRV_POLL_WHILE(blk_bs(blk), rwco.ret == NOT_DONE);
|
||||
}
|
||||
+ blk_dec_in_flight(blk);
|
||||
|
||||
return rwco.ret;
|
||||
}
|
||||
@@ -1394,7 +1425,7 @@ static void blk_aio_read_entry(void *opaque)
|
||||
}
|
||||
|
||||
assert(qiov->size == acb->bytes);
|
||||
- rwco->ret = blk_co_preadv(rwco->blk, rwco->offset, acb->bytes,
|
||||
+ rwco->ret = blk_do_preadv(rwco->blk, rwco->offset, acb->bytes,
|
||||
qiov, rwco->flags);
|
||||
blk_aio_complete(acb);
|
||||
}
|
||||
@@ -1412,8 +1443,8 @@ static void blk_aio_write_entry(void *opaque)
|
||||
}
|
||||
|
||||
assert(!qiov || qiov->size == acb->bytes);
|
||||
- rwco->ret = blk_co_pwritev(rwco->blk, rwco->offset, acb->bytes,
|
||||
- qiov, rwco->flags);
|
||||
+ rwco->ret = blk_do_pwritev_part(rwco->blk, rwco->offset, acb->bytes,
|
||||
+ qiov, 0, rwco->flags);
|
||||
blk_aio_complete(acb);
|
||||
}
|
||||
|
||||
@@ -1498,7 +1529,9 @@ void blk_aio_cancel_async(BlockAIOCB *acb)
|
||||
bdrv_aio_cancel_async(acb);
|
||||
}
|
||||
|
||||
-int blk_co_ioctl(BlockBackend *blk, unsigned long int req, void *buf)
|
||||
+/* To be called between exactly one pair of blk_inc/dec_in_flight() */
|
||||
+static int coroutine_fn
|
||||
+blk_do_ioctl(BlockBackend *blk, unsigned long int req, void *buf)
|
||||
{
|
||||
blk_wait_while_drained(blk);
|
||||
|
||||
@@ -1514,8 +1547,7 @@ static void blk_ioctl_entry(void *opaque)
|
||||
BlkRwCo *rwco = opaque;
|
||||
QEMUIOVector *qiov = rwco->iobuf;
|
||||
|
||||
- rwco->ret = blk_co_ioctl(rwco->blk, rwco->offset,
|
||||
- qiov->iov[0].iov_base);
|
||||
+ rwco->ret = blk_do_ioctl(rwco->blk, rwco->offset, qiov->iov[0].iov_base);
|
||||
aio_wait_kick();
|
||||
}
|
||||
|
||||
@@ -1529,7 +1561,7 @@ static void blk_aio_ioctl_entry(void *opaque)
|
||||
BlkAioEmAIOCB *acb = opaque;
|
||||
BlkRwCo *rwco = &acb->rwco;
|
||||
|
||||
- rwco->ret = blk_co_ioctl(rwco->blk, rwco->offset, rwco->iobuf);
|
||||
+ rwco->ret = blk_do_ioctl(rwco->blk, rwco->offset, rwco->iobuf);
|
||||
|
||||
blk_aio_complete(acb);
|
||||
}
|
||||
@@ -1540,7 +1572,9 @@ BlockAIOCB *blk_aio_ioctl(BlockBackend *blk, unsigned long int req, void *buf,
|
||||
return blk_aio_prwv(blk, req, 0, buf, blk_aio_ioctl_entry, 0, cb, opaque);
|
||||
}
|
||||
|
||||
-int blk_co_pdiscard(BlockBackend *blk, int64_t offset, int bytes)
|
||||
+/* To be called between exactly one pair of blk_inc/dec_in_flight() */
|
||||
+static int coroutine_fn
|
||||
+blk_do_pdiscard(BlockBackend *blk, int64_t offset, int bytes)
|
||||
{
|
||||
int ret;
|
||||
|
||||
@@ -1559,7 +1593,7 @@ static void blk_aio_pdiscard_entry(void *opaque)
|
||||
BlkAioEmAIOCB *acb = opaque;
|
||||
BlkRwCo *rwco = &acb->rwco;
|
||||
|
||||
- rwco->ret = blk_co_pdiscard(rwco->blk, rwco->offset, acb->bytes);
|
||||
+ rwco->ret = blk_do_pdiscard(rwco->blk, rwco->offset, acb->bytes);
|
||||
blk_aio_complete(acb);
|
||||
}
|
||||
|
||||
@@ -1571,12 +1605,23 @@ BlockAIOCB *blk_aio_pdiscard(BlockBackend *blk,
|
||||
cb, opaque);
|
||||
}
|
||||
|
||||
+int coroutine_fn blk_co_pdiscard(BlockBackend *blk, int64_t offset, int bytes)
|
||||
+{
|
||||
+ int ret;
|
||||
+
|
||||
+ blk_inc_in_flight(blk);
|
||||
+ ret = blk_do_pdiscard(blk, offset, bytes);
|
||||
+ blk_dec_in_flight(blk);
|
||||
+
|
||||
+ return ret;
|
||||
+}
|
||||
+
|
||||
static void blk_pdiscard_entry(void *opaque)
|
||||
{
|
||||
BlkRwCo *rwco = opaque;
|
||||
QEMUIOVector *qiov = rwco->iobuf;
|
||||
|
||||
- rwco->ret = blk_co_pdiscard(rwco->blk, rwco->offset, qiov->size);
|
||||
+ rwco->ret = blk_do_pdiscard(rwco->blk, rwco->offset, qiov->size);
|
||||
aio_wait_kick();
|
||||
}
|
||||
|
||||
@@ -1585,7 +1630,8 @@ int blk_pdiscard(BlockBackend *blk, int64_t offset, int bytes)
|
||||
return blk_prw(blk, offset, NULL, bytes, blk_pdiscard_entry, 0);
|
||||
}
|
||||
|
||||
-int blk_co_flush(BlockBackend *blk)
|
||||
+/* To be called between exactly one pair of blk_inc/dec_in_flight() */
|
||||
+static int coroutine_fn blk_do_flush(BlockBackend *blk)
|
||||
{
|
||||
blk_wait_while_drained(blk);
|
||||
|
||||
@@ -1601,7 +1647,7 @@ static void blk_aio_flush_entry(void *opaque)
|
||||
BlkAioEmAIOCB *acb = opaque;
|
||||
BlkRwCo *rwco = &acb->rwco;
|
||||
|
||||
- rwco->ret = blk_co_flush(rwco->blk);
|
||||
+ rwco->ret = blk_do_flush(rwco->blk);
|
||||
blk_aio_complete(acb);
|
||||
}
|
||||
|
||||
@@ -1611,10 +1657,21 @@ BlockAIOCB *blk_aio_flush(BlockBackend *blk,
|
||||
return blk_aio_prwv(blk, 0, 0, NULL, blk_aio_flush_entry, 0, cb, opaque);
|
||||
}
|
||||
|
||||
+int coroutine_fn blk_co_flush(BlockBackend *blk)
|
||||
+{
|
||||
+ int ret;
|
||||
+
|
||||
+ blk_inc_in_flight(blk);
|
||||
+ ret = blk_do_flush(blk);
|
||||
+ blk_dec_in_flight(blk);
|
||||
+
|
||||
+ return ret;
|
||||
+}
|
||||
+
|
||||
static void blk_flush_entry(void *opaque)
|
||||
{
|
||||
BlkRwCo *rwco = opaque;
|
||||
- rwco->ret = blk_co_flush(rwco->blk);
|
||||
+ rwco->ret = blk_do_flush(rwco->blk);
|
||||
aio_wait_kick();
|
||||
}
|
||||
|
||||
diff --git a/include/sysemu/block-backend.h b/include/sysemu/block-backend.h
|
||||
index b198dec..9bbdbd6 100644
|
||||
--- a/include/sysemu/block-backend.h
|
||||
+++ b/include/sysemu/block-backend.h
|
||||
@@ -171,7 +171,6 @@ BlockAIOCB *blk_aio_pdiscard(BlockBackend *blk, int64_t offset, int bytes,
|
||||
BlockCompletionFunc *cb, void *opaque);
|
||||
void blk_aio_cancel(BlockAIOCB *acb);
|
||||
void blk_aio_cancel_async(BlockAIOCB *acb);
|
||||
-int blk_co_ioctl(BlockBackend *blk, unsigned long int req, void *buf);
|
||||
int blk_ioctl(BlockBackend *blk, unsigned long int req, void *buf);
|
||||
BlockAIOCB *blk_aio_ioctl(BlockBackend *blk, unsigned long int req, void *buf,
|
||||
BlockCompletionFunc *cb, void *opaque);
|
||||
--
|
||||
1.8.3.1
|
||||
|
@ -1,65 +0,0 @@
|
||||
From f7dd953c2d0380cef3c351afb03d68c6fcda1dca Mon Sep 17 00:00:00 2001
|
||||
From: Kevin Wolf <kwolf@redhat.com>
|
||||
Date: Fri, 13 Mar 2020 12:34:28 +0000
|
||||
Subject: [PATCH 08/20] block: Introduce 'bdrv_reopen_commit_post' step
|
||||
|
||||
RH-Author: Kevin Wolf <kwolf@redhat.com>
|
||||
Message-id: <20200313123439.10548-3-kwolf@redhat.com>
|
||||
Patchwork-id: 94278
|
||||
O-Subject: [RHEL-AV-8.2.0 qemu-kvm PATCH v2 02/13] block: Introduce 'bdrv_reopen_commit_post' step
|
||||
Bugzilla: 1790482 1805143
|
||||
RH-Acked-by: John Snow <jsnow@redhat.com>
|
||||
RH-Acked-by: Daniel P. Berrange <berrange@redhat.com>
|
||||
RH-Acked-by: Peter Krempa <pkrempa@redhat.com>
|
||||
|
||||
From: Peter Krempa <pkrempa@redhat.com>
|
||||
|
||||
Add another step in the reopen process where driver can execute code
|
||||
after permission changes are comitted.
|
||||
|
||||
Signed-off-by: Peter Krempa <pkrempa@redhat.com>
|
||||
Message-Id: <adc02cf591c3cb34e98e33518eb1c540a0f27db1.1582893284.git.pkrempa@redhat.com>
|
||||
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
|
||||
(cherry picked from commit 17e1e2be5f9e84e0298e28e70675655b43e225ea)
|
||||
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
|
||||
Signed-off-by: Danilo C. L. de Paula <ddepaula@redhat.com>
|
||||
---
|
||||
block.c | 9 +++++++++
|
||||
include/block/block_int.h | 1 +
|
||||
2 files changed, 10 insertions(+)
|
||||
|
||||
diff --git a/block.c b/block.c
|
||||
index e1a4e38..a744bb5 100644
|
||||
--- a/block.c
|
||||
+++ b/block.c
|
||||
@@ -3657,6 +3657,15 @@ cleanup_perm:
|
||||
}
|
||||
}
|
||||
}
|
||||
+
|
||||
+ if (ret == 0) {
|
||||
+ QTAILQ_FOREACH_REVERSE(bs_entry, bs_queue, entry) {
|
||||
+ BlockDriverState *bs = bs_entry->state.bs;
|
||||
+
|
||||
+ if (bs->drv->bdrv_reopen_commit_post)
|
||||
+ bs->drv->bdrv_reopen_commit_post(&bs_entry->state);
|
||||
+ }
|
||||
+ }
|
||||
cleanup:
|
||||
QTAILQ_FOREACH_SAFE(bs_entry, bs_queue, entry, next) {
|
||||
if (ret) {
|
||||
diff --git a/include/block/block_int.h b/include/block/block_int.h
|
||||
index dd033d0..c168690 100644
|
||||
--- a/include/block/block_int.h
|
||||
+++ b/include/block/block_int.h
|
||||
@@ -123,6 +123,7 @@ struct BlockDriver {
|
||||
int (*bdrv_reopen_prepare)(BDRVReopenState *reopen_state,
|
||||
BlockReopenQueue *queue, Error **errp);
|
||||
void (*bdrv_reopen_commit)(BDRVReopenState *reopen_state);
|
||||
+ void (*bdrv_reopen_commit_post)(BDRVReopenState *reopen_state);
|
||||
void (*bdrv_reopen_abort)(BDRVReopenState *reopen_state);
|
||||
void (*bdrv_join_options)(QDict *options, QDict *old_options);
|
||||
|
||||
--
|
||||
1.8.3.1
|
||||
|
@ -1,67 +0,0 @@
|
||||
From 294ab4c4963295556d12ac15150b48c8536175a7 Mon Sep 17 00:00:00 2001
|
||||
From: Kevin Wolf <kwolf@redhat.com>
|
||||
Date: Fri, 13 Mar 2020 12:34:33 +0000
|
||||
Subject: [PATCH 13/20] block: Make bdrv_get_cumulative_perm() public
|
||||
|
||||
RH-Author: Kevin Wolf <kwolf@redhat.com>
|
||||
Message-id: <20200313123439.10548-8-kwolf@redhat.com>
|
||||
Patchwork-id: 94287
|
||||
O-Subject: [RHEL-AV-8.2.0 qemu-kvm PATCH v2 07/13] block: Make bdrv_get_cumulative_perm() public
|
||||
Bugzilla: 1790482 1805143
|
||||
RH-Acked-by: John Snow <jsnow@redhat.com>
|
||||
RH-Acked-by: Daniel P. Berrange <berrange@redhat.com>
|
||||
RH-Acked-by: Peter Krempa <pkrempa@redhat.com>
|
||||
|
||||
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
|
||||
Message-Id: <20200310113831.27293-2-kwolf@redhat.com>
|
||||
Reviewed-by: Peter Krempa <pkrempa@redhat.com>
|
||||
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
|
||||
(cherry picked from commit c7a0f2be8f95b220cdadbba9a9236eaf115951dc)
|
||||
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
|
||||
Signed-off-by: Danilo C. L. de Paula <ddepaula@redhat.com>
|
||||
---
|
||||
block.c | 6 ++----
|
||||
include/block/block_int.h | 3 +++
|
||||
2 files changed, 5 insertions(+), 4 deletions(-)
|
||||
|
||||
diff --git a/block.c b/block.c
|
||||
index 39e4647..354d388 100644
|
||||
--- a/block.c
|
||||
+++ b/block.c
|
||||
@@ -1850,8 +1850,6 @@ static int bdrv_child_check_perm(BdrvChild *c, BlockReopenQueue *q,
|
||||
bool *tighten_restrictions, Error **errp);
|
||||
static void bdrv_child_abort_perm_update(BdrvChild *c);
|
||||
static void bdrv_child_set_perm(BdrvChild *c, uint64_t perm, uint64_t shared);
|
||||
-static void bdrv_get_cumulative_perm(BlockDriverState *bs, uint64_t *perm,
|
||||
- uint64_t *shared_perm);
|
||||
|
||||
typedef struct BlockReopenQueueEntry {
|
||||
bool prepared;
|
||||
@@ -2075,8 +2073,8 @@ static void bdrv_set_perm(BlockDriverState *bs, uint64_t cumulative_perms,
|
||||
}
|
||||
}
|
||||
|
||||
-static void bdrv_get_cumulative_perm(BlockDriverState *bs, uint64_t *perm,
|
||||
- uint64_t *shared_perm)
|
||||
+void bdrv_get_cumulative_perm(BlockDriverState *bs, uint64_t *perm,
|
||||
+ uint64_t *shared_perm)
|
||||
{
|
||||
BdrvChild *c;
|
||||
uint64_t cumulative_perms = 0;
|
||||
diff --git a/include/block/block_int.h b/include/block/block_int.h
|
||||
index c168690..96e327b 100644
|
||||
--- a/include/block/block_int.h
|
||||
+++ b/include/block/block_int.h
|
||||
@@ -1228,6 +1228,9 @@ BdrvChild *bdrv_root_attach_child(BlockDriverState *child_bs,
|
||||
void *opaque, Error **errp);
|
||||
void bdrv_root_unref_child(BdrvChild *child);
|
||||
|
||||
+void bdrv_get_cumulative_perm(BlockDriverState *bs, uint64_t *perm,
|
||||
+ uint64_t *shared_perm);
|
||||
+
|
||||
/**
|
||||
* Sets a BdrvChild's permissions. Avoid if the parent is a BDS; use
|
||||
* bdrv_child_refresh_perms() instead and make the parent's
|
||||
--
|
||||
1.8.3.1
|
||||
|
@ -1,117 +0,0 @@
|
||||
From 9ba321e18a357c1a3a238ceee301bbb174f96eee Mon Sep 17 00:00:00 2001
|
||||
From: Kevin Wolf <kwolf@redhat.com>
|
||||
Date: Fri, 13 Mar 2020 12:34:34 +0000
|
||||
Subject: [PATCH 14/20] block: Relax restrictions for blockdev-snapshot
|
||||
|
||||
RH-Author: Kevin Wolf <kwolf@redhat.com>
|
||||
Message-id: <20200313123439.10548-9-kwolf@redhat.com>
|
||||
Patchwork-id: 94285
|
||||
O-Subject: [RHEL-AV-8.2.0 qemu-kvm PATCH v2 08/13] block: Relax restrictions for blockdev-snapshot
|
||||
Bugzilla: 1790482 1805143
|
||||
RH-Acked-by: John Snow <jsnow@redhat.com>
|
||||
RH-Acked-by: Daniel P. Berrange <berrange@redhat.com>
|
||||
RH-Acked-by: Peter Krempa <pkrempa@redhat.com>
|
||||
|
||||
blockdev-snapshot returned an error if the overlay was already in use,
|
||||
which it defined as having any BlockBackend parent. This is in fact both
|
||||
too strict (some parents can tolerate the change of visible data caused
|
||||
by attaching a backing file) and too loose (some non-BlockBackend
|
||||
parents may not be happy with it).
|
||||
|
||||
One important use case that is prevented by the too strict check is live
|
||||
storage migration with blockdev-mirror. Here, the target node is
|
||||
usually opened without a backing file so that the active layer is
|
||||
mirrored while its backing chain can be copied in the background.
|
||||
|
||||
The backing chain should be attached to the mirror target node when
|
||||
finalising the job, just before switching the users of the source node
|
||||
to the new copy (at which point the mirror job still has a reference to
|
||||
the node). drive-mirror did this automatically, but with blockdev-mirror
|
||||
this is the job of the QMP client, so it needs a way to do this.
|
||||
|
||||
blockdev-snapshot is the obvious way, so this patch makes it work in
|
||||
this scenario. The new condition is that no parent uses CONSISTENT_READ
|
||||
permissions. This will ensure that the operation will still be blocked
|
||||
when the node is attached to the guest device, so blockdev-snapshot
|
||||
remains safe.
|
||||
|
||||
(For the sake of completeness, x-blockdev-reopen can be used to achieve
|
||||
the same, however it is a big hammer, performs the graph change
|
||||
completely unchecked and is still experimental. So even with the option
|
||||
of using x-blockdev-reopen, there are reasons why blockdev-snapshot
|
||||
should be able to perform this operation.)
|
||||
|
||||
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
|
||||
Message-Id: <20200310113831.27293-3-kwolf@redhat.com>
|
||||
Reviewed-by: Peter Krempa <pkrempa@redhat.com>
|
||||
Tested-by: Peter Krempa <pkrempa@redhat.com>
|
||||
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
|
||||
(cherry picked from commit d29d3d1f80b3947fb26e7139645c83de66d146a9)
|
||||
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
|
||||
Signed-off-by: Danilo C. L. de Paula <ddepaula@redhat.com>
|
||||
---
|
||||
blockdev.c | 14 ++++++++------
|
||||
tests/qemu-iotests/085.out | 4 ++--
|
||||
2 files changed, 10 insertions(+), 8 deletions(-)
|
||||
|
||||
diff --git a/blockdev.c b/blockdev.c
|
||||
index 4cd9a58..7918533 100644
|
||||
--- a/blockdev.c
|
||||
+++ b/blockdev.c
|
||||
@@ -1536,6 +1536,7 @@ static void external_snapshot_prepare(BlkActionState *common,
|
||||
TransactionAction *action = common->action;
|
||||
AioContext *aio_context;
|
||||
AioContext *old_context;
|
||||
+ uint64_t perm, shared;
|
||||
int ret;
|
||||
|
||||
/* 'blockdev-snapshot' and 'blockdev-snapshot-sync' have similar
|
||||
@@ -1656,16 +1657,17 @@ static void external_snapshot_prepare(BlkActionState *common,
|
||||
goto out;
|
||||
}
|
||||
|
||||
- if (bdrv_has_blk(state->new_bs)) {
|
||||
+ /*
|
||||
+ * Allow attaching a backing file to an overlay that's already in use only
|
||||
+ * if the parents don't assume that they are already seeing a valid image.
|
||||
+ * (Specifically, allow it as a mirror target, which is write-only access.)
|
||||
+ */
|
||||
+ bdrv_get_cumulative_perm(state->new_bs, &perm, &shared);
|
||||
+ if (perm & BLK_PERM_CONSISTENT_READ) {
|
||||
error_setg(errp, "The overlay is already in use");
|
||||
goto out;
|
||||
}
|
||||
|
||||
- if (bdrv_op_is_blocked(state->new_bs, BLOCK_OP_TYPE_EXTERNAL_SNAPSHOT,
|
||||
- errp)) {
|
||||
- goto out;
|
||||
- }
|
||||
-
|
||||
if (state->new_bs->backing != NULL) {
|
||||
error_setg(errp, "The overlay already has a backing image");
|
||||
goto out;
|
||||
diff --git a/tests/qemu-iotests/085.out b/tests/qemu-iotests/085.out
|
||||
index bb50227..487d920 100644
|
||||
--- a/tests/qemu-iotests/085.out
|
||||
+++ b/tests/qemu-iotests/085.out
|
||||
@@ -82,7 +82,7 @@ Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=134217728 backing_file=TEST_DIR/
|
||||
=== Invalid command - cannot create a snapshot using a file BDS ===
|
||||
|
||||
{ 'execute': 'blockdev-snapshot', 'arguments': { 'node':'virtio0', 'overlay':'file_12' } }
|
||||
-{"error": {"class": "GenericError", "desc": "The overlay does not support backing images"}}
|
||||
+{"error": {"class": "GenericError", "desc": "The overlay is already in use"}}
|
||||
|
||||
=== Invalid command - snapshot node used as active layer ===
|
||||
|
||||
@@ -96,7 +96,7 @@ Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=134217728 backing_file=TEST_DIR/
|
||||
=== Invalid command - snapshot node used as backing hd ===
|
||||
|
||||
{ 'execute': 'blockdev-snapshot', 'arguments': { 'node': 'virtio0', 'overlay':'snap_11' } }
|
||||
-{"error": {"class": "GenericError", "desc": "Node 'snap_11' is busy: node is used as backing hd of 'snap_12'"}}
|
||||
+{"error": {"class": "GenericError", "desc": "The overlay is already in use"}}
|
||||
|
||||
=== Invalid command - snapshot node has a backing image ===
|
||||
|
||||
--
|
||||
1.8.3.1
|
||||
|
@ -1,158 +0,0 @@
|
||||
From 6cc456c4c1e6557fdc7e138e8ef8171b71609222 Mon Sep 17 00:00:00 2001
|
||||
From: Kevin Wolf <kwolf@redhat.com>
|
||||
Date: Wed, 8 Apr 2020 17:29:15 +0100
|
||||
Subject: [PATCH 4/6] block-backend: Reorder flush/pdiscard function
|
||||
definitions
|
||||
|
||||
RH-Author: Kevin Wolf <kwolf@redhat.com>
|
||||
Message-id: <20200408172917.18712-5-kwolf@redhat.com>
|
||||
Patchwork-id: 94598
|
||||
O-Subject: [RHEL-AV-8.2.0 qemu-kvm PATCH 4/6] block-backend: Reorder flush/pdiscard function definitions
|
||||
Bugzilla: 1817621
|
||||
RH-Acked-by: Eric Blake <eblake@redhat.com>
|
||||
RH-Acked-by: Danilo de Paula <ddepaula@redhat.com>
|
||||
RH-Acked-by: Max Reitz <mreitz@redhat.com>
|
||||
|
||||
Move all variants of the flush/pdiscard functions to a single place and
|
||||
put the blk_co_*() version first because it is called by all other
|
||||
variants (and will become static in the next patch).
|
||||
|
||||
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
|
||||
Reviewed-by: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>
|
||||
Reviewed-by: Max Reitz <mreitz@redhat.com>
|
||||
Message-Id: <20200407121259.21350-2-kwolf@redhat.com>
|
||||
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
|
||||
(cherry picked from commit 564806c529d4e0acad209b1e5b864a8886092f1f)
|
||||
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
|
||||
Signed-off-by: Danilo C. L. de Paula <ddepaula@redhat.com>
|
||||
---
|
||||
block/block-backend.c | 92 +++++++++++++++++++++++++--------------------------
|
||||
1 file changed, 46 insertions(+), 46 deletions(-)
|
||||
|
||||
diff --git a/block/block-backend.c b/block/block-backend.c
|
||||
index 8b8f2a8..17b2e87 100644
|
||||
--- a/block/block-backend.c
|
||||
+++ b/block/block-backend.c
|
||||
@@ -1488,38 +1488,6 @@ BlockAIOCB *blk_aio_pwritev(BlockBackend *blk, int64_t offset,
|
||||
blk_aio_write_entry, flags, cb, opaque);
|
||||
}
|
||||
|
||||
-static void blk_aio_flush_entry(void *opaque)
|
||||
-{
|
||||
- BlkAioEmAIOCB *acb = opaque;
|
||||
- BlkRwCo *rwco = &acb->rwco;
|
||||
-
|
||||
- rwco->ret = blk_co_flush(rwco->blk);
|
||||
- blk_aio_complete(acb);
|
||||
-}
|
||||
-
|
||||
-BlockAIOCB *blk_aio_flush(BlockBackend *blk,
|
||||
- BlockCompletionFunc *cb, void *opaque)
|
||||
-{
|
||||
- return blk_aio_prwv(blk, 0, 0, NULL, blk_aio_flush_entry, 0, cb, opaque);
|
||||
-}
|
||||
-
|
||||
-static void blk_aio_pdiscard_entry(void *opaque)
|
||||
-{
|
||||
- BlkAioEmAIOCB *acb = opaque;
|
||||
- BlkRwCo *rwco = &acb->rwco;
|
||||
-
|
||||
- rwco->ret = blk_co_pdiscard(rwco->blk, rwco->offset, acb->bytes);
|
||||
- blk_aio_complete(acb);
|
||||
-}
|
||||
-
|
||||
-BlockAIOCB *blk_aio_pdiscard(BlockBackend *blk,
|
||||
- int64_t offset, int bytes,
|
||||
- BlockCompletionFunc *cb, void *opaque)
|
||||
-{
|
||||
- return blk_aio_prwv(blk, offset, bytes, NULL, blk_aio_pdiscard_entry, 0,
|
||||
- cb, opaque);
|
||||
-}
|
||||
-
|
||||
void blk_aio_cancel(BlockAIOCB *acb)
|
||||
{
|
||||
bdrv_aio_cancel(acb);
|
||||
@@ -1586,6 +1554,37 @@ int blk_co_pdiscard(BlockBackend *blk, int64_t offset, int bytes)
|
||||
return bdrv_co_pdiscard(blk->root, offset, bytes);
|
||||
}
|
||||
|
||||
+static void blk_aio_pdiscard_entry(void *opaque)
|
||||
+{
|
||||
+ BlkAioEmAIOCB *acb = opaque;
|
||||
+ BlkRwCo *rwco = &acb->rwco;
|
||||
+
|
||||
+ rwco->ret = blk_co_pdiscard(rwco->blk, rwco->offset, acb->bytes);
|
||||
+ blk_aio_complete(acb);
|
||||
+}
|
||||
+
|
||||
+BlockAIOCB *blk_aio_pdiscard(BlockBackend *blk,
|
||||
+ int64_t offset, int bytes,
|
||||
+ BlockCompletionFunc *cb, void *opaque)
|
||||
+{
|
||||
+ return blk_aio_prwv(blk, offset, bytes, NULL, blk_aio_pdiscard_entry, 0,
|
||||
+ cb, opaque);
|
||||
+}
|
||||
+
|
||||
+static void blk_pdiscard_entry(void *opaque)
|
||||
+{
|
||||
+ BlkRwCo *rwco = opaque;
|
||||
+ QEMUIOVector *qiov = rwco->iobuf;
|
||||
+
|
||||
+ rwco->ret = blk_co_pdiscard(rwco->blk, rwco->offset, qiov->size);
|
||||
+ aio_wait_kick();
|
||||
+}
|
||||
+
|
||||
+int blk_pdiscard(BlockBackend *blk, int64_t offset, int bytes)
|
||||
+{
|
||||
+ return blk_prw(blk, offset, NULL, bytes, blk_pdiscard_entry, 0);
|
||||
+}
|
||||
+
|
||||
int blk_co_flush(BlockBackend *blk)
|
||||
{
|
||||
blk_wait_while_drained(blk);
|
||||
@@ -1597,6 +1596,21 @@ int blk_co_flush(BlockBackend *blk)
|
||||
return bdrv_co_flush(blk_bs(blk));
|
||||
}
|
||||
|
||||
+static void blk_aio_flush_entry(void *opaque)
|
||||
+{
|
||||
+ BlkAioEmAIOCB *acb = opaque;
|
||||
+ BlkRwCo *rwco = &acb->rwco;
|
||||
+
|
||||
+ rwco->ret = blk_co_flush(rwco->blk);
|
||||
+ blk_aio_complete(acb);
|
||||
+}
|
||||
+
|
||||
+BlockAIOCB *blk_aio_flush(BlockBackend *blk,
|
||||
+ BlockCompletionFunc *cb, void *opaque)
|
||||
+{
|
||||
+ return blk_aio_prwv(blk, 0, 0, NULL, blk_aio_flush_entry, 0, cb, opaque);
|
||||
+}
|
||||
+
|
||||
static void blk_flush_entry(void *opaque)
|
||||
{
|
||||
BlkRwCo *rwco = opaque;
|
||||
@@ -2083,20 +2097,6 @@ int blk_truncate(BlockBackend *blk, int64_t offset, bool exact,
|
||||
return bdrv_truncate(blk->root, offset, exact, prealloc, errp);
|
||||
}
|
||||
|
||||
-static void blk_pdiscard_entry(void *opaque)
|
||||
-{
|
||||
- BlkRwCo *rwco = opaque;
|
||||
- QEMUIOVector *qiov = rwco->iobuf;
|
||||
-
|
||||
- rwco->ret = blk_co_pdiscard(rwco->blk, rwco->offset, qiov->size);
|
||||
- aio_wait_kick();
|
||||
-}
|
||||
-
|
||||
-int blk_pdiscard(BlockBackend *blk, int64_t offset, int bytes)
|
||||
-{
|
||||
- return blk_prw(blk, offset, NULL, bytes, blk_pdiscard_entry, 0);
|
||||
-}
|
||||
-
|
||||
int blk_save_vmstate(BlockBackend *blk, const uint8_t *buf,
|
||||
int64_t pos, int size)
|
||||
{
|
||||
--
|
||||
1.8.3.1
|
||||
|
@ -1,130 +0,0 @@
|
||||
From aefff389c4d11bd69180db7177135c4645a9b1bd Mon Sep 17 00:00:00 2001
|
||||
From: Sergio Lopez Pascual <slp@redhat.com>
|
||||
Date: Fri, 7 Feb 2020 11:27:46 +0000
|
||||
Subject: [PATCH 13/18] block/backup-top: Don't acquire context while dropping
|
||||
top
|
||||
|
||||
RH-Author: Sergio Lopez Pascual <slp@redhat.com>
|
||||
Message-id: <20200207112749.25073-7-slp@redhat.com>
|
||||
Patchwork-id: 93759
|
||||
O-Subject: [RHEL-AV-8.2.0 qemu-kvm PATCH v2 6/9] block/backup-top: Don't acquire context while dropping top
|
||||
Bugzilla: 1745606 1746217 1773517 1779036 1782111 1782175 1783965
|
||||
RH-Acked-by: Stefano Garzarella <sgarzare@redhat.com>
|
||||
RH-Acked-by: Paolo Bonzini <pbonzini@redhat.com>
|
||||
RH-Acked-by: Max Reitz <mreitz@redhat.com>
|
||||
RH-Acked-by: Stefan Hajnoczi <stefanha@redhat.com>
|
||||
|
||||
All paths that lead to bdrv_backup_top_drop(), except for the call
|
||||
from backup_clean(), imply that the BDS AioContext has already been
|
||||
acquired, so doing it there too can potentially lead to QEMU hanging
|
||||
on AIO_WAIT_WHILE().
|
||||
|
||||
An easy way to trigger this situation is by issuing a two actions
|
||||
transaction, with a proper and a bogus blockdev-backup, so the second
|
||||
one will trigger a rollback. This will trigger a hang with an stack
|
||||
trace like this one:
|
||||
|
||||
#0 0x00007fb680c75016 in __GI_ppoll (fds=0x55e74580f7c0, nfds=1, timeout=<optimized out>,
|
||||
timeout@entry=0x0, sigmask=sigmask@entry=0x0) at ../sysdeps/unix/sysv/linux/ppoll.c:39
|
||||
#1 0x000055e743386e09 in ppoll (__ss=0x0, __timeout=0x0, __nfds=<optimized out>, __fds=<optimized out>)
|
||||
at /usr/include/bits/poll2.h:77
|
||||
#2 0x000055e743386e09 in qemu_poll_ns
|
||||
(fds=<optimized out>, nfds=<optimized out>, timeout=<optimized out>) at util/qemu-timer.c:336
|
||||
#3 0x000055e743388dc4 in aio_poll (ctx=0x55e7458925d0, blocking=blocking@entry=true)
|
||||
at util/aio-posix.c:669
|
||||
#4 0x000055e743305dea in bdrv_flush (bs=bs@entry=0x55e74593c0d0) at block/io.c:2878
|
||||
#5 0x000055e7432be58e in bdrv_close (bs=0x55e74593c0d0) at block.c:4017
|
||||
#6 0x000055e7432be58e in bdrv_delete (bs=<optimized out>) at block.c:4262
|
||||
#7 0x000055e7432be58e in bdrv_unref (bs=bs@entry=0x55e74593c0d0) at block.c:5644
|
||||
#8 0x000055e743316b9b in bdrv_backup_top_drop (bs=bs@entry=0x55e74593c0d0) at block/backup-top.c:273
|
||||
#9 0x000055e74331461f in backup_job_create
|
||||
(job_id=0x0, bs=bs@entry=0x55e7458d5820, target=target@entry=0x55e74589f640, speed=0, sync_mode=MIRROR_SYNC_MODE_FULL, sync_bitmap=sync_bitmap@entry=0x0, bitmap_mode=BITMAP_SYNC_MODE_ON_SUCCESS, compress=false, filter_node_name=0x0, on_source_error=BLOCKDEV_ON_ERROR_REPORT, on_target_error=BLOCKDEV_ON_ERROR_REPORT, creation_flags=0, cb=0x0, opaque=0x0, txn=0x0, errp=0x7ffddfd1efb0) at block/backup.c:478
|
||||
#10 0x000055e74315bc52 in do_backup_common
|
||||
(backup=backup@entry=0x55e746c066d0, bs=bs@entry=0x55e7458d5820, target_bs=target_bs@entry=0x55e74589f640, aio_context=aio_context@entry=0x55e7458a91e0, txn=txn@entry=0x0, errp=errp@entry=0x7ffddfd1efb0)
|
||||
at blockdev.c:3580
|
||||
#11 0x000055e74315c37c in do_blockdev_backup
|
||||
(backup=backup@entry=0x55e746c066d0, txn=0x0, errp=errp@entry=0x7ffddfd1efb0)
|
||||
at /usr/src/debug/qemu-kvm-4.2.0-2.module+el8.2.0+5135+ed3b2489.x86_64/./qapi/qapi-types-block-core.h:1492
|
||||
#12 0x000055e74315c449 in blockdev_backup_prepare (common=0x55e746a8de90, errp=0x7ffddfd1f018)
|
||||
at blockdev.c:1885
|
||||
#13 0x000055e743160152 in qmp_transaction
|
||||
(dev_list=<optimized out>, has_props=<optimized out>, props=0x55e7467fe2c0, errp=errp@entry=0x7ffddfd1f088) at blockdev.c:2340
|
||||
#14 0x000055e743287ff5 in qmp_marshal_transaction
|
||||
(args=<optimized out>, ret=<optimized out>, errp=0x7ffddfd1f0f8)
|
||||
at qapi/qapi-commands-transaction.c:44
|
||||
#15 0x000055e74333de6c in do_qmp_dispatch
|
||||
(errp=0x7ffddfd1f0f0, allow_oob=<optimized out>, request=<optimized out>, cmds=0x55e743c28d60 <qmp_commands>) at qapi/qmp-dispatch.c:132
|
||||
#16 0x000055e74333de6c in qmp_dispatch
|
||||
(cmds=0x55e743c28d60 <qmp_commands>, request=<optimized out>, allow_oob=<optimized out>)
|
||||
at qapi/qmp-dispatch.c:175
|
||||
#17 0x000055e74325c061 in monitor_qmp_dispatch (mon=0x55e745908030, req=<optimized out>)
|
||||
at monitor/qmp.c:145
|
||||
#18 0x000055e74325c6fa in monitor_qmp_bh_dispatcher (data=<optimized out>) at monitor/qmp.c:234
|
||||
#19 0x000055e743385866 in aio_bh_call (bh=0x55e745807ae0) at util/async.c:117
|
||||
#20 0x000055e743385866 in aio_bh_poll (ctx=ctx@entry=0x55e7458067a0) at util/async.c:117
|
||||
#21 0x000055e743388c54 in aio_dispatch (ctx=0x55e7458067a0) at util/aio-posix.c:459
|
||||
#22 0x000055e743385742 in aio_ctx_dispatch
|
||||
(source=<optimized out>, callback=<optimized out>, user_data=<optimized out>) at util/async.c:260
|
||||
#23 0x00007fb68543e67d in g_main_dispatch (context=0x55e745893a40) at gmain.c:3176
|
||||
#24 0x00007fb68543e67d in g_main_context_dispatch (context=context@entry=0x55e745893a40) at gmain.c:3829
|
||||
#25 0x000055e743387d08 in glib_pollfds_poll () at util/main-loop.c:219
|
||||
#26 0x000055e743387d08 in os_host_main_loop_wait (timeout=<optimized out>) at util/main-loop.c:242
|
||||
#27 0x000055e743387d08 in main_loop_wait (nonblocking=<optimized out>) at util/main-loop.c:518
|
||||
#28 0x000055e74316a3c1 in main_loop () at vl.c:1828
|
||||
#29 0x000055e743016a72 in main (argc=<optimized out>, argv=<optimized out>, envp=<optimized out>)
|
||||
at vl.c:4504
|
||||
|
||||
Fix this by not acquiring the AioContext there, and ensuring all paths
|
||||
leading to it have it already acquired (backup_clean()).
|
||||
|
||||
RHBZ: https://bugzilla.redhat.com/show_bug.cgi?id=1782111
|
||||
Signed-off-by: Sergio Lopez <slp@redhat.com>
|
||||
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
|
||||
(cherry picked from commit 0abf2581717a19d9749d5c2ff8acd0ac203452c2)
|
||||
Signed-off-by: Sergio Lopez <slp@redhat.com>
|
||||
Signed-off-by: Danilo C. L. de Paula <ddepaula@redhat.com>
|
||||
---
|
||||
block/backup-top.c | 5 -----
|
||||
block/backup.c | 3 +++
|
||||
2 files changed, 3 insertions(+), 5 deletions(-)
|
||||
|
||||
diff --git a/block/backup-top.c b/block/backup-top.c
|
||||
index 818d3f2..b8d863f 100644
|
||||
--- a/block/backup-top.c
|
||||
+++ b/block/backup-top.c
|
||||
@@ -255,9 +255,6 @@ append_failed:
|
||||
void bdrv_backup_top_drop(BlockDriverState *bs)
|
||||
{
|
||||
BDRVBackupTopState *s = bs->opaque;
|
||||
- AioContext *aio_context = bdrv_get_aio_context(bs);
|
||||
-
|
||||
- aio_context_acquire(aio_context);
|
||||
|
||||
bdrv_drained_begin(bs);
|
||||
|
||||
@@ -271,6 +268,4 @@ void bdrv_backup_top_drop(BlockDriverState *bs)
|
||||
bdrv_drained_end(bs);
|
||||
|
||||
bdrv_unref(bs);
|
||||
-
|
||||
- aio_context_release(aio_context);
|
||||
}
|
||||
diff --git a/block/backup.c b/block/backup.c
|
||||
index cf62b1a..1383e21 100644
|
||||
--- a/block/backup.c
|
||||
+++ b/block/backup.c
|
||||
@@ -135,8 +135,11 @@ static void backup_abort(Job *job)
|
||||
static void backup_clean(Job *job)
|
||||
{
|
||||
BackupBlockJob *s = container_of(job, BackupBlockJob, common.job);
|
||||
+ AioContext *aio_context = bdrv_get_aio_context(s->backup_top);
|
||||
|
||||
+ aio_context_acquire(aio_context);
|
||||
bdrv_backup_top_drop(s->backup_top);
|
||||
+ aio_context_release(aio_context);
|
||||
}
|
||||
|
||||
void backup_do_checkpoint(BlockJob *job, Error **errp)
|
||||
--
|
||||
1.8.3.1
|
||||
|
@ -1,114 +0,0 @@
|
||||
From 1e0582ad34e77a060e2067a35992979c9eae82c9 Mon Sep 17 00:00:00 2001
|
||||
From: Kevin Wolf <kwolf@redhat.com>
|
||||
Date: Fri, 13 Mar 2020 12:34:31 +0000
|
||||
Subject: [PATCH 11/20] block: bdrv_reopen() with backing file in different
|
||||
AioContext
|
||||
|
||||
RH-Author: Kevin Wolf <kwolf@redhat.com>
|
||||
Message-id: <20200313123439.10548-6-kwolf@redhat.com>
|
||||
Patchwork-id: 94282
|
||||
O-Subject: [RHEL-AV-8.2.0 qemu-kvm PATCH v2 05/13] block: bdrv_reopen() with backing file in different AioContext
|
||||
Bugzilla: 1790482 1805143
|
||||
RH-Acked-by: John Snow <jsnow@redhat.com>
|
||||
RH-Acked-by: Daniel P. Berrange <berrange@redhat.com>
|
||||
RH-Acked-by: Peter Krempa <pkrempa@redhat.com>
|
||||
|
||||
This patch allows bdrv_reopen() (and therefore the x-blockdev-reopen QMP
|
||||
command) to attach a node as the new backing file even if the node is in
|
||||
a different AioContext than the parent if one of both nodes can be moved
|
||||
to the AioContext of the other node.
|
||||
|
||||
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
|
||||
Tested-by: Peter Krempa <pkrempa@redhat.com>
|
||||
Message-Id: <20200306141413.30705-3-kwolf@redhat.com>
|
||||
Reviewed-by: Alberto Garcia <berto@igalia.com>
|
||||
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
|
||||
(cherry picked from commit 1de6b45fb5c1489b450df7d1a4c692bba9678ce6)
|
||||
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
|
||||
Signed-off-by: Danilo C. L. de Paula <ddepaula@redhat.com>
|
||||
---
|
||||
block.c | 32 ++++++++++++++++++++++++++------
|
||||
tests/qemu-iotests/245 | 8 +++-----
|
||||
2 files changed, 29 insertions(+), 11 deletions(-)
|
||||
|
||||
diff --git a/block.c b/block.c
|
||||
index a744bb5..39e4647 100644
|
||||
--- a/block.c
|
||||
+++ b/block.c
|
||||
@@ -3749,6 +3749,29 @@ static void bdrv_reopen_perm(BlockReopenQueue *q, BlockDriverState *bs,
|
||||
*shared = cumulative_shared_perms;
|
||||
}
|
||||
|
||||
+static bool bdrv_reopen_can_attach(BlockDriverState *parent,
|
||||
+ BdrvChild *child,
|
||||
+ BlockDriverState *new_child,
|
||||
+ Error **errp)
|
||||
+{
|
||||
+ AioContext *parent_ctx = bdrv_get_aio_context(parent);
|
||||
+ AioContext *child_ctx = bdrv_get_aio_context(new_child);
|
||||
+ GSList *ignore;
|
||||
+ bool ret;
|
||||
+
|
||||
+ ignore = g_slist_prepend(NULL, child);
|
||||
+ ret = bdrv_can_set_aio_context(new_child, parent_ctx, &ignore, NULL);
|
||||
+ g_slist_free(ignore);
|
||||
+ if (ret) {
|
||||
+ return ret;
|
||||
+ }
|
||||
+
|
||||
+ ignore = g_slist_prepend(NULL, child);
|
||||
+ ret = bdrv_can_set_aio_context(parent, child_ctx, &ignore, errp);
|
||||
+ g_slist_free(ignore);
|
||||
+ return ret;
|
||||
+}
|
||||
+
|
||||
/*
|
||||
* Take a BDRVReopenState and check if the value of 'backing' in the
|
||||
* reopen_state->options QDict is valid or not.
|
||||
@@ -3800,14 +3823,11 @@ static int bdrv_reopen_parse_backing(BDRVReopenState *reopen_state,
|
||||
}
|
||||
|
||||
/*
|
||||
- * TODO: before removing the x- prefix from x-blockdev-reopen we
|
||||
- * should move the new backing file into the right AioContext
|
||||
- * instead of returning an error.
|
||||
+ * Check AioContext compatibility so that the bdrv_set_backing_hd() call in
|
||||
+ * bdrv_reopen_commit() won't fail.
|
||||
*/
|
||||
if (new_backing_bs) {
|
||||
- if (bdrv_get_aio_context(new_backing_bs) != bdrv_get_aio_context(bs)) {
|
||||
- error_setg(errp, "Cannot use a new backing file "
|
||||
- "with a different AioContext");
|
||||
+ if (!bdrv_reopen_can_attach(bs, bs->backing, new_backing_bs, errp)) {
|
||||
return -EINVAL;
|
||||
}
|
||||
}
|
||||
diff --git a/tests/qemu-iotests/245 b/tests/qemu-iotests/245
|
||||
index f69c2fa..919131d 100644
|
||||
--- a/tests/qemu-iotests/245
|
||||
+++ b/tests/qemu-iotests/245
|
||||
@@ -1013,18 +1013,16 @@ class TestBlockdevReopen(iotests.QMPTestCase):
|
||||
# neither of them can switch to the other AioContext
|
||||
def test_iothreads_error(self):
|
||||
self.run_test_iothreads('iothread0', 'iothread1',
|
||||
- "Cannot use a new backing file with a different AioContext")
|
||||
+ "Cannot change iothread of active block backend")
|
||||
|
||||
def test_iothreads_compatible_users(self):
|
||||
self.run_test_iothreads('iothread0', 'iothread0')
|
||||
|
||||
def test_iothreads_switch_backing(self):
|
||||
- self.run_test_iothreads('iothread0', None,
|
||||
- "Cannot use a new backing file with a different AioContext")
|
||||
+ self.run_test_iothreads('iothread0', None)
|
||||
|
||||
def test_iothreads_switch_overlay(self):
|
||||
- self.run_test_iothreads(None, 'iothread0',
|
||||
- "Cannot use a new backing file with a different AioContext")
|
||||
+ self.run_test_iothreads(None, 'iothread0')
|
||||
|
||||
if __name__ == '__main__':
|
||||
iotests.main(supported_fmts=["qcow2"],
|
||||
--
|
||||
1.8.3.1
|
||||
|
@ -1,78 +0,0 @@
|
||||
From 4ef2c464a54b0b618d933641ac0a7012e629fed9 Mon Sep 17 00:00:00 2001
|
||||
From: Maxim Levitsky <mlevitsk@redhat.com>
|
||||
Date: Wed, 11 Mar 2020 10:51:42 +0000
|
||||
Subject: [PATCH 01/20] block/nbd: Fix hang in .bdrv_close()
|
||||
|
||||
RH-Author: Maxim Levitsky <mlevitsk@redhat.com>
|
||||
Message-id: <20200311105147.13208-2-mlevitsk@redhat.com>
|
||||
Patchwork-id: 94224
|
||||
O-Subject: [RHEL-AV-8.2.0 qemu-kvm PATCH v2 1/6] block/nbd: Fix hang in .bdrv_close()
|
||||
Bugzilla: 1640894
|
||||
RH-Acked-by: Stefano Garzarella <sgarzare@redhat.com>
|
||||
RH-Acked-by: John Snow <jsnow@redhat.com>
|
||||
RH-Acked-by: Max Reitz <mreitz@redhat.com>
|
||||
|
||||
From: Max Reitz <mreitz@redhat.com>
|
||||
|
||||
When nbd_close() is called from a coroutine, the connection_co never
|
||||
gets to run, and thus nbd_teardown_connection() hangs.
|
||||
|
||||
This is because aio_co_enter() only puts the connection_co into the main
|
||||
coroutine's wake-up queue, so this main coroutine needs to yield and
|
||||
wait for connection_co to terminate.
|
||||
|
||||
Suggested-by: Kevin Wolf <kwolf@redhat.com>
|
||||
Signed-off-by: Max Reitz <mreitz@redhat.com>
|
||||
Message-Id: <20200122164532.178040-2-mreitz@redhat.com>
|
||||
Reviewed-by: Eric Blake <eblake@redhat.com>
|
||||
Reviewed-by: Maxim Levitsky <mlevitsk@redhat.com>
|
||||
Signed-off-by: Max Reitz <mreitz@redhat.com>
|
||||
(cherry picked from commit 78c81a3f108870d325b0a39d88711366afe6f703)
|
||||
Signed-off-by: Maxim Levitsky <mlevitsk@redhat.com>
|
||||
Signed-off-by: Danilo C. L. de Paula <ddepaula@redhat.com>
|
||||
---
|
||||
block/nbd.c | 14 +++++++++++++-
|
||||
1 file changed, 13 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/block/nbd.c b/block/nbd.c
|
||||
index 5f18f78..a73f0d9 100644
|
||||
--- a/block/nbd.c
|
||||
+++ b/block/nbd.c
|
||||
@@ -70,6 +70,7 @@ typedef struct BDRVNBDState {
|
||||
CoMutex send_mutex;
|
||||
CoQueue free_sema;
|
||||
Coroutine *connection_co;
|
||||
+ Coroutine *teardown_co;
|
||||
QemuCoSleepState *connection_co_sleep_ns_state;
|
||||
bool drained;
|
||||
bool wait_drained_end;
|
||||
@@ -203,7 +204,15 @@ static void nbd_teardown_connection(BlockDriverState *bs)
|
||||
qemu_co_sleep_wake(s->connection_co_sleep_ns_state);
|
||||
}
|
||||
}
|
||||
- BDRV_POLL_WHILE(bs, s->connection_co);
|
||||
+ if (qemu_in_coroutine()) {
|
||||
+ s->teardown_co = qemu_coroutine_self();
|
||||
+ /* connection_co resumes us when it terminates */
|
||||
+ qemu_coroutine_yield();
|
||||
+ s->teardown_co = NULL;
|
||||
+ } else {
|
||||
+ BDRV_POLL_WHILE(bs, s->connection_co);
|
||||
+ }
|
||||
+ assert(!s->connection_co);
|
||||
}
|
||||
|
||||
static bool nbd_client_connecting(BDRVNBDState *s)
|
||||
@@ -395,6 +404,9 @@ static coroutine_fn void nbd_connection_entry(void *opaque)
|
||||
s->ioc = NULL;
|
||||
}
|
||||
|
||||
+ if (s->teardown_co) {
|
||||
+ aio_co_wake(s->teardown_co);
|
||||
+ }
|
||||
aio_wait_kick();
|
||||
}
|
||||
|
||||
--
|
||||
1.8.3.1
|
||||
|
@ -1,328 +0,0 @@
|
||||
From 25c528b30f8774f33e957d14060805398da524d9 Mon Sep 17 00:00:00 2001
|
||||
From: Maxim Levitsky <mlevitsk@redhat.com>
|
||||
Date: Thu, 26 Mar 2020 20:23:06 +0000
|
||||
Subject: [PATCH 1/4] block: pass BlockDriver reference to the .bdrv_co_create
|
||||
|
||||
RH-Author: Maxim Levitsky <mlevitsk@redhat.com>
|
||||
Message-id: <20200326202307.9264-2-mlevitsk@redhat.com>
|
||||
Patchwork-id: 94447
|
||||
O-Subject: [RHEL-AV-8.2.0 qemu-kvm PATCH 1/2] block: pass BlockDriver reference to the .bdrv_co_create
|
||||
Bugzilla: 1816007
|
||||
RH-Acked-by: Danilo de Paula <ddepaula@redhat.com>
|
||||
RH-Acked-by: Kevin Wolf <kwolf@redhat.com>
|
||||
RH-Acked-by: Max Reitz <mreitz@redhat.com>
|
||||
|
||||
This will allow the reuse of a single generic .bdrv_co_create
|
||||
implementation for several drivers.
|
||||
No functional changes.
|
||||
|
||||
Signed-off-by: Maxim Levitsky <mlevitsk@redhat.com>
|
||||
Message-Id: <20200326011218.29230-2-mlevitsk@redhat.com>
|
||||
Reviewed-by: Denis V. Lunev <den@openvz.org>
|
||||
Signed-off-by: Max Reitz <mreitz@redhat.com>
|
||||
(cherry picked from commit b92902dfeaafbceaf744ab7473f2d070284f6172)
|
||||
Signed-off-by: Maxim Levitsky <mlevitsk@redhat.com>
|
||||
Signed-off-by: Danilo C. L. de Paula <ddepaula@redhat.com>
|
||||
---
|
||||
block.c | 3 ++-
|
||||
block/crypto.c | 3 ++-
|
||||
block/file-posix.c | 4 +++-
|
||||
block/file-win32.c | 4 +++-
|
||||
block/gluster.c | 3 ++-
|
||||
block/nfs.c | 4 +++-
|
||||
block/parallels.c | 3 ++-
|
||||
block/qcow.c | 3 ++-
|
||||
block/qcow2.c | 4 +++-
|
||||
block/qed.c | 3 ++-
|
||||
block/raw-format.c | 4 +++-
|
||||
block/rbd.c | 3 ++-
|
||||
block/sheepdog.c | 4 +++-
|
||||
block/ssh.c | 4 +++-
|
||||
block/vdi.c | 4 +++-
|
||||
block/vhdx.c | 3 ++-
|
||||
block/vmdk.c | 4 +++-
|
||||
block/vpc.c | 6 ++++--
|
||||
include/block/block_int.h | 3 ++-
|
||||
19 files changed, 49 insertions(+), 20 deletions(-)
|
||||
|
||||
diff --git a/block.c b/block.c
|
||||
index ec29b1e..f9a1c5b 100644
|
||||
--- a/block.c
|
||||
+++ b/block.c
|
||||
@@ -482,7 +482,8 @@ static void coroutine_fn bdrv_create_co_entry(void *opaque)
|
||||
CreateCo *cco = opaque;
|
||||
assert(cco->drv);
|
||||
|
||||
- ret = cco->drv->bdrv_co_create_opts(cco->filename, cco->opts, &local_err);
|
||||
+ ret = cco->drv->bdrv_co_create_opts(cco->drv,
|
||||
+ cco->filename, cco->opts, &local_err);
|
||||
error_propagate(&cco->err, local_err);
|
||||
cco->ret = ret;
|
||||
}
|
||||
diff --git a/block/crypto.c b/block/crypto.c
|
||||
index 2482383..970d463 100644
|
||||
--- a/block/crypto.c
|
||||
+++ b/block/crypto.c
|
||||
@@ -539,7 +539,8 @@ fail:
|
||||
return ret;
|
||||
}
|
||||
|
||||
-static int coroutine_fn block_crypto_co_create_opts_luks(const char *filename,
|
||||
+static int coroutine_fn block_crypto_co_create_opts_luks(BlockDriver *drv,
|
||||
+ const char *filename,
|
||||
QemuOpts *opts,
|
||||
Error **errp)
|
||||
{
|
||||
diff --git a/block/file-posix.c b/block/file-posix.c
|
||||
index fd29372..a2e0a74 100644
|
||||
--- a/block/file-posix.c
|
||||
+++ b/block/file-posix.c
|
||||
@@ -2346,7 +2346,9 @@ out:
|
||||
return result;
|
||||
}
|
||||
|
||||
-static int coroutine_fn raw_co_create_opts(const char *filename, QemuOpts *opts,
|
||||
+static int coroutine_fn raw_co_create_opts(BlockDriver *drv,
|
||||
+ const char *filename,
|
||||
+ QemuOpts *opts,
|
||||
Error **errp)
|
||||
{
|
||||
BlockdevCreateOptions options;
|
||||
diff --git a/block/file-win32.c b/block/file-win32.c
|
||||
index 77e8ff7..1585983 100644
|
||||
--- a/block/file-win32.c
|
||||
+++ b/block/file-win32.c
|
||||
@@ -588,7 +588,9 @@ static int raw_co_create(BlockdevCreateOptions *options, Error **errp)
|
||||
return 0;
|
||||
}
|
||||
|
||||
-static int coroutine_fn raw_co_create_opts(const char *filename, QemuOpts *opts,
|
||||
+static int coroutine_fn raw_co_create_opts(BlockDriver *drv,
|
||||
+ const char *filename,
|
||||
+ QemuOpts *opts,
|
||||
Error **errp)
|
||||
{
|
||||
BlockdevCreateOptions options;
|
||||
diff --git a/block/gluster.c b/block/gluster.c
|
||||
index 4fa4a77..0aa1f2c 100644
|
||||
--- a/block/gluster.c
|
||||
+++ b/block/gluster.c
|
||||
@@ -1130,7 +1130,8 @@ out:
|
||||
return ret;
|
||||
}
|
||||
|
||||
-static int coroutine_fn qemu_gluster_co_create_opts(const char *filename,
|
||||
+static int coroutine_fn qemu_gluster_co_create_opts(BlockDriver *drv,
|
||||
+ const char *filename,
|
||||
QemuOpts *opts,
|
||||
Error **errp)
|
||||
{
|
||||
diff --git a/block/nfs.c b/block/nfs.c
|
||||
index 9a6311e..cc2413d 100644
|
||||
--- a/block/nfs.c
|
||||
+++ b/block/nfs.c
|
||||
@@ -662,7 +662,9 @@ out:
|
||||
return ret;
|
||||
}
|
||||
|
||||
-static int coroutine_fn nfs_file_co_create_opts(const char *url, QemuOpts *opts,
|
||||
+static int coroutine_fn nfs_file_co_create_opts(BlockDriver *drv,
|
||||
+ const char *url,
|
||||
+ QemuOpts *opts,
|
||||
Error **errp)
|
||||
{
|
||||
BlockdevCreateOptions *create_options;
|
||||
diff --git a/block/parallels.c b/block/parallels.c
|
||||
index 7a01997..6d4ed77 100644
|
||||
--- a/block/parallels.c
|
||||
+++ b/block/parallels.c
|
||||
@@ -609,7 +609,8 @@ exit:
|
||||
goto out;
|
||||
}
|
||||
|
||||
-static int coroutine_fn parallels_co_create_opts(const char *filename,
|
||||
+static int coroutine_fn parallels_co_create_opts(BlockDriver *drv,
|
||||
+ const char *filename,
|
||||
QemuOpts *opts,
|
||||
Error **errp)
|
||||
{
|
||||
diff --git a/block/qcow.c b/block/qcow.c
|
||||
index fce8989..8973e4e 100644
|
||||
--- a/block/qcow.c
|
||||
+++ b/block/qcow.c
|
||||
@@ -934,7 +934,8 @@ exit:
|
||||
return ret;
|
||||
}
|
||||
|
||||
-static int coroutine_fn qcow_co_create_opts(const char *filename,
|
||||
+static int coroutine_fn qcow_co_create_opts(BlockDriver *drv,
|
||||
+ const char *filename,
|
||||
QemuOpts *opts, Error **errp)
|
||||
{
|
||||
BlockdevCreateOptions *create_options = NULL;
|
||||
diff --git a/block/qcow2.c b/block/qcow2.c
|
||||
index 83b1fc0..71067c6 100644
|
||||
--- a/block/qcow2.c
|
||||
+++ b/block/qcow2.c
|
||||
@@ -3558,7 +3558,9 @@ out:
|
||||
return ret;
|
||||
}
|
||||
|
||||
-static int coroutine_fn qcow2_co_create_opts(const char *filename, QemuOpts *opts,
|
||||
+static int coroutine_fn qcow2_co_create_opts(BlockDriver *drv,
|
||||
+ const char *filename,
|
||||
+ QemuOpts *opts,
|
||||
Error **errp)
|
||||
{
|
||||
BlockdevCreateOptions *create_options = NULL;
|
||||
diff --git a/block/qed.c b/block/qed.c
|
||||
index d8c4e5f..1af9b3c 100644
|
||||
--- a/block/qed.c
|
||||
+++ b/block/qed.c
|
||||
@@ -720,7 +720,8 @@ out:
|
||||
return ret;
|
||||
}
|
||||
|
||||
-static int coroutine_fn bdrv_qed_co_create_opts(const char *filename,
|
||||
+static int coroutine_fn bdrv_qed_co_create_opts(BlockDriver *drv,
|
||||
+ const char *filename,
|
||||
QemuOpts *opts,
|
||||
Error **errp)
|
||||
{
|
||||
diff --git a/block/raw-format.c b/block/raw-format.c
|
||||
index 3a76ec7..93b25e1 100644
|
||||
--- a/block/raw-format.c
|
||||
+++ b/block/raw-format.c
|
||||
@@ -419,7 +419,9 @@ static int raw_has_zero_init_truncate(BlockDriverState *bs)
|
||||
return bdrv_has_zero_init_truncate(bs->file->bs);
|
||||
}
|
||||
|
||||
-static int coroutine_fn raw_co_create_opts(const char *filename, QemuOpts *opts,
|
||||
+static int coroutine_fn raw_co_create_opts(BlockDriver *drv,
|
||||
+ const char *filename,
|
||||
+ QemuOpts *opts,
|
||||
Error **errp)
|
||||
{
|
||||
return bdrv_create_file(filename, opts, errp);
|
||||
diff --git a/block/rbd.c b/block/rbd.c
|
||||
index 027cbcc..8847259 100644
|
||||
--- a/block/rbd.c
|
||||
+++ b/block/rbd.c
|
||||
@@ -425,7 +425,8 @@ static int qemu_rbd_co_create(BlockdevCreateOptions *options, Error **errp)
|
||||
return qemu_rbd_do_create(options, NULL, NULL, errp);
|
||||
}
|
||||
|
||||
-static int coroutine_fn qemu_rbd_co_create_opts(const char *filename,
|
||||
+static int coroutine_fn qemu_rbd_co_create_opts(BlockDriver *drv,
|
||||
+ const char *filename,
|
||||
QemuOpts *opts,
|
||||
Error **errp)
|
||||
{
|
||||
diff --git a/block/sheepdog.c b/block/sheepdog.c
|
||||
index cfa8433..a8a7e32 100644
|
||||
--- a/block/sheepdog.c
|
||||
+++ b/block/sheepdog.c
|
||||
@@ -2157,7 +2157,9 @@ out:
|
||||
return ret;
|
||||
}
|
||||
|
||||
-static int coroutine_fn sd_co_create_opts(const char *filename, QemuOpts *opts,
|
||||
+static int coroutine_fn sd_co_create_opts(BlockDriver *drv,
|
||||
+ const char *filename,
|
||||
+ QemuOpts *opts,
|
||||
Error **errp)
|
||||
{
|
||||
BlockdevCreateOptions *create_options = NULL;
|
||||
diff --git a/block/ssh.c b/block/ssh.c
|
||||
index b4375cf..84e9282 100644
|
||||
--- a/block/ssh.c
|
||||
+++ b/block/ssh.c
|
||||
@@ -963,7 +963,9 @@ fail:
|
||||
return ret;
|
||||
}
|
||||
|
||||
-static int coroutine_fn ssh_co_create_opts(const char *filename, QemuOpts *opts,
|
||||
+static int coroutine_fn ssh_co_create_opts(BlockDriver *drv,
|
||||
+ const char *filename,
|
||||
+ QemuOpts *opts,
|
||||
Error **errp)
|
||||
{
|
||||
BlockdevCreateOptions *create_options;
|
||||
diff --git a/block/vdi.c b/block/vdi.c
|
||||
index 0142da7..e1a11f2 100644
|
||||
--- a/block/vdi.c
|
||||
+++ b/block/vdi.c
|
||||
@@ -896,7 +896,9 @@ static int coroutine_fn vdi_co_create(BlockdevCreateOptions *create_options,
|
||||
return vdi_co_do_create(create_options, DEFAULT_CLUSTER_SIZE, errp);
|
||||
}
|
||||
|
||||
-static int coroutine_fn vdi_co_create_opts(const char *filename, QemuOpts *opts,
|
||||
+static int coroutine_fn vdi_co_create_opts(BlockDriver *drv,
|
||||
+ const char *filename,
|
||||
+ QemuOpts *opts,
|
||||
Error **errp)
|
||||
{
|
||||
QDict *qdict = NULL;
|
||||
diff --git a/block/vhdx.c b/block/vhdx.c
|
||||
index f02d261..33e57cd 100644
|
||||
--- a/block/vhdx.c
|
||||
+++ b/block/vhdx.c
|
||||
@@ -2046,7 +2046,8 @@ delete_and_exit:
|
||||
return ret;
|
||||
}
|
||||
|
||||
-static int coroutine_fn vhdx_co_create_opts(const char *filename,
|
||||
+static int coroutine_fn vhdx_co_create_opts(BlockDriver *drv,
|
||||
+ const char *filename,
|
||||
QemuOpts *opts,
|
||||
Error **errp)
|
||||
{
|
||||
diff --git a/block/vmdk.c b/block/vmdk.c
|
||||
index 20e909d..eb726f2 100644
|
||||
--- a/block/vmdk.c
|
||||
+++ b/block/vmdk.c
|
||||
@@ -2588,7 +2588,9 @@ exit:
|
||||
return blk;
|
||||
}
|
||||
|
||||
-static int coroutine_fn vmdk_co_create_opts(const char *filename, QemuOpts *opts,
|
||||
+static int coroutine_fn vmdk_co_create_opts(BlockDriver *drv,
|
||||
+ const char *filename,
|
||||
+ QemuOpts *opts,
|
||||
Error **errp)
|
||||
{
|
||||
Error *local_err = NULL;
|
||||
diff --git a/block/vpc.c b/block/vpc.c
|
||||
index a655502..6df75e2 100644
|
||||
--- a/block/vpc.c
|
||||
+++ b/block/vpc.c
|
||||
@@ -1089,8 +1089,10 @@ out:
|
||||
return ret;
|
||||
}
|
||||
|
||||
-static int coroutine_fn vpc_co_create_opts(const char *filename,
|
||||
- QemuOpts *opts, Error **errp)
|
||||
+static int coroutine_fn vpc_co_create_opts(BlockDriver *drv,
|
||||
+ const char *filename,
|
||||
+ QemuOpts *opts,
|
||||
+ Error **errp)
|
||||
{
|
||||
BlockdevCreateOptions *create_options = NULL;
|
||||
QDict *qdict;
|
||||
diff --git a/include/block/block_int.h b/include/block/block_int.h
|
||||
index 96e327b..7ff81be 100644
|
||||
--- a/include/block/block_int.h
|
||||
+++ b/include/block/block_int.h
|
||||
@@ -136,7 +136,8 @@ struct BlockDriver {
|
||||
void (*bdrv_close)(BlockDriverState *bs);
|
||||
int coroutine_fn (*bdrv_co_create)(BlockdevCreateOptions *opts,
|
||||
Error **errp);
|
||||
- int coroutine_fn (*bdrv_co_create_opts)(const char *filename,
|
||||
+ int coroutine_fn (*bdrv_co_create_opts)(BlockDriver *drv,
|
||||
+ const char *filename,
|
||||
QemuOpts *opts,
|
||||
Error **errp);
|
||||
int (*bdrv_make_empty)(BlockDriverState *bs);
|
||||
--
|
||||
1.8.3.1
|
||||
|
@ -1,78 +0,0 @@
|
||||
From ec5408763c49cd0b63ee324bdc38a429ed1adeee Mon Sep 17 00:00:00 2001
|
||||
From: Kevin Wolf <kwolf@redhat.com>
|
||||
Date: Fri, 13 Mar 2020 12:34:29 +0000
|
||||
Subject: [PATCH 09/20] block/qcow2: Move bitmap reopen into
|
||||
bdrv_reopen_commit_post
|
||||
|
||||
RH-Author: Kevin Wolf <kwolf@redhat.com>
|
||||
Message-id: <20200313123439.10548-4-kwolf@redhat.com>
|
||||
Patchwork-id: 94280
|
||||
O-Subject: [RHEL-AV-8.2.0 qemu-kvm PATCH v2 03/13] block/qcow2: Move bitmap reopen into bdrv_reopen_commit_post
|
||||
Bugzilla: 1790482 1805143
|
||||
RH-Acked-by: John Snow <jsnow@redhat.com>
|
||||
RH-Acked-by: Daniel P. Berrange <berrange@redhat.com>
|
||||
RH-Acked-by: Peter Krempa <pkrempa@redhat.com>
|
||||
|
||||
From: Peter Krempa <pkrempa@redhat.com>
|
||||
|
||||
The bitmap code requires writing the 'file' child when the qcow2 driver
|
||||
is reopened in read-write mode.
|
||||
|
||||
If the 'file' child is being reopened due to a permissions change, the
|
||||
modification is commited yet when qcow2_reopen_commit is called. This
|
||||
means that any attempt to write the 'file' child will end with EBADFD
|
||||
as the original fd was already closed.
|
||||
|
||||
Moving bitmap reopening to the new callback which is called after
|
||||
permission modifications are commited fixes this as the file descriptor
|
||||
will be replaced with the correct one.
|
||||
|
||||
The above problem manifests itself when reopening 'qcow2' format layer
|
||||
which uses a 'file-posix' file child which was opened with the
|
||||
'auto-read-only' property set.
|
||||
|
||||
Signed-off-by: Peter Krempa <pkrempa@redhat.com>
|
||||
Message-Id: <db118dbafe1955afbc0a18d3dd220931074ce349.1582893284.git.pkrempa@redhat.com>
|
||||
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
|
||||
(cherry picked from commit 65eb7c85a3e62529e2bad782e94d5a7b11dd5a92)
|
||||
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
|
||||
Signed-off-by: Danilo C. L. de Paula <ddepaula@redhat.com>
|
||||
---
|
||||
block/qcow2.c | 7 ++++++-
|
||||
1 file changed, 6 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/block/qcow2.c b/block/qcow2.c
|
||||
index 7c18721..83b1fc0 100644
|
||||
--- a/block/qcow2.c
|
||||
+++ b/block/qcow2.c
|
||||
@@ -1881,6 +1881,11 @@ fail:
|
||||
static void qcow2_reopen_commit(BDRVReopenState *state)
|
||||
{
|
||||
qcow2_update_options_commit(state->bs, state->opaque);
|
||||
+ g_free(state->opaque);
|
||||
+}
|
||||
+
|
||||
+static void qcow2_reopen_commit_post(BDRVReopenState *state)
|
||||
+{
|
||||
if (state->flags & BDRV_O_RDWR) {
|
||||
Error *local_err = NULL;
|
||||
|
||||
@@ -1895,7 +1900,6 @@ static void qcow2_reopen_commit(BDRVReopenState *state)
|
||||
bdrv_get_node_name(state->bs));
|
||||
}
|
||||
}
|
||||
- g_free(state->opaque);
|
||||
}
|
||||
|
||||
static void qcow2_reopen_abort(BDRVReopenState *state)
|
||||
@@ -5492,6 +5496,7 @@ BlockDriver bdrv_qcow2 = {
|
||||
.bdrv_close = qcow2_close,
|
||||
.bdrv_reopen_prepare = qcow2_reopen_prepare,
|
||||
.bdrv_reopen_commit = qcow2_reopen_commit,
|
||||
+ .bdrv_reopen_commit_post = qcow2_reopen_commit_post,
|
||||
.bdrv_reopen_abort = qcow2_reopen_abort,
|
||||
.bdrv_join_options = qcow2_join_options,
|
||||
.bdrv_child_perm = bdrv_format_default_perms,
|
||||
--
|
||||
1.8.3.1
|
||||
|
@ -1,296 +0,0 @@
|
||||
From a1f7b929ae1fe6fa424c520c3a5eb497333b0fd9 Mon Sep 17 00:00:00 2001
|
||||
From: Maxim Levitsky <mlevitsk@redhat.com>
|
||||
Date: Thu, 26 Mar 2020 20:23:07 +0000
|
||||
Subject: [PATCH 2/4] block: trickle down the fallback image creation function
|
||||
use to the block drivers
|
||||
|
||||
RH-Author: Maxim Levitsky <mlevitsk@redhat.com>
|
||||
Message-id: <20200326202307.9264-3-mlevitsk@redhat.com>
|
||||
Patchwork-id: 94446
|
||||
O-Subject: [RHEL-AV-8.2.0 qemu-kvm PATCH 2/2] block: trickle down the fallback image creation function use to the block drivers
|
||||
Bugzilla: 1816007
|
||||
RH-Acked-by: Danilo de Paula <ddepaula@redhat.com>
|
||||
RH-Acked-by: Kevin Wolf <kwolf@redhat.com>
|
||||
RH-Acked-by: Max Reitz <mreitz@redhat.com>
|
||||
|
||||
Instead of checking the .bdrv_co_create_opts to see if we need the
|
||||
fallback, just implement the .bdrv_co_create_opts in the drivers that
|
||||
need it.
|
||||
|
||||
This way we don't break various places that need to know if the
|
||||
underlying protocol/format really supports image creation, and this way
|
||||
we still allow some drivers to not support image creation.
|
||||
|
||||
Fixes: fd17146cd93d1704cd96d7c2757b325fc7aac6fd
|
||||
Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1816007
|
||||
|
||||
Note that technically this driver reverts the image creation fallback
|
||||
for the vxhs driver since I don't have a means to test it, and IMHO it
|
||||
is better to leave it not supported as it was prior to generic image
|
||||
creation patches.
|
||||
|
||||
Also drop iscsi_create_opts which was left accidentally.
|
||||
|
||||
Signed-off-by: Maxim Levitsky <mlevitsk@redhat.com>
|
||||
Message-Id: <20200326011218.29230-3-mlevitsk@redhat.com>
|
||||
Reviewed-by: Denis V. Lunev <den@openvz.org>
|
||||
[mreitz: Fixed alignment, and moved bdrv_co_create_opts_simple() and
|
||||
bdrv_create_opts_simple from block.h into block_int.h]
|
||||
Signed-off-by: Max Reitz <mreitz@redhat.com>
|
||||
(cherry picked from commit 5a5e7f8cd86b7ced0732b1b6e28c82baa65b09c9)
|
||||
|
||||
Contextual conflicts in block.c and include/block/block_int.h
|
||||
|
||||
(conflict in block.c by default shows as functional but
|
||||
with --diff-algorithm=patience it becomes a contextual conflict)
|
||||
|
||||
...
|
||||
001/2:[----] [--] 'block: pass BlockDriver reference to the .bdrv_co_create'
|
||||
002/2:[0014] [FC] 'block: trickle down the fallback image creation function use to the block drivers'
|
||||
...
|
||||
002/2: 'meld <(git show 5a5e7f8^\!) <(git show 6d3bca5^\!)'
|
||||
|
||||
So now running:
|
||||
meld <(git show 5a5e7f8^\! --diff-algorithm=patience) <(git show 6d3bca5^\! --diff-algorithm=patience)
|
||||
|
||||
shows no contextual conflicts
|
||||
It is mostly due to missing commit f6dc1c31d3801dcbdf0c56574f9ff4f05180810c
|
||||
Thanks to Max Reitz for helping me with this.
|
||||
|
||||
Signed-off-by: Maxim Levitsky <mlevitsk@redhat.com>
|
||||
Signed-off-by: Danilo C. L. de Paula <ddepaula@redhat.com>
|
||||
---
|
||||
block.c | 35 ++++++++++++++++++++---------------
|
||||
block/file-posix.c | 7 ++++++-
|
||||
block/iscsi.c | 16 ++++------------
|
||||
block/nbd.c | 6 ++++++
|
||||
block/nvme.c | 3 +++
|
||||
include/block/block.h | 1 +
|
||||
include/block/block_int.h | 11 +++++++++++
|
||||
7 files changed, 51 insertions(+), 28 deletions(-)
|
||||
|
||||
diff --git a/block.c b/block.c
|
||||
index f9a1c5b..ba3b40d7 100644
|
||||
--- a/block.c
|
||||
+++ b/block.c
|
||||
@@ -597,8 +597,15 @@ static int create_file_fallback_zero_first_sector(BlockBackend *blk,
|
||||
return 0;
|
||||
}
|
||||
|
||||
-static int bdrv_create_file_fallback(const char *filename, BlockDriver *drv,
|
||||
- QemuOpts *opts, Error **errp)
|
||||
+/**
|
||||
+ * Simple implementation of bdrv_co_create_opts for protocol drivers
|
||||
+ * which only support creation via opening a file
|
||||
+ * (usually existing raw storage device)
|
||||
+ */
|
||||
+int coroutine_fn bdrv_co_create_opts_simple(BlockDriver *drv,
|
||||
+ const char *filename,
|
||||
+ QemuOpts *opts,
|
||||
+ Error **errp)
|
||||
{
|
||||
BlockBackend *blk;
|
||||
QDict *options;
|
||||
@@ -662,11 +669,7 @@ int bdrv_create_file(const char *filename, QemuOpts *opts, Error **errp)
|
||||
return -ENOENT;
|
||||
}
|
||||
|
||||
- if (drv->bdrv_co_create_opts) {
|
||||
- return bdrv_create(drv, filename, opts, errp);
|
||||
- } else {
|
||||
- return bdrv_create_file_fallback(filename, drv, opts, errp);
|
||||
- }
|
||||
+ return bdrv_create(drv, filename, opts, errp);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -1543,9 +1546,9 @@ QemuOptsList bdrv_runtime_opts = {
|
||||
},
|
||||
};
|
||||
|
||||
-static QemuOptsList fallback_create_opts = {
|
||||
- .name = "fallback-create-opts",
|
||||
- .head = QTAILQ_HEAD_INITIALIZER(fallback_create_opts.head),
|
||||
+QemuOptsList bdrv_create_opts_simple = {
|
||||
+ .name = "simple-create-opts",
|
||||
+ .head = QTAILQ_HEAD_INITIALIZER(bdrv_create_opts_simple.head),
|
||||
.desc = {
|
||||
{
|
||||
.name = BLOCK_OPT_SIZE,
|
||||
@@ -5910,13 +5913,15 @@ void bdrv_img_create(const char *filename, const char *fmt,
|
||||
return;
|
||||
}
|
||||
|
||||
- create_opts = qemu_opts_append(create_opts, drv->create_opts);
|
||||
- if (proto_drv->create_opts) {
|
||||
- create_opts = qemu_opts_append(create_opts, proto_drv->create_opts);
|
||||
- } else {
|
||||
- create_opts = qemu_opts_append(create_opts, &fallback_create_opts);
|
||||
+ if (!proto_drv->create_opts) {
|
||||
+ error_setg(errp, "Protocol driver '%s' does not support image creation",
|
||||
+ proto_drv->format_name);
|
||||
+ return;
|
||||
}
|
||||
|
||||
+ create_opts = qemu_opts_append(create_opts, drv->create_opts);
|
||||
+ create_opts = qemu_opts_append(create_opts, proto_drv->create_opts);
|
||||
+
|
||||
/* Create parameter list with default values */
|
||||
opts = qemu_opts_create(create_opts, NULL, 0, &error_abort);
|
||||
qemu_opt_set_number(opts, BLOCK_OPT_SIZE, img_size, &error_abort);
|
||||
diff --git a/block/file-posix.c b/block/file-posix.c
|
||||
index a2e0a74..dd18d40 100644
|
||||
--- a/block/file-posix.c
|
||||
+++ b/block/file-posix.c
|
||||
@@ -3432,6 +3432,8 @@ static BlockDriver bdrv_host_device = {
|
||||
.bdrv_reopen_prepare = raw_reopen_prepare,
|
||||
.bdrv_reopen_commit = raw_reopen_commit,
|
||||
.bdrv_reopen_abort = raw_reopen_abort,
|
||||
+ .bdrv_co_create_opts = bdrv_co_create_opts_simple,
|
||||
+ .create_opts = &bdrv_create_opts_simple,
|
||||
.mutable_opts = mutable_opts,
|
||||
.bdrv_co_invalidate_cache = raw_co_invalidate_cache,
|
||||
.bdrv_co_pwrite_zeroes = hdev_co_pwrite_zeroes,
|
||||
@@ -3558,10 +3560,11 @@ static BlockDriver bdrv_host_cdrom = {
|
||||
.bdrv_reopen_prepare = raw_reopen_prepare,
|
||||
.bdrv_reopen_commit = raw_reopen_commit,
|
||||
.bdrv_reopen_abort = raw_reopen_abort,
|
||||
+ .bdrv_co_create_opts = bdrv_co_create_opts_simple,
|
||||
+ .create_opts = &bdrv_create_opts_simple,
|
||||
.mutable_opts = mutable_opts,
|
||||
.bdrv_co_invalidate_cache = raw_co_invalidate_cache,
|
||||
|
||||
-
|
||||
.bdrv_co_preadv = raw_co_preadv,
|
||||
.bdrv_co_pwritev = raw_co_pwritev,
|
||||
.bdrv_co_flush_to_disk = raw_co_flush_to_disk,
|
||||
@@ -3690,6 +3693,8 @@ static BlockDriver bdrv_host_cdrom = {
|
||||
.bdrv_reopen_prepare = raw_reopen_prepare,
|
||||
.bdrv_reopen_commit = raw_reopen_commit,
|
||||
.bdrv_reopen_abort = raw_reopen_abort,
|
||||
+ .bdrv_co_create_opts = bdrv_co_create_opts_simple,
|
||||
+ .create_opts = &bdrv_create_opts_simple,
|
||||
.mutable_opts = mutable_opts,
|
||||
|
||||
.bdrv_co_preadv = raw_co_preadv,
|
||||
diff --git a/block/iscsi.c b/block/iscsi.c
|
||||
index b45da65..16b0716 100644
|
||||
--- a/block/iscsi.c
|
||||
+++ b/block/iscsi.c
|
||||
@@ -2399,18 +2399,6 @@ out_unlock:
|
||||
return r;
|
||||
}
|
||||
|
||||
-static QemuOptsList iscsi_create_opts = {
|
||||
- .name = "iscsi-create-opts",
|
||||
- .head = QTAILQ_HEAD_INITIALIZER(iscsi_create_opts.head),
|
||||
- .desc = {
|
||||
- {
|
||||
- .name = BLOCK_OPT_SIZE,
|
||||
- .type = QEMU_OPT_SIZE,
|
||||
- .help = "Virtual disk size"
|
||||
- },
|
||||
- { /* end of list */ }
|
||||
- }
|
||||
-};
|
||||
|
||||
static const char *const iscsi_strong_runtime_opts[] = {
|
||||
"transport",
|
||||
@@ -2434,6 +2422,8 @@ static BlockDriver bdrv_iscsi = {
|
||||
.bdrv_parse_filename = iscsi_parse_filename,
|
||||
.bdrv_file_open = iscsi_open,
|
||||
.bdrv_close = iscsi_close,
|
||||
+ .bdrv_co_create_opts = bdrv_co_create_opts_simple,
|
||||
+ .create_opts = &bdrv_create_opts_simple,
|
||||
.bdrv_reopen_prepare = iscsi_reopen_prepare,
|
||||
.bdrv_reopen_commit = iscsi_reopen_commit,
|
||||
.bdrv_co_invalidate_cache = iscsi_co_invalidate_cache,
|
||||
@@ -2471,6 +2461,8 @@ static BlockDriver bdrv_iser = {
|
||||
.bdrv_parse_filename = iscsi_parse_filename,
|
||||
.bdrv_file_open = iscsi_open,
|
||||
.bdrv_close = iscsi_close,
|
||||
+ .bdrv_co_create_opts = bdrv_co_create_opts_simple,
|
||||
+ .create_opts = &bdrv_create_opts_simple,
|
||||
.bdrv_reopen_prepare = iscsi_reopen_prepare,
|
||||
.bdrv_reopen_commit = iscsi_reopen_commit,
|
||||
.bdrv_co_invalidate_cache = iscsi_co_invalidate_cache,
|
||||
diff --git a/block/nbd.c b/block/nbd.c
|
||||
index a73f0d9..927915d 100644
|
||||
--- a/block/nbd.c
|
||||
+++ b/block/nbd.c
|
||||
@@ -2030,6 +2030,8 @@ static BlockDriver bdrv_nbd = {
|
||||
.protocol_name = "nbd",
|
||||
.instance_size = sizeof(BDRVNBDState),
|
||||
.bdrv_parse_filename = nbd_parse_filename,
|
||||
+ .bdrv_co_create_opts = bdrv_co_create_opts_simple,
|
||||
+ .create_opts = &bdrv_create_opts_simple,
|
||||
.bdrv_file_open = nbd_open,
|
||||
.bdrv_reopen_prepare = nbd_client_reopen_prepare,
|
||||
.bdrv_co_preadv = nbd_client_co_preadv,
|
||||
@@ -2055,6 +2057,8 @@ static BlockDriver bdrv_nbd_tcp = {
|
||||
.protocol_name = "nbd+tcp",
|
||||
.instance_size = sizeof(BDRVNBDState),
|
||||
.bdrv_parse_filename = nbd_parse_filename,
|
||||
+ .bdrv_co_create_opts = bdrv_co_create_opts_simple,
|
||||
+ .create_opts = &bdrv_create_opts_simple,
|
||||
.bdrv_file_open = nbd_open,
|
||||
.bdrv_reopen_prepare = nbd_client_reopen_prepare,
|
||||
.bdrv_co_preadv = nbd_client_co_preadv,
|
||||
@@ -2080,6 +2084,8 @@ static BlockDriver bdrv_nbd_unix = {
|
||||
.protocol_name = "nbd+unix",
|
||||
.instance_size = sizeof(BDRVNBDState),
|
||||
.bdrv_parse_filename = nbd_parse_filename,
|
||||
+ .bdrv_co_create_opts = bdrv_co_create_opts_simple,
|
||||
+ .create_opts = &bdrv_create_opts_simple,
|
||||
.bdrv_file_open = nbd_open,
|
||||
.bdrv_reopen_prepare = nbd_client_reopen_prepare,
|
||||
.bdrv_co_preadv = nbd_client_co_preadv,
|
||||
diff --git a/block/nvme.c b/block/nvme.c
|
||||
index d41c4bd..7b7c0cc 100644
|
||||
--- a/block/nvme.c
|
||||
+++ b/block/nvme.c
|
||||
@@ -1333,6 +1333,9 @@ static BlockDriver bdrv_nvme = {
|
||||
.protocol_name = "nvme",
|
||||
.instance_size = sizeof(BDRVNVMeState),
|
||||
|
||||
+ .bdrv_co_create_opts = bdrv_co_create_opts_simple,
|
||||
+ .create_opts = &bdrv_create_opts_simple,
|
||||
+
|
||||
.bdrv_parse_filename = nvme_parse_filename,
|
||||
.bdrv_file_open = nvme_file_open,
|
||||
.bdrv_close = nvme_close,
|
||||
diff --git a/include/block/block.h b/include/block/block.h
|
||||
index 1df9848..92685d2 100644
|
||||
--- a/include/block/block.h
|
||||
+++ b/include/block/block.h
|
||||
@@ -293,6 +293,7 @@ BlockDriver *bdrv_find_format(const char *format_name);
|
||||
int bdrv_create(BlockDriver *drv, const char* filename,
|
||||
QemuOpts *opts, Error **errp);
|
||||
int bdrv_create_file(const char *filename, QemuOpts *opts, Error **errp);
|
||||
+
|
||||
BlockDriverState *bdrv_new(void);
|
||||
void bdrv_append(BlockDriverState *bs_new, BlockDriverState *bs_top,
|
||||
Error **errp);
|
||||
diff --git a/include/block/block_int.h b/include/block/block_int.h
|
||||
index 7ff81be..529f153 100644
|
||||
--- a/include/block/block_int.h
|
||||
+++ b/include/block/block_int.h
|
||||
@@ -1325,4 +1325,15 @@ int coroutine_fn bdrv_co_copy_range_to(BdrvChild *src, uint64_t src_offset,
|
||||
|
||||
int refresh_total_sectors(BlockDriverState *bs, int64_t hint);
|
||||
|
||||
+/**
|
||||
+ * Simple implementation of bdrv_co_create_opts for protocol drivers
|
||||
+ * which only support creation via opening a file
|
||||
+ * (usually existing raw storage device)
|
||||
+ */
|
||||
+int coroutine_fn bdrv_co_create_opts_simple(BlockDriver *drv,
|
||||
+ const char *filename,
|
||||
+ QemuOpts *opts,
|
||||
+ Error **errp);
|
||||
+extern QemuOptsList bdrv_create_opts_simple;
|
||||
+
|
||||
#endif /* BLOCK_INT_H */
|
||||
--
|
||||
1.8.3.1
|
||||
|
@ -1,176 +0,0 @@
|
||||
From dc2654f2319ad6c379e0ba10be143726c6f0e9e0 Mon Sep 17 00:00:00 2001
|
||||
From: Sergio Lopez Pascual <slp@redhat.com>
|
||||
Date: Fri, 7 Feb 2020 11:27:47 +0000
|
||||
Subject: [PATCH 14/18] blockdev: Acquire AioContext on dirty bitmap functions
|
||||
|
||||
RH-Author: Sergio Lopez Pascual <slp@redhat.com>
|
||||
Message-id: <20200207112749.25073-8-slp@redhat.com>
|
||||
Patchwork-id: 93760
|
||||
O-Subject: [RHEL-AV-8.2.0 qemu-kvm PATCH v2 7/9] blockdev: Acquire AioContext on dirty bitmap functions
|
||||
Bugzilla: 1745606 1746217 1773517 1779036 1782111 1782175 1783965
|
||||
RH-Acked-by: Stefano Garzarella <sgarzare@redhat.com>
|
||||
RH-Acked-by: Paolo Bonzini <pbonzini@redhat.com>
|
||||
RH-Acked-by: Max Reitz <mreitz@redhat.com>
|
||||
RH-Acked-by: Stefan Hajnoczi <stefanha@redhat.com>
|
||||
|
||||
Dirty map addition and removal functions are not acquiring to BDS
|
||||
AioContext, while they may call to code that expects it to be
|
||||
acquired.
|
||||
|
||||
This may trigger a crash with a stack trace like this one:
|
||||
|
||||
#0 0x00007f0ef146370f in __GI_raise (sig=sig@entry=6)
|
||||
at ../sysdeps/unix/sysv/linux/raise.c:50
|
||||
#1 0x00007f0ef144db25 in __GI_abort () at abort.c:79
|
||||
#2 0x0000565022294dce in error_exit
|
||||
(err=<optimized out>, msg=msg@entry=0x56502243a730 <__func__.16350> "qemu_mutex_unlock_impl") at util/qemu-thread-posix.c:36
|
||||
#3 0x00005650222950ba in qemu_mutex_unlock_impl
|
||||
(mutex=mutex@entry=0x5650244b0240, file=file@entry=0x565022439adf "util/async.c", line=line@entry=526) at util/qemu-thread-posix.c:108
|
||||
#4 0x0000565022290029 in aio_context_release
|
||||
(ctx=ctx@entry=0x5650244b01e0) at util/async.c:526
|
||||
#5 0x000056502221cd08 in bdrv_can_store_new_dirty_bitmap
|
||||
(bs=bs@entry=0x5650244dc820, name=name@entry=0x56502481d360 "bitmap1", granularity=granularity@entry=65536, errp=errp@entry=0x7fff22831718)
|
||||
at block/dirty-bitmap.c:542
|
||||
#6 0x000056502206ae53 in qmp_block_dirty_bitmap_add
|
||||
(errp=0x7fff22831718, disabled=false, has_disabled=<optimized out>, persistent=<optimized out>, has_persistent=true, granularity=65536, has_granularity=<optimized out>, name=0x56502481d360 "bitmap1", node=<optimized out>) at blockdev.c:2894
|
||||
#7 0x000056502206ae53 in qmp_block_dirty_bitmap_add
|
||||
(node=<optimized out>, name=0x56502481d360 "bitmap1", has_granularity=<optimized out>, granularity=<optimized out>, has_persistent=true, persistent=<optimized out>, has_disabled=false, disabled=false, errp=0x7fff22831718) at blockdev.c:2856
|
||||
#8 0x00005650221847a3 in qmp_marshal_block_dirty_bitmap_add
|
||||
(args=<optimized out>, ret=<optimized out>, errp=0x7fff22831798)
|
||||
at qapi/qapi-commands-block-core.c:651
|
||||
#9 0x0000565022247e6c in do_qmp_dispatch
|
||||
(errp=0x7fff22831790, allow_oob=<optimized out>, request=<optimized out>, cmds=0x565022b32d60 <qmp_commands>) at qapi/qmp-dispatch.c:132
|
||||
#10 0x0000565022247e6c in qmp_dispatch
|
||||
(cmds=0x565022b32d60 <qmp_commands>, request=<optimized out>, allow_oob=<optimized out>) at qapi/qmp-dispatch.c:175
|
||||
#11 0x0000565022166061 in monitor_qmp_dispatch
|
||||
(mon=0x56502450faa0, req=<optimized out>) at monitor/qmp.c:145
|
||||
#12 0x00005650221666fa in monitor_qmp_bh_dispatcher
|
||||
(data=<optimized out>) at monitor/qmp.c:234
|
||||
#13 0x000056502228f866 in aio_bh_call (bh=0x56502440eae0)
|
||||
at util/async.c:117
|
||||
#14 0x000056502228f866 in aio_bh_poll (ctx=ctx@entry=0x56502440d7a0)
|
||||
at util/async.c:117
|
||||
#15 0x0000565022292c54 in aio_dispatch (ctx=0x56502440d7a0)
|
||||
at util/aio-posix.c:459
|
||||
#16 0x000056502228f742 in aio_ctx_dispatch
|
||||
(source=<optimized out>, callback=<optimized out>, user_data=<optimized out>) at util/async.c:260
|
||||
#17 0x00007f0ef5ce667d in g_main_dispatch (context=0x56502449aa40)
|
||||
at gmain.c:3176
|
||||
#18 0x00007f0ef5ce667d in g_main_context_dispatch
|
||||
(context=context@entry=0x56502449aa40) at gmain.c:3829
|
||||
#19 0x0000565022291d08 in glib_pollfds_poll () at util/main-loop.c:219
|
||||
#20 0x0000565022291d08 in os_host_main_loop_wait
|
||||
(timeout=<optimized out>) at util/main-loop.c:242
|
||||
#21 0x0000565022291d08 in main_loop_wait (nonblocking=<optimized out>)
|
||||
at util/main-loop.c:518
|
||||
#22 0x00005650220743c1 in main_loop () at vl.c:1828
|
||||
#23 0x0000565021f20a72 in main
|
||||
(argc=<optimized out>, argv=<optimized out>, envp=<optimized out>)
|
||||
at vl.c:4504
|
||||
|
||||
Fix this by acquiring the AioContext at qmp_block_dirty_bitmap_add()
|
||||
and qmp_block_dirty_bitmap_add().
|
||||
|
||||
RHBZ: https://bugzilla.redhat.com/show_bug.cgi?id=1782175
|
||||
Signed-off-by: Sergio Lopez <slp@redhat.com>
|
||||
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
|
||||
(cherry picked from commit 91005a495e228ebd7e5e173cd18f952450eef82d)
|
||||
Signed-off-by: Sergio Lopez <slp@redhat.com>
|
||||
Signed-off-by: Danilo C. L. de Paula <ddepaula@redhat.com>
|
||||
---
|
||||
blockdev.c | 22 ++++++++++++++++++----
|
||||
1 file changed, 18 insertions(+), 4 deletions(-)
|
||||
|
||||
diff --git a/blockdev.c b/blockdev.c
|
||||
index 1dacbc2..d4ef6cd 100644
|
||||
--- a/blockdev.c
|
||||
+++ b/blockdev.c
|
||||
@@ -2984,6 +2984,7 @@ void qmp_block_dirty_bitmap_add(const char *node, const char *name,
|
||||
{
|
||||
BlockDriverState *bs;
|
||||
BdrvDirtyBitmap *bitmap;
|
||||
+ AioContext *aio_context;
|
||||
|
||||
if (!name || name[0] == '\0') {
|
||||
error_setg(errp, "Bitmap name cannot be empty");
|
||||
@@ -2995,11 +2996,14 @@ void qmp_block_dirty_bitmap_add(const char *node, const char *name,
|
||||
return;
|
||||
}
|
||||
|
||||
+ aio_context = bdrv_get_aio_context(bs);
|
||||
+ aio_context_acquire(aio_context);
|
||||
+
|
||||
if (has_granularity) {
|
||||
if (granularity < 512 || !is_power_of_2(granularity)) {
|
||||
error_setg(errp, "Granularity must be power of 2 "
|
||||
"and at least 512");
|
||||
- return;
|
||||
+ goto out;
|
||||
}
|
||||
} else {
|
||||
/* Default to cluster size, if available: */
|
||||
@@ -3017,12 +3021,12 @@ void qmp_block_dirty_bitmap_add(const char *node, const char *name,
|
||||
if (persistent &&
|
||||
!bdrv_can_store_new_dirty_bitmap(bs, name, granularity, errp))
|
||||
{
|
||||
- return;
|
||||
+ goto out;
|
||||
}
|
||||
|
||||
bitmap = bdrv_create_dirty_bitmap(bs, granularity, name, errp);
|
||||
if (bitmap == NULL) {
|
||||
- return;
|
||||
+ goto out;
|
||||
}
|
||||
|
||||
if (disabled) {
|
||||
@@ -3030,6 +3034,9 @@ void qmp_block_dirty_bitmap_add(const char *node, const char *name,
|
||||
}
|
||||
|
||||
bdrv_dirty_bitmap_set_persistence(bitmap, persistent);
|
||||
+
|
||||
+out:
|
||||
+ aio_context_release(aio_context);
|
||||
}
|
||||
|
||||
static BdrvDirtyBitmap *do_block_dirty_bitmap_remove(
|
||||
@@ -3038,21 +3045,27 @@ static BdrvDirtyBitmap *do_block_dirty_bitmap_remove(
|
||||
{
|
||||
BlockDriverState *bs;
|
||||
BdrvDirtyBitmap *bitmap;
|
||||
+ AioContext *aio_context;
|
||||
|
||||
bitmap = block_dirty_bitmap_lookup(node, name, &bs, errp);
|
||||
if (!bitmap || !bs) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
+ aio_context = bdrv_get_aio_context(bs);
|
||||
+ aio_context_acquire(aio_context);
|
||||
+
|
||||
if (bdrv_dirty_bitmap_check(bitmap, BDRV_BITMAP_BUSY | BDRV_BITMAP_RO,
|
||||
errp)) {
|
||||
+ aio_context_release(aio_context);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
if (bdrv_dirty_bitmap_get_persistence(bitmap) &&
|
||||
bdrv_remove_persistent_dirty_bitmap(bs, name, errp) < 0)
|
||||
{
|
||||
- return NULL;
|
||||
+ aio_context_release(aio_context);
|
||||
+ return NULL;
|
||||
}
|
||||
|
||||
if (release) {
|
||||
@@ -3063,6 +3076,7 @@ static BdrvDirtyBitmap *do_block_dirty_bitmap_remove(
|
||||
*bitmap_bs = bs;
|
||||
}
|
||||
|
||||
+ aio_context_release(aio_context);
|
||||
return release ? NULL : bitmap;
|
||||
}
|
||||
|
||||
--
|
||||
1.8.3.1
|
||||
|
@ -1,107 +0,0 @@
|
||||
From 24e5eca4218b294bd013e2d85a38345045506bec Mon Sep 17 00:00:00 2001
|
||||
From: Sergio Lopez Pascual <slp@redhat.com>
|
||||
Date: Fri, 7 Feb 2020 11:27:48 +0000
|
||||
Subject: [PATCH 15/18] blockdev: Return bs to the proper context on snapshot
|
||||
abort
|
||||
|
||||
RH-Author: Sergio Lopez Pascual <slp@redhat.com>
|
||||
Message-id: <20200207112749.25073-9-slp@redhat.com>
|
||||
Patchwork-id: 93761
|
||||
O-Subject: [RHEL-AV-8.2.0 qemu-kvm PATCH v2 8/9] blockdev: Return bs to the proper context on snapshot abort
|
||||
Bugzilla: 1745606 1746217 1773517 1779036 1782111 1782175 1783965
|
||||
RH-Acked-by: Stefano Garzarella <sgarzare@redhat.com>
|
||||
RH-Acked-by: Paolo Bonzini <pbonzini@redhat.com>
|
||||
RH-Acked-by: Max Reitz <mreitz@redhat.com>
|
||||
RH-Acked-by: Stefan Hajnoczi <stefanha@redhat.com>
|
||||
|
||||
external_snapshot_abort() calls to bdrv_set_backing_hd(), which
|
||||
returns state->old_bs to the main AioContext, as it's intended to be
|
||||
used then the BDS is going to be released. As that's not the case when
|
||||
aborting an external snapshot, return it to the AioContext it was
|
||||
before the call.
|
||||
|
||||
This issue can be triggered by issuing a transaction with two actions,
|
||||
a proper blockdev-snapshot-sync and a bogus one, so the second will
|
||||
trigger a transaction abort. This results in a crash with an stack
|
||||
trace like this one:
|
||||
|
||||
#0 0x00007fa1048b28df in __GI_raise (sig=sig@entry=6) at ../sysdeps/unix/sysv/linux/raise.c:50
|
||||
#1 0x00007fa10489ccf5 in __GI_abort () at abort.c:79
|
||||
#2 0x00007fa10489cbc9 in __assert_fail_base
|
||||
(fmt=0x7fa104a03300 "%s%s%s:%u: %s%sAssertion `%s' failed.\n%n", assertion=0x5572240b44d8 "bdrv_get_aio_context(old_bs) == bdrv_get_aio_context(new_bs)", file=0x557224014d30 "block.c", line=2240, function=<optimized out>) at assert.c:92
|
||||
#3 0x00007fa1048aae96 in __GI___assert_fail
|
||||
(assertion=assertion@entry=0x5572240b44d8 "bdrv_get_aio_context(old_bs) == bdrv_get_aio_context(new_bs)", file=file@entry=0x557224014d30 "block.c", line=line@entry=2240, function=function@entry=0x5572240b5d60 <__PRETTY_FUNCTION__.31620> "bdrv_replace_child_noperm") at assert.c:101
|
||||
#4 0x0000557223e631f8 in bdrv_replace_child_noperm (child=0x557225b9c980, new_bs=new_bs@entry=0x557225c42e40) at block.c:2240
|
||||
#5 0x0000557223e68be7 in bdrv_replace_node (from=0x557226951a60, to=0x557225c42e40, errp=0x5572247d6138 <error_abort>) at block.c:4196
|
||||
#6 0x0000557223d069c4 in external_snapshot_abort (common=0x557225d7e170) at blockdev.c:1731
|
||||
#7 0x0000557223d069c4 in external_snapshot_abort (common=0x557225d7e170) at blockdev.c:1717
|
||||
#8 0x0000557223d09013 in qmp_transaction (dev_list=<optimized out>, has_props=<optimized out>, props=0x557225cc7d70, errp=errp@entry=0x7ffe704c0c98) at blockdev.c:2360
|
||||
#9 0x0000557223e32085 in qmp_marshal_transaction (args=<optimized out>, ret=<optimized out>, errp=0x7ffe704c0d08) at qapi/qapi-commands-transaction.c:44
|
||||
#10 0x0000557223ee798c in do_qmp_dispatch (errp=0x7ffe704c0d00, allow_oob=<optimized out>, request=<optimized out>, cmds=0x5572247d3cc0 <qmp_commands>) at qapi/qmp-dispatch.c:132
|
||||
#11 0x0000557223ee798c in qmp_dispatch (cmds=0x5572247d3cc0 <qmp_commands>, request=<optimized out>, allow_oob=<optimized out>) at qapi/qmp-dispatch.c:175
|
||||
#12 0x0000557223e06141 in monitor_qmp_dispatch (mon=0x557225c69ff0, req=<optimized out>) at monitor/qmp.c:120
|
||||
#13 0x0000557223e0678a in monitor_qmp_bh_dispatcher (data=<optimized out>) at monitor/qmp.c:209
|
||||
#14 0x0000557223f2f366 in aio_bh_call (bh=0x557225b9dc60) at util/async.c:117
|
||||
#15 0x0000557223f2f366 in aio_bh_poll (ctx=ctx@entry=0x557225b9c840) at util/async.c:117
|
||||
#16 0x0000557223f32754 in aio_dispatch (ctx=0x557225b9c840) at util/aio-posix.c:459
|
||||
#17 0x0000557223f2f242 in aio_ctx_dispatch (source=<optimized out>, callback=<optimized out>, user_data=<optimized out>) at util/async.c:260
|
||||
#18 0x00007fa10913467d in g_main_dispatch (context=0x557225c28e80) at gmain.c:3176
|
||||
#19 0x00007fa10913467d in g_main_context_dispatch (context=context@entry=0x557225c28e80) at gmain.c:3829
|
||||
#20 0x0000557223f31808 in glib_pollfds_poll () at util/main-loop.c:219
|
||||
#21 0x0000557223f31808 in os_host_main_loop_wait (timeout=<optimized out>) at util/main-loop.c:242
|
||||
#22 0x0000557223f31808 in main_loop_wait (nonblocking=<optimized out>) at util/main-loop.c:518
|
||||
#23 0x0000557223d13201 in main_loop () at vl.c:1828
|
||||
#24 0x0000557223bbfb82 in main (argc=<optimized out>, argv=<optimized out>, envp=<optimized out>) at vl.c:4504
|
||||
|
||||
RHBZ: https://bugzilla.redhat.com/show_bug.cgi?id=1779036
|
||||
Signed-off-by: Sergio Lopez <slp@redhat.com>
|
||||
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
|
||||
(cherry picked from commit 377410f6fb4f6b0d26d4a028c20766fae05de17e)
|
||||
Signed-off-by: Sergio Lopez <slp@redhat.com>
|
||||
Signed-off-by: Danilo C. L. de Paula <ddepaula@redhat.com>
|
||||
---
|
||||
blockdev.c | 21 +++++++++++++++++++++
|
||||
1 file changed, 21 insertions(+)
|
||||
|
||||
diff --git a/blockdev.c b/blockdev.c
|
||||
index d4ef6cd..4cd9a58 100644
|
||||
--- a/blockdev.c
|
||||
+++ b/blockdev.c
|
||||
@@ -1731,6 +1731,8 @@ static void external_snapshot_abort(BlkActionState *common)
|
||||
if (state->new_bs) {
|
||||
if (state->overlay_appended) {
|
||||
AioContext *aio_context;
|
||||
+ AioContext *tmp_context;
|
||||
+ int ret;
|
||||
|
||||
aio_context = bdrv_get_aio_context(state->old_bs);
|
||||
aio_context_acquire(aio_context);
|
||||
@@ -1738,6 +1740,25 @@ static void external_snapshot_abort(BlkActionState *common)
|
||||
bdrv_ref(state->old_bs); /* we can't let bdrv_set_backind_hd()
|
||||
close state->old_bs; we need it */
|
||||
bdrv_set_backing_hd(state->new_bs, NULL, &error_abort);
|
||||
+
|
||||
+ /*
|
||||
+ * The call to bdrv_set_backing_hd() above returns state->old_bs to
|
||||
+ * the main AioContext. As we're still going to be using it, return
|
||||
+ * it to the AioContext it was before.
|
||||
+ */
|
||||
+ tmp_context = bdrv_get_aio_context(state->old_bs);
|
||||
+ if (aio_context != tmp_context) {
|
||||
+ aio_context_release(aio_context);
|
||||
+ aio_context_acquire(tmp_context);
|
||||
+
|
||||
+ ret = bdrv_try_set_aio_context(state->old_bs,
|
||||
+ aio_context, NULL);
|
||||
+ assert(ret == 0);
|
||||
+
|
||||
+ aio_context_release(tmp_context);
|
||||
+ aio_context_acquire(aio_context);
|
||||
+ }
|
||||
+
|
||||
bdrv_replace_node(state->new_bs, state->old_bs, &error_abort);
|
||||
bdrv_unref(state->old_bs); /* bdrv_replace_node() ref'ed old_bs */
|
||||
|
||||
--
|
||||
1.8.3.1
|
||||
|
@ -1,62 +0,0 @@
|
||||
From d56b53cd75c4146eae7a06d1cc30ab823a9bde93 Mon Sep 17 00:00:00 2001
|
||||
From: Sergio Lopez Pascual <slp@redhat.com>
|
||||
Date: Fri, 7 Feb 2020 11:27:41 +0000
|
||||
Subject: [PATCH 08/18] blockdev: fix coding style issues in
|
||||
drive_backup_prepare
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
RH-Author: Sergio Lopez Pascual <slp@redhat.com>
|
||||
Message-id: <20200207112749.25073-2-slp@redhat.com>
|
||||
Patchwork-id: 93754
|
||||
O-Subject: [RHEL-AV-8.2.0 qemu-kvm PATCH v2 1/9] blockdev: fix coding style issues in drive_backup_prepare
|
||||
Bugzilla: 1745606 1746217 1773517 1779036 1782111 1782175 1783965
|
||||
RH-Acked-by: Stefano Garzarella <sgarzare@redhat.com>
|
||||
RH-Acked-by: Paolo Bonzini <pbonzini@redhat.com>
|
||||
RH-Acked-by: Philippe Mathieu-Daudé <philmd@redhat.com>
|
||||
RH-Acked-by: Max Reitz <mreitz@redhat.com>
|
||||
RH-Acked-by: Stefan Hajnoczi <stefanha@redhat.com>
|
||||
|
||||
Fix a couple of minor coding style issues in drive_backup_prepare.
|
||||
|
||||
Signed-off-by: Sergio Lopez <slp@redhat.com>
|
||||
Reviewed-by: Max Reitz <mreitz@redhat.com>
|
||||
Reviewed-by: Kevin Wolf <kwolf@redhat.com>
|
||||
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
|
||||
(cherry picked from commit 471ded690e19689018535e3f48480507ed073e22)
|
||||
Signed-off-by: Sergio Lopez <slp@redhat.com>
|
||||
Signed-off-by: Danilo C. L. de Paula <ddepaula@redhat.com>
|
||||
---
|
||||
blockdev.c | 8 +++++---
|
||||
1 file changed, 5 insertions(+), 3 deletions(-)
|
||||
|
||||
diff --git a/blockdev.c b/blockdev.c
|
||||
index 8e029e9..553e315 100644
|
||||
--- a/blockdev.c
|
||||
+++ b/blockdev.c
|
||||
@@ -3620,7 +3620,7 @@ static BlockJob *do_drive_backup(DriveBackup *backup, JobTxn *txn,
|
||||
|
||||
if (!backup->has_format) {
|
||||
backup->format = backup->mode == NEW_IMAGE_MODE_EXISTING ?
|
||||
- NULL : (char*) bs->drv->format_name;
|
||||
+ NULL : (char *) bs->drv->format_name;
|
||||
}
|
||||
|
||||
/* Early check to avoid creating target */
|
||||
@@ -3630,8 +3630,10 @@ static BlockJob *do_drive_backup(DriveBackup *backup, JobTxn *txn,
|
||||
|
||||
flags = bs->open_flags | BDRV_O_RDWR;
|
||||
|
||||
- /* See if we have a backing HD we can use to create our new image
|
||||
- * on top of. */
|
||||
+ /*
|
||||
+ * See if we have a backing HD we can use to create our new image
|
||||
+ * on top of.
|
||||
+ */
|
||||
if (backup->sync == MIRROR_SYNC_MODE_TOP) {
|
||||
source = backing_bs(bs);
|
||||
if (!source) {
|
||||
--
|
||||
1.8.3.1
|
||||
|
@ -1,204 +0,0 @@
|
||||
From da4ee4c0d56200042cb86f8ccd2777009bd82df3 Mon Sep 17 00:00:00 2001
|
||||
From: Sergio Lopez Pascual <slp@redhat.com>
|
||||
Date: Fri, 7 Feb 2020 11:27:44 +0000
|
||||
Subject: [PATCH 11/18] blockdev: honor bdrv_try_set_aio_context() context
|
||||
requirements
|
||||
|
||||
RH-Author: Sergio Lopez Pascual <slp@redhat.com>
|
||||
Message-id: <20200207112749.25073-5-slp@redhat.com>
|
||||
Patchwork-id: 93758
|
||||
O-Subject: [RHEL-AV-8.2.0 qemu-kvm PATCH v2 4/9] blockdev: honor bdrv_try_set_aio_context() context requirements
|
||||
Bugzilla: 1745606 1746217 1773517 1779036 1782111 1782175 1783965
|
||||
RH-Acked-by: Stefano Garzarella <sgarzare@redhat.com>
|
||||
RH-Acked-by: Paolo Bonzini <pbonzini@redhat.com>
|
||||
RH-Acked-by: Max Reitz <mreitz@redhat.com>
|
||||
RH-Acked-by: Stefan Hajnoczi <stefanha@redhat.com>
|
||||
|
||||
bdrv_try_set_aio_context() requires that the old context is held, and
|
||||
the new context is not held. Fix all the occurrences where it's not
|
||||
done this way.
|
||||
|
||||
Suggested-by: Max Reitz <mreitz@redhat.com>
|
||||
Signed-off-by: Sergio Lopez <slp@redhat.com>
|
||||
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
|
||||
(cherry picked from commit 3ea67e08832775a28d0bd2795f01bc77e7ea1512)
|
||||
Signed-off-by: Sergio Lopez <slp@redhat.com>
|
||||
Signed-off-by: Danilo C. L. de Paula <ddepaula@redhat.com>
|
||||
---
|
||||
blockdev.c | 68 ++++++++++++++++++++++++++++++++++++++++++++++++++++++--------
|
||||
1 file changed, 60 insertions(+), 8 deletions(-)
|
||||
|
||||
diff --git a/blockdev.c b/blockdev.c
|
||||
index 152a0f7..1dacbc2 100644
|
||||
--- a/blockdev.c
|
||||
+++ b/blockdev.c
|
||||
@@ -1535,6 +1535,7 @@ static void external_snapshot_prepare(BlkActionState *common,
|
||||
DO_UPCAST(ExternalSnapshotState, common, common);
|
||||
TransactionAction *action = common->action;
|
||||
AioContext *aio_context;
|
||||
+ AioContext *old_context;
|
||||
int ret;
|
||||
|
||||
/* 'blockdev-snapshot' and 'blockdev-snapshot-sync' have similar
|
||||
@@ -1675,7 +1676,16 @@ static void external_snapshot_prepare(BlkActionState *common,
|
||||
goto out;
|
||||
}
|
||||
|
||||
+ /* Honor bdrv_try_set_aio_context() context acquisition requirements. */
|
||||
+ old_context = bdrv_get_aio_context(state->new_bs);
|
||||
+ aio_context_release(aio_context);
|
||||
+ aio_context_acquire(old_context);
|
||||
+
|
||||
ret = bdrv_try_set_aio_context(state->new_bs, aio_context, errp);
|
||||
+
|
||||
+ aio_context_release(old_context);
|
||||
+ aio_context_acquire(aio_context);
|
||||
+
|
||||
if (ret < 0) {
|
||||
goto out;
|
||||
}
|
||||
@@ -1775,11 +1785,13 @@ static void drive_backup_prepare(BlkActionState *common, Error **errp)
|
||||
BlockDriverState *target_bs;
|
||||
BlockDriverState *source = NULL;
|
||||
AioContext *aio_context;
|
||||
+ AioContext *old_context;
|
||||
QDict *options;
|
||||
Error *local_err = NULL;
|
||||
int flags;
|
||||
int64_t size;
|
||||
bool set_backing_hd = false;
|
||||
+ int ret;
|
||||
|
||||
assert(common->action->type == TRANSACTION_ACTION_KIND_DRIVE_BACKUP);
|
||||
backup = common->action->u.drive_backup.data;
|
||||
@@ -1868,6 +1880,21 @@ static void drive_backup_prepare(BlkActionState *common, Error **errp)
|
||||
goto out;
|
||||
}
|
||||
|
||||
+ /* Honor bdrv_try_set_aio_context() context acquisition requirements. */
|
||||
+ old_context = bdrv_get_aio_context(target_bs);
|
||||
+ aio_context_release(aio_context);
|
||||
+ aio_context_acquire(old_context);
|
||||
+
|
||||
+ ret = bdrv_try_set_aio_context(target_bs, aio_context, errp);
|
||||
+ if (ret < 0) {
|
||||
+ bdrv_unref(target_bs);
|
||||
+ aio_context_release(old_context);
|
||||
+ return;
|
||||
+ }
|
||||
+
|
||||
+ aio_context_release(old_context);
|
||||
+ aio_context_acquire(aio_context);
|
||||
+
|
||||
if (set_backing_hd) {
|
||||
bdrv_set_backing_hd(target_bs, source, &local_err);
|
||||
if (local_err) {
|
||||
@@ -1947,6 +1974,8 @@ static void blockdev_backup_prepare(BlkActionState *common, Error **errp)
|
||||
BlockDriverState *bs;
|
||||
BlockDriverState *target_bs;
|
||||
AioContext *aio_context;
|
||||
+ AioContext *old_context;
|
||||
+ int ret;
|
||||
|
||||
assert(common->action->type == TRANSACTION_ACTION_KIND_BLOCKDEV_BACKUP);
|
||||
backup = common->action->u.blockdev_backup.data;
|
||||
@@ -1961,7 +1990,18 @@ static void blockdev_backup_prepare(BlkActionState *common, Error **errp)
|
||||
return;
|
||||
}
|
||||
|
||||
+ /* Honor bdrv_try_set_aio_context() context acquisition requirements. */
|
||||
aio_context = bdrv_get_aio_context(bs);
|
||||
+ old_context = bdrv_get_aio_context(target_bs);
|
||||
+ aio_context_acquire(old_context);
|
||||
+
|
||||
+ ret = bdrv_try_set_aio_context(target_bs, aio_context, errp);
|
||||
+ if (ret < 0) {
|
||||
+ aio_context_release(old_context);
|
||||
+ return;
|
||||
+ }
|
||||
+
|
||||
+ aio_context_release(old_context);
|
||||
aio_context_acquire(aio_context);
|
||||
state->bs = bs;
|
||||
|
||||
@@ -3562,7 +3602,6 @@ static BlockJob *do_backup_common(BackupCommon *backup,
|
||||
BlockJob *job = NULL;
|
||||
BdrvDirtyBitmap *bmap = NULL;
|
||||
int job_flags = JOB_DEFAULT;
|
||||
- int ret;
|
||||
|
||||
if (!backup->has_speed) {
|
||||
backup->speed = 0;
|
||||
@@ -3586,11 +3625,6 @@ static BlockJob *do_backup_common(BackupCommon *backup,
|
||||
backup->compress = false;
|
||||
}
|
||||
|
||||
- ret = bdrv_try_set_aio_context(target_bs, aio_context, errp);
|
||||
- if (ret < 0) {
|
||||
- return NULL;
|
||||
- }
|
||||
-
|
||||
if ((backup->sync == MIRROR_SYNC_MODE_BITMAP) ||
|
||||
(backup->sync == MIRROR_SYNC_MODE_INCREMENTAL)) {
|
||||
/* done before desugaring 'incremental' to print the right message */
|
||||
@@ -3825,6 +3859,7 @@ void qmp_drive_mirror(DriveMirror *arg, Error **errp)
|
||||
BlockDriverState *bs;
|
||||
BlockDriverState *source, *target_bs;
|
||||
AioContext *aio_context;
|
||||
+ AioContext *old_context;
|
||||
BlockMirrorBackingMode backing_mode;
|
||||
Error *local_err = NULL;
|
||||
QDict *options = NULL;
|
||||
@@ -3937,12 +3972,22 @@ void qmp_drive_mirror(DriveMirror *arg, Error **errp)
|
||||
(arg->mode == NEW_IMAGE_MODE_EXISTING ||
|
||||
!bdrv_has_zero_init(target_bs)));
|
||||
|
||||
+
|
||||
+ /* Honor bdrv_try_set_aio_context() context acquisition requirements. */
|
||||
+ old_context = bdrv_get_aio_context(target_bs);
|
||||
+ aio_context_release(aio_context);
|
||||
+ aio_context_acquire(old_context);
|
||||
+
|
||||
ret = bdrv_try_set_aio_context(target_bs, aio_context, errp);
|
||||
if (ret < 0) {
|
||||
bdrv_unref(target_bs);
|
||||
- goto out;
|
||||
+ aio_context_release(old_context);
|
||||
+ return;
|
||||
}
|
||||
|
||||
+ aio_context_release(old_context);
|
||||
+ aio_context_acquire(aio_context);
|
||||
+
|
||||
blockdev_mirror_common(arg->has_job_id ? arg->job_id : NULL, bs, target_bs,
|
||||
arg->has_replaces, arg->replaces, arg->sync,
|
||||
backing_mode, zero_target,
|
||||
@@ -3984,6 +4029,7 @@ void qmp_blockdev_mirror(bool has_job_id, const char *job_id,
|
||||
BlockDriverState *bs;
|
||||
BlockDriverState *target_bs;
|
||||
AioContext *aio_context;
|
||||
+ AioContext *old_context;
|
||||
BlockMirrorBackingMode backing_mode = MIRROR_LEAVE_BACKING_CHAIN;
|
||||
Error *local_err = NULL;
|
||||
bool zero_target;
|
||||
@@ -4001,10 +4047,16 @@ void qmp_blockdev_mirror(bool has_job_id, const char *job_id,
|
||||
|
||||
zero_target = (sync == MIRROR_SYNC_MODE_FULL);
|
||||
|
||||
+ /* Honor bdrv_try_set_aio_context() context acquisition requirements. */
|
||||
+ old_context = bdrv_get_aio_context(target_bs);
|
||||
aio_context = bdrv_get_aio_context(bs);
|
||||
- aio_context_acquire(aio_context);
|
||||
+ aio_context_acquire(old_context);
|
||||
|
||||
ret = bdrv_try_set_aio_context(target_bs, aio_context, errp);
|
||||
+
|
||||
+ aio_context_release(old_context);
|
||||
+ aio_context_acquire(aio_context);
|
||||
+
|
||||
if (ret < 0) {
|
||||
goto out;
|
||||
}
|
||||
--
|
||||
1.8.3.1
|
||||
|
@ -1,144 +0,0 @@
|
||||
From 959955217f745f1ee6cbea97314efe69f2d7dc08 Mon Sep 17 00:00:00 2001
|
||||
From: Sergio Lopez Pascual <slp@redhat.com>
|
||||
Date: Fri, 7 Feb 2020 11:27:43 +0000
|
||||
Subject: [PATCH 10/18] blockdev: unify qmp_blockdev_backup and blockdev-backup
|
||||
transaction paths
|
||||
|
||||
RH-Author: Sergio Lopez Pascual <slp@redhat.com>
|
||||
Message-id: <20200207112749.25073-4-slp@redhat.com>
|
||||
Patchwork-id: 93756
|
||||
O-Subject: [RHEL-AV-8.2.0 qemu-kvm PATCH v2 3/9] blockdev: unify qmp_blockdev_backup and blockdev-backup transaction paths
|
||||
Bugzilla: 1745606 1746217 1773517 1779036 1782111 1782175 1783965
|
||||
RH-Acked-by: Stefano Garzarella <sgarzare@redhat.com>
|
||||
RH-Acked-by: Paolo Bonzini <pbonzini@redhat.com>
|
||||
RH-Acked-by: Max Reitz <mreitz@redhat.com>
|
||||
RH-Acked-by: Stefan Hajnoczi <stefanha@redhat.com>
|
||||
|
||||
Issuing a blockdev-backup from qmp_blockdev_backup takes a slightly
|
||||
different path than when it's issued from a transaction. In the code,
|
||||
this is manifested as some redundancy between do_blockdev_backup() and
|
||||
blockdev_backup_prepare().
|
||||
|
||||
This change unifies both paths, merging do_blockdev_backup() and
|
||||
blockdev_backup_prepare(), and changing qmp_blockdev_backup() to
|
||||
create a transaction instead of calling do_backup_common() direcly.
|
||||
|
||||
As a side-effect, now qmp_blockdev_backup() is executed inside a
|
||||
drained section, as it happens when creating a blockdev-backup
|
||||
transaction. This change is visible from the user's perspective, as
|
||||
the job gets paused and immediately resumed before starting the actual
|
||||
work.
|
||||
|
||||
Signed-off-by: Sergio Lopez <slp@redhat.com>
|
||||
Reviewed-by: Max Reitz <mreitz@redhat.com>
|
||||
Reviewed-by: Kevin Wolf <kwolf@redhat.com>
|
||||
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
|
||||
(cherry picked from commit 5b7bfe515ecbd584b40ff6e41d2fd8b37c7d5139)
|
||||
Signed-off-by: Sergio Lopez <slp@redhat.com>
|
||||
Signed-off-by: Danilo C. L. de Paula <ddepaula@redhat.com>
|
||||
---
|
||||
blockdev.c | 60 +++++++++++++-----------------------------------------------
|
||||
1 file changed, 13 insertions(+), 47 deletions(-)
|
||||
|
||||
diff --git a/blockdev.c b/blockdev.c
|
||||
index 5e85fc0..152a0f7 100644
|
||||
--- a/blockdev.c
|
||||
+++ b/blockdev.c
|
||||
@@ -1940,16 +1940,13 @@ typedef struct BlockdevBackupState {
|
||||
BlockJob *job;
|
||||
} BlockdevBackupState;
|
||||
|
||||
-static BlockJob *do_blockdev_backup(BlockdevBackup *backup, JobTxn *txn,
|
||||
- Error **errp);
|
||||
-
|
||||
static void blockdev_backup_prepare(BlkActionState *common, Error **errp)
|
||||
{
|
||||
BlockdevBackupState *state = DO_UPCAST(BlockdevBackupState, common, common);
|
||||
BlockdevBackup *backup;
|
||||
- BlockDriverState *bs, *target;
|
||||
+ BlockDriverState *bs;
|
||||
+ BlockDriverState *target_bs;
|
||||
AioContext *aio_context;
|
||||
- Error *local_err = NULL;
|
||||
|
||||
assert(common->action->type == TRANSACTION_ACTION_KIND_BLOCKDEV_BACKUP);
|
||||
backup = common->action->u.blockdev_backup.data;
|
||||
@@ -1959,8 +1956,8 @@ static void blockdev_backup_prepare(BlkActionState *common, Error **errp)
|
||||
return;
|
||||
}
|
||||
|
||||
- target = bdrv_lookup_bs(backup->target, backup->target, errp);
|
||||
- if (!target) {
|
||||
+ target_bs = bdrv_lookup_bs(backup->target, backup->target, errp);
|
||||
+ if (!target_bs) {
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -1971,13 +1968,10 @@ static void blockdev_backup_prepare(BlkActionState *common, Error **errp)
|
||||
/* Paired with .clean() */
|
||||
bdrv_drained_begin(state->bs);
|
||||
|
||||
- state->job = do_blockdev_backup(backup, common->block_job_txn, &local_err);
|
||||
- if (local_err) {
|
||||
- error_propagate(errp, local_err);
|
||||
- goto out;
|
||||
- }
|
||||
+ state->job = do_backup_common(qapi_BlockdevBackup_base(backup),
|
||||
+ bs, target_bs, aio_context,
|
||||
+ common->block_job_txn, errp);
|
||||
|
||||
-out:
|
||||
aio_context_release(aio_context);
|
||||
}
|
||||
|
||||
@@ -3695,41 +3689,13 @@ XDbgBlockGraph *qmp_x_debug_query_block_graph(Error **errp)
|
||||
return bdrv_get_xdbg_block_graph(errp);
|
||||
}
|
||||
|
||||
-BlockJob *do_blockdev_backup(BlockdevBackup *backup, JobTxn *txn,
|
||||
- Error **errp)
|
||||
+void qmp_blockdev_backup(BlockdevBackup *backup, Error **errp)
|
||||
{
|
||||
- BlockDriverState *bs;
|
||||
- BlockDriverState *target_bs;
|
||||
- AioContext *aio_context;
|
||||
- BlockJob *job;
|
||||
-
|
||||
- bs = bdrv_lookup_bs(backup->device, backup->device, errp);
|
||||
- if (!bs) {
|
||||
- return NULL;
|
||||
- }
|
||||
-
|
||||
- target_bs = bdrv_lookup_bs(backup->target, backup->target, errp);
|
||||
- if (!target_bs) {
|
||||
- return NULL;
|
||||
- }
|
||||
-
|
||||
- aio_context = bdrv_get_aio_context(bs);
|
||||
- aio_context_acquire(aio_context);
|
||||
-
|
||||
- job = do_backup_common(qapi_BlockdevBackup_base(backup),
|
||||
- bs, target_bs, aio_context, txn, errp);
|
||||
-
|
||||
- aio_context_release(aio_context);
|
||||
- return job;
|
||||
-}
|
||||
-
|
||||
-void qmp_blockdev_backup(BlockdevBackup *arg, Error **errp)
|
||||
-{
|
||||
- BlockJob *job;
|
||||
- job = do_blockdev_backup(arg, NULL, errp);
|
||||
- if (job) {
|
||||
- job_start(&job->job);
|
||||
- }
|
||||
+ TransactionAction action = {
|
||||
+ .type = TRANSACTION_ACTION_KIND_BLOCKDEV_BACKUP,
|
||||
+ .u.blockdev_backup.data = backup,
|
||||
+ };
|
||||
+ blockdev_do_action(&action, errp);
|
||||
}
|
||||
|
||||
/* Parameter check and block job starting for drive mirroring.
|
||||
--
|
||||
1.8.3.1
|
||||
|
@ -1,419 +0,0 @@
|
||||
From 4a03ab2a6cc4974d8d43240d1297b09160818af3 Mon Sep 17 00:00:00 2001
|
||||
From: Sergio Lopez Pascual <slp@redhat.com>
|
||||
Date: Fri, 7 Feb 2020 11:27:42 +0000
|
||||
Subject: [PATCH 09/18] blockdev: unify qmp_drive_backup and drive-backup
|
||||
transaction paths
|
||||
|
||||
RH-Author: Sergio Lopez Pascual <slp@redhat.com>
|
||||
Message-id: <20200207112749.25073-3-slp@redhat.com>
|
||||
Patchwork-id: 93755
|
||||
O-Subject: [RHEL-AV-8.2.0 qemu-kvm PATCH v2 2/9] blockdev: unify qmp_drive_backup and drive-backup transaction paths
|
||||
Bugzilla: 1745606 1746217 1773517 1779036 1782111 1782175 1783965
|
||||
RH-Acked-by: Stefano Garzarella <sgarzare@redhat.com>
|
||||
RH-Acked-by: Paolo Bonzini <pbonzini@redhat.com>
|
||||
RH-Acked-by: Max Reitz <mreitz@redhat.com>
|
||||
RH-Acked-by: Stefan Hajnoczi <stefanha@redhat.com>
|
||||
|
||||
Issuing a drive-backup from qmp_drive_backup takes a slightly
|
||||
different path than when it's issued from a transaction. In the code,
|
||||
this is manifested as some redundancy between do_drive_backup() and
|
||||
drive_backup_prepare().
|
||||
|
||||
This change unifies both paths, merging do_drive_backup() and
|
||||
drive_backup_prepare(), and changing qmp_drive_backup() to create a
|
||||
transaction instead of calling do_backup_common() direcly.
|
||||
|
||||
As a side-effect, now qmp_drive_backup() is executed inside a drained
|
||||
section, as it happens when creating a drive-backup transaction. This
|
||||
change is visible from the user's perspective, as the job gets paused
|
||||
and immediately resumed before starting the actual work.
|
||||
|
||||
Also fix tests 141, 185 and 219 to cope with the extra
|
||||
JOB_STATUS_CHANGE lines.
|
||||
|
||||
Signed-off-by: Sergio Lopez <slp@redhat.com>
|
||||
Reviewed-by: Kevin Wolf <kwolf@redhat.com>
|
||||
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
|
||||
(cherry picked from commit 2288ccfac96281c316db942d10e3f921c1373064)
|
||||
Signed-off-by: Sergio Lopez <slp@redhat.com>
|
||||
Signed-off-by: Danilo C. L. de Paula <ddepaula@redhat.com>
|
||||
---
|
||||
blockdev.c | 224 ++++++++++++++++++++-------------------------
|
||||
tests/qemu-iotests/141.out | 2 +
|
||||
tests/qemu-iotests/185.out | 2 +
|
||||
tests/qemu-iotests/219 | 7 +-
|
||||
tests/qemu-iotests/219.out | 8 ++
|
||||
5 files changed, 117 insertions(+), 126 deletions(-)
|
||||
|
||||
diff --git a/blockdev.c b/blockdev.c
|
||||
index 553e315..5e85fc0 100644
|
||||
--- a/blockdev.c
|
||||
+++ b/blockdev.c
|
||||
@@ -1761,39 +1761,128 @@ typedef struct DriveBackupState {
|
||||
BlockJob *job;
|
||||
} DriveBackupState;
|
||||
|
||||
-static BlockJob *do_drive_backup(DriveBackup *backup, JobTxn *txn,
|
||||
- Error **errp);
|
||||
+static BlockJob *do_backup_common(BackupCommon *backup,
|
||||
+ BlockDriverState *bs,
|
||||
+ BlockDriverState *target_bs,
|
||||
+ AioContext *aio_context,
|
||||
+ JobTxn *txn, Error **errp);
|
||||
|
||||
static void drive_backup_prepare(BlkActionState *common, Error **errp)
|
||||
{
|
||||
DriveBackupState *state = DO_UPCAST(DriveBackupState, common, common);
|
||||
- BlockDriverState *bs;
|
||||
DriveBackup *backup;
|
||||
+ BlockDriverState *bs;
|
||||
+ BlockDriverState *target_bs;
|
||||
+ BlockDriverState *source = NULL;
|
||||
AioContext *aio_context;
|
||||
+ QDict *options;
|
||||
Error *local_err = NULL;
|
||||
+ int flags;
|
||||
+ int64_t size;
|
||||
+ bool set_backing_hd = false;
|
||||
|
||||
assert(common->action->type == TRANSACTION_ACTION_KIND_DRIVE_BACKUP);
|
||||
backup = common->action->u.drive_backup.data;
|
||||
|
||||
+ if (!backup->has_mode) {
|
||||
+ backup->mode = NEW_IMAGE_MODE_ABSOLUTE_PATHS;
|
||||
+ }
|
||||
+
|
||||
bs = bdrv_lookup_bs(backup->device, backup->device, errp);
|
||||
if (!bs) {
|
||||
return;
|
||||
}
|
||||
|
||||
+ if (!bs->drv) {
|
||||
+ error_setg(errp, "Device has no medium");
|
||||
+ return;
|
||||
+ }
|
||||
+
|
||||
aio_context = bdrv_get_aio_context(bs);
|
||||
aio_context_acquire(aio_context);
|
||||
|
||||
/* Paired with .clean() */
|
||||
bdrv_drained_begin(bs);
|
||||
|
||||
- state->bs = bs;
|
||||
+ if (!backup->has_format) {
|
||||
+ backup->format = backup->mode == NEW_IMAGE_MODE_EXISTING ?
|
||||
+ NULL : (char *) bs->drv->format_name;
|
||||
+ }
|
||||
+
|
||||
+ /* Early check to avoid creating target */
|
||||
+ if (bdrv_op_is_blocked(bs, BLOCK_OP_TYPE_BACKUP_SOURCE, errp)) {
|
||||
+ goto out;
|
||||
+ }
|
||||
+
|
||||
+ flags = bs->open_flags | BDRV_O_RDWR;
|
||||
+
|
||||
+ /*
|
||||
+ * See if we have a backing HD we can use to create our new image
|
||||
+ * on top of.
|
||||
+ */
|
||||
+ if (backup->sync == MIRROR_SYNC_MODE_TOP) {
|
||||
+ source = backing_bs(bs);
|
||||
+ if (!source) {
|
||||
+ backup->sync = MIRROR_SYNC_MODE_FULL;
|
||||
+ }
|
||||
+ }
|
||||
+ if (backup->sync == MIRROR_SYNC_MODE_NONE) {
|
||||
+ source = bs;
|
||||
+ flags |= BDRV_O_NO_BACKING;
|
||||
+ set_backing_hd = true;
|
||||
+ }
|
||||
+
|
||||
+ size = bdrv_getlength(bs);
|
||||
+ if (size < 0) {
|
||||
+ error_setg_errno(errp, -size, "bdrv_getlength failed");
|
||||
+ goto out;
|
||||
+ }
|
||||
+
|
||||
+ if (backup->mode != NEW_IMAGE_MODE_EXISTING) {
|
||||
+ assert(backup->format);
|
||||
+ if (source) {
|
||||
+ bdrv_refresh_filename(source);
|
||||
+ bdrv_img_create(backup->target, backup->format, source->filename,
|
||||
+ source->drv->format_name, NULL,
|
||||
+ size, flags, false, &local_err);
|
||||
+ } else {
|
||||
+ bdrv_img_create(backup->target, backup->format, NULL, NULL, NULL,
|
||||
+ size, flags, false, &local_err);
|
||||
+ }
|
||||
+ }
|
||||
|
||||
- state->job = do_drive_backup(backup, common->block_job_txn, &local_err);
|
||||
if (local_err) {
|
||||
error_propagate(errp, local_err);
|
||||
goto out;
|
||||
}
|
||||
|
||||
+ options = qdict_new();
|
||||
+ qdict_put_str(options, "discard", "unmap");
|
||||
+ qdict_put_str(options, "detect-zeroes", "unmap");
|
||||
+ if (backup->format) {
|
||||
+ qdict_put_str(options, "driver", backup->format);
|
||||
+ }
|
||||
+
|
||||
+ target_bs = bdrv_open(backup->target, NULL, options, flags, errp);
|
||||
+ if (!target_bs) {
|
||||
+ goto out;
|
||||
+ }
|
||||
+
|
||||
+ if (set_backing_hd) {
|
||||
+ bdrv_set_backing_hd(target_bs, source, &local_err);
|
||||
+ if (local_err) {
|
||||
+ goto unref;
|
||||
+ }
|
||||
+ }
|
||||
+
|
||||
+ state->bs = bs;
|
||||
+
|
||||
+ state->job = do_backup_common(qapi_DriveBackup_base(backup),
|
||||
+ bs, target_bs, aio_context,
|
||||
+ common->block_job_txn, errp);
|
||||
+
|
||||
+unref:
|
||||
+ bdrv_unref(target_bs);
|
||||
out:
|
||||
aio_context_release(aio_context);
|
||||
}
|
||||
@@ -3587,126 +3676,13 @@ static BlockJob *do_backup_common(BackupCommon *backup,
|
||||
return job;
|
||||
}
|
||||
|
||||
-static BlockJob *do_drive_backup(DriveBackup *backup, JobTxn *txn,
|
||||
- Error **errp)
|
||||
-{
|
||||
- BlockDriverState *bs;
|
||||
- BlockDriverState *target_bs;
|
||||
- BlockDriverState *source = NULL;
|
||||
- BlockJob *job = NULL;
|
||||
- AioContext *aio_context;
|
||||
- QDict *options;
|
||||
- Error *local_err = NULL;
|
||||
- int flags;
|
||||
- int64_t size;
|
||||
- bool set_backing_hd = false;
|
||||
-
|
||||
- if (!backup->has_mode) {
|
||||
- backup->mode = NEW_IMAGE_MODE_ABSOLUTE_PATHS;
|
||||
- }
|
||||
-
|
||||
- bs = bdrv_lookup_bs(backup->device, backup->device, errp);
|
||||
- if (!bs) {
|
||||
- return NULL;
|
||||
- }
|
||||
-
|
||||
- if (!bs->drv) {
|
||||
- error_setg(errp, "Device has no medium");
|
||||
- return NULL;
|
||||
- }
|
||||
-
|
||||
- aio_context = bdrv_get_aio_context(bs);
|
||||
- aio_context_acquire(aio_context);
|
||||
-
|
||||
- if (!backup->has_format) {
|
||||
- backup->format = backup->mode == NEW_IMAGE_MODE_EXISTING ?
|
||||
- NULL : (char *) bs->drv->format_name;
|
||||
- }
|
||||
-
|
||||
- /* Early check to avoid creating target */
|
||||
- if (bdrv_op_is_blocked(bs, BLOCK_OP_TYPE_BACKUP_SOURCE, errp)) {
|
||||
- goto out;
|
||||
- }
|
||||
-
|
||||
- flags = bs->open_flags | BDRV_O_RDWR;
|
||||
-
|
||||
- /*
|
||||
- * See if we have a backing HD we can use to create our new image
|
||||
- * on top of.
|
||||
- */
|
||||
- if (backup->sync == MIRROR_SYNC_MODE_TOP) {
|
||||
- source = backing_bs(bs);
|
||||
- if (!source) {
|
||||
- backup->sync = MIRROR_SYNC_MODE_FULL;
|
||||
- }
|
||||
- }
|
||||
- if (backup->sync == MIRROR_SYNC_MODE_NONE) {
|
||||
- source = bs;
|
||||
- flags |= BDRV_O_NO_BACKING;
|
||||
- set_backing_hd = true;
|
||||
- }
|
||||
-
|
||||
- size = bdrv_getlength(bs);
|
||||
- if (size < 0) {
|
||||
- error_setg_errno(errp, -size, "bdrv_getlength failed");
|
||||
- goto out;
|
||||
- }
|
||||
-
|
||||
- if (backup->mode != NEW_IMAGE_MODE_EXISTING) {
|
||||
- assert(backup->format);
|
||||
- if (source) {
|
||||
- bdrv_refresh_filename(source);
|
||||
- bdrv_img_create(backup->target, backup->format, source->filename,
|
||||
- source->drv->format_name, NULL,
|
||||
- size, flags, false, &local_err);
|
||||
- } else {
|
||||
- bdrv_img_create(backup->target, backup->format, NULL, NULL, NULL,
|
||||
- size, flags, false, &local_err);
|
||||
- }
|
||||
- }
|
||||
-
|
||||
- if (local_err) {
|
||||
- error_propagate(errp, local_err);
|
||||
- goto out;
|
||||
- }
|
||||
-
|
||||
- options = qdict_new();
|
||||
- qdict_put_str(options, "discard", "unmap");
|
||||
- qdict_put_str(options, "detect-zeroes", "unmap");
|
||||
- if (backup->format) {
|
||||
- qdict_put_str(options, "driver", backup->format);
|
||||
- }
|
||||
-
|
||||
- target_bs = bdrv_open(backup->target, NULL, options, flags, errp);
|
||||
- if (!target_bs) {
|
||||
- goto out;
|
||||
- }
|
||||
-
|
||||
- if (set_backing_hd) {
|
||||
- bdrv_set_backing_hd(target_bs, source, &local_err);
|
||||
- if (local_err) {
|
||||
- goto unref;
|
||||
- }
|
||||
- }
|
||||
-
|
||||
- job = do_backup_common(qapi_DriveBackup_base(backup),
|
||||
- bs, target_bs, aio_context, txn, errp);
|
||||
-
|
||||
-unref:
|
||||
- bdrv_unref(target_bs);
|
||||
-out:
|
||||
- aio_context_release(aio_context);
|
||||
- return job;
|
||||
-}
|
||||
-
|
||||
-void qmp_drive_backup(DriveBackup *arg, Error **errp)
|
||||
+void qmp_drive_backup(DriveBackup *backup, Error **errp)
|
||||
{
|
||||
-
|
||||
- BlockJob *job;
|
||||
- job = do_drive_backup(arg, NULL, errp);
|
||||
- if (job) {
|
||||
- job_start(&job->job);
|
||||
- }
|
||||
+ TransactionAction action = {
|
||||
+ .type = TRANSACTION_ACTION_KIND_DRIVE_BACKUP,
|
||||
+ .u.drive_backup.data = backup,
|
||||
+ };
|
||||
+ blockdev_do_action(&action, errp);
|
||||
}
|
||||
|
||||
BlockDeviceInfoList *qmp_query_named_block_nodes(Error **errp)
|
||||
diff --git a/tests/qemu-iotests/141.out b/tests/qemu-iotests/141.out
|
||||
index 3645675..263b680 100644
|
||||
--- a/tests/qemu-iotests/141.out
|
||||
+++ b/tests/qemu-iotests/141.out
|
||||
@@ -13,6 +13,8 @@ Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=1048576 backing_file=TEST_DIR/m.
|
||||
Formatting 'TEST_DIR/o.IMGFMT', fmt=IMGFMT size=1048576 backing_file=TEST_DIR/t.IMGFMT backing_fmt=IMGFMT
|
||||
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "JOB_STATUS_CHANGE", "data": {"status": "created", "id": "job0"}}
|
||||
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "JOB_STATUS_CHANGE", "data": {"status": "running", "id": "job0"}}
|
||||
+{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "JOB_STATUS_CHANGE", "data": {"status": "paused", "id": "job0"}}
|
||||
+{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "JOB_STATUS_CHANGE", "data": {"status": "running", "id": "job0"}}
|
||||
{'execute': 'blockdev-del', 'arguments': {'node-name': 'drv0'}}
|
||||
{"error": {"class": "GenericError", "desc": "Node 'drv0' is busy: node is used as backing hd of 'NODE_NAME'"}}
|
||||
{'execute': 'block-job-cancel', 'arguments': {'device': 'job0'}}
|
||||
diff --git a/tests/qemu-iotests/185.out b/tests/qemu-iotests/185.out
|
||||
index 8379ac5..9a3b657 100644
|
||||
--- a/tests/qemu-iotests/185.out
|
||||
+++ b/tests/qemu-iotests/185.out
|
||||
@@ -65,6 +65,8 @@ Formatting 'TEST_DIR/t.qcow2.copy', fmt=qcow2 size=67108864 cluster_size=65536 l
|
||||
Formatting 'TEST_DIR/t.qcow2.copy', fmt=qcow2 size=67108864 cluster_size=65536 lazy_refcounts=off refcount_bits=16
|
||||
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "JOB_STATUS_CHANGE", "data": {"status": "created", "id": "disk"}}
|
||||
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "JOB_STATUS_CHANGE", "data": {"status": "running", "id": "disk"}}
|
||||
+{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "JOB_STATUS_CHANGE", "data": {"status": "paused", "id": "disk"}}
|
||||
+{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "JOB_STATUS_CHANGE", "data": {"status": "running", "id": "disk"}}
|
||||
{"return": {}}
|
||||
{ 'execute': 'quit' }
|
||||
{"return": {}}
|
||||
diff --git a/tests/qemu-iotests/219 b/tests/qemu-iotests/219
|
||||
index e0c5166..655f54d 100755
|
||||
--- a/tests/qemu-iotests/219
|
||||
+++ b/tests/qemu-iotests/219
|
||||
@@ -63,7 +63,7 @@ def test_pause_resume(vm):
|
||||
# logged immediately
|
||||
iotests.log(vm.qmp('query-jobs'))
|
||||
|
||||
-def test_job_lifecycle(vm, job, job_args, has_ready=False):
|
||||
+def test_job_lifecycle(vm, job, job_args, has_ready=False, is_mirror=False):
|
||||
global img_size
|
||||
|
||||
iotests.log('')
|
||||
@@ -135,6 +135,9 @@ def test_job_lifecycle(vm, job, job_args, has_ready=False):
|
||||
iotests.log('Waiting for PENDING state...')
|
||||
iotests.log(iotests.filter_qmp_event(vm.event_wait('JOB_STATUS_CHANGE')))
|
||||
iotests.log(iotests.filter_qmp_event(vm.event_wait('JOB_STATUS_CHANGE')))
|
||||
+ if is_mirror:
|
||||
+ iotests.log(iotests.filter_qmp_event(vm.event_wait('JOB_STATUS_CHANGE')))
|
||||
+ iotests.log(iotests.filter_qmp_event(vm.event_wait('JOB_STATUS_CHANGE')))
|
||||
|
||||
if not job_args.get('auto-finalize', True):
|
||||
# PENDING state:
|
||||
@@ -218,7 +221,7 @@ with iotests.FilePath('disk.img') as disk_path, \
|
||||
|
||||
for auto_finalize in [True, False]:
|
||||
for auto_dismiss in [True, False]:
|
||||
- test_job_lifecycle(vm, 'drive-backup', job_args={
|
||||
+ test_job_lifecycle(vm, 'drive-backup', is_mirror=True, job_args={
|
||||
'device': 'drive0-node',
|
||||
'target': copy_path,
|
||||
'sync': 'full',
|
||||
diff --git a/tests/qemu-iotests/219.out b/tests/qemu-iotests/219.out
|
||||
index 8ebd3fe..0ea5d0b 100644
|
||||
--- a/tests/qemu-iotests/219.out
|
||||
+++ b/tests/qemu-iotests/219.out
|
||||
@@ -135,6 +135,8 @@ Pause/resume in RUNNING
|
||||
{"return": {}}
|
||||
|
||||
Waiting for PENDING state...
|
||||
+{"data": {"id": "job0", "status": "paused"}, "event": "JOB_STATUS_CHANGE", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
|
||||
+{"data": {"id": "job0", "status": "running"}, "event": "JOB_STATUS_CHANGE", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
|
||||
{"data": {"id": "job0", "status": "waiting"}, "event": "JOB_STATUS_CHANGE", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
|
||||
{"data": {"id": "job0", "status": "pending"}, "event": "JOB_STATUS_CHANGE", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
|
||||
{"data": {"id": "job0", "status": "concluded"}, "event": "JOB_STATUS_CHANGE", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
|
||||
@@ -186,6 +188,8 @@ Pause/resume in RUNNING
|
||||
{"return": {}}
|
||||
|
||||
Waiting for PENDING state...
|
||||
+{"data": {"id": "job0", "status": "paused"}, "event": "JOB_STATUS_CHANGE", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
|
||||
+{"data": {"id": "job0", "status": "running"}, "event": "JOB_STATUS_CHANGE", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
|
||||
{"data": {"id": "job0", "status": "waiting"}, "event": "JOB_STATUS_CHANGE", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
|
||||
{"data": {"id": "job0", "status": "pending"}, "event": "JOB_STATUS_CHANGE", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
|
||||
{"data": {"id": "job0", "status": "concluded"}, "event": "JOB_STATUS_CHANGE", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
|
||||
@@ -245,6 +249,8 @@ Pause/resume in RUNNING
|
||||
{"return": {}}
|
||||
|
||||
Waiting for PENDING state...
|
||||
+{"data": {"id": "job0", "status": "paused"}, "event": "JOB_STATUS_CHANGE", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
|
||||
+{"data": {"id": "job0", "status": "running"}, "event": "JOB_STATUS_CHANGE", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
|
||||
{"data": {"id": "job0", "status": "waiting"}, "event": "JOB_STATUS_CHANGE", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
|
||||
{"data": {"id": "job0", "status": "pending"}, "event": "JOB_STATUS_CHANGE", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
|
||||
{"return": [{"current-progress": 4194304, "id": "job0", "status": "pending", "total-progress": 4194304, "type": "backup"}]}
|
||||
@@ -304,6 +310,8 @@ Pause/resume in RUNNING
|
||||
{"return": {}}
|
||||
|
||||
Waiting for PENDING state...
|
||||
+{"data": {"id": "job0", "status": "paused"}, "event": "JOB_STATUS_CHANGE", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
|
||||
+{"data": {"id": "job0", "status": "running"}, "event": "JOB_STATUS_CHANGE", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
|
||||
{"data": {"id": "job0", "status": "waiting"}, "event": "JOB_STATUS_CHANGE", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
|
||||
{"data": {"id": "job0", "status": "pending"}, "event": "JOB_STATUS_CHANGE", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
|
||||
{"return": [{"current-progress": 4194304, "id": "job0", "status": "pending", "total-progress": 4194304, "type": "backup"}]}
|
||||
--
|
||||
1.8.3.1
|
||||
|
@ -1,137 +0,0 @@
|
||||
From f756c1c4590a37c533ec0429644a7034ba35dada Mon Sep 17 00:00:00 2001
|
||||
From: "Dr. David Alan Gilbert" <dgilbert@redhat.com>
|
||||
Date: Mon, 27 Jan 2020 19:00:38 +0100
|
||||
Subject: [PATCH 007/116] build: rename CONFIG_LIBCAP to CONFIG_LIBCAP_NG
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
RH-Author: Dr. David Alan Gilbert <dgilbert@redhat.com>
|
||||
Message-id: <20200127190227.40942-4-dgilbert@redhat.com>
|
||||
Patchwork-id: 93459
|
||||
O-Subject: [RHEL-AV-8.2 qemu-kvm PATCH 003/112] build: rename CONFIG_LIBCAP to CONFIG_LIBCAP_NG
|
||||
Bugzilla: 1694164
|
||||
RH-Acked-by: Philippe Mathieu-Daudé <philmd@redhat.com>
|
||||
RH-Acked-by: Stefan Hajnoczi <stefanha@redhat.com>
|
||||
RH-Acked-by: Sergio Lopez Pascual <slp@redhat.com>
|
||||
|
||||
From: Paolo Bonzini <pbonzini@redhat.com>
|
||||
|
||||
Since we are actually testing for the newer capng library, rename the
|
||||
symbol to match.
|
||||
|
||||
Reviewed-by: Dr. David Alan Gilbert <dgilbert@redhat.com>
|
||||
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
|
||||
(cherry picked from commit a358bca24026a377e0804e137a4499e4e041918d)
|
||||
Signed-off-by: Miroslav Rezanina <mrezanin@redhat.com>
|
||||
---
|
||||
configure | 2 +-
|
||||
qemu-bridge-helper.c | 6 +++---
|
||||
scsi/qemu-pr-helper.c | 12 ++++++------
|
||||
3 files changed, 10 insertions(+), 10 deletions(-)
|
||||
|
||||
diff --git a/configure b/configure
|
||||
index 16564f8..7831618 100755
|
||||
--- a/configure
|
||||
+++ b/configure
|
||||
@@ -6760,7 +6760,7 @@ if test "$l2tpv3" = "yes" ; then
|
||||
echo "CONFIG_L2TPV3=y" >> $config_host_mak
|
||||
fi
|
||||
if test "$cap_ng" = "yes" ; then
|
||||
- echo "CONFIG_LIBCAP=y" >> $config_host_mak
|
||||
+ echo "CONFIG_LIBCAP_NG=y" >> $config_host_mak
|
||||
fi
|
||||
echo "CONFIG_AUDIO_DRIVERS=$audio_drv_list" >> $config_host_mak
|
||||
for drv in $audio_drv_list; do
|
||||
diff --git a/qemu-bridge-helper.c b/qemu-bridge-helper.c
|
||||
index 3d50ec0..88b2674 100644
|
||||
--- a/qemu-bridge-helper.c
|
||||
+++ b/qemu-bridge-helper.c
|
||||
@@ -43,7 +43,7 @@
|
||||
|
||||
#include "net/tap-linux.h"
|
||||
|
||||
-#ifdef CONFIG_LIBCAP
|
||||
+#ifdef CONFIG_LIBCAP_NG
|
||||
#include <cap-ng.h>
|
||||
#endif
|
||||
|
||||
@@ -207,7 +207,7 @@ static int send_fd(int c, int fd)
|
||||
return sendmsg(c, &msg, 0);
|
||||
}
|
||||
|
||||
-#ifdef CONFIG_LIBCAP
|
||||
+#ifdef CONFIG_LIBCAP_NG
|
||||
static int drop_privileges(void)
|
||||
{
|
||||
/* clear all capabilities */
|
||||
@@ -246,7 +246,7 @@ int main(int argc, char **argv)
|
||||
int access_allowed, access_denied;
|
||||
int ret = EXIT_SUCCESS;
|
||||
|
||||
-#ifdef CONFIG_LIBCAP
|
||||
+#ifdef CONFIG_LIBCAP_NG
|
||||
/* if we're run from an suid binary, immediately drop privileges preserving
|
||||
* cap_net_admin */
|
||||
if (geteuid() == 0 && getuid() != geteuid()) {
|
||||
diff --git a/scsi/qemu-pr-helper.c b/scsi/qemu-pr-helper.c
|
||||
index debb18f..0659cee 100644
|
||||
--- a/scsi/qemu-pr-helper.c
|
||||
+++ b/scsi/qemu-pr-helper.c
|
||||
@@ -24,7 +24,7 @@
|
||||
#include <linux/dm-ioctl.h>
|
||||
#include <scsi/sg.h>
|
||||
|
||||
-#ifdef CONFIG_LIBCAP
|
||||
+#ifdef CONFIG_LIBCAP_NG
|
||||
#include <cap-ng.h>
|
||||
#endif
|
||||
#include <pwd.h>
|
||||
@@ -70,7 +70,7 @@ static int num_active_sockets = 1;
|
||||
static int noisy;
|
||||
static int verbose;
|
||||
|
||||
-#ifdef CONFIG_LIBCAP
|
||||
+#ifdef CONFIG_LIBCAP_NG
|
||||
static int uid = -1;
|
||||
static int gid = -1;
|
||||
#endif
|
||||
@@ -97,7 +97,7 @@ static void usage(const char *name)
|
||||
" (default '%s')\n"
|
||||
" -T, --trace [[enable=]<pattern>][,events=<file>][,file=<file>]\n"
|
||||
" specify tracing options\n"
|
||||
-#ifdef CONFIG_LIBCAP
|
||||
+#ifdef CONFIG_LIBCAP_NG
|
||||
" -u, --user=USER user to drop privileges to\n"
|
||||
" -g, --group=GROUP group to drop privileges to\n"
|
||||
#endif
|
||||
@@ -827,7 +827,7 @@ static void close_server_socket(void)
|
||||
num_active_sockets--;
|
||||
}
|
||||
|
||||
-#ifdef CONFIG_LIBCAP
|
||||
+#ifdef CONFIG_LIBCAP_NG
|
||||
static int drop_privileges(void)
|
||||
{
|
||||
/* clear all capabilities */
|
||||
@@ -920,7 +920,7 @@ int main(int argc, char **argv)
|
||||
pidfile = g_strdup(optarg);
|
||||
pidfile_specified = true;
|
||||
break;
|
||||
-#ifdef CONFIG_LIBCAP
|
||||
+#ifdef CONFIG_LIBCAP_NG
|
||||
case 'u': {
|
||||
unsigned long res;
|
||||
struct passwd *userinfo = getpwnam(optarg);
|
||||
@@ -1056,7 +1056,7 @@ int main(int argc, char **argv)
|
||||
exit(EXIT_FAILURE);
|
||||
}
|
||||
|
||||
-#ifdef CONFIG_LIBCAP
|
||||
+#ifdef CONFIG_LIBCAP_NG
|
||||
if (drop_privileges() < 0) {
|
||||
error_report("Failed to drop privileges: %s", strerror(errno));
|
||||
exit(EXIT_FAILURE);
|
||||
--
|
||||
1.8.3.1
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -1,134 +0,0 @@
|
||||
From 548de8acbf0137b6e49a14b63682badfff037d23 Mon Sep 17 00:00:00 2001
|
||||
From: "Dr. David Alan Gilbert" <dgilbert@redhat.com>
|
||||
Date: Mon, 27 Jan 2020 19:01:44 +0100
|
||||
Subject: [PATCH 073/116] contrib/libvhost-user: Protect slave fd with mutex
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
RH-Author: Dr. David Alan Gilbert <dgilbert@redhat.com>
|
||||
Message-id: <20200127190227.40942-70-dgilbert@redhat.com>
|
||||
Patchwork-id: 93523
|
||||
O-Subject: [RHEL-AV-8.2 qemu-kvm PATCH 069/112] contrib/libvhost-user: Protect slave fd with mutex
|
||||
Bugzilla: 1694164
|
||||
RH-Acked-by: Philippe Mathieu-Daudé <philmd@redhat.com>
|
||||
RH-Acked-by: Stefan Hajnoczi <stefanha@redhat.com>
|
||||
RH-Acked-by: Sergio Lopez Pascual <slp@redhat.com>
|
||||
|
||||
From: "Dr. David Alan Gilbert" <dgilbert@redhat.com>
|
||||
|
||||
In future patches we'll be performing commands on the slave-fd driven
|
||||
by commands on queues, since those queues will be driven by individual
|
||||
threads we need to make sure they don't attempt to use the slave-fd
|
||||
for multiple commands in parallel.
|
||||
|
||||
Signed-off-by: Dr. David Alan Gilbert <dgilbert@redhat.com>
|
||||
Reviewed-by: Daniel P. Berrangé <berrange@redhat.com>
|
||||
Signed-off-by: Dr. David Alan Gilbert <dgilbert@redhat.com>
|
||||
(cherry picked from commit c25c02b9e6a196be87a818f459c426556b24770d)
|
||||
Signed-off-by: Miroslav Rezanina <mrezanin@redhat.com>
|
||||
---
|
||||
contrib/libvhost-user/libvhost-user.c | 24 ++++++++++++++++++++----
|
||||
contrib/libvhost-user/libvhost-user.h | 3 +++
|
||||
2 files changed, 23 insertions(+), 4 deletions(-)
|
||||
|
||||
diff --git a/contrib/libvhost-user/libvhost-user.c b/contrib/libvhost-user/libvhost-user.c
|
||||
index ec27b78..63e4106 100644
|
||||
--- a/contrib/libvhost-user/libvhost-user.c
|
||||
+++ b/contrib/libvhost-user/libvhost-user.c
|
||||
@@ -392,26 +392,37 @@ vu_send_reply(VuDev *dev, int conn_fd, VhostUserMsg *vmsg)
|
||||
return vu_message_write(dev, conn_fd, vmsg);
|
||||
}
|
||||
|
||||
+/*
|
||||
+ * Processes a reply on the slave channel.
|
||||
+ * Entered with slave_mutex held and releases it before exit.
|
||||
+ * Returns true on success.
|
||||
+ */
|
||||
static bool
|
||||
vu_process_message_reply(VuDev *dev, const VhostUserMsg *vmsg)
|
||||
{
|
||||
VhostUserMsg msg_reply;
|
||||
+ bool result = false;
|
||||
|
||||
if ((vmsg->flags & VHOST_USER_NEED_REPLY_MASK) == 0) {
|
||||
- return true;
|
||||
+ result = true;
|
||||
+ goto out;
|
||||
}
|
||||
|
||||
if (!vu_message_read(dev, dev->slave_fd, &msg_reply)) {
|
||||
- return false;
|
||||
+ goto out;
|
||||
}
|
||||
|
||||
if (msg_reply.request != vmsg->request) {
|
||||
DPRINT("Received unexpected msg type. Expected %d received %d",
|
||||
vmsg->request, msg_reply.request);
|
||||
- return false;
|
||||
+ goto out;
|
||||
}
|
||||
|
||||
- return msg_reply.payload.u64 == 0;
|
||||
+ result = msg_reply.payload.u64 == 0;
|
||||
+
|
||||
+out:
|
||||
+ pthread_mutex_unlock(&dev->slave_mutex);
|
||||
+ return result;
|
||||
}
|
||||
|
||||
/* Kick the log_call_fd if required. */
|
||||
@@ -1105,10 +1116,13 @@ bool vu_set_queue_host_notifier(VuDev *dev, VuVirtq *vq, int fd,
|
||||
return false;
|
||||
}
|
||||
|
||||
+ pthread_mutex_lock(&dev->slave_mutex);
|
||||
if (!vu_message_write(dev, dev->slave_fd, &vmsg)) {
|
||||
+ pthread_mutex_unlock(&dev->slave_mutex);
|
||||
return false;
|
||||
}
|
||||
|
||||
+ /* Also unlocks the slave_mutex */
|
||||
return vu_process_message_reply(dev, &vmsg);
|
||||
}
|
||||
|
||||
@@ -1628,6 +1642,7 @@ vu_deinit(VuDev *dev)
|
||||
close(dev->slave_fd);
|
||||
dev->slave_fd = -1;
|
||||
}
|
||||
+ pthread_mutex_destroy(&dev->slave_mutex);
|
||||
|
||||
if (dev->sock != -1) {
|
||||
close(dev->sock);
|
||||
@@ -1663,6 +1678,7 @@ vu_init(VuDev *dev,
|
||||
dev->remove_watch = remove_watch;
|
||||
dev->iface = iface;
|
||||
dev->log_call_fd = -1;
|
||||
+ pthread_mutex_init(&dev->slave_mutex, NULL);
|
||||
dev->slave_fd = -1;
|
||||
dev->max_queues = max_queues;
|
||||
|
||||
diff --git a/contrib/libvhost-user/libvhost-user.h b/contrib/libvhost-user/libvhost-user.h
|
||||
index 46b6007..1844b6f 100644
|
||||
--- a/contrib/libvhost-user/libvhost-user.h
|
||||
+++ b/contrib/libvhost-user/libvhost-user.h
|
||||
@@ -19,6 +19,7 @@
|
||||
#include <stddef.h>
|
||||
#include <sys/poll.h>
|
||||
#include <linux/vhost.h>
|
||||
+#include <pthread.h>
|
||||
#include "standard-headers/linux/virtio_ring.h"
|
||||
|
||||
/* Based on qemu/hw/virtio/vhost-user.c */
|
||||
@@ -355,6 +356,8 @@ struct VuDev {
|
||||
VuVirtq *vq;
|
||||
VuDevInflightInfo inflight_info;
|
||||
int log_call_fd;
|
||||
+ /* Must be held while using slave_fd */
|
||||
+ pthread_mutex_t slave_mutex;
|
||||
int slave_fd;
|
||||
uint64_t log_size;
|
||||
uint8_t *log_table;
|
||||
--
|
||||
1.8.3.1
|
||||
|
@ -1,56 +0,0 @@
|
||||
From f01178897c8f5ff98692a22059dd65e35677eaa3 Mon Sep 17 00:00:00 2001
|
||||
From: Andrew Jones <drjones@redhat.com>
|
||||
Date: Mon, 10 Feb 2020 17:33:58 +0000
|
||||
Subject: [PATCH 18/18] docs/arm-cpu-features: Make kvm-no-adjvtime comment
|
||||
clearer
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
RH-Author: Andrew Jones <drjones@redhat.com>
|
||||
Message-id: <20200210173358.16896-3-drjones@redhat.com>
|
||||
Patchwork-id: 93772
|
||||
O-Subject: [RHEL-AV-8.2.0 qemu-kvm PATCH 2/2] docs/arm-cpu-features: Make kvm-no-adjvtime comment clearer
|
||||
Bugzilla: 1801320
|
||||
RH-Acked-by: Auger Eric <eric.auger@redhat.com>
|
||||
RH-Acked-by: Gavin Shan <gshan@redhat.com>
|
||||
RH-Acked-by: Philippe Mathieu-Daudé <philmd@redhat.com>
|
||||
|
||||
Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1801320
|
||||
|
||||
Author: Philippe Mathieu-Daudé <philmd@redhat.com>
|
||||
Date: Fri, 07 Feb 2020 14:04:28 +0000
|
||||
|
||||
docs/arm-cpu-features: Make kvm-no-adjvtime comment clearer
|
||||
|
||||
The bold text sounds like 'knock knock'. Only bolding the
|
||||
second 'not' makes it easier to read.
|
||||
|
||||
Fixes: dea101a1ae
|
||||
Signed-off-by: Philippe Mathieu-Daudé <philmd@redhat.com>
|
||||
Reviewed-by: Andrew Jones <drjones@redhat.com>
|
||||
Message-id: 20200206225148.23923-1-philmd@redhat.com
|
||||
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
|
||||
|
||||
(cherry picked from commit fa3236a970b6ea5be3fa3ad258f1a75920ca1ebb)
|
||||
Signed-off-by: Danilo C. L. de Paula <ddepaula@redhat.com>
|
||||
---
|
||||
docs/arm-cpu-features.rst | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
diff --git a/docs/arm-cpu-features.rst b/docs/arm-cpu-features.rst
|
||||
index 45d1eb6..48d5054 100644
|
||||
--- a/docs/arm-cpu-features.rst
|
||||
+++ b/docs/arm-cpu-features.rst
|
||||
@@ -185,7 +185,7 @@ the list of KVM VCPU features and their descriptions.
|
||||
|
||||
kvm-no-adjvtime By default kvm-no-adjvtime is disabled. This
|
||||
means that by default the virtual time
|
||||
- adjustment is enabled (vtime is *not not*
|
||||
+ adjustment is enabled (vtime is not *not*
|
||||
adjusted).
|
||||
|
||||
When virtual time adjustment is enabled each
|
||||
--
|
||||
1.8.3.1
|
||||
|
@ -1,85 +0,0 @@
|
||||
From 5770fe43fe1e15e6f53cfd3705605e8645b95a98 Mon Sep 17 00:00:00 2001
|
||||
From: "Dr. David Alan Gilbert" <dgilbert@redhat.com>
|
||||
Date: Fri, 13 Mar 2020 17:17:08 +0000
|
||||
Subject: [PATCH 20/20] exec/rom_reset: Free rom data during inmigrate skip
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
RH-Author: Dr. David Alan Gilbert <dgilbert@redhat.com>
|
||||
Message-id: <20200313171708.242774-1-dgilbert@redhat.com>
|
||||
Patchwork-id: 94292
|
||||
O-Subject: [RHEL-AV-8.2.0 qemu-kvm PATCH 1/1] exec/rom_reset: Free rom data during inmigrate skip
|
||||
Bugzilla: 1809380
|
||||
RH-Acked-by: Daniel P. Berrange <berrange@redhat.com>
|
||||
RH-Acked-by: Philippe Mathieu-Daudé <philmd@redhat.com>
|
||||
RH-Acked-by: Paolo Bonzini <pbonzini@redhat.com>
|
||||
|
||||
From: "Dr. David Alan Gilbert" <dgilbert@redhat.com>
|
||||
|
||||
bz: https://bugzilla.redhat.com/show_bug.cgi?id=1809380
|
||||
brew: https://brewweb.engineering.redhat.com/brew/taskinfo?taskID=27249921
|
||||
branch: rhel-av-8.2.0
|
||||
upstream: Posted and with review-by, not merged yet
|
||||
|
||||
Commit 355477f8c73e9 skips rom reset when we're an incoming migration
|
||||
so as not to overwrite shared ram in the ignore-shared migration
|
||||
optimisation.
|
||||
However, it's got an unexpected side effect that because it skips
|
||||
freeing the ROM data, when rom_reset gets called later on, after
|
||||
migration (e.g. during a reboot), the ROM does get reset to the original
|
||||
file contents. Because of seabios/x86's weird reboot process
|
||||
this confuses a reboot into hanging after a migration.
|
||||
|
||||
Fixes: 355477f8c73e9 ("migration: do not rom_reset() during incoming migration")
|
||||
https://bugzilla.redhat.com/show_bug.cgi?id=1809380
|
||||
|
||||
Signed-off-by: Dr. David Alan Gilbert <dgilbert@redhat.com>
|
||||
Signed-off-by: Danilo C. L. de Paula <ddepaula@redhat.com>
|
||||
---
|
||||
hw/core/loader.c | 25 ++++++++++++++++---------
|
||||
1 file changed, 16 insertions(+), 9 deletions(-)
|
||||
|
||||
diff --git a/hw/core/loader.c b/hw/core/loader.c
|
||||
index 5099f27..375b29b 100644
|
||||
--- a/hw/core/loader.c
|
||||
+++ b/hw/core/loader.c
|
||||
@@ -1118,19 +1118,26 @@ static void rom_reset(void *unused)
|
||||
{
|
||||
Rom *rom;
|
||||
|
||||
- /*
|
||||
- * We don't need to fill in the RAM with ROM data because we'll fill
|
||||
- * the data in during the next incoming migration in all cases. Note
|
||||
- * that some of those RAMs can actually be modified by the guest on ARM
|
||||
- * so this is probably the only right thing to do here.
|
||||
- */
|
||||
- if (runstate_check(RUN_STATE_INMIGRATE))
|
||||
- return;
|
||||
-
|
||||
QTAILQ_FOREACH(rom, &roms, next) {
|
||||
if (rom->fw_file) {
|
||||
continue;
|
||||
}
|
||||
+ /*
|
||||
+ * We don't need to fill in the RAM with ROM data because we'll fill
|
||||
+ * the data in during the next incoming migration in all cases. Note
|
||||
+ * that some of those RAMs can actually be modified by the guest.
|
||||
+ */
|
||||
+ if (runstate_check(RUN_STATE_INMIGRATE)) {
|
||||
+ if (rom->data && rom->isrom) {
|
||||
+ /*
|
||||
+ * Free it so that a rom_reset after migration doesn't
|
||||
+ * overwrite a potentially modified 'rom'.
|
||||
+ */
|
||||
+ rom_free_data(rom);
|
||||
+ }
|
||||
+ continue;
|
||||
+ }
|
||||
+
|
||||
if (rom->data == NULL) {
|
||||
continue;
|
||||
}
|
||||
--
|
||||
1.8.3.1
|
||||
|
@ -1,131 +0,0 @@
|
||||
From 3d3509c010129bd15eb1f5ec1a7b9eedcdbf23f6 Mon Sep 17 00:00:00 2001
|
||||
From: Maxim Levitsky <mlevitsk@redhat.com>
|
||||
Date: Wed, 11 Mar 2020 10:51:44 +0000
|
||||
Subject: [PATCH 03/20] file-posix: Drop hdev_co_create_opts()
|
||||
|
||||
RH-Author: Maxim Levitsky <mlevitsk@redhat.com>
|
||||
Message-id: <20200311105147.13208-4-mlevitsk@redhat.com>
|
||||
Patchwork-id: 94225
|
||||
O-Subject: [RHEL-AV-8.2.0 qemu-kvm PATCH v2 3/6] file-posix: Drop hdev_co_create_opts()
|
||||
Bugzilla: 1640894
|
||||
RH-Acked-by: Stefano Garzarella <sgarzare@redhat.com>
|
||||
RH-Acked-by: John Snow <jsnow@redhat.com>
|
||||
RH-Acked-by: Max Reitz <mreitz@redhat.com>
|
||||
|
||||
From: Max Reitz <mreitz@redhat.com>
|
||||
|
||||
The generic fallback implementation effectively does the same.
|
||||
|
||||
Reviewed-by: Maxim Levitsky <mlevitsk@redhat.com>
|
||||
Signed-off-by: Max Reitz <mreitz@redhat.com>
|
||||
Message-Id: <20200122164532.178040-4-mreitz@redhat.com>
|
||||
Signed-off-by: Max Reitz <mreitz@redhat.com>
|
||||
(cherry picked from commit 87ca3b8fa615b278b33cabf9ed22b3f44b5214ba)
|
||||
Signed-off-by: Maxim Levitsky <mlevitsk@redhat.com>
|
||||
Signed-off-by: Danilo C. L. de Paula <ddepaula@redhat.com>
|
||||
---
|
||||
block/file-posix.c | 67 ------------------------------------------------------
|
||||
1 file changed, 67 deletions(-)
|
||||
|
||||
diff --git a/block/file-posix.c b/block/file-posix.c
|
||||
index 1b805bd..fd29372 100644
|
||||
--- a/block/file-posix.c
|
||||
+++ b/block/file-posix.c
|
||||
@@ -3418,67 +3418,6 @@ static coroutine_fn int hdev_co_pwrite_zeroes(BlockDriverState *bs,
|
||||
return raw_do_pwrite_zeroes(bs, offset, bytes, flags, true);
|
||||
}
|
||||
|
||||
-static int coroutine_fn hdev_co_create_opts(const char *filename, QemuOpts *opts,
|
||||
- Error **errp)
|
||||
-{
|
||||
- int fd;
|
||||
- int ret = 0;
|
||||
- struct stat stat_buf;
|
||||
- int64_t total_size = 0;
|
||||
- bool has_prefix;
|
||||
-
|
||||
- /* This function is used by both protocol block drivers and therefore either
|
||||
- * of these prefixes may be given.
|
||||
- * The return value has to be stored somewhere, otherwise this is an error
|
||||
- * due to -Werror=unused-value. */
|
||||
- has_prefix =
|
||||
- strstart(filename, "host_device:", &filename) ||
|
||||
- strstart(filename, "host_cdrom:" , &filename);
|
||||
-
|
||||
- (void)has_prefix;
|
||||
-
|
||||
- ret = raw_normalize_devicepath(&filename, errp);
|
||||
- if (ret < 0) {
|
||||
- return ret;
|
||||
- }
|
||||
-
|
||||
- /* Read out options */
|
||||
- total_size = ROUND_UP(qemu_opt_get_size_del(opts, BLOCK_OPT_SIZE, 0),
|
||||
- BDRV_SECTOR_SIZE);
|
||||
-
|
||||
- fd = qemu_open(filename, O_WRONLY | O_BINARY);
|
||||
- if (fd < 0) {
|
||||
- ret = -errno;
|
||||
- error_setg_errno(errp, -ret, "Could not open device");
|
||||
- return ret;
|
||||
- }
|
||||
-
|
||||
- if (fstat(fd, &stat_buf) < 0) {
|
||||
- ret = -errno;
|
||||
- error_setg_errno(errp, -ret, "Could not stat device");
|
||||
- } else if (!S_ISBLK(stat_buf.st_mode) && !S_ISCHR(stat_buf.st_mode)) {
|
||||
- error_setg(errp,
|
||||
- "The given file is neither a block nor a character device");
|
||||
- ret = -ENODEV;
|
||||
- } else if (lseek(fd, 0, SEEK_END) < total_size) {
|
||||
- error_setg(errp, "Device is too small");
|
||||
- ret = -ENOSPC;
|
||||
- }
|
||||
-
|
||||
- if (!ret && total_size) {
|
||||
- uint8_t buf[BDRV_SECTOR_SIZE] = { 0 };
|
||||
- int64_t zero_size = MIN(BDRV_SECTOR_SIZE, total_size);
|
||||
- if (lseek(fd, 0, SEEK_SET) == -1) {
|
||||
- ret = -errno;
|
||||
- } else {
|
||||
- ret = qemu_write_full(fd, buf, zero_size);
|
||||
- ret = ret == zero_size ? 0 : -errno;
|
||||
- }
|
||||
- }
|
||||
- qemu_close(fd);
|
||||
- return ret;
|
||||
-}
|
||||
-
|
||||
static BlockDriver bdrv_host_device = {
|
||||
.format_name = "host_device",
|
||||
.protocol_name = "host_device",
|
||||
@@ -3491,8 +3430,6 @@ static BlockDriver bdrv_host_device = {
|
||||
.bdrv_reopen_prepare = raw_reopen_prepare,
|
||||
.bdrv_reopen_commit = raw_reopen_commit,
|
||||
.bdrv_reopen_abort = raw_reopen_abort,
|
||||
- .bdrv_co_create_opts = hdev_co_create_opts,
|
||||
- .create_opts = &raw_create_opts,
|
||||
.mutable_opts = mutable_opts,
|
||||
.bdrv_co_invalidate_cache = raw_co_invalidate_cache,
|
||||
.bdrv_co_pwrite_zeroes = hdev_co_pwrite_zeroes,
|
||||
@@ -3619,8 +3556,6 @@ static BlockDriver bdrv_host_cdrom = {
|
||||
.bdrv_reopen_prepare = raw_reopen_prepare,
|
||||
.bdrv_reopen_commit = raw_reopen_commit,
|
||||
.bdrv_reopen_abort = raw_reopen_abort,
|
||||
- .bdrv_co_create_opts = hdev_co_create_opts,
|
||||
- .create_opts = &raw_create_opts,
|
||||
.mutable_opts = mutable_opts,
|
||||
.bdrv_co_invalidate_cache = raw_co_invalidate_cache,
|
||||
|
||||
@@ -3753,8 +3688,6 @@ static BlockDriver bdrv_host_cdrom = {
|
||||
.bdrv_reopen_prepare = raw_reopen_prepare,
|
||||
.bdrv_reopen_commit = raw_reopen_commit,
|
||||
.bdrv_reopen_abort = raw_reopen_abort,
|
||||
- .bdrv_co_create_opts = hdev_co_create_opts,
|
||||
- .create_opts = &raw_create_opts,
|
||||
.mutable_opts = mutable_opts,
|
||||
|
||||
.bdrv_co_preadv = raw_co_preadv,
|
||||
--
|
||||
1.8.3.1
|
||||
|
@ -1,100 +0,0 @@
|
||||
From cebc614e5ddd1f770c4d6dc26c066791f36e56df Mon Sep 17 00:00:00 2001
|
||||
From: Kevin Wolf <kwolf@redhat.com>
|
||||
Date: Fri, 7 Feb 2020 11:24:02 +0000
|
||||
Subject: [PATCH 05/18] hmp: Allow using qdev ID for qemu-io command
|
||||
|
||||
RH-Author: Kevin Wolf <kwolf@redhat.com>
|
||||
Message-id: <20200207112404.25198-5-kwolf@redhat.com>
|
||||
Patchwork-id: 93750
|
||||
O-Subject: [RHEL-AV-8.2.0 qemu-kvm PATCH v2 4/6] hmp: Allow using qdev ID for qemu-io command
|
||||
Bugzilla: 1781637
|
||||
RH-Acked-by: Sergio Lopez Pascual <slp@redhat.com>
|
||||
RH-Acked-by: Max Reitz <mreitz@redhat.com>
|
||||
RH-Acked-by: Stefan Hajnoczi <stefanha@redhat.com>
|
||||
|
||||
In order to issue requests on an existing BlockBackend with the
|
||||
'qemu-io' HMP command, allow specifying the BlockBackend not only with a
|
||||
BlockBackend name, but also with a qdev ID/QOM path for a device that
|
||||
owns the (possibly anonymous) BlockBackend.
|
||||
|
||||
Because qdev names could be conflicting with BlockBackend and node
|
||||
names, introduce a -d option to explicitly address a device. If the
|
||||
option is not given, a BlockBackend or a node is addressed.
|
||||
|
||||
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
|
||||
(cherry picked from commit 89b6fc45614bb45dcd58f1590415afe5c2791abd)
|
||||
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
|
||||
Signed-off-by: Danilo C. L. de Paula <ddepaula@redhat.com>
|
||||
---
|
||||
hmp-commands.hx | 8 +++++---
|
||||
monitor/hmp-cmds.c | 28 ++++++++++++++++++----------
|
||||
2 files changed, 23 insertions(+), 13 deletions(-)
|
||||
|
||||
diff --git a/hmp-commands.hx b/hmp-commands.hx
|
||||
index cfcc044..dc23185 100644
|
||||
--- a/hmp-commands.hx
|
||||
+++ b/hmp-commands.hx
|
||||
@@ -1875,9 +1875,11 @@ ETEXI
|
||||
|
||||
{
|
||||
.name = "qemu-io",
|
||||
- .args_type = "device:B,command:s",
|
||||
- .params = "[device] \"[command]\"",
|
||||
- .help = "run a qemu-io command on a block device",
|
||||
+ .args_type = "qdev:-d,device:B,command:s",
|
||||
+ .params = "[-d] [device] \"[command]\"",
|
||||
+ .help = "run a qemu-io command on a block device\n\t\t\t"
|
||||
+ "-d: [device] is a device ID rather than a "
|
||||
+ "drive ID or node name",
|
||||
.cmd = hmp_qemu_io,
|
||||
},
|
||||
|
||||
diff --git a/monitor/hmp-cmds.c b/monitor/hmp-cmds.c
|
||||
index b2551c1..5f8941d 100644
|
||||
--- a/monitor/hmp-cmds.c
|
||||
+++ b/monitor/hmp-cmds.c
|
||||
@@ -2468,23 +2468,31 @@ void hmp_qemu_io(Monitor *mon, const QDict *qdict)
|
||||
{
|
||||
BlockBackend *blk;
|
||||
BlockBackend *local_blk = NULL;
|
||||
+ bool qdev = qdict_get_try_bool(qdict, "qdev", false);
|
||||
const char* device = qdict_get_str(qdict, "device");
|
||||
const char* command = qdict_get_str(qdict, "command");
|
||||
Error *err = NULL;
|
||||
int ret;
|
||||
|
||||
- blk = blk_by_name(device);
|
||||
- if (!blk) {
|
||||
- BlockDriverState *bs = bdrv_lookup_bs(NULL, device, &err);
|
||||
- if (bs) {
|
||||
- blk = local_blk = blk_new(bdrv_get_aio_context(bs),
|
||||
- 0, BLK_PERM_ALL);
|
||||
- ret = blk_insert_bs(blk, bs, &err);
|
||||
- if (ret < 0) {
|
||||
+ if (qdev) {
|
||||
+ blk = blk_by_qdev_id(device, &err);
|
||||
+ if (!blk) {
|
||||
+ goto fail;
|
||||
+ }
|
||||
+ } else {
|
||||
+ blk = blk_by_name(device);
|
||||
+ if (!blk) {
|
||||
+ BlockDriverState *bs = bdrv_lookup_bs(NULL, device, &err);
|
||||
+ if (bs) {
|
||||
+ blk = local_blk = blk_new(bdrv_get_aio_context(bs),
|
||||
+ 0, BLK_PERM_ALL);
|
||||
+ ret = blk_insert_bs(blk, bs, &err);
|
||||
+ if (ret < 0) {
|
||||
+ goto fail;
|
||||
+ }
|
||||
+ } else {
|
||||
goto fail;
|
||||
}
|
||||
- } else {
|
||||
- goto fail;
|
||||
}
|
||||
}
|
||||
|
||||
--
|
||||
1.8.3.1
|
||||
|
@ -1,262 +0,0 @@
|
||||
From e6c3fbfc82863180007569cf2a9132c28a47bf1f Mon Sep 17 00:00:00 2001
|
||||
From: "Daniel P. Berrange" <berrange@redhat.com>
|
||||
Date: Mon, 20 Jan 2020 16:13:08 +0000
|
||||
Subject: [PATCH 01/18] hw/smbios: set new default SMBIOS fields for Windows
|
||||
driver support
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
RH-Author: Daniel P. Berrange <berrange@redhat.com>
|
||||
Message-id: <20200120161308.584989-2-berrange@redhat.com>
|
||||
Patchwork-id: 93422
|
||||
O-Subject: [RHEL-AV-8.2.0 qemu-kvm PATCH 1/1] hw/smbios: set new default SMBIOS fields for Windows driver support
|
||||
Bugzilla: 1782529
|
||||
RH-Acked-by: Eduardo Habkost <ehabkost@redhat.com>
|
||||
RH-Acked-by: Igor Mammedov <imammedo@redhat.com>
|
||||
RH-Acked-by: Laszlo Ersek <lersek@redhat.com>
|
||||
|
||||
For Windows driver support, we have to follow this doc in order to
|
||||
enable Windows to automatically determine the right drivers to install
|
||||
for a given guest / host combination:
|
||||
|
||||
https://docs.microsoft.com/en-us/windows-hardware/drivers/install/specifying-hardware-ids-for-a-computer
|
||||
|
||||
Out of the choices available, it was decided that the Windows drivers
|
||||
will be written to expect use of the scheme documented as "HardwareID-6"
|
||||
against Windows 10. This uses SMBIOS System (Type 1) and Base Board
|
||||
(Type 2) tables and will match on
|
||||
|
||||
System Manufacturer = Red Hat
|
||||
System SKU Number = 8.2.0
|
||||
Baseboard Manufacturer = Red Hat
|
||||
Baseboard Product = RHEL-AV
|
||||
|
||||
The new SMBIOS fields will be tied to machine type and only reported for
|
||||
pc-q35-8.2.0 machine and later.
|
||||
|
||||
The old SMBIOS fields, previously reported by all machines were:
|
||||
|
||||
System Manufacturer: Red Hat
|
||||
System Product Name: KVM
|
||||
System Version: RHEL-8.2.0 PC (Q35 + ICH9, 2009)
|
||||
System Family: Red Hat Enterprise Linux
|
||||
Baseboard Manufacturer: Red Hat
|
||||
Baseboard Product Name: KVM
|
||||
Baseboard Version: RHEL-8.2.0 PC (Q35 + ICH9, 2009)
|
||||
Chassis Manufacturer: Red Hat
|
||||
Chassis Product Name: KVM
|
||||
Chassis Version: RHEL-8.2.0 PC (Q35 + ICH9, 2009)
|
||||
Processor Manufacturer: Red Hat
|
||||
Processor Product Name: KVM
|
||||
Processor Version: RHEL-8.2.0 PC (Q35 + ICH9, 2009)
|
||||
|
||||
This information will continue to be reported for all machines, except
|
||||
where it conflicts with the requirement of the new SMBIOS data. IOW,
|
||||
the "Baseboard Product Name" will change to "RHEL-AV" for pc-q35-8.2.0
|
||||
machine types and later.
|
||||
|
||||
Management applications MUST NEVER override the 4 new SMBIOS fields that
|
||||
are used for Windows driver matching, with differing values. Aside from
|
||||
this, they are free to override any other field, including those from
|
||||
the old SMBIOS field data.
|
||||
|
||||
In particular if a management application wants to report its own
|
||||
product name and version, it is recommended to use "System product"
|
||||
and "System version" as identifying fields, as these avoid a clash with
|
||||
the new SMBIOS fields used for Windows drivers.
|
||||
|
||||
Note that until now the Baseboard (type 2) table has only been generated
|
||||
by QEMU if explicitly asked for on the CLI. This patch makes it always
|
||||
present for new machine types.
|
||||
|
||||
Signed-off-by: Daniel P. Berrangé <berrange@redhat.com>
|
||||
Signed-off-by: Danilo C. L. de Paula <ddepaula@redhat.com>
|
||||
---
|
||||
hw/arm/virt.c | 2 +-
|
||||
hw/i386/pc_piix.c | 2 ++
|
||||
hw/i386/pc_q35.c | 8 ++++++++
|
||||
hw/smbios/smbios.c | 45 +++++++++++++++++++++++++++++++++++++++++---
|
||||
include/hw/firmware/smbios.h | 5 ++++-
|
||||
include/hw/i386/pc.h | 3 +++
|
||||
6 files changed, 60 insertions(+), 5 deletions(-)
|
||||
|
||||
diff --git a/hw/arm/virt.c b/hw/arm/virt.c
|
||||
index d30d38c..2dcf6e7 100644
|
||||
--- a/hw/arm/virt.c
|
||||
+++ b/hw/arm/virt.c
|
||||
@@ -1423,7 +1423,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);
|
||||
|
||||
smbios_get_tables(MACHINE(vms), NULL, 0, &smbios_tables, &smbios_tables_len,
|
||||
&smbios_anchor, &smbios_anchor_len);
|
||||
diff --git a/hw/i386/pc_piix.c b/hw/i386/pc_piix.c
|
||||
index bd7fdb9..2ac94d5 100644
|
||||
--- a/hw/i386/pc_piix.c
|
||||
+++ b/hw/i386/pc_piix.c
|
||||
@@ -177,6 +177,8 @@ static void pc_init1(MachineState *machine,
|
||||
smbios_set_defaults("Red Hat", "KVM",
|
||||
mc->desc, pcmc->smbios_legacy_mode,
|
||||
pcmc->smbios_uuid_encoded,
|
||||
+ pcmc->smbios_stream_product,
|
||||
+ pcmc->smbios_stream_version,
|
||||
SMBIOS_ENTRY_POINT_21);
|
||||
}
|
||||
|
||||
diff --git a/hw/i386/pc_q35.c b/hw/i386/pc_q35.c
|
||||
index 7531d8e..e975643 100644
|
||||
--- a/hw/i386/pc_q35.c
|
||||
+++ b/hw/i386/pc_q35.c
|
||||
@@ -200,6 +200,8 @@ static void pc_q35_init(MachineState *machine)
|
||||
smbios_set_defaults("Red Hat", "KVM",
|
||||
mc->desc, pcmc->smbios_legacy_mode,
|
||||
pcmc->smbios_uuid_encoded,
|
||||
+ pcmc->smbios_stream_product,
|
||||
+ pcmc->smbios_stream_version,
|
||||
SMBIOS_ENTRY_POINT_21);
|
||||
}
|
||||
|
||||
@@ -565,8 +567,11 @@ static void pc_q35_init_rhel820(MachineState *machine)
|
||||
|
||||
static void pc_q35_machine_rhel820_options(MachineClass *m)
|
||||
{
|
||||
+ PCMachineClass *pcmc = PC_MACHINE_CLASS(m);
|
||||
pc_q35_machine_rhel_options(m);
|
||||
m->desc = "RHEL-8.2.0 PC (Q35 + ICH9, 2009)";
|
||||
+ pcmc->smbios_stream_product = "RHEL-AV";
|
||||
+ pcmc->smbios_stream_version = "8.2.0";
|
||||
}
|
||||
|
||||
DEFINE_PC_MACHINE(q35_rhel820, "pc-q35-rhel8.2.0", pc_q35_init_rhel820,
|
||||
@@ -579,9 +584,12 @@ static void pc_q35_init_rhel810(MachineState *machine)
|
||||
|
||||
static void pc_q35_machine_rhel810_options(MachineClass *m)
|
||||
{
|
||||
+ PCMachineClass *pcmc = PC_MACHINE_CLASS(m);
|
||||
pc_q35_machine_rhel820_options(m);
|
||||
m->desc = "RHEL-8.1.0 PC (Q35 + ICH9, 2009)";
|
||||
m->alias = NULL;
|
||||
+ pcmc->smbios_stream_product = NULL;
|
||||
+ pcmc->smbios_stream_version = NULL;
|
||||
compat_props_add(m->compat_props, hw_compat_rhel_8_1, hw_compat_rhel_8_1_len);
|
||||
compat_props_add(m->compat_props, pc_rhel_8_1_compat, pc_rhel_8_1_compat_len);
|
||||
}
|
||||
diff --git a/hw/smbios/smbios.c b/hw/smbios/smbios.c
|
||||
index e6e9355..d65c149 100644
|
||||
--- a/hw/smbios/smbios.c
|
||||
+++ b/hw/smbios/smbios.c
|
||||
@@ -57,6 +57,9 @@ static bool smbios_legacy = true;
|
||||
static bool smbios_uuid_encoded = true;
|
||||
/* end: legacy structures & constants for <= 2.0 machines */
|
||||
|
||||
+/* Set to true for modern Windows 10 HardwareID-6 compat */
|
||||
+static bool smbios_type2_required;
|
||||
+
|
||||
|
||||
uint8_t *smbios_tables;
|
||||
size_t smbios_tables_len;
|
||||
@@ -532,7 +535,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_TABLE_SET_STR(2, manufacturer_str, type2.manufacturer);
|
||||
SMBIOS_TABLE_SET_STR(2, product_str, type2.product);
|
||||
@@ -753,7 +756,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,
|
||||
- bool uuid_encoded, SmbiosEntryPointType ep_type)
|
||||
+ bool uuid_encoded,
|
||||
+ const char *stream_product,
|
||||
+ const char *stream_version,
|
||||
+ SmbiosEntryPointType ep_type)
|
||||
{
|
||||
smbios_have_defaults = true;
|
||||
smbios_legacy = legacy_mode;
|
||||
@@ -774,12 +780,45 @@ void smbios_set_defaults(const char *manufacturer, const char *product,
|
||||
g_free(smbios_entries);
|
||||
}
|
||||
|
||||
+ /*
|
||||
+ * If @stream_product & @stream_version are non-NULL, then
|
||||
+ * we're following rules for new Windows driver support.
|
||||
+ * The data we have to report is defined in this doc:
|
||||
+ *
|
||||
+ * https://docs.microsoft.com/en-us/windows-hardware/drivers/install/specifying-hardware-ids-for-a-computer
|
||||
+ *
|
||||
+ * The Windows drivers are written to expect use of the
|
||||
+ * scheme documented as "HardwareID-6" against Windows 10,
|
||||
+ * which uses SMBIOS System (Type 1) and Base Board (Type 2)
|
||||
+ * tables and will match on
|
||||
+ *
|
||||
+ * System Manufacturer = Red Hat (@manufacturer)
|
||||
+ * System SKU Number = 8.2.0 (@stream_version)
|
||||
+ * Baseboard Manufacturer = Red Hat (@manufacturer)
|
||||
+ * Baseboard Product = RHEL-AV (@stream_product)
|
||||
+ *
|
||||
+ * NB, SKU must be changed with each RHEL-AV release
|
||||
+ *
|
||||
+ * Other fields can be freely used by applications using
|
||||
+ * QEMU. For example apps can use the "System product"
|
||||
+ * and "System version" to identify themselves.
|
||||
+ *
|
||||
+ * We get 'System Manufacturer' and 'Baseboard Manufacturer'
|
||||
+ */
|
||||
SMBIOS_SET_DEFAULT(type1.manufacturer, manufacturer);
|
||||
SMBIOS_SET_DEFAULT(type1.product, product);
|
||||
SMBIOS_SET_DEFAULT(type1.version, version);
|
||||
SMBIOS_SET_DEFAULT(type1.family, "Red Hat Enterprise Linux");
|
||||
+ if (stream_version != NULL) {
|
||||
+ SMBIOS_SET_DEFAULT(type1.sku, stream_version);
|
||||
+ }
|
||||
SMBIOS_SET_DEFAULT(type2.manufacturer, manufacturer);
|
||||
- SMBIOS_SET_DEFAULT(type2.product, product);
|
||||
+ if (stream_product != NULL) {
|
||||
+ SMBIOS_SET_DEFAULT(type2.product, stream_product);
|
||||
+ smbios_type2_required = true;
|
||||
+ } else {
|
||||
+ SMBIOS_SET_DEFAULT(type2.product, product);
|
||||
+ }
|
||||
SMBIOS_SET_DEFAULT(type2.version, version);
|
||||
SMBIOS_SET_DEFAULT(type3.manufacturer, manufacturer);
|
||||
SMBIOS_SET_DEFAULT(type3.version, version);
|
||||
diff --git a/include/hw/firmware/smbios.h b/include/hw/firmware/smbios.h
|
||||
index 02a0ced..67e38a1 100644
|
||||
--- a/include/hw/firmware/smbios.h
|
||||
+++ b/include/hw/firmware/smbios.h
|
||||
@@ -267,7 +267,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,
|
||||
- bool uuid_encoded, SmbiosEntryPointType ep_type);
|
||||
+ bool uuid_encoded,
|
||||
+ const char *stream_product,
|
||||
+ const char *stream_version,
|
||||
+ SmbiosEntryPointType ep_type);
|
||||
uint8_t *smbios_get_table_legacy(MachineState *ms, size_t *length);
|
||||
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 2e362c8..b9f29ba 100644
|
||||
--- a/include/hw/i386/pc.h
|
||||
+++ b/include/hw/i386/pc.h
|
||||
@@ -109,6 +109,9 @@ typedef struct PCMachineClass {
|
||||
bool smbios_defaults;
|
||||
bool smbios_legacy_mode;
|
||||
bool smbios_uuid_encoded;
|
||||
+ /* New fields needed for Windows HardwareID-6 matching */
|
||||
+ const char *smbios_stream_product;
|
||||
+ const char *smbios_stream_version;
|
||||
|
||||
/* RAM / address space compat: */
|
||||
bool gigabyte_align;
|
||||
--
|
||||
1.8.3.1
|
||||
|
@ -1,77 +0,0 @@
|
||||
From 4543a3c19816bd07f27eb900f20ae609df03703c Mon Sep 17 00:00:00 2001
|
||||
From: Eduardo Habkost <ehabkost@redhat.com>
|
||||
Date: Mon, 23 Dec 2019 21:10:31 +0000
|
||||
Subject: [PATCH 1/2] i386: Remove cpu64-rhel6 CPU model
|
||||
|
||||
RH-Author: Eduardo Habkost <ehabkost@redhat.com>
|
||||
Message-id: <20191223211031.26503-1-ehabkost@redhat.com>
|
||||
Patchwork-id: 93213
|
||||
O-Subject: [RHEL-AV-8.2.0 qemu-kvm PATCH] i386: Remove cpu64-rhel6 CPU model
|
||||
Bugzilla: 1741345
|
||||
RH-Acked-by: Daniel P. Berrange <berrange@redhat.com>
|
||||
RH-Acked-by: Dr. David Alan Gilbert <dgilbert@redhat.com>
|
||||
RH-Acked-by: Laszlo Ersek <lersek@redhat.com>
|
||||
|
||||
Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1741345
|
||||
BRANCH: rhel-av-8.2.0
|
||||
Upstream: not applicable
|
||||
Brew: https://brewweb.engineering.redhat.com/brew/taskinfo?taskID=25525975
|
||||
|
||||
We don't provide rhel6 machine types anymore, so we don't need to
|
||||
provide compatibility with RHEl6. cpu64-rhel6 was documented as
|
||||
deprecated and scheduled for removal in 8.2, so now it's time to
|
||||
remove it.
|
||||
|
||||
Signed-off-by: Eduardo Habkost <ehabkost@redhat.com>
|
||||
Signed-off-by: Danilo C. L. de Paula <ddepaula@redhat.com>
|
||||
---
|
||||
target/i386/cpu.c | 26 +-------------------------
|
||||
1 file changed, 1 insertion(+), 25 deletions(-)
|
||||
|
||||
diff --git a/target/i386/cpu.c b/target/i386/cpu.c
|
||||
index 790db77..6dce6f2 100644
|
||||
--- a/target/i386/cpu.c
|
||||
+++ b/target/i386/cpu.c
|
||||
@@ -1829,12 +1829,7 @@ static CPUCaches epyc_cache_info = {
|
||||
|
||||
static X86CPUDefinition builtin_x86_defs[] = {
|
||||
{
|
||||
- /* qemu64 is the default CPU model for all *-rhel7.* machine-types.
|
||||
- * The default on RHEL-6 was cpu64-rhel6.
|
||||
- * libvirt assumes that qemu64 is the default for _all_ machine-types,
|
||||
- * so we should try to keep qemu64 and cpu64-rhel6 as similar as
|
||||
- * possible.
|
||||
- */
|
||||
+ /* qemu64 is the default CPU model for all machine-types */
|
||||
.name = "qemu64",
|
||||
.level = 0xd,
|
||||
.vendor = CPUID_VENDOR_AMD,
|
||||
@@ -2135,25 +2130,6 @@ static X86CPUDefinition builtin_x86_defs[] = {
|
||||
.model_id = "Intel(R) Atom(TM) CPU N270 @ 1.60GHz",
|
||||
},
|
||||
{
|
||||
- .name = "cpu64-rhel6",
|
||||
- .level = 4,
|
||||
- .vendor = CPUID_VENDOR_AMD,
|
||||
- .family = 6,
|
||||
- .model = 13,
|
||||
- .stepping = 3,
|
||||
- .features[FEAT_1_EDX] = CPUID_SSE2 | CPUID_SSE | CPUID_FXSR |
|
||||
- CPUID_MMX | CPUID_CLFLUSH | CPUID_PSE36 | CPUID_PAT | CPUID_CMOV |
|
||||
- CPUID_MCA | CPUID_PGE | CPUID_MTRR | CPUID_SEP | CPUID_APIC |
|
||||
- CPUID_CX8 | CPUID_MCE | CPUID_PAE | CPUID_MSR | CPUID_TSC |
|
||||
- CPUID_PSE | CPUID_DE | CPUID_FP87,
|
||||
- .features[FEAT_1_ECX] = CPUID_EXT_CX16 | CPUID_EXT_SSE3,
|
||||
- .features[FEAT_8000_0001_EDX] = CPUID_EXT2_LM | CPUID_EXT2_NX | CPUID_EXT2_SYSCALL,
|
||||
- .features[FEAT_8000_0001_ECX] = CPUID_EXT3_SSE4A | CPUID_EXT3_ABM |
|
||||
- CPUID_EXT3_SVM | CPUID_EXT3_LAHF_LM,
|
||||
- .xlevel = 0x8000000A,
|
||||
- .model_id = "QEMU Virtual CPU version (cpu64-rhel6)",
|
||||
- },
|
||||
- {
|
||||
.name = "Conroe",
|
||||
.level = 10,
|
||||
.vendor = CPUID_VENDOR_INTEL,
|
||||
--
|
||||
1.8.3.1
|
||||
|
@ -1,95 +0,0 @@
|
||||
From ccda4494b0ea4b81b6b0c3e539a0bcf7e673c68c Mon Sep 17 00:00:00 2001
|
||||
From: Eduardo Habkost <ehabkost@redhat.com>
|
||||
Date: Thu, 5 Dec 2019 21:56:50 +0000
|
||||
Subject: [PATCH 01/18] i386: Resolve CPU models to v1 by default
|
||||
|
||||
RH-Author: Eduardo Habkost <ehabkost@redhat.com>
|
||||
Message-id: <20191205225650.772600-2-ehabkost@redhat.com>
|
||||
Patchwork-id: 92907
|
||||
O-Subject: [RHEL-AV-8.1.1 qemu-kvm PATCH 1/1] i386: Resolve CPU models to v1 by default
|
||||
Bugzilla: 1787291 1779078 1779078
|
||||
RH-Acked-by: Danilo de Paula <ddepaula@redhat.com>
|
||||
RH-Acked-by: Igor Mammedov <imammedo@redhat.com>
|
||||
RH-Acked-by: Paolo Bonzini <pbonzini@redhat.com>
|
||||
|
||||
Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1779078
|
||||
Brew: https://brewweb.engineering.redhat.com/brew/taskinfo?taskID=25187823
|
||||
Upstream: submitted, Message-Id: <20191205223339.764534-1-ehabkost@redhat.com>
|
||||
|
||||
When using `query-cpu-definitions` using `-machine none`,
|
||||
QEMU is resolving all CPU models to their latest versions. The
|
||||
actual CPU model version being used by another machine type (e.g.
|
||||
`pc-q35-4.0`) might be different.
|
||||
|
||||
In theory, this was OK because the correct CPU model
|
||||
version is returned when using the correct `-machine` argument.
|
||||
|
||||
Except that in practice, this breaks libvirt expectations:
|
||||
libvirt always use `-machine none` when checking if a CPU model
|
||||
is runnable, because runnability is not expected to be affected
|
||||
when the machine type is changed.
|
||||
|
||||
For example, when running on a Haswell host without TSX,
|
||||
Haswell-v4 is runnable, but Haswell-v1 is not. On those hosts,
|
||||
`query-cpu-definitions` says Haswell is runnable if using
|
||||
`-machine none`, but Haswell is actually not runnable using any
|
||||
of the `pc-*` machine types (because they resolve Haswell to
|
||||
Haswell-v1). In other words, we're breaking the "runnability
|
||||
guarantee" we promised to not break for a few releases (see
|
||||
qemu-deprecated.texi).
|
||||
|
||||
To address this issue, change the default CPU model version to v1
|
||||
on all machine types, so we make `query-cpu-definitions` output
|
||||
when using `-machine none` match the results when using `pc-*`.
|
||||
This will change in the future (the plan is to always return the
|
||||
latest CPU model version if using `-machine none`), but only
|
||||
after giving libvirt the opportunity to adapt.
|
||||
|
||||
Fixes: https://bugzilla.redhat.com/show_bug.cgi?id=1779078
|
||||
Signed-off-by: Eduardo Habkost <ehabkost@redhat.com>
|
||||
Signed-off-by: Danilo C. L. de Paula <ddepaula@redhat.com>
|
||||
---
|
||||
qemu-deprecated.texi | 7 +++++++
|
||||
target/i386/cpu.c | 8 +++++++-
|
||||
2 files changed, 14 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/qemu-deprecated.texi b/qemu-deprecated.texi
|
||||
index 4b4b742..534ebe9 100644
|
||||
--- a/qemu-deprecated.texi
|
||||
+++ b/qemu-deprecated.texi
|
||||
@@ -374,6 +374,13 @@ guarantees must resolve the CPU model aliases using te
|
||||
``alias-of'' field returned by the ``query-cpu-definitions'' QMP
|
||||
command.
|
||||
|
||||
+While those guarantees are kept, the return value of
|
||||
+``query-cpu-definitions'' will have existing CPU model aliases
|
||||
+point to a version that doesn't break runnability guarantees
|
||||
+(specifically, version 1 of those CPU models). In future QEMU
|
||||
+versions, aliases will point to newer CPU model versions
|
||||
+depending on the machine type, so management software must
|
||||
+resolve CPU model aliases before starting a virtual machine.
|
||||
|
||||
@node Recently removed features
|
||||
@appendix Recently removed features
|
||||
diff --git a/target/i386/cpu.c b/target/i386/cpu.c
|
||||
index 6dce6f2..863192c 100644
|
||||
--- a/target/i386/cpu.c
|
||||
+++ b/target/i386/cpu.c
|
||||
@@ -3926,7 +3926,13 @@ static PropValue tcg_default_props[] = {
|
||||
};
|
||||
|
||||
|
||||
-X86CPUVersion default_cpu_version = CPU_VERSION_LATEST;
|
||||
+/*
|
||||
+ * We resolve CPU model aliases using -v1 when using "-machine
|
||||
+ * none", but this is just for compatibility while libvirt isn't
|
||||
+ * adapted to resolve CPU model versions before creating VMs.
|
||||
+ * See "Runnability guarantee of CPU models" at * qemu-deprecated.texi.
|
||||
+ */
|
||||
+X86CPUVersion default_cpu_version = 1;
|
||||
|
||||
void x86_cpu_set_default_version(X86CPUVersion version)
|
||||
{
|
||||
--
|
||||
1.8.3.1
|
||||
|
@ -1,147 +0,0 @@
|
||||
From 2366cd9066e79d6c93a3a28710aea987b2c8f454 Mon Sep 17 00:00:00 2001
|
||||
From: Kevin Wolf <kwolf@redhat.com>
|
||||
Date: Fri, 13 Mar 2020 12:34:38 +0000
|
||||
Subject: [PATCH 18/20] iotests: Add iothread cases to 155
|
||||
|
||||
RH-Author: Kevin Wolf <kwolf@redhat.com>
|
||||
Message-id: <20200313123439.10548-13-kwolf@redhat.com>
|
||||
Patchwork-id: 94289
|
||||
O-Subject: [RHEL-AV-8.2.0 qemu-kvm PATCH v2 12/13] iotests: Add iothread cases to 155
|
||||
Bugzilla: 1790482 1805143
|
||||
RH-Acked-by: John Snow <jsnow@redhat.com>
|
||||
RH-Acked-by: Daniel P. Berrange <berrange@redhat.com>
|
||||
RH-Acked-by: Peter Krempa <pkrempa@redhat.com>
|
||||
|
||||
This patch adds test cases for attaching the backing chain to a mirror
|
||||
job target right before finalising the job, where the image is in a
|
||||
non-mainloop AioContext (i.e. the backing chain needs to be moved to the
|
||||
AioContext of the mirror target).
|
||||
|
||||
This requires switching the test case from virtio-blk to virtio-scsi
|
||||
because virtio-blk only actually starts using the iothreads when the
|
||||
guest driver initialises the device (which never happens in a test case
|
||||
without a guest OS). virtio-scsi always keeps its block nodes in the
|
||||
AioContext of the the requested iothread without guest interaction.
|
||||
|
||||
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
|
||||
Message-Id: <20200310113831.27293-7-kwolf@redhat.com>
|
||||
Reviewed-by: Peter Krempa <pkrempa@redhat.com>
|
||||
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
|
||||
(cherry picked from commit 6a5f6403a11307794ec79d277a065c137cfc12b2)
|
||||
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
|
||||
Signed-off-by: Danilo C. L. de Paula <ddepaula@redhat.com>
|
||||
---
|
||||
tests/qemu-iotests/155 | 32 +++++++++++++++++++++++---------
|
||||
tests/qemu-iotests/155.out | 4 ++--
|
||||
2 files changed, 25 insertions(+), 11 deletions(-)
|
||||
|
||||
diff --git a/tests/qemu-iotests/155 b/tests/qemu-iotests/155
|
||||
index 3053e50..b552d1f 100755
|
||||
--- a/tests/qemu-iotests/155
|
||||
+++ b/tests/qemu-iotests/155
|
||||
@@ -49,11 +49,14 @@ target_img = os.path.join(iotests.test_dir, 'target.' + iotests.imgfmt)
|
||||
# chain opened right away. If False, blockdev-add
|
||||
# opens it without a backing file and job completion
|
||||
# is supposed to open the backing chain.
|
||||
+# use_iothread: If True, an iothread is configured for the virtio-blk device
|
||||
+# that uses the image being mirrored
|
||||
|
||||
class BaseClass(iotests.QMPTestCase):
|
||||
target_blockdev_backing = None
|
||||
target_real_backing = None
|
||||
target_open_with_backing = True
|
||||
+ use_iothread = False
|
||||
|
||||
def setUp(self):
|
||||
qemu_img('create', '-f', iotests.imgfmt, back0_img, '1440K')
|
||||
@@ -69,7 +72,16 @@ class BaseClass(iotests.QMPTestCase):
|
||||
'file': {'driver': 'file',
|
||||
'filename': source_img}}
|
||||
self.vm.add_blockdev(self.vm.qmp_to_opts(blockdev))
|
||||
- self.vm.add_device('virtio-blk,id=qdev0,drive=source')
|
||||
+
|
||||
+ if self.use_iothread:
|
||||
+ self.vm.add_object('iothread,id=iothread0')
|
||||
+ iothread = ",iothread=iothread0"
|
||||
+ else:
|
||||
+ iothread = ""
|
||||
+
|
||||
+ self.vm.add_device('virtio-scsi%s' % iothread)
|
||||
+ self.vm.add_device('scsi-hd,id=qdev0,drive=source')
|
||||
+
|
||||
self.vm.launch()
|
||||
|
||||
self.assertIntactSourceBackingChain()
|
||||
@@ -182,24 +194,21 @@ class MirrorBaseClass(BaseClass):
|
||||
def testFull(self):
|
||||
self.runMirror('full')
|
||||
|
||||
- node = self.findBlockNode('target',
|
||||
- '/machine/peripheral/qdev0/virtio-backend')
|
||||
+ node = self.findBlockNode('target', 'qdev0')
|
||||
self.assertCorrectBackingImage(node, None)
|
||||
self.assertIntactSourceBackingChain()
|
||||
|
||||
def testTop(self):
|
||||
self.runMirror('top')
|
||||
|
||||
- node = self.findBlockNode('target',
|
||||
- '/machine/peripheral/qdev0/virtio-backend')
|
||||
+ node = self.findBlockNode('target', 'qdev0')
|
||||
self.assertCorrectBackingImage(node, back2_img)
|
||||
self.assertIntactSourceBackingChain()
|
||||
|
||||
def testNone(self):
|
||||
self.runMirror('none')
|
||||
|
||||
- node = self.findBlockNode('target',
|
||||
- '/machine/peripheral/qdev0/virtio-backend')
|
||||
+ node = self.findBlockNode('target', 'qdev0')
|
||||
self.assertCorrectBackingImage(node, source_img)
|
||||
self.assertIntactSourceBackingChain()
|
||||
|
||||
@@ -252,6 +261,9 @@ class TestBlockdevMirrorReopen(MirrorBaseClass):
|
||||
backing="backing")
|
||||
self.assert_qmp(result, 'return', {})
|
||||
|
||||
+class TestBlockdevMirrorReopenIothread(TestBlockdevMirrorReopen):
|
||||
+ use_iothread = True
|
||||
+
|
||||
# Attach the backing chain only during completion, with blockdev-snapshot
|
||||
class TestBlockdevMirrorSnapshot(MirrorBaseClass):
|
||||
cmd = 'blockdev-mirror'
|
||||
@@ -268,6 +280,9 @@ class TestBlockdevMirrorSnapshot(MirrorBaseClass):
|
||||
overlay="target")
|
||||
self.assert_qmp(result, 'return', {})
|
||||
|
||||
+class TestBlockdevMirrorSnapshotIothread(TestBlockdevMirrorSnapshot):
|
||||
+ use_iothread = True
|
||||
+
|
||||
class TestCommit(BaseClass):
|
||||
existing = False
|
||||
|
||||
@@ -283,8 +298,7 @@ class TestCommit(BaseClass):
|
||||
|
||||
self.vm.event_wait('BLOCK_JOB_COMPLETED')
|
||||
|
||||
- node = self.findBlockNode(None,
|
||||
- '/machine/peripheral/qdev0/virtio-backend')
|
||||
+ node = self.findBlockNode(None, 'qdev0')
|
||||
self.assert_qmp(node, 'image' + '/backing-image' * 0 + '/filename',
|
||||
back1_img)
|
||||
self.assert_qmp(node, 'image' + '/backing-image' * 1 + '/filename',
|
||||
diff --git a/tests/qemu-iotests/155.out b/tests/qemu-iotests/155.out
|
||||
index 4fd1c2d..ed714d5 100644
|
||||
--- a/tests/qemu-iotests/155.out
|
||||
+++ b/tests/qemu-iotests/155.out
|
||||
@@ -1,5 +1,5 @@
|
||||
-.........................
|
||||
+...............................
|
||||
----------------------------------------------------------------------
|
||||
-Ran 25 tests
|
||||
+Ran 31 tests
|
||||
|
||||
OK
|
||||
--
|
||||
1.8.3.1
|
||||
|
@ -1,138 +0,0 @@
|
||||
From 55f3a02574da226299d99bd74d12dd91b0f228dc Mon Sep 17 00:00:00 2001
|
||||
From: Maxim Levitsky <mlevitsk@redhat.com>
|
||||
Date: Wed, 11 Mar 2020 10:51:46 +0000
|
||||
Subject: [PATCH 05/20] iotests: Add test for image creation fallback
|
||||
|
||||
RH-Author: Maxim Levitsky <mlevitsk@redhat.com>
|
||||
Message-id: <20200311105147.13208-6-mlevitsk@redhat.com>
|
||||
Patchwork-id: 94228
|
||||
O-Subject: [RHEL-AV-8.2.0 qemu-kvm PATCH v2 5/6] iotests: Add test for image creation fallback
|
||||
Bugzilla: 1640894
|
||||
RH-Acked-by: Stefano Garzarella <sgarzare@redhat.com>
|
||||
RH-Acked-by: John Snow <jsnow@redhat.com>
|
||||
RH-Acked-by: Max Reitz <mreitz@redhat.com>
|
||||
|
||||
From: Max Reitz <mreitz@redhat.com>
|
||||
|
||||
Signed-off-by: Max Reitz <mreitz@redhat.com>
|
||||
Message-Id: <20200122164532.178040-6-mreitz@redhat.com>
|
||||
Reviewed-by: Eric Blake <eblake@redhat.com>
|
||||
Reviewed-by: Maxim Levitsky <mlevitsk@redhat.com>
|
||||
[mreitz: Added a note that NBD does not support resizing, which is why
|
||||
the second case is expected to fail]
|
||||
Signed-off-by: Max Reitz <mreitz@redhat.com>
|
||||
(cherry picked from commit 4dddeac115c5a2c5f74731fda0afd031a0b45490)
|
||||
Signed-off-by: Maxim Levitsky <mlevitsk@redhat.com>
|
||||
|
||||
Signed-off-by: Danilo C. L. de Paula <ddepaula@redhat.com>
|
||||
---
|
||||
tests/qemu-iotests/259 | 62 ++++++++++++++++++++++++++++++++++++++++++++++
|
||||
tests/qemu-iotests/259.out | 14 +++++++++++
|
||||
tests/qemu-iotests/group | 1 +
|
||||
3 files changed, 77 insertions(+)
|
||||
create mode 100755 tests/qemu-iotests/259
|
||||
create mode 100644 tests/qemu-iotests/259.out
|
||||
|
||||
diff --git a/tests/qemu-iotests/259 b/tests/qemu-iotests/259
|
||||
new file mode 100755
|
||||
index 0000000..62e29af
|
||||
--- /dev/null
|
||||
+++ b/tests/qemu-iotests/259
|
||||
@@ -0,0 +1,62 @@
|
||||
+#!/usr/bin/env bash
|
||||
+#
|
||||
+# Test generic image creation fallback (by using NBD)
|
||||
+#
|
||||
+# Copyright (C) 2019 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/>.
|
||||
+#
|
||||
+
|
||||
+# creator
|
||||
+owner=mreitz@redhat.com
|
||||
+
|
||||
+seq=$(basename $0)
|
||||
+echo "QA output created by $seq"
|
||||
+
|
||||
+status=1 # failure is the default!
|
||||
+
|
||||
+_cleanup()
|
||||
+{
|
||||
+ _cleanup_test_img
|
||||
+}
|
||||
+trap "_cleanup; exit \$status" 0 1 2 3 15
|
||||
+
|
||||
+# get standard environment, filters and checks
|
||||
+. ./common.rc
|
||||
+. ./common.filter
|
||||
+
|
||||
+_supported_fmt raw
|
||||
+_supported_proto nbd
|
||||
+_supported_os Linux
|
||||
+
|
||||
+
|
||||
+_make_test_img 64M
|
||||
+
|
||||
+echo
|
||||
+echo '--- Testing creation ---'
|
||||
+
|
||||
+$QEMU_IMG create -f qcow2 "$TEST_IMG" 64M | _filter_img_create
|
||||
+$QEMU_IMG info "$TEST_IMG" | _filter_img_info
|
||||
+
|
||||
+echo
|
||||
+echo '--- Testing creation for which the node would need to grow ---'
|
||||
+
|
||||
+# NBD does not support resizing, so this will fail
|
||||
+$QEMU_IMG create -f qcow2 -o preallocation=metadata "$TEST_IMG" 64M 2>&1 \
|
||||
+ | _filter_img_create
|
||||
+
|
||||
+# success, all done
|
||||
+echo "*** done"
|
||||
+rm -f $seq.full
|
||||
+status=0
|
||||
diff --git a/tests/qemu-iotests/259.out b/tests/qemu-iotests/259.out
|
||||
new file mode 100644
|
||||
index 0000000..ffed19c
|
||||
--- /dev/null
|
||||
+++ b/tests/qemu-iotests/259.out
|
||||
@@ -0,0 +1,14 @@
|
||||
+QA output created by 259
|
||||
+Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=67108864
|
||||
+
|
||||
+--- Testing creation ---
|
||||
+Formatting 'TEST_DIR/t.IMGFMT', fmt=qcow2 size=67108864
|
||||
+image: TEST_DIR/t.IMGFMT
|
||||
+file format: qcow2
|
||||
+virtual size: 64 MiB (67108864 bytes)
|
||||
+disk size: unavailable
|
||||
+
|
||||
+--- Testing creation for which the node would need to grow ---
|
||||
+qemu-img: TEST_DIR/t.IMGFMT: Could not resize image: Image format driver does not support resize
|
||||
+Formatting 'TEST_DIR/t.IMGFMT', fmt=qcow2 size=67108864 preallocation=metadata
|
||||
+*** done
|
||||
diff --git a/tests/qemu-iotests/group b/tests/qemu-iotests/group
|
||||
index c0e8197..e47cbfc 100644
|
||||
--- a/tests/qemu-iotests/group
|
||||
+++ b/tests/qemu-iotests/group
|
||||
@@ -273,6 +273,7 @@
|
||||
256 rw quick
|
||||
257 rw
|
||||
258 rw quick
|
||||
+259 rw auto quick
|
||||
260 rw quick
|
||||
261 rw
|
||||
262 rw quick migration
|
||||
--
|
||||
1.8.3.1
|
||||
|
@ -1,59 +0,0 @@
|
||||
From 05fedde1374abb180cd2b51457385d8128aa7fe4 Mon Sep 17 00:00:00 2001
|
||||
From: Kevin Wolf <kwolf@redhat.com>
|
||||
Date: Fri, 7 Feb 2020 11:24:00 +0000
|
||||
Subject: [PATCH 03/18] iotests: Create VM.blockdev_create()
|
||||
|
||||
RH-Author: Kevin Wolf <kwolf@redhat.com>
|
||||
Message-id: <20200207112404.25198-3-kwolf@redhat.com>
|
||||
Patchwork-id: 93748
|
||||
O-Subject: [RHEL-AV-8.2.0 qemu-kvm PATCH v2 2/6] iotests: Create VM.blockdev_create()
|
||||
Bugzilla: 1781637
|
||||
RH-Acked-by: Sergio Lopez Pascual <slp@redhat.com>
|
||||
RH-Acked-by: Max Reitz <mreitz@redhat.com>
|
||||
RH-Acked-by: Stefan Hajnoczi <stefanha@redhat.com>
|
||||
|
||||
We have several almost identical copies of a blockdev_create() function
|
||||
in different test cases. Time to create one unified function in
|
||||
iotests.py.
|
||||
|
||||
To keep the diff managable, this patch only creates the function and
|
||||
follow-up patches will convert the individual test cases.
|
||||
|
||||
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
|
||||
(cherry picked from commit e9dbd1cae86f7cb6f8e470e1485aeb0c6e23ae64)
|
||||
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
|
||||
Signed-off-by: Danilo C. L. de Paula <ddepaula@redhat.com>
|
||||
---
|
||||
tests/qemu-iotests/iotests.py | 16 ++++++++++++++++
|
||||
1 file changed, 16 insertions(+)
|
||||
|
||||
diff --git a/tests/qemu-iotests/iotests.py b/tests/qemu-iotests/iotests.py
|
||||
index 3cff671..5741efb 100644
|
||||
--- a/tests/qemu-iotests/iotests.py
|
||||
+++ b/tests/qemu-iotests/iotests.py
|
||||
@@ -638,6 +638,22 @@ class VM(qtest.QEMUQtestMachine):
|
||||
elif status == 'null':
|
||||
return error
|
||||
|
||||
+ # Returns None on success, and an error string on failure
|
||||
+ def blockdev_create(self, options, job_id='job0', filters=None):
|
||||
+ if filters is None:
|
||||
+ filters = [filter_qmp_testfiles]
|
||||
+ result = self.qmp_log('blockdev-create', filters=filters,
|
||||
+ job_id=job_id, options=options)
|
||||
+
|
||||
+ if 'return' in result:
|
||||
+ assert result['return'] == {}
|
||||
+ job_result = self.run_job(job_id)
|
||||
+ else:
|
||||
+ job_result = result['error']
|
||||
+
|
||||
+ log("")
|
||||
+ return job_result
|
||||
+
|
||||
def enable_migration_events(self, name):
|
||||
log('Enabling migration QMP events on %s...' % name)
|
||||
log(self.qmp('migrate-set-capabilities', capabilities=[
|
||||
--
|
||||
1.8.3.1
|
||||
|
@ -1,47 +0,0 @@
|
||||
From bb7b968a02c97564596b73d8d080cd745d96ed6b Mon Sep 17 00:00:00 2001
|
||||
From: Kevin Wolf <kwolf@redhat.com>
|
||||
Date: Fri, 13 Mar 2020 12:34:35 +0000
|
||||
Subject: [PATCH 15/20] iotests: Fix run_job() with use_log=False
|
||||
|
||||
RH-Author: Kevin Wolf <kwolf@redhat.com>
|
||||
Message-id: <20200313123439.10548-10-kwolf@redhat.com>
|
||||
Patchwork-id: 94284
|
||||
O-Subject: [RHEL-AV-8.2.0 qemu-kvm PATCH v2 09/13] iotests: Fix run_job() with use_log=False
|
||||
Bugzilla: 1790482 1805143
|
||||
RH-Acked-by: John Snow <jsnow@redhat.com>
|
||||
RH-Acked-by: Daniel P. Berrange <berrange@redhat.com>
|
||||
RH-Acked-by: Peter Krempa <pkrempa@redhat.com>
|
||||
|
||||
The 'job-complete' QMP command should be run with qmp() rather than
|
||||
qmp_log() if use_log=False is passed.
|
||||
|
||||
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
|
||||
Message-Id: <20200310113831.27293-4-kwolf@redhat.com>
|
||||
Reviewed-by: Peter Krempa <pkrempa@redhat.com>
|
||||
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
|
||||
(cherry picked from commit b31b532122ec6f68d17168449c034d2197bf96ec)
|
||||
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
|
||||
Signed-off-by: Danilo C. L. de Paula <ddepaula@redhat.com>
|
||||
---
|
||||
tests/qemu-iotests/iotests.py | 5 ++++-
|
||||
1 file changed, 4 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/tests/qemu-iotests/iotests.py b/tests/qemu-iotests/iotests.py
|
||||
index 0c55f7b..46f880c 100644
|
||||
--- a/tests/qemu-iotests/iotests.py
|
||||
+++ b/tests/qemu-iotests/iotests.py
|
||||
@@ -618,7 +618,10 @@ class VM(qtest.QEMUQtestMachine):
|
||||
if use_log:
|
||||
log('Job failed: %s' % (j['error']))
|
||||
elif status == 'ready':
|
||||
- self.qmp_log('job-complete', id=job)
|
||||
+ if use_log:
|
||||
+ self.qmp_log('job-complete', id=job)
|
||||
+ else:
|
||||
+ self.qmp('job-complete', id=job)
|
||||
elif status == 'pending' and not auto_finalize:
|
||||
if pre_finalize:
|
||||
pre_finalize()
|
||||
--
|
||||
1.8.3.1
|
||||
|
@ -1,122 +0,0 @@
|
||||
From 7e23b64dc20b64ca6fa887cd06cc5e52374f6268 Mon Sep 17 00:00:00 2001
|
||||
From: Kevin Wolf <kwolf@redhat.com>
|
||||
Date: Fri, 13 Mar 2020 12:34:30 +0000
|
||||
Subject: [PATCH 10/20] iotests: Refactor blockdev-reopen test for iothreads
|
||||
|
||||
RH-Author: Kevin Wolf <kwolf@redhat.com>
|
||||
Message-id: <20200313123439.10548-5-kwolf@redhat.com>
|
||||
Patchwork-id: 94281
|
||||
O-Subject: [RHEL-AV-8.2.0 qemu-kvm PATCH v2 04/13] iotests: Refactor blockdev-reopen test for iothreads
|
||||
Bugzilla: 1790482 1805143
|
||||
RH-Acked-by: John Snow <jsnow@redhat.com>
|
||||
RH-Acked-by: Daniel P. Berrange <berrange@redhat.com>
|
||||
RH-Acked-by: Peter Krempa <pkrempa@redhat.com>
|
||||
|
||||
We'll want to test more than one successful case in the future, so
|
||||
prepare the test for that by a refactoring that runs each scenario in a
|
||||
separate VM.
|
||||
|
||||
test_iothreads_switch_{backing,overlay} currently produce errors, but
|
||||
these are cases that should actually work, by switching either the
|
||||
backing file node or the overlay node to the AioContext of the other
|
||||
node.
|
||||
|
||||
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
|
||||
Tested-by: Peter Krempa <pkrempa@redhat.com>
|
||||
Message-Id: <20200306141413.30705-2-kwolf@redhat.com>
|
||||
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
|
||||
(cherry picked from commit 97518e11c3d902a32386d33797044f6b79bccc6f)
|
||||
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
|
||||
Signed-off-by: Danilo C. L. de Paula <ddepaula@redhat.com>
|
||||
---
|
||||
tests/qemu-iotests/245 | 47 ++++++++++++++++++++++++++++++++++++----------
|
||||
tests/qemu-iotests/245.out | 4 ++--
|
||||
2 files changed, 39 insertions(+), 12 deletions(-)
|
||||
|
||||
diff --git a/tests/qemu-iotests/245 b/tests/qemu-iotests/245
|
||||
index e66a23c..f69c2fa 100644
|
||||
--- a/tests/qemu-iotests/245
|
||||
+++ b/tests/qemu-iotests/245
|
||||
@@ -968,8 +968,7 @@ class TestBlockdevReopen(iotests.QMPTestCase):
|
||||
self.assertEqual(self.get_node('hd1'), None)
|
||||
self.assert_qmp(self.get_node('hd2'), 'ro', True)
|
||||
|
||||
- # We don't allow setting a backing file that uses a different AioContext
|
||||
- def test_iothreads(self):
|
||||
+ def run_test_iothreads(self, iothread_a, iothread_b, errmsg = None):
|
||||
opts = hd_opts(0)
|
||||
result = self.vm.qmp('blockdev-add', conv_keys = False, **opts)
|
||||
self.assert_qmp(result, 'return', {})
|
||||
@@ -984,20 +983,48 @@ class TestBlockdevReopen(iotests.QMPTestCase):
|
||||
result = self.vm.qmp('object-add', qom_type='iothread', id='iothread1')
|
||||
self.assert_qmp(result, 'return', {})
|
||||
|
||||
- result = self.vm.qmp('x-blockdev-set-iothread', node_name='hd0', iothread='iothread0')
|
||||
+ result = self.vm.qmp('device_add', driver='virtio-scsi', id='scsi0',
|
||||
+ iothread=iothread_a)
|
||||
self.assert_qmp(result, 'return', {})
|
||||
|
||||
- self.reopen(opts, {'backing': 'hd2'}, "Cannot use a new backing file with a different AioContext")
|
||||
-
|
||||
- result = self.vm.qmp('x-blockdev-set-iothread', node_name='hd2', iothread='iothread1')
|
||||
+ result = self.vm.qmp('device_add', driver='virtio-scsi', id='scsi1',
|
||||
+ iothread=iothread_b)
|
||||
self.assert_qmp(result, 'return', {})
|
||||
|
||||
- self.reopen(opts, {'backing': 'hd2'}, "Cannot use a new backing file with a different AioContext")
|
||||
+ if iothread_a:
|
||||
+ result = self.vm.qmp('device_add', driver='scsi-hd', drive='hd0',
|
||||
+ share_rw=True, bus="scsi0.0")
|
||||
+ self.assert_qmp(result, 'return', {})
|
||||
|
||||
- result = self.vm.qmp('x-blockdev-set-iothread', node_name='hd2', iothread='iothread0')
|
||||
- self.assert_qmp(result, 'return', {})
|
||||
+ if iothread_b:
|
||||
+ result = self.vm.qmp('device_add', driver='scsi-hd', drive='hd2',
|
||||
+ share_rw=True, bus="scsi1.0")
|
||||
+ self.assert_qmp(result, 'return', {})
|
||||
|
||||
- self.reopen(opts, {'backing': 'hd2'})
|
||||
+ # Attaching the backing file may or may not work
|
||||
+ self.reopen(opts, {'backing': 'hd2'}, errmsg)
|
||||
+
|
||||
+ # But removing the backing file should always work
|
||||
+ self.reopen(opts, {'backing': None})
|
||||
+
|
||||
+ self.vm.shutdown()
|
||||
+
|
||||
+ # We don't allow setting a backing file that uses a different AioContext if
|
||||
+ # neither of them can switch to the other AioContext
|
||||
+ def test_iothreads_error(self):
|
||||
+ self.run_test_iothreads('iothread0', 'iothread1',
|
||||
+ "Cannot use a new backing file with a different AioContext")
|
||||
+
|
||||
+ def test_iothreads_compatible_users(self):
|
||||
+ self.run_test_iothreads('iothread0', 'iothread0')
|
||||
+
|
||||
+ def test_iothreads_switch_backing(self):
|
||||
+ self.run_test_iothreads('iothread0', None,
|
||||
+ "Cannot use a new backing file with a different AioContext")
|
||||
+
|
||||
+ def test_iothreads_switch_overlay(self):
|
||||
+ self.run_test_iothreads(None, 'iothread0',
|
||||
+ "Cannot use a new backing file with a different AioContext")
|
||||
|
||||
if __name__ == '__main__':
|
||||
iotests.main(supported_fmts=["qcow2"],
|
||||
diff --git a/tests/qemu-iotests/245.out b/tests/qemu-iotests/245.out
|
||||
index a19de52..682b933 100644
|
||||
--- a/tests/qemu-iotests/245.out
|
||||
+++ b/tests/qemu-iotests/245.out
|
||||
@@ -1,6 +1,6 @@
|
||||
-..................
|
||||
+.....................
|
||||
----------------------------------------------------------------------
|
||||
-Ran 18 tests
|
||||
+Ran 21 tests
|
||||
|
||||
OK
|
||||
{"execute": "job-finalize", "arguments": {"id": "commit0"}}
|
||||
--
|
||||
1.8.3.1
|
||||
|
@ -1,46 +0,0 @@
|
||||
From a3778aef0be61dead835af39073a62bbf72c8e20 Mon Sep 17 00:00:00 2001
|
||||
From: Kevin Wolf <kwolf@redhat.com>
|
||||
Date: Fri, 7 Feb 2020 11:23:59 +0000
|
||||
Subject: [PATCH 02/18] iotests: Support job-complete in run_job()
|
||||
|
||||
RH-Author: Kevin Wolf <kwolf@redhat.com>
|
||||
Message-id: <20200207112404.25198-2-kwolf@redhat.com>
|
||||
Patchwork-id: 93746
|
||||
O-Subject: [RHEL-AV-8.2.0 qemu-kvm PATCH v2 1/6] iotests: Support job-complete in run_job()
|
||||
Bugzilla: 1781637
|
||||
RH-Acked-by: Sergio Lopez Pascual <slp@redhat.com>
|
||||
RH-Acked-by: Max Reitz <mreitz@redhat.com>
|
||||
RH-Acked-by: Stefan Hajnoczi <stefanha@redhat.com>
|
||||
|
||||
Automatically complete jobs that have a 'ready' state and need an
|
||||
explicit job-complete. Without this, run_job() would hang for such
|
||||
jobs.
|
||||
|
||||
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
|
||||
Reviewed-by: Eric Blake <eblake@redhat.com>
|
||||
Reviewed-by: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>
|
||||
Reviewed-by: Alberto Garcia <berto@igalia.com>
|
||||
Reviewed-by: Stefan Hajnoczi <stefanha@redhat.com>
|
||||
(cherry picked from commit 4688c4e32ec76004676470f11734478799673d6d)
|
||||
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
|
||||
Signed-off-by: Danilo C. L. de Paula <ddepaula@redhat.com>
|
||||
---
|
||||
tests/qemu-iotests/iotests.py | 2 ++
|
||||
1 file changed, 2 insertions(+)
|
||||
|
||||
diff --git a/tests/qemu-iotests/iotests.py b/tests/qemu-iotests/iotests.py
|
||||
index df07089..3cff671 100644
|
||||
--- a/tests/qemu-iotests/iotests.py
|
||||
+++ b/tests/qemu-iotests/iotests.py
|
||||
@@ -617,6 +617,8 @@ class VM(qtest.QEMUQtestMachine):
|
||||
error = j['error']
|
||||
if use_log:
|
||||
log('Job failed: %s' % (j['error']))
|
||||
+ elif status == 'ready':
|
||||
+ self.qmp_log('job-complete', id=job)
|
||||
elif status == 'pending' and not auto_finalize:
|
||||
if pre_finalize:
|
||||
pre_finalize()
|
||||
--
|
||||
1.8.3.1
|
||||
|
@ -1,189 +0,0 @@
|
||||
From 38b0cff9703fc740c30f5874973ac1be88f94d9f Mon Sep 17 00:00:00 2001
|
||||
From: Kevin Wolf <kwolf@redhat.com>
|
||||
Date: Fri, 7 Feb 2020 11:24:03 +0000
|
||||
Subject: [PATCH 06/18] iotests: Test external snapshot with VM state
|
||||
|
||||
RH-Author: Kevin Wolf <kwolf@redhat.com>
|
||||
Message-id: <20200207112404.25198-6-kwolf@redhat.com>
|
||||
Patchwork-id: 93752
|
||||
O-Subject: [RHEL-AV-8.2.0 qemu-kvm PATCH v2 5/6] iotests: Test external snapshot with VM state
|
||||
Bugzilla: 1781637
|
||||
RH-Acked-by: Sergio Lopez Pascual <slp@redhat.com>
|
||||
RH-Acked-by: Max Reitz <mreitz@redhat.com>
|
||||
RH-Acked-by: Stefan Hajnoczi <stefanha@redhat.com>
|
||||
|
||||
This tests creating an external snapshot with VM state (which results in
|
||||
an active overlay over an inactive backing file, which is also the root
|
||||
node of an inactive BlockBackend), re-activating the images and
|
||||
performing some operations to test that the re-activation worked as
|
||||
intended.
|
||||
|
||||
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
|
||||
(cherry picked from commit f62f08ab7a9d902da70078992248ec5c98f652ad)
|
||||
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
|
||||
Signed-off-by: Danilo C. L. de Paula <ddepaula@redhat.com>
|
||||
---
|
||||
tests/qemu-iotests/280 | 83 ++++++++++++++++++++++++++++++++++++++++++++++
|
||||
tests/qemu-iotests/280.out | 50 ++++++++++++++++++++++++++++
|
||||
tests/qemu-iotests/group | 1 +
|
||||
3 files changed, 134 insertions(+)
|
||||
create mode 100755 tests/qemu-iotests/280
|
||||
create mode 100644 tests/qemu-iotests/280.out
|
||||
|
||||
diff --git a/tests/qemu-iotests/280 b/tests/qemu-iotests/280
|
||||
new file mode 100755
|
||||
index 0000000..0b1fa8e
|
||||
--- /dev/null
|
||||
+++ b/tests/qemu-iotests/280
|
||||
@@ -0,0 +1,83 @@
|
||||
+#!/usr/bin/env python
|
||||
+#
|
||||
+# Copyright (C) 2019 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/>.
|
||||
+#
|
||||
+# Creator/Owner: Kevin Wolf <kwolf@redhat.com>
|
||||
+#
|
||||
+# Test migration to file for taking an external snapshot with VM state.
|
||||
+
|
||||
+import iotests
|
||||
+import os
|
||||
+
|
||||
+iotests.verify_image_format(supported_fmts=['qcow2'])
|
||||
+iotests.verify_protocol(supported=['file'])
|
||||
+iotests.verify_platform(['linux'])
|
||||
+
|
||||
+with iotests.FilePath('base') as base_path , \
|
||||
+ iotests.FilePath('top') as top_path, \
|
||||
+ iotests.VM() as vm:
|
||||
+
|
||||
+ iotests.qemu_img_log('create', '-f', iotests.imgfmt, base_path, '64M')
|
||||
+
|
||||
+ iotests.log('=== Launch VM ===')
|
||||
+ vm.add_object('iothread,id=iothread0')
|
||||
+ vm.add_blockdev('file,filename=%s,node-name=base-file' % (base_path))
|
||||
+ vm.add_blockdev('%s,file=base-file,node-name=base-fmt' % (iotests.imgfmt))
|
||||
+ vm.add_device('virtio-blk,drive=base-fmt,iothread=iothread0,id=vda')
|
||||
+ vm.launch()
|
||||
+
|
||||
+ vm.enable_migration_events('VM')
|
||||
+
|
||||
+ iotests.log('\n=== Migrate to file ===')
|
||||
+ vm.qmp_log('migrate', uri='exec:cat > /dev/null')
|
||||
+
|
||||
+ with iotests.Timeout(3, 'Migration does not complete'):
|
||||
+ vm.wait_migration()
|
||||
+
|
||||
+ iotests.log('\nVM is now stopped:')
|
||||
+ iotests.log(vm.qmp('query-migrate')['return']['status'])
|
||||
+ vm.qmp_log('query-status')
|
||||
+
|
||||
+ iotests.log('\n=== Create a snapshot of the disk image ===')
|
||||
+ vm.blockdev_create({
|
||||
+ 'driver': 'file',
|
||||
+ 'filename': top_path,
|
||||
+ 'size': 0,
|
||||
+ })
|
||||
+ vm.qmp_log('blockdev-add', node_name='top-file',
|
||||
+ driver='file', filename=top_path,
|
||||
+ filters=[iotests.filter_qmp_testfiles])
|
||||
+
|
||||
+ vm.blockdev_create({
|
||||
+ 'driver': iotests.imgfmt,
|
||||
+ 'file': 'top-file',
|
||||
+ 'size': 1024 * 1024,
|
||||
+ })
|
||||
+ vm.qmp_log('blockdev-add', node_name='top-fmt',
|
||||
+ driver=iotests.imgfmt, file='top-file')
|
||||
+
|
||||
+ vm.qmp_log('blockdev-snapshot', node='base-fmt', overlay='top-fmt')
|
||||
+
|
||||
+ iotests.log('\n=== Resume the VM and simulate a write request ===')
|
||||
+ vm.qmp_log('cont')
|
||||
+ iotests.log(vm.hmp_qemu_io('-d vda/virtio-backend', 'write 4k 4k'))
|
||||
+
|
||||
+ iotests.log('\n=== Commit it to the backing file ===')
|
||||
+ result = vm.qmp_log('block-commit', job_id='job0', auto_dismiss=False,
|
||||
+ device='top-fmt', top_node='top-fmt',
|
||||
+ filters=[iotests.filter_qmp_testfiles])
|
||||
+ if 'return' in result:
|
||||
+ vm.run_job('job0')
|
||||
diff --git a/tests/qemu-iotests/280.out b/tests/qemu-iotests/280.out
|
||||
new file mode 100644
|
||||
index 0000000..5d382fa
|
||||
--- /dev/null
|
||||
+++ b/tests/qemu-iotests/280.out
|
||||
@@ -0,0 +1,50 @@
|
||||
+Formatting 'TEST_DIR/PID-base', fmt=qcow2 size=67108864 cluster_size=65536 lazy_refcounts=off refcount_bits=16
|
||||
+
|
||||
+=== Launch VM ===
|
||||
+Enabling migration QMP events on VM...
|
||||
+{"return": {}}
|
||||
+
|
||||
+=== Migrate to file ===
|
||||
+{"execute": "migrate", "arguments": {"uri": "exec:cat > /dev/null"}}
|
||||
+{"return": {}}
|
||||
+{"data": {"status": "setup"}, "event": "MIGRATION", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
|
||||
+{"data": {"status": "active"}, "event": "MIGRATION", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
|
||||
+{"data": {"status": "completed"}, "event": "MIGRATION", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
|
||||
+
|
||||
+VM is now stopped:
|
||||
+completed
|
||||
+{"execute": "query-status", "arguments": {}}
|
||||
+{"return": {"running": false, "singlestep": false, "status": "postmigrate"}}
|
||||
+
|
||||
+=== Create a snapshot of the disk image ===
|
||||
+{"execute": "blockdev-create", "arguments": {"job-id": "job0", "options": {"driver": "file", "filename": "TEST_DIR/PID-top", "size": 0}}}
|
||||
+{"return": {}}
|
||||
+{"execute": "job-dismiss", "arguments": {"id": "job0"}}
|
||||
+{"return": {}}
|
||||
+
|
||||
+{"execute": "blockdev-add", "arguments": {"driver": "file", "filename": "TEST_DIR/PID-top", "node-name": "top-file"}}
|
||||
+{"return": {}}
|
||||
+{"execute": "blockdev-create", "arguments": {"job-id": "job0", "options": {"driver": "qcow2", "file": "top-file", "size": 1048576}}}
|
||||
+{"return": {}}
|
||||
+{"execute": "job-dismiss", "arguments": {"id": "job0"}}
|
||||
+{"return": {}}
|
||||
+
|
||||
+{"execute": "blockdev-add", "arguments": {"driver": "qcow2", "file": "top-file", "node-name": "top-fmt"}}
|
||||
+{"return": {}}
|
||||
+{"execute": "blockdev-snapshot", "arguments": {"node": "base-fmt", "overlay": "top-fmt"}}
|
||||
+{"return": {}}
|
||||
+
|
||||
+=== Resume the VM and simulate a write request ===
|
||||
+{"execute": "cont", "arguments": {}}
|
||||
+{"return": {}}
|
||||
+{"return": ""}
|
||||
+
|
||||
+=== Commit it to the backing file ===
|
||||
+{"execute": "block-commit", "arguments": {"auto-dismiss": false, "device": "top-fmt", "job-id": "job0", "top-node": "top-fmt"}}
|
||||
+{"return": {}}
|
||||
+{"execute": "job-complete", "arguments": {"id": "job0"}}
|
||||
+{"return": {}}
|
||||
+{"data": {"device": "job0", "len": 65536, "offset": 65536, "speed": 0, "type": "commit"}, "event": "BLOCK_JOB_READY", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
|
||||
+{"data": {"device": "job0", "len": 65536, "offset": 65536, "speed": 0, "type": "commit"}, "event": "BLOCK_JOB_COMPLETED", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
|
||||
+{"execute": "job-dismiss", "arguments": {"id": "job0"}}
|
||||
+{"return": {}}
|
||||
diff --git a/tests/qemu-iotests/group b/tests/qemu-iotests/group
|
||||
index 06cc734..01301cd 100644
|
||||
--- a/tests/qemu-iotests/group
|
||||
+++ b/tests/qemu-iotests/group
|
||||
@@ -286,3 +286,4 @@
|
||||
272 rw
|
||||
273 backing quick
|
||||
277 rw quick
|
||||
+280 rw migration quick
|
||||
--
|
||||
1.8.3.1
|
||||
|
@ -1,322 +0,0 @@
|
||||
From 6b9a6ba9ed753ad7aa714b35de938ebeeb4fa6cb Mon Sep 17 00:00:00 2001
|
||||
From: Sergio Lopez Pascual <slp@redhat.com>
|
||||
Date: Fri, 7 Feb 2020 10:27:49 +0000
|
||||
Subject: [PATCH 16/18] iotests: Test handling of AioContexts with some
|
||||
blockdev actions
|
||||
|
||||
RH-Author: Sergio Lopez Pascual <slp@redhat.com>
|
||||
Message-id: <20200207112749.25073-10-slp@redhat.com>
|
||||
Patchwork-id: 93762
|
||||
O-Subject: [RHEL-AV-8.2.0 qemu-kvm PATCH v2 9/9] iotests: Test handling of AioContexts with some blockdev actions
|
||||
Bugzilla: 1745606 1746217 1773517 1779036 1782111 1782175 1783965
|
||||
RH-Acked-by: Stefano Garzarella <sgarzare@redhat.com>
|
||||
RH-Acked-by: Paolo Bonzini <pbonzini@redhat.com>
|
||||
RH-Acked-by: Max Reitz <mreitz@redhat.com>
|
||||
RH-Acked-by: Stefan Hajnoczi <stefanha@redhat.com>
|
||||
|
||||
Includes the following tests:
|
||||
|
||||
- Adding a dirty bitmap.
|
||||
* RHBZ: 1782175
|
||||
|
||||
- Starting a drive-mirror to an NBD-backed target.
|
||||
* RHBZ: 1746217, 1773517
|
||||
|
||||
- Aborting an external snapshot transaction.
|
||||
* RHBZ: 1779036
|
||||
|
||||
- Aborting a blockdev backup transaction.
|
||||
* RHBZ: 1782111
|
||||
|
||||
For each one of them, a VM with a number of disks running in an
|
||||
IOThread AioContext is used.
|
||||
|
||||
Signed-off-by: Sergio Lopez <slp@redhat.com>
|
||||
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
|
||||
(cherry picked from commit 9b8c59e7610b9c5315ef093d801843dbe8debfac)
|
||||
Signed-off-by: Sergio Lopez <slp@redhat.com>
|
||||
Signed-off-by: Danilo C. L. de Paula <ddepaula@redhat.com>
|
||||
---
|
||||
tests/qemu-iotests/281 | 247 +++++++++++++++++++++++++++++++++++++++++++++
|
||||
tests/qemu-iotests/281.out | 5 +
|
||||
tests/qemu-iotests/group | 1 +
|
||||
3 files changed, 253 insertions(+)
|
||||
create mode 100755 tests/qemu-iotests/281
|
||||
create mode 100644 tests/qemu-iotests/281.out
|
||||
|
||||
diff --git a/tests/qemu-iotests/281 b/tests/qemu-iotests/281
|
||||
new file mode 100755
|
||||
index 0000000..269d583
|
||||
--- /dev/null
|
||||
+++ b/tests/qemu-iotests/281
|
||||
@@ -0,0 +1,247 @@
|
||||
+#!/usr/bin/env python
|
||||
+#
|
||||
+# Test cases for blockdev + IOThread interactions
|
||||
+#
|
||||
+# Copyright (C) 2019 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 qemu_img
|
||||
+
|
||||
+image_len = 64 * 1024 * 1024
|
||||
+
|
||||
+# Test for RHBZ#1782175
|
||||
+class TestDirtyBitmapIOThread(iotests.QMPTestCase):
|
||||
+ drive0_img = os.path.join(iotests.test_dir, 'drive0.img')
|
||||
+ images = { 'drive0': drive0_img }
|
||||
+
|
||||
+ def setUp(self):
|
||||
+ for name in self.images:
|
||||
+ qemu_img('create', '-f', iotests.imgfmt,
|
||||
+ self.images[name], str(image_len))
|
||||
+
|
||||
+ self.vm = iotests.VM()
|
||||
+ self.vm.add_object('iothread,id=iothread0')
|
||||
+
|
||||
+ for name in self.images:
|
||||
+ self.vm.add_blockdev('driver=file,filename=%s,node-name=file_%s'
|
||||
+ % (self.images[name], name))
|
||||
+ self.vm.add_blockdev('driver=qcow2,file=file_%s,node-name=%s'
|
||||
+ % (name, name))
|
||||
+
|
||||
+ self.vm.launch()
|
||||
+ self.vm.qmp('x-blockdev-set-iothread',
|
||||
+ node_name='drive0', iothread='iothread0',
|
||||
+ force=True)
|
||||
+
|
||||
+ def tearDown(self):
|
||||
+ self.vm.shutdown()
|
||||
+ for name in self.images:
|
||||
+ os.remove(self.images[name])
|
||||
+
|
||||
+ def test_add_dirty_bitmap(self):
|
||||
+ result = self.vm.qmp(
|
||||
+ 'block-dirty-bitmap-add',
|
||||
+ node='drive0',
|
||||
+ name='bitmap1',
|
||||
+ persistent=True,
|
||||
+ )
|
||||
+
|
||||
+ self.assert_qmp(result, 'return', {})
|
||||
+
|
||||
+
|
||||
+# Test for RHBZ#1746217 & RHBZ#1773517
|
||||
+class TestNBDMirrorIOThread(iotests.QMPTestCase):
|
||||
+ nbd_sock = os.path.join(iotests.sock_dir, 'nbd.sock')
|
||||
+ drive0_img = os.path.join(iotests.test_dir, 'drive0.img')
|
||||
+ mirror_img = os.path.join(iotests.test_dir, 'mirror.img')
|
||||
+ images = { 'drive0': drive0_img, 'mirror': mirror_img }
|
||||
+
|
||||
+ def setUp(self):
|
||||
+ for name in self.images:
|
||||
+ qemu_img('create', '-f', iotests.imgfmt,
|
||||
+ self.images[name], str(image_len))
|
||||
+
|
||||
+ self.vm_src = iotests.VM(path_suffix='src')
|
||||
+ self.vm_src.add_object('iothread,id=iothread0')
|
||||
+ self.vm_src.add_blockdev('driver=file,filename=%s,node-name=file0'
|
||||
+ % (self.drive0_img))
|
||||
+ self.vm_src.add_blockdev('driver=qcow2,file=file0,node-name=drive0')
|
||||
+ self.vm_src.launch()
|
||||
+ self.vm_src.qmp('x-blockdev-set-iothread',
|
||||
+ node_name='drive0', iothread='iothread0',
|
||||
+ force=True)
|
||||
+
|
||||
+ self.vm_tgt = iotests.VM(path_suffix='tgt')
|
||||
+ self.vm_tgt.add_object('iothread,id=iothread0')
|
||||
+ self.vm_tgt.add_blockdev('driver=file,filename=%s,node-name=file0'
|
||||
+ % (self.mirror_img))
|
||||
+ self.vm_tgt.add_blockdev('driver=qcow2,file=file0,node-name=drive0')
|
||||
+ self.vm_tgt.launch()
|
||||
+ self.vm_tgt.qmp('x-blockdev-set-iothread',
|
||||
+ node_name='drive0', iothread='iothread0',
|
||||
+ force=True)
|
||||
+
|
||||
+ def tearDown(self):
|
||||
+ self.vm_src.shutdown()
|
||||
+ self.vm_tgt.shutdown()
|
||||
+ for name in self.images:
|
||||
+ os.remove(self.images[name])
|
||||
+
|
||||
+ def test_nbd_mirror(self):
|
||||
+ result = self.vm_tgt.qmp(
|
||||
+ 'nbd-server-start',
|
||||
+ addr={
|
||||
+ 'type': 'unix',
|
||||
+ 'data': { 'path': self.nbd_sock }
|
||||
+ }
|
||||
+ )
|
||||
+ self.assert_qmp(result, 'return', {})
|
||||
+
|
||||
+ result = self.vm_tgt.qmp(
|
||||
+ 'nbd-server-add',
|
||||
+ device='drive0',
|
||||
+ writable=True
|
||||
+ )
|
||||
+ self.assert_qmp(result, 'return', {})
|
||||
+
|
||||
+ result = self.vm_src.qmp(
|
||||
+ 'drive-mirror',
|
||||
+ device='drive0',
|
||||
+ target='nbd+unix:///drive0?socket=' + self.nbd_sock,
|
||||
+ sync='full',
|
||||
+ mode='existing',
|
||||
+ speed=64*1024*1024,
|
||||
+ job_id='j1'
|
||||
+ )
|
||||
+ self.assert_qmp(result, 'return', {})
|
||||
+
|
||||
+ self.vm_src.event_wait(name="BLOCK_JOB_READY")
|
||||
+
|
||||
+
|
||||
+# Test for RHBZ#1779036
|
||||
+class TestExternalSnapshotAbort(iotests.QMPTestCase):
|
||||
+ drive0_img = os.path.join(iotests.test_dir, 'drive0.img')
|
||||
+ snapshot_img = os.path.join(iotests.test_dir, 'snapshot.img')
|
||||
+ images = { 'drive0': drive0_img, 'snapshot': snapshot_img }
|
||||
+
|
||||
+ def setUp(self):
|
||||
+ for name in self.images:
|
||||
+ qemu_img('create', '-f', iotests.imgfmt,
|
||||
+ self.images[name], str(image_len))
|
||||
+
|
||||
+ self.vm = iotests.VM()
|
||||
+ self.vm.add_object('iothread,id=iothread0')
|
||||
+ self.vm.add_blockdev('driver=file,filename=%s,node-name=file0'
|
||||
+ % (self.drive0_img))
|
||||
+ self.vm.add_blockdev('driver=qcow2,file=file0,node-name=drive0')
|
||||
+ self.vm.launch()
|
||||
+ self.vm.qmp('x-blockdev-set-iothread',
|
||||
+ node_name='drive0', iothread='iothread0',
|
||||
+ force=True)
|
||||
+
|
||||
+ def tearDown(self):
|
||||
+ self.vm.shutdown()
|
||||
+ for name in self.images:
|
||||
+ os.remove(self.images[name])
|
||||
+
|
||||
+ def test_external_snapshot_abort(self):
|
||||
+ # Use a two actions transaction with a bogus values on the second
|
||||
+ # one to trigger an abort of the transaction.
|
||||
+ result = self.vm.qmp('transaction', actions=[
|
||||
+ {
|
||||
+ 'type': 'blockdev-snapshot-sync',
|
||||
+ 'data': { 'node-name': 'drive0',
|
||||
+ 'snapshot-file': self.snapshot_img,
|
||||
+ 'snapshot-node-name': 'snap1',
|
||||
+ 'mode': 'absolute-paths',
|
||||
+ 'format': 'qcow2' }
|
||||
+ },
|
||||
+ {
|
||||
+ 'type': 'blockdev-snapshot-sync',
|
||||
+ 'data': { 'node-name': 'drive0',
|
||||
+ 'snapshot-file': '/fakesnapshot',
|
||||
+ 'snapshot-node-name': 'snap2',
|
||||
+ 'mode': 'absolute-paths',
|
||||
+ 'format': 'qcow2' }
|
||||
+ },
|
||||
+ ])
|
||||
+
|
||||
+ # Crashes on failure, we expect this error.
|
||||
+ self.assert_qmp(result, 'error/class', 'GenericError')
|
||||
+
|
||||
+
|
||||
+# Test for RHBZ#1782111
|
||||
+class TestBlockdevBackupAbort(iotests.QMPTestCase):
|
||||
+ drive0_img = os.path.join(iotests.test_dir, 'drive0.img')
|
||||
+ drive1_img = os.path.join(iotests.test_dir, 'drive1.img')
|
||||
+ snap0_img = os.path.join(iotests.test_dir, 'snap0.img')
|
||||
+ snap1_img = os.path.join(iotests.test_dir, 'snap1.img')
|
||||
+ images = { 'drive0': drive0_img,
|
||||
+ 'drive1': drive1_img,
|
||||
+ 'snap0': snap0_img,
|
||||
+ 'snap1': snap1_img }
|
||||
+
|
||||
+ def setUp(self):
|
||||
+ for name in self.images:
|
||||
+ qemu_img('create', '-f', iotests.imgfmt,
|
||||
+ self.images[name], str(image_len))
|
||||
+
|
||||
+ self.vm = iotests.VM()
|
||||
+ self.vm.add_object('iothread,id=iothread0')
|
||||
+ self.vm.add_device('virtio-scsi,iothread=iothread0')
|
||||
+
|
||||
+ for name in self.images:
|
||||
+ self.vm.add_blockdev('driver=file,filename=%s,node-name=file_%s'
|
||||
+ % (self.images[name], name))
|
||||
+ self.vm.add_blockdev('driver=qcow2,file=file_%s,node-name=%s'
|
||||
+ % (name, name))
|
||||
+
|
||||
+ self.vm.add_device('scsi-hd,drive=drive0')
|
||||
+ self.vm.add_device('scsi-hd,drive=drive1')
|
||||
+ self.vm.launch()
|
||||
+
|
||||
+ def tearDown(self):
|
||||
+ self.vm.shutdown()
|
||||
+ for name in self.images:
|
||||
+ os.remove(self.images[name])
|
||||
+
|
||||
+ def test_blockdev_backup_abort(self):
|
||||
+ # Use a two actions transaction with a bogus values on the second
|
||||
+ # one to trigger an abort of the transaction.
|
||||
+ result = self.vm.qmp('transaction', actions=[
|
||||
+ {
|
||||
+ 'type': 'blockdev-backup',
|
||||
+ 'data': { 'device': 'drive0',
|
||||
+ 'target': 'snap0',
|
||||
+ 'sync': 'full',
|
||||
+ 'job-id': 'j1' }
|
||||
+ },
|
||||
+ {
|
||||
+ 'type': 'blockdev-backup',
|
||||
+ 'data': { 'device': 'drive1',
|
||||
+ 'target': 'snap1',
|
||||
+ 'sync': 'full' }
|
||||
+ },
|
||||
+ ])
|
||||
+
|
||||
+ # Hangs on failure, we expect this error.
|
||||
+ self.assert_qmp(result, 'error/class', 'GenericError')
|
||||
+
|
||||
+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
|
||||
new file mode 100644
|
||||
index 0000000..89968f3
|
||||
--- /dev/null
|
||||
+++ b/tests/qemu-iotests/281.out
|
||||
@@ -0,0 +1,5 @@
|
||||
+....
|
||||
+----------------------------------------------------------------------
|
||||
+Ran 4 tests
|
||||
+
|
||||
+OK
|
||||
diff --git a/tests/qemu-iotests/group b/tests/qemu-iotests/group
|
||||
index 01301cd..c0e8197 100644
|
||||
--- a/tests/qemu-iotests/group
|
||||
+++ b/tests/qemu-iotests/group
|
||||
@@ -287,3 +287,4 @@
|
||||
273 backing quick
|
||||
277 rw quick
|
||||
280 rw migration quick
|
||||
+281 rw quick
|
||||
--
|
||||
1.8.3.1
|
||||
|
@ -1,162 +0,0 @@
|
||||
From 239f7bdeef48a3c0b07098617371b9955dc55348 Mon Sep 17 00:00:00 2001
|
||||
From: Kevin Wolf <kwolf@redhat.com>
|
||||
Date: Fri, 13 Mar 2020 12:34:36 +0000
|
||||
Subject: [PATCH 16/20] iotests: Test mirror with temporarily disabled target
|
||||
backing file
|
||||
|
||||
RH-Author: Kevin Wolf <kwolf@redhat.com>
|
||||
Message-id: <20200313123439.10548-11-kwolf@redhat.com>
|
||||
Patchwork-id: 94288
|
||||
O-Subject: [RHEL-AV-8.2.0 qemu-kvm PATCH v2 10/13] iotests: Test mirror with temporarily disabled target backing file
|
||||
Bugzilla: 1790482 1805143
|
||||
RH-Acked-by: John Snow <jsnow@redhat.com>
|
||||
RH-Acked-by: Daniel P. Berrange <berrange@redhat.com>
|
||||
RH-Acked-by: Peter Krempa <pkrempa@redhat.com>
|
||||
|
||||
The newly tested scenario is a common live storage migration scenario:
|
||||
The target node is opened without a backing file so that the active
|
||||
layer is mirrored while its backing chain can be copied in the
|
||||
background.
|
||||
|
||||
The backing chain should be attached to the mirror target node when
|
||||
finalising the job, just before switching the users of the source node
|
||||
to the new copy (at which point the mirror job still has a reference to
|
||||
the node). drive-mirror did this automatically, but with blockdev-mirror
|
||||
this is the job of the QMP client.
|
||||
|
||||
This patch adds test cases for two ways to achieve the desired result,
|
||||
using either x-blockdev-reopen or blockdev-snapshot.
|
||||
|
||||
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
|
||||
Message-Id: <20200310113831.27293-5-kwolf@redhat.com>
|
||||
Reviewed-by: Peter Krempa <pkrempa@redhat.com>
|
||||
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
|
||||
(cherry picked from commit 8bdee9f10eac2aefdcc5095feef756354c87bdec)
|
||||
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
|
||||
Signed-off-by: Danilo C. L. de Paula <ddepaula@redhat.com>
|
||||
---
|
||||
tests/qemu-iotests/155 | 56 +++++++++++++++++++++++++++++++++++++++++-----
|
||||
tests/qemu-iotests/155.out | 4 ++--
|
||||
2 files changed, 53 insertions(+), 7 deletions(-)
|
||||
|
||||
diff --git a/tests/qemu-iotests/155 b/tests/qemu-iotests/155
|
||||
index d7ef257..3053e50 100755
|
||||
--- a/tests/qemu-iotests/155
|
||||
+++ b/tests/qemu-iotests/155
|
||||
@@ -45,10 +45,15 @@ target_img = os.path.join(iotests.test_dir, 'target.' + iotests.imgfmt)
|
||||
# image during runtime, only makes sense if
|
||||
# target_blockdev_backing is not None
|
||||
# (None: same as target_backing)
|
||||
+# target_open_with_backing: If True, the target image is added with its backing
|
||||
+# chain opened right away. If False, blockdev-add
|
||||
+# opens it without a backing file and job completion
|
||||
+# is supposed to open the backing chain.
|
||||
|
||||
class BaseClass(iotests.QMPTestCase):
|
||||
target_blockdev_backing = None
|
||||
target_real_backing = None
|
||||
+ target_open_with_backing = True
|
||||
|
||||
def setUp(self):
|
||||
qemu_img('create', '-f', iotests.imgfmt, back0_img, '1440K')
|
||||
@@ -80,9 +85,13 @@ class BaseClass(iotests.QMPTestCase):
|
||||
options = { 'node-name': 'target',
|
||||
'driver': iotests.imgfmt,
|
||||
'file': { 'driver': 'file',
|
||||
+ 'node-name': 'target-file',
|
||||
'filename': target_img } }
|
||||
- if self.target_blockdev_backing:
|
||||
- options['backing'] = self.target_blockdev_backing
|
||||
+
|
||||
+ if not self.target_open_with_backing:
|
||||
+ options['backing'] = None
|
||||
+ elif self.target_blockdev_backing:
|
||||
+ options['backing'] = self.target_blockdev_backing
|
||||
|
||||
result = self.vm.qmp('blockdev-add', **options)
|
||||
self.assert_qmp(result, 'return', {})
|
||||
@@ -147,10 +156,14 @@ class BaseClass(iotests.QMPTestCase):
|
||||
# cmd: Mirroring command to execute, either drive-mirror or blockdev-mirror
|
||||
|
||||
class MirrorBaseClass(BaseClass):
|
||||
+ def openBacking(self):
|
||||
+ pass
|
||||
+
|
||||
def runMirror(self, sync):
|
||||
if self.cmd == 'blockdev-mirror':
|
||||
result = self.vm.qmp(self.cmd, job_id='mirror-job', device='source',
|
||||
- sync=sync, target='target')
|
||||
+ sync=sync, target='target',
|
||||
+ auto_finalize=False)
|
||||
else:
|
||||
if self.existing:
|
||||
mode = 'existing'
|
||||
@@ -159,11 +172,12 @@ class MirrorBaseClass(BaseClass):
|
||||
result = self.vm.qmp(self.cmd, job_id='mirror-job', device='source',
|
||||
sync=sync, target=target_img,
|
||||
format=iotests.imgfmt, mode=mode,
|
||||
- node_name='target')
|
||||
+ node_name='target', auto_finalize=False)
|
||||
|
||||
self.assert_qmp(result, 'return', {})
|
||||
|
||||
- self.complete_and_wait('mirror-job')
|
||||
+ self.vm.run_job('mirror-job', use_log=False, auto_finalize=False,
|
||||
+ pre_finalize=self.openBacking, auto_dismiss=True)
|
||||
|
||||
def testFull(self):
|
||||
self.runMirror('full')
|
||||
@@ -221,6 +235,38 @@ class TestBlockdevMirrorForcedBacking(MirrorBaseClass):
|
||||
target_blockdev_backing = { 'driver': 'null-co' }
|
||||
target_real_backing = 'null-co://'
|
||||
|
||||
+# Attach the backing chain only during completion, with blockdev-reopen
|
||||
+class TestBlockdevMirrorReopen(MirrorBaseClass):
|
||||
+ cmd = 'blockdev-mirror'
|
||||
+ existing = True
|
||||
+ target_backing = 'null-co://'
|
||||
+ target_open_with_backing = False
|
||||
+
|
||||
+ def openBacking(self):
|
||||
+ if not self.target_open_with_backing:
|
||||
+ result = self.vm.qmp('blockdev-add', node_name="backing",
|
||||
+ driver="null-co")
|
||||
+ self.assert_qmp(result, 'return', {})
|
||||
+ result = self.vm.qmp('x-blockdev-reopen', node_name="target",
|
||||
+ driver=iotests.imgfmt, file="target-file",
|
||||
+ backing="backing")
|
||||
+ self.assert_qmp(result, 'return', {})
|
||||
+
|
||||
+# Attach the backing chain only during completion, with blockdev-snapshot
|
||||
+class TestBlockdevMirrorSnapshot(MirrorBaseClass):
|
||||
+ cmd = 'blockdev-mirror'
|
||||
+ existing = True
|
||||
+ target_backing = 'null-co://'
|
||||
+ target_open_with_backing = False
|
||||
+
|
||||
+ def openBacking(self):
|
||||
+ if not self.target_open_with_backing:
|
||||
+ result = self.vm.qmp('blockdev-add', node_name="backing",
|
||||
+ driver="null-co")
|
||||
+ self.assert_qmp(result, 'return', {})
|
||||
+ result = self.vm.qmp('blockdev-snapshot', node="backing",
|
||||
+ overlay="target")
|
||||
+ self.assert_qmp(result, 'return', {})
|
||||
|
||||
class TestCommit(BaseClass):
|
||||
existing = False
|
||||
diff --git a/tests/qemu-iotests/155.out b/tests/qemu-iotests/155.out
|
||||
index 4176bb9..4fd1c2d 100644
|
||||
--- a/tests/qemu-iotests/155.out
|
||||
+++ b/tests/qemu-iotests/155.out
|
||||
@@ -1,5 +1,5 @@
|
||||
-...................
|
||||
+.........................
|
||||
----------------------------------------------------------------------
|
||||
-Ran 19 tests
|
||||
+Ran 25 tests
|
||||
|
||||
OK
|
||||
--
|
||||
1.8.3.1
|
||||
|
@ -1,50 +0,0 @@
|
||||
From 872fbd32d06bda4aba3a7e67a95f76f62e475dbe Mon Sep 17 00:00:00 2001
|
||||
From: Kevin Wolf <kwolf@redhat.com>
|
||||
Date: Fri, 13 Mar 2020 12:34:27 +0000
|
||||
Subject: [PATCH 07/20] iotests: Use complete_and_wait() in 155
|
||||
|
||||
RH-Author: Kevin Wolf <kwolf@redhat.com>
|
||||
Message-id: <20200313123439.10548-2-kwolf@redhat.com>
|
||||
Patchwork-id: 94279
|
||||
O-Subject: [RHEL-AV-8.2.0 qemu-kvm PATCH v2 01/13] iotests: Use complete_and_wait() in 155
|
||||
Bugzilla: 1790482 1805143
|
||||
RH-Acked-by: John Snow <jsnow@redhat.com>
|
||||
RH-Acked-by: Daniel P. Berrange <berrange@redhat.com>
|
||||
RH-Acked-by: Peter Krempa <pkrempa@redhat.com>
|
||||
|
||||
From: Max Reitz <mreitz@redhat.com>
|
||||
|
||||
This way, we get to see errors during the completion phase.
|
||||
|
||||
Signed-off-by: Max Reitz <mreitz@redhat.com>
|
||||
Reviewed-by: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>
|
||||
Message-Id: <20200218103454.296704-14-mreitz@redhat.com>
|
||||
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
|
||||
(cherry picked from commit 6644d0e6192b36cdf2902c9774e1afb8ab2e7223)
|
||||
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
|
||||
Signed-off-by: Danilo C. L. de Paula <ddepaula@redhat.com>
|
||||
---
|
||||
tests/qemu-iotests/155 | 7 +------
|
||||
1 file changed, 1 insertion(+), 6 deletions(-)
|
||||
|
||||
diff --git a/tests/qemu-iotests/155 b/tests/qemu-iotests/155
|
||||
index e194859..d7ef257 100755
|
||||
--- a/tests/qemu-iotests/155
|
||||
+++ b/tests/qemu-iotests/155
|
||||
@@ -163,12 +163,7 @@ class MirrorBaseClass(BaseClass):
|
||||
|
||||
self.assert_qmp(result, 'return', {})
|
||||
|
||||
- self.vm.event_wait('BLOCK_JOB_READY')
|
||||
-
|
||||
- result = self.vm.qmp('block-job-complete', device='mirror-job')
|
||||
- self.assert_qmp(result, 'return', {})
|
||||
-
|
||||
- self.vm.event_wait('BLOCK_JOB_COMPLETED')
|
||||
+ self.complete_and_wait('mirror-job')
|
||||
|
||||
def testFull(self):
|
||||
self.runMirror('full')
|
||||
--
|
||||
1.8.3.1
|
||||
|
@ -1,123 +0,0 @@
|
||||
From d6df1426ae65b3a0d50bdbb1f8a7246386dd6ebf Mon Sep 17 00:00:00 2001
|
||||
From: Kevin Wolf <kwolf@redhat.com>
|
||||
Date: Fri, 7 Feb 2020 11:24:04 +0000
|
||||
Subject: [PATCH 07/18] iotests.py: Let wait_migration wait even more
|
||||
|
||||
RH-Author: Kevin Wolf <kwolf@redhat.com>
|
||||
Message-id: <20200207112404.25198-7-kwolf@redhat.com>
|
||||
Patchwork-id: 93751
|
||||
O-Subject: [RHEL-AV-8.2.0 qemu-kvm PATCH v2 6/6] iotests.py: Let wait_migration wait even more
|
||||
Bugzilla: 1781637
|
||||
RH-Acked-by: Sergio Lopez Pascual <slp@redhat.com>
|
||||
RH-Acked-by: Max Reitz <mreitz@redhat.com>
|
||||
RH-Acked-by: Stefan Hajnoczi <stefanha@redhat.com>
|
||||
|
||||
From: Max Reitz <mreitz@redhat.com>
|
||||
|
||||
The "migration completed" event may be sent (on the source, to be
|
||||
specific) before the migration is actually completed, so the VM runstate
|
||||
will still be "finish-migrate" instead of "postmigrate". So ask the
|
||||
users of VM.wait_migration() to specify the final runstate they desire
|
||||
and then poll the VM until it has reached that state. (This should be
|
||||
over very quickly, so busy polling is fine.)
|
||||
|
||||
Without this patch, I see intermittent failures in the new iotest 280
|
||||
under high system load. I have not yet seen such failures with other
|
||||
iotests that use VM.wait_migration() and query-status afterwards, but
|
||||
maybe they just occur even more rarely, or it is because they also wait
|
||||
on the destination VM to be running.
|
||||
|
||||
Signed-off-by: Max Reitz <mreitz@redhat.com>
|
||||
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
|
||||
(cherry picked from commit 8da7969bd7014f6de037d8ae132b40721944b186)
|
||||
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
|
||||
Signed-off-by: Danilo C. L. de Paula <ddepaula@redhat.com>
|
||||
---
|
||||
tests/qemu-iotests/234 | 8 ++++----
|
||||
tests/qemu-iotests/262 | 4 ++--
|
||||
tests/qemu-iotests/280 | 2 +-
|
||||
tests/qemu-iotests/iotests.py | 6 +++++-
|
||||
4 files changed, 12 insertions(+), 8 deletions(-)
|
||||
|
||||
diff --git a/tests/qemu-iotests/234 b/tests/qemu-iotests/234
|
||||
index 34c818c..59a7f94 100755
|
||||
--- a/tests/qemu-iotests/234
|
||||
+++ b/tests/qemu-iotests/234
|
||||
@@ -69,9 +69,9 @@ with iotests.FilePath('img') as img_path, \
|
||||
iotests.log(vm_a.qmp('migrate', uri='exec:cat >%s' % (fifo_a)))
|
||||
with iotests.Timeout(3, 'Migration does not complete'):
|
||||
# Wait for the source first (which includes setup=setup)
|
||||
- vm_a.wait_migration()
|
||||
+ vm_a.wait_migration('postmigrate')
|
||||
# Wait for the destination second (which does not)
|
||||
- vm_b.wait_migration()
|
||||
+ vm_b.wait_migration('running')
|
||||
|
||||
iotests.log(vm_a.qmp('query-migrate')['return']['status'])
|
||||
iotests.log(vm_b.qmp('query-migrate')['return']['status'])
|
||||
@@ -98,9 +98,9 @@ with iotests.FilePath('img') as img_path, \
|
||||
iotests.log(vm_b.qmp('migrate', uri='exec:cat >%s' % (fifo_b)))
|
||||
with iotests.Timeout(3, 'Migration does not complete'):
|
||||
# Wait for the source first (which includes setup=setup)
|
||||
- vm_b.wait_migration()
|
||||
+ vm_b.wait_migration('postmigrate')
|
||||
# Wait for the destination second (which does not)
|
||||
- vm_a.wait_migration()
|
||||
+ vm_a.wait_migration('running')
|
||||
|
||||
iotests.log(vm_a.qmp('query-migrate')['return']['status'])
|
||||
iotests.log(vm_b.qmp('query-migrate')['return']['status'])
|
||||
diff --git a/tests/qemu-iotests/262 b/tests/qemu-iotests/262
|
||||
index 0963daa..bbcb526 100755
|
||||
--- a/tests/qemu-iotests/262
|
||||
+++ b/tests/qemu-iotests/262
|
||||
@@ -71,9 +71,9 @@ with iotests.FilePath('img') as img_path, \
|
||||
iotests.log(vm_a.qmp('migrate', uri='exec:cat >%s' % (fifo)))
|
||||
with iotests.Timeout(3, 'Migration does not complete'):
|
||||
# Wait for the source first (which includes setup=setup)
|
||||
- vm_a.wait_migration()
|
||||
+ vm_a.wait_migration('postmigrate')
|
||||
# Wait for the destination second (which does not)
|
||||
- vm_b.wait_migration()
|
||||
+ vm_b.wait_migration('running')
|
||||
|
||||
iotests.log(vm_a.qmp('query-migrate')['return']['status'])
|
||||
iotests.log(vm_b.qmp('query-migrate')['return']['status'])
|
||||
diff --git a/tests/qemu-iotests/280 b/tests/qemu-iotests/280
|
||||
index 0b1fa8e..85e9114 100755
|
||||
--- a/tests/qemu-iotests/280
|
||||
+++ b/tests/qemu-iotests/280
|
||||
@@ -45,7 +45,7 @@ with iotests.FilePath('base') as base_path , \
|
||||
vm.qmp_log('migrate', uri='exec:cat > /dev/null')
|
||||
|
||||
with iotests.Timeout(3, 'Migration does not complete'):
|
||||
- vm.wait_migration()
|
||||
+ vm.wait_migration('postmigrate')
|
||||
|
||||
iotests.log('\nVM is now stopped:')
|
||||
iotests.log(vm.qmp('query-migrate')['return']['status'])
|
||||
diff --git a/tests/qemu-iotests/iotests.py b/tests/qemu-iotests/iotests.py
|
||||
index 5741efb..0c55f7b 100644
|
||||
--- a/tests/qemu-iotests/iotests.py
|
||||
+++ b/tests/qemu-iotests/iotests.py
|
||||
@@ -663,12 +663,16 @@ class VM(qtest.QEMUQtestMachine):
|
||||
}
|
||||
]))
|
||||
|
||||
- def wait_migration(self):
|
||||
+ def wait_migration(self, expect_runstate):
|
||||
while True:
|
||||
event = self.event_wait('MIGRATION')
|
||||
log(event, filters=[filter_qmp_event])
|
||||
if event['data']['status'] == 'completed':
|
||||
break
|
||||
+ # The event may occur in finish-migrate, so wait for the expected
|
||||
+ # post-migration runstate
|
||||
+ while self.qmp('query-status')['return']['status'] != expect_runstate:
|
||||
+ pass
|
||||
|
||||
def node_info(self, node_name):
|
||||
nodes = self.qmp('query-named-block-nodes')
|
||||
--
|
||||
1.8.3.1
|
||||
|
@ -1,79 +0,0 @@
|
||||
From 1c508d56d154caf5fbf53e7dabafd707236cb16b Mon Sep 17 00:00:00 2001
|
||||
From: jmaloy <jmaloy@redhat.com>
|
||||
Date: Wed, 29 Jan 2020 13:45:18 +0000
|
||||
Subject: [PATCH 06/15] iscsi: Cap block count from GET LBA STATUS
|
||||
(CVE-2020-1711)
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
RH-Author: jmaloy <jmaloy@redhat.com>
|
||||
Message-id: <20200129134518.1293-2-jmaloy@redhat.com>
|
||||
Patchwork-id: 93571
|
||||
O-Subject: [RHEL-AV-8.2.0 qemu-kvm PATCH 1/1] iscsi: Cap block count from GET LBA STATUS (CVE-2020-1711)
|
||||
Bugzilla: 1794503
|
||||
RH-Acked-by: Stefan Hajnoczi <stefanha@redhat.com>
|
||||
RH-Acked-by: Kevin Wolf <kwolf@redhat.com>
|
||||
RH-Acked-by: Philippe Mathieu-Daudé <philmd@redhat.com>
|
||||
|
||||
From: Felipe Franciosi <felipe@nutanix.com>
|
||||
|
||||
When querying an iSCSI server for the provisioning status of blocks (via
|
||||
GET LBA STATUS), Qemu only validates that the response descriptor zero's
|
||||
LBA matches the one requested. Given the SCSI spec allows servers to
|
||||
respond with the status of blocks beyond the end of the LUN, Qemu may
|
||||
have its heap corrupted by clearing/setting too many bits at the end of
|
||||
its allocmap for the LUN.
|
||||
|
||||
A malicious guest in control of the iSCSI server could carefully program
|
||||
Qemu's heap (by selectively setting the bitmap) and then smash it.
|
||||
|
||||
This limits the number of bits that iscsi_co_block_status() will try to
|
||||
update in the allocmap so it can't overflow the bitmap.
|
||||
|
||||
Fixes: CVE-2020-1711
|
||||
Cc: qemu-stable@nongnu.org
|
||||
Signed-off-by: Felipe Franciosi <felipe@nutanix.com>
|
||||
Signed-off-by: Peter Turschmid <peter.turschm@nutanix.com>
|
||||
Signed-off-by: Raphael Norwitz <raphael.norwitz@nutanix.com>
|
||||
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
|
||||
(cherry picked from commit 693fd2acdf14dd86c0bf852610f1c2cca80a74dc)
|
||||
Signed-off-by: Jon Maloy <jmaloy@redhat.com>
|
||||
Signed-off-by: Danilo C. L. de Paula <ddepaula@redhat.com>
|
||||
---
|
||||
block/iscsi.c | 5 +++--
|
||||
1 file changed, 3 insertions(+), 2 deletions(-)
|
||||
|
||||
diff --git a/block/iscsi.c b/block/iscsi.c
|
||||
index 2aea7e3..cbd5729 100644
|
||||
--- a/block/iscsi.c
|
||||
+++ b/block/iscsi.c
|
||||
@@ -701,7 +701,7 @@ static int coroutine_fn iscsi_co_block_status(BlockDriverState *bs,
|
||||
struct scsi_get_lba_status *lbas = NULL;
|
||||
struct scsi_lba_status_descriptor *lbasd = NULL;
|
||||
struct IscsiTask iTask;
|
||||
- uint64_t lba;
|
||||
+ uint64_t lba, max_bytes;
|
||||
int ret;
|
||||
|
||||
iscsi_co_init_iscsitask(iscsilun, &iTask);
|
||||
@@ -721,6 +721,7 @@ static int coroutine_fn iscsi_co_block_status(BlockDriverState *bs,
|
||||
}
|
||||
|
||||
lba = offset / iscsilun->block_size;
|
||||
+ max_bytes = (iscsilun->num_blocks - lba) * iscsilun->block_size;
|
||||
|
||||
qemu_mutex_lock(&iscsilun->mutex);
|
||||
retry:
|
||||
@@ -764,7 +765,7 @@ retry:
|
||||
goto out_unlock;
|
||||
}
|
||||
|
||||
- *pnum = (int64_t) lbasd->num_blocks * iscsilun->block_size;
|
||||
+ *pnum = MIN((int64_t) lbasd->num_blocks * iscsilun->block_size, max_bytes);
|
||||
|
||||
if (lbasd->provisioning == SCSI_PROVISIONING_TYPE_DEALLOCATED ||
|
||||
lbasd->provisioning == SCSI_PROVISIONING_TYPE_ANCHORED) {
|
||||
--
|
||||
1.8.3.1
|
||||
|
@ -1,113 +0,0 @@
|
||||
From 58b7d33e1bc17b89103ceaa39f5722a69b35d810 Mon Sep 17 00:00:00 2001
|
||||
From: Maxim Levitsky <mlevitsk@redhat.com>
|
||||
Date: Wed, 11 Mar 2020 10:51:45 +0000
|
||||
Subject: [PATCH 04/20] iscsi: Drop iscsi_co_create_opts()
|
||||
|
||||
RH-Author: Maxim Levitsky <mlevitsk@redhat.com>
|
||||
Message-id: <20200311105147.13208-5-mlevitsk@redhat.com>
|
||||
Patchwork-id: 94226
|
||||
O-Subject: [RHEL-AV-8.2.0 qemu-kvm PATCH v2 4/6] iscsi: Drop iscsi_co_create_opts()
|
||||
Bugzilla: 1640894
|
||||
RH-Acked-by: Stefano Garzarella <sgarzare@redhat.com>
|
||||
RH-Acked-by: John Snow <jsnow@redhat.com>
|
||||
RH-Acked-by: Max Reitz <mreitz@redhat.com>
|
||||
|
||||
From: Max Reitz <mreitz@redhat.com>
|
||||
|
||||
The generic fallback implementation effectively does the same.
|
||||
|
||||
Reviewed-by: Maxim Levitsky <mlevitsk@redhat.com>
|
||||
Signed-off-by: Max Reitz <mreitz@redhat.com>
|
||||
Message-Id: <20200122164532.178040-5-mreitz@redhat.com>
|
||||
Signed-off-by: Max Reitz <mreitz@redhat.com>
|
||||
(cherry picked from commit 80f0900905b555f00d644894c786b6d66ac2e00e)
|
||||
Signed-off-by: Maxim Levitsky <mlevitsk@redhat.com>
|
||||
Signed-off-by: Danilo C. L. de Paula <ddepaula@redhat.com>
|
||||
---
|
||||
block/iscsi.c | 56 --------------------------------------------------------
|
||||
1 file changed, 56 deletions(-)
|
||||
|
||||
diff --git a/block/iscsi.c b/block/iscsi.c
|
||||
index cbd5729..b45da65 100644
|
||||
--- a/block/iscsi.c
|
||||
+++ b/block/iscsi.c
|
||||
@@ -2164,58 +2164,6 @@ static int coroutine_fn iscsi_co_truncate(BlockDriverState *bs, int64_t offset,
|
||||
return 0;
|
||||
}
|
||||
|
||||
-static int coroutine_fn iscsi_co_create_opts(const char *filename, QemuOpts *opts,
|
||||
- Error **errp)
|
||||
-{
|
||||
- int ret = 0;
|
||||
- int64_t total_size = 0;
|
||||
- BlockDriverState *bs;
|
||||
- IscsiLun *iscsilun = NULL;
|
||||
- QDict *bs_options;
|
||||
- Error *local_err = NULL;
|
||||
-
|
||||
- bs = bdrv_new();
|
||||
-
|
||||
- /* Read out options */
|
||||
- total_size = DIV_ROUND_UP(qemu_opt_get_size_del(opts, BLOCK_OPT_SIZE, 0),
|
||||
- BDRV_SECTOR_SIZE);
|
||||
- bs->opaque = g_new0(struct IscsiLun, 1);
|
||||
- iscsilun = bs->opaque;
|
||||
-
|
||||
- bs_options = qdict_new();
|
||||
- iscsi_parse_filename(filename, bs_options, &local_err);
|
||||
- if (local_err) {
|
||||
- error_propagate(errp, local_err);
|
||||
- ret = -EINVAL;
|
||||
- } else {
|
||||
- ret = iscsi_open(bs, bs_options, 0, NULL);
|
||||
- }
|
||||
- qobject_unref(bs_options);
|
||||
-
|
||||
- if (ret != 0) {
|
||||
- goto out;
|
||||
- }
|
||||
- iscsi_detach_aio_context(bs);
|
||||
- if (iscsilun->type != TYPE_DISK) {
|
||||
- ret = -ENODEV;
|
||||
- goto out;
|
||||
- }
|
||||
- if (bs->total_sectors < total_size) {
|
||||
- ret = -ENOSPC;
|
||||
- goto out;
|
||||
- }
|
||||
-
|
||||
- ret = 0;
|
||||
-out:
|
||||
- if (iscsilun->iscsi != NULL) {
|
||||
- iscsi_destroy_context(iscsilun->iscsi);
|
||||
- }
|
||||
- g_free(bs->opaque);
|
||||
- bs->opaque = NULL;
|
||||
- bdrv_unref(bs);
|
||||
- return ret;
|
||||
-}
|
||||
-
|
||||
static int iscsi_get_info(BlockDriverState *bs, BlockDriverInfo *bdi)
|
||||
{
|
||||
IscsiLun *iscsilun = bs->opaque;
|
||||
@@ -2486,8 +2434,6 @@ static BlockDriver bdrv_iscsi = {
|
||||
.bdrv_parse_filename = iscsi_parse_filename,
|
||||
.bdrv_file_open = iscsi_open,
|
||||
.bdrv_close = iscsi_close,
|
||||
- .bdrv_co_create_opts = iscsi_co_create_opts,
|
||||
- .create_opts = &iscsi_create_opts,
|
||||
.bdrv_reopen_prepare = iscsi_reopen_prepare,
|
||||
.bdrv_reopen_commit = iscsi_reopen_commit,
|
||||
.bdrv_co_invalidate_cache = iscsi_co_invalidate_cache,
|
||||
@@ -2525,8 +2471,6 @@ static BlockDriver bdrv_iser = {
|
||||
.bdrv_parse_filename = iscsi_parse_filename,
|
||||
.bdrv_file_open = iscsi_open,
|
||||
.bdrv_close = iscsi_close,
|
||||
- .bdrv_co_create_opts = iscsi_co_create_opts,
|
||||
- .create_opts = &iscsi_create_opts,
|
||||
.bdrv_reopen_prepare = iscsi_reopen_prepare,
|
||||
.bdrv_reopen_commit = iscsi_reopen_commit,
|
||||
.bdrv_co_invalidate_cache = iscsi_co_invalidate_cache,
|
||||
--
|
||||
1.8.3.1
|
||||
|
@ -1,213 +0,0 @@
|
||||
From 3f16b8a33bd7503cbe857fbeb45fff7301b6bb5f Mon Sep 17 00:00:00 2001
|
||||
From: Kevin Wolf <kwolf@redhat.com>
|
||||
Date: Wed, 8 Apr 2020 17:29:12 +0100
|
||||
Subject: [PATCH 1/6] job: take each job's lock individually in job_txn_apply
|
||||
|
||||
RH-Author: Kevin Wolf <kwolf@redhat.com>
|
||||
Message-id: <20200408172917.18712-2-kwolf@redhat.com>
|
||||
Patchwork-id: 94597
|
||||
O-Subject: [RHEL-AV-8.2.0 qemu-kvm PATCH 1/6] job: take each job's lock individually in job_txn_apply
|
||||
Bugzilla: 1817621
|
||||
RH-Acked-by: Eric Blake <eblake@redhat.com>
|
||||
RH-Acked-by: Danilo de Paula <ddepaula@redhat.com>
|
||||
RH-Acked-by: Max Reitz <mreitz@redhat.com>
|
||||
|
||||
From: Stefan Reiter <s.reiter@proxmox.com>
|
||||
|
||||
All callers of job_txn_apply hold a single job's lock, but different
|
||||
jobs within a transaction can have different contexts, thus we need to
|
||||
lock each one individually before applying the callback function.
|
||||
|
||||
Similar to job_completed_txn_abort this also requires releasing the
|
||||
caller's context before and reacquiring it after to avoid recursive
|
||||
locks which might break AIO_WAIT_WHILE in the callback. This is safe, since
|
||||
existing code would already have to take this into account, lest
|
||||
job_completed_txn_abort might have broken.
|
||||
|
||||
This also brings to light a different issue: When a callback function in
|
||||
job_txn_apply moves it's job to a different AIO context, callers will
|
||||
try to release the wrong lock (now that we re-acquire the lock
|
||||
correctly, previously it would just continue with the old lock, leaving
|
||||
the job unlocked for the rest of the return path). Fix this by not caching
|
||||
the job's context.
|
||||
|
||||
This is only necessary for qmp_block_job_finalize, qmp_job_finalize and
|
||||
job_exit, since everyone else calls through job_exit.
|
||||
|
||||
One test needed adapting, since it calls job_finalize directly, so it
|
||||
manually needs to acquire the correct context.
|
||||
|
||||
Signed-off-by: Stefan Reiter <s.reiter@proxmox.com>
|
||||
Message-Id: <20200407115651.69472-2-s.reiter@proxmox.com>
|
||||
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
|
||||
(cherry picked from commit b660a84bbb0eb1a76b505648d31d5e82594fb75e)
|
||||
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
|
||||
Signed-off-by: Danilo C. L. de Paula <ddepaula@redhat.com>
|
||||
---
|
||||
blockdev.c | 9 +++++++++
|
||||
job-qmp.c | 9 +++++++++
|
||||
job.c | 50 ++++++++++++++++++++++++++++++++++++++++----------
|
||||
tests/test-blockjob.c | 2 ++
|
||||
4 files changed, 60 insertions(+), 10 deletions(-)
|
||||
|
||||
diff --git a/blockdev.c b/blockdev.c
|
||||
index c8d4b51..86eb115 100644
|
||||
--- a/blockdev.c
|
||||
+++ b/blockdev.c
|
||||
@@ -4215,7 +4215,16 @@ void qmp_block_job_finalize(const char *id, Error **errp)
|
||||
}
|
||||
|
||||
trace_qmp_block_job_finalize(job);
|
||||
+ job_ref(&job->job);
|
||||
job_finalize(&job->job, errp);
|
||||
+
|
||||
+ /*
|
||||
+ * Job's context might have changed via job_finalize (and job_txn_apply
|
||||
+ * automatically acquires the new one), so make sure we release the correct
|
||||
+ * one.
|
||||
+ */
|
||||
+ aio_context = blk_get_aio_context(job->blk);
|
||||
+ job_unref(&job->job);
|
||||
aio_context_release(aio_context);
|
||||
}
|
||||
|
||||
diff --git a/job-qmp.c b/job-qmp.c
|
||||
index fbfed25..a201220 100644
|
||||
--- a/job-qmp.c
|
||||
+++ b/job-qmp.c
|
||||
@@ -114,7 +114,16 @@ void qmp_job_finalize(const char *id, Error **errp)
|
||||
}
|
||||
|
||||
trace_qmp_job_finalize(job);
|
||||
+ job_ref(job);
|
||||
job_finalize(job, errp);
|
||||
+
|
||||
+ /*
|
||||
+ * Job's context might have changed via job_finalize (and job_txn_apply
|
||||
+ * automatically acquires the new one), so make sure we release the correct
|
||||
+ * one.
|
||||
+ */
|
||||
+ aio_context = job->aio_context;
|
||||
+ job_unref(job);
|
||||
aio_context_release(aio_context);
|
||||
}
|
||||
|
||||
diff --git a/job.c b/job.c
|
||||
index 04409b4..48fc4ad 100644
|
||||
--- a/job.c
|
||||
+++ b/job.c
|
||||
@@ -136,17 +136,38 @@ static void job_txn_del_job(Job *job)
|
||||
}
|
||||
}
|
||||
|
||||
-static int job_txn_apply(JobTxn *txn, int fn(Job *))
|
||||
+static int job_txn_apply(Job *job, int fn(Job *))
|
||||
{
|
||||
- Job *job, *next;
|
||||
+ AioContext *inner_ctx;
|
||||
+ Job *other_job, *next;
|
||||
+ JobTxn *txn = job->txn;
|
||||
int rc = 0;
|
||||
|
||||
- QLIST_FOREACH_SAFE(job, &txn->jobs, txn_list, next) {
|
||||
- rc = fn(job);
|
||||
+ /*
|
||||
+ * Similar to job_completed_txn_abort, we take each job's lock before
|
||||
+ * applying fn, but since we assume that outer_ctx is held by the caller,
|
||||
+ * we need to release it here to avoid holding the lock twice - which would
|
||||
+ * break AIO_WAIT_WHILE from within fn.
|
||||
+ */
|
||||
+ job_ref(job);
|
||||
+ aio_context_release(job->aio_context);
|
||||
+
|
||||
+ QLIST_FOREACH_SAFE(other_job, &txn->jobs, txn_list, next) {
|
||||
+ inner_ctx = other_job->aio_context;
|
||||
+ aio_context_acquire(inner_ctx);
|
||||
+ rc = fn(other_job);
|
||||
+ aio_context_release(inner_ctx);
|
||||
if (rc) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
+
|
||||
+ /*
|
||||
+ * Note that job->aio_context might have been changed by calling fn, so we
|
||||
+ * can't use a local variable to cache it.
|
||||
+ */
|
||||
+ aio_context_acquire(job->aio_context);
|
||||
+ job_unref(job);
|
||||
return rc;
|
||||
}
|
||||
|
||||
@@ -774,11 +795,11 @@ static void job_do_finalize(Job *job)
|
||||
assert(job && job->txn);
|
||||
|
||||
/* prepare the transaction to complete */
|
||||
- rc = job_txn_apply(job->txn, job_prepare);
|
||||
+ rc = job_txn_apply(job, job_prepare);
|
||||
if (rc) {
|
||||
job_completed_txn_abort(job);
|
||||
} else {
|
||||
- job_txn_apply(job->txn, job_finalize_single);
|
||||
+ job_txn_apply(job, job_finalize_single);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -824,10 +845,10 @@ static void job_completed_txn_success(Job *job)
|
||||
assert(other_job->ret == 0);
|
||||
}
|
||||
|
||||
- job_txn_apply(txn, job_transition_to_pending);
|
||||
+ job_txn_apply(job, job_transition_to_pending);
|
||||
|
||||
/* If no jobs need manual finalization, automatically do so */
|
||||
- if (job_txn_apply(txn, job_needs_finalize) == 0) {
|
||||
+ if (job_txn_apply(job, job_needs_finalize) == 0) {
|
||||
job_do_finalize(job);
|
||||
}
|
||||
}
|
||||
@@ -849,9 +870,10 @@ static void job_completed(Job *job)
|
||||
static void job_exit(void *opaque)
|
||||
{
|
||||
Job *job = (Job *)opaque;
|
||||
- AioContext *ctx = job->aio_context;
|
||||
+ AioContext *ctx;
|
||||
|
||||
- aio_context_acquire(ctx);
|
||||
+ job_ref(job);
|
||||
+ aio_context_acquire(job->aio_context);
|
||||
|
||||
/* This is a lie, we're not quiescent, but still doing the completion
|
||||
* callbacks. However, completion callbacks tend to involve operations that
|
||||
@@ -862,6 +884,14 @@ static void job_exit(void *opaque)
|
||||
|
||||
job_completed(job);
|
||||
|
||||
+ /*
|
||||
+ * Note that calling job_completed can move the job to a different
|
||||
+ * aio_context, so we cannot cache from above. job_txn_apply takes care of
|
||||
+ * acquiring the new lock, and we ref/unref to avoid job_completed freeing
|
||||
+ * the job underneath us.
|
||||
+ */
|
||||
+ ctx = job->aio_context;
|
||||
+ job_unref(job);
|
||||
aio_context_release(ctx);
|
||||
}
|
||||
|
||||
diff --git a/tests/test-blockjob.c b/tests/test-blockjob.c
|
||||
index 7844c9f..6d857fd 100644
|
||||
--- a/tests/test-blockjob.c
|
||||
+++ b/tests/test-blockjob.c
|
||||
@@ -368,7 +368,9 @@ static void test_cancel_concluded(void)
|
||||
aio_poll(qemu_get_aio_context(), true);
|
||||
assert(job->status == JOB_STATUS_PENDING);
|
||||
|
||||
+ aio_context_acquire(job->aio_context);
|
||||
job_finalize(job, &error_abort);
|
||||
+ aio_context_release(job->aio_context);
|
||||
assert(job->status == JOB_STATUS_CONCLUDED);
|
||||
|
||||
cancel_common(s);
|
||||
--
|
||||
1.8.3.1
|
||||
|
@ -1,117 +0,0 @@
|
||||
From ee360b70f179cf540faebe7e55b34e323e2bb179 Mon Sep 17 00:00:00 2001
|
||||
From: "Dr. David Alan Gilbert" <dgilbert@redhat.com>
|
||||
Date: Mon, 27 Jan 2020 19:02:09 +0100
|
||||
Subject: [PATCH 098/116] libvhost-user: Fix some memtable remap cases
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
RH-Author: Dr. David Alan Gilbert <dgilbert@redhat.com>
|
||||
Message-id: <20200127190227.40942-95-dgilbert@redhat.com>
|
||||
Patchwork-id: 93548
|
||||
O-Subject: [RHEL-AV-8.2 qemu-kvm PATCH 094/112] libvhost-user: Fix some memtable remap cases
|
||||
Bugzilla: 1694164
|
||||
RH-Acked-by: Philippe Mathieu-Daudé <philmd@redhat.com>
|
||||
RH-Acked-by: Stefan Hajnoczi <stefanha@redhat.com>
|
||||
RH-Acked-by: Sergio Lopez Pascual <slp@redhat.com>
|
||||
|
||||
From: "Dr. David Alan Gilbert" <dgilbert@redhat.com>
|
||||
|
||||
If a new setmemtable command comes in once the vhost threads are
|
||||
running, it will remap the guests address space and the threads
|
||||
will now be looking in the wrong place.
|
||||
|
||||
Fortunately we're running this command under lock, so we can
|
||||
update the queue mappings so that threads will look in the new-right
|
||||
place.
|
||||
|
||||
Note: This doesn't fix things that the threads might be doing
|
||||
without a lock (e.g. a readv/writev!) That's for another time.
|
||||
|
||||
Signed-off-by: Dr. David Alan Gilbert <dgilbert@redhat.com>
|
||||
(cherry picked from commit 49e9ec749d4db62ae51f76354143cee183912a1d)
|
||||
Signed-off-by: Miroslav Rezanina <mrezanin@redhat.com>
|
||||
---
|
||||
contrib/libvhost-user/libvhost-user.c | 33 +++++++++++++++++++++++++--------
|
||||
contrib/libvhost-user/libvhost-user.h | 3 +++
|
||||
2 files changed, 28 insertions(+), 8 deletions(-)
|
||||
|
||||
diff --git a/contrib/libvhost-user/libvhost-user.c b/contrib/libvhost-user/libvhost-user.c
|
||||
index 63e4106..b89bf18 100644
|
||||
--- a/contrib/libvhost-user/libvhost-user.c
|
||||
+++ b/contrib/libvhost-user/libvhost-user.c
|
||||
@@ -565,6 +565,21 @@ vu_reset_device_exec(VuDev *dev, VhostUserMsg *vmsg)
|
||||
}
|
||||
|
||||
static bool
|
||||
+map_ring(VuDev *dev, VuVirtq *vq)
|
||||
+{
|
||||
+ vq->vring.desc = qva_to_va(dev, vq->vra.desc_user_addr);
|
||||
+ vq->vring.used = qva_to_va(dev, vq->vra.used_user_addr);
|
||||
+ vq->vring.avail = qva_to_va(dev, vq->vra.avail_user_addr);
|
||||
+
|
||||
+ DPRINT("Setting virtq addresses:\n");
|
||||
+ DPRINT(" vring_desc at %p\n", vq->vring.desc);
|
||||
+ DPRINT(" vring_used at %p\n", vq->vring.used);
|
||||
+ DPRINT(" vring_avail at %p\n", vq->vring.avail);
|
||||
+
|
||||
+ return !(vq->vring.desc && vq->vring.used && vq->vring.avail);
|
||||
+}
|
||||
+
|
||||
+static bool
|
||||
vu_set_mem_table_exec_postcopy(VuDev *dev, VhostUserMsg *vmsg)
|
||||
{
|
||||
int i;
|
||||
@@ -767,6 +782,14 @@ vu_set_mem_table_exec(VuDev *dev, VhostUserMsg *vmsg)
|
||||
close(vmsg->fds[i]);
|
||||
}
|
||||
|
||||
+ for (i = 0; i < dev->max_queues; i++) {
|
||||
+ if (dev->vq[i].vring.desc) {
|
||||
+ if (map_ring(dev, &dev->vq[i])) {
|
||||
+ vu_panic(dev, "remaping queue %d during setmemtable", i);
|
||||
+ }
|
||||
+ }
|
||||
+ }
|
||||
+
|
||||
return false;
|
||||
}
|
||||
|
||||
@@ -853,18 +876,12 @@ vu_set_vring_addr_exec(VuDev *dev, VhostUserMsg *vmsg)
|
||||
DPRINT(" avail_user_addr: 0x%016" PRIx64 "\n", vra->avail_user_addr);
|
||||
DPRINT(" log_guest_addr: 0x%016" PRIx64 "\n", vra->log_guest_addr);
|
||||
|
||||
+ vq->vra = *vra;
|
||||
vq->vring.flags = vra->flags;
|
||||
- vq->vring.desc = qva_to_va(dev, vra->desc_user_addr);
|
||||
- vq->vring.used = qva_to_va(dev, vra->used_user_addr);
|
||||
- vq->vring.avail = qva_to_va(dev, vra->avail_user_addr);
|
||||
vq->vring.log_guest_addr = vra->log_guest_addr;
|
||||
|
||||
- DPRINT("Setting virtq addresses:\n");
|
||||
- DPRINT(" vring_desc at %p\n", vq->vring.desc);
|
||||
- DPRINT(" vring_used at %p\n", vq->vring.used);
|
||||
- DPRINT(" vring_avail at %p\n", vq->vring.avail);
|
||||
|
||||
- if (!(vq->vring.desc && vq->vring.used && vq->vring.avail)) {
|
||||
+ if (map_ring(dev, vq)) {
|
||||
vu_panic(dev, "Invalid vring_addr message");
|
||||
return false;
|
||||
}
|
||||
diff --git a/contrib/libvhost-user/libvhost-user.h b/contrib/libvhost-user/libvhost-user.h
|
||||
index 1844b6f..5cb7708 100644
|
||||
--- a/contrib/libvhost-user/libvhost-user.h
|
||||
+++ b/contrib/libvhost-user/libvhost-user.h
|
||||
@@ -327,6 +327,9 @@ typedef struct VuVirtq {
|
||||
int err_fd;
|
||||
unsigned int enable;
|
||||
bool started;
|
||||
+
|
||||
+ /* Guest addresses of our ring */
|
||||
+ struct vhost_vring_addr vra;
|
||||
} VuVirtq;
|
||||
|
||||
enum VuWatchCondtion {
|
||||
--
|
||||
1.8.3.1
|
||||
|
@ -1,179 +0,0 @@
|
||||
From 38a032829b6b8d523b4cee05f732031e66fc2e41 Mon Sep 17 00:00:00 2001
|
||||
From: Peter Xu <peterx@redhat.com>
|
||||
Date: Fri, 31 Jan 2020 17:12:56 +0000
|
||||
Subject: [PATCH 14/15] migration: Change SaveStateEntry.instance_id into
|
||||
uint32_t
|
||||
|
||||
RH-Author: Peter Xu <peterx@redhat.com>
|
||||
Message-id: <20200131171257.1066593-3-peterx@redhat.com>
|
||||
Patchwork-id: 93629
|
||||
O-Subject: [RHEL-AV-8.2.0 qemu-kvm PATCH 2/3] migration: Change SaveStateEntry.instance_id into uint32_t
|
||||
Bugzilla: 1529231
|
||||
RH-Acked-by: Eduardo Habkost <ehabkost@redhat.com>
|
||||
RH-Acked-by: Juan Quintela <quintela@redhat.com>
|
||||
RH-Acked-by: Dr. David Alan Gilbert <dgilbert@redhat.com>
|
||||
|
||||
It was always used as 32bit, so define it as used to be clear.
|
||||
Instead of using -1 as the auto-gen magic value, we switch to
|
||||
UINT32_MAX. We also make sure that we don't auto-gen this value to
|
||||
avoid overflowed instance IDs without being noticed.
|
||||
|
||||
Suggested-by: Juan Quintela <quintela@redhat.com>
|
||||
Signed-off-by: Peter Xu <peterx@redhat.com>
|
||||
Reviewed-by: Juan Quintela <quintela@redhat.com>
|
||||
Signed-off-by: Juan Quintela <quintela@redhat.com>
|
||||
(cherry picked from commit 93062e23619e057743757ee53bf7f8e07f7a3710)
|
||||
Signed-off-by: Peter Xu <peterx@redhat.com>
|
||||
Signed-off-by: Danilo C. L. de Paula <ddepaula@redhat.com>
|
||||
|
||||
Conflicts:
|
||||
include/migration/vmstate.h
|
||||
migration/savevm.c
|
||||
stubs/vmstate.c
|
||||
Due to missing 3cad405bab ("vmstate: replace DeviceState with
|
||||
VMStateIf", 2020-01-06)
|
||||
|
||||
Signed-off-by: Danilo C. L. de Paula <ddepaula@redhat.com>
|
||||
---
|
||||
hw/intc/apic_common.c | 2 +-
|
||||
include/migration/register.h | 2 +-
|
||||
include/migration/vmstate.h | 2 +-
|
||||
migration/savevm.c | 18 ++++++++++--------
|
||||
stubs/vmstate.c | 2 +-
|
||||
5 files changed, 14 insertions(+), 12 deletions(-)
|
||||
|
||||
diff --git a/hw/intc/apic_common.c b/hw/intc/apic_common.c
|
||||
index f2c3a7f..54b8731 100644
|
||||
--- a/hw/intc/apic_common.c
|
||||
+++ b/hw/intc/apic_common.c
|
||||
@@ -268,7 +268,7 @@ static void apic_common_realize(DeviceState *dev, Error **errp)
|
||||
APICCommonState *s = APIC_COMMON(dev);
|
||||
APICCommonClass *info;
|
||||
static DeviceState *vapic;
|
||||
- int instance_id = s->id;
|
||||
+ uint32_t instance_id = s->id;
|
||||
|
||||
info = APIC_COMMON_GET_CLASS(s);
|
||||
info->realize(dev, errp);
|
||||
diff --git a/include/migration/register.h b/include/migration/register.h
|
||||
index a13359a..f3ba10b 100644
|
||||
--- a/include/migration/register.h
|
||||
+++ b/include/migration/register.h
|
||||
@@ -69,7 +69,7 @@ typedef struct SaveVMHandlers {
|
||||
} SaveVMHandlers;
|
||||
|
||||
int register_savevm_live(const char *idstr,
|
||||
- int instance_id,
|
||||
+ uint32_t instance_id,
|
||||
int version_id,
|
||||
const SaveVMHandlers *ops,
|
||||
void *opaque);
|
||||
diff --git a/include/migration/vmstate.h b/include/migration/vmstate.h
|
||||
index 883f1cf..296609c 100644
|
||||
--- a/include/migration/vmstate.h
|
||||
+++ b/include/migration/vmstate.h
|
||||
@@ -1158,7 +1158,7 @@ bool vmstate_save_needed(const VMStateDescription *vmsd, void *opaque);
|
||||
#define VMSTATE_INSTANCE_ID_ANY -1
|
||||
|
||||
/* Returns: 0 on success, -1 on failure */
|
||||
-int vmstate_register_with_alias_id(DeviceState *dev, int instance_id,
|
||||
+int vmstate_register_with_alias_id(DeviceState *dev, uint32_t instance_id,
|
||||
const VMStateDescription *vmsd,
|
||||
void *base, int alias_id,
|
||||
int required_for_version,
|
||||
diff --git a/migration/savevm.c b/migration/savevm.c
|
||||
index e2e8e0a..a80bb52 100644
|
||||
--- a/migration/savevm.c
|
||||
+++ b/migration/savevm.c
|
||||
@@ -233,7 +233,7 @@ typedef struct CompatEntry {
|
||||
typedef struct SaveStateEntry {
|
||||
QTAILQ_ENTRY(SaveStateEntry) entry;
|
||||
char idstr[256];
|
||||
- int instance_id;
|
||||
+ uint32_t instance_id;
|
||||
int alias_id;
|
||||
int version_id;
|
||||
/* version id read from the stream */
|
||||
@@ -665,10 +665,10 @@ void dump_vmstate_json_to_file(FILE *out_file)
|
||||
fclose(out_file);
|
||||
}
|
||||
|
||||
-static int calculate_new_instance_id(const char *idstr)
|
||||
+static uint32_t calculate_new_instance_id(const char *idstr)
|
||||
{
|
||||
SaveStateEntry *se;
|
||||
- int instance_id = 0;
|
||||
+ uint32_t instance_id = 0;
|
||||
|
||||
QTAILQ_FOREACH(se, &savevm_state.handlers, entry) {
|
||||
if (strcmp(idstr, se->idstr) == 0
|
||||
@@ -676,6 +676,8 @@ static int calculate_new_instance_id(const char *idstr)
|
||||
instance_id = se->instance_id + 1;
|
||||
}
|
||||
}
|
||||
+ /* Make sure we never loop over without being noticed */
|
||||
+ assert(instance_id != VMSTATE_INSTANCE_ID_ANY);
|
||||
return instance_id;
|
||||
}
|
||||
|
||||
@@ -730,7 +732,7 @@ static void savevm_state_handler_insert(SaveStateEntry *nse)
|
||||
Meanwhile pass -1 as instance_id if you do not already have a clearly
|
||||
distinguishing id for all instances of your device class. */
|
||||
int register_savevm_live(const char *idstr,
|
||||
- int instance_id,
|
||||
+ uint32_t instance_id,
|
||||
int version_id,
|
||||
const SaveVMHandlers *ops,
|
||||
void *opaque)
|
||||
@@ -784,7 +786,7 @@ void unregister_savevm(DeviceState *dev, const char *idstr, void *opaque)
|
||||
}
|
||||
}
|
||||
|
||||
-int vmstate_register_with_alias_id(DeviceState *dev, int instance_id,
|
||||
+int vmstate_register_with_alias_id(DeviceState *dev, uint32_t instance_id,
|
||||
const VMStateDescription *vmsd,
|
||||
void *opaque, int alias_id,
|
||||
int required_for_version,
|
||||
@@ -1600,7 +1602,7 @@ int qemu_save_device_state(QEMUFile *f)
|
||||
return qemu_file_get_error(f);
|
||||
}
|
||||
|
||||
-static SaveStateEntry *find_se(const char *idstr, int instance_id)
|
||||
+static SaveStateEntry *find_se(const char *idstr, uint32_t instance_id)
|
||||
{
|
||||
SaveStateEntry *se;
|
||||
|
||||
@@ -2267,7 +2269,7 @@ qemu_loadvm_section_start_full(QEMUFile *f, MigrationIncomingState *mis)
|
||||
/* Find savevm section */
|
||||
se = find_se(idstr, instance_id);
|
||||
if (se == NULL) {
|
||||
- error_report("Unknown savevm section or instance '%s' %d. "
|
||||
+ error_report("Unknown savevm section or instance '%s' %"PRIu32". "
|
||||
"Make sure that your current VM setup matches your "
|
||||
"saved VM setup, including any hotplugged devices",
|
||||
idstr, instance_id);
|
||||
@@ -2291,7 +2293,7 @@ qemu_loadvm_section_start_full(QEMUFile *f, MigrationIncomingState *mis)
|
||||
|
||||
ret = vmstate_load(f, se);
|
||||
if (ret < 0) {
|
||||
- error_report("error while loading state for instance 0x%x of"
|
||||
+ error_report("error while loading state for instance 0x%"PRIx32" of"
|
||||
" device '%s'", instance_id, idstr);
|
||||
return ret;
|
||||
}
|
||||
diff --git a/stubs/vmstate.c b/stubs/vmstate.c
|
||||
index e1e89b8..4ed5cc6 100644
|
||||
--- a/stubs/vmstate.c
|
||||
+++ b/stubs/vmstate.c
|
||||
@@ -4,7 +4,7 @@
|
||||
const VMStateDescription vmstate_dummy = {};
|
||||
|
||||
int vmstate_register_with_alias_id(DeviceState *dev,
|
||||
- int instance_id,
|
||||
+ uint32_t instance_id,
|
||||
const VMStateDescription *vmsd,
|
||||
void *base, int alias_id,
|
||||
int required_for_version,
|
||||
--
|
||||
1.8.3.1
|
||||
|
@ -1,119 +0,0 @@
|
||||
From c9e3d13d70a24bf606ce351886b27bdca25ef4dc Mon Sep 17 00:00:00 2001
|
||||
From: Juan Quintela <quintela@redhat.com>
|
||||
Date: Tue, 3 Mar 2020 14:51:41 +0000
|
||||
Subject: [PATCH 09/18] migration: Create migration_is_running()
|
||||
|
||||
RH-Author: Juan Quintela <quintela@redhat.com>
|
||||
Message-id: <20200303145143.149290-9-quintela@redhat.com>
|
||||
Patchwork-id: 94115
|
||||
O-Subject: [RHEL-AV-8.2.0 qemu-kvm PATCH v2 08/10] migration: Create migration_is_running()
|
||||
Bugzilla: 1738451
|
||||
RH-Acked-by: Laurent Vivier <lvivier@redhat.com>
|
||||
RH-Acked-by: Peter Xu <peterx@redhat.com>
|
||||
RH-Acked-by: Dr. David Alan Gilbert <dgilbert@redhat.com>
|
||||
|
||||
This function returns true if we are in the middle of a migration.
|
||||
It is like migration_is_setup_or_active() with CANCELLING and COLO.
|
||||
Adapt all callers that are needed.
|
||||
|
||||
Signed-off-by: Juan Quintela <quintela@redhat.com>
|
||||
Reviewed-by: Dr. David Alan Gilbert <dgilbert@redhat.com>
|
||||
(cherry picked from commit 392d87e21325fdb01210176faa07472b4985ccf0)
|
||||
Signed-off-by: Danilo C. L. de Paula <ddepaula@redhat.com>
|
||||
---
|
||||
migration/migration.c | 29 ++++++++++++++++++++++++-----
|
||||
migration/migration.h | 1 +
|
||||
migration/savevm.c | 4 +---
|
||||
3 files changed, 26 insertions(+), 8 deletions(-)
|
||||
|
||||
diff --git a/migration/migration.c b/migration/migration.c
|
||||
index 30c53c6..eb50d77 100644
|
||||
--- a/migration/migration.c
|
||||
+++ b/migration/migration.c
|
||||
@@ -831,6 +831,27 @@ bool migration_is_setup_or_active(int state)
|
||||
}
|
||||
}
|
||||
|
||||
+bool migration_is_running(int state)
|
||||
+{
|
||||
+ switch (state) {
|
||||
+ case MIGRATION_STATUS_ACTIVE:
|
||||
+ case MIGRATION_STATUS_POSTCOPY_ACTIVE:
|
||||
+ case MIGRATION_STATUS_POSTCOPY_PAUSED:
|
||||
+ case MIGRATION_STATUS_POSTCOPY_RECOVER:
|
||||
+ case MIGRATION_STATUS_SETUP:
|
||||
+ case MIGRATION_STATUS_PRE_SWITCHOVER:
|
||||
+ case MIGRATION_STATUS_DEVICE:
|
||||
+ case MIGRATION_STATUS_WAIT_UNPLUG:
|
||||
+ case MIGRATION_STATUS_CANCELLING:
|
||||
+ case MIGRATION_STATUS_COLO:
|
||||
+ return true;
|
||||
+
|
||||
+ default:
|
||||
+ return false;
|
||||
+
|
||||
+ }
|
||||
+}
|
||||
+
|
||||
static void populate_time_info(MigrationInfo *info, MigrationState *s)
|
||||
{
|
||||
info->has_status = true;
|
||||
@@ -1090,7 +1111,7 @@ void qmp_migrate_set_capabilities(MigrationCapabilityStatusList *params,
|
||||
MigrationCapabilityStatusList *cap;
|
||||
bool cap_list[MIGRATION_CAPABILITY__MAX];
|
||||
|
||||
- if (migration_is_setup_or_active(s->state)) {
|
||||
+ if (migration_is_running(s->state)) {
|
||||
error_setg(errp, QERR_MIGRATION_ACTIVE);
|
||||
return;
|
||||
}
|
||||
@@ -1603,7 +1624,7 @@ static void migrate_fd_cancel(MigrationState *s)
|
||||
|
||||
do {
|
||||
old_state = s->state;
|
||||
- if (!migration_is_setup_or_active(old_state)) {
|
||||
+ if (!migration_is_running(old_state)) {
|
||||
break;
|
||||
}
|
||||
/* If the migration is paused, kick it out of the pause */
|
||||
@@ -1900,9 +1921,7 @@ static bool migrate_prepare(MigrationState *s, bool blk, bool blk_inc,
|
||||
return true;
|
||||
}
|
||||
|
||||
- if (migration_is_setup_or_active(s->state) ||
|
||||
- s->state == MIGRATION_STATUS_CANCELLING ||
|
||||
- s->state == MIGRATION_STATUS_COLO) {
|
||||
+ if (migration_is_running(s->state)) {
|
||||
error_setg(errp, QERR_MIGRATION_ACTIVE);
|
||||
return false;
|
||||
}
|
||||
diff --git a/migration/migration.h b/migration/migration.h
|
||||
index 0b1b0d4..a2b2336 100644
|
||||
--- a/migration/migration.h
|
||||
+++ b/migration/migration.h
|
||||
@@ -279,6 +279,7 @@ void migrate_fd_error(MigrationState *s, const Error *error);
|
||||
void migrate_fd_connect(MigrationState *s, Error *error_in);
|
||||
|
||||
bool migration_is_setup_or_active(int state);
|
||||
+bool migration_is_running(int state);
|
||||
|
||||
void migrate_init(MigrationState *s);
|
||||
bool migration_is_blocked(Error **errp);
|
||||
diff --git a/migration/savevm.c b/migration/savevm.c
|
||||
index a80bb52..144ecf0 100644
|
||||
--- a/migration/savevm.c
|
||||
+++ b/migration/savevm.c
|
||||
@@ -1506,9 +1506,7 @@ static int qemu_savevm_state(QEMUFile *f, Error **errp)
|
||||
MigrationState *ms = migrate_get_current();
|
||||
MigrationStatus status;
|
||||
|
||||
- if (migration_is_setup_or_active(ms->state) ||
|
||||
- ms->state == MIGRATION_STATUS_CANCELLING ||
|
||||
- ms->state == MIGRATION_STATUS_COLO) {
|
||||
+ if (migration_is_running(ms->state)) {
|
||||
error_setg(errp, QERR_MIGRATION_ACTIVE);
|
||||
return -EINVAL;
|
||||
}
|
||||
--
|
||||
1.8.3.1
|
||||
|
@ -1,257 +0,0 @@
|
||||
From 2659af9267586fb626f543773bf3f844727e473b Mon Sep 17 00:00:00 2001
|
||||
From: Peter Xu <peterx@redhat.com>
|
||||
Date: Fri, 31 Jan 2020 17:12:55 +0000
|
||||
Subject: [PATCH 13/15] migration: Define VMSTATE_INSTANCE_ID_ANY
|
||||
|
||||
RH-Author: Peter Xu <peterx@redhat.com>
|
||||
Message-id: <20200131171257.1066593-2-peterx@redhat.com>
|
||||
Patchwork-id: 93630
|
||||
O-Subject: [RHEL-AV-8.2.0 qemu-kvm PATCH 1/3] migration: Define VMSTATE_INSTANCE_ID_ANY
|
||||
Bugzilla: 1529231
|
||||
RH-Acked-by: Eduardo Habkost <ehabkost@redhat.com>
|
||||
RH-Acked-by: Juan Quintela <quintela@redhat.com>
|
||||
RH-Acked-by: Dr. David Alan Gilbert <dgilbert@redhat.com>
|
||||
|
||||
Define the new macro VMSTATE_INSTANCE_ID_ANY for callers who wants to
|
||||
auto-generate the vmstate instance ID. Previously it was hard coded
|
||||
as -1 instead of this macro. It helps to change this default value in
|
||||
the follow up patches. No functional change.
|
||||
|
||||
Signed-off-by: Peter Xu <peterx@redhat.com>
|
||||
Reviewed-by: Juan Quintela <quintela@redhat.com>
|
||||
Signed-off-by: Juan Quintela <quintela@redhat.com>
|
||||
(cherry picked from commit 1df2c9a26fcb2fa32d099f8e9adcdae4207872e3)
|
||||
Signed-off-by: Peter Xu <peterx@redhat.com>
|
||||
Signed-off-by: Danilo C. L. de Paula <ddepaula@redhat.com>
|
||||
|
||||
Conflicts:
|
||||
backends/dbus-vmstate.c
|
||||
File deleted
|
||||
hw/core/qdev.c
|
||||
hw/misc/max111x.c
|
||||
hw/net/eepro100.c
|
||||
Due to missing commit 3cad405bab ("vmstate: replace
|
||||
DeviceState with VMStateIf", 2020-01-06)
|
||||
|
||||
Signed-off-by: Danilo C. L. de Paula <ddepaula@redhat.com>
|
||||
---
|
||||
hw/arm/stellaris.c | 2 +-
|
||||
hw/core/qdev.c | 3 ++-
|
||||
hw/display/ads7846.c | 2 +-
|
||||
hw/i2c/core.c | 2 +-
|
||||
hw/input/stellaris_input.c | 3 ++-
|
||||
hw/intc/apic_common.c | 2 +-
|
||||
hw/misc/max111x.c | 2 +-
|
||||
hw/net/eepro100.c | 2 +-
|
||||
hw/pci/pci.c | 2 +-
|
||||
hw/ppc/spapr.c | 2 +-
|
||||
hw/timer/arm_timer.c | 2 +-
|
||||
hw/tpm/tpm_emulator.c | 3 ++-
|
||||
include/migration/vmstate.h | 2 ++
|
||||
migration/savevm.c | 8 ++++----
|
||||
14 files changed, 21 insertions(+), 16 deletions(-)
|
||||
|
||||
diff --git a/hw/arm/stellaris.c b/hw/arm/stellaris.c
|
||||
index b198066..bb025e0 100644
|
||||
--- a/hw/arm/stellaris.c
|
||||
+++ b/hw/arm/stellaris.c
|
||||
@@ -708,7 +708,7 @@ static int stellaris_sys_init(uint32_t base, qemu_irq irq,
|
||||
memory_region_init_io(&s->iomem, NULL, &ssys_ops, s, "ssys", 0x00001000);
|
||||
memory_region_add_subregion(get_system_memory(), base, &s->iomem);
|
||||
ssys_reset(s);
|
||||
- vmstate_register(NULL, -1, &vmstate_stellaris_sys, s);
|
||||
+ vmstate_register(NULL, VMSTATE_INSTANCE_ID_ANY, &vmstate_stellaris_sys, s);
|
||||
return 0;
|
||||
}
|
||||
|
||||
diff --git a/hw/core/qdev.c b/hw/core/qdev.c
|
||||
index cf1ba28..40f6b2b 100644
|
||||
--- a/hw/core/qdev.c
|
||||
+++ b/hw/core/qdev.c
|
||||
@@ -890,7 +890,8 @@ static void device_set_realized(Object *obj, bool value, Error **errp)
|
||||
dev->canonical_path = object_get_canonical_path(OBJECT(dev));
|
||||
|
||||
if (qdev_get_vmsd(dev)) {
|
||||
- if (vmstate_register_with_alias_id(dev, -1, qdev_get_vmsd(dev), dev,
|
||||
+ if (vmstate_register_with_alias_id(dev, VMSTATE_INSTANCE_ID_ANY,
|
||||
+ qdev_get_vmsd(dev), dev,
|
||||
dev->instance_id_alias,
|
||||
dev->alias_required_for_version,
|
||||
&local_err) < 0) {
|
||||
diff --git a/hw/display/ads7846.c b/hw/display/ads7846.c
|
||||
index c12272a..9228b40 100644
|
||||
--- a/hw/display/ads7846.c
|
||||
+++ b/hw/display/ads7846.c
|
||||
@@ -154,7 +154,7 @@ static void ads7846_realize(SSISlave *d, Error **errp)
|
||||
|
||||
ads7846_int_update(s);
|
||||
|
||||
- vmstate_register(NULL, -1, &vmstate_ads7846, s);
|
||||
+ vmstate_register(NULL, VMSTATE_INSTANCE_ID_ANY, &vmstate_ads7846, s);
|
||||
}
|
||||
|
||||
static void ads7846_class_init(ObjectClass *klass, void *data)
|
||||
diff --git a/hw/i2c/core.c b/hw/i2c/core.c
|
||||
index 92cd489..d770035 100644
|
||||
--- a/hw/i2c/core.c
|
||||
+++ b/hw/i2c/core.c
|
||||
@@ -61,7 +61,7 @@ I2CBus *i2c_init_bus(DeviceState *parent, const char *name)
|
||||
|
||||
bus = I2C_BUS(qbus_create(TYPE_I2C_BUS, parent, name));
|
||||
QLIST_INIT(&bus->current_devs);
|
||||
- vmstate_register(NULL, -1, &vmstate_i2c_bus, bus);
|
||||
+ vmstate_register(NULL, VMSTATE_INSTANCE_ID_ANY, &vmstate_i2c_bus, bus);
|
||||
return bus;
|
||||
}
|
||||
|
||||
diff --git a/hw/input/stellaris_input.c b/hw/input/stellaris_input.c
|
||||
index 59892b0..e6ee5e1 100644
|
||||
--- a/hw/input/stellaris_input.c
|
||||
+++ b/hw/input/stellaris_input.c
|
||||
@@ -88,5 +88,6 @@ void stellaris_gamepad_init(int n, qemu_irq *irq, const int *keycode)
|
||||
}
|
||||
s->num_buttons = n;
|
||||
qemu_add_kbd_event_handler(stellaris_gamepad_put_key, s);
|
||||
- vmstate_register(NULL, -1, &vmstate_stellaris_gamepad, s);
|
||||
+ vmstate_register(NULL, VMSTATE_INSTANCE_ID_ANY,
|
||||
+ &vmstate_stellaris_gamepad, s);
|
||||
}
|
||||
diff --git a/hw/intc/apic_common.c b/hw/intc/apic_common.c
|
||||
index 375cb6a..f2c3a7f 100644
|
||||
--- a/hw/intc/apic_common.c
|
||||
+++ b/hw/intc/apic_common.c
|
||||
@@ -284,7 +284,7 @@ static void apic_common_realize(DeviceState *dev, Error **errp)
|
||||
}
|
||||
|
||||
if (s->legacy_instance_id) {
|
||||
- instance_id = -1;
|
||||
+ instance_id = VMSTATE_INSTANCE_ID_ANY;
|
||||
}
|
||||
vmstate_register_with_alias_id(NULL, instance_id, &vmstate_apic_common,
|
||||
s, -1, 0, NULL);
|
||||
diff --git a/hw/misc/max111x.c b/hw/misc/max111x.c
|
||||
index a713149..81ee73e 100644
|
||||
--- a/hw/misc/max111x.c
|
||||
+++ b/hw/misc/max111x.c
|
||||
@@ -146,7 +146,7 @@ static int max111x_init(SSISlave *d, int inputs)
|
||||
s->input[7] = 0x80;
|
||||
s->com = 0;
|
||||
|
||||
- vmstate_register(dev, -1, &vmstate_max111x, s);
|
||||
+ vmstate_register(dev, VMSTATE_INSTANCE_ID_ANY, &vmstate_max111x, s);
|
||||
return 0;
|
||||
}
|
||||
|
||||
diff --git a/hw/net/eepro100.c b/hw/net/eepro100.c
|
||||
index cc2dd8b..39920c6 100644
|
||||
--- a/hw/net/eepro100.c
|
||||
+++ b/hw/net/eepro100.c
|
||||
@@ -1874,7 +1874,7 @@ static void e100_nic_realize(PCIDevice *pci_dev, Error **errp)
|
||||
|
||||
s->vmstate = g_memdup(&vmstate_eepro100, sizeof(vmstate_eepro100));
|
||||
s->vmstate->name = qemu_get_queue(s->nic)->model;
|
||||
- vmstate_register(&pci_dev->qdev, -1, s->vmstate, s);
|
||||
+ vmstate_register(&pci_dev->qdev, VMSTATE_INSTANCE_ID_ANY, s->vmstate, s);
|
||||
}
|
||||
|
||||
static void eepro100_instance_init(Object *obj)
|
||||
diff --git a/hw/pci/pci.c b/hw/pci/pci.c
|
||||
index cbc7a32..fed019d 100644
|
||||
--- a/hw/pci/pci.c
|
||||
+++ b/hw/pci/pci.c
|
||||
@@ -124,7 +124,7 @@ static void pci_bus_realize(BusState *qbus, Error **errp)
|
||||
bus->machine_done.notify = pcibus_machine_done;
|
||||
qemu_add_machine_init_done_notifier(&bus->machine_done);
|
||||
|
||||
- vmstate_register(NULL, -1, &vmstate_pcibus, bus);
|
||||
+ vmstate_register(NULL, VMSTATE_INSTANCE_ID_ANY, &vmstate_pcibus, bus);
|
||||
}
|
||||
|
||||
static void pcie_bus_realize(BusState *qbus, Error **errp)
|
||||
diff --git a/hw/ppc/spapr.c b/hw/ppc/spapr.c
|
||||
index 8749c72..c12862d 100644
|
||||
--- a/hw/ppc/spapr.c
|
||||
+++ b/hw/ppc/spapr.c
|
||||
@@ -3028,7 +3028,7 @@ static void spapr_machine_init(MachineState *machine)
|
||||
* interface, this is a legacy from the sPAPREnvironment structure
|
||||
* which predated MachineState but had a similar function */
|
||||
vmstate_register(NULL, 0, &vmstate_spapr, spapr);
|
||||
- register_savevm_live("spapr/htab", -1, 1,
|
||||
+ register_savevm_live("spapr/htab", VMSTATE_INSTANCE_ID_ANY, 1,
|
||||
&savevm_htab_handlers, spapr);
|
||||
|
||||
qbus_set_hotplug_handler(sysbus_get_default(), OBJECT(machine),
|
||||
diff --git a/hw/timer/arm_timer.c b/hw/timer/arm_timer.c
|
||||
index af524fa..beaa285 100644
|
||||
--- a/hw/timer/arm_timer.c
|
||||
+++ b/hw/timer/arm_timer.c
|
||||
@@ -180,7 +180,7 @@ static arm_timer_state *arm_timer_init(uint32_t freq)
|
||||
s->control = TIMER_CTRL_IE;
|
||||
|
||||
s->timer = ptimer_init(arm_timer_tick, s, PTIMER_POLICY_DEFAULT);
|
||||
- vmstate_register(NULL, -1, &vmstate_arm_timer, s);
|
||||
+ vmstate_register(NULL, VMSTATE_INSTANCE_ID_ANY, &vmstate_arm_timer, s);
|
||||
return s;
|
||||
}
|
||||
|
||||
diff --git a/hw/tpm/tpm_emulator.c b/hw/tpm/tpm_emulator.c
|
||||
index 22f9113..da7b490 100644
|
||||
--- a/hw/tpm/tpm_emulator.c
|
||||
+++ b/hw/tpm/tpm_emulator.c
|
||||
@@ -914,7 +914,8 @@ static void tpm_emulator_inst_init(Object *obj)
|
||||
tpm_emu->cur_locty_number = ~0;
|
||||
qemu_mutex_init(&tpm_emu->mutex);
|
||||
|
||||
- vmstate_register(NULL, -1, &vmstate_tpm_emulator, obj);
|
||||
+ vmstate_register(NULL, VMSTATE_INSTANCE_ID_ANY,
|
||||
+ &vmstate_tpm_emulator, obj);
|
||||
}
|
||||
|
||||
/*
|
||||
diff --git a/include/migration/vmstate.h b/include/migration/vmstate.h
|
||||
index ac4f46a..883f1cf 100644
|
||||
--- a/include/migration/vmstate.h
|
||||
+++ b/include/migration/vmstate.h
|
||||
@@ -1155,6 +1155,8 @@ int vmstate_save_state_v(QEMUFile *f, const VMStateDescription *vmsd,
|
||||
|
||||
bool vmstate_save_needed(const VMStateDescription *vmsd, void *opaque);
|
||||
|
||||
+#define VMSTATE_INSTANCE_ID_ANY -1
|
||||
+
|
||||
/* Returns: 0 on success, -1 on failure */
|
||||
int vmstate_register_with_alias_id(DeviceState *dev, int instance_id,
|
||||
const VMStateDescription *vmsd,
|
||||
diff --git a/migration/savevm.c b/migration/savevm.c
|
||||
index a71b930..e2e8e0a 100644
|
||||
--- a/migration/savevm.c
|
||||
+++ b/migration/savevm.c
|
||||
@@ -750,7 +750,7 @@ int register_savevm_live(const char *idstr,
|
||||
|
||||
pstrcat(se->idstr, sizeof(se->idstr), idstr);
|
||||
|
||||
- if (instance_id == -1) {
|
||||
+ if (instance_id == VMSTATE_INSTANCE_ID_ANY) {
|
||||
se->instance_id = calculate_new_instance_id(se->idstr);
|
||||
} else {
|
||||
se->instance_id = instance_id;
|
||||
@@ -817,14 +817,14 @@ int vmstate_register_with_alias_id(DeviceState *dev, int instance_id,
|
||||
|
||||
se->compat = g_new0(CompatEntry, 1);
|
||||
pstrcpy(se->compat->idstr, sizeof(se->compat->idstr), vmsd->name);
|
||||
- se->compat->instance_id = instance_id == -1 ?
|
||||
+ se->compat->instance_id = instance_id == VMSTATE_INSTANCE_ID_ANY ?
|
||||
calculate_compat_instance_id(vmsd->name) : instance_id;
|
||||
- instance_id = -1;
|
||||
+ instance_id = VMSTATE_INSTANCE_ID_ANY;
|
||||
}
|
||||
}
|
||||
pstrcat(se->idstr, sizeof(se->idstr), vmsd->name);
|
||||
|
||||
- if (instance_id == -1) {
|
||||
+ if (instance_id == VMSTATE_INSTANCE_ID_ANY) {
|
||||
se->instance_id = calculate_new_instance_id(se->idstr);
|
||||
} else {
|
||||
se->instance_id = instance_id;
|
||||
--
|
||||
1.8.3.1
|
||||
|
@ -1,42 +0,0 @@
|
||||
From ab07e0b41c50a85940d798a9a65a58698fd2edfb Mon Sep 17 00:00:00 2001
|
||||
From: Juan Quintela <quintela@redhat.com>
|
||||
Date: Tue, 3 Mar 2020 14:51:40 +0000
|
||||
Subject: [PATCH 08/18] migration: Don't send data if we have stopped
|
||||
|
||||
RH-Author: Juan Quintela <quintela@redhat.com>
|
||||
Message-id: <20200303145143.149290-8-quintela@redhat.com>
|
||||
Patchwork-id: 94114
|
||||
O-Subject: [RHEL-AV-8.2.0 qemu-kvm PATCH v2 07/10] migration: Don't send data if we have stopped
|
||||
Bugzilla: 1738451
|
||||
RH-Acked-by: Laurent Vivier <lvivier@redhat.com>
|
||||
RH-Acked-by: Peter Xu <peterx@redhat.com>
|
||||
RH-Acked-by: Dr. David Alan Gilbert <dgilbert@redhat.com>
|
||||
|
||||
If we do a cancel, we got out without one error, but we can't do the
|
||||
rest of the output as in a normal situation.
|
||||
|
||||
Signed-off-by: Juan Quintela <quintela@redhat.com>
|
||||
Reviewed-by: Dr. David Alan Gilbert <dgilbert@redhat.com>
|
||||
(cherry picked from commit b69a0227a803256ad270283872d40ff768f4d56d)
|
||||
Signed-off-by: Danilo C. L. de Paula <ddepaula@redhat.com>
|
||||
---
|
||||
migration/ram.c | 3 ++-
|
||||
1 file changed, 2 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/migration/ram.c b/migration/ram.c
|
||||
index a0257ee..902c56c 100644
|
||||
--- a/migration/ram.c
|
||||
+++ b/migration/ram.c
|
||||
@@ -3511,7 +3511,8 @@ static int ram_save_iterate(QEMUFile *f, void *opaque)
|
||||
ram_control_after_iterate(f, RAM_CONTROL_ROUND);
|
||||
|
||||
out:
|
||||
- if (ret >= 0) {
|
||||
+ if (ret >= 0
|
||||
+ && migration_is_setup_or_active(migrate_get_current()->state)) {
|
||||
multifd_send_sync_main(rs);
|
||||
qemu_put_be64(f, RAM_SAVE_FLAG_EOS);
|
||||
qemu_fflush(f);
|
||||
--
|
||||
1.8.3.1
|
||||
|
@ -1,94 +0,0 @@
|
||||
From 71b05ab5782aa1e38c016be6264a14f5650d2a87 Mon Sep 17 00:00:00 2001
|
||||
From: Juan Quintela <quintela@redhat.com>
|
||||
Date: Tue, 3 Mar 2020 14:51:35 +0000
|
||||
Subject: [PATCH 03/18] migration: Make sure that we don't call write() in case
|
||||
of error
|
||||
|
||||
RH-Author: Juan Quintela <quintela@redhat.com>
|
||||
Message-id: <20200303145143.149290-3-quintela@redhat.com>
|
||||
Patchwork-id: 94113
|
||||
O-Subject: [RHEL-AV-8.2.0 qemu-kvm PATCH v2 02/10] migration: Make sure that we don't call write() in case of error
|
||||
Bugzilla: 1738451
|
||||
RH-Acked-by: Laurent Vivier <lvivier@redhat.com>
|
||||
RH-Acked-by: Peter Xu <peterx@redhat.com>
|
||||
RH-Acked-by: Dr. David Alan Gilbert <dgilbert@redhat.com>
|
||||
|
||||
If we are exiting due to an error/finish/.... Just don't try to even
|
||||
touch the channel with one IO operation.
|
||||
|
||||
Signed-off-by: Juan Quintela <quintela@redhat.com>
|
||||
Reviewed-by: Dr. David Alan Gilbert <dgilbert@redhat.com>
|
||||
Signed-off-by: Juan Quintela <quintela@redhat.com>
|
||||
(cherry picked from commit 4d65a6216bfc44891ac298b74a6921d479805131)
|
||||
Signed-off-by: Danilo C. L. de Paula <ddepaula@redhat.com>
|
||||
---
|
||||
migration/ram.c | 25 +++++++++++++++++++++++++
|
||||
1 file changed, 25 insertions(+)
|
||||
|
||||
diff --git a/migration/ram.c b/migration/ram.c
|
||||
index 65580e3..8c783b3 100644
|
||||
--- a/migration/ram.c
|
||||
+++ b/migration/ram.c
|
||||
@@ -899,6 +899,12 @@ struct {
|
||||
uint64_t packet_num;
|
||||
/* send channels ready */
|
||||
QemuSemaphore channels_ready;
|
||||
+ /*
|
||||
+ * Have we already run terminate threads. There is a race when it
|
||||
+ * happens that we got one error while we are exiting.
|
||||
+ * We will use atomic operations. Only valid values are 0 and 1.
|
||||
+ */
|
||||
+ int exiting;
|
||||
} *multifd_send_state;
|
||||
|
||||
/*
|
||||
@@ -927,6 +933,10 @@ static int multifd_send_pages(RAMState *rs)
|
||||
MultiFDPages_t *pages = multifd_send_state->pages;
|
||||
uint64_t transferred;
|
||||
|
||||
+ if (atomic_read(&multifd_send_state->exiting)) {
|
||||
+ return -1;
|
||||
+ }
|
||||
+
|
||||
qemu_sem_wait(&multifd_send_state->channels_ready);
|
||||
for (i = next_channel;; i = (i + 1) % migrate_multifd_channels()) {
|
||||
p = &multifd_send_state->params[i];
|
||||
@@ -1008,6 +1018,16 @@ static void multifd_send_terminate_threads(Error *err)
|
||||
}
|
||||
}
|
||||
|
||||
+ /*
|
||||
+ * We don't want to exit each threads twice. Depending on where
|
||||
+ * we get the error, or if there are two independent errors in two
|
||||
+ * threads at the same time, we can end calling this function
|
||||
+ * twice.
|
||||
+ */
|
||||
+ if (atomic_xchg(&multifd_send_state->exiting, 1)) {
|
||||
+ return;
|
||||
+ }
|
||||
+
|
||||
for (i = 0; i < migrate_multifd_channels(); i++) {
|
||||
MultiFDSendParams *p = &multifd_send_state->params[i];
|
||||
|
||||
@@ -1117,6 +1137,10 @@ static void *multifd_send_thread(void *opaque)
|
||||
|
||||
while (true) {
|
||||
qemu_sem_wait(&p->sem);
|
||||
+
|
||||
+ if (atomic_read(&multifd_send_state->exiting)) {
|
||||
+ break;
|
||||
+ }
|
||||
qemu_mutex_lock(&p->mutex);
|
||||
|
||||
if (p->pending_job) {
|
||||
@@ -1225,6 +1249,7 @@ int multifd_save_setup(void)
|
||||
multifd_send_state->params = g_new0(MultiFDSendParams, thread_count);
|
||||
multifd_send_state->pages = multifd_pages_init(page_count);
|
||||
qemu_sem_init(&multifd_send_state->channels_ready, 0);
|
||||
+ atomic_set(&multifd_send_state->exiting, 0);
|
||||
|
||||
for (i = 0; i < thread_count; i++) {
|
||||
MultiFDSendParams *p = &multifd_send_state->params[i];
|
||||
--
|
||||
1.8.3.1
|
||||
|
@ -1,70 +0,0 @@
|
||||
From 3c4f6f0c2bf5562f2aa26f964848ae53e6ac4790 Mon Sep 17 00:00:00 2001
|
||||
From: Juan Quintela <quintela@redhat.com>
|
||||
Date: Tue, 3 Mar 2020 14:51:43 +0000
|
||||
Subject: [PATCH 11/18] migration: Maybe VM is paused when migration is
|
||||
cancelled
|
||||
|
||||
RH-Author: Juan Quintela <quintela@redhat.com>
|
||||
Message-id: <20200303145143.149290-11-quintela@redhat.com>
|
||||
Patchwork-id: 94120
|
||||
O-Subject: [RHEL-AV-8.2.0 qemu-kvm PATCH v2 10/10] migration: Maybe VM is paused when migration is cancelled
|
||||
Bugzilla: 1738451
|
||||
RH-Acked-by: Laurent Vivier <lvivier@redhat.com>
|
||||
RH-Acked-by: Peter Xu <peterx@redhat.com>
|
||||
RH-Acked-by: Dr. David Alan Gilbert <dgilbert@redhat.com>
|
||||
|
||||
From: Zhimin Feng <fengzhimin1@huawei.com>
|
||||
|
||||
If the migration is cancelled when it is in the completion phase,
|
||||
the migration state is set to MIGRATION_STATUS_CANCELLING.
|
||||
The VM maybe wait for the 'pause_sem' semaphore in migration_maybe_pause
|
||||
function, so that VM always is paused.
|
||||
|
||||
Reported-by: Euler Robot <euler.robot@huawei.com>
|
||||
Signed-off-by: Zhimin Feng <fengzhimin1@huawei.com>
|
||||
Reviewed-by: Juan Quintela <quintela@redhat.com>
|
||||
Signed-off-by: Juan Quintela <quintela@redhat.com>
|
||||
(cherry picked from commit 8958338b10abcb346b54a8038a491fda2db1c853)
|
||||
Signed-off-by: Danilo C. L. de Paula <ddepaula@redhat.com>
|
||||
---
|
||||
migration/migration.c | 24 ++++++++++++++++--------
|
||||
1 file changed, 16 insertions(+), 8 deletions(-)
|
||||
|
||||
diff --git a/migration/migration.c b/migration/migration.c
|
||||
index eb50d77..ed18c59 100644
|
||||
--- a/migration/migration.c
|
||||
+++ b/migration/migration.c
|
||||
@@ -2786,14 +2786,22 @@ static int migration_maybe_pause(MigrationState *s,
|
||||
/* This block intentionally left blank */
|
||||
}
|
||||
|
||||
- qemu_mutex_unlock_iothread();
|
||||
- migrate_set_state(&s->state, *current_active_state,
|
||||
- MIGRATION_STATUS_PRE_SWITCHOVER);
|
||||
- qemu_sem_wait(&s->pause_sem);
|
||||
- migrate_set_state(&s->state, MIGRATION_STATUS_PRE_SWITCHOVER,
|
||||
- new_state);
|
||||
- *current_active_state = new_state;
|
||||
- qemu_mutex_lock_iothread();
|
||||
+ /*
|
||||
+ * If the migration is cancelled when it is in the completion phase,
|
||||
+ * the migration state is set to MIGRATION_STATUS_CANCELLING.
|
||||
+ * So we don't need to wait a semaphore, otherwise we would always
|
||||
+ * wait for the 'pause_sem' semaphore.
|
||||
+ */
|
||||
+ if (s->state != MIGRATION_STATUS_CANCELLING) {
|
||||
+ qemu_mutex_unlock_iothread();
|
||||
+ migrate_set_state(&s->state, *current_active_state,
|
||||
+ MIGRATION_STATUS_PRE_SWITCHOVER);
|
||||
+ qemu_sem_wait(&s->pause_sem);
|
||||
+ migrate_set_state(&s->state, MIGRATION_STATUS_PRE_SWITCHOVER,
|
||||
+ new_state);
|
||||
+ *current_active_state = new_state;
|
||||
+ qemu_mutex_lock_iothread();
|
||||
+ }
|
||||
|
||||
return s->state == new_state ? 0 : -EINVAL;
|
||||
}
|
||||
--
|
||||
1.8.3.1
|
||||
|
@ -1,172 +0,0 @@
|
||||
From 8e8f421cce99543081f225acf46541312cfbc371 Mon Sep 17 00:00:00 2001
|
||||
From: Laurent Vivier <lvivier@redhat.com>
|
||||
Date: Tue, 17 Mar 2020 17:05:18 +0000
|
||||
Subject: [PATCH 1/2] migration: Rate limit inside host pages
|
||||
|
||||
RH-Author: Laurent Vivier <lvivier@redhat.com>
|
||||
Message-id: <20200317170518.9303-1-lvivier@redhat.com>
|
||||
Patchwork-id: 94374
|
||||
O-Subject: [RHEL-AV-8.2.0 qemu-kvm PATCH] migration: Rate limit inside host pages
|
||||
Bugzilla: 1814336
|
||||
RH-Acked-by: Peter Xu <peterx@redhat.com>
|
||||
RH-Acked-by: Juan Quintela <quintela@redhat.com>
|
||||
RH-Acked-by: Dr. David Alan Gilbert <dgilbert@redhat.com>
|
||||
|
||||
From: "Dr. David Alan Gilbert" <dgilbert@redhat.com>
|
||||
|
||||
When using hugepages, rate limiting is necessary within each huge
|
||||
page, since a 1G huge page can take a significant time to send, so
|
||||
you end up with bursty behaviour.
|
||||
|
||||
Fixes: 4c011c37ecb3 ("postcopy: Send whole huge pages")
|
||||
Reported-by: Lin Ma <LMa@suse.com>
|
||||
Signed-off-by: Dr. David Alan Gilbert <dgilbert@redhat.com>
|
||||
Reviewed-by: Juan Quintela <quintela@redhat.com>
|
||||
Reviewed-by: Peter Xu <peterx@redhat.com>
|
||||
Signed-off-by: Juan Quintela <quintela@redhat.com>
|
||||
(cherry picked from commit 97e1e06780e70f6e98a0d2df881e0c0927d3aeb6)
|
||||
Signed-off-by: Laurent Vivier <lvivier@redhat.com>
|
||||
|
||||
BZ: https://bugzilla.redhat.com/show_bug.cgi?id=1814336
|
||||
BRANCH: rhel-av-8.2.0
|
||||
UPSTREAM: Merged
|
||||
BREW: https://brewweb.engineering.redhat.com/brew/taskinfo?taskID=27283241
|
||||
TESTED: Tested that the migration abort doesn't trigger an error message in
|
||||
the kernel logs on P9
|
||||
|
||||
Signed-off-by: Danilo C. L. de Paula <ddepaula@redhat.com>
|
||||
---
|
||||
migration/migration.c | 57 ++++++++++++++++++++++++++++----------------------
|
||||
migration/migration.h | 1 +
|
||||
migration/ram.c | 2 ++
|
||||
migration/trace-events | 4 ++--
|
||||
4 files changed, 37 insertions(+), 27 deletions(-)
|
||||
|
||||
diff --git a/migration/migration.c b/migration/migration.c
|
||||
index ed18c59..e31d0f5 100644
|
||||
--- a/migration/migration.c
|
||||
+++ b/migration/migration.c
|
||||
@@ -3253,6 +3253,37 @@ void migration_consume_urgent_request(void)
|
||||
qemu_sem_wait(&migrate_get_current()->rate_limit_sem);
|
||||
}
|
||||
|
||||
+/* Returns true if the rate limiting was broken by an urgent request */
|
||||
+bool migration_rate_limit(void)
|
||||
+{
|
||||
+ int64_t now = qemu_clock_get_ms(QEMU_CLOCK_REALTIME);
|
||||
+ MigrationState *s = migrate_get_current();
|
||||
+
|
||||
+ bool urgent = false;
|
||||
+ migration_update_counters(s, now);
|
||||
+ if (qemu_file_rate_limit(s->to_dst_file)) {
|
||||
+ /*
|
||||
+ * Wait for a delay to do rate limiting OR
|
||||
+ * something urgent to post the semaphore.
|
||||
+ */
|
||||
+ int ms = s->iteration_start_time + BUFFER_DELAY - now;
|
||||
+ trace_migration_rate_limit_pre(ms);
|
||||
+ if (qemu_sem_timedwait(&s->rate_limit_sem, ms) == 0) {
|
||||
+ /*
|
||||
+ * We were woken by one or more urgent things but
|
||||
+ * the timedwait will have consumed one of them.
|
||||
+ * The service routine for the urgent wake will dec
|
||||
+ * the semaphore itself for each item it consumes,
|
||||
+ * so add this one we just eat back.
|
||||
+ */
|
||||
+ qemu_sem_post(&s->rate_limit_sem);
|
||||
+ urgent = true;
|
||||
+ }
|
||||
+ trace_migration_rate_limit_post(urgent);
|
||||
+ }
|
||||
+ return urgent;
|
||||
+}
|
||||
+
|
||||
/*
|
||||
* Master migration thread on the source VM.
|
||||
* It drives the migration and pumps the data down the outgoing channel.
|
||||
@@ -3319,8 +3350,6 @@ static void *migration_thread(void *opaque)
|
||||
trace_migration_thread_setup_complete();
|
||||
|
||||
while (migration_is_active(s)) {
|
||||
- int64_t current_time;
|
||||
-
|
||||
if (urgent || !qemu_file_rate_limit(s->to_dst_file)) {
|
||||
MigIterateState iter_state = migration_iteration_run(s);
|
||||
if (iter_state == MIG_ITERATE_SKIP) {
|
||||
@@ -3347,29 +3376,7 @@ static void *migration_thread(void *opaque)
|
||||
update_iteration_initial_status(s);
|
||||
}
|
||||
|
||||
- current_time = qemu_clock_get_ms(QEMU_CLOCK_REALTIME);
|
||||
-
|
||||
- migration_update_counters(s, current_time);
|
||||
-
|
||||
- urgent = false;
|
||||
- if (qemu_file_rate_limit(s->to_dst_file)) {
|
||||
- /* Wait for a delay to do rate limiting OR
|
||||
- * something urgent to post the semaphore.
|
||||
- */
|
||||
- int ms = s->iteration_start_time + BUFFER_DELAY - current_time;
|
||||
- trace_migration_thread_ratelimit_pre(ms);
|
||||
- if (qemu_sem_timedwait(&s->rate_limit_sem, ms) == 0) {
|
||||
- /* We were worken by one or more urgent things but
|
||||
- * the timedwait will have consumed one of them.
|
||||
- * The service routine for the urgent wake will dec
|
||||
- * the semaphore itself for each item it consumes,
|
||||
- * so add this one we just eat back.
|
||||
- */
|
||||
- qemu_sem_post(&s->rate_limit_sem);
|
||||
- urgent = true;
|
||||
- }
|
||||
- trace_migration_thread_ratelimit_post(urgent);
|
||||
- }
|
||||
+ urgent = migration_rate_limit();
|
||||
}
|
||||
|
||||
trace_migration_thread_after_loop();
|
||||
diff --git a/migration/migration.h b/migration/migration.h
|
||||
index a2b2336..a15e8d8 100644
|
||||
--- a/migration/migration.h
|
||||
+++ b/migration/migration.h
|
||||
@@ -347,5 +347,6 @@ extern bool migrate_pre_2_2;
|
||||
|
||||
void migration_make_urgent_request(void);
|
||||
void migration_consume_urgent_request(void);
|
||||
+bool migration_rate_limit(void);
|
||||
|
||||
#endif
|
||||
diff --git a/migration/ram.c b/migration/ram.c
|
||||
index 3891eff..5344c7d 100644
|
||||
--- a/migration/ram.c
|
||||
+++ b/migration/ram.c
|
||||
@@ -2661,6 +2661,8 @@ static int ram_save_host_page(RAMState *rs, PageSearchStatus *pss,
|
||||
|
||||
pages += tmppages;
|
||||
pss->page++;
|
||||
+ /* Allow rate limiting to happen in the middle of huge pages */
|
||||
+ migration_rate_limit();
|
||||
} while ((pss->page & (pagesize_bits - 1)) &&
|
||||
offset_in_ramblock(pss->block, pss->page << TARGET_PAGE_BITS));
|
||||
|
||||
diff --git a/migration/trace-events b/migration/trace-events
|
||||
index 6dee7b5..2f9129e 100644
|
||||
--- a/migration/trace-events
|
||||
+++ b/migration/trace-events
|
||||
@@ -138,12 +138,12 @@ migrate_send_rp_recv_bitmap(char *name, int64_t size) "block '%s' size 0x%"PRIi6
|
||||
migration_completion_file_err(void) ""
|
||||
migration_completion_postcopy_end(void) ""
|
||||
migration_completion_postcopy_end_after_complete(void) ""
|
||||
+migration_rate_limit_pre(int ms) "%d ms"
|
||||
+migration_rate_limit_post(int urgent) "urgent: %d"
|
||||
migration_return_path_end_before(void) ""
|
||||
migration_return_path_end_after(int rp_error) "%d"
|
||||
migration_thread_after_loop(void) ""
|
||||
migration_thread_file_err(void) ""
|
||||
-migration_thread_ratelimit_pre(int ms) "%d ms"
|
||||
-migration_thread_ratelimit_post(int urgent) "urgent: %d"
|
||||
migration_thread_setup_complete(void) ""
|
||||
open_return_path_on_source(void) ""
|
||||
open_return_path_on_source_continue(void) ""
|
||||
--
|
||||
1.8.3.1
|
||||
|
@ -1,65 +0,0 @@
|
||||
From 32ee75b7f4a31d6080e5659e2a0285a046ef1036 Mon Sep 17 00:00:00 2001
|
||||
From: Juan Quintela <quintela@redhat.com>
|
||||
Date: Tue, 3 Mar 2020 14:51:34 +0000
|
||||
Subject: [PATCH 02/18] migration/multifd: clean pages after filling packet
|
||||
|
||||
RH-Author: Juan Quintela <quintela@redhat.com>
|
||||
Message-id: <20200303145143.149290-2-quintela@redhat.com>
|
||||
Patchwork-id: 94112
|
||||
O-Subject: [RHEL-AV-8.2.0 qemu-kvm PATCH v2 01/10] migration/multifd: clean pages after filling packet
|
||||
Bugzilla: 1738451
|
||||
RH-Acked-by: Laurent Vivier <lvivier@redhat.com>
|
||||
RH-Acked-by: Peter Xu <peterx@redhat.com>
|
||||
RH-Acked-by: Dr. David Alan Gilbert <dgilbert@redhat.com>
|
||||
|
||||
From: Wei Yang <richardw.yang@linux.intel.com>
|
||||
|
||||
This is a preparation for the next patch:
|
||||
|
||||
not use multifd during postcopy.
|
||||
|
||||
Without enabling postcopy, everything looks good. While after enabling
|
||||
postcopy, migration may fail even not use multifd during postcopy. The
|
||||
reason is the pages is not properly cleared and *old* target page will
|
||||
continue to be transferred.
|
||||
|
||||
After clean pages, migration succeeds.
|
||||
|
||||
Signed-off-by: Wei Yang <richardw.yang@linux.intel.com>
|
||||
Reviewed-by: Juan Quintela <quintela@redhat.com>
|
||||
Signed-off-by: Juan Quintela <quintela@redhat.com>
|
||||
(cherry picked from commit eab54aa78ffd9fb7895b20fc2761ee998479489b)
|
||||
Signed-off-by: Danilo C. L. de Paula <ddepaula@redhat.com>
|
||||
---
|
||||
migration/ram.c | 6 ++++--
|
||||
1 file changed, 4 insertions(+), 2 deletions(-)
|
||||
|
||||
diff --git a/migration/ram.c b/migration/ram.c
|
||||
index 5078f94..65580e3 100644
|
||||
--- a/migration/ram.c
|
||||
+++ b/migration/ram.c
|
||||
@@ -944,10 +944,10 @@ static int multifd_send_pages(RAMState *rs)
|
||||
}
|
||||
qemu_mutex_unlock(&p->mutex);
|
||||
}
|
||||
- p->pages->used = 0;
|
||||
+ assert(!p->pages->used);
|
||||
+ assert(!p->pages->block);
|
||||
|
||||
p->packet_num = multifd_send_state->packet_num++;
|
||||
- p->pages->block = NULL;
|
||||
multifd_send_state->pages = p->pages;
|
||||
p->pages = pages;
|
||||
transferred = ((uint64_t) pages->used) * TARGET_PAGE_SIZE + p->packet_len;
|
||||
@@ -1129,6 +1129,8 @@ static void *multifd_send_thread(void *opaque)
|
||||
p->flags = 0;
|
||||
p->num_packets++;
|
||||
p->num_pages += used;
|
||||
+ p->pages->used = 0;
|
||||
+ p->pages->block = NULL;
|
||||
qemu_mutex_unlock(&p->mutex);
|
||||
|
||||
trace_multifd_send(p->id, packet_num, used, flags,
|
||||
--
|
||||
1.8.3.1
|
||||
|
@ -1,77 +0,0 @@
|
||||
From 2c14a6831954a59256cc8d1980da0ad705a3a3fa Mon Sep 17 00:00:00 2001
|
||||
From: Juan Quintela <quintela@redhat.com>
|
||||
Date: Tue, 3 Mar 2020 14:51:37 +0000
|
||||
Subject: [PATCH 05/18] migration/multifd: fix destroyed mutex access in
|
||||
terminating multifd threads
|
||||
|
||||
RH-Author: Juan Quintela <quintela@redhat.com>
|
||||
Message-id: <20200303145143.149290-5-quintela@redhat.com>
|
||||
Patchwork-id: 94119
|
||||
O-Subject: [RHEL-AV-8.2.0 qemu-kvm PATCH v2 04/10] migration/multifd: fix destroyed mutex access in terminating multifd threads
|
||||
Bugzilla: 1738451
|
||||
RH-Acked-by: Laurent Vivier <lvivier@redhat.com>
|
||||
RH-Acked-by: Peter Xu <peterx@redhat.com>
|
||||
RH-Acked-by: Dr. David Alan Gilbert <dgilbert@redhat.com>
|
||||
|
||||
From: Jiahui Cen <cenjiahui@huawei.com>
|
||||
|
||||
One multifd will lock all the other multifds' IOChannel mutex to inform them
|
||||
to quit by setting p->quit or shutting down p->c. In this senario, if some
|
||||
multifds had already been terminated and multifd_load_cleanup/multifd_save_cleanup
|
||||
had destroyed their mutex, it could cause destroyed mutex access when trying
|
||||
lock their mutex.
|
||||
|
||||
Here is the coredump stack:
|
||||
#0 0x00007f81a2794437 in raise () from /usr/lib64/libc.so.6
|
||||
#1 0x00007f81a2795b28 in abort () from /usr/lib64/libc.so.6
|
||||
#2 0x00007f81a278d1b6 in __assert_fail_base () from /usr/lib64/libc.so.6
|
||||
#3 0x00007f81a278d262 in __assert_fail () from /usr/lib64/libc.so.6
|
||||
#4 0x000055eb1bfadbd3 in qemu_mutex_lock_impl (mutex=0x55eb1e2d1988, file=<optimized out>, line=<optimized out>) at util/qemu-thread-posix.c:64
|
||||
#5 0x000055eb1bb4564a in multifd_send_terminate_threads (err=<optimized out>) at migration/ram.c:1015
|
||||
#6 0x000055eb1bb4bb7f in multifd_send_thread (opaque=0x55eb1e2d19f8) at migration/ram.c:1171
|
||||
#7 0x000055eb1bfad628 in qemu_thread_start (args=0x55eb1e170450) at util/qemu-thread-posix.c:502
|
||||
#8 0x00007f81a2b36df5 in start_thread () from /usr/lib64/libpthread.so.0
|
||||
#9 0x00007f81a286048d in clone () from /usr/lib64/libc.so.6
|
||||
|
||||
To fix it up, let's destroy the mutex after all the other multifd threads had
|
||||
been terminated.
|
||||
|
||||
Signed-off-by: Jiahui Cen <cenjiahui@huawei.com>
|
||||
Signed-off-by: Ying Fang <fangying1@huawei.com>
|
||||
Reviewed-by: Juan Quintela <quintela@redhat.com>
|
||||
Signed-off-by: Juan Quintela <quintela@redhat.com>
|
||||
(cherry picked from commit 9560a48ecc0c20d87bc458a6db77fba651605819)
|
||||
Signed-off-by: Danilo C. L. de Paula <ddepaula@redhat.com>
|
||||
---
|
||||
migration/ram.c | 8 ++++++++
|
||||
1 file changed, 8 insertions(+)
|
||||
|
||||
diff --git a/migration/ram.c b/migration/ram.c
|
||||
index 860f781..6c55c5d 100644
|
||||
--- a/migration/ram.c
|
||||
+++ b/migration/ram.c
|
||||
@@ -1052,6 +1052,10 @@ void multifd_save_cleanup(void)
|
||||
if (p->running) {
|
||||
qemu_thread_join(&p->thread);
|
||||
}
|
||||
+ }
|
||||
+ for (i = 0; i < migrate_multifd_channels(); i++) {
|
||||
+ MultiFDSendParams *p = &multifd_send_state->params[i];
|
||||
+
|
||||
socket_send_channel_destroy(p->c);
|
||||
p->c = NULL;
|
||||
qemu_mutex_destroy(&p->mutex);
|
||||
@@ -1335,6 +1339,10 @@ int multifd_load_cleanup(Error **errp)
|
||||
qemu_sem_post(&p->sem_sync);
|
||||
qemu_thread_join(&p->thread);
|
||||
}
|
||||
+ }
|
||||
+ for (i = 0; i < migrate_multifd_channels(); i++) {
|
||||
+ MultiFDRecvParams *p = &multifd_recv_state->params[i];
|
||||
+
|
||||
object_unref(OBJECT(p->c));
|
||||
p->c = NULL;
|
||||
qemu_mutex_destroy(&p->mutex);
|
||||
--
|
||||
1.8.3.1
|
||||
|
@ -1,75 +0,0 @@
|
||||
From 517a99c5fba163bf684978fe3d9476b619481391 Mon Sep 17 00:00:00 2001
|
||||
From: Juan Quintela <quintela@redhat.com>
|
||||
Date: Tue, 3 Mar 2020 14:51:42 +0000
|
||||
Subject: [PATCH 10/18] migration/multifd: fix nullptr access in
|
||||
multifd_send_terminate_threads
|
||||
|
||||
RH-Author: Juan Quintela <quintela@redhat.com>
|
||||
Message-id: <20200303145143.149290-10-quintela@redhat.com>
|
||||
Patchwork-id: 94117
|
||||
O-Subject: [RHEL-AV-8.2.0 qemu-kvm PATCH v2 09/10] migration/multifd: fix nullptr access in multifd_send_terminate_threads
|
||||
Bugzilla: 1738451
|
||||
RH-Acked-by: Laurent Vivier <lvivier@redhat.com>
|
||||
RH-Acked-by: Peter Xu <peterx@redhat.com>
|
||||
RH-Acked-by: Dr. David Alan Gilbert <dgilbert@redhat.com>
|
||||
|
||||
From: Zhimin Feng <fengzhimin1@huawei.com>
|
||||
|
||||
If the multifd_send_threads is not created when migration is failed,
|
||||
multifd_save_cleanup would be called twice. In this senario, the
|
||||
multifd_send_state is accessed after it has been released, the result
|
||||
is that the source VM is crashing down.
|
||||
|
||||
Here is the coredump stack:
|
||||
Program received signal SIGSEGV, Segmentation fault.
|
||||
0x00005629333a78ef in multifd_send_terminate_threads (err=err@entry=0x0) at migration/ram.c:1012
|
||||
1012 MultiFDSendParams *p = &multifd_send_state->params[i];
|
||||
#0 0x00005629333a78ef in multifd_send_terminate_threads (err=err@entry=0x0) at migration/ram.c:1012
|
||||
#1 0x00005629333ab8a9 in multifd_save_cleanup () at migration/ram.c:1028
|
||||
#2 0x00005629333abaea in multifd_new_send_channel_async (task=0x562935450e70, opaque=<optimized out>) at migration/ram.c:1202
|
||||
#3 0x000056293373a562 in qio_task_complete (task=task@entry=0x562935450e70) at io/task.c:196
|
||||
#4 0x000056293373a6e0 in qio_task_thread_result (opaque=0x562935450e70) at io/task.c:111
|
||||
#5 0x00007f475d4d75a7 in g_idle_dispatch () from /usr/lib64/libglib-2.0.so.0
|
||||
#6 0x00007f475d4da9a9 in g_main_context_dispatch () from /usr/lib64/libglib-2.0.so.0
|
||||
#7 0x0000562933785b33 in glib_pollfds_poll () at util/main-loop.c:219
|
||||
#8 os_host_main_loop_wait (timeout=<optimized out>) at util/main-loop.c:242
|
||||
#9 main_loop_wait (nonblocking=nonblocking@entry=0) at util/main-loop.c:518
|
||||
#10 0x00005629334c5acf in main_loop () at vl.c:1810
|
||||
#11 0x000056293334d7bb in main (argc=<optimized out>, argv=<optimized out>, envp=<optimized out>) at vl.c:4471
|
||||
|
||||
If the multifd_send_threads is not created when migration is failed.
|
||||
In this senario, we don't call multifd_save_cleanup in multifd_new_send_channel_async.
|
||||
|
||||
Signed-off-by: Zhimin Feng <fengzhimin1@huawei.com>
|
||||
Reviewed-by: Juan Quintela <quintela@redhat.com>
|
||||
Signed-off-by: Juan Quintela <quintela@redhat.com>
|
||||
(cherry picked from commit 9c4d333c092e9c26d38f740ff3616deb42f21681)
|
||||
Signed-off-by: Danilo C. L. de Paula <ddepaula@redhat.com>
|
||||
---
|
||||
migration/ram.c | 10 +++++++++-
|
||||
1 file changed, 9 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/migration/ram.c b/migration/ram.c
|
||||
index 902c56c..3891eff 100644
|
||||
--- a/migration/ram.c
|
||||
+++ b/migration/ram.c
|
||||
@@ -1229,7 +1229,15 @@ static void multifd_new_send_channel_async(QIOTask *task, gpointer opaque)
|
||||
trace_multifd_new_send_channel_async(p->id);
|
||||
if (qio_task_propagate_error(task, &local_err)) {
|
||||
migrate_set_error(migrate_get_current(), local_err);
|
||||
- multifd_save_cleanup();
|
||||
+ /* Error happen, we need to tell who pay attention to me */
|
||||
+ qemu_sem_post(&multifd_send_state->channels_ready);
|
||||
+ qemu_sem_post(&p->sem_sync);
|
||||
+ /*
|
||||
+ * Although multifd_send_thread is not created, but main migration
|
||||
+ * thread neet to judge whether it is running, so we need to mark
|
||||
+ * its status.
|
||||
+ */
|
||||
+ p->quit = true;
|
||||
} else {
|
||||
p->c = QIO_CHANNEL(sioc);
|
||||
qio_channel_set_delay(p->c, false);
|
||||
--
|
||||
1.8.3.1
|
||||
|
@ -1,68 +0,0 @@
|
||||
From 7f664fe26ff67f8131faa7a81a388b8a5b51403f Mon Sep 17 00:00:00 2001
|
||||
From: Juan Quintela <quintela@redhat.com>
|
||||
Date: Tue, 3 Mar 2020 14:51:36 +0000
|
||||
Subject: [PATCH 04/18] migration/multifd: fix nullptr access in terminating
|
||||
multifd threads
|
||||
|
||||
RH-Author: Juan Quintela <quintela@redhat.com>
|
||||
Message-id: <20200303145143.149290-4-quintela@redhat.com>
|
||||
Patchwork-id: 94110
|
||||
O-Subject: [RHEL-AV-8.2.0 qemu-kvm PATCH v2 03/10] migration/multifd: fix nullptr access in terminating multifd threads
|
||||
Bugzilla: 1738451
|
||||
RH-Acked-by: Laurent Vivier <lvivier@redhat.com>
|
||||
RH-Acked-by: Peter Xu <peterx@redhat.com>
|
||||
RH-Acked-by: Dr. David Alan Gilbert <dgilbert@redhat.com>
|
||||
|
||||
From: Jiahui Cen <cenjiahui@huawei.com>
|
||||
|
||||
One multifd channel will shutdown all the other multifd's IOChannel when it
|
||||
fails to receive an IOChannel. In this senario, if some multifds had not
|
||||
received its IOChannel yet, it would try to shutdown its IOChannel which could
|
||||
cause nullptr access at qio_channel_shutdown.
|
||||
|
||||
Here is the coredump stack:
|
||||
#0 object_get_class (obj=obj@entry=0x0) at qom/object.c:908
|
||||
#1 0x00005563fdbb8f4a in qio_channel_shutdown (ioc=0x0, how=QIO_CHANNEL_SHUTDOWN_BOTH, errp=0x0) at io/channel.c:355
|
||||
#2 0x00005563fd7b4c5f in multifd_recv_terminate_threads (err=<optimized out>) at migration/ram.c:1280
|
||||
#3 0x00005563fd7bc019 in multifd_recv_new_channel (ioc=ioc@entry=0x556400255610, errp=errp@entry=0x7ffec07dce00) at migration/ram.c:1478
|
||||
#4 0x00005563fda82177 in migration_ioc_process_incoming (ioc=ioc@entry=0x556400255610, errp=errp@entry=0x7ffec07dce30) at migration/migration.c:605
|
||||
#5 0x00005563fda8567d in migration_channel_process_incoming (ioc=0x556400255610) at migration/channel.c:44
|
||||
#6 0x00005563fda83ee0 in socket_accept_incoming_migration (listener=0x5563fff6b920, cioc=0x556400255610, opaque=<optimized out>) at migration/socket.c:166
|
||||
#7 0x00005563fdbc25cd in qio_net_listener_channel_func (ioc=<optimized out>, condition=<optimized out>, opaque=<optimized out>) at io/net-listener.c:54
|
||||
#8 0x00007f895b6fe9a9 in g_main_context_dispatch () from /usr/lib64/libglib-2.0.so.0
|
||||
#9 0x00005563fdc18136 in glib_pollfds_poll () at util/main-loop.c:218
|
||||
#10 0x00005563fdc181b5 in os_host_main_loop_wait (timeout=1000000000) at util/main-loop.c:241
|
||||
#11 0x00005563fdc183a2 in main_loop_wait (nonblocking=nonblocking@entry=0) at util/main-loop.c:517
|
||||
#12 0x00005563fd8edb37 in main_loop () at vl.c:1791
|
||||
#13 0x00005563fd74fd45 in main (argc=<optimized out>, argv=<optimized out>, envp=<optimized out>) at vl.c:4473
|
||||
|
||||
To fix it up, let's check p->c before calling qio_channel_shutdown.
|
||||
|
||||
Signed-off-by: Jiahui Cen <cenjiahui@huawei.com>
|
||||
Signed-off-by: Ying Fang <fangying1@huawei.com>
|
||||
Reviewed-by: Juan Quintela <quintela@redhat.com>
|
||||
Signed-off-by: Juan Quintela <quintela@redhat.com>
|
||||
(cherry picked from commit f76e32eb05041ab001184ab16afb56524adccd0c)
|
||||
Signed-off-by: Danilo C. L. de Paula <ddepaula@redhat.com>
|
||||
---
|
||||
migration/ram.c | 4 +++-
|
||||
1 file changed, 3 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/migration/ram.c b/migration/ram.c
|
||||
index 8c783b3..860f781 100644
|
||||
--- a/migration/ram.c
|
||||
+++ b/migration/ram.c
|
||||
@@ -1307,7 +1307,9 @@ static void multifd_recv_terminate_threads(Error *err)
|
||||
- normal quit, i.e. everything went fine, just finished
|
||||
- error quit: We close the channels so the channel threads
|
||||
finish the qio_channel_read_all_eof() */
|
||||
- qio_channel_shutdown(p->c, QIO_CHANNEL_SHUTDOWN_BOTH, NULL);
|
||||
+ if (p->c) {
|
||||
+ qio_channel_shutdown(p->c, QIO_CHANNEL_SHUTDOWN_BOTH, NULL);
|
||||
+ }
|
||||
qemu_mutex_unlock(&p->mutex);
|
||||
}
|
||||
}
|
||||
--
|
||||
1.8.3.1
|
||||
|
@ -1,123 +0,0 @@
|
||||
From 261ee33e0e6711fadd3049e4640bb731ee3d44ff Mon Sep 17 00:00:00 2001
|
||||
From: Kevin Wolf <kwolf@redhat.com>
|
||||
Date: Mon, 24 Feb 2020 16:57:10 +0000
|
||||
Subject: [PATCH 9/9] mirror: Don't let an operation wait for itself
|
||||
|
||||
RH-Author: Kevin Wolf <kwolf@redhat.com>
|
||||
Message-id: <20200224165710.4830-3-kwolf@redhat.com>
|
||||
Patchwork-id: 94045
|
||||
O-Subject: [RHEL-AV-8.2.0 qemu-kvm PATCH 2/2] mirror: Don't let an operation wait for itself
|
||||
Bugzilla: 1794692
|
||||
RH-Acked-by: John Snow <jsnow@redhat.com>
|
||||
RH-Acked-by: Stefan Hajnoczi <stefanha@redhat.com>
|
||||
RH-Acked-by: Max Reitz <mreitz@redhat.com>
|
||||
|
||||
mirror_wait_for_free_in_flight_slot() just picks a random operation to
|
||||
wait for. However, when mirror_co_read() waits for free slots, its
|
||||
MirrorOp is already in s->ops_in_flight, so if not enough slots are
|
||||
immediately available, an operation can end up waiting for itself to
|
||||
complete, which results in a hang.
|
||||
|
||||
Fix this by passing the current MirrorOp and skipping this operation
|
||||
when picking an operation to wait for.
|
||||
|
||||
Fixes: https://bugzilla.redhat.com/show_bug.cgi?id=1794692
|
||||
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
|
||||
Reviewed-by: Eric Blake <eblake@redhat.com>
|
||||
(cherry picked from commit 7e6c4ff792734e196c8ca82564c56b5e7c6288ca)
|
||||
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
|
||||
Signed-off-by: Danilo C. L. de Paula <ddepaula@redhat.com>
|
||||
---
|
||||
block/mirror.c | 21 ++++++++++++---------
|
||||
1 file changed, 12 insertions(+), 9 deletions(-)
|
||||
|
||||
diff --git a/block/mirror.c b/block/mirror.c
|
||||
index 8959e42..cacbc70 100644
|
||||
--- a/block/mirror.c
|
||||
+++ b/block/mirror.c
|
||||
@@ -283,11 +283,14 @@ static int mirror_cow_align(MirrorBlockJob *s, int64_t *offset,
|
||||
}
|
||||
|
||||
static inline void coroutine_fn
|
||||
-mirror_wait_for_any_operation(MirrorBlockJob *s, bool active)
|
||||
+mirror_wait_for_any_operation(MirrorBlockJob *s, MirrorOp *self, bool active)
|
||||
{
|
||||
MirrorOp *op;
|
||||
|
||||
QTAILQ_FOREACH(op, &s->ops_in_flight, next) {
|
||||
+ if (self == op) {
|
||||
+ continue;
|
||||
+ }
|
||||
/* Do not wait on pseudo ops, because it may in turn wait on
|
||||
* some other operation to start, which may in fact be the
|
||||
* caller of this function. Since there is only one pseudo op
|
||||
@@ -302,10 +305,10 @@ mirror_wait_for_any_operation(MirrorBlockJob *s, bool active)
|
||||
}
|
||||
|
||||
static inline void coroutine_fn
|
||||
-mirror_wait_for_free_in_flight_slot(MirrorBlockJob *s)
|
||||
+mirror_wait_for_free_in_flight_slot(MirrorBlockJob *s, MirrorOp *self)
|
||||
{
|
||||
/* Only non-active operations use up in-flight slots */
|
||||
- mirror_wait_for_any_operation(s, false);
|
||||
+ mirror_wait_for_any_operation(s, self, false);
|
||||
}
|
||||
|
||||
/* Perform a mirror copy operation.
|
||||
@@ -348,7 +351,7 @@ static void coroutine_fn mirror_co_read(void *opaque)
|
||||
|
||||
while (s->buf_free_count < nb_chunks) {
|
||||
trace_mirror_yield_in_flight(s, op->offset, s->in_flight);
|
||||
- mirror_wait_for_free_in_flight_slot(s);
|
||||
+ mirror_wait_for_free_in_flight_slot(s, op);
|
||||
}
|
||||
|
||||
/* Now make a QEMUIOVector taking enough granularity-sized chunks
|
||||
@@ -555,7 +558,7 @@ static uint64_t coroutine_fn mirror_iteration(MirrorBlockJob *s)
|
||||
|
||||
while (s->in_flight >= MAX_IN_FLIGHT) {
|
||||
trace_mirror_yield_in_flight(s, offset, s->in_flight);
|
||||
- mirror_wait_for_free_in_flight_slot(s);
|
||||
+ mirror_wait_for_free_in_flight_slot(s, pseudo_op);
|
||||
}
|
||||
|
||||
if (s->ret < 0) {
|
||||
@@ -609,7 +612,7 @@ static void mirror_free_init(MirrorBlockJob *s)
|
||||
static void coroutine_fn mirror_wait_for_all_io(MirrorBlockJob *s)
|
||||
{
|
||||
while (s->in_flight > 0) {
|
||||
- mirror_wait_for_free_in_flight_slot(s);
|
||||
+ mirror_wait_for_free_in_flight_slot(s, NULL);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -794,7 +797,7 @@ static int coroutine_fn mirror_dirty_init(MirrorBlockJob *s)
|
||||
if (s->in_flight >= MAX_IN_FLIGHT) {
|
||||
trace_mirror_yield(s, UINT64_MAX, s->buf_free_count,
|
||||
s->in_flight);
|
||||
- mirror_wait_for_free_in_flight_slot(s);
|
||||
+ mirror_wait_for_free_in_flight_slot(s, NULL);
|
||||
continue;
|
||||
}
|
||||
|
||||
@@ -947,7 +950,7 @@ static int coroutine_fn mirror_run(Job *job, Error **errp)
|
||||
/* Do not start passive operations while there are active
|
||||
* writes in progress */
|
||||
while (s->in_active_write_counter) {
|
||||
- mirror_wait_for_any_operation(s, true);
|
||||
+ mirror_wait_for_any_operation(s, NULL, true);
|
||||
}
|
||||
|
||||
if (s->ret < 0) {
|
||||
@@ -973,7 +976,7 @@ static int coroutine_fn mirror_run(Job *job, Error **errp)
|
||||
if (s->in_flight >= MAX_IN_FLIGHT || s->buf_free_count == 0 ||
|
||||
(cnt == 0 && s->in_flight > 0)) {
|
||||
trace_mirror_yield(s, cnt, s->buf_free_count, s->in_flight);
|
||||
- mirror_wait_for_free_in_flight_slot(s);
|
||||
+ mirror_wait_for_free_in_flight_slot(s, NULL);
|
||||
continue;
|
||||
} else if (cnt != 0) {
|
||||
delay_ns = mirror_iteration(s);
|
||||
--
|
||||
1.8.3.1
|
||||
|
@ -1,51 +0,0 @@
|
||||
From 27fe3b8d42a2c99de01ce20e4b0727079c12da65 Mon Sep 17 00:00:00 2001
|
||||
From: Kevin Wolf <kwolf@redhat.com>
|
||||
Date: Mon, 24 Feb 2020 16:57:09 +0000
|
||||
Subject: [PATCH 8/9] mirror: Store MirrorOp.co for debuggability
|
||||
|
||||
RH-Author: Kevin Wolf <kwolf@redhat.com>
|
||||
Message-id: <20200224165710.4830-2-kwolf@redhat.com>
|
||||
Patchwork-id: 94044
|
||||
O-Subject: [RHEL-AV-8.2.0 qemu-kvm PATCH 1/2] mirror: Store MirrorOp.co for debuggability
|
||||
Bugzilla: 1794692
|
||||
RH-Acked-by: John Snow <jsnow@redhat.com>
|
||||
RH-Acked-by: Stefan Hajnoczi <stefanha@redhat.com>
|
||||
RH-Acked-by: Max Reitz <mreitz@redhat.com>
|
||||
|
||||
If a coroutine is launched, but the coroutine pointer isn't stored
|
||||
anywhere, debugging any problems inside the coroutine is quite hard.
|
||||
Let's store the coroutine pointer of a mirror operation in MirrorOp to
|
||||
have it available in the debugger.
|
||||
|
||||
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
|
||||
Reviewed-by: Eric Blake <eblake@redhat.com>
|
||||
(cherry picked from commit eed325b92c3e68417121ea23f96e33af6a4654ed)
|
||||
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
|
||||
Signed-off-by: Danilo C. L. de Paula <ddepaula@redhat.com>
|
||||
---
|
||||
block/mirror.c | 2 ++
|
||||
1 file changed, 2 insertions(+)
|
||||
|
||||
diff --git a/block/mirror.c b/block/mirror.c
|
||||
index f0f2d9d..8959e42 100644
|
||||
--- a/block/mirror.c
|
||||
+++ b/block/mirror.c
|
||||
@@ -103,6 +103,7 @@ struct MirrorOp {
|
||||
bool is_pseudo_op;
|
||||
bool is_active_write;
|
||||
CoQueue waiting_requests;
|
||||
+ Coroutine *co;
|
||||
|
||||
QTAILQ_ENTRY(MirrorOp) next;
|
||||
};
|
||||
@@ -429,6 +430,7 @@ static unsigned mirror_perform(MirrorBlockJob *s, int64_t offset,
|
||||
default:
|
||||
abort();
|
||||
}
|
||||
+ op->co = co;
|
||||
|
||||
QTAILQ_INSERT_TAIL(&s->ops_in_flight, op, next);
|
||||
qemu_coroutine_enter(co);
|
||||
--
|
||||
1.8.3.1
|
||||
|
@ -1,95 +0,0 @@
|
||||
From bddf389330e11fb0ce17413c1bfa2264a281ded2 Mon Sep 17 00:00:00 2001
|
||||
From: Kevin Wolf <kwolf@redhat.com>
|
||||
Date: Mon, 30 Mar 2020 11:19:24 +0100
|
||||
Subject: [PATCH 4/4] mirror: Wait only for in-flight operations
|
||||
|
||||
RH-Author: Kevin Wolf <kwolf@redhat.com>
|
||||
Message-id: <20200330111924.22938-3-kwolf@redhat.com>
|
||||
Patchwork-id: 94463
|
||||
O-Subject: [RHEL-AV-8.2.0 qemu-kvm PATCH 2/2] mirror: Wait only for in-flight operations
|
||||
Bugzilla: 1794692
|
||||
RH-Acked-by: Maxim Levitsky <mlevitsk@redhat.com>
|
||||
RH-Acked-by: Danilo de Paula <ddepaula@redhat.com>
|
||||
RH-Acked-by: Max Reitz <mreitz@redhat.com>
|
||||
|
||||
mirror_wait_for_free_in_flight_slot() just picks a random operation to
|
||||
wait for. However, a MirrorOp is already in s->ops_in_flight when
|
||||
mirror_co_read() waits for free slots, so if not enough slots are
|
||||
immediately available, an operation can end up waiting for itself, or
|
||||
two or more operations can wait for each other to complete, which
|
||||
results in a hang.
|
||||
|
||||
Fix this by adding a flag to MirrorOp that tells us if the request is
|
||||
already in flight (and therefore occupies slots that it will later
|
||||
free), and picking only such operations for waiting.
|
||||
|
||||
Fixes: https://bugzilla.redhat.com/show_bug.cgi?id=1794692
|
||||
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
|
||||
Message-Id: <20200326153628.4869-3-kwolf@redhat.com>
|
||||
Reviewed-by: Eric Blake <eblake@redhat.com>
|
||||
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
|
||||
(cherry picked from commit ce8cabbd17cf738ddfc68384440c38e5dd2fdf97)
|
||||
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
|
||||
Signed-off-by: Danilo C. L. de Paula <ddepaula@redhat.com>
|
||||
---
|
||||
block/mirror.c | 9 ++++++++-
|
||||
1 file changed, 8 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/block/mirror.c b/block/mirror.c
|
||||
index 8959e42..5e5a521 100644
|
||||
--- a/block/mirror.c
|
||||
+++ b/block/mirror.c
|
||||
@@ -102,6 +102,7 @@ struct MirrorOp {
|
||||
|
||||
bool is_pseudo_op;
|
||||
bool is_active_write;
|
||||
+ bool is_in_flight;
|
||||
CoQueue waiting_requests;
|
||||
Coroutine *co;
|
||||
|
||||
@@ -293,7 +294,9 @@ mirror_wait_for_any_operation(MirrorBlockJob *s, bool active)
|
||||
* caller of this function. Since there is only one pseudo op
|
||||
* at any given time, we will always find some real operation
|
||||
* to wait on. */
|
||||
- if (!op->is_pseudo_op && op->is_active_write == active) {
|
||||
+ if (!op->is_pseudo_op && op->is_in_flight &&
|
||||
+ op->is_active_write == active)
|
||||
+ {
|
||||
qemu_co_queue_wait(&op->waiting_requests, NULL);
|
||||
return;
|
||||
}
|
||||
@@ -367,6 +370,7 @@ static void coroutine_fn mirror_co_read(void *opaque)
|
||||
/* Copy the dirty cluster. */
|
||||
s->in_flight++;
|
||||
s->bytes_in_flight += op->bytes;
|
||||
+ op->is_in_flight = true;
|
||||
trace_mirror_one_iteration(s, op->offset, op->bytes);
|
||||
|
||||
ret = bdrv_co_preadv(s->mirror_top_bs->backing, op->offset, op->bytes,
|
||||
@@ -382,6 +386,7 @@ static void coroutine_fn mirror_co_zero(void *opaque)
|
||||
op->s->in_flight++;
|
||||
op->s->bytes_in_flight += op->bytes;
|
||||
*op->bytes_handled = op->bytes;
|
||||
+ op->is_in_flight = true;
|
||||
|
||||
ret = blk_co_pwrite_zeroes(op->s->target, op->offset, op->bytes,
|
||||
op->s->unmap ? BDRV_REQ_MAY_UNMAP : 0);
|
||||
@@ -396,6 +401,7 @@ static void coroutine_fn mirror_co_discard(void *opaque)
|
||||
op->s->in_flight++;
|
||||
op->s->bytes_in_flight += op->bytes;
|
||||
*op->bytes_handled = op->bytes;
|
||||
+ op->is_in_flight = true;
|
||||
|
||||
ret = blk_co_pdiscard(op->s->target, op->offset, op->bytes);
|
||||
mirror_write_complete(op, ret);
|
||||
@@ -1306,6 +1312,7 @@ static MirrorOp *coroutine_fn active_write_prepare(MirrorBlockJob *s,
|
||||
.offset = offset,
|
||||
.bytes = bytes,
|
||||
.is_active_write = true,
|
||||
+ .is_in_flight = true,
|
||||
};
|
||||
qemu_co_queue_init(&op->waiting_requests);
|
||||
QTAILQ_INSERT_TAIL(&s->ops_in_flight, op, next);
|
||||
--
|
||||
1.8.3.1
|
||||
|
@ -1,74 +0,0 @@
|
||||
From 78c7fb5afcb298631df47f6b71cf764f921c15f4 Mon Sep 17 00:00:00 2001
|
||||
From: Juan Quintela <quintela@redhat.com>
|
||||
Date: Tue, 3 Mar 2020 14:51:38 +0000
|
||||
Subject: [PATCH 06/18] multifd: Make sure that we don't do any IO after an
|
||||
error
|
||||
|
||||
RH-Author: Juan Quintela <quintela@redhat.com>
|
||||
Message-id: <20200303145143.149290-6-quintela@redhat.com>
|
||||
Patchwork-id: 94118
|
||||
O-Subject: [RHEL-AV-8.2.0 qemu-kvm PATCH v2 05/10] multifd: Make sure that we don't do any IO after an error
|
||||
Bugzilla: 1738451
|
||||
RH-Acked-by: Laurent Vivier <lvivier@redhat.com>
|
||||
RH-Acked-by: Peter Xu <peterx@redhat.com>
|
||||
RH-Acked-by: Dr. David Alan Gilbert <dgilbert@redhat.com>
|
||||
|
||||
Signed-off-by: Juan Quintela <quintela@redhat.com>
|
||||
Reviewed-by: Dr. David Alan Gilbert <dgilbert@redhat.com>
|
||||
(cherry picked from commit 3d4095b222d97393b1c2c6e514951ec7798f1c43)
|
||||
Signed-off-by: Danilo C. L. de Paula <ddepaula@redhat.com>
|
||||
---
|
||||
migration/ram.c | 22 +++++++++++++---------
|
||||
1 file changed, 13 insertions(+), 9 deletions(-)
|
||||
|
||||
diff --git a/migration/ram.c b/migration/ram.c
|
||||
index 6c55c5d..a0257ee 100644
|
||||
--- a/migration/ram.c
|
||||
+++ b/migration/ram.c
|
||||
@@ -3440,7 +3440,7 @@ static int ram_save_iterate(QEMUFile *f, void *opaque)
|
||||
{
|
||||
RAMState **temp = opaque;
|
||||
RAMState *rs = *temp;
|
||||
- int ret;
|
||||
+ int ret = 0;
|
||||
int i;
|
||||
int64_t t0;
|
||||
int done = 0;
|
||||
@@ -3511,12 +3511,14 @@ static int ram_save_iterate(QEMUFile *f, void *opaque)
|
||||
ram_control_after_iterate(f, RAM_CONTROL_ROUND);
|
||||
|
||||
out:
|
||||
- multifd_send_sync_main(rs);
|
||||
- qemu_put_be64(f, RAM_SAVE_FLAG_EOS);
|
||||
- qemu_fflush(f);
|
||||
- ram_counters.transferred += 8;
|
||||
+ if (ret >= 0) {
|
||||
+ multifd_send_sync_main(rs);
|
||||
+ qemu_put_be64(f, RAM_SAVE_FLAG_EOS);
|
||||
+ qemu_fflush(f);
|
||||
+ ram_counters.transferred += 8;
|
||||
|
||||
- ret = qemu_file_get_error(f);
|
||||
+ ret = qemu_file_get_error(f);
|
||||
+ }
|
||||
if (ret < 0) {
|
||||
return ret;
|
||||
}
|
||||
@@ -3568,9 +3570,11 @@ static int ram_save_complete(QEMUFile *f, void *opaque)
|
||||
ram_control_after_iterate(f, RAM_CONTROL_FINISH);
|
||||
}
|
||||
|
||||
- multifd_send_sync_main(rs);
|
||||
- qemu_put_be64(f, RAM_SAVE_FLAG_EOS);
|
||||
- qemu_fflush(f);
|
||||
+ if (ret >= 0) {
|
||||
+ multifd_send_sync_main(rs);
|
||||
+ qemu_put_be64(f, RAM_SAVE_FLAG_EOS);
|
||||
+ qemu_fflush(f);
|
||||
+ }
|
||||
|
||||
return ret;
|
||||
}
|
||||
--
|
||||
1.8.3.1
|
||||
|
@ -1,107 +0,0 @@
|
||||
From 22fc9bd7e7ae0b72c6f6e483eb66cf996f519766 Mon Sep 17 00:00:00 2001
|
||||
From: David Gibson <dgibson@redhat.com>
|
||||
Date: Tue, 21 Jan 2020 05:16:11 +0000
|
||||
Subject: [PATCH 01/15] ppc: Deassert the external interrupt pin in KVM on
|
||||
reset
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
RH-Author: David Gibson <dgibson@redhat.com>
|
||||
Message-id: <20200121051613.388295-2-dgibson@redhat.com>
|
||||
Patchwork-id: 93429
|
||||
O-Subject: [RHEL-AV-8.2 qemu-kvm PATCH 1/3] ppc: Deassert the external interrupt pin in KVM on reset
|
||||
Bugzilla: 1776638
|
||||
RH-Acked-by: Philippe Mathieu-Daudé <philmd@redhat.com>
|
||||
RH-Acked-by: Laurent Vivier <lvivier@redhat.com>
|
||||
RH-Acked-by: Thomas Huth <thuth@redhat.com>
|
||||
|
||||
From: Greg Kurz <groug@kaod.org>
|
||||
|
||||
When a CPU is reset, QEMU makes sure no interrupt is pending by clearing
|
||||
CPUPPCstate::pending_interrupts in ppc_cpu_reset(). In the case of a
|
||||
complete machine emulation, eg. a sPAPR machine, an external interrupt
|
||||
request could still be pending in KVM though, eg. an IPI. It will be
|
||||
eventually presented to the guest, which is supposed to acknowledge it at
|
||||
the interrupt controller. If the interrupt controller is emulated in QEMU,
|
||||
either XICS or XIVE, ppc_set_irq() won't deassert the external interrupt
|
||||
pin in KVM since it isn't pending anymore for QEMU. When the vCPU re-enters
|
||||
the guest, the interrupt request is still pending and the vCPU will try
|
||||
again to acknowledge it. This causes an infinite loop and eventually hangs
|
||||
the guest.
|
||||
|
||||
The code has been broken since the beginning. The issue wasn't hit before
|
||||
because accel=kvm,kernel-irqchip=off is an awkward setup that never got
|
||||
used until recently with the LC92x IBM systems (aka, Boston).
|
||||
|
||||
Add a ppc_irq_reset() function to do the necessary cleanup, ie. deassert
|
||||
the IRQ pins of the CPU in QEMU and most importantly the external interrupt
|
||||
pin for this vCPU in KVM.
|
||||
|
||||
Reported-by: Satheesh Rajendran <sathnaga@linux.vnet.ibm.com>
|
||||
Signed-off-by: Greg Kurz <groug@kaod.org>
|
||||
Message-Id: <157548861740.3650476.16879693165328764758.stgit@bahia.lan>
|
||||
Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
|
||||
(cherry picked from commit 401774387aeb37f2ada9bb18f7c7e307b21a3e93)
|
||||
|
||||
Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1776638
|
||||
|
||||
Signed-off-by: David Gibson <dgibson@redhat.com>
|
||||
Signed-off-by: Danilo C. L. de Paula <ddepaula@redhat.com>
|
||||
---
|
||||
hw/ppc/ppc.c | 8 ++++++++
|
||||
include/hw/ppc/ppc.h | 2 ++
|
||||
target/ppc/translate_init.inc.c | 1 +
|
||||
3 files changed, 11 insertions(+)
|
||||
|
||||
diff --git a/hw/ppc/ppc.c b/hw/ppc/ppc.c
|
||||
index 52a18eb..d554b64 100644
|
||||
--- a/hw/ppc/ppc.c
|
||||
+++ b/hw/ppc/ppc.c
|
||||
@@ -1510,3 +1510,11 @@ PowerPCCPU *ppc_get_vcpu_by_pir(int pir)
|
||||
|
||||
return NULL;
|
||||
}
|
||||
+
|
||||
+void ppc_irq_reset(PowerPCCPU *cpu)
|
||||
+{
|
||||
+ CPUPPCState *env = &cpu->env;
|
||||
+
|
||||
+ env->irq_input_state = 0;
|
||||
+ kvmppc_set_interrupt(cpu, PPC_INTERRUPT_EXT, 0);
|
||||
+}
|
||||
diff --git a/include/hw/ppc/ppc.h b/include/hw/ppc/ppc.h
|
||||
index 4bdcb8b..5dd7531 100644
|
||||
--- a/include/hw/ppc/ppc.h
|
||||
+++ b/include/hw/ppc/ppc.h
|
||||
@@ -76,6 +76,7 @@ static inline void ppc970_irq_init(PowerPCCPU *cpu) {}
|
||||
static inline void ppcPOWER7_irq_init(PowerPCCPU *cpu) {}
|
||||
static inline void ppcPOWER9_irq_init(PowerPCCPU *cpu) {}
|
||||
static inline void ppce500_irq_init(PowerPCCPU *cpu) {}
|
||||
+static inline void ppc_irq_reset(PowerPCCPU *cpu) {}
|
||||
#else
|
||||
void ppc40x_irq_init(PowerPCCPU *cpu);
|
||||
void ppce500_irq_init(PowerPCCPU *cpu);
|
||||
@@ -83,6 +84,7 @@ void ppc6xx_irq_init(PowerPCCPU *cpu);
|
||||
void ppc970_irq_init(PowerPCCPU *cpu);
|
||||
void ppcPOWER7_irq_init(PowerPCCPU *cpu);
|
||||
void ppcPOWER9_irq_init(PowerPCCPU *cpu);
|
||||
+void ppc_irq_reset(PowerPCCPU *cpu);
|
||||
#endif
|
||||
|
||||
/* PPC machines for OpenBIOS */
|
||||
diff --git a/target/ppc/translate_init.inc.c b/target/ppc/translate_init.inc.c
|
||||
index ba726de..64a8380 100644
|
||||
--- a/target/ppc/translate_init.inc.c
|
||||
+++ b/target/ppc/translate_init.inc.c
|
||||
@@ -10461,6 +10461,7 @@ static void ppc_cpu_reset(CPUState *s)
|
||||
env->pending_interrupts = 0;
|
||||
s->exception_index = POWERPC_EXCP_NONE;
|
||||
env->error_code = 0;
|
||||
+ ppc_irq_reset(cpu);
|
||||
|
||||
/* tininess for underflow is detected before rounding */
|
||||
set_float_detect_tininess(float_tininess_before_rounding,
|
||||
--
|
||||
1.8.3.1
|
||||
|
@ -1,112 +0,0 @@
|
||||
From f2f57c1ed926384e074d2048cdbdc30ee2f426eb Mon Sep 17 00:00:00 2001
|
||||
From: David Gibson <dgibson@redhat.com>
|
||||
Date: Tue, 21 Jan 2020 05:16:13 +0000
|
||||
Subject: [PATCH 03/15] ppc: Don't use CPUPPCState::irq_input_state with modern
|
||||
Book3s CPU models
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
RH-Author: David Gibson <dgibson@redhat.com>
|
||||
Message-id: <20200121051613.388295-4-dgibson@redhat.com>
|
||||
Patchwork-id: 93431
|
||||
O-Subject: [RHEL-AV-8.2 qemu-kvm PATCH 3/3] ppc: Don't use CPUPPCState::irq_input_state with modern Book3s CPU models
|
||||
Bugzilla: 1776638
|
||||
RH-Acked-by: Philippe Mathieu-Daudé <philmd@redhat.com>
|
||||
RH-Acked-by: Laurent Vivier <lvivier@redhat.com>
|
||||
RH-Acked-by: Thomas Huth <thuth@redhat.com>
|
||||
|
||||
From: Greg Kurz <groug@kaod.org>
|
||||
|
||||
The power7_set_irq() and power9_set_irq() functions set this but it is
|
||||
never used actually. Modern Book3s compatible CPUs are only supported
|
||||
by the pnv and spapr machines. They have an interrupt controller, XICS
|
||||
for POWER7/8 and XIVE for POWER9, whose models don't require to track
|
||||
IRQ input states at the CPU level.
|
||||
|
||||
Drop these lines to avoid confusion.
|
||||
|
||||
Signed-off-by: Greg Kurz <groug@kaod.org>
|
||||
Message-Id: <157548862861.3650476.16622818876928044450.stgit@bahia.lan>
|
||||
Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
|
||||
(cherry picked from commit c1ad0b892ce20cf2b5e619c79e8a0c4c66b235dc)
|
||||
|
||||
Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1776638
|
||||
|
||||
Signed-off-by: David Gibson <dgibson@redhat.com>
|
||||
Signed-off-by: Danilo C. L. de Paula <ddepaula@redhat.com>
|
||||
---
|
||||
hw/ppc/ppc.c | 16 ++--------------
|
||||
target/ppc/cpu.h | 4 +++-
|
||||
2 files changed, 5 insertions(+), 15 deletions(-)
|
||||
|
||||
diff --git a/hw/ppc/ppc.c b/hw/ppc/ppc.c
|
||||
index d554b64..730a41f 100644
|
||||
--- a/hw/ppc/ppc.c
|
||||
+++ b/hw/ppc/ppc.c
|
||||
@@ -275,10 +275,9 @@ void ppc970_irq_init(PowerPCCPU *cpu)
|
||||
static void power7_set_irq(void *opaque, int pin, int level)
|
||||
{
|
||||
PowerPCCPU *cpu = opaque;
|
||||
- CPUPPCState *env = &cpu->env;
|
||||
|
||||
LOG_IRQ("%s: env %p pin %d level %d\n", __func__,
|
||||
- env, pin, level);
|
||||
+ &cpu->env, pin, level);
|
||||
|
||||
switch (pin) {
|
||||
case POWER7_INPUT_INT:
|
||||
@@ -292,11 +291,6 @@ static void power7_set_irq(void *opaque, int pin, int level)
|
||||
LOG_IRQ("%s: unknown IRQ pin %d\n", __func__, pin);
|
||||
return;
|
||||
}
|
||||
- if (level) {
|
||||
- env->irq_input_state |= 1 << pin;
|
||||
- } else {
|
||||
- env->irq_input_state &= ~(1 << pin);
|
||||
- }
|
||||
}
|
||||
|
||||
void ppcPOWER7_irq_init(PowerPCCPU *cpu)
|
||||
@@ -311,10 +305,9 @@ void ppcPOWER7_irq_init(PowerPCCPU *cpu)
|
||||
static void power9_set_irq(void *opaque, int pin, int level)
|
||||
{
|
||||
PowerPCCPU *cpu = opaque;
|
||||
- CPUPPCState *env = &cpu->env;
|
||||
|
||||
LOG_IRQ("%s: env %p pin %d level %d\n", __func__,
|
||||
- env, pin, level);
|
||||
+ &cpu->env, pin, level);
|
||||
|
||||
switch (pin) {
|
||||
case POWER9_INPUT_INT:
|
||||
@@ -334,11 +327,6 @@ static void power9_set_irq(void *opaque, int pin, int level)
|
||||
LOG_IRQ("%s: unknown IRQ pin %d\n", __func__, pin);
|
||||
return;
|
||||
}
|
||||
- if (level) {
|
||||
- env->irq_input_state |= 1 << pin;
|
||||
- } else {
|
||||
- env->irq_input_state &= ~(1 << pin);
|
||||
- }
|
||||
}
|
||||
|
||||
void ppcPOWER9_irq_init(PowerPCCPU *cpu)
|
||||
diff --git a/target/ppc/cpu.h b/target/ppc/cpu.h
|
||||
index 5c53801..8887f76 100644
|
||||
--- a/target/ppc/cpu.h
|
||||
+++ b/target/ppc/cpu.h
|
||||
@@ -1090,7 +1090,9 @@ struct CPUPPCState {
|
||||
#if !defined(CONFIG_USER_ONLY)
|
||||
/*
|
||||
* This is the IRQ controller, which is implementation dependent
|
||||
- * and only relevant when emulating a complete machine.
|
||||
+ * and only relevant when emulating a complete machine. Note that
|
||||
+ * this isn't used by recent Book3s compatible CPUs (POWER7 and
|
||||
+ * newer).
|
||||
*/
|
||||
uint32_t irq_input_state;
|
||||
void **irq_inputs;
|
||||
--
|
||||
1.8.3.1
|
||||
|
@ -1,64 +0,0 @@
|
||||
From 428eb7260718b69b1f3f421d03bce10b8785fc49 Mon Sep 17 00:00:00 2001
|
||||
From: Kevin Wolf <kwolf@redhat.com>
|
||||
Date: Fri, 13 Mar 2020 12:34:39 +0000
|
||||
Subject: [PATCH 19/20] qapi: Add '@allow-write-only-overlay' feature for
|
||||
'blockdev-snapshot'
|
||||
|
||||
RH-Author: Kevin Wolf <kwolf@redhat.com>
|
||||
Message-id: <20200313123439.10548-14-kwolf@redhat.com>
|
||||
Patchwork-id: 94290
|
||||
O-Subject: [RHEL-AV-8.2.0 qemu-kvm PATCH v2 13/13] qapi: Add '@allow-write-only-overlay' feature for 'blockdev-snapshot'
|
||||
Bugzilla: 1790482 1805143
|
||||
RH-Acked-by: John Snow <jsnow@redhat.com>
|
||||
RH-Acked-by: Daniel P. Berrange <berrange@redhat.com>
|
||||
RH-Acked-by: Peter Krempa <pkrempa@redhat.com>
|
||||
|
||||
From: Peter Krempa <pkrempa@redhat.com>
|
||||
|
||||
Anounce that 'blockdev-snapshot' command's permissions allow changing
|
||||
of the backing file if the 'consistent_read' permission is not required.
|
||||
|
||||
This is useful for libvirt to allow late opening of the backing chain
|
||||
during a blockdev-mirror.
|
||||
|
||||
Signed-off-by: Peter Krempa <pkrempa@redhat.com>
|
||||
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
|
||||
Message-Id: <20200310113831.27293-8-kwolf@redhat.com>
|
||||
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
|
||||
(cherry picked from commit c6bdc312f30d5c7326aa2fdca3e0f98c15eb541a)
|
||||
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
|
||||
Signed-off-by: Danilo C. L. de Paula <ddepaula@redhat.com>
|
||||
---
|
||||
qapi/block-core.json | 9 ++++++++-
|
||||
1 file changed, 8 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/qapi/block-core.json b/qapi/block-core.json
|
||||
index a1e85b0..a64ad81 100644
|
||||
--- a/qapi/block-core.json
|
||||
+++ b/qapi/block-core.json
|
||||
@@ -1541,6 +1541,12 @@
|
||||
#
|
||||
# For the arguments, see the documentation of BlockdevSnapshot.
|
||||
#
|
||||
+# Features:
|
||||
+# @allow-write-only-overlay: If present, the check whether this operation is safe
|
||||
+# was relaxed so that it can be used to change
|
||||
+# backing file of a destination of a blockdev-mirror.
|
||||
+# (since 5.0)
|
||||
+#
|
||||
# Since: 2.5
|
||||
#
|
||||
# Example:
|
||||
@@ -1561,7 +1567,8 @@
|
||||
#
|
||||
##
|
||||
{ 'command': 'blockdev-snapshot',
|
||||
- 'data': 'BlockdevSnapshot' }
|
||||
+ 'data': 'BlockdevSnapshot',
|
||||
+ 'features': [ 'allow-write-only-overlay' ] }
|
||||
|
||||
##
|
||||
# @change-backing-file:
|
||||
--
|
||||
1.8.3.1
|
||||
|
@ -1,52 +0,0 @@
|
||||
From ecc4fb6e1941035e1d9def1f69b779fbea216caf Mon Sep 17 00:00:00 2001
|
||||
From: Kevin Wolf <kwolf@redhat.com>
|
||||
Date: Mon, 24 Feb 2020 16:13:07 +0000
|
||||
Subject: [PATCH 7/9] qcow2: Fix qcow2_alloc_cluster_abort() for external data
|
||||
file
|
||||
|
||||
RH-Author: Kevin Wolf <kwolf@redhat.com>
|
||||
Message-id: <20200224161307.29783-2-kwolf@redhat.com>
|
||||
Patchwork-id: 94042
|
||||
O-Subject: [RHEL-AV-8.2.0 qemu-kvm PATCH 1/1] qcow2: Fix qcow2_alloc_cluster_abort() for external data file
|
||||
Bugzilla: 1703907
|
||||
RH-Acked-by: John Snow <jsnow@redhat.com>
|
||||
RH-Acked-by: Stefan Hajnoczi <stefanha@redhat.com>
|
||||
RH-Acked-by: Max Reitz <mreitz@redhat.com>
|
||||
|
||||
For external data file, cluster allocations return an offset in the data
|
||||
file and are not refcounted. In this case, there is nothing to do for
|
||||
qcow2_alloc_cluster_abort(). Freeing the same offset in the qcow2 file
|
||||
is wrong and causes crashes in the better case or image corruption in
|
||||
the worse case.
|
||||
|
||||
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
|
||||
Message-Id: <20200211094900.17315-3-kwolf@redhat.com>
|
||||
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
|
||||
(cherry picked from commit c3b6658c1a5a3fb24d6c27b2594cf86146f75b22)
|
||||
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
|
||||
Signed-off-by: Danilo C. L. de Paula <ddepaula@redhat.com>
|
||||
---
|
||||
block/qcow2-cluster.c | 7 +++++--
|
||||
1 file changed, 5 insertions(+), 2 deletions(-)
|
||||
|
||||
diff --git a/block/qcow2-cluster.c b/block/qcow2-cluster.c
|
||||
index 8982b7b..dc3c270 100644
|
||||
--- a/block/qcow2-cluster.c
|
||||
+++ b/block/qcow2-cluster.c
|
||||
@@ -1015,8 +1015,11 @@ err:
|
||||
void qcow2_alloc_cluster_abort(BlockDriverState *bs, QCowL2Meta *m)
|
||||
{
|
||||
BDRVQcow2State *s = bs->opaque;
|
||||
- qcow2_free_clusters(bs, m->alloc_offset, m->nb_clusters << s->cluster_bits,
|
||||
- QCOW2_DISCARD_NEVER);
|
||||
+ if (!has_data_file(bs)) {
|
||||
+ qcow2_free_clusters(bs, m->alloc_offset,
|
||||
+ m->nb_clusters << s->cluster_bits,
|
||||
+ QCOW2_DISCARD_NEVER);
|
||||
+ }
|
||||
}
|
||||
|
||||
/*
|
||||
--
|
||||
1.8.3.1
|
||||
|
@ -1,92 +0,0 @@
|
||||
From d84814e298e3b05fb5bc61cc8e641a5e104d32d5 Mon Sep 17 00:00:00 2001
|
||||
From: Juan Quintela <quintela@redhat.com>
|
||||
Date: Tue, 3 Mar 2020 14:51:39 +0000
|
||||
Subject: [PATCH 07/18] qemu-file: Don't do IO after shutdown
|
||||
|
||||
RH-Author: Juan Quintela <quintela@redhat.com>
|
||||
Message-id: <20200303145143.149290-7-quintela@redhat.com>
|
||||
Patchwork-id: 94116
|
||||
O-Subject: [RHEL-AV-8.2.0 qemu-kvm PATCH v2 06/10] qemu-file: Don't do IO after shutdown
|
||||
Bugzilla: 1738451
|
||||
RH-Acked-by: Laurent Vivier <lvivier@redhat.com>
|
||||
RH-Acked-by: Peter Xu <peterx@redhat.com>
|
||||
RH-Acked-by: Dr. David Alan Gilbert <dgilbert@redhat.com>
|
||||
|
||||
Be sure that we are not doing neither read/write after shutdown of the
|
||||
QEMUFile.
|
||||
|
||||
Signed-off-by: Juan Quintela <quintela@redhat.com>
|
||||
Reviewed-by: Dr. David Alan Gilbert <dgilbert@redhat.com>
|
||||
(cherry picked from commit a555b8092abc6f1bbe4b64c516679cbd68fcfbd8)
|
||||
Signed-off-by: Danilo C. L. de Paula <ddepaula@redhat.com>
|
||||
---
|
||||
migration/qemu-file.c | 22 +++++++++++++++++++++-
|
||||
1 file changed, 21 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/migration/qemu-file.c b/migration/qemu-file.c
|
||||
index 26fb25d..bbb2b63 100644
|
||||
--- a/migration/qemu-file.c
|
||||
+++ b/migration/qemu-file.c
|
||||
@@ -53,6 +53,8 @@ struct QEMUFile {
|
||||
|
||||
int last_error;
|
||||
Error *last_error_obj;
|
||||
+ /* has the file has been shutdown */
|
||||
+ bool shutdown;
|
||||
};
|
||||
|
||||
/*
|
||||
@@ -61,10 +63,18 @@ struct QEMUFile {
|
||||
*/
|
||||
int qemu_file_shutdown(QEMUFile *f)
|
||||
{
|
||||
+ int ret;
|
||||
+
|
||||
+ f->shutdown = true;
|
||||
if (!f->ops->shut_down) {
|
||||
return -ENOSYS;
|
||||
}
|
||||
- return f->ops->shut_down(f->opaque, true, true, NULL);
|
||||
+ ret = f->ops->shut_down(f->opaque, true, true, NULL);
|
||||
+
|
||||
+ if (!f->last_error) {
|
||||
+ qemu_file_set_error(f, -EIO);
|
||||
+ }
|
||||
+ return ret;
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -214,6 +224,9 @@ void qemu_fflush(QEMUFile *f)
|
||||
return;
|
||||
}
|
||||
|
||||
+ if (f->shutdown) {
|
||||
+ return;
|
||||
+ }
|
||||
if (f->iovcnt > 0) {
|
||||
expect = iov_size(f->iov, f->iovcnt);
|
||||
ret = f->ops->writev_buffer(f->opaque, f->iov, f->iovcnt, f->pos,
|
||||
@@ -328,6 +341,10 @@ static ssize_t qemu_fill_buffer(QEMUFile *f)
|
||||
f->buf_index = 0;
|
||||
f->buf_size = pending;
|
||||
|
||||
+ if (f->shutdown) {
|
||||
+ return 0;
|
||||
+ }
|
||||
+
|
||||
len = f->ops->get_buffer(f->opaque, f->buf + pending, f->pos,
|
||||
IO_BUF_SIZE - pending, &local_error);
|
||||
if (len > 0) {
|
||||
@@ -642,6 +659,9 @@ int64_t qemu_ftell(QEMUFile *f)
|
||||
|
||||
int qemu_file_rate_limit(QEMUFile *f)
|
||||
{
|
||||
+ if (f->shutdown) {
|
||||
+ return 1;
|
||||
+ }
|
||||
if (qemu_file_get_error(f)) {
|
||||
return 1;
|
||||
}
|
||||
--
|
||||
1.8.3.1
|
||||
|
@ -1,57 +0,0 @@
|
||||
From 46887feac666d0d7633ff3f5af5721fe2a80a8ab Mon Sep 17 00:00:00 2001
|
||||
From: Kevin Wolf <kwolf@redhat.com>
|
||||
Date: Wed, 8 Apr 2020 17:29:13 +0100
|
||||
Subject: [PATCH 2/6] replication: assert we own context before job_cancel_sync
|
||||
|
||||
RH-Author: Kevin Wolf <kwolf@redhat.com>
|
||||
Message-id: <20200408172917.18712-3-kwolf@redhat.com>
|
||||
Patchwork-id: 94595
|
||||
O-Subject: [RHEL-AV-8.2.0 qemu-kvm PATCH 2/6] replication: assert we own context before job_cancel_sync
|
||||
Bugzilla: 1817621
|
||||
RH-Acked-by: Eric Blake <eblake@redhat.com>
|
||||
RH-Acked-by: Danilo de Paula <ddepaula@redhat.com>
|
||||
RH-Acked-by: Max Reitz <mreitz@redhat.com>
|
||||
|
||||
From: Stefan Reiter <s.reiter@proxmox.com>
|
||||
|
||||
job_cancel_sync requires the job's lock to be held, all other callers
|
||||
already do this (replication_stop, drive_backup_abort,
|
||||
blockdev_backup_abort, job_cancel_sync_all, cancel_common).
|
||||
|
||||
In this case we're in a BlockDriver handler, so we already have a lock,
|
||||
just assert that it is the same as the one used for the commit_job.
|
||||
|
||||
Signed-off-by: Stefan Reiter <s.reiter@proxmox.com>
|
||||
Message-Id: <20200407115651.69472-3-s.reiter@proxmox.com>
|
||||
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
|
||||
(cherry picked from commit 08558e33257ec796594bd411261028a93414a70c)
|
||||
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
|
||||
Signed-off-by: Danilo C. L. de Paula <ddepaula@redhat.com>
|
||||
---
|
||||
block/replication.c | 5 ++++-
|
||||
1 file changed, 4 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/block/replication.c b/block/replication.c
|
||||
index 99532ce..0ce27ee 100644
|
||||
--- a/block/replication.c
|
||||
+++ b/block/replication.c
|
||||
@@ -144,12 +144,15 @@ fail:
|
||||
static void replication_close(BlockDriverState *bs)
|
||||
{
|
||||
BDRVReplicationState *s = bs->opaque;
|
||||
+ Job *commit_job;
|
||||
|
||||
if (s->stage == BLOCK_REPLICATION_RUNNING) {
|
||||
replication_stop(s->rs, false, NULL);
|
||||
}
|
||||
if (s->stage == BLOCK_REPLICATION_FAILOVER) {
|
||||
- job_cancel_sync(&s->commit_job->job);
|
||||
+ commit_job = &s->commit_job->job;
|
||||
+ assert(commit_job->aio_context == qemu_get_current_aio_context());
|
||||
+ job_cancel_sync(commit_job);
|
||||
}
|
||||
|
||||
if (s->mode == REPLICATION_MODE_SECONDARY) {
|
||||
--
|
||||
1.8.3.1
|
||||
|
@ -1,77 +0,0 @@
|
||||
From 0f659af4870f151e25a7d2184b9a383bff58e3ba Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Marc-Andr=C3=A9=20Lureau?= <marcandre.lureau@redhat.com>
|
||||
Date: Fri, 17 Jan 2020 12:07:57 +0100
|
||||
Subject: [PATCH 2/4] slirp: use correct size while emulating IRC commands
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
RH-Author: Marc-André Lureau <marcandre.lureau@redhat.com>
|
||||
Message-id: <20200117120758.1076549-3-marcandre.lureau@redhat.com>
|
||||
Patchwork-id: 93400
|
||||
O-Subject: [RHEL-AV-8.1.0 qemu-kvm + RHEL-AV-8.2.0 qemu-kvm PATCH 2/3] slirp: use correct size while emulating IRC commands
|
||||
Bugzilla: 1791568
|
||||
RH-Acked-by: Philippe Mathieu-Daudé <philmd@redhat.com>
|
||||
RH-Acked-by: Stefano Garzarella <sgarzare@redhat.com>
|
||||
RH-Acked-by: Stefan Hajnoczi <stefanha@redhat.com>
|
||||
|
||||
From: Prasad J Pandit <pjp@fedoraproject.org>
|
||||
|
||||
While emulating IRC DCC commands, tcp_emu() uses 'mbuf' size
|
||||
'm->m_size' to write DCC commands via snprintf(3). This may
|
||||
lead to OOB write access, because 'bptr' points somewhere in
|
||||
the middle of 'mbuf' buffer, not at the start. Use M_FREEROOM(m)
|
||||
size to avoid OOB access.
|
||||
|
||||
Reported-by: Vishnu Dev TJ <vishnudevtj@gmail.com>
|
||||
Signed-off-by: Prasad J Pandit <pjp@fedoraproject.org>
|
||||
Reviewed-by: Samuel Thibault <samuel.thibault@ens-lyon.org>
|
||||
Message-Id: <20200109094228.79764-2-ppandit@redhat.com>
|
||||
|
||||
(cherry picked from libslirp commit ce131029d6d4a405cb7d3ac6716d03e58fb4a5d9)
|
||||
Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
|
||||
|
||||
Signed-off-by: Miroslav Rezanina <mrezanin@redhat.com>
|
||||
---
|
||||
slirp/src/tcp_subr.c | 11 ++++++-----
|
||||
1 file changed, 6 insertions(+), 5 deletions(-)
|
||||
|
||||
diff --git a/slirp/src/tcp_subr.c b/slirp/src/tcp_subr.c
|
||||
index cbecd64..cedbfb2 100644
|
||||
--- a/slirp/src/tcp_subr.c
|
||||
+++ b/slirp/src/tcp_subr.c
|
||||
@@ -778,7 +778,8 @@ int tcp_emu(struct socket *so, struct mbuf *m)
|
||||
return 1;
|
||||
}
|
||||
m->m_len = bptr - m->m_data; /* Adjust length */
|
||||
- m->m_len += snprintf(bptr, m->m_size, "DCC CHAT chat %lu %u%c\n",
|
||||
+ m->m_len += snprintf(bptr, M_FREEROOM(m),
|
||||
+ "DCC CHAT chat %lu %u%c\n",
|
||||
(unsigned long)ntohl(so->so_faddr.s_addr),
|
||||
ntohs(so->so_fport), 1);
|
||||
} else if (sscanf(bptr, "DCC SEND %256s %u %u %u", buff, &laddr, &lport,
|
||||
@@ -788,8 +789,8 @@ int tcp_emu(struct socket *so, struct mbuf *m)
|
||||
return 1;
|
||||
}
|
||||
m->m_len = bptr - m->m_data; /* Adjust length */
|
||||
- m->m_len +=
|
||||
- snprintf(bptr, m->m_size, "DCC SEND %s %lu %u %u%c\n", buff,
|
||||
+ m->m_len += snprintf(bptr, M_FREEROOM(m),
|
||||
+ "DCC SEND %s %lu %u %u%c\n", buff,
|
||||
(unsigned long)ntohl(so->so_faddr.s_addr),
|
||||
ntohs(so->so_fport), n1, 1);
|
||||
} else if (sscanf(bptr, "DCC MOVE %256s %u %u %u", buff, &laddr, &lport,
|
||||
@@ -799,8 +800,8 @@ int tcp_emu(struct socket *so, struct mbuf *m)
|
||||
return 1;
|
||||
}
|
||||
m->m_len = bptr - m->m_data; /* Adjust length */
|
||||
- m->m_len +=
|
||||
- snprintf(bptr, m->m_size, "DCC MOVE %s %lu %u %u%c\n", buff,
|
||||
+ m->m_len += snprintf(bptr, M_FREEROOM(m),
|
||||
+ "DCC MOVE %s %lu %u %u%c\n", buff,
|
||||
(unsigned long)ntohl(so->so_faddr.s_addr),
|
||||
ntohs(so->so_fport), n1, 1);
|
||||
}
|
||||
--
|
||||
1.8.3.1
|
||||
|
@ -1,71 +0,0 @@
|
||||
From dfbfcf02738640ab83f7970e636b72b78f166675 Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Marc-Andr=C3=A9=20Lureau?= <marcandre.lureau@redhat.com>
|
||||
Date: Fri, 17 Jan 2020 12:07:58 +0100
|
||||
Subject: [PATCH 3/4] slirp: use correct size while emulating commands
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
RH-Author: Marc-André Lureau <marcandre.lureau@redhat.com>
|
||||
Message-id: <20200117120758.1076549-4-marcandre.lureau@redhat.com>
|
||||
Patchwork-id: 93401
|
||||
O-Subject: [RHEL-AV-8.1.0 qemu-kvm + RHEL-AV-8.2.0 qemu-kvm PATCH 3/3] slirp: use correct size while emulating commands
|
||||
Bugzilla: 1791568
|
||||
RH-Acked-by: Philippe Mathieu-Daudé <philmd@redhat.com>
|
||||
RH-Acked-by: Stefano Garzarella <sgarzare@redhat.com>
|
||||
RH-Acked-by: Stefan Hajnoczi <stefanha@redhat.com>
|
||||
|
||||
From: Prasad J Pandit <pjp@fedoraproject.org>
|
||||
|
||||
While emulating services in tcp_emu(), it uses 'mbuf' size
|
||||
'm->m_size' to write commands via snprintf(3). Use M_FREEROOM(m)
|
||||
size to avoid possible OOB access.
|
||||
|
||||
Signed-off-by: Prasad J Pandit <pjp@fedoraproject.org>
|
||||
Signed-off-by: Samuel Thibault <samuel.thibault@ens-lyon.org>
|
||||
Message-Id: <20200109094228.79764-3-ppandit@redhat.com>
|
||||
|
||||
(cherry picked from commit 82ebe9c370a0e2970fb5695aa19aa5214a6a1c80)
|
||||
Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
|
||||
Signed-off-by: Miroslav Rezanina <mrezanin@redhat.com>
|
||||
---
|
||||
slirp/src/tcp_subr.c | 9 ++++-----
|
||||
1 file changed, 4 insertions(+), 5 deletions(-)
|
||||
|
||||
diff --git a/slirp/src/tcp_subr.c b/slirp/src/tcp_subr.c
|
||||
index cedbfb2..954d1a6 100644
|
||||
--- a/slirp/src/tcp_subr.c
|
||||
+++ b/slirp/src/tcp_subr.c
|
||||
@@ -696,7 +696,7 @@ int tcp_emu(struct socket *so, struct mbuf *m)
|
||||
n4 = (laddr & 0xff);
|
||||
|
||||
m->m_len = bptr - m->m_data; /* Adjust length */
|
||||
- m->m_len += snprintf(bptr, m->m_size - m->m_len,
|
||||
+ m->m_len += snprintf(bptr, M_FREEROOM(m),
|
||||
"ORT %d,%d,%d,%d,%d,%d\r\n%s", n1, n2, n3, n4,
|
||||
n5, n6, x == 7 ? buff : "");
|
||||
return 1;
|
||||
@@ -731,8 +731,7 @@ int tcp_emu(struct socket *so, struct mbuf *m)
|
||||
n4 = (laddr & 0xff);
|
||||
|
||||
m->m_len = bptr - m->m_data; /* Adjust length */
|
||||
- m->m_len +=
|
||||
- snprintf(bptr, m->m_size - m->m_len,
|
||||
+ m->m_len += snprintf(bptr, M_FREEROOM(m),
|
||||
"27 Entering Passive Mode (%d,%d,%d,%d,%d,%d)\r\n%s",
|
||||
n1, n2, n3, n4, n5, n6, x == 7 ? buff : "");
|
||||
|
||||
@@ -758,8 +757,8 @@ int tcp_emu(struct socket *so, struct mbuf *m)
|
||||
if (m->m_data[m->m_len - 1] == '\0' && lport != 0 &&
|
||||
(so = tcp_listen(slirp, INADDR_ANY, 0, so->so_laddr.s_addr,
|
||||
htons(lport), SS_FACCEPTONCE)) != NULL)
|
||||
- m->m_len =
|
||||
- snprintf(m->m_data, m->m_size, "%d", ntohs(so->so_fport)) + 1;
|
||||
+ m->m_len = snprintf(m->m_data, M_ROOM(m),
|
||||
+ "%d", ntohs(so->so_fport)) + 1;
|
||||
return 1;
|
||||
|
||||
case EMU_IRC:
|
||||
--
|
||||
1.8.3.1
|
||||
|
@ -1,113 +0,0 @@
|
||||
From f2aeed761d2dad14920fa08c977dc45564886d9b Mon Sep 17 00:00:00 2001
|
||||
From: David Gibson <dgibson@redhat.com>
|
||||
Date: Fri, 3 Jan 2020 01:15:12 +0000
|
||||
Subject: [PATCH 1/5] spapr: Don't trigger a CAS reboot for XICS/XIVE mode
|
||||
changeover
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
RH-Author: David Gibson <dgibson@redhat.com>
|
||||
Message-id: <20200103011512.49129-2-dgibson@redhat.com>
|
||||
Patchwork-id: 93261
|
||||
O-Subject: [RHEL-AV-4.2 qemu-kvm PATCH 1/1] spapr: Don't trigger a CAS reboot for XICS/XIVE mode changeover
|
||||
Bugzilla: 1733893
|
||||
RH-Acked-by: Laurent Vivier <lvivier@redhat.com>
|
||||
RH-Acked-by: Thomas Huth <thuth@redhat.com>
|
||||
RH-Acked-by: Philippe Mathieu-Daudé <philmd@redhat.com>
|
||||
|
||||
From: David Gibson <david@gibson.dropbear.id.au>
|
||||
|
||||
PAPR allows the interrupt controller used on a POWER9 machine (XICS or
|
||||
XIVE) to be selected by the guest operating system, by using the
|
||||
ibm,client-architecture-support (CAS) feature negotiation call.
|
||||
|
||||
Currently, if the guest selects an interrupt controller different from the
|
||||
one selected at initial boot, this causes the system to be reset with the
|
||||
new model and the boot starts again. This means we run through the SLOF
|
||||
boot process twice, as well as any other bootloader (e.g. grub) in use
|
||||
before the OS calls CAS. This can be confusing and/or inconvenient for
|
||||
users.
|
||||
|
||||
Thanks to two fairly recent changes, we no longer need this reboot. 1) we
|
||||
now completely regenerate the device tree when CAS is called (meaning we
|
||||
don't need special case updates for all the device tree changes caused by
|
||||
the interrupt controller mode change), 2) we now have explicit code paths
|
||||
to activate and deactivate the different interrupt controllers, rather than
|
||||
just implicitly calling those at machine reset time.
|
||||
|
||||
We can therefore eliminate the reboot for changing irq mode, simply by
|
||||
putting a call to spapr_irq_update_active_intc() before we call
|
||||
spapr_h_cas_compose_response() (which gives the updated device tree to
|
||||
the guest firmware and OS).
|
||||
|
||||
Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
|
||||
Reviewed-by: Cedric Le Goater <clg@fr.ibm.com>
|
||||
Reviewed-by: Greg Kurz <groug@kaod.org>
|
||||
(cherry picked from commit 8deb8019d696c75e6ecaee7545026b62aba2f1bb)
|
||||
|
||||
Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1733893
|
||||
|
||||
Signed-off-by: David Gibson <dgibson@redhat.com>
|
||||
Signed-off-by: Danilo C. L. de Paula <ddepaula@redhat.com>
|
||||
---
|
||||
hw/ppc/spapr_hcall.c | 33 +++++++++++++--------------------
|
||||
1 file changed, 13 insertions(+), 20 deletions(-)
|
||||
|
||||
diff --git a/hw/ppc/spapr_hcall.c b/hw/ppc/spapr_hcall.c
|
||||
index 140f05c..05a7ca2 100644
|
||||
--- a/hw/ppc/spapr_hcall.c
|
||||
+++ b/hw/ppc/spapr_hcall.c
|
||||
@@ -1767,21 +1767,10 @@ static target_ulong h_client_architecture_support(PowerPCCPU *cpu,
|
||||
}
|
||||
spapr->cas_pre_isa3_guest = !spapr_ovec_test(ov1_guest, OV1_PPC_3_00);
|
||||
spapr_ovec_cleanup(ov1_guest);
|
||||
- if (!spapr->cas_reboot) {
|
||||
- /* If spapr_machine_reset() did not set up a HPT but one is necessary
|
||||
- * (because the guest isn't going to use radix) then set it up here. */
|
||||
- if ((spapr->patb_entry & PATE1_GR) && !guest_radix) {
|
||||
- /* legacy hash or new hash: */
|
||||
- spapr_setup_hpt_and_vrma(spapr);
|
||||
- }
|
||||
- spapr->cas_reboot =
|
||||
- (spapr_h_cas_compose_response(spapr, args[1], args[2],
|
||||
- ov5_updates) != 0);
|
||||
- }
|
||||
|
||||
/*
|
||||
- * Ensure the guest asks for an interrupt mode we support; otherwise
|
||||
- * terminate the boot.
|
||||
+ * Ensure the guest asks for an interrupt mode we support;
|
||||
+ * otherwise terminate the boot.
|
||||
*/
|
||||
if (guest_xive) {
|
||||
if (!spapr->irq->xive) {
|
||||
@@ -1797,14 +1786,18 @@ static target_ulong h_client_architecture_support(PowerPCCPU *cpu,
|
||||
}
|
||||
}
|
||||
|
||||
- /*
|
||||
- * Generate a machine reset when we have an update of the
|
||||
- * interrupt mode. Only required when the machine supports both
|
||||
- * modes.
|
||||
- */
|
||||
+ spapr_irq_update_active_intc(spapr);
|
||||
+
|
||||
if (!spapr->cas_reboot) {
|
||||
- spapr->cas_reboot = spapr_ovec_test(ov5_updates, OV5_XIVE_EXPLOIT)
|
||||
- && spapr->irq->xics && spapr->irq->xive;
|
||||
+ /* If spapr_machine_reset() did not set up a HPT but one is necessary
|
||||
+ * (because the guest isn't going to use radix) then set it up here. */
|
||||
+ if ((spapr->patb_entry & PATE1_GR) && !guest_radix) {
|
||||
+ /* legacy hash or new hash: */
|
||||
+ spapr_setup_hpt_and_vrma(spapr);
|
||||
+ }
|
||||
+ spapr->cas_reboot =
|
||||
+ (spapr_h_cas_compose_response(spapr, args[1], args[2],
|
||||
+ ov5_updates) != 0);
|
||||
}
|
||||
|
||||
spapr_ovec_cleanup(ov5_updates);
|
||||
--
|
||||
1.8.3.1
|
||||
|
@ -1,135 +0,0 @@
|
||||
From eb121ffa97c1c25d7853d51b4c8209c0bb521deb Mon Sep 17 00:00:00 2001
|
||||
From: David Gibson <dgibson@redhat.com>
|
||||
Date: Fri, 7 Feb 2020 00:57:04 +0000
|
||||
Subject: [PATCH 1/7] spapr: Enable DD2.3 accelerated count cache flush in
|
||||
pseries-5.0 machine
|
||||
|
||||
RH-Author: David Gibson <dgibson@redhat.com>
|
||||
Message-id: <20200207005704.194428-1-dgibson@redhat.com>
|
||||
Patchwork-id: 93737
|
||||
O-Subject: [RHEL-AV-8.2 qemu-kvm PATCHv2] spapr: Enable DD2.3 accelerated count cache flush in pseries-5.0 machine
|
||||
Bugzilla: 1796240
|
||||
RH-Acked-by: Danilo de Paula <ddepaula@redhat.com>
|
||||
RH-Acked-by: Laurent Vivier <lvivier@redhat.com>
|
||||
RH-Acked-by: Thomas Huth <thuth@redhat.com>
|
||||
|
||||
From: David Gibson <david@gibson.dropbear.id.au>
|
||||
|
||||
For POWER9 DD2.2 cpus, the best current Spectre v2 indirect branch
|
||||
mitigation is "count cache disabled", which is configured with:
|
||||
-machine cap-ibs=fixed-ccd
|
||||
However, this option isn't available on DD2.3 CPUs with KVM, because they
|
||||
don't have the count cache disabled.
|
||||
|
||||
For POWER9 DD2.3 cpus, it is "count cache flush with assist", configured
|
||||
with:
|
||||
-machine cap-ibs=workaround,cap-ccf-assist=on
|
||||
However this option isn't available on DD2.2 CPUs with KVM, because they
|
||||
don't have the special CCF assist instruction this relies on.
|
||||
|
||||
On current machine types, we default to "count cache flush w/o assist",
|
||||
that is:
|
||||
-machine cap-ibs=workaround,cap-ccf-assist=off
|
||||
This runs, with mitigation on both DD2.2 and DD2.3 host cpus, but has a
|
||||
fairly significant performance impact.
|
||||
|
||||
It turns out we can do better. The special instruction that CCF assist
|
||||
uses to trigger a count cache flush is a no-op on earlier CPUs, rather than
|
||||
trapping or causing other badness. It doesn't, of itself, implement the
|
||||
mitigation, but *if* we have count-cache-disabled, then the count cache
|
||||
flush is unnecessary, and so using the count cache flush mitigation is
|
||||
harmless.
|
||||
|
||||
Therefore for the new pseries-5.0 machine type, enable cap-ccf-assist by
|
||||
default. Along with that, suppress throwing an error if cap-ccf-assist
|
||||
is selected but KVM doesn't support it, as long as KVM *is* giving us
|
||||
count-cache-disabled. To allow TCG to work out of the box, even though it
|
||||
doesn't implement the ccf flush assist, downgrade the error in that case to
|
||||
a warning. This matches several Spectre mitigations where we allow TCG
|
||||
to operate for debugging, since we don't really make guarantees about TCG
|
||||
security properties anyway.
|
||||
|
||||
While we're there, make the TCG warning for this case match that for other
|
||||
mitigations.
|
||||
|
||||
Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
|
||||
Tested-by: Michael Ellerman <mpe@ellerman.id.au>
|
||||
(cherry picked from commit 37965dfe4dffa3ac49438337417608e7f346b58a)
|
||||
Signed-off-by: Danilo C. L. de Paula <ddepaula@redhat.com>
|
||||
|
||||
Conflicts:
|
||||
hw/ppc/spapr.c
|
||||
|
||||
Adjusted machine version compatibility code to the RHEL machine types
|
||||
rather than the upstream machine types.
|
||||
|
||||
Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1796240
|
||||
Brew: https://brewweb.engineering.redhat.com/brew/taskinfo?taskID=26285002
|
||||
Branch: rhel-av-8.2.0
|
||||
Upstream: Merged for qemu-5.0
|
||||
|
||||
Signed-off-by: David Gibson <dgibson@redhat.com>
|
||||
Signed-off-by: Danilo C. L. de Paula <ddepaula@redhat.com>
|
||||
---
|
||||
hw/ppc/spapr.c | 4 +++-
|
||||
hw/ppc/spapr_caps.c | 21 +++++++++++++++++----
|
||||
2 files changed, 20 insertions(+), 5 deletions(-)
|
||||
|
||||
diff --git a/hw/ppc/spapr.c b/hw/ppc/spapr.c
|
||||
index c12862d..a330f03 100644
|
||||
--- a/hw/ppc/spapr.c
|
||||
+++ b/hw/ppc/spapr.c
|
||||
@@ -4440,7 +4440,7 @@ static void spapr_machine_class_init(ObjectClass *oc, void *data)
|
||||
smc->default_caps.caps[SPAPR_CAP_HPT_MAXPAGESIZE] = 16; /* 64kiB */
|
||||
smc->default_caps.caps[SPAPR_CAP_NESTED_KVM_HV] = SPAPR_CAP_OFF;
|
||||
smc->default_caps.caps[SPAPR_CAP_LARGE_DECREMENTER] = SPAPR_CAP_ON;
|
||||
- smc->default_caps.caps[SPAPR_CAP_CCF_ASSIST] = SPAPR_CAP_OFF;
|
||||
+ smc->default_caps.caps[SPAPR_CAP_CCF_ASSIST] = SPAPR_CAP_ON;
|
||||
spapr_caps_add_properties(smc, &error_abort);
|
||||
smc->irq = &spapr_irq_dual;
|
||||
smc->dr_phb_enabled = true;
|
||||
@@ -4904,6 +4904,8 @@ static void spapr_machine_rhel810_class_options(MachineClass *mc)
|
||||
hw_compat_rhel_8_1_len);
|
||||
compat_props_add(mc->compat_props, compat, G_N_ELEMENTS(compat));
|
||||
|
||||
+ /* from pseries-4.2 */
|
||||
+ smc->default_caps.caps[SPAPR_CAP_CCF_ASSIST] = SPAPR_CAP_OFF;
|
||||
}
|
||||
|
||||
DEFINE_SPAPR_MACHINE(rhel810, "rhel8.1.0", false);
|
||||
diff --git a/hw/ppc/spapr_caps.c b/hw/ppc/spapr_caps.c
|
||||
index 805f385..6e6fb28 100644
|
||||
--- a/hw/ppc/spapr_caps.c
|
||||
+++ b/hw/ppc/spapr_caps.c
|
||||
@@ -492,11 +492,24 @@ static void cap_ccf_assist_apply(SpaprMachineState *spapr, uint8_t val,
|
||||
uint8_t kvm_val = kvmppc_get_cap_count_cache_flush_assist();
|
||||
|
||||
if (tcg_enabled() && val) {
|
||||
- /* TODO - for now only allow broken for TCG */
|
||||
- error_setg(errp,
|
||||
-"Requested count cache flush assist capability level not supported by tcg,"
|
||||
- " try appending -machine cap-ccf-assist=off");
|
||||
+ /* TCG doesn't implement anything here, but allow with a warning */
|
||||
+ warn_report("TCG doesn't support requested feature, cap-ccf-assist=on");
|
||||
} else if (kvm_enabled() && (val > kvm_val)) {
|
||||
+ uint8_t kvm_ibs = kvmppc_get_cap_safe_indirect_branch();
|
||||
+
|
||||
+ if (kvm_ibs == SPAPR_CAP_FIXED_CCD) {
|
||||
+ /*
|
||||
+ * If we don't have CCF assist on the host, the assist
|
||||
+ * instruction is a harmless no-op. It won't correctly
|
||||
+ * implement the cache count flush *but* if we have
|
||||
+ * count-cache-disabled in the host, that flush is
|
||||
+ * unnnecessary. So, specifically allow this case. This
|
||||
+ * allows us to have better performance on POWER9 DD2.3,
|
||||
+ * while still working on POWER9 DD2.2 and POWER8 host
|
||||
+ * cpus.
|
||||
+ */
|
||||
+ return;
|
||||
+ }
|
||||
error_setg(errp,
|
||||
"Requested count cache flush assist capability level not supported by kvm,"
|
||||
" try appending -machine cap-ccf-assist=off");
|
||||
--
|
||||
1.8.3.1
|
||||
|
@ -1,298 +0,0 @@
|
||||
From d8871ae2842531130c9b333e7c06a6a5d1561286 Mon Sep 17 00:00:00 2001
|
||||
From: Andrew Jones <drjones@redhat.com>
|
||||
Date: Fri, 24 Jan 2020 09:14:34 +0100
|
||||
Subject: [PATCH 001/116] target/arm/arch_dump: Add SVE notes
|
||||
|
||||
RH-Author: Andrew Jones <drjones@redhat.com>
|
||||
Message-id: <20200124091434.15021-2-drjones@redhat.com>
|
||||
Patchwork-id: 93443
|
||||
O-Subject: [RHEL-AV-8.2.0 qemu-kvm PATCH 1/1] target/arm/arch_dump: Add SVE notes
|
||||
Bugzilla: 1725084
|
||||
RH-Acked-by: Auger Eric <eric.auger@redhat.com>
|
||||
RH-Acked-by: Laszlo Ersek <lersek@redhat.com>
|
||||
RH-Acked-by: Gavin Shan <gshan@redhat.com>
|
||||
|
||||
Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1725084
|
||||
|
||||
Author: Andrew Jones <drjones@redhat.com>
|
||||
Date: Thu, 23 Jan 2020 15:22:40 +0000
|
||||
|
||||
target/arm/arch_dump: Add SVE notes
|
||||
|
||||
When dumping a guest with dump-guest-memory also dump the SVE
|
||||
registers if they are in use.
|
||||
|
||||
Signed-off-by: Andrew Jones <drjones@redhat.com>
|
||||
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
|
||||
Message-id: 20200120101832.18781-1-drjones@redhat.com
|
||||
[PMM: fixed checkpatch nits]
|
||||
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
|
||||
|
||||
(cherry picked from commit 538baab245ca881e6a6ff720b5133f3ad1fcaafc)
|
||||
Signed-off-by: Miroslav Rezanina <mrezanin@redhat.com>
|
||||
---
|
||||
include/elf.h | 1 +
|
||||
target/arm/arch_dump.c | 124 ++++++++++++++++++++++++++++++++++++++++++++++++-
|
||||
target/arm/cpu.h | 25 ++++++++++
|
||||
target/arm/kvm64.c | 24 ----------
|
||||
4 files changed, 148 insertions(+), 26 deletions(-)
|
||||
|
||||
diff --git a/include/elf.h b/include/elf.h
|
||||
index 3501e0c..8fbfe60 100644
|
||||
--- a/include/elf.h
|
||||
+++ b/include/elf.h
|
||||
@@ -1650,6 +1650,7 @@ typedef struct elf64_shdr {
|
||||
#define NT_ARM_HW_BREAK 0x402 /* ARM hardware breakpoint registers */
|
||||
#define NT_ARM_HW_WATCH 0x403 /* ARM hardware watchpoint registers */
|
||||
#define NT_ARM_SYSTEM_CALL 0x404 /* ARM system call number */
|
||||
+#define NT_ARM_SVE 0x405 /* ARM Scalable Vector Extension regs */
|
||||
|
||||
/*
|
||||
* Physical entry point into the kernel.
|
||||
diff --git a/target/arm/arch_dump.c b/target/arm/arch_dump.c
|
||||
index 26a2c09..2345dec 100644
|
||||
--- a/target/arm/arch_dump.c
|
||||
+++ b/target/arm/arch_dump.c
|
||||
@@ -62,12 +62,23 @@ struct aarch64_user_vfp_state {
|
||||
|
||||
QEMU_BUILD_BUG_ON(sizeof(struct aarch64_user_vfp_state) != 528);
|
||||
|
||||
+/* struct user_sve_header from arch/arm64/include/uapi/asm/ptrace.h */
|
||||
+struct aarch64_user_sve_header {
|
||||
+ uint32_t size;
|
||||
+ uint32_t max_size;
|
||||
+ uint16_t vl;
|
||||
+ uint16_t max_vl;
|
||||
+ uint16_t flags;
|
||||
+ uint16_t reserved;
|
||||
+} QEMU_PACKED;
|
||||
+
|
||||
struct aarch64_note {
|
||||
Elf64_Nhdr hdr;
|
||||
char name[8]; /* align_up(sizeof("CORE"), 4) */
|
||||
union {
|
||||
struct aarch64_elf_prstatus prstatus;
|
||||
struct aarch64_user_vfp_state vfp;
|
||||
+ struct aarch64_user_sve_header sve;
|
||||
};
|
||||
} QEMU_PACKED;
|
||||
|
||||
@@ -76,6 +87,8 @@ struct aarch64_note {
|
||||
(AARCH64_NOTE_HEADER_SIZE + sizeof(struct aarch64_elf_prstatus))
|
||||
#define AARCH64_PRFPREG_NOTE_SIZE \
|
||||
(AARCH64_NOTE_HEADER_SIZE + sizeof(struct aarch64_user_vfp_state))
|
||||
+#define AARCH64_SVE_NOTE_SIZE(env) \
|
||||
+ (AARCH64_NOTE_HEADER_SIZE + sve_size(env))
|
||||
|
||||
static void aarch64_note_init(struct aarch64_note *note, DumpState *s,
|
||||
const char *name, Elf64_Word namesz,
|
||||
@@ -128,11 +141,102 @@ static int aarch64_write_elf64_prfpreg(WriteCoreDumpFunction f,
|
||||
return 0;
|
||||
}
|
||||
|
||||
+#ifdef TARGET_AARCH64
|
||||
+static off_t sve_zreg_offset(uint32_t vq, int n)
|
||||
+{
|
||||
+ off_t off = sizeof(struct aarch64_user_sve_header);
|
||||
+ return ROUND_UP(off, 16) + vq * 16 * n;
|
||||
+}
|
||||
+
|
||||
+static off_t sve_preg_offset(uint32_t vq, int n)
|
||||
+{
|
||||
+ return sve_zreg_offset(vq, 32) + vq * 16 / 8 * n;
|
||||
+}
|
||||
+
|
||||
+static off_t sve_fpsr_offset(uint32_t vq)
|
||||
+{
|
||||
+ off_t off = sve_preg_offset(vq, 17);
|
||||
+ return ROUND_UP(off, 16);
|
||||
+}
|
||||
+
|
||||
+static off_t sve_fpcr_offset(uint32_t vq)
|
||||
+{
|
||||
+ return sve_fpsr_offset(vq) + sizeof(uint32_t);
|
||||
+}
|
||||
+
|
||||
+static uint32_t sve_current_vq(CPUARMState *env)
|
||||
+{
|
||||
+ return sve_zcr_len_for_el(env, arm_current_el(env)) + 1;
|
||||
+}
|
||||
+
|
||||
+static size_t sve_size_vq(uint32_t vq)
|
||||
+{
|
||||
+ off_t off = sve_fpcr_offset(vq) + sizeof(uint32_t);
|
||||
+ return ROUND_UP(off, 16);
|
||||
+}
|
||||
+
|
||||
+static size_t sve_size(CPUARMState *env)
|
||||
+{
|
||||
+ return sve_size_vq(sve_current_vq(env));
|
||||
+}
|
||||
+
|
||||
+static int aarch64_write_elf64_sve(WriteCoreDumpFunction f,
|
||||
+ CPUARMState *env, int cpuid,
|
||||
+ DumpState *s)
|
||||
+{
|
||||
+ struct aarch64_note *note;
|
||||
+ ARMCPU *cpu = env_archcpu(env);
|
||||
+ uint32_t vq = sve_current_vq(env);
|
||||
+ uint64_t tmp[ARM_MAX_VQ * 2], *r;
|
||||
+ uint32_t fpr;
|
||||
+ uint8_t *buf;
|
||||
+ int ret, i;
|
||||
+
|
||||
+ note = g_malloc0(AARCH64_SVE_NOTE_SIZE(env));
|
||||
+ buf = (uint8_t *)¬e->sve;
|
||||
+
|
||||
+ aarch64_note_init(note, s, "LINUX", 6, NT_ARM_SVE, sve_size_vq(vq));
|
||||
+
|
||||
+ note->sve.size = cpu_to_dump32(s, sve_size_vq(vq));
|
||||
+ note->sve.max_size = cpu_to_dump32(s, sve_size_vq(cpu->sve_max_vq));
|
||||
+ note->sve.vl = cpu_to_dump16(s, vq * 16);
|
||||
+ note->sve.max_vl = cpu_to_dump16(s, cpu->sve_max_vq * 16);
|
||||
+ note->sve.flags = cpu_to_dump16(s, 1);
|
||||
+
|
||||
+ for (i = 0; i < 32; ++i) {
|
||||
+ r = sve_bswap64(tmp, &env->vfp.zregs[i].d[0], vq * 2);
|
||||
+ memcpy(&buf[sve_zreg_offset(vq, i)], r, vq * 16);
|
||||
+ }
|
||||
+
|
||||
+ for (i = 0; i < 17; ++i) {
|
||||
+ r = sve_bswap64(tmp, r = &env->vfp.pregs[i].p[0],
|
||||
+ DIV_ROUND_UP(vq * 2, 8));
|
||||
+ memcpy(&buf[sve_preg_offset(vq, i)], r, vq * 16 / 8);
|
||||
+ }
|
||||
+
|
||||
+ fpr = cpu_to_dump32(s, vfp_get_fpsr(env));
|
||||
+ memcpy(&buf[sve_fpsr_offset(vq)], &fpr, sizeof(uint32_t));
|
||||
+
|
||||
+ fpr = cpu_to_dump32(s, vfp_get_fpcr(env));
|
||||
+ memcpy(&buf[sve_fpcr_offset(vq)], &fpr, sizeof(uint32_t));
|
||||
+
|
||||
+ ret = f(note, AARCH64_SVE_NOTE_SIZE(env), s);
|
||||
+ g_free(note);
|
||||
+
|
||||
+ if (ret < 0) {
|
||||
+ return -1;
|
||||
+ }
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+#endif
|
||||
+
|
||||
int arm_cpu_write_elf64_note(WriteCoreDumpFunction f, CPUState *cs,
|
||||
int cpuid, void *opaque)
|
||||
{
|
||||
struct aarch64_note note;
|
||||
- CPUARMState *env = &ARM_CPU(cs)->env;
|
||||
+ ARMCPU *cpu = ARM_CPU(cs);
|
||||
+ CPUARMState *env = &cpu->env;
|
||||
DumpState *s = opaque;
|
||||
uint64_t pstate, sp;
|
||||
int ret, i;
|
||||
@@ -163,7 +267,18 @@ int arm_cpu_write_elf64_note(WriteCoreDumpFunction f, CPUState *cs,
|
||||
return -1;
|
||||
}
|
||||
|
||||
- return aarch64_write_elf64_prfpreg(f, env, cpuid, s);
|
||||
+ ret = aarch64_write_elf64_prfpreg(f, env, cpuid, s);
|
||||
+ if (ret) {
|
||||
+ return ret;
|
||||
+ }
|
||||
+
|
||||
+#ifdef TARGET_AARCH64
|
||||
+ if (cpu_isar_feature(aa64_sve, cpu)) {
|
||||
+ ret = aarch64_write_elf64_sve(f, env, cpuid, s);
|
||||
+ }
|
||||
+#endif
|
||||
+
|
||||
+ return ret;
|
||||
}
|
||||
|
||||
/* struct pt_regs from arch/arm/include/asm/ptrace.h */
|
||||
@@ -335,6 +450,11 @@ ssize_t cpu_get_note_size(int class, int machine, int nr_cpus)
|
||||
if (class == ELFCLASS64) {
|
||||
note_size = AARCH64_PRSTATUS_NOTE_SIZE;
|
||||
note_size += AARCH64_PRFPREG_NOTE_SIZE;
|
||||
+#ifdef TARGET_AARCH64
|
||||
+ if (cpu_isar_feature(aa64_sve, cpu)) {
|
||||
+ note_size += AARCH64_SVE_NOTE_SIZE(env);
|
||||
+ }
|
||||
+#endif
|
||||
} else {
|
||||
note_size = ARM_PRSTATUS_NOTE_SIZE;
|
||||
if (arm_feature(env, ARM_FEATURE_VFP)) {
|
||||
diff --git a/target/arm/cpu.h b/target/arm/cpu.h
|
||||
index 83a809d..82dd3cc 100644
|
||||
--- a/target/arm/cpu.h
|
||||
+++ b/target/arm/cpu.h
|
||||
@@ -975,6 +975,31 @@ void aarch64_sve_narrow_vq(CPUARMState *env, unsigned vq);
|
||||
void aarch64_sve_change_el(CPUARMState *env, int old_el,
|
||||
int new_el, bool el0_a64);
|
||||
void aarch64_add_sve_properties(Object *obj);
|
||||
+
|
||||
+/*
|
||||
+ * SVE registers are encoded in KVM's memory in an endianness-invariant format.
|
||||
+ * The byte at offset i from the start of the in-memory representation contains
|
||||
+ * the bits [(7 + 8 * i) : (8 * i)] of the register value. As this means the
|
||||
+ * lowest offsets are stored in the lowest memory addresses, then that nearly
|
||||
+ * matches QEMU's representation, which is to use an array of host-endian
|
||||
+ * uint64_t's, where the lower offsets are at the lower indices. To complete
|
||||
+ * the translation we just need to byte swap the uint64_t's on big-endian hosts.
|
||||
+ */
|
||||
+static inline uint64_t *sve_bswap64(uint64_t *dst, uint64_t *src, int nr)
|
||||
+{
|
||||
+#ifdef HOST_WORDS_BIGENDIAN
|
||||
+ int i;
|
||||
+
|
||||
+ for (i = 0; i < nr; ++i) {
|
||||
+ dst[i] = bswap64(src[i]);
|
||||
+ }
|
||||
+
|
||||
+ return dst;
|
||||
+#else
|
||||
+ return src;
|
||||
+#endif
|
||||
+}
|
||||
+
|
||||
#else
|
||||
static inline void aarch64_sve_narrow_vq(CPUARMState *env, unsigned vq) { }
|
||||
static inline void aarch64_sve_change_el(CPUARMState *env, int o,
|
||||
diff --git a/target/arm/kvm64.c b/target/arm/kvm64.c
|
||||
index 876184b..e2da756 100644
|
||||
--- a/target/arm/kvm64.c
|
||||
+++ b/target/arm/kvm64.c
|
||||
@@ -877,30 +877,6 @@ static int kvm_arch_put_fpsimd(CPUState *cs)
|
||||
}
|
||||
|
||||
/*
|
||||
- * SVE registers are encoded in KVM's memory in an endianness-invariant format.
|
||||
- * The byte at offset i from the start of the in-memory representation contains
|
||||
- * the bits [(7 + 8 * i) : (8 * i)] of the register value. As this means the
|
||||
- * lowest offsets are stored in the lowest memory addresses, then that nearly
|
||||
- * matches QEMU's representation, which is to use an array of host-endian
|
||||
- * uint64_t's, where the lower offsets are at the lower indices. To complete
|
||||
- * the translation we just need to byte swap the uint64_t's on big-endian hosts.
|
||||
- */
|
||||
-static uint64_t *sve_bswap64(uint64_t *dst, uint64_t *src, int nr)
|
||||
-{
|
||||
-#ifdef HOST_WORDS_BIGENDIAN
|
||||
- int i;
|
||||
-
|
||||
- for (i = 0; i < nr; ++i) {
|
||||
- dst[i] = bswap64(src[i]);
|
||||
- }
|
||||
-
|
||||
- return dst;
|
||||
-#else
|
||||
- return src;
|
||||
-#endif
|
||||
-}
|
||||
-
|
||||
-/*
|
||||
* KVM SVE registers come in slices where ZREGs have a slice size of 2048 bits
|
||||
* and PREGS and the FFR have a slice size of 256 bits. However we simply hard
|
||||
* code the slice index to zero for now as it's unlikely we'll need more than
|
||||
--
|
||||
1.8.3.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