Accepting request 798748 from Virtualization:Staging
Update to v5.0.0 OBS-URL: https://build.opensuse.org/request/show/798748 OBS-URL: https://build.opensuse.org/package/show/Virtualization/qemu?expand=0&rev=547
This commit is contained in:
parent
b825605405
commit
3b42969e09
@ -8,10 +8,10 @@ Signed-off-by: Bruce Rogers <brogers@suse.com>
|
||||
1 file changed, 2 insertions(+)
|
||||
|
||||
diff --git a/Makefile b/Makefile
|
||||
index 52881cbb12e7d980e0ed51f21174..edc3de72e6a94ef0503da640bbfe 100644
|
||||
index 1a2f649a21a85e1849a3ca40991d..a7851435c0ba8c60df39ebad492b 100644
|
||||
--- a/Makefile
|
||||
+++ b/Makefile
|
||||
@@ -913,6 +913,7 @@ ifneq ($(DESCS),)
|
||||
@@ -974,6 +974,7 @@ ifneq ($(DESCS),)
|
||||
"$(DESTDIR)$(qemu_datadir)/firmware/$$x"; \
|
||||
done
|
||||
endif
|
||||
@ -19,7 +19,7 @@ index 52881cbb12e7d980e0ed51f21174..edc3de72e6a94ef0503da640bbfe 100644
|
||||
for s in $(ICON_SIZES); do \
|
||||
mkdir -p "$(DESTDIR)$(qemu_icondir)/hicolor/$${s}/apps"; \
|
||||
$(INSTALL_DATA) $(SRC_PATH)/ui/icons/qemu_$${s}.png \
|
||||
@@ -927,6 +928,7 @@ endif
|
||||
@@ -988,6 +989,7 @@ endif
|
||||
mkdir -p "$(DESTDIR)$(qemu_desktopdir)"
|
||||
$(INSTALL_DATA) $(SRC_PATH)/ui/qemu.desktop \
|
||||
"$(DESTDIR)$(qemu_desktopdir)/qemu.desktop"
|
||||
|
@ -1,33 +0,0 @@
|
||||
From: Robert Foley <robert.foley@linaro.org>
|
||||
Date: Mon, 18 Nov 2019 16:15:23 -0500
|
||||
Subject: Fix double free issue in qemu_set_log_filename().
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
Git-commit: 0f516ca4767042aec8716369d6d62436fa10593a
|
||||
|
||||
After freeing the logfilename, we set logfilename to NULL, in case of an
|
||||
error which returns without setting logfilename.
|
||||
|
||||
Signed-off-by: Robert Foley <robert.foley@linaro.org>
|
||||
Reviewed-by: Alex Bennée <alex.bennee@linaro.org>
|
||||
Signed-off-by: Alex Bennée <alex.bennee@linaro.org>
|
||||
Message-Id: <20191118211528.3221-2-robert.foley@linaro.org>
|
||||
Signed-off-by: Bruce Rogers <brogers@suse.com>
|
||||
---
|
||||
util/log.c | 1 +
|
||||
1 file changed, 1 insertion(+)
|
||||
|
||||
diff --git a/util/log.c b/util/log.c
|
||||
index 1ca13059eef5441dce01769e046d..4316fe74eee8ba96fd2d3c9afd3b 100644
|
||||
--- a/util/log.c
|
||||
+++ b/util/log.c
|
||||
@@ -113,6 +113,7 @@ void qemu_set_log_filename(const char *filename, Error **errp)
|
||||
{
|
||||
char *pidstr;
|
||||
g_free(logfilename);
|
||||
+ logfilename = NULL;
|
||||
|
||||
pidstr = strstr(filename, "%");
|
||||
if (pidstr) {
|
@ -41,7 +41,7 @@ index f3530a90e6364d813097105b6113..f8aa0daf31692810efc7d5ca32eb 100644
|
||||
#include "qemu/error-report.h"
|
||||
#include "qapi/error.h"
|
||||
diff --git a/chardev/char-mux.c b/chardev/char-mux.c
|
||||
index 200c62a0d08bd779de8efdc95aad..10acb4fce1d3bda0d9f818eeb5ee 100644
|
||||
index 46c44af67c4ea5348eb1b6db637f..1d3eaf1e37bc2995ae4b8e80f0ff 100644
|
||||
--- a/chardev/char-mux.c
|
||||
+++ b/chardev/char-mux.c
|
||||
@@ -22,6 +22,7 @@
|
||||
@ -82,7 +82,7 @@ index 200c62a0d08bd779de8efdc95aad..10acb4fce1d3bda0d9f818eeb5ee 100644
|
||||
* set of muxes
|
||||
*/
|
||||
diff --git a/chardev/char.c b/chardev/char.c
|
||||
index 7b6b2cb12300042c6adf257e188c..d2134d72f60e58f35ee9e7869db4 100644
|
||||
index e77564060dbc8d60e964787b9150..7f08483a4fc8b1c2c01d57546eca 100644
|
||||
--- a/chardev/char.c
|
||||
+++ b/chardev/char.c
|
||||
@@ -22,6 +22,7 @@
|
||||
@ -94,7 +94,7 @@ index 7b6b2cb12300042c6adf257e188c..d2134d72f60e58f35ee9e7869db4 100644
|
||||
#include "qemu/cutils.h"
|
||||
#include "monitor/monitor.h"
|
||||
diff --git a/include/chardev/char-mux.h b/include/chardev/char-mux.h
|
||||
index 572cefd517c8fa9d605cbd10fc21..6e80785bd9c12b85e747fa9f924e 100644
|
||||
index 417fe32eedf29b206c4c7a20f8ef..225a4d1c37d051bca576a1b73607 100644
|
||||
--- a/include/chardev/char-mux.h
|
||||
+++ b/include/chardev/char-mux.h
|
||||
@@ -34,6 +34,9 @@ typedef struct MuxChardev {
|
||||
@ -108,7 +108,7 @@ index 572cefd517c8fa9d605cbd10fc21..6e80785bd9c12b85e747fa9f924e 100644
|
||||
int mux_cnt;
|
||||
int term_got_escape;
|
||||
diff --git a/tests/test-char.c b/tests/test-char.c
|
||||
index 45e42af290d4c55c0d8ed9358ef2..8e8c983dc0adce3dea739c9d85fc 100644
|
||||
index 3afc9b1b8d59802919139012c2cb..530cf7c2414e85e00e2685e7482c 100644
|
||||
--- a/tests/test-char.c
|
||||
+++ b/tests/test-char.c
|
||||
@@ -1,3 +1,4 @@
|
||||
|
@ -13,21 +13,21 @@ Signed-off-by: Bruce Rogers <brogers@suse.com>
|
||||
2 files changed, 2 insertions(+), 2 deletions(-)
|
||||
|
||||
diff --git a/scripts/analyze-migration.py b/scripts/analyze-migration.py
|
||||
index e527eb168e9ce7c3944094ec6701..fd376eac71f73e6366a9e17a1c51 100755
|
||||
index 96a31d3974ba2af13d419b71c409..4cae695244a00003d1431c02febf 100755
|
||||
--- a/scripts/analyze-migration.py
|
||||
+++ b/scripts/analyze-migration.py
|
||||
@@ -1,4 +1,4 @@
|
||||
-#!/usr/bin/env python
|
||||
-#!/usr/bin/env python3
|
||||
+#!/usr/bin/python3
|
||||
#
|
||||
# Migration Stream Analyzer
|
||||
#
|
||||
diff --git a/scripts/vmstate-static-checker.py b/scripts/vmstate-static-checker.py
|
||||
index f8b7b8f77252f2c03d6d7db9dc60..754159069dfae6838edaac14856f 100755
|
||||
index 539ead62b498202fc40b42bff05f..0b7d30eef392cd659dbd722d8bdc 100755
|
||||
--- a/scripts/vmstate-static-checker.py
|
||||
+++ b/scripts/vmstate-static-checker.py
|
||||
@@ -1,4 +1,4 @@
|
||||
-#!/usr/bin/python
|
||||
-#!/usr/bin/env python3
|
||||
+#!/usr/bin/python3
|
||||
#
|
||||
# Compares vmstate information stored in JSON format, obtained from
|
||||
|
@ -14,10 +14,10 @@ Signed-off-by: Bruce Rogers <brogers@suse.com>
|
||||
1 file changed, 2 insertions(+)
|
||||
|
||||
diff --git a/exec.c b/exec.c
|
||||
index ffdb5185353bdbacc613d4730228..0d0c0618bb70f9747c71048f5cde 100644
|
||||
index 2874bb508853d353bca3b9790e5d..76ac1f619b563c591f36f9601c15 100644
|
||||
--- a/exec.c
|
||||
+++ b/exec.c
|
||||
@@ -2291,11 +2291,13 @@ RAMBlock *qemu_ram_alloc_from_fd(ram_addr_t size, MemoryRegion *mr,
|
||||
@@ -2297,11 +2297,13 @@ RAMBlock *qemu_ram_alloc_from_fd(ram_addr_t size, MemoryRegion *mr,
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
@ -16,7 +16,7 @@ queue available in a local git branch named frombundle (see config.sh for the
|
||||
locations). This set of patches comes from a "bundle of git bundles", the
|
||||
bundles.tar.xz file, which is included as a package source file. You will then
|
||||
create an altered patch queue in the branch which corresponds to this release
|
||||
(eg: opensuse-4.2), using the frombundle branch as the starting point for your
|
||||
(eg: opensuse-5.0), using the frombundle branch as the starting point for your
|
||||
changes (eg perhaps start by doing git reset --hard frombundle, then cherry-pick
|
||||
upstream patches from there). Once you have the patch queue ready to go run
|
||||
'bash ./update_git.sh git2pkg' which updates the bundles.tar.xz file, as well as
|
||||
@ -47,7 +47,7 @@ in the near future.
|
||||
Bug or feature tracking identifiers should also be added to the patch similarly,
|
||||
using the abbreviations identified here:
|
||||
http://en.opensuse.org/openSUSE:Packaging_Patches_guidelines#Current_set_of_abbreviations
|
||||
using the "References:" tag, with multiple entries comma separated.
|
||||
using the "Reference:" tag, with multiple entries comma separated.
|
||||
|
||||
The ability to provide a conditional inclusion of a patch (eg based on
|
||||
architecture, is provided by using the "Include-If:" tag similarly, as follows:
|
||||
|
@ -12,14 +12,14 @@ Signed-off-by: Andreas Färber <afaerber@suse.de>
|
||||
[BR: add include for sys/resource.h]
|
||||
Signed-off-by: Bruce Rogers <brogers@suse.com>
|
||||
---
|
||||
vl.c | 12 ++++++++++++
|
||||
softmmu/vl.c | 12 ++++++++++++
|
||||
1 file changed, 12 insertions(+)
|
||||
|
||||
diff --git a/vl.c b/vl.c
|
||||
index bf0a6345d2394ad25adfe53c4006..68de8184f91c6ef3903859c70526 100644
|
||||
--- a/vl.c
|
||||
+++ b/vl.c
|
||||
@@ -33,6 +33,7 @@
|
||||
diff --git a/softmmu/vl.c b/softmmu/vl.c
|
||||
index 32c004788919e4f50b4bfc88113b..97e3888e832f0c9051f720bb701c 100644
|
||||
--- a/softmmu/vl.c
|
||||
+++ b/softmmu/vl.c
|
||||
@@ -34,6 +34,7 @@
|
||||
#include "qemu/uuid.h"
|
||||
#include "sysemu/reset.h"
|
||||
#include "sysemu/runstate.h"
|
||||
@ -27,15 +27,15 @@ index bf0a6345d2394ad25adfe53c4006..68de8184f91c6ef3903859c70526 100644
|
||||
#include "sysemu/seccomp.h"
|
||||
#include "sysemu/tcg.h"
|
||||
|
||||
@@ -2863,6 +2864,7 @@ int main(int argc, char **argv, char **envp)
|
||||
char *dir, **dirs;
|
||||
@@ -2851,6 +2852,7 @@ void qemu_init(int argc, char **argv, char **envp)
|
||||
BlockdevOptionsQueue bdo_queue = QSIMPLEQ_HEAD_INITIALIZER(bdo_queue);
|
||||
QemuPluginList plugin_list = QTAILQ_HEAD_INITIALIZER(plugin_list);
|
||||
int mem_prealloc = 0; /* force preallocation of physical target memory */
|
||||
+ struct rlimit rlimit_as;
|
||||
|
||||
os_set_line_buffering();
|
||||
|
||||
@@ -2874,6 +2876,16 @@ int main(int argc, char **argv, char **envp)
|
||||
@@ -2862,6 +2864,16 @@ void qemu_init(int argc, char **argv, char **envp)
|
||||
|
||||
qemu_mutex_lock_iothread();
|
||||
|
||||
|
@ -1,35 +0,0 @@
|
||||
From: Han Han <hhan@redhat.com>
|
||||
Date: Thu, 5 Dec 2019 10:48:21 +0800
|
||||
Subject: Revert "qemu-options.hx: Update for reboot-timeout parameter"
|
||||
|
||||
Git-commit: 8937a39da22e5d5689c516a2d4ce4f2bb6a378fc
|
||||
|
||||
This reverts commit bbd9e6985ff342cbe15b9cb7eb30e842796fbbe8.
|
||||
|
||||
In 20a1922032 we allowed reboot-timeout=-1 again, so update the doc
|
||||
accordingly.
|
||||
|
||||
Signed-off-by: Han Han <hhan@redhat.com>
|
||||
Reviewed-by: Markus Armbruster <armbru@redhat.com>
|
||||
Message-Id: <20191205024821.245435-1-hhan@redhat.com>
|
||||
Signed-off-by: Laurent Vivier <laurent@vivier.eu>
|
||||
Signed-off-by: Bruce Rogers <brogers@suse.com>
|
||||
---
|
||||
qemu-options.hx | 4 ++--
|
||||
1 file changed, 2 insertions(+), 2 deletions(-)
|
||||
|
||||
diff --git a/qemu-options.hx b/qemu-options.hx
|
||||
index 65c9473b7325545c00befcbac651..e14d88e9b2f3a3c13a4c20db0b36 100644
|
||||
--- a/qemu-options.hx
|
||||
+++ b/qemu-options.hx
|
||||
@@ -327,8 +327,8 @@ format(true color). The resolution should be supported by the SVGA mode, so
|
||||
the recommended is 320x240, 640x480, 800x640.
|
||||
|
||||
A timeout could be passed to bios, guest will pause for @var{rb_timeout} ms
|
||||
-when boot failed, then reboot. If @option{reboot-timeout} is not set,
|
||||
-guest will not reboot by default. Currently Seabios for X86
|
||||
+when boot failed, then reboot. If @var{rb_timeout} is '-1', guest will not
|
||||
+reboot, qemu passes '-1' to bios by default. Currently Seabios for X86
|
||||
system support it.
|
||||
|
||||
Do strict boot via @option{strict=on} as far as firmware/BIOS
|
@ -1,69 +0,0 @@
|
||||
From: Gerd Hoffmann <kraxel@redhat.com>
|
||||
Date: Tue, 21 Jan 2020 07:02:10 +0100
|
||||
Subject: Revert "vnc: allow fall back to RAW encoding"
|
||||
|
||||
Git-commit: 0780ec7be82dd4781e9fd216b5d99a125882ff5a
|
||||
|
||||
This reverts commit de3f7de7f4e257ce44cdabb90f5f17ee99624557.
|
||||
|
||||
Remove VNC optimization to reencode framebuffer update as raw if it's
|
||||
smaller than the default encoding.
|
||||
|
||||
QEMU's implementation was naive and didn't account for the ZLIB z_stream
|
||||
mutating with each compression. Because of the mutation, simply
|
||||
resetting the output buffer's offset wasn't sufficient to "rewind" the
|
||||
operation. The mutated z_stream would generate future zlib blocks which
|
||||
referred to symbols in past blocks which weren't sent. This would lead
|
||||
to artifacting.
|
||||
|
||||
Considering that ZRLE is never larger than raw and even though ZLIB can
|
||||
occasionally be fractionally larger than raw, the overhead of
|
||||
implementing this optimization correctly isn't worth it.
|
||||
|
||||
Signed-off-by: Cameron Esfahani <dirty@apple.com>
|
||||
Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
|
||||
Signed-off-by: Bruce Rogers <brogers@suse.com>
|
||||
---
|
||||
ui/vnc.c | 20 ++------------------
|
||||
1 file changed, 2 insertions(+), 18 deletions(-)
|
||||
|
||||
diff --git a/ui/vnc.c b/ui/vnc.c
|
||||
index 87b8045afec2b7d52983914dbc08..f94b3a257ee3add364a0b0bd5101 100644
|
||||
--- a/ui/vnc.c
|
||||
+++ b/ui/vnc.c
|
||||
@@ -898,8 +898,6 @@ int vnc_raw_send_framebuffer_update(VncState *vs, int x, int y, int w, int h)
|
||||
int vnc_send_framebuffer_update(VncState *vs, int x, int y, int w, int h)
|
||||
{
|
||||
int n = 0;
|
||||
- bool encode_raw = false;
|
||||
- size_t saved_offs = vs->output.offset;
|
||||
|
||||
switch(vs->vnc_encoding) {
|
||||
case VNC_ENCODING_ZLIB:
|
||||
@@ -922,24 +920,10 @@ int vnc_send_framebuffer_update(VncState *vs, int x, int y, int w, int h)
|
||||
n = vnc_zywrle_send_framebuffer_update(vs, x, y, w, h);
|
||||
break;
|
||||
default:
|
||||
- encode_raw = true;
|
||||
+ vnc_framebuffer_update(vs, x, y, w, h, VNC_ENCODING_RAW);
|
||||
+ n = vnc_raw_send_framebuffer_update(vs, x, y, w, h);
|
||||
break;
|
||||
}
|
||||
-
|
||||
- /* If the client has the same pixel format as our internal buffer and
|
||||
- * a RAW encoding would need less space fall back to RAW encoding to
|
||||
- * save bandwidth and processing power in the client. */
|
||||
- if (!encode_raw && vs->write_pixels == vnc_write_pixels_copy &&
|
||||
- 12 + h * w * VNC_SERVER_FB_BYTES <= (vs->output.offset - saved_offs)) {
|
||||
- vs->output.offset = saved_offs;
|
||||
- encode_raw = true;
|
||||
- }
|
||||
-
|
||||
- if (encode_raw) {
|
||||
- vnc_framebuffer_update(vs, x, y, w, h, VNC_ENCODING_RAW);
|
||||
- n = vnc_raw_send_framebuffer_update(vs, x, y, w, h);
|
||||
- }
|
||||
-
|
||||
return n;
|
||||
}
|
||||
|
@ -9,10 +9,10 @@ Signed-off-by: Bruce Rogers <brogers@suse.com>
|
||||
2 files changed, 2 insertions(+), 2 deletions(-)
|
||||
|
||||
diff --git a/Makefile b/Makefile
|
||||
index b437a346d71a55d75f207f36e85b..52881cbb12e7d980e0ed51f21174 100644
|
||||
index 8a9113e6663eb51cf842b2f4f5a2..1a2f649a21a85e1849a3ca40991d 100644
|
||||
--- a/Makefile
|
||||
+++ b/Makefile
|
||||
@@ -579,7 +579,7 @@ fsdev/virtfs-proxy-helper$(EXESUF): LIBS += -lcap
|
||||
@@ -619,7 +619,7 @@ fsdev/virtfs-proxy-helper$(EXESUF): fsdev/virtfs-proxy-helper.o fsdev/9p-marshal
|
||||
|
||||
scsi/qemu-pr-helper$(EXESUF): scsi/qemu-pr-helper.o scsi/utils.o $(authz-obj-y) $(crypto-obj-y) $(io-obj-y) $(qom-obj-y) $(COMMON_LDADDS)
|
||||
ifdef CONFIG_MPATH
|
||||
@ -22,10 +22,10 @@ index b437a346d71a55d75f207f36e85b..52881cbb12e7d980e0ed51f21174 100644
|
||||
|
||||
qemu-img-cmds.h: $(SRC_PATH)/qemu-img-cmds.hx $(SRC_PATH)/scripts/hxtool
|
||||
diff --git a/configure b/configure
|
||||
index 6099be1d848c7f52ea02694d6d86..09a33aecfd6ef543eeee8c5023b6 100755
|
||||
index 23b5e93752b6a2597b2099b50218..ef127fb1e0715da446b4a822e3ab 100755
|
||||
--- a/configure
|
||||
+++ b/configure
|
||||
@@ -3836,7 +3836,7 @@ int main(void) {
|
||||
@@ -3961,7 +3961,7 @@ int main(void) {
|
||||
return 0;
|
||||
}
|
||||
EOF
|
||||
|
@ -8,14 +8,14 @@ Signed-off-by: Janosch Frank <frankja@linux.ibm.com>
|
||||
(cherry picked from commit 6807f464961cfee1dd81c95e22ddd91fa352fcc4)
|
||||
Signed-off-by: Bruce Rogers <brogers@suse.com>
|
||||
---
|
||||
linux-headers/linux/kvm.h | 50 +++++++++++++++++++++++++++++++++++++--
|
||||
1 file changed, 48 insertions(+), 2 deletions(-)
|
||||
linux-headers/linux/kvm.h | 45 +++++++++++++++++++++++++++++++++++++--
|
||||
1 file changed, 43 insertions(+), 2 deletions(-)
|
||||
|
||||
diff --git a/linux-headers/linux/kvm.h b/linux-headers/linux/kvm.h
|
||||
index 3d9b18f7f871acd0d13a0c42f184..18c636070edaf09dd8cf33ddb400 100644
|
||||
index 265099100e65b3e86d9e42e8806e..c30344ab0095e8568e785a237c89 100644
|
||||
--- a/linux-headers/linux/kvm.h
|
||||
+++ b/linux-headers/linux/kvm.h
|
||||
@@ -468,12 +468,17 @@ struct kvm_s390_mem_op {
|
||||
@@ -474,12 +474,17 @@ struct kvm_s390_mem_op {
|
||||
__u32 size; /* amount of bytes */
|
||||
__u32 op; /* type of operation */
|
||||
__u64 buf; /* buffer in userspace */
|
||||
@ -35,23 +35,18 @@ index 3d9b18f7f871acd0d13a0c42f184..18c636070edaf09dd8cf33ddb400 100644
|
||||
/* flags for kvm_s390_mem_op->flags */
|
||||
#define KVM_S390_MEMOP_F_CHECK_ONLY (1ULL << 0)
|
||||
#define KVM_S390_MEMOP_F_INJECT_EXCEPTION (1ULL << 1)
|
||||
@@ -1000,6 +1005,8 @@ struct kvm_ppc_resize_hpt {
|
||||
#define KVM_CAP_PMU_EVENT_FILTER 173
|
||||
#define KVM_CAP_ARM_IRQ_LINE_LAYOUT_2 174
|
||||
#define KVM_CAP_HYPERV_DIRECT_TLBFLUSH 175
|
||||
+#define KVM_CAP_S390_VCPU_RESETS 179
|
||||
@@ -1010,6 +1015,7 @@ struct kvm_ppc_resize_hpt {
|
||||
#define KVM_CAP_ARM_NISV_TO_USER 177
|
||||
#define KVM_CAP_ARM_INJECT_EXT_DABT 178
|
||||
#define KVM_CAP_S390_VCPU_RESETS 179
|
||||
+#define KVM_CAP_S390_PROTECTED 180
|
||||
|
||||
#ifdef KVM_CAP_IRQ_ROUTING
|
||||
|
||||
@@ -1461,6 +1468,45 @@ struct kvm_enc_region {
|
||||
/* Available with KVM_CAP_ARM_SVE */
|
||||
#define KVM_ARM_VCPU_FINALIZE _IOW(KVMIO, 0xc2, int)
|
||||
@@ -1478,6 +1484,41 @@ struct kvm_enc_region {
|
||||
#define KVM_S390_NORMAL_RESET _IO(KVMIO, 0xc3)
|
||||
#define KVM_S390_CLEAR_RESET _IO(KVMIO, 0xc4)
|
||||
|
||||
+/* Available with KVM_CAP_S390_VCPU_RESETS */
|
||||
+#define KVM_S390_NORMAL_RESET _IO(KVMIO, 0xc3)
|
||||
+#define KVM_S390_CLEAR_RESET _IO(KVMIO, 0xc4)
|
||||
+
|
||||
+struct kvm_s390_pv_sec_parm {
|
||||
+ __u64 origin;
|
||||
+ __u64 length;
|
||||
|
@ -8,10 +8,10 @@ Signed-off-by: Bruce Rogers <brogers@suse.com>
|
||||
1 file changed, 6 insertions(+)
|
||||
|
||||
diff --git a/linux-user/signal.c b/linux-user/signal.c
|
||||
index 5ca6d62b15d3e4d3faee3f554fff..1d6382ce881795b057ab229e4129 100644
|
||||
index 8cf51ffecde659742b7aac6dfaae..08cb813a8a1782ed4b845d716ce2 100644
|
||||
--- a/linux-user/signal.c
|
||||
+++ b/linux-user/signal.c
|
||||
@@ -581,6 +581,10 @@ static void QEMU_NORETURN dump_core_and_abort(int target_sig)
|
||||
@@ -632,6 +632,10 @@ static void QEMU_NORETURN dump_core_and_abort(int target_sig)
|
||||
trace_user_force_sig(env, target_sig, host_sig);
|
||||
gdb_signalled(env, target_sig);
|
||||
|
||||
@ -22,7 +22,7 @@ index 5ca6d62b15d3e4d3faee3f554fff..1d6382ce881795b057ab229e4129 100644
|
||||
/* dump core if supported by target binary format */
|
||||
if (core_dump_signal(target_sig) && (ts->bprm->core_dump != NULL)) {
|
||||
stop_all_tasks();
|
||||
@@ -598,6 +602,8 @@ static void QEMU_NORETURN dump_core_and_abort(int target_sig)
|
||||
@@ -649,6 +653,8 @@ static void QEMU_NORETURN dump_core_and_abort(int target_sig)
|
||||
target_sig, strsignal(host_sig), "core dumped" );
|
||||
}
|
||||
|
||||
|
@ -16,10 +16,10 @@ Signed-off-by: Andreas Färber <afaerber@suse.de>
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
diff --git a/hw/acpi/piix4.c b/hw/acpi/piix4.c
|
||||
index 93aec2dd2ce1767784076c3544b0..1f2a8ea850e9115b689af90bf708 100644
|
||||
index 964d6f5990faf6ff7521bb2377a2..7b5f8234444b8b29ae66098b8d39 100644
|
||||
--- a/hw/acpi/piix4.c
|
||||
+++ b/hw/acpi/piix4.c
|
||||
@@ -273,7 +273,7 @@ static bool piix4_vmstate_need_smbus(void *opaque, int version_id)
|
||||
@@ -274,7 +274,7 @@ static bool piix4_vmstate_need_smbus(void *opaque, int version_id)
|
||||
static const VMStateDescription vmstate_acpi = {
|
||||
.name = "piix4_pm",
|
||||
.version_id = 3,
|
||||
|
@ -1,116 +0,0 @@
|
||||
From: Paolo Bonzini <pbonzini@redhat.com>
|
||||
Date: Tue, 7 Apr 2020 10:07:45 -0400
|
||||
Subject: aio-wait: delegate polling of main AioContext if BQL not held
|
||||
|
||||
Git-commit: 3c18a92dc4b55ca8cc37a755ed119f11c0f34099
|
||||
|
||||
Any thread that is not a iothread returns NULL for qemu_get_current_aio_context().
|
||||
As a result, it would also return true for
|
||||
in_aio_context_home_thread(qemu_get_aio_context()), causing
|
||||
AIO_WAIT_WHILE to invoke aio_poll() directly. This is incorrect
|
||||
if the BQL is not held, because aio_poll() does not expect to
|
||||
run concurrently from multiple threads, and it can actually
|
||||
happen when savevm writes to the vmstate file from the
|
||||
migration thread.
|
||||
|
||||
Therefore, restrict in_aio_context_home_thread to return true
|
||||
for the main AioContext only if the BQL is held.
|
||||
|
||||
The function is moved to aio-wait.h because it is mostly used
|
||||
there and to avoid a circular reference between main-loop.h
|
||||
and block/aio.h.
|
||||
|
||||
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
|
||||
Message-Id: <20200407140746.8041-5-pbonzini@redhat.com>
|
||||
Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
|
||||
Signed-off-by: Bruce Rogers <brogers@suse.com>
|
||||
---
|
||||
include/block/aio-wait.h | 22 ++++++++++++++++++++++
|
||||
include/block/aio.h | 29 ++++++++++-------------------
|
||||
2 files changed, 32 insertions(+), 19 deletions(-)
|
||||
|
||||
diff --git a/include/block/aio-wait.h b/include/block/aio-wait.h
|
||||
index afeeb18f95ebb593982b5d3f8917..716d2639df708f03e3f29d68315b 100644
|
||||
--- a/include/block/aio-wait.h
|
||||
+++ b/include/block/aio-wait.h
|
||||
@@ -26,6 +26,7 @@
|
||||
#define QEMU_AIO_WAIT_H
|
||||
|
||||
#include "block/aio.h"
|
||||
+#include "qemu/main-loop.h"
|
||||
|
||||
/**
|
||||
* AioWait:
|
||||
@@ -124,4 +125,25 @@ void aio_wait_kick(void);
|
||||
*/
|
||||
void aio_wait_bh_oneshot(AioContext *ctx, QEMUBHFunc *cb, void *opaque);
|
||||
|
||||
+/**
|
||||
+ * in_aio_context_home_thread:
|
||||
+ * @ctx: the aio context
|
||||
+ *
|
||||
+ * Return whether we are running in the thread that normally runs @ctx. Note
|
||||
+ * that acquiring/releasing ctx does not affect the outcome, each AioContext
|
||||
+ * still only has one home thread that is responsible for running it.
|
||||
+ */
|
||||
+static inline bool in_aio_context_home_thread(AioContext *ctx)
|
||||
+{
|
||||
+ if (ctx == qemu_get_current_aio_context()) {
|
||||
+ return true;
|
||||
+ }
|
||||
+
|
||||
+ if (ctx == qemu_get_aio_context()) {
|
||||
+ return qemu_mutex_iothread_locked();
|
||||
+ } else {
|
||||
+ return false;
|
||||
+ }
|
||||
+}
|
||||
+
|
||||
#endif /* QEMU_AIO_WAIT_H */
|
||||
diff --git a/include/block/aio.h b/include/block/aio.h
|
||||
index 6b0d52f732b86caef07602281574..9d28e247df7f0d3a556644fcd9d1 100644
|
||||
--- a/include/block/aio.h
|
||||
+++ b/include/block/aio.h
|
||||
@@ -60,12 +60,16 @@ struct AioContext {
|
||||
QLIST_HEAD(, AioHandler) aio_handlers;
|
||||
|
||||
/* Used to avoid unnecessary event_notifier_set calls in aio_notify;
|
||||
- * accessed with atomic primitives. If this field is 0, everything
|
||||
- * (file descriptors, bottom halves, timers) will be re-evaluated
|
||||
- * before the next blocking poll(), thus the event_notifier_set call
|
||||
- * can be skipped. If it is non-zero, you may need to wake up a
|
||||
- * concurrent aio_poll or the glib main event loop, making
|
||||
- * event_notifier_set necessary.
|
||||
+ * only written from the AioContext home thread, or under the BQL in
|
||||
+ * the case of the main AioContext. However, it is read from any
|
||||
+ * thread so it is still accessed with atomic primitives.
|
||||
+ *
|
||||
+ * If this field is 0, everything (file descriptors, bottom halves,
|
||||
+ * timers) will be re-evaluated before the next blocking poll() or
|
||||
+ * io_uring wait; therefore, the event_notifier_set call can be
|
||||
+ * skipped. If it is non-zero, you may need to wake up a concurrent
|
||||
+ * aio_poll or the glib main event loop, making event_notifier_set
|
||||
+ * necessary.
|
||||
*
|
||||
* Bit 0 is reserved for GSource usage of the AioContext, and is 1
|
||||
* between a call to aio_ctx_prepare and the next call to aio_ctx_check.
|
||||
@@ -580,19 +584,6 @@ void aio_co_enter(AioContext *ctx, struct Coroutine *co);
|
||||
*/
|
||||
AioContext *qemu_get_current_aio_context(void);
|
||||
|
||||
-/**
|
||||
- * in_aio_context_home_thread:
|
||||
- * @ctx: the aio context
|
||||
- *
|
||||
- * Return whether we are running in the thread that normally runs @ctx. Note
|
||||
- * that acquiring/releasing ctx does not affect the outcome, each AioContext
|
||||
- * still only has one home thread that is responsible for running it.
|
||||
- */
|
||||
-static inline bool in_aio_context_home_thread(AioContext *ctx)
|
||||
-{
|
||||
- return ctx == qemu_get_current_aio_context();
|
||||
-}
|
||||
-
|
||||
/**
|
||||
* aio_context_setup:
|
||||
* @ctx: the aio context
|
@ -1,42 +0,0 @@
|
||||
From: Niek Linnenbank <nieklinnenbank@gmail.com>
|
||||
Date: Mon, 2 Dec 2019 22:09:43 +0100
|
||||
Subject: arm/arm-powerctl: set NSACR.{CP11, CP10} bits in arm_set_cpu_on()
|
||||
|
||||
Git-commit: 0c7f8c43daf6556078e51de98aa13f069e505985
|
||||
|
||||
This change ensures that the FPU can be accessed in Non-Secure mode
|
||||
when the CPU core is reset using the arm_set_cpu_on() function call.
|
||||
The NSACR.{CP11,CP10} bits define the exception level required to
|
||||
access the FPU in Non-Secure mode. Without these bits set, the CPU
|
||||
will give an undefined exception trap on the first FPU access for the
|
||||
secondary cores under Linux.
|
||||
|
||||
This is necessary because in this power-control codepath QEMU
|
||||
is effectively emulating a bit of EL3 firmware, and has to set
|
||||
the CPU up as the EL3 firmware would.
|
||||
|
||||
Fixes: fc1120a7f5
|
||||
Cc: qemu-stable@nongnu.org
|
||||
Signed-off-by: Niek Linnenbank <nieklinnenbank@gmail.com>
|
||||
[PMM: added clarifying para to commit message]
|
||||
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
|
||||
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
|
||||
Signed-off-by: Bruce Rogers <brogers@suse.com>
|
||||
---
|
||||
target/arm/arm-powerctl.c | 3 +++
|
||||
1 file changed, 3 insertions(+)
|
||||
|
||||
diff --git a/target/arm/arm-powerctl.c b/target/arm/arm-powerctl.c
|
||||
index f77a950db67276513977af686aa9..b064513d44a86932bbd70b06b3ca 100644
|
||||
--- a/target/arm/arm-powerctl.c
|
||||
+++ b/target/arm/arm-powerctl.c
|
||||
@@ -104,6 +104,9 @@ static void arm_set_cpu_on_async_work(CPUState *target_cpu_state,
|
||||
/* Processor is not in secure mode */
|
||||
target_cpu->env.cp15.scr_el3 |= SCR_NS;
|
||||
|
||||
+ /* Set NSACR.{CP11,CP10} so NS can access the FPU */
|
||||
+ target_cpu->env.cp15.nsacr |= 3 << 10;
|
||||
+
|
||||
/*
|
||||
* If QEMU is providing the equivalent of EL3 firmware, then we need
|
||||
* to make sure a CPU targeting EL2 comes out of reset with a
|
@ -1,168 +0,0 @@
|
||||
From: Paolo Bonzini <pbonzini@redhat.com>
|
||||
Date: Tue, 7 Apr 2020 10:07:46 -0400
|
||||
Subject: async: use explicit memory barriers
|
||||
|
||||
Git-commit: 5710a3e09f9b85801e5ce70797a4a511e5fc9e2c
|
||||
|
||||
When using C11 atomics, non-seqcst reads and writes do not participate
|
||||
in the total order of seqcst operations. In util/async.c and util/aio-posix.c,
|
||||
in particular, the pattern that we use
|
||||
|
||||
write ctx->notify_me write bh->scheduled
|
||||
read bh->scheduled read ctx->notify_me
|
||||
if !bh->scheduled, sleep if ctx->notify_me, notify
|
||||
|
||||
needs to use seqcst operations for both the write and the read. In
|
||||
general this is something that we do not want, because there can be
|
||||
many sources that are polled in addition to bottom halves. The
|
||||
alternative is to place a seqcst memory barrier between the write
|
||||
and the read. This also comes with a disadvantage, in that the
|
||||
memory barrier is implicit on strongly-ordered architectures and
|
||||
it wastes a few dozen clock cycles.
|
||||
|
||||
Fortunately, ctx->notify_me is never written concurrently by two
|
||||
threads, so we can assert that and relax the writes to ctx->notify_me.
|
||||
The resulting solution works and performs well on both aarch64 and x86.
|
||||
|
||||
Note that the atomic_set/atomic_read combination is not an atomic
|
||||
read-modify-write, and therefore it is even weaker than C11 ATOMIC_RELAXED;
|
||||
on x86, ATOMIC_RELAXED compiles to a locked operation.
|
||||
|
||||
Analyzed-by: Ying Fang <fangying1@huawei.com>
|
||||
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
|
||||
Tested-by: Ying Fang <fangying1@huawei.com>
|
||||
Message-Id: <20200407140746.8041-6-pbonzini@redhat.com>
|
||||
Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
|
||||
Signed-off-by: Bruce Rogers <brogers@suse.com>
|
||||
---
|
||||
util/aio-posix.c | 16 ++++++++++++++--
|
||||
util/aio-win32.c | 17 ++++++++++++++---
|
||||
util/async.c | 16 ++++++++++++----
|
||||
3 files changed, 40 insertions(+), 9 deletions(-)
|
||||
|
||||
diff --git a/util/aio-posix.c b/util/aio-posix.c
|
||||
index a4977f538ef28d56178267a1795c..fe2a46c439fa1505f5f688274566 100644
|
||||
--- a/util/aio-posix.c
|
||||
+++ b/util/aio-posix.c
|
||||
@@ -616,6 +616,11 @@ bool aio_poll(AioContext *ctx, bool blocking)
|
||||
int64_t timeout;
|
||||
int64_t start = 0;
|
||||
|
||||
+ /*
|
||||
+ * There cannot be two concurrent aio_poll calls for the same AioContext (or
|
||||
+ * an aio_poll concurrent with a GSource prepare/check/dispatch callback).
|
||||
+ * We rely on this below to avoid slow locked accesses to ctx->notify_me.
|
||||
+ */
|
||||
assert(in_aio_context_home_thread(ctx));
|
||||
|
||||
/* aio_notify can avoid the expensive event_notifier_set if
|
||||
@@ -626,7 +631,13 @@ bool aio_poll(AioContext *ctx, bool blocking)
|
||||
* so disable the optimization now.
|
||||
*/
|
||||
if (blocking) {
|
||||
- atomic_add(&ctx->notify_me, 2);
|
||||
+ atomic_set(&ctx->notify_me, atomic_read(&ctx->notify_me) + 2);
|
||||
+ /*
|
||||
+ * Write ctx->notify_me before computing the timeout
|
||||
+ * (reading bottom half flags, etc.). Pairs with
|
||||
+ * smp_mb in aio_notify().
|
||||
+ */
|
||||
+ smp_mb();
|
||||
}
|
||||
|
||||
qemu_lockcnt_inc(&ctx->list_lock);
|
||||
@@ -671,7 +682,8 @@ bool aio_poll(AioContext *ctx, bool blocking)
|
||||
}
|
||||
|
||||
if (blocking) {
|
||||
- atomic_sub(&ctx->notify_me, 2);
|
||||
+ /* Finish the poll before clearing the flag. */
|
||||
+ atomic_store_release(&ctx->notify_me, atomic_read(&ctx->notify_me) - 2);
|
||||
aio_notify_accept(ctx);
|
||||
}
|
||||
|
||||
diff --git a/util/aio-win32.c b/util/aio-win32.c
|
||||
index a23b9c364db3a764a3e00c6b62e9..729d533faf4d807e0a5388edd2af 100644
|
||||
--- a/util/aio-win32.c
|
||||
+++ b/util/aio-win32.c
|
||||
@@ -321,6 +321,12 @@ bool aio_poll(AioContext *ctx, bool blocking)
|
||||
int count;
|
||||
int timeout;
|
||||
|
||||
+ /*
|
||||
+ * There cannot be two concurrent aio_poll calls for the same AioContext (or
|
||||
+ * an aio_poll concurrent with a GSource prepare/check/dispatch callback).
|
||||
+ * We rely on this below to avoid slow locked accesses to ctx->notify_me.
|
||||
+ */
|
||||
+ assert(in_aio_context_home_thread(ctx));
|
||||
progress = false;
|
||||
|
||||
/* aio_notify can avoid the expensive event_notifier_set if
|
||||
@@ -331,7 +337,13 @@ bool aio_poll(AioContext *ctx, bool blocking)
|
||||
* so disable the optimization now.
|
||||
*/
|
||||
if (blocking) {
|
||||
- atomic_add(&ctx->notify_me, 2);
|
||||
+ atomic_set(&ctx->notify_me, atomic_read(&ctx->notify_me) + 2);
|
||||
+ /*
|
||||
+ * Write ctx->notify_me before computing the timeout
|
||||
+ * (reading bottom half flags, etc.). Pairs with
|
||||
+ * smp_mb in aio_notify().
|
||||
+ */
|
||||
+ smp_mb();
|
||||
}
|
||||
|
||||
qemu_lockcnt_inc(&ctx->list_lock);
|
||||
@@ -364,8 +376,7 @@ bool aio_poll(AioContext *ctx, bool blocking)
|
||||
ret = WaitForMultipleObjects(count, events, FALSE, timeout);
|
||||
if (blocking) {
|
||||
assert(first);
|
||||
- assert(in_aio_context_home_thread(ctx));
|
||||
- atomic_sub(&ctx->notify_me, 2);
|
||||
+ atomic_store_release(&ctx->notify_me, atomic_read(&ctx->notify_me) - 2);
|
||||
aio_notify_accept(ctx);
|
||||
}
|
||||
|
||||
diff --git a/util/async.c b/util/async.c
|
||||
index b1fa5319e5bc7830d50108f91139..c65c58bbc9f57bf1bbdb6acd5fd1 100644
|
||||
--- a/util/async.c
|
||||
+++ b/util/async.c
|
||||
@@ -220,7 +220,14 @@ aio_ctx_prepare(GSource *source, gint *timeout)
|
||||
{
|
||||
AioContext *ctx = (AioContext *) source;
|
||||
|
||||
- atomic_or(&ctx->notify_me, 1);
|
||||
+ atomic_set(&ctx->notify_me, atomic_read(&ctx->notify_me) | 1);
|
||||
+
|
||||
+ /*
|
||||
+ * Write ctx->notify_me before computing the timeout
|
||||
+ * (reading bottom half flags, etc.). Pairs with
|
||||
+ * smp_mb in aio_notify().
|
||||
+ */
|
||||
+ smp_mb();
|
||||
|
||||
/* We assume there is no timeout already supplied */
|
||||
*timeout = qemu_timeout_ns_to_ms(aio_compute_timeout(ctx));
|
||||
@@ -238,7 +245,8 @@ aio_ctx_check(GSource *source)
|
||||
AioContext *ctx = (AioContext *) source;
|
||||
QEMUBH *bh;
|
||||
|
||||
- atomic_and(&ctx->notify_me, ~1);
|
||||
+ /* Finish computing the timeout before clearing the flag. */
|
||||
+ atomic_store_release(&ctx->notify_me, atomic_read(&ctx->notify_me) & ~1);
|
||||
aio_notify_accept(ctx);
|
||||
|
||||
for (bh = ctx->first_bh; bh; bh = bh->next) {
|
||||
@@ -343,10 +351,10 @@ LinuxAioState *aio_get_linux_aio(AioContext *ctx)
|
||||
void aio_notify(AioContext *ctx)
|
||||
{
|
||||
/* Write e.g. bh->scheduled before reading ctx->notify_me. Pairs
|
||||
- * with atomic_or in aio_ctx_prepare or atomic_add in aio_poll.
|
||||
+ * with smp_mb in aio_ctx_prepare or aio_poll.
|
||||
*/
|
||||
smp_mb();
|
||||
- if (ctx->notify_me) {
|
||||
+ if (atomic_read(&ctx->notify_me)) {
|
||||
event_notifier_set(&ctx->notifier);
|
||||
atomic_mb_set(&ctx->notified, true);
|
||||
}
|
@ -1,94 +0,0 @@
|
||||
From: BALATON Zoltan <balaton@eik.bme.hu>
|
||||
Date: Mon, 6 Apr 2020 22:34:26 +0200
|
||||
Subject: ati-vga: Fix checks in ati_2d_blt() to avoid crash
|
||||
|
||||
Git-commit ac2071c3791b67fc7af78b8ceb320c01ca1b5df7:
|
||||
References: bsc#117037, CVE-2020-11869
|
||||
|
||||
In some corner cases (that never happen during normal operation but a
|
||||
malicious guest could program wrong values) pixman functions were
|
||||
called with parameters that result in a crash. Fix this and add more
|
||||
checks to disallow such cases.
|
||||
|
||||
Reported-by: Ziming Zhang <ezrakiez@gmail.com>
|
||||
Signed-off-by: BALATON Zoltan <balaton@eik.bme.hu>
|
||||
Message-id: 20200406204029.19559747D5D@zero.eik.bme.hu
|
||||
Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
|
||||
Signed-off-by: Bruce Rogers <brogers@suse.com>
|
||||
---
|
||||
hw/display/ati_2d.c | 37 ++++++++++++++++++++++++++-----------
|
||||
1 file changed, 26 insertions(+), 11 deletions(-)
|
||||
|
||||
diff --git a/hw/display/ati_2d.c b/hw/display/ati_2d.c
|
||||
index 42e82311eb4433a6ee2671e9855a..23a8ae0cd8ceb7b59408c0709e2f 100644
|
||||
--- a/hw/display/ati_2d.c
|
||||
+++ b/hw/display/ati_2d.c
|
||||
@@ -53,12 +53,20 @@ void ati_2d_blt(ATIVGAState *s)
|
||||
s->vga.vbe_start_addr, surface_data(ds), surface_stride(ds),
|
||||
surface_bits_per_pixel(ds),
|
||||
(s->regs.dp_mix & GMC_ROP3_MASK) >> 16);
|
||||
- int dst_x = (s->regs.dp_cntl & DST_X_LEFT_TO_RIGHT ?
|
||||
- s->regs.dst_x : s->regs.dst_x + 1 - s->regs.dst_width);
|
||||
- int dst_y = (s->regs.dp_cntl & DST_Y_TOP_TO_BOTTOM ?
|
||||
- s->regs.dst_y : s->regs.dst_y + 1 - s->regs.dst_height);
|
||||
+ unsigned dst_x = (s->regs.dp_cntl & DST_X_LEFT_TO_RIGHT ?
|
||||
+ s->regs.dst_x : s->regs.dst_x + 1 - s->regs.dst_width);
|
||||
+ unsigned dst_y = (s->regs.dp_cntl & DST_Y_TOP_TO_BOTTOM ?
|
||||
+ s->regs.dst_y : s->regs.dst_y + 1 - s->regs.dst_height);
|
||||
int bpp = ati_bpp_from_datatype(s);
|
||||
+ if (!bpp) {
|
||||
+ qemu_log_mask(LOG_GUEST_ERROR, "Invalid bpp\n");
|
||||
+ return;
|
||||
+ }
|
||||
int dst_stride = DEFAULT_CNTL ? s->regs.dst_pitch : s->regs.default_pitch;
|
||||
+ if (!dst_stride) {
|
||||
+ qemu_log_mask(LOG_GUEST_ERROR, "Zero dest pitch\n");
|
||||
+ return;
|
||||
+ }
|
||||
uint8_t *dst_bits = s->vga.vram_ptr + (DEFAULT_CNTL ?
|
||||
s->regs.dst_offset : s->regs.default_offset);
|
||||
|
||||
@@ -82,12 +90,16 @@ void ati_2d_blt(ATIVGAState *s)
|
||||
switch (s->regs.dp_mix & GMC_ROP3_MASK) {
|
||||
case ROP3_SRCCOPY:
|
||||
{
|
||||
- int src_x = (s->regs.dp_cntl & DST_X_LEFT_TO_RIGHT ?
|
||||
- s->regs.src_x : s->regs.src_x + 1 - s->regs.dst_width);
|
||||
- int src_y = (s->regs.dp_cntl & DST_Y_TOP_TO_BOTTOM ?
|
||||
- s->regs.src_y : s->regs.src_y + 1 - s->regs.dst_height);
|
||||
+ unsigned src_x = (s->regs.dp_cntl & DST_X_LEFT_TO_RIGHT ?
|
||||
+ s->regs.src_x : s->regs.src_x + 1 - s->regs.dst_width);
|
||||
+ unsigned src_y = (s->regs.dp_cntl & DST_Y_TOP_TO_BOTTOM ?
|
||||
+ s->regs.src_y : s->regs.src_y + 1 - s->regs.dst_height);
|
||||
int src_stride = DEFAULT_CNTL ?
|
||||
s->regs.src_pitch : s->regs.default_pitch;
|
||||
+ if (!src_stride) {
|
||||
+ qemu_log_mask(LOG_GUEST_ERROR, "Zero source pitch\n");
|
||||
+ return;
|
||||
+ }
|
||||
uint8_t *src_bits = s->vga.vram_ptr + (DEFAULT_CNTL ?
|
||||
s->regs.src_offset : s->regs.default_offset);
|
||||
|
||||
@@ -137,8 +149,10 @@ void ati_2d_blt(ATIVGAState *s)
|
||||
dst_y * surface_stride(ds),
|
||||
s->regs.dst_height * surface_stride(ds));
|
||||
}
|
||||
- s->regs.dst_x += s->regs.dst_width;
|
||||
- s->regs.dst_y += s->regs.dst_height;
|
||||
+ s->regs.dst_x = (s->regs.dp_cntl & DST_X_LEFT_TO_RIGHT ?
|
||||
+ dst_x + s->regs.dst_width : dst_x);
|
||||
+ s->regs.dst_y = (s->regs.dp_cntl & DST_Y_TOP_TO_BOTTOM ?
|
||||
+ dst_y + s->regs.dst_height : dst_y);
|
||||
break;
|
||||
}
|
||||
case ROP3_PATCOPY:
|
||||
@@ -179,7 +193,8 @@ void ati_2d_blt(ATIVGAState *s)
|
||||
dst_y * surface_stride(ds),
|
||||
s->regs.dst_height * surface_stride(ds));
|
||||
}
|
||||
- s->regs.dst_y += s->regs.dst_height;
|
||||
+ s->regs.dst_y = (s->regs.dp_cntl & DST_Y_TOP_TO_BOTTOM ?
|
||||
+ dst_y + s->regs.dst_height : dst_y);
|
||||
break;
|
||||
}
|
||||
default:
|
@ -1,32 +0,0 @@
|
||||
From: Gerd Hoffmann <kraxel@redhat.com>
|
||||
Date: Mon, 20 Jan 2020 11:18:04 +0100
|
||||
Subject: audio/oss: fix buffer pos calculation
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
Git-commit: 7a4ede0047a8613b0e3b72c9d351038f013dd357
|
||||
|
||||
Fixes: 3ba4066d085f ("ossaudio: port to the new audio backend api")
|
||||
Reported-by: ziming zhang <ezrakiez@gmail.com>
|
||||
Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
|
||||
Message-Id: <20200120101804.29578-1-kraxel@redhat.com>
|
||||
Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com>
|
||||
Signed-off-by: Bruce Rogers <brogers@suse.com>
|
||||
---
|
||||
audio/ossaudio.c | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
diff --git a/audio/ossaudio.c b/audio/ossaudio.c
|
||||
index c43faeeea4aa208c9729cc760dcd..94564916fbf03c4783a5fdf5c403 100644
|
||||
--- a/audio/ossaudio.c
|
||||
+++ b/audio/ossaudio.c
|
||||
@@ -420,7 +420,7 @@ static size_t oss_write(HWVoiceOut *hw, void *buf, size_t len)
|
||||
size_t to_copy = MIN(len, hw->size_emul - hw->pos_emul);
|
||||
memcpy(hw->buf_emul + hw->pos_emul, buf, to_copy);
|
||||
|
||||
- hw->pos_emul = (hw->pos_emul + to_copy) % hw->pos_emul;
|
||||
+ hw->pos_emul = (hw->pos_emul + to_copy) % hw->size_emul;
|
||||
buf += to_copy;
|
||||
len -= to_copy;
|
||||
}
|
@ -1,40 +0,0 @@
|
||||
From: Max Reitz <mreitz@redhat.com>
|
||||
Date: Thu, 19 Dec 2019 19:26:38 +0100
|
||||
Subject: backup-top: Begin drain earlier
|
||||
|
||||
Git-commit: 503ca1262bab2c11c533a4816d1ff4297d4f58a6
|
||||
|
||||
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>
|
||||
Signed-off-by: Bruce Rogers <brogers@suse.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 7cdb1f8eba1065c04057b4a2137e..818d3f26b48da425ba061e21887f 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,201 +0,0 @@
|
||||
From: Max Reitz <mreitz@redhat.com>
|
||||
Date: Fri, 8 Nov 2019 13:34:53 +0100
|
||||
Subject: blkdebug: Allow taking/unsharing permissions
|
||||
|
||||
Git-commit: 69c6449ff10fe4e3219e960549307096d5366bd0
|
||||
|
||||
Sometimes it is useful to be able to add a node to the block graph that
|
||||
takes or unshare a certain set of permissions for debugging purposes.
|
||||
This patch adds this capability to blkdebug.
|
||||
|
||||
(Note that you cannot make blkdebug release or share permissions that it
|
||||
needs to take or cannot share, because this might result in assertion
|
||||
failures in the block layer. But if the blkdebug node has no parents,
|
||||
it will not take any permissions and share everything by default, so you
|
||||
can then freely choose what permissions to take and share.)
|
||||
|
||||
Signed-off-by: Max Reitz <mreitz@redhat.com>
|
||||
Message-id: 20191108123455.39445-4-mreitz@redhat.com
|
||||
Reviewed-by: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>
|
||||
Signed-off-by: Max Reitz <mreitz@redhat.com>
|
||||
Signed-off-by: Bruce Rogers <brogers@suse.com>
|
||||
---
|
||||
block/blkdebug.c | 93 +++++++++++++++++++++++++++++++++++++++++++-
|
||||
qapi/block-core.json | 14 ++++++-
|
||||
2 files changed, 105 insertions(+), 2 deletions(-)
|
||||
|
||||
diff --git a/block/blkdebug.c b/block/blkdebug.c
|
||||
index 5ae96c52b0733fc37bd5f485e124..af44aa973fd1855a48317ff7fd3f 100644
|
||||
--- a/block/blkdebug.c
|
||||
+++ b/block/blkdebug.c
|
||||
@@ -28,10 +28,14 @@
|
||||
#include "qemu/cutils.h"
|
||||
#include "qemu/config-file.h"
|
||||
#include "block/block_int.h"
|
||||
+#include "block/qdict.h"
|
||||
#include "qemu/module.h"
|
||||
#include "qemu/option.h"
|
||||
+#include "qapi/qapi-visit-block-core.h"
|
||||
#include "qapi/qmp/qdict.h"
|
||||
+#include "qapi/qmp/qlist.h"
|
||||
#include "qapi/qmp/qstring.h"
|
||||
+#include "qapi/qobject-input-visitor.h"
|
||||
#include "sysemu/qtest.h"
|
||||
|
||||
typedef struct BDRVBlkdebugState {
|
||||
@@ -44,6 +48,9 @@ typedef struct BDRVBlkdebugState {
|
||||
uint64_t opt_discard;
|
||||
uint64_t max_discard;
|
||||
|
||||
+ uint64_t take_child_perms;
|
||||
+ uint64_t unshare_child_perms;
|
||||
+
|
||||
/* For blkdebug_refresh_filename() */
|
||||
char *config_file;
|
||||
|
||||
@@ -344,6 +351,69 @@ static void blkdebug_parse_filename(const char *filename, QDict *options,
|
||||
qdict_put_str(options, "x-image", filename);
|
||||
}
|
||||
|
||||
+static int blkdebug_parse_perm_list(uint64_t *dest, QDict *options,
|
||||
+ const char *prefix, Error **errp)
|
||||
+{
|
||||
+ int ret = 0;
|
||||
+ QDict *subqdict = NULL;
|
||||
+ QObject *crumpled_subqdict = NULL;
|
||||
+ Visitor *v = NULL;
|
||||
+ BlockPermissionList *perm_list = NULL, *element;
|
||||
+ Error *local_err = NULL;
|
||||
+
|
||||
+ *dest = 0;
|
||||
+
|
||||
+ qdict_extract_subqdict(options, &subqdict, prefix);
|
||||
+ if (!qdict_size(subqdict)) {
|
||||
+ goto out;
|
||||
+ }
|
||||
+
|
||||
+ crumpled_subqdict = qdict_crumple(subqdict, errp);
|
||||
+ if (!crumpled_subqdict) {
|
||||
+ ret = -EINVAL;
|
||||
+ goto out;
|
||||
+ }
|
||||
+
|
||||
+ v = qobject_input_visitor_new(crumpled_subqdict);
|
||||
+ visit_type_BlockPermissionList(v, NULL, &perm_list, &local_err);
|
||||
+ if (local_err) {
|
||||
+ error_propagate(errp, local_err);
|
||||
+ ret = -EINVAL;
|
||||
+ goto out;
|
||||
+ }
|
||||
+
|
||||
+ for (element = perm_list; element; element = element->next) {
|
||||
+ *dest |= bdrv_qapi_perm_to_blk_perm(element->value);
|
||||
+ }
|
||||
+
|
||||
+out:
|
||||
+ qapi_free_BlockPermissionList(perm_list);
|
||||
+ visit_free(v);
|
||||
+ qobject_unref(subqdict);
|
||||
+ qobject_unref(crumpled_subqdict);
|
||||
+ return ret;
|
||||
+}
|
||||
+
|
||||
+static int blkdebug_parse_perms(BDRVBlkdebugState *s, QDict *options,
|
||||
+ Error **errp)
|
||||
+{
|
||||
+ int ret;
|
||||
+
|
||||
+ ret = blkdebug_parse_perm_list(&s->take_child_perms, options,
|
||||
+ "take-child-perms.", errp);
|
||||
+ if (ret < 0) {
|
||||
+ return ret;
|
||||
+ }
|
||||
+
|
||||
+ ret = blkdebug_parse_perm_list(&s->unshare_child_perms, options,
|
||||
+ "unshare-child-perms.", errp);
|
||||
+ if (ret < 0) {
|
||||
+ return ret;
|
||||
+ }
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
static QemuOptsList runtime_opts = {
|
||||
.name = "blkdebug",
|
||||
.head = QTAILQ_HEAD_INITIALIZER(runtime_opts.head),
|
||||
@@ -419,6 +489,12 @@ static int blkdebug_open(BlockDriverState *bs, QDict *options, int flags,
|
||||
/* Set initial state */
|
||||
s->state = 1;
|
||||
|
||||
+ /* Parse permissions modifiers before opening the image file */
|
||||
+ ret = blkdebug_parse_perms(s, options, errp);
|
||||
+ if (ret < 0) {
|
||||
+ goto out;
|
||||
+ }
|
||||
+
|
||||
/* Open the image file */
|
||||
bs->file = bdrv_open_child(qemu_opt_get(opts, "x-image"), options, "image",
|
||||
bs, &child_file, false, &local_err);
|
||||
@@ -916,6 +992,21 @@ static int blkdebug_reopen_prepare(BDRVReopenState *reopen_state,
|
||||
return 0;
|
||||
}
|
||||
|
||||
+static void blkdebug_child_perm(BlockDriverState *bs, BdrvChild *c,
|
||||
+ const BdrvChildRole *role,
|
||||
+ BlockReopenQueue *reopen_queue,
|
||||
+ uint64_t perm, uint64_t shared,
|
||||
+ uint64_t *nperm, uint64_t *nshared)
|
||||
+{
|
||||
+ BDRVBlkdebugState *s = bs->opaque;
|
||||
+
|
||||
+ bdrv_filter_default_perms(bs, c, role, reopen_queue, perm, shared,
|
||||
+ nperm, nshared);
|
||||
+
|
||||
+ *nperm |= s->take_child_perms;
|
||||
+ *nshared &= ~s->unshare_child_perms;
|
||||
+}
|
||||
+
|
||||
static const char *const blkdebug_strong_runtime_opts[] = {
|
||||
"config",
|
||||
"inject-error.",
|
||||
@@ -940,7 +1031,7 @@ static BlockDriver bdrv_blkdebug = {
|
||||
.bdrv_file_open = blkdebug_open,
|
||||
.bdrv_close = blkdebug_close,
|
||||
.bdrv_reopen_prepare = blkdebug_reopen_prepare,
|
||||
- .bdrv_child_perm = bdrv_filter_default_perms,
|
||||
+ .bdrv_child_perm = blkdebug_child_perm,
|
||||
|
||||
.bdrv_getlength = blkdebug_getlength,
|
||||
.bdrv_refresh_filename = blkdebug_refresh_filename,
|
||||
diff --git a/qapi/block-core.json b/qapi/block-core.json
|
||||
index 0cf68fea1450e6cb739863d2367c..bcf77d496289480b86b1c9d80374 100644
|
||||
--- a/qapi/block-core.json
|
||||
+++ b/qapi/block-core.json
|
||||
@@ -3450,6 +3450,16 @@
|
||||
#
|
||||
# @set-state: array of state-change descriptions
|
||||
#
|
||||
+# @take-child-perms: Permissions to take on @image in addition to what
|
||||
+# is necessary anyway (which depends on how the
|
||||
+# blkdebug node is used). Defaults to none.
|
||||
+# (since 5.0)
|
||||
+#
|
||||
+# @unshare-child-perms: Permissions not to share on @image in addition
|
||||
+# to what cannot be shared anyway (which depends
|
||||
+# on how the blkdebug node is used). Defaults
|
||||
+# to none. (since 5.0)
|
||||
+#
|
||||
# Since: 2.9
|
||||
##
|
||||
{ 'struct': 'BlockdevOptionsBlkdebug',
|
||||
@@ -3459,7 +3469,9 @@
|
||||
'*opt-write-zero': 'int32', '*max-write-zero': 'int32',
|
||||
'*opt-discard': 'int32', '*max-discard': 'int32',
|
||||
'*inject-error': ['BlkdebugInjectErrorOptions'],
|
||||
- '*set-state': ['BlkdebugSetStateOptions'] } }
|
||||
+ '*set-state': ['BlkdebugSetStateOptions'],
|
||||
+ '*take-child-perms': ['BlockPermission'],
|
||||
+ '*unshare-child-perms': ['BlockPermission'] } }
|
||||
|
||||
##
|
||||
# @BlockdevOptionsBlklogwrites:
|
@ -1,102 +0,0 @@
|
||||
From: Kevin Wolf <kwolf@redhat.com>
|
||||
Date: Tue, 17 Dec 2019 15:06:38 +0100
|
||||
Subject: block: Activate recursively even for already active nodes
|
||||
|
||||
Git-commit: 7bb4941ace471fc7dd6ded4749b95b9622baa6ed
|
||||
|
||||
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>
|
||||
Signed-off-by: Bruce Rogers <brogers@suse.com>
|
||||
---
|
||||
block.c | 50 ++++++++++++++++++++++++--------------------------
|
||||
1 file changed, 24 insertions(+), 26 deletions(-)
|
||||
|
||||
diff --git a/block.c b/block.c
|
||||
index 473eb6eeaabacbaea4e74869e93e..2e5e8b639a88d430e52ef40973c7 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,79 +0,0 @@
|
||||
From: Max Reitz <mreitz@redhat.com>
|
||||
Date: Fri, 8 Nov 2019 13:34:51 +0100
|
||||
Subject: block: Add bdrv_qapi_perm_to_blk_perm()
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
Git-commit: 7b1d9c4df0603fbc526226a9c5ef91118aa6c957
|
||||
|
||||
We need some way to correlate QAPI BlockPermission values with
|
||||
BLK_PERM_* flags. We could:
|
||||
|
||||
(1) have the same order in the QAPI definition as the the BLK_PERM_*
|
||||
flags are in LSb-first order. However, then there is no guarantee
|
||||
that they actually match (e.g. when someone modifies the QAPI schema
|
||||
without thinking of the BLK_PERM_* definitions).
|
||||
We could add static assertions, but these would break what’s good
|
||||
about this solution, namely its simplicity.
|
||||
|
||||
(2) define the BLK_PERM_* flags based on the BlockPermission values.
|
||||
But this way whenever someone were to modify the QAPI order
|
||||
(perfectly sensible in theory), the BLK_PERM_* values would change.
|
||||
Because these values are used for file locking, this might break
|
||||
file locking between different qemu versions.
|
||||
|
||||
Therefore, go the slightly more cumbersome way: Add a function to
|
||||
translate from the QAPI constants to the BLK_PERM_* flags.
|
||||
|
||||
Signed-off-by: Max Reitz <mreitz@redhat.com>
|
||||
Message-id: 20191108123455.39445-2-mreitz@redhat.com
|
||||
Reviewed-by: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>
|
||||
Signed-off-by: Max Reitz <mreitz@redhat.com>
|
||||
Signed-off-by: Bruce Rogers <brogers@suse.com>
|
||||
---
|
||||
block.c | 18 ++++++++++++++++++
|
||||
include/block/block.h | 1 +
|
||||
2 files changed, 19 insertions(+)
|
||||
|
||||
diff --git a/block.c b/block.c
|
||||
index 2e5e8b639a88d430e52ef40973c7..2cc16f99b352623272491c1cf254 100644
|
||||
--- a/block.c
|
||||
+++ b/block.c
|
||||
@@ -2227,6 +2227,24 @@ void bdrv_format_default_perms(BlockDriverState *bs, BdrvChild *c,
|
||||
*nshared = shared;
|
||||
}
|
||||
|
||||
+uint64_t bdrv_qapi_perm_to_blk_perm(BlockPermission qapi_perm)
|
||||
+{
|
||||
+ static const uint64_t permissions[] = {
|
||||
+ [BLOCK_PERMISSION_CONSISTENT_READ] = BLK_PERM_CONSISTENT_READ,
|
||||
+ [BLOCK_PERMISSION_WRITE] = BLK_PERM_WRITE,
|
||||
+ [BLOCK_PERMISSION_WRITE_UNCHANGED] = BLK_PERM_WRITE_UNCHANGED,
|
||||
+ [BLOCK_PERMISSION_RESIZE] = BLK_PERM_RESIZE,
|
||||
+ [BLOCK_PERMISSION_GRAPH_MOD] = BLK_PERM_GRAPH_MOD,
|
||||
+ };
|
||||
+
|
||||
+ QEMU_BUILD_BUG_ON(ARRAY_SIZE(permissions) != BLOCK_PERMISSION__MAX);
|
||||
+ QEMU_BUILD_BUG_ON(1UL << ARRAY_SIZE(permissions) != BLK_PERM_ALL + 1);
|
||||
+
|
||||
+ assert(qapi_perm < BLOCK_PERMISSION__MAX);
|
||||
+
|
||||
+ return permissions[qapi_perm];
|
||||
+}
|
||||
+
|
||||
static void bdrv_replace_child_noperm(BdrvChild *child,
|
||||
BlockDriverState *new_bs)
|
||||
{
|
||||
diff --git a/include/block/block.h b/include/block/block.h
|
||||
index 1df9848e7436eec47e6251118a2f..e9dcfef7fa463e7655b4ec4a0d7c 100644
|
||||
--- a/include/block/block.h
|
||||
+++ b/include/block/block.h
|
||||
@@ -280,6 +280,7 @@ enum {
|
||||
};
|
||||
|
||||
char *bdrv_perm_names(uint64_t perm);
|
||||
+uint64_t bdrv_qapi_perm_to_blk_perm(BlockPermission qapi_perm);
|
||||
|
||||
/* disk I/O throttling */
|
||||
void bdrv_init(void);
|
@ -1,33 +0,0 @@
|
||||
From: Eric Blake <eblake@redhat.com>
|
||||
Date: Fri, 20 Mar 2020 13:36:20 -0500
|
||||
Subject: block: Avoid memleak on qcow2 image info failure
|
||||
|
||||
Git-commit: 71eaec2e8c7c8d266137b5c5f42da0bd6d6b5eb7
|
||||
|
||||
If we fail to get bitmap info, we must not leak the encryption info.
|
||||
|
||||
Fixes: b8968c875f403
|
||||
Fixes: Coverity CID 1421894
|
||||
Signed-off-by: Eric Blake <eblake@redhat.com>
|
||||
Message-Id: <20200320183620.1112123-1-eblake@redhat.com>
|
||||
Reviewed-by: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>
|
||||
Reviewed-by: Andrey Shinkevich <andrey.shinkevich@virtuozzo.com>
|
||||
Tested-by: Andrey Shinkevich <andrey.shinkevich@virtuozzo.com>
|
||||
Signed-off-by: Max Reitz <mreitz@redhat.com>
|
||||
Signed-off-by: Bruce Rogers <brogers@suse.com>
|
||||
---
|
||||
block/qcow2.c | 1 +
|
||||
1 file changed, 1 insertion(+)
|
||||
|
||||
diff --git a/block/qcow2.c b/block/qcow2.c
|
||||
index 7c18721741eacfb7f6c2c1f0efe6..13e118e16f02f371c0f23c7aaa8d 100644
|
||||
--- a/block/qcow2.c
|
||||
+++ b/block/qcow2.c
|
||||
@@ -4800,6 +4800,7 @@ static ImageInfoSpecific *qcow2_get_specific_info(BlockDriverState *bs,
|
||||
if (local_err) {
|
||||
error_propagate(errp, local_err);
|
||||
qapi_free_ImageInfoSpecific(spec_info);
|
||||
+ qapi_free_QCryptoBlockInfo(encrypt_info);
|
||||
return NULL;
|
||||
}
|
||||
*spec_info->u.qcow2.data = (ImageInfoSpecificQCow2){
|
@ -1,50 +0,0 @@
|
||||
From: Max Reitz <mreitz@redhat.com>
|
||||
Date: Fri, 17 Jan 2020 11:58:58 +0100
|
||||
Subject: block: Fix VM size field width in snapshot dump
|
||||
|
||||
Git-commit: 804359b8b90f76d9d8fbe8d85a6544b68f107f10
|
||||
|
||||
When printing the snapshot list (e.g. with qemu-img snapshot -l), the VM
|
||||
size field is only seven characters wide. As of de38b5005e9, this is
|
||||
not necessarily sufficient: We generally print three digits, and this
|
||||
may require a decimal point. Also, the unit field grew from something
|
||||
as plain as "M" to " MiB". This means that number and unit may take up
|
||||
eight characters in total; but we also want spaces in front.
|
||||
|
||||
Considering previously the maximum width was four characters and the
|
||||
field width was chosen to be three characters wider, let us adjust the
|
||||
field width to be eleven now.
|
||||
|
||||
Fixes: de38b5005e946aa3714963ea4c501e279e7d3666
|
||||
Buglink: https://bugs.launchpad.net/qemu/+bug/1859989
|
||||
Signed-off-by: Max Reitz <mreitz@redhat.com>
|
||||
Message-Id: <20200117105859.241818-2-mreitz@redhat.com>
|
||||
Reviewed-by: Eric Blake <eblake@redhat.com>
|
||||
Signed-off-by: Max Reitz <mreitz@redhat.com>
|
||||
Signed-off-by: Bruce Rogers <brogers@suse.com>
|
||||
---
|
||||
block/qapi.c | 4 ++--
|
||||
1 file changed, 2 insertions(+), 2 deletions(-)
|
||||
|
||||
diff --git a/block/qapi.c b/block/qapi.c
|
||||
index 9a5d0c9b27d85d77f3c6d49dcd0e..ffa539250dc8f0d01374517e8e5b 100644
|
||||
--- a/block/qapi.c
|
||||
+++ b/block/qapi.c
|
||||
@@ -657,7 +657,7 @@ void bdrv_snapshot_dump(QEMUSnapshotInfo *sn)
|
||||
char *sizing = NULL;
|
||||
|
||||
if (!sn) {
|
||||
- qemu_printf("%-10s%-20s%7s%20s%15s",
|
||||
+ qemu_printf("%-10s%-20s%11s%20s%15s",
|
||||
"ID", "TAG", "VM SIZE", "DATE", "VM CLOCK");
|
||||
} else {
|
||||
ti = sn->date_sec;
|
||||
@@ -672,7 +672,7 @@ void bdrv_snapshot_dump(QEMUSnapshotInfo *sn)
|
||||
(int)(secs % 60),
|
||||
(int)((sn->vm_clock_nsec / 1000000) % 1000));
|
||||
sizing = size_to_str(sn->vm_state_size);
|
||||
- qemu_printf("%-10s%-20s%7s%20s%15s",
|
||||
+ qemu_printf("%-10s%-20s%11s%20s%15s",
|
||||
sn->id_str, sn->name,
|
||||
sizing,
|
||||
date_buf,
|
@ -1,47 +0,0 @@
|
||||
From: Eiichi Tsukata <devel@etsukata.com>
|
||||
Date: Mon, 23 Dec 2019 18:06:32 +0900
|
||||
Subject: block/backup: fix memory leak in bdrv_backup_top_append()
|
||||
|
||||
Git-commit: fb574de81bfdd71fdb0315105a3a7761efb68395
|
||||
|
||||
bdrv_open_driver() allocates bs->opaque according to drv->instance_size.
|
||||
There is no need to allocate it and overwrite opaque in
|
||||
bdrv_backup_top_append().
|
||||
|
||||
Reproducer:
|
||||
|
||||
$ QTEST_QEMU_BINARY=./x86_64-softmmu/qemu-system-x86_64 valgrind -q --leak-check=full tests/test-replication -p /replication/secondary/start
|
||||
==29792== 24 bytes in 1 blocks are definitely lost in loss record 52 of 226
|
||||
==29792== at 0x483AB1A: calloc (vg_replace_malloc.c:762)
|
||||
==29792== by 0x4B07CE0: g_malloc0 (in /usr/lib64/libglib-2.0.so.0.6000.7)
|
||||
==29792== by 0x12BAB9: bdrv_open_driver (block.c:1289)
|
||||
==29792== by 0x12BEA9: bdrv_new_open_driver (block.c:1359)
|
||||
==29792== by 0x1D15CB: bdrv_backup_top_append (backup-top.c:190)
|
||||
==29792== by 0x1CC11A: backup_job_create (backup.c:439)
|
||||
==29792== by 0x1CD542: replication_start (replication.c:544)
|
||||
==29792== by 0x1401B9: replication_start_all (replication.c:52)
|
||||
==29792== by 0x128B50: test_secondary_start (test-replication.c:427)
|
||||
...
|
||||
|
||||
Fixes: 7df7868b9640 ("block: introduce backup-top filter driver")
|
||||
Signed-off-by: Eiichi Tsukata <devel@etsukata.com>
|
||||
Reviewed-by: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>
|
||||
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
|
||||
Signed-off-by: Bruce Rogers <brogers@suse.com>
|
||||
---
|
||||
block/backup-top.c | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
diff --git a/block/backup-top.c b/block/backup-top.c
|
||||
index 818d3f26b48da425ba061e21887f..64e9e4f576ab27889fb4c0d8aa0a 100644
|
||||
--- a/block/backup-top.c
|
||||
+++ b/block/backup-top.c
|
||||
@@ -196,7 +196,7 @@ BlockDriverState *bdrv_backup_top_append(BlockDriverState *source,
|
||||
}
|
||||
|
||||
top->total_sectors = source->total_sectors;
|
||||
- top->opaque = state = g_new0(BDRVBackupTopState, 1);
|
||||
+ state = top->opaque;
|
||||
|
||||
bdrv_ref(target);
|
||||
state->target = bdrv_attach_child(top, target, "target", &child_file, errp);
|
@ -1,91 +0,0 @@
|
||||
From: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>
|
||||
Date: Tue, 21 Jan 2020 17:28:01 +0300
|
||||
Subject: block/backup-top: fix failure path
|
||||
|
||||
Git-commit 0df62f45c1de6c020f1e6fba4eeafd248209b003
|
||||
|
||||
We can't access top after call bdrv_backup_top_drop, as it is already
|
||||
freed at this time.
|
||||
|
||||
Also, no needs to unref target child by hand, it will be unrefed on
|
||||
bdrv_close() automatically.
|
||||
|
||||
So, just do bdrv_backup_top_drop if append succeed and one bdrv_unref
|
||||
otherwise.
|
||||
|
||||
Note, that in !appended case bdrv_unref(top) moved into drained section
|
||||
on source. It doesn't really matter, but just for code simplicity.
|
||||
|
||||
Fixes: 7df7868b96404
|
||||
Cc: qemu-stable@nongnu.org # v4.2.0
|
||||
Signed-off-by: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>
|
||||
Reviewed-by: Max Reitz <mreitz@redhat.com>
|
||||
Message-id: 20200121142802.21467-2-vsementsov@virtuozzo.com
|
||||
Signed-off-by: Max Reitz <mreitz@redhat.com>
|
||||
Signed-off-by: Bruce Rogers <brogers@suse.com>
|
||||
---
|
||||
block/backup-top.c | 21 ++++++++++++---------
|
||||
1 file changed, 12 insertions(+), 9 deletions(-)
|
||||
|
||||
diff --git a/block/backup-top.c b/block/backup-top.c
|
||||
index 64e9e4f576ab27889fb4c0d8aa0a..d214139a4d2f2694df7610394003 100644
|
||||
--- a/block/backup-top.c
|
||||
+++ b/block/backup-top.c
|
||||
@@ -190,6 +190,7 @@ BlockDriverState *bdrv_backup_top_append(BlockDriverState *source,
|
||||
BlockDriverState *top = bdrv_new_open_driver(&bdrv_backup_top_filter,
|
||||
filter_node_name,
|
||||
BDRV_O_RDWR, errp);
|
||||
+ bool appended = false;
|
||||
|
||||
if (!top) {
|
||||
return NULL;
|
||||
@@ -212,8 +213,9 @@ BlockDriverState *bdrv_backup_top_append(BlockDriverState *source,
|
||||
bdrv_append(top, source, &local_err);
|
||||
if (local_err) {
|
||||
error_prepend(&local_err, "Cannot append backup-top filter: ");
|
||||
- goto append_failed;
|
||||
+ goto fail;
|
||||
}
|
||||
+ appended = true;
|
||||
|
||||
/*
|
||||
* bdrv_append() finished successfully, now we can require permissions
|
||||
@@ -224,14 +226,14 @@ BlockDriverState *bdrv_backup_top_append(BlockDriverState *source,
|
||||
if (local_err) {
|
||||
error_prepend(&local_err,
|
||||
"Cannot set permissions for backup-top filter: ");
|
||||
- goto failed_after_append;
|
||||
+ goto fail;
|
||||
}
|
||||
|
||||
state->bcs = block_copy_state_new(top->backing, state->target,
|
||||
cluster_size, write_flags, &local_err);
|
||||
if (local_err) {
|
||||
error_prepend(&local_err, "Cannot create block-copy-state: ");
|
||||
- goto failed_after_append;
|
||||
+ goto fail;
|
||||
}
|
||||
*bcs = state->bcs;
|
||||
|
||||
@@ -239,14 +241,15 @@ BlockDriverState *bdrv_backup_top_append(BlockDriverState *source,
|
||||
|
||||
return top;
|
||||
|
||||
-failed_after_append:
|
||||
- state->active = false;
|
||||
- bdrv_backup_top_drop(top);
|
||||
+fail:
|
||||
+ if (appended) {
|
||||
+ state->active = false;
|
||||
+ bdrv_backup_top_drop(top);
|
||||
+ } else {
|
||||
+ bdrv_unref(top);
|
||||
+ }
|
||||
|
||||
-append_failed:
|
||||
bdrv_drained_end(source);
|
||||
- bdrv_unref_child(top, state->target);
|
||||
- bdrv_unref(top);
|
||||
error_propagate(errp, local_err);
|
||||
|
||||
return NULL;
|
@ -1,114 +0,0 @@
|
||||
From: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>
|
||||
Date: Mon, 16 Mar 2020 09:06:30 +0300
|
||||
Subject: block: bdrv_set_backing_bs: fix use-after-free
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
Git-commit: 6e57963a77df1e275a73dab4c6a7ec9a9d3468d4
|
||||
|
||||
There is a use-after-free possible: bdrv_unref_child() leaves
|
||||
bs->backing freed but not NULL. bdrv_attach_child may produce nested
|
||||
polling loop due to drain, than access of freed pointer is possible.
|
||||
|
||||
I've produced the following crash on 30 iotest with modified code. It
|
||||
does not reproduce on master, but still seems possible:
|
||||
|
||||
#0 __strcmp_avx2 () at /lib64/libc.so.6
|
||||
#1 bdrv_backing_overridden (bs=0x55c9d3cc2060) at block.c:6350
|
||||
#2 bdrv_refresh_filename (bs=0x55c9d3cc2060) at block.c:6404
|
||||
#3 bdrv_backing_attach (c=0x55c9d48e5520) at block.c:1063
|
||||
#4 bdrv_replace_child_noperm
|
||||
(child=child@entry=0x55c9d48e5520,
|
||||
new_bs=new_bs@entry=0x55c9d3cc2060) at block.c:2290
|
||||
#5 bdrv_replace_child
|
||||
(child=child@entry=0x55c9d48e5520,
|
||||
new_bs=new_bs@entry=0x55c9d3cc2060) at block.c:2320
|
||||
#6 bdrv_root_attach_child
|
||||
(child_bs=child_bs@entry=0x55c9d3cc2060,
|
||||
child_name=child_name@entry=0x55c9d241d478 "backing",
|
||||
child_role=child_role@entry=0x55c9d26ecee0 <child_backing>,
|
||||
ctx=<optimized out>, perm=<optimized out>, shared_perm=21,
|
||||
opaque=0x55c9d3c5a3d0, errp=0x7ffd117108e0) at block.c:2424
|
||||
#7 bdrv_attach_child
|
||||
(parent_bs=parent_bs@entry=0x55c9d3c5a3d0,
|
||||
child_bs=child_bs@entry=0x55c9d3cc2060,
|
||||
child_name=child_name@entry=0x55c9d241d478 "backing",
|
||||
child_role=child_role@entry=0x55c9d26ecee0 <child_backing>,
|
||||
errp=errp@entry=0x7ffd117108e0) at block.c:5876
|
||||
#8 in bdrv_set_backing_hd
|
||||
(bs=bs@entry=0x55c9d3c5a3d0,
|
||||
backing_hd=backing_hd@entry=0x55c9d3cc2060,
|
||||
errp=errp@entry=0x7ffd117108e0)
|
||||
at block.c:2576
|
||||
#9 stream_prepare (job=0x55c9d49d84a0) at block/stream.c:150
|
||||
#10 job_prepare (job=0x55c9d49d84a0) at job.c:761
|
||||
#11 job_txn_apply (txn=<optimized out>, fn=<optimized out>) at
|
||||
job.c:145
|
||||
#12 job_do_finalize (job=0x55c9d49d84a0) at job.c:778
|
||||
#13 job_completed_txn_success (job=0x55c9d49d84a0) at job.c:832
|
||||
#14 job_completed (job=0x55c9d49d84a0) at job.c:845
|
||||
#15 job_completed (job=0x55c9d49d84a0) at job.c:836
|
||||
#16 job_exit (opaque=0x55c9d49d84a0) at job.c:864
|
||||
#17 aio_bh_call (bh=0x55c9d471a160) at util/async.c:117
|
||||
#18 aio_bh_poll (ctx=ctx@entry=0x55c9d3c46720) at util/async.c:117
|
||||
#19 aio_poll (ctx=ctx@entry=0x55c9d3c46720,
|
||||
blocking=blocking@entry=true)
|
||||
at util/aio-posix.c:728
|
||||
#20 bdrv_parent_drained_begin_single (poll=true, c=0x55c9d3d558f0)
|
||||
at block/io.c:121
|
||||
#21 bdrv_parent_drained_begin_single (c=c@entry=0x55c9d3d558f0,
|
||||
poll=poll@entry=true)
|
||||
at block/io.c:114
|
||||
#22 bdrv_replace_child_noperm
|
||||
(child=child@entry=0x55c9d3d558f0,
|
||||
new_bs=new_bs@entry=0x55c9d3d27300) at block.c:2258
|
||||
#23 bdrv_replace_child
|
||||
(child=child@entry=0x55c9d3d558f0,
|
||||
new_bs=new_bs@entry=0x55c9d3d27300) at block.c:2320
|
||||
#24 bdrv_root_attach_child
|
||||
(child_bs=child_bs@entry=0x55c9d3d27300,
|
||||
child_name=child_name@entry=0x55c9d241d478 "backing",
|
||||
child_role=child_role@entry=0x55c9d26ecee0 <child_backing>,
|
||||
ctx=<optimized out>, perm=<optimized out>, shared_perm=21,
|
||||
opaque=0x55c9d3cc2060, errp=0x7ffd11710c60) at block.c:2424
|
||||
#25 bdrv_attach_child
|
||||
(parent_bs=parent_bs@entry=0x55c9d3cc2060,
|
||||
child_bs=child_bs@entry=0x55c9d3d27300,
|
||||
child_name=child_name@entry=0x55c9d241d478 "backing",
|
||||
child_role=child_role@entry=0x55c9d26ecee0 <child_backing>,
|
||||
errp=errp@entry=0x7ffd11710c60) at block.c:5876
|
||||
#26 bdrv_set_backing_hd
|
||||
(bs=bs@entry=0x55c9d3cc2060,
|
||||
backing_hd=backing_hd@entry=0x55c9d3d27300,
|
||||
errp=errp@entry=0x7ffd11710c60)
|
||||
at block.c:2576
|
||||
#27 stream_prepare (job=0x55c9d495ead0) at block/stream.c:150
|
||||
...
|
||||
|
||||
Signed-off-by: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>
|
||||
Message-Id: <20200316060631.30052-2-vsementsov@virtuozzo.com>
|
||||
Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com>
|
||||
Reviewed-by: John Snow <jsnow@redhat.com>
|
||||
Signed-off-by: Max Reitz <mreitz@redhat.com>
|
||||
Signed-off-by: Bruce Rogers <brogers@suse.com>
|
||||
---
|
||||
block.c | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
diff --git a/block.c b/block.c
|
||||
index 8539f99ac47cdbf0e9b823751074..3d0134f00b55e0400efc70058d00 100644
|
||||
--- a/block.c
|
||||
+++ b/block.c
|
||||
@@ -2577,10 +2577,10 @@ void bdrv_set_backing_hd(BlockDriverState *bs, BlockDriverState *backing_hd,
|
||||
|
||||
if (bs->backing) {
|
||||
bdrv_unref_child(bs, bs->backing);
|
||||
+ bs->backing = NULL;
|
||||
}
|
||||
|
||||
if (!backing_hd) {
|
||||
- bs->backing = NULL;
|
||||
goto out;
|
||||
}
|
||||
|
@ -1,195 +0,0 @@
|
||||
From: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>
|
||||
Date: Wed, 11 Mar 2020 13:29:57 +0300
|
||||
Subject: block/block-copy: fix progress calculation
|
||||
|
||||
Git-commit: d0ebeca14a585f352938062ef8ddde47fe4d39f9
|
||||
|
||||
Assume we have two regions, A and B, and region B is in-flight now,
|
||||
region A is not yet touched, but it is unallocated and should be
|
||||
skipped.
|
||||
|
||||
Correspondingly, as progress we have
|
||||
|
||||
total = A + B
|
||||
current = 0
|
||||
|
||||
If we reset unallocated region A and call progress_reset_callback,
|
||||
it will calculate 0 bytes dirty in the bitmap and call
|
||||
job_progress_set_remaining, which will set
|
||||
|
||||
total = current + 0 = 0 + 0 = 0
|
||||
|
||||
So, B bytes are actually removed from total accounting. When job
|
||||
finishes we'll have
|
||||
|
||||
total = 0
|
||||
current = B
|
||||
|
||||
, which doesn't sound good.
|
||||
|
||||
This is because we didn't considered in-flight bytes, actually when
|
||||
calculating remaining, we should have set (in_flight + dirty_bytes)
|
||||
as remaining, not only dirty_bytes.
|
||||
|
||||
To fix it, let's refactor progress calculation, moving it to block-copy
|
||||
itself instead of fixing callback. And, of course, track in_flight
|
||||
bytes count.
|
||||
|
||||
We still have to keep one callback, to maintain backup job bytes_read
|
||||
calculation, but it will go on soon, when we turn the whole backup
|
||||
process into one block_copy call.
|
||||
|
||||
Cc: qemu-stable@nongnu.org
|
||||
Signed-off-by: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>
|
||||
Reviewed-by: Andrey Shinkevich <andrey.shinkevich@virtuozzo.com>
|
||||
Message-Id: <20200311103004.7649-3-vsementsov@virtuozzo.com>
|
||||
Signed-off-by: Max Reitz <mreitz@redhat.com>
|
||||
Signed-off-by: Bruce Rogers <brogers@suse.com>
|
||||
---
|
||||
block/backup.c | 13 ++-----------
|
||||
block/block-copy.c | 16 ++++++++++++----
|
||||
include/block/block-copy.h | 15 +++++----------
|
||||
3 files changed, 19 insertions(+), 25 deletions(-)
|
||||
|
||||
diff --git a/block/backup.c b/block/backup.c
|
||||
index cf62b1a38ceacaa6785f0ec0d197..5f3bd2415a125e845441deafe3b5 100644
|
||||
--- a/block/backup.c
|
||||
+++ b/block/backup.c
|
||||
@@ -57,15 +57,6 @@ static void backup_progress_bytes_callback(int64_t bytes, void *opaque)
|
||||
BackupBlockJob *s = opaque;
|
||||
|
||||
s->bytes_read += bytes;
|
||||
- job_progress_update(&s->common.job, bytes);
|
||||
-}
|
||||
-
|
||||
-static void backup_progress_reset_callback(void *opaque)
|
||||
-{
|
||||
- BackupBlockJob *s = opaque;
|
||||
- uint64_t estimate = bdrv_get_dirty_count(s->bcs->copy_bitmap);
|
||||
-
|
||||
- job_progress_set_remaining(&s->common.job, estimate);
|
||||
}
|
||||
|
||||
static int coroutine_fn backup_do_cow(BackupBlockJob *job,
|
||||
@@ -461,8 +452,8 @@ BlockJob *backup_job_create(const char *job_id, BlockDriverState *bs,
|
||||
job->cluster_size = cluster_size;
|
||||
job->len = len;
|
||||
|
||||
- block_copy_set_callbacks(bcs, backup_progress_bytes_callback,
|
||||
- backup_progress_reset_callback, job);
|
||||
+ block_copy_set_progress_callback(bcs, backup_progress_bytes_callback, job);
|
||||
+ block_copy_set_progress_meter(bcs, &job->common.job.progress);
|
||||
|
||||
/* Required permissions are already taken by backup-top target */
|
||||
block_job_add_bdrv(&job->common, "target", target, 0, BLK_PERM_ALL,
|
||||
diff --git a/block/block-copy.c b/block/block-copy.c
|
||||
index 79798a1567b10d8b59b6bb045ca4..e2d7b3b887198b40a12a42073ac9 100644
|
||||
--- a/block/block-copy.c
|
||||
+++ b/block/block-copy.c
|
||||
@@ -127,17 +127,20 @@ BlockCopyState *block_copy_state_new(BdrvChild *source, BdrvChild *target,
|
||||
return s;
|
||||
}
|
||||
|
||||
-void block_copy_set_callbacks(
|
||||
+void block_copy_set_progress_callback(
|
||||
BlockCopyState *s,
|
||||
ProgressBytesCallbackFunc progress_bytes_callback,
|
||||
- ProgressResetCallbackFunc progress_reset_callback,
|
||||
void *progress_opaque)
|
||||
{
|
||||
s->progress_bytes_callback = progress_bytes_callback;
|
||||
- s->progress_reset_callback = progress_reset_callback;
|
||||
s->progress_opaque = progress_opaque;
|
||||
}
|
||||
|
||||
+void block_copy_set_progress_meter(BlockCopyState *s, ProgressMeter *pm)
|
||||
+{
|
||||
+ s->progress = pm;
|
||||
+}
|
||||
+
|
||||
/*
|
||||
* block_copy_do_copy
|
||||
*
|
||||
@@ -269,7 +272,9 @@ int64_t block_copy_reset_unallocated(BlockCopyState *s,
|
||||
|
||||
if (!ret) {
|
||||
bdrv_reset_dirty_bitmap(s->copy_bitmap, offset, bytes);
|
||||
- s->progress_reset_callback(s->progress_opaque);
|
||||
+ progress_set_remaining(s->progress,
|
||||
+ bdrv_get_dirty_count(s->copy_bitmap) +
|
||||
+ s->in_flight_bytes);
|
||||
}
|
||||
|
||||
*count = bytes;
|
||||
@@ -331,15 +336,18 @@ int coroutine_fn block_copy(BlockCopyState *s,
|
||||
trace_block_copy_process(s, start);
|
||||
|
||||
bdrv_reset_dirty_bitmap(s->copy_bitmap, start, chunk_end - start);
|
||||
+ s->in_flight_bytes += chunk_end - start;
|
||||
|
||||
co_get_from_shres(s->mem, chunk_end - start);
|
||||
ret = block_copy_do_copy(s, start, chunk_end, error_is_read);
|
||||
co_put_to_shres(s->mem, chunk_end - start);
|
||||
+ s->in_flight_bytes -= chunk_end - start;
|
||||
if (ret < 0) {
|
||||
bdrv_set_dirty_bitmap(s->copy_bitmap, start, chunk_end - start);
|
||||
break;
|
||||
}
|
||||
|
||||
+ progress_work_done(s->progress, chunk_end - start);
|
||||
s->progress_bytes_callback(chunk_end - start, s->progress_opaque);
|
||||
start = chunk_end;
|
||||
ret = 0;
|
||||
diff --git a/include/block/block-copy.h b/include/block/block-copy.h
|
||||
index 0a161724d77bddbb2e8bcfd0e913..9def00068c5ad12044cae0331853 100644
|
||||
--- a/include/block/block-copy.h
|
||||
+++ b/include/block/block-copy.h
|
||||
@@ -26,7 +26,6 @@ typedef struct BlockCopyInFlightReq {
|
||||
} BlockCopyInFlightReq;
|
||||
|
||||
typedef void (*ProgressBytesCallbackFunc)(int64_t bytes, void *opaque);
|
||||
-typedef void (*ProgressResetCallbackFunc)(void *opaque);
|
||||
typedef struct BlockCopyState {
|
||||
/*
|
||||
* BdrvChild objects are not owned or managed by block-copy. They are
|
||||
@@ -36,6 +35,7 @@ typedef struct BlockCopyState {
|
||||
BdrvChild *source;
|
||||
BdrvChild *target;
|
||||
BdrvDirtyBitmap *copy_bitmap;
|
||||
+ int64_t in_flight_bytes;
|
||||
int64_t cluster_size;
|
||||
bool use_copy_range;
|
||||
int64_t copy_size;
|
||||
@@ -60,15 +60,9 @@ typedef struct BlockCopyState {
|
||||
*/
|
||||
bool skip_unallocated;
|
||||
|
||||
+ ProgressMeter *progress;
|
||||
/* progress_bytes_callback: called when some copying progress is done. */
|
||||
ProgressBytesCallbackFunc progress_bytes_callback;
|
||||
-
|
||||
- /*
|
||||
- * progress_reset_callback: called when some bytes reset from copy_bitmap
|
||||
- * (see @skip_unallocated above). The callee is assumed to recalculate how
|
||||
- * many bytes remain based on the dirty bit count of copy_bitmap.
|
||||
- */
|
||||
- ProgressResetCallbackFunc progress_reset_callback;
|
||||
void *progress_opaque;
|
||||
|
||||
SharedResource *mem;
|
||||
@@ -79,12 +73,13 @@ BlockCopyState *block_copy_state_new(BdrvChild *source, BdrvChild *target,
|
||||
BdrvRequestFlags write_flags,
|
||||
Error **errp);
|
||||
|
||||
-void block_copy_set_callbacks(
|
||||
+void block_copy_set_progress_callback(
|
||||
BlockCopyState *s,
|
||||
ProgressBytesCallbackFunc progress_bytes_callback,
|
||||
- ProgressResetCallbackFunc progress_reset_callback,
|
||||
void *progress_opaque);
|
||||
|
||||
+void block_copy_set_progress_meter(BlockCopyState *s, ProgressMeter *pm);
|
||||
+
|
||||
void block_copy_state_free(BlockCopyState *s);
|
||||
|
||||
int64_t block_copy_reset_unallocated(BlockCopyState *s,
|
@ -1,101 +0,0 @@
|
||||
From: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>
|
||||
Date: Thu, 6 Feb 2020 19:42:45 +0300
|
||||
Subject: block: fix crash on zero-length unaligned write and read
|
||||
|
||||
Git-commit: ac9d00bf7b47acae6b0e42910d9ed55fef3af5b8
|
||||
|
||||
Commit 7a3f542fbd "block/io: refactor padding" occasionally dropped
|
||||
aligning for zero-length request: bdrv_init_padding() blindly return
|
||||
false if bytes == 0, like there is nothing to align.
|
||||
|
||||
This leads the following command to crash:
|
||||
|
||||
./qemu-io --image-opts -c 'write 1 0' \
|
||||
driver=blkdebug,align=512,image.driver=null-co,image.size=512
|
||||
|
||||
>> qemu-io: block/io.c:1955: bdrv_aligned_pwritev: Assertion
|
||||
`(offset & (align - 1)) == 0' failed.
|
||||
>> Aborted (core dumped)
|
||||
|
||||
Prior to 7a3f542fbd we does aligning of such zero requests. Instead of
|
||||
recovering this behavior let's just do nothing on such requests as it
|
||||
is useless.
|
||||
|
||||
Note that driver may have special meaning of zero-length reqeusts, like
|
||||
qcow2_co_pwritev_compressed_part, so we can't skip any zero-length
|
||||
operation. But for unaligned ones, we can't pass it to driver anyway.
|
||||
|
||||
This commit also fixes crash in iotest 80 running with -nocache:
|
||||
|
||||
./check -nocache -qcow2 80
|
||||
|
||||
which crashes on same assertion due to trying to read empty extra data
|
||||
in qcow2_do_read_snapshots().
|
||||
|
||||
Cc: qemu-stable@nongnu.org # v4.2
|
||||
Fixes: 7a3f542fbd
|
||||
Signed-off-by: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>
|
||||
Reviewed-by: Max Reitz <mreitz@redhat.com>
|
||||
Message-id: 20200206164245.17781-1-vsementsov@virtuozzo.com
|
||||
Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
|
||||
Signed-off-by: Bruce Rogers <brogers@suse.com>
|
||||
---
|
||||
block/io.c | 28 +++++++++++++++++++++++++++-
|
||||
1 file changed, 27 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/block/io.c b/block/io.c
|
||||
index f75777f5ea744aac5c9b5872f203..d1f1ee9138c7af82352e9277f22b 100644
|
||||
--- a/block/io.c
|
||||
+++ b/block/io.c
|
||||
@@ -1567,10 +1567,12 @@ static bool bdrv_init_padding(BlockDriverState *bs,
|
||||
pad->tail = align - pad->tail;
|
||||
}
|
||||
|
||||
- if ((!pad->head && !pad->tail) || !bytes) {
|
||||
+ if (!pad->head && !pad->tail) {
|
||||
return false;
|
||||
}
|
||||
|
||||
+ assert(bytes); /* Nothing good in aligning zero-length requests */
|
||||
+
|
||||
sum = pad->head + bytes + pad->tail;
|
||||
pad->buf_len = (sum > align && pad->head && pad->tail) ? 2 * align : align;
|
||||
pad->buf = qemu_blockalign(bs, pad->buf_len);
|
||||
@@ -1708,6 +1710,18 @@ int coroutine_fn bdrv_co_preadv_part(BdrvChild *child,
|
||||
return ret;
|
||||
}
|
||||
|
||||
+ if (bytes == 0 && !QEMU_IS_ALIGNED(offset, bs->bl.request_alignment)) {
|
||||
+ /*
|
||||
+ * Aligning zero request is nonsense. Even if driver has special meaning
|
||||
+ * of zero-length (like qcow2_co_pwritev_compressed_part), we can't pass
|
||||
+ * it to driver due to request_alignment.
|
||||
+ *
|
||||
+ * Still, no reason to return an error if someone do unaligned
|
||||
+ * zero-length read occasionally.
|
||||
+ */
|
||||
+ return 0;
|
||||
+ }
|
||||
+
|
||||
bdrv_inc_in_flight(bs);
|
||||
|
||||
/* Don't do copy-on-read if we read data before write operation */
|
||||
@@ -2115,6 +2129,18 @@ int coroutine_fn bdrv_co_pwritev_part(BdrvChild *child,
|
||||
return -ENOTSUP;
|
||||
}
|
||||
|
||||
+ if (bytes == 0 && !QEMU_IS_ALIGNED(offset, bs->bl.request_alignment)) {
|
||||
+ /*
|
||||
+ * Aligning zero request is nonsense. Even if driver has special meaning
|
||||
+ * of zero-length (like qcow2_co_pwritev_compressed_part), we can't pass
|
||||
+ * it to driver due to request_alignment.
|
||||
+ *
|
||||
+ * Still, no reason to return an error if someone do unaligned
|
||||
+ * zero-length write occasionally.
|
||||
+ */
|
||||
+ return 0;
|
||||
+ }
|
||||
+
|
||||
bdrv_inc_in_flight(bs);
|
||||
/*
|
||||
* Align write if necessary by performing a read-modify-write cycle.
|
@ -1,60 +0,0 @@
|
||||
From: Pan Nengyuan <pannengyuan@huawei.com>
|
||||
Date: Thu, 16 Jan 2020 16:56:00 +0800
|
||||
Subject: block: fix memleaks in bdrv_refresh_filename
|
||||
|
||||
Git-commit: cb8956144ccaccf23d5cc4167677e2c84fa5a9f8
|
||||
|
||||
If we call the qmp 'query-block' while qemu is working on
|
||||
'block-commit', it will cause memleaks, the memory leak stack is as
|
||||
follow:
|
||||
|
||||
Indirect leak of 12360 byte(s) in 3 object(s) allocated from:
|
||||
#0 0x7f80f0b6d970 in __interceptor_calloc (/lib64/libasan.so.5+0xef970)
|
||||
#1 0x7f80ee86049d in g_malloc0 (/lib64/libglib-2.0.so.0+0x5249d)
|
||||
#2 0x55ea95b5bb67 in qdict_new /mnt/sdb/qemu-4.2.0-rc0/qobject/qdict.c:29
|
||||
#3 0x55ea956cd043 in bdrv_refresh_filename /mnt/sdb/qemu-4.2.0-rc0/block.c:6427
|
||||
#4 0x55ea956cc950 in bdrv_refresh_filename /mnt/sdb/qemu-4.2.0-rc0/block.c:6399
|
||||
#5 0x55ea956cc950 in bdrv_refresh_filename /mnt/sdb/qemu-4.2.0-rc0/block.c:6399
|
||||
#6 0x55ea956cc950 in bdrv_refresh_filename /mnt/sdb/qemu-4.2.0-rc0/block.c:6399
|
||||
#7 0x55ea958818ea in bdrv_block_device_info /mnt/sdb/qemu-4.2.0-rc0/block/qapi.c:56
|
||||
#8 0x55ea958879de in bdrv_query_info /mnt/sdb/qemu-4.2.0-rc0/block/qapi.c:392
|
||||
#9 0x55ea9588b58f in qmp_query_block /mnt/sdb/qemu-4.2.0-rc0/block/qapi.c:578
|
||||
#10 0x55ea95567392 in qmp_marshal_query_block qapi/qapi-commands-block-core.c:95
|
||||
|
||||
Indirect leak of 4120 byte(s) in 1 object(s) allocated from:
|
||||
#0 0x7f80f0b6d970 in __interceptor_calloc (/lib64/libasan.so.5+0xef970)
|
||||
#1 0x7f80ee86049d in g_malloc0 (/lib64/libglib-2.0.so.0+0x5249d)
|
||||
#2 0x55ea95b5bb67 in qdict_new /mnt/sdb/qemu-4.2.0-rc0/qobject/qdict.c:29
|
||||
#3 0x55ea956cd043 in bdrv_refresh_filename /mnt/sdb/qemu-4.2.0-rc0/block.c:6427
|
||||
#4 0x55ea956cc950 in bdrv_refresh_filename /mnt/sdb/qemu-4.2.0-rc0/block.c:6399
|
||||
#5 0x55ea956cc950 in bdrv_refresh_filename /mnt/sdb/qemu-4.2.0-rc0/block.c:6399
|
||||
#6 0x55ea9569f301 in bdrv_backing_attach /mnt/sdb/qemu-4.2.0-rc0/block.c:1064
|
||||
#7 0x55ea956a99dd in bdrv_replace_child_noperm /mnt/sdb/qemu-4.2.0-rc0/block.c:2283
|
||||
#8 0x55ea956b9b53 in bdrv_replace_node /mnt/sdb/qemu-4.2.0-rc0/block.c:4196
|
||||
#9 0x55ea956b9e49 in bdrv_append /mnt/sdb/qemu-4.2.0-rc0/block.c:4236
|
||||
#10 0x55ea958c3472 in commit_start /mnt/sdb/qemu-4.2.0-rc0/block/commit.c:306
|
||||
#11 0x55ea94b68ab0 in qmp_block_commit /mnt/sdb/qemu-4.2.0-rc0/blockdev.c:3459
|
||||
#12 0x55ea9556a7a7 in qmp_marshal_block_commit qapi/qapi-commands-block-core.c:407
|
||||
|
||||
Fixes: bb808d5f5c0978828a974d547e6032402c339555
|
||||
Reported-by: Euler Robot <euler.robot@huawei.com>
|
||||
Signed-off-by: Pan Nengyuan <pannengyuan@huawei.com>
|
||||
Message-id: 20200116085600.24056-1-pannengyuan@huawei.com
|
||||
Signed-off-by: Max Reitz <mreitz@redhat.com>
|
||||
Signed-off-by: Bruce Rogers <brogers@suse.com>
|
||||
---
|
||||
block.c | 1 +
|
||||
1 file changed, 1 insertion(+)
|
||||
|
||||
diff --git a/block.c b/block.c
|
||||
index 2cc16f99b352623272491c1cf254..8539f99ac47cdbf0e9b823751074 100644
|
||||
--- a/block.c
|
||||
+++ b/block.c
|
||||
@@ -6426,6 +6426,7 @@ void bdrv_refresh_filename(BlockDriverState *bs)
|
||||
child->bs->exact_filename);
|
||||
pstrcpy(bs->filename, sizeof(bs->filename), child->bs->filename);
|
||||
|
||||
+ qobject_unref(bs->full_open_options);
|
||||
bs->full_open_options = qobject_ref(child->bs->full_open_options);
|
||||
|
||||
return;
|
@ -1,38 +0,0 @@
|
||||
From: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>
|
||||
Date: Thu, 12 Mar 2020 11:19:49 +0300
|
||||
Subject: block/io: fix bdrv_co_do_copy_on_readv
|
||||
|
||||
Git-commit: 4ab78b19189a81038e744728ed949d09aa477550
|
||||
|
||||
Prior to 1143ec5ebf4 it was OK to qemu_iovec_from_buf() from aligned-up
|
||||
buffer to original qiov, as qemu_iovec_from_buf() will stop at qiov end
|
||||
anyway.
|
||||
|
||||
But after 1143ec5ebf4 we assume that bdrv_co_do_copy_on_readv works on
|
||||
part of original qiov, defined by qiov_offset and bytes. So we must not
|
||||
touch qiov behind qiov_offset+bytes bound. Fix it.
|
||||
|
||||
Cc: qemu-stable@nongnu.org # v4.2
|
||||
Fixes: 1143ec5ebf4
|
||||
Signed-off-by: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>
|
||||
Reviewed-by: John Snow <jsnow@redhat.com>
|
||||
Message-id: 20200312081949.5350-1-vsementsov@virtuozzo.com
|
||||
Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
|
||||
Signed-off-by: Bruce Rogers <brogers@suse.com>
|
||||
---
|
||||
block/io.c | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
diff --git a/block/io.c b/block/io.c
|
||||
index d1f1ee9138c7af82352e9277f22b..c2c3aab9ee3d1d4d494ce98a6d8b 100644
|
||||
--- a/block/io.c
|
||||
+++ b/block/io.c
|
||||
@@ -1395,7 +1395,7 @@ static int coroutine_fn bdrv_co_do_copy_on_readv(BdrvChild *child,
|
||||
if (!(flags & BDRV_REQ_PREFETCH)) {
|
||||
qemu_iovec_from_buf(qiov, qiov_offset + progress,
|
||||
bounce_buffer + skip_bytes,
|
||||
- pnum - skip_bytes);
|
||||
+ MIN(pnum - skip_bytes, bytes - progress));
|
||||
}
|
||||
} else if (!(flags & BDRV_REQ_PREFETCH)) {
|
||||
/* Read directly into the destination */
|
@ -1,72 +0,0 @@
|
||||
From: Pan Nengyuan <pannengyuan@huawei.com>
|
||||
Date: Thu, 5 Dec 2019 11:45:27 +0800
|
||||
Subject: block/nbd: extract the common cleanup code
|
||||
|
||||
Git-commit: 7f493662be4045146a8f45119d8834c9088a0ad6
|
||||
|
||||
The BDRVNBDState cleanup code is common in two places, add
|
||||
nbd_clear_bdrvstate() function to do these cleanups.
|
||||
|
||||
Suggested-by: Stefano Garzarella <sgarzare@redhat.com>
|
||||
Signed-off-by: Pan Nengyuan <pannengyuan@huawei.com>
|
||||
Reviewed-by: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>
|
||||
Message-Id: <1575517528-44312-2-git-send-email-pannengyuan@huawei.com>
|
||||
Reviewed-by: Eric Blake <eblake@redhat.com>
|
||||
[eblake: fix compilation error and commit message]
|
||||
Signed-off-by: Eric Blake <eblake@redhat.com>
|
||||
Signed-off-by: Bruce Rogers <brogers@suse.com>
|
||||
---
|
||||
block/nbd.c | 26 +++++++++++++++-----------
|
||||
1 file changed, 15 insertions(+), 11 deletions(-)
|
||||
|
||||
diff --git a/block/nbd.c b/block/nbd.c
|
||||
index 5f18f78a9471b25c859bf8d4a743..6bb67152864954bb0e7b6f0145de 100644
|
||||
--- a/block/nbd.c
|
||||
+++ b/block/nbd.c
|
||||
@@ -94,6 +94,19 @@ typedef struct BDRVNBDState {
|
||||
|
||||
static int nbd_client_connect(BlockDriverState *bs, Error **errp);
|
||||
|
||||
+static void nbd_clear_bdrvstate(BDRVNBDState *s)
|
||||
+{
|
||||
+ object_unref(OBJECT(s->tlscreds));
|
||||
+ qapi_free_SocketAddress(s->saddr);
|
||||
+ s->saddr = NULL;
|
||||
+ g_free(s->export);
|
||||
+ s->export = NULL;
|
||||
+ g_free(s->tlscredsid);
|
||||
+ s->tlscredsid = NULL;
|
||||
+ g_free(s->x_dirty_bitmap);
|
||||
+ s->x_dirty_bitmap = NULL;
|
||||
+}
|
||||
+
|
||||
static void nbd_channel_error(BDRVNBDState *s, int ret)
|
||||
{
|
||||
if (ret == -EIO) {
|
||||
@@ -1864,11 +1877,7 @@ static int nbd_process_options(BlockDriverState *bs, QDict *options,
|
||||
|
||||
error:
|
||||
if (ret < 0) {
|
||||
- object_unref(OBJECT(s->tlscreds));
|
||||
- qapi_free_SocketAddress(s->saddr);
|
||||
- g_free(s->export);
|
||||
- g_free(s->tlscredsid);
|
||||
- g_free(s->x_dirty_bitmap);
|
||||
+ nbd_clear_bdrvstate(s);
|
||||
}
|
||||
qemu_opts_del(opts);
|
||||
return ret;
|
||||
@@ -1947,12 +1956,7 @@ static void nbd_close(BlockDriverState *bs)
|
||||
BDRVNBDState *s = bs->opaque;
|
||||
|
||||
nbd_client_close(bs);
|
||||
-
|
||||
- object_unref(OBJECT(s->tlscreds));
|
||||
- qapi_free_SocketAddress(s->saddr);
|
||||
- g_free(s->export);
|
||||
- g_free(s->tlscredsid);
|
||||
- g_free(s->x_dirty_bitmap);
|
||||
+ nbd_clear_bdrvstate(s);
|
||||
}
|
||||
|
||||
static int64_t nbd_getlength(BlockDriverState *bs)
|
@ -1,70 +0,0 @@
|
||||
From: Pan Nengyuan <pannengyuan@huawei.com>
|
||||
Date: Thu, 5 Dec 2019 11:45:28 +0800
|
||||
Subject: block/nbd: fix memory leak in nbd_open()
|
||||
|
||||
Git-commit: 8198cf5ef0ef98118b4176970d1cd998d93ec849
|
||||
|
||||
In currently implementation there will be a memory leak when
|
||||
nbd_client_connect() returns error status. Here is an easy way to
|
||||
reproduce:
|
||||
|
||||
1. run qemu-iotests as follow and check the result with asan:
|
||||
./check -raw 143
|
||||
|
||||
Following is the asan output backtrack:
|
||||
Direct leak of 40 byte(s) in 1 object(s) allocated from:
|
||||
#0 0x7f629688a560 in calloc (/usr/lib64/libasan.so.3+0xc7560)
|
||||
#1 0x7f6295e7e015 in g_malloc0 (/usr/lib64/libglib-2.0.so.0+0x50015)
|
||||
#2 0x56281dab4642 in qobject_input_start_struct /mnt/sdb/qemu-4.2.0-rc0/qapi/qobject-input-visitor.c:295
|
||||
#3 0x56281dab1a04 in visit_start_struct /mnt/sdb/qemu-4.2.0-rc0/qapi/qapi-visit-core.c:49
|
||||
#4 0x56281dad1827 in visit_type_SocketAddress qapi/qapi-visit-sockets.c:386
|
||||
#5 0x56281da8062f in nbd_config /mnt/sdb/qemu-4.2.0-rc0/block/nbd.c:1716
|
||||
#6 0x56281da8062f in nbd_process_options /mnt/sdb/qemu-4.2.0-rc0/block/nbd.c:1829
|
||||
#7 0x56281da8062f in nbd_open /mnt/sdb/qemu-4.2.0-rc0/block/nbd.c:1873
|
||||
|
||||
Direct leak of 15 byte(s) in 1 object(s) allocated from:
|
||||
#0 0x7f629688a3a0 in malloc (/usr/lib64/libasan.so.3+0xc73a0)
|
||||
#1 0x7f6295e7dfbd in g_malloc (/usr/lib64/libglib-2.0.so.0+0x4ffbd)
|
||||
#2 0x7f6295e96ace in g_strdup (/usr/lib64/libglib-2.0.so.0+0x68ace)
|
||||
#3 0x56281da804ac in nbd_process_options /mnt/sdb/qemu-4.2.0-rc0/block/nbd.c:1834
|
||||
#4 0x56281da804ac in nbd_open /mnt/sdb/qemu-4.2.0-rc0/block/nbd.c:1873
|
||||
|
||||
Indirect leak of 24 byte(s) in 1 object(s) allocated from:
|
||||
#0 0x7f629688a3a0 in malloc (/usr/lib64/libasan.so.3+0xc73a0)
|
||||
#1 0x7f6295e7dfbd in g_malloc (/usr/lib64/libglib-2.0.so.0+0x4ffbd)
|
||||
#2 0x7f6295e96ace in g_strdup (/usr/lib64/libglib-2.0.so.0+0x68ace)
|
||||
#3 0x56281dab41a3 in qobject_input_type_str_keyval /mnt/sdb/qemu-4.2.0-rc0/qapi/qobject-input-visitor.c:536
|
||||
#4 0x56281dab2ee9 in visit_type_str /mnt/sdb/qemu-4.2.0-rc0/qapi/qapi-visit-core.c:297
|
||||
#5 0x56281dad0fa1 in visit_type_UnixSocketAddress_members qapi/qapi-visit-sockets.c:141
|
||||
#6 0x56281dad17b6 in visit_type_SocketAddress_members qapi/qapi-visit-sockets.c:366
|
||||
#7 0x56281dad186a in visit_type_SocketAddress qapi/qapi-visit-sockets.c:393
|
||||
#8 0x56281da8062f in nbd_config /mnt/sdb/qemu-4.2.0-rc0/block/nbd.c:1716
|
||||
#9 0x56281da8062f in nbd_process_options /mnt/sdb/qemu-4.2.0-rc0/block/nbd.c:1829
|
||||
#10 0x56281da8062f in nbd_open /mnt/sdb/qemu-4.2.0-rc0/block/nbd.c:1873
|
||||
|
||||
Fixes: 8f071c9db506e03ab
|
||||
Reported-by: Euler Robot <euler.robot@huawei.com>
|
||||
Signed-off-by: Pan Nengyuan <pannengyuan@huawei.com>
|
||||
Reviewed-by: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>
|
||||
Cc: qemu-stable <qemu-stable@nongnu.org>
|
||||
Cc: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>
|
||||
Message-Id: <1575517528-44312-3-git-send-email-pannengyuan@huawei.com>
|
||||
Reviewed-by: Stefano Garzarella <sgarzare@redhat.com>
|
||||
Signed-off-by: Eric Blake <eblake@redhat.com>
|
||||
Signed-off-by: Bruce Rogers <brogers@suse.com>
|
||||
---
|
||||
block/nbd.c | 1 +
|
||||
1 file changed, 1 insertion(+)
|
||||
|
||||
diff --git a/block/nbd.c b/block/nbd.c
|
||||
index 6bb67152864954bb0e7b6f0145de..3d369fc8eb79df642bfd22cd8e88 100644
|
||||
--- a/block/nbd.c
|
||||
+++ b/block/nbd.c
|
||||
@@ -1900,6 +1900,7 @@ static int nbd_open(BlockDriverState *bs, QDict *options, int flags,
|
||||
|
||||
ret = nbd_client_connect(bs, errp);
|
||||
if (ret < 0) {
|
||||
+ nbd_clear_bdrvstate(s);
|
||||
return ret;
|
||||
}
|
||||
/* successfully connected */
|
@ -1,73 +0,0 @@
|
||||
From: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>
|
||||
Date: Mon, 2 Mar 2020 18:09:30 +0300
|
||||
Subject: block/qcow2-threads: fix qcow2_decompress
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
Git-commit: e7266570f2cf7b3ca2a156c677ee0a59d563458b
|
||||
|
||||
On success path we return what inflate() returns instead of 0. And it
|
||||
most probably works for Z_STREAM_END as it is positive, but is
|
||||
definitely broken for Z_BUF_ERROR.
|
||||
|
||||
While being here, switch to errno return code, to be closer to
|
||||
qcow2_compress API (and usual expectations).
|
||||
|
||||
Revert condition in if to be more positive. Drop dead initialization of
|
||||
ret.
|
||||
|
||||
Cc: qemu-stable@nongnu.org # v4.0
|
||||
Fixes: 341926ab83e2b
|
||||
Signed-off-by: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>
|
||||
Message-Id: <20200302150930.16218-1-vsementsov@virtuozzo.com>
|
||||
Reviewed-by: Alberto Garcia <berto@igalia.com>
|
||||
Reviewed-by: Ján Tomko <jtomko@redhat.com>
|
||||
Signed-off-by: Max Reitz <mreitz@redhat.com>
|
||||
Signed-off-by: Bruce Rogers <brogers@suse.com>
|
||||
---
|
||||
block/qcow2-threads.c | 12 +++++++-----
|
||||
1 file changed, 7 insertions(+), 5 deletions(-)
|
||||
|
||||
diff --git a/block/qcow2-threads.c b/block/qcow2-threads.c
|
||||
index 8f5a0d1ebe7182151ba99d9aeeff..0d193d16147cf2fc6a8dac23d885 100644
|
||||
--- a/block/qcow2-threads.c
|
||||
+++ b/block/qcow2-threads.c
|
||||
@@ -128,12 +128,12 @@ static ssize_t qcow2_compress(void *dest, size_t dest_size,
|
||||
* @src - source buffer, @src_size bytes
|
||||
*
|
||||
* Returns: 0 on success
|
||||
- * -1 on fail
|
||||
+ * -EIO on fail
|
||||
*/
|
||||
static ssize_t qcow2_decompress(void *dest, size_t dest_size,
|
||||
const void *src, size_t src_size)
|
||||
{
|
||||
- int ret = 0;
|
||||
+ int ret;
|
||||
z_stream strm;
|
||||
|
||||
memset(&strm, 0, sizeof(strm));
|
||||
@@ -144,17 +144,19 @@ static ssize_t qcow2_decompress(void *dest, size_t dest_size,
|
||||
|
||||
ret = inflateInit2(&strm, -12);
|
||||
if (ret != Z_OK) {
|
||||
- return -1;
|
||||
+ return -EIO;
|
||||
}
|
||||
|
||||
ret = inflate(&strm, Z_FINISH);
|
||||
- if ((ret != Z_STREAM_END && ret != Z_BUF_ERROR) || strm.avail_out != 0) {
|
||||
+ if ((ret == Z_STREAM_END || ret == Z_BUF_ERROR) && strm.avail_out == 0) {
|
||||
/*
|
||||
* We approve Z_BUF_ERROR because we need @dest buffer to be filled, but
|
||||
* @src buffer may be processed partly (because in qcow2 we know size of
|
||||
* compressed data with precision of one sector)
|
||||
*/
|
||||
- ret = -1;
|
||||
+ ret = 0;
|
||||
+ } else {
|
||||
+ ret = -EIO;
|
||||
}
|
||||
|
||||
inflateEnd(&strm);
|
@ -1,3 +1,3 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:0b749677c0f64b90dcc12394d2fa25dd94a3e278a26fa16939c3a641f18c3b7b
|
||||
size 153360
|
||||
oid sha256:7b48585377489cd7edb49ea0ca8195b1340f2d70d1c487aad8a71dd15dc333b3
|
||||
size 64676
|
||||
|
@ -1,41 +0,0 @@
|
||||
From: Cornelia Huck <cohuck@redhat.com>
|
||||
Date: Wed, 18 Mar 2020 10:39:19 +0100
|
||||
Subject: compat: disable edid on correct virtio-gpu device
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
Git-commit: 02501fc39381c4dabaf6becdd12c2a4754c3847c
|
||||
|
||||
Commit bb15791166c1 ("compat: disable edid on virtio-gpu base
|
||||
device") tried to disable 'edid' on the virtio-gpu base device.
|
||||
However, that device is not 'virtio-gpu', but 'virtio-gpu-device'.
|
||||
Fix it.
|
||||
|
||||
Fixes: bb15791166c1 ("compat: disable edid on virtio-gpu base device")
|
||||
Reported-by: Lukáš Doktor <ldoktor@redhat.com>
|
||||
Tested-by: Lukáš Doktor <ldoktor@redhat.com>
|
||||
Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com>
|
||||
Signed-off-by: Cornelia Huck <cohuck@redhat.com>
|
||||
Message-id: 20200318093919.24942-1-cohuck@redhat.com
|
||||
Cc: qemu-stable@nongnu.org
|
||||
Signed-off-by: Cornelia Huck <cohuck@redhat.com>
|
||||
Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
|
||||
Signed-off-by: Bruce Rogers <brogers@suse.com>
|
||||
---
|
||||
hw/core/machine.c | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
diff --git a/hw/core/machine.c b/hw/core/machine.c
|
||||
index a15c5a8673ade765965b4e2c8237..cfab784b02ce6076c827c10c9e9c 100644
|
||||
--- a/hw/core/machine.c
|
||||
+++ b/hw/core/machine.c
|
||||
@@ -37,7 +37,7 @@ GlobalProperty hw_compat_4_0[] = {
|
||||
{ "secondary-vga", "edid", "false" },
|
||||
{ "bochs-display", "edid", "false" },
|
||||
{ "virtio-vga", "edid", "false" },
|
||||
- { "virtio-gpu", "edid", "false" },
|
||||
+ { "virtio-gpu-device", "edid", "false" },
|
||||
{ "virtio-device", "use-started", "false" },
|
||||
{ "virtio-balloon-device", "qemu-4-0-config-size", "true" },
|
||||
{ "pl031", "migrate-tick-offset", "false" },
|
11
config.sh
11
config.sh
@ -7,17 +7,17 @@
|
||||
# The following specifies the upstream tag or commit upon which our patchqueue
|
||||
# gets rebased. The special value LATEST may be used to "automatically" track
|
||||
# the upstream development tree in the master branch
|
||||
GIT_UPSTREAM_COMMIT_ISH=v4.2.0
|
||||
GIT_UPSTREAM_COMMIT_ISH=v5.0.0
|
||||
# WARNING: If transitioning from using LATEST to not, MANUALLY re-set the
|
||||
# tarball present. If transitioning TO LATEST, make sure that
|
||||
# NEXT_RELEASE_IS_MAJOR is set correctly
|
||||
# This is used to choose the version number when LATEST processing is active
|
||||
NEXT_RELEASE_IS_MAJOR=1
|
||||
NEXT_RELEASE_IS_MAJOR=0
|
||||
|
||||
# Unfortunately, SeaBIOS doesn't always follow an "always increasing" version
|
||||
# model, so there may be times we should overide the automated version setting.
|
||||
# We can do so by specifing the value here:
|
||||
SEABIOS_VERSION=1.12.1+
|
||||
#SEABIOS_VERSION=1.13.0
|
||||
|
||||
# The shared git repo, on which $GIT_LOCAL_TREE is based
|
||||
GIT_TREE=git://github.com/openSUSE/qemu.git
|
||||
@ -31,7 +31,7 @@ BUNDLE_DIR=/dev/shm/qemu-factory-bundle-dir
|
||||
NUMBERED_PATCHES=0
|
||||
|
||||
PATCH_RANGE=1000
|
||||
REPO_COUNT=27
|
||||
REPO_COUNT=26
|
||||
|
||||
# Perhaps we need to instead use the terminal local dirname as the index
|
||||
# and store the ~/git/ as a separate VARIABLE
|
||||
@ -49,7 +49,6 @@ LOCAL_REPO_MAP=(
|
||||
~/git/qemu-keycodemapdb
|
||||
~/git/qemu-slirp
|
||||
~/git/qemu-u-boot
|
||||
~/git/qemu-openhackware
|
||||
~/git/qemu-qboot
|
||||
~/git/qemu-dtc
|
||||
~/git/qemu-opensbi
|
||||
@ -74,7 +73,6 @@ REQUIRED_LOCAL_REPO_MAP=(
|
||||
~/git/qemu-ipxe
|
||||
~/git/qemu-sgabios
|
||||
~/git/qemu-keycodemapdb
|
||||
~/git/qemu-slirp
|
||||
~/git/qemu-qboot
|
||||
)
|
||||
|
||||
@ -90,7 +88,6 @@ PATCH_PATH_MAP=(
|
||||
"ui/keycodemapdb/"
|
||||
"slirp/"
|
||||
"roms/u-boot/"
|
||||
"roms/openhackware/"
|
||||
"roms/qboot/"
|
||||
"dtc/"
|
||||
"roms/opensbi/"
|
||||
|
@ -12,10 +12,10 @@ Signed-off-by: Bruce Rogers <brogers@suse.com>
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
diff --git a/configure b/configure
|
||||
index 09a33aecfd6ef543eeee8c5023b6..94984691ab378620ac2e0ae771ca 100755
|
||||
index ef127fb1e0715da446b4a822e3ab..5a0a52e842df70b757252f89b74a 100755
|
||||
--- a/configure
|
||||
+++ b/configure
|
||||
@@ -6327,7 +6327,7 @@ if { test "$cpu" = "i386" || test "$cpu" = "x86_64"; } && \
|
||||
@@ -6495,7 +6495,7 @@ if { test "$cpu" = "i386" || test "$cpu" = "x86_64"; } && \
|
||||
fi
|
||||
|
||||
# Only build s390-ccw bios if we're on s390x and the compiler has -march=z900
|
||||
|
@ -18,10 +18,10 @@ Signed-off-by: Bruce Rogers <brogers@suse.com>
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
diff --git a/configure b/configure
|
||||
index 94984691ab378620ac2e0ae771ca..c68e378776336748b227013a1a3f 100755
|
||||
index 5a0a52e842df70b757252f89b74a..790337b204cdfa6d84b1f8524f90 100755
|
||||
--- a/configure
|
||||
+++ b/configure
|
||||
@@ -6811,7 +6811,7 @@ fi
|
||||
@@ -6939,7 +6939,7 @@ fi
|
||||
if test "$modules" = "yes"; then
|
||||
# $shacmd can generate a hash started with digit, which the compiler doesn't
|
||||
# like as an symbol. So prefix it with an underscore
|
||||
@ -29,4 +29,4 @@ index 94984691ab378620ac2e0ae771ca..c68e378776336748b227013a1a3f 100755
|
||||
+ echo "CONFIG_STAMP=_$( (echo $qemu_version; cat $0) | $shacmd - | cut -f1 -d\ )" >> $config_host_mak
|
||||
echo "CONFIG_MODULES=y" >> $config_host_mak
|
||||
fi
|
||||
if test "$have_x11" = "yes" && test "$need_x11" = "yes"; then
|
||||
if test "$module_upgrades" = "yes"; then
|
||||
|
@ -1,34 +0,0 @@
|
||||
From: Cameron Esfahani <dirty@apple.com>
|
||||
Date: Tue, 10 Dec 2019 13:27:54 -0800
|
||||
Subject: display/bochs-display: fix memory leak
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
Git-commit 0d82411d0e38a0de7829f97d04406765c8d2210d
|
||||
|
||||
Fix memory leak in bochs_display_update(). Leaks 304 bytes per frame.
|
||||
|
||||
Fixes: 33ebad54056
|
||||
Signed-off-by: Cameron Esfahani <dirty@apple.com>
|
||||
Message-Id: <d6c26e68db134c7b0c7ce8b61596ca2e65e01e12.1576013209.git.dirty@apple.com>
|
||||
Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com>
|
||||
Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
|
||||
Signed-off-by: Bruce Rogers <brogers@suse.com>
|
||||
---
|
||||
hw/display/bochs-display.c | 2 ++
|
||||
1 file changed, 2 insertions(+)
|
||||
|
||||
diff --git a/hw/display/bochs-display.c b/hw/display/bochs-display.c
|
||||
index dc1bd1641d3428247204993da0c3..215db9a231d3564289a3e7971098 100644
|
||||
--- a/hw/display/bochs-display.c
|
||||
+++ b/hw/display/bochs-display.c
|
||||
@@ -252,6 +252,8 @@ static void bochs_display_update(void *opaque)
|
||||
dpy_gfx_update(s->con, 0, ys,
|
||||
mode.width, y - ys);
|
||||
}
|
||||
+
|
||||
+ g_free(snap);
|
||||
}
|
||||
}
|
||||
|
27
docs-add-SUSE-support-statements-to-html.patch
Normal file
27
docs-add-SUSE-support-statements-to-html.patch
Normal file
@ -0,0 +1,27 @@
|
||||
From: Bruce Rogers <brogers@suse.com>
|
||||
Date: Tue, 28 Apr 2020 09:53:49 -0600
|
||||
Subject: docs: add SUSE support statements to html docs
|
||||
|
||||
Include-If: %if %{legacy_qemu_kvm} && 0%{?is_opensuse} == 0
|
||||
|
||||
We can fairly easily produce an html version of our support statements.
|
||||
Now that qemu includes fairly good html-based documentation, leverage it
|
||||
to expose our SUSE specific in-package support documentation.
|
||||
|
||||
Signed-off-by: Bruce Rogers <brogers@suse.com>
|
||||
---
|
||||
docs/index.html.in | 1 +
|
||||
1 file changed, 1 insertion(+)
|
||||
|
||||
diff --git a/docs/index.html.in b/docs/index.html.in
|
||||
index e9a160384cfe939a3bccc51e5da9..2a76ade7bfd053f359d7782c7473 100644
|
||||
--- a/docs/index.html.in
|
||||
+++ b/docs/index.html.in
|
||||
@@ -7,6 +7,7 @@
|
||||
<body>
|
||||
<h1>QEMU @@VERSION@@ Documentation</h1>
|
||||
<ul>
|
||||
+ <li><a href="/usr/share/doc/packages/qemu-kvm/kvm-supported.html">SUSE Support Statements</a></li>
|
||||
<li><a href="system/index.html">System Emulation User's Guide</a></li>
|
||||
<li><a href="user/index.html">User Mode Emulation User's Guide</a></li>
|
||||
<li><a href="tools/index.html">Tools Guide</a></li>
|
@ -17,7 +17,7 @@ Signed-off-by: Bruce Rogers <brogers@suse.com>
|
||||
1 file changed, 1 insertion(+)
|
||||
|
||||
diff --git a/hw/openrisc/openrisc_sim.c b/hw/openrisc/openrisc_sim.c
|
||||
index 79e70493fc77e50556a4a92a4231..bc4b71059ff6d922e3cdc83bfc79 100644
|
||||
index d08ce6181199aa1e75a7c5bc2157..02f5259e5e33272b17bba701f5d5 100644
|
||||
--- a/hw/openrisc/openrisc_sim.c
|
||||
+++ b/hw/openrisc/openrisc_sim.c
|
||||
@@ -134,6 +134,7 @@ static void openrisc_sim_init(MachineState *machine)
|
||||
|
@ -1,258 +0,0 @@
|
||||
From: Liu Jingqi <jingqi.liu@intel.com>
|
||||
Date: Fri, 13 Dec 2019 09:19:25 +0800
|
||||
Subject: hmat acpi: Build Memory Proximity Domain Attributes Structure(s)
|
||||
|
||||
Git-commit: e6f123c3b81241be33f1b763d0ff8b36d1ae9c1e
|
||||
References: jsc#SLE-8897
|
||||
|
||||
HMAT is defined in ACPI 6.3: 5.2.27 Heterogeneous Memory Attribute Table
|
||||
(HMAT). The specification references below link:
|
||||
http://www.uefi.org/sites/default/files/resources/ACPI_6_3_final_Jan30.pdf
|
||||
|
||||
It describes the memory attributes, such as memory side cache
|
||||
attributes and bandwidth and latency details, related to the
|
||||
Memory Proximity Domain. The software is
|
||||
expected to use this information as hint for optimization.
|
||||
|
||||
This structure describes Memory Proximity Domain Attributes by memory
|
||||
subsystem and its associativity with processor proximity domain as well as
|
||||
hint for memory usage.
|
||||
|
||||
In the linux kernel, the codes in drivers/acpi/hmat/hmat.c parse and report
|
||||
the platform's HMAT tables.
|
||||
|
||||
Acked-by: Markus Armbruster <armbru@redhat.com>
|
||||
Reviewed-by: Igor Mammedov <imammedo@redhat.com>
|
||||
Reviewed-by: Daniel Black <daniel@linux.ibm.com>
|
||||
Reviewed-by: Jonathan Cameron <Jonathan.Cameron@huawei.com>
|
||||
Signed-off-by: Liu Jingqi <jingqi.liu@intel.com>
|
||||
Signed-off-by: Tao Xu <tao3.xu@intel.com>
|
||||
Message-Id: <20191213011929.2520-5-tao3.xu@intel.com>
|
||||
Reviewed-by: Michael S. Tsirkin <mst@redhat.com>
|
||||
Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
|
||||
Signed-off-by: Bruce Rogers <brogers@suse.com>
|
||||
---
|
||||
hw/acpi/Kconfig | 7 ++-
|
||||
hw/acpi/Makefile.objs | 1 +
|
||||
hw/acpi/hmat.c | 99 +++++++++++++++++++++++++++++++++++++++++++
|
||||
hw/acpi/hmat.h | 42 ++++++++++++++++++
|
||||
hw/i386/acpi-build.c | 5 +++
|
||||
5 files changed, 152 insertions(+), 2 deletions(-)
|
||||
|
||||
diff --git a/hw/acpi/Kconfig b/hw/acpi/Kconfig
|
||||
index 12e3f1e86e62256bf274b554938b..54209c6f2f17d4ca0a737cb25403 100644
|
||||
--- a/hw/acpi/Kconfig
|
||||
+++ b/hw/acpi/Kconfig
|
||||
@@ -7,6 +7,7 @@ config ACPI_X86
|
||||
select ACPI_NVDIMM
|
||||
select ACPI_CPU_HOTPLUG
|
||||
select ACPI_MEMORY_HOTPLUG
|
||||
+ select ACPI_HMAT
|
||||
|
||||
config ACPI_X86_ICH
|
||||
bool
|
||||
@@ -23,6 +24,10 @@ config ACPI_NVDIMM
|
||||
bool
|
||||
depends on ACPI
|
||||
|
||||
+config ACPI_HMAT
|
||||
+ bool
|
||||
+ depends on ACPI
|
||||
+
|
||||
config ACPI_PCI
|
||||
bool
|
||||
depends on ACPI && PCI
|
||||
@@ -33,5 +38,3 @@ config ACPI_VMGENID
|
||||
depends on PC
|
||||
|
||||
config ACPI_HW_REDUCED
|
||||
- bool
|
||||
- depends on ACPI
|
||||
diff --git a/hw/acpi/Makefile.objs b/hw/acpi/Makefile.objs
|
||||
index 655a9c197341fed6fcea2062a30c..517bd88704769d8605dde18a6776 100644
|
||||
--- a/hw/acpi/Makefile.objs
|
||||
+++ b/hw/acpi/Makefile.objs
|
||||
@@ -7,6 +7,7 @@ common-obj-$(CONFIG_ACPI_CPU_HOTPLUG) += cpu.o
|
||||
common-obj-$(CONFIG_ACPI_NVDIMM) += nvdimm.o
|
||||
common-obj-$(CONFIG_ACPI_VMGENID) += vmgenid.o
|
||||
common-obj-$(CONFIG_ACPI_HW_REDUCED) += generic_event_device.o
|
||||
+common-obj-$(CONFIG_ACPI_HMAT) += hmat.o
|
||||
common-obj-$(call lnot,$(CONFIG_ACPI_X86)) += acpi-stub.o
|
||||
|
||||
common-obj-y += acpi_interface.o
|
||||
diff --git a/hw/acpi/hmat.c b/hw/acpi/hmat.c
|
||||
new file mode 100644
|
||||
index 0000000000000000000000000000000000000000..9ff79308a497fe40a1b0a2f9a043ad3bebb2c3cb
|
||||
--- /dev/null
|
||||
+++ b/hw/acpi/hmat.c
|
||||
@@ -0,0 +1,99 @@
|
||||
+/*
|
||||
+ * HMAT ACPI Implementation
|
||||
+ *
|
||||
+ * Copyright(C) 2019 Intel Corporation.
|
||||
+ *
|
||||
+ * Author:
|
||||
+ * Liu jingqi <jingqi.liu@linux.intel.com>
|
||||
+ * Tao Xu <tao3.xu@intel.com>
|
||||
+ *
|
||||
+ * HMAT is defined in ACPI 6.3: 5.2.27 Heterogeneous Memory Attribute Table
|
||||
+ * (HMAT)
|
||||
+ *
|
||||
+ * This library is free software; you can redistribute it and/or
|
||||
+ * modify it under the terms of the GNU Lesser General Public
|
||||
+ * License as published by the Free Software Foundation; either
|
||||
+ * version 2 of the License, or (at your option) any later version.
|
||||
+ *
|
||||
+ * This library 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
|
||||
+ * Lesser General Public License for more details.
|
||||
+ *
|
||||
+ * You should have received a copy of the GNU Lesser General Public
|
||||
+ * License along with this library; if not, see <http://www.gnu.org/licenses/>
|
||||
+ */
|
||||
+
|
||||
+#include "qemu/osdep.h"
|
||||
+#include "sysemu/numa.h"
|
||||
+#include "hw/acpi/hmat.h"
|
||||
+
|
||||
+/*
|
||||
+ * ACPI 6.3:
|
||||
+ * 5.2.27.3 Memory Proximity Domain Attributes Structure: Table 5-145
|
||||
+ */
|
||||
+static void build_hmat_mpda(GArray *table_data, uint16_t flags,
|
||||
+ uint32_t initiator, uint32_t mem_node)
|
||||
+{
|
||||
+
|
||||
+ /* Memory Proximity Domain Attributes Structure */
|
||||
+ /* Type */
|
||||
+ build_append_int_noprefix(table_data, 0, 2);
|
||||
+ /* Reserved */
|
||||
+ build_append_int_noprefix(table_data, 0, 2);
|
||||
+ /* Length */
|
||||
+ build_append_int_noprefix(table_data, 40, 4);
|
||||
+ /* Flags */
|
||||
+ build_append_int_noprefix(table_data, flags, 2);
|
||||
+ /* Reserved */
|
||||
+ build_append_int_noprefix(table_data, 0, 2);
|
||||
+ /* Proximity Domain for the Attached Initiator */
|
||||
+ build_append_int_noprefix(table_data, initiator, 4);
|
||||
+ /* Proximity Domain for the Memory */
|
||||
+ build_append_int_noprefix(table_data, mem_node, 4);
|
||||
+ /* Reserved */
|
||||
+ build_append_int_noprefix(table_data, 0, 4);
|
||||
+ /*
|
||||
+ * Reserved:
|
||||
+ * Previously defined as the Start Address of the System Physical
|
||||
+ * Address Range. Deprecated since ACPI Spec 6.3.
|
||||
+ */
|
||||
+ build_append_int_noprefix(table_data, 0, 8);
|
||||
+ /*
|
||||
+ * Reserved:
|
||||
+ * Previously defined as the Range Length of the region in bytes.
|
||||
+ * Deprecated since ACPI Spec 6.3.
|
||||
+ */
|
||||
+ build_append_int_noprefix(table_data, 0, 8);
|
||||
+}
|
||||
+
|
||||
+/* Build HMAT sub table structures */
|
||||
+static void hmat_build_table_structs(GArray *table_data, NumaState *numa_state)
|
||||
+{
|
||||
+ uint16_t flags;
|
||||
+ int i;
|
||||
+
|
||||
+ for (i = 0; i < numa_state->num_nodes; i++) {
|
||||
+ flags = 0;
|
||||
+
|
||||
+ if (numa_state->nodes[i].initiator < MAX_NODES) {
|
||||
+ flags |= HMAT_PROXIMITY_INITIATOR_VALID;
|
||||
+ }
|
||||
+
|
||||
+ build_hmat_mpda(table_data, flags, numa_state->nodes[i].initiator, i);
|
||||
+ }
|
||||
+}
|
||||
+
|
||||
+void build_hmat(GArray *table_data, BIOSLinker *linker, NumaState *numa_state)
|
||||
+{
|
||||
+ int hmat_start = table_data->len;
|
||||
+
|
||||
+ /* reserve space for HMAT header */
|
||||
+ acpi_data_push(table_data, 40);
|
||||
+
|
||||
+ hmat_build_table_structs(table_data, numa_state);
|
||||
+
|
||||
+ build_header(linker, table_data,
|
||||
+ (void *)(table_data->data + hmat_start),
|
||||
+ "HMAT", table_data->len - hmat_start, 2, NULL, NULL);
|
||||
+}
|
||||
diff --git a/hw/acpi/hmat.h b/hw/acpi/hmat.h
|
||||
new file mode 100644
|
||||
index 0000000000000000000000000000000000000000..437dbc6872e82e4c1ae42a9ff16299465eec052f
|
||||
--- /dev/null
|
||||
+++ b/hw/acpi/hmat.h
|
||||
@@ -0,0 +1,42 @@
|
||||
+/*
|
||||
+ * HMAT ACPI Implementation Header
|
||||
+ *
|
||||
+ * Copyright(C) 2019 Intel Corporation.
|
||||
+ *
|
||||
+ * Author:
|
||||
+ * Liu jingqi <jingqi.liu@linux.intel.com>
|
||||
+ * Tao Xu <tao3.xu@intel.com>
|
||||
+ *
|
||||
+ * HMAT is defined in ACPI 6.3: 5.2.27 Heterogeneous Memory Attribute Table
|
||||
+ * (HMAT)
|
||||
+ *
|
||||
+ * This library is free software; you can redistribute it and/or
|
||||
+ * modify it under the terms of the GNU Lesser General Public
|
||||
+ * License as published by the Free Software Foundation; either
|
||||
+ * version 2 of the License, or (at your option) any later version.
|
||||
+ *
|
||||
+ * This library 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
|
||||
+ * Lesser General Public License for more details.
|
||||
+ *
|
||||
+ * You should have received a copy of the GNU Lesser General Public
|
||||
+ * License along with this library; if not, see <http://www.gnu.org/licenses/>
|
||||
+ */
|
||||
+
|
||||
+#ifndef HMAT_H
|
||||
+#define HMAT_H
|
||||
+
|
||||
+#include "hw/acpi/aml-build.h"
|
||||
+
|
||||
+/*
|
||||
+ * ACPI 6.3: 5.2.27.3 Memory Proximity Domain Attributes Structure,
|
||||
+ * Table 5-145, Field "flag", Bit [0]: set to 1 to indicate that data in
|
||||
+ * the Proximity Domain for the Attached Initiator field is valid.
|
||||
+ * Other bits reserved.
|
||||
+ */
|
||||
+#define HMAT_PROXIMITY_INITIATOR_VALID 0x1
|
||||
+
|
||||
+void build_hmat(GArray *table_data, BIOSLinker *linker, NumaState *numa_state);
|
||||
+
|
||||
+#endif
|
||||
diff --git a/hw/i386/acpi-build.c b/hw/i386/acpi-build.c
|
||||
index 12ff55fcfb543208c18ba44d569e..90a9c2ce6f8c01221efc56f63f79 100644
|
||||
--- a/hw/i386/acpi-build.c
|
||||
+++ b/hw/i386/acpi-build.c
|
||||
@@ -67,6 +67,7 @@
|
||||
#include "hw/i386/intel_iommu.h"
|
||||
|
||||
#include "hw/acpi/ipmi.h"
|
||||
+#include "hw/acpi/hmat.h"
|
||||
|
||||
/* These are used to size the ACPI tables for -M pc-i440fx-1.7 and
|
||||
* -M pc-i440fx-2.0. Even if the actual amount of AML generated grows
|
||||
@@ -2834,6 +2835,10 @@ void acpi_build(AcpiBuildTables *tables, MachineState *machine)
|
||||
acpi_add_table(table_offsets, tables_blob);
|
||||
build_slit(tables_blob, tables->linker, machine);
|
||||
}
|
||||
+ if (machine->numa_state->hmat_enabled) {
|
||||
+ acpi_add_table(table_offsets, tables_blob);
|
||||
+ build_hmat(tables_blob, tables->linker, machine->numa_state);
|
||||
+ }
|
||||
}
|
||||
if (acpi_get_mcfg(&mcfg)) {
|
||||
acpi_add_table(table_offsets, tables_blob);
|
@ -1,122 +0,0 @@
|
||||
From: Liu Jingqi <jingqi.liu@intel.com>
|
||||
Date: Fri, 13 Dec 2019 09:19:27 +0800
|
||||
Subject: hmat acpi: Build Memory Side Cache Information Structure(s)
|
||||
|
||||
Git-commit: a9c2b841af002db6e21e1297c9026b63fc22c875
|
||||
References: jsc#SLE-8897
|
||||
|
||||
This structure describes memory side cache information for memory
|
||||
proximity domains if the memory side cache is present and the
|
||||
physical device forms the memory side cache.
|
||||
The software could use this information to effectively place
|
||||
the data in memory to maximize the performance of the system
|
||||
memory that use the memory side cache.
|
||||
|
||||
Acked-by: Markus Armbruster <armbru@redhat.com>
|
||||
Reviewed-by: Igor Mammedov <imammedo@redhat.com>
|
||||
Reviewed-by: Daniel Black <daniel@linux.ibm.com>
|
||||
Reviewed-by: Jonathan Cameron <Jonathan.Cameron@huawei.com>
|
||||
Signed-off-by: Liu Jingqi <jingqi.liu@intel.com>
|
||||
Signed-off-by: Tao Xu <tao3.xu@intel.com>
|
||||
Message-Id: <20191213011929.2520-7-tao3.xu@intel.com>
|
||||
Reviewed-by: Michael S. Tsirkin <mst@redhat.com>
|
||||
Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
|
||||
Signed-off-by: Bruce Rogers <brogers@suse.com>
|
||||
---
|
||||
hw/acpi/hmat.c | 69 +++++++++++++++++++++++++++++++++++++++++++++++++-
|
||||
1 file changed, 68 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/hw/acpi/hmat.c b/hw/acpi/hmat.c
|
||||
index 4635d45deeccd34659f6c8325d66..7c24bb53719e497d5cc6cf3f262e 100644
|
||||
--- a/hw/acpi/hmat.c
|
||||
+++ b/hw/acpi/hmat.c
|
||||
@@ -143,14 +143,62 @@ static void build_hmat_lb(GArray *table_data, HMAT_LB_Info *hmat_lb,
|
||||
g_free(entry_list);
|
||||
}
|
||||
|
||||
+/* ACPI 6.3: 5.2.27.5 Memory Side Cache Information Structure: Table 5-147 */
|
||||
+static void build_hmat_cache(GArray *table_data, uint8_t total_levels,
|
||||
+ NumaHmatCacheOptions *hmat_cache)
|
||||
+{
|
||||
+ /*
|
||||
+ * Cache Attributes: Bits [3:0] – Total Cache Levels
|
||||
+ * for this Memory Proximity Domain
|
||||
+ */
|
||||
+ uint32_t cache_attr = total_levels;
|
||||
+
|
||||
+ /* Bits [7:4] : Cache Level described in this structure */
|
||||
+ cache_attr |= (uint32_t) hmat_cache->level << 4;
|
||||
+
|
||||
+ /* Bits [11:8] - Cache Associativity */
|
||||
+ cache_attr |= (uint32_t) hmat_cache->associativity << 8;
|
||||
+
|
||||
+ /* Bits [15:12] - Write Policy */
|
||||
+ cache_attr |= (uint32_t) hmat_cache->policy << 12;
|
||||
+
|
||||
+ /* Bits [31:16] - Cache Line size in bytes */
|
||||
+ cache_attr |= (uint32_t) hmat_cache->line << 16;
|
||||
+
|
||||
+ /* Type */
|
||||
+ build_append_int_noprefix(table_data, 2, 2);
|
||||
+ /* Reserved */
|
||||
+ build_append_int_noprefix(table_data, 0, 2);
|
||||
+ /* Length */
|
||||
+ build_append_int_noprefix(table_data, 32, 4);
|
||||
+ /* Proximity Domain for the Memory */
|
||||
+ build_append_int_noprefix(table_data, hmat_cache->node_id, 4);
|
||||
+ /* Reserved */
|
||||
+ build_append_int_noprefix(table_data, 0, 4);
|
||||
+ /* Memory Side Cache Size */
|
||||
+ build_append_int_noprefix(table_data, hmat_cache->size, 8);
|
||||
+ /* Cache Attributes */
|
||||
+ build_append_int_noprefix(table_data, cache_attr, 4);
|
||||
+ /* Reserved */
|
||||
+ build_append_int_noprefix(table_data, 0, 2);
|
||||
+ /*
|
||||
+ * Number of SMBIOS handles (n)
|
||||
+ * Linux kernel uses Memory Side Cache Information Structure
|
||||
+ * without SMBIOS entries for now, so set Number of SMBIOS handles
|
||||
+ * as 0.
|
||||
+ */
|
||||
+ build_append_int_noprefix(table_data, 0, 2);
|
||||
+}
|
||||
+
|
||||
/* Build HMAT sub table structures */
|
||||
static void hmat_build_table_structs(GArray *table_data, NumaState *numa_state)
|
||||
{
|
||||
uint16_t flags;
|
||||
uint32_t num_initiator = 0;
|
||||
uint32_t initiator_list[MAX_NODES];
|
||||
- int i, hierarchy, type;
|
||||
+ int i, hierarchy, type, cache_level, total_levels;
|
||||
HMAT_LB_Info *hmat_lb;
|
||||
+ NumaHmatCacheOptions *hmat_cache;
|
||||
|
||||
for (i = 0; i < numa_state->num_nodes; i++) {
|
||||
flags = 0;
|
||||
@@ -184,6 +232,25 @@ static void hmat_build_table_structs(GArray *table_data, NumaState *numa_state)
|
||||
}
|
||||
}
|
||||
}
|
||||
+
|
||||
+ /*
|
||||
+ * ACPI 6.3: 5.2.27.5 Memory Side Cache Information Structure:
|
||||
+ * Table 5-147
|
||||
+ */
|
||||
+ for (i = 0; i < numa_state->num_nodes; i++) {
|
||||
+ total_levels = 0;
|
||||
+ for (cache_level = 1; cache_level < HMAT_LB_LEVELS; cache_level++) {
|
||||
+ if (numa_state->hmat_cache[i][cache_level]) {
|
||||
+ total_levels++;
|
||||
+ }
|
||||
+ }
|
||||
+ for (cache_level = 0; cache_level <= total_levels; cache_level++) {
|
||||
+ hmat_cache = numa_state->hmat_cache[i][cache_level];
|
||||
+ if (hmat_cache) {
|
||||
+ build_hmat_cache(table_data, total_levels, hmat_cache);
|
||||
+ }
|
||||
+ }
|
||||
+ }
|
||||
}
|
||||
|
||||
void build_hmat(GArray *table_data, BIOSLinker *linker, NumaState *numa_state)
|
@ -1,159 +0,0 @@
|
||||
From: Liu Jingqi <jingqi.liu@intel.com>
|
||||
Date: Fri, 13 Dec 2019 09:19:26 +0800
|
||||
Subject: hmat acpi: Build System Locality Latency and Bandwidth Information
|
||||
Structure(s)
|
||||
|
||||
Git-commit: 4586a2cb833f80b19c80ebe364a005ac2fa0974a
|
||||
References: jsc#SLE-8897
|
||||
|
||||
This structure describes the memory access latency and bandwidth
|
||||
information from various memory access initiator proximity domains.
|
||||
The latency and bandwidth numbers represented in this structure
|
||||
correspond to rated latency and bandwidth for the platform.
|
||||
The software could use this information as hint for optimization.
|
||||
|
||||
Acked-by: Markus Armbruster <armbru@redhat.com>
|
||||
Reviewed-by: Igor Mammedov <imammedo@redhat.com>
|
||||
Signed-off-by: Liu Jingqi <jingqi.liu@intel.com>
|
||||
Signed-off-by: Tao Xu <tao3.xu@intel.com>
|
||||
Message-Id: <20191213011929.2520-6-tao3.xu@intel.com>
|
||||
Reviewed-by: Michael S. Tsirkin <mst@redhat.com>
|
||||
Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
|
||||
Signed-off-by: Bruce Rogers <brogers@suse.com>
|
||||
---
|
||||
hw/acpi/hmat.c | 104 ++++++++++++++++++++++++++++++++++++++++++++++++-
|
||||
1 file changed, 103 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/hw/acpi/hmat.c b/hw/acpi/hmat.c
|
||||
index 9ff79308a497fe40a1b0a2f9a043..4635d45deeccd34659f6c8325d66 100644
|
||||
--- a/hw/acpi/hmat.c
|
||||
+++ b/hw/acpi/hmat.c
|
||||
@@ -25,6 +25,7 @@
|
||||
*/
|
||||
|
||||
#include "qemu/osdep.h"
|
||||
+#include "qemu/units.h"
|
||||
#include "sysemu/numa.h"
|
||||
#include "hw/acpi/hmat.h"
|
||||
|
||||
@@ -67,11 +68,89 @@ static void build_hmat_mpda(GArray *table_data, uint16_t flags,
|
||||
build_append_int_noprefix(table_data, 0, 8);
|
||||
}
|
||||
|
||||
+/*
|
||||
+ * ACPI 6.3: 5.2.27.4 System Locality Latency and Bandwidth Information
|
||||
+ * Structure: Table 5-146
|
||||
+ */
|
||||
+static void build_hmat_lb(GArray *table_data, HMAT_LB_Info *hmat_lb,
|
||||
+ uint32_t num_initiator, uint32_t num_target,
|
||||
+ uint32_t *initiator_list)
|
||||
+{
|
||||
+ int i, index;
|
||||
+ HMAT_LB_Data *lb_data;
|
||||
+ uint16_t *entry_list;
|
||||
+ uint32_t base;
|
||||
+ /* Length in bytes for entire structure */
|
||||
+ uint32_t lb_length
|
||||
+ = 32 /* Table length upto and including Entry Base Unit */
|
||||
+ + 4 * num_initiator /* Initiator Proximity Domain List */
|
||||
+ + 4 * num_target /* Target Proximity Domain List */
|
||||
+ + 2 * num_initiator * num_target; /* Latency or Bandwidth Entries */
|
||||
+
|
||||
+ /* Type */
|
||||
+ build_append_int_noprefix(table_data, 1, 2);
|
||||
+ /* Reserved */
|
||||
+ build_append_int_noprefix(table_data, 0, 2);
|
||||
+ /* Length */
|
||||
+ build_append_int_noprefix(table_data, lb_length, 4);
|
||||
+ /* Flags: Bits [3:0] Memory Hierarchy, Bits[7:4] Reserved */
|
||||
+ assert(!(hmat_lb->hierarchy >> 4));
|
||||
+ build_append_int_noprefix(table_data, hmat_lb->hierarchy, 1);
|
||||
+ /* Data Type */
|
||||
+ build_append_int_noprefix(table_data, hmat_lb->data_type, 1);
|
||||
+ /* Reserved */
|
||||
+ build_append_int_noprefix(table_data, 0, 2);
|
||||
+ /* Number of Initiator Proximity Domains (s) */
|
||||
+ build_append_int_noprefix(table_data, num_initiator, 4);
|
||||
+ /* Number of Target Proximity Domains (t) */
|
||||
+ build_append_int_noprefix(table_data, num_target, 4);
|
||||
+ /* Reserved */
|
||||
+ build_append_int_noprefix(table_data, 0, 4);
|
||||
+
|
||||
+ /* Entry Base Unit */
|
||||
+ if (hmat_lb->data_type <= HMAT_LB_DATA_WRITE_LATENCY) {
|
||||
+ /* Convert latency base from nanoseconds to picosecond */
|
||||
+ base = hmat_lb->base * 1000;
|
||||
+ } else {
|
||||
+ /* Convert bandwidth base from Byte to Megabyte */
|
||||
+ base = hmat_lb->base / MiB;
|
||||
+ }
|
||||
+ build_append_int_noprefix(table_data, base, 8);
|
||||
+
|
||||
+ /* Initiator Proximity Domain List */
|
||||
+ for (i = 0; i < num_initiator; i++) {
|
||||
+ build_append_int_noprefix(table_data, initiator_list[i], 4);
|
||||
+ }
|
||||
+
|
||||
+ /* Target Proximity Domain List */
|
||||
+ for (i = 0; i < num_target; i++) {
|
||||
+ build_append_int_noprefix(table_data, i, 4);
|
||||
+ }
|
||||
+
|
||||
+ /* Latency or Bandwidth Entries */
|
||||
+ entry_list = g_malloc0(num_initiator * num_target * sizeof(uint16_t));
|
||||
+ for (i = 0; i < hmat_lb->list->len; i++) {
|
||||
+ lb_data = &g_array_index(hmat_lb->list, HMAT_LB_Data, i);
|
||||
+ index = lb_data->initiator * num_target + lb_data->target;
|
||||
+
|
||||
+ entry_list[index] = (uint16_t)(lb_data->data / hmat_lb->base);
|
||||
+ }
|
||||
+
|
||||
+ for (i = 0; i < num_initiator * num_target; i++) {
|
||||
+ build_append_int_noprefix(table_data, entry_list[i], 2);
|
||||
+ }
|
||||
+
|
||||
+ g_free(entry_list);
|
||||
+}
|
||||
+
|
||||
/* Build HMAT sub table structures */
|
||||
static void hmat_build_table_structs(GArray *table_data, NumaState *numa_state)
|
||||
{
|
||||
uint16_t flags;
|
||||
- int i;
|
||||
+ uint32_t num_initiator = 0;
|
||||
+ uint32_t initiator_list[MAX_NODES];
|
||||
+ int i, hierarchy, type;
|
||||
+ HMAT_LB_Info *hmat_lb;
|
||||
|
||||
for (i = 0; i < numa_state->num_nodes; i++) {
|
||||
flags = 0;
|
||||
@@ -82,6 +161,29 @@ static void hmat_build_table_structs(GArray *table_data, NumaState *numa_state)
|
||||
|
||||
build_hmat_mpda(table_data, flags, numa_state->nodes[i].initiator, i);
|
||||
}
|
||||
+
|
||||
+ for (i = 0; i < numa_state->num_nodes; i++) {
|
||||
+ if (numa_state->nodes[i].has_cpu) {
|
||||
+ initiator_list[num_initiator++] = i;
|
||||
+ }
|
||||
+ }
|
||||
+
|
||||
+ /*
|
||||
+ * ACPI 6.3: 5.2.27.4 System Locality Latency and Bandwidth Information
|
||||
+ * Structure: Table 5-146
|
||||
+ */
|
||||
+ for (hierarchy = HMAT_LB_MEM_MEMORY;
|
||||
+ hierarchy <= HMAT_LB_MEM_CACHE_3RD_LEVEL; hierarchy++) {
|
||||
+ for (type = HMAT_LB_DATA_ACCESS_LATENCY;
|
||||
+ type <= HMAT_LB_DATA_WRITE_BANDWIDTH; type++) {
|
||||
+ hmat_lb = numa_state->hmat_lb[hierarchy][type];
|
||||
+
|
||||
+ if (hmat_lb && hmat_lb->list->len) {
|
||||
+ build_hmat_lb(table_data, hmat_lb, num_initiator,
|
||||
+ numa_state->num_nodes, initiator_list);
|
||||
+ }
|
||||
+ }
|
||||
+ }
|
||||
}
|
||||
|
||||
void build_hmat(GArray *table_data, BIOSLinker *linker, NumaState *numa_state)
|
@ -1,46 +0,0 @@
|
||||
From: "Dr. David Alan Gilbert" <dgilbert@redhat.com>
|
||||
Date: Mon, 23 Mar 2020 12:08:22 +0000
|
||||
Subject: hmp/vnc: Fix info vnc list leak
|
||||
|
||||
Git-commit: d4ff109373ce871928c7e9ef648973eba642b484
|
||||
|
||||
We're iterating the list, and then freeing the iteration pointer rather
|
||||
than the list head.
|
||||
|
||||
Fixes: 0a9667ecdb6d ("hmp: Update info vnc")
|
||||
Reported-by: Coverity (CID 1421932)
|
||||
Signed-off-by: Dr. David Alan Gilbert <dgilbert@redhat.com>
|
||||
Message-Id: <20200323120822.51266-1-dgilbert@redhat.com>
|
||||
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
|
||||
Signed-off-by: Dr. David Alan Gilbert <dgilbert@redhat.com>
|
||||
Signed-off-by: Bruce Rogers <brogers@suse.com>
|
||||
---
|
||||
monitor/hmp-cmds.c | 5 +++--
|
||||
1 file changed, 3 insertions(+), 2 deletions(-)
|
||||
|
||||
diff --git a/monitor/hmp-cmds.c b/monitor/hmp-cmds.c
|
||||
index b2551c16d129291068ce64b5f1fd..2fdc84ec995449b5139a89575e18 100644
|
||||
--- a/monitor/hmp-cmds.c
|
||||
+++ b/monitor/hmp-cmds.c
|
||||
@@ -729,10 +729,11 @@ static void hmp_info_vnc_servers(Monitor *mon, VncServerInfo2List *server)
|
||||
|
||||
void hmp_info_vnc(Monitor *mon, const QDict *qdict)
|
||||
{
|
||||
- VncInfo2List *info2l;
|
||||
+ VncInfo2List *info2l, *info2l_head;
|
||||
Error *err = NULL;
|
||||
|
||||
info2l = qmp_query_vnc_servers(&err);
|
||||
+ info2l_head = info2l;
|
||||
if (err) {
|
||||
hmp_handle_error(mon, &err);
|
||||
return;
|
||||
@@ -761,7 +762,7 @@ void hmp_info_vnc(Monitor *mon, const QDict *qdict)
|
||||
info2l = info2l->next;
|
||||
}
|
||||
|
||||
- qapi_free_VncInfo2List(info2l);
|
||||
+ qapi_free_VncInfo2List(info2l_head);
|
||||
|
||||
}
|
||||
#endif
|
@ -1,51 +0,0 @@
|
||||
From: Niek Linnenbank <nieklinnenbank@gmail.com>
|
||||
Date: Thu, 5 Mar 2020 16:09:19 +0000
|
||||
Subject: hw/arm/cubieboard: use ARM Cortex-A8 as the default CPU in machine
|
||||
definition
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
Git-commit: 2104df2a1fbf44b2564427aa72fd58d66ce290a7
|
||||
|
||||
The Cubieboard is a singleboard computer with an Allwinner A10 System-on-Chip [1].
|
||||
As documented in the Allwinner A10 User Manual V1.5 [2], the SoC has an ARM
|
||||
Cortex-A8 processor. Currently the Cubieboard machine definition specifies the
|
||||
ARM Cortex-A9 in its description and as the default CPU.
|
||||
|
||||
This patch corrects the Cubieboard machine definition to use the ARM Cortex-A8.
|
||||
|
||||
The only user-visible effect is that our textual description of the
|
||||
machine was wrong, because hw/arm/allwinner-a10.c always creates a
|
||||
Cortex-A8 CPU regardless of the default value in the MachineClass struct.
|
||||
|
||||
[1] http://docs.cubieboard.org/products/start#cubieboard1
|
||||
[2] https://linux-sunxi.org/File:Allwinner_A10_User_manual_V1.5.pdf
|
||||
|
||||
Fixes: 8a863c8120994981a099
|
||||
Signed-off-by: Niek Linnenbank <nieklinnenbank@gmail.com>
|
||||
Message-id: 20200227220149.6845-2-nieklinnenbank@gmail.com
|
||||
Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com>
|
||||
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
|
||||
[note in commit message that the bug didn't have much visible effect]
|
||||
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
|
||||
Signed-off-by: Bruce Rogers <brogers@suse.com>
|
||||
---
|
||||
hw/arm/cubieboard.c | 4 ++--
|
||||
1 file changed, 2 insertions(+), 2 deletions(-)
|
||||
|
||||
diff --git a/hw/arm/cubieboard.c b/hw/arm/cubieboard.c
|
||||
index 6dc2f1d6b6f6c87e5241c6bb7718..d8e8919e796d43c9a8a2ca6aa836 100644
|
||||
--- a/hw/arm/cubieboard.c
|
||||
+++ b/hw/arm/cubieboard.c
|
||||
@@ -78,8 +78,8 @@ static void cubieboard_init(MachineState *machine)
|
||||
|
||||
static void cubieboard_machine_init(MachineClass *mc)
|
||||
{
|
||||
- mc->desc = "cubietech cubieboard (Cortex-A9)";
|
||||
- mc->default_cpu_type = ARM_CPU_TYPE_NAME("cortex-a9");
|
||||
+ mc->desc = "cubietech cubieboard (Cortex-A8)";
|
||||
+ mc->default_cpu_type = ARM_CPU_TYPE_NAME("cortex-a8");
|
||||
mc->init = cubieboard_init;
|
||||
mc->block_default_type = IF_IDE;
|
||||
mc->units_per_default_bus = 1;
|
@ -1,75 +0,0 @@
|
||||
From: Simon Veith <sveith@amazon.de>
|
||||
Date: Fri, 20 Dec 2019 14:03:00 +0000
|
||||
Subject: hw/arm/smmuv3: Align stream table base address to table size
|
||||
|
||||
Git-commit: 41678c33aac61261522b74f08595ccf2221a430a
|
||||
|
||||
Per the specification, and as observed in hardware, the SMMUv3 aligns
|
||||
the SMMU_STRTAB_BASE address to the size of the table by masking out the
|
||||
respective least significant bits in the ADDR field.
|
||||
|
||||
Apply this masking logic to our smmu_find_ste() lookup function per the
|
||||
specification.
|
||||
|
||||
ref. ARM IHI 0070C, section 6.3.23.
|
||||
|
||||
Signed-off-by: Simon Veith <sveith@amazon.de>
|
||||
Acked-by: Eric Auger <eric.auger@redhat.com>
|
||||
Tested-by: Eric Auger <eric.auger@redhat.com>
|
||||
Message-id: 1576509312-13083-5-git-send-email-sveith@amazon.de
|
||||
Cc: Eric Auger <eric.auger@redhat.com>
|
||||
Cc: qemu-devel@nongnu.org
|
||||
Cc: qemu-arm@nongnu.org
|
||||
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
|
||||
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
|
||||
Signed-off-by: Bruce Rogers <brogers@suse.com>
|
||||
---
|
||||
hw/arm/smmuv3.c | 18 ++++++++++++++----
|
||||
1 file changed, 14 insertions(+), 4 deletions(-)
|
||||
|
||||
diff --git a/hw/arm/smmuv3.c b/hw/arm/smmuv3.c
|
||||
index 727558bcfa5e782b8a9225adb302..31ac3ca32ebe3c1073350843c8ab 100644
|
||||
--- a/hw/arm/smmuv3.c
|
||||
+++ b/hw/arm/smmuv3.c
|
||||
@@ -376,8 +376,9 @@ bad_ste:
|
||||
static int smmu_find_ste(SMMUv3State *s, uint32_t sid, STE *ste,
|
||||
SMMUEventInfo *event)
|
||||
{
|
||||
- dma_addr_t addr;
|
||||
+ dma_addr_t addr, strtab_base;
|
||||
uint32_t log2size;
|
||||
+ int strtab_size_shift;
|
||||
int ret;
|
||||
|
||||
trace_smmuv3_find_ste(sid, s->features, s->sid_split);
|
||||
@@ -391,10 +392,16 @@ static int smmu_find_ste(SMMUv3State *s, uint32_t sid, STE *ste,
|
||||
}
|
||||
if (s->features & SMMU_FEATURE_2LVL_STE) {
|
||||
int l1_ste_offset, l2_ste_offset, max_l2_ste, span;
|
||||
- dma_addr_t strtab_base, l1ptr, l2ptr;
|
||||
+ dma_addr_t l1ptr, l2ptr;
|
||||
STEDesc l1std;
|
||||
|
||||
- strtab_base = s->strtab_base & SMMU_BASE_ADDR_MASK;
|
||||
+ /*
|
||||
+ * Align strtab base address to table size. For this purpose, assume it
|
||||
+ * is not bounded by SMMU_IDR1_SIDSIZE.
|
||||
+ */
|
||||
+ strtab_size_shift = MAX(5, (int)log2size - s->sid_split - 1 + 3);
|
||||
+ strtab_base = s->strtab_base & SMMU_BASE_ADDR_MASK &
|
||||
+ ~MAKE_64BIT_MASK(0, strtab_size_shift);
|
||||
l1_ste_offset = sid >> s->sid_split;
|
||||
l2_ste_offset = sid & ((1 << s->sid_split) - 1);
|
||||
l1ptr = (dma_addr_t)(strtab_base + l1_ste_offset * sizeof(l1std));
|
||||
@@ -433,7 +440,10 @@ static int smmu_find_ste(SMMUv3State *s, uint32_t sid, STE *ste,
|
||||
}
|
||||
addr = l2ptr + l2_ste_offset * sizeof(*ste);
|
||||
} else {
|
||||
- addr = (s->strtab_base & SMMU_BASE_ADDR_MASK) + sid * sizeof(*ste);
|
||||
+ strtab_size_shift = log2size + 5;
|
||||
+ strtab_base = s->strtab_base & SMMU_BASE_ADDR_MASK &
|
||||
+ ~MAKE_64BIT_MASK(0, strtab_size_shift);
|
||||
+ addr = strtab_base + sid * sizeof(*ste);
|
||||
}
|
||||
|
||||
if (smmu_get_ste(s, addr, ste, event)) {
|
@ -1,50 +0,0 @@
|
||||
From: Simon Veith <sveith@amazon.de>
|
||||
Date: Fri, 20 Dec 2019 14:03:00 +0000
|
||||
Subject: hw/arm/smmuv3: Apply address mask to linear strtab base address
|
||||
|
||||
Git-commit: 3d44c60500785f18bb469c9de0aeba7415c0f28f
|
||||
|
||||
In the SMMU_STRTAB_BASE register, the stream table base address only
|
||||
occupies bits [51:6]. Other bits, such as RA (bit [62]), must be masked
|
||||
out to obtain the base address.
|
||||
|
||||
The branch for 2-level stream tables correctly applies this mask by way
|
||||
of SMMU_BASE_ADDR_MASK, but the one for linear stream tables does not.
|
||||
|
||||
Apply the missing mask in that case as well so that the correct stream
|
||||
base address is used by guests which configure a linear stream table.
|
||||
|
||||
Linux guests are unaffected by this change because they choose a 2-level
|
||||
stream table layout for the QEMU SMMUv3, based on the size of its stream
|
||||
ID space.
|
||||
|
||||
ref. ARM IHI 0070C, section 6.3.23.
|
||||
|
||||
Signed-off-by: Simon Veith <sveith@amazon.de>
|
||||
Acked-by: Eric Auger <eric.auger@redhat.com>
|
||||
Tested-by: Eric Auger <eric.auger@redhat.com>
|
||||
Message-id: 1576509312-13083-2-git-send-email-sveith@amazon.de
|
||||
Cc: Eric Auger <eric.auger@redhat.com>
|
||||
Cc: qemu-devel@nongnu.org
|
||||
Cc: qemu-arm@nongnu.org
|
||||
Acked-by: Eric Auger <eric.auger@redhat.com>
|
||||
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
|
||||
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
|
||||
Signed-off-by: Bruce Rogers <brogers@suse.com>
|
||||
---
|
||||
hw/arm/smmuv3.c | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
diff --git a/hw/arm/smmuv3.c b/hw/arm/smmuv3.c
|
||||
index e2fbb8357ea521cd4ca6185b3c7a..eef9a18d70f891af08ef7b03235c 100644
|
||||
--- a/hw/arm/smmuv3.c
|
||||
+++ b/hw/arm/smmuv3.c
|
||||
@@ -429,7 +429,7 @@ static int smmu_find_ste(SMMUv3State *s, uint32_t sid, STE *ste,
|
||||
}
|
||||
addr = l2ptr + l2_ste_offset * sizeof(*ste);
|
||||
} else {
|
||||
- addr = s->strtab_base + sid * sizeof(*ste);
|
||||
+ addr = (s->strtab_base & SMMU_BASE_ADDR_MASK) + sid * sizeof(*ste);
|
||||
}
|
||||
|
||||
if (smmu_get_ste(s, addr, ste, event)) {
|
@ -1,55 +0,0 @@
|
||||
From: Simon Veith <sveith@amazon.de>
|
||||
Date: Fri, 20 Dec 2019 14:03:00 +0000
|
||||
Subject: hw/arm/smmuv3: Check stream IDs against actual table LOG2SIZE
|
||||
|
||||
Git-commit: 05ff2fb80ce4ca85d8a39d48ff8156de739b4f51
|
||||
|
||||
When checking whether a stream ID is in range of the stream table, we
|
||||
have so far been only checking it against our implementation limit
|
||||
(SMMU_IDR1_SIDSIZE). However, the guest can program the
|
||||
STRTAB_BASE_CFG.LOG2SIZE field to a size that is smaller than this
|
||||
limit.
|
||||
|
||||
Check the stream ID against this limit as well to match the hardware
|
||||
behavior of raising C_BAD_STREAMID events in case the limit is exceeded.
|
||||
Also, ensure that we do not go one entry beyond the end of the table by
|
||||
checking that its index is strictly smaller than the table size.
|
||||
|
||||
ref. ARM IHI 0070C, section 6.3.24.
|
||||
|
||||
Signed-off-by: Simon Veith <sveith@amazon.de>
|
||||
Acked-by: Eric Auger <eric.auger@redhat.com>
|
||||
Tested-by: Eric Auger <eric.auger@redhat.com>
|
||||
Message-id: 1576509312-13083-4-git-send-email-sveith@amazon.de
|
||||
Cc: Eric Auger <eric.auger@redhat.com>
|
||||
Cc: qemu-devel@nongnu.org
|
||||
Cc: qemu-arm@nongnu.org
|
||||
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
|
||||
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
|
||||
Signed-off-by: Bruce Rogers <brogers@suse.com>
|
||||
---
|
||||
hw/arm/smmuv3.c | 8 ++++++--
|
||||
1 file changed, 6 insertions(+), 2 deletions(-)
|
||||
|
||||
diff --git a/hw/arm/smmuv3.c b/hw/arm/smmuv3.c
|
||||
index eef9a18d70f891af08ef7b03235c..727558bcfa5e782b8a9225adb302 100644
|
||||
--- a/hw/arm/smmuv3.c
|
||||
+++ b/hw/arm/smmuv3.c
|
||||
@@ -377,11 +377,15 @@ static int smmu_find_ste(SMMUv3State *s, uint32_t sid, STE *ste,
|
||||
SMMUEventInfo *event)
|
||||
{
|
||||
dma_addr_t addr;
|
||||
+ uint32_t log2size;
|
||||
int ret;
|
||||
|
||||
trace_smmuv3_find_ste(sid, s->features, s->sid_split);
|
||||
- /* Check SID range */
|
||||
- if (sid > (1 << SMMU_IDR1_SIDSIZE)) {
|
||||
+ log2size = FIELD_EX32(s->strtab_base_cfg, STRTAB_BASE_CFG, LOG2SIZE);
|
||||
+ /*
|
||||
+ * Check SID range against both guest-configured and implementation limits
|
||||
+ */
|
||||
+ if (sid >= (1 << MIN(log2size, SMMU_IDR1_SIDSIZE))) {
|
||||
event->type = SMMU_EVT_C_BAD_STREAMID;
|
||||
return -EINVAL;
|
||||
}
|
@ -1,44 +0,0 @@
|
||||
From: Simon Veith <sveith@amazon.de>
|
||||
Date: Fri, 20 Dec 2019 14:03:00 +0000
|
||||
Subject: hw/arm/smmuv3: Correct SMMU_BASE_ADDR_MASK value
|
||||
|
||||
Git-commit: 3293b9f514a413e019b7dbc9d543458075b4849e
|
||||
|
||||
There are two issues with the current value of SMMU_BASE_ADDR_MASK:
|
||||
|
||||
- At the lower end, we are clearing bits [4:0]. Per the SMMUv3 spec,
|
||||
we should also be treating bit 5 as zero in the base address.
|
||||
- At the upper end, we are clearing bits [63:48]. Per the SMMUv3 spec,
|
||||
only bits [63:52] must be explicitly treated as zero.
|
||||
|
||||
Update the SMMU_BASE_ADDR_MASK value to mask out bits [63:52] and [5:0].
|
||||
|
||||
ref. ARM IHI 0070C, section 6.3.23.
|
||||
|
||||
Signed-off-by: Simon Veith <sveith@amazon.de>
|
||||
Acked-by: Eric Auger <eric.auger@redhat.com>
|
||||
Tested-by: Eric Auger <eric.auger@redhat.com>
|
||||
Message-id: 1576509312-13083-3-git-send-email-sveith@amazon.de
|
||||
Cc: Eric Auger <eric.auger@redhat.com>
|
||||
Cc: qemu-devel@nongnu.org
|
||||
Cc: qemu-arm@nongnu.org
|
||||
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
|
||||
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
|
||||
Signed-off-by: Bruce Rogers <brogers@suse.com>
|
||||
---
|
||||
hw/arm/smmuv3-internal.h | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
diff --git a/hw/arm/smmuv3-internal.h b/hw/arm/smmuv3-internal.h
|
||||
index d190181ef1bf3d116ecc48abc1bc..042b4358084b6b87e8b9e42d5622 100644
|
||||
--- a/hw/arm/smmuv3-internal.h
|
||||
+++ b/hw/arm/smmuv3-internal.h
|
||||
@@ -99,7 +99,7 @@ REG32(GERROR_IRQ_CFG2, 0x74)
|
||||
|
||||
#define A_STRTAB_BASE 0x80 /* 64b */
|
||||
|
||||
-#define SMMU_BASE_ADDR_MASK 0xffffffffffe0
|
||||
+#define SMMU_BASE_ADDR_MASK 0xfffffffffffc0
|
||||
|
||||
REG32(STRTAB_BASE_CFG, 0x88)
|
||||
FIELD(STRTAB_BASE_CFG, FMT, 16, 2)
|
@ -1,47 +0,0 @@
|
||||
From: Simon Veith <sveith@amazon.de>
|
||||
Date: Fri, 20 Dec 2019 14:03:00 +0000
|
||||
Subject: hw/arm/smmuv3: Report F_STE_FETCH fault address in correct word
|
||||
position
|
||||
|
||||
Git-commit: b255cafb59578d16716186ed955717bc8f87bdb7
|
||||
|
||||
The smmuv3_record_event() function that generates the F_STE_FETCH error
|
||||
uses the EVT_SET_ADDR macro to record the fetch address, placing it in
|
||||
32-bit words 4 and 5.
|
||||
|
||||
The correct position for this address is in words 6 and 7, per the
|
||||
SMMUv3 Architecture Specification.
|
||||
|
||||
Update the function to use the EVT_SET_ADDR2 macro instead, which is the
|
||||
macro intended for writing to these words.
|
||||
|
||||
ref. ARM IHI 0070C, section 7.3.4.
|
||||
|
||||
Signed-off-by: Simon Veith <sveith@amazon.de>
|
||||
Acked-by: Eric Auger <eric.auger@redhat.com>
|
||||
Tested-by: Eric Auger <eric.auger@redhat.com>
|
||||
Message-id: 1576509312-13083-7-git-send-email-sveith@amazon.de
|
||||
Cc: Eric Auger <eric.auger@redhat.com>
|
||||
Cc: qemu-devel@nongnu.org
|
||||
Cc: qemu-arm@nongnu.org
|
||||
Acked-by: Eric Auger <eric.auger@redhat.com>
|
||||
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
|
||||
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
|
||||
Signed-off-by: Bruce Rogers <brogers@suse.com>
|
||||
---
|
||||
hw/arm/smmuv3.c | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
diff --git a/hw/arm/smmuv3.c b/hw/arm/smmuv3.c
|
||||
index 31ac3ca32ebe3c1073350843c8ab..8b5f157dc702322b5424ab585b8a 100644
|
||||
--- a/hw/arm/smmuv3.c
|
||||
+++ b/hw/arm/smmuv3.c
|
||||
@@ -172,7 +172,7 @@ void smmuv3_record_event(SMMUv3State *s, SMMUEventInfo *info)
|
||||
case SMMU_EVT_F_STE_FETCH:
|
||||
EVT_SET_SSID(&evt, info->u.f_ste_fetch.ssid);
|
||||
EVT_SET_SSV(&evt, info->u.f_ste_fetch.ssv);
|
||||
- EVT_SET_ADDR(&evt, info->u.f_ste_fetch.addr);
|
||||
+ EVT_SET_ADDR2(&evt, info->u.f_ste_fetch.addr);
|
||||
break;
|
||||
case SMMU_EVT_C_BAD_STE:
|
||||
EVT_SET_SSID(&evt, info->u.c_bad_ste.ssid);
|
@ -1,49 +0,0 @@
|
||||
From: Simon Veith <sveith@amazon.de>
|
||||
Date: Fri, 20 Dec 2019 14:03:00 +0000
|
||||
Subject: hw/arm/smmuv3: Use correct bit positions in EVT_SET_ADDR2 macro
|
||||
|
||||
Git-commit: a7f65ceb851af5a5b639c6e30801076d848db2c2
|
||||
|
||||
The bit offsets in the EVT_SET_ADDR2 macro do not match those specified
|
||||
in the ARM SMMUv3 Architecture Specification. In all events that use
|
||||
this macro, e.g. F_WALK_EABT, the faulting fetch address or IPA actually
|
||||
occupies the 32-bit words 6 and 7 in the event record contiguously, with
|
||||
the upper and lower unused bits clear due to alignment or maximum
|
||||
supported address bits. How many bits are clear depends on the
|
||||
individual event type.
|
||||
|
||||
Update the macro to write to the correct words in the event record so
|
||||
that guest drivers can obtain accurate address information on events.
|
||||
|
||||
ref. ARM IHI 0070C, sections 7.3.12 through 7.3.16.
|
||||
|
||||
Signed-off-by: Simon Veith <sveith@amazon.de>
|
||||
Acked-by: Eric Auger <eric.auger@redhat.com>
|
||||
Tested-by: Eric Auger <eric.auger@redhat.com>
|
||||
Message-id: 1576509312-13083-6-git-send-email-sveith@amazon.de
|
||||
Cc: Eric Auger <eric.auger@redhat.com>
|
||||
Cc: qemu-devel@nongnu.org
|
||||
Cc: qemu-arm@nongnu.org
|
||||
Acked-by: Eric Auger <eric.auger@redhat.com>
|
||||
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
|
||||
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
|
||||
Signed-off-by: Bruce Rogers <brogers@suse.com>
|
||||
---
|
||||
hw/arm/smmuv3-internal.h | 4 ++--
|
||||
1 file changed, 2 insertions(+), 2 deletions(-)
|
||||
|
||||
diff --git a/hw/arm/smmuv3-internal.h b/hw/arm/smmuv3-internal.h
|
||||
index 042b4358084b6b87e8b9e42d5622..4112394129e0069018a5967cb685 100644
|
||||
--- a/hw/arm/smmuv3-internal.h
|
||||
+++ b/hw/arm/smmuv3-internal.h
|
||||
@@ -461,8 +461,8 @@ typedef struct SMMUEventInfo {
|
||||
} while (0)
|
||||
#define EVT_SET_ADDR2(x, addr) \
|
||||
do { \
|
||||
- (x)->word[7] = deposit32((x)->word[7], 3, 29, addr >> 16); \
|
||||
- (x)->word[7] = deposit32((x)->word[7], 0, 16, addr & 0xffff);\
|
||||
+ (x)->word[7] = (uint32_t)(addr >> 32); \
|
||||
+ (x)->word[6] = (uint32_t)(addr & 0xffffffff); \
|
||||
} while (0)
|
||||
|
||||
void smmuv3_record_event(SMMUv3State *s, SMMUEventInfo *event);
|
@ -1,43 +0,0 @@
|
||||
From: Olaf Hering <olaf@aepfle.de>
|
||||
Date: Wed, 19 Feb 2020 15:15:15 +0100
|
||||
Subject: hw/i386: disable smbus migration for xenfv
|
||||
|
||||
References: bsc#1159755
|
||||
|
||||
With commit 7fccf2a06890e3bc3b30e29827ad3fb93fe88fea a new member
|
||||
smbus_no_migration_support was added, and enabled in two places.
|
||||
With commit 4ab2f2a8aabfea95cc53c64e13b3f67960b27fdf the vmstate_acpi
|
||||
got new elements, which are conditionally filled. As a result, an
|
||||
incoming migration expected smbus related data unless smbus migration
|
||||
was disabled for a given MachineClass.
|
||||
|
||||
Since commit 7fccf2a06890e3bc3b30e29827ad3fb93fe88fea forgot to handle
|
||||
xenfv, live migration to receiving hosts using qemu-4.0 and later is broken.
|
||||
|
||||
Adjust 'xenfv' to stay compatible with with 'pc-i440fx-3.1':
|
||||
- the toolstack can not use '-M pc-i440fx-3.1,accel=xen -device xen-platform'
|
||||
because this would move the PCI device from 00:02.0 to 00:04.0
|
||||
- disable pvh.
|
||||
Running PVH may require dedicated device_model_args= options which select
|
||||
'pc-i440fx-4.x'
|
||||
|
||||
Signed-off-by: Olaf Hering <olaf@aepfle.de>
|
||||
Signed-off-by: Bruce Rogers <brogers@suse.com>
|
||||
[BR: Adjust implementation to simply call pc_i440fx_3_1_machine_options]
|
||||
---
|
||||
hw/i386/pc_piix.c | 2 ++
|
||||
1 file changed, 2 insertions(+)
|
||||
|
||||
diff --git a/hw/i386/pc_piix.c b/hw/i386/pc_piix.c
|
||||
index d760d3589607daf4997ea76854c4..000e692d0e5af449270214ea9345 100644
|
||||
--- a/hw/i386/pc_piix.c
|
||||
+++ b/hw/i386/pc_piix.c
|
||||
@@ -1043,6 +1043,8 @@ DEFINE_PC_MACHINE(isapc, "isapc", pc_init_isa,
|
||||
#ifdef CONFIG_XEN
|
||||
static void xenfv_machine_options(MachineClass *m)
|
||||
{
|
||||
+ /* compat with pc_i440fx_3_1_machine_options */
|
||||
+ pc_i440fx_3_1_machine_options(m);
|
||||
m->desc = "Xen Fully-virtualized PC";
|
||||
m->max_cpus = HVM_MAX_VCPUS;
|
||||
m->default_machine_opts = "accel=xen";
|
@ -1,52 +0,0 @@
|
||||
From: Peter Wu <peter@lekensteyn.nl>
|
||||
Date: Sat, 21 Dec 2019 17:21:24 +0100
|
||||
Subject: hw/i386/pc: fix regression in parsing vga cmdline parameter
|
||||
|
||||
Git-commit: a88c40f02ace88f09b2a85a64831b277b2ebc88c
|
||||
|
||||
When the 'vga=' parameter is succeeded by another parameter, QEMU 4.2.0
|
||||
would refuse to start with a rather cryptic message:
|
||||
|
||||
$ qemu-system-x86_64 -kernel /boot/vmlinuz-linux -append 'vga=792 quiet'
|
||||
qemu: can't parse 'vga' parameter: Invalid argument
|
||||
|
||||
It was not clear whether this applied to the '-vga std' parameter or the
|
||||
'-append' one. Fix the parsing regression and clarify the error.
|
||||
|
||||
Fixes: 133ef074bd ("hw/i386/pc: replace use of strtol with qemu_strtoui in x86_load_linux()")
|
||||
Cc: Sergio Lopez <slp@redhat.com>
|
||||
Signed-off-by: Peter Wu <peter@lekensteyn.nl>
|
||||
Message-Id: <20191221162124.1159291-1-peter@lekensteyn.nl>
|
||||
Cc: qemu-stable@nongnu.org
|
||||
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
|
||||
Signed-off-by: Bruce Rogers <brogers@suse.com>
|
||||
---
|
||||
hw/i386/x86.c | 8 ++++----
|
||||
1 file changed, 4 insertions(+), 4 deletions(-)
|
||||
|
||||
diff --git a/hw/i386/x86.c b/hw/i386/x86.c
|
||||
index 394edc2f720985c0910396181eeb..121650ae511c3814dcdbb908abdc 100644
|
||||
--- a/hw/i386/x86.c
|
||||
+++ b/hw/i386/x86.c
|
||||
@@ -508,6 +508,7 @@ void x86_load_linux(X86MachineState *x86ms,
|
||||
vmode = strstr(kernel_cmdline, "vga=");
|
||||
if (vmode) {
|
||||
unsigned int video_mode;
|
||||
+ const char *end;
|
||||
int ret;
|
||||
/* skip "vga=" */
|
||||
vmode += 4;
|
||||
@@ -518,10 +519,9 @@ void x86_load_linux(X86MachineState *x86ms,
|
||||
} else if (!strncmp(vmode, "ask", 3)) {
|
||||
video_mode = 0xfffd;
|
||||
} else {
|
||||
- ret = qemu_strtoui(vmode, NULL, 0, &video_mode);
|
||||
- if (ret != 0) {
|
||||
- fprintf(stderr, "qemu: can't parse 'vga' parameter: %s\n",
|
||||
- strerror(-ret));
|
||||
+ ret = qemu_strtoui(vmode, &end, 0, &video_mode);
|
||||
+ if (ret != 0 || (*end && *end != ' ')) {
|
||||
+ fprintf(stderr, "qemu: invalid 'vga=' kernel parameter.\n");
|
||||
exit(1);
|
||||
}
|
||||
}
|
@ -1,58 +0,0 @@
|
||||
From: Zenghui Yu <yuzenghui@huawei.com>
|
||||
Date: Thu, 30 Jan 2020 16:02:05 +0000
|
||||
Subject: hw/intc/arm_gicv3_kvm: Stop wrongly programming GICR_PENDBASER.PTZ
|
||||
bit
|
||||
|
||||
Git-commit: 618bacabd3c8c3360be795cd8763bacdf5bec101
|
||||
|
||||
If LPIs are disabled, KVM will just ignore the GICR_PENDBASER.PTZ bit when
|
||||
restoring GICR_CTLR. Setting PTZ here makes littlt sense in "reduce GIC
|
||||
initialization time".
|
||||
|
||||
And what's worse, PTZ is generally programmed by guest to indicate to the
|
||||
Redistributor whether the LPI Pending table is zero when enabling LPIs.
|
||||
If migration is triggered when the PTZ has just been cleared by guest (and
|
||||
before enabling LPIs), we will see PTZ==1 on the destination side, which
|
||||
is not as expected. Let's just drop this hackish userspace behavior.
|
||||
|
||||
Also take this chance to refine the comment a bit.
|
||||
|
||||
Fixes: 367b9f527bec ("hw/intc/arm_gicv3_kvm: Implement get/put functions")
|
||||
Signed-off-by: Zenghui Yu <yuzenghui@huawei.com>
|
||||
Message-id: 20200119133051.642-1-yuzenghui@huawei.com
|
||||
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
|
||||
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
|
||||
Signed-off-by: Bruce Rogers <brogers@suse.com>
|
||||
---
|
||||
hw/intc/arm_gicv3_kvm.c | 11 ++++-------
|
||||
1 file changed, 4 insertions(+), 7 deletions(-)
|
||||
|
||||
diff --git a/hw/intc/arm_gicv3_kvm.c b/hw/intc/arm_gicv3_kvm.c
|
||||
index 9c7f4ab8711cd7ba780727089a1c..49304ca589d1f016cdfb217bf719 100644
|
||||
--- a/hw/intc/arm_gicv3_kvm.c
|
||||
+++ b/hw/intc/arm_gicv3_kvm.c
|
||||
@@ -336,7 +336,10 @@ static void kvm_arm_gicv3_put(GICv3State *s)
|
||||
kvm_gicd_access(s, GICD_CTLR, ®, true);
|
||||
|
||||
if (redist_typer & GICR_TYPER_PLPIS) {
|
||||
- /* Set base addresses before LPIs are enabled by GICR_CTLR write */
|
||||
+ /*
|
||||
+ * Restore base addresses before LPIs are potentially enabled by
|
||||
+ * GICR_CTLR write
|
||||
+ */
|
||||
for (ncpu = 0; ncpu < s->num_cpu; ncpu++) {
|
||||
GICv3CPUState *c = &s->cpu[ncpu];
|
||||
|
||||
@@ -347,12 +350,6 @@ static void kvm_arm_gicv3_put(GICv3State *s)
|
||||
kvm_gicr_access(s, GICR_PROPBASER + 4, ncpu, ®h, true);
|
||||
|
||||
reg64 = c->gicr_pendbaser;
|
||||
- if (!(c->gicr_ctlr & GICR_CTLR_ENABLE_LPIS)) {
|
||||
- /* Setting PTZ is advised if LPIs are disabled, to reduce
|
||||
- * GIC initialization time.
|
||||
- */
|
||||
- reg64 |= GICR_PENDBASER_PTZ;
|
||||
- }
|
||||
regl = (uint32_t)reg64;
|
||||
kvm_gicr_access(s, GICR_PENDBASER, ncpu, ®l, true);
|
||||
regh = (uint32_t)(reg64 >> 32);
|
@ -41,7 +41,7 @@ Signed-off-by: Bruce Rogers <brogers@suse.com>
|
||||
1 file changed, 2 insertions(+), 2 deletions(-)
|
||||
|
||||
diff --git a/hw/intc/exynos4210_gic.c b/hw/intc/exynos4210_gic.c
|
||||
index a1b699b6babc3105bfd4ad9a8383..17317c961caa9a09c476e9ecbd3f 100644
|
||||
index 82c8f4192cbc34fe4c8762846728..50958b31c9173aba84b7443950cb 100644
|
||||
--- a/hw/intc/exynos4210_gic.c
|
||||
+++ b/hw/intc/exynos4210_gic.c
|
||||
@@ -290,8 +290,8 @@ static void exynos4210_gic_realize(DeviceState *dev, Error **errp)
|
||||
@ -53,5 +53,5 @@ index a1b699b6babc3105bfd4ad9a8383..17317c961caa9a09c476e9ecbd3f 100644
|
||||
+ char cpu_alias_name[sizeof(cpu_prefix) + 7];
|
||||
+ char dist_alias_name[sizeof(cpu_prefix) + 8];
|
||||
SysBusDevice *gicbusdev;
|
||||
uint32_t n = s->num_cpu;
|
||||
uint32_t i;
|
||||
|
||||
|
@ -16,10 +16,10 @@ Signed-off-by: Bruce Rogers <brogers@suse.com>
|
||||
1 file changed, 39 insertions(+), 4 deletions(-)
|
||||
|
||||
diff --git a/hw/smbios/smbios.c b/hw/smbios/smbios.c
|
||||
index 11d476c4a2cbdabc546c02b4f076..570ffa3acfa48b3721bdc578ee57 100644
|
||||
index ffd98727ee9e503dfce5e5c92241..a50b5aea6545f1d702278e838cf2 100644
|
||||
--- a/hw/smbios/smbios.c
|
||||
+++ b/hw/smbios/smbios.c
|
||||
@@ -964,6 +964,7 @@ void smbios_entry_add(QemuOpts *opts, Error **errp)
|
||||
@@ -963,6 +963,7 @@ void smbios_entry_add(QemuOpts *opts, Error **errp)
|
||||
struct smbios_structure_header *header;
|
||||
int size;
|
||||
struct smbios_table *table; /* legacy mode only */
|
||||
@ -27,7 +27,7 @@ index 11d476c4a2cbdabc546c02b4f076..570ffa3acfa48b3721bdc578ee57 100644
|
||||
|
||||
qemu_opts_validate(opts, qemu_smbios_file_opts, &err);
|
||||
if (err) {
|
||||
@@ -978,11 +979,21 @@ void smbios_entry_add(QemuOpts *opts, Error **errp)
|
||||
@@ -977,11 +978,21 @@ void smbios_entry_add(QemuOpts *opts, Error **errp)
|
||||
}
|
||||
|
||||
/*
|
||||
@ -53,7 +53,7 @@ index 11d476c4a2cbdabc546c02b4f076..570ffa3acfa48b3721bdc578ee57 100644
|
||||
header = (struct smbios_structure_header *)(smbios_tables +
|
||||
smbios_tables_len);
|
||||
|
||||
@@ -997,6 +1008,19 @@ void smbios_entry_add(QemuOpts *opts, Error **errp)
|
||||
@@ -996,6 +1007,19 @@ void smbios_entry_add(QemuOpts *opts, Error **errp)
|
||||
header->type);
|
||||
return;
|
||||
}
|
||||
@ -73,7 +73,7 @@ index 11d476c4a2cbdabc546c02b4f076..570ffa3acfa48b3721bdc578ee57 100644
|
||||
set_bit(header->type, have_binfile_bitmap);
|
||||
|
||||
if (header->type == 4) {
|
||||
@@ -1017,6 +1041,17 @@ void smbios_entry_add(QemuOpts *opts, Error **errp)
|
||||
@@ -1016,6 +1040,17 @@ void smbios_entry_add(QemuOpts *opts, Error **errp)
|
||||
* delete the one we don't need from smbios_set_defaults(),
|
||||
* once we know which machine version has been requested.
|
||||
*/
|
||||
|
@ -17,7 +17,7 @@ Signed-off-by: Bruce Rogers <brogers@suse.com>
|
||||
1 file changed, 13 insertions(+)
|
||||
|
||||
diff --git a/hw/usb/dev-mtp.c b/hw/usb/dev-mtp.c
|
||||
index 7c07295519d33d13fd3755ea7e0a..13815df4737ef8f46e6f857153b1 100644
|
||||
index 20717f026bc03922944317f73a68..e640fe183a0b407db555aade6e16 100644
|
||||
--- a/hw/usb/dev-mtp.c
|
||||
+++ b/hw/usb/dev-mtp.c
|
||||
@@ -1722,9 +1722,22 @@ static void usb_mtp_write_metadata(MTPState *s, uint64_t dlen)
|
||||
|
@ -28,10 +28,10 @@ Signed-off-by: Bruce Rogers <brogers@suse.com>
|
||||
1 file changed, 1 insertion(+)
|
||||
|
||||
diff --git a/hw/usb/hcd-xhci.c b/hw/usb/hcd-xhci.c
|
||||
index 80988bb305a149f2974d329576a0..00b59bee44f4780727ca0279ced5 100644
|
||||
index b330e36fe6cc69a3b47ddd51ccba..8c4e4b66dd33ee482125b98846b7 100644
|
||||
--- a/hw/usb/hcd-xhci.c
|
||||
+++ b/hw/usb/hcd-xhci.c
|
||||
@@ -3330,6 +3330,7 @@ static void usb_xhci_init(XHCIState *xhci)
|
||||
@@ -3340,6 +3340,7 @@ static void usb_xhci_init(XHCIState *xhci)
|
||||
usb_bus_new(&xhci->bus, sizeof(xhci->bus), &xhci_bus_ops, dev);
|
||||
|
||||
for (i = 0; i < usbports; i++) {
|
||||
|
@ -1,32 +0,0 @@
|
||||
From: Cathy Zhang <cathy.zhang@intel.com>
|
||||
Date: Tue, 22 Oct 2019 15:35:26 +0800
|
||||
Subject: i386: Add MSR feature bit for MDS-NO
|
||||
|
||||
Git-commit: 77b168d221191156c47fcd8d1c47329dfdb9439e
|
||||
References: jsc#SLE-7923
|
||||
|
||||
Define MSR_ARCH_CAP_MDS_NO in the IA32_ARCH_CAPABILITIES MSR to allow
|
||||
CPU models to report the feature when host supports it.
|
||||
|
||||
Signed-off-by: Cathy Zhang <cathy.zhang@intel.com>
|
||||
Reviewed-by: Xiaoyao Li <xiaoyao.li@intel.com>
|
||||
Reviewed-by: Tao Xu <tao3.xu@intel.com>
|
||||
Message-Id: <1571729728-23284-2-git-send-email-cathy.zhang@intel.com>
|
||||
Signed-off-by: Eduardo Habkost <ehabkost@redhat.com>
|
||||
Signed-off-by: Bruce Rogers <brogers@suse.com>
|
||||
---
|
||||
target/i386/cpu.h | 1 +
|
||||
1 file changed, 1 insertion(+)
|
||||
|
||||
diff --git a/target/i386/cpu.h b/target/i386/cpu.h
|
||||
index cde2a16b941adeb1123d5d7411f3..39d37e12256069b92c7998590849 100644
|
||||
--- a/target/i386/cpu.h
|
||||
+++ b/target/i386/cpu.h
|
||||
@@ -838,6 +838,7 @@ typedef uint64_t FeatureWordArray[FEATURE_WORDS];
|
||||
#define MSR_ARCH_CAP_RSBA (1U << 2)
|
||||
#define MSR_ARCH_CAP_SKIP_L1DFL_VMENTRY (1U << 3)
|
||||
#define MSR_ARCH_CAP_SSB_NO (1U << 4)
|
||||
+#define MSR_ARCH_CAP_MDS_NO (1U << 5)
|
||||
|
||||
#define MSR_CORE_CAP_SPLIT_LOCK_DETECT (1U << 5)
|
||||
|
@ -1,35 +0,0 @@
|
||||
From: Cathy Zhang <cathy.zhang@intel.com>
|
||||
Date: Tue, 22 Oct 2019 15:35:27 +0800
|
||||
Subject: i386: Add macro for stibp
|
||||
|
||||
Git-commit: 5af514d0cb314f43bc53f2aefb437f6451d64d0c
|
||||
References: jsc#SLE-7923
|
||||
|
||||
stibp feature is already added through the following commit.
|
||||
https://github.com/qemu/qemu/commit/0e8916582991b9fd0b94850a8444b8b80d0a0955
|
||||
|
||||
Add a macro for it to allow CPU models to report it when host supports.
|
||||
|
||||
Signed-off-by: Cathy Zhang <cathy.zhang@intel.com>
|
||||
Reviewed-by: Xiaoyao Li <xiaoyao.li@intel.com>
|
||||
Reviewed-by: Tao Xu <tao3.xu@intel.com>
|
||||
Message-Id: <1571729728-23284-3-git-send-email-cathy.zhang@intel.com>
|
||||
Signed-off-by: Eduardo Habkost <ehabkost@redhat.com>
|
||||
Signed-off-by: Bruce Rogers <brogers@suse.com>
|
||||
---
|
||||
target/i386/cpu.h | 2 ++
|
||||
1 file changed, 2 insertions(+)
|
||||
|
||||
diff --git a/target/i386/cpu.h b/target/i386/cpu.h
|
||||
index 39d37e12256069b92c7998590849..af282936a785a25f651d0db1a8cf 100644
|
||||
--- a/target/i386/cpu.h
|
||||
+++ b/target/i386/cpu.h
|
||||
@@ -771,6 +771,8 @@ typedef uint64_t FeatureWordArray[FEATURE_WORDS];
|
||||
#define CPUID_7_0_EDX_AVX512_4FMAPS (1U << 3)
|
||||
/* Speculation Control */
|
||||
#define CPUID_7_0_EDX_SPEC_CTRL (1U << 26)
|
||||
+/* Single Thread Indirect Branch Predictors */
|
||||
+#define CPUID_7_0_EDX_STIBP (1U << 27)
|
||||
/* Arch Capabilities */
|
||||
#define CPUID_7_0_EDX_ARCH_CAPABILITIES (1U << 29)
|
||||
/* Core Capability */
|
@ -1,94 +0,0 @@
|
||||
From: Cathy Zhang <cathy.zhang@intel.com>
|
||||
Date: Tue, 22 Oct 2019 15:35:28 +0800
|
||||
Subject: i386: Add new CPU model Cooperlake
|
||||
|
||||
Git-commit: 22a866b6166db5caa4abaa6e656c2a431fa60726
|
||||
References: jsc#SLE-7923
|
||||
|
||||
Cooper Lake is intel's successor to Cascade Lake, the new
|
||||
CPU model inherits features from Cascadelake-Server, while
|
||||
add one platform associated new feature: AVX512_BF16. Meanwhile,
|
||||
add STIBP for speculative execution.
|
||||
|
||||
Signed-off-by: Cathy Zhang <cathy.zhang@intel.com>
|
||||
Reviewed-by: Xiaoyao Li <xiaoyao.li@intel.com>
|
||||
Reviewed-by: Tao Xu <tao3.xu@intel.com>
|
||||
Message-Id: <1571729728-23284-4-git-send-email-cathy.zhang@intel.com>
|
||||
Reviewed-by: Bruce Rogers <brogers@suse.com>
|
||||
Signed-off-by: Eduardo Habkost <ehabkost@redhat.com>
|
||||
Signed-off-by: Bruce Rogers <brogers@suse.com>
|
||||
---
|
||||
target/i386/cpu.c | 60 +++++++++++++++++++++++++++++++++++++++++++++++
|
||||
1 file changed, 60 insertions(+)
|
||||
|
||||
diff --git a/target/i386/cpu.c b/target/i386/cpu.c
|
||||
index 69f518a21a9b625269b15d9e8ad3..de828e29d8d6a35c1f03bc4a456a 100644
|
||||
--- a/target/i386/cpu.c
|
||||
+++ b/target/i386/cpu.c
|
||||
@@ -3159,6 +3159,66 @@ static X86CPUDefinition builtin_x86_defs[] = {
|
||||
{ /* end of list */ }
|
||||
}
|
||||
},
|
||||
+ {
|
||||
+ .name = "Cooperlake",
|
||||
+ .level = 0xd,
|
||||
+ .vendor = CPUID_VENDOR_INTEL,
|
||||
+ .family = 6,
|
||||
+ .model = 85,
|
||||
+ .stepping = 10,
|
||||
+ .features[FEAT_1_EDX] =
|
||||
+ CPUID_VME | 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_AVX | CPUID_EXT_XSAVE | CPUID_EXT_AES |
|
||||
+ CPUID_EXT_POPCNT | CPUID_EXT_X2APIC | CPUID_EXT_SSE42 |
|
||||
+ CPUID_EXT_SSE41 | CPUID_EXT_CX16 | CPUID_EXT_SSSE3 |
|
||||
+ CPUID_EXT_PCLMULQDQ | CPUID_EXT_SSE3 |
|
||||
+ CPUID_EXT_TSC_DEADLINE_TIMER | CPUID_EXT_FMA | CPUID_EXT_MOVBE |
|
||||
+ CPUID_EXT_PCID | CPUID_EXT_F16C | CPUID_EXT_RDRAND,
|
||||
+ .features[FEAT_8000_0001_EDX] =
|
||||
+ CPUID_EXT2_LM | CPUID_EXT2_PDPE1GB | CPUID_EXT2_RDTSCP |
|
||||
+ CPUID_EXT2_NX | CPUID_EXT2_SYSCALL,
|
||||
+ .features[FEAT_8000_0001_ECX] =
|
||||
+ CPUID_EXT3_ABM | CPUID_EXT3_LAHF_LM | CPUID_EXT3_3DNOWPREFETCH,
|
||||
+ .features[FEAT_7_0_EBX] =
|
||||
+ CPUID_7_0_EBX_FSGSBASE | CPUID_7_0_EBX_BMI1 |
|
||||
+ CPUID_7_0_EBX_HLE | CPUID_7_0_EBX_AVX2 | CPUID_7_0_EBX_SMEP |
|
||||
+ CPUID_7_0_EBX_BMI2 | CPUID_7_0_EBX_ERMS | CPUID_7_0_EBX_INVPCID |
|
||||
+ CPUID_7_0_EBX_RTM | CPUID_7_0_EBX_RDSEED | CPUID_7_0_EBX_ADX |
|
||||
+ CPUID_7_0_EBX_SMAP | CPUID_7_0_EBX_CLWB |
|
||||
+ CPUID_7_0_EBX_AVX512F | CPUID_7_0_EBX_AVX512DQ |
|
||||
+ CPUID_7_0_EBX_AVX512BW | CPUID_7_0_EBX_AVX512CD |
|
||||
+ CPUID_7_0_EBX_AVX512VL | CPUID_7_0_EBX_CLFLUSHOPT,
|
||||
+ .features[FEAT_7_0_ECX] =
|
||||
+ CPUID_7_0_ECX_PKU |
|
||||
+ CPUID_7_0_ECX_AVX512VNNI,
|
||||
+ .features[FEAT_7_0_EDX] =
|
||||
+ CPUID_7_0_EDX_SPEC_CTRL | CPUID_7_0_EDX_STIBP |
|
||||
+ CPUID_7_0_EDX_SPEC_CTRL_SSBD | CPUID_7_0_EDX_ARCH_CAPABILITIES,
|
||||
+ .features[FEAT_ARCH_CAPABILITIES] =
|
||||
+ MSR_ARCH_CAP_RDCL_NO | MSR_ARCH_CAP_IBRS_ALL |
|
||||
+ MSR_ARCH_CAP_SKIP_L1DFL_VMENTRY | MSR_ARCH_CAP_MDS_NO,
|
||||
+ .features[FEAT_7_1_EAX] =
|
||||
+ CPUID_7_1_EAX_AVX512_BF16,
|
||||
+ /*
|
||||
+ * Missing: XSAVES (not supported by some Linux versions,
|
||||
+ * including v4.1 to v4.12).
|
||||
+ * KVM doesn't yet expose any XSAVES state save component,
|
||||
+ * and the only one defined in Skylake (processor tracing)
|
||||
+ * probably will block migration anyway.
|
||||
+ */
|
||||
+ .features[FEAT_XSAVE] =
|
||||
+ CPUID_XSAVE_XSAVEOPT | CPUID_XSAVE_XSAVEC |
|
||||
+ CPUID_XSAVE_XGETBV1,
|
||||
+ .features[FEAT_6_EAX] =
|
||||
+ CPUID_6_EAX_ARAT,
|
||||
+ .xlevel = 0x80000008,
|
||||
+ .model_id = "Intel Xeon Processor (Cooperlake)",
|
||||
+ },
|
||||
{
|
||||
.name = "Icelake-Client",
|
||||
.level = 0xd,
|
@ -1,83 +0,0 @@
|
||||
From: Eduardo Habkost <ehabkost@redhat.com>
|
||||
Date: Thu, 5 Dec 2019 19:33:39 -0300
|
||||
Subject: i386: Resolve CPU models to v1 by default
|
||||
|
||||
Git-commit: ad18392892c04637fb56956d997f4bc600224356
|
||||
|
||||
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>
|
||||
Message-Id: <20191205223339.764534-1-ehabkost@redhat.com>
|
||||
Signed-off-by: Eduardo Habkost <ehabkost@redhat.com>
|
||||
Signed-off-by: Bruce Rogers <brogers@suse.com>
|
||||
---
|
||||
qemu-deprecated.texi | 8 ++++++++
|
||||
target/i386/cpu.c | 8 +++++++-
|
||||
2 files changed, 15 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/qemu-deprecated.texi b/qemu-deprecated.texi
|
||||
index 4b4b7425ac1e8f71ad6a2becafb1..b42d8b3c5fbd7e74acc826678a90 100644
|
||||
--- a/qemu-deprecated.texi
|
||||
+++ b/qemu-deprecated.texi
|
||||
@@ -374,6 +374,14 @@ 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 de828e29d8d6a35c1f03bc4a456a..8a1993ac64bd763b7bb70c98b8b8 100644
|
||||
--- a/target/i386/cpu.c
|
||||
+++ b/target/i386/cpu.c
|
||||
@@ -3984,7 +3984,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)
|
||||
{
|
@ -18,10 +18,10 @@ Signed-off-by: Andreas Färber <afaerber@suse.de>
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
diff --git a/target/i386/cpu.h b/target/i386/cpu.h
|
||||
index 594326a7946798aba6ac42415164..5da6b243db2824f79676e4e1bbae 100644
|
||||
index e818fc712aca18df805859d10ede..bafc094406d16f6f8c1d41d69ff6 100644
|
||||
--- a/target/i386/cpu.h
|
||||
+++ b/target/i386/cpu.h
|
||||
@@ -1934,7 +1934,7 @@ uint64_t cpu_get_tsc(CPUX86State *env);
|
||||
@@ -1942,7 +1942,7 @@ uint64_t cpu_get_tsc(CPUX86State *env);
|
||||
/* XXX: This value should match the one returned by CPUID
|
||||
* and in exec.c */
|
||||
# if defined(TARGET_X86_64)
|
||||
|
@ -1,38 +0,0 @@
|
||||
From: Liu Yi L <yi.l.liu@intel.com>
|
||||
Date: Fri, 3 Jan 2020 21:28:05 +0800
|
||||
Subject: intel_iommu: a fix to vtd_find_as_from_bus_num()
|
||||
|
||||
Git-commit: a2e1cd41ccfe796529abfd1b6aeb1dd4393762a2
|
||||
|
||||
Ensure the return value of vtd_find_as_from_bus_num() is NULL by
|
||||
enforcing vtd_bus=NULL. This would help caller of vtd_find_as_from_bus_num()
|
||||
to decide if any further operation on the returned vtd_bus.
|
||||
|
||||
Cc: qemu-stable@nongnu.org
|
||||
Cc: Kevin Tian <kevin.tian@intel.com>
|
||||
Cc: Jacob Pan <jacob.jun.pan@linux.intel.com>
|
||||
Cc: Peter Xu <peterx@redhat.com>
|
||||
Cc: Yi Sun <yi.y.sun@linux.intel.com>
|
||||
Signed-off-by: Liu Yi L <yi.l.liu@intel.com>
|
||||
Signed-off-by: Yi Sun <yi.y.sun@linux.intel.com>
|
||||
Message-Id: <1578058086-4288-2-git-send-email-yi.l.liu@intel.com>
|
||||
Reviewed-by: Peter Xu <peterx@redhat.com>
|
||||
Reviewed-by: Michael S. Tsirkin <mst@redhat.com>
|
||||
Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
|
||||
Signed-off-by: Bruce Rogers <brogers@suse.com>
|
||||
---
|
||||
hw/i386/intel_iommu.c | 1 +
|
||||
1 file changed, 1 insertion(+)
|
||||
|
||||
diff --git a/hw/i386/intel_iommu.c b/hw/i386/intel_iommu.c
|
||||
index 43c94b993b4ab591067676ed022a..00ebae4863cf7e49368779bd1fc4 100644
|
||||
--- a/hw/i386/intel_iommu.c
|
||||
+++ b/hw/i386/intel_iommu.c
|
||||
@@ -948,6 +948,7 @@ static VTDBus *vtd_find_as_from_bus_num(IntelIOMMUState *s, uint8_t bus_num)
|
||||
return vtd_bus;
|
||||
}
|
||||
}
|
||||
+ vtd_bus = NULL;
|
||||
}
|
||||
return vtd_bus;
|
||||
}
|
@ -1,34 +0,0 @@
|
||||
From: Max Reitz <mreitz@redhat.com>
|
||||
Date: Wed, 18 Dec 2019 11:48:55 +0100
|
||||
Subject: iotests: Fix IMGOPTSSYNTAX for nbd
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
Git-commit: eb4ea9aaa0051054b3c148ad8631be7510851681
|
||||
|
||||
There is no $SOCKDIR, only $SOCK_DIR.
|
||||
|
||||
Fixes: f3923a72f199b2c63747a7032db74730546f55c6
|
||||
Signed-off-by: Max Reitz <mreitz@redhat.com>
|
||||
Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com>
|
||||
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
|
||||
Signed-off-by: Bruce Rogers <brogers@suse.com>
|
||||
---
|
||||
tests/qemu-iotests/common.rc | 3 ++-
|
||||
1 file changed, 2 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/tests/qemu-iotests/common.rc b/tests/qemu-iotests/common.rc
|
||||
index 6f0582c79af429c14f197b301f5c..555c45391157d58534f0702094bc 100644
|
||||
--- a/tests/qemu-iotests/common.rc
|
||||
+++ b/tests/qemu-iotests/common.rc
|
||||
@@ -217,7 +217,8 @@ if [ "$IMGOPTSSYNTAX" = "true" ]; then
|
||||
TEST_IMG="$DRIVER,file.filename=$TEST_DIR/t.$IMGFMT"
|
||||
elif [ "$IMGPROTO" = "nbd" ]; then
|
||||
TEST_IMG_FILE=$TEST_DIR/t.$IMGFMT
|
||||
- TEST_IMG="$DRIVER,file.driver=nbd,file.type=unix,file.path=$SOCKDIR/nbd"
|
||||
+ TEST_IMG="$DRIVER,file.driver=nbd,file.type=unix"
|
||||
+ TEST_IMG="$TEST_IMG,file.path=$SOCK_DIR/nbd"
|
||||
elif [ "$IMGPROTO" = "ssh" ]; then
|
||||
TEST_IMG_FILE=$TEST_DIR/t.$IMGFMT
|
||||
TEST_IMG="$DRIVER,file.driver=ssh,file.host=127.0.0.1,file.path=$TEST_IMG_FILE"
|
@ -1,61 +0,0 @@
|
||||
From: Eric Blake <eblake@redhat.com>
|
||||
Date: Wed, 26 Feb 2020 06:54:24 -0600
|
||||
Subject: iotests: Fix nonportable use of od --endian
|
||||
|
||||
Git-commit: 69135eb30b9c3fca583737a96df015174dc8e6dd
|
||||
|
||||
Tests 261 and 272 fail on RHEL 7 with coreutils 8.22, since od
|
||||
--endian was not added until coreutils 8.23. Fix this by manually
|
||||
constructing the final value one byte at a time.
|
||||
|
||||
Fixes: fc8ba423
|
||||
Reported-by: Andrey Shinkevich <andrey.shinkevich@virtuozzo.com>
|
||||
Signed-off-by: Eric Blake <eblake@redhat.com>
|
||||
Reviewed-by: Max Reitz <mreitz@redhat.com>
|
||||
Message-Id: <20200226125424.481840-1-eblake@redhat.com>
|
||||
Signed-off-by: Max Reitz <mreitz@redhat.com>
|
||||
Signed-off-by: Bruce Rogers <brogers@suse.com>
|
||||
---
|
||||
tests/qemu-iotests/common.rc | 22 +++++++++++++++++-----
|
||||
1 file changed, 17 insertions(+), 5 deletions(-)
|
||||
|
||||
diff --git a/tests/qemu-iotests/common.rc b/tests/qemu-iotests/common.rc
|
||||
index 555c45391157d58534f0702094bc..315a9a8a4690d68abc0eb5fa83fd 100644
|
||||
--- a/tests/qemu-iotests/common.rc
|
||||
+++ b/tests/qemu-iotests/common.rc
|
||||
@@ -56,18 +56,30 @@ poke_file()
|
||||
# peek_file_le 'test.img' 512 2 => 65534
|
||||
peek_file_le()
|
||||
{
|
||||
- # Wrap in echo $() to strip spaces
|
||||
- echo $(od -j"$2" -N"$3" --endian=little -An -vtu"$3" "$1")
|
||||
+ local val=0 shift=0 byte
|
||||
+
|
||||
+ # coreutils' od --endian is not portable, so manually assemble bytes.
|
||||
+ for byte in $(od -j"$2" -N"$3" -An -v -tu1 "$1"); do
|
||||
+ val=$(( val | (byte << shift) ))
|
||||
+ shift=$((shift + 8))
|
||||
+ done
|
||||
+ printf %llu $val
|
||||
}
|
||||
|
||||
# peek_file_be 'test.img' 512 2 => 65279
|
||||
peek_file_be()
|
||||
{
|
||||
- # Wrap in echo $() to strip spaces
|
||||
- echo $(od -j"$2" -N"$3" --endian=big -An -vtu"$3" "$1")
|
||||
+ local val=0 byte
|
||||
+
|
||||
+ # coreutils' od --endian is not portable, so manually assemble bytes.
|
||||
+ for byte in $(od -j"$2" -N"$3" -An -v -tu1 "$1"); do
|
||||
+ val=$(( (val << 8) | byte ))
|
||||
+ done
|
||||
+ printf %llu $val
|
||||
}
|
||||
|
||||
-# peek_file_raw 'test.img' 512 2 => '\xff\xfe'
|
||||
+# peek_file_raw 'test.img' 512 2 => '\xff\xfe'. Do not use if the raw data
|
||||
+# is likely to contain \0 or trailing \n.
|
||||
peek_file_raw()
|
||||
{
|
||||
dd if="$1" bs=1 skip="$2" count="$3" status=none
|
@ -1,82 +0,0 @@
|
||||
From: Thomas Huth <thuth@redhat.com>
|
||||
Date: Wed, 4 Dec 2019 16:46:12 +0100
|
||||
Subject: iotests: Provide a function for checking the creation of huge files
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
Git-commit: 30729ae93b7e123e472a2d42792134ae39bf9df0
|
||||
|
||||
Some tests create huge (but sparse) files, and to be able to run those
|
||||
tests in certain limited environments (like CI containers), we have to
|
||||
check for the possibility to create such files first. Thus let's introduce
|
||||
a common function to check for large files, and replace the already
|
||||
existing checks in the iotests 005 and 220 with this function.
|
||||
|
||||
Reviewed-by: Alex Bennée <alex.bennee@linaro.org>
|
||||
Signed-off-by: Thomas Huth <thuth@redhat.com>
|
||||
Reviewed-by: Cleber Rosa <crosa@redhat.com>
|
||||
Tested-by: Cleber Rosa <crosa@redhat.com>
|
||||
Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com>
|
||||
Message-Id: <20191204154618.23560-2-thuth@redhat.com>
|
||||
Signed-off-by: Alex Bennée <alex.bennee@linaro.org>
|
||||
Signed-off-by: Bruce Rogers <brogers@suse.com>
|
||||
---
|
||||
tests/qemu-iotests/005 | 5 +----
|
||||
tests/qemu-iotests/220 | 6 ++----
|
||||
tests/qemu-iotests/common.rc | 10 ++++++++++
|
||||
3 files changed, 13 insertions(+), 8 deletions(-)
|
||||
|
||||
diff --git a/tests/qemu-iotests/005 b/tests/qemu-iotests/005
|
||||
index 58442762fe366d0f5eb9bf7a1860..b6d03ac37deabcbf6372ffb17113 100755
|
||||
--- a/tests/qemu-iotests/005
|
||||
+++ b/tests/qemu-iotests/005
|
||||
@@ -59,10 +59,7 @@ fi
|
||||
# Sanity check: For raw, we require a file system that permits the creation
|
||||
# of a HUGE (but very sparse) file. Check we can create it before continuing.
|
||||
if [ "$IMGFMT" = "raw" ]; then
|
||||
- if ! truncate --size=5T "$TEST_IMG"; then
|
||||
- _notrun "file system on $TEST_DIR does not support large enough files"
|
||||
- fi
|
||||
- rm "$TEST_IMG"
|
||||
+ _require_large_file 5T
|
||||
fi
|
||||
|
||||
echo
|
||||
diff --git a/tests/qemu-iotests/220 b/tests/qemu-iotests/220
|
||||
index 2d62c5dcac2a258ed82cd4bca775..15159270d33550e4649a25fe772e 100755
|
||||
--- a/tests/qemu-iotests/220
|
||||
+++ b/tests/qemu-iotests/220
|
||||
@@ -42,10 +42,8 @@ echo "== Creating huge file =="
|
||||
|
||||
# Sanity check: We require a file system that permits the creation
|
||||
# of a HUGE (but very sparse) file. tmpfs works, ext4 does not.
|
||||
-if ! truncate --size=513T "$TEST_IMG"; then
|
||||
- _notrun "file system on $TEST_DIR does not support large enough files"
|
||||
-fi
|
||||
-rm "$TEST_IMG"
|
||||
+_require_large_file 513T
|
||||
+
|
||||
IMGOPTS='cluster_size=2M,refcount_bits=1' _make_test_img 513T
|
||||
|
||||
echo "== Populating refcounts =="
|
||||
diff --git a/tests/qemu-iotests/common.rc b/tests/qemu-iotests/common.rc
|
||||
index 0cc8acc9edd23e1cadf942676882..6f0582c79af429c14f197b301f5c 100644
|
||||
--- a/tests/qemu-iotests/common.rc
|
||||
+++ b/tests/qemu-iotests/common.rc
|
||||
@@ -643,5 +643,15 @@ _require_drivers()
|
||||
done
|
||||
}
|
||||
|
||||
+# Check that we have a file system that allows huge (but very sparse) files
|
||||
+#
|
||||
+_require_large_file()
|
||||
+{
|
||||
+ if ! truncate --size="$1" "$TEST_IMG"; then
|
||||
+ _notrun "file system on $TEST_DIR does not support large enough files"
|
||||
+ fi
|
||||
+ rm "$TEST_IMG"
|
||||
+}
|
||||
+
|
||||
# make sure this script returns success
|
||||
true
|
@ -1,33 +0,0 @@
|
||||
From: Thomas Huth <thuth@redhat.com>
|
||||
Date: Mon, 2 Dec 2019 11:16:30 +0100
|
||||
Subject: iotests: Skip test 060 if it is not possible to create large files
|
||||
|
||||
Git-commit: efd0e5a1215bbdfd28168485800f5cfec9735cf8
|
||||
|
||||
Test 060 fails in the arm64, s390x and ppc64le LXD containers on Travis
|
||||
(which we will hopefully enable in our CI soon). These containers
|
||||
apparently do not allow large files to be created. The repair process
|
||||
in test 060 creates a file of 64 GiB, so test first whether such large
|
||||
files are possible and skip the test if that's not the case.
|
||||
|
||||
Signed-off-by: Thomas Huth <thuth@redhat.com>
|
||||
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
|
||||
Signed-off-by: Bruce Rogers <brogers@suse.com>
|
||||
---
|
||||
tests/qemu-iotests/060 | 3 +++
|
||||
1 file changed, 3 insertions(+)
|
||||
|
||||
diff --git a/tests/qemu-iotests/060 b/tests/qemu-iotests/060
|
||||
index b91d8321bb8d20d1033a3081acf4..d96f17a4846979aa3cb86c8388fa 100755
|
||||
--- a/tests/qemu-iotests/060
|
||||
+++ b/tests/qemu-iotests/060
|
||||
@@ -49,6 +49,9 @@ _supported_fmt qcow2
|
||||
_supported_proto file
|
||||
_supported_os Linux
|
||||
|
||||
+# The repair process will create a large file - so check for availability first
|
||||
+_require_large_file 64G
|
||||
+
|
||||
rt_offset=65536 # 0x10000 (XXX: just an assumption)
|
||||
rb_offset=131072 # 0x20000 (XXX: just an assumption)
|
||||
l1_offset=196608 # 0x30000 (XXX: just an assumption)
|
@ -1,34 +0,0 @@
|
||||
From: Thomas Huth <thuth@redhat.com>
|
||||
Date: Mon, 2 Dec 2019 11:16:31 +0100
|
||||
Subject: iotests: Skip test 079 if it is not possible to create large files
|
||||
|
||||
Git-commit: e28582fdb28b2e8b29a351c20b0c8f1af4120688
|
||||
|
||||
Test 079 fails in the arm64, s390x and ppc64le LXD containers on Travis
|
||||
(which we will hopefully enable in our CI soon). These containers
|
||||
apparently do not allow large files to be created. Test 079 tries to
|
||||
create a 4G sparse file, which is apparently already too big for these
|
||||
containers, so check first whether we can really create such files before
|
||||
executing the test.
|
||||
|
||||
Signed-off-by: Thomas Huth <thuth@redhat.com>
|
||||
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
|
||||
Signed-off-by: Bruce Rogers <brogers@suse.com>
|
||||
---
|
||||
tests/qemu-iotests/079 | 3 +++
|
||||
1 file changed, 3 insertions(+)
|
||||
|
||||
diff --git a/tests/qemu-iotests/079 b/tests/qemu-iotests/079
|
||||
index 81f0c21f530287b2c833eefd735d..78536d3bbfa01fc0575d31d1f680 100755
|
||||
--- a/tests/qemu-iotests/079
|
||||
+++ b/tests/qemu-iotests/079
|
||||
@@ -39,6 +39,9 @@ trap "_cleanup; exit \$status" 0 1 2 3 15
|
||||
_supported_fmt qcow2
|
||||
_supported_proto file nfs
|
||||
|
||||
+# Some containers (e.g. non-x86 on Travis) do not allow large files
|
||||
+_require_large_file 4G
|
||||
+
|
||||
echo "=== Check option preallocation and cluster_size ==="
|
||||
echo
|
||||
cluster_sizes="16384 32768 65536 131072 262144 524288 1048576 2097152 4194304"
|
@ -1,140 +0,0 @@
|
||||
From: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>
|
||||
Date: Tue, 21 Jan 2020 17:28:02 +0300
|
||||
Subject: iotests: add test for backup-top failure on permission activation
|
||||
|
||||
Git-commit: a541fcc27c98b96da187c7d4573f3270f3ddd283
|
||||
|
||||
This test checks that bug is really fixed by previous commit.
|
||||
|
||||
Cc: qemu-stable@nongnu.org # v4.2.0
|
||||
Signed-off-by: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>
|
||||
Message-id: 20200121142802.21467-3-vsementsov@virtuozzo.com
|
||||
Signed-off-by: Max Reitz <mreitz@redhat.com>
|
||||
Signed-off-by: Bruce Rogers <brogers@suse.com>
|
||||
---
|
||||
tests/qemu-iotests/283 | 92 ++++++++++++++++++++++++++++++++++++++
|
||||
tests/qemu-iotests/283.out | 8 ++++
|
||||
tests/qemu-iotests/group | 1 +
|
||||
3 files changed, 101 insertions(+)
|
||||
|
||||
diff --git a/tests/qemu-iotests/283 b/tests/qemu-iotests/283
|
||||
new file mode 100644
|
||||
index 0000000000000000000000000000000000000000..293e557bd95f0553624fba89cd555614ff4a8c1b
|
||||
--- /dev/null
|
||||
+++ b/tests/qemu-iotests/283
|
||||
@@ -0,0 +1,92 @@
|
||||
+#!/usr/bin/env python
|
||||
+#
|
||||
+# Test for backup-top filter permission activation failure
|
||||
+#
|
||||
+# Copyright (c) 2019 Virtuozzo International GmbH.
|
||||
+#
|
||||
+# 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 iotests
|
||||
+
|
||||
+# The test is unrelated to formats, restrict it to qcow2 to avoid extra runs
|
||||
+iotests.verify_image_format(supported_fmts=['qcow2'])
|
||||
+
|
||||
+size = 1024 * 1024
|
||||
+
|
||||
+""" Test description
|
||||
+
|
||||
+When performing a backup, all writes on the source subtree must go through the
|
||||
+backup-top filter so it can copy all data to the target before it is changed.
|
||||
+backup-top filter is appended above source node, to achieve this thing, so all
|
||||
+parents of source node are handled. A configuration with side parents of source
|
||||
+sub-tree with write permission is unsupported (we'd have append several
|
||||
+backup-top filter like nodes to handle such parents). The test create an
|
||||
+example of such configuration and checks that a backup is then not allowed
|
||||
+(blockdev-backup command should fail).
|
||||
+
|
||||
+The configuration:
|
||||
+
|
||||
+ ┌────────┐ target ┌─────────────┐
|
||||
+ │ target │ ◀─────── │ backup_top │
|
||||
+ └────────┘ └─────────────┘
|
||||
+ │
|
||||
+ │ backing
|
||||
+ ▼
|
||||
+ ┌─────────────┐
|
||||
+ │ source │
|
||||
+ └─────────────┘
|
||||
+ │
|
||||
+ │ file
|
||||
+ ▼
|
||||
+ ┌─────────────┐ write perm ┌───────┐
|
||||
+ │ base │ ◀──────────── │ other │
|
||||
+ └─────────────┘ └───────┘
|
||||
+
|
||||
+On activation (see .active field of backup-top state in block/backup-top.c),
|
||||
+backup-top is going to unshare write permission on its source child. Write
|
||||
+unsharing will be propagated to the "source->base" link and will conflict with
|
||||
+other node write permission. So permission update will fail and backup job will
|
||||
+not be started.
|
||||
+
|
||||
+Note, that the only thing which prevents backup of running on such
|
||||
+configuration is default permission propagation scheme. It may be altered by
|
||||
+different block drivers, so backup will run in invalid configuration. But
|
||||
+something is better than nothing. Also, before the previous commit (commit
|
||||
+preceding this test creation), starting backup on such configuration led to
|
||||
+crash, so current "something" is a lot better, and this test actual goal is
|
||||
+to check that crash is fixed :)
|
||||
+"""
|
||||
+
|
||||
+vm = iotests.VM()
|
||||
+vm.launch()
|
||||
+
|
||||
+vm.qmp_log('blockdev-add', **{'node-name': 'target', 'driver': 'null-co'})
|
||||
+
|
||||
+vm.qmp_log('blockdev-add', **{
|
||||
+ 'node-name': 'source',
|
||||
+ 'driver': 'blkdebug',
|
||||
+ 'image': {'node-name': 'base', 'driver': 'null-co', 'size': size}
|
||||
+})
|
||||
+
|
||||
+vm.qmp_log('blockdev-add', **{
|
||||
+ 'node-name': 'other',
|
||||
+ 'driver': 'blkdebug',
|
||||
+ 'image': 'base',
|
||||
+ 'take-child-perms': ['write']
|
||||
+})
|
||||
+
|
||||
+vm.qmp_log('blockdev-backup', sync='full', device='source', target='target')
|
||||
+
|
||||
+vm.shutdown()
|
||||
diff --git a/tests/qemu-iotests/283.out b/tests/qemu-iotests/283.out
|
||||
new file mode 100644
|
||||
index 0000000000000000000000000000000000000000..daaf5828c18ee463671ec916989846f94c9f4b31
|
||||
--- /dev/null
|
||||
+++ b/tests/qemu-iotests/283.out
|
||||
@@ -0,0 +1,8 @@
|
||||
+{"execute": "blockdev-add", "arguments": {"driver": "null-co", "node-name": "target"}}
|
||||
+{"return": {}}
|
||||
+{"execute": "blockdev-add", "arguments": {"driver": "blkdebug", "image": {"driver": "null-co", "node-name": "base", "size": 1048576}, "node-name": "source"}}
|
||||
+{"return": {}}
|
||||
+{"execute": "blockdev-add", "arguments": {"driver": "blkdebug", "image": "base", "node-name": "other", "take-child-perms": ["write"]}}
|
||||
+{"return": {}}
|
||||
+{"execute": "blockdev-backup", "arguments": {"device": "source", "sync": "full", "target": "target"}}
|
||||
+{"error": {"class": "GenericError", "desc": "Cannot set permissions for backup-top filter: Conflicts with use by other as 'image', which uses 'write' on base"}}
|
||||
diff --git a/tests/qemu-iotests/group b/tests/qemu-iotests/group
|
||||
index 6b10a6a762143ec0d079b7fd6df2..1c1b69f0581c9a0043376b440600 100644
|
||||
--- a/tests/qemu-iotests/group
|
||||
+++ b/tests/qemu-iotests/group
|
||||
@@ -286,3 +286,4 @@
|
||||
272 rw
|
||||
273 backing quick
|
||||
277 rw quick
|
||||
+283 auto quick
|
@ -1,61 +0,0 @@
|
||||
From: Felipe Franciosi <felipe@nutanix.com>
|
||||
Date: Thu, 23 Jan 2020 12:44:59 +0000
|
||||
Subject: iscsi: Cap block count from GET LBA STATUS (CVE-2020-1711)
|
||||
|
||||
Git-commit: 693fd2acdf14dd86c0bf852610f1c2cca80a74dc
|
||||
References: bsc#1166240, CVE-2020-1711
|
||||
|
||||
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>
|
||||
Signed-off-by: Bruce Rogers <brogers@suse.com>
|
||||
---
|
||||
block/iscsi.c | 5 +++--
|
||||
1 file changed, 3 insertions(+), 2 deletions(-)
|
||||
|
||||
diff --git a/block/iscsi.c b/block/iscsi.c
|
||||
index 2aea7e3f13f73662a838d2f8187f..cbd57294ab4417a33657af0fbce8 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,223 +0,0 @@
|
||||
From: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>
|
||||
Date: Wed, 11 Mar 2020 13:29:56 +0300
|
||||
Subject: job: refactor progress to separate object
|
||||
|
||||
Git-commit: 01fe1ca945345d3dc420d70c69488143dc0451b1
|
||||
|
||||
We need it in separate to pass to the block-copy object in the next
|
||||
commit.
|
||||
|
||||
Cc: qemu-stable@nongnu.org
|
||||
Signed-off-by: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>
|
||||
Reviewed-by: Andrey Shinkevich <andrey.shinkevich@virtuozzo.com>
|
||||
Reviewed-by: Max Reitz <mreitz@redhat.com>
|
||||
Message-Id: <20200311103004.7649-2-vsementsov@virtuozzo.com>
|
||||
Signed-off-by: Max Reitz <mreitz@redhat.com>
|
||||
Signed-off-by: Bruce Rogers <brogers@suse.com>
|
||||
---
|
||||
blockjob.c | 16 +++++-----
|
||||
include/qemu/job.h | 11 ++-----
|
||||
include/qemu/progress_meter.h | 58 +++++++++++++++++++++++++++++++++++
|
||||
job-qmp.c | 4 +--
|
||||
job.c | 6 ++--
|
||||
qemu-img.c | 6 ++--
|
||||
6 files changed, 76 insertions(+), 25 deletions(-)
|
||||
|
||||
diff --git a/blockjob.c b/blockjob.c
|
||||
index c6e20e2fcde53c82146cb45efd87..701bd2588d5ca58826bad00e498d 100644
|
||||
--- a/blockjob.c
|
||||
+++ b/blockjob.c
|
||||
@@ -298,8 +298,8 @@ BlockJobInfo *block_job_query(BlockJob *job, Error **errp)
|
||||
info->device = g_strdup(job->job.id);
|
||||
info->busy = atomic_read(&job->job.busy);
|
||||
info->paused = job->job.pause_count > 0;
|
||||
- info->offset = job->job.progress_current;
|
||||
- info->len = job->job.progress_total;
|
||||
+ info->offset = job->job.progress.current;
|
||||
+ info->len = job->job.progress.total;
|
||||
info->speed = job->speed;
|
||||
info->io_status = job->iostatus;
|
||||
info->ready = job_is_ready(&job->job),
|
||||
@@ -329,8 +329,8 @@ static void block_job_event_cancelled(Notifier *n, void *opaque)
|
||||
|
||||
qapi_event_send_block_job_cancelled(job_type(&job->job),
|
||||
job->job.id,
|
||||
- job->job.progress_total,
|
||||
- job->job.progress_current,
|
||||
+ job->job.progress.total,
|
||||
+ job->job.progress.current,
|
||||
job->speed);
|
||||
}
|
||||
|
||||
@@ -349,8 +349,8 @@ static void block_job_event_completed(Notifier *n, void *opaque)
|
||||
|
||||
qapi_event_send_block_job_completed(job_type(&job->job),
|
||||
job->job.id,
|
||||
- job->job.progress_total,
|
||||
- job->job.progress_current,
|
||||
+ job->job.progress.total,
|
||||
+ job->job.progress.current,
|
||||
job->speed,
|
||||
!!msg,
|
||||
msg);
|
||||
@@ -378,8 +378,8 @@ static void block_job_event_ready(Notifier *n, void *opaque)
|
||||
|
||||
qapi_event_send_block_job_ready(job_type(&job->job),
|
||||
job->job.id,
|
||||
- job->job.progress_total,
|
||||
- job->job.progress_current,
|
||||
+ job->job.progress.total,
|
||||
+ job->job.progress.current,
|
||||
job->speed);
|
||||
}
|
||||
|
||||
diff --git a/include/qemu/job.h b/include/qemu/job.h
|
||||
index bd59cd8944de41304d8f78dce94c..32aabb1c60009825ca4a921b7864 100644
|
||||
--- a/include/qemu/job.h
|
||||
+++ b/include/qemu/job.h
|
||||
@@ -28,6 +28,7 @@
|
||||
|
||||
#include "qapi/qapi-types-job.h"
|
||||
#include "qemu/queue.h"
|
||||
+#include "qemu/progress_meter.h"
|
||||
#include "qemu/coroutine.h"
|
||||
#include "block/aio.h"
|
||||
|
||||
@@ -117,15 +118,7 @@ typedef struct Job {
|
||||
/** True if this job should automatically dismiss itself */
|
||||
bool auto_dismiss;
|
||||
|
||||
- /**
|
||||
- * Current progress. The unit is arbitrary as long as the ratio between
|
||||
- * progress_current and progress_total represents the estimated percentage
|
||||
- * of work already done.
|
||||
- */
|
||||
- int64_t progress_current;
|
||||
-
|
||||
- /** Estimated progress_current value at the completion of the job */
|
||||
- int64_t progress_total;
|
||||
+ ProgressMeter progress;
|
||||
|
||||
/**
|
||||
* Return code from @run and/or @prepare callback(s).
|
||||
diff --git a/include/qemu/progress_meter.h b/include/qemu/progress_meter.h
|
||||
new file mode 100644
|
||||
index 0000000000000000000000000000000000000000..9a23ff071c4c327c099eb5b4ec3e9d6505b298ef
|
||||
--- /dev/null
|
||||
+++ b/include/qemu/progress_meter.h
|
||||
@@ -0,0 +1,58 @@
|
||||
+/*
|
||||
+ * Helper functionality for some process progress tracking.
|
||||
+ *
|
||||
+ * Copyright (c) 2011 IBM Corp.
|
||||
+ * Copyright (c) 2012, 2018 Red Hat, Inc.
|
||||
+ * Copyright (c) 2020 Virtuozzo International GmbH
|
||||
+ *
|
||||
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
+ * of this software and associated documentation files (the "Software"), to deal
|
||||
+ * in the Software without restriction, including without limitation the rights
|
||||
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
+ * copies of the Software, and to permit persons to whom the Software is
|
||||
+ * furnished to do so, subject to the following conditions:
|
||||
+ *
|
||||
+ * The above copyright notice and this permission notice shall be included in
|
||||
+ * all copies or substantial portions of the Software.
|
||||
+ *
|
||||
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
||||
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
+ * THE SOFTWARE.
|
||||
+ */
|
||||
+
|
||||
+#ifndef QEMU_PROGRESS_METER_H
|
||||
+#define QEMU_PROGRESS_METER_H
|
||||
+
|
||||
+typedef struct ProgressMeter {
|
||||
+ /**
|
||||
+ * Current progress. The unit is arbitrary as long as the ratio between
|
||||
+ * current and total represents the estimated percentage
|
||||
+ * of work already done.
|
||||
+ */
|
||||
+ uint64_t current;
|
||||
+
|
||||
+ /** Estimated current value at the completion of the process */
|
||||
+ uint64_t total;
|
||||
+} ProgressMeter;
|
||||
+
|
||||
+static inline void progress_work_done(ProgressMeter *pm, uint64_t done)
|
||||
+{
|
||||
+ pm->current += done;
|
||||
+}
|
||||
+
|
||||
+static inline void progress_set_remaining(ProgressMeter *pm, uint64_t remaining)
|
||||
+{
|
||||
+ pm->total = pm->current + remaining;
|
||||
+}
|
||||
+
|
||||
+static inline void progress_increase_remaining(ProgressMeter *pm,
|
||||
+ uint64_t delta)
|
||||
+{
|
||||
+ pm->total += delta;
|
||||
+}
|
||||
+
|
||||
+#endif /* QEMU_PROGRESS_METER_H */
|
||||
diff --git a/job-qmp.c b/job-qmp.c
|
||||
index fbfed25a00067c5035bfde3d7b89..fecc939ebd951aa3bb863400b71c 100644
|
||||
--- a/job-qmp.c
|
||||
+++ b/job-qmp.c
|
||||
@@ -143,8 +143,8 @@ static JobInfo *job_query_single(Job *job, Error **errp)
|
||||
.id = g_strdup(job->id),
|
||||
.type = job_type(job),
|
||||
.status = job->status,
|
||||
- .current_progress = job->progress_current,
|
||||
- .total_progress = job->progress_total,
|
||||
+ .current_progress = job->progress.current,
|
||||
+ .total_progress = job->progress.total,
|
||||
.has_error = !!job->err,
|
||||
.error = job->err ? \
|
||||
g_strdup(error_get_pretty(job->err)) : NULL,
|
||||
diff --git a/job.c b/job.c
|
||||
index 04409b40aab3545798414bda1a87..134a07b92e5ef05a52bee7e21a96 100644
|
||||
--- a/job.c
|
||||
+++ b/job.c
|
||||
@@ -369,17 +369,17 @@ void job_unref(Job *job)
|
||||
|
||||
void job_progress_update(Job *job, uint64_t done)
|
||||
{
|
||||
- job->progress_current += done;
|
||||
+ progress_work_done(&job->progress, done);
|
||||
}
|
||||
|
||||
void job_progress_set_remaining(Job *job, uint64_t remaining)
|
||||
{
|
||||
- job->progress_total = job->progress_current + remaining;
|
||||
+ progress_set_remaining(&job->progress, remaining);
|
||||
}
|
||||
|
||||
void job_progress_increase_remaining(Job *job, uint64_t delta)
|
||||
{
|
||||
- job->progress_total += delta;
|
||||
+ progress_increase_remaining(&job->progress, delta);
|
||||
}
|
||||
|
||||
void job_event_cancelled(Job *job)
|
||||
diff --git a/qemu-img.c b/qemu-img.c
|
||||
index 95a24b9762b0b00ef13f68cd4251..9ae07bbc80bd1fa0e6e20a04ec73 100644
|
||||
--- a/qemu-img.c
|
||||
+++ b/qemu-img.c
|
||||
@@ -881,9 +881,9 @@ static void run_block_job(BlockJob *job, Error **errp)
|
||||
do {
|
||||
float progress = 0.0f;
|
||||
aio_poll(aio_context, true);
|
||||
- if (job->job.progress_total) {
|
||||
- progress = (float)job->job.progress_current /
|
||||
- job->job.progress_total * 100.f;
|
||||
+ if (job->job.progress.total) {
|
||||
+ progress = (float)job->job.progress.current /
|
||||
+ job->job.progress.total * 100.f;
|
||||
}
|
||||
qemu_progress_print(progress, 0);
|
||||
} while (!job_is_ready(&job->job) && !job_is_completed(&job->job));
|
@ -21,10 +21,10 @@ Signed-off-by: Andreas Färber <afaerber@suse.de>
|
||||
1 file changed, 24 insertions(+)
|
||||
|
||||
diff --git a/linux-user/syscall.c b/linux-user/syscall.c
|
||||
index 57be4c98555e50f2263811cd11f4..243ec2a1e3bde8e6b3ac48989554 100644
|
||||
index 894627b9dc8d4f72c06bab90aa9b..39b824760a29765dc9538d8574e5 100644
|
||||
--- a/linux-user/syscall.c
|
||||
+++ b/linux-user/syscall.c
|
||||
@@ -7068,6 +7068,27 @@ static int open_self_stat(void *cpu_env, int fd)
|
||||
@@ -7344,6 +7344,27 @@ static int open_self_stat(void *cpu_env, int fd)
|
||||
return 0;
|
||||
}
|
||||
|
||||
@ -52,7 +52,7 @@ index 57be4c98555e50f2263811cd11f4..243ec2a1e3bde8e6b3ac48989554 100644
|
||||
static int open_self_auxv(void *cpu_env, int fd)
|
||||
{
|
||||
CPUState *cpu = env_cpu((CPUArchState *)cpu_env);
|
||||
@@ -7210,6 +7231,9 @@ static int do_openat(void *cpu_env, int dirfd, const char *pathname, int flags,
|
||||
@@ -7486,6 +7507,9 @@ static int do_openat(void *cpu_env, int dirfd, const char *pathname, int flags,
|
||||
#if defined(TARGET_SPARC)
|
||||
{ "/proc/cpuinfo", open_cpuinfo, is_proc },
|
||||
#endif
|
||||
|
@ -30,12 +30,12 @@ Signed-off-by: Alexander Graf <agraf@suse.de>
|
||||
Signed-off-by: Andreas Färber <afaerber@suse.de>
|
||||
---
|
||||
Makefile.target | 13 +++++++++++++
|
||||
linux-user/Makefile.objs | 2 ++
|
||||
linux-user/Makefile.objs | 1 +
|
||||
linux-user/binfmt.c | 42 ++++++++++++++++++++++++++++++++++++++++
|
||||
3 files changed, 57 insertions(+)
|
||||
3 files changed, 56 insertions(+)
|
||||
|
||||
diff --git a/Makefile.target b/Makefile.target
|
||||
index 24d79d26ebd00034bd97309fe5a7..1e9600834a25544063c313eba92a 100644
|
||||
index 8ed1eba95b9c29ab4e47349cbdb2..8b5d84006cb32d4463f13059de93 100644
|
||||
--- a/Makefile.target
|
||||
+++ b/Makefile.target
|
||||
@@ -39,6 +39,10 @@ endif
|
||||
@ -49,7 +49,7 @@ index 24d79d26ebd00034bd97309fe5a7..1e9600834a25544063c313eba92a 100644
|
||||
config-target.h: config-target.h-timestamp
|
||||
config-target.h-timestamp: config-target.mak
|
||||
|
||||
@@ -133,6 +137,8 @@ QEMU_CFLAGS+=-I$(SRC_PATH)/linux-user/$(TARGET_ABI_DIR) \
|
||||
@@ -134,6 +138,8 @@ QEMU_CFLAGS+=-I$(SRC_PATH)/linux-user/$(TARGET_ABI_DIR) \
|
||||
obj-y += linux-user/
|
||||
obj-y += gdbstub.o thunk.o
|
||||
|
||||
@ -58,7 +58,7 @@ index 24d79d26ebd00034bd97309fe5a7..1e9600834a25544063c313eba92a 100644
|
||||
endif #CONFIG_LINUX_USER
|
||||
|
||||
#########################################################
|
||||
@@ -174,7 +180,11 @@ generated-files-y += config-devices.h
|
||||
@@ -176,7 +182,11 @@ generated-files-y += config-devices.h
|
||||
|
||||
endif # CONFIG_SOFTMMU
|
||||
|
||||
@ -81,14 +81,13 @@ index 24d79d26ebd00034bd97309fe5a7..1e9600834a25544063c313eba92a 100644
|
||||
$(call quiet-command,rm -f $@ && $(SHELL) $(SRC_PATH)/scripts/feature_to_c.sh $@ $(TARGET_XML_FILES),"GEN","$(TARGET_DIR)$@")
|
||||
|
||||
diff --git a/linux-user/Makefile.objs b/linux-user/Makefile.objs
|
||||
index d2f33beb5e52efce6adc7fb85b7f..ffc6b095e253d4c448000a974d4d 100644
|
||||
index 1940910a7321c5a44d29c2602f9e..84c770a6cb58193d73afdffa2b01 100644
|
||||
--- a/linux-user/Makefile.objs
|
||||
+++ b/linux-user/Makefile.objs
|
||||
@@ -8,3 +8,5 @@ obj-$(TARGET_I386) += vm86.o
|
||||
obj-$(TARGET_ARM) += arm/nwfpe/
|
||||
obj-$(TARGET_ARM) += arm/semihost.o
|
||||
obj-$(TARGET_AARCH64) += arm/semihost.o
|
||||
+
|
||||
@@ -23,3 +23,4 @@ obj-$(TARGET_SPARC) += sparc/
|
||||
obj-$(TARGET_SPARC64) += $(TARGET_ABI_DIR)/
|
||||
obj-$(TARGET_X86_64) += x86_64/
|
||||
obj-$(TARGET_XTENSA) += xtensa/
|
||||
+obj-binfmt-y = binfmt.o
|
||||
diff --git a/linux-user/binfmt.c b/linux-user/binfmt.c
|
||||
new file mode 100644
|
||||
|
@ -15,10 +15,10 @@ Signed-off-by: Alexander Graf <agraf@suse.de>
|
||||
1 file changed, 7 insertions(+), 2 deletions(-)
|
||||
|
||||
diff --git a/linux-user/syscall.c b/linux-user/syscall.c
|
||||
index 61d976cca146a6deb2d74c95ec59..926a7dd587b39d0615cbbb077ef2 100644
|
||||
index 0317c64f4ae460c972fe4fe67ef8..6ada54d3a19e455c0c12a1d4b321 100644
|
||||
--- a/linux-user/syscall.c
|
||||
+++ b/linux-user/syscall.c
|
||||
@@ -7729,8 +7729,13 @@ static abi_long do_syscall1(void *cpu_env, int num, abi_ulong arg1,
|
||||
@@ -8005,8 +8005,13 @@ static abi_long do_syscall1(void *cpu_env, int num, abi_ulong arg1,
|
||||
return ret;
|
||||
#endif
|
||||
#ifdef TARGET_NR_lseek
|
||||
|
@ -15,10 +15,10 @@ Signed-off-by: Andreas Schwab <schwab@suse.de>
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
diff --git a/linux-user/syscall.c b/linux-user/syscall.c
|
||||
index 926a7dd587b39d0615cbbb077ef2..9330a1ec6a15f16e4f7fd0f825c2 100644
|
||||
index 6ada54d3a19e455c0c12a1d4b321..69c9dee831d8fdb96cde3a0b996c 100644
|
||||
--- a/linux-user/syscall.c
|
||||
+++ b/linux-user/syscall.c
|
||||
@@ -9758,7 +9758,7 @@ static abi_long do_syscall1(void *cpu_env, int num, abi_ulong arg1,
|
||||
@@ -10052,7 +10052,7 @@ static abi_long do_syscall1(void *cpu_env, int num, abi_ulong arg1,
|
||||
{
|
||||
struct timespec ts, *pts;
|
||||
|
||||
|
@ -16,10 +16,10 @@ Signed-off-by: Alexander Graf <agraf@suse.de>
|
||||
2 files changed, 13 insertions(+), 13 deletions(-)
|
||||
|
||||
diff --git a/linux-user/qemu.h b/linux-user/qemu.h
|
||||
index f6f5fe5fbb553c151cb57146350c..b45b68221434e29636bb34c9f0b0 100644
|
||||
index 792c74290f8d376235b07f3f8ef0..956ad6db3df11684132402dd877b 100644
|
||||
--- a/linux-user/qemu.h
|
||||
+++ b/linux-user/qemu.h
|
||||
@@ -206,10 +206,10 @@ abi_long memcpy_to_target(abi_ulong dest, const void *src,
|
||||
@@ -207,10 +207,10 @@ abi_long memcpy_to_target(abi_ulong dest, const void *src,
|
||||
void target_set_brk(abi_ulong new_brk);
|
||||
abi_long do_brk(abi_ulong new_brk);
|
||||
void syscall_init(void);
|
||||
@ -31,14 +31,14 @@ index f6f5fe5fbb553c151cb57146350c..b45b68221434e29636bb34c9f0b0 100644
|
||||
+ abi_ulong arg2, abi_ulong arg3, abi_ulong arg4,
|
||||
+ abi_ulong arg5, abi_ulong arg6, abi_ulong arg7,
|
||||
+ abi_ulong arg8);
|
||||
void gemu_log(const char *fmt, ...) GCC_FMT_ATTR(1, 2);
|
||||
extern __thread CPUState *thread_cpu;
|
||||
void cpu_loop(CPUArchState *env);
|
||||
const char *target_strerror(int err);
|
||||
diff --git a/linux-user/syscall.c b/linux-user/syscall.c
|
||||
index 243ec2a1e3bde8e6b3ac48989554..61d976cca146a6deb2d74c95ec59 100644
|
||||
index 39b824760a29765dc9538d8574e5..0317c64f4ae460c972fe4fe67ef8 100644
|
||||
--- a/linux-user/syscall.c
|
||||
+++ b/linux-user/syscall.c
|
||||
@@ -7374,10 +7374,10 @@ static int host_to_target_cpu_mask(const unsigned long *host_mask,
|
||||
@@ -7650,10 +7650,10 @@ static int host_to_target_cpu_mask(const unsigned long *host_mask,
|
||||
* of syscall results, can be performed.
|
||||
* All errnos that do_syscall() returns must be -TARGET_<errcode>.
|
||||
*/
|
||||
@ -53,7 +53,7 @@ index 243ec2a1e3bde8e6b3ac48989554..61d976cca146a6deb2d74c95ec59 100644
|
||||
{
|
||||
CPUState *cpu = env_cpu(cpu_env);
|
||||
abi_long ret;
|
||||
@@ -10125,7 +10125,7 @@ static abi_long do_syscall1(void *cpu_env, int num, abi_long arg1,
|
||||
@@ -10423,7 +10423,7 @@ static abi_long do_syscall1(void *cpu_env, int num, abi_long arg1,
|
||||
*/
|
||||
ret = -TARGET_EINVAL;
|
||||
if (cpu_isar_feature(aa64_sve, env_archcpu(cpu_env))
|
||||
@ -62,7 +62,7 @@ index 243ec2a1e3bde8e6b3ac48989554..61d976cca146a6deb2d74c95ec59 100644
|
||||
CPUARMState *env = cpu_env;
|
||||
ARMCPU *cpu = env_archcpu(env);
|
||||
uint32_t vq, old_vq;
|
||||
@@ -12116,10 +12116,10 @@ static abi_long do_syscall1(void *cpu_env, int num, abi_long arg1,
|
||||
@@ -12456,10 +12456,10 @@ static abi_long do_syscall1(void *cpu_env, int num, abi_long arg1,
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
@ -1,100 +0,0 @@
|
||||
From: Laurent Vivier <laurent@vivier.eu>
|
||||
Date: Thu, 16 Jan 2020 17:54:54 +0100
|
||||
Subject: m68k: Fix regression causing Single-Step via GDB/RSP to not single
|
||||
step
|
||||
|
||||
Git-commit: 322f244aaa80a5208090d41481c1c09c6face66b
|
||||
|
||||
A regression that was introduced, with the refactor to TranslatorOps,
|
||||
drops two lines that update the PC when single-stepping is being performed.
|
||||
|
||||
Fixes: 11ab74b01e0a ("target/m68k: Convert to TranslatorOps")
|
||||
Reported-by: Lucien Murray-Pitts <lucienmp_antispam@yahoo.com>
|
||||
Suggested-by: Lucien Murray-Pitts <lucienmp_antispam@yahoo.com>
|
||||
Suggested-by: Richard Henderson <richard.henderson@linaro.org>
|
||||
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
|
||||
Signed-off-by: Laurent Vivier <laurent@vivier.eu>
|
||||
Message-Id: <20200116165454.2076265-1-laurent@vivier.eu>
|
||||
Signed-off-by: Bruce Rogers <brogers@suse.com>
|
||||
---
|
||||
target/m68k/translate.c | 42 ++++++++++++++++++++++++++---------------
|
||||
1 file changed, 27 insertions(+), 15 deletions(-)
|
||||
|
||||
diff --git a/target/m68k/translate.c b/target/m68k/translate.c
|
||||
index fcdb7bc8e4eeabc2f3b0e336c064..16fae5ac9ec3f729ef402b805e41 100644
|
||||
--- a/target/m68k/translate.c
|
||||
+++ b/target/m68k/translate.c
|
||||
@@ -289,16 +289,21 @@ static void gen_jmp(DisasContext *s, TCGv dest)
|
||||
s->base.is_jmp = DISAS_JUMP;
|
||||
}
|
||||
|
||||
-static void gen_exception(DisasContext *s, uint32_t dest, int nr)
|
||||
+static void gen_raise_exception(int nr)
|
||||
{
|
||||
TCGv_i32 tmp;
|
||||
|
||||
- update_cc_op(s);
|
||||
- tcg_gen_movi_i32(QREG_PC, dest);
|
||||
-
|
||||
tmp = tcg_const_i32(nr);
|
||||
gen_helper_raise_exception(cpu_env, tmp);
|
||||
tcg_temp_free_i32(tmp);
|
||||
+}
|
||||
+
|
||||
+static void gen_exception(DisasContext *s, uint32_t dest, int nr)
|
||||
+{
|
||||
+ update_cc_op(s);
|
||||
+ tcg_gen_movi_i32(QREG_PC, dest);
|
||||
+
|
||||
+ gen_raise_exception(nr);
|
||||
|
||||
s->base.is_jmp = DISAS_NORETURN;
|
||||
}
|
||||
@@ -6198,29 +6203,36 @@ static void m68k_tr_tb_stop(DisasContextBase *dcbase, CPUState *cpu)
|
||||
{
|
||||
DisasContext *dc = container_of(dcbase, DisasContext, base);
|
||||
|
||||
- if (dc->base.is_jmp == DISAS_NORETURN) {
|
||||
- return;
|
||||
- }
|
||||
- if (dc->base.singlestep_enabled) {
|
||||
- gen_helper_raise_exception(cpu_env, tcg_const_i32(EXCP_DEBUG));
|
||||
- return;
|
||||
- }
|
||||
-
|
||||
switch (dc->base.is_jmp) {
|
||||
+ case DISAS_NORETURN:
|
||||
+ break;
|
||||
case DISAS_TOO_MANY:
|
||||
update_cc_op(dc);
|
||||
- gen_jmp_tb(dc, 0, dc->pc);
|
||||
+ if (dc->base.singlestep_enabled) {
|
||||
+ tcg_gen_movi_i32(QREG_PC, dc->pc);
|
||||
+ gen_raise_exception(EXCP_DEBUG);
|
||||
+ } else {
|
||||
+ gen_jmp_tb(dc, 0, dc->pc);
|
||||
+ }
|
||||
break;
|
||||
case DISAS_JUMP:
|
||||
/* We updated CC_OP and PC in gen_jmp/gen_jmp_im. */
|
||||
- tcg_gen_lookup_and_goto_ptr();
|
||||
+ if (dc->base.singlestep_enabled) {
|
||||
+ gen_raise_exception(EXCP_DEBUG);
|
||||
+ } else {
|
||||
+ tcg_gen_lookup_and_goto_ptr();
|
||||
+ }
|
||||
break;
|
||||
case DISAS_EXIT:
|
||||
/*
|
||||
* We updated CC_OP and PC in gen_exit_tb, but also modified
|
||||
* other state that may require returning to the main loop.
|
||||
*/
|
||||
- tcg_gen_exit_tb(NULL, 0);
|
||||
+ if (dc->base.singlestep_enabled) {
|
||||
+ gen_raise_exception(EXCP_DEBUG);
|
||||
+ } else {
|
||||
+ tcg_gen_exit_tb(NULL, 0);
|
||||
+ }
|
||||
break;
|
||||
default:
|
||||
g_assert_not_reached();
|
@ -1,149 +0,0 @@
|
||||
From: "Dr. David Alan Gilbert" <dgilbert@redhat.com>
|
||||
Date: Thu, 5 Dec 2019 10:29:18 +0000
|
||||
Subject: migration: Rate limit inside host pages
|
||||
|
||||
Git-commit: 97e1e06780e70f6e98a0d2df881e0c0927d3aeb6
|
||||
|
||||
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>
|
||||
Signed-off-by: Bruce Rogers <brogers@suse.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 354ad072fa5553333c5b1e0d8023..27500d09a94a8615c935245e23ed 100644
|
||||
--- a/migration/migration.c
|
||||
+++ b/migration/migration.c
|
||||
@@ -3224,6 +3224,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.
|
||||
@@ -3290,8 +3321,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) {
|
||||
@@ -3318,29 +3347,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 79b3dda146f716955f413383bf39..aa9ff6f27b19d7ee165048aa7b6d 100644
|
||||
--- a/migration/migration.h
|
||||
+++ b/migration/migration.h
|
||||
@@ -341,5 +341,6 @@ int foreach_not_ignored_block(RAMBlockIterFunc func, void *opaque);
|
||||
|
||||
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 5078f94490de7a1bc71670376078..b6de7d1d5552a0aa39b0d232c2d6 100644
|
||||
--- a/migration/ram.c
|
||||
+++ b/migration/ram.c
|
||||
@@ -2616,6 +2616,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 6dee7b5389dc2be37b3851820919..2f9129e213d41a6350fe7e968697 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,31 +0,0 @@
|
||||
From: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>
|
||||
Date: Tue, 24 Mar 2020 18:36:28 +0300
|
||||
Subject: migration/colo: fix use after free of local_err
|
||||
|
||||
Git-commit: 27d07fcfa70c3afa0664288cbce5334ed9595a3a
|
||||
|
||||
local_err is used again in secondary_vm_do_failover() after
|
||||
replication_stop_all(), so we must zero it. Otherwise try to set
|
||||
non-NULL local_err will crash.
|
||||
|
||||
Signed-off-by: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>
|
||||
Message-Id: <20200324153630.11882-5-vsementsov@virtuozzo.com>
|
||||
Reviewed-by: Dr. David Alan Gilbert <dgilbert@redhat.com>
|
||||
Signed-off-by: Dr. David Alan Gilbert <dgilbert@redhat.com>
|
||||
Signed-off-by: Bruce Rogers <brogers@suse.com>
|
||||
---
|
||||
migration/colo.c | 1 +
|
||||
1 file changed, 1 insertion(+)
|
||||
|
||||
diff --git a/migration/colo.c b/migration/colo.c
|
||||
index 2c88aa57a29307963a15fc017b1d..6d46800aa6a2617521a36cc0dc33 100644
|
||||
--- a/migration/colo.c
|
||||
+++ b/migration/colo.c
|
||||
@@ -92,6 +92,7 @@ static void secondary_vm_do_failover(void)
|
||||
replication_stop_all(true, &local_err);
|
||||
if (local_err) {
|
||||
error_report_err(local_err);
|
||||
+ local_err = NULL;
|
||||
}
|
||||
|
||||
/* Notify all filters of all NIC to do checkpoint */
|
@ -1,31 +0,0 @@
|
||||
From: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>
|
||||
Date: Tue, 24 Mar 2020 18:36:29 +0300
|
||||
Subject: migration/ram: fix use after free of local_err
|
||||
|
||||
Git-commit: b4a1733c5e6827c72b0dcfa295e07ef7b1ebccff
|
||||
|
||||
local_err is used again in migration_bitmap_sync_precopy() after
|
||||
precopy_notify(), so we must zero it. Otherwise try to set
|
||||
non-NULL local_err will crash.
|
||||
|
||||
Signed-off-by: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>
|
||||
Message-Id: <20200324153630.11882-6-vsementsov@virtuozzo.com>
|
||||
Reviewed-by: Dr. David Alan Gilbert <dgilbert@redhat.com>
|
||||
Signed-off-by: Dr. David Alan Gilbert <dgilbert@redhat.com>
|
||||
Signed-off-by: Bruce Rogers <brogers@suse.com>
|
||||
---
|
||||
migration/ram.c | 1 +
|
||||
1 file changed, 1 insertion(+)
|
||||
|
||||
diff --git a/migration/ram.c b/migration/ram.c
|
||||
index b6de7d1d5552a0aa39b0d232c2d6..c44542175da044c78ef8dc0ce612 100644
|
||||
--- a/migration/ram.c
|
||||
+++ b/migration/ram.c
|
||||
@@ -1906,6 +1906,7 @@ static void migration_bitmap_sync_precopy(RAMState *rs)
|
||||
*/
|
||||
if (precopy_notify(PRECOPY_NOTIFY_BEFORE_BITMAP_SYNC, &local_err)) {
|
||||
error_report_err(local_err);
|
||||
+ local_err = NULL;
|
||||
}
|
||||
|
||||
migration_bitmap_sync(rs);
|
@ -1,55 +0,0 @@
|
||||
From: Laurent Vivier <lvivier@redhat.com>
|
||||
Date: Tue, 7 Jan 2020 17:34:37 +0100
|
||||
Subject: migration-test: ppc64: fix FORTH test program
|
||||
|
||||
Git-commit: 16c5c6928ff53bd95e6504301ef6c285501531e7
|
||||
|
||||
Commit e51e711b1bef has moved the initialization of start_address and
|
||||
end_address after the definition of the command line argument,
|
||||
where the nvramrc is initialized, and thus the loop is between 0 and 0
|
||||
rather than 1 MiB and 100 MiB.
|
||||
|
||||
It doesn't affect the result of the test if all the tests are run in
|
||||
sequence because the two first tests don't run the loop, so the
|
||||
values are correctly initialized when we actually need them.
|
||||
|
||||
But it hangs when we ask to run only one test, for instance:
|
||||
|
||||
QTEST_QEMU_BINARY=ppc64-softmmu/qemu-system-ppc64 \
|
||||
tests/migration-test -m=quick -p /ppc64/migration/validate_uuid_error
|
||||
|
||||
Fixes: e51e711b1bef ("tests/migration: Add migration-test header file")
|
||||
Cc: wei@redhat.com
|
||||
Signed-off-by: Laurent Vivier <lvivier@redhat.com>
|
||||
Message-Id: <20200107163437.52139-1-lvivier@redhat.com>
|
||||
Reviewed-by: Dr. David Alan Gilbert <dgilbert@redhat.com>
|
||||
Reviewed-by: Juan Quintela <quintela@redhat.com>
|
||||
Acked-by: David Gibson <david@gibson.dropbear.id.au>
|
||||
Signed-off-by: Thomas Huth <thuth@redhat.com>
|
||||
Signed-off-by: Bruce Rogers <brogers@suse.com>
|
||||
---
|
||||
tests/migration-test.c | 4 ++--
|
||||
1 file changed, 2 insertions(+), 2 deletions(-)
|
||||
|
||||
diff --git a/tests/migration-test.c b/tests/migration-test.c
|
||||
index ebd77a581affd8872138f6f36d5e..d79980fbe39dfaa3fa89999ee64f 100644
|
||||
--- a/tests/migration-test.c
|
||||
+++ b/tests/migration-test.c
|
||||
@@ -614,6 +614,8 @@ static int test_migrate_start(QTestState **from, QTestState **to,
|
||||
end_address = S390_TEST_MEM_END;
|
||||
} else if (strcmp(arch, "ppc64") == 0) {
|
||||
extra_opts = use_shmem ? get_shmem_opts("256M", shmem_path) : NULL;
|
||||
+ start_address = PPC_TEST_MEM_START;
|
||||
+ end_address = PPC_TEST_MEM_END;
|
||||
cmd_src = g_strdup_printf("-machine accel=%s,vsmt=8 -m 256M -nodefaults"
|
||||
" -name source,debug-threads=on"
|
||||
" -serial file:%s/src_serial"
|
||||
@@ -630,8 +632,6 @@ static int test_migrate_start(QTestState **from, QTestState **to,
|
||||
accel, tmpfs, uri,
|
||||
extra_opts ? extra_opts : "", opts_dst);
|
||||
|
||||
- start_address = PPC_TEST_MEM_START;
|
||||
- end_address = PPC_TEST_MEM_END;
|
||||
} else if (strcmp(arch, "aarch64") == 0) {
|
||||
init_bootfile(bootpath, aarch64_kernel, sizeof(aarch64_kernel));
|
||||
extra_opts = use_shmem ? get_shmem_opts("150M", shmem_path) : NULL;
|
@ -1,144 +0,0 @@
|
||||
From: Prasad J Pandit <pjp@fedoraproject.org>
|
||||
Date: Tue, 24 Mar 2020 22:57:22 +0530
|
||||
Subject: net: tulip: check frame size and r/w data length
|
||||
|
||||
Git-commit: 8ffb7265af64ec81748335ec8f20e7ab542c3850
|
||||
References: bsc#1168713, CVE-2020-11102
|
||||
|
||||
Tulip network driver while copying tx/rx buffers does not check
|
||||
frame size against r/w data length. This may lead to OOB buffer
|
||||
access. Add check to avoid it.
|
||||
|
||||
Limit iterations over descriptors to avoid potential infinite
|
||||
loop issue in tulip_xmit_list_update.
|
||||
|
||||
Reported-by: Li Qiang <pangpei.lq@antfin.com>
|
||||
Reported-by: Ziming Zhang <ezrakiez@gmail.com>
|
||||
Reported-by: Jason Wang <jasowang@redhat.com>
|
||||
Tested-by: Li Qiang <liq3ea@gmail.com>
|
||||
Reviewed-by: Li Qiang <liq3ea@gmail.com>
|
||||
Signed-off-by: Prasad J Pandit <pjp@fedoraproject.org>
|
||||
Signed-off-by: Jason Wang <jasowang@redhat.com>
|
||||
Signed-off-by: Bruce Rogers <brogers@suse.com>
|
||||
---
|
||||
hw/net/tulip.c | 36 +++++++++++++++++++++++++++---------
|
||||
1 file changed, 27 insertions(+), 9 deletions(-)
|
||||
|
||||
diff --git a/hw/net/tulip.c b/hw/net/tulip.c
|
||||
index f85f54341fab635a4d5756a6c444..1167c1bb07d74783f3fa47b01996 100644
|
||||
--- a/hw/net/tulip.c
|
||||
+++ b/hw/net/tulip.c
|
||||
@@ -170,6 +170,10 @@ static void tulip_copy_rx_bytes(TULIPState *s, struct tulip_descriptor *desc)
|
||||
} else {
|
||||
len = s->rx_frame_len;
|
||||
}
|
||||
+
|
||||
+ if (s->rx_frame_len + len > sizeof(s->rx_frame)) {
|
||||
+ return;
|
||||
+ }
|
||||
pci_dma_write(&s->dev, desc->buf_addr1, s->rx_frame +
|
||||
(s->rx_frame_size - s->rx_frame_len), len);
|
||||
s->rx_frame_len -= len;
|
||||
@@ -181,6 +185,10 @@ static void tulip_copy_rx_bytes(TULIPState *s, struct tulip_descriptor *desc)
|
||||
} else {
|
||||
len = s->rx_frame_len;
|
||||
}
|
||||
+
|
||||
+ if (s->rx_frame_len + len > sizeof(s->rx_frame)) {
|
||||
+ return;
|
||||
+ }
|
||||
pci_dma_write(&s->dev, desc->buf_addr2, s->rx_frame +
|
||||
(s->rx_frame_size - s->rx_frame_len), len);
|
||||
s->rx_frame_len -= len;
|
||||
@@ -227,7 +235,8 @@ static ssize_t tulip_receive(TULIPState *s, const uint8_t *buf, size_t size)
|
||||
|
||||
trace_tulip_receive(buf, size);
|
||||
|
||||
- if (size < 14 || size > 2048 || s->rx_frame_len || tulip_rx_stopped(s)) {
|
||||
+ if (size < 14 || size > sizeof(s->rx_frame) - 4
|
||||
+ || s->rx_frame_len || tulip_rx_stopped(s)) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -275,7 +284,6 @@ static ssize_t tulip_receive_nc(NetClientState *nc,
|
||||
return tulip_receive(qemu_get_nic_opaque(nc), buf, size);
|
||||
}
|
||||
|
||||
-
|
||||
static NetClientInfo net_tulip_info = {
|
||||
.type = NET_CLIENT_DRIVER_NIC,
|
||||
.size = sizeof(NICState),
|
||||
@@ -558,7 +566,7 @@ static void tulip_tx(TULIPState *s, struct tulip_descriptor *desc)
|
||||
if ((s->csr[6] >> CSR6_OM_SHIFT) & CSR6_OM_MASK) {
|
||||
/* Internal or external Loopback */
|
||||
tulip_receive(s, s->tx_frame, s->tx_frame_len);
|
||||
- } else {
|
||||
+ } else if (s->tx_frame_len <= sizeof(s->tx_frame)) {
|
||||
qemu_send_packet(qemu_get_queue(s->nic),
|
||||
s->tx_frame, s->tx_frame_len);
|
||||
}
|
||||
@@ -570,23 +578,31 @@ static void tulip_tx(TULIPState *s, struct tulip_descriptor *desc)
|
||||
}
|
||||
}
|
||||
|
||||
-static void tulip_copy_tx_buffers(TULIPState *s, struct tulip_descriptor *desc)
|
||||
+static int tulip_copy_tx_buffers(TULIPState *s, struct tulip_descriptor *desc)
|
||||
{
|
||||
int len1 = (desc->control >> TDES1_BUF1_SIZE_SHIFT) & TDES1_BUF1_SIZE_MASK;
|
||||
int len2 = (desc->control >> TDES1_BUF2_SIZE_SHIFT) & TDES1_BUF2_SIZE_MASK;
|
||||
|
||||
+ if (s->tx_frame_len + len1 > sizeof(s->tx_frame)) {
|
||||
+ return -1;
|
||||
+ }
|
||||
if (len1) {
|
||||
pci_dma_read(&s->dev, desc->buf_addr1,
|
||||
s->tx_frame + s->tx_frame_len, len1);
|
||||
s->tx_frame_len += len1;
|
||||
}
|
||||
|
||||
+ if (s->tx_frame_len + len2 > sizeof(s->tx_frame)) {
|
||||
+ return -1;
|
||||
+ }
|
||||
if (len2) {
|
||||
pci_dma_read(&s->dev, desc->buf_addr2,
|
||||
s->tx_frame + s->tx_frame_len, len2);
|
||||
s->tx_frame_len += len2;
|
||||
}
|
||||
desc->status = (len1 + len2) ? 0 : 0x7fffffff;
|
||||
+
|
||||
+ return 0;
|
||||
}
|
||||
|
||||
static void tulip_setup_filter_addr(TULIPState *s, uint8_t *buf, int n)
|
||||
@@ -651,13 +667,15 @@ static uint32_t tulip_ts(TULIPState *s)
|
||||
|
||||
static void tulip_xmit_list_update(TULIPState *s)
|
||||
{
|
||||
+#define TULIP_DESC_MAX 128
|
||||
+ uint8_t i = 0;
|
||||
struct tulip_descriptor desc;
|
||||
|
||||
if (tulip_ts(s) != CSR5_TS_SUSPENDED) {
|
||||
return;
|
||||
}
|
||||
|
||||
- for (;;) {
|
||||
+ for (i = 0; i < TULIP_DESC_MAX; i++) {
|
||||
tulip_desc_read(s, s->current_tx_desc, &desc);
|
||||
tulip_dump_tx_descriptor(s, &desc);
|
||||
|
||||
@@ -675,10 +693,10 @@ static void tulip_xmit_list_update(TULIPState *s)
|
||||
s->tx_frame_len = 0;
|
||||
}
|
||||
|
||||
- tulip_copy_tx_buffers(s, &desc);
|
||||
-
|
||||
- if (desc.control & TDES1_LS) {
|
||||
- tulip_tx(s, &desc);
|
||||
+ if (!tulip_copy_tx_buffers(s, &desc)) {
|
||||
+ if (desc.control & TDES1_LS) {
|
||||
+ tulip_tx(s, &desc);
|
||||
+ }
|
||||
}
|
||||
}
|
||||
tulip_desc_write(s, s->current_tx_desc, &desc);
|
@ -1,303 +0,0 @@
|
||||
From: Tao Xu <tao3.xu@intel.com>
|
||||
Date: Fri, 13 Dec 2019 09:19:22 +0800
|
||||
Subject: numa: Extend CLI to provide initiator information for numa nodes
|
||||
|
||||
Git-commit: 244b3f4485a07c7ce4b7123d6ce9d8c6012756e8
|
||||
References: jsc#SLE-8897
|
||||
|
||||
In ACPI 6.3 chapter 5.2.27 Heterogeneous Memory Attribute Table (HMAT),
|
||||
The initiator represents processor which access to memory. And in 5.2.27.3
|
||||
Memory Proximity Domain Attributes Structure, the attached initiator is
|
||||
defined as where the memory controller responsible for a memory proximity
|
||||
domain. With attached initiator information, the topology of heterogeneous
|
||||
memory can be described. Add new machine property 'hmat' to enable all
|
||||
HMAT specific options.
|
||||
|
||||
Extend CLI of "-numa node" option to indicate the initiator numa node-id.
|
||||
In the linux kernel, the codes in drivers/acpi/hmat/hmat.c parse and report
|
||||
the platform's HMAT tables. Before using initiator option, enable HMAT with
|
||||
-machine hmat=on.
|
||||
|
||||
Acked-by: Markus Armbruster <armbru@redhat.com>
|
||||
Reviewed-by: Igor Mammedov <imammedo@redhat.com>
|
||||
Reviewed-by: Jingqi Liu <jingqi.liu@intel.com>
|
||||
Suggested-by: Dan Williams <dan.j.williams@intel.com>
|
||||
Signed-off-by: Tao Xu <tao3.xu@intel.com>
|
||||
Message-Id: <20191213011929.2520-2-tao3.xu@intel.com>
|
||||
Reviewed-by: Michael S. Tsirkin <mst@redhat.com>
|
||||
Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
|
||||
Signed-off-by: Bruce Rogers <brogers@suse.com>
|
||||
---
|
||||
hw/core/machine.c | 64 +++++++++++++++++++++++++++++++++++++++++++
|
||||
hw/core/numa.c | 23 ++++++++++++++++
|
||||
include/sysemu/numa.h | 5 ++++
|
||||
qapi/machine.json | 10 ++++++-
|
||||
qemu-options.hx | 35 +++++++++++++++++++----
|
||||
5 files changed, 131 insertions(+), 6 deletions(-)
|
||||
|
||||
diff --git a/hw/core/machine.c b/hw/core/machine.c
|
||||
index aa63231f3160aaf32874e59ba452..a15c5a8673ade765965b4e2c8237 100644
|
||||
--- a/hw/core/machine.c
|
||||
+++ b/hw/core/machine.c
|
||||
@@ -518,6 +518,20 @@ static void machine_set_nvdimm(Object *obj, bool value, Error **errp)
|
||||
ms->nvdimms_state->is_enabled = value;
|
||||
}
|
||||
|
||||
+static bool machine_get_hmat(Object *obj, Error **errp)
|
||||
+{
|
||||
+ MachineState *ms = MACHINE(obj);
|
||||
+
|
||||
+ return ms->numa_state->hmat_enabled;
|
||||
+}
|
||||
+
|
||||
+static void machine_set_hmat(Object *obj, bool value, Error **errp)
|
||||
+{
|
||||
+ MachineState *ms = MACHINE(obj);
|
||||
+
|
||||
+ ms->numa_state->hmat_enabled = value;
|
||||
+}
|
||||
+
|
||||
static char *machine_get_nvdimm_persistence(Object *obj, Error **errp)
|
||||
{
|
||||
MachineState *ms = MACHINE(obj);
|
||||
@@ -645,6 +659,7 @@ void machine_set_cpu_numa_node(MachineState *machine,
|
||||
const CpuInstanceProperties *props, Error **errp)
|
||||
{
|
||||
MachineClass *mc = MACHINE_GET_CLASS(machine);
|
||||
+ NodeInfo *numa_info = machine->numa_state->nodes;
|
||||
bool match = false;
|
||||
int i;
|
||||
|
||||
@@ -714,6 +729,17 @@ void machine_set_cpu_numa_node(MachineState *machine,
|
||||
match = true;
|
||||
slot->props.node_id = props->node_id;
|
||||
slot->props.has_node_id = props->has_node_id;
|
||||
+
|
||||
+ if (machine->numa_state->hmat_enabled) {
|
||||
+ if ((numa_info[props->node_id].initiator < MAX_NODES) &&
|
||||
+ (props->node_id != numa_info[props->node_id].initiator)) {
|
||||
+ error_setg(errp, "The initiator of CPU NUMA node %" PRId64
|
||||
+ " should be itself", props->node_id);
|
||||
+ return;
|
||||
+ }
|
||||
+ numa_info[props->node_id].has_cpu = true;
|
||||
+ numa_info[props->node_id].initiator = props->node_id;
|
||||
+ }
|
||||
}
|
||||
|
||||
if (!match) {
|
||||
@@ -960,6 +986,13 @@ static void machine_initfn(Object *obj)
|
||||
|
||||
if (mc->cpu_index_to_instance_props && mc->get_default_cpu_node_id) {
|
||||
ms->numa_state = g_new0(NumaState, 1);
|
||||
+ object_property_add_bool(obj, "hmat",
|
||||
+ machine_get_hmat, machine_set_hmat,
|
||||
+ &error_abort);
|
||||
+ object_property_set_description(obj, "hmat",
|
||||
+ "Set on/off to enable/disable "
|
||||
+ "ACPI Heterogeneous Memory Attribute "
|
||||
+ "Table (HMAT)", NULL);
|
||||
}
|
||||
|
||||
/* Register notifier when init is done for sysbus sanity checks */
|
||||
@@ -1048,6 +1081,32 @@ static char *cpu_slot_to_string(const CPUArchId *cpu)
|
||||
return g_string_free(s, false);
|
||||
}
|
||||
|
||||
+static void numa_validate_initiator(NumaState *numa_state)
|
||||
+{
|
||||
+ int i;
|
||||
+ NodeInfo *numa_info = numa_state->nodes;
|
||||
+
|
||||
+ for (i = 0; i < numa_state->num_nodes; i++) {
|
||||
+ if (numa_info[i].initiator == MAX_NODES) {
|
||||
+ error_report("The initiator of NUMA node %d is missing, use "
|
||||
+ "'-numa node,initiator' option to declare it", i);
|
||||
+ exit(1);
|
||||
+ }
|
||||
+
|
||||
+ if (!numa_info[numa_info[i].initiator].present) {
|
||||
+ error_report("NUMA node %" PRIu16 " is missing, use "
|
||||
+ "'-numa node' option to declare it first",
|
||||
+ numa_info[i].initiator);
|
||||
+ exit(1);
|
||||
+ }
|
||||
+
|
||||
+ if (!numa_info[numa_info[i].initiator].has_cpu) {
|
||||
+ error_report("The initiator of NUMA node %d is invalid", i);
|
||||
+ exit(1);
|
||||
+ }
|
||||
+ }
|
||||
+}
|
||||
+
|
||||
static void machine_numa_finish_cpu_init(MachineState *machine)
|
||||
{
|
||||
int i;
|
||||
@@ -1088,6 +1147,11 @@ static void machine_numa_finish_cpu_init(MachineState *machine)
|
||||
machine_set_cpu_numa_node(machine, &props, &error_fatal);
|
||||
}
|
||||
}
|
||||
+
|
||||
+ if (machine->numa_state->hmat_enabled) {
|
||||
+ numa_validate_initiator(machine->numa_state);
|
||||
+ }
|
||||
+
|
||||
if (s->len && !qtest_enabled()) {
|
||||
warn_report("CPU(s) not present in any NUMA nodes: %s",
|
||||
s->str);
|
||||
diff --git a/hw/core/numa.c b/hw/core/numa.c
|
||||
index e3332a984f7c9639b2a058ac9ac7..e60da99293b4d19c090711659928 100644
|
||||
--- a/hw/core/numa.c
|
||||
+++ b/hw/core/numa.c
|
||||
@@ -133,6 +133,29 @@ static void parse_numa_node(MachineState *ms, NumaNodeOptions *node,
|
||||
numa_info[nodenr].node_mem = object_property_get_uint(o, "size", NULL);
|
||||
numa_info[nodenr].node_memdev = MEMORY_BACKEND(o);
|
||||
}
|
||||
+
|
||||
+ /*
|
||||
+ * If not set the initiator, set it to MAX_NODES. And if
|
||||
+ * HMAT is enabled and this node has no cpus, QEMU will raise error.
|
||||
+ */
|
||||
+ numa_info[nodenr].initiator = MAX_NODES;
|
||||
+ if (node->has_initiator) {
|
||||
+ if (!ms->numa_state->hmat_enabled) {
|
||||
+ error_setg(errp, "ACPI Heterogeneous Memory Attribute Table "
|
||||
+ "(HMAT) is disabled, enable it with -machine hmat=on "
|
||||
+ "before using any of hmat specific options");
|
||||
+ return;
|
||||
+ }
|
||||
+
|
||||
+ if (node->initiator >= MAX_NODES) {
|
||||
+ error_report("The initiator id %" PRIu16 " expects an integer "
|
||||
+ "between 0 and %d", node->initiator,
|
||||
+ MAX_NODES - 1);
|
||||
+ return;
|
||||
+ }
|
||||
+
|
||||
+ numa_info[nodenr].initiator = node->initiator;
|
||||
+ }
|
||||
numa_info[nodenr].present = true;
|
||||
max_numa_nodeid = MAX(max_numa_nodeid, nodenr + 1);
|
||||
ms->numa_state->num_nodes++;
|
||||
diff --git a/include/sysemu/numa.h b/include/sysemu/numa.h
|
||||
index ae9c41d02ba47c089d19d74b3a4f..788cbec7a2096e262555ac6e83cb 100644
|
||||
--- a/include/sysemu/numa.h
|
||||
+++ b/include/sysemu/numa.h
|
||||
@@ -18,6 +18,8 @@ struct NodeInfo {
|
||||
uint64_t node_mem;
|
||||
struct HostMemoryBackend *node_memdev;
|
||||
bool present;
|
||||
+ bool has_cpu;
|
||||
+ uint16_t initiator;
|
||||
uint8_t distance[MAX_NODES];
|
||||
};
|
||||
|
||||
@@ -33,6 +35,9 @@ struct NumaState {
|
||||
/* Allow setting NUMA distance for different NUMA nodes */
|
||||
bool have_numa_distance;
|
||||
|
||||
+ /* Detect if HMAT support is enabled. */
|
||||
+ bool hmat_enabled;
|
||||
+
|
||||
/* NUMA nodes information */
|
||||
NodeInfo nodes[MAX_NODES];
|
||||
};
|
||||
diff --git a/qapi/machine.json b/qapi/machine.json
|
||||
index ca26779f1a3623e86befc00ee8d8..27d0e375342a502c7676d23837a7 100644
|
||||
--- a/qapi/machine.json
|
||||
+++ b/qapi/machine.json
|
||||
@@ -463,6 +463,13 @@
|
||||
# @memdev: memory backend object. If specified for one node,
|
||||
# it must be specified for all nodes.
|
||||
#
|
||||
+# @initiator: defined in ACPI 6.3 Chapter 5.2.27.3 Table 5-145,
|
||||
+# points to the nodeid which has the memory controller
|
||||
+# responsible for this NUMA node. This field provides
|
||||
+# additional information as to the initiator node that
|
||||
+# is closest (as in directly attached) to this node, and
|
||||
+# therefore has the best performance (since 5.0)
|
||||
+#
|
||||
# Since: 2.1
|
||||
##
|
||||
{ 'struct': 'NumaNodeOptions',
|
||||
@@ -470,7 +477,8 @@
|
||||
'*nodeid': 'uint16',
|
||||
'*cpus': ['uint16'],
|
||||
'*mem': 'size',
|
||||
- '*memdev': 'str' }}
|
||||
+ '*memdev': 'str',
|
||||
+ '*initiator': 'uint16' }}
|
||||
|
||||
##
|
||||
# @NumaDistOptions:
|
||||
diff --git a/qemu-options.hx b/qemu-options.hx
|
||||
index e14d88e9b2f3a3c13a4c20db0b36..9b1618cd34d9fe1d8374d6abb954 100644
|
||||
--- a/qemu-options.hx
|
||||
+++ b/qemu-options.hx
|
||||
@@ -43,7 +43,8 @@ DEF("machine", HAS_ARG, QEMU_OPTION_machine, \
|
||||
" suppress-vmdesc=on|off disables self-describing migration (default=off)\n"
|
||||
" nvdimm=on|off controls NVDIMM support (default=off)\n"
|
||||
" enforce-config-section=on|off enforce configuration section migration (default=off)\n"
|
||||
- " memory-encryption=@var{} memory encryption object to use (default=none)\n",
|
||||
+ " memory-encryption=@var{} memory encryption object to use (default=none)\n"
|
||||
+ " hmat=on|off controls ACPI HMAT support (default=off)\n",
|
||||
QEMU_ARCH_ALL)
|
||||
STEXI
|
||||
@item -machine [type=]@var{name}[,prop=@var{value}[,...]]
|
||||
@@ -103,6 +104,9 @@ NOTE: this parameter is deprecated. Please use @option{-global}
|
||||
@option{migration.send-configuration}=@var{on|off} instead.
|
||||
@item memory-encryption=@var{}
|
||||
Memory encryption object to use. The default is none.
|
||||
+@item hmat=on|off
|
||||
+Enables or disables ACPI Heterogeneous Memory Attribute Table (HMAT) support.
|
||||
+The default is off.
|
||||
@end table
|
||||
ETEXI
|
||||
|
||||
@@ -161,14 +165,14 @@ If any on the three values is given, the total number of CPUs @var{n} can be omi
|
||||
ETEXI
|
||||
|
||||
DEF("numa", HAS_ARG, QEMU_OPTION_numa,
|
||||
- "-numa node[,mem=size][,cpus=firstcpu[-lastcpu]][,nodeid=node]\n"
|
||||
- "-numa node[,memdev=id][,cpus=firstcpu[-lastcpu]][,nodeid=node]\n"
|
||||
+ "-numa node[,mem=size][,cpus=firstcpu[-lastcpu]][,nodeid=node][,initiator=node]\n"
|
||||
+ "-numa node[,memdev=id][,cpus=firstcpu[-lastcpu]][,nodeid=node][,initiator=node]\n"
|
||||
"-numa dist,src=source,dst=destination,val=distance\n"
|
||||
"-numa cpu,node-id=node[,socket-id=x][,core-id=y][,thread-id=z]\n",
|
||||
QEMU_ARCH_ALL)
|
||||
STEXI
|
||||
-@item -numa node[,mem=@var{size}][,cpus=@var{firstcpu}[-@var{lastcpu}]][,nodeid=@var{node}]
|
||||
-@itemx -numa node[,memdev=@var{id}][,cpus=@var{firstcpu}[-@var{lastcpu}]][,nodeid=@var{node}]
|
||||
+@item -numa node[,mem=@var{size}][,cpus=@var{firstcpu}[-@var{lastcpu}]][,nodeid=@var{node}][,initiator=@var{initiator}]
|
||||
+@itemx -numa node[,memdev=@var{id}][,cpus=@var{firstcpu}[-@var{lastcpu}]][,nodeid=@var{node}][,initiator=@var{initiator}]
|
||||
@itemx -numa dist,src=@var{source},dst=@var{destination},val=@var{distance}
|
||||
@itemx -numa cpu,node-id=@var{node}[,socket-id=@var{x}][,core-id=@var{y}][,thread-id=@var{z}]
|
||||
@findex -numa
|
||||
@@ -215,6 +219,27 @@ split equally between them.
|
||||
@samp{mem} and @samp{memdev} are mutually exclusive. Furthermore,
|
||||
if one node uses @samp{memdev}, all of them have to use it.
|
||||
|
||||
+@samp{initiator} is an additional option that points to an @var{initiator}
|
||||
+NUMA node that has best performance (the lowest latency or largest bandwidth)
|
||||
+to this NUMA @var{node}. Note that this option can be set only when
|
||||
+the machine property 'hmat' is set to 'on'.
|
||||
+
|
||||
+Following example creates a machine with 2 NUMA nodes, node 0 has CPU.
|
||||
+node 1 has only memory, and its initiator is node 0. Note that because
|
||||
+node 0 has CPU, by default the initiator of node 0 is itself and must be
|
||||
+itself.
|
||||
+@example
|
||||
+-machine hmat=on \
|
||||
+-m 2G,slots=2,maxmem=4G \
|
||||
+-object memory-backend-ram,size=1G,id=m0 \
|
||||
+-object memory-backend-ram,size=1G,id=m1 \
|
||||
+-numa node,nodeid=0,memdev=m0 \
|
||||
+-numa node,nodeid=1,memdev=m1,initiator=0 \
|
||||
+-smp 2,sockets=2,maxcpus=2 \
|
||||
+-numa cpu,node-id=0,socket-id=0 \
|
||||
+-numa cpu,node-id=0,socket-id=1
|
||||
+@end example
|
||||
+
|
||||
@var{source} and @var{destination} are NUMA node IDs.
|
||||
@var{distance} is the NUMA distance from @var{source} to @var{destination}.
|
||||
The distance from a node to itself is always 10. If any pair of nodes is
|
@ -1,530 +0,0 @@
|
||||
From: Liu Jingqi <jingqi.liu@intel.com>
|
||||
Date: Fri, 13 Dec 2019 09:19:23 +0800
|
||||
Subject: numa: Extend CLI to provide memory latency and bandwidth information
|
||||
|
||||
Git-commit: 9b12dfa03a94d7f7a4b54eb67229a31e58193384
|
||||
References: jsc#SLE-8897
|
||||
|
||||
Add -numa hmat-lb option to provide System Locality Latency and
|
||||
Bandwidth Information. These memory attributes help to build
|
||||
System Locality Latency and Bandwidth Information Structure(s)
|
||||
in ACPI Heterogeneous Memory Attribute Table (HMAT). Before using
|
||||
hmat-lb option, enable HMAT with -machine hmat=on.
|
||||
|
||||
Acked-by: Markus Armbruster <armbru@redhat.com>
|
||||
Signed-off-by: Liu Jingqi <jingqi.liu@intel.com>
|
||||
Signed-off-by: Tao Xu <tao3.xu@intel.com>
|
||||
Message-Id: <20191213011929.2520-3-tao3.xu@intel.com>
|
||||
Reviewed-by: Michael S. Tsirkin <mst@redhat.com>
|
||||
Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
|
||||
Reviewed-by: Igor Mammedov <imammedo@redhat.com>
|
||||
Signed-off-by: Bruce Rogers <brogers@suse.com>
|
||||
---
|
||||
hw/core/numa.c | 194 ++++++++++++++++++++++++++++++++++++++++++
|
||||
include/sysemu/numa.h | 53 ++++++++++++
|
||||
qapi/machine.json | 93 +++++++++++++++++++-
|
||||
qemu-options.hx | 47 +++++++++-
|
||||
4 files changed, 384 insertions(+), 3 deletions(-)
|
||||
|
||||
diff --git a/hw/core/numa.c b/hw/core/numa.c
|
||||
index e60da99293b4d19c090711659928..34eb413f5d58a6feb11214ecc061 100644
|
||||
--- a/hw/core/numa.c
|
||||
+++ b/hw/core/numa.c
|
||||
@@ -23,6 +23,7 @@
|
||||
*/
|
||||
|
||||
#include "qemu/osdep.h"
|
||||
+#include "qemu/units.h"
|
||||
#include "sysemu/hostmem.h"
|
||||
#include "sysemu/numa.h"
|
||||
#include "sysemu/sysemu.h"
|
||||
@@ -198,6 +199,186 @@ void parse_numa_distance(MachineState *ms, NumaDistOptions *dist, Error **errp)
|
||||
ms->numa_state->have_numa_distance = true;
|
||||
}
|
||||
|
||||
+void parse_numa_hmat_lb(NumaState *numa_state, NumaHmatLBOptions *node,
|
||||
+ Error **errp)
|
||||
+{
|
||||
+ int i, first_bit, last_bit;
|
||||
+ uint64_t max_entry, temp_base, bitmap_copy;
|
||||
+ NodeInfo *numa_info = numa_state->nodes;
|
||||
+ HMAT_LB_Info *hmat_lb =
|
||||
+ numa_state->hmat_lb[node->hierarchy][node->data_type];
|
||||
+ HMAT_LB_Data lb_data = {};
|
||||
+ HMAT_LB_Data *lb_temp;
|
||||
+
|
||||
+ /* Error checking */
|
||||
+ if (node->initiator > numa_state->num_nodes) {
|
||||
+ error_setg(errp, "Invalid initiator=%d, it should be less than %d",
|
||||
+ node->initiator, numa_state->num_nodes);
|
||||
+ return;
|
||||
+ }
|
||||
+ if (node->target > numa_state->num_nodes) {
|
||||
+ error_setg(errp, "Invalid target=%d, it should be less than %d",
|
||||
+ node->target, numa_state->num_nodes);
|
||||
+ return;
|
||||
+ }
|
||||
+ if (!numa_info[node->initiator].has_cpu) {
|
||||
+ error_setg(errp, "Invalid initiator=%d, it isn't an "
|
||||
+ "initiator proximity domain", node->initiator);
|
||||
+ return;
|
||||
+ }
|
||||
+ if (!numa_info[node->target].present) {
|
||||
+ error_setg(errp, "The target=%d should point to an existing node",
|
||||
+ node->target);
|
||||
+ return;
|
||||
+ }
|
||||
+
|
||||
+ if (!hmat_lb) {
|
||||
+ hmat_lb = g_malloc0(sizeof(*hmat_lb));
|
||||
+ numa_state->hmat_lb[node->hierarchy][node->data_type] = hmat_lb;
|
||||
+ hmat_lb->list = g_array_new(false, true, sizeof(HMAT_LB_Data));
|
||||
+ }
|
||||
+ hmat_lb->hierarchy = node->hierarchy;
|
||||
+ hmat_lb->data_type = node->data_type;
|
||||
+ lb_data.initiator = node->initiator;
|
||||
+ lb_data.target = node->target;
|
||||
+
|
||||
+ if (node->data_type <= HMATLB_DATA_TYPE_WRITE_LATENCY) {
|
||||
+ /* Input latency data */
|
||||
+
|
||||
+ if (!node->has_latency) {
|
||||
+ error_setg(errp, "Missing 'latency' option");
|
||||
+ return;
|
||||
+ }
|
||||
+ if (node->has_bandwidth) {
|
||||
+ error_setg(errp, "Invalid option 'bandwidth' since "
|
||||
+ "the data type is latency");
|
||||
+ return;
|
||||
+ }
|
||||
+
|
||||
+ /* Detect duplicate configuration */
|
||||
+ for (i = 0; i < hmat_lb->list->len; i++) {
|
||||
+ lb_temp = &g_array_index(hmat_lb->list, HMAT_LB_Data, i);
|
||||
+
|
||||
+ if (node->initiator == lb_temp->initiator &&
|
||||
+ node->target == lb_temp->target) {
|
||||
+ error_setg(errp, "Duplicate configuration of the latency for "
|
||||
+ "initiator=%d and target=%d", node->initiator,
|
||||
+ node->target);
|
||||
+ return;
|
||||
+ }
|
||||
+ }
|
||||
+
|
||||
+ hmat_lb->base = hmat_lb->base ? hmat_lb->base : UINT64_MAX;
|
||||
+
|
||||
+ if (node->latency) {
|
||||
+ /* Calculate the temporary base and compressed latency */
|
||||
+ max_entry = node->latency;
|
||||
+ temp_base = 1;
|
||||
+ while (QEMU_IS_ALIGNED(max_entry, 10)) {
|
||||
+ max_entry /= 10;
|
||||
+ temp_base *= 10;
|
||||
+ }
|
||||
+
|
||||
+ /* Calculate the max compressed latency */
|
||||
+ temp_base = MIN(hmat_lb->base, temp_base);
|
||||
+ max_entry = node->latency / hmat_lb->base;
|
||||
+ max_entry = MAX(hmat_lb->range_bitmap, max_entry);
|
||||
+
|
||||
+ /*
|
||||
+ * For latency hmat_lb->range_bitmap record the max compressed
|
||||
+ * latency which should be less than 0xFFFF (UINT16_MAX)
|
||||
+ */
|
||||
+ if (max_entry >= UINT16_MAX) {
|
||||
+ error_setg(errp, "Latency %" PRIu64 " between initiator=%d and "
|
||||
+ "target=%d should not differ from previously entered "
|
||||
+ "min or max values on more than %d", node->latency,
|
||||
+ node->initiator, node->target, UINT16_MAX - 1);
|
||||
+ return;
|
||||
+ } else {
|
||||
+ hmat_lb->base = temp_base;
|
||||
+ hmat_lb->range_bitmap = max_entry;
|
||||
+ }
|
||||
+
|
||||
+ /*
|
||||
+ * Set lb_info_provided bit 0 as 1,
|
||||
+ * latency information is provided
|
||||
+ */
|
||||
+ numa_info[node->target].lb_info_provided |= BIT(0);
|
||||
+ }
|
||||
+ lb_data.data = node->latency;
|
||||
+ } else if (node->data_type >= HMATLB_DATA_TYPE_ACCESS_BANDWIDTH) {
|
||||
+ /* Input bandwidth data */
|
||||
+ if (!node->has_bandwidth) {
|
||||
+ error_setg(errp, "Missing 'bandwidth' option");
|
||||
+ return;
|
||||
+ }
|
||||
+ if (node->has_latency) {
|
||||
+ error_setg(errp, "Invalid option 'latency' since "
|
||||
+ "the data type is bandwidth");
|
||||
+ return;
|
||||
+ }
|
||||
+ if (!QEMU_IS_ALIGNED(node->bandwidth, MiB)) {
|
||||
+ error_setg(errp, "Bandwidth %" PRIu64 " between initiator=%d and "
|
||||
+ "target=%d should be 1MB aligned", node->bandwidth,
|
||||
+ node->initiator, node->target);
|
||||
+ return;
|
||||
+ }
|
||||
+
|
||||
+ /* Detect duplicate configuration */
|
||||
+ for (i = 0; i < hmat_lb->list->len; i++) {
|
||||
+ lb_temp = &g_array_index(hmat_lb->list, HMAT_LB_Data, i);
|
||||
+
|
||||
+ if (node->initiator == lb_temp->initiator &&
|
||||
+ node->target == lb_temp->target) {
|
||||
+ error_setg(errp, "Duplicate configuration of the bandwidth for "
|
||||
+ "initiator=%d and target=%d", node->initiator,
|
||||
+ node->target);
|
||||
+ return;
|
||||
+ }
|
||||
+ }
|
||||
+
|
||||
+ hmat_lb->base = hmat_lb->base ? hmat_lb->base : 1;
|
||||
+
|
||||
+ if (node->bandwidth) {
|
||||
+ /* Keep bitmap unchanged when bandwidth out of range */
|
||||
+ bitmap_copy = hmat_lb->range_bitmap;
|
||||
+ bitmap_copy |= node->bandwidth;
|
||||
+ first_bit = ctz64(bitmap_copy);
|
||||
+ temp_base = UINT64_C(1) << first_bit;
|
||||
+ max_entry = node->bandwidth / temp_base;
|
||||
+ last_bit = 64 - clz64(bitmap_copy);
|
||||
+
|
||||
+ /*
|
||||
+ * For bandwidth, first_bit record the base unit of bandwidth bits,
|
||||
+ * last_bit record the last bit of the max bandwidth. The max
|
||||
+ * compressed bandwidth should be less than 0xFFFF (UINT16_MAX)
|
||||
+ */
|
||||
+ if ((last_bit - first_bit) > UINT16_BITS ||
|
||||
+ max_entry >= UINT16_MAX) {
|
||||
+ error_setg(errp, "Bandwidth %" PRIu64 " between initiator=%d "
|
||||
+ "and target=%d should not differ from previously "
|
||||
+ "entered values on more than %d", node->bandwidth,
|
||||
+ node->initiator, node->target, UINT16_MAX - 1);
|
||||
+ return;
|
||||
+ } else {
|
||||
+ hmat_lb->base = temp_base;
|
||||
+ hmat_lb->range_bitmap = bitmap_copy;
|
||||
+ }
|
||||
+
|
||||
+ /*
|
||||
+ * Set lb_info_provided bit 1 as 1,
|
||||
+ * bandwidth information is provided
|
||||
+ */
|
||||
+ numa_info[node->target].lb_info_provided |= BIT(1);
|
||||
+ }
|
||||
+ lb_data.data = node->bandwidth;
|
||||
+ } else {
|
||||
+ assert(0);
|
||||
+ }
|
||||
+
|
||||
+ g_array_append_val(hmat_lb->list, lb_data);
|
||||
+}
|
||||
+
|
||||
void set_numa_options(MachineState *ms, NumaOptions *object, Error **errp)
|
||||
{
|
||||
Error *err = NULL;
|
||||
@@ -236,6 +417,19 @@ void set_numa_options(MachineState *ms, NumaOptions *object, Error **errp)
|
||||
machine_set_cpu_numa_node(ms, qapi_NumaCpuOptions_base(&object->u.cpu),
|
||||
&err);
|
||||
break;
|
||||
+ case NUMA_OPTIONS_TYPE_HMAT_LB:
|
||||
+ if (!ms->numa_state->hmat_enabled) {
|
||||
+ error_setg(errp, "ACPI Heterogeneous Memory Attribute Table "
|
||||
+ "(HMAT) is disabled, enable it with -machine hmat=on "
|
||||
+ "before using any of hmat specific options");
|
||||
+ return;
|
||||
+ }
|
||||
+
|
||||
+ parse_numa_hmat_lb(ms->numa_state, &object->u.hmat_lb, &err);
|
||||
+ if (err) {
|
||||
+ goto end;
|
||||
+ }
|
||||
+ break;
|
||||
default:
|
||||
abort();
|
||||
}
|
||||
diff --git a/include/sysemu/numa.h b/include/sysemu/numa.h
|
||||
index 788cbec7a2096e262555ac6e83cb..70f93c83d71eb2cdab5bf1dde422 100644
|
||||
--- a/include/sysemu/numa.h
|
||||
+++ b/include/sysemu/numa.h
|
||||
@@ -14,11 +14,34 @@ struct CPUArchId;
|
||||
#define NUMA_DISTANCE_MAX 254
|
||||
#define NUMA_DISTANCE_UNREACHABLE 255
|
||||
|
||||
+/* the value of AcpiHmatLBInfo flags */
|
||||
+enum {
|
||||
+ HMAT_LB_MEM_MEMORY = 0,
|
||||
+ HMAT_LB_MEM_CACHE_1ST_LEVEL = 1,
|
||||
+ HMAT_LB_MEM_CACHE_2ND_LEVEL = 2,
|
||||
+ HMAT_LB_MEM_CACHE_3RD_LEVEL = 3,
|
||||
+ HMAT_LB_LEVELS /* must be the last entry */
|
||||
+};
|
||||
+
|
||||
+/* the value of AcpiHmatLBInfo data type */
|
||||
+enum {
|
||||
+ HMAT_LB_DATA_ACCESS_LATENCY = 0,
|
||||
+ HMAT_LB_DATA_READ_LATENCY = 1,
|
||||
+ HMAT_LB_DATA_WRITE_LATENCY = 2,
|
||||
+ HMAT_LB_DATA_ACCESS_BANDWIDTH = 3,
|
||||
+ HMAT_LB_DATA_READ_BANDWIDTH = 4,
|
||||
+ HMAT_LB_DATA_WRITE_BANDWIDTH = 5,
|
||||
+ HMAT_LB_TYPES /* must be the last entry */
|
||||
+};
|
||||
+
|
||||
+#define UINT16_BITS 16
|
||||
+
|
||||
struct NodeInfo {
|
||||
uint64_t node_mem;
|
||||
struct HostMemoryBackend *node_memdev;
|
||||
bool present;
|
||||
bool has_cpu;
|
||||
+ uint8_t lb_info_provided;
|
||||
uint16_t initiator;
|
||||
uint8_t distance[MAX_NODES];
|
||||
};
|
||||
@@ -28,6 +51,31 @@ struct NumaNodeMem {
|
||||
uint64_t node_plugged_mem;
|
||||
};
|
||||
|
||||
+struct HMAT_LB_Data {
|
||||
+ uint8_t initiator;
|
||||
+ uint8_t target;
|
||||
+ uint64_t data;
|
||||
+};
|
||||
+typedef struct HMAT_LB_Data HMAT_LB_Data;
|
||||
+
|
||||
+struct HMAT_LB_Info {
|
||||
+ /* Indicates it's memory or the specified level memory side cache. */
|
||||
+ uint8_t hierarchy;
|
||||
+
|
||||
+ /* Present the type of data, access/read/write latency or bandwidth. */
|
||||
+ uint8_t data_type;
|
||||
+
|
||||
+ /* The range bitmap of bandwidth for calculating common base */
|
||||
+ uint64_t range_bitmap;
|
||||
+
|
||||
+ /* The common base unit for latencies or bandwidths */
|
||||
+ uint64_t base;
|
||||
+
|
||||
+ /* Array to store the latencies or bandwidths */
|
||||
+ GArray *list;
|
||||
+};
|
||||
+typedef struct HMAT_LB_Info HMAT_LB_Info;
|
||||
+
|
||||
struct NumaState {
|
||||
/* Number of NUMA nodes */
|
||||
int num_nodes;
|
||||
@@ -40,11 +88,16 @@ struct NumaState {
|
||||
|
||||
/* NUMA nodes information */
|
||||
NodeInfo nodes[MAX_NODES];
|
||||
+
|
||||
+ /* NUMA nodes HMAT Locality Latency and Bandwidth Information */
|
||||
+ HMAT_LB_Info *hmat_lb[HMAT_LB_LEVELS][HMAT_LB_TYPES];
|
||||
};
|
||||
typedef struct NumaState NumaState;
|
||||
|
||||
void set_numa_options(MachineState *ms, NumaOptions *object, Error **errp);
|
||||
void parse_numa_opts(MachineState *ms);
|
||||
+void parse_numa_hmat_lb(NumaState *numa_state, NumaHmatLBOptions *node,
|
||||
+ Error **errp);
|
||||
void numa_complete_configuration(MachineState *ms);
|
||||
void query_numa_node_mem(NumaNodeMem node_mem[], MachineState *ms);
|
||||
extern QemuOptsList qemu_numa_opts;
|
||||
diff --git a/qapi/machine.json b/qapi/machine.json
|
||||
index 27d0e375342a502c7676d23837a7..cf8faf5a2a4929560c852bf8d50c 100644
|
||||
--- a/qapi/machine.json
|
||||
+++ b/qapi/machine.json
|
||||
@@ -426,10 +426,12 @@
|
||||
#
|
||||
# @cpu: property based CPU(s) to node mapping (Since: 2.10)
|
||||
#
|
||||
+# @hmat-lb: memory latency and bandwidth information (Since: 5.0)
|
||||
+#
|
||||
# Since: 2.1
|
||||
##
|
||||
{ 'enum': 'NumaOptionsType',
|
||||
- 'data': [ 'node', 'dist', 'cpu' ] }
|
||||
+ 'data': [ 'node', 'dist', 'cpu', 'hmat-lb' ] }
|
||||
|
||||
##
|
||||
# @NumaOptions:
|
||||
@@ -444,7 +446,8 @@
|
||||
'data': {
|
||||
'node': 'NumaNodeOptions',
|
||||
'dist': 'NumaDistOptions',
|
||||
- 'cpu': 'NumaCpuOptions' }}
|
||||
+ 'cpu': 'NumaCpuOptions',
|
||||
+ 'hmat-lb': 'NumaHmatLBOptions' }}
|
||||
|
||||
##
|
||||
# @NumaNodeOptions:
|
||||
@@ -557,6 +560,92 @@
|
||||
'base': 'CpuInstanceProperties',
|
||||
'data' : {} }
|
||||
|
||||
+##
|
||||
+# @HmatLBMemoryHierarchy:
|
||||
+#
|
||||
+# The memory hierarchy in the System Locality Latency and Bandwidth
|
||||
+# Information Structure of HMAT (Heterogeneous Memory Attribute Table)
|
||||
+#
|
||||
+# For more information about @HmatLBMemoryHierarchy, see chapter
|
||||
+# 5.2.27.4: Table 5-146: Field "Flags" of ACPI 6.3 spec.
|
||||
+#
|
||||
+# @memory: the structure represents the memory performance
|
||||
+#
|
||||
+# @first-level: first level of memory side cache
|
||||
+#
|
||||
+# @second-level: second level of memory side cache
|
||||
+#
|
||||
+# @third-level: third level of memory side cache
|
||||
+#
|
||||
+# Since: 5.0
|
||||
+##
|
||||
+{ 'enum': 'HmatLBMemoryHierarchy',
|
||||
+ 'data': [ 'memory', 'first-level', 'second-level', 'third-level' ] }
|
||||
+
|
||||
+##
|
||||
+# @HmatLBDataType:
|
||||
+#
|
||||
+# Data type in the System Locality Latency and Bandwidth
|
||||
+# Information Structure of HMAT (Heterogeneous Memory Attribute Table)
|
||||
+#
|
||||
+# For more information about @HmatLBDataType, see chapter
|
||||
+# 5.2.27.4: Table 5-146: Field "Data Type" of ACPI 6.3 spec.
|
||||
+#
|
||||
+# @access-latency: access latency (nanoseconds)
|
||||
+#
|
||||
+# @read-latency: read latency (nanoseconds)
|
||||
+#
|
||||
+# @write-latency: write latency (nanoseconds)
|
||||
+#
|
||||
+# @access-bandwidth: access bandwidth (Bytes per second)
|
||||
+#
|
||||
+# @read-bandwidth: read bandwidth (Bytes per second)
|
||||
+#
|
||||
+# @write-bandwidth: write bandwidth (Bytes per second)
|
||||
+#
|
||||
+# Since: 5.0
|
||||
+##
|
||||
+{ 'enum': 'HmatLBDataType',
|
||||
+ 'data': [ 'access-latency', 'read-latency', 'write-latency',
|
||||
+ 'access-bandwidth', 'read-bandwidth', 'write-bandwidth' ] }
|
||||
+
|
||||
+##
|
||||
+# @NumaHmatLBOptions:
|
||||
+#
|
||||
+# Set the system locality latency and bandwidth information
|
||||
+# between Initiator and Target proximity Domains.
|
||||
+#
|
||||
+# For more information about @NumaHmatLBOptions, see chapter
|
||||
+# 5.2.27.4: Table 5-146 of ACPI 6.3 spec.
|
||||
+#
|
||||
+# @initiator: the Initiator Proximity Domain.
|
||||
+#
|
||||
+# @target: the Target Proximity Domain.
|
||||
+#
|
||||
+# @hierarchy: the Memory Hierarchy. Indicates the performance
|
||||
+# of memory or side cache.
|
||||
+#
|
||||
+# @data-type: presents the type of data, access/read/write
|
||||
+# latency or hit latency.
|
||||
+#
|
||||
+# @latency: the value of latency from @initiator to @target
|
||||
+# proximity domain, the latency unit is "ns(nanosecond)".
|
||||
+#
|
||||
+# @bandwidth: the value of bandwidth between @initiator and @target
|
||||
+# proximity domain, the bandwidth unit is
|
||||
+# "Bytes per second".
|
||||
+#
|
||||
+# Since: 5.0
|
||||
+##
|
||||
+{ 'struct': 'NumaHmatLBOptions',
|
||||
+ 'data': {
|
||||
+ 'initiator': 'uint16',
|
||||
+ 'target': 'uint16',
|
||||
+ 'hierarchy': 'HmatLBMemoryHierarchy',
|
||||
+ 'data-type': 'HmatLBDataType',
|
||||
+ '*latency': 'uint64',
|
||||
+ '*bandwidth': 'size' }}
|
||||
+
|
||||
##
|
||||
# @HostMemPolicy:
|
||||
#
|
||||
diff --git a/qemu-options.hx b/qemu-options.hx
|
||||
index 9b1618cd34d9fe1d8374d6abb954..5f7f31457ab6a8640698f6913b07 100644
|
||||
--- a/qemu-options.hx
|
||||
+++ b/qemu-options.hx
|
||||
@@ -168,16 +168,19 @@ DEF("numa", HAS_ARG, QEMU_OPTION_numa,
|
||||
"-numa node[,mem=size][,cpus=firstcpu[-lastcpu]][,nodeid=node][,initiator=node]\n"
|
||||
"-numa node[,memdev=id][,cpus=firstcpu[-lastcpu]][,nodeid=node][,initiator=node]\n"
|
||||
"-numa dist,src=source,dst=destination,val=distance\n"
|
||||
- "-numa cpu,node-id=node[,socket-id=x][,core-id=y][,thread-id=z]\n",
|
||||
+ "-numa cpu,node-id=node[,socket-id=x][,core-id=y][,thread-id=z]\n"
|
||||
+ "-numa hmat-lb,initiator=node,target=node,hierarchy=memory|first-level|second-level|third-level,data-type=access-latency|read-latency|write-latency[,latency=lat][,bandwidth=bw]\n",
|
||||
QEMU_ARCH_ALL)
|
||||
STEXI
|
||||
@item -numa node[,mem=@var{size}][,cpus=@var{firstcpu}[-@var{lastcpu}]][,nodeid=@var{node}][,initiator=@var{initiator}]
|
||||
@itemx -numa node[,memdev=@var{id}][,cpus=@var{firstcpu}[-@var{lastcpu}]][,nodeid=@var{node}][,initiator=@var{initiator}]
|
||||
@itemx -numa dist,src=@var{source},dst=@var{destination},val=@var{distance}
|
||||
@itemx -numa cpu,node-id=@var{node}[,socket-id=@var{x}][,core-id=@var{y}][,thread-id=@var{z}]
|
||||
+@itemx -numa hmat-lb,initiator=@var{node},target=@var{node},hierarchy=@var{hierarchy},data-type=@var{tpye}[,latency=@var{lat}][,bandwidth=@var{bw}]
|
||||
@findex -numa
|
||||
Define a NUMA node and assign RAM and VCPUs to it.
|
||||
Set the NUMA distance from a source node to a destination node.
|
||||
+Set the ACPI Heterogeneous Memory Attributes for the given nodes.
|
||||
|
||||
Legacy VCPU assignment uses @samp{cpus} option where
|
||||
@var{firstcpu} and @var{lastcpu} are CPU indexes. Each
|
||||
@@ -256,6 +259,48 @@ specified resources, it just assigns existing resources to NUMA
|
||||
nodes. This means that one still has to use the @option{-m},
|
||||
@option{-smp} options to allocate RAM and VCPUs respectively.
|
||||
|
||||
+Use @samp{hmat-lb} to set System Locality Latency and Bandwidth Information
|
||||
+between initiator and target NUMA nodes in ACPI Heterogeneous Attribute Memory Table (HMAT).
|
||||
+Initiator NUMA node can create memory requests, usually it has one or more processors.
|
||||
+Target NUMA node contains addressable memory.
|
||||
+
|
||||
+In @samp{hmat-lb} option, @var{node} are NUMA node IDs. @var{hierarchy} is the memory
|
||||
+hierarchy of the target NUMA node: if @var{hierarchy} is 'memory', the structure
|
||||
+represents the memory performance; if @var{hierarchy} is 'first-level|second-level|third-level',
|
||||
+this structure represents aggregated performance of memory side caches for each domain.
|
||||
+@var{type} of 'data-type' is type of data represented by this structure instance:
|
||||
+if 'hierarchy' is 'memory', 'data-type' is 'access|read|write' latency or 'access|read|write'
|
||||
+bandwidth of the target memory; if 'hierarchy' is 'first-level|second-level|third-level',
|
||||
+'data-type' is 'access|read|write' hit latency or 'access|read|write' hit bandwidth of the
|
||||
+target memory side cache.
|
||||
+
|
||||
+@var{lat} is latency value in nanoseconds. @var{bw} is bandwidth value,
|
||||
+the possible value and units are NUM[M|G|T], mean that the bandwidth value are
|
||||
+NUM byte per second (or MB/s, GB/s or TB/s depending on used suffix).
|
||||
+Note that if latency or bandwidth value is 0, means the corresponding latency or
|
||||
+bandwidth information is not provided.
|
||||
+
|
||||
+For example, the following options describe 2 NUMA nodes. Node 0 has 2 cpus and
|
||||
+a ram, node 1 has only a ram. The processors in node 0 access memory in node
|
||||
+0 with access-latency 5 nanoseconds, access-bandwidth is 200 MB/s;
|
||||
+The processors in NUMA node 0 access memory in NUMA node 1 with access-latency 10
|
||||
+nanoseconds, access-bandwidth is 100 MB/s.
|
||||
+@example
|
||||
+-machine hmat=on \
|
||||
+-m 2G \
|
||||
+-object memory-backend-ram,size=1G,id=m0 \
|
||||
+-object memory-backend-ram,size=1G,id=m1 \
|
||||
+-smp 2 \
|
||||
+-numa node,nodeid=0,memdev=m0 \
|
||||
+-numa node,nodeid=1,memdev=m1,initiator=0 \
|
||||
+-numa cpu,node-id=0,socket-id=0 \
|
||||
+-numa cpu,node-id=0,socket-id=1 \
|
||||
+-numa hmat-lb,initiator=0,target=0,hierarchy=memory,data-type=access-latency,latency=5 \
|
||||
+-numa hmat-lb,initiator=0,target=0,hierarchy=memory,data-type=access-bandwidth,bandwidth=200M \
|
||||
+-numa hmat-lb,initiator=0,target=1,hierarchy=memory,data-type=access-latency,latency=10 \
|
||||
+-numa hmat-lb,initiator=0,target=1,hierarchy=memory,data-type=access-bandwidth,bandwidth=100M
|
||||
+@end example
|
||||
+
|
||||
ETEXI
|
||||
|
||||
DEF("add-fd", HAS_ARG, QEMU_OPTION_add_fd,
|
@ -1,311 +0,0 @@
|
||||
From: Liu Jingqi <jingqi.liu@intel.com>
|
||||
Date: Fri, 13 Dec 2019 09:19:24 +0800
|
||||
Subject: numa: Extend CLI to provide memory side cache information
|
||||
|
||||
Git-commit: c412a48d4d91e8f8b89aae02de0f44f1f0b729e5
|
||||
References: jsc#SLE-8897
|
||||
|
||||
Add -numa hmat-cache option to provide Memory Side Cache Information.
|
||||
These memory attributes help to build Memory Side Cache Information
|
||||
Structure(s) in ACPI Heterogeneous Memory Attribute Table (HMAT).
|
||||
Before using hmat-cache option, enable HMAT with -machine hmat=on.
|
||||
|
||||
Acked-by: Markus Armbruster <armbru@redhat.com>
|
||||
Signed-off-by: Liu Jingqi <jingqi.liu@intel.com>
|
||||
Signed-off-by: Tao Xu <tao3.xu@intel.com>
|
||||
Message-Id: <20191213011929.2520-4-tao3.xu@intel.com>
|
||||
Reviewed-by: Michael S. Tsirkin <mst@redhat.com>
|
||||
Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
|
||||
Reviewed-by: Igor Mammedov <imammedo@redhat.com>
|
||||
Signed-off-by: Bruce Rogers brogers@suse.com>
|
||||
---
|
||||
hw/core/numa.c | 80 ++++++++++++++++++++++++++++++++++++++++++
|
||||
include/sysemu/numa.h | 5 +++
|
||||
qapi/machine.json | 81 +++++++++++++++++++++++++++++++++++++++++--
|
||||
qemu-options.hx | 17 +++++++--
|
||||
4 files changed, 179 insertions(+), 4 deletions(-)
|
||||
|
||||
diff --git a/hw/core/numa.c b/hw/core/numa.c
|
||||
index 34eb413f5d58a6feb11214ecc061..747c9680b02837baa309475ca265 100644
|
||||
--- a/hw/core/numa.c
|
||||
+++ b/hw/core/numa.c
|
||||
@@ -379,6 +379,73 @@ void parse_numa_hmat_lb(NumaState *numa_state, NumaHmatLBOptions *node,
|
||||
g_array_append_val(hmat_lb->list, lb_data);
|
||||
}
|
||||
|
||||
+void parse_numa_hmat_cache(MachineState *ms, NumaHmatCacheOptions *node,
|
||||
+ Error **errp)
|
||||
+{
|
||||
+ int nb_numa_nodes = ms->numa_state->num_nodes;
|
||||
+ NodeInfo *numa_info = ms->numa_state->nodes;
|
||||
+ NumaHmatCacheOptions *hmat_cache = NULL;
|
||||
+
|
||||
+ if (node->node_id >= nb_numa_nodes) {
|
||||
+ error_setg(errp, "Invalid node-id=%" PRIu32 ", it should be less "
|
||||
+ "than %d", node->node_id, nb_numa_nodes);
|
||||
+ return;
|
||||
+ }
|
||||
+
|
||||
+ if (numa_info[node->node_id].lb_info_provided != (BIT(0) | BIT(1))) {
|
||||
+ error_setg(errp, "The latency and bandwidth information of "
|
||||
+ "node-id=%" PRIu32 " should be provided before memory side "
|
||||
+ "cache attributes", node->node_id);
|
||||
+ return;
|
||||
+ }
|
||||
+
|
||||
+ if (node->level < 1 || node->level >= HMAT_LB_LEVELS) {
|
||||
+ error_setg(errp, "Invalid level=%" PRIu8 ", it should be larger than 0 "
|
||||
+ "and less than or equal to %d", node->level,
|
||||
+ HMAT_LB_LEVELS - 1);
|
||||
+ return;
|
||||
+ }
|
||||
+
|
||||
+ assert(node->associativity < HMAT_CACHE_ASSOCIATIVITY__MAX);
|
||||
+ assert(node->policy < HMAT_CACHE_WRITE_POLICY__MAX);
|
||||
+ if (ms->numa_state->hmat_cache[node->node_id][node->level]) {
|
||||
+ error_setg(errp, "Duplicate configuration of the side cache for "
|
||||
+ "node-id=%" PRIu32 " and level=%" PRIu8,
|
||||
+ node->node_id, node->level);
|
||||
+ return;
|
||||
+ }
|
||||
+
|
||||
+ if ((node->level > 1) &&
|
||||
+ ms->numa_state->hmat_cache[node->node_id][node->level - 1] &&
|
||||
+ (node->size >=
|
||||
+ ms->numa_state->hmat_cache[node->node_id][node->level - 1]->size)) {
|
||||
+ error_setg(errp, "Invalid size=%" PRIu64 ", the size of level=%" PRIu8
|
||||
+ " should be less than the size(%" PRIu64 ") of "
|
||||
+ "level=%u", node->size, node->level,
|
||||
+ ms->numa_state->hmat_cache[node->node_id]
|
||||
+ [node->level - 1]->size,
|
||||
+ node->level - 1);
|
||||
+ return;
|
||||
+ }
|
||||
+
|
||||
+ if ((node->level < HMAT_LB_LEVELS - 1) &&
|
||||
+ ms->numa_state->hmat_cache[node->node_id][node->level + 1] &&
|
||||
+ (node->size <=
|
||||
+ ms->numa_state->hmat_cache[node->node_id][node->level + 1]->size)) {
|
||||
+ error_setg(errp, "Invalid size=%" PRIu64 ", the size of level=%" PRIu8
|
||||
+ " should be larger than the size(%" PRIu64 ") of "
|
||||
+ "level=%u", node->size, node->level,
|
||||
+ ms->numa_state->hmat_cache[node->node_id]
|
||||
+ [node->level + 1]->size,
|
||||
+ node->level + 1);
|
||||
+ return;
|
||||
+ }
|
||||
+
|
||||
+ hmat_cache = g_malloc0(sizeof(*hmat_cache));
|
||||
+ memcpy(hmat_cache, node, sizeof(*hmat_cache));
|
||||
+ ms->numa_state->hmat_cache[node->node_id][node->level] = hmat_cache;
|
||||
+}
|
||||
+
|
||||
void set_numa_options(MachineState *ms, NumaOptions *object, Error **errp)
|
||||
{
|
||||
Error *err = NULL;
|
||||
@@ -430,6 +497,19 @@ void set_numa_options(MachineState *ms, NumaOptions *object, Error **errp)
|
||||
goto end;
|
||||
}
|
||||
break;
|
||||
+ case NUMA_OPTIONS_TYPE_HMAT_CACHE:
|
||||
+ if (!ms->numa_state->hmat_enabled) {
|
||||
+ error_setg(errp, "ACPI Heterogeneous Memory Attribute Table "
|
||||
+ "(HMAT) is disabled, enable it with -machine hmat=on "
|
||||
+ "before using any of hmat specific options");
|
||||
+ return;
|
||||
+ }
|
||||
+
|
||||
+ parse_numa_hmat_cache(ms, &object->u.hmat_cache, &err);
|
||||
+ if (err) {
|
||||
+ goto end;
|
||||
+ }
|
||||
+ break;
|
||||
default:
|
||||
abort();
|
||||
}
|
||||
diff --git a/include/sysemu/numa.h b/include/sysemu/numa.h
|
||||
index 70f93c83d71eb2cdab5bf1dde422..ba693cc80b780ecccd49a4fa9145 100644
|
||||
--- a/include/sysemu/numa.h
|
||||
+++ b/include/sysemu/numa.h
|
||||
@@ -91,6 +91,9 @@ struct NumaState {
|
||||
|
||||
/* NUMA nodes HMAT Locality Latency and Bandwidth Information */
|
||||
HMAT_LB_Info *hmat_lb[HMAT_LB_LEVELS][HMAT_LB_TYPES];
|
||||
+
|
||||
+ /* Memory Side Cache Information Structure */
|
||||
+ NumaHmatCacheOptions *hmat_cache[MAX_NODES][HMAT_LB_LEVELS];
|
||||
};
|
||||
typedef struct NumaState NumaState;
|
||||
|
||||
@@ -98,6 +101,8 @@ void set_numa_options(MachineState *ms, NumaOptions *object, Error **errp);
|
||||
void parse_numa_opts(MachineState *ms);
|
||||
void parse_numa_hmat_lb(NumaState *numa_state, NumaHmatLBOptions *node,
|
||||
Error **errp);
|
||||
+void parse_numa_hmat_cache(MachineState *ms, NumaHmatCacheOptions *node,
|
||||
+ Error **errp);
|
||||
void numa_complete_configuration(MachineState *ms);
|
||||
void query_numa_node_mem(NumaNodeMem node_mem[], MachineState *ms);
|
||||
extern QemuOptsList qemu_numa_opts;
|
||||
diff --git a/qapi/machine.json b/qapi/machine.json
|
||||
index cf8faf5a2a4929560c852bf8d50c..b3d30bc8162da9a0b60005fdd86b 100644
|
||||
--- a/qapi/machine.json
|
||||
+++ b/qapi/machine.json
|
||||
@@ -428,10 +428,12 @@
|
||||
#
|
||||
# @hmat-lb: memory latency and bandwidth information (Since: 5.0)
|
||||
#
|
||||
+# @hmat-cache: memory side cache information (Since: 5.0)
|
||||
+#
|
||||
# Since: 2.1
|
||||
##
|
||||
{ 'enum': 'NumaOptionsType',
|
||||
- 'data': [ 'node', 'dist', 'cpu', 'hmat-lb' ] }
|
||||
+ 'data': [ 'node', 'dist', 'cpu', 'hmat-lb', 'hmat-cache' ] }
|
||||
|
||||
##
|
||||
# @NumaOptions:
|
||||
@@ -447,7 +449,8 @@
|
||||
'node': 'NumaNodeOptions',
|
||||
'dist': 'NumaDistOptions',
|
||||
'cpu': 'NumaCpuOptions',
|
||||
- 'hmat-lb': 'NumaHmatLBOptions' }}
|
||||
+ 'hmat-lb': 'NumaHmatLBOptions',
|
||||
+ 'hmat-cache': 'NumaHmatCacheOptions' }}
|
||||
|
||||
##
|
||||
# @NumaNodeOptions:
|
||||
@@ -646,6 +649,80 @@
|
||||
'*latency': 'uint64',
|
||||
'*bandwidth': 'size' }}
|
||||
|
||||
+##
|
||||
+# @HmatCacheAssociativity:
|
||||
+#
|
||||
+# Cache associativity in the Memory Side Cache Information Structure
|
||||
+# of HMAT
|
||||
+#
|
||||
+# For more information of @HmatCacheAssociativity, see chapter
|
||||
+# 5.2.27.5: Table 5-147 of ACPI 6.3 spec.
|
||||
+#
|
||||
+# @none: None (no memory side cache in this proximity domain,
|
||||
+# or cache associativity unknown)
|
||||
+#
|
||||
+# @direct: Direct Mapped
|
||||
+#
|
||||
+# @complex: Complex Cache Indexing (implementation specific)
|
||||
+#
|
||||
+# Since: 5.0
|
||||
+##
|
||||
+{ 'enum': 'HmatCacheAssociativity',
|
||||
+ 'data': [ 'none', 'direct', 'complex' ] }
|
||||
+
|
||||
+##
|
||||
+# @HmatCacheWritePolicy:
|
||||
+#
|
||||
+# Cache write policy in the Memory Side Cache Information Structure
|
||||
+# of HMAT
|
||||
+#
|
||||
+# For more information of @HmatCacheWritePolicy, see chapter
|
||||
+# 5.2.27.5: Table 5-147: Field "Cache Attributes" of ACPI 6.3 spec.
|
||||
+#
|
||||
+# @none: None (no memory side cache in this proximity domain,
|
||||
+# or cache write policy unknown)
|
||||
+#
|
||||
+# @write-back: Write Back (WB)
|
||||
+#
|
||||
+# @write-through: Write Through (WT)
|
||||
+#
|
||||
+# Since: 5.0
|
||||
+##
|
||||
+{ 'enum': 'HmatCacheWritePolicy',
|
||||
+ 'data': [ 'none', 'write-back', 'write-through' ] }
|
||||
+
|
||||
+##
|
||||
+# @NumaHmatCacheOptions:
|
||||
+#
|
||||
+# Set the memory side cache information for a given memory domain.
|
||||
+#
|
||||
+# For more information of @NumaHmatCacheOptions, see chapter
|
||||
+# 5.2.27.5: Table 5-147: Field "Cache Attributes" of ACPI 6.3 spec.
|
||||
+#
|
||||
+# @node-id: the memory proximity domain to which the memory belongs.
|
||||
+#
|
||||
+# @size: the size of memory side cache in bytes.
|
||||
+#
|
||||
+# @level: the cache level described in this structure.
|
||||
+#
|
||||
+# @associativity: the cache associativity,
|
||||
+# none/direct-mapped/complex(complex cache indexing).
|
||||
+#
|
||||
+# @policy: the write policy, none/write-back/write-through.
|
||||
+#
|
||||
+# @line: the cache Line size in bytes.
|
||||
+#
|
||||
+# Since: 5.0
|
||||
+##
|
||||
+{ 'struct': 'NumaHmatCacheOptions',
|
||||
+ 'data': {
|
||||
+ 'node-id': 'uint32',
|
||||
+ 'size': 'size',
|
||||
+ 'level': 'uint8',
|
||||
+ 'associativity': 'HmatCacheAssociativity',
|
||||
+ 'policy': 'HmatCacheWritePolicy',
|
||||
+ 'line': 'uint16' }}
|
||||
+
|
||||
##
|
||||
# @HostMemPolicy:
|
||||
#
|
||||
diff --git a/qemu-options.hx b/qemu-options.hx
|
||||
index 5f7f31457ab6a8640698f6913b07..b0471ed152d77c9e0512c842149f 100644
|
||||
--- a/qemu-options.hx
|
||||
+++ b/qemu-options.hx
|
||||
@@ -169,7 +169,8 @@ DEF("numa", HAS_ARG, QEMU_OPTION_numa,
|
||||
"-numa node[,memdev=id][,cpus=firstcpu[-lastcpu]][,nodeid=node][,initiator=node]\n"
|
||||
"-numa dist,src=source,dst=destination,val=distance\n"
|
||||
"-numa cpu,node-id=node[,socket-id=x][,core-id=y][,thread-id=z]\n"
|
||||
- "-numa hmat-lb,initiator=node,target=node,hierarchy=memory|first-level|second-level|third-level,data-type=access-latency|read-latency|write-latency[,latency=lat][,bandwidth=bw]\n",
|
||||
+ "-numa hmat-lb,initiator=node,target=node,hierarchy=memory|first-level|second-level|third-level,data-type=access-latency|read-latency|write-latency[,latency=lat][,bandwidth=bw]\n"
|
||||
+ "-numa hmat-cache,node-id=node,size=size,level=level[,associativity=none|direct|complex][,policy=none|write-back|write-through][,line=size]\n",
|
||||
QEMU_ARCH_ALL)
|
||||
STEXI
|
||||
@item -numa node[,mem=@var{size}][,cpus=@var{firstcpu}[-@var{lastcpu}]][,nodeid=@var{node}][,initiator=@var{initiator}]
|
||||
@@ -177,6 +178,7 @@ STEXI
|
||||
@itemx -numa dist,src=@var{source},dst=@var{destination},val=@var{distance}
|
||||
@itemx -numa cpu,node-id=@var{node}[,socket-id=@var{x}][,core-id=@var{y}][,thread-id=@var{z}]
|
||||
@itemx -numa hmat-lb,initiator=@var{node},target=@var{node},hierarchy=@var{hierarchy},data-type=@var{tpye}[,latency=@var{lat}][,bandwidth=@var{bw}]
|
||||
+@itemx -numa hmat-cache,node-id=@var{node},size=@var{size},level=@var{level}[,associativity=@var{str}][,policy=@var{str}][,line=@var{size}]
|
||||
@findex -numa
|
||||
Define a NUMA node and assign RAM and VCPUs to it.
|
||||
Set the NUMA distance from a source node to a destination node.
|
||||
@@ -280,11 +282,20 @@ NUM byte per second (or MB/s, GB/s or TB/s depending on used suffix).
|
||||
Note that if latency or bandwidth value is 0, means the corresponding latency or
|
||||
bandwidth information is not provided.
|
||||
|
||||
+In @samp{hmat-cache} option, @var{node-id} is the NUMA-id of the memory belongs.
|
||||
+@var{size} is the size of memory side cache in bytes. @var{level} is the cache
|
||||
+level described in this structure, note that the cache level 0 should not be used
|
||||
+with @samp{hmat-cache} option. @var{associativity} is the cache associativity,
|
||||
+the possible value is 'none/direct(direct-mapped)/complex(complex cache indexing)'.
|
||||
+@var{policy} is the write policy. @var{line} is the cache Line size in bytes.
|
||||
+
|
||||
For example, the following options describe 2 NUMA nodes. Node 0 has 2 cpus and
|
||||
a ram, node 1 has only a ram. The processors in node 0 access memory in node
|
||||
0 with access-latency 5 nanoseconds, access-bandwidth is 200 MB/s;
|
||||
The processors in NUMA node 0 access memory in NUMA node 1 with access-latency 10
|
||||
nanoseconds, access-bandwidth is 100 MB/s.
|
||||
+And for memory side cache information, NUMA node 0 and 1 both have 1 level memory
|
||||
+cache, size is 10KB, policy is write-back, the cache Line size is 8 bytes:
|
||||
@example
|
||||
-machine hmat=on \
|
||||
-m 2G \
|
||||
@@ -298,7 +309,9 @@ nanoseconds, access-bandwidth is 100 MB/s.
|
||||
-numa hmat-lb,initiator=0,target=0,hierarchy=memory,data-type=access-latency,latency=5 \
|
||||
-numa hmat-lb,initiator=0,target=0,hierarchy=memory,data-type=access-bandwidth,bandwidth=200M \
|
||||
-numa hmat-lb,initiator=0,target=1,hierarchy=memory,data-type=access-latency,latency=10 \
|
||||
--numa hmat-lb,initiator=0,target=1,hierarchy=memory,data-type=access-bandwidth,bandwidth=100M
|
||||
+-numa hmat-lb,initiator=0,target=1,hierarchy=memory,data-type=access-bandwidth,bandwidth=100M \
|
||||
+-numa hmat-cache,node-id=0,size=10K,level=1,associativity=direct,policy=write-back,line=8 \
|
||||
+-numa hmat-cache,node-id=1,size=10K,level=1,associativity=direct,policy=write-back,line=8
|
||||
@end example
|
||||
|
||||
ETEXI
|
@ -1,67 +0,0 @@
|
||||
From: Igor Mammedov <imammedo@redhat.com>
|
||||
Date: Thu, 12 Dec 2019 13:48:56 +0100
|
||||
Subject: numa: properly check if numa is supported
|
||||
|
||||
Git-commit: fcd3f2cc124600385dba46c69a80626985c15b50
|
||||
|
||||
Commit aa57020774b, by mistake used MachineClass::numa_mem_supported
|
||||
to check if NUMA is supported by machine and also as unrelated change
|
||||
set it to true for sbsa-ref board.
|
||||
|
||||
Luckily change didn't break machines that support NUMA, as the field
|
||||
is set to true for them.
|
||||
|
||||
But the field is not intended for checking if NUMA is supported and
|
||||
will be flipped to false within this release for new machine types.
|
||||
|
||||
Fix it:
|
||||
- by using previously used condition
|
||||
!mc->cpu_index_to_instance_props || !mc->get_default_cpu_node_id
|
||||
the first time and then use MachineState::numa_state down the road
|
||||
to check if NUMA is supported
|
||||
- dropping stray sbsa-ref chunk
|
||||
|
||||
Fixes: aa57020774b690a22be72453b8e91c9b5a68c516
|
||||
Signed-off-by: Igor Mammedov <imammedo@redhat.com>
|
||||
Message-Id: <1576154936-178362-3-git-send-email-imammedo@redhat.com>
|
||||
Signed-off-by: Eduardo Habkost <ehabkost@redhat.com>
|
||||
Signed-off-by: Bruce Rogers <brogers@suse.com>
|
||||
---
|
||||
hw/arm/sbsa-ref.c | 1 -
|
||||
hw/core/machine.c | 4 ++--
|
||||
2 files changed, 2 insertions(+), 3 deletions(-)
|
||||
|
||||
diff --git a/hw/arm/sbsa-ref.c b/hw/arm/sbsa-ref.c
|
||||
index 27046cc284f4b9daa59468889430..c6261d44a4c53e8a6bc14bbf088d 100644
|
||||
--- a/hw/arm/sbsa-ref.c
|
||||
+++ b/hw/arm/sbsa-ref.c
|
||||
@@ -791,7 +791,6 @@ static void sbsa_ref_class_init(ObjectClass *oc, void *data)
|
||||
mc->possible_cpu_arch_ids = sbsa_ref_possible_cpu_arch_ids;
|
||||
mc->cpu_index_to_instance_props = sbsa_ref_cpu_index_to_props;
|
||||
mc->get_default_cpu_node_id = sbsa_ref_get_default_cpu_node_id;
|
||||
- mc->numa_mem_supported = true;
|
||||
}
|
||||
|
||||
static const TypeInfo sbsa_ref_info = {
|
||||
diff --git a/hw/core/machine.c b/hw/core/machine.c
|
||||
index 1689ad3bf8afd18f0e774ed41a8d..aa63231f3160aaf32874e59ba452 100644
|
||||
--- a/hw/core/machine.c
|
||||
+++ b/hw/core/machine.c
|
||||
@@ -958,7 +958,7 @@ static void machine_initfn(Object *obj)
|
||||
NULL);
|
||||
}
|
||||
|
||||
- if (mc->numa_mem_supported) {
|
||||
+ if (mc->cpu_index_to_instance_props && mc->get_default_cpu_node_id) {
|
||||
ms->numa_state = g_new0(NumaState, 1);
|
||||
}
|
||||
|
||||
@@ -1102,7 +1102,7 @@ void machine_run_board_init(MachineState *machine)
|
||||
{
|
||||
MachineClass *machine_class = MACHINE_GET_CLASS(machine);
|
||||
|
||||
- if (machine_class->numa_mem_supported) {
|
||||
+ if (machine->numa_state) {
|
||||
numa_complete_configuration(machine);
|
||||
if (machine->numa_state->num_nodes) {
|
||||
machine_numa_finish_cpu_init(machine);
|
@ -1,133 +0,0 @@
|
||||
From: Janosch Frank <frankja@linux.ibm.com>
|
||||
Date: Wed, 4 Mar 2020 06:42:31 -0500
|
||||
Subject: pc-bios: s390x: Save iplb location in lowcore
|
||||
|
||||
Git-commit: 9bfc04f9ef6802fff0fc77130ff345a541783363
|
||||
References: bsc#1163140, bsc#1167075
|
||||
|
||||
The POP states that for a list directed IPL the IPLB is stored into
|
||||
memory by the machine loader and its address is stored at offset 0x14
|
||||
of the lowcore.
|
||||
|
||||
ZIPL currently uses the address in offset 0x14 to access the IPLB and
|
||||
acquire flags about secure boot. If the IPLB address points into
|
||||
memory which has an unsupported mix of flags set, ZIPL will panic
|
||||
instead of booting the OS.
|
||||
|
||||
As the lowcore can have quite a high entropy for a guest that did drop
|
||||
out of protected mode (i.e. rebooted) we encountered the ZIPL panic
|
||||
quite often.
|
||||
|
||||
Signed-off-by: Janosch Frank <frankja@linux.ibm.com>
|
||||
Tested-by: Marc Hartmayer <mhartmay@linux.ibm.com>
|
||||
Message-Id: <20200304114231.23493-19-frankja@linux.ibm.com>
|
||||
Reviewed-by: Christian Borntraeger <borntraeger@de.ibm.com>
|
||||
Reviewed-by: David Hildenbrand <david@redhat.com>
|
||||
Signed-off-by: Christian Borntraeger <borntraeger@de.ibm.com>
|
||||
Signed-off-by: Liang Yan <lyan@suse.com>
|
||||
Signed-off-by: Bruce Rogers <brogers@suse.com>
|
||||
---
|
||||
pc-bios/s390-ccw/jump2ipl.c | 1 +
|
||||
pc-bios/s390-ccw/main.c | 8 +++++++-
|
||||
pc-bios/s390-ccw/netmain.c | 1 +
|
||||
pc-bios/s390-ccw/s390-arch.h | 10 ++++++++--
|
||||
pc-bios/s390-ccw/s390-ccw.h | 1 +
|
||||
5 files changed, 18 insertions(+), 3 deletions(-)
|
||||
|
||||
diff --git a/pc-bios/s390-ccw/jump2ipl.c b/pc-bios/s390-ccw/jump2ipl.c
|
||||
index 266f1502b9675d2a58cb7ae8adbb..1489e5043c85863df9e91951fbd1 100644
|
||||
--- a/pc-bios/s390-ccw/jump2ipl.c
|
||||
+++ b/pc-bios/s390-ccw/jump2ipl.c
|
||||
@@ -35,6 +35,7 @@ void jump_to_IPL_code(uint64_t address)
|
||||
{
|
||||
/* store the subsystem information _after_ the bootmap was loaded */
|
||||
write_subsystem_identification();
|
||||
+ write_iplb_location();
|
||||
|
||||
/* prevent unknown IPL types in the guest */
|
||||
if (iplb.pbt == S390_IPL_TYPE_QEMU_SCSI) {
|
||||
diff --git a/pc-bios/s390-ccw/main.c b/pc-bios/s390-ccw/main.c
|
||||
index a21b38628075b450477af9565fd6..4e65b411e1d890ba7f8536d7b99f 100644
|
||||
--- a/pc-bios/s390-ccw/main.c
|
||||
+++ b/pc-bios/s390-ccw/main.c
|
||||
@@ -9,6 +9,7 @@
|
||||
*/
|
||||
|
||||
#include "libc.h"
|
||||
+#include "helper.h"
|
||||
#include "s390-arch.h"
|
||||
#include "s390-ccw.h"
|
||||
#include "cio.h"
|
||||
@@ -22,7 +23,7 @@ QemuIplParameters qipl;
|
||||
IplParameterBlock iplb __attribute__((__aligned__(PAGE_SIZE)));
|
||||
static bool have_iplb;
|
||||
static uint16_t cutype;
|
||||
-LowCore const *lowcore; /* Yes, this *is* a pointer to address 0 */
|
||||
+LowCore *lowcore; /* Yes, this *is* a pointer to address 0 */
|
||||
|
||||
#define LOADPARM_PROMPT "PROMPT "
|
||||
#define LOADPARM_EMPTY " "
|
||||
@@ -42,6 +43,11 @@ void write_subsystem_identification(void)
|
||||
*zeroes = 0;
|
||||
}
|
||||
|
||||
+void write_iplb_location(void)
|
||||
+{
|
||||
+ lowcore->ptr_iplb = ptr2u32(&iplb);
|
||||
+}
|
||||
+
|
||||
void panic(const char *string)
|
||||
{
|
||||
sclp_print(string);
|
||||
diff --git a/pc-bios/s390-ccw/netmain.c b/pc-bios/s390-ccw/netmain.c
|
||||
index f2dcc01e27257696d110b12164c9..309ffa30d992207770d51ffc7d9a 100644
|
||||
--- a/pc-bios/s390-ccw/netmain.c
|
||||
+++ b/pc-bios/s390-ccw/netmain.c
|
||||
@@ -40,6 +40,7 @@
|
||||
#define DEFAULT_TFTP_RETRIES 20
|
||||
|
||||
extern char _start[];
|
||||
+void write_iplb_location(void) {}
|
||||
|
||||
#define KERNEL_ADDR ((void *)0L)
|
||||
#define KERNEL_MAX_SIZE ((long)_start)
|
||||
diff --git a/pc-bios/s390-ccw/s390-arch.h b/pc-bios/s390-ccw/s390-arch.h
|
||||
index 504fc7c2f09878cb6b37e307bb20..5f36361c0223d43439a249e84040 100644
|
||||
--- a/pc-bios/s390-ccw/s390-arch.h
|
||||
+++ b/pc-bios/s390-ccw/s390-arch.h
|
||||
@@ -36,7 +36,13 @@ typedef struct LowCore {
|
||||
/* prefix area: defined by architecture */
|
||||
PSWLegacy ipl_psw; /* 0x000 */
|
||||
uint32_t ccw1[2]; /* 0x008 */
|
||||
- uint32_t ccw2[2]; /* 0x010 */
|
||||
+ union {
|
||||
+ uint32_t ccw2[2]; /* 0x010 */
|
||||
+ struct {
|
||||
+ uint32_t reserved10;
|
||||
+ uint32_t ptr_iplb;
|
||||
+ };
|
||||
+ };
|
||||
uint8_t pad1[0x80 - 0x18]; /* 0x018 */
|
||||
uint32_t ext_params; /* 0x080 */
|
||||
uint16_t cpu_addr; /* 0x084 */
|
||||
@@ -85,7 +91,7 @@ typedef struct LowCore {
|
||||
PSW io_new_psw; /* 0x1f0 */
|
||||
} __attribute__((packed, aligned(8192))) LowCore;
|
||||
|
||||
-extern LowCore const *lowcore;
|
||||
+extern LowCore *lowcore;
|
||||
|
||||
static inline void set_prefix(uint32_t address)
|
||||
{
|
||||
diff --git a/pc-bios/s390-ccw/s390-ccw.h b/pc-bios/s390-ccw/s390-ccw.h
|
||||
index 11bce7d73c85581e561d5802059b..21f27e79906ea297c4480eeaee2e 100644
|
||||
--- a/pc-bios/s390-ccw/s390-ccw.h
|
||||
+++ b/pc-bios/s390-ccw/s390-ccw.h
|
||||
@@ -57,6 +57,7 @@ void consume_io_int(void);
|
||||
/* main.c */
|
||||
void panic(const char *string);
|
||||
void write_subsystem_identification(void);
|
||||
+void write_iplb_location(void);
|
||||
extern char stack[PAGE_SIZE * 8] __attribute__((__aligned__(PAGE_SIZE)));
|
||||
unsigned int get_loadparm_index(void);
|
||||
|
@ -1,55 +0,0 @@
|
||||
From: =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= <philmd@redhat.com>
|
||||
Date: Fri, 20 Mar 2020 16:57:40 +0100
|
||||
Subject: ppc/ppc405_boards: Remove unnecessary NULL check
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
Git-commit: 1583794b9b36911df116cc726750dadbeeac506a
|
||||
|
||||
This code is inside the "if (dinfo)" condition, so testing
|
||||
again here whether it is NULL is unnecessary.
|
||||
|
||||
Fixes: dd59bcae7 (Don't size flash memory to match backing image)
|
||||
Reported-by: Coverity (CID 1421917)
|
||||
Suggested-by: Peter Maydell <peter.maydell@linaro.org>
|
||||
Signed-off-by: Philippe Mathieu-Daudé <philmd@redhat.com>
|
||||
Message-Id: <20200320155740.5342-1-philmd@redhat.com>
|
||||
Reviewed-by: Markus Armbruster <armbru@redhat.com>
|
||||
Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
|
||||
Signed-off-by: Bruce Rogers <brogers@suse.com>
|
||||
---
|
||||
hw/ppc/ppc405_boards.c | 6 +++---
|
||||
1 file changed, 3 insertions(+), 3 deletions(-)
|
||||
|
||||
diff --git a/hw/ppc/ppc405_boards.c b/hw/ppc/ppc405_boards.c
|
||||
index 1f721feed6a4bfc128187aefb5d9..556f3a80ec1ddbc018e00941c5c5 100644
|
||||
--- a/hw/ppc/ppc405_boards.c
|
||||
+++ b/hw/ppc/ppc405_boards.c
|
||||
@@ -184,7 +184,7 @@ static void ref405ep_init(MachineState *machine)
|
||||
bios_size = 8 * MiB;
|
||||
pflash_cfi02_register((uint32_t)(-bios_size),
|
||||
"ef405ep.bios", bios_size,
|
||||
- dinfo ? blk_by_legacy_dinfo(dinfo) : NULL,
|
||||
+ blk_by_legacy_dinfo(dinfo),
|
||||
64 * KiB, 1,
|
||||
2, 0x0001, 0x22DA, 0x0000, 0x0000, 0x555, 0x2AA,
|
||||
1);
|
||||
@@ -450,7 +450,7 @@ static void taihu_405ep_init(MachineState *machine)
|
||||
bios_size = 2 * MiB;
|
||||
pflash_cfi02_register(0xFFE00000,
|
||||
"taihu_405ep.bios", bios_size,
|
||||
- dinfo ? blk_by_legacy_dinfo(dinfo) : NULL,
|
||||
+ blk_by_legacy_dinfo(dinfo),
|
||||
64 * KiB, 1,
|
||||
4, 0x0001, 0x22DA, 0x0000, 0x0000, 0x555, 0x2AA,
|
||||
1);
|
||||
@@ -486,7 +486,7 @@ static void taihu_405ep_init(MachineState *machine)
|
||||
if (dinfo) {
|
||||
bios_size = 32 * MiB;
|
||||
pflash_cfi02_register(0xfc000000, "taihu_405ep.flash", bios_size,
|
||||
- dinfo ? blk_by_legacy_dinfo(dinfo) : NULL,
|
||||
+ blk_by_legacy_dinfo(dinfo),
|
||||
64 * KiB, 1,
|
||||
4, 0x0001, 0x22DA, 0x0000, 0x0000, 0x555, 0x2AA,
|
||||
1);
|
@ -1,200 +0,0 @@
|
||||
From: Eric Blake <eblake@redhat.com>
|
||||
Date: Tue, 24 Mar 2020 12:42:31 -0500
|
||||
Subject: qcow2: List autoclear bit names in header
|
||||
|
||||
Git-commit bb40ebce2cb0bd4bf37968074d43d5a864fb6dee
|
||||
|
||||
The feature table is supposed to advertise the name of all feature
|
||||
bits that we support; however, we forgot to update the table for
|
||||
autoclear bits. While at it, move the table to read-only memory in
|
||||
code, and tweak the qcow2 spec to name the second autoclear bit.
|
||||
Update iotests that are affected by the longer header length.
|
||||
|
||||
Fixes: 88ddffae
|
||||
Fixes: 93c24936
|
||||
Signed-off-by: Eric Blake <eblake@redhat.com>
|
||||
Reviewed-by: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>
|
||||
Message-Id: <20200324174233.1622067-3-eblake@redhat.com>
|
||||
Signed-off-by: Max Reitz <mreitz@redhat.com>
|
||||
Signed-off-by: Bruce Rogers <brogers@suse.com>
|
||||
---
|
||||
block/qcow2.c | 12 +++++++++++-
|
||||
docs/interop/qcow2.txt | 3 ++-
|
||||
tests/qemu-iotests/031.out | 8 ++++----
|
||||
tests/qemu-iotests/036.out | 4 ++--
|
||||
tests/qemu-iotests/061.out | 14 +++++++-------
|
||||
5 files changed, 26 insertions(+), 15 deletions(-)
|
||||
|
||||
diff --git a/block/qcow2.c b/block/qcow2.c
|
||||
index 13e118e16f02f371c0f23c7aaa8d..77edd98be6fbaf0949dcb7755e48 100644
|
||||
--- a/block/qcow2.c
|
||||
+++ b/block/qcow2.c
|
||||
@@ -2822,7 +2822,7 @@ int qcow2_update_header(BlockDriverState *bs)
|
||||
|
||||
/* Feature table */
|
||||
if (s->qcow_version >= 3) {
|
||||
- Qcow2Feature features[] = {
|
||||
+ static const Qcow2Feature features[] = {
|
||||
{
|
||||
.type = QCOW2_FEAT_TYPE_INCOMPATIBLE,
|
||||
.bit = QCOW2_INCOMPAT_DIRTY_BITNR,
|
||||
@@ -2843,6 +2843,16 @@ int qcow2_update_header(BlockDriverState *bs)
|
||||
.bit = QCOW2_COMPAT_LAZY_REFCOUNTS_BITNR,
|
||||
.name = "lazy refcounts",
|
||||
},
|
||||
+ {
|
||||
+ .type = QCOW2_FEAT_TYPE_AUTOCLEAR,
|
||||
+ .bit = QCOW2_AUTOCLEAR_BITMAPS_BITNR,
|
||||
+ .name = "bitmaps",
|
||||
+ },
|
||||
+ {
|
||||
+ .type = QCOW2_FEAT_TYPE_AUTOCLEAR,
|
||||
+ .bit = QCOW2_AUTOCLEAR_DATA_FILE_RAW_BITNR,
|
||||
+ .name = "raw external data",
|
||||
+ },
|
||||
};
|
||||
|
||||
ret = header_ext_add(buf, QCOW2_EXT_MAGIC_FEATURE_TABLE,
|
||||
diff --git a/docs/interop/qcow2.txt b/docs/interop/qcow2.txt
|
||||
index af5711e5337191d2c01932b0b3d0..8510d74c807927b86cf76a0f6cb8 100644
|
||||
--- a/docs/interop/qcow2.txt
|
||||
+++ b/docs/interop/qcow2.txt
|
||||
@@ -138,7 +138,8 @@ in the description of a field.
|
||||
bit is unset, the bitmaps extension data must be
|
||||
considered inconsistent.
|
||||
|
||||
- Bit 1: If this bit is set, the external data file can
|
||||
+ Bit 1: Raw external data bit
|
||||
+ If this bit is set, the external data file can
|
||||
be read as a consistent standalone raw image
|
||||
without looking at the qcow2 metadata.
|
||||
|
||||
diff --git a/tests/qemu-iotests/031.out b/tests/qemu-iotests/031.out
|
||||
index 68a74d03b9971ea8946e8fce41d6..f1941300d817ef1026046891c4df 100644
|
||||
--- a/tests/qemu-iotests/031.out
|
||||
+++ b/tests/qemu-iotests/031.out
|
||||
@@ -117,7 +117,7 @@ header_length 104
|
||||
|
||||
Header extension:
|
||||
magic 0x6803f857
|
||||
-length 192
|
||||
+length 288
|
||||
data <binary>
|
||||
|
||||
Header extension:
|
||||
@@ -150,7 +150,7 @@ header_length 104
|
||||
|
||||
Header extension:
|
||||
magic 0x6803f857
|
||||
-length 192
|
||||
+length 288
|
||||
data <binary>
|
||||
|
||||
Header extension:
|
||||
@@ -164,7 +164,7 @@ No errors were found on the image.
|
||||
|
||||
magic 0x514649fb
|
||||
version 3
|
||||
-backing_file_offset 0x178
|
||||
+backing_file_offset 0x1d8
|
||||
backing_file_size 0x17
|
||||
cluster_bits 16
|
||||
size 67108864
|
||||
@@ -188,7 +188,7 @@ data 'host_device'
|
||||
|
||||
Header extension:
|
||||
magic 0x6803f857
|
||||
-length 192
|
||||
+length 288
|
||||
data <binary>
|
||||
|
||||
Header extension:
|
||||
diff --git a/tests/qemu-iotests/036.out b/tests/qemu-iotests/036.out
|
||||
index e489b443866c515b42be344a9b85..3c19fa1edee7aeee1589a1c68366 100644
|
||||
--- a/tests/qemu-iotests/036.out
|
||||
+++ b/tests/qemu-iotests/036.out
|
||||
@@ -58,7 +58,7 @@ header_length 104
|
||||
|
||||
Header extension:
|
||||
magic 0x6803f857
|
||||
-length 192
|
||||
+length 288
|
||||
data <binary>
|
||||
|
||||
|
||||
@@ -86,7 +86,7 @@ header_length 104
|
||||
|
||||
Header extension:
|
||||
magic 0x6803f857
|
||||
-length 192
|
||||
+length 288
|
||||
data <binary>
|
||||
|
||||
*** done
|
||||
diff --git a/tests/qemu-iotests/061.out b/tests/qemu-iotests/061.out
|
||||
index d6a7c2af95f2dcff314f425fd6a3..f98c098b5431072d4e54de1475cc 100644
|
||||
--- a/tests/qemu-iotests/061.out
|
||||
+++ b/tests/qemu-iotests/061.out
|
||||
@@ -26,7 +26,7 @@ header_length 104
|
||||
|
||||
Header extension:
|
||||
magic 0x6803f857
|
||||
-length 192
|
||||
+length 288
|
||||
data <binary>
|
||||
|
||||
magic 0x514649fb
|
||||
@@ -84,7 +84,7 @@ header_length 104
|
||||
|
||||
Header extension:
|
||||
magic 0x6803f857
|
||||
-length 192
|
||||
+length 288
|
||||
data <binary>
|
||||
|
||||
magic 0x514649fb
|
||||
@@ -140,7 +140,7 @@ header_length 104
|
||||
|
||||
Header extension:
|
||||
magic 0x6803f857
|
||||
-length 192
|
||||
+length 288
|
||||
data <binary>
|
||||
|
||||
ERROR cluster 5 refcount=0 reference=1
|
||||
@@ -195,7 +195,7 @@ header_length 104
|
||||
|
||||
Header extension:
|
||||
magic 0x6803f857
|
||||
-length 192
|
||||
+length 288
|
||||
data <binary>
|
||||
|
||||
magic 0x514649fb
|
||||
@@ -264,7 +264,7 @@ header_length 104
|
||||
|
||||
Header extension:
|
||||
magic 0x6803f857
|
||||
-length 192
|
||||
+length 288
|
||||
data <binary>
|
||||
|
||||
read 65536/65536 bytes at offset 44040192
|
||||
@@ -298,7 +298,7 @@ header_length 104
|
||||
|
||||
Header extension:
|
||||
magic 0x6803f857
|
||||
-length 192
|
||||
+length 288
|
||||
data <binary>
|
||||
|
||||
ERROR cluster 5 refcount=0 reference=1
|
||||
@@ -327,7 +327,7 @@ header_length 104
|
||||
|
||||
Header extension:
|
||||
magic 0x6803f857
|
||||
-length 192
|
||||
+length 288
|
||||
data <binary>
|
||||
|
||||
read 131072/131072 bytes at offset 0
|
@ -1,96 +0,0 @@
|
||||
From: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>
|
||||
Date: Mon, 14 Oct 2019 14:51:25 +0300
|
||||
Subject: qcow2-bitmaps: fix qcow2_can_store_new_dirty_bitmap
|
||||
|
||||
Git-commit: a1db8733d28d615bc0daeada6c406a6dd5c5d5ef
|
||||
|
||||
qcow2_can_store_new_dirty_bitmap works wrong, as it considers only
|
||||
bitmaps already stored in the qcow2 image and ignores persistent
|
||||
BdrvDirtyBitmap objects.
|
||||
|
||||
So, let's instead count persistent BdrvDirtyBitmaps. We load all qcow2
|
||||
bitmaps on open, so there should not be any bitmap in the image for
|
||||
which we don't have BdrvDirtyBitmaps version. If it is - it's a kind of
|
||||
corruption, and no reason to check for corruptions here (open() and
|
||||
close() are better places for it).
|
||||
|
||||
Signed-off-by: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>
|
||||
Message-id: 20191014115126.15360-2-vsementsov@virtuozzo.com
|
||||
Reviewed-by: Max Reitz <mreitz@redhat.com>
|
||||
Cc: qemu-stable@nongnu.org
|
||||
Signed-off-by: Max Reitz <mreitz@redhat.com>
|
||||
Signed-off-by: Bruce Rogers <brogers@suse.com>
|
||||
---
|
||||
block/qcow2-bitmap.c | 41 ++++++++++++++++++-----------------------
|
||||
1 file changed, 18 insertions(+), 23 deletions(-)
|
||||
|
||||
diff --git a/block/qcow2-bitmap.c b/block/qcow2-bitmap.c
|
||||
index c6c8ebbe89d4252432bfb80e3426..d41f5d049b7d791ac30e1e36d3c5 100644
|
||||
--- a/block/qcow2-bitmap.c
|
||||
+++ b/block/qcow2-bitmap.c
|
||||
@@ -1703,8 +1703,14 @@ bool coroutine_fn qcow2_co_can_store_new_dirty_bitmap(BlockDriverState *bs,
|
||||
Error **errp)
|
||||
{
|
||||
BDRVQcow2State *s = bs->opaque;
|
||||
- bool found;
|
||||
- Qcow2BitmapList *bm_list;
|
||||
+ BdrvDirtyBitmap *bitmap;
|
||||
+ uint64_t bitmap_directory_size = 0;
|
||||
+ uint32_t nb_bitmaps = 0;
|
||||
+
|
||||
+ if (bdrv_find_dirty_bitmap(bs, name)) {
|
||||
+ error_setg(errp, "Bitmap already exists: %s", name);
|
||||
+ return false;
|
||||
+ }
|
||||
|
||||
if (s->qcow_version < 3) {
|
||||
/* Without autoclear_features, we would always have to assume
|
||||
@@ -1720,38 +1726,27 @@ bool coroutine_fn qcow2_co_can_store_new_dirty_bitmap(BlockDriverState *bs,
|
||||
goto fail;
|
||||
}
|
||||
|
||||
- if (s->nb_bitmaps == 0) {
|
||||
- return true;
|
||||
+ FOR_EACH_DIRTY_BITMAP(bs, bitmap) {
|
||||
+ if (bdrv_dirty_bitmap_get_persistence(bitmap)) {
|
||||
+ nb_bitmaps++;
|
||||
+ bitmap_directory_size +=
|
||||
+ calc_dir_entry_size(strlen(bdrv_dirty_bitmap_name(bitmap)), 0);
|
||||
+ }
|
||||
}
|
||||
+ nb_bitmaps++;
|
||||
+ bitmap_directory_size += calc_dir_entry_size(strlen(name), 0);
|
||||
|
||||
- if (s->nb_bitmaps >= QCOW2_MAX_BITMAPS) {
|
||||
+ if (nb_bitmaps > QCOW2_MAX_BITMAPS) {
|
||||
error_setg(errp,
|
||||
"Maximum number of persistent bitmaps is already reached");
|
||||
goto fail;
|
||||
}
|
||||
|
||||
- if (s->bitmap_directory_size + calc_dir_entry_size(strlen(name), 0) >
|
||||
- QCOW2_MAX_BITMAP_DIRECTORY_SIZE)
|
||||
- {
|
||||
+ if (bitmap_directory_size > QCOW2_MAX_BITMAP_DIRECTORY_SIZE) {
|
||||
error_setg(errp, "Not enough space in the bitmap directory");
|
||||
goto fail;
|
||||
}
|
||||
|
||||
- qemu_co_mutex_lock(&s->lock);
|
||||
- bm_list = bitmap_list_load(bs, s->bitmap_directory_offset,
|
||||
- s->bitmap_directory_size, errp);
|
||||
- qemu_co_mutex_unlock(&s->lock);
|
||||
- if (bm_list == NULL) {
|
||||
- goto fail;
|
||||
- }
|
||||
-
|
||||
- found = find_bitmap_by_name(bm_list, name);
|
||||
- bitmap_list_free(bm_list);
|
||||
- if (found) {
|
||||
- error_setg(errp, "Bitmap with the same name is already stored");
|
||||
- goto fail;
|
||||
- }
|
||||
-
|
||||
return true;
|
||||
|
||||
fail:
|
@ -1,3 +0,0 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:d3481d4108ce211a053ef15be69af1bdd9dde1510fda80d92be0f6c3e98768f0
|
||||
size 62222068
|
Binary file not shown.
3
qemu-5.0.0.tar.xz
Normal file
3
qemu-5.0.0.tar.xz
Normal file
@ -0,0 +1,3 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:2f13a92a0fa5c8b69ff0796b59b86b080bbb92ebad5d301a7724dd06b5e78cb6
|
||||
size 62426192
|
BIN
qemu-5.0.0.tar.xz.sig
Normal file
BIN
qemu-5.0.0.tar.xz.sig
Normal file
Binary file not shown.
@ -19,7 +19,7 @@ Signed-off-by: Andreas Färber <afaerber@suse.de>
|
||||
1 file changed, 25 insertions(+), 3 deletions(-)
|
||||
|
||||
diff --git a/qemu-bridge-helper.c b/qemu-bridge-helper.c
|
||||
index 3d50ec094c794b9c0835628f10c5..f2291b398f8e4589f649af226dba 100644
|
||||
index 88b26747fc866116637716264dea..9ed35df944fa6968045e675e023a 100644
|
||||
--- a/qemu-bridge-helper.c
|
||||
+++ b/qemu-bridge-helper.c
|
||||
@@ -123,7 +123,12 @@ static int parse_acl_file(const char *filename, ACLList *acl_list)
|
||||
|
@ -11,16 +11,16 @@ Signed-off-by: Bruce Rogers <brogers@suse.com>
|
||||
1 file changed, 3 insertions(+)
|
||||
|
||||
diff --git a/linux-user/syscall.c b/linux-user/syscall.c
|
||||
index 171c0caef3a191c861e76493ccfc..25b0f3bba38b8629cb4bc027be96 100644
|
||||
index 05f03919ff070a06444d82e86a70..1a350d1a9e0ff9f99e36817a6ecc 100644
|
||||
--- a/linux-user/syscall.c
|
||||
+++ b/linux-user/syscall.c
|
||||
@@ -8558,6 +8558,9 @@ static abi_long do_syscall1(void *cpu_env, int num, abi_long arg1,
|
||||
case TARGET_NR_gettimeofday:
|
||||
@@ -8837,6 +8837,9 @@ static abi_long do_syscall1(void *cpu_env, int num, abi_long arg1,
|
||||
{
|
||||
struct timeval tv;
|
||||
struct timezone tz;
|
||||
+ if (copy_from_user_timeval(&tv, arg1)) {
|
||||
+ return -TARGET_EFAULT;
|
||||
+ }
|
||||
ret = get_errno(gettimeofday(&tv, NULL));
|
||||
|
||||
ret = get_errno(gettimeofday(&tv, &tz));
|
||||
if (!is_error(ret)) {
|
||||
if (copy_to_user_timeval(arg1, &tv))
|
||||
|
@ -9,27 +9,29 @@ Signed-off-by: Ulrich Hecht <uli@suse.de>
|
||||
[BR: minor edits to pass qemu's checkpatch script]
|
||||
Signed-off-by: Bruce Rogers <brogers@suse.com>
|
||||
---
|
||||
linux-user/syscall.c | 14 +++++++++++++-
|
||||
1 file changed, 13 insertions(+), 1 deletion(-)
|
||||
linux-user/syscall.c | 15 ++++++++++++++-
|
||||
1 file changed, 14 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/linux-user/syscall.c b/linux-user/syscall.c
|
||||
index 25b0f3bba38b8629cb4bc027be96..49db231f031015265f6d8cead831 100644
|
||||
index 1a350d1a9e0ff9f99e36817a6ecc..946c1e3a1957ea43368311acecda 100644
|
||||
--- a/linux-user/syscall.c
|
||||
+++ b/linux-user/syscall.c
|
||||
@@ -5151,7 +5151,19 @@ static abi_long do_ioctl(int fd, int cmd, abi_long arg)
|
||||
@@ -5301,8 +5301,21 @@ static abi_long do_ioctl(int fd, int cmd, abi_long arg)
|
||||
ie = ioctl_entries;
|
||||
for(;;) {
|
||||
if (ie->target_cmd == 0) {
|
||||
- gemu_log("Unsupported ioctl: cmd=0x%04lx\n", (long)cmd);
|
||||
+ int i;
|
||||
+ gemu_log("Unsupported ioctl: cmd=0x%04lx (%x)\n", (unsigned long)cmd,
|
||||
qemu_log_mask(
|
||||
- LOG_UNIMP, "Unsupported ioctl: cmd=0x%04lx\n", (long)cmd);
|
||||
+ LOG_UNIMP, "Unsupported ioctl: cmd=0x%04lx (%x)\n", (unsigned long)cmd,
|
||||
+ (unsigned int)(cmd & (TARGET_IOC_SIZEMASK << TARGET_IOC_SIZESHIFT))
|
||||
+ >> TARGET_IOC_SIZESHIFT);
|
||||
+ for (i = 0; ioctl_entries[i].target_cmd; i++) {
|
||||
+ if ((ioctl_entries[i].target_cmd & ~(TARGET_IOC_SIZEMASK
|
||||
+ << TARGET_IOC_SIZESHIFT)) == (cmd & ~(TARGET_IOC_SIZEMASK <<
|
||||
+ TARGET_IOC_SIZESHIFT)))
|
||||
+ gemu_log("%p\t->\t%s (%x)\n", (void *)(unsigned long)
|
||||
+ qemu_log_mask(
|
||||
+ LOG_UNIMP, "%p\t->\t%s (%x)\n", (void *)(unsigned long)
|
||||
+ ioctl_entries[i].host_cmd, ioctl_entries[i].name,
|
||||
+ (ioctl_entries[i].target_cmd & (TARGET_IOC_SIZEMASK
|
||||
+ << TARGET_IOC_SIZESHIFT)) >> TARGET_IOC_SIZESHIFT);
|
||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user