import qemu-kvm-6.2.0-11.el9_0.2
This commit is contained in:
		
						commit
						fa43255245
					
				
							
								
								
									
										1
									
								
								.gitignore
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								.gitignore
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @ -0,0 +1 @@ | ||||
| SOURCES/qemu-6.2.0.tar.xz | ||||
							
								
								
									
										1
									
								
								.qemu-kvm.metadata
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								.qemu-kvm.metadata
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1 @@ | ||||
| 68cd61a466170115b88817e2d52db2cd7a92f43a SOURCES/qemu-6.2.0.tar.xz | ||||
| @ -0,0 +1,49 @@ | ||||
| From cc2f3e2ce9e2a9ab9e52e8f44bee4876e69843da Mon Sep 17 00:00:00 2001 | ||||
| From: John Snow <jsnow@redhat.com> | ||||
| Date: Wed, 17 Nov 2021 09:51:46 -0500 | ||||
| Subject: ui/clipboard: Don't use g_autoptr just to free a variable | ||||
| 
 | ||||
| Clang doesn't recognize that the variable is being "used" and will emit | ||||
| a warning: | ||||
| 
 | ||||
|   ../ui/clipboard.c:47:34: error: variable 'old' set but not used [-Werror,-Wunused-but-set-variable] | ||||
|       g_autoptr(QemuClipboardInfo) old = NULL; | ||||
|                                  ^ | ||||
|   1 error generated. | ||||
| 
 | ||||
| OK, fine. Just do things the old way. | ||||
| 
 | ||||
| Signed-off-by: John Snow <jsnow@redhat.com> | ||||
| Signed-off-by: Miroslav Rezanina <mrezanin@redhat.com> | ||||
| 
 | ||||
| ---
 | ||||
| 
 | ||||
| This is temporary commit from upstream submission necessary for build to pass. | ||||
| We expect proper fix included upstream later. | ||||
| ---
 | ||||
|  ui/clipboard.c | 3 ++- | ||||
|  1 file changed, 2 insertions(+), 1 deletion(-) | ||||
| 
 | ||||
| diff --git a/ui/clipboard.c b/ui/clipboard.c
 | ||||
| index d7b008d62a..d53576b0f6 100644
 | ||||
| --- a/ui/clipboard.c
 | ||||
| +++ b/ui/clipboard.c
 | ||||
| @@ -44,13 +44,14 @@ void qemu_clipboard_peer_release(QemuClipboardPeer *peer,
 | ||||
|   | ||||
|  void qemu_clipboard_update(QemuClipboardInfo *info) | ||||
|  { | ||||
| -    g_autoptr(QemuClipboardInfo) old = NULL;
 | ||||
| +    QemuClipboardInfo *old = NULL;
 | ||||
|      assert(info->selection < QEMU_CLIPBOARD_SELECTION__COUNT); | ||||
|   | ||||
|      notifier_list_notify(&clipboard_notifiers, info); | ||||
|   | ||||
|      old = cbinfo[info->selection]; | ||||
|      cbinfo[info->selection] = qemu_clipboard_info_ref(info); | ||||
| +    g_free(old);
 | ||||
|  } | ||||
|   | ||||
|  QemuClipboardInfo *qemu_clipboard_info(QemuClipboardSelection selection) | ||||
| -- 
 | ||||
| 2.27.0 | ||||
| 
 | ||||
							
								
								
									
										301
									
								
								SOURCES/0005-Initial-redhat-build.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										301
									
								
								SOURCES/0005-Initial-redhat-build.patch
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,301 @@ | ||||
| From 3308eb892f03c7169f712fe88e74dacd6f05b1fe Mon Sep 17 00:00:00 2001 | ||||
| From: Miroslav Rezanina <mrezanin@redhat.com> | ||||
| Date: Wed, 26 May 2021 10:56:02 +0200 | ||||
| Subject: Initial redhat build | ||||
| 
 | ||||
| This patch introduces redhat build structure in redhat subdirectory. In addition, | ||||
| several issues are fixed in QEMU tree: | ||||
| 
 | ||||
| - Change of app name for sasl_server_init in VNC code from qemu to qemu-kvm
 | ||||
|  - As we use qemu-kvm as name in all places, this is updated to be consistent | ||||
| - Man page renamed from qemu to qemu-kvm
 | ||||
|  - man page is installed using make install so we have to fix it in qemu tree | ||||
| 
 | ||||
| We disable make check due to issues with some of the tests. | ||||
| 
 | ||||
| This rebase is based on qemu-kvm-6.1.0-8.el9 | ||||
| 
 | ||||
| Signed-off-by: Miroslav Rezanina <mrezanin@redhat.com> | ||||
| --
 | ||||
| Rebase changes (6.1.0): | ||||
| - Move build to .distro
 | ||||
| - Move changes for support file to related commit
 | ||||
| - Added dependency for python3-sphinx-rtd_theme
 | ||||
| - Removed --disable-sheepdog configure option
 | ||||
| - Added new hw-display modules
 | ||||
| - SASL initialization moved to ui/vnc-auth-sasl.c
 | ||||
| - Add accel-qtest-<arch> and accel-tcg-x86_64 libraries
 | ||||
| - Added hw-usb-host module
 | ||||
| - Disable new configure options (bpf, nvmm, slirp-smbd)
 | ||||
| - Use -pie for ksmctl build (annocheck complain fix)
 | ||||
| 
 | ||||
| Rebase changes (6.2.0): | ||||
| - removed --disable-jemalloc and --disable-tcmalloc configure options
 | ||||
| - added audio-oss.so
 | ||||
| - added fdt requirement for x86_64
 | ||||
| - tests/acceptance renamed to tests/avocado
 | ||||
| - added multiboot_dma.bin
 | ||||
| - Add -Wno-string-plus-int to extra flags
 | ||||
| - Updated configure options
 | ||||
| 
 | ||||
| Merged patches (6.0.0): | ||||
|  - 605758c902 Limit build on Power to qemu-img and qemu-ga only | ||||
| 
 | ||||
| Merged patches (6.1.0): | ||||
| - f04f91751f Use cached tarballs
 | ||||
| - 6581165c65 Remove message with running VM count
 | ||||
| - 03c3cac9fc spec-file: build qemu-kvm without SPICE and QXL
 | ||||
| - e0ae6c1f6c spec-file: Obsolete qemu-kvm-ui-spice
 | ||||
| - 9d2e9f9ecf spec: Do not build qemu-kvm-block-gluster
 | ||||
| - cf470b4234 spec: Do not link pcnet and ne2k_pci roms
 | ||||
| - e981284a6b redhat: Install the s390-netboot.img that we've built
 | ||||
| - 24ef557f33 spec: Remove usage of Group: tag
 | ||||
| - c40d69b4f4 spec: Drop %defattr usage
 | ||||
| - f8e98798ce spec: Clean up BuildRequires
 | ||||
| - 47246b43ee spec: Remove iasl BuildRequires
 | ||||
| - 170dc1cbe0 spec: Remove redundant 0 in conditionals
 | ||||
| - 8718f6fa11 spec: Add more have_XXX conditionals
 | ||||
| - a001269ce9 spec: Remove binutils versioned Requires
 | ||||
| - 34545ee641 spec: Remove diffutils BuildRequires
 | ||||
| - c2c82beac9 spec: Remove redundant Requires:
 | ||||
| - 9314c231f4 spec: Add XXX_version macros
 | ||||
| - c43db0bf0f spec: Add have_block_rbd
 | ||||
| - 3ecb0c0319 qga: drop StandardError=syslog
 | ||||
| - 018049dc80 Remove iscsi support
 | ||||
| - a2edf18777 redhat: Replace the kvm-setup.service with a /etc/modules-load.d config file
 | ||||
| - 387b5fbcfe redhat: Move qemu-kvm-docs dependency to qemu-kvm
 | ||||
| - 4ead693178 redhat: introducting qemu-kvm-hw-usbredir
 | ||||
| - 4dc6fc3035 redhat: use the standard vhost-user JSON path
 | ||||
| - 84757178b4 Fix local build
 | ||||
| - 8c394227dd spec: Restrict block drivers in tools
 | ||||
| - b6aa7c1fae Move tools to separate package
 | ||||
| - eafd82e509 Split qemu-pr-helper to separate package
 | ||||
| - 2c0182e2aa spec: RPM_BUILD_ROOT -> %{buildroot}
 | ||||
| - 91bd55ca13 spec: More use of %{name} instead of 'qemu-kvm'
 | ||||
| - 50ba299c61 spec: Use qemu-pr-helper.service from qemu.git (partial)
 | ||||
| - ee08d4e0a3 spec: Use %{_sourcedir} for referencing sources
 | ||||
| - 039e7f7d02 spec: Add tools_only
 | ||||
| - 884ba71617 spec: %build: Add run_configure helper
 | ||||
| - 8ebd864d65 spec: %build: Disable more bits with %{disable_everything} (partial)
 | ||||
| - f23fdb53f5 spec: %build: Add macros for some 'configure' parameters
 | ||||
| - fe951a8bd8 spec: %files: Move qemu-guest-agent and qemu-img earlier
 | ||||
| - 353b632e37 spec: %install: Remove redundant bits
 | ||||
| - 9d2015b752 spec: %install: Add %{modprobe_kvm_conf} macro
 | ||||
| - 6d05134e8c spec: %install: Remove qemu-guest-agent /etc/qemu-kvm usage
 | ||||
| - 985b226467 spec: %install: clean up qemu-ga section
 | ||||
| - dfaf9c600d spec: %install: Use a single %{tools_only} section
 | ||||
| - f6978ddb46 spec: Make tools_only not cross spec sections
 | ||||
| - 071c211098 spec: %install: Limit time spent in %{qemu_kvm_build}
 | ||||
| - 1b65c674be spec: misc syntactic merges with Fedora
 | ||||
| - 4da16294cf spec: Use Fedora's pattern for specifying rc version
 | ||||
| - d7ee259a79 spec: %files: don't use fine grained -docs file list
 | ||||
| - 64cad0c60f spec: %files: Add licenses to qemu-common too
 | ||||
| - c3de4f080a spec: %install: Drop python3 shebang fixup
 | ||||
| - 46fc216115 Update local build to work with spec file improvements
 | ||||
| - bab9531548 spec: Remove buildldflags
 | ||||
| - c8360ab6a9 spec: Use %make_build macro
 | ||||
| - f6966c66e9 spec: Drop make install sharedir and datadir usage
 | ||||
| - 86982421bc spec: use %make_install macro
 | ||||
| - 191c405d22 spec: parallelize `make check`
 | ||||
| - 251a1fb958 spec: Drop explicit --build-id
 | ||||
| - 44c7dda6c3 spec: use %{build_ldflags}
 | ||||
| - 0009a34354 Move virtiofsd to separate package
 | ||||
| -  34d1b200b3 Utilize --firmware configure option
 | ||||
| - 2800e1dd03 spec: Switch toolchain to Clang/LLVM (except process-patches.sh)
 | ||||
| - e8a70f500f spec: Use safe-stack for x86_64
 | ||||
| - e29445d50d spec: Reenable write support for VMDK etc. in tools
 | ||||
| - a4fe2a3e16 redhat: Disable LTO on non-x86 architectures
 | ||||
| 
 | ||||
| Merged patches (6.2.0): | ||||
| - 333452440b remove sgabios dependency
 | ||||
| - 7d3633f184 enable pulseaudio
 | ||||
| - bd898709b0 spec: disable use of gcrypt for crypto backends in favour of gnutls
 | ||||
| - e4f0c6dee6 spec: Remove block-curl and block-ssh dependency
 | ||||
| - 4dc13bfe63 spec: Build the VDI block driver
 | ||||
| - d2f2ff3c74 spec: Explicitly include compress filter
 | ||||
| - a7d047f9c2 Move ksmtuned files to separate package
 | ||||
| 
 | ||||
| With rebase new configure options are introducesed. We use two steps | ||||
| configuration - first we disable all options and then enable supported | ||||
| options. | ||||
| 
 | ||||
| With 6.2.0, following changes are done: | ||||
| - disabled all audiodev and enable only pa
 | ||||
|   - not use audio-drv-list anymore | ||||
|   - disabling oss driver removes oss module (added during rebase to 6.2.0) | ||||
| - disable gettext
 | ||||
| - disable l2tpv3
 | ||||
| - enable selinux
 | ||||
| - enable spice-protocol
 | ||||
|   - added needed BuildRequire | ||||
| - specify used capstone version
 | ||||
| - specify used fdt version
 | ||||
| 
 | ||||
| Signed-off-by: Miroslav Rezanina <mrezanin@redhat.com> | ||||
| ---
 | ||||
|  .distro/85-kvm.preset                   |    5 - | ||||
|  .distro/Makefile                        |  100 + | ||||
|  .distro/Makefile.common                 |   38 + | ||||
|  .distro/README.tests                    |   39 + | ||||
|  .distro/ksm.service                     |   13 - | ||||
|  .distro/ksm.sysconfig                   |    4 - | ||||
|  .distro/ksmctl.c                        |   77 - | ||||
|  .distro/ksmtuned                        |  139 - | ||||
|  .distro/ksmtuned.conf                   |   21 - | ||||
|  .distro/ksmtuned.service                |   12 - | ||||
|  .distro/kvm-setup                       |   49 - | ||||
|  .distro/kvm-setup.service               |   14 - | ||||
|  .distro/modules-load.conf               |    4 + | ||||
|  .distro/qemu-guest-agent.service        |    1 - | ||||
|  .distro/qemu-kvm.spec.template          | 3817 +++++++++++++++++++++++ | ||||
|  .distro/scripts/extract_build_cmd.py    |   12 + | ||||
|  .gitignore                              |    1 + | ||||
|  README.systemtap                        |   43 + | ||||
|  meson.build                             |    4 +- | ||||
|  scripts/qemu-guest-agent/fsfreeze-hook  |    2 +- | ||||
|  scripts/systemtap/conf.d/qemu_kvm.conf  |    4 + | ||||
|  scripts/systemtap/script.d/qemu_kvm.stp |    1 + | ||||
|  tests/check-block.sh                    |    2 + | ||||
|  ui/vnc-auth-sasl.c                      |    2 +- | ||||
|  24 files changed, 4066 insertions(+), 338 deletions(-) | ||||
|  delete mode 100644 .distro/85-kvm.preset | ||||
|  create mode 100644 .distro/Makefile | ||||
|  create mode 100644 .distro/Makefile.common | ||||
|  create mode 100644 .distro/README.tests | ||||
|  delete mode 100644 .distro/ksm.service | ||||
|  delete mode 100644 .distro/ksm.sysconfig | ||||
|  delete mode 100644 .distro/ksmctl.c | ||||
|  delete mode 100644 .distro/ksmtuned | ||||
|  delete mode 100644 .distro/ksmtuned.conf | ||||
|  delete mode 100644 .distro/ksmtuned.service | ||||
|  delete mode 100644 .distro/kvm-setup | ||||
|  delete mode 100644 .distro/kvm-setup.service | ||||
|  create mode 100644 .distro/modules-load.conf | ||||
|  create mode 100644 .distro/qemu-kvm.spec.template | ||||
|  create mode 100644 README.systemtap | ||||
|  create mode 100644 scripts/systemtap/conf.d/qemu_kvm.conf | ||||
|  create mode 100644 scripts/systemtap/script.d/qemu_kvm.stp | ||||
| 
 | ||||
| diff --git a/README.systemtap b/README.systemtap
 | ||||
| new file mode 100644 | ||||
| index 0000000000..ad913fc990
 | ||||
| --- /dev/null
 | ||||
| +++ b/README.systemtap
 | ||||
| @@ -0,0 +1,43 @@
 | ||||
| +QEMU tracing using systemtap-initscript
 | ||||
| +---------------------------------------
 | ||||
| +
 | ||||
| +You can capture QEMU trace data all the time using systemtap-initscript.  This
 | ||||
| +uses SystemTap's flight recorder mode to trace all running guests to a
 | ||||
| +fixed-size buffer on the host.  Old trace entries are overwritten by new
 | ||||
| +entries when the buffer size wraps.
 | ||||
| +
 | ||||
| +1. Install the systemtap-initscript package:
 | ||||
| +  # yum install systemtap-initscript
 | ||||
| +
 | ||||
| +2. Install the systemtap scripts and the conf file:
 | ||||
| +  # cp /usr/share/qemu-kvm/systemtap/script.d/qemu_kvm.stp /etc/systemtap/script.d/
 | ||||
| +  # cp /usr/share/qemu-kvm/systemtap/conf.d/qemu_kvm.conf /etc/systemtap/conf.d/
 | ||||
| +
 | ||||
| +The set of trace events to enable is given in qemu_kvm.stp.  This SystemTap
 | ||||
| +script can be customized to add or remove trace events provided in
 | ||||
| +/usr/share/systemtap/tapset/qemu-kvm-simpletrace.stp.
 | ||||
| +
 | ||||
| +SystemTap customizations can be made to qemu_kvm.conf to control the flight
 | ||||
| +recorder buffer size and whether to store traces in memory only or disk too.
 | ||||
| +See stap(1) for option documentation.
 | ||||
| +
 | ||||
| +3. Start the systemtap service.
 | ||||
| + # service systemtap start qemu_kvm
 | ||||
| +
 | ||||
| +4. Make the service start at boot time.
 | ||||
| + # chkconfig systemtap on
 | ||||
| +
 | ||||
| +5. Confirm that the service works.
 | ||||
| +  # service systemtap status qemu_kvm
 | ||||
| +  qemu_kvm is running...
 | ||||
| +
 | ||||
| +When you want to inspect the trace buffer, perform the following steps:
 | ||||
| +
 | ||||
| +1. Dump the trace buffer.
 | ||||
| +  # staprun -A qemu_kvm >/tmp/trace.log
 | ||||
| +
 | ||||
| +2. Start the systemtap service because the preceding step stops the service.
 | ||||
| +  # service systemtap start qemu_kvm
 | ||||
| +
 | ||||
| +3. Translate the trace record to readable format.
 | ||||
| +  # /usr/share/qemu-kvm/simpletrace.py --no-header /usr/share/qemu-kvm/trace-events /tmp/trace.log
 | ||||
| diff --git a/meson.build b/meson.build
 | ||||
| index 96de1a6ef9..5f6ba86dbb 100644
 | ||||
| --- a/meson.build
 | ||||
| +++ b/meson.build
 | ||||
| @@ -2108,7 +2108,9 @@ if capstone_opt == 'internal'
 | ||||
|      # Include all configuration defines via a header file, which will wind up | ||||
|      # as a dependency on the object file, and thus changes here will result | ||||
|      # in a rebuild. | ||||
| -    '-include', 'capstone-defs.h'
 | ||||
| +    '-include', 'capstone-defs.h',
 | ||||
| +
 | ||||
| +    '-Wp,-D_GLIBCXX_ASSERTIONS',
 | ||||
|    ] | ||||
|   | ||||
|    libcapstone = static_library('capstone', | ||||
| diff --git a/scripts/qemu-guest-agent/fsfreeze-hook b/scripts/qemu-guest-agent/fsfreeze-hook
 | ||||
| index 13aafd4845..e9b84ec028 100755
 | ||||
| --- a/scripts/qemu-guest-agent/fsfreeze-hook
 | ||||
| +++ b/scripts/qemu-guest-agent/fsfreeze-hook
 | ||||
| @@ -8,7 +8,7 @@
 | ||||
|  # request, it is issued with "thaw" argument after filesystem is thawed. | ||||
|   | ||||
|  LOGFILE=/var/log/qga-fsfreeze-hook.log | ||||
| -FSFREEZE_D=$(dirname -- "$0")/fsfreeze-hook.d
 | ||||
| +FSFREEZE_D=$(dirname -- "$(realpath $0)")/fsfreeze-hook.d
 | ||||
|   | ||||
|  # Check whether file $1 is a backup or rpm-generated file and should be ignored | ||||
|  is_ignored_file() { | ||||
| diff --git a/scripts/systemtap/conf.d/qemu_kvm.conf b/scripts/systemtap/conf.d/qemu_kvm.conf
 | ||||
| new file mode 100644 | ||||
| index 0000000000..372d8160a4
 | ||||
| --- /dev/null
 | ||||
| +++ b/scripts/systemtap/conf.d/qemu_kvm.conf
 | ||||
| @@ -0,0 +1,4 @@
 | ||||
| +# Force load uprobes (see BZ#1118352)
 | ||||
| +stap -e 'probe process("/usr/libexec/qemu-kvm").function("main") { printf("") }' -c true
 | ||||
| +
 | ||||
| +qemu_kvm_OPT="-s4" # per-CPU buffer size, in megabytes
 | ||||
| diff --git a/scripts/systemtap/script.d/qemu_kvm.stp b/scripts/systemtap/script.d/qemu_kvm.stp
 | ||||
| new file mode 100644 | ||||
| index 0000000000..c04abf9449
 | ||||
| --- /dev/null
 | ||||
| +++ b/scripts/systemtap/script.d/qemu_kvm.stp
 | ||||
| @@ -0,0 +1 @@
 | ||||
| +probe qemu.kvm.simpletrace.handle_qmp_command,qemu.kvm.simpletrace.monitor_protocol_*,qemu.kvm.simpletrace.migrate_set_state {}
 | ||||
| diff --git a/tests/check-block.sh b/tests/check-block.sh
 | ||||
| index f86cb863de..6d38340d49 100755
 | ||||
| --- a/tests/check-block.sh
 | ||||
| +++ b/tests/check-block.sh
 | ||||
| @@ -69,6 +69,8 @@ else
 | ||||
|      fi | ||||
|  fi | ||||
|   | ||||
| +exit 0
 | ||||
| +
 | ||||
|  cd tests/qemu-iotests | ||||
|   | ||||
|  # QEMU_CHECK_BLOCK_AUTO is used to disable some unstable sub-tests | ||||
| diff --git a/ui/vnc-auth-sasl.c b/ui/vnc-auth-sasl.c
 | ||||
| index 47fdae5b21..2a950caa2a 100644
 | ||||
| --- a/ui/vnc-auth-sasl.c
 | ||||
| +++ b/ui/vnc-auth-sasl.c
 | ||||
| @@ -42,7 +42,7 @@
 | ||||
|   | ||||
|  bool vnc_sasl_server_init(Error **errp) | ||||
|  { | ||||
| -    int saslErr = sasl_server_init(NULL, "qemu");
 | ||||
| +    int saslErr = sasl_server_init(NULL, "qemu-kvm");
 | ||||
|   | ||||
|      if (saslErr != SASL_OK) { | ||||
|          error_setg(errp, "Failed to initialize SASL auth: %s", | ||||
| -- 
 | ||||
| 2.27.0 | ||||
| 
 | ||||
							
								
								
									
										698
									
								
								SOURCES/0006-Enable-disable-devices-for-RHEL.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										698
									
								
								SOURCES/0006-Enable-disable-devices-for-RHEL.patch
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,698 @@ | ||||
| From af4c83ed637bfda003ae86133413d53cefda3654 Mon Sep 17 00:00:00 2001 | ||||
| From: Miroslav Rezanina <mrezanin@redhat.com> | ||||
| Date: Thu, 15 Jul 2021 03:22:36 -0400 | ||||
| Subject: Enable/disable devices for RHEL | ||||
| 
 | ||||
| This commit adds all changes related to changes in supported devices. | ||||
| 
 | ||||
| Signed-off-by: Miroslav Rezanina <mrezanin@redhat.com> | ||||
| --
 | ||||
| Rebase notes (6.1.0): | ||||
| - Added CONFIG_TPM (except s390x)
 | ||||
| - default-configs moved to configs
 | ||||
| - Use --with-device-<ARCH> configure option to use rhel configs
 | ||||
| 
 | ||||
| Rebase notes (6.2.0 RC0): | ||||
| - Add CONFIG_ISA_FDC
 | ||||
| 
 | ||||
| Rebase notes (6.2.0 RC3): | ||||
| - Do not remove -no-hpet documentation
 | ||||
| 
 | ||||
| Merged patches (6.1.0): | ||||
| - c51bf45304 Remove SPICE and QXL from x86_64-rh-devices.mak
 | ||||
| - 02fc745601 aarch64-rh-devices: add CONFIG_PVPANIC_PCI
 | ||||
| - f2fe835153 aarch64-rh-devices: add CONFIG_PXB
 | ||||
| - b5431733ad disable CONFIG_USB_STORAGE_BOT
 | ||||
| - 478ba0cdf6 Disable TPM passthrough
 | ||||
| - 2504d68a7c aarch64: Add USB storage devices
 | ||||
| - 51c2a3253c disable ac97 audio
 | ||||
| 
 | ||||
| Merged patches (6.2.0 RC0): | ||||
| - 9f2f9fa2ba disable sga device
 | ||||
| ---
 | ||||
|  .distro/qemu-kvm.spec.template                |   9 +- | ||||
|  .../aarch64-softmmu/aarch64-rh-devices.mak    |  33 ++++++ | ||||
|  .../ppc64-softmmu/ppc64-rh-devices.mak        |  35 ++++++ | ||||
|  configs/devices/rh-virtio.mak                 |  10 ++ | ||||
|  .../s390x-softmmu/s390x-rh-devices.mak        |  15 +++ | ||||
|  .../x86_64-softmmu/x86_64-rh-devices.mak      | 102 ++++++++++++++++++ | ||||
|  .../x86_64-upstream-devices.mak               |   4 + | ||||
|  hw/acpi/ich9.c                                |   4 +- | ||||
|  hw/arm/meson.build                            |   2 +- | ||||
|  hw/block/fdc.c                                |  10 ++ | ||||
|  hw/char/parallel.c                            |   9 ++ | ||||
|  hw/cpu/meson.build                            |   5 +- | ||||
|  hw/display/cirrus_vga.c                       |   3 + | ||||
|  hw/ide/piix.c                                 |   5 +- | ||||
|  hw/input/pckbd.c                              |   2 + | ||||
|  hw/net/e1000.c                                |   2 + | ||||
|  hw/ppc/spapr_cpu_core.c                       |   2 + | ||||
|  hw/timer/hpet.c                               |   8 ++ | ||||
|  hw/usb/meson.build                            |   2 +- | ||||
|  target/arm/cpu_tcg.c                          |  10 ++ | ||||
|  target/ppc/cpu-models.c                       |  10 ++ | ||||
|  target/s390x/cpu_models_sysemu.c              |   3 + | ||||
|  target/s390x/kvm/kvm.c                        |   8 ++ | ||||
|  23 files changed, 283 insertions(+), 10 deletions(-) | ||||
|  create mode 100644 configs/devices/aarch64-softmmu/aarch64-rh-devices.mak | ||||
|  create mode 100644 configs/devices/ppc64-softmmu/ppc64-rh-devices.mak | ||||
|  create mode 100644 configs/devices/rh-virtio.mak | ||||
|  create mode 100644 configs/devices/s390x-softmmu/s390x-rh-devices.mak | ||||
|  create mode 100644 configs/devices/x86_64-softmmu/x86_64-rh-devices.mak | ||||
|  create mode 100644 configs/devices/x86_64-softmmu/x86_64-upstream-devices.mak | ||||
| 
 | ||||
| diff --git a/configs/devices/aarch64-softmmu/aarch64-rh-devices.mak b/configs/devices/aarch64-softmmu/aarch64-rh-devices.mak
 | ||||
| new file mode 100644 | ||||
| index 0000000000..cd9c7c5127
 | ||||
| --- /dev/null
 | ||||
| +++ b/configs/devices/aarch64-softmmu/aarch64-rh-devices.mak
 | ||||
| @@ -0,0 +1,33 @@
 | ||||
| +include ../rh-virtio.mak
 | ||||
| +
 | ||||
| +CONFIG_ARM_GIC_KVM=y
 | ||||
| +CONFIG_ARM_GIC=y
 | ||||
| +CONFIG_ARM_SMMUV3=y
 | ||||
| +CONFIG_ARM_V7M=y
 | ||||
| +CONFIG_ARM_VIRT=y
 | ||||
| +CONFIG_EDID=y
 | ||||
| +CONFIG_PCIE_PORT=y
 | ||||
| +CONFIG_PCI_DEVICES=y
 | ||||
| +CONFIG_PCI_TESTDEV=y
 | ||||
| +CONFIG_PFLASH_CFI01=y
 | ||||
| +CONFIG_SCSI=y
 | ||||
| +CONFIG_SEMIHOSTING=y
 | ||||
| +CONFIG_USB=y
 | ||||
| +CONFIG_USB_XHCI=y
 | ||||
| +CONFIG_USB_XHCI_PCI=y
 | ||||
| +CONFIG_USB_STORAGE_CORE=y
 | ||||
| +CONFIG_USB_STORAGE_CLASSIC=y
 | ||||
| +CONFIG_VFIO=y
 | ||||
| +CONFIG_VFIO_PCI=y
 | ||||
| +CONFIG_VIRTIO_MMIO=y
 | ||||
| +CONFIG_VIRTIO_PCI=y
 | ||||
| +CONFIG_XIO3130=y
 | ||||
| +CONFIG_NVDIMM=y
 | ||||
| +CONFIG_ACPI_APEI=y
 | ||||
| +CONFIG_TPM=y
 | ||||
| +CONFIG_TPM_EMULATOR=y
 | ||||
| +CONFIG_TPM_TIS_SYSBUS=y
 | ||||
| +CONFIG_PTIMER=y
 | ||||
| +CONFIG_ARM_COMPATIBLE_SEMIHOSTING=y
 | ||||
| +CONFIG_PVPANIC_PCI=y
 | ||||
| +CONFIG_PXB=y
 | ||||
| diff --git a/configs/devices/ppc64-softmmu/ppc64-rh-devices.mak b/configs/devices/ppc64-softmmu/ppc64-rh-devices.mak
 | ||||
| new file mode 100644 | ||||
| index 0000000000..6a3e3f0227
 | ||||
| --- /dev/null
 | ||||
| +++ b/configs/devices/ppc64-softmmu/ppc64-rh-devices.mak
 | ||||
| @@ -0,0 +1,35 @@
 | ||||
| +include ../rh-virtio.mak
 | ||||
| +
 | ||||
| +CONFIG_DIMM=y
 | ||||
| +CONFIG_MEM_DEVICE=y
 | ||||
| +CONFIG_NVDIMM=y
 | ||||
| +CONFIG_PCI=y
 | ||||
| +CONFIG_PCI_DEVICES=y
 | ||||
| +CONFIG_PCI_TESTDEV=y
 | ||||
| +CONFIG_PCI_EXPRESS=y
 | ||||
| +CONFIG_PSERIES=y
 | ||||
| +CONFIG_SCSI=y
 | ||||
| +CONFIG_SPAPR_VSCSI=y
 | ||||
| +CONFIG_TEST_DEVICES=y
 | ||||
| +CONFIG_USB=y
 | ||||
| +CONFIG_USB_OHCI=y
 | ||||
| +CONFIG_USB_OHCI_PCI=y
 | ||||
| +CONFIG_USB_SMARTCARD=y
 | ||||
| +CONFIG_USB_STORAGE_CORE=y
 | ||||
| +CONFIG_USB_STORAGE_CLASSIC=y
 | ||||
| +CONFIG_USB_XHCI=y
 | ||||
| +CONFIG_USB_XHCI_NEC=y
 | ||||
| +CONFIG_USB_XHCI_PCI=y
 | ||||
| +CONFIG_VFIO=y
 | ||||
| +CONFIG_VFIO_PCI=y
 | ||||
| +CONFIG_VGA=y
 | ||||
| +CONFIG_VGA_PCI=y
 | ||||
| +CONFIG_VHOST_USER=y
 | ||||
| +CONFIG_VIRTIO_PCI=y
 | ||||
| +CONFIG_VIRTIO_VGA=y
 | ||||
| +CONFIG_WDT_IB6300ESB=y
 | ||||
| +CONFIG_XICS=y
 | ||||
| +CONFIG_XIVE=y
 | ||||
| +CONFIG_TPM=y
 | ||||
| +CONFIG_TPM_SPAPR=y
 | ||||
| +CONFIG_TPM_EMULATOR=y
 | ||||
| diff --git a/configs/devices/rh-virtio.mak b/configs/devices/rh-virtio.mak
 | ||||
| new file mode 100644 | ||||
| index 0000000000..94ede1b5f6
 | ||||
| --- /dev/null
 | ||||
| +++ b/configs/devices/rh-virtio.mak
 | ||||
| @@ -0,0 +1,10 @@
 | ||||
| +CONFIG_VIRTIO=y
 | ||||
| +CONFIG_VIRTIO_BALLOON=y
 | ||||
| +CONFIG_VIRTIO_BLK=y
 | ||||
| +CONFIG_VIRTIO_GPU=y
 | ||||
| +CONFIG_VIRTIO_INPUT=y
 | ||||
| +CONFIG_VIRTIO_INPUT_HOST=y
 | ||||
| +CONFIG_VIRTIO_NET=y
 | ||||
| +CONFIG_VIRTIO_RNG=y
 | ||||
| +CONFIG_VIRTIO_SCSI=y
 | ||||
| +CONFIG_VIRTIO_SERIAL=y
 | ||||
| diff --git a/configs/devices/s390x-softmmu/s390x-rh-devices.mak b/configs/devices/s390x-softmmu/s390x-rh-devices.mak
 | ||||
| new file mode 100644 | ||||
| index 0000000000..d3b38312e1
 | ||||
| --- /dev/null
 | ||||
| +++ b/configs/devices/s390x-softmmu/s390x-rh-devices.mak
 | ||||
| @@ -0,0 +1,15 @@
 | ||||
| +include ../rh-virtio.mak
 | ||||
| +
 | ||||
| +CONFIG_PCI=y
 | ||||
| +CONFIG_S390_CCW_VIRTIO=y
 | ||||
| +CONFIG_S390_FLIC=y
 | ||||
| +CONFIG_S390_FLIC_KVM=y
 | ||||
| +CONFIG_SCLPCONSOLE=y
 | ||||
| +CONFIG_SCSI=y
 | ||||
| +CONFIG_VFIO=y
 | ||||
| +CONFIG_VFIO_AP=y
 | ||||
| +CONFIG_VFIO_CCW=y
 | ||||
| +CONFIG_VFIO_PCI=y
 | ||||
| +CONFIG_VHOST_USER=y
 | ||||
| +CONFIG_VIRTIO_CCW=y
 | ||||
| +CONFIG_WDT_DIAG288=y
 | ||||
| diff --git a/configs/devices/x86_64-softmmu/x86_64-rh-devices.mak b/configs/devices/x86_64-softmmu/x86_64-rh-devices.mak
 | ||||
| new file mode 100644 | ||||
| index 0000000000..1f7a9ab024
 | ||||
| --- /dev/null
 | ||||
| +++ b/configs/devices/x86_64-softmmu/x86_64-rh-devices.mak
 | ||||
| @@ -0,0 +1,102 @@
 | ||||
| +include ../rh-virtio.mak
 | ||||
| +include x86_64-upstream-devices.mak
 | ||||
| +
 | ||||
| +CONFIG_ACPI=y
 | ||||
| +CONFIG_ACPI_PCI=y
 | ||||
| +CONFIG_ACPI_CPU_HOTPLUG=y
 | ||||
| +CONFIG_ACPI_MEMORY_HOTPLUG=y
 | ||||
| +CONFIG_ACPI_NVDIMM=y
 | ||||
| +CONFIG_ACPI_SMBUS=y
 | ||||
| +CONFIG_ACPI_VMGENID=y
 | ||||
| +CONFIG_ACPI_X86=y
 | ||||
| +CONFIG_ACPI_X86_ICH=y
 | ||||
| +CONFIG_AHCI=y
 | ||||
| +CONFIG_APIC=y
 | ||||
| +CONFIG_APM=y
 | ||||
| +CONFIG_BOCHS_DISPLAY=y
 | ||||
| +CONFIG_DIMM=y
 | ||||
| +CONFIG_E1000E_PCI_EXPRESS=y
 | ||||
| +CONFIG_E1000_PCI=y
 | ||||
| +CONFIG_EDU=y
 | ||||
| +CONFIG_FDC=y
 | ||||
| +CONFIG_FDC_SYSBUS=y
 | ||||
| +CONFIG_FDC_ISA=y
 | ||||
| +CONFIG_FW_CFG_DMA=y
 | ||||
| +CONFIG_HDA=y
 | ||||
| +CONFIG_HYPERV=y
 | ||||
| +CONFIG_HYPERV_TESTDEV=y
 | ||||
| +CONFIG_I2C=y
 | ||||
| +CONFIG_I440FX=y
 | ||||
| +CONFIG_I8254=y
 | ||||
| +CONFIG_I8257=y
 | ||||
| +CONFIG_I8259=y
 | ||||
| +CONFIG_I82801B11=y
 | ||||
| +CONFIG_IDE_CORE=y
 | ||||
| +CONFIG_IDE_PCI=y
 | ||||
| +CONFIG_IDE_PIIX=y
 | ||||
| +CONFIG_IDE_QDEV=y
 | ||||
| +CONFIG_IOAPIC=y
 | ||||
| +CONFIG_IOH3420=y
 | ||||
| +CONFIG_ISA_BUS=y
 | ||||
| +CONFIG_ISA_DEBUG=y
 | ||||
| +CONFIG_ISA_TESTDEV=y
 | ||||
| +CONFIG_LPC_ICH9=y
 | ||||
| +CONFIG_MC146818RTC=y
 | ||||
| +CONFIG_MEM_DEVICE=y
 | ||||
| +CONFIG_NVDIMM=y
 | ||||
| +CONFIG_OPENGL=y
 | ||||
| +CONFIG_PAM=y
 | ||||
| +CONFIG_PC=y
 | ||||
| +CONFIG_PCI=y
 | ||||
| +CONFIG_PCIE_PORT=y
 | ||||
| +CONFIG_PCI_DEVICES=y
 | ||||
| +CONFIG_PCI_EXPRESS=y
 | ||||
| +CONFIG_PCI_EXPRESS_Q35=y
 | ||||
| +CONFIG_PCI_I440FX=y
 | ||||
| +CONFIG_PCI_TESTDEV=y
 | ||||
| +CONFIG_PCKBD=y
 | ||||
| +CONFIG_PCSPK=y
 | ||||
| +CONFIG_PC_ACPI=y
 | ||||
| +CONFIG_PC_PCI=y
 | ||||
| +CONFIG_PFLASH_CFI01=y
 | ||||
| +CONFIG_PVPANIC_ISA=y
 | ||||
| +CONFIG_PXB=y
 | ||||
| +CONFIG_Q35=y
 | ||||
| +CONFIG_RTL8139_PCI=y
 | ||||
| +CONFIG_SCSI=y
 | ||||
| +CONFIG_SERIAL=y
 | ||||
| +CONFIG_SERIAL_ISA=y
 | ||||
| +CONFIG_SERIAL_PCI=y
 | ||||
| +CONFIG_SEV=y
 | ||||
| +CONFIG_SMBIOS=y
 | ||||
| +CONFIG_SMBUS_EEPROM=y
 | ||||
| +CONFIG_TEST_DEVICES=y
 | ||||
| +CONFIG_USB=y
 | ||||
| +CONFIG_USB_EHCI=y
 | ||||
| +CONFIG_USB_EHCI_PCI=y
 | ||||
| +CONFIG_USB_SMARTCARD=y
 | ||||
| +CONFIG_USB_STORAGE_CORE=y
 | ||||
| +CONFIG_USB_STORAGE_CLASSIC=y
 | ||||
| +CONFIG_USB_UHCI=y
 | ||||
| +CONFIG_USB_XHCI=y
 | ||||
| +CONFIG_USB_XHCI_NEC=y
 | ||||
| +CONFIG_USB_XHCI_PCI=y
 | ||||
| +CONFIG_VFIO=y
 | ||||
| +CONFIG_VFIO_PCI=y
 | ||||
| +CONFIG_VGA=y
 | ||||
| +CONFIG_VGA_CIRRUS=y
 | ||||
| +CONFIG_VGA_PCI=y
 | ||||
| +CONFIG_VHOST_USER=y
 | ||||
| +CONFIG_VHOST_USER_BLK=y
 | ||||
| +CONFIG_VIRTIO_PCI=y
 | ||||
| +CONFIG_VIRTIO_VGA=y
 | ||||
| +CONFIG_VMMOUSE=y
 | ||||
| +CONFIG_VMPORT=y
 | ||||
| +CONFIG_VTD=y
 | ||||
| +CONFIG_WDT_IB6300ESB=y
 | ||||
| +CONFIG_WDT_IB700=y
 | ||||
| +CONFIG_XIO3130=y
 | ||||
| +CONFIG_TPM=y
 | ||||
| +CONFIG_TPM_CRB=y
 | ||||
| +CONFIG_TPM_TIS_ISA=y
 | ||||
| +CONFIG_TPM_EMULATOR=y
 | ||||
| diff --git a/configs/devices/x86_64-softmmu/x86_64-upstream-devices.mak b/configs/devices/x86_64-softmmu/x86_64-upstream-devices.mak
 | ||||
| new file mode 100644 | ||||
| index 0000000000..2cd20f54d2
 | ||||
| --- /dev/null
 | ||||
| +++ b/configs/devices/x86_64-softmmu/x86_64-upstream-devices.mak
 | ||||
| @@ -0,0 +1,4 @@
 | ||||
| +# We need "isa-parallel"
 | ||||
| +CONFIG_PARALLEL=y
 | ||||
| +# We need "hpet"
 | ||||
| +CONFIG_HPET=y
 | ||||
| diff --git a/hw/acpi/ich9.c b/hw/acpi/ich9.c
 | ||||
| index ebe08ed831..381ef2ddcf 100644
 | ||||
| --- a/hw/acpi/ich9.c
 | ||||
| +++ b/hw/acpi/ich9.c
 | ||||
| @@ -438,8 +438,8 @@ void ich9_pm_add_properties(Object *obj, ICH9LPCPMRegs *pm)
 | ||||
|      static const uint32_t gpe0_len = ICH9_PMIO_GPE0_LEN; | ||||
|      pm->acpi_memory_hotplug.is_enabled = true; | ||||
|      pm->cpu_hotplug_legacy = true; | ||||
| -    pm->disable_s3 = 0;
 | ||||
| -    pm->disable_s4 = 0;
 | ||||
| +    pm->disable_s3 = 1;
 | ||||
| +    pm->disable_s4 = 1;
 | ||||
|      pm->s4_val = 2; | ||||
|      pm->use_acpi_hotplug_bridge = true; | ||||
|      pm->keep_pci_slot_hpc = true; | ||||
| diff --git a/hw/arm/meson.build b/hw/arm/meson.build
 | ||||
| index 721a8eb8be..87ed4dd914 100644
 | ||||
| --- a/hw/arm/meson.build
 | ||||
| +++ b/hw/arm/meson.build
 | ||||
| @@ -31,7 +31,7 @@ arm_ss.add(when: 'CONFIG_VEXPRESS', if_true: files('vexpress.c'))
 | ||||
|  arm_ss.add(when: 'CONFIG_ZYNQ', if_true: files('xilinx_zynq.c')) | ||||
|  arm_ss.add(when: 'CONFIG_SABRELITE', if_true: files('sabrelite.c')) | ||||
|   | ||||
| -arm_ss.add(when: 'CONFIG_ARM_V7M', if_true: files('armv7m.c'))
 | ||||
| +#arm_ss.add(when: 'CONFIG_ARM_V7M', if_true: files('armv7m.c'))
 | ||||
|  arm_ss.add(when: 'CONFIG_EXYNOS4', if_true: files('exynos4210.c')) | ||||
|  arm_ss.add(when: 'CONFIG_PXA2XX', if_true: files('pxa2xx.c', 'pxa2xx_gpio.c', 'pxa2xx_pic.c')) | ||||
|  arm_ss.add(when: 'CONFIG_DIGIC', if_true: files('digic.c')) | ||||
| diff --git a/hw/block/fdc.c b/hw/block/fdc.c
 | ||||
| index 21d18ac2e3..97fa6de423 100644
 | ||||
| --- a/hw/block/fdc.c
 | ||||
| +++ b/hw/block/fdc.c
 | ||||
| @@ -48,6 +48,8 @@
 | ||||
|  #include "qom/object.h" | ||||
|  #include "fdc-internal.h" | ||||
|   | ||||
| +#include "hw/boards.h"
 | ||||
| +
 | ||||
|  /********************************************************/ | ||||
|  /* debug Floppy devices */ | ||||
|   | ||||
| @@ -2337,6 +2339,14 @@ void fdctrl_realize_common(DeviceState *dev, FDCtrl *fdctrl, Error **errp)
 | ||||
|      FDrive *drive; | ||||
|      static int command_tables_inited = 0; | ||||
|   | ||||
| +    /* Restricted for Red Hat Enterprise Linux: */
 | ||||
| +    MachineClass *mc = MACHINE_GET_CLASS(qdev_get_machine());
 | ||||
| +    if (!strstr(mc->name, "-rhel7.")) {
 | ||||
| +        error_setg(errp, "Device %s is not supported with machine type %s",
 | ||||
| +                   object_get_typename(OBJECT(dev)), mc->name);
 | ||||
| +        return;
 | ||||
| +    }
 | ||||
| +
 | ||||
|      if (fdctrl->fallback == FLOPPY_DRIVE_TYPE_AUTO) { | ||||
|          error_setg(errp, "Cannot choose a fallback FDrive type of 'auto'"); | ||||
|          return; | ||||
| diff --git a/hw/char/parallel.c b/hw/char/parallel.c
 | ||||
| index b45e67bfbb..e5f108211b 100644
 | ||||
| --- a/hw/char/parallel.c
 | ||||
| +++ b/hw/char/parallel.c
 | ||||
| @@ -29,6 +29,7 @@
 | ||||
|  #include "chardev/char-parallel.h" | ||||
|  #include "chardev/char-fe.h" | ||||
|  #include "hw/acpi/aml-build.h" | ||||
| +#include "hw/boards.h"
 | ||||
|  #include "hw/irq.h" | ||||
|  #include "hw/isa/isa.h" | ||||
|  #include "hw/qdev-properties.h" | ||||
| @@ -534,6 +535,14 @@ static void parallel_isa_realizefn(DeviceState *dev, Error **errp)
 | ||||
|      int base; | ||||
|      uint8_t dummy; | ||||
|   | ||||
| +    /* Restricted for Red Hat Enterprise Linux */
 | ||||
| +    MachineClass *mc = MACHINE_GET_CLASS(qdev_get_machine());
 | ||||
| +    if (strstr(mc->name, "rhel")) {
 | ||||
| +        error_setg(errp, "Device %s is not supported with machine type %s",
 | ||||
| +                   object_get_typename(OBJECT(dev)), mc->name);
 | ||||
| +        return;
 | ||||
| +    }
 | ||||
| +
 | ||||
|      if (!qemu_chr_fe_backend_connected(&s->chr)) { | ||||
|          error_setg(errp, "Can't create parallel device, empty char device"); | ||||
|          return; | ||||
| diff --git a/hw/cpu/meson.build b/hw/cpu/meson.build
 | ||||
| index 9e52fee9e7..bb71c9f3e7 100644
 | ||||
| --- a/hw/cpu/meson.build
 | ||||
| +++ b/hw/cpu/meson.build
 | ||||
| @@ -1,6 +1,7 @@
 | ||||
| -softmmu_ss.add(files('core.c', 'cluster.c'))
 | ||||
| +#softmmu_ss.add(files('core.c', 'cluster.c'))
 | ||||
| +softmmu_ss.add(files('core.c'))
 | ||||
|   | ||||
|  specific_ss.add(when: 'CONFIG_ARM11MPCORE', if_true: files('arm11mpcore.c')) | ||||
|  specific_ss.add(when: 'CONFIG_REALVIEW', if_true: files('realview_mpcore.c')) | ||||
|  specific_ss.add(when: 'CONFIG_A9MPCORE', if_true: files('a9mpcore.c')) | ||||
| -specific_ss.add(when: 'CONFIG_A15MPCORE', if_true: files('a15mpcore.c'))
 | ||||
| +#specific_ss.add(when: 'CONFIG_A15MPCORE', if_true: files('a15mpcore.c'))
 | ||||
| diff --git a/hw/display/cirrus_vga.c b/hw/display/cirrus_vga.c
 | ||||
| index fdca6ca659..fa1a7eee51 100644
 | ||||
| --- a/hw/display/cirrus_vga.c
 | ||||
| +++ b/hw/display/cirrus_vga.c
 | ||||
| @@ -2945,6 +2945,9 @@ static void pci_cirrus_vga_realize(PCIDevice *dev, Error **errp)
 | ||||
|       PCIDeviceClass *pc = PCI_DEVICE_GET_CLASS(dev); | ||||
|       int16_t device_id = pc->device_id; | ||||
|   | ||||
| +     warn_report("'cirrus-vga' is deprecated, "
 | ||||
| +                 "please use a different VGA card instead");
 | ||||
| +
 | ||||
|       /* follow real hardware, cirrus card emulated has 4 MB video memory. | ||||
|         Also accept 8 MB/16 MB for backward compatibility. */ | ||||
|       if (s->vga.vram_size_mb != 4 && s->vga.vram_size_mb != 8 && | ||||
| diff --git a/hw/ide/piix.c b/hw/ide/piix.c
 | ||||
| index ce89fd0aa3..fbcf802b13 100644
 | ||||
| --- a/hw/ide/piix.c
 | ||||
| +++ b/hw/ide/piix.c
 | ||||
| @@ -232,7 +232,8 @@ static void piix3_ide_class_init(ObjectClass *klass, void *data)
 | ||||
|      k->device_id = PCI_DEVICE_ID_INTEL_82371SB_1; | ||||
|      k->class_id = PCI_CLASS_STORAGE_IDE; | ||||
|      set_bit(DEVICE_CATEGORY_STORAGE, dc->categories); | ||||
| -    dc->hotpluggable = false;
 | ||||
| +    /* Disabled for Red Hat Enterprise Linux: */
 | ||||
| +    dc->user_creatable = false;
 | ||||
|  } | ||||
|   | ||||
|  static const TypeInfo piix3_ide_info = { | ||||
| @@ -261,6 +262,8 @@ static void piix4_ide_class_init(ObjectClass *klass, void *data)
 | ||||
|      k->class_id = PCI_CLASS_STORAGE_IDE; | ||||
|      set_bit(DEVICE_CATEGORY_STORAGE, dc->categories); | ||||
|      dc->hotpluggable = false; | ||||
| +    /* Disabled for Red Hat Enterprise Linux: */
 | ||||
| +    dc->user_creatable = false;
 | ||||
|  } | ||||
|   | ||||
|  static const TypeInfo piix4_ide_info = { | ||||
| diff --git a/hw/input/pckbd.c b/hw/input/pckbd.c
 | ||||
| index baba62f357..bc360347ea 100644
 | ||||
| --- a/hw/input/pckbd.c
 | ||||
| +++ b/hw/input/pckbd.c
 | ||||
| @@ -796,6 +796,8 @@ static void i8042_class_initfn(ObjectClass *klass, void *data)
 | ||||
|      dc->vmsd = &vmstate_kbd_isa; | ||||
|      isa->build_aml = i8042_build_aml; | ||||
|      set_bit(DEVICE_CATEGORY_INPUT, dc->categories); | ||||
| +    /* Disabled for Red Hat Enterprise Linux: */
 | ||||
| +    dc->user_creatable = false;
 | ||||
|  } | ||||
|   | ||||
|  static const TypeInfo i8042_info = { | ||||
| diff --git a/hw/net/e1000.c b/hw/net/e1000.c
 | ||||
| index f5bc81296d..282d01e374 100644
 | ||||
| --- a/hw/net/e1000.c
 | ||||
| +++ b/hw/net/e1000.c
 | ||||
| @@ -1821,6 +1821,7 @@ static const E1000Info e1000_devices[] = {
 | ||||
|          .revision  = 0x03, | ||||
|          .phy_id2   = E1000_PHY_ID2_8254xx_DEFAULT, | ||||
|      }, | ||||
| +#if 0 /* Disabled for Red Hat Enterprise Linux 7 */
 | ||||
|      { | ||||
|          .name      = "e1000-82544gc", | ||||
|          .device_id = E1000_DEV_ID_82544GC_COPPER, | ||||
| @@ -1833,6 +1834,7 @@ static const E1000Info e1000_devices[] = {
 | ||||
|          .revision  = 0x03, | ||||
|          .phy_id2   = E1000_PHY_ID2_8254xx_DEFAULT, | ||||
|      }, | ||||
| +#endif
 | ||||
|  }; | ||||
|   | ||||
|  static void e1000_register_types(void) | ||||
| diff --git a/hw/ppc/spapr_cpu_core.c b/hw/ppc/spapr_cpu_core.c
 | ||||
| index 58e7341cb7..8ba34f6a1d 100644
 | ||||
| --- a/hw/ppc/spapr_cpu_core.c
 | ||||
| +++ b/hw/ppc/spapr_cpu_core.c
 | ||||
| @@ -370,10 +370,12 @@ static const TypeInfo spapr_cpu_core_type_infos[] = {
 | ||||
|          .instance_size = sizeof(SpaprCpuCore), | ||||
|          .class_size = sizeof(SpaprCpuCoreClass), | ||||
|      }, | ||||
| +#if 0  /* Disabled for Red Hat Enterprise Linux */
 | ||||
|      DEFINE_SPAPR_CPU_CORE_TYPE("970_v2.2"), | ||||
|      DEFINE_SPAPR_CPU_CORE_TYPE("970mp_v1.0"), | ||||
|      DEFINE_SPAPR_CPU_CORE_TYPE("970mp_v1.1"), | ||||
|      DEFINE_SPAPR_CPU_CORE_TYPE("power5+_v2.1"), | ||||
| +#endif
 | ||||
|      DEFINE_SPAPR_CPU_CORE_TYPE("power7_v2.3"), | ||||
|      DEFINE_SPAPR_CPU_CORE_TYPE("power7+_v2.1"), | ||||
|      DEFINE_SPAPR_CPU_CORE_TYPE("power8_v2.0"), | ||||
| diff --git a/hw/timer/hpet.c b/hw/timer/hpet.c
 | ||||
| index 9520471be2..202e032524 100644
 | ||||
| --- a/hw/timer/hpet.c
 | ||||
| +++ b/hw/timer/hpet.c
 | ||||
| @@ -733,6 +733,14 @@ static void hpet_realize(DeviceState *dev, Error **errp)
 | ||||
|      int i; | ||||
|      HPETTimer *timer; | ||||
|   | ||||
| +    /* Restricted for Red Hat Enterprise Linux */
 | ||||
| +    MachineClass *mc = MACHINE_GET_CLASS(qdev_get_machine());
 | ||||
| +    if (strstr(mc->name, "rhel")) {
 | ||||
| +        error_setg(errp, "Device %s is not supported with machine type %s",
 | ||||
| +                   object_get_typename(OBJECT(dev)), mc->name);
 | ||||
| +        return;
 | ||||
| +    }
 | ||||
| +
 | ||||
|      if (!s->intcap) { | ||||
|          warn_report("Hpet's intcap not initialized"); | ||||
|      } | ||||
| diff --git a/hw/usb/meson.build b/hw/usb/meson.build
 | ||||
| index de853d780d..0776ae6a20 100644
 | ||||
| --- a/hw/usb/meson.build
 | ||||
| +++ b/hw/usb/meson.build
 | ||||
| @@ -52,7 +52,7 @@ softmmu_ss.add(when: 'CONFIG_USB_SMARTCARD', if_true: files('dev-smartcard-reade
 | ||||
|  if cacard.found() | ||||
|    usbsmartcard_ss = ss.source_set() | ||||
|    usbsmartcard_ss.add(when: 'CONFIG_USB_SMARTCARD', | ||||
| -                      if_true: [cacard, files('ccid-card-emulated.c', 'ccid-card-passthru.c')])
 | ||||
| +                      if_true: [cacard, files('ccid-card-passthru.c')])
 | ||||
|    hw_usb_modules += {'smartcard': usbsmartcard_ss} | ||||
|  endif | ||||
|   | ||||
| diff --git a/target/arm/cpu_tcg.c b/target/arm/cpu_tcg.c
 | ||||
| index 13d0e9b195..3826fa5122 100644
 | ||||
| --- a/target/arm/cpu_tcg.c
 | ||||
| +++ b/target/arm/cpu_tcg.c
 | ||||
| @@ -22,6 +22,7 @@
 | ||||
|  /* CPU models. These are not needed for the AArch64 linux-user build. */ | ||||
|  #if !defined(CONFIG_USER_ONLY) || !defined(TARGET_AARCH64) | ||||
|   | ||||
| +#if 0 /* Disabled for Red Hat Enterprise Linux */
 | ||||
|  #if !defined(CONFIG_USER_ONLY) && defined(CONFIG_TCG) | ||||
|  static bool arm_v7m_cpu_exec_interrupt(CPUState *cs, int interrupt_request) | ||||
|  { | ||||
| @@ -375,6 +376,7 @@ static void cortex_a9_initfn(Object *obj)
 | ||||
|      cpu->ccsidr[1] = 0x200fe019; /* 16k L1 icache. */ | ||||
|      define_arm_cp_regs(cpu, cortexa9_cp_reginfo); | ||||
|  } | ||||
| +#endif /* disabled for RHEL */
 | ||||
|   | ||||
|  #ifndef CONFIG_USER_ONLY | ||||
|  static uint64_t a15_l2ctlr_read(CPUARMState *env, const ARMCPRegInfo *ri) | ||||
| @@ -400,6 +402,7 @@ static const ARMCPRegInfo cortexa15_cp_reginfo[] = {
 | ||||
|      REGINFO_SENTINEL | ||||
|  }; | ||||
|   | ||||
| +#if 0 /* Disabled for Red Hat Enterprise Linux */
 | ||||
|  static void cortex_a7_initfn(Object *obj) | ||||
|  { | ||||
|      ARMCPU *cpu = ARM_CPU(obj); | ||||
| @@ -445,6 +448,7 @@ static void cortex_a7_initfn(Object *obj)
 | ||||
|      cpu->ccsidr[2] = 0x711fe07a; /* 4096K L2 unified cache */ | ||||
|      define_arm_cp_regs(cpu, cortexa15_cp_reginfo); /* Same as A15 */ | ||||
|  } | ||||
| +#endif /* disabled for RHEL */
 | ||||
|   | ||||
|  static void cortex_a15_initfn(Object *obj) | ||||
|  { | ||||
| @@ -488,6 +492,7 @@ static void cortex_a15_initfn(Object *obj)
 | ||||
|      define_arm_cp_regs(cpu, cortexa15_cp_reginfo); | ||||
|  } | ||||
|   | ||||
| +#if 0 /* Disabled for Red Hat Enterprise Linux */
 | ||||
|  static void cortex_m0_initfn(Object *obj) | ||||
|  { | ||||
|      ARMCPU *cpu = ARM_CPU(obj); | ||||
| @@ -928,6 +933,7 @@ static void arm_v7m_class_init(ObjectClass *oc, void *data)
 | ||||
|   | ||||
|      cc->gdb_core_xml_file = "arm-m-profile.xml"; | ||||
|  } | ||||
| +#endif /* disabled for RHEL */
 | ||||
|   | ||||
|  #ifndef TARGET_AARCH64 | ||||
|  /* | ||||
| @@ -1007,6 +1013,7 @@ static void arm_max_initfn(Object *obj)
 | ||||
|  #endif /* !TARGET_AARCH64 */ | ||||
|   | ||||
|  static const ARMCPUInfo arm_tcg_cpus[] = { | ||||
| +#if 0 /* Disabled for Red Hat Enterprise Linux */
 | ||||
|      { .name = "arm926",      .initfn = arm926_initfn }, | ||||
|      { .name = "arm946",      .initfn = arm946_initfn }, | ||||
|      { .name = "arm1026",     .initfn = arm1026_initfn }, | ||||
| @@ -1022,7 +1029,9 @@ static const ARMCPUInfo arm_tcg_cpus[] = {
 | ||||
|      { .name = "cortex-a7",   .initfn = cortex_a7_initfn }, | ||||
|      { .name = "cortex-a8",   .initfn = cortex_a8_initfn }, | ||||
|      { .name = "cortex-a9",   .initfn = cortex_a9_initfn }, | ||||
| +#endif /* disabled for RHEL */
 | ||||
|      { .name = "cortex-a15",  .initfn = cortex_a15_initfn }, | ||||
| +#if 0 /* Disabled for Red Hat Enterprise Linux */
 | ||||
|      { .name = "cortex-m0",   .initfn = cortex_m0_initfn, | ||||
|                               .class_init = arm_v7m_class_init }, | ||||
|      { .name = "cortex-m3",   .initfn = cortex_m3_initfn, | ||||
| @@ -1053,6 +1062,7 @@ static const ARMCPUInfo arm_tcg_cpus[] = {
 | ||||
|      { .name = "pxa270-b1",   .initfn = pxa270b1_initfn }, | ||||
|      { .name = "pxa270-c0",   .initfn = pxa270c0_initfn }, | ||||
|      { .name = "pxa270-c5",   .initfn = pxa270c5_initfn }, | ||||
| +#endif /* disabled for RHEL */
 | ||||
|  #ifndef TARGET_AARCH64 | ||||
|      { .name = "max",         .initfn = arm_max_initfn }, | ||||
|  #endif | ||||
| diff --git a/target/ppc/cpu-models.c b/target/ppc/cpu-models.c
 | ||||
| index 4baa111713..d779c4d1d5 100644
 | ||||
| --- a/target/ppc/cpu-models.c
 | ||||
| +++ b/target/ppc/cpu-models.c
 | ||||
| @@ -66,6 +66,7 @@
 | ||||
|  #define POWERPC_DEF(_name, _pvr, _type, _desc)                              \ | ||||
|      POWERPC_DEF_SVR(_name, _desc, _pvr, POWERPC_SVR_NONE, _type) | ||||
|   | ||||
| +#if 0  /* Embedded and 32-bit CPUs disabled for Red Hat Enterprise Linux */
 | ||||
|      /* Embedded PowerPC                                                      */ | ||||
|      /* PowerPC 401 family                                                    */ | ||||
|      POWERPC_DEF("401",           CPU_POWERPC_401,                    401, | ||||
| @@ -740,8 +741,10 @@
 | ||||
|                  "PowerPC 7447A v1.2 (G4)") | ||||
|      POWERPC_DEF("7457a_v1.2",    CPU_POWERPC_74x7A_v12,              7455, | ||||
|                  "PowerPC 7457A v1.2 (G4)") | ||||
| +#endif
 | ||||
|      /* 64 bits PowerPC                                                       */ | ||||
|  #if defined(TARGET_PPC64) | ||||
| +#if 0  /* Disabled for Red Hat Enterprise Linux */
 | ||||
|      POWERPC_DEF("970_v2.2",      CPU_POWERPC_970_v22,                970, | ||||
|                  "PowerPC 970 v2.2") | ||||
|      POWERPC_DEF("970fx_v1.0",    CPU_POWERPC_970FX_v10,              970, | ||||
| @@ -760,6 +763,7 @@
 | ||||
|                  "PowerPC 970MP v1.1") | ||||
|      POWERPC_DEF("power5+_v2.1",  CPU_POWERPC_POWER5P_v21,            POWER5P, | ||||
|                  "POWER5+ v2.1") | ||||
| +#endif
 | ||||
|      POWERPC_DEF("power7_v2.3",   CPU_POWERPC_POWER7_v23,             POWER7, | ||||
|                  "POWER7 v2.3") | ||||
|      POWERPC_DEF("power7+_v2.1",  CPU_POWERPC_POWER7P_v21,            POWER7, | ||||
| @@ -784,6 +788,7 @@
 | ||||
|  /* PowerPC CPU aliases                                                     */ | ||||
|   | ||||
|  PowerPCCPUAlias ppc_cpu_aliases[] = { | ||||
| +#if 0  /* Embedded and 32-bit CPUs disabled for Red Hat Enterprise Linux */
 | ||||
|      { "403", "403gc" }, | ||||
|      { "405", "405d4" }, | ||||
|      { "405cr", "405crc" }, | ||||
| @@ -942,12 +947,15 @@ PowerPCCPUAlias ppc_cpu_aliases[] = {
 | ||||
|      { "7447a", "7447a_v1.2" }, | ||||
|      { "7457a", "7457a_v1.2" }, | ||||
|      { "apollo7pm", "7457a_v1.0" }, | ||||
| +#endif
 | ||||
|  #if defined(TARGET_PPC64) | ||||
| +#if 0  /* Disabled for Red Hat Enterprise Linux */
 | ||||
|      { "970", "970_v2.2" }, | ||||
|      { "970fx", "970fx_v3.1" }, | ||||
|      { "970mp", "970mp_v1.1" }, | ||||
|      { "power5+", "power5+_v2.1" }, | ||||
|      { "power5gs", "power5+_v2.1" }, | ||||
| +#endif
 | ||||
|      { "power7", "power7_v2.3" }, | ||||
|      { "power7+", "power7+_v2.1" }, | ||||
|      { "power8e", "power8e_v2.1" }, | ||||
| @@ -957,6 +965,7 @@ PowerPCCPUAlias ppc_cpu_aliases[] = {
 | ||||
|      { "power10", "power10_v2.0" }, | ||||
|  #endif | ||||
|   | ||||
| +#if 0  /* Disabled for Red Hat Enterprise Linux */
 | ||||
|      /* Generic PowerPCs */ | ||||
|  #if defined(TARGET_PPC64) | ||||
|      { "ppc64", "970fx_v3.1" }, | ||||
| @@ -964,5 +973,6 @@ PowerPCCPUAlias ppc_cpu_aliases[] = {
 | ||||
|      { "ppc32", "604" }, | ||||
|      { "ppc", "604" }, | ||||
|      { "default", "604" }, | ||||
| +#endif
 | ||||
|      { NULL, NULL } | ||||
|  }; | ||||
| diff --git a/target/s390x/cpu_models_sysemu.c b/target/s390x/cpu_models_sysemu.c
 | ||||
| index 05c3ccaaff..6a04ccab1b 100644
 | ||||
| --- a/target/s390x/cpu_models_sysemu.c
 | ||||
| +++ b/target/s390x/cpu_models_sysemu.c
 | ||||
| @@ -36,6 +36,9 @@ static void check_unavailable_features(const S390CPUModel *max_model,
 | ||||
|          (max_model->def->gen == model->def->gen && | ||||
|           max_model->def->ec_ga < model->def->ec_ga)) { | ||||
|          list_add_feat("type", unavailable); | ||||
| +    } else if (model->def->gen < 11 && kvm_enabled()) {
 | ||||
| +        /* Older CPU models are not supported on Red Hat Enterprise Linux */
 | ||||
| +        list_add_feat("type", unavailable);
 | ||||
|      } | ||||
|   | ||||
|      /* detect missing features if any to properly report them */ | ||||
| diff --git a/target/s390x/kvm/kvm.c b/target/s390x/kvm/kvm.c
 | ||||
| index 5b1fdb55c4..c52434985b 100644
 | ||||
| --- a/target/s390x/kvm/kvm.c
 | ||||
| +++ b/target/s390x/kvm/kvm.c
 | ||||
| @@ -2508,6 +2508,14 @@ void kvm_s390_apply_cpu_model(const S390CPUModel *model, Error **errp)
 | ||||
|          error_setg(errp, "KVM doesn't support CPU models"); | ||||
|          return; | ||||
|      } | ||||
| +
 | ||||
| +    /* Older CPU models are not supported on Red Hat Enterprise Linux */
 | ||||
| +    if (model->def->gen < 11) {
 | ||||
| +        error_setg(errp, "KVM: Unsupported CPU type specified: %s",
 | ||||
| +                   MACHINE(qdev_get_machine())->cpu_type);
 | ||||
| +        return;
 | ||||
| +    }
 | ||||
| +
 | ||||
|      prop.cpuid = s390_cpuid_from_cpu_model(model); | ||||
|      prop.ibc = s390_ibc_from_cpu_model(model); | ||||
|      /* configure cpu features indicated via STFL(e) */ | ||||
| -- 
 | ||||
| 2.27.0 | ||||
| 
 | ||||
							
								
								
									
										648
									
								
								SOURCES/0007-Machine-type-related-general-changes.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										648
									
								
								SOURCES/0007-Machine-type-related-general-changes.patch
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,648 @@ | ||||
| From ef9b78c3f2810541eac453a3f8a8753763b1378d Mon Sep 17 00:00:00 2001 | ||||
| From: Miroslav Rezanina <mrezanin@redhat.com> | ||||
| Date: Fri, 11 Jan 2019 09:54:45 +0100 | ||||
| Subject: Machine type related general changes | ||||
| 
 | ||||
| This patch is first part of original "Add RHEL machine types" patch we | ||||
| split to allow easier review. It contains changes not related to any | ||||
| architecture. | ||||
| 
 | ||||
| Signed-off-by: Miroslav Rezanina <mrezanin@redhat.com> | ||||
| --
 | ||||
| Rebase notes (6.2.0 RC0): | ||||
| - Do not duplicate minimal_version_id for piix4_pm
 | ||||
| - Remove empty line chunks in serial.c
 | ||||
| - Remove migration.h include in serial.c
 | ||||
| 
 | ||||
| Rebase notes (6.2.0 RC1): | ||||
| - Update hw_compat_rhel_8_5 (from MR 66)
 | ||||
| 
 | ||||
| Merged patches (6.1.0): | ||||
| - f2fb42a3c6 redhat: add missing entries in hw_compat_rhel_8_4
 | ||||
| - 1949ec258e hw/arm/virt: Disable PL011 clock migration through hw_compat_rhel_8_3
 | ||||
| - a3995e2eff Remove RHEL 7.0.0 machine type (only generic changes)
 | ||||
| - ad3190a79b Remove RHEL 7.1.0 machine type (only generic changes)
 | ||||
| - 84bbe15d4e Remove RHEL 7.2.0 machine type (only generic changes)
 | ||||
| - 0215eb3356 Remove RHEL 7.3.0 machine types (only generic changes)
 | ||||
| - af69d1ca6e Remove RHEL 7.4.0 machine types (only generic changes)
 | ||||
| - 8f7a74ab78 Remove RHEL 7.5.0 machine types (only generic changes)
 | ||||
| 
 | ||||
| Merged patches (6.2.0 RC0): | ||||
| - d687ac13d2 redhat: Define hw_compat_rhel_8_5
 | ||||
| ---
 | ||||
|  hw/acpi/piix4.c              |   6 +- | ||||
|  hw/arm/virt.c                |   2 +- | ||||
|  hw/core/machine.c            | 180 +++++++++++++++++++++++++++++++++++ | ||||
|  hw/display/vga-isa.c         |   2 +- | ||||
|  hw/i386/pc_piix.c            |   2 + | ||||
|  hw/i386/pc_q35.c             |   2 + | ||||
|  hw/net/rtl8139.c             |   4 +- | ||||
|  hw/rtc/mc146818rtc.c         |   2 + | ||||
|  hw/smbios/smbios.c           |  46 ++++++++- | ||||
|  hw/timer/i8254_common.c      |   2 +- | ||||
|  hw/usb/hcd-uhci.c            |   4 +- | ||||
|  hw/usb/hcd-xhci-pci.c        |  59 +++++++++--- | ||||
|  hw/usb/hcd-xhci-pci.h        |   1 + | ||||
|  include/hw/boards.h          |  21 ++++ | ||||
|  include/hw/firmware/smbios.h |   5 +- | ||||
|  include/hw/i386/pc.h         |   3 + | ||||
|  16 files changed, 315 insertions(+), 26 deletions(-) | ||||
| 
 | ||||
| diff --git a/hw/acpi/piix4.c b/hw/acpi/piix4.c
 | ||||
| index f0b5fac44a..8d6011c0a3 100644
 | ||||
| --- a/hw/acpi/piix4.c
 | ||||
| +++ b/hw/acpi/piix4.c
 | ||||
| @@ -278,7 +278,7 @@ static bool piix4_vmstate_need_smbus(void *opaque, int version_id)
 | ||||
|  static const VMStateDescription vmstate_acpi = { | ||||
|      .name = "piix4_pm", | ||||
|      .version_id = 3, | ||||
| -    .minimum_version_id = 3,
 | ||||
| +    .minimum_version_id = 2,
 | ||||
|      .post_load = vmstate_acpi_post_load, | ||||
|      .fields = (VMStateField[]) { | ||||
|          VMSTATE_PCI_DEVICE(parent_obj, PIIX4PMState), | ||||
| @@ -644,8 +644,8 @@ static void piix4_send_gpe(AcpiDeviceIf *adev, AcpiEventStatusBits ev)
 | ||||
|   | ||||
|  static Property piix4_pm_properties[] = { | ||||
|      DEFINE_PROP_UINT32("smb_io_base", PIIX4PMState, smb_io_base, 0), | ||||
| -    DEFINE_PROP_UINT8(ACPI_PM_PROP_S3_DISABLED, PIIX4PMState, disable_s3, 0),
 | ||||
| -    DEFINE_PROP_UINT8(ACPI_PM_PROP_S4_DISABLED, PIIX4PMState, disable_s4, 0),
 | ||||
| +    DEFINE_PROP_UINT8(ACPI_PM_PROP_S3_DISABLED, PIIX4PMState, disable_s3, 1),
 | ||||
| +    DEFINE_PROP_UINT8(ACPI_PM_PROP_S4_DISABLED, PIIX4PMState, disable_s4, 1),
 | ||||
|      DEFINE_PROP_UINT8(ACPI_PM_PROP_S4_VAL, PIIX4PMState, s4_val, 2), | ||||
|      DEFINE_PROP_BOOL(ACPI_PM_PROP_ACPI_PCIHP_BRIDGE, PIIX4PMState, | ||||
|                       use_acpi_hotplug_bridge, true), | ||||
| diff --git a/hw/arm/virt.c b/hw/arm/virt.c
 | ||||
| index 30da05dfe0..5de4d9d73b 100644
 | ||||
| --- a/hw/arm/virt.c
 | ||||
| +++ b/hw/arm/virt.c
 | ||||
| @@ -1590,7 +1590,7 @@ static void virt_build_smbios(VirtMachineState *vms)
 | ||||
|   | ||||
|      smbios_set_defaults("QEMU", product, | ||||
|                          vmc->smbios_old_sys_ver ? "1.0" : mc->name, false, | ||||
| -                        true, SMBIOS_ENTRY_POINT_30);
 | ||||
| +                        true, NULL, NULL, SMBIOS_ENTRY_POINT_30);
 | ||||
|   | ||||
|      smbios_get_tables(MACHINE(vms), NULL, 0, | ||||
|                        &smbios_tables, &smbios_tables_len, | ||||
| diff --git a/hw/core/machine.c b/hw/core/machine.c
 | ||||
| index 53a99abc56..53a3caf4fb 100644
 | ||||
| --- a/hw/core/machine.c
 | ||||
| +++ b/hw/core/machine.c
 | ||||
| @@ -37,6 +37,186 @@
 | ||||
|  #include "hw/virtio/virtio.h" | ||||
|  #include "hw/virtio/virtio-pci.h" | ||||
|   | ||||
| +/*
 | ||||
| + * Mostly the same as hw_compat_6_0 and hw_compat_6_1
 | ||||
| + */
 | ||||
| +GlobalProperty hw_compat_rhel_8_5[] = {
 | ||||
| +    /* hw_compat_rhel_8_5 from hw_compat_6_0 */
 | ||||
| +    { "gpex-pcihost", "allow-unmapped-accesses", "false" },
 | ||||
| +    /* hw_compat_rhel_8_5 from hw_compat_6_0 */
 | ||||
| +    { "i8042", "extended-state", "false"},
 | ||||
| +    /* hw_compat_rhel_8_5 from hw_compat_6_0 */
 | ||||
| +    { "nvme-ns", "eui64-default", "off"},
 | ||||
| +    /* hw_compat_rhel_8_5 from hw_compat_6_0 */
 | ||||
| +    { "e1000", "init-vet", "off" },
 | ||||
| +    /* hw_compat_rhel_8_5 from hw_compat_6_0 */
 | ||||
| +    { "e1000e", "init-vet", "off" },
 | ||||
| +    /* hw_compat_rhel_8_5 from hw_compat_6_0 */
 | ||||
| +    { "vhost-vsock-device", "seqpacket", "off" },
 | ||||
| +    /* hw_compat_rhel_8_5 from hw_compat_6_1 */
 | ||||
| +    { "vhost-user-vsock-device", "seqpacket", "off" },
 | ||||
| +};
 | ||||
| +const size_t hw_compat_rhel_8_5_len = G_N_ELEMENTS(hw_compat_rhel_8_5);
 | ||||
| +
 | ||||
| +/*
 | ||||
| + * Mostly the same as hw_compat_5_2
 | ||||
| + */
 | ||||
| +GlobalProperty hw_compat_rhel_8_4[] = {
 | ||||
| +    /* hw_compat_rhel_8_4 from hw_compat_5_2 */
 | ||||
| +    { "ICH9-LPC", "smm-compat", "on"},
 | ||||
| +    /* hw_compat_rhel_8_4 from hw_compat_5_2 */
 | ||||
| +    { "PIIX4_PM", "smm-compat", "on"},
 | ||||
| +    /* hw_compat_rhel_8_4 from hw_compat_5_2 */
 | ||||
| +    { "virtio-blk-device", "report-discard-granularity", "off" },
 | ||||
| +    /* hw_compat_rhel_8_4 from hw_compat_5_2 */
 | ||||
| +    { "virtio-net-pci", "vectors", "3"},
 | ||||
| +};
 | ||||
| +const size_t hw_compat_rhel_8_4_len = G_N_ELEMENTS(hw_compat_rhel_8_4);
 | ||||
| +
 | ||||
| +/*
 | ||||
| + * Mostly the same as hw_compat_5_1
 | ||||
| + */
 | ||||
| +GlobalProperty hw_compat_rhel_8_3[] = {
 | ||||
| +    /* hw_compat_rhel_8_3 from hw_compat_5_1 */
 | ||||
| +    { "vhost-scsi", "num_queues", "1"},
 | ||||
| +    /* hw_compat_rhel_8_3 from hw_compat_5_1 */
 | ||||
| +    { "vhost-user-blk", "num-queues", "1"},
 | ||||
| +    /* hw_compat_rhel_8_3 from hw_compat_5_1 */
 | ||||
| +    { "vhost-user-scsi", "num_queues", "1"},
 | ||||
| +    /* hw_compat_rhel_8_3 from hw_compat_5_1 */
 | ||||
| +    { "virtio-blk-device", "num-queues", "1"},
 | ||||
| +    /* hw_compat_rhel_8_3 from hw_compat_5_1 */
 | ||||
| +    { "virtio-scsi-device", "num_queues", "1"},
 | ||||
| +    /* hw_compat_rhel_8_3 from hw_compat_5_1 */
 | ||||
| +    { "nvme", "use-intel-id", "on"},
 | ||||
| +    /* hw_compat_rhel_8_3 from hw_compat_5_1 */
 | ||||
| +    { "pvpanic", "events", "1"}, /* PVPANIC_PANICKED */
 | ||||
| +    /* hw_compat_rhel_8_3 from hw_compat_5_1 */
 | ||||
| +    { "pl011", "migrate-clk", "off" },
 | ||||
| +    /* hw_compat_rhel_8_3 bz 1912846 */
 | ||||
| +    { "pci-xhci", "x-rh-late-msi-cap", "off" },
 | ||||
| +    /* hw_compat_rhel_8_3 from hw_compat_5_1 */
 | ||||
| +    { "virtio-pci", "x-ats-page-aligned", "off"},
 | ||||
| +};
 | ||||
| +const size_t hw_compat_rhel_8_3_len = G_N_ELEMENTS(hw_compat_rhel_8_3);
 | ||||
| +
 | ||||
| +/*
 | ||||
| + * The same as hw_compat_4_2 + hw_compat_5_0
 | ||||
| + */
 | ||||
| +GlobalProperty hw_compat_rhel_8_2[] = {
 | ||||
| +    /* hw_compat_rhel_8_2 from hw_compat_4_2 */
 | ||||
| +    { "virtio-blk-device", "queue-size", "128"},
 | ||||
| +    /* hw_compat_rhel_8_2 from hw_compat_4_2 */
 | ||||
| +    { "virtio-scsi-device", "virtqueue_size", "128"},
 | ||||
| +    /* hw_compat_rhel_8_2 from hw_compat_4_2 */
 | ||||
| +    { "virtio-blk-device", "x-enable-wce-if-config-wce", "off" },
 | ||||
| +    /* hw_compat_rhel_8_2 from hw_compat_4_2 */
 | ||||
| +    { "virtio-blk-device", "seg-max-adjust", "off"},
 | ||||
| +    /* hw_compat_rhel_8_2 from hw_compat_4_2 */
 | ||||
| +    { "virtio-scsi-device", "seg_max_adjust", "off"},
 | ||||
| +    /* hw_compat_rhel_8_2 from hw_compat_4_2 */
 | ||||
| +    { "vhost-blk-device", "seg_max_adjust", "off"},
 | ||||
| +    /* hw_compat_rhel_8_2 from hw_compat_4_2 */
 | ||||
| +    { "usb-host", "suppress-remote-wake", "off" },
 | ||||
| +    /* hw_compat_rhel_8_2 from hw_compat_4_2 */
 | ||||
| +    { "usb-redir", "suppress-remote-wake", "off" },
 | ||||
| +    /* hw_compat_rhel_8_2 from hw_compat_4_2 */
 | ||||
| +    { "qxl", "revision", "4" },
 | ||||
| +    /* hw_compat_rhel_8_2 from hw_compat_4_2 */
 | ||||
| +    { "qxl-vga", "revision", "4" },
 | ||||
| +    /* hw_compat_rhel_8_2 from hw_compat_4_2 */
 | ||||
| +    { "fw_cfg", "acpi-mr-restore", "false" },
 | ||||
| +    /* hw_compat_rhel_8_2 from hw_compat_4_2 */
 | ||||
| +    { "virtio-device", "use-disabled-flag", "false" },
 | ||||
| +    /* hw_compat_rhel_8_2 from hw_compat_5_0 */
 | ||||
| +    { "pci-host-bridge", "x-config-reg-migration-enabled", "off" },
 | ||||
| +    /* hw_compat_rhel_8_2 from hw_compat_5_0 */
 | ||||
| +    { "virtio-balloon-device", "page-poison", "false" },
 | ||||
| +    /* hw_compat_rhel_8_2 from hw_compat_5_0 */
 | ||||
| +    { "vmport", "x-read-set-eax", "off" },
 | ||||
| +    /* hw_compat_rhel_8_2 from hw_compat_5_0 */
 | ||||
| +    { "vmport", "x-signal-unsupported-cmd", "off" },
 | ||||
| +    /* hw_compat_rhel_8_2 from hw_compat_5_0 */
 | ||||
| +    { "vmport", "x-report-vmx-type", "off" },
 | ||||
| +    /* hw_compat_rhel_8_2 from hw_compat_5_0 */
 | ||||
| +    { "vmport", "x-cmds-v2", "off" },
 | ||||
| +    /* hw_compat_rhel_8_2 from hw_compat_5_0 */
 | ||||
| +    { "virtio-device", "x-disable-legacy-check", "true" },
 | ||||
| +};
 | ||||
| +const size_t hw_compat_rhel_8_2_len = G_N_ELEMENTS(hw_compat_rhel_8_2);
 | ||||
| +
 | ||||
| +/*
 | ||||
| + * The same as hw_compat_4_1
 | ||||
| + */
 | ||||
| +GlobalProperty hw_compat_rhel_8_1[] = {
 | ||||
| +    /* hw_compat_rhel_8_1 from hw_compat_4_1 */
 | ||||
| +    { "virtio-pci", "x-pcie-flr-init", "off" },
 | ||||
| +};
 | ||||
| +const size_t hw_compat_rhel_8_1_len = G_N_ELEMENTS(hw_compat_rhel_8_1);
 | ||||
| +
 | ||||
| +/* The same as hw_compat_3_1
 | ||||
| + * format of array has been changed by:
 | ||||
| + *     6c36bddf5340 ("machine: Use shorter format for GlobalProperty arrays")
 | ||||
| + */
 | ||||
| +GlobalProperty hw_compat_rhel_8_0[] = {
 | ||||
| +    /* hw_compat_rhel_8_0 from hw_compat_3_1 */
 | ||||
| +    { "pcie-root-port", "x-speed", "2_5" },
 | ||||
| +    /* hw_compat_rhel_8_0 from hw_compat_3_1 */
 | ||||
| +    { "pcie-root-port", "x-width", "1" },
 | ||||
| +    /* hw_compat_rhel_8_0 from hw_compat_3_1 */
 | ||||
| +    { "memory-backend-file", "x-use-canonical-path-for-ramblock-id", "true" },
 | ||||
| +    /* hw_compat_rhel_8_0 from hw_compat_3_1 */
 | ||||
| +    { "memory-backend-memfd", "x-use-canonical-path-for-ramblock-id", "true" },
 | ||||
| +    /* hw_compat_rhel_8_0 from hw_compat_3_1 */
 | ||||
| +    { "tpm-crb", "ppi", "false" },
 | ||||
| +    /* hw_compat_rhel_8_0 from hw_compat_3_1 */
 | ||||
| +    { "tpm-tis", "ppi", "false" },
 | ||||
| +    /* hw_compat_rhel_8_0 from hw_compat_3_1 */
 | ||||
| +    { "usb-kbd", "serial", "42" },
 | ||||
| +    /* hw_compat_rhel_8_0 from hw_compat_3_1 */
 | ||||
| +    { "usb-mouse", "serial", "42" },
 | ||||
| +    /* hw_compat_rhel_8_0 from hw_compat_3_1 */
 | ||||
| +    { "usb-tablet", "serial", "42" },
 | ||||
| +    /* hw_compat_rhel_8_0 from hw_compat_3_1 */
 | ||||
| +    { "virtio-blk-device", "discard", "false" },
 | ||||
| +    /* hw_compat_rhel_8_0 from hw_compat_3_1 */
 | ||||
| +    { "virtio-blk-device", "write-zeroes", "false" },
 | ||||
| +    /* hw_compat_rhel_8_0 from hw_compat_4_0 */
 | ||||
| +    { "VGA",            "edid", "false" },
 | ||||
| +    /* hw_compat_rhel_8_0 from hw_compat_4_0 */
 | ||||
| +    { "secondary-vga",  "edid", "false" },
 | ||||
| +    /* hw_compat_rhel_8_0 from hw_compat_4_0 */
 | ||||
| +    { "bochs-display",  "edid", "false" },
 | ||||
| +    /* hw_compat_rhel_8_0 from hw_compat_4_0 */
 | ||||
| +    { "virtio-vga",     "edid", "false" },
 | ||||
| +    /* hw_compat_rhel_8_0 from hw_compat_4_0 */
 | ||||
| +    { "virtio-gpu-device", "edid", "false" },
 | ||||
| +    /* hw_compat_rhel_8_0 from hw_compat_4_0 */
 | ||||
| +    { "virtio-device", "use-started", "false" },
 | ||||
| +    /* hw_compat_rhel_8_0 from hw_compat_3_1 - that was added in 4.1 */
 | ||||
| +    { "pcie-root-port-base", "disable-acs", "true" },
 | ||||
| +};
 | ||||
| +const size_t hw_compat_rhel_8_0_len = G_N_ELEMENTS(hw_compat_rhel_8_0);
 | ||||
| +
 | ||||
| +/* The same as hw_compat_3_0 + hw_compat_2_12
 | ||||
| + * except that
 | ||||
| + *   there's nothing in 3_0
 | ||||
| + *   migration.decompress-error-check=off was in 7.5 from bz 1584139
 | ||||
| + */
 | ||||
| +GlobalProperty hw_compat_rhel_7_6[] = {
 | ||||
| +    /* hw_compat_rhel_7_6 from hw_compat_2_12 */
 | ||||
| +    { "hda-audio", "use-timer", "false" },
 | ||||
| +    /* hw_compat_rhel_7_6 from hw_compat_2_12 */
 | ||||
| +    { "cirrus-vga", "global-vmstate", "true" },
 | ||||
| +    /* hw_compat_rhel_7_6 from hw_compat_2_12 */
 | ||||
| +    { "VGA", "global-vmstate", "true" },
 | ||||
| +    /* hw_compat_rhel_7_6 from hw_compat_2_12 */
 | ||||
| +    { "vmware-svga", "global-vmstate", "true" },
 | ||||
| +    /* hw_compat_rhel_7_6 from hw_compat_2_12 */
 | ||||
| +    { "qxl-vga", "global-vmstate",  "true" },
 | ||||
| +};
 | ||||
| +const size_t hw_compat_rhel_7_6_len = G_N_ELEMENTS(hw_compat_rhel_7_6);
 | ||||
| +
 | ||||
|  GlobalProperty hw_compat_6_1[] = { | ||||
|      { "vhost-user-vsock-device", "seqpacket", "off" }, | ||||
|      { "nvme-ns", "shared", "off" }, | ||||
| diff --git a/hw/display/vga-isa.c b/hw/display/vga-isa.c
 | ||||
| index 90851e730b..a91c5d7467 100644
 | ||||
| --- a/hw/display/vga-isa.c
 | ||||
| +++ b/hw/display/vga-isa.c
 | ||||
| @@ -85,7 +85,7 @@ static void vga_isa_realizefn(DeviceState *dev, Error **errp)
 | ||||
|  } | ||||
|   | ||||
|  static Property vga_isa_properties[] = { | ||||
| -    DEFINE_PROP_UINT32("vgamem_mb", ISAVGAState, state.vram_size_mb, 8),
 | ||||
| +    DEFINE_PROP_UINT32("vgamem_mb", ISAVGAState, state.vram_size_mb, 16),
 | ||||
|      DEFINE_PROP_END_OF_LIST(), | ||||
|  }; | ||||
|   | ||||
| diff --git a/hw/i386/pc_piix.c b/hw/i386/pc_piix.c
 | ||||
| index 223dd3e05d..dda3f64f19 100644
 | ||||
| --- a/hw/i386/pc_piix.c
 | ||||
| +++ b/hw/i386/pc_piix.c
 | ||||
| @@ -177,6 +177,8 @@ static void pc_init1(MachineState *machine,
 | ||||
|          smbios_set_defaults("QEMU", "Standard PC (i440FX + PIIX, 1996)", | ||||
|                              mc->name, pcmc->smbios_legacy_mode, | ||||
|                              pcmc->smbios_uuid_encoded, | ||||
| +                            pcmc->smbios_stream_product,
 | ||||
| +                            pcmc->smbios_stream_version,
 | ||||
|                              SMBIOS_ENTRY_POINT_21); | ||||
|      } | ||||
|   | ||||
| diff --git a/hw/i386/pc_q35.c b/hw/i386/pc_q35.c
 | ||||
| index e1e100316d..235054a643 100644
 | ||||
| --- a/hw/i386/pc_q35.c
 | ||||
| +++ b/hw/i386/pc_q35.c
 | ||||
| @@ -200,6 +200,8 @@ static void pc_q35_init(MachineState *machine)
 | ||||
|          smbios_set_defaults("QEMU", "Standard PC (Q35 + ICH9, 2009)", | ||||
|                              mc->name, pcmc->smbios_legacy_mode, | ||||
|                              pcmc->smbios_uuid_encoded, | ||||
| +                            pcmc->smbios_stream_product,
 | ||||
| +                            pcmc->smbios_stream_version,
 | ||||
|                              SMBIOS_ENTRY_POINT_21); | ||||
|      } | ||||
|   | ||||
| diff --git a/hw/net/rtl8139.c b/hw/net/rtl8139.c
 | ||||
| index 90b4fc63ce..3ffb9dd22c 100644
 | ||||
| --- a/hw/net/rtl8139.c
 | ||||
| +++ b/hw/net/rtl8139.c
 | ||||
| @@ -3179,7 +3179,7 @@ static int rtl8139_pre_save(void *opaque)
 | ||||
|   | ||||
|  static const VMStateDescription vmstate_rtl8139 = { | ||||
|      .name = "rtl8139", | ||||
| -    .version_id = 5,
 | ||||
| +    .version_id = 4,
 | ||||
|      .minimum_version_id = 3, | ||||
|      .post_load = rtl8139_post_load, | ||||
|      .pre_save  = rtl8139_pre_save, | ||||
| @@ -3260,7 +3260,9 @@ static const VMStateDescription vmstate_rtl8139 = {
 | ||||
|          VMSTATE_UINT32(tally_counters.TxMCol, RTL8139State), | ||||
|          VMSTATE_UINT64(tally_counters.RxOkPhy, RTL8139State), | ||||
|          VMSTATE_UINT64(tally_counters.RxOkBrd, RTL8139State), | ||||
| +#if 0 /* Disabled for Red Hat Enterprise Linux bz 1420195 */
 | ||||
|          VMSTATE_UINT32_V(tally_counters.RxOkMul, RTL8139State, 5), | ||||
| +#endif
 | ||||
|          VMSTATE_UINT16(tally_counters.TxAbt, RTL8139State), | ||||
|          VMSTATE_UINT16(tally_counters.TxUndrn, RTL8139State), | ||||
|   | ||||
| diff --git a/hw/rtc/mc146818rtc.c b/hw/rtc/mc146818rtc.c
 | ||||
| index 4fbafddb22..6c42cc22cd 100644
 | ||||
| --- a/hw/rtc/mc146818rtc.c
 | ||||
| +++ b/hw/rtc/mc146818rtc.c
 | ||||
| @@ -43,6 +43,7 @@
 | ||||
|  #include "qapi/qapi-events-misc-target.h" | ||||
|  #include "qapi/visitor.h" | ||||
|  #include "hw/rtc/mc146818rtc_regs.h" | ||||
| +#include "migration/migration.h"
 | ||||
|   | ||||
|  #ifdef TARGET_I386 | ||||
|  #include "qapi/qapi-commands-misc-target.h" | ||||
| @@ -821,6 +822,7 @@ static int rtc_post_load(void *opaque, int version_id)
 | ||||
|  static bool rtc_irq_reinject_on_ack_count_needed(void *opaque) | ||||
|  { | ||||
|      RTCState *s = (RTCState *)opaque; | ||||
| +
 | ||||
|      return s->irq_reinject_on_ack_count != 0; | ||||
|  } | ||||
|   | ||||
| diff --git a/hw/smbios/smbios.c b/hw/smbios/smbios.c
 | ||||
| index 7397e56737..3a4bb894ba 100644
 | ||||
| --- a/hw/smbios/smbios.c
 | ||||
| +++ b/hw/smbios/smbios.c
 | ||||
| @@ -57,6 +57,9 @@ static bool smbios_legacy = true;
 | ||||
|  static bool smbios_uuid_encoded = true; | ||||
|  /* end: legacy structures & constants for <= 2.0 machines */ | ||||
|   | ||||
| +/* Set to true for modern Windows 10 HardwareID-6 compat */
 | ||||
| +static bool smbios_type2_required;
 | ||||
| +
 | ||||
|   | ||||
|  uint8_t *smbios_tables; | ||||
|  size_t smbios_tables_len; | ||||
| @@ -619,7 +622,7 @@ static void smbios_build_type_1_table(void)
 | ||||
|   | ||||
|  static void smbios_build_type_2_table(void) | ||||
|  { | ||||
| -    SMBIOS_BUILD_TABLE_PRE(2, 0x200, false); /* optional */
 | ||||
| +    SMBIOS_BUILD_TABLE_PRE(2, 0x200, smbios_type2_required);
 | ||||
|   | ||||
|      SMBIOS_TABLE_SET_STR(2, manufacturer_str, type2.manufacturer); | ||||
|      SMBIOS_TABLE_SET_STR(2, product_str, type2.product); | ||||
| @@ -888,7 +891,10 @@ void smbios_set_cpuid(uint32_t version, uint32_t features)
 | ||||
|   | ||||
|  void smbios_set_defaults(const char *manufacturer, const char *product, | ||||
|                           const char *version, bool legacy_mode, | ||||
| -                         bool uuid_encoded, SmbiosEntryPointType ep_type)
 | ||||
| +                         bool uuid_encoded,
 | ||||
| +                         const char *stream_product,
 | ||||
| +                         const char *stream_version,
 | ||||
| +                         SmbiosEntryPointType ep_type)
 | ||||
|  { | ||||
|      smbios_have_defaults = true; | ||||
|      smbios_legacy = legacy_mode; | ||||
| @@ -909,11 +915,45 @@ void smbios_set_defaults(const char *manufacturer, const char *product,
 | ||||
|          g_free(smbios_entries); | ||||
|      } | ||||
|   | ||||
| +    /*
 | ||||
| +     * If @stream_product & @stream_version are non-NULL, then
 | ||||
| +     * we're following rules for new Windows driver support.
 | ||||
| +     * The data we have to report is defined in this doc:
 | ||||
| +     *
 | ||||
| +     * https://docs.microsoft.com/en-us/windows-hardware/drivers/install/specifying-hardware-ids-for-a-computer
 | ||||
| +     *
 | ||||
| +     * The Windows drivers are written to expect use of the
 | ||||
| +     * scheme documented as "HardwareID-6" against Windows 10,
 | ||||
| +     * which uses SMBIOS System (Type 1) and Base Board (Type 2)
 | ||||
| +     * tables and will match on
 | ||||
| +     *
 | ||||
| +     *   System Manufacturer = Red Hat     (@manufacturer)
 | ||||
| +     *   System SKU Number = 8.2.0         (@stream_version)
 | ||||
| +     *   Baseboard Manufacturer = Red Hat  (@manufacturer)
 | ||||
| +     *   Baseboard Product = RHEL-AV       (@stream_product)
 | ||||
| +     *
 | ||||
| +     * NB, SKU must be changed with each RHEL-AV release
 | ||||
| +     *
 | ||||
| +     * Other fields can be freely used by applications using
 | ||||
| +     * QEMU. For example apps can use the "System product"
 | ||||
| +     * and "System version" to identify themselves.
 | ||||
| +     *
 | ||||
| +     * We get 'System Manufacturer' and 'Baseboard Manufacturer'
 | ||||
| +     */
 | ||||
|      SMBIOS_SET_DEFAULT(type1.manufacturer, manufacturer); | ||||
|      SMBIOS_SET_DEFAULT(type1.product, product); | ||||
|      SMBIOS_SET_DEFAULT(type1.version, version); | ||||
| +    SMBIOS_SET_DEFAULT(type1.family, "Red Hat Enterprise Linux");
 | ||||
| +    if (stream_version != NULL) {
 | ||||
| +        SMBIOS_SET_DEFAULT(type1.sku, stream_version);
 | ||||
| +    }
 | ||||
|      SMBIOS_SET_DEFAULT(type2.manufacturer, manufacturer); | ||||
| -    SMBIOS_SET_DEFAULT(type2.product, product);
 | ||||
| +    if (stream_product != NULL) {
 | ||||
| +        SMBIOS_SET_DEFAULT(type2.product, stream_product);
 | ||||
| +        smbios_type2_required = true;
 | ||||
| +    } else {
 | ||||
| +        SMBIOS_SET_DEFAULT(type2.product, product);
 | ||||
| +    }
 | ||||
|      SMBIOS_SET_DEFAULT(type2.version, version); | ||||
|      SMBIOS_SET_DEFAULT(type3.manufacturer, manufacturer); | ||||
|      SMBIOS_SET_DEFAULT(type3.version, version); | ||||
| diff --git a/hw/timer/i8254_common.c b/hw/timer/i8254_common.c
 | ||||
| index 050875b497..32935da46c 100644
 | ||||
| --- a/hw/timer/i8254_common.c
 | ||||
| +++ b/hw/timer/i8254_common.c
 | ||||
| @@ -231,7 +231,7 @@ static const VMStateDescription vmstate_pit_common = {
 | ||||
|      .pre_save = pit_dispatch_pre_save, | ||||
|      .post_load = pit_dispatch_post_load, | ||||
|      .fields = (VMStateField[]) { | ||||
| -        VMSTATE_UINT32_V(channels[0].irq_disabled, PITCommonState, 3),
 | ||||
| +        VMSTATE_UINT32(channels[0].irq_disabled, PITCommonState), /* qemu-kvm's v2 had 'flags' here */
 | ||||
|          VMSTATE_STRUCT_ARRAY(channels, PITCommonState, 3, 2, | ||||
|                               vmstate_pit_channel, PITChannelState), | ||||
|          VMSTATE_INT64(channels[0].next_transition_time, | ||||
| diff --git a/hw/usb/hcd-uhci.c b/hw/usb/hcd-uhci.c
 | ||||
| index d1b5657d72..7930b868fa 100644
 | ||||
| --- a/hw/usb/hcd-uhci.c
 | ||||
| +++ b/hw/usb/hcd-uhci.c
 | ||||
| @@ -1166,11 +1166,13 @@ void usb_uhci_common_realize(PCIDevice *dev, Error **errp)
 | ||||
|      UHCIState *s = UHCI(dev); | ||||
|      uint8_t *pci_conf = s->dev.config; | ||||
|      int i; | ||||
| +    int irq_pin;
 | ||||
|   | ||||
|      pci_conf[PCI_CLASS_PROG] = 0x00; | ||||
|      /* TODO: reset value should be 0. */ | ||||
|      pci_conf[USB_SBRN] = USB_RELEASE_1; /* release number */ | ||||
| -    pci_config_set_interrupt_pin(pci_conf, u->info.irq_pin + 1);
 | ||||
| +    irq_pin = u->info.irq_pin;
 | ||||
| +    pci_config_set_interrupt_pin(pci_conf, irq_pin + 1);
 | ||||
|      s->irq = pci_allocate_irq(dev); | ||||
|   | ||||
|      if (s->masterbus) { | ||||
| diff --git a/hw/usb/hcd-xhci-pci.c b/hw/usb/hcd-xhci-pci.c
 | ||||
| index e934b1a5b1..e18b05e528 100644
 | ||||
| --- a/hw/usb/hcd-xhci-pci.c
 | ||||
| +++ b/hw/usb/hcd-xhci-pci.c
 | ||||
| @@ -104,6 +104,33 @@ static int xhci_pci_vmstate_post_load(void *opaque, int version_id)
 | ||||
|     return 0; | ||||
|  } | ||||
|   | ||||
| +/* RH bz 1912846 */
 | ||||
| +static bool usb_xhci_pci_add_msi(struct PCIDevice *dev, Error **errp)
 | ||||
| +{
 | ||||
| +    int ret;
 | ||||
| +    Error *err = NULL;
 | ||||
| +    XHCIPciState *s = XHCI_PCI(dev);
 | ||||
| +
 | ||||
| +    ret = msi_init(dev, 0x70, s->xhci.numintrs, true, false, &err);
 | ||||
| +    /*
 | ||||
| +     * Any error other than -ENOTSUP(board's MSI support is broken)
 | ||||
| +     * is a programming error
 | ||||
| +     */
 | ||||
| +    assert(!ret || ret == -ENOTSUP);
 | ||||
| +    if (ret && s->msi == ON_OFF_AUTO_ON) {
 | ||||
| +        /* Can't satisfy user's explicit msi=on request, fail */
 | ||||
| +        error_append_hint(&err, "You have to use msi=auto (default) or "
 | ||||
| +                "msi=off with this machine type.\n");
 | ||||
| +        error_propagate(errp, err);
 | ||||
| +        return true;
 | ||||
| +    }
 | ||||
| +    assert(!err || s->msi == ON_OFF_AUTO_AUTO);
 | ||||
| +    /* With msi=auto, we fall back to MSI off silently */
 | ||||
| +    error_free(err);
 | ||||
| +
 | ||||
| +    return false;
 | ||||
| +}
 | ||||
| +
 | ||||
|  static void usb_xhci_pci_realize(struct PCIDevice *dev, Error **errp) | ||||
|  { | ||||
|      int ret; | ||||
| @@ -125,23 +152,12 @@ static void usb_xhci_pci_realize(struct PCIDevice *dev, Error **errp)
 | ||||
|          s->xhci.nec_quirks = true; | ||||
|      } | ||||
|   | ||||
| -    if (s->msi != ON_OFF_AUTO_OFF) {
 | ||||
| -        ret = msi_init(dev, 0x70, s->xhci.numintrs, true, false, &err);
 | ||||
| -        /*
 | ||||
| -         * Any error other than -ENOTSUP(board's MSI support is broken)
 | ||||
| -         * is a programming error
 | ||||
| -         */
 | ||||
| -        assert(!ret || ret == -ENOTSUP);
 | ||||
| -        if (ret && s->msi == ON_OFF_AUTO_ON) {
 | ||||
| -            /* Can't satisfy user's explicit msi=on request, fail */
 | ||||
| -            error_append_hint(&err, "You have to use msi=auto (default) or "
 | ||||
| -                    "msi=off with this machine type.\n");
 | ||||
| +    if (s->msi != ON_OFF_AUTO_OFF && s->rh_late_msi_cap) {
 | ||||
| +        /* This gives the behaviour from 5.2.0 onwards, lspci shows 90,a0,70 */
 | ||||
| +        if (usb_xhci_pci_add_msi(dev, &err)) {
 | ||||
|              error_propagate(errp, err); | ||||
|              return; | ||||
|          } | ||||
| -        assert(!err || s->msi == ON_OFF_AUTO_AUTO);
 | ||||
| -        /* With msi=auto, we fall back to MSI off silently */
 | ||||
| -        error_free(err);
 | ||||
|      } | ||||
|      pci_register_bar(dev, 0, | ||||
|                       PCI_BASE_ADDRESS_SPACE_MEMORY | | ||||
| @@ -154,6 +170,14 @@ static void usb_xhci_pci_realize(struct PCIDevice *dev, Error **errp)
 | ||||
|          assert(ret > 0); | ||||
|      } | ||||
|   | ||||
| +    /* RH bz 1912846 */
 | ||||
| +    if (s->msi != ON_OFF_AUTO_OFF && !s->rh_late_msi_cap) {
 | ||||
| +        /* This gives the older RH machine behaviour, lspci shows 90,70,a0 */
 | ||||
| +        if (usb_xhci_pci_add_msi(dev, &err)) {
 | ||||
| +            error_propagate(errp, err);
 | ||||
| +            return;
 | ||||
| +        }
 | ||||
| +    }
 | ||||
|      if (s->msix != ON_OFF_AUTO_OFF) { | ||||
|          /* TODO check for errors, and should fail when msix=on */ | ||||
|          msix_init(dev, s->xhci.numintrs, | ||||
| @@ -198,11 +222,18 @@ static void xhci_instance_init(Object *obj)
 | ||||
|      qdev_alias_all_properties(DEVICE(&s->xhci), obj); | ||||
|  } | ||||
|   | ||||
| +static Property xhci_pci_properties[] = {
 | ||||
| +    /* RH bz 1912846 */
 | ||||
| +    DEFINE_PROP_BOOL("x-rh-late-msi-cap", XHCIPciState, rh_late_msi_cap, true),
 | ||||
| +    DEFINE_PROP_END_OF_LIST()
 | ||||
| +};
 | ||||
| +
 | ||||
|  static void xhci_class_init(ObjectClass *klass, void *data) | ||||
|  { | ||||
|      PCIDeviceClass *k = PCI_DEVICE_CLASS(klass); | ||||
|      DeviceClass *dc = DEVICE_CLASS(klass); | ||||
|   | ||||
| +    device_class_set_props(dc, xhci_pci_properties);
 | ||||
|      dc->reset   = xhci_pci_reset; | ||||
|      dc->vmsd    = &vmstate_xhci_pci; | ||||
|      set_bit(DEVICE_CATEGORY_USB, dc->categories); | ||||
| diff --git a/hw/usb/hcd-xhci-pci.h b/hw/usb/hcd-xhci-pci.h
 | ||||
| index c193f79443..086a1feb1e 100644
 | ||||
| --- a/hw/usb/hcd-xhci-pci.h
 | ||||
| +++ b/hw/usb/hcd-xhci-pci.h
 | ||||
| @@ -39,6 +39,7 @@ typedef struct XHCIPciState {
 | ||||
|      XHCIState xhci; | ||||
|      OnOffAuto msi; | ||||
|      OnOffAuto msix; | ||||
| +    bool      rh_late_msi_cap;  /* bz 1912846 */
 | ||||
|  } XHCIPciState; | ||||
|   | ||||
|  #endif | ||||
| diff --git a/include/hw/boards.h b/include/hw/boards.h
 | ||||
| index 9c1c190104..b0a6e05b48 100644
 | ||||
| --- a/include/hw/boards.h
 | ||||
| +++ b/include/hw/boards.h
 | ||||
| @@ -441,4 +441,25 @@ extern const size_t hw_compat_2_2_len;
 | ||||
|  extern GlobalProperty hw_compat_2_1[]; | ||||
|  extern const size_t hw_compat_2_1_len; | ||||
|   | ||||
| +extern GlobalProperty hw_compat_rhel_8_5[];
 | ||||
| +extern const size_t hw_compat_rhel_8_5_len;
 | ||||
| +
 | ||||
| +extern GlobalProperty hw_compat_rhel_8_4[];
 | ||||
| +extern const size_t hw_compat_rhel_8_4_len;
 | ||||
| +
 | ||||
| +extern GlobalProperty hw_compat_rhel_8_3[];
 | ||||
| +extern const size_t hw_compat_rhel_8_3_len;
 | ||||
| +
 | ||||
| +extern GlobalProperty hw_compat_rhel_8_2[];
 | ||||
| +extern const size_t hw_compat_rhel_8_2_len;
 | ||||
| +
 | ||||
| +extern GlobalProperty hw_compat_rhel_8_1[];
 | ||||
| +extern const size_t hw_compat_rhel_8_1_len;
 | ||||
| +
 | ||||
| +extern GlobalProperty hw_compat_rhel_8_0[];
 | ||||
| +extern const size_t hw_compat_rhel_8_0_len;
 | ||||
| +
 | ||||
| +extern GlobalProperty hw_compat_rhel_7_6[];
 | ||||
| +extern const size_t hw_compat_rhel_7_6_len;
 | ||||
| +
 | ||||
|  #endif | ||||
| diff --git a/include/hw/firmware/smbios.h b/include/hw/firmware/smbios.h
 | ||||
| index 5a0dd0c8cf..2cb1ec2bab 100644
 | ||||
| --- a/include/hw/firmware/smbios.h
 | ||||
| +++ b/include/hw/firmware/smbios.h
 | ||||
| @@ -278,7 +278,10 @@ void smbios_entry_add(QemuOpts *opts, Error **errp);
 | ||||
|  void smbios_set_cpuid(uint32_t version, uint32_t features); | ||||
|  void smbios_set_defaults(const char *manufacturer, const char *product, | ||||
|                           const char *version, bool legacy_mode, | ||||
| -                         bool uuid_encoded, SmbiosEntryPointType ep_type);
 | ||||
| +                         bool uuid_encoded,
 | ||||
| +                         const char *stream_product,
 | ||||
| +                         const char *stream_version,
 | ||||
| +                         SmbiosEntryPointType ep_type);
 | ||||
|  uint8_t *smbios_get_table_legacy(MachineState *ms, size_t *length); | ||||
|  void smbios_get_tables(MachineState *ms, | ||||
|                         const struct smbios_phys_mem_area *mem_array, | ||||
| diff --git a/include/hw/i386/pc.h b/include/hw/i386/pc.h
 | ||||
| index 9ab39e428f..7ccc9a1a07 100644
 | ||||
| --- a/include/hw/i386/pc.h
 | ||||
| +++ b/include/hw/i386/pc.h
 | ||||
| @@ -107,6 +107,9 @@ struct PCMachineClass {
 | ||||
|      bool smbios_defaults; | ||||
|      bool smbios_legacy_mode; | ||||
|      bool smbios_uuid_encoded; | ||||
| +    /* New fields needed for Windows HardwareID-6 matching */
 | ||||
| +    const char *smbios_stream_product;
 | ||||
| +    const char *smbios_stream_version;
 | ||||
|   | ||||
|      /* RAM / address space compat: */ | ||||
|      bool gigabyte_align; | ||||
| -- 
 | ||||
| 2.27.0 | ||||
| 
 | ||||
							
								
								
									
										310
									
								
								SOURCES/0008-Add-aarch64-machine-types.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										310
									
								
								SOURCES/0008-Add-aarch64-machine-types.patch
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,310 @@ | ||||
| From 19d36c4519a1a560cce60b212e3afdf7eb026e45 Mon Sep 17 00:00:00 2001 | ||||
| From: Miroslav Rezanina <mrezanin@redhat.com> | ||||
| Date: Fri, 19 Oct 2018 12:53:31 +0200 | ||||
| Subject: Add aarch64 machine types | ||||
| 
 | ||||
| Adding changes to add RHEL machine types for aarch64 architecture. | ||||
| 
 | ||||
| Signed-off-by: Miroslav Rezanina <mrezanin@redhat.com> | ||||
| ---
 | ||||
| Rebase notes (6.1.0): | ||||
| - Use CONFIG_TPM check when using TPM structures
 | ||||
| - Add support for default_bus_bypass_iommu
 | ||||
| - ea4c0b32d9 arm/virt: Register highmem and gic-version as class properties
 | ||||
| - 895e1fa86a hw/arm/virt: Add 8.5 and 9.0 machine types and remove older ones
 | ||||
| 
 | ||||
| Merged patches (6.2.0 RC0): | ||||
| - 9a3d4fde0e hw/arm/virt: Remove 9.0 machine type
 | ||||
| - f7d04d6695 hw: arm: virt: Add hw_compat_rhel_8_5 to 8.5 machine type
 | ||||
| ---
 | ||||
|  hw/arm/virt.c         | 205 +++++++++++++++++++++++++++++++++++++++++- | ||||
|  include/hw/arm/virt.h |   8 ++ | ||||
|  2 files changed, 212 insertions(+), 1 deletion(-) | ||||
| 
 | ||||
| diff --git a/hw/arm/virt.c b/hw/arm/virt.c
 | ||||
| index 5de4d9d73b..7d51824263 100644
 | ||||
| --- a/hw/arm/virt.c
 | ||||
| +++ b/hw/arm/virt.c
 | ||||
| @@ -79,6 +79,7 @@
 | ||||
|  #include "hw/char/pl011.h" | ||||
|  #include "qemu/guest-random.h" | ||||
|   | ||||
| +#if 0 /* Disabled for Red Hat Enterprise Linux */
 | ||||
|  #define DEFINE_VIRT_MACHINE_LATEST(major, minor, latest) \ | ||||
|      static void virt_##major##_##minor##_class_init(ObjectClass *oc, \ | ||||
|                                                      void *data) \ | ||||
| @@ -105,7 +106,48 @@
 | ||||
|      DEFINE_VIRT_MACHINE_LATEST(major, minor, true) | ||||
|  #define DEFINE_VIRT_MACHINE(major, minor) \ | ||||
|      DEFINE_VIRT_MACHINE_LATEST(major, minor, false) | ||||
| -
 | ||||
| +#endif /* disabled for RHEL */
 | ||||
| +
 | ||||
| +#define DEFINE_RHEL_MACHINE_LATEST(m, n, s, latest)                     \
 | ||||
| +    static void rhel##m##n##s##_virt_class_init(ObjectClass *oc,        \
 | ||||
| +                                                void *data)             \
 | ||||
| +    {                                                                   \
 | ||||
| +        MachineClass *mc = MACHINE_CLASS(oc);                           \
 | ||||
| +        rhel##m##n##s##_virt_options(mc);                               \
 | ||||
| +        mc->desc = "RHEL " # m "." # n "." # s " ARM Virtual Machine";  \
 | ||||
| +        if (latest) {                                                   \
 | ||||
| +            mc->alias = "virt";                                         \
 | ||||
| +            mc->is_default = 1;                                         \
 | ||||
| +        }                                                               \
 | ||||
| +    }                                                                   \
 | ||||
| +    static const TypeInfo rhel##m##n##s##_machvirt_info = {             \
 | ||||
| +        .name = MACHINE_TYPE_NAME("virt-rhel" # m "." # n "." # s),     \
 | ||||
| +        .parent = TYPE_RHEL_MACHINE,                                    \
 | ||||
| +        .class_init = rhel##m##n##s##_virt_class_init,                  \
 | ||||
| +    };                                                                  \
 | ||||
| +    static void rhel##m##n##s##_machvirt_init(void)                     \
 | ||||
| +    {                                                                   \
 | ||||
| +        type_register_static(&rhel##m##n##s##_machvirt_info);           \
 | ||||
| +    }                                                                   \
 | ||||
| +    type_init(rhel##m##n##s##_machvirt_init);
 | ||||
| +
 | ||||
| +#define DEFINE_RHEL_MACHINE_AS_LATEST(major, minor, subminor)   \
 | ||||
| +    DEFINE_RHEL_MACHINE_LATEST(major, minor, subminor, true)
 | ||||
| +#define DEFINE_RHEL_MACHINE(major, minor, subminor)             \
 | ||||
| +    DEFINE_RHEL_MACHINE_LATEST(major, minor, subminor, false)
 | ||||
| +
 | ||||
| +/* This variable is for changes to properties that are RHEL specific,
 | ||||
| + * different to the current upstream and to be applied to the latest
 | ||||
| + * machine type.
 | ||||
| + */
 | ||||
| +GlobalProperty arm_rhel_compat[] = {
 | ||||
| +    {
 | ||||
| +        .driver   = "virtio-net-pci",
 | ||||
| +        .property = "romfile",
 | ||||
| +        .value    = "",
 | ||||
| +    },
 | ||||
| +};
 | ||||
| +const size_t arm_rhel_compat_len = G_N_ELEMENTS(arm_rhel_compat);
 | ||||
|   | ||||
|  /* Number of external interrupt lines to configure the GIC with */ | ||||
|  #define NUM_IRQS 256 | ||||
| @@ -2180,6 +2222,7 @@ static void machvirt_init(MachineState *machine)
 | ||||
|      qemu_add_machine_init_done_notifier(&vms->machine_done); | ||||
|  } | ||||
|   | ||||
| +#if 0 /* Disabled for Red Hat Enterprise Linux */
 | ||||
|  static bool virt_get_secure(Object *obj, Error **errp) | ||||
|  { | ||||
|      VirtMachineState *vms = VIRT_MACHINE(obj); | ||||
| @@ -2207,6 +2250,7 @@ static void virt_set_virt(Object *obj, bool value, Error **errp)
 | ||||
|   | ||||
|      vms->virt = value; | ||||
|  } | ||||
| +#endif /* disabled for RHEL */
 | ||||
|   | ||||
|  static bool virt_get_highmem(Object *obj, Error **errp) | ||||
|  { | ||||
| @@ -2304,6 +2348,7 @@ static void virt_set_acpi(Object *obj, Visitor *v, const char *name,
 | ||||
|      visit_type_OnOffAuto(v, name, &vms->acpi, errp); | ||||
|  } | ||||
|   | ||||
| +#if 0 /* Disabled for Red Hat Enterprise Linux */
 | ||||
|  static bool virt_get_ras(Object *obj, Error **errp) | ||||
|  { | ||||
|      VirtMachineState *vms = VIRT_MACHINE(obj); | ||||
| @@ -2331,6 +2376,7 @@ static void virt_set_mte(Object *obj, bool value, Error **errp)
 | ||||
|   | ||||
|      vms->mte = value; | ||||
|  } | ||||
| +#endif /* disabled for RHEL */
 | ||||
|   | ||||
|  static char *virt_get_gic_version(Object *obj, Error **errp) | ||||
|  { | ||||
| @@ -2666,6 +2712,7 @@ static int virt_kvm_type(MachineState *ms, const char *type_str)
 | ||||
|      return fixed_ipa ? 0 : requested_pa_size; | ||||
|  } | ||||
|   | ||||
| +#if 0 /* Disabled for Red Hat Enterprise Linux */
 | ||||
|  static void virt_machine_class_init(ObjectClass *oc, void *data) | ||||
|  { | ||||
|      MachineClass *mc = MACHINE_CLASS(oc); | ||||
| @@ -3031,3 +3078,159 @@ static void virt_machine_2_6_options(MachineClass *mc)
 | ||||
|      vmc->no_pmu = true; | ||||
|  } | ||||
|  DEFINE_VIRT_MACHINE(2, 6) | ||||
| +#endif /* disabled for RHEL */
 | ||||
| +
 | ||||
| +static void rhel_machine_class_init(ObjectClass *oc, void *data)
 | ||||
| +{
 | ||||
| +    MachineClass *mc = MACHINE_CLASS(oc);
 | ||||
| +    HotplugHandlerClass *hc = HOTPLUG_HANDLER_CLASS(oc);
 | ||||
| +
 | ||||
| +    mc->family = "virt-rhel-Z";
 | ||||
| +    mc->init = machvirt_init;
 | ||||
| +    /* Maximum supported VCPU count for all virt-rhel* machines */
 | ||||
| +    mc->max_cpus = 384;
 | ||||
| +#ifdef CONFIG_TPM
 | ||||
| +    machine_class_allow_dynamic_sysbus_dev(mc, TYPE_TPM_TIS_SYSBUS);
 | ||||
| +#endif
 | ||||
| +    mc->block_default_type = IF_VIRTIO;
 | ||||
| +    mc->no_cdrom = 1;
 | ||||
| +    mc->pci_allow_0_address = true;
 | ||||
| +    /* We know we will never create a pre-ARMv7 CPU which needs 1K pages */
 | ||||
| +    mc->minimum_page_bits = 12;
 | ||||
| +    mc->possible_cpu_arch_ids = virt_possible_cpu_arch_ids;
 | ||||
| +    mc->cpu_index_to_instance_props = virt_cpu_index_to_props;
 | ||||
| +    mc->default_cpu_type = ARM_CPU_TYPE_NAME("cortex-a57");
 | ||||
| +    mc->get_default_cpu_node_id = virt_get_default_cpu_node_id;
 | ||||
| +    mc->kvm_type = virt_kvm_type;
 | ||||
| +    assert(!mc->get_hotplug_handler);
 | ||||
| +    mc->get_hotplug_handler = virt_machine_get_hotplug_handler;
 | ||||
| +    hc->pre_plug = virt_machine_device_pre_plug_cb;
 | ||||
| +    hc->plug = virt_machine_device_plug_cb;
 | ||||
| +    hc->unplug_request = virt_machine_device_unplug_request_cb;
 | ||||
| +    hc->unplug = virt_machine_device_unplug_cb;
 | ||||
| +    mc->nvdimm_supported = true;
 | ||||
| +    mc->auto_enable_numa_with_memhp = true;
 | ||||
| +    mc->auto_enable_numa_with_memdev = true;
 | ||||
| +    mc->default_ram_id = "mach-virt.ram";
 | ||||
| +
 | ||||
| +    object_class_property_add(oc, "acpi", "OnOffAuto",
 | ||||
| +        virt_get_acpi, virt_set_acpi,
 | ||||
| +        NULL, NULL);
 | ||||
| +    object_class_property_set_description(oc, "acpi",
 | ||||
| +        "Enable ACPI");
 | ||||
| +
 | ||||
| +    object_class_property_add_bool(oc, "highmem", virt_get_highmem,
 | ||||
| +                                   virt_set_highmem);
 | ||||
| +    object_class_property_set_description(oc, "highmem",
 | ||||
| +                                          "Set on/off to enable/disable using "
 | ||||
| +                                          "physical address space above 32 bits");
 | ||||
| +
 | ||||
| +    object_class_property_add_str(oc, "gic-version", virt_get_gic_version,
 | ||||
| +                                  virt_set_gic_version);
 | ||||
| +    object_class_property_set_description(oc, "gic-version",
 | ||||
| +                                          "Set GIC version. "
 | ||||
| +                                          "Valid values are 2, 3, host and max");
 | ||||
| +
 | ||||
| +    object_class_property_add_str(oc, "x-oem-id",
 | ||||
| +                                  virt_get_oem_id,
 | ||||
| +                                  virt_set_oem_id);
 | ||||
| +    object_class_property_set_description(oc, "x-oem-id",
 | ||||
| +                                          "Override the default value of field OEMID "
 | ||||
| +                                          "in ACPI table header."
 | ||||
| +                                          "The string may be up to 6 bytes in size");
 | ||||
| +
 | ||||
| +    object_class_property_add_str(oc, "x-oem-table-id",
 | ||||
| +                                  virt_get_oem_table_id,
 | ||||
| +                                  virt_set_oem_table_id);
 | ||||
| +    object_class_property_set_description(oc, "x-oem-table-id",
 | ||||
| +                                          "Override the default value of field OEM Table ID "
 | ||||
| +                                          "in ACPI table header."
 | ||||
| +                                          "The string may be up to 8 bytes in size");
 | ||||
| +    object_class_property_add_bool(oc, "default_bus_bypass_iommu",
 | ||||
| +                                   virt_get_default_bus_bypass_iommu,
 | ||||
| +                                   virt_set_default_bus_bypass_iommu);
 | ||||
| +    object_class_property_set_description(oc, "default_bus_bypass_iommu",
 | ||||
| +                                          "Set on/off to enable/disable "
 | ||||
| +                                          "bypass_iommu for default root bus");
 | ||||
| +
 | ||||
| +}
 | ||||
| +
 | ||||
| +static void rhel_virt_instance_init(Object *obj)
 | ||||
| +{
 | ||||
| +    VirtMachineState *vms = VIRT_MACHINE(obj);
 | ||||
| +    VirtMachineClass *vmc = VIRT_MACHINE_GET_CLASS(vms);
 | ||||
| +
 | ||||
| +    /* EL3 is disabled by default and non-configurable for RHEL */
 | ||||
| +    vms->secure = false;
 | ||||
| +
 | ||||
| +    /* EL2 is disabled by default and non-configurable for RHEL */
 | ||||
| +    vms->virt = false;
 | ||||
| +
 | ||||
| +    /* High memory is enabled by default */
 | ||||
| +    vms->highmem = true;
 | ||||
| +    vms->gic_version = VIRT_GIC_VERSION_NOSEL;
 | ||||
| +
 | ||||
| +    vms->highmem_ecam = !vmc->no_highmem_ecam;
 | ||||
| +
 | ||||
| +    if (vmc->no_its) {
 | ||||
| +        vms->its = false;
 | ||||
| +    } else {
 | ||||
| +        /* Default allows ITS instantiation */
 | ||||
| +        vms->its = true;
 | ||||
| +        object_property_add_bool(obj, "its", virt_get_its,
 | ||||
| +                                 virt_set_its);
 | ||||
| +        object_property_set_description(obj, "its",
 | ||||
| +                                        "Set on/off to enable/disable "
 | ||||
| +                                        "ITS instantiation");
 | ||||
| +    }
 | ||||
| +
 | ||||
| +    /* Default disallows iommu instantiation */
 | ||||
| +    vms->iommu = VIRT_IOMMU_NONE;
 | ||||
| +    object_property_add_str(obj, "iommu", virt_get_iommu, virt_set_iommu);
 | ||||
| +    object_property_set_description(obj, "iommu",
 | ||||
| +                                    "Set the IOMMU type. "
 | ||||
| +                                    "Valid values are none and smmuv3");
 | ||||
| +
 | ||||
| +    /* Default disallows RAS instantiation and is non-configurable for RHEL */
 | ||||
| +    vms->ras = false;
 | ||||
| +
 | ||||
| +    /* MTE is disabled by default and non-configurable for RHEL */
 | ||||
| +    vms->mte = false;
 | ||||
| +
 | ||||
| +    /* The default root bus is attached to iommu by default */
 | ||||
| +    vms->default_bus_bypass_iommu = false;
 | ||||
| +
 | ||||
| +    vms->irqmap = a15irqmap;
 | ||||
| +
 | ||||
| +    virt_flash_create(vms);
 | ||||
| +    vms->oem_id = g_strndup(ACPI_BUILD_APPNAME6, 6);
 | ||||
| +    vms->oem_table_id = g_strndup(ACPI_BUILD_APPNAME8, 8);
 | ||||
| +
 | ||||
| +}
 | ||||
| +
 | ||||
| +static const TypeInfo rhel_machine_info = {
 | ||||
| +    .name          = TYPE_RHEL_MACHINE,
 | ||||
| +    .parent        = TYPE_MACHINE,
 | ||||
| +    .abstract      = true,
 | ||||
| +    .instance_size = sizeof(VirtMachineState),
 | ||||
| +    .class_size    = sizeof(VirtMachineClass),
 | ||||
| +    .class_init    = rhel_machine_class_init,
 | ||||
| +    .instance_init = rhel_virt_instance_init,
 | ||||
| +    .interfaces = (InterfaceInfo[]) {
 | ||||
| +         { TYPE_HOTPLUG_HANDLER },
 | ||||
| +         { }
 | ||||
| +    },
 | ||||
| +};
 | ||||
| +
 | ||||
| +static void rhel_machine_init(void)
 | ||||
| +{
 | ||||
| +    type_register_static(&rhel_machine_info);
 | ||||
| +}
 | ||||
| +type_init(rhel_machine_init);
 | ||||
| +
 | ||||
| +static void rhel850_virt_options(MachineClass *mc)
 | ||||
| +{
 | ||||
| +    compat_props_add(mc->compat_props, arm_rhel_compat, arm_rhel_compat_len);
 | ||||
| +    compat_props_add(mc->compat_props, hw_compat_rhel_8_5, hw_compat_rhel_8_5_len);
 | ||||
| +}
 | ||||
| +DEFINE_RHEL_MACHINE_AS_LATEST(8, 5, 0)
 | ||||
| diff --git a/include/hw/arm/virt.h b/include/hw/arm/virt.h
 | ||||
| index dc6b66ffc8..9364628847 100644
 | ||||
| --- a/include/hw/arm/virt.h
 | ||||
| +++ b/include/hw/arm/virt.h
 | ||||
| @@ -175,9 +175,17 @@ struct VirtMachineState {
 | ||||
|   | ||||
|  #define VIRT_ECAM_ID(high) (high ? VIRT_HIGH_PCIE_ECAM : VIRT_PCIE_ECAM) | ||||
|   | ||||
| +#if 0 /* disabled for Red Hat Enterprise Linux */
 | ||||
|  #define TYPE_VIRT_MACHINE   MACHINE_TYPE_NAME("virt") | ||||
|  OBJECT_DECLARE_TYPE(VirtMachineState, VirtMachineClass, VIRT_MACHINE) | ||||
|   | ||||
| +#else
 | ||||
| +#define TYPE_RHEL_MACHINE MACHINE_TYPE_NAME("virt-rhel")
 | ||||
| +typedef struct VirtMachineClass VirtMachineClass;
 | ||||
| +typedef struct VirtMachineState VirtMachineState;
 | ||||
| +DECLARE_OBJ_CHECKERS(VirtMachineState, VirtMachineClass, VIRT_MACHINE, TYPE_RHEL_MACHINE)
 | ||||
| +#endif
 | ||||
| +
 | ||||
|  void virt_acpi_setup(VirtMachineState *vms); | ||||
|  bool virt_is_acpi_enabled(VirtMachineState *vms); | ||||
|   | ||||
| -- 
 | ||||
| 2.27.0 | ||||
| 
 | ||||
							
								
								
									
										528
									
								
								SOURCES/0009-Add-ppc64-machine-types.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										528
									
								
								SOURCES/0009-Add-ppc64-machine-types.patch
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,528 @@ | ||||
| From 2d595bc1744fc764ef506fd6ed6555f267d01ea4 Mon Sep 17 00:00:00 2001 | ||||
| From: Miroslav Rezanina <mrezanin@redhat.com> | ||||
| Date: Fri, 19 Oct 2018 13:27:13 +0200 | ||||
| Subject: Add ppc64 machine types | ||||
| 
 | ||||
| Adding changes to add RHEL machine types for ppc64 architecture. | ||||
| 
 | ||||
| Signed-off-by: Miroslav Rezanina <mrezanin@redhat.com> | ||||
| 
 | ||||
| Rebase notes (6.2.0 rc1): | ||||
| - Fixed rebase conflict relicts
 | ||||
| - Update machine type compat for 6.2 (from MR 66)
 | ||||
| 
 | ||||
| Merged patches (6.1.0): | ||||
| - c438c25ac3 redhat: Define pseries-rhel8.5.0 machine type
 | ||||
| - a3995e2eff Remove RHEL 7.0.0 machine type (only ppc64 changes)
 | ||||
| - ad3190a79b Remove RHEL 7.1.0 machine type (only ppc64 changes)
 | ||||
| - 84bbe15d4e Remove RHEL 7.2.0 machine type (only ppc64 changes)
 | ||||
| - 0215eb3356 Remove RHEL 7.3.0 machine types (only ppc64 changes)
 | ||||
| - af69d1ca6e Remove RHEL 7.4.0 machine types (only ppc64 changes)
 | ||||
| - 8f7a74ab78 Remove RHEL 7.5.0 machine types (only ppc64 changes)
 | ||||
| ---
 | ||||
|  hw/ppc/spapr.c          | 243 ++++++++++++++++++++++++++++++++++++++++ | ||||
|  hw/ppc/spapr_cpu_core.c |  13 +++ | ||||
|  include/hw/ppc/spapr.h  |   4 + | ||||
|  target/ppc/compat.c     |  13 ++- | ||||
|  target/ppc/cpu.h        |   1 + | ||||
|  target/ppc/kvm.c        |  27 +++++ | ||||
|  target/ppc/kvm_ppc.h    |  13 +++ | ||||
|  7 files changed, 313 insertions(+), 1 deletion(-) | ||||
| 
 | ||||
| diff --git a/hw/ppc/spapr.c b/hw/ppc/spapr.c
 | ||||
| index 3b5fd749be..f4bb5f15f0 100644
 | ||||
| --- a/hw/ppc/spapr.c
 | ||||
| +++ b/hw/ppc/spapr.c
 | ||||
| @@ -1593,6 +1593,9 @@ static void spapr_machine_reset(MachineState *machine)
 | ||||
|   | ||||
|      pef_kvm_reset(machine->cgs, &error_fatal); | ||||
|      spapr_caps_apply(spapr); | ||||
| +    if (spapr->svm_allowed) {
 | ||||
| +        kvmppc_svm_allow(&error_fatal);
 | ||||
| +    }
 | ||||
|   | ||||
|      first_ppc_cpu = POWERPC_CPU(first_cpu); | ||||
|      if (kvm_enabled() && kvmppc_has_cap_mmu_radix() && | ||||
| @@ -3288,6 +3291,20 @@ static void spapr_set_host_serial(Object *obj, const char *value, Error **errp)
 | ||||
|      spapr->host_serial = g_strdup(value); | ||||
|  } | ||||
|   | ||||
| +static bool spapr_get_svm_allowed(Object *obj, Error **errp)
 | ||||
| +{
 | ||||
| +    SpaprMachineState *spapr = SPAPR_MACHINE(obj);
 | ||||
| +
 | ||||
| +    return spapr->svm_allowed;
 | ||||
| +}
 | ||||
| +
 | ||||
| +static void spapr_set_svm_allowed(Object *obj, bool value, Error **errp)
 | ||||
| +{
 | ||||
| +    SpaprMachineState *spapr = SPAPR_MACHINE(obj);
 | ||||
| +
 | ||||
| +    spapr->svm_allowed = value;
 | ||||
| +}
 | ||||
| +
 | ||||
|  static void spapr_instance_init(Object *obj) | ||||
|  { | ||||
|      SpaprMachineState *spapr = SPAPR_MACHINE(obj); | ||||
| @@ -3366,6 +3383,12 @@ static void spapr_instance_init(Object *obj)
 | ||||
|          spapr_get_host_serial, spapr_set_host_serial); | ||||
|      object_property_set_description(obj, "host-serial", | ||||
|          "Host serial number to advertise in guest device tree"); | ||||
| +    object_property_add_bool(obj, "x-svm-allowed",
 | ||||
| +                            spapr_get_svm_allowed,
 | ||||
| +                            spapr_set_svm_allowed);
 | ||||
| +    object_property_set_description(obj, "x-svm-allowed",
 | ||||
| +                                    "Allow the guest to become a Secure Guest"
 | ||||
| +                                    " (experimental only)");
 | ||||
|  } | ||||
|   | ||||
|  static void spapr_machine_finalizefn(Object *obj) | ||||
| @@ -4614,6 +4637,7 @@ static void spapr_machine_class_init(ObjectClass *oc, void *data)
 | ||||
|      vmc->client_architecture_support = spapr_vof_client_architecture_support; | ||||
|      vmc->quiesce = spapr_vof_quiesce; | ||||
|      vmc->setprop = spapr_vof_setprop; | ||||
| +    smc->has_power9_support = true;
 | ||||
|  } | ||||
|   | ||||
|  static const TypeInfo spapr_machine_info = { | ||||
| @@ -4665,6 +4689,7 @@ static void spapr_machine_latest_class_options(MachineClass *mc)
 | ||||
|      }                                                                \ | ||||
|      type_init(spapr_machine_register_##suffix) | ||||
|   | ||||
| +#if 0 /* Disabled for Red Hat Enterprise Linux */
 | ||||
|  /* | ||||
|   * pseries-6.2 | ||||
|   */ | ||||
| @@ -4781,6 +4806,7 @@ static void spapr_machine_4_1_class_options(MachineClass *mc)
 | ||||
|  } | ||||
|   | ||||
|  DEFINE_SPAPR_MACHINE(4_1, "4.1", false); | ||||
| +#endif
 | ||||
|   | ||||
|  /* | ||||
|   * pseries-4.0 | ||||
| @@ -4800,6 +4826,8 @@ static bool phb_placement_4_0(SpaprMachineState *spapr, uint32_t index,
 | ||||
|      *nv2atsd = 0; | ||||
|      return true; | ||||
|  } | ||||
| +
 | ||||
| +#if 0 /* Disabled for Red Hat Enterprise Linux */
 | ||||
|  static void spapr_machine_4_0_class_options(MachineClass *mc) | ||||
|  { | ||||
|      SpaprMachineClass *smc = SPAPR_MACHINE_CLASS(mc); | ||||
| @@ -5127,6 +5155,221 @@ static void spapr_machine_2_1_class_options(MachineClass *mc)
 | ||||
|      compat_props_add(mc->compat_props, hw_compat_2_1, hw_compat_2_1_len); | ||||
|  } | ||||
|  DEFINE_SPAPR_MACHINE(2_1, "2.1", false); | ||||
| +#endif
 | ||||
| +
 | ||||
| +static void spapr_machine_rhel_default_class_options(MachineClass *mc)
 | ||||
| +{
 | ||||
| +    /*
 | ||||
| +     * Defaults for the latest behaviour inherited from the base class
 | ||||
| +     * can be overriden here for all pseries-rhel* machines.
 | ||||
| +     */
 | ||||
| +
 | ||||
| +    /* Maximum supported VCPU count */
 | ||||
| +    mc->max_cpus = 384;
 | ||||
| +}
 | ||||
| +
 | ||||
| +/*
 | ||||
| + * pseries-rhel8.5.0
 | ||||
| + * like pseries-6.0
 | ||||
| + */
 | ||||
| +
 | ||||
| +static void spapr_machine_rhel850_class_options(MachineClass *mc)
 | ||||
| +{
 | ||||
| +    SpaprMachineClass *smc = SPAPR_MACHINE_CLASS(mc);
 | ||||
| +
 | ||||
| +    /* The default machine type must apply the RHEL specific defaults */
 | ||||
| +    spapr_machine_rhel_default_class_options(mc);
 | ||||
| +    compat_props_add(mc->compat_props, hw_compat_rhel_8_5,
 | ||||
| +                     hw_compat_rhel_8_5_len);
 | ||||
| +    smc->pre_6_2_numa_affinity = true;
 | ||||
| +    mc->smp_props.prefer_sockets = true;
 | ||||
| +}
 | ||||
| +
 | ||||
| +DEFINE_SPAPR_MACHINE(rhel850, "rhel8.5.0", true);
 | ||||
| +
 | ||||
| +/*
 | ||||
| + * pseries-rhel8.4.0
 | ||||
| + * like pseries-5.2
 | ||||
| + */
 | ||||
| +
 | ||||
| +static void spapr_machine_rhel840_class_options(MachineClass *mc)
 | ||||
| +{
 | ||||
| +    spapr_machine_rhel850_class_options(mc);
 | ||||
| +    compat_props_add(mc->compat_props, hw_compat_rhel_8_4,
 | ||||
| +                     hw_compat_rhel_8_4_len);
 | ||||
| +}
 | ||||
| +
 | ||||
| +DEFINE_SPAPR_MACHINE(rhel840, "rhel8.4.0", false);
 | ||||
| +
 | ||||
| +/*
 | ||||
| + * pseries-rhel8.3.0
 | ||||
| + * like pseries-5.1
 | ||||
| + */
 | ||||
| +
 | ||||
| +static void spapr_machine_rhel830_class_options(MachineClass *mc)
 | ||||
| +{
 | ||||
| +    SpaprMachineClass *smc = SPAPR_MACHINE_CLASS(mc);
 | ||||
| +
 | ||||
| +    spapr_machine_rhel840_class_options(mc);
 | ||||
| +    compat_props_add(mc->compat_props, hw_compat_rhel_8_3,
 | ||||
| +                     hw_compat_rhel_8_3_len);
 | ||||
| +
 | ||||
| +    /* from pseries-5.1 */
 | ||||
| +    smc->pre_5_2_numa_associativity = true;
 | ||||
| +}
 | ||||
| +
 | ||||
| +DEFINE_SPAPR_MACHINE(rhel830, "rhel8.3.0", false);
 | ||||
| +
 | ||||
| +/*
 | ||||
| + * pseries-rhel8.2.0
 | ||||
| + * like pseries-4.2 + pseries-5.0
 | ||||
| + * except SPAPR_CAP_CCF_ASSIST that has been backported to pseries-rhel8.1.0
 | ||||
| + */
 | ||||
| +
 | ||||
| +static void spapr_machine_rhel820_class_options(MachineClass *mc)
 | ||||
| +{
 | ||||
| +    SpaprMachineClass *smc = SPAPR_MACHINE_CLASS(mc);
 | ||||
| +    /* from pseries-5.0 */
 | ||||
| +    static GlobalProperty compat[] = {
 | ||||
| +        { TYPE_SPAPR_PCI_HOST_BRIDGE, "pre-5.1-associativity", "on" },
 | ||||
| +    };
 | ||||
| +
 | ||||
| +    spapr_machine_rhel830_class_options(mc);
 | ||||
| +    compat_props_add(mc->compat_props, hw_compat_rhel_8_2,
 | ||||
| +                     hw_compat_rhel_8_2_len);
 | ||||
| +    compat_props_add(mc->compat_props, compat, G_N_ELEMENTS(compat));
 | ||||
| +
 | ||||
| +    /* from pseries-4.2 */
 | ||||
| +    smc->default_caps.caps[SPAPR_CAP_FWNMI] = SPAPR_CAP_OFF;
 | ||||
| +    smc->rma_limit = 16 * GiB;
 | ||||
| +    mc->nvdimm_supported = false;
 | ||||
| +
 | ||||
| +    /* from pseries-5.0 */
 | ||||
| +    mc->numa_mem_supported = true;
 | ||||
| +    smc->pre_5_1_assoc_refpoints = true;
 | ||||
| +}
 | ||||
| +
 | ||||
| +DEFINE_SPAPR_MACHINE(rhel820, "rhel8.2.0", false);
 | ||||
| +
 | ||||
| +/*
 | ||||
| + * pseries-rhel8.1.0
 | ||||
| + * like pseries-4.1
 | ||||
| + */
 | ||||
| +
 | ||||
| +static void spapr_machine_rhel810_class_options(MachineClass *mc)
 | ||||
| +{
 | ||||
| +    SpaprMachineClass *smc = SPAPR_MACHINE_CLASS(mc);
 | ||||
| +    static GlobalProperty compat[] = {
 | ||||
| +        /* Only allow 4kiB and 64kiB IOMMU pagesizes */
 | ||||
| +        { TYPE_SPAPR_PCI_HOST_BRIDGE, "pgsz", "0x11000" },
 | ||||
| +    };
 | ||||
| +
 | ||||
| +    spapr_machine_rhel820_class_options(mc);
 | ||||
| +
 | ||||
| +    /* from pseries-4.1 */
 | ||||
| +    smc->linux_pci_probe = false;
 | ||||
| +    smc->smp_threads_vsmt = false;
 | ||||
| +    compat_props_add(mc->compat_props, hw_compat_rhel_8_1,
 | ||||
| +                     hw_compat_rhel_8_1_len);
 | ||||
| +    compat_props_add(mc->compat_props, compat, G_N_ELEMENTS(compat));
 | ||||
| +
 | ||||
| +    /* from pseries-4.2 */
 | ||||
| +    smc->default_caps.caps[SPAPR_CAP_CCF_ASSIST] = SPAPR_CAP_OFF;
 | ||||
| +}
 | ||||
| +
 | ||||
| +DEFINE_SPAPR_MACHINE(rhel810, "rhel8.1.0", false);
 | ||||
| +
 | ||||
| +/*
 | ||||
| + * pseries-rhel8.0.0
 | ||||
| + * like pseries-3.1 and pseries-4.0
 | ||||
| + * except SPAPR_CAP_CFPC, SPAPR_CAP_SBBC and SPAPR_CAP_IBS
 | ||||
| + * that have been backported to pseries-rhel8.0.0
 | ||||
| + */
 | ||||
| +
 | ||||
| +static void spapr_machine_rhel800_class_options(MachineClass *mc)
 | ||||
| +{
 | ||||
| +    SpaprMachineClass *smc = SPAPR_MACHINE_CLASS(mc);
 | ||||
| +
 | ||||
| +    spapr_machine_rhel810_class_options(mc);
 | ||||
| +    compat_props_add(mc->compat_props, hw_compat_rhel_8_0,
 | ||||
| +                     hw_compat_rhel_8_0_len);
 | ||||
| +
 | ||||
| +    /* pseries-4.0 */
 | ||||
| +    smc->phb_placement = phb_placement_4_0;
 | ||||
| +    smc->irq = &spapr_irq_xics;
 | ||||
| +    smc->pre_4_1_migration = true;
 | ||||
| +
 | ||||
| +    /* pseries-3.1 */
 | ||||
| +    mc->default_cpu_type = POWERPC_CPU_TYPE_NAME("power8_v2.0");
 | ||||
| +    smc->update_dt_enabled = false;
 | ||||
| +    smc->dr_phb_enabled = false;
 | ||||
| +    smc->broken_host_serial_model = true;
 | ||||
| +    smc->default_caps.caps[SPAPR_CAP_LARGE_DECREMENTER] = SPAPR_CAP_OFF;
 | ||||
| +}
 | ||||
| +
 | ||||
| +DEFINE_SPAPR_MACHINE(rhel800, "rhel8.0.0", false);
 | ||||
| +
 | ||||
| +/*
 | ||||
| + * pseries-rhel7.6.0
 | ||||
| + * like spapr_compat_2_12 and spapr_compat_3_0
 | ||||
| + * spapr_compat_0 is empty
 | ||||
| + */
 | ||||
| +GlobalProperty spapr_compat_rhel7_6[] = {
 | ||||
| +    { TYPE_POWERPC_CPU, "pre-3.0-migration", "on" },
 | ||||
| +    { TYPE_SPAPR_CPU_CORE, "pre-3.0-migration", "on" },
 | ||||
| +};
 | ||||
| +const size_t spapr_compat_rhel7_6_len = G_N_ELEMENTS(spapr_compat_rhel7_6);
 | ||||
| +
 | ||||
| +
 | ||||
| +static void spapr_machine_rhel760_class_options(MachineClass *mc)
 | ||||
| +{
 | ||||
| +    SpaprMachineClass *smc = SPAPR_MACHINE_CLASS(mc);
 | ||||
| +
 | ||||
| +    spapr_machine_rhel800_class_options(mc);
 | ||||
| +    compat_props_add(mc->compat_props, hw_compat_rhel_7_6, hw_compat_rhel_7_6_len);
 | ||||
| +    compat_props_add(mc->compat_props, spapr_compat_rhel7_6, spapr_compat_rhel7_6_len);
 | ||||
| +
 | ||||
| +    /* from spapr_machine_3_0_class_options() */
 | ||||
| +    smc->legacy_irq_allocation = true;
 | ||||
| +    smc->nr_xirqs = 0x400;
 | ||||
| +    smc->irq = &spapr_irq_xics_legacy;
 | ||||
| +
 | ||||
| +    /* from spapr_machine_2_12_class_options() */
 | ||||
| +    /* We depend on kvm_enabled() to choose a default value for the
 | ||||
| +     * hpt-max-page-size capability. Of course we can't do it here
 | ||||
| +     * because this is too early and the HW accelerator isn't initialzed
 | ||||
| +     * yet. Postpone this to machine init (see default_caps_with_cpu()).
 | ||||
| +     */
 | ||||
| +    smc->default_caps.caps[SPAPR_CAP_HPT_MAXPAGESIZE] = 0;
 | ||||
| +
 | ||||
| +    /* SPAPR_CAP_WORKAROUND enabled in pseries-rhel800 by
 | ||||
| +     * f21757edc554
 | ||||
| +     * "Enable mitigations by default for pseries-4.0 machine type")
 | ||||
| +     */
 | ||||
| +    smc->default_caps.caps[SPAPR_CAP_CFPC] = SPAPR_CAP_BROKEN;
 | ||||
| +    smc->default_caps.caps[SPAPR_CAP_SBBC] = SPAPR_CAP_BROKEN;
 | ||||
| +    smc->default_caps.caps[SPAPR_CAP_IBS] = SPAPR_CAP_BROKEN;
 | ||||
| +}
 | ||||
| +
 | ||||
| +DEFINE_SPAPR_MACHINE(rhel760, "rhel7.6.0", false);
 | ||||
| +
 | ||||
| +/*
 | ||||
| + * pseries-rhel7.6.0-sxxm
 | ||||
| + *
 | ||||
| + * pseries-rhel7.6.0 with speculative execution exploit mitigations enabled by default
 | ||||
| + */
 | ||||
| +
 | ||||
| +static void spapr_machine_rhel760sxxm_class_options(MachineClass *mc)
 | ||||
| +{
 | ||||
| +    SpaprMachineClass *smc = SPAPR_MACHINE_CLASS(mc);
 | ||||
| +
 | ||||
| +    spapr_machine_rhel760_class_options(mc);
 | ||||
| +    smc->default_caps.caps[SPAPR_CAP_CFPC] = SPAPR_CAP_WORKAROUND;
 | ||||
| +    smc->default_caps.caps[SPAPR_CAP_SBBC] = SPAPR_CAP_WORKAROUND;
 | ||||
| +    smc->default_caps.caps[SPAPR_CAP_IBS] = SPAPR_CAP_FIXED_CCD;
 | ||||
| +}
 | ||||
| +
 | ||||
| +DEFINE_SPAPR_MACHINE(rhel760sxxm, "rhel7.6.0-sxxm", false);
 | ||||
|   | ||||
|  static void spapr_machine_register_types(void) | ||||
|  { | ||||
| diff --git a/hw/ppc/spapr_cpu_core.c b/hw/ppc/spapr_cpu_core.c
 | ||||
| index 8ba34f6a1d..78eca1c04a 100644
 | ||||
| --- a/hw/ppc/spapr_cpu_core.c
 | ||||
| +++ b/hw/ppc/spapr_cpu_core.c
 | ||||
| @@ -24,6 +24,7 @@
 | ||||
|  #include "sysemu/reset.h" | ||||
|  #include "sysemu/hw_accel.h" | ||||
|  #include "qemu/error-report.h" | ||||
| +#include "cpu-models.h"
 | ||||
|   | ||||
|  static void spapr_reset_vcpu(PowerPCCPU *cpu) | ||||
|  { | ||||
| @@ -250,6 +251,7 @@ static bool spapr_realize_vcpu(PowerPCCPU *cpu, SpaprMachineState *spapr,
 | ||||
|  { | ||||
|      CPUPPCState *env = &cpu->env; | ||||
|      CPUState *cs = CPU(cpu); | ||||
| +    SpaprMachineClass *smc = SPAPR_MACHINE_GET_CLASS(spapr);
 | ||||
|   | ||||
|      if (!qdev_realize(DEVICE(cpu), NULL, errp)) { | ||||
|          return false; | ||||
| @@ -261,6 +263,17 @@ static bool spapr_realize_vcpu(PowerPCCPU *cpu, SpaprMachineState *spapr,
 | ||||
|      cpu_ppc_set_vhyp(cpu, PPC_VIRTUAL_HYPERVISOR(spapr)); | ||||
|      kvmppc_set_papr(cpu); | ||||
|   | ||||
| +    if (!smc->has_power9_support &&
 | ||||
| +        (((spapr->max_compat_pvr &&
 | ||||
| +           ppc_compat_cmp(spapr->max_compat_pvr,
 | ||||
| +                          CPU_POWERPC_LOGICAL_3_00) >= 0)) ||
 | ||||
| +          (!spapr->max_compat_pvr &&
 | ||||
| +           ppc_check_compat(cpu, CPU_POWERPC_LOGICAL_3_00, 0, 0)))) {
 | ||||
| +        error_set(errp, ERROR_CLASS_DEVICE_NOT_FOUND,
 | ||||
| +                  "POWER9 CPU is not supported by this machine class");
 | ||||
| +        return false;
 | ||||
| +    }
 | ||||
| +
 | ||||
|      if (spapr_irq_cpu_intc_create(spapr, cpu, errp) < 0) { | ||||
|          qdev_unrealize(DEVICE(cpu)); | ||||
|          return false; | ||||
| diff --git a/include/hw/ppc/spapr.h b/include/hw/ppc/spapr.h
 | ||||
| index ee7504b976..fcd5bf9302 100644
 | ||||
| --- a/include/hw/ppc/spapr.h
 | ||||
| +++ b/include/hw/ppc/spapr.h
 | ||||
| @@ -154,6 +154,7 @@ struct SpaprMachineClass {
 | ||||
|      bool pre_5_2_numa_associativity; | ||||
|      bool pre_6_2_numa_affinity; | ||||
|   | ||||
| +    bool has_power9_support;
 | ||||
|      bool (*phb_placement)(SpaprMachineState *spapr, uint32_t index, | ||||
|                            uint64_t *buid, hwaddr *pio, | ||||
|                            hwaddr *mmio32, hwaddr *mmio64, | ||||
| @@ -238,6 +239,9 @@ struct SpaprMachineState {
 | ||||
|      /* Set by -boot */ | ||||
|      char *boot_device; | ||||
|   | ||||
| +    /* Secure Guest support via x-svm-allowed */
 | ||||
| +    bool svm_allowed;
 | ||||
| +
 | ||||
|      /*< public >*/ | ||||
|      char *kvm_type; | ||||
|      char *host_model; | ||||
| diff --git a/target/ppc/compat.c b/target/ppc/compat.c
 | ||||
| index 7949a24f5a..f207a9ba01 100644
 | ||||
| --- a/target/ppc/compat.c
 | ||||
| +++ b/target/ppc/compat.c
 | ||||
| @@ -114,8 +114,19 @@ static const CompatInfo *compat_by_pvr(uint32_t pvr)
 | ||||
|      return NULL; | ||||
|  } | ||||
|   | ||||
| +long ppc_compat_cmp(uint32_t pvr1, uint32_t pvr2)
 | ||||
| +{
 | ||||
| +    const CompatInfo *compat1 = compat_by_pvr(pvr1);
 | ||||
| +    const CompatInfo *compat2 = compat_by_pvr(pvr2);
 | ||||
| +
 | ||||
| +    g_assert(compat1);
 | ||||
| +    g_assert(compat2);
 | ||||
| +
 | ||||
| +    return compat1 - compat2;
 | ||||
| +}
 | ||||
| +
 | ||||
|  static bool pcc_compat(PowerPCCPUClass *pcc, uint32_t compat_pvr, | ||||
| -                       uint32_t min_compat_pvr, uint32_t max_compat_pvr)
 | ||||
| +                      uint32_t min_compat_pvr, uint32_t max_compat_pvr)
 | ||||
|  { | ||||
|      const CompatInfo *compat = compat_by_pvr(compat_pvr); | ||||
|      const CompatInfo *min = compat_by_pvr(min_compat_pvr); | ||||
| diff --git a/target/ppc/cpu.h b/target/ppc/cpu.h
 | ||||
| index e946da5f3a..23e8b76c85 100644
 | ||||
| --- a/target/ppc/cpu.h
 | ||||
| +++ b/target/ppc/cpu.h
 | ||||
| @@ -1401,6 +1401,7 @@ static inline int cpu_mmu_index(CPUPPCState *env, bool ifetch)
 | ||||
|   | ||||
|  /* Compatibility modes */ | ||||
|  #if defined(TARGET_PPC64) | ||||
| +long ppc_compat_cmp(uint32_t pvr1, uint32_t pvr2);
 | ||||
|  bool ppc_check_compat(PowerPCCPU *cpu, uint32_t compat_pvr, | ||||
|                        uint32_t min_compat_pvr, uint32_t max_compat_pvr); | ||||
|  bool ppc_type_check_compat(const char *cputype, uint32_t compat_pvr, | ||||
| diff --git a/target/ppc/kvm.c b/target/ppc/kvm.c
 | ||||
| index dc93b99189..154888cce5 100644
 | ||||
| --- a/target/ppc/kvm.c
 | ||||
| +++ b/target/ppc/kvm.c
 | ||||
| @@ -90,6 +90,7 @@ static int cap_ppc_nested_kvm_hv;
 | ||||
|  static int cap_large_decr; | ||||
|  static int cap_fwnmi; | ||||
|  static int cap_rpt_invalidate; | ||||
| +static int cap_ppc_secure_guest;
 | ||||
|   | ||||
|  static uint32_t debug_inst_opcode; | ||||
|   | ||||
| @@ -137,6 +138,7 @@ int kvm_arch_init(MachineState *ms, KVMState *s)
 | ||||
|      cap_resize_hpt = kvm_vm_check_extension(s, KVM_CAP_SPAPR_RESIZE_HPT); | ||||
|      kvmppc_get_cpu_characteristics(s); | ||||
|      cap_ppc_nested_kvm_hv = kvm_vm_check_extension(s, KVM_CAP_PPC_NESTED_HV); | ||||
| +    cap_ppc_secure_guest = kvm_vm_check_extension(s, KVM_CAP_PPC_SECURE_GUEST);
 | ||||
|      cap_large_decr = kvmppc_get_dec_bits(); | ||||
|      cap_fwnmi = kvm_vm_check_extension(s, KVM_CAP_PPC_FWNMI); | ||||
|      /* | ||||
| @@ -2563,6 +2565,16 @@ int kvmppc_has_cap_rpt_invalidate(void)
 | ||||
|      return cap_rpt_invalidate; | ||||
|  } | ||||
|   | ||||
| +bool kvmppc_has_cap_secure_guest(void)
 | ||||
| +{
 | ||||
| +    return !!cap_ppc_secure_guest;
 | ||||
| +}
 | ||||
| +
 | ||||
| +int kvmppc_enable_cap_secure_guest(void)
 | ||||
| +{
 | ||||
| +    return kvm_vm_enable_cap(kvm_state, KVM_CAP_PPC_SECURE_GUEST, 0, 1);
 | ||||
| +}
 | ||||
| +
 | ||||
|  PowerPCCPUClass *kvm_ppc_get_host_cpu_class(void) | ||||
|  { | ||||
|      uint32_t host_pvr = mfpvr(); | ||||
| @@ -2959,3 +2971,18 @@ bool kvm_arch_cpu_check_are_resettable(void)
 | ||||
|  { | ||||
|      return true; | ||||
|  } | ||||
| +
 | ||||
| +void kvmppc_svm_allow(Error **errp)
 | ||||
| +{
 | ||||
| +    if (!kvm_enabled()) {
 | ||||
| +        error_setg(errp, "No PEF support in tcg, try x-svm-allowed=off");
 | ||||
| +        return;
 | ||||
| +    }
 | ||||
| +
 | ||||
| +    if (!kvmppc_has_cap_secure_guest()) {
 | ||||
| +        error_setg(errp, "KVM implementation does not support secure guests, "
 | ||||
| +                   "try x-svm-allowed=off");
 | ||||
| +    } else if (kvmppc_enable_cap_secure_guest() < 0) {
 | ||||
| +        error_setg(errp, "Error enabling x-svm-allowed, try x-svm-allowed=off");
 | ||||
| +    }
 | ||||
| +}
 | ||||
| diff --git a/target/ppc/kvm_ppc.h b/target/ppc/kvm_ppc.h
 | ||||
| index ee9325bf9a..20dbb95989 100644
 | ||||
| --- a/target/ppc/kvm_ppc.h
 | ||||
| +++ b/target/ppc/kvm_ppc.h
 | ||||
| @@ -40,6 +40,7 @@ int kvmppc_booke_watchdog_enable(PowerPCCPU *cpu);
 | ||||
|  target_ulong kvmppc_configure_v3_mmu(PowerPCCPU *cpu, | ||||
|                                       bool radix, bool gtse, | ||||
|                                       uint64_t proc_tbl); | ||||
| +void kvmppc_svm_allow(Error **errp);
 | ||||
|  #ifndef CONFIG_USER_ONLY | ||||
|  bool kvmppc_spapr_use_multitce(void); | ||||
|  int kvmppc_spapr_enable_inkernel_multitce(void); | ||||
| @@ -74,6 +75,8 @@ int kvmppc_get_cap_large_decr(void);
 | ||||
|  int kvmppc_enable_cap_large_decr(PowerPCCPU *cpu, int enable); | ||||
|  int kvmppc_has_cap_rpt_invalidate(void); | ||||
|  int kvmppc_enable_hwrng(void); | ||||
| +bool kvmppc_has_cap_secure_guest(void);
 | ||||
| +int kvmppc_enable_cap_secure_guest(void);
 | ||||
|  int kvmppc_put_books_sregs(PowerPCCPU *cpu); | ||||
|  PowerPCCPUClass *kvm_ppc_get_host_cpu_class(void); | ||||
|  void kvmppc_check_papr_resize_hpt(Error **errp); | ||||
| @@ -393,6 +396,16 @@ static inline int kvmppc_has_cap_rpt_invalidate(void)
 | ||||
|      return false; | ||||
|  } | ||||
|   | ||||
| +static inline bool kvmppc_has_cap_secure_guest(void)
 | ||||
| +{
 | ||||
| +    return false;
 | ||||
| +}
 | ||||
| +
 | ||||
| +static inline int kvmppc_enable_cap_secure_guest(void)
 | ||||
| +{
 | ||||
| +    return -1;
 | ||||
| +}
 | ||||
| +
 | ||||
|  static inline int kvmppc_enable_hwrng(void) | ||||
|  { | ||||
|      return -1; | ||||
| -- 
 | ||||
| 2.27.0 | ||||
| 
 | ||||
							
								
								
									
										114
									
								
								SOURCES/0010-Add-s390x-machine-types.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										114
									
								
								SOURCES/0010-Add-s390x-machine-types.patch
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,114 @@ | ||||
| From ea22b5ae0a89ef53f31f67bb6845fd6c45d4f412 Mon Sep 17 00:00:00 2001 | ||||
| From: Miroslav Rezanina <mrezanin@redhat.com> | ||||
| Date: Fri, 19 Oct 2018 13:47:32 +0200 | ||||
| Subject: Add s390x machine types | ||||
| 
 | ||||
| Adding changes to add RHEL machine types for s390x architecture. | ||||
| 
 | ||||
| Signed-off-by: Miroslav Rezanina <mrezanin@redhat.com> | ||||
| --
 | ||||
| Merged patches (6.1.0): | ||||
| - 64a9a5c971 hw/s390x: Remove the RHEL7-only machine type
 | ||||
| - 395516d62b redhat: s390x: add rhel-8.5.0 compat machine
 | ||||
| 
 | ||||
| Merged patches (6.2.0 RC0): | ||||
| - 3bf66f4520 redhat: Add s390x machine type compatibility update for 6.1 rebase
 | ||||
| ---
 | ||||
|  hw/s390x/s390-virtio-ccw.c | 67 +++++++++++++++++++++++++++++++++++++- | ||||
|  1 file changed, 66 insertions(+), 1 deletion(-) | ||||
| 
 | ||||
| diff --git a/hw/s390x/s390-virtio-ccw.c b/hw/s390x/s390-virtio-ccw.c
 | ||||
| index 653587ea62..4af14cb9ca 100644
 | ||||
| --- a/hw/s390x/s390-virtio-ccw.c
 | ||||
| +++ b/hw/s390x/s390-virtio-ccw.c
 | ||||
| @@ -767,7 +767,7 @@ bool css_migration_enabled(void)
 | ||||
|      {                                                                         \ | ||||
|          MachineClass *mc = MACHINE_CLASS(oc);                                 \ | ||||
|          ccw_machine_##suffix##_class_options(mc);                             \ | ||||
| -        mc->desc = "VirtIO-ccw based S390 machine v" verstr;                  \
 | ||||
| +        mc->desc = "VirtIO-ccw based S390 machine " verstr;                   \
 | ||||
|          if (latest) {                                                         \ | ||||
|              mc->alias = "s390-ccw-virtio";                                    \ | ||||
|              mc->is_default = true;                                            \ | ||||
| @@ -791,6 +791,7 @@ bool css_migration_enabled(void)
 | ||||
|      }                                                                         \ | ||||
|      type_init(ccw_machine_register_##suffix) | ||||
|   | ||||
| +#if 0 /* Disabled for Red Hat Enterprise Linux */
 | ||||
|  static void ccw_machine_6_2_instance_options(MachineState *machine) | ||||
|  { | ||||
|  } | ||||
| @@ -1100,6 +1101,70 @@ static void ccw_machine_2_4_class_options(MachineClass *mc)
 | ||||
|      compat_props_add(mc->compat_props, compat, G_N_ELEMENTS(compat)); | ||||
|  } | ||||
|  DEFINE_CCW_MACHINE(2_4, "2.4", false); | ||||
| +#endif
 | ||||
| +
 | ||||
| +static void ccw_machine_rhel850_instance_options(MachineState *machine)
 | ||||
| +{
 | ||||
| +}
 | ||||
| +
 | ||||
| +static void ccw_machine_rhel850_class_options(MachineClass *mc)
 | ||||
| +{
 | ||||
| +    compat_props_add(mc->compat_props, hw_compat_rhel_8_5, hw_compat_rhel_8_5_len);
 | ||||
| +}
 | ||||
| +DEFINE_CCW_MACHINE(rhel850, "rhel8.5.0", true);
 | ||||
| +
 | ||||
| +static void ccw_machine_rhel840_instance_options(MachineState *machine)
 | ||||
| +{
 | ||||
| +    ccw_machine_rhel850_instance_options(machine);
 | ||||
| +}
 | ||||
| +
 | ||||
| +static void ccw_machine_rhel840_class_options(MachineClass *mc)
 | ||||
| +{
 | ||||
| +    ccw_machine_rhel850_class_options(mc);
 | ||||
| +    compat_props_add(mc->compat_props, hw_compat_rhel_8_4, hw_compat_rhel_8_4_len);
 | ||||
| +}
 | ||||
| +DEFINE_CCW_MACHINE(rhel840, "rhel8.4.0", false);
 | ||||
| +
 | ||||
| +static void ccw_machine_rhel820_instance_options(MachineState *machine)
 | ||||
| +{
 | ||||
| +    ccw_machine_rhel840_instance_options(machine);
 | ||||
| +}
 | ||||
| +
 | ||||
| +static void ccw_machine_rhel820_class_options(MachineClass *mc)
 | ||||
| +{
 | ||||
| +    ccw_machine_rhel840_class_options(mc);
 | ||||
| +    mc->fixup_ram_size = s390_fixup_ram_size;
 | ||||
| +    /* we did not publish a rhel8.3.0 machine */
 | ||||
| +    compat_props_add(mc->compat_props, hw_compat_rhel_8_3, hw_compat_rhel_8_3_len);
 | ||||
| +    compat_props_add(mc->compat_props, hw_compat_rhel_8_2, hw_compat_rhel_8_2_len);
 | ||||
| +}
 | ||||
| +DEFINE_CCW_MACHINE(rhel820, "rhel8.2.0", false);
 | ||||
| +
 | ||||
| +static void ccw_machine_rhel760_instance_options(MachineState *machine)
 | ||||
| +{
 | ||||
| +    static const S390FeatInit qemu_cpu_feat = { S390_FEAT_LIST_QEMU_V3_1 };
 | ||||
| +
 | ||||
| +    ccw_machine_rhel820_instance_options(machine);
 | ||||
| +
 | ||||
| +    s390_set_qemu_cpu_model(0x2827, 12, 2, qemu_cpu_feat);
 | ||||
| +
 | ||||
| +    /* The multiple-epoch facility was not available with rhel7.6.0 on z14GA1 */
 | ||||
| +    s390_cpudef_featoff(14, 1, S390_FEAT_MULTIPLE_EPOCH);
 | ||||
| +    s390_cpudef_featoff(14, 1, S390_FEAT_PTFF_QSIE);
 | ||||
| +    s390_cpudef_featoff(14, 1, S390_FEAT_PTFF_QTOUE);
 | ||||
| +    s390_cpudef_featoff(14, 1, S390_FEAT_PTFF_STOE);
 | ||||
| +    s390_cpudef_featoff(14, 1, S390_FEAT_PTFF_STOUE);
 | ||||
| +}
 | ||||
| +
 | ||||
| +static void ccw_machine_rhel760_class_options(MachineClass *mc)
 | ||||
| +{
 | ||||
| +    ccw_machine_rhel820_class_options(mc);
 | ||||
| +    /* We never published the s390x version of RHEL-AV 8.0 and 8.1, so add this here */
 | ||||
| +    compat_props_add(mc->compat_props, hw_compat_rhel_8_1, hw_compat_rhel_8_1_len);
 | ||||
| +    compat_props_add(mc->compat_props, hw_compat_rhel_8_0, hw_compat_rhel_8_0_len);
 | ||||
| +    compat_props_add(mc->compat_props, hw_compat_rhel_7_6, hw_compat_rhel_7_6_len);
 | ||||
| +}
 | ||||
| +DEFINE_CCW_MACHINE(rhel760, "rhel7.6.0", false);
 | ||||
|   | ||||
|  static void ccw_machine_register_types(void) | ||||
|  { | ||||
| -- 
 | ||||
| 2.27.0 | ||||
| 
 | ||||
							
								
								
									
										572
									
								
								SOURCES/0011-Add-x86_64-machine-types.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										572
									
								
								SOURCES/0011-Add-x86_64-machine-types.patch
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,572 @@ | ||||
| From afe0cbc5cdb98998b37cf48e9a1c87a110d9fbb3 Mon Sep 17 00:00:00 2001 | ||||
| From: Miroslav Rezanina <mrezanin@redhat.com> | ||||
| Date: Fri, 19 Oct 2018 13:10:31 +0200 | ||||
| Subject: Add x86_64 machine types | ||||
| 
 | ||||
| Adding changes to add RHEL machine types for x86_64 architecture. | ||||
| 
 | ||||
| Signed-off-by: Miroslav Rezanina <mrezanin@redhat.com> | ||||
| 
 | ||||
| Rebase notes (6.1.0): | ||||
| - Update qemu64 cpu spec
 | ||||
| 
 | ||||
| Merged patches (6.1.0): | ||||
| - 59c284ad3b x86: Add x86 rhel8.5 machine types
 | ||||
| - a8868b42fe redhat: x86: Enable 'kvm-asyncpf-int' by default
 | ||||
| - a3995e2eff Remove RHEL 7.0.0 machine type (only x86_64 changes)
 | ||||
| - ad3190a79b Remove RHEL 7.1.0 machine type (only x86_64 changes)
 | ||||
| - 84bbe15d4e Remove RHEL 7.2.0 machine type (only x86_64 changes)
 | ||||
| - 0215eb3356 Remove RHEL 7.3.0 machine types (only x86_64 changes)
 | ||||
| - af69d1ca6e Remove RHEL 7.4.0 machine types (only x86_64 changes)
 | ||||
| - 8f7a74ab78 Remove RHEL 7.5.0 machine types (only x86_64 changes)
 | ||||
| ---
 | ||||
|  hw/i386/pc.c               | 114 +++++++++++++++++++++++- | ||||
|  hw/i386/pc_piix.c          |  68 +++++++++++++- | ||||
|  hw/i386/pc_q35.c           | 177 ++++++++++++++++++++++++++++++++++++- | ||||
|  include/hw/boards.h        |   2 + | ||||
|  include/hw/i386/pc.h       |  21 +++++ | ||||
|  target/i386/kvm/kvm-cpu.c  |   1 + | ||||
|  target/i386/kvm/kvm.c      |   4 + | ||||
|  tests/qtest/pvpanic-test.c |   5 +- | ||||
|  8 files changed, 385 insertions(+), 7 deletions(-) | ||||
| 
 | ||||
| diff --git a/hw/i386/pc.c b/hw/i386/pc.c
 | ||||
| index a2ef40ecbc..b6d2db8d04 100644
 | ||||
| --- a/hw/i386/pc.c
 | ||||
| +++ b/hw/i386/pc.c
 | ||||
| @@ -371,6 +371,116 @@ GlobalProperty pc_compat_1_4[] = {
 | ||||
|  }; | ||||
|  const size_t pc_compat_1_4_len = G_N_ELEMENTS(pc_compat_1_4); | ||||
|   | ||||
| +/* This macro is for changes to properties that are RHEL specific,
 | ||||
| + * different to the current upstream and to be applied to the latest
 | ||||
| + * machine type.
 | ||||
| + */
 | ||||
| +GlobalProperty pc_rhel_compat[] = {
 | ||||
| +    { TYPE_X86_CPU, "host-phys-bits", "on" },
 | ||||
| +    { TYPE_X86_CPU, "host-phys-bits-limit", "48" },
 | ||||
| +    { TYPE_X86_CPU, "vmx-entry-load-perf-global-ctrl", "off" },
 | ||||
| +    { TYPE_X86_CPU, "vmx-exit-load-perf-global-ctrl", "off" },
 | ||||
| +    /* bz 1508330 */ 
 | ||||
| +    { "vfio-pci", "x-no-geforce-quirks", "on" },
 | ||||
| +    /* bz 1941397 */
 | ||||
| +    { TYPE_X86_CPU, "kvm-asyncpf-int", "on" },
 | ||||
| +};
 | ||||
| +const size_t pc_rhel_compat_len = G_N_ELEMENTS(pc_rhel_compat);
 | ||||
| +
 | ||||
| +GlobalProperty pc_rhel_8_4_compat[] = {
 | ||||
| +    /* pc_rhel_8_4_compat from pc_compat_5_2 */
 | ||||
| +    { "ICH9-LPC", "x-smi-cpu-hotunplug", "off" },
 | ||||
| +    { TYPE_X86_CPU, "kvm-asyncpf-int", "off" },
 | ||||
| +};
 | ||||
| +const size_t pc_rhel_8_4_compat_len = G_N_ELEMENTS(pc_rhel_8_4_compat);
 | ||||
| +
 | ||||
| +GlobalProperty pc_rhel_8_3_compat[] = {
 | ||||
| +    /* pc_rhel_8_3_compat from pc_compat_5_1 */
 | ||||
| +    { "ICH9-LPC", "x-smi-cpu-hotplug", "off" },
 | ||||
| +};
 | ||||
| +const size_t pc_rhel_8_3_compat_len = G_N_ELEMENTS(pc_rhel_8_3_compat);
 | ||||
| +
 | ||||
| +GlobalProperty pc_rhel_8_2_compat[] = {
 | ||||
| +    /* pc_rhel_8_2_compat from pc_compat_4_2 */
 | ||||
| +    { "mch", "smbase-smram", "off" },
 | ||||
| +};
 | ||||
| +const size_t pc_rhel_8_2_compat_len = G_N_ELEMENTS(pc_rhel_8_2_compat);
 | ||||
| +
 | ||||
| +/* pc_rhel_8_1_compat is empty since pc_4_1_compat is */
 | ||||
| +GlobalProperty pc_rhel_8_1_compat[] = { };
 | ||||
| +const size_t pc_rhel_8_1_compat_len = G_N_ELEMENTS(pc_rhel_8_1_compat);
 | ||||
| +
 | ||||
| +GlobalProperty pc_rhel_8_0_compat[] = {
 | ||||
| +    /* pc_rhel_8_0_compat from pc_compat_3_1 */
 | ||||
| +    { "intel-iommu", "dma-drain", "off" },
 | ||||
| +    /* pc_rhel_8_0_compat from pc_compat_3_1 */
 | ||||
| +    { "Opteron_G3" "-" TYPE_X86_CPU, "rdtscp", "off" },
 | ||||
| +    /* pc_rhel_8_0_compat from pc_compat_3_1 */
 | ||||
| +    { "Opteron_G4" "-" TYPE_X86_CPU, "rdtscp", "off" },
 | ||||
| +    /* pc_rhel_8_0_compat from pc_compat_3_1 */
 | ||||
| +    { "Opteron_G4" "-" TYPE_X86_CPU, "npt", "off" },
 | ||||
| +    /* pc_rhel_8_0_compat from pc_compat_3_1 */
 | ||||
| +    { "Opteron_G4" "-" TYPE_X86_CPU, "nrip-save", "off" },
 | ||||
| +    /* pc_rhel_8_0_compat from pc_compat_3_1 */
 | ||||
| +    { "Opteron_G5" "-" TYPE_X86_CPU, "rdtscp", "off" },
 | ||||
| +    /* pc_rhel_8_0_compat from pc_compat_3_1 */
 | ||||
| +    { "Opteron_G5" "-" TYPE_X86_CPU, "npt", "off" },
 | ||||
| +    /* pc_rhel_8_0_compat from pc_compat_3_1 */
 | ||||
| +    { "Opteron_G5" "-" TYPE_X86_CPU, "nrip-save", "off" },
 | ||||
| +    /* pc_rhel_8_0_compat from pc_compat_3_1 */
 | ||||
| +    { "EPYC" "-" TYPE_X86_CPU, "npt", "off" },
 | ||||
| +    /* pc_rhel_8_0_compat from pc_compat_3_1 */
 | ||||
| +    { "EPYC" "-" TYPE_X86_CPU, "nrip-save", "off" },
 | ||||
| +    /* pc_rhel_8_0_compat from pc_compat_3_1 */
 | ||||
| +    { "EPYC-IBPB" "-" TYPE_X86_CPU, "npt", "off" },
 | ||||
| +    /* pc_rhel_8_0_compat from pc_compat_3_1 */
 | ||||
| +    { "EPYC-IBPB" "-" TYPE_X86_CPU, "nrip-save", "off" },
 | ||||
| +    /** The mpx=on entries from pc_compat_3_1 are in pc_rhel_7_6_compat **/
 | ||||
| +    /* pc_rhel_8_0_compat from pc_compat_3_1 */
 | ||||
| +    { "Cascadelake-Server" "-" TYPE_X86_CPU, "stepping", "5" },
 | ||||
| +    /* pc_rhel_8_0_compat from pc_compat_3_1 */
 | ||||
| +    { TYPE_X86_CPU, "x-intel-pt-auto-level", "off" },
 | ||||
| +};
 | ||||
| +const size_t pc_rhel_8_0_compat_len = G_N_ELEMENTS(pc_rhel_8_0_compat);
 | ||||
| +
 | ||||
| +/* Similar to PC_COMPAT_3_0 + PC_COMPAT_2_12, but:
 | ||||
| + * all of the 2_12 stuff was already in 7.6 from bz 1481253
 | ||||
| + * x-migrate-smi-count comes from PC_COMPAT_2_11 but
 | ||||
| + * is really tied to kernel version so keep it off on 7.x
 | ||||
| + * machine types irrespective of host.
 | ||||
| + */
 | ||||
| +GlobalProperty pc_rhel_7_6_compat[] = {
 | ||||
| +    /* pc_rhel_7_6_compat from pc_compat_3_0 */ 
 | ||||
| +    { TYPE_X86_CPU, "x-hv-synic-kvm-only", "on" },
 | ||||
| +    /* pc_rhel_7_6_compat from pc_compat_3_0 */ 
 | ||||
| +    { "Skylake-Server" "-" TYPE_X86_CPU, "pku", "off" },
 | ||||
| +    /* pc_rhel_7_6_compat from pc_compat_3_0 */ 
 | ||||
| +    { "Skylake-Server-IBRS" "-" TYPE_X86_CPU, "pku", "off" },
 | ||||
| +    /* pc_rhel_7_6_compat from pc_compat_2_11 */ 
 | ||||
| +    { TYPE_X86_CPU, "x-migrate-smi-count", "off" },
 | ||||
| +    /* pc_rhel_7_6_compat from pc_compat_2_11 */ 
 | ||||
| +    { "Skylake-Client" "-" TYPE_X86_CPU, "mpx", "on" },
 | ||||
| +    /* pc_rhel_7_6_compat from pc_compat_2_11 */ 
 | ||||
| +    { "Skylake-Client-IBRS" "-" TYPE_X86_CPU, "mpx", "on" },
 | ||||
| +    /* pc_rhel_7_6_compat from pc_compat_2_11 */ 
 | ||||
| +    { "Skylake-Server" "-" TYPE_X86_CPU, "mpx", "on" },
 | ||||
| +    /* pc_rhel_7_6_compat from pc_compat_2_11 */ 
 | ||||
| +    { "Skylake-Server-IBRS" "-" TYPE_X86_CPU, "mpx", "on" },
 | ||||
| +    /* pc_rhel_7_6_compat from pc_compat_2_11 */ 
 | ||||
| +    { "Cascadelake-Server" "-" TYPE_X86_CPU, "mpx", "on" },
 | ||||
| +    /* pc_rhel_7_6_compat from pc_compat_2_11 */ 
 | ||||
| +    { "Icelake-Client" "-" TYPE_X86_CPU, "mpx", "on" },
 | ||||
| +    /* pc_rhel_7_6_compat from pc_compat_2_11 */ 
 | ||||
| +    { "Icelake-Server" "-" TYPE_X86_CPU, "mpx", "on" },
 | ||||
| +};
 | ||||
| +const size_t pc_rhel_7_6_compat_len = G_N_ELEMENTS(pc_rhel_7_6_compat);
 | ||||
| +
 | ||||
| +/*
 | ||||
| + * The PC_RHEL_*_COMPAT serve the same purpose for RHEL-7 machine
 | ||||
| + * types as the PC_COMPAT_* do for upstream types.
 | ||||
| + * PC_RHEL_7_*_COMPAT apply both to i440fx and q35 types.
 | ||||
| + */
 | ||||
| +
 | ||||
|  GSIState *pc_gsi_create(qemu_irq **irqs, bool pci_enabled) | ||||
|  { | ||||
|      GSIState *s; | ||||
| @@ -1694,6 +1804,7 @@ static void pc_machine_class_init(ObjectClass *oc, void *data)
 | ||||
|      pcmc->pvh_enabled = true; | ||||
|      pcmc->kvmclock_create_always = true; | ||||
|      assert(!mc->get_hotplug_handler); | ||||
| +    mc->async_pf_vmexit_disable = false;
 | ||||
|      mc->get_hotplug_handler = pc_get_hotplug_handler; | ||||
|      mc->hotplug_allowed = pc_hotplug_allowed; | ||||
|      mc->cpu_index_to_instance_props = x86_cpu_index_to_props; | ||||
| @@ -1704,7 +1815,8 @@ static void pc_machine_class_init(ObjectClass *oc, void *data)
 | ||||
|      mc->has_hotpluggable_cpus = true; | ||||
|      mc->default_boot_order = "cad"; | ||||
|      mc->block_default_type = IF_IDE; | ||||
| -    mc->max_cpus = 255;
 | ||||
| +    /* 240: max CPU count for RHEL */
 | ||||
| +    mc->max_cpus = 240;
 | ||||
|      mc->reset = pc_machine_reset; | ||||
|      mc->wakeup = pc_machine_wakeup; | ||||
|      hc->pre_plug = pc_machine_device_pre_plug_cb; | ||||
| diff --git a/hw/i386/pc_piix.c b/hw/i386/pc_piix.c
 | ||||
| index dda3f64f19..dabc6c1933 100644
 | ||||
| --- a/hw/i386/pc_piix.c
 | ||||
| +++ b/hw/i386/pc_piix.c
 | ||||
| @@ -50,6 +50,7 @@
 | ||||
|  #include "qapi/error.h" | ||||
|  #include "qemu/error-report.h" | ||||
|  #include "sysemu/xen.h" | ||||
| +#include "migration/migration.h"
 | ||||
|  #ifdef CONFIG_XEN | ||||
|  #include <xen/hvm/hvm_info_table.h> | ||||
|  #include "hw/xen/xen_pt.h" | ||||
| @@ -174,8 +175,8 @@ static void pc_init1(MachineState *machine,
 | ||||
|      if (pcmc->smbios_defaults) { | ||||
|          MachineClass *mc = MACHINE_GET_CLASS(machine); | ||||
|          /* These values are guest ABI, do not change */ | ||||
| -        smbios_set_defaults("QEMU", "Standard PC (i440FX + PIIX, 1996)",
 | ||||
| -                            mc->name, pcmc->smbios_legacy_mode,
 | ||||
| +        smbios_set_defaults("Red Hat", "KVM",
 | ||||
| +                            mc->desc, pcmc->smbios_legacy_mode,
 | ||||
|                              pcmc->smbios_uuid_encoded, | ||||
|                              pcmc->smbios_stream_product, | ||||
|                              pcmc->smbios_stream_version, | ||||
| @@ -314,6 +315,7 @@ static void pc_init1(MachineState *machine,
 | ||||
|   * hw_compat_*, pc_compat_*, or * pc_*_machine_options(). | ||||
|   */ | ||||
|   | ||||
| +#if 0 /* Disabled for Red Hat Enterprise Linux */
 | ||||
|  static void pc_compat_2_3_fn(MachineState *machine) | ||||
|  { | ||||
|      X86MachineState *x86ms = X86_MACHINE(machine); | ||||
| @@ -951,3 +953,65 @@ static void xenfv_3_1_machine_options(MachineClass *m)
 | ||||
|  DEFINE_PC_MACHINE(xenfv, "xenfv-3.1", pc_xen_hvm_init, | ||||
|                    xenfv_3_1_machine_options); | ||||
|  #endif | ||||
| +#endif  /* Disabled for Red Hat Enterprise Linux */
 | ||||
| +
 | ||||
| +/* Red Hat Enterprise Linux machine types */
 | ||||
| +
 | ||||
| +/* Options for the latest rhel7 machine type */
 | ||||
| +static void pc_machine_rhel7_options(MachineClass *m)
 | ||||
| +{
 | ||||
| +    PCMachineClass *pcmc = PC_MACHINE_CLASS(m);
 | ||||
| +    m->family = "pc_piix_Y";
 | ||||
| +    m->default_machine_opts = "firmware=bios-256k.bin,hpet=off";
 | ||||
| +    pcmc->default_nic_model = "e1000";
 | ||||
| +    pcmc->pci_root_uid = 0;
 | ||||
| +    m->default_display = "std";
 | ||||
| +    m->no_parallel = 1;
 | ||||
| +    m->numa_mem_supported = true;
 | ||||
| +    m->auto_enable_numa_with_memdev = false;
 | ||||
| +    machine_class_allow_dynamic_sysbus_dev(m, TYPE_RAMFB_DEVICE);
 | ||||
| +    compat_props_add(m->compat_props, pc_rhel_compat, pc_rhel_compat_len);
 | ||||
| +    m->alias = "pc";
 | ||||
| +    m->is_default = 1;
 | ||||
| +}
 | ||||
| +
 | ||||
| +static void pc_init_rhel760(MachineState *machine)
 | ||||
| +{
 | ||||
| +    pc_init1(machine, TYPE_I440FX_PCI_HOST_BRIDGE, \
 | ||||
| +             TYPE_I440FX_PCI_DEVICE);
 | ||||
| +}
 | ||||
| +
 | ||||
| +static void pc_machine_rhel760_options(MachineClass *m)
 | ||||
| +{
 | ||||
| +    PCMachineClass *pcmc = PC_MACHINE_CLASS(m);
 | ||||
| +    pc_machine_rhel7_options(m);
 | ||||
| +    m->desc = "RHEL 7.6.0 PC (i440FX + PIIX, 1996)";
 | ||||
| +    m->async_pf_vmexit_disable = true;
 | ||||
| +    m->smbus_no_migration_support = true;
 | ||||
| +    pcmc->pvh_enabled = false;
 | ||||
| +    pcmc->default_cpu_version = CPU_VERSION_LEGACY;
 | ||||
| +    pcmc->kvmclock_create_always = false;
 | ||||
| +    /* From pc_i440fx_5_1_machine_options() */
 | ||||
| +    pcmc->pci_root_uid = 1;
 | ||||
| +    compat_props_add(m->compat_props, hw_compat_rhel_8_4,
 | ||||
| +                     hw_compat_rhel_8_4_len);
 | ||||
| +    compat_props_add(m->compat_props, pc_rhel_8_4_compat,
 | ||||
| +                     pc_rhel_8_4_compat_len);
 | ||||
| +    compat_props_add(m->compat_props, hw_compat_rhel_8_3,
 | ||||
| +                     hw_compat_rhel_8_3_len);
 | ||||
| +    compat_props_add(m->compat_props, pc_rhel_8_3_compat,
 | ||||
| +                     pc_rhel_8_3_compat_len);
 | ||||
| +    compat_props_add(m->compat_props, hw_compat_rhel_8_2,
 | ||||
| +                     hw_compat_rhel_8_2_len);
 | ||||
| +    compat_props_add(m->compat_props, pc_rhel_8_2_compat,
 | ||||
| +                     pc_rhel_8_2_compat_len);
 | ||||
| +    compat_props_add(m->compat_props, hw_compat_rhel_8_1, hw_compat_rhel_8_1_len);
 | ||||
| +    compat_props_add(m->compat_props, pc_rhel_8_1_compat, pc_rhel_8_1_compat_len);
 | ||||
| +    compat_props_add(m->compat_props, hw_compat_rhel_8_0, hw_compat_rhel_8_0_len);
 | ||||
| +    compat_props_add(m->compat_props, pc_rhel_8_0_compat, pc_rhel_8_0_compat_len);
 | ||||
| +    compat_props_add(m->compat_props, hw_compat_rhel_7_6, hw_compat_rhel_7_6_len);
 | ||||
| +    compat_props_add(m->compat_props, pc_rhel_7_6_compat, pc_rhel_7_6_compat_len);
 | ||||
| +}
 | ||||
| +
 | ||||
| +DEFINE_PC_MACHINE(rhel760, "pc-i440fx-rhel7.6.0", pc_init_rhel760,
 | ||||
| +                  pc_machine_rhel760_options);
 | ||||
| diff --git a/hw/i386/pc_q35.c b/hw/i386/pc_q35.c
 | ||||
| index 235054a643..04c911da18 100644
 | ||||
| --- a/hw/i386/pc_q35.c
 | ||||
| +++ b/hw/i386/pc_q35.c
 | ||||
| @@ -197,8 +197,8 @@ static void pc_q35_init(MachineState *machine)
 | ||||
|   | ||||
|      if (pcmc->smbios_defaults) { | ||||
|          /* These values are guest ABI, do not change */ | ||||
| -        smbios_set_defaults("QEMU", "Standard PC (Q35 + ICH9, 2009)",
 | ||||
| -                            mc->name, pcmc->smbios_legacy_mode,
 | ||||
| +        smbios_set_defaults("Red Hat", "KVM",
 | ||||
| +                            mc->desc, pcmc->smbios_legacy_mode,
 | ||||
|                              pcmc->smbios_uuid_encoded, | ||||
|                              pcmc->smbios_stream_product, | ||||
|                              pcmc->smbios_stream_version, | ||||
| @@ -342,6 +342,7 @@ static void pc_q35_init(MachineState *machine)
 | ||||
|      DEFINE_PC_MACHINE(suffix, name, pc_init_##suffix, optionfn) | ||||
|   | ||||
|   | ||||
| +#if 0 /* Disabled for Red Hat Enterprise Linux */
 | ||||
|  static void pc_q35_machine_options(MachineClass *m) | ||||
|  { | ||||
|      PCMachineClass *pcmc = PC_MACHINE_CLASS(m); | ||||
| @@ -620,3 +621,175 @@ static void pc_q35_2_4_machine_options(MachineClass *m)
 | ||||
|   | ||||
|  DEFINE_Q35_MACHINE(v2_4, "pc-q35-2.4", NULL, | ||||
|                     pc_q35_2_4_machine_options); | ||||
| +#endif  /* Disabled for Red Hat Enterprise Linux */
 | ||||
| +
 | ||||
| +/* Red Hat Enterprise Linux machine types */
 | ||||
| +
 | ||||
| +/* Options for the latest rhel q35 machine type */
 | ||||
| +static void pc_q35_machine_rhel_options(MachineClass *m)
 | ||||
| +{
 | ||||
| +    PCMachineClass *pcmc = PC_MACHINE_CLASS(m);
 | ||||
| +    pcmc->default_nic_model = "e1000e";
 | ||||
| +    pcmc->pci_root_uid = 0;
 | ||||
| +    m->family = "pc_q35_Z";
 | ||||
| +    m->units_per_default_bus = 1;
 | ||||
| +    m->default_machine_opts = "firmware=bios-256k.bin,hpet=off";
 | ||||
| +    m->default_display = "std";
 | ||||
| +    m->no_floppy = 1;
 | ||||
| +    m->no_parallel = 1;
 | ||||
| +    pcmc->default_cpu_version = 1;
 | ||||
| +    machine_class_allow_dynamic_sysbus_dev(m, TYPE_AMD_IOMMU_DEVICE);
 | ||||
| +    machine_class_allow_dynamic_sysbus_dev(m, TYPE_INTEL_IOMMU_DEVICE);
 | ||||
| +    machine_class_allow_dynamic_sysbus_dev(m, TYPE_RAMFB_DEVICE);
 | ||||
| +    m->alias = "q35";
 | ||||
| +    m->max_cpus = 710;
 | ||||
| +    compat_props_add(m->compat_props, pc_rhel_compat, pc_rhel_compat_len);
 | ||||
| +}
 | ||||
| +
 | ||||
| +static void pc_q35_init_rhel850(MachineState *machine)
 | ||||
| +{
 | ||||
| +    pc_q35_init(machine);
 | ||||
| +}
 | ||||
| +
 | ||||
| +static void pc_q35_machine_rhel850_options(MachineClass *m)
 | ||||
| +{
 | ||||
| +    PCMachineClass *pcmc = PC_MACHINE_CLASS(m);
 | ||||
| +    pc_q35_machine_rhel_options(m);
 | ||||
| +    m->desc = "RHEL-8.5.0 PC (Q35 + ICH9, 2009)";
 | ||||
| +    pcmc->smbios_stream_product = "RHEL-AV";
 | ||||
| +    pcmc->smbios_stream_version = "8.5.0";
 | ||||
| +}
 | ||||
| +
 | ||||
| +DEFINE_PC_MACHINE(q35_rhel850, "pc-q35-rhel8.5.0", pc_q35_init_rhel850,
 | ||||
| +                  pc_q35_machine_rhel850_options);
 | ||||
| +
 | ||||
| +
 | ||||
| +static void pc_q35_init_rhel840(MachineState *machine)
 | ||||
| +{
 | ||||
| +    pc_q35_init(machine);
 | ||||
| +}
 | ||||
| +
 | ||||
| +static void pc_q35_machine_rhel840_options(MachineClass *m)
 | ||||
| +{
 | ||||
| +    PCMachineClass *pcmc = PC_MACHINE_CLASS(m);
 | ||||
| +    pc_q35_machine_rhel850_options(m);
 | ||||
| +    m->desc = "RHEL-8.4.0 PC (Q35 + ICH9, 2009)";
 | ||||
| +    m->alias = NULL;
 | ||||
| +    pcmc->smbios_stream_product = "RHEL-AV";
 | ||||
| +    pcmc->smbios_stream_version = "8.4.0";
 | ||||
| +    compat_props_add(m->compat_props, hw_compat_rhel_8_4,
 | ||||
| +                     hw_compat_rhel_8_4_len);
 | ||||
| +    compat_props_add(m->compat_props, pc_rhel_8_4_compat,
 | ||||
| +                     pc_rhel_8_4_compat_len);
 | ||||
| +}
 | ||||
| +
 | ||||
| +DEFINE_PC_MACHINE(q35_rhel840, "pc-q35-rhel8.4.0", pc_q35_init_rhel840,
 | ||||
| +                  pc_q35_machine_rhel840_options);
 | ||||
| +
 | ||||
| +
 | ||||
| +static void pc_q35_init_rhel830(MachineState *machine)
 | ||||
| +{
 | ||||
| +    pc_q35_init(machine);
 | ||||
| +}
 | ||||
| +
 | ||||
| +static void pc_q35_machine_rhel830_options(MachineClass *m)
 | ||||
| +{
 | ||||
| +    PCMachineClass *pcmc = PC_MACHINE_CLASS(m);
 | ||||
| +    pc_q35_machine_rhel840_options(m);
 | ||||
| +    m->desc = "RHEL-8.3.0 PC (Q35 + ICH9, 2009)";
 | ||||
| +    pcmc->smbios_stream_product = "RHEL-AV";
 | ||||
| +    pcmc->smbios_stream_version = "8.3.0";
 | ||||
| +    compat_props_add(m->compat_props, hw_compat_rhel_8_3,
 | ||||
| +                     hw_compat_rhel_8_3_len);
 | ||||
| +    compat_props_add(m->compat_props, pc_rhel_8_3_compat,
 | ||||
| +                     pc_rhel_8_3_compat_len);
 | ||||
| +    /* From pc_q35_5_1_machine_options() */
 | ||||
| +    pcmc->kvmclock_create_always = false;
 | ||||
| +    /* From pc_q35_5_1_machine_options() */
 | ||||
| +    pcmc->pci_root_uid = 1;
 | ||||
| +}
 | ||||
| +
 | ||||
| +DEFINE_PC_MACHINE(q35_rhel830, "pc-q35-rhel8.3.0", pc_q35_init_rhel830,
 | ||||
| +                  pc_q35_machine_rhel830_options);
 | ||||
| +
 | ||||
| +static void pc_q35_init_rhel820(MachineState *machine)
 | ||||
| +{
 | ||||
| +    pc_q35_init(machine);
 | ||||
| +}
 | ||||
| +
 | ||||
| +static void pc_q35_machine_rhel820_options(MachineClass *m)
 | ||||
| +{
 | ||||
| +    PCMachineClass *pcmc = PC_MACHINE_CLASS(m);
 | ||||
| +    pc_q35_machine_rhel830_options(m);
 | ||||
| +    m->desc = "RHEL-8.2.0 PC (Q35 + ICH9, 2009)";
 | ||||
| +    m->numa_mem_supported = true;
 | ||||
| +    m->auto_enable_numa_with_memdev = false;
 | ||||
| +    pcmc->smbios_stream_product = "RHEL-AV";
 | ||||
| +    pcmc->smbios_stream_version = "8.2.0";
 | ||||
| +    compat_props_add(m->compat_props, hw_compat_rhel_8_2,
 | ||||
| +                     hw_compat_rhel_8_2_len);
 | ||||
| +    compat_props_add(m->compat_props, pc_rhel_8_2_compat,
 | ||||
| +                     pc_rhel_8_2_compat_len);
 | ||||
| +}
 | ||||
| +
 | ||||
| +DEFINE_PC_MACHINE(q35_rhel820, "pc-q35-rhel8.2.0", pc_q35_init_rhel820,
 | ||||
| +                  pc_q35_machine_rhel820_options);
 | ||||
| +
 | ||||
| +static void pc_q35_init_rhel810(MachineState *machine)
 | ||||
| +{
 | ||||
| +    pc_q35_init(machine);
 | ||||
| +}
 | ||||
| +
 | ||||
| +static void pc_q35_machine_rhel810_options(MachineClass *m)
 | ||||
| +{
 | ||||
| +    PCMachineClass *pcmc = PC_MACHINE_CLASS(m);
 | ||||
| +    pc_q35_machine_rhel820_options(m);
 | ||||
| +    m->desc = "RHEL-8.1.0 PC (Q35 + ICH9, 2009)";
 | ||||
| +    m->alias = NULL;
 | ||||
| +    pcmc->smbios_stream_product = NULL;
 | ||||
| +    pcmc->smbios_stream_version = NULL;
 | ||||
| +    compat_props_add(m->compat_props, hw_compat_rhel_8_1, hw_compat_rhel_8_1_len);
 | ||||
| +    compat_props_add(m->compat_props, pc_rhel_8_1_compat, pc_rhel_8_1_compat_len);
 | ||||
| +}
 | ||||
| +
 | ||||
| +DEFINE_PC_MACHINE(q35_rhel810, "pc-q35-rhel8.1.0", pc_q35_init_rhel810,
 | ||||
| +                  pc_q35_machine_rhel810_options);
 | ||||
| +
 | ||||
| +static void pc_q35_init_rhel800(MachineState *machine)
 | ||||
| +{
 | ||||
| +    pc_q35_init(machine);
 | ||||
| +}
 | ||||
| +
 | ||||
| +static void pc_q35_machine_rhel800_options(MachineClass *m)
 | ||||
| +{
 | ||||
| +    PCMachineClass *pcmc = PC_MACHINE_CLASS(m);
 | ||||
| +    pc_q35_machine_rhel810_options(m);
 | ||||
| +    m->desc = "RHEL-8.0.0 PC (Q35 + ICH9, 2009)";
 | ||||
| +    m->smbus_no_migration_support = true;
 | ||||
| +    m->alias = NULL;
 | ||||
| +    pcmc->pvh_enabled = false;
 | ||||
| +    pcmc->default_cpu_version = CPU_VERSION_LEGACY;
 | ||||
| +    compat_props_add(m->compat_props, hw_compat_rhel_8_0, hw_compat_rhel_8_0_len);
 | ||||
| +    compat_props_add(m->compat_props, pc_rhel_8_0_compat, pc_rhel_8_0_compat_len);
 | ||||
| +}
 | ||||
| +
 | ||||
| +DEFINE_PC_MACHINE(q35_rhel800, "pc-q35-rhel8.0.0", pc_q35_init_rhel800,
 | ||||
| +                  pc_q35_machine_rhel800_options);
 | ||||
| +
 | ||||
| +static void pc_q35_init_rhel760(MachineState *machine)
 | ||||
| +{
 | ||||
| +    pc_q35_init(machine);
 | ||||
| +}
 | ||||
| +
 | ||||
| +static void pc_q35_machine_rhel760_options(MachineClass *m)
 | ||||
| +{
 | ||||
| +    pc_q35_machine_rhel800_options(m);
 | ||||
| +    m->alias = NULL;
 | ||||
| +    m->desc = "RHEL-7.6.0 PC (Q35 + ICH9, 2009)";
 | ||||
| +    m->async_pf_vmexit_disable = true;
 | ||||
| +    compat_props_add(m->compat_props, hw_compat_rhel_7_6, hw_compat_rhel_7_6_len);
 | ||||
| +    compat_props_add(m->compat_props, pc_rhel_7_6_compat, pc_rhel_7_6_compat_len);
 | ||||
| +}
 | ||||
| +
 | ||||
| +DEFINE_PC_MACHINE(q35_rhel760, "pc-q35-rhel7.6.0", pc_q35_init_rhel760,
 | ||||
| +                  pc_q35_machine_rhel760_options);
 | ||||
| diff --git a/include/hw/boards.h b/include/hw/boards.h
 | ||||
| index b0a6e05b48..3c3d2ad450 100644
 | ||||
| --- a/include/hw/boards.h
 | ||||
| +++ b/include/hw/boards.h
 | ||||
| @@ -263,6 +263,8 @@ struct MachineClass {
 | ||||
|      strList *allowed_dynamic_sysbus_devices; | ||||
|      bool auto_enable_numa_with_memhp; | ||||
|      bool auto_enable_numa_with_memdev; | ||||
| +    /* RHEL only */
 | ||||
| +    bool async_pf_vmexit_disable;
 | ||||
|      bool ignore_boot_device_suffixes; | ||||
|      bool smbus_no_migration_support; | ||||
|      bool nvdimm_supported; | ||||
| diff --git a/include/hw/i386/pc.h b/include/hw/i386/pc.h
 | ||||
| index 7ccc9a1a07..9689a58b14 100644
 | ||||
| --- a/include/hw/i386/pc.h
 | ||||
| +++ b/include/hw/i386/pc.h
 | ||||
| @@ -280,6 +280,27 @@ extern const size_t pc_compat_1_5_len;
 | ||||
|  extern GlobalProperty pc_compat_1_4[]; | ||||
|  extern const size_t pc_compat_1_4_len; | ||||
|   | ||||
| +extern GlobalProperty pc_rhel_compat[];
 | ||||
| +extern const size_t pc_rhel_compat_len;
 | ||||
| +
 | ||||
| +extern GlobalProperty pc_rhel_8_4_compat[];
 | ||||
| +extern const size_t pc_rhel_8_4_compat_len;
 | ||||
| +
 | ||||
| +extern GlobalProperty pc_rhel_8_3_compat[];
 | ||||
| +extern const size_t pc_rhel_8_3_compat_len;
 | ||||
| +
 | ||||
| +extern GlobalProperty pc_rhel_8_2_compat[];
 | ||||
| +extern const size_t pc_rhel_8_2_compat_len;
 | ||||
| +
 | ||||
| +extern GlobalProperty pc_rhel_8_1_compat[];
 | ||||
| +extern const size_t pc_rhel_8_1_compat_len;
 | ||||
| +
 | ||||
| +extern GlobalProperty pc_rhel_8_0_compat[];
 | ||||
| +extern const size_t pc_rhel_8_0_compat_len;
 | ||||
| +
 | ||||
| +extern GlobalProperty pc_rhel_7_6_compat[];
 | ||||
| +extern const size_t pc_rhel_7_6_compat_len;
 | ||||
| +
 | ||||
|  /* Helper for setting model-id for CPU models that changed model-id | ||||
|   * depending on QEMU versions up to QEMU 2.4. | ||||
|   */ | ||||
| diff --git a/target/i386/kvm/kvm-cpu.c b/target/i386/kvm/kvm-cpu.c
 | ||||
| index d95028018e..7b004065ae 100644
 | ||||
| --- a/target/i386/kvm/kvm-cpu.c
 | ||||
| +++ b/target/i386/kvm/kvm-cpu.c
 | ||||
| @@ -131,6 +131,7 @@ static PropValue kvm_default_props[] = {
 | ||||
|      { "acpi", "off" }, | ||||
|      { "monitor", "off" }, | ||||
|      { "svm", "off" }, | ||||
| +    { "kvm-pv-unhalt", "on" },
 | ||||
|      { NULL, NULL }, | ||||
|  }; | ||||
|   | ||||
| diff --git a/target/i386/kvm/kvm.c b/target/i386/kvm/kvm.c
 | ||||
| index 5a698bde19..a668f521ac 100644
 | ||||
| --- a/target/i386/kvm/kvm.c
 | ||||
| +++ b/target/i386/kvm/kvm.c
 | ||||
| @@ -3336,6 +3336,7 @@ static int kvm_get_msrs(X86CPU *cpu)
 | ||||
|      struct kvm_msr_entry *msrs = cpu->kvm_msr_buf->entries; | ||||
|      int ret, i; | ||||
|      uint64_t mtrr_top_bits; | ||||
| +    MachineClass *mc = MACHINE_GET_CLASS(qdev_get_machine());
 | ||||
|   | ||||
|      kvm_msr_buf_reset(cpu); | ||||
|   | ||||
| @@ -3665,6 +3666,9 @@ static int kvm_get_msrs(X86CPU *cpu)
 | ||||
|              break; | ||||
|          case MSR_KVM_ASYNC_PF_EN: | ||||
|              env->async_pf_en_msr = msrs[i].data; | ||||
| +            if (mc->async_pf_vmexit_disable) {
 | ||||
| +                env->async_pf_en_msr &= ~(1ULL << 2);
 | ||||
| +            }
 | ||||
|              break; | ||||
|          case MSR_KVM_ASYNC_PF_INT: | ||||
|              env->async_pf_int_msr = msrs[i].data; | ||||
| diff --git a/tests/qtest/pvpanic-test.c b/tests/qtest/pvpanic-test.c
 | ||||
| index 6dcad2db49..580c2c43d2 100644
 | ||||
| --- a/tests/qtest/pvpanic-test.c
 | ||||
| +++ b/tests/qtest/pvpanic-test.c
 | ||||
| @@ -17,7 +17,7 @@ static void test_panic_nopause(void)
 | ||||
|      QDict *response, *data; | ||||
|      QTestState *qts; | ||||
|   | ||||
| -    qts = qtest_init("-device pvpanic -action panic=none");
 | ||||
| +    qts = qtest_init("-M q35 -device pvpanic -action panic=none");
 | ||||
|   | ||||
|      val = qtest_inb(qts, 0x505); | ||||
|      g_assert_cmpuint(val, ==, 3); | ||||
| @@ -40,7 +40,8 @@ static void test_panic(void)
 | ||||
|      QDict *response, *data; | ||||
|      QTestState *qts; | ||||
|   | ||||
| -    qts = qtest_init("-device pvpanic -action panic=pause");
 | ||||
| +    /* RHEL: Use q35 */
 | ||||
| +    qts = qtest_init("-M q35 -device pvpanic -action panic=pause");
 | ||||
|   | ||||
|      val = qtest_inb(qts, 0x505); | ||||
|      g_assert_cmpuint(val, ==, 3); | ||||
| -- 
 | ||||
| 2.27.0 | ||||
| 
 | ||||
							
								
								
									
										376
									
								
								SOURCES/0012-Enable-make-check.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										376
									
								
								SOURCES/0012-Enable-make-check.patch
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,376 @@ | ||||
| From b071f3eaa77dde1567d70b43d0b2975efe380da2 Mon Sep 17 00:00:00 2001 | ||||
| From: Miroslav Rezanina <mrezanin@redhat.com> | ||||
| Date: Wed, 2 Sep 2020 09:39:41 +0200 | ||||
| Subject: Enable make check | ||||
| 
 | ||||
| Fixing tests after device disabling and machine types changes and enabling | ||||
| make check run during build. | ||||
| 
 | ||||
| Signed-off-by: Miroslav Rezanina <mrezanin@redhat.com> | ||||
| ---
 | ||||
| Rebase changes (6.1.0): | ||||
| - removed unnecessary test changes
 | ||||
| 
 | ||||
| Rebase changes (6.2.0 RC0): | ||||
| - new way of disabling bios-table-test
 | ||||
| 
 | ||||
| Merged patches (6.1.0): | ||||
| - 2f129df7d3 redhat: Enable the 'test-block-iothread' test again
 | ||||
| ---
 | ||||
|  .distro/qemu-kvm.spec.template      |  5 ++--- | ||||
|  tests/qemu-iotests/051              |  8 ++++---- | ||||
|  tests/qtest/bios-tables-test.c      |  6 +++--- | ||||
|  tests/qtest/boot-serial-test.c      |  6 +++++- | ||||
|  tests/qtest/cdrom-test.c            |  4 ++++ | ||||
|  tests/qtest/cpu-plug-test.c         |  4 ++-- | ||||
|  tests/qtest/fuzz-e1000e-test.c      |  2 +- | ||||
|  tests/qtest/fuzz-virtio-scsi-test.c |  2 +- | ||||
|  tests/qtest/hd-geo-test.c           |  4 ++++ | ||||
|  tests/qtest/lpc-ich9-test.c         |  2 +- | ||||
|  tests/qtest/meson.build             | 13 ++++--------- | ||||
|  tests/qtest/prom-env-test.c         |  4 ++++ | ||||
|  tests/qtest/test-x86-cpuid-compat.c |  2 ++ | ||||
|  tests/qtest/usb-hcd-xhci-test.c     |  4 ++++ | ||||
|  14 files changed, 41 insertions(+), 25 deletions(-) | ||||
| 
 | ||||
| diff --git a/tests/qemu-iotests/051 b/tests/qemu-iotests/051
 | ||||
| index 1d2fa93a11..c8a2815f54 100755
 | ||||
| --- a/tests/qemu-iotests/051
 | ||||
| +++ b/tests/qemu-iotests/051
 | ||||
| @@ -174,9 +174,9 @@ run_qemu -drive if=virtio
 | ||||
|  case "$QEMU_DEFAULT_MACHINE" in | ||||
|      pc) | ||||
|          run_qemu -drive if=none,id=disk -device ide-cd,drive=disk | ||||
| -        run_qemu -drive if=none,id=disk -device lsi53c895a -device scsi-cd,drive=disk
 | ||||
| +#        run_qemu -drive if=none,id=disk -device lsi53c895a -device scsi-cd,drive=disk
 | ||||
|          run_qemu -drive if=none,id=disk -device ide-hd,drive=disk | ||||
| -        run_qemu -drive if=none,id=disk -device lsi53c895a -device scsi-hd,drive=disk
 | ||||
| +#        run_qemu -drive if=none,id=disk -device lsi53c895a -device scsi-hd,drive=disk
 | ||||
|          ;; | ||||
|       *) | ||||
|          ;; | ||||
| @@ -225,9 +225,9 @@ run_qemu -drive file="$TEST_IMG",if=virtio,readonly=on
 | ||||
|  case "$QEMU_DEFAULT_MACHINE" in | ||||
|      pc) | ||||
|          run_qemu -drive file="$TEST_IMG",if=none,id=disk,readonly=on -device ide-cd,drive=disk | ||||
| -        run_qemu -drive file="$TEST_IMG",if=none,id=disk,readonly=on -device lsi53c895a -device scsi-cd,drive=disk
 | ||||
| +#        run_qemu -drive file="$TEST_IMG",if=none,id=disk,readonly=on -device lsi53c895a -device scsi-cd,drive=disk
 | ||||
|          run_qemu -drive file="$TEST_IMG",if=none,id=disk,readonly=on -device ide-hd,drive=disk | ||||
| -        run_qemu -drive file="$TEST_IMG",if=none,id=disk,readonly=on -device lsi53c895a -device scsi-hd,drive=disk
 | ||||
| +#        run_qemu -drive file="$TEST_IMG",if=none,id=disk,readonly=on -device lsi53c895a -device scsi-hd,drive=disk
 | ||||
|          ;; | ||||
|       *) | ||||
|          ;; | ||||
| diff --git a/tests/qtest/bios-tables-test.c b/tests/qtest/bios-tables-test.c
 | ||||
| index 258874167e..62745181a8 100644
 | ||||
| --- a/tests/qtest/bios-tables-test.c
 | ||||
| +++ b/tests/qtest/bios-tables-test.c
 | ||||
| @@ -1371,7 +1371,7 @@ static void test_acpi_virt_tcg_numamem(void)
 | ||||
|      free_test_data(&data); | ||||
|   | ||||
|  } | ||||
| -
 | ||||
| +#if 0  /* Disabled for Red Hat Enterprise Linux */
 | ||||
|  static void test_acpi_virt_tcg_pxb(void) | ||||
|  { | ||||
|      test_data data = { | ||||
| @@ -1403,7 +1403,7 @@ static void test_acpi_virt_tcg_pxb(void)
 | ||||
|   | ||||
|      free_test_data(&data); | ||||
|  } | ||||
| -
 | ||||
| +#endif
 | ||||
|  static void test_acpi_tcg_acpi_hmat(const char *machine) | ||||
|  { | ||||
|      test_data data; | ||||
| @@ -1644,7 +1644,7 @@ int main(int argc, char *argv[])
 | ||||
|              qtest_add_func("acpi/virt", test_acpi_virt_tcg); | ||||
|              qtest_add_func("acpi/virt/numamem", test_acpi_virt_tcg_numamem); | ||||
|              qtest_add_func("acpi/virt/memhp", test_acpi_virt_tcg_memhp); | ||||
| -            qtest_add_func("acpi/virt/pxb", test_acpi_virt_tcg_pxb);
 | ||||
| +/*            qtest_add_func("acpi/virt/pxb", test_acpi_virt_tcg_pxb); */
 | ||||
|              qtest_add_func("acpi/virt/oem-fields", test_acpi_oem_fields_virt); | ||||
|          } | ||||
|      } | ||||
| diff --git a/tests/qtest/boot-serial-test.c b/tests/qtest/boot-serial-test.c
 | ||||
| index 83828ba270..294476b959 100644
 | ||||
| --- a/tests/qtest/boot-serial-test.c
 | ||||
| +++ b/tests/qtest/boot-serial-test.c
 | ||||
| @@ -148,19 +148,23 @@ static testdef_t tests[] = {
 | ||||
|      { "ppc", "g3beige", "", "PowerPC,750" }, | ||||
|      { "ppc", "mac99", "", "PowerPC,G4" }, | ||||
|      { "ppc", "sam460ex", "-m 256", "DRAM:  256 MiB" }, | ||||
| +#if 0 /* Disabled for Red Hat Enterprise Linux */
 | ||||
|      { "ppc64", "ppce500", "", "U-Boot" }, | ||||
|      { "ppc64", "40p", "-m 192", "Memory: 192M" }, | ||||
|      { "ppc64", "mac99", "", "PowerPC,970FX" }, | ||||
| +#endif
 | ||||
|      { "ppc64", "pseries", | ||||
|        "-machine " PSERIES_DEFAULT_CAPABILITIES, | ||||
|        "Open Firmware" }, | ||||
| +#if 0 /* Disabled for Red Hat Enterprise Linux */
 | ||||
|      { "ppc64", "powernv8", "", "OPAL" }, | ||||
|      { "ppc64", "powernv9", "", "OPAL" }, | ||||
|      { "ppc64", "sam460ex", "-device e1000", "8086  100e" }, | ||||
| +#endif
 | ||||
|      { "i386", "isapc", "-cpu qemu32 -device sga", "SGABIOS" }, | ||||
|      { "i386", "pc", "-device sga", "SGABIOS" }, | ||||
|      { "i386", "q35", "-device sga", "SGABIOS" }, | ||||
| -    { "x86_64", "isapc", "-cpu qemu32 -device sga", "SGABIOS" },
 | ||||
| +    { "x86_64", "pc", "-cpu qemu32 -device sga", "SGABIOS" },
 | ||||
|      { "x86_64", "q35", "-device sga", "SGABIOS" }, | ||||
|      { "sparc", "LX", "", "TMS390S10" }, | ||||
|      { "sparc", "SS-4", "", "MB86904" }, | ||||
| diff --git a/tests/qtest/cdrom-test.c b/tests/qtest/cdrom-test.c
 | ||||
| index 5af944a5fb..69d9bac38a 100644
 | ||||
| --- a/tests/qtest/cdrom-test.c
 | ||||
| +++ b/tests/qtest/cdrom-test.c
 | ||||
| @@ -140,6 +140,7 @@ static void add_x86_tests(void)
 | ||||
|          qtest_add_data_func("cdrom/boot/isapc", "-M isapc " | ||||
|                              "-drive if=ide,media=cdrom,file=", test_cdboot); | ||||
|      } | ||||
| +#if 0  /* Disabled for Red Hat Enterprise Linux */
 | ||||
|      qtest_add_data_func("cdrom/boot/am53c974", | ||||
|                          "-device am53c974 -device scsi-cd,drive=cd1 " | ||||
|                          "-drive if=none,id=cd1,format=raw,file=", test_cdboot); | ||||
| @@ -155,6 +156,7 @@ static void add_x86_tests(void)
 | ||||
|      qtest_add_data_func("cdrom/boot/megasas-gen2", "-M q35 " | ||||
|                          "-device megasas-gen2 -device scsi-cd,drive=cd1 " | ||||
|                          "-blockdev file,node-name=cd1,filename=", test_cdboot); | ||||
| +#endif
 | ||||
|  } | ||||
|   | ||||
|  static void add_s390x_tests(void) | ||||
| @@ -220,6 +222,7 @@ int main(int argc, char **argv)
 | ||||
|              "magnum", "malta", "pica61", NULL | ||||
|          }; | ||||
|          add_cdrom_param_tests(mips64machines); | ||||
| +#if 0 /* Disabled for Red Hat Enterprise Linux */
 | ||||
|      } else if (g_str_equal(arch, "arm") || g_str_equal(arch, "aarch64")) { | ||||
|          const char *armmachines[] = { | ||||
|              "realview-eb", "realview-eb-mpcore", "realview-pb-a8", | ||||
| @@ -227,6 +230,7 @@ int main(int argc, char **argv)
 | ||||
|              "vexpress-a9", "virt", NULL | ||||
|          }; | ||||
|          add_cdrom_param_tests(armmachines); | ||||
| +#endif
 | ||||
|      } else { | ||||
|          const char *nonemachine[] = { "none", NULL }; | ||||
|          add_cdrom_param_tests(nonemachine); | ||||
| diff --git a/tests/qtest/cpu-plug-test.c b/tests/qtest/cpu-plug-test.c
 | ||||
| index a1c689414b..a8f076711c 100644
 | ||||
| --- a/tests/qtest/cpu-plug-test.c
 | ||||
| +++ b/tests/qtest/cpu-plug-test.c
 | ||||
| @@ -110,8 +110,8 @@ static void add_pseries_test_case(const char *mname)
 | ||||
|      char *path; | ||||
|      PlugTestData *data; | ||||
|   | ||||
| -    if (!g_str_has_prefix(mname, "pseries-") ||
 | ||||
| -        (g_str_has_prefix(mname, "pseries-2.") && atoi(&mname[10]) < 7)) {
 | ||||
| +    if (!g_str_has_prefix(mname, "pseries-rhel") ||
 | ||||
| +        (g_str_has_prefix(mname, "pseries-rhel7.") && atoi(&mname[14]) < 4)) {
 | ||||
|          return; | ||||
|      } | ||||
|      data = g_new(PlugTestData, 1); | ||||
| diff --git a/tests/qtest/fuzz-e1000e-test.c b/tests/qtest/fuzz-e1000e-test.c
 | ||||
| index 66229e6096..947fba73b7 100644
 | ||||
| --- a/tests/qtest/fuzz-e1000e-test.c
 | ||||
| +++ b/tests/qtest/fuzz-e1000e-test.c
 | ||||
| @@ -17,7 +17,7 @@ static void test_lp1879531_eth_get_rss_ex_dst_addr(void)
 | ||||
|  { | ||||
|      QTestState *s; | ||||
|   | ||||
| -    s = qtest_init("-nographic -monitor none -serial none -M pc-q35-5.0");
 | ||||
| +    s = qtest_init("-nographic -monitor none -serial none -M pc-q35-rhel8.4.0");
 | ||||
|   | ||||
|      qtest_outl(s, 0xcf8, 0x80001010); | ||||
|      qtest_outl(s, 0xcfc, 0xe1020000); | ||||
| diff --git a/tests/qtest/fuzz-virtio-scsi-test.c b/tests/qtest/fuzz-virtio-scsi-test.c
 | ||||
| index aaf6d10e18..43727d62ac 100644
 | ||||
| --- a/tests/qtest/fuzz-virtio-scsi-test.c
 | ||||
| +++ b/tests/qtest/fuzz-virtio-scsi-test.c
 | ||||
| @@ -19,7 +19,7 @@ static void test_mmio_oob_from_memory_region_cache(void)
 | ||||
|  { | ||||
|      QTestState *s; | ||||
|   | ||||
| -    s = qtest_init("-M pc-q35-5.2 -display none -m 512M "
 | ||||
| +    s = qtest_init("-M pc-q35-rhel8.4.0 -display none -m 512M "
 | ||||
|                     "-device virtio-scsi,num_queues=8,addr=03.0 "); | ||||
|   | ||||
|      qtest_outl(s, 0xcf8, 0x80001811); | ||||
| diff --git a/tests/qtest/hd-geo-test.c b/tests/qtest/hd-geo-test.c
 | ||||
| index 113126ae06..999ef2aace 100644
 | ||||
| --- a/tests/qtest/hd-geo-test.c
 | ||||
| +++ b/tests/qtest/hd-geo-test.c
 | ||||
| @@ -737,6 +737,7 @@ static void test_override_ide(void)
 | ||||
|      test_override(args, expected); | ||||
|  } | ||||
|   | ||||
| +#if 0 /* Require lsi53c895a - not supported on RHEL */
 | ||||
|  static void test_override_scsi(void) | ||||
|  { | ||||
|      TestArgs *args = create_args(); | ||||
| @@ -781,6 +782,7 @@ static void test_override_scsi_2_controllers(void)
 | ||||
|      add_scsi_disk(args, 3, 1, 0, 1, 2, 0, 1, 0); | ||||
|      test_override(args, expected); | ||||
|  } | ||||
| +#endif
 | ||||
|   | ||||
|  static void test_override_virtio_blk(void) | ||||
|  { | ||||
| @@ -960,9 +962,11 @@ int main(int argc, char **argv)
 | ||||
|      qtest_add_func("hd-geo/ide/device/user/chst", test_ide_device_user_chst); | ||||
|      if (have_qemu_img()) { | ||||
|          qtest_add_func("hd-geo/override/ide", test_override_ide); | ||||
| +#if 0 /* Require lsi53c895a - not supported on RHEL */
 | ||||
|          qtest_add_func("hd-geo/override/scsi", test_override_scsi); | ||||
|          qtest_add_func("hd-geo/override/scsi_2_controllers", | ||||
|                         test_override_scsi_2_controllers); | ||||
| +#endif
 | ||||
|          qtest_add_func("hd-geo/override/virtio_blk", test_override_virtio_blk); | ||||
|          qtest_add_func("hd-geo/override/zero_chs", test_override_zero_chs); | ||||
|          qtest_add_func("hd-geo/override/scsi_hot_unplug", | ||||
| diff --git a/tests/qtest/lpc-ich9-test.c b/tests/qtest/lpc-ich9-test.c
 | ||||
| index fe0bef9980..7a9d51579b 100644
 | ||||
| --- a/tests/qtest/lpc-ich9-test.c
 | ||||
| +++ b/tests/qtest/lpc-ich9-test.c
 | ||||
| @@ -15,7 +15,7 @@ static void test_lp1878642_pci_bus_get_irq_level_assert(void)
 | ||||
|  { | ||||
|      QTestState *s; | ||||
|   | ||||
| -    s = qtest_init("-M pc-q35-5.0 "
 | ||||
| +    s = qtest_init("-M pc-q35-rhel8.4.0 "
 | ||||
|                     "-nographic -monitor none -serial none"); | ||||
|   | ||||
|      qtest_outl(s, 0xcf8, 0x8000f840); /* PMBASE */ | ||||
| diff --git a/tests/qtest/meson.build b/tests/qtest/meson.build
 | ||||
| index c9d8458062..049e06c057 100644
 | ||||
| --- a/tests/qtest/meson.build
 | ||||
| +++ b/tests/qtest/meson.build
 | ||||
| @@ -68,7 +68,6 @@ qtests_i386 = \
 | ||||
|    (config_all_devices.has_key('CONFIG_RTL8139_PCI') ? ['rtl8139-test'] : []) +              \ | ||||
|    (config_all_devices.has_key('CONFIG_E1000E_PCI_EXPRESS') ? ['fuzz-e1000e-test'] : []) +   \ | ||||
|    (config_all_devices.has_key('CONFIG_ESP_PCI') ? ['am53c974-test'] : []) +                 \ | ||||
| -  (unpack_edk2_blobs ? ['bios-tables-test'] : []) +                                         \
 | ||||
|    qtests_pci +                                                                              \ | ||||
|    ['fdc-test', | ||||
|     'ide-test', | ||||
| @@ -81,7 +80,6 @@ qtests_i386 = \
 | ||||
|     'drive_del-test', | ||||
|     'tco-test', | ||||
|     'cpu-plug-test', | ||||
| -   'q35-test',
 | ||||
|     'vmgenid-test', | ||||
|     'migration-test', | ||||
|     'test-x86-cpuid-compat', | ||||
| @@ -130,17 +128,15 @@ qtests_mips64el = \
 | ||||
|   | ||||
|  qtests_ppc = \ | ||||
|    (config_all_devices.has_key('CONFIG_ISA_TESTDEV') ? ['endianness-test'] : []) +            \ | ||||
| -  (config_all_devices.has_key('CONFIG_M48T59') ? ['m48t59-test'] : []) +                     \
 | ||||
| -  ['boot-order-test', 'prom-env-test', 'boot-serial-test']                 \
 | ||||
| +  (config_all_devices.has_key('CONFIG_M48T59') ? ['m48t59-test'] : [])
 | ||||
|   | ||||
|  qtests_ppc64 = \ | ||||
|    (config_all_devices.has_key('CONFIG_PSERIES') ? ['device-plug-test'] : []) +               \ | ||||
|    (config_all_devices.has_key('CONFIG_POWERNV') ? ['pnv-xscom-test'] : []) +                 \ | ||||
|    (config_all_devices.has_key('CONFIG_PSERIES') ? ['rtas-test'] : []) +                      \ | ||||
| -  (slirp.found() ? ['pxe-test', 'test-netfilter'] : []) +              \
 | ||||
| +  (slirp.found() ? ['pxe-test'] : []) +              \
 | ||||
|    (config_all_devices.has_key('CONFIG_USB_UHCI') ? ['usb-hcd-uhci-test'] : []) +             \ | ||||
|    (config_all_devices.has_key('CONFIG_USB_XHCI_NEC') ? ['usb-hcd-xhci-test'] : []) +         \ | ||||
| -  (config_host.has_key('CONFIG_POSIX') ? ['test-filter-mirror'] : []) +                      \
 | ||||
|    qtests_pci + ['migration-test', 'numa-test', 'cpu-plug-test', 'drive_del-test'] | ||||
|   | ||||
|  qtests_sh4 = (config_all_devices.has_key('CONFIG_ISA_TESTDEV') ? ['endianness-test'] : []) | ||||
| @@ -186,8 +182,8 @@ qtests_aarch64 = \
 | ||||
|    ['arm-cpu-features', | ||||
|     'numa-test', | ||||
|     'boot-serial-test', | ||||
| -   'xlnx-can-test',
 | ||||
| -   'fuzz-xlnx-dp-test',
 | ||||
| +#   'xlnx-can-test',
 | ||||
| +#   'fuzz-xlnx-dp-test',
 | ||||
|     'migration-test'] | ||||
|   | ||||
|  qtests_s390x = \ | ||||
| @@ -196,7 +192,6 @@ qtests_s390x = \
 | ||||
|    (config_host.has_key('CONFIG_POSIX') ? ['test-filter-redirector'] : []) +                     \ | ||||
|    ['boot-serial-test', | ||||
|     'drive_del-test', | ||||
| -   'device-plug-test',
 | ||||
|     'virtio-ccw-test', | ||||
|     'cpu-plug-test', | ||||
|     'migration-test'] | ||||
| diff --git a/tests/qtest/prom-env-test.c b/tests/qtest/prom-env-test.c
 | ||||
| index f41d80154a..f8dc478ce8 100644
 | ||||
| --- a/tests/qtest/prom-env-test.c
 | ||||
| +++ b/tests/qtest/prom-env-test.c
 | ||||
| @@ -89,10 +89,14 @@ int main(int argc, char *argv[])
 | ||||
|      if (!strcmp(arch, "ppc")) { | ||||
|          add_tests(ppc_machines); | ||||
|      } else if (!strcmp(arch, "ppc64")) { | ||||
| +#if 0 /* Disabled for Red Hat Enterprise Linux */
 | ||||
|          add_tests(ppc_machines); | ||||
|          if (g_test_slow()) { | ||||
| +#endif
 | ||||
|              qtest_add_data_func("prom-env/pseries", "pseries", test_machine); | ||||
| +#if 0 /* Disabled for Red Hat Enterprise Linux */
 | ||||
|          } | ||||
| +#endif
 | ||||
|      } else if (!strcmp(arch, "sparc")) { | ||||
|          add_tests(sparc_machines); | ||||
|      } else if (!strcmp(arch, "sparc64")) { | ||||
| diff --git a/tests/qtest/test-x86-cpuid-compat.c b/tests/qtest/test-x86-cpuid-compat.c
 | ||||
| index f28848e06e..6b2fd398a2 100644
 | ||||
| --- a/tests/qtest/test-x86-cpuid-compat.c
 | ||||
| +++ b/tests/qtest/test-x86-cpuid-compat.c
 | ||||
| @@ -300,6 +300,7 @@ int main(int argc, char **argv)
 | ||||
|                     "-cpu 486,xlevel2=0xC0000002,xstore=on", | ||||
|                     "xlevel2", 0xC0000002); | ||||
|   | ||||
| +#if 0 /* Disabled in Red Hat Enterprise Linux */
 | ||||
|      /* Check compatibility of old machine-types that didn't | ||||
|       * auto-increase level/xlevel/xlevel2: */ | ||||
|   | ||||
| @@ -350,6 +351,7 @@ int main(int argc, char **argv)
 | ||||
|      add_cpuid_test("x86/cpuid/xlevel-compat/pc-i440fx-2.4/npt-on", | ||||
|                     "-machine pc-i440fx-2.4 -cpu SandyBridge,svm=on,npt=on", | ||||
|                     "xlevel", 0x80000008); | ||||
| +#endif
 | ||||
|   | ||||
|      /* Test feature parsing */ | ||||
|      add_feature_test("x86/cpuid/features/plus", | ||||
| diff --git a/tests/qtest/usb-hcd-xhci-test.c b/tests/qtest/usb-hcd-xhci-test.c
 | ||||
| index 10ef9d2a91..3855873050 100644
 | ||||
| --- a/tests/qtest/usb-hcd-xhci-test.c
 | ||||
| +++ b/tests/qtest/usb-hcd-xhci-test.c
 | ||||
| @@ -21,6 +21,7 @@ static void test_xhci_hotplug(void)
 | ||||
|      usb_test_hotplug(global_qtest, "xhci", "1", NULL); | ||||
|  } | ||||
|   | ||||
| +#if 0 /* Disabled for Red Hat Enterprise Linux */
 | ||||
|  static void test_usb_uas_hotplug(void) | ||||
|  { | ||||
|      QTestState *qts = global_qtest; | ||||
| @@ -36,6 +37,7 @@ static void test_usb_uas_hotplug(void)
 | ||||
|      qtest_qmp_device_del(qts, "scsihd"); | ||||
|      qtest_qmp_device_del(qts, "uas"); | ||||
|  } | ||||
| +#endif
 | ||||
|   | ||||
|  static void test_usb_ccid_hotplug(void) | ||||
|  { | ||||
| @@ -56,7 +58,9 @@ int main(int argc, char **argv)
 | ||||
|   | ||||
|      qtest_add_func("/xhci/pci/init", test_xhci_init); | ||||
|      qtest_add_func("/xhci/pci/hotplug", test_xhci_hotplug); | ||||
| +#if 0 /* Disabled for Red Hat Enterprise Linux */
 | ||||
|      qtest_add_func("/xhci/pci/hotplug/usb-uas", test_usb_uas_hotplug); | ||||
| +#endif
 | ||||
|      qtest_add_func("/xhci/pci/hotplug/usb-ccid", test_usb_ccid_hotplug); | ||||
|   | ||||
|      qtest_start("-device nec-usb-xhci,id=xhci" | ||||
| -- 
 | ||||
| 2.27.0 | ||||
| 
 | ||||
| @ -0,0 +1,104 @@ | ||||
| From 55dcef9d806aa530f10e3ca42eb24d52f850d674 Mon Sep 17 00:00:00 2001 | ||||
| From: Bandan Das <bsd@redhat.com> | ||||
| Date: Tue, 3 Dec 2013 20:05:13 +0100 | ||||
| Subject: vfio: cap number of devices that can be assigned | ||||
| 
 | ||||
| RH-Author: Bandan Das <bsd@redhat.com> | ||||
| Message-id: <1386101113-31560-3-git-send-email-bsd@redhat.com> | ||||
| Patchwork-id: 55984 | ||||
| O-Subject: [PATCH RHEL7 qemu-kvm v2 2/2] vfio: cap number of devices that can be assigned | ||||
| Bugzilla: 678368 | ||||
| RH-Acked-by: Alex Williamson <alex.williamson@redhat.com> | ||||
| RH-Acked-by: Marcelo Tosatti <mtosatti@redhat.com> | ||||
| RH-Acked-by: Michael S. Tsirkin <mst@redhat.com> | ||||
| 
 | ||||
| Go through all groups to get count of total number of devices | ||||
| active to enforce limit | ||||
| 
 | ||||
| Reasoning from Alex for the limit(32) - Assuming 3 slots per | ||||
| device, with 125 slots (number of memory slots for RHEL 7), | ||||
| we can support almost 40 devices and still have few slots left | ||||
| for other uses. Stepping down a bit, the number 32 arbitrarily | ||||
| matches the number of slots on a PCI bus and is also a nice power | ||||
| of two. | ||||
| 
 | ||||
| Count of slots increased to 509 later so we could increase limit | ||||
| to 64 as some usecases require more than 32 devices. | ||||
| 
 | ||||
| Signed-off-by: Bandan Das <bsd@redhat.com> | ||||
| ---
 | ||||
|  hw/vfio/pci.c | 29 ++++++++++++++++++++++++++++- | ||||
|  hw/vfio/pci.h |  1 + | ||||
|  2 files changed, 29 insertions(+), 1 deletion(-) | ||||
| 
 | ||||
| diff --git a/hw/vfio/pci.c b/hw/vfio/pci.c
 | ||||
| index 7b45353ce2..eb725a3aee 100644
 | ||||
| --- a/hw/vfio/pci.c
 | ||||
| +++ b/hw/vfio/pci.c
 | ||||
| @@ -45,6 +45,9 @@
 | ||||
|   | ||||
|  #define TYPE_VFIO_PCI_NOHOTPLUG "vfio-pci-nohotplug" | ||||
|   | ||||
| +/* RHEL only: Set once for the first assigned dev */
 | ||||
| +static uint16_t device_limit;
 | ||||
| +
 | ||||
|  static void vfio_disable_interrupts(VFIOPCIDevice *vdev); | ||||
|  static void vfio_mmap_set_enabled(VFIOPCIDevice *vdev, bool enabled); | ||||
|   | ||||
| @@ -2807,9 +2810,30 @@ static void vfio_realize(PCIDevice *pdev, Error **errp)
 | ||||
|      ssize_t len; | ||||
|      struct stat st; | ||||
|      int groupid; | ||||
| -    int i, ret;
 | ||||
| +    int ret, i = 0;
 | ||||
|      bool is_mdev; | ||||
|   | ||||
| +    if (device_limit && device_limit != vdev->assigned_device_limit) {
 | ||||
| +            error_setg(errp, "Assigned device limit has been redefined. "
 | ||||
| +                       "Old:%d, New:%d",
 | ||||
| +                       device_limit, vdev->assigned_device_limit);
 | ||||
| +            return;
 | ||||
| +    } else {
 | ||||
| +        device_limit = vdev->assigned_device_limit;
 | ||||
| +    }
 | ||||
| +
 | ||||
| +    QLIST_FOREACH(group, &vfio_group_list, next) {
 | ||||
| +        QLIST_FOREACH(vbasedev_iter, &group->device_list, next) {
 | ||||
| +            i++;
 | ||||
| +        }
 | ||||
| +    }
 | ||||
| +
 | ||||
| +    if (i >= vdev->assigned_device_limit) {
 | ||||
| +        error_setg(errp, "Maximum supported vfio devices (%d) "
 | ||||
| +                     "already attached", vdev->assigned_device_limit);
 | ||||
| +        return;
 | ||||
| +    }
 | ||||
| +
 | ||||
|      if (!vdev->vbasedev.sysfsdev) { | ||||
|          if (!(~vdev->host.domain || ~vdev->host.bus || | ||||
|                ~vdev->host.slot || ~vdev->host.function)) { | ||||
| @@ -3246,6 +3270,9 @@ static Property vfio_pci_dev_properties[] = {
 | ||||
|      DEFINE_PROP_BOOL("x-no-kvm-msix", VFIOPCIDevice, no_kvm_msix, false), | ||||
|      DEFINE_PROP_BOOL("x-no-geforce-quirks", VFIOPCIDevice, | ||||
|                       no_geforce_quirks, false), | ||||
| +    /* RHEL only */
 | ||||
| +    DEFINE_PROP_UINT16("x-assigned-device-limit", VFIOPCIDevice,
 | ||||
| +                       assigned_device_limit, 64),
 | ||||
|      DEFINE_PROP_BOOL("x-no-kvm-ioeventfd", VFIOPCIDevice, no_kvm_ioeventfd, | ||||
|                       false), | ||||
|      DEFINE_PROP_BOOL("x-no-vfio-ioeventfd", VFIOPCIDevice, no_vfio_ioeventfd, | ||||
| diff --git a/hw/vfio/pci.h b/hw/vfio/pci.h
 | ||||
| index 64777516d1..e0fe6ca97e 100644
 | ||||
| --- a/hw/vfio/pci.h
 | ||||
| +++ b/hw/vfio/pci.h
 | ||||
| @@ -139,6 +139,7 @@ struct VFIOPCIDevice {
 | ||||
|      EventNotifier err_notifier; | ||||
|      EventNotifier req_notifier; | ||||
|      int (*resetfn)(struct VFIOPCIDevice *); | ||||
| +    uint16_t assigned_device_limit;
 | ||||
|      uint32_t vendor_id; | ||||
|      uint32_t device_id; | ||||
|      uint32_t sub_vendor_id; | ||||
| -- 
 | ||||
| 2.27.0 | ||||
| 
 | ||||
							
								
								
									
										55
									
								
								SOURCES/0014-Add-support-statement-to-help-output.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										55
									
								
								SOURCES/0014-Add-support-statement-to-help-output.patch
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,55 @@ | ||||
| From fcccb5c061b8bbae29de59637c5ad4cf4416281b Mon Sep 17 00:00:00 2001 | ||||
| From: Eduardo Habkost <ehabkost@redhat.com> | ||||
| Date: Wed, 4 Dec 2013 18:53:17 +0100 | ||||
| Subject: Add support statement to -help output | ||||
| 
 | ||||
| RH-Author: Eduardo Habkost <ehabkost@redhat.com> | ||||
| Message-id: <1386183197-27761-1-git-send-email-ehabkost@redhat.com> | ||||
| Patchwork-id: 55994 | ||||
| O-Subject: [qemu-kvm RHEL7 PATCH] Add support statement to -help output | ||||
| Bugzilla: 972773 | ||||
| RH-Acked-by: Miroslav Rezanina <mrezanin@redhat.com> | ||||
| RH-Acked-by: knoel@redhat.com | ||||
| RH-Acked-by: Paolo Bonzini <pbonzini@redhat.com> | ||||
| 
 | ||||
| Add support statement to -help output, reporting direct qemu-kvm usage | ||||
| as unsupported by Red Hat, and advising users to use libvirt instead. | ||||
| 
 | ||||
| Signed-off-by: Eduardo Habkost <ehabkost@redhat.com> | ||||
| ---
 | ||||
|  softmmu/vl.c | 9 +++++++++ | ||||
|  1 file changed, 9 insertions(+) | ||||
| 
 | ||||
| diff --git a/softmmu/vl.c b/softmmu/vl.c
 | ||||
| index 620a1f1367..d46b8fb4ab 100644
 | ||||
| --- a/softmmu/vl.c
 | ||||
| +++ b/softmmu/vl.c
 | ||||
| @@ -827,9 +827,17 @@ static void version(void)
 | ||||
|             QEMU_COPYRIGHT "\n"); | ||||
|  } | ||||
|   | ||||
| +static void print_rh_warning(void)
 | ||||
| +{
 | ||||
| +    printf("\nWARNING: Direct use of qemu-kvm from the command line is not supported by Red Hat.\n"
 | ||||
| +             "WARNING: Use libvirt as the stable management interface.\n"
 | ||||
| +             "WARNING: Some command line options listed here may not be available in future releases.\n\n");
 | ||||
| +}
 | ||||
| +
 | ||||
|  static void help(int exitcode) | ||||
|  { | ||||
|      version(); | ||||
| +    print_rh_warning();
 | ||||
|      printf("usage: %s [options] [disk_image]\n\n" | ||||
|             "'disk_image' is a raw hard disk image for IDE hard disk 0\n\n", | ||||
|              error_get_progname()); | ||||
| @@ -855,6 +863,7 @@ static void help(int exitcode)
 | ||||
|             "\n" | ||||
|             QEMU_HELP_BOTTOM "\n"); | ||||
|   | ||||
| +    print_rh_warning();
 | ||||
|      exit(exitcode); | ||||
|  } | ||||
|   | ||||
| -- 
 | ||||
| 2.27.0 | ||||
| 
 | ||||
							
								
								
									
										45
									
								
								SOURCES/0015-globally-limit-the-maximum-number-of-CPUs.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										45
									
								
								SOURCES/0015-globally-limit-the-maximum-number-of-CPUs.patch
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,45 @@ | ||||
| From 354c9ce982e566ddb3c724a57252986dcb7c36db Mon Sep 17 00:00:00 2001 | ||||
| From: Andrew Jones <drjones@redhat.com> | ||||
| Date: Tue, 21 Jan 2014 10:46:52 +0100 | ||||
| Subject: globally limit the maximum number of CPUs | ||||
| 
 | ||||
| We now globally limit the number of VCPUs. | ||||
| Especially, there is no way one can specify more than | ||||
| max_cpus VCPUs for a VM. | ||||
| 
 | ||||
| This allows us the restore the ppc max_cpus limitation to the upstream | ||||
| default and minimize the ppc hack in kvm-all.c. | ||||
| 
 | ||||
| Signed-off-by: David Hildenbrand <david@redhat.com> | ||||
| Signed-off-by: Miroslav Rezanina <mrezanin@redhat.com> | ||||
| Signed-off-by: Danilo Cesar Lemes de Paula <ddepaula@redhat.com> | ||||
| ---
 | ||||
|  accel/kvm/kvm-all.c | 12 ++++++++++++ | ||||
|  1 file changed, 12 insertions(+) | ||||
| 
 | ||||
| diff --git a/accel/kvm/kvm-all.c b/accel/kvm/kvm-all.c
 | ||||
| index eecd8031cf..8f2a53438f 100644
 | ||||
| --- a/accel/kvm/kvm-all.c
 | ||||
| +++ b/accel/kvm/kvm-all.c
 | ||||
| @@ -2423,6 +2423,18 @@ static int kvm_init(MachineState *ms)
 | ||||
|      soft_vcpus_limit = kvm_recommended_vcpus(s); | ||||
|      hard_vcpus_limit = kvm_max_vcpus(s); | ||||
|   | ||||
| +#ifdef HOST_PPC64
 | ||||
| +    /*
 | ||||
| +     * On POWER, the kernel advertises a soft limit based on the
 | ||||
| +     * number of CPU threads on the host.  We want to allow exceeding
 | ||||
| +     * this for testing purposes, so we don't want to set hard limit
 | ||||
| +     * to soft limit as on x86.
 | ||||
| +     */
 | ||||
| +#else
 | ||||
| +    /* RHEL doesn't support nr_vcpus > soft_vcpus_limit */
 | ||||
| +    hard_vcpus_limit = soft_vcpus_limit;
 | ||||
| +#endif
 | ||||
| +
 | ||||
|      while (nc->name) { | ||||
|          if (nc->num > soft_vcpus_limit) { | ||||
|              warn_report("Number of %s cpus requested (%d) exceeds " | ||||
| -- 
 | ||||
| 2.27.0 | ||||
| 
 | ||||
| @ -0,0 +1,120 @@ | ||||
| From b057b4ebec0f87f21ba4a15adbb2a1bde7240ed5 Mon Sep 17 00:00:00 2001 | ||||
| From: Miroslav Rezanina <mrezanin@redhat.com> | ||||
| Date: Wed, 8 Jul 2020 08:35:50 +0200 | ||||
| Subject: Use qemu-kvm in documentation instead of qemu-system-<arch> | ||||
| 
 | ||||
| Patchwork-id: 62380 | ||||
| O-Subject: [RHEV-7.1 qemu-kvm-rhev PATCHv4] Use qemu-kvm in documentation instead of qemu-system-i386 | ||||
| Bugzilla: 1140620 | ||||
| RH-Acked-by: Laszlo Ersek <lersek@redhat.com> | ||||
| RH-Acked-by: Markus Armbruster <armbru@redhat.com> | ||||
| RH-Acked-by: Stefan Hajnoczi <stefanha@redhat.com> | ||||
| 
 | ||||
| From: Miroslav Rezanina <mrezanin@redhat.com> | ||||
| 
 | ||||
| We change the name and location of qemu-kvm binaries. Update documentation | ||||
| to reflect this change. Only architectures available in RHEL are updated. | ||||
| 
 | ||||
| Signed-off-by: Miroslav Rezanina <mrezanin@redhat.com> | ||||
| ---
 | ||||
|  docs/defs.rst.inc              |  4 ++-- | ||||
|  docs/tools/qemu-trace-stap.rst | 14 +++++++------- | ||||
|  qemu-options.hx                | 10 +++++----- | ||||
|  3 files changed, 14 insertions(+), 14 deletions(-) | ||||
| 
 | ||||
| diff --git a/docs/defs.rst.inc b/docs/defs.rst.inc
 | ||||
| index 52d6454b93..d74dbdeca9 100644
 | ||||
| --- a/docs/defs.rst.inc
 | ||||
| +++ b/docs/defs.rst.inc
 | ||||
| @@ -9,7 +9,7 @@
 | ||||
|     but the manpages will end up misrendered with following normal text | ||||
|     incorrectly in boldface. | ||||
|   | ||||
| -.. |qemu_system| replace:: qemu-system-x86_64
 | ||||
| -.. |qemu_system_x86| replace:: qemu-system-x86_64
 | ||||
| +.. |qemu_system| replace:: qemu-kvm
 | ||||
| +.. |qemu_system_x86| replace:: qemu-kvm
 | ||||
|  .. |I2C| replace:: I\ :sup:`2`\ C | ||||
|  .. |I2S| replace:: I\ :sup:`2`\ S | ||||
| diff --git a/docs/tools/qemu-trace-stap.rst b/docs/tools/qemu-trace-stap.rst
 | ||||
| index d53073b52b..9e93df084f 100644
 | ||||
| --- a/docs/tools/qemu-trace-stap.rst
 | ||||
| +++ b/docs/tools/qemu-trace-stap.rst
 | ||||
| @@ -46,19 +46,19 @@ The following commands are valid:
 | ||||
|    any of the listed names. If no *PATTERN* is given, the all possible | ||||
|    probes will be listed. | ||||
|   | ||||
| -  For example, to list all probes available in the ``qemu-system-x86_64``
 | ||||
| +  For example, to list all probes available in the ``qemu-kvm``
 | ||||
|    binary: | ||||
|   | ||||
|    :: | ||||
|   | ||||
| -    $ qemu-trace-stap list qemu-system-x86_64
 | ||||
| +    $ qemu-trace-stap list qemu-kvm
 | ||||
|   | ||||
|    To filter the list to only cover probes related to QEMU's cryptographic | ||||
|    subsystem, in a binary outside ``$PATH`` | ||||
|   | ||||
|    :: | ||||
|   | ||||
| -    $ qemu-trace-stap list /opt/qemu/4.0.0/bin/qemu-system-x86_64 'qcrypto*'
 | ||||
| +    $ qemu-trace-stap list /opt/qemu/4.0.0/bin/qemu-kvm 'qcrypto*'
 | ||||
|   | ||||
|  .. option:: run OPTIONS BINARY PATTERN... | ||||
|   | ||||
| @@ -90,18 +90,18 @@ The following commands are valid:
 | ||||
|      Restrict the tracing session so that it only triggers for the process | ||||
|      identified by *PID*. | ||||
|   | ||||
| -  For example, to monitor all processes executing ``qemu-system-x86_64``
 | ||||
| +  For example, to monitor all processes executing ``qemu-kvm``
 | ||||
|    as found on ``$PATH``, displaying all I/O related probes: | ||||
|   | ||||
|    :: | ||||
|   | ||||
| -    $ qemu-trace-stap run qemu-system-x86_64 'qio*'
 | ||||
| +    $ qemu-trace-stap run qemu-kvm 'qio*'
 | ||||
|   | ||||
|    To monitor only the QEMU process with PID 1732 | ||||
|   | ||||
|    :: | ||||
|   | ||||
| -    $ qemu-trace-stap run --pid=1732 qemu-system-x86_64 'qio*'
 | ||||
| +    $ qemu-trace-stap run --pid=1732 qemu-kvm 'qio*'
 | ||||
|   | ||||
|    To monitor QEMU processes running an alternative binary outside of | ||||
|    ``$PATH``, displaying verbose information about setup of the | ||||
| @@ -109,7 +109,7 @@ The following commands are valid:
 | ||||
|   | ||||
|    :: | ||||
|   | ||||
| -    $ qemu-trace-stap -v run /opt/qemu/4.0.0/qemu-system-x86_64 'qio*'
 | ||||
| +    $ qemu-trace-stap -v run /opt/qemu/4.0.0/qemu-kvm 'qio*'
 | ||||
|   | ||||
|  See also | ||||
|  -------- | ||||
| diff --git a/qemu-options.hx b/qemu-options.hx
 | ||||
| index ae2c6dbbfc..94c4a8dbaf 100644
 | ||||
| --- a/qemu-options.hx
 | ||||
| +++ b/qemu-options.hx
 | ||||
| @@ -3150,11 +3150,11 @@ SRST
 | ||||
|   | ||||
|      :: | ||||
|   | ||||
| -        qemu -m 512 -object memory-backend-file,id=mem,size=512M,mem-path=/hugetlbfs,share=on \
 | ||||
| -             -numa node,memdev=mem \
 | ||||
| -             -chardev socket,id=chr0,path=/path/to/socket \
 | ||||
| -             -netdev type=vhost-user,id=net0,chardev=chr0 \
 | ||||
| -             -device virtio-net-pci,netdev=net0
 | ||||
| +        qemu-kvm -m 512 -object memory-backend-file,id=mem,size=512M,mem-path=/hugetlbfs,share=on \
 | ||||
| +                 -numa node,memdev=mem \
 | ||||
| +                 -chardev socket,id=chr0,path=/path/to/socket \
 | ||||
| +                 -netdev type=vhost-user,id=net0,chardev=chr0 \
 | ||||
| +                 -device virtio-net-pci,netdev=net0
 | ||||
|   | ||||
|  ``-netdev vhost-vdpa,vhostdev=/path/to/dev`` | ||||
|      Establish a vhost-vdpa netdev. | ||||
| -- 
 | ||||
| 2.27.0 | ||||
| 
 | ||||
| @ -0,0 +1,66 @@ | ||||
| From 41fe05330d095f69f12973b0540466439e030047 Mon Sep 17 00:00:00 2001 | ||||
| From: Fam Zheng <famz@redhat.com> | ||||
| Date: Wed, 14 Jun 2017 15:37:01 +0200 | ||||
| Subject: virtio-scsi: Reject scsi-cd if data plane enabled [RHEL only] | ||||
| 
 | ||||
| RH-Author: Fam Zheng <famz@redhat.com> | ||||
| Message-id: <20170614153701.14757-1-famz@redhat.com> | ||||
| Patchwork-id: 75613 | ||||
| O-Subject: [RHV-7.4 qemu-kvm-rhev PATCH v3] virtio-scsi: Reject scsi-cd if data plane enabled [RHEL only] | ||||
| Bugzilla: 1378816 | ||||
| RH-Acked-by: Paolo Bonzini <pbonzini@redhat.com> | ||||
| RH-Acked-by: Stefan Hajnoczi <stefanha@redhat.com> | ||||
| RH-Acked-by: Max Reitz <mreitz@redhat.com> | ||||
| 
 | ||||
| We need a fix for RHEL 7.4 and 7.3.z, but unfortunately upstream isn't | ||||
| ready. If it were, the changes will be too invasive. To have an idea: | ||||
| 
 | ||||
| https://lists.gnu.org/archive/html/qemu-devel/2017-05/msg05400.html | ||||
| 
 | ||||
| is an incomplete attempt to fix part of the issue, and the remaining | ||||
| work unfortunately involve even more complex changes. | ||||
| 
 | ||||
| As a band-aid, this partially reverts the effect of ef8875b | ||||
| (virtio-scsi: Remove op blocker for dataplane, since v2.7). We cannot | ||||
| simply revert that commit as a whole because we already shipped it in | ||||
| qemu-kvm-rhev 7.3, since when, block jobs has been possible.  We should | ||||
| only block what has been broken.  Also, faithfully reverting the above | ||||
| commit means adding back the removed op blocker, but that is not enough, | ||||
| because it still crashes when inserting media into an initially empty | ||||
| scsi-cd. | ||||
| 
 | ||||
| All in all, scsi-cd on virtio-scsi-dataplane has basically been unusable | ||||
| unless the scsi-cd never enters an empty state, so, disable it | ||||
| altogether.  Otherwise it would be much more difficult to avoid | ||||
| crashing. | ||||
| 
 | ||||
| Signed-off-by: Fam Zheng <famz@redhat.com> | ||||
| Signed-off-by: Miroslav Rezanina <mrezanin@redhat.com> | ||||
| Signed-off-by: Danilo C. L. de Paula <ddepaula@redhat.com> | ||||
| ---
 | ||||
|  hw/scsi/virtio-scsi.c | 9 +++++++++ | ||||
|  1 file changed, 9 insertions(+) | ||||
| 
 | ||||
| diff --git a/hw/scsi/virtio-scsi.c b/hw/scsi/virtio-scsi.c
 | ||||
| index 51fd09522a..a35257c35a 100644
 | ||||
| --- a/hw/scsi/virtio-scsi.c
 | ||||
| +++ b/hw/scsi/virtio-scsi.c
 | ||||
| @@ -896,6 +896,15 @@ static void virtio_scsi_hotplug(HotplugHandler *hotplug_dev, DeviceState *dev,
 | ||||
|      AioContext *old_context; | ||||
|      int ret; | ||||
|   | ||||
| +    /* XXX: Remove this check once block backend is capable of handling
 | ||||
| +     * AioContext change upon eject/insert.
 | ||||
| +     * s->ctx is NULL if ioeventfd is off, s->ctx is qemu_get_aio_context() if
 | ||||
| +     * data plane is not used, both cases are safe for scsi-cd. */
 | ||||
| +    if (s->ctx && s->ctx != qemu_get_aio_context() &&
 | ||||
| +        object_dynamic_cast(OBJECT(dev), "scsi-cd")) {
 | ||||
| +        error_setg(errp, "scsi-cd is not supported by data plane");
 | ||||
| +        return;
 | ||||
| +    }
 | ||||
|      if (s->ctx && !s->dataplane_fenced) { | ||||
|          if (blk_op_is_blocked(sd->conf.blk, BLOCK_OP_TYPE_DATAPLANE, errp)) { | ||||
|              return; | ||||
| -- 
 | ||||
| 2.27.0 | ||||
| 
 | ||||
| @ -0,0 +1,60 @@ | ||||
| From 295ee942608d48ab167aa76adabf3697c28e6910 Mon Sep 17 00:00:00 2001 | ||||
| From: David Gibson <dgibson@redhat.com> | ||||
| Date: Wed, 6 Feb 2019 03:58:56 +0000 | ||||
| Subject: BZ1653590: Require at least 64kiB pages for downstream guests & hosts | ||||
| 
 | ||||
| RH-Author: David Gibson <dgibson@redhat.com> | ||||
| Message-id: <20190206035856.19058-1-dgibson@redhat.com> | ||||
| Patchwork-id: 84246 | ||||
| O-Subject: [RHELAV-8.0/rhel qemu-kvm PATCH] BZ1653590: Require at least 64kiB pages for downstream guests & hosts | ||||
| Bugzilla: 1653590 | ||||
| RH-Acked-by: Laurent Vivier <lvivier@redhat.com> | ||||
| RH-Acked-by: Serhii Popovych <spopovyc@redhat.com> | ||||
| RH-Acked-by: Thomas Huth <thuth@redhat.com> | ||||
| 
 | ||||
| Most current POWER guests require 64kiB page support, so that's the default | ||||
| for the cap-hpt-max-pagesize option in qemu which limits available guest | ||||
| page sizes.  We warn if the value is set smaller than that, but don't | ||||
| outright fail upstream, because we need to allow for the possibility of | ||||
| guest (and/or host) kernels configured for 4kiB page sizes. | ||||
| 
 | ||||
| Downstream, however, we simply don't support 4kiB pagesize configured | ||||
| kernels in guest or host, so we can have qemu simply error out in this | ||||
| situation. | ||||
| 
 | ||||
| Testing: Attempted to start a guest with cap-hpt-max-page-size=4k and verified | ||||
|          it failed immediately with a qemu error | ||||
| 
 | ||||
| Signed-off-by: David Gibson <dgibson@redhat.com> | ||||
| Signed-off-by: Danilo C. L. de Paula <ddepaula@redhat.com> | ||||
| ---
 | ||||
|  hw/ppc/spapr_caps.c | 7 +++++++ | ||||
|  1 file changed, 7 insertions(+) | ||||
| 
 | ||||
| diff --git a/hw/ppc/spapr_caps.c b/hw/ppc/spapr_caps.c
 | ||||
| index ed7c077a0d..48a8efe678 100644
 | ||||
| --- a/hw/ppc/spapr_caps.c
 | ||||
| +++ b/hw/ppc/spapr_caps.c
 | ||||
| @@ -332,12 +332,19 @@ bool spapr_check_pagesize(SpaprMachineState *spapr, hwaddr pagesize,
 | ||||
|  static void cap_hpt_maxpagesize_apply(SpaprMachineState *spapr, | ||||
|                                        uint8_t val, Error **errp) | ||||
|  { | ||||
| +#if 0 /* disabled for RHEL */
 | ||||
|      if (val < 12) { | ||||
|          error_setg(errp, "Require at least 4kiB hpt-max-page-size"); | ||||
|          return; | ||||
|      } else if (val < 16) { | ||||
|          warn_report("Many guests require at least 64kiB hpt-max-page-size"); | ||||
|      } | ||||
| +#else /* Only page sizes >=64kiB supported for RHEL */
 | ||||
| +    if (val < 16) {
 | ||||
| +        error_setg(errp, "Require at least 64kiB hpt-max-page-size");
 | ||||
| +        return;
 | ||||
| +    }
 | ||||
| +#endif
 | ||||
|   | ||||
|      spapr_check_pagesize(spapr, qemu_minrampagesize(), errp); | ||||
|  } | ||||
| -- 
 | ||||
| 2.27.0 | ||||
| 
 | ||||
| @ -0,0 +1,77 @@ | ||||
| From a3bb2330bbf68faabc57b768cdf3ae2f4f4d86f3 Mon Sep 17 00:00:00 2001 | ||||
| From: Kevin Wolf <kwolf@redhat.com> | ||||
| Date: Fri, 20 Aug 2021 18:25:12 +0200 | ||||
| Subject: qcow2: Deprecation warning when opening v2 images rw | ||||
| MIME-Version: 1.0 | ||||
| Content-Type: text/plain; charset=UTF-8 | ||||
| Content-Transfer-Encoding: 8bit | ||||
| 
 | ||||
| RH-Author: Kevin Wolf <kwolf@redhat.com> | ||||
| RH-MergeRequest: 37: qcow2: Deprecation warning when opening v2 images rw | ||||
| RH-Commit: [1/1] f450d0ae32d35063b28c72c4f2d2ebb9e6d8db3e (kmwolf/centos-qemu-kvm) | ||||
| RH-Bugzilla: 1951814 | ||||
| RH-Acked-by: Stefan Hajnoczi <stefanha@redhat.com> | ||||
| RH-Acked-by: Hanna Reitz <hreitz@redhat.com> | ||||
| RH-Acked-by: Thomas Huth <thuth@redhat.com> | ||||
| RH-Acked-by: Philippe Mathieu-Daudé <philmd@redhat.com> | ||||
| 
 | ||||
| qcow2 v3 has been around for a long time (since QEMU 1.1/RHEL 7), so | ||||
| there is no real reason any more to use it. People still using it might | ||||
| do so unintentionally. Warn about it and suggest upgrading during the | ||||
| RHEL 9 timeframe so that the code can possibly be disabled in RHEL 10. | ||||
| 
 | ||||
| The warning is restricted to read-write mode and the system emulator. | ||||
| The primary motivation for not having it in qemu-img is that 'qemu-img | ||||
| amend' for upgrades would warn otherwise. It also avoids having to make | ||||
| too many changes to the test suite. | ||||
| 
 | ||||
| bdrv_uses_whitelist() is used as a proxy for deciding whether we are | ||||
| running in a tool or the system emulator. This is not entirely clean, | ||||
| but it's what is available and the same function qcow2_do_open() already | ||||
| uses it this way for another warning. | ||||
| 
 | ||||
| Signed-off-by: Kevin Wolf <kwolf@redhat.com> | ||||
| 
 | ||||
| patch_name: kvm-qcow2-Deprecation-warning-when-opening-v2-images-rw.patch | ||||
| present_in_specfile: true | ||||
| location_in_specfile: 116 | ||||
| ---
 | ||||
| Rebase notes (6.1.0): | ||||
| - Replace bs->read_only with bdrv_is_read_only
 | ||||
| ---
 | ||||
|  block/qcow2.c                    | 6 ++++++ | ||||
|  tests/qemu-iotests/common.filter | 1 + | ||||
|  2 files changed, 7 insertions(+) | ||||
| 
 | ||||
| diff --git a/block/qcow2.c b/block/qcow2.c
 | ||||
| index d509016756..37d1c26a71 100644
 | ||||
| --- a/block/qcow2.c
 | ||||
| +++ b/block/qcow2.c
 | ||||
| @@ -1336,6 +1336,12 @@ static int coroutine_fn qcow2_do_open(BlockDriverState *bs, QDict *options,
 | ||||
|          ret = -ENOTSUP; | ||||
|          goto fail; | ||||
|      } | ||||
| +    if (header.version < 3 && !bdrv_is_read_only(bs) && bdrv_uses_whitelist()) {
 | ||||
| +        warn_report_once("qcow2 v2 images are deprecated and may not be "
 | ||||
| +                         "supported in future versions. Please consider "
 | ||||
| +                         "upgrading the image with 'qemu-img amend "
 | ||||
| +                         "-o compat=v3'.");
 | ||||
| +    }
 | ||||
|   | ||||
|      s->qcow_version = header.version; | ||||
|   | ||||
| diff --git a/tests/qemu-iotests/common.filter b/tests/qemu-iotests/common.filter
 | ||||
| index 2b2b53946c..c5c2dc39bd 100644
 | ||||
| --- a/tests/qemu-iotests/common.filter
 | ||||
| +++ b/tests/qemu-iotests/common.filter
 | ||||
| @@ -82,6 +82,7 @@ _filter_qemu()
 | ||||
|  { | ||||
|      $SED -e "s#\\(^\\|(qemu) \\)$(basename $QEMU_PROG):#\1QEMU_PROG:#" \ | ||||
|          -e 's#^QEMU [0-9]\+\.[0-9]\+\.[0-9]\+ monitor#QEMU X.Y.Z monitor#' \ | ||||
| +        -e "/qcow2 v2 images are deprecated/d" \
 | ||||
|          -e $'s#\r##' # QEMU monitor uses \r\n line endings | ||||
|  } | ||||
|   | ||||
| -- 
 | ||||
| 2.27.0 | ||||
| 
 | ||||
							
								
								
									
										46
									
								
								SOURCES/0020-Fix-virtio-net-pci-vectors-compat.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										46
									
								
								SOURCES/0020-Fix-virtio-net-pci-vectors-compat.patch
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,46 @@ | ||||
| From ef5afcc86dc44d1c9d3030a8ceca2018df86c6ec Mon Sep 17 00:00:00 2001 | ||||
| From: Eduardo Habkost <ehabkost@redhat.com> | ||||
| Date: Tue, 19 Oct 2021 13:17:06 -0400 | ||||
| Subject: Fix virtio-net-pci* "vectors" compat | ||||
| 
 | ||||
| RH-Author: Dr. David Alan Gilbert <dgilbert@redhat.com> | ||||
| RH-MergeRequest: 76: 9.0/6.2.0-rc1 x86 machine type fixes | ||||
| RH-Commit: [20/22] ebb570f053f96d3558bac49962dc7dc88296c207 | ||||
| RH-Bugzilla: 2025468 | ||||
| RH-Acked-by: quintela1 <quintela@redhat.com> | ||||
| RH-Acked-by: Vitaly Kuznetsov <vkuznets@redhat.com> | ||||
| RH-Acked-by: Cornelia Huck <cohuck@redhat.com> | ||||
| 
 | ||||
| hw_compat_rhel_8_4 has an issue: it affects only "virtio-net-pci" | ||||
| but not "virtio-net-pci-transitional" and | ||||
| "virtio-net-pci-non-transitional".  The solution is to use the | ||||
| "virtio-net-pci-base" type in compat_props. | ||||
| 
 | ||||
| An equivalent fix will be submitted for hw_compat_5_2 upstream. | ||||
| 
 | ||||
| Signed-off-by: Eduardo Habkost <ehabkost@redhat.com> | ||||
| (cherry picked from commit d45823ab0d0138b2fbaf2ed1e1896d2052f3ccb3) | ||||
| ---
 | ||||
|  hw/core/machine.c | 6 +++++- | ||||
|  1 file changed, 5 insertions(+), 1 deletion(-) | ||||
| 
 | ||||
| diff --git a/hw/core/machine.c b/hw/core/machine.c
 | ||||
| index 53a3caf4fb..448a8dd127 100644
 | ||||
| --- a/hw/core/machine.c
 | ||||
| +++ b/hw/core/machine.c
 | ||||
| @@ -69,7 +69,11 @@ GlobalProperty hw_compat_rhel_8_4[] = {
 | ||||
|      /* hw_compat_rhel_8_4 from hw_compat_5_2 */ | ||||
|      { "virtio-blk-device", "report-discard-granularity", "off" }, | ||||
|      /* hw_compat_rhel_8_4 from hw_compat_5_2 */ | ||||
| -    { "virtio-net-pci", "vectors", "3"},
 | ||||
| +    /*
 | ||||
| +     * Upstream incorrectly had "virtio-net-pci" instead of "virtio-net-pci-base",
 | ||||
| +     * (https://bugzilla.redhat.com/show_bug.cgi?id=1999141)
 | ||||
| +     */
 | ||||
| +    { "virtio-net-pci-base", "vectors", "3"},
 | ||||
|  }; | ||||
|  const size_t hw_compat_rhel_8_4_len = G_N_ELEMENTS(hw_compat_rhel_8_4); | ||||
|   | ||||
| -- 
 | ||||
| 2.27.0 | ||||
| 
 | ||||
| @ -0,0 +1,75 @@ | ||||
| From eae7d8dd3c3b9aa859a619933f52a4759a42bf66 Mon Sep 17 00:00:00 2001 | ||||
| From: "Dr. David Alan Gilbert" <dgilbert@redhat.com> | ||||
| Date: Tue, 23 Nov 2021 17:57:42 +0000 | ||||
| Subject: x86/rhel machine types: Add pc_rhel_8_5_compat | ||||
| 
 | ||||
| RH-Author: Dr. David Alan Gilbert <dgilbert@redhat.com> | ||||
| RH-MergeRequest: 76: 9.0/6.2.0-rc1 x86 machine type fixes | ||||
| RH-Commit: [21/22] dd23060695bc0ad892bbfa51d93afe31f5d745c7 | ||||
| RH-Bugzilla: 2025468 | ||||
| RH-Acked-by: quintela1 <quintela@redhat.com> | ||||
| RH-Acked-by: Vitaly Kuznetsov <vkuznets@redhat.com> | ||||
| RH-Acked-by: Cornelia Huck <cohuck@redhat.com> | ||||
| 
 | ||||
| Add pc_rhel_8_5_compat as the merge of pc_compat_6_1 and pc_compat_6_0 | ||||
| (since 8.5 was based on 6.0). | ||||
| 
 | ||||
| Note, x-keep-pci-slot-hpc flipped back and forward, leaving it out | ||||
| looks like it leaves us with the original. | ||||
| 
 | ||||
| Signed-off-by: Dr. David Alan Gilbert <dgilbert@redhat.com> | ||||
| Signed-off-by: Miroslav Rezanina <mrezanin@redhat.com> | ||||
| ---
 | ||||
|  hw/i386/pc.c         | 21 +++++++++++++++++++++ | ||||
|  include/hw/i386/pc.h |  3 +++ | ||||
|  2 files changed, 24 insertions(+) | ||||
| 
 | ||||
| diff --git a/hw/i386/pc.c b/hw/i386/pc.c
 | ||||
| index b6d2db8d04..4661473d2a 100644
 | ||||
| --- a/hw/i386/pc.c
 | ||||
| +++ b/hw/i386/pc.c
 | ||||
| @@ -387,6 +387,27 @@ GlobalProperty pc_rhel_compat[] = {
 | ||||
|  }; | ||||
|  const size_t pc_rhel_compat_len = G_N_ELEMENTS(pc_rhel_compat); | ||||
|   | ||||
| +GlobalProperty pc_rhel_8_5_compat[] = {
 | ||||
| +    /* pc_rhel_8_5_compat from pc_compat_6_0 */
 | ||||
| +    { "qemu64" "-" TYPE_X86_CPU, "family", "6" },
 | ||||
| +    /* pc_rhel_8_5_compat from pc_compat_6_0 */
 | ||||
| +    { "qemu64" "-" TYPE_X86_CPU, "model", "6" },
 | ||||
| +    /* pc_rhel_8_5_compat from pc_compat_6_0 */
 | ||||
| +    { "qemu64" "-" TYPE_X86_CPU, "stepping", "3" },
 | ||||
| +    /* pc_rhel_8_5_compat from pc_compat_6_0 */
 | ||||
| +    { TYPE_X86_CPU, "x-vendor-cpuid-only", "off" },
 | ||||
| +    /* pc_rhel_8_5_compat from pc_compat_6_0 */
 | ||||
| +    { "ICH9-LPC", ACPI_PM_PROP_ACPI_PCIHP_BRIDGE, "off" },
 | ||||
| +
 | ||||
| +    /* pc_rhel_8_5_compat from pc_compat_6_1 */
 | ||||
| +    { TYPE_X86_CPU, "hv-version-id-build", "0x1bbc" },
 | ||||
| +    /* pc_rhel_8_5_compat from pc_compat_6_1 */
 | ||||
| +    { TYPE_X86_CPU, "hv-version-id-major", "0x0006" },
 | ||||
| +    /* pc_rhel_8_5_compat from pc_compat_6_1 */
 | ||||
| +    { TYPE_X86_CPU, "hv-version-id-minor", "0x0001" },
 | ||||
| +};
 | ||||
| +const size_t pc_rhel_8_5_compat_len = G_N_ELEMENTS(pc_rhel_8_5_compat);
 | ||||
| +
 | ||||
|  GlobalProperty pc_rhel_8_4_compat[] = { | ||||
|      /* pc_rhel_8_4_compat from pc_compat_5_2 */ | ||||
|      { "ICH9-LPC", "x-smi-cpu-hotunplug", "off" }, | ||||
| diff --git a/include/hw/i386/pc.h b/include/hw/i386/pc.h
 | ||||
| index 9689a58b14..afb570ba14 100644
 | ||||
| --- a/include/hw/i386/pc.h
 | ||||
| +++ b/include/hw/i386/pc.h
 | ||||
| @@ -283,6 +283,9 @@ extern const size_t pc_compat_1_4_len;
 | ||||
|  extern GlobalProperty pc_rhel_compat[]; | ||||
|  extern const size_t pc_rhel_compat_len; | ||||
|   | ||||
| +extern GlobalProperty pc_rhel_8_5_compat[];
 | ||||
| +extern const size_t pc_rhel_8_5_compat_len;
 | ||||
| +
 | ||||
|  extern GlobalProperty pc_rhel_8_4_compat[]; | ||||
|  extern const size_t pc_rhel_8_4_compat_len; | ||||
|   | ||||
| -- 
 | ||||
| 2.27.0 | ||||
| 
 | ||||
| @ -0,0 +1,55 @@ | ||||
| From 6762f5646943c759ece5972f08eb88364cf0a8ad Mon Sep 17 00:00:00 2001 | ||||
| From: "Dr. David Alan Gilbert" <dgilbert@redhat.com> | ||||
| Date: Tue, 23 Nov 2021 18:07:49 +0000 | ||||
| Subject: x86/rhel machine types: Wire compat into q35 and i440fx | ||||
| 
 | ||||
| RH-Author: Dr. David Alan Gilbert <dgilbert@redhat.com> | ||||
| RH-MergeRequest: 76: 9.0/6.2.0-rc1 x86 machine type fixes | ||||
| RH-Commit: [22/22] e2767df0d920773057cb52d346e0106a76cb0a28 | ||||
| RH-Bugzilla: 2025468 | ||||
| RH-Acked-by: quintela1 <quintela@redhat.com> | ||||
| RH-Acked-by: Vitaly Kuznetsov <vkuznets@redhat.com> | ||||
| RH-Acked-by: Cornelia Huck <cohuck@redhat.com> | ||||
| Wire the pc_rhel_8_5 compat data into both piix and q35 | ||||
| to keep the existing machine types compatible. | ||||
| 
 | ||||
| Signed-off-by: Dr. David Alan Gilbert <dgilbert@redhat.com> | ||||
| Signed-off-by: Miroslav Rezanina <mrezanin@redhat.com> | ||||
| ---
 | ||||
|  hw/i386/pc_piix.c | 4 ++++ | ||||
|  hw/i386/pc_q35.c  | 4 ++++ | ||||
|  2 files changed, 8 insertions(+) | ||||
| 
 | ||||
| diff --git a/hw/i386/pc_piix.c b/hw/i386/pc_piix.c
 | ||||
| index dabc6c1933..183b5d5464 100644
 | ||||
| --- a/hw/i386/pc_piix.c
 | ||||
| +++ b/hw/i386/pc_piix.c
 | ||||
| @@ -993,6 +993,10 @@ static void pc_machine_rhel760_options(MachineClass *m)
 | ||||
|      pcmc->kvmclock_create_always = false; | ||||
|      /* From pc_i440fx_5_1_machine_options() */ | ||||
|      pcmc->pci_root_uid = 1; | ||||
| +    compat_props_add(m->compat_props, hw_compat_rhel_8_5,
 | ||||
| +                     hw_compat_rhel_8_5_len);
 | ||||
| +    compat_props_add(m->compat_props, pc_rhel_8_5_compat,
 | ||||
| +                     pc_rhel_8_5_compat_len);
 | ||||
|      compat_props_add(m->compat_props, hw_compat_rhel_8_4, | ||||
|                       hw_compat_rhel_8_4_len); | ||||
|      compat_props_add(m->compat_props, pc_rhel_8_4_compat, | ||||
| diff --git a/hw/i386/pc_q35.c b/hw/i386/pc_q35.c
 | ||||
| index 04c911da18..0e7e885e78 100644
 | ||||
| --- a/hw/i386/pc_q35.c
 | ||||
| +++ b/hw/i386/pc_q35.c
 | ||||
| @@ -658,6 +658,10 @@ static void pc_q35_machine_rhel850_options(MachineClass *m)
 | ||||
|      m->desc = "RHEL-8.5.0 PC (Q35 + ICH9, 2009)"; | ||||
|      pcmc->smbios_stream_product = "RHEL-AV"; | ||||
|      pcmc->smbios_stream_version = "8.5.0"; | ||||
| +    compat_props_add(m->compat_props, hw_compat_rhel_8_5,
 | ||||
| +                     hw_compat_rhel_8_5_len);
 | ||||
| +    compat_props_add(m->compat_props, pc_rhel_8_5_compat,
 | ||||
| +                     pc_rhel_8_5_compat_len);
 | ||||
|  } | ||||
|   | ||||
|  DEFINE_PC_MACHINE(q35_rhel850, "pc-q35-rhel8.5.0", pc_q35_init_rhel850, | ||||
| -- 
 | ||||
| 2.27.0 | ||||
| 
 | ||||
| @ -0,0 +1,50 @@ | ||||
| From 3b82be3dd3d5254baedf82ba2a6cf0412e84a991 Mon Sep 17 00:00:00 2001 | ||||
| From: Eric Auger <eric.auger@redhat.com> | ||||
| Date: Tue, 16 Nov 2021 17:03:07 +0100 | ||||
| Subject: redhat: virt-rhel8.5.0: Update machine type compatibility for QEMU | ||||
|  6.2.0 update | ||||
| 
 | ||||
| RH-Author: Eric Auger <eric.auger@redhat.com> | ||||
| RH-MergeRequest: 75: redhat: virt-rhel8.5.0: Update machine type compatibility for QEMU 6.2.0 update | ||||
| RH-Commit: [21/21] f027d13654944e3d34e3356affe7af952eec2bed | ||||
| RH-Bugzilla: 2022607 | ||||
| RH-Acked-by: Gavin Shan <gshan@redhat.com> | ||||
| RH-Acked-by: Miroslav Rezanina <mrezanin@redhat.com> | ||||
| RH-Acked-by: Andrew Jones <drjones@redhat.com> | ||||
| RH-Acked-by: Cornelia Huck <cohuck@redhat.com> | ||||
| RH-Acked-by: Laurent Vivier <lvivier@redhat.com> | ||||
| 
 | ||||
| To keep compatibility with 8.5-AV machine type we need to | ||||
| turn few new options on by default: | ||||
| smp_props.prefer_sockets, no_cpu_topology, no_tcg_its | ||||
| 
 | ||||
| TESTED: migrate from rhel-av-8.5.0 to rhel-8.6.0 and vice-versa | ||||
| with upstream fix: 33a0c404fb  hw/intc/arm_gicv3_its: Revert version | ||||
| increments in vmstate_its | ||||
| 
 | ||||
| Signed-off-by: Eric Auger <eric.auger@redhat.com> | ||||
| Signed-off-by: Miroslav Rezanina <mrezanin@redhat.com> | ||||
| ---
 | ||||
|  hw/arm/virt.c | 5 +++++ | ||||
|  1 file changed, 5 insertions(+) | ||||
| 
 | ||||
| diff --git a/hw/arm/virt.c b/hw/arm/virt.c
 | ||||
| index 7d51824263..6ba9a2c2e1 100644
 | ||||
| --- a/hw/arm/virt.c
 | ||||
| +++ b/hw/arm/virt.c
 | ||||
| @@ -3230,7 +3230,12 @@ type_init(rhel_machine_init);
 | ||||
|   | ||||
|  static void rhel850_virt_options(MachineClass *mc) | ||||
|  { | ||||
| +    VirtMachineClass *vmc = VIRT_MACHINE_CLASS(OBJECT_CLASS(mc));
 | ||||
| +
 | ||||
|      compat_props_add(mc->compat_props, arm_rhel_compat, arm_rhel_compat_len); | ||||
|      compat_props_add(mc->compat_props, hw_compat_rhel_8_5, hw_compat_rhel_8_5_len); | ||||
| +    mc->smp_props.prefer_sockets = true;
 | ||||
| +    vmc->no_cpu_topology = true;
 | ||||
| +    vmc->no_tcg_its = true;
 | ||||
|  } | ||||
|  DEFINE_RHEL_MACHINE_AS_LATEST(8, 5, 0) | ||||
| -- 
 | ||||
| 2.27.0 | ||||
| 
 | ||||
| @ -0,0 +1,58 @@ | ||||
| From e6ff4de4f7036f88ee63adad6de5ee5dd74f1d99 Mon Sep 17 00:00:00 2001 | ||||
| From: Thomas Huth <thuth@redhat.com> | ||||
| Date: Fri, 26 Nov 2021 09:37:11 +0100 | ||||
| Subject: redhat: Add s390x machine type compatibility handling for the rebase | ||||
|  to v6.2 | ||||
| 
 | ||||
| RH-Author: Thomas Huth <thuth@redhat.com> | ||||
| RH-MergeRequest: 80: Add s390x machine type compatibility handling for the rebase to v6.2 | ||||
| RH-Commit: [26/26] c45cf594604f6dd23954696b9c84d2025e328d11 | ||||
| RH-Bugzilla: 2022602 | ||||
| RH-Acked-by: David Hildenbrand <david@redhat.com> | ||||
| RH-Acked-by: Laurent Vivier <lvivier@redhat.com> | ||||
| RH-Acked-by: Cornelia Huck <cohuck@redhat.com> | ||||
| 
 | ||||
| Add compatibility handling for the rhel8.5.0 machine type (and | ||||
| recursively older, of course). | ||||
| 
 | ||||
| Based on the following upstream commits: | ||||
| 
 | ||||
|  463e50da8b - s390x/cpumodel: Bump up QEMU model to a stripped-down IBM z14 GA2 | ||||
|  30e398f796 - s390x/cpumodel: Add more feature to gen16 default model | ||||
|  4a0af2930a - machine: Prefer cores over sockets in smp parsing since 6.2 | ||||
|  2b52619994 - machine: Move smp_prefer_sockets to struct SMPCompatProps | ||||
| 
 | ||||
| Signed-off-by: Thomas Huth <thuth@redhat.com> | ||||
| ---
 | ||||
|  hw/s390x/s390-virtio-ccw.c | 10 ++++++++++ | ||||
|  1 file changed, 10 insertions(+) | ||||
| 
 | ||||
| diff --git a/hw/s390x/s390-virtio-ccw.c b/hw/s390x/s390-virtio-ccw.c
 | ||||
| index 4af14cb9ca..c654045964 100644
 | ||||
| --- a/hw/s390x/s390-virtio-ccw.c
 | ||||
| +++ b/hw/s390x/s390-virtio-ccw.c
 | ||||
| @@ -1105,11 +1105,21 @@ DEFINE_CCW_MACHINE(2_4, "2.4", false);
 | ||||
|   | ||||
|  static void ccw_machine_rhel850_instance_options(MachineState *machine) | ||||
|  { | ||||
| +    static const S390FeatInit qemu_cpu_feat = { S390_FEAT_LIST_QEMU_V6_0 };
 | ||||
| +
 | ||||
| +    s390_set_qemu_cpu_model(0x2964, 13, 2, qemu_cpu_feat);
 | ||||
| +
 | ||||
| +    s390_cpudef_featoff_greater(16, 1, S390_FEAT_NNPA);
 | ||||
| +    s390_cpudef_featoff_greater(16, 1, S390_FEAT_VECTOR_PACKED_DECIMAL_ENH2);
 | ||||
| +    s390_cpudef_featoff_greater(16, 1, S390_FEAT_BEAR_ENH);
 | ||||
| +    s390_cpudef_featoff_greater(16, 1, S390_FEAT_RDP);
 | ||||
| +    s390_cpudef_featoff_greater(16, 1, S390_FEAT_PAI);
 | ||||
|  } | ||||
|   | ||||
|  static void ccw_machine_rhel850_class_options(MachineClass *mc) | ||||
|  { | ||||
|      compat_props_add(mc->compat_props, hw_compat_rhel_8_5, hw_compat_rhel_8_5_len); | ||||
| +    mc->smp_props.prefer_sockets = true;
 | ||||
|  } | ||||
|  DEFINE_CCW_MACHINE(rhel850, "rhel8.5.0", true); | ||||
|   | ||||
| -- 
 | ||||
| 2.27.0 | ||||
| 
 | ||||
| @ -0,0 +1,31 @@ | ||||
| From 168f0d56e3a37a7d5fcc59483e2b1181824a23d2 Mon Sep 17 00:00:00 2001 | ||||
| From: Miroslav Rezanina <mrezanin@redhat.com> | ||||
| Date: Wed, 24 Nov 2021 23:51:52 -0500 | ||||
| Subject: compat: Update hw_compat_rhel_8_5 with 6.2.0 RC2 changes | ||||
| 
 | ||||
| In RC2 nvme-ns 'shared' default was changed (commit 916b0f0b52). | ||||
| 
 | ||||
| Adding compat record for RHEL 8.5.0 so we keep it off for downstream | ||||
| machinetypes. | ||||
| 
 | ||||
| Signed-off-by: Miroslav Rezanina <mrezanin@redhat.com> | ||||
| ---
 | ||||
|  hw/core/machine.c | 2 ++ | ||||
|  1 file changed, 2 insertions(+) | ||||
| 
 | ||||
| diff --git a/hw/core/machine.c b/hw/core/machine.c
 | ||||
| index 448a8dd127..669d3d8b91 100644
 | ||||
| --- a/hw/core/machine.c
 | ||||
| +++ b/hw/core/machine.c
 | ||||
| @@ -55,6 +55,8 @@ GlobalProperty hw_compat_rhel_8_5[] = {
 | ||||
|      { "vhost-vsock-device", "seqpacket", "off" }, | ||||
|      /* hw_compat_rhel_8_5 from hw_compat_6_1 */ | ||||
|      { "vhost-user-vsock-device", "seqpacket", "off" }, | ||||
| +    /* hw_compat_rhel_8_5 from hw_compat_6_1 */
 | ||||
| +    { "nvme-ns", "shared", "off" },
 | ||||
|  }; | ||||
|  const size_t hw_compat_rhel_8_5_len = G_N_ELEMENTS(hw_compat_rhel_8_5); | ||||
|   | ||||
| -- 
 | ||||
| 2.27.0 | ||||
| 
 | ||||
							
								
								
									
										10
									
								
								SOURCES/95-kvm-memlock.conf
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										10
									
								
								SOURCES/95-kvm-memlock.conf
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,10 @@ | ||||
| # The KVM HV implementation on Power can require a significant amount | ||||
| # of unswappable memory (about half of which also needs to be host | ||||
| # physically contiguous) to hold the guest's Hash Page Table (HPT) - | ||||
| # roughly 1/64th of the guest's RAM size, minimum 16MiB. | ||||
| # | ||||
| # These limits allow unprivileged users to start smallish VMs, such as | ||||
| # those used by libguestfs. | ||||
| # | ||||
| *	hard	memlock		65536 | ||||
| *	soft	memlock		65536 | ||||
							
								
								
									
										2
									
								
								SOURCES/99-qemu-guest-agent.rules
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										2
									
								
								SOURCES/99-qemu-guest-agent.rules
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,2 @@ | ||||
| SUBSYSTEM=="virtio-ports", ATTR{name}=="org.qemu.guest_agent.0", \ | ||||
|   TAG+="systemd" ENV{SYSTEMD_WANTS}="qemu-guest-agent.service" | ||||
							
								
								
									
										39
									
								
								SOURCES/README.tests
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										39
									
								
								SOURCES/README.tests
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,39 @@ | ||||
| qemu-kvm-tests README | ||||
| ===================== | ||||
| 
 | ||||
| The qemu-kvm-tests rpm contains tests that can be used to verify the | ||||
| functionality of the installed qemu-kvm package | ||||
| 
 | ||||
| When installed, the files from this rpm will be arranged in the following | ||||
| directory structure | ||||
| 
 | ||||
| tests-src/ | ||||
| ├── README | ||||
| ├── scripts | ||||
| │   ├── qemu.py | ||||
| │   └── qmp | ||||
| └── tests | ||||
|     ├── acceptance | ||||
|     ├── Makefile.include | ||||
|     └── qemu-iotests | ||||
| 
 | ||||
| The tests/ directory within the tests-src/ directory is setup to remain a copy | ||||
| of a subset of the tests/ directory from the QEMU source tree | ||||
| 
 | ||||
| The avocado_qemu tests and qemu-iotests, along with files required for the | ||||
| execution of the avocado_qemu tests (scripts/qemu.py and scripts/qmp/) will be | ||||
| installed in a new location - /usr/lib64/qemu-kvm/tests-src/ | ||||
| 
 | ||||
| avocado_qemu tests: | ||||
| The avocado_qemu tests can be executed by running the following avocado command: | ||||
| avocado run -p qemu_bin=/usr/libexec/qemu-kvm /usr/lib64/qemu-kvm/tests/acceptance/ | ||||
| Avocado needs to be installed separately using either pip or from source as | ||||
| Avocado is not being packaged for RHEL-8. | ||||
| 
 | ||||
| qemu-iotests: | ||||
| symlinks to corresponding binaries need to be created for QEMU_PROG, | ||||
| QEMU_IO_PROG, QEMU_IMG_PROG, and QEMU_NBD_PROG before the iotests can be | ||||
| executed. | ||||
| 
 | ||||
| The primary purpose of this package is to make these tests available to be | ||||
| executed as gating tests for the virt module in the RHEL-8 OSCI environment. | ||||
							
								
								
									
										1
									
								
								SOURCES/bridge.conf
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								SOURCES/bridge.conf
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1 @@ | ||||
| allow virbr0 | ||||
							
								
								
									
										28
									
								
								SOURCES/kvm-Enable-SGX-RH-Only.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										28
									
								
								SOURCES/kvm-Enable-SGX-RH-Only.patch
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,28 @@ | ||||
| From f4f7c62a4658a570d3ad694b64463665fa4b80a7 Mon Sep 17 00:00:00 2001 | ||||
| From: Paul Lai <plai@redhat.com> | ||||
| Date: Fri, 21 Jan 2022 13:14:42 -0500 | ||||
| Subject: [PATCH 04/12] Enable SGX  -- RH Only | ||||
| 
 | ||||
| RH-Author: Paul Lai <plai@redhat.com> | ||||
| RH-MergeRequest: 65: Enable SGX and add SGX Numa support | ||||
| RH-Commit: [4/5] 2cd4ee4a429f5e7b1c32e83a10bf488503603795 | ||||
| RH-Bugzilla: 2033708 | ||||
| RH-Acked-by: Paolo Bonzini <None> | ||||
| RH-Acked-by: Bandan Das <None> | ||||
| RH-Acked-by: Cornelia Huck <cohuck@redhat.com> | ||||
| ---
 | ||||
|  configs/devices/x86_64-softmmu/x86_64-rh-devices.mak | 1 + | ||||
|  1 file changed, 1 insertion(+) | ||||
| 
 | ||||
| diff --git a/configs/devices/x86_64-softmmu/x86_64-rh-devices.mak b/configs/devices/x86_64-softmmu/x86_64-rh-devices.mak
 | ||||
| index dc03fbb671..327b1bee62 100644
 | ||||
| --- a/configs/devices/x86_64-softmmu/x86_64-rh-devices.mak
 | ||||
| +++ b/configs/devices/x86_64-softmmu/x86_64-rh-devices.mak
 | ||||
| @@ -101,3 +101,4 @@ CONFIG_TPM=y
 | ||||
|  CONFIG_TPM_CRB=y | ||||
|  CONFIG_TPM_TIS_ISA=y | ||||
|  CONFIG_TPM_EMULATOR=y | ||||
| +CONFIG_SGX=y
 | ||||
| -- 
 | ||||
| 2.27.0 | ||||
| 
 | ||||
							
								
								
									
										110
									
								
								SOURCES/kvm-RHEL-mark-old-machine-types-as-deprecated.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										110
									
								
								SOURCES/kvm-RHEL-mark-old-machine-types-as-deprecated.patch
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,110 @@ | ||||
| From dcc64971bf25e5c2303d551fb2fef448a5e8f4fd Mon Sep 17 00:00:00 2001 | ||||
| From: Cornelia Huck <cohuck@redhat.com> | ||||
| Date: Thu, 3 Mar 2022 10:57:37 +0100 | ||||
| Subject: [PATCH 1/5] RHEL: mark old machine types as deprecated | ||||
| MIME-Version: 1.0 | ||||
| Content-Type: text/plain; charset=UTF-8 | ||||
| Content-Transfer-Encoding: 8bit | ||||
| 
 | ||||
| RH-Author: Cornelia Huck <cohuck@redhat.com> | ||||
| RH-MergeRequest: 119: RHEL: mark old machine types as deprecated | ||||
| RH-Commit: [1/1] 5d7531d23fac5dd67c3cc202f538b25f26393600 (cohuck/qemu-kvm) | ||||
| RH-Bugzilla: 2052050 | ||||
| RH-Acked-by: Thomas Huth <thuth@redhat.com> | ||||
| RH-Acked-by: Dr. David Alan Gilbert <dgilbert@redhat.com> | ||||
| RH-Acked-by: Daniel P. Berrangé <berrange@redhat.com> | ||||
| 
 | ||||
| We want to make it obvious that we consider machine types for older | ||||
| RHEL major releases to be deprecated; we only carry them for | ||||
| compatibility purposes. | ||||
| 
 | ||||
| Let's mark all rhel-7.x and rhel-8.x machine type as deprecated via | ||||
| QEMU's existing deprecation mechanism; those machine types will | ||||
| continue to work as expected, but commands like 'virsh capabilities', | ||||
| 'virsh dominfo', or the libvirt log will tag the machine as | ||||
| deprecated. | ||||
| 
 | ||||
| Signed-off-by: Cornelia Huck <cohuck@redhat.com> | ||||
| ---
 | ||||
|  hw/core/machine.c          | 6 ++++++ | ||||
|  hw/i386/pc_piix.c          | 4 ++++ | ||||
|  hw/i386/pc_q35.c           | 4 ++++ | ||||
|  hw/s390x/s390-virtio-ccw.c | 3 +++ | ||||
|  include/hw/boards.h        | 2 ++ | ||||
|  5 files changed, 19 insertions(+) | ||||
| 
 | ||||
| diff --git a/hw/core/machine.c b/hw/core/machine.c
 | ||||
| index 669d3d8b91..5fae55d6cd 100644
 | ||||
| --- a/hw/core/machine.c
 | ||||
| +++ b/hw/core/machine.c
 | ||||
| @@ -37,6 +37,12 @@
 | ||||
|  #include "hw/virtio/virtio.h" | ||||
|  #include "hw/virtio/virtio-pci.h" | ||||
|   | ||||
| +/*
 | ||||
| + * RHEL only: machine types for previous major releases are deprecated
 | ||||
| + */
 | ||||
| +const char *rhel_old_machine_deprecation =
 | ||||
| +    "machine types for previous major releases are deprecated";
 | ||||
| +
 | ||||
|  /* | ||||
|   * Mostly the same as hw_compat_6_0 and hw_compat_6_1 | ||||
|   */ | ||||
| diff --git a/hw/i386/pc_piix.c b/hw/i386/pc_piix.c
 | ||||
| index fccb7f5fc9..cf68d7498c 100644
 | ||||
| --- a/hw/i386/pc_piix.c
 | ||||
| +++ b/hw/i386/pc_piix.c
 | ||||
| @@ -989,6 +989,10 @@ static void pc_machine_rhel760_options(MachineClass *m)
 | ||||
|      m->desc = "RHEL 7.6.0 PC (i440FX + PIIX, 1996)"; | ||||
|      m->async_pf_vmexit_disable = true; | ||||
|      m->smbus_no_migration_support = true; | ||||
| +
 | ||||
| +    /* All RHEL machines for prior major releases are deprecated */
 | ||||
| +    m->deprecation_reason = rhel_old_machine_deprecation;
 | ||||
| +
 | ||||
|      pcmc->pvh_enabled = false; | ||||
|      pcmc->default_cpu_version = CPU_VERSION_LEGACY; | ||||
|      pcmc->kvmclock_create_always = false; | ||||
| diff --git a/hw/i386/pc_q35.c b/hw/i386/pc_q35.c
 | ||||
| index bf9ad32f0e..c8e06da084 100644
 | ||||
| --- a/hw/i386/pc_q35.c
 | ||||
| +++ b/hw/i386/pc_q35.c
 | ||||
| @@ -674,6 +674,10 @@ static void pc_q35_machine_rhel860_options(MachineClass *m)
 | ||||
|      pc_q35_machine_rhel900_options(m); | ||||
|      m->desc = "RHEL-8.6.0 PC (Q35 + ICH9, 2009)"; | ||||
|      m->alias = NULL; | ||||
| +
 | ||||
| +    /* All RHEL machines for prior major releases are deprecated */
 | ||||
| +    m->deprecation_reason = rhel_old_machine_deprecation;
 | ||||
| +
 | ||||
|      pcmc->smbios_stream_product = "RHEL-AV"; | ||||
|      pcmc->smbios_stream_version = "8.6.0"; | ||||
|  } | ||||
| diff --git a/hw/s390x/s390-virtio-ccw.c b/hw/s390x/s390-virtio-ccw.c
 | ||||
| index 9da6e9b1d4..cc78a315e3 100644
 | ||||
| --- a/hw/s390x/s390-virtio-ccw.c
 | ||||
| +++ b/hw/s390x/s390-virtio-ccw.c
 | ||||
| @@ -1121,6 +1121,9 @@ static void ccw_machine_rhel860_instance_options(MachineState *machine)
 | ||||
|  static void ccw_machine_rhel860_class_options(MachineClass *mc) | ||||
|  { | ||||
|      ccw_machine_rhel900_class_options(mc); | ||||
| +
 | ||||
| +    /* All RHEL machines for prior major releases are deprecated */
 | ||||
| +    mc->deprecation_reason = rhel_old_machine_deprecation;
 | ||||
|  } | ||||
|  DEFINE_CCW_MACHINE(rhel860, "rhel8.6.0", false); | ||||
|   | ||||
| diff --git a/include/hw/boards.h b/include/hw/boards.h
 | ||||
| index 3c3d2ad450..21d8d5528e 100644
 | ||||
| --- a/include/hw/boards.h
 | ||||
| +++ b/include/hw/boards.h
 | ||||
| @@ -464,4 +464,6 @@ extern const size_t hw_compat_rhel_8_0_len;
 | ||||
|  extern GlobalProperty hw_compat_rhel_7_6[]; | ||||
|  extern const size_t hw_compat_rhel_7_6_len; | ||||
|   | ||||
| +extern const char *rhel_old_machine_deprecation;
 | ||||
| +
 | ||||
|  #endif | ||||
| -- 
 | ||||
| 2.31.1 | ||||
| 
 | ||||
| @ -0,0 +1,45 @@ | ||||
| From 213d2c6d3138f3570bca36edaacfd1ee86b18967 Mon Sep 17 00:00:00 2001 | ||||
| From: Gerd Hoffmann <kraxel@redhat.com> | ||||
| Date: Fri, 4 Feb 2022 06:45:51 +0100 | ||||
| Subject: [PATCH 1/6] Revert "ui/clipboard: Don't use g_autoptr just to free a | ||||
|  variable" | ||||
| MIME-Version: 1.0 | ||||
| Content-Type: text/plain; charset=UTF-8 | ||||
| Content-Transfer-Encoding: 8bit | ||||
| 
 | ||||
| RH-Author: Gerd Hoffmann <kraxel@redhat.com> | ||||
| RH-MergeRequest: 75: fix vnc cut+paste crash | ||||
| RH-Commit: [1/4] 0937d15054ad6e902bc22d1872231504f442ddcc (kraxel/centos-qemu-kvm) | ||||
| RH-Bugzilla: 2042820 | ||||
| RH-Acked-by: Marc-André Lureau <marcandre.lureau@redhat.com> | ||||
| RH-Acked-by: Daniel P. Berrangé <berrange@redhat.com> | ||||
| RH-Acked-by: Miroslav Rezanina <mrezanin@redhat.com> | ||||
| 
 | ||||
| This reverts commit 8df1ea81ee6c674522967d056daa8d3748fa3883. | ||||
| ---
 | ||||
|  ui/clipboard.c | 3 +-- | ||||
|  1 file changed, 1 insertion(+), 2 deletions(-) | ||||
| 
 | ||||
| diff --git a/ui/clipboard.c b/ui/clipboard.c
 | ||||
| index d53576b0f6..d7b008d62a 100644
 | ||||
| --- a/ui/clipboard.c
 | ||||
| +++ b/ui/clipboard.c
 | ||||
| @@ -44,14 +44,13 @@ void qemu_clipboard_peer_release(QemuClipboardPeer *peer,
 | ||||
|   | ||||
|  void qemu_clipboard_update(QemuClipboardInfo *info) | ||||
|  { | ||||
| -    QemuClipboardInfo *old = NULL;
 | ||||
| +    g_autoptr(QemuClipboardInfo) old = NULL;
 | ||||
|      assert(info->selection < QEMU_CLIPBOARD_SELECTION__COUNT); | ||||
|   | ||||
|      notifier_list_notify(&clipboard_notifiers, info); | ||||
|   | ||||
|      old = cbinfo[info->selection]; | ||||
|      cbinfo[info->selection] = qemu_clipboard_info_ref(info); | ||||
| -    g_free(old);
 | ||||
|  } | ||||
|   | ||||
|  QemuClipboardInfo *qemu_clipboard_info(QemuClipboardSelection selection) | ||||
| -- 
 | ||||
| 2.27.0 | ||||
| 
 | ||||
							
								
								
									
										70
									
								
								SOURCES/kvm-acpi-fix-OEM-ID-OEM-Table-ID-padding.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										70
									
								
								SOURCES/kvm-acpi-fix-OEM-ID-OEM-Table-ID-padding.patch
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,70 @@ | ||||
| From 473b05bbdad50dc3877ab6da4ac52b5a4fc7d5e1 Mon Sep 17 00:00:00 2001 | ||||
| From: Igor Mammedov <imammedo@redhat.com> | ||||
| Date: Wed, 12 Jan 2022 08:03:31 -0500 | ||||
| Subject: [PATCH 11/14] acpi: fix OEM ID/OEM Table ID padding | ||||
| 
 | ||||
| RH-Author: Igor Mammedov <imammedo@redhat.com> | ||||
| RH-MergeRequest: 130: acpi: fix QEMU crash when started with SLIC table | ||||
| RH-Commit: [7/10] 276af1aa7650e79f146c75ef4ec19f792e7e163c | ||||
| RH-Bugzilla: 2043531 | ||||
| RH-Acked-by: Gerd Hoffmann <kraxel@redhat.com> | ||||
| RH-Acked-by: Miroslav Rezanina <mrezanin@redhat.com> | ||||
| RH-Acked-by: MST <None> | ||||
| 
 | ||||
| Commit [2] broke original '\0' padding of OEM ID and OEM Table ID | ||||
| fields in headers of ACPI tables. While it doesn't have impact on | ||||
| default values since QEMU uses 6 and 8 characters long values | ||||
| respectively, it broke usecase where IDs are provided on QEMU CLI. | ||||
| It shouldn't affect guest (but may cause licensing verification | ||||
| issues in guest OS). | ||||
| One of the broken usecases is user supplied SLIC table with IDs | ||||
| shorter than max possible length, where [2] mangles IDs with extra | ||||
| spaces in RSDT and FADT tables whereas guest OS expects those to | ||||
| mirror the respective values of the used SLIC table. | ||||
| 
 | ||||
| Fix it by replacing whitespace padding with '\0' padding in | ||||
| accordance with [1] and expectations of guest OS | ||||
| 
 | ||||
| 1) ACPI spec, v2.0b | ||||
|        17.2 AML Grammar Definition | ||||
|        ... | ||||
|        //OEM ID of up to 6 characters. If the OEM ID is | ||||
|        //shorter than 6 characters, it can be terminated | ||||
|        //with a NULL character. | ||||
| 
 | ||||
| 2) | ||||
| Fixes: 602b458201 ("acpi: Permit OEM ID and OEM table ID fields to be changed") | ||||
| Resolves: https://gitlab.com/qemu-project/qemu/-/issues/707 | ||||
| Reported-by: Dmitry V. Orekhov <dima.orekhov@gmail.com> | ||||
| Signed-off-by: Igor Mammedov <imammedo@redhat.com> | ||||
| Cc: qemu-stable@nongnu.org | ||||
| Message-Id: <20220112130332.1648664-4-imammedo@redhat.com> | ||||
| Reviewed-by: Michael S. Tsirkin <mst@redhat.com> | ||||
| Signed-off-by: Michael S. Tsirkin <mst@redhat.com> | ||||
| Reviewed-by: Ani Sinha <ani@anisinha.ca> | ||||
| Tested-by: Dmitry V. Orekhov dima.orekhov@gmail.com | ||||
| (cherry picked from commit 748c030f360a940fe0c9382c8ca1649096c3a80d) | ||||
| Signed-off-by: Igor Mammedov <imammedo@redhat.com> | ||||
| ---
 | ||||
|  hw/acpi/aml-build.c | 4 ++-- | ||||
|  1 file changed, 2 insertions(+), 2 deletions(-) | ||||
| 
 | ||||
| diff --git a/hw/acpi/aml-build.c b/hw/acpi/aml-build.c
 | ||||
| index b3b3310df3..65148d5b9d 100644
 | ||||
| --- a/hw/acpi/aml-build.c
 | ||||
| +++ b/hw/acpi/aml-build.c
 | ||||
| @@ -1724,9 +1724,9 @@ void acpi_table_begin(AcpiTable *desc, GArray *array)
 | ||||
|      build_append_int_noprefix(array, 0, 4); /* Length */ | ||||
|      build_append_int_noprefix(array, desc->rev, 1); /* Revision */ | ||||
|      build_append_int_noprefix(array, 0, 1); /* Checksum */ | ||||
| -    build_append_padded_str(array, desc->oem_id, 6, ' '); /* OEMID */
 | ||||
| +    build_append_padded_str(array, desc->oem_id, 6, '\0'); /* OEMID */
 | ||||
|      /* OEM Table ID */ | ||||
| -    build_append_padded_str(array, desc->oem_table_id, 8, ' ');
 | ||||
| +    build_append_padded_str(array, desc->oem_table_id, 8, '\0');
 | ||||
|      build_append_int_noprefix(array, 1, 4); /* OEM Revision */ | ||||
|      g_array_append_vals(array, ACPI_BUILD_APPNAME8, 4); /* Creator ID */ | ||||
|      build_append_int_noprefix(array, 1, 4); /* Creator Revision */ | ||||
| -- 
 | ||||
| 2.31.1 | ||||
| 
 | ||||
| @ -0,0 +1,100 @@ | ||||
| From 636a09dbe361517ac2b8d810166676b5006a6ca2 Mon Sep 17 00:00:00 2001 | ||||
| From: Igor Mammedov <imammedo@redhat.com> | ||||
| Date: Mon, 27 Dec 2021 14:31:17 -0500 | ||||
| Subject: [PATCH 05/14] acpi: fix QEMU crash when started with SLIC table | ||||
| MIME-Version: 1.0 | ||||
| Content-Type: text/plain; charset=UTF-8 | ||||
| Content-Transfer-Encoding: 8bit | ||||
| 
 | ||||
| RH-Author: Igor Mammedov <imammedo@redhat.com> | ||||
| RH-MergeRequest: 130: acpi: fix QEMU crash when started with SLIC table | ||||
| RH-Commit: [1/10] 67c1d1d2358d0ba746f260dfc3c1cfc165357fd1 | ||||
| RH-Bugzilla: 2043531 | ||||
| RH-Acked-by: Gerd Hoffmann <kraxel@redhat.com> | ||||
| RH-Acked-by: Miroslav Rezanina <mrezanin@redhat.com> | ||||
| RH-Acked-by: MST <None> | ||||
| 
 | ||||
| if QEMU is started with used provided SLIC table blob, | ||||
| 
 | ||||
|   -acpitable sig=SLIC,oem_id='CRASH ',oem_table_id="ME",oem_rev=00002210,asl_compiler_id="",asl_compiler_rev=00000000,data=/dev/null | ||||
| it will assert with: | ||||
| 
 | ||||
|   hw/acpi/aml-build.c:61:build_append_padded_str: assertion failed: (len <= maxlen) | ||||
| 
 | ||||
| and following backtrace: | ||||
| 
 | ||||
|   ... | ||||
|   build_append_padded_str (array=0x555556afe320, str=0x555556afdb2e "CRASH ME", maxlen=0x6, pad=0x20) at hw/acpi/aml-build.c:61 | ||||
|   acpi_table_begin (desc=0x7fffffffd1b0, array=0x555556afe320) at hw/acpi/aml-build.c:1727 | ||||
|   build_fadt (tbl=0x555556afe320, linker=0x555557ca3830, f=0x7fffffffd318, oem_id=0x555556afdb2e "CRASH ME", oem_table_id=0x555556afdb34 "ME") at hw/acpi/aml-build.c:2064 | ||||
|   ... | ||||
| 
 | ||||
| which happens due to acpi_table_begin() expecting NULL terminated | ||||
| oem_id and oem_table_id strings, which is normally the case, but | ||||
| in case of user provided SLIC table, oem_id points to table's blob | ||||
| directly and as result oem_id became longer than expected. | ||||
| 
 | ||||
| Fix issue by handling oem_id consistently and make acpi_get_slic_oem() | ||||
| return NULL terminated strings. | ||||
| 
 | ||||
| PS: | ||||
| After [1] refactoring, oem_id semantics became inconsistent, where | ||||
| NULL terminated string was coming from machine and old way pointer | ||||
| into byte array coming from -acpitable option. That used to work | ||||
| since build_header() wasn't expecting NULL terminated string and | ||||
| blindly copied the 1st 6 bytes only. | ||||
| 
 | ||||
| However commit [2] broke that by replacing build_header() with | ||||
| acpi_table_begin(), which was expecting NULL terminated string | ||||
| and was checking oem_id size. | ||||
| 
 | ||||
| 1) 602b45820 ("acpi: Permit OEM ID and OEM table ID fields to be changed") | ||||
| 2) | ||||
| Fixes: 4b56e1e4eb08 ("acpi: build_fadt: use acpi_table_begin()/acpi_table_end() instead of build_header()") | ||||
| Resolves: https://gitlab.com/qemu-project/qemu/-/issues/786 | ||||
| Signed-off-by: Igor Mammedov <imammedo@redhat.com> | ||||
| Message-Id: <20211227193120.1084176-2-imammedo@redhat.com> | ||||
| Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com> | ||||
| Tested-by: Denis Lisov <dennis.lissov@gmail.com> | ||||
| Tested-by: Alexander Tsoy <alexander@tsoy.me> | ||||
| Cc: qemu-stable@nongnu.org | ||||
| Reviewed-by: Michael S. Tsirkin <mst@redhat.com> | ||||
| Signed-off-by: Michael S. Tsirkin <mst@redhat.com> | ||||
| (cherry picked from commit 8cdb99af45365727ac17f45239a9b8c1d5155c6d) | ||||
| Signed-off-by: Igor Mammedov <imammedo@redhat.com> | ||||
| ---
 | ||||
|  hw/acpi/core.c       | 4 ++-- | ||||
|  hw/i386/acpi-build.c | 2 ++ | ||||
|  2 files changed, 4 insertions(+), 2 deletions(-) | ||||
| 
 | ||||
| diff --git a/hw/acpi/core.c b/hw/acpi/core.c
 | ||||
| index 1e004d0078..3e811bf03c 100644
 | ||||
| --- a/hw/acpi/core.c
 | ||||
| +++ b/hw/acpi/core.c
 | ||||
| @@ -345,8 +345,8 @@ int acpi_get_slic_oem(AcpiSlicOem *oem)
 | ||||
|          struct acpi_table_header *hdr = (void *)(u - sizeof(hdr->_length)); | ||||
|   | ||||
|          if (memcmp(hdr->sig, "SLIC", 4) == 0) { | ||||
| -            oem->id = hdr->oem_id;
 | ||||
| -            oem->table_id = hdr->oem_table_id;
 | ||||
| +            oem->id = g_strndup(hdr->oem_id, 6);
 | ||||
| +            oem->table_id = g_strndup(hdr->oem_table_id, 8);
 | ||||
|              return 0; | ||||
|          } | ||||
|      } | ||||
| diff --git a/hw/i386/acpi-build.c b/hw/i386/acpi-build.c
 | ||||
| index 8383b83ee3..0234fe7588 100644
 | ||||
| --- a/hw/i386/acpi-build.c
 | ||||
| +++ b/hw/i386/acpi-build.c
 | ||||
| @@ -2723,6 +2723,8 @@ void acpi_build(AcpiBuildTables *tables, MachineState *machine)
 | ||||
|   | ||||
|      /* Cleanup memory that's no longer used. */ | ||||
|      g_array_free(table_offsets, true); | ||||
| +    g_free(slic_oem.id);
 | ||||
| +    g_free(slic_oem.table_id);
 | ||||
|  } | ||||
|   | ||||
|  static void acpi_ram_update(MemoryRegion *mr, GArray *data) | ||||
| -- 
 | ||||
| 2.31.1 | ||||
| 
 | ||||
| @ -0,0 +1,130 @@ | ||||
| From a3a4fd1733e71d029e38136366e73ace8e78298b Mon Sep 17 00:00:00 2001 | ||||
| From: Igor Mammedov <imammedo@redhat.com> | ||||
| Date: Tue, 1 Mar 2022 10:11:59 -0500 | ||||
| Subject: [PATCH 02/14] acpi: pcihp: pcie: set power on cap on parent slot | ||||
| 
 | ||||
| RH-Author: Igor Mammedov <imammedo@redhat.com> | ||||
| RH-MergeRequest: 124: RHEL-9.0 Fix broken PCIe device after migration | ||||
| RH-Commit: [2/2] 135602421e5fed803f7d71121380306633d490d8 | ||||
| RH-Bugzilla: 2053584 | ||||
| RH-Acked-by: Vitaly Kuznetsov <vkuznets@redhat.com> | ||||
| RH-Acked-by: MST <None> | ||||
| RH-Acked-by: Gerd Hoffmann <kraxel@redhat.com> | ||||
| 
 | ||||
| on creation a PCIDevice has power turned on at the end of pci_qdev_realize() | ||||
| however later on if PCIe slot isn't populated with any children | ||||
| it's power is turned off. It's fine if native hotplug is used | ||||
| as plug callback will power slot on among other things. | ||||
| However when ACPI hotplug is enabled it replaces native PCIe plug | ||||
| callbacks with ACPI specific ones (acpi_pcihp_device_*plug_cb) and | ||||
| as result slot stays powered off. It works fine as ACPI hotplug | ||||
| on guest side takes care of enumerating/initializing hotplugged | ||||
| device. But when later guest is migrated, call chain introduced by] | ||||
| commit d5daff7d312 (pcie: implement slot power control for pcie root ports) | ||||
| 
 | ||||
|    pcie_cap_slot_post_load() | ||||
|        -> pcie_cap_update_power() | ||||
|            -> pcie_set_power_device() | ||||
|                -> pci_set_power() | ||||
|                    -> pci_update_mappings() | ||||
| 
 | ||||
| will disable earlier initialized BARs for the hotplugged device | ||||
| in powered off slot due to commit 23786d13441 (pci: implement power state) | ||||
| which disables BARs if power is off. | ||||
| 
 | ||||
| Fix it by setting PCI_EXP_SLTCTL_PCC to PCI_EXP_SLTCTL_PWR_ON | ||||
| on slot (root port/downstream port) at the time a device | ||||
| hotplugged into it. As result PCI_EXP_SLTCTL_PWR_ON is migrated | ||||
| to target and above call chain keeps device plugged into it | ||||
| powered on. | ||||
| 
 | ||||
| Fixes: d5daff7d312 ("pcie: implement slot power control for pcie root ports") | ||||
| Fixes: 23786d13441 ("pci: implement power state") | ||||
| Fixes: https://bugzilla.redhat.com/show_bug.cgi?id=2053584 | ||||
| Suggested-by: "Michael S. Tsirkin" <mst@redhat.com> | ||||
| Signed-off-by: Igor Mammedov <imammedo@redhat.com> | ||||
| Message-Id: <20220301151200.3507298-3-imammedo@redhat.com> | ||||
| Reviewed-by: Michael S. Tsirkin <mst@redhat.com> | ||||
| Signed-off-by: Michael S. Tsirkin <mst@redhat.com> | ||||
| (cherry picked from commit 6b0969f1ec825984cd74619f0730be421b0c46fb) | ||||
| Signed-off-by: Igor Mammedov <imammedo@redhat.com> | ||||
| ---
 | ||||
|  hw/acpi/pcihp.c       | 12 +++++++++++- | ||||
|  hw/pci/pcie.c         | 11 +++++++++++ | ||||
|  include/hw/pci/pcie.h |  1 + | ||||
|  3 files changed, 23 insertions(+), 1 deletion(-) | ||||
| 
 | ||||
| diff --git a/hw/acpi/pcihp.c b/hw/acpi/pcihp.c
 | ||||
| index 30405b5113..3d5610e02d 100644
 | ||||
| --- a/hw/acpi/pcihp.c
 | ||||
| +++ b/hw/acpi/pcihp.c
 | ||||
| @@ -32,6 +32,7 @@
 | ||||
|  #include "hw/pci/pci_bridge.h" | ||||
|  #include "hw/pci/pci_host.h" | ||||
|  #include "hw/pci/pcie_port.h" | ||||
| +#include "hw/pci-bridge/xio3130_downstream.h"
 | ||||
|  #include "hw/i386/acpi-build.h" | ||||
|  #include "hw/acpi/acpi.h" | ||||
|  #include "hw/pci/pci_bus.h" | ||||
| @@ -341,6 +342,8 @@ void acpi_pcihp_device_plug_cb(HotplugHandler *hotplug_dev, AcpiPciHpState *s,
 | ||||
|  { | ||||
|      PCIDevice *pdev = PCI_DEVICE(dev); | ||||
|      int slot = PCI_SLOT(pdev->devfn); | ||||
| +    PCIDevice *bridge;
 | ||||
| +    PCIBus *bus;
 | ||||
|      int bsel; | ||||
|   | ||||
|      /* Don't send event when device is enabled during qemu machine creation: | ||||
| @@ -370,7 +373,14 @@ void acpi_pcihp_device_plug_cb(HotplugHandler *hotplug_dev, AcpiPciHpState *s,
 | ||||
|          return; | ||||
|      } | ||||
|   | ||||
| -    bsel = acpi_pcihp_get_bsel(pci_get_bus(pdev));
 | ||||
| +    bus = pci_get_bus(pdev);
 | ||||
| +    bridge = pci_bridge_get_device(bus);
 | ||||
| +    if (object_dynamic_cast(OBJECT(bridge), TYPE_PCIE_ROOT_PORT) ||
 | ||||
| +        object_dynamic_cast(OBJECT(bridge), TYPE_XIO3130_DOWNSTREAM)) {
 | ||||
| +        pcie_cap_slot_enable_power(bridge);
 | ||||
| +    }
 | ||||
| +
 | ||||
| +    bsel = acpi_pcihp_get_bsel(bus);
 | ||||
|      g_assert(bsel >= 0); | ||||
|      s->acpi_pcihp_pci_status[bsel].up |= (1U << slot); | ||||
|      acpi_send_event(DEVICE(hotplug_dev), ACPI_PCI_HOTPLUG_STATUS); | ||||
| diff --git a/hw/pci/pcie.c b/hw/pci/pcie.c
 | ||||
| index d7d73a31e4..996f0e24fe 100644
 | ||||
| --- a/hw/pci/pcie.c
 | ||||
| +++ b/hw/pci/pcie.c
 | ||||
| @@ -366,6 +366,17 @@ static void hotplug_event_clear(PCIDevice *dev)
 | ||||
|      } | ||||
|  } | ||||
|   | ||||
| +void pcie_cap_slot_enable_power(PCIDevice *dev)
 | ||||
| +{
 | ||||
| +    uint8_t *exp_cap = dev->config + dev->exp.exp_cap;
 | ||||
| +    uint32_t sltcap = pci_get_long(exp_cap + PCI_EXP_SLTCAP);
 | ||||
| +
 | ||||
| +    if (sltcap & PCI_EXP_SLTCAP_PCP) {
 | ||||
| +        pci_set_word_by_mask(exp_cap + PCI_EXP_SLTCTL,
 | ||||
| +                             PCI_EXP_SLTCTL_PCC, PCI_EXP_SLTCTL_PWR_ON);
 | ||||
| +    }
 | ||||
| +}
 | ||||
| +
 | ||||
|  static void pcie_set_power_device(PCIBus *bus, PCIDevice *dev, void *opaque) | ||||
|  { | ||||
|      bool *power = opaque; | ||||
| diff --git a/include/hw/pci/pcie.h b/include/hw/pci/pcie.h
 | ||||
| index 6063bee0ec..c27368d077 100644
 | ||||
| --- a/include/hw/pci/pcie.h
 | ||||
| +++ b/include/hw/pci/pcie.h
 | ||||
| @@ -112,6 +112,7 @@ void pcie_cap_slot_write_config(PCIDevice *dev,
 | ||||
|                                  uint32_t addr, uint32_t val, int len); | ||||
|  int pcie_cap_slot_post_load(void *opaque, int version_id); | ||||
|  void pcie_cap_slot_push_attention_button(PCIDevice *dev); | ||||
| +void pcie_cap_slot_enable_power(PCIDevice *dev);
 | ||||
|   | ||||
|  void pcie_cap_root_init(PCIDevice *dev); | ||||
|  void pcie_cap_root_reset(PCIDevice *dev); | ||||
| -- 
 | ||||
| 2.31.1 | ||||
| 
 | ||||
| @ -0,0 +1,63 @@ | ||||
| From 7b973b9cb7b890eaf9a31c99f5c272b513322ac1 Mon Sep 17 00:00:00 2001 | ||||
| From: Kevin Wolf <kwolf@redhat.com> | ||||
| Date: Thu, 3 Feb 2022 15:05:33 +0100 | ||||
| Subject: [PATCH 1/8] block: Lock AioContext for drain_end in blockdev-reopen | ||||
| 
 | ||||
| RH-Author: Kevin Wolf <kwolf@redhat.com> | ||||
| RH-MergeRequest: 73: block: Lock AioContext for drain_end in blockdev-reopen | ||||
| RH-Commit: [1/2] db25e999152b0e4f09decade1ac76b9f56cd9706 (kmwolf/centos-qemu-kvm) | ||||
| RH-Bugzilla: 2046659 | ||||
| RH-Acked-by: Sergio Lopez <None> | ||||
| RH-Acked-by: Stefan Hajnoczi <stefanha@redhat.com> | ||||
| RH-Acked-by: Hanna Reitz <hreitz@redhat.com> | ||||
| 
 | ||||
| bdrv_subtree_drained_end() requires the caller to hold the AioContext | ||||
| lock for the drained node. Not doing this for nodes outside of the main | ||||
| AioContext leads to crashes when AIO_WAIT_WHILE() needs to wait and | ||||
| tries to temporarily release the lock. | ||||
| 
 | ||||
| Fixes: 3908b7a8994fa5ef7a89aa58cd5a02fc58141592 | ||||
| Resolves: https://bugzilla.redhat.com/show_bug.cgi?id=2046659 | ||||
| Reported-by: Qing Wang <qinwang@redhat.com> | ||||
| Signed-off-by: Kevin Wolf <kwolf@redhat.com> | ||||
| Message-Id: <20220203140534.36522-2-kwolf@redhat.com> | ||||
| Reviewed-by: Hanna Reitz <hreitz@redhat.com> | ||||
| Signed-off-by: Kevin Wolf <kwolf@redhat.com> | ||||
| (cherry picked from commit aba8205be0707b9d108e32254e186ba88107a869) | ||||
| Signed-off-by: Kevin Wolf <kwolf@redhat.com> | ||||
| ---
 | ||||
|  blockdev.c | 11 ++++++++++- | ||||
|  1 file changed, 10 insertions(+), 1 deletion(-) | ||||
| 
 | ||||
| diff --git a/blockdev.c b/blockdev.c
 | ||||
| index b35072644e..565f6a81fd 100644
 | ||||
| --- a/blockdev.c
 | ||||
| +++ b/blockdev.c
 | ||||
| @@ -3562,6 +3562,7 @@ void qmp_blockdev_reopen(BlockdevOptionsList *reopen_list, Error **errp)
 | ||||
|  { | ||||
|      BlockReopenQueue *queue = NULL; | ||||
|      GSList *drained = NULL; | ||||
| +    GSList *p;
 | ||||
|   | ||||
|      /* Add each one of the BDS that we want to reopen to the queue */ | ||||
|      for (; reopen_list != NULL; reopen_list = reopen_list->next) { | ||||
| @@ -3611,7 +3612,15 @@ void qmp_blockdev_reopen(BlockdevOptionsList *reopen_list, Error **errp)
 | ||||
|   | ||||
|  fail: | ||||
|      bdrv_reopen_queue_free(queue); | ||||
| -    g_slist_free_full(drained, (GDestroyNotify) bdrv_subtree_drained_end);
 | ||||
| +    for (p = drained; p; p = p->next) {
 | ||||
| +        BlockDriverState *bs = p->data;
 | ||||
| +        AioContext *ctx = bdrv_get_aio_context(bs);
 | ||||
| +
 | ||||
| +        aio_context_acquire(ctx);
 | ||||
| +        bdrv_subtree_drained_end(bs);
 | ||||
| +        aio_context_release(ctx);
 | ||||
| +    }
 | ||||
| +    g_slist_free(drained);
 | ||||
|  } | ||||
|   | ||||
|  void qmp_blockdev_del(const char *node_name, Error **errp) | ||||
| -- 
 | ||||
| 2.27.0 | ||||
| 
 | ||||
| @ -0,0 +1,129 @@ | ||||
| From 87f3b10dc600ac12272ee6cdc67571910ea722f6 Mon Sep 17 00:00:00 2001 | ||||
| From: Stefan Hajnoczi <stefanha@redhat.com> | ||||
| Date: Tue, 11 Jan 2022 15:36:12 +0000 | ||||
| Subject: [PATCH 10/12] block-backend: prevent dangling BDS pointers across | ||||
|  aio_poll() | ||||
| 
 | ||||
| RH-Author: Hanna Reitz <hreitz@redhat.com> | ||||
| RH-MergeRequest: 71: block-backend: prevent dangling BDS pointers across aio_poll() | ||||
| RH-Commit: [1/2] 1b4cab39bf8c933ab910293a29bfceaa9e821068 (hreitz/qemu-kvm-c-9-s) | ||||
| RH-Bugzilla: 2040123 | ||||
| RH-Acked-by: Kevin Wolf <kwolf@redhat.com> | ||||
| RH-Acked-by: Stefan Hajnoczi <stefanha@redhat.com> | ||||
| RH-Acked-by: Emanuele Giuseppe Esposito <eesposit@redhat.com> | ||||
| 
 | ||||
| The BlockBackend root child can change when aio_poll() is invoked. This | ||||
| happens when a temporary filter node is removed upon blockjob | ||||
| completion, for example. | ||||
| 
 | ||||
| Functions in block/block-backend.c must be aware of this when using a | ||||
| blk_bs() pointer across aio_poll() because the BlockDriverState refcnt | ||||
| may reach 0, resulting in a stale pointer. | ||||
| 
 | ||||
| One example is scsi_device_purge_requests(), which calls blk_drain() to | ||||
| wait for in-flight requests to cancel. If the backup blockjob is active, | ||||
| then the BlockBackend root child is a temporary filter BDS owned by the | ||||
| blockjob. The blockjob can complete during bdrv_drained_begin() and the | ||||
| last reference to the BDS is released when the temporary filter node is | ||||
| removed. This results in a use-after-free when blk_drain() calls | ||||
| bdrv_drained_end(bs) on the dangling pointer. | ||||
| 
 | ||||
| Explicitly hold a reference to bs across block APIs that invoke | ||||
| aio_poll(). | ||||
| 
 | ||||
| Buglink: https://bugzilla.redhat.com/show_bug.cgi?id=2021778 | ||||
| Buglink: https://bugzilla.redhat.com/show_bug.cgi?id=2036178 | ||||
| Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com> | ||||
| Message-Id: <20220111153613.25453-2-stefanha@redhat.com> | ||||
| Signed-off-by: Kevin Wolf <kwolf@redhat.com> | ||||
| (cherry picked from commit 1e3552dbd28359d35967b7c28dc86cde1bc29205) | ||||
| Signed-off-by: Hanna Reitz <hreitz@redhat.com> | ||||
| ---
 | ||||
|  block/block-backend.c | 19 +++++++++++++++++-- | ||||
|  1 file changed, 17 insertions(+), 2 deletions(-) | ||||
| 
 | ||||
| diff --git a/block/block-backend.c b/block/block-backend.c
 | ||||
| index 12ef80ea17..23e727199b 100644
 | ||||
| --- a/block/block-backend.c
 | ||||
| +++ b/block/block-backend.c
 | ||||
| @@ -822,16 +822,22 @@ BlockBackend *blk_by_public(BlockBackendPublic *public)
 | ||||
|  void blk_remove_bs(BlockBackend *blk) | ||||
|  { | ||||
|      ThrottleGroupMember *tgm = &blk->public.throttle_group_member; | ||||
| -    BlockDriverState *bs;
 | ||||
|      BdrvChild *root; | ||||
|   | ||||
|      notifier_list_notify(&blk->remove_bs_notifiers, blk); | ||||
|      if (tgm->throttle_state) { | ||||
| -        bs = blk_bs(blk);
 | ||||
| +        BlockDriverState *bs = blk_bs(blk);
 | ||||
| +
 | ||||
| +        /*
 | ||||
| +         * Take a ref in case blk_bs() changes across bdrv_drained_begin(), for
 | ||||
| +         * example, if a temporary filter node is removed by a blockjob.
 | ||||
| +         */
 | ||||
| +        bdrv_ref(bs);
 | ||||
|          bdrv_drained_begin(bs); | ||||
|          throttle_group_detach_aio_context(tgm); | ||||
|          throttle_group_attach_aio_context(tgm, qemu_get_aio_context()); | ||||
|          bdrv_drained_end(bs); | ||||
| +        bdrv_unref(bs);
 | ||||
|      } | ||||
|   | ||||
|      blk_update_root_state(blk); | ||||
| @@ -1705,6 +1711,7 @@ void blk_drain(BlockBackend *blk)
 | ||||
|      BlockDriverState *bs = blk_bs(blk); | ||||
|   | ||||
|      if (bs) { | ||||
| +        bdrv_ref(bs);
 | ||||
|          bdrv_drained_begin(bs); | ||||
|      } | ||||
|   | ||||
| @@ -1714,6 +1721,7 @@ void blk_drain(BlockBackend *blk)
 | ||||
|   | ||||
|      if (bs) { | ||||
|          bdrv_drained_end(bs); | ||||
| +        bdrv_unref(bs);
 | ||||
|      } | ||||
|  } | ||||
|   | ||||
| @@ -2044,10 +2052,13 @@ static int blk_do_set_aio_context(BlockBackend *blk, AioContext *new_context,
 | ||||
|      int ret; | ||||
|   | ||||
|      if (bs) { | ||||
| +        bdrv_ref(bs);
 | ||||
| +
 | ||||
|          if (update_root_node) { | ||||
|              ret = bdrv_child_try_set_aio_context(bs, new_context, blk->root, | ||||
|                                                   errp); | ||||
|              if (ret < 0) { | ||||
| +                bdrv_unref(bs);
 | ||||
|                  return ret; | ||||
|              } | ||||
|          } | ||||
| @@ -2057,6 +2068,8 @@ static int blk_do_set_aio_context(BlockBackend *blk, AioContext *new_context,
 | ||||
|              throttle_group_attach_aio_context(tgm, new_context); | ||||
|              bdrv_drained_end(bs); | ||||
|          } | ||||
| +
 | ||||
| +        bdrv_unref(bs);
 | ||||
|      } | ||||
|   | ||||
|      blk->ctx = new_context; | ||||
| @@ -2326,11 +2339,13 @@ void blk_io_limits_disable(BlockBackend *blk)
 | ||||
|      ThrottleGroupMember *tgm = &blk->public.throttle_group_member; | ||||
|      assert(tgm->throttle_state); | ||||
|      if (bs) { | ||||
| +        bdrv_ref(bs);
 | ||||
|          bdrv_drained_begin(bs); | ||||
|      } | ||||
|      throttle_group_unregister_tgm(tgm); | ||||
|      if (bs) { | ||||
|          bdrv_drained_end(bs); | ||||
| +        bdrv_unref(bs);
 | ||||
|      } | ||||
|  } | ||||
|   | ||||
| -- 
 | ||||
| 2.27.0 | ||||
| 
 | ||||
| @ -0,0 +1,56 @@ | ||||
| From a6b472de71f6ebbe44025e1348c90e6f1f2b2326 Mon Sep 17 00:00:00 2001 | ||||
| From: Hanna Reitz <hreitz@redhat.com> | ||||
| Date: Tue, 18 Jan 2022 17:59:59 +0100 | ||||
| Subject: [PATCH 06/12] block/io: Update BSC only if want_zero is true | ||||
| 
 | ||||
| RH-Author: Hanna Reitz <hreitz@redhat.com> | ||||
| RH-MergeRequest: 69: block/io: Update BSC only if want_zero is true | ||||
| RH-Commit: [1/2] ad19ff86c3420cafe5a9e785ee210e482fbc8cd7 (hreitz/qemu-kvm-c-9-s) | ||||
| RH-Bugzilla: 2041461 | ||||
| RH-Acked-by: Eric Blake <eblake@redhat.com> | ||||
| RH-Acked-by: Stefan Hajnoczi <stefanha@redhat.com> | ||||
| RH-Acked-by: Kevin Wolf <kwolf@redhat.com> | ||||
| 
 | ||||
| We update the block-status cache whenever we get new information from a | ||||
| bdrv_co_block_status() call to the block driver.  However, if we have | ||||
| passed want_zero=false to that call, it may flag areas containing zeroes | ||||
| as data, and so we would update the block-status cache with wrong | ||||
| information. | ||||
| 
 | ||||
| Therefore, we should not update the cache with want_zero=false. | ||||
| 
 | ||||
| Reported-by: Nir Soffer <nsoffer@redhat.com> | ||||
| Fixes: 0bc329fbb00 ("block: block-status cache for data regions") | ||||
| Reviewed-by: Nir Soffer <nsoffer@redhat.com> | ||||
| Cc: qemu-stable@nongnu.org | ||||
| Signed-off-by: Hanna Reitz <hreitz@redhat.com> | ||||
| Message-Id: <20220118170000.49423-2-hreitz@redhat.com> | ||||
| Reviewed-by: Eric Blake <eblake@redhat.com> | ||||
| Signed-off-by: Eric Blake <eblake@redhat.com> | ||||
| (cherry picked from commit 113b727ce788335cf76f65355d670c9bc130fd75) | ||||
| Signed-off-by: Hanna Reitz <hreitz@redhat.com> | ||||
| ---
 | ||||
|  block/io.c | 6 +++++- | ||||
|  1 file changed, 5 insertions(+), 1 deletion(-) | ||||
| 
 | ||||
| diff --git a/block/io.c b/block/io.c
 | ||||
| index bb0a254def..4e4cb556c5 100644
 | ||||
| --- a/block/io.c
 | ||||
| +++ b/block/io.c
 | ||||
| @@ -2497,8 +2497,12 @@ static int coroutine_fn bdrv_co_block_status(BlockDriverState *bs,
 | ||||
|               * non-protocol nodes, and then it is never used.  However, filling | ||||
|               * the cache requires an RCU update, so double check here to avoid | ||||
|               * such an update if possible. | ||||
| +             *
 | ||||
| +             * Check want_zero, because we only want to update the cache when we
 | ||||
| +             * have accurate information about what is zero and what is data.
 | ||||
|               */ | ||||
| -            if (ret == (BDRV_BLOCK_DATA | BDRV_BLOCK_OFFSET_VALID) &&
 | ||||
| +            if (want_zero &&
 | ||||
| +                ret == (BDRV_BLOCK_DATA | BDRV_BLOCK_OFFSET_VALID) &&
 | ||||
|                  QLIST_EMPTY(&bs->children)) | ||||
|              { | ||||
|                  /* | ||||
| -- 
 | ||||
| 2.27.0 | ||||
| 
 | ||||
| @ -0,0 +1,52 @@ | ||||
| From 76b03619435d0b2f0125ee7aa5c94f2b889247de Mon Sep 17 00:00:00 2001 | ||||
| From: Hanna Reitz <hreitz@redhat.com> | ||||
| Date: Fri, 4 Feb 2022 12:10:08 +0100 | ||||
| Subject: [PATCH 4/8] block/nbd: Assert there are no timers when closed | ||||
| 
 | ||||
| RH-Author: Hanna Reitz <hreitz@redhat.com> | ||||
| RH-MergeRequest: 74: block/nbd: Handle AioContext changes | ||||
| RH-Commit: [2/6] 56903457ca35d9c596aeb6827a48f80e8eabd66a (hreitz/qemu-kvm-c-9-s) | ||||
| RH-Bugzilla: 2033626 | ||||
| RH-Acked-by: Miroslav Rezanina <mrezanin@redhat.com> | ||||
| RH-Acked-by: Eric Blake <eblake@redhat.com> | ||||
| RH-Acked-by: Stefan Hajnoczi <stefanha@redhat.com> | ||||
| 
 | ||||
| Our two timers must not remain armed beyond nbd_clear_bdrvstate(), or | ||||
| they will access freed data when they fire. | ||||
| 
 | ||||
| This patch is separate from the patches that actually fix the issue | ||||
| (HEAD^^ and HEAD^) so that you can run the associated regression iotest | ||||
| (281) on a configuration that reproducibly exposes the bug. | ||||
| 
 | ||||
| Reviewed-by: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com> | ||||
| Signed-off-by: Hanna Reitz <hreitz@redhat.com> | ||||
| Signed-off-by: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com> | ||||
| (cherry picked from commit 8a39c381e5e407d2fe5500324323f90a8540fa90) | ||||
| 
 | ||||
| Conflict: | ||||
| - block/nbd.c: open_timer was introduced after the 6.2 release (for
 | ||||
|   nbd's @open-timeout parameter), and has not been backported, so drop | ||||
|   the assertion that it is NULL | ||||
| 
 | ||||
| Signed-off-by: Hanna Reitz <hreitz@redhat.com> | ||||
| ---
 | ||||
|  block/nbd.c | 3 +++ | ||||
|  1 file changed, 3 insertions(+) | ||||
| 
 | ||||
| diff --git a/block/nbd.c b/block/nbd.c
 | ||||
| index b8e5a9b4cc..aab20125d8 100644
 | ||||
| --- a/block/nbd.c
 | ||||
| +++ b/block/nbd.c
 | ||||
| @@ -108,6 +108,9 @@ static void nbd_clear_bdrvstate(BlockDriverState *bs)
 | ||||
|   | ||||
|      yank_unregister_instance(BLOCKDEV_YANK_INSTANCE(bs->node_name)); | ||||
|   | ||||
| +    /* Must not leave timers behind that would access freed data */
 | ||||
| +    assert(!s->reconnect_delay_timer);
 | ||||
| +
 | ||||
|      object_unref(OBJECT(s->tlscreds)); | ||||
|      qapi_free_SocketAddress(s->saddr); | ||||
|      s->saddr = NULL; | ||||
| -- 
 | ||||
| 2.27.0 | ||||
| 
 | ||||
| @ -0,0 +1,54 @@ | ||||
| From eeb4683ad8c40a03a4e91463ec1d1b651974b744 Mon Sep 17 00:00:00 2001 | ||||
| From: Hanna Reitz <hreitz@redhat.com> | ||||
| Date: Fri, 4 Feb 2022 12:10:06 +0100 | ||||
| Subject: [PATCH 3/8] block/nbd: Delete reconnect delay timer when done | ||||
| 
 | ||||
| RH-Author: Hanna Reitz <hreitz@redhat.com> | ||||
| RH-MergeRequest: 74: block/nbd: Handle AioContext changes | ||||
| RH-Commit: [1/6] 34f92910b6ffd256d781109a2b39737fc6ab449c (hreitz/qemu-kvm-c-9-s) | ||||
| RH-Bugzilla: 2033626 | ||||
| RH-Acked-by: Miroslav Rezanina <mrezanin@redhat.com> | ||||
| RH-Acked-by: Eric Blake <eblake@redhat.com> | ||||
| RH-Acked-by: Stefan Hajnoczi <stefanha@redhat.com> | ||||
| 
 | ||||
| We start the reconnect delay timer to cancel the reconnection attempt | ||||
| after a while.  Once nbd_co_do_establish_connection() has returned, this | ||||
| attempt is over, and we no longer need the timer. | ||||
| 
 | ||||
| Delete it before returning from nbd_reconnect_attempt(), so that it does | ||||
| not persist beyond the I/O request that was paused for reconnecting; we | ||||
| do not want it to fire in a drained section, because all sort of things | ||||
| can happen in such a section (e.g. the AioContext might be changed, and | ||||
| we do not want the timer to fire in the wrong context; or the BDS might | ||||
| even be deleted, and so the timer CB would access already-freed data). | ||||
| 
 | ||||
| Reviewed-by: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com> | ||||
| Signed-off-by: Hanna Reitz <hreitz@redhat.com> | ||||
| Signed-off-by: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com> | ||||
| (cherry picked from commit 3ce1fc16bad9c3f8b7b10b451a224d6d76e5c551) | ||||
| Signed-off-by: Hanna Reitz <hreitz@redhat.com> | ||||
| ---
 | ||||
|  block/nbd.c | 7 +++++++ | ||||
|  1 file changed, 7 insertions(+) | ||||
| 
 | ||||
| diff --git a/block/nbd.c b/block/nbd.c
 | ||||
| index 5ef462db1b..b8e5a9b4cc 100644
 | ||||
| --- a/block/nbd.c
 | ||||
| +++ b/block/nbd.c
 | ||||
| @@ -353,6 +353,13 @@ static coroutine_fn void nbd_reconnect_attempt(BDRVNBDState *s)
 | ||||
|      } | ||||
|   | ||||
|      nbd_co_do_establish_connection(s->bs, NULL); | ||||
| +
 | ||||
| +    /*
 | ||||
| +     * The reconnect attempt is done (maybe successfully, maybe not), so
 | ||||
| +     * we no longer need this timer.  Delete it so it will not outlive
 | ||||
| +     * this I/O request (so draining removes all timers).
 | ||||
| +     */
 | ||||
| +    reconnect_delay_timer_del(s);
 | ||||
|  } | ||||
|   | ||||
|  static coroutine_fn int nbd_receive_replies(BDRVNBDState *s, uint64_t handle) | ||||
| -- 
 | ||||
| 2.27.0 | ||||
| 
 | ||||
							
								
								
									
										107
									
								
								SOURCES/kvm-block-nbd-Move-s-ioc-on-AioContext-change.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										107
									
								
								SOURCES/kvm-block-nbd-Move-s-ioc-on-AioContext-change.patch
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,107 @@ | ||||
| From 6d9d86cc4e6149d4c0793e8ceb65dab7535a4561 Mon Sep 17 00:00:00 2001 | ||||
| From: Hanna Reitz <hreitz@redhat.com> | ||||
| Date: Fri, 4 Feb 2022 12:10:11 +0100 | ||||
| Subject: [PATCH 7/8] block/nbd: Move s->ioc on AioContext change | ||||
| 
 | ||||
| RH-Author: Hanna Reitz <hreitz@redhat.com> | ||||
| RH-MergeRequest: 74: block/nbd: Handle AioContext changes | ||||
| RH-Commit: [5/6] b3c1eb21ac70d64fdac6094468a72cfbe50a30a9 (hreitz/qemu-kvm-c-9-s) | ||||
| RH-Bugzilla: 2033626 | ||||
| RH-Acked-by: Miroslav Rezanina <mrezanin@redhat.com> | ||||
| RH-Acked-by: Eric Blake <eblake@redhat.com> | ||||
| RH-Acked-by: Stefan Hajnoczi <stefanha@redhat.com> | ||||
| 
 | ||||
| s->ioc must always be attached to the NBD node's AioContext.  If that | ||||
| context changes, s->ioc must be attached to the new context. | ||||
| 
 | ||||
| Buglink: https://bugzilla.redhat.com/show_bug.cgi?id=2033626 | ||||
| Reviewed-by: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com> | ||||
| Signed-off-by: Hanna Reitz <hreitz@redhat.com> | ||||
| Signed-off-by: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com> | ||||
| (cherry picked from commit e15f3a66c830e3fce99c9d56c493c2f7078a1225) | ||||
| 
 | ||||
| Conflict: | ||||
| - block/nbd.c: open_timer was added after the 6.2 release, so we need
 | ||||
|   not (and cannot) assert it is NULL here. | ||||
| 
 | ||||
| Signed-off-by: Hanna Reitz <hreitz@redhat.com> | ||||
| ---
 | ||||
|  block/nbd.c | 41 +++++++++++++++++++++++++++++++++++++++++ | ||||
|  1 file changed, 41 insertions(+) | ||||
| 
 | ||||
| diff --git a/block/nbd.c b/block/nbd.c
 | ||||
| index aab20125d8..a3896c7f5f 100644
 | ||||
| --- a/block/nbd.c
 | ||||
| +++ b/block/nbd.c
 | ||||
| @@ -2003,6 +2003,38 @@ static void nbd_cancel_in_flight(BlockDriverState *bs)
 | ||||
|      nbd_co_establish_connection_cancel(s->conn); | ||||
|  } | ||||
|   | ||||
| +static void nbd_attach_aio_context(BlockDriverState *bs,
 | ||||
| +                                   AioContext *new_context)
 | ||||
| +{
 | ||||
| +    BDRVNBDState *s = bs->opaque;
 | ||||
| +
 | ||||
| +    /*
 | ||||
| +     * The reconnect_delay_timer is scheduled in I/O paths when the
 | ||||
| +     * connection is lost, to cancel the reconnection attempt after a
 | ||||
| +     * given time.  Once this attempt is done (successfully or not),
 | ||||
| +     * nbd_reconnect_attempt() ensures the timer is deleted before the
 | ||||
| +     * respective I/O request is resumed.
 | ||||
| +     * Since the AioContext can only be changed when a node is drained,
 | ||||
| +     * the reconnect_delay_timer cannot be active here.
 | ||||
| +     */
 | ||||
| +    assert(!s->reconnect_delay_timer);
 | ||||
| +
 | ||||
| +    if (s->ioc) {
 | ||||
| +        qio_channel_attach_aio_context(s->ioc, new_context);
 | ||||
| +    }
 | ||||
| +}
 | ||||
| +
 | ||||
| +static void nbd_detach_aio_context(BlockDriverState *bs)
 | ||||
| +{
 | ||||
| +    BDRVNBDState *s = bs->opaque;
 | ||||
| +
 | ||||
| +    assert(!s->reconnect_delay_timer);
 | ||||
| +
 | ||||
| +    if (s->ioc) {
 | ||||
| +        qio_channel_detach_aio_context(s->ioc);
 | ||||
| +    }
 | ||||
| +}
 | ||||
| +
 | ||||
|  static BlockDriver bdrv_nbd = { | ||||
|      .format_name                = "nbd", | ||||
|      .protocol_name              = "nbd", | ||||
| @@ -2026,6 +2058,9 @@ static BlockDriver bdrv_nbd = {
 | ||||
|      .bdrv_dirname               = nbd_dirname, | ||||
|      .strong_runtime_opts        = nbd_strong_runtime_opts, | ||||
|      .bdrv_cancel_in_flight      = nbd_cancel_in_flight, | ||||
| +
 | ||||
| +    .bdrv_attach_aio_context    = nbd_attach_aio_context,
 | ||||
| +    .bdrv_detach_aio_context    = nbd_detach_aio_context,
 | ||||
|  }; | ||||
|   | ||||
|  static BlockDriver bdrv_nbd_tcp = { | ||||
| @@ -2051,6 +2086,9 @@ static BlockDriver bdrv_nbd_tcp = {
 | ||||
|      .bdrv_dirname               = nbd_dirname, | ||||
|      .strong_runtime_opts        = nbd_strong_runtime_opts, | ||||
|      .bdrv_cancel_in_flight      = nbd_cancel_in_flight, | ||||
| +
 | ||||
| +    .bdrv_attach_aio_context    = nbd_attach_aio_context,
 | ||||
| +    .bdrv_detach_aio_context    = nbd_detach_aio_context,
 | ||||
|  }; | ||||
|   | ||||
|  static BlockDriver bdrv_nbd_unix = { | ||||
| @@ -2076,6 +2114,9 @@ static BlockDriver bdrv_nbd_unix = {
 | ||||
|      .bdrv_dirname               = nbd_dirname, | ||||
|      .strong_runtime_opts        = nbd_strong_runtime_opts, | ||||
|      .bdrv_cancel_in_flight      = nbd_cancel_in_flight, | ||||
| +
 | ||||
| +    .bdrv_attach_aio_context    = nbd_attach_aio_context,
 | ||||
| +    .bdrv_detach_aio_context    = nbd_detach_aio_context,
 | ||||
|  }; | ||||
|   | ||||
|  static void bdrv_nbd_init(void) | ||||
| -- 
 | ||||
| 2.27.0 | ||||
| 
 | ||||
| @ -0,0 +1,71 @@ | ||||
| From 6989be9d0aa08470f8b287c243dc4bf027d5fbcf Mon Sep 17 00:00:00 2001 | ||||
| From: Stefan Hajnoczi <stefanha@redhat.com> | ||||
| Date: Wed, 8 Dec 2021 15:22:46 +0000 | ||||
| Subject: [PATCH 1/2] block/nvme: fix infinite loop in nvme_free_req_queue_cb() | ||||
| MIME-Version: 1.0 | ||||
| Content-Type: text/plain; charset=UTF-8 | ||||
| Content-Transfer-Encoding: 8bit | ||||
| 
 | ||||
| RH-Author: Stefan Hajnoczi <stefanha@redhat.com> | ||||
| RH-MergeRequest: 58: block/nvme: fix infinite loop in nvme_free_req_queue_cb() | ||||
| RH-Commit: [1/1] 544b3f310d791a20c63b51947de0c6cbb60b0d5b (stefanha/centos-stream-qemu-kvm) | ||||
| RH-Bugzilla: 2024544 | ||||
| RH-Acked-by: Kevin Wolf <kwolf@redhat.com> | ||||
| RH-Acked-by: Stefano Garzarella <sgarzare@redhat.com> | ||||
| RH-Acked-by: Hanna Reitz <hreitz@redhat.com> | ||||
| 
 | ||||
| When the request free list is exhausted the coroutine waits on | ||||
| q->free_req_queue for the next free request. Whenever a request is | ||||
| completed a BH is scheduled to invoke nvme_free_req_queue_cb() and wake | ||||
| up waiting coroutines. | ||||
| 
 | ||||
| 1. nvme_get_free_req() waits for a free request: | ||||
| 
 | ||||
|     while (q->free_req_head == -1) { | ||||
|         ... | ||||
|             trace_nvme_free_req_queue_wait(q->s, q->index); | ||||
|             qemu_co_queue_wait(&q->free_req_queue, &q->lock); | ||||
|         ... | ||||
|     } | ||||
| 
 | ||||
| 2. nvme_free_req_queue_cb() wakes up the coroutine: | ||||
| 
 | ||||
|     while (qemu_co_enter_next(&q->free_req_queue, &q->lock)) { | ||||
|        ^--- infinite loop when free_req_head == -1 | ||||
|     } | ||||
| 
 | ||||
| nvme_free_req_queue_cb() and the coroutine form an infinite loop when | ||||
| q->free_req_head == -1. Fix this by checking q->free_req_head in | ||||
| nvme_free_req_queue_cb(). If the free request list is exhausted, don't | ||||
| wake waiting coroutines. Eventually an in-flight request will complete | ||||
| and the BH will be scheduled again, guaranteeing forward progress. | ||||
| 
 | ||||
| Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com> | ||||
| Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com> | ||||
| Message-id: 20211208152246.244585-1-stefanha@redhat.com | ||||
| Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com> | ||||
| (cherry picked from commit cf4fbc3030c974fff726756a7ceef8386cdf500b) | ||||
| Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com> | ||||
| ---
 | ||||
|  block/nvme.c | 5 +++-- | ||||
|  1 file changed, 3 insertions(+), 2 deletions(-) | ||||
| 
 | ||||
| diff --git a/block/nvme.c b/block/nvme.c
 | ||||
| index e4f336d79c..fa360b9b3c 100644
 | ||||
| --- a/block/nvme.c
 | ||||
| +++ b/block/nvme.c
 | ||||
| @@ -206,8 +206,9 @@ static void nvme_free_req_queue_cb(void *opaque)
 | ||||
|      NVMeQueuePair *q = opaque; | ||||
|   | ||||
|      qemu_mutex_lock(&q->lock); | ||||
| -    while (qemu_co_enter_next(&q->free_req_queue, &q->lock)) {
 | ||||
| -        /* Retry all pending requests */
 | ||||
| +    while (q->free_req_head != -1 &&
 | ||||
| +           qemu_co_enter_next(&q->free_req_queue, &q->lock)) {
 | ||||
| +        /* Retry waiting requests */
 | ||||
|      } | ||||
|      qemu_mutex_unlock(&q->lock); | ||||
|  } | ||||
| -- 
 | ||||
| 2.27.0 | ||||
| 
 | ||||
| @ -0,0 +1,59 @@ | ||||
| From d374d5aa4485a0c62d6b48eec64491cae2fd0873 Mon Sep 17 00:00:00 2001 | ||||
| From: Peter Lieven <pl@kamp.de> | ||||
| Date: Thu, 13 Jan 2022 15:44:25 +0100 | ||||
| Subject: [PATCH 4/5] block/rbd: fix handling of holes in .bdrv_co_block_status | ||||
| 
 | ||||
| RH-Author: Stefano Garzarella <sgarzare@redhat.com> | ||||
| RH-MergeRequest: 68: block/rbd: fix handling of holes in .bdrv_co_block_status | ||||
| RH-Commit: [1/2] 8ef178b01885e3c292f7844ccff865b1a8d4faf0 (sgarzarella/qemu-kvm-c-9-s) | ||||
| RH-Bugzilla: 2034791 | ||||
| RH-Acked-by: Miroslav Rezanina <mrezanin@redhat.com> | ||||
| RH-Acked-by: Kevin Wolf <kwolf@redhat.com> | ||||
| RH-Acked-by: Hanna Reitz <hreitz@redhat.com> | ||||
| 
 | ||||
| the assumption that we can't hit a hole if we do not diff against a snapshot was wrong. | ||||
| 
 | ||||
| We can see a hole in an image if we diff against base if there exists an older snapshot | ||||
| of the image and we have discarded blocks in the image where the snapshot has data. | ||||
| 
 | ||||
| Fix this by simply handling a hole like an unallocated area. There are no callbacks | ||||
| for unallocated areas so just bail out if we hit a hole. | ||||
| 
 | ||||
| Fixes: 0347a8fd4c3faaedf119be04c197804be40a384b | ||||
| Suggested-by: Ilya Dryomov <idryomov@gmail.com> | ||||
| Cc: qemu-stable@nongnu.org | ||||
| Signed-off-by: Peter Lieven <pl@kamp.de> | ||||
| Message-Id: <20220113144426.4036493-2-pl@kamp.de> | ||||
| Reviewed-by: Ilya Dryomov <idryomov@gmail.com> | ||||
| Reviewed-by: Stefano Garzarella <sgarzare@redhat.com> | ||||
| Signed-off-by: Kevin Wolf <kwolf@redhat.com> | ||||
| (cherry picked from commit 9e302f64bb407a9bb097b626da97228c2654cfee) | ||||
| Signed-off-by: Stefano Garzarella <sgarzare@redhat.com> | ||||
| ---
 | ||||
|  block/rbd.c | 10 +++++----- | ||||
|  1 file changed, 5 insertions(+), 5 deletions(-) | ||||
| 
 | ||||
| diff --git a/block/rbd.c b/block/rbd.c
 | ||||
| index def96292e0..20bb896c4a 100644
 | ||||
| --- a/block/rbd.c
 | ||||
| +++ b/block/rbd.c
 | ||||
| @@ -1279,11 +1279,11 @@ static int qemu_rbd_diff_iterate_cb(uint64_t offs, size_t len,
 | ||||
|      RBDDiffIterateReq *req = opaque; | ||||
|   | ||||
|      assert(req->offs + req->bytes <= offs); | ||||
| -    /*
 | ||||
| -     * we do not diff against a snapshot so we should never receive a callback
 | ||||
| -     * for a hole.
 | ||||
| -     */
 | ||||
| -    assert(exists);
 | ||||
| +
 | ||||
| +    /* treat a hole like an unallocated area and bail out */
 | ||||
| +    if (!exists) {
 | ||||
| +        return 0;
 | ||||
| +    }
 | ||||
|   | ||||
|      if (!req->exists && offs > req->offs) { | ||||
|          /* | ||||
| -- 
 | ||||
| 2.27.0 | ||||
| 
 | ||||
							
								
								
									
										103
									
								
								SOURCES/kvm-block-rbd-workaround-for-ceph-issue-53784.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										103
									
								
								SOURCES/kvm-block-rbd-workaround-for-ceph-issue-53784.patch
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,103 @@ | ||||
| From f035b5250529eed8d12e0b93b1b6d6f2c50003f6 Mon Sep 17 00:00:00 2001 | ||||
| From: Peter Lieven <pl@kamp.de> | ||||
| Date: Thu, 13 Jan 2022 15:44:26 +0100 | ||||
| Subject: [PATCH 5/5] block/rbd: workaround for ceph issue #53784 | ||||
| 
 | ||||
| RH-Author: Stefano Garzarella <sgarzare@redhat.com> | ||||
| RH-MergeRequest: 68: block/rbd: fix handling of holes in .bdrv_co_block_status | ||||
| RH-Commit: [2/2] 5feaa2e20a77886cc1a84cdf212ade3dcda28289 (sgarzarella/qemu-kvm-c-9-s) | ||||
| RH-Bugzilla: 2034791 | ||||
| RH-Acked-by: Miroslav Rezanina <mrezanin@redhat.com> | ||||
| RH-Acked-by: Kevin Wolf <kwolf@redhat.com> | ||||
| RH-Acked-by: Hanna Reitz <hreitz@redhat.com> | ||||
| 
 | ||||
| librbd had a bug until early 2022 that affected all versions of ceph that | ||||
| supported fast-diff. This bug results in reporting of incorrect offsets | ||||
| if the offset parameter to rbd_diff_iterate2 is not object aligned. | ||||
| 
 | ||||
| This patch works around this bug for pre Quincy versions of librbd. | ||||
| 
 | ||||
| Fixes: 0347a8fd4c3faaedf119be04c197804be40a384b | ||||
| Cc: qemu-stable@nongnu.org | ||||
| Signed-off-by: Peter Lieven <pl@kamp.de> | ||||
| Message-Id: <20220113144426.4036493-3-pl@kamp.de> | ||||
| Reviewed-by: Ilya Dryomov <idryomov@gmail.com> | ||||
| Reviewed-by: Stefano Garzarella <sgarzare@redhat.com> | ||||
| Tested-by: Stefano Garzarella <sgarzare@redhat.com> | ||||
| Signed-off-by: Kevin Wolf <kwolf@redhat.com> | ||||
| (cherry picked from commit fc176116cdea816ceb8dd969080b2b95f58edbc0) | ||||
| Signed-off-by: Stefano Garzarella <sgarzare@redhat.com> | ||||
| ---
 | ||||
|  block/rbd.c | 42 ++++++++++++++++++++++++++++++++++++++++-- | ||||
|  1 file changed, 40 insertions(+), 2 deletions(-) | ||||
| 
 | ||||
| diff --git a/block/rbd.c b/block/rbd.c
 | ||||
| index 20bb896c4a..8f183eba2a 100644
 | ||||
| --- a/block/rbd.c
 | ||||
| +++ b/block/rbd.c
 | ||||
| @@ -1320,6 +1320,7 @@ static int coroutine_fn qemu_rbd_co_block_status(BlockDriverState *bs,
 | ||||
|      int status, r; | ||||
|      RBDDiffIterateReq req = { .offs = offset }; | ||||
|      uint64_t features, flags; | ||||
| +    uint64_t head = 0;
 | ||||
|   | ||||
|      assert(offset + bytes <= s->image_size); | ||||
|   | ||||
| @@ -1347,7 +1348,43 @@ static int coroutine_fn qemu_rbd_co_block_status(BlockDriverState *bs,
 | ||||
|          return status; | ||||
|      } | ||||
|   | ||||
| -    r = rbd_diff_iterate2(s->image, NULL, offset, bytes, true, true,
 | ||||
| +#if LIBRBD_VERSION_CODE < LIBRBD_VERSION(1, 17, 0)
 | ||||
| +    /*
 | ||||
| +     * librbd had a bug until early 2022 that affected all versions of ceph that
 | ||||
| +     * supported fast-diff. This bug results in reporting of incorrect offsets
 | ||||
| +     * if the offset parameter to rbd_diff_iterate2 is not object aligned.
 | ||||
| +     * Work around this bug by rounding down the offset to object boundaries.
 | ||||
| +     * This is OK because we call rbd_diff_iterate2 with whole_object = true.
 | ||||
| +     * However, this workaround only works for non cloned images with default
 | ||||
| +     * striping.
 | ||||
| +     *
 | ||||
| +     * See: https://tracker.ceph.com/issues/53784
 | ||||
| +     */
 | ||||
| +
 | ||||
| +    /* check if RBD image has non-default striping enabled */
 | ||||
| +    if (features & RBD_FEATURE_STRIPINGV2) {
 | ||||
| +        return status;
 | ||||
| +    }
 | ||||
| +
 | ||||
| +#pragma GCC diagnostic push
 | ||||
| +#pragma GCC diagnostic ignored "-Wdeprecated-declarations"
 | ||||
| +    /*
 | ||||
| +     * check if RBD image is a clone (= has a parent).
 | ||||
| +     *
 | ||||
| +     * rbd_get_parent_info is deprecated from Nautilus onwards, but the
 | ||||
| +     * replacement rbd_get_parent is not present in Luminous and Mimic.
 | ||||
| +     */
 | ||||
| +    if (rbd_get_parent_info(s->image, NULL, 0, NULL, 0, NULL, 0) != -ENOENT) {
 | ||||
| +        return status;
 | ||||
| +    }
 | ||||
| +#pragma GCC diagnostic pop
 | ||||
| +
 | ||||
| +    head = req.offs & (s->object_size - 1);
 | ||||
| +    req.offs -= head;
 | ||||
| +    bytes += head;
 | ||||
| +#endif
 | ||||
| +
 | ||||
| +    r = rbd_diff_iterate2(s->image, NULL, req.offs, bytes, true, true,
 | ||||
|                            qemu_rbd_diff_iterate_cb, &req); | ||||
|      if (r < 0 && r != QEMU_RBD_EXIT_DIFF_ITERATE2) { | ||||
|          return status; | ||||
| @@ -1366,7 +1403,8 @@ static int coroutine_fn qemu_rbd_co_block_status(BlockDriverState *bs,
 | ||||
|          status = BDRV_BLOCK_ZERO | BDRV_BLOCK_OFFSET_VALID; | ||||
|      } | ||||
|   | ||||
| -    *pnum = req.bytes;
 | ||||
| +    assert(req.bytes > head);
 | ||||
| +    *pnum = req.bytes - head;
 | ||||
|      return status; | ||||
|  } | ||||
|   | ||||
| -- 
 | ||||
| 2.27.0 | ||||
| 
 | ||||
							
								
								
									
										77
									
								
								SOURCES/kvm-doc-Add-the-SGX-numa-description.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										77
									
								
								SOURCES/kvm-doc-Add-the-SGX-numa-description.patch
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,77 @@ | ||||
| From eb88a12ab1ecfe77bcc0d0067c96fce27a3bde01 Mon Sep 17 00:00:00 2001 | ||||
| From: Yang Zhong <yang.zhong@intel.com> | ||||
| Date: Mon, 1 Nov 2021 12:20:08 -0400 | ||||
| Subject: [PATCH 03/12] doc: Add the SGX numa description | ||||
| 
 | ||||
| RH-Author: Paul Lai <plai@redhat.com> | ||||
| RH-MergeRequest: 65: Enable SGX and add SGX Numa support | ||||
| RH-Commit: [3/5] c27b3f6976cbe92cc3c0e1dab0191cdd25de596a | ||||
| RH-Bugzilla: 2033708 | ||||
| RH-Acked-by: Paolo Bonzini <None> | ||||
| RH-Acked-by: Bandan Das <None> | ||||
| RH-Acked-by: Cornelia Huck <cohuck@redhat.com> | ||||
| 
 | ||||
| Add the SGX numa reference command and how to check if | ||||
| SGX numa is support or not with multiple EPC sections. | ||||
| 
 | ||||
| Signed-off-by: Yang Zhong <yang.zhong@intel.com> | ||||
| Message-Id: <20211101162009.62161-5-yang.zhong@intel.com> | ||||
| Signed-off-by: Paolo Bonzini <pbonzini@redhat.com> | ||||
| (cherry picked from commit d1889b36098c79e2e6ac90faf3d0dc5ec0057677) | ||||
| Signed-off-by: Paul Lai <plai@redhat.com> | ||||
| ---
 | ||||
|  docs/system/i386/sgx.rst | 31 +++++++++++++++++++++++++++---- | ||||
|  1 file changed, 27 insertions(+), 4 deletions(-) | ||||
| 
 | ||||
| diff --git a/docs/system/i386/sgx.rst b/docs/system/i386/sgx.rst
 | ||||
| index f8fade5ac2..0f0a73f758 100644
 | ||||
| --- a/docs/system/i386/sgx.rst
 | ||||
| +++ b/docs/system/i386/sgx.rst
 | ||||
| @@ -141,8 +141,7 @@ To launch a SGX guest:
 | ||||
|    |qemu_system_x86| \\ | ||||
|     -cpu host,+sgx-provisionkey \\ | ||||
|     -object memory-backend-epc,id=mem1,size=64M,prealloc=on \\ | ||||
| -   -object memory-backend-epc,id=mem2,size=28M \\
 | ||||
| -   -M sgx-epc.0.memdev=mem1,sgx-epc.1.memdev=mem2
 | ||||
| +   -M sgx-epc.0.memdev=mem1,sgx-epc.0.node=0
 | ||||
|   | ||||
|  Utilizing SGX in the guest requires a kernel/OS with SGX support. | ||||
|  The support can be determined in guest by:: | ||||
| @@ -152,8 +151,32 @@ The support can be determined in guest by::
 | ||||
|  and SGX epc info by:: | ||||
|   | ||||
|    $ dmesg | grep sgx | ||||
| -  [    1.242142] sgx: EPC section 0x180000000-0x181bfffff
 | ||||
| -  [    1.242319] sgx: EPC section 0x181c00000-0x1837fffff
 | ||||
| +  [    0.182807] sgx: EPC section 0x140000000-0x143ffffff
 | ||||
| +  [    0.183695] sgx: [Firmware Bug]: Unable to map EPC section to online node. Fallback to the NUMA node 0.
 | ||||
| +
 | ||||
| +To launch a SGX numa guest:
 | ||||
| +
 | ||||
| +.. parsed-literal::
 | ||||
| +
 | ||||
| +  |qemu_system_x86| \\
 | ||||
| +   -cpu host,+sgx-provisionkey \\
 | ||||
| +   -object memory-backend-ram,size=2G,host-nodes=0,policy=bind,id=node0 \\
 | ||||
| +   -object memory-backend-epc,id=mem0,size=64M,prealloc=on,host-nodes=0,policy=bind \\
 | ||||
| +   -numa node,nodeid=0,cpus=0-1,memdev=node0 \\
 | ||||
| +   -object memory-backend-ram,size=2G,host-nodes=1,policy=bind,id=node1 \\
 | ||||
| +   -object memory-backend-epc,id=mem1,size=28M,prealloc=on,host-nodes=1,policy=bind \\
 | ||||
| +   -numa node,nodeid=1,cpus=2-3,memdev=node1 \\
 | ||||
| +   -M sgx-epc.0.memdev=mem0,sgx-epc.0.node=0,sgx-epc.1.memdev=mem1,sgx-epc.1.node=1
 | ||||
| +
 | ||||
| +and SGX epc numa info by::
 | ||||
| +
 | ||||
| +  $ dmesg | grep sgx
 | ||||
| +  [    0.369937] sgx: EPC section 0x180000000-0x183ffffff
 | ||||
| +  [    0.370259] sgx: EPC section 0x184000000-0x185bfffff
 | ||||
| +
 | ||||
| +  $ dmesg | grep SRAT
 | ||||
| +  [    0.009981] ACPI: SRAT: Node 0 PXM 0 [mem 0x180000000-0x183ffffff]
 | ||||
| +  [    0.009982] ACPI: SRAT: Node 1 PXM 1 [mem 0x184000000-0x185bfffff]
 | ||||
|   | ||||
|  References | ||||
|  ---------- | ||||
| -- 
 | ||||
| 2.27.0 | ||||
| 
 | ||||
							
								
								
									
										61
									
								
								SOURCES/kvm-hw-arm-smmuv3-Fix-device-reset.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										61
									
								
								SOURCES/kvm-hw-arm-smmuv3-Fix-device-reset.patch
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,61 @@ | ||||
| From c08c3fbb2bb8494738fd34ec8fc9dc434ce82f4b Mon Sep 17 00:00:00 2001 | ||||
| From: Eric Auger <eric.auger@redhat.com> | ||||
| Date: Wed, 2 Feb 2022 12:16:02 +0100 | ||||
| Subject: [PATCH 12/12] hw/arm/smmuv3: Fix device reset | ||||
| 
 | ||||
| RH-Author: Eric Auger <eric.auger@redhat.com> | ||||
| RH-MergeRequest: 72: hw/arm/smmuv3: Fix device reset | ||||
| RH-Commit: [1/1] 2cfee2f7a03692681224fed96bb4f28406bf460a (eauger1/centos-qemu-kvm) | ||||
| RH-Bugzilla: 2042481 | ||||
| RH-Acked-by: Miroslav Rezanina <mrezanin@redhat.com> | ||||
| RH-Acked-by: Peter Xu <peterx@redhat.com> | ||||
| RH-Acked-by: Andrew Jones <drjones@redhat.com> | ||||
| 
 | ||||
| branch: c9s | ||||
| Brew: 42958737 | ||||
| Upstream: yes | ||||
| 
 | ||||
| We currently miss a bunch of register resets in the device reset | ||||
| function. This sometimes prevents the guest from rebooting after | ||||
| a system_reset (with virtio-blk-pci). For instance, we may get | ||||
| the following errors: | ||||
| 
 | ||||
| invalid STE | ||||
| smmuv3-iommu-memory-region-0-0 translation failed for iova=0x13a9d2000(SMMU_EVT_C_BAD_STE) | ||||
| Invalid read at addr 0x13A9D2000, size 2, region '(null)', reason: rejected | ||||
| invalid STE | ||||
| smmuv3-iommu-memory-region-0-0 translation failed for iova=0x13a9d2000(SMMU_EVT_C_BAD_STE) | ||||
| Invalid write at addr 0x13A9D2000, size 2, region '(null)', reason: rejected | ||||
| invalid STE | ||||
| 
 | ||||
| Signed-off-by: Eric Auger <eric.auger@redhat.com> | ||||
| Message-id: 20220202111602.627429-1-eric.auger@redhat.com | ||||
| Fixes: 10a83cb988 ("hw/arm/smmuv3: Skeleton") | ||||
| Reviewed-by: Peter Maydell <peter.maydell@linaro.org> | ||||
| Signed-off-by: Peter Maydell <peter.maydell@linaro.org> | ||||
| (cherry picked from commit 43530095e18fd16dcd51a4b385ad2a22c36f5698) | ||||
| Signed-off-by: Eric Auger <eric.auger@redhat.com> | ||||
| ---
 | ||||
|  hw/arm/smmuv3.c | 6 ++++++ | ||||
|  1 file changed, 6 insertions(+) | ||||
| 
 | ||||
| diff --git a/hw/arm/smmuv3.c b/hw/arm/smmuv3.c
 | ||||
| index 01b60bee49..1b5640bb98 100644
 | ||||
| --- a/hw/arm/smmuv3.c
 | ||||
| +++ b/hw/arm/smmuv3.c
 | ||||
| @@ -276,6 +276,12 @@ static void smmuv3_init_regs(SMMUv3State *s)
 | ||||
|      s->features = 0; | ||||
|      s->sid_split = 0; | ||||
|      s->aidr = 0x1; | ||||
| +    s->cr[0] = 0;
 | ||||
| +    s->cr0ack = 0;
 | ||||
| +    s->irq_ctrl = 0;
 | ||||
| +    s->gerror = 0;
 | ||||
| +    s->gerrorn = 0;
 | ||||
| +    s->statusr = 0;
 | ||||
|  } | ||||
|   | ||||
|  static int smmu_get_ste(SMMUv3State *s, dma_addr_t addr, STE *buf, | ||||
| -- 
 | ||||
| 2.27.0 | ||||
| 
 | ||||
| @ -0,0 +1,48 @@ | ||||
| From 6b0e129f0758ccd076d1ecbf85c8f1e863788981 Mon Sep 17 00:00:00 2001 | ||||
| From: Eric Auger <eric.auger@redhat.com> | ||||
| Date: Mon, 20 Dec 2021 10:11:47 +0100 | ||||
| Subject: [PATCH 5/6] hw/arm/virt: Add 9.0 machine type and remove 8.5 one | ||||
| 
 | ||||
| RH-Author: Eric Auger <eric.auger@redhat.com> | ||||
| RH-MergeRequest: 57: hw/arm/virt: Add 9.0 machine type and remove 8.5 one | ||||
| RH-Commit: [5/6] f573a2fb44882a010e2c6bf5f561f29d54e6e9b5 (eauger1/centos-qemu-kvm) | ||||
| RH-Bugzilla: 2031044 | ||||
| RH-Acked-by: Gavin Shan <gshan@redhat.com> | ||||
| RH-Acked-by: Andrew Jones <drjones@redhat.com> | ||||
| RH-Acked-by: Miroslav Rezanina <mrezanin@redhat.com> | ||||
| 
 | ||||
| branch: c9s | ||||
| Brew: 42213566 | ||||
| Upstream: no | ||||
| 
 | ||||
| Add 9.0 machine type and remove 8.5 one. | ||||
| 
 | ||||
| Signed-off-by: Eric Auger <eric.auger@redhat.com> | ||||
| ---
 | ||||
|  hw/arm/virt.c | 10 ++-------- | ||||
|  1 file changed, 2 insertions(+), 8 deletions(-) | ||||
| 
 | ||||
| diff --git a/hw/arm/virt.c b/hw/arm/virt.c
 | ||||
| index d433139479..d537706a86 100644
 | ||||
| --- a/hw/arm/virt.c
 | ||||
| +++ b/hw/arm/virt.c
 | ||||
| @@ -3236,14 +3236,8 @@ static void rhel_machine_init(void)
 | ||||
|  } | ||||
|  type_init(rhel_machine_init); | ||||
|   | ||||
| -static void rhel850_virt_options(MachineClass *mc)
 | ||||
| +static void rhel900_virt_options(MachineClass *mc)
 | ||||
|  { | ||||
| -    VirtMachineClass *vmc = VIRT_MACHINE_CLASS(OBJECT_CLASS(mc));
 | ||||
| -
 | ||||
|      compat_props_add(mc->compat_props, arm_rhel_compat, arm_rhel_compat_len); | ||||
| -    compat_props_add(mc->compat_props, hw_compat_rhel_8_5, hw_compat_rhel_8_5_len);
 | ||||
| -    mc->smp_props.prefer_sockets = true;
 | ||||
| -    vmc->no_cpu_topology = true;
 | ||||
| -    vmc->no_tcg_its = true;
 | ||||
|  } | ||||
| -DEFINE_RHEL_MACHINE_AS_LATEST(8, 5, 0)
 | ||||
| +DEFINE_RHEL_MACHINE_AS_LATEST(9, 0, 0)
 | ||||
| -- 
 | ||||
| 2.27.0 | ||||
| 
 | ||||
| @ -0,0 +1,88 @@ | ||||
| From 4098f7b5aea8871a655bab43d5114d067662e6c5 Mon Sep 17 00:00:00 2001 | ||||
| From: Eric Auger <eric.auger@redhat.com> | ||||
| Date: Wed, 5 Jan 2022 16:17:10 +0100 | ||||
| Subject: [PATCH 6/6] hw/arm/virt: Check no_tcg_its and minor style changes | ||||
| 
 | ||||
| RH-Author: Eric Auger <eric.auger@redhat.com> | ||||
| RH-MergeRequest: 57: hw/arm/virt: Add 9.0 machine type and remove 8.5 one | ||||
| RH-Commit: [6/6] 4480d569463fd3f637404539d3bd06b59cafbc88 (eauger1/centos-qemu-kvm) | ||||
| RH-Bugzilla: 2031044 | ||||
| RH-Acked-by: Gavin Shan <gshan@redhat.com> | ||||
| RH-Acked-by: Andrew Jones <drjones@redhat.com> | ||||
| RH-Acked-by: Miroslav Rezanina <mrezanin@redhat.com> | ||||
| 
 | ||||
| branch: c9s | ||||
| Brew: 42213566 | ||||
| Upstream: no | ||||
| 
 | ||||
| Truly allow TCG ITS instantiation according to the no_tcg_its | ||||
| class flag. Otherwise it is always set to false. | ||||
| 
 | ||||
| We also take benefit of this patch to do some minor non | ||||
| functional style changes to be closer to the upstream code. | ||||
| 
 | ||||
| Signed-off-by: Eric Auger <eric.auger@redhat.com> | ||||
| ---
 | ||||
|  hw/arm/virt.c | 16 ++++++++++++---- | ||||
|  1 file changed, 12 insertions(+), 4 deletions(-) | ||||
| 
 | ||||
| diff --git a/hw/arm/virt.c b/hw/arm/virt.c
 | ||||
| index d537706a86..0e691cbe81 100644
 | ||||
| --- a/hw/arm/virt.c
 | ||||
| +++ b/hw/arm/virt.c
 | ||||
| @@ -3163,6 +3163,7 @@ static void rhel_machine_class_init(ObjectClass *oc, void *data)
 | ||||
|                                            "in ACPI table header." | ||||
|                                            "The string may be up to 6 bytes in size"); | ||||
|   | ||||
| +
 | ||||
|      object_class_property_add_str(oc, "x-oem-table-id", | ||||
|                                    virt_get_oem_table_id, | ||||
|                                    virt_set_oem_table_id); | ||||
| @@ -3170,6 +3171,7 @@ static void rhel_machine_class_init(ObjectClass *oc, void *data)
 | ||||
|                                            "Override the default value of field OEM Table ID " | ||||
|                                            "in ACPI table header." | ||||
|                                            "The string may be up to 8 bytes in size"); | ||||
| +
 | ||||
|  } | ||||
|   | ||||
|  static void rhel_virt_instance_init(Object *obj) | ||||
| @@ -3194,26 +3196,32 @@ static void rhel_virt_instance_init(Object *obj)
 | ||||
|      } else { | ||||
|          /* Default allows ITS instantiation */ | ||||
|          vms->its = true; | ||||
| +
 | ||||
| +        if (vmc->no_tcg_its) {
 | ||||
| +            vms->tcg_its = false;
 | ||||
| +        } else {
 | ||||
| +            vms->tcg_its = true;
 | ||||
| +        }
 | ||||
|      } | ||||
|   | ||||
|      /* Default disallows iommu instantiation */ | ||||
|      vms->iommu = VIRT_IOMMU_NONE; | ||||
|   | ||||
| +    /* The default root bus is attached to iommu by default */
 | ||||
| +    vms->default_bus_bypass_iommu = false;
 | ||||
| +
 | ||||
|      /* Default disallows RAS instantiation and is non-configurable for RHEL */ | ||||
|      vms->ras = false; | ||||
|   | ||||
|      /* MTE is disabled by default and non-configurable for RHEL */ | ||||
|      vms->mte = false; | ||||
|   | ||||
| -    /* The default root bus is attached to iommu by default */
 | ||||
| -    vms->default_bus_bypass_iommu = false;
 | ||||
| -
 | ||||
|      vms->irqmap = a15irqmap; | ||||
|   | ||||
|      virt_flash_create(vms); | ||||
| +
 | ||||
|      vms->oem_id = g_strndup(ACPI_BUILD_APPNAME6, 6); | ||||
|      vms->oem_table_id = g_strndup(ACPI_BUILD_APPNAME8, 8); | ||||
| -
 | ||||
|  } | ||||
|   | ||||
|  static const TypeInfo rhel_machine_info = { | ||||
| -- 
 | ||||
| 2.27.0 | ||||
| 
 | ||||
							
								
								
									
										60
									
								
								SOURCES/kvm-hw-arm-virt-Expose-the-RAS-option.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										60
									
								
								SOURCES/kvm-hw-arm-virt-Expose-the-RAS-option.patch
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,60 @@ | ||||
| From 914d9f9eea5d0a944aa93682b03d3189ad37ec9b Mon Sep 17 00:00:00 2001 | ||||
| From: Eric Auger <eric.auger@redhat.com> | ||||
| Date: Mon, 20 Dec 2021 15:34:22 +0100 | ||||
| Subject: [PATCH 4/6] hw/arm/virt: Expose the 'RAS' option | ||||
| 
 | ||||
| RH-Author: Eric Auger <eric.auger@redhat.com> | ||||
| RH-MergeRequest: 57: hw/arm/virt: Add 9.0 machine type and remove 8.5 one | ||||
| RH-Commit: [4/6] c8704564d31b23a0f08a6ced946c9a81e2e72c11 (eauger1/centos-qemu-kvm) | ||||
| RH-Bugzilla: 2031044 | ||||
| RH-Acked-by: Gavin Shan <gshan@redhat.com> | ||||
| RH-Acked-by: Andrew Jones <drjones@redhat.com> | ||||
| RH-Acked-by: Miroslav Rezanina <mrezanin@redhat.com> | ||||
| 
 | ||||
| branch: c9s | ||||
| Brew: 42213566 | ||||
| Upstream: no | ||||
| 
 | ||||
| In RHEL9.0 we want to expose the 'RAS' option. | ||||
| 
 | ||||
| Signed-off-by: Eric Auger <eric.auger@redhat.com> | ||||
| ---
 | ||||
|  hw/arm/virt.c | 8 +++++++- | ||||
|  1 file changed, 7 insertions(+), 1 deletion(-) | ||||
| 
 | ||||
| diff --git a/hw/arm/virt.c b/hw/arm/virt.c
 | ||||
| index c99ca93e75..d433139479 100644
 | ||||
| --- a/hw/arm/virt.c
 | ||||
| +++ b/hw/arm/virt.c
 | ||||
| @@ -2348,7 +2348,6 @@ static void virt_set_acpi(Object *obj, Visitor *v, const char *name,
 | ||||
|      visit_type_OnOffAuto(v, name, &vms->acpi, errp); | ||||
|  } | ||||
|   | ||||
| -#if 0 /* Disabled for Red Hat Enterprise Linux */
 | ||||
|  static bool virt_get_ras(Object *obj, Error **errp) | ||||
|  { | ||||
|      VirtMachineState *vms = VIRT_MACHINE(obj); | ||||
| @@ -2363,6 +2362,7 @@ static void virt_set_ras(Object *obj, bool value, Error **errp)
 | ||||
|      vms->ras = value; | ||||
|  } | ||||
|   | ||||
| +#if 0 /* Disabled for Red Hat Enterprise Linux */
 | ||||
|  static bool virt_get_mte(Object *obj, Error **errp) | ||||
|  { | ||||
|      VirtMachineState *vms = VIRT_MACHINE(obj); | ||||
| @@ -3143,6 +3143,12 @@ static void rhel_machine_class_init(ObjectClass *oc, void *data)
 | ||||
|                                            "Set on/off to enable/disable " | ||||
|                                            "bypass_iommu for default root bus"); | ||||
|   | ||||
| +    object_class_property_add_bool(oc, "ras", virt_get_ras,
 | ||||
| +                                   virt_set_ras);
 | ||||
| +    object_class_property_set_description(oc, "ras",
 | ||||
| +                                          "Set on/off to enable/disable reporting host memory errors "
 | ||||
| +                                          "to a KVM guest using ACPI and guest external abort exceptions");
 | ||||
| +
 | ||||
|      object_class_property_add_bool(oc, "its", virt_get_its, | ||||
|                                     virt_set_its); | ||||
|      object_class_property_set_description(oc, "its", | ||||
| -- 
 | ||||
| 2.27.0 | ||||
| 
 | ||||
| @ -0,0 +1,81 @@ | ||||
| From 545076d67ef27203e08538123d8bc3798caf9505 Mon Sep 17 00:00:00 2001 | ||||
| From: Eric Auger <eric.auger@redhat.com> | ||||
| Date: Mon, 20 Dec 2021 15:50:44 +0100 | ||||
| Subject: [PATCH 1/6] hw/arm/virt: Register "iommu" as a class property | ||||
| 
 | ||||
| RH-Author: Eric Auger <eric.auger@redhat.com> | ||||
| RH-MergeRequest: 57: hw/arm/virt: Add 9.0 machine type and remove 8.5 one | ||||
| RH-Commit: [1/6] 2b6a22ebddd2da7505961ff4ffe90424f7489300 (eauger1/centos-qemu-kvm) | ||||
| RH-Bugzilla: 2031044 | ||||
| RH-Acked-by: Gavin Shan <gshan@redhat.com> | ||||
| RH-Acked-by: Andrew Jones <drjones@redhat.com> | ||||
| RH-Acked-by: Miroslav Rezanina <mrezanin@redhat.com> | ||||
| 
 | ||||
| branch: c9s | ||||
| Brew: 42213566 | ||||
| Upstream: no | ||||
| 
 | ||||
| Register the "iommu" option as a class property. This mirrors what | ||||
| was done in upstream commit b91def7b ("arm/virt: Register | ||||
| most properties as class properties"). | ||||
| 
 | ||||
| While we are at it we also move the "x-oem-id" and "x-oem-table-id" | ||||
| registrations at the very end of the rhel_machine_class_init() | ||||
| function.  This makes our life easier when comparing with upstream. | ||||
| 
 | ||||
| Signed-off-by: Eric Auger <eric.auger@redhat.com> | ||||
| ---
 | ||||
|  hw/arm/virt.c | 23 ++++++++++++----------- | ||||
|  1 file changed, 12 insertions(+), 11 deletions(-) | ||||
| 
 | ||||
| diff --git a/hw/arm/virt.c b/hw/arm/virt.c
 | ||||
| index 6ba9a2c2e1..7e227b1fa4 100644
 | ||||
| --- a/hw/arm/virt.c
 | ||||
| +++ b/hw/arm/virt.c
 | ||||
| @@ -3131,6 +3131,18 @@ static void rhel_machine_class_init(ObjectClass *oc, void *data)
 | ||||
|                                            "Set GIC version. " | ||||
|                                            "Valid values are 2, 3, host and max"); | ||||
|   | ||||
| +    object_class_property_add_str(oc, "iommu", virt_get_iommu, virt_set_iommu);
 | ||||
| +    object_class_property_set_description(oc, "iommu",
 | ||||
| +                                          "Set the IOMMU type. "
 | ||||
| +                                          "Valid values are none and smmuv3");
 | ||||
| +
 | ||||
| +    object_class_property_add_bool(oc, "default_bus_bypass_iommu",
 | ||||
| +                                   virt_get_default_bus_bypass_iommu,
 | ||||
| +                                   virt_set_default_bus_bypass_iommu);
 | ||||
| +    object_class_property_set_description(oc, "default_bus_bypass_iommu",
 | ||||
| +                                          "Set on/off to enable/disable "
 | ||||
| +                                          "bypass_iommu for default root bus");
 | ||||
| +
 | ||||
|      object_class_property_add_str(oc, "x-oem-id", | ||||
|                                    virt_get_oem_id, | ||||
|                                    virt_set_oem_id); | ||||
| @@ -3146,13 +3158,6 @@ static void rhel_machine_class_init(ObjectClass *oc, void *data)
 | ||||
|                                            "Override the default value of field OEM Table ID " | ||||
|                                            "in ACPI table header." | ||||
|                                            "The string may be up to 8 bytes in size"); | ||||
| -    object_class_property_add_bool(oc, "default_bus_bypass_iommu",
 | ||||
| -                                   virt_get_default_bus_bypass_iommu,
 | ||||
| -                                   virt_set_default_bus_bypass_iommu);
 | ||||
| -    object_class_property_set_description(oc, "default_bus_bypass_iommu",
 | ||||
| -                                          "Set on/off to enable/disable "
 | ||||
| -                                          "bypass_iommu for default root bus");
 | ||||
| -
 | ||||
|  } | ||||
|   | ||||
|  static void rhel_virt_instance_init(Object *obj) | ||||
| @@ -3186,10 +3191,6 @@ static void rhel_virt_instance_init(Object *obj)
 | ||||
|   | ||||
|      /* Default disallows iommu instantiation */ | ||||
|      vms->iommu = VIRT_IOMMU_NONE; | ||||
| -    object_property_add_str(obj, "iommu", virt_get_iommu, virt_set_iommu);
 | ||||
| -    object_property_set_description(obj, "iommu",
 | ||||
| -                                    "Set the IOMMU type. "
 | ||||
| -                                    "Valid values are none and smmuv3");
 | ||||
|   | ||||
|      /* Default disallows RAS instantiation and is non-configurable for RHEL */ | ||||
|      vms->ras = false; | ||||
| -- 
 | ||||
| 2.27.0 | ||||
| 
 | ||||
| @ -0,0 +1,57 @@ | ||||
| From 789933e2598f9a525c2a638feca974ca1730a859 Mon Sep 17 00:00:00 2001 | ||||
| From: Eric Auger <eric.auger@redhat.com> | ||||
| Date: Mon, 20 Dec 2021 16:04:59 +0100 | ||||
| Subject: [PATCH 2/6] hw/arm/virt: Register "its" as a class property | ||||
| 
 | ||||
| RH-Author: Eric Auger <eric.auger@redhat.com> | ||||
| RH-MergeRequest: 57: hw/arm/virt: Add 9.0 machine type and remove 8.5 one | ||||
| RH-Commit: [2/6] dbd3e994553f00cd19842824f6bd763863a4e484 (eauger1/centos-qemu-kvm) | ||||
| RH-Bugzilla: 2031044 | ||||
| RH-Acked-by: Gavin Shan <gshan@redhat.com> | ||||
| RH-Acked-by: Andrew Jones <drjones@redhat.com> | ||||
| RH-Acked-by: Miroslav Rezanina <mrezanin@redhat.com> | ||||
| 
 | ||||
| branch: c9s | ||||
| Brew: 42213566 | ||||
| Upstream: no | ||||
| 
 | ||||
| Register "its" as a class property.  This mirrors what was done | ||||
| in commit 27edeeaafe43 ("virt: Register "its" as class property"). | ||||
| 
 | ||||
| Signed-off-by: Eric Auger <eric.auger@redhat.com> | ||||
| ---
 | ||||
|  hw/arm/virt.c | 11 ++++++----- | ||||
|  1 file changed, 6 insertions(+), 5 deletions(-) | ||||
| 
 | ||||
| diff --git a/hw/arm/virt.c b/hw/arm/virt.c
 | ||||
| index 7e227b1fa4..984151b7dd 100644
 | ||||
| --- a/hw/arm/virt.c
 | ||||
| +++ b/hw/arm/virt.c
 | ||||
| @@ -3143,6 +3143,12 @@ static void rhel_machine_class_init(ObjectClass *oc, void *data)
 | ||||
|                                            "Set on/off to enable/disable " | ||||
|                                            "bypass_iommu for default root bus"); | ||||
|   | ||||
| +    object_class_property_add_bool(oc, "its", virt_get_its,
 | ||||
| +                                   virt_set_its);
 | ||||
| +    object_class_property_set_description(oc, "its",
 | ||||
| +                                          "Set on/off to enable/disable "
 | ||||
| +                                          "ITS instantiation");
 | ||||
| +
 | ||||
|      object_class_property_add_str(oc, "x-oem-id", | ||||
|                                    virt_get_oem_id, | ||||
|                                    virt_set_oem_id); | ||||
| @@ -3182,11 +3188,6 @@ static void rhel_virt_instance_init(Object *obj)
 | ||||
|      } else { | ||||
|          /* Default allows ITS instantiation */ | ||||
|          vms->its = true; | ||||
| -        object_property_add_bool(obj, "its", virt_get_its,
 | ||||
| -                                 virt_set_its);
 | ||||
| -        object_property_set_description(obj, "its",
 | ||||
| -                                        "Set on/off to enable/disable "
 | ||||
| -                                        "ITS instantiation");
 | ||||
|      } | ||||
|   | ||||
|      /* Default disallows iommu instantiation */ | ||||
| -- 
 | ||||
| 2.27.0 | ||||
| 
 | ||||
| @ -0,0 +1,46 @@ | ||||
| From 94987c271c3bdc37216c5baa4c5766b9b7f053a1 Mon Sep 17 00:00:00 2001 | ||||
| From: Eric Auger <eric.auger@redhat.com> | ||||
| Date: Mon, 20 Dec 2021 15:58:38 +0100 | ||||
| Subject: [PATCH 3/6] hw/arm/virt: Rename default_bus_bypass_iommu | ||||
| 
 | ||||
| RH-Author: Eric Auger <eric.auger@redhat.com> | ||||
| RH-MergeRequest: 57: hw/arm/virt: Add 9.0 machine type and remove 8.5 one | ||||
| RH-Commit: [3/6] 6b66844ae4629d8c879f7c6abbc5e5017a162e16 (eauger1/centos-qemu-kvm) | ||||
| RH-Bugzilla: 2031044 | ||||
| RH-Acked-by: Gavin Shan <gshan@redhat.com> | ||||
| RH-Acked-by: Andrew Jones <drjones@redhat.com> | ||||
| RH-Acked-by: Miroslav Rezanina <mrezanin@redhat.com> | ||||
| 
 | ||||
| branch: c9s | ||||
| Brew: 42213566 | ||||
| Upstream: no | ||||
| 
 | ||||
| Rename "default_bus_bypass_iommu" into "default-bus-bypass-iommu". | ||||
| This mirrors what was done in upstream commit: | ||||
| 9dad363a223 ("hw/arm/virt: Rename default_bus_bypass_iommu") | ||||
| 
 | ||||
| Signed-off-by: Eric Auger <eric.auger@redhat.com> | ||||
| ---
 | ||||
|  hw/arm/virt.c | 4 ++-- | ||||
|  1 file changed, 2 insertions(+), 2 deletions(-) | ||||
| 
 | ||||
| diff --git a/hw/arm/virt.c b/hw/arm/virt.c
 | ||||
| index 984151b7dd..c99ca93e75 100644
 | ||||
| --- a/hw/arm/virt.c
 | ||||
| +++ b/hw/arm/virt.c
 | ||||
| @@ -3136,10 +3136,10 @@ static void rhel_machine_class_init(ObjectClass *oc, void *data)
 | ||||
|                                            "Set the IOMMU type. " | ||||
|                                            "Valid values are none and smmuv3"); | ||||
|   | ||||
| -    object_class_property_add_bool(oc, "default_bus_bypass_iommu",
 | ||||
| +    object_class_property_add_bool(oc, "default-bus-bypass-iommu",
 | ||||
|                                     virt_get_default_bus_bypass_iommu, | ||||
|                                     virt_set_default_bus_bypass_iommu); | ||||
| -    object_class_property_set_description(oc, "default_bus_bypass_iommu",
 | ||||
| +    object_class_property_set_description(oc, "default-bus-bypass-iommu",
 | ||||
|                                            "Set on/off to enable/disable " | ||||
|                                            "bypass_iommu for default root bus"); | ||||
|   | ||||
| -- 
 | ||||
| 2.27.0 | ||||
| 
 | ||||
| @ -0,0 +1,60 @@ | ||||
| From 2005e3bb97fba4889829b58331a057b9cb35a65d Mon Sep 17 00:00:00 2001 | ||||
| From: Laurent Vivier <lvivier@redhat.com> | ||||
| Date: Fri, 11 Feb 2022 18:02:59 +0100 | ||||
| Subject: [PATCH 2/5] hw/virtio: vdpa: Fix leak of host-notifier memory-region | ||||
| 
 | ||||
| RH-Author: Laurent Vivier <lvivier@redhat.com> | ||||
| RH-MergeRequest: 123: hw/virtio: vdpa: Fix leak of host-notifier memory-region | ||||
| RH-Commit: [1/1] ddd64cac5c29786edf652f5fa97767b261ccfcdd | ||||
| RH-Bugzilla: 2059786 | ||||
| RH-Acked-by: Jason Wang <jasowang@redhat.com> | ||||
| RH-Acked-by: Cindy Lu <lulu@redhat.com> | ||||
| RH-Acked-by: MST <mst@redhat.com> | ||||
| RH-Acked-by: Stefano Garzarella <sgarzare@redhat.com> | ||||
| 
 | ||||
| BZ: https://bugzilla.redhat.com/2059786 | ||||
| BRANCH: rhel-9.0.0 | ||||
| BREW: https://brewweb.engineering.redhat.com/brew/taskinfo?taskID=43688388 | ||||
| UPTREAM: Merged | ||||
| 
 | ||||
| If call virtio_queue_set_host_notifier_mr fails, should free | ||||
| host-notifier memory-region. | ||||
| 
 | ||||
| This problem can trigger a coredump with some vDPA drivers (mlx5, | ||||
| but not with the vdpasim), if we unplug the virtio-net card from | ||||
| the guest after a stop/start. | ||||
| 
 | ||||
| The same fix has been done for vhost-user: | ||||
|   1f89d3b91e3e ("hw/virtio: Fix leak of host-notifier memory-region") | ||||
| 
 | ||||
| Fixes: d0416d487bd5 ("vhost-vdpa: map virtqueue notification area if possible") | ||||
| Cc: jasowang@redhat.com | ||||
| Resolves: https://bugzilla.redhat.com/2027208 | ||||
| Signed-off-by: Laurent Vivier <lvivier@redhat.com> | ||||
| Message-Id: <20220211170259.1388734-1-lvivier@redhat.com> | ||||
| Cc: qemu-stable@nongnu.org | ||||
| Acked-by: Jason Wang <jasowang@redhat.com> | ||||
| Reviewed-by: Stefano Garzarella <sgarzare@redhat.com> | ||||
| Reviewed-by: Michael S. Tsirkin <mst@redhat.com> | ||||
| Signed-off-by: Michael S. Tsirkin <mst@redhat.com> | ||||
| (cherry picked from commit 98f7607ecda00dea3cbb2ed7b4427c96846efb83) | ||||
| Signed-off-by: Laurent Vivier <lvivier@redhat.com> | ||||
| ---
 | ||||
|  hw/virtio/vhost-vdpa.c | 1 + | ||||
|  1 file changed, 1 insertion(+) | ||||
| 
 | ||||
| diff --git a/hw/virtio/vhost-vdpa.c b/hw/virtio/vhost-vdpa.c
 | ||||
| index bcaf00e09f..78da48a333 100644
 | ||||
| --- a/hw/virtio/vhost-vdpa.c
 | ||||
| +++ b/hw/virtio/vhost-vdpa.c
 | ||||
| @@ -415,6 +415,7 @@ static int vhost_vdpa_host_notifier_init(struct vhost_dev *dev, int queue_index)
 | ||||
|      g_free(name); | ||||
|   | ||||
|      if (virtio_queue_set_host_notifier_mr(vdev, queue_index, &n->mr, true)) { | ||||
| +        object_unparent(OBJECT(&n->mr));
 | ||||
|          munmap(addr, page_size); | ||||
|          goto err; | ||||
|      } | ||||
| -- 
 | ||||
| 2.31.1 | ||||
| 
 | ||||
| @ -0,0 +1,60 @@ | ||||
| From 575ca409fa21db088c76e57f7285021dd8da1569 Mon Sep 17 00:00:00 2001 | ||||
| From: Vitaly Kuznetsov <vkuznets@redhat.com> | ||||
| Date: Wed, 16 Mar 2022 09:36:19 +0100 | ||||
| Subject: [PATCH 04/14] i386: Add Icelake-Server-v6 CPU model with 5-level EPT | ||||
|  support | ||||
| 
 | ||||
| RH-Author: Vitaly Kuznetsov <vkuznets@redhat.com> | ||||
| RH-MergeRequest: 126: i386: Add Icelake-Server-v6 CPU model with 5-level EPT support | ||||
| RH-Commit: [2/2] a047caa01fafd8ca6a5fa0704b379edab91d4ccc | ||||
| RH-Bugzilla: 2038051 | ||||
| RH-Acked-by: Igor Mammedov <imammedo@redhat.com> | ||||
| RH-Acked-by: Cornelia Huck <cohuck@redhat.com> | ||||
| RH-Acked-by: Paolo Bonzini <pbonzini@redhat.com> | ||||
| 
 | ||||
| Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=2038051 | ||||
| Brew: https://brewweb.engineering.redhat.com/brew/taskinfo?taskID=43862630 | ||||
| 
 | ||||
| commit 12cab535db6440af41ed8dfefe908a594321b6ce | ||||
| Author: Vitaly Kuznetsov <vkuznets@redhat.com> | ||||
| Date:   Mon Feb 21 15:53:15 2022 +0100 | ||||
| 
 | ||||
|     i386: Add Icelake-Server-v6 CPU model with 5-level EPT support | ||||
| 
 | ||||
|     Windows 11 with WSL2 enabled (Hyper-V) fails to boot with Icelake-Server | ||||
|     {-v5} CPU model but boots well with '-cpu host'. Apparently, it expects | ||||
|     5-level paging and 5-level EPT support to come in pair but QEMU's | ||||
|     Icelake-Server CPU model lacks the later. Introduce 'Icelake-Server-v6' | ||||
|     CPU model with 'vmx-page-walk-5' enabled by default. | ||||
| 
 | ||||
|     Signed-off-by: Vitaly Kuznetsov <vkuznets@redhat.com> | ||||
|     Message-Id: <20220221145316.576138-1-vkuznets@redhat.com> | ||||
|     Signed-off-by: Paolo Bonzini <pbonzini@redhat.com> | ||||
| 
 | ||||
| Signed-off-by: Vitaly Kuznetsov <vkuznets@redhat.com> | ||||
| ---
 | ||||
|  target/i386/cpu.c | 8 ++++++++ | ||||
|  1 file changed, 8 insertions(+) | ||||
| 
 | ||||
| diff --git a/target/i386/cpu.c b/target/i386/cpu.c
 | ||||
| index aa9e636800..6e25d13339 100644
 | ||||
| --- a/target/i386/cpu.c
 | ||||
| +++ b/target/i386/cpu.c
 | ||||
| @@ -3505,6 +3505,14 @@ static const X86CPUDefinition builtin_x86_defs[] = {
 | ||||
|                      { /* end of list */ } | ||||
|                  }, | ||||
|              }, | ||||
| +            {
 | ||||
| +                .version = 6,
 | ||||
| +                .note = "5-level EPT",
 | ||||
| +                .props = (PropValue[]) {
 | ||||
| +                    { "vmx-page-walk-5", "on" },
 | ||||
| +                    { /* end of list */ }
 | ||||
| +                },
 | ||||
| +            },
 | ||||
|              { /* end of list */ } | ||||
|          } | ||||
|      }, | ||||
| -- 
 | ||||
| 2.31.1 | ||||
| 
 | ||||
| @ -0,0 +1,108 @@ | ||||
| From 06583ce33fab2976157461ac4503d6f8eeb59e75 Mon Sep 17 00:00:00 2001 | ||||
| From: Hanna Reitz <hreitz@redhat.com> | ||||
| Date: Fri, 4 Feb 2022 12:10:12 +0100 | ||||
| Subject: [PATCH 8/8] iotests/281: Let NBD connection yield in iothread | ||||
| 
 | ||||
| RH-Author: Hanna Reitz <hreitz@redhat.com> | ||||
| RH-MergeRequest: 74: block/nbd: Handle AioContext changes | ||||
| RH-Commit: [6/6] 632b9ef5177a80d1c0c00121e1acc37272076d3e (hreitz/qemu-kvm-c-9-s) | ||||
| RH-Bugzilla: 2033626 | ||||
| RH-Acked-by: Miroslav Rezanina <mrezanin@redhat.com> | ||||
| RH-Acked-by: Eric Blake <eblake@redhat.com> | ||||
| RH-Acked-by: Stefan Hajnoczi <stefanha@redhat.com> | ||||
| 
 | ||||
| Put an NBD block device into an I/O thread, and then read data from it, | ||||
| hoping that the NBD connection will yield during that read.  When it | ||||
| does, the coroutine must be reentered in the block device's I/O thread, | ||||
| which will only happen if the NBD block driver attaches the connection's | ||||
| QIOChannel to the new AioContext.  It did not do that after 4ddb5d2fde | ||||
| ("block/nbd: drop connection_co") and prior to "block/nbd: Move s->ioc | ||||
| on AioContext change", which would cause an assertion failure. | ||||
| 
 | ||||
| To improve our chances of yielding, the NBD server is throttled to | ||||
| reading 64 kB/s, and the NBD client reads 128 kB, so it should yield at | ||||
| some point. | ||||
| 
 | ||||
| Reviewed-by: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com> | ||||
| Signed-off-by: Hanna Reitz <hreitz@redhat.com> | ||||
| Signed-off-by: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com> | ||||
| (cherry picked from commit 8cfbe929e8c26050f0a4580a1606a370a947d4ce) | ||||
| Signed-off-by: Hanna Reitz <hreitz@redhat.com> | ||||
| ---
 | ||||
|  tests/qemu-iotests/281     | 28 +++++++++++++++++++++++++--- | ||||
|  tests/qemu-iotests/281.out |  4 ++-- | ||||
|  2 files changed, 27 insertions(+), 5 deletions(-) | ||||
| 
 | ||||
| diff --git a/tests/qemu-iotests/281 b/tests/qemu-iotests/281
 | ||||
| index 13c588be75..b2ead7f388 100755
 | ||||
| --- a/tests/qemu-iotests/281
 | ||||
| +++ b/tests/qemu-iotests/281
 | ||||
| @@ -253,8 +253,9 @@ class TestYieldingAndTimers(iotests.QMPTestCase):
 | ||||
|          self.create_nbd_export() | ||||
|   | ||||
|          # Simple VM with an NBD block device connected to the NBD export | ||||
| -        # provided by the QSD
 | ||||
| +        # provided by the QSD, and an (initially unused) iothread
 | ||||
|          self.vm = iotests.VM() | ||||
| +        self.vm.add_object('iothread,id=iothr')
 | ||||
|          self.vm.add_blockdev('nbd,node-name=nbd,server.type=unix,' + | ||||
|                               f'server.path={self.sock},export=exp,' + | ||||
|                               'reconnect-delay=1') | ||||
| @@ -293,19 +294,40 @@ class TestYieldingAndTimers(iotests.QMPTestCase):
 | ||||
|          # thus not see the error, and so the test will pass.) | ||||
|          time.sleep(2) | ||||
|   | ||||
| +    def test_yield_in_iothread(self):
 | ||||
| +        # Move the NBD node to the I/O thread; the NBD block driver should
 | ||||
| +        # attach the connection's QIOChannel to that thread's AioContext, too
 | ||||
| +        result = self.vm.qmp('x-blockdev-set-iothread',
 | ||||
| +                             node_name='nbd', iothread='iothr')
 | ||||
| +        self.assert_qmp(result, 'return', {})
 | ||||
| +
 | ||||
| +        # Do some I/O that will be throttled by the QSD, so that the network
 | ||||
| +        # connection hopefully will yield here.  When it is resumed, it must
 | ||||
| +        # then be resumed in the I/O thread's AioContext.
 | ||||
| +        result = self.vm.qmp('human-monitor-command',
 | ||||
| +                             command_line='qemu-io nbd "read 0 128K"')
 | ||||
| +        self.assert_qmp(result, 'return', '')
 | ||||
| +
 | ||||
|      def create_nbd_export(self): | ||||
|          assert self.qsd is None | ||||
|   | ||||
| -        # Simple NBD export of a null-co BDS
 | ||||
| +        # Export a throttled null-co BDS: Reads are throttled (max 64 kB/s),
 | ||||
| +        # writes are not.
 | ||||
|          self.qsd = QemuStorageDaemon( | ||||
| +            '--object',
 | ||||
| +            'throttle-group,id=thrgr,x-bps-read=65536,x-bps-read-max=65536',
 | ||||
| +
 | ||||
|              '--blockdev', | ||||
|              'null-co,node-name=null,read-zeroes=true', | ||||
|   | ||||
| +            '--blockdev',
 | ||||
| +            'throttle,node-name=thr,file=null,throttle-group=thrgr',
 | ||||
| +
 | ||||
|              '--nbd-server', | ||||
|              f'addr.type=unix,addr.path={self.sock}', | ||||
|   | ||||
|              '--export', | ||||
| -            'nbd,id=exp,node-name=null,name=exp,writable=true'
 | ||||
| +            'nbd,id=exp,node-name=thr,name=exp,writable=true'
 | ||||
|          ) | ||||
|   | ||||
|      def stop_nbd_export(self): | ||||
| diff --git a/tests/qemu-iotests/281.out b/tests/qemu-iotests/281.out
 | ||||
| index 914e3737bd..3f8a935a08 100644
 | ||||
| --- a/tests/qemu-iotests/281.out
 | ||||
| +++ b/tests/qemu-iotests/281.out
 | ||||
| @@ -1,5 +1,5 @@
 | ||||
| -.....
 | ||||
| +......
 | ||||
|  ---------------------------------------------------------------------- | ||||
| -Ran 5 tests
 | ||||
| +Ran 6 tests
 | ||||
|   | ||||
|  OK | ||||
| -- 
 | ||||
| 2.27.0 | ||||
| 
 | ||||
							
								
								
									
										174
									
								
								SOURCES/kvm-iotests-281-Test-lingering-timers.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										174
									
								
								SOURCES/kvm-iotests-281-Test-lingering-timers.patch
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,174 @@ | ||||
| From 3d2d7a46713d362d2ff5137841e689593da976a3 Mon Sep 17 00:00:00 2001 | ||||
| From: Hanna Reitz <hreitz@redhat.com> | ||||
| Date: Fri, 4 Feb 2022 12:10:10 +0100 | ||||
| Subject: [PATCH 6/8] iotests/281: Test lingering timers | ||||
| 
 | ||||
| RH-Author: Hanna Reitz <hreitz@redhat.com> | ||||
| RH-MergeRequest: 74: block/nbd: Handle AioContext changes | ||||
| RH-Commit: [4/6] d228ba3fcdfaab2d54dd5b023688a1c055cce2c2 (hreitz/qemu-kvm-c-9-s) | ||||
| RH-Bugzilla: 2033626 | ||||
| RH-Acked-by: Miroslav Rezanina <mrezanin@redhat.com> | ||||
| RH-Acked-by: Eric Blake <eblake@redhat.com> | ||||
| RH-Acked-by: Stefan Hajnoczi <stefanha@redhat.com> | ||||
| 
 | ||||
| Prior to "block/nbd: Delete reconnect delay timer when done" and | ||||
| "block/nbd: Delete open timer when done", both of those timers would | ||||
| remain scheduled even after successfully (re-)connecting to the server, | ||||
| and they would not even be deleted when the BDS is deleted. | ||||
| 
 | ||||
| This test constructs exactly this situation: | ||||
| (1) Configure an @open-timeout, so the open timer is armed, and | ||||
| (2) Configure a @reconnect-delay and trigger a reconnect situation | ||||
|     (which succeeds immediately), so the reconnect delay timer is armed. | ||||
| Then we immediately delete the BDS, and sleep for longer than the | ||||
| @open-timeout and @reconnect-delay.  Prior to said patches, this caused
 | ||||
| one (or both) of the timer CBs to access already-freed data. | ||||
| 
 | ||||
| Accessing freed data may or may not crash, so this test can produce | ||||
| false successes, but I do not know how to show the problem in a better | ||||
| or more reliable way.  If you run this test on "block/nbd: Assert there | ||||
| are no timers when closed" and without the fix patches mentioned above, | ||||
| you should reliably see an assertion failure. | ||||
| (But all other tests that use the reconnect delay timer (264 and 277) | ||||
| will fail in that configuration, too; as will nbd-reconnect-on-open, | ||||
| which uses the open timer.) | ||||
| 
 | ||||
| Remove this test from the quick group because of the two second sleep | ||||
| this patch introduces. | ||||
| 
 | ||||
| (I decided to put this test case into 281, because the main bug this | ||||
| series addresses is in the interaction of the NBD block driver and I/O | ||||
| threads, which is precisely the scope of 281.  The test case for that | ||||
| other bug will also be put into the test class added here. | ||||
| 
 | ||||
| Also, excuse the test class's name, I couldn't come up with anything | ||||
| better.  The "yield" part will make sense two patches from now.) | ||||
| 
 | ||||
| Reviewed-by: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com> | ||||
| Signed-off-by: Hanna Reitz <hreitz@redhat.com> | ||||
| Signed-off-by: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com> | ||||
| (cherry picked from commit eaf1e85d4ddefdbd197f393fa9c5acc7ba8133b0) | ||||
| 
 | ||||
| Conflict: | ||||
| - @open-timeout was introduced after the 6.2 release, and has not been
 | ||||
|   backported.  Consequently, there is no open_timer, and we can (and | ||||
|   must) drop the respective parts of the test here. | ||||
| 
 | ||||
| Signed-off-by: Hanna Reitz <hreitz@redhat.com> | ||||
| ---
 | ||||
|  tests/qemu-iotests/281     | 73 ++++++++++++++++++++++++++++++++++++-- | ||||
|  tests/qemu-iotests/281.out |  4 +-- | ||||
|  2 files changed, 73 insertions(+), 4 deletions(-) | ||||
| 
 | ||||
| diff --git a/tests/qemu-iotests/281 b/tests/qemu-iotests/281
 | ||||
| index 956698083f..13c588be75 100755
 | ||||
| --- a/tests/qemu-iotests/281
 | ||||
| +++ b/tests/qemu-iotests/281
 | ||||
| @@ -1,5 +1,5 @@
 | ||||
|  #!/usr/bin/env python3 | ||||
| -# group: rw quick
 | ||||
| +# group: rw
 | ||||
|  # | ||||
|  # Test cases for blockdev + IOThread interactions | ||||
|  # | ||||
| @@ -20,8 +20,9 @@
 | ||||
|  # | ||||
|   | ||||
|  import os | ||||
| +import time
 | ||||
|  import iotests | ||||
| -from iotests import qemu_img
 | ||||
| +from iotests import qemu_img, QemuStorageDaemon
 | ||||
|   | ||||
|  image_len = 64 * 1024 * 1024 | ||||
|   | ||||
| @@ -243,6 +244,74 @@ class TestBlockdevBackupAbort(iotests.QMPTestCase):
 | ||||
|          # Hangs on failure, we expect this error. | ||||
|          self.assert_qmp(result, 'error/class', 'GenericError') | ||||
|   | ||||
| +# Test for RHBZ#2033626
 | ||||
| +class TestYieldingAndTimers(iotests.QMPTestCase):
 | ||||
| +    sock = os.path.join(iotests.sock_dir, 'nbd.sock')
 | ||||
| +    qsd = None
 | ||||
| +
 | ||||
| +    def setUp(self):
 | ||||
| +        self.create_nbd_export()
 | ||||
| +
 | ||||
| +        # Simple VM with an NBD block device connected to the NBD export
 | ||||
| +        # provided by the QSD
 | ||||
| +        self.vm = iotests.VM()
 | ||||
| +        self.vm.add_blockdev('nbd,node-name=nbd,server.type=unix,' +
 | ||||
| +                             f'server.path={self.sock},export=exp,' +
 | ||||
| +                             'reconnect-delay=1')
 | ||||
| +
 | ||||
| +        self.vm.launch()
 | ||||
| +
 | ||||
| +    def tearDown(self):
 | ||||
| +        self.stop_nbd_export()
 | ||||
| +        self.vm.shutdown()
 | ||||
| +
 | ||||
| +    def test_timers_with_blockdev_del(self):
 | ||||
| +        # Stop and restart the NBD server, and do some I/O on the client to
 | ||||
| +        # trigger a reconnect and start the reconnect delay timer
 | ||||
| +        self.stop_nbd_export()
 | ||||
| +        self.create_nbd_export()
 | ||||
| +
 | ||||
| +        result = self.vm.qmp('human-monitor-command',
 | ||||
| +                             command_line='qemu-io nbd "write 0 512"')
 | ||||
| +        self.assert_qmp(result, 'return', '')
 | ||||
| +
 | ||||
| +        # Reconnect is done, so the reconnect delay timer should be gone.
 | ||||
| +        # (But there used to be a bug where it remained active, for which this
 | ||||
| +        # is a regression test.)
 | ||||
| +
 | ||||
| +        # Delete the BDS to see whether the timer is gone.  If it is not,
 | ||||
| +        # it will remain active, fire later, and then access freed data.
 | ||||
| +        # (Or, with "block/nbd: Assert there are no timers when closed"
 | ||||
| +        # applied, the assertion added in that patch will fail.)
 | ||||
| +        result = self.vm.qmp('blockdev-del', node_name='nbd')
 | ||||
| +        self.assert_qmp(result, 'return', {})
 | ||||
| +
 | ||||
| +        # Give the timer some time to fire (it has a timeout of 1 s).
 | ||||
| +        # (Sleeping in an iotest may ring some alarm bells, but note that if
 | ||||
| +        # the timing is off here, the test will just always pass.  If we kill
 | ||||
| +        # the VM too early, then we just kill the timer before it can fire,
 | ||||
| +        # thus not see the error, and so the test will pass.)
 | ||||
| +        time.sleep(2)
 | ||||
| +
 | ||||
| +    def create_nbd_export(self):
 | ||||
| +        assert self.qsd is None
 | ||||
| +
 | ||||
| +        # Simple NBD export of a null-co BDS
 | ||||
| +        self.qsd = QemuStorageDaemon(
 | ||||
| +            '--blockdev',
 | ||||
| +            'null-co,node-name=null,read-zeroes=true',
 | ||||
| +
 | ||||
| +            '--nbd-server',
 | ||||
| +            f'addr.type=unix,addr.path={self.sock}',
 | ||||
| +
 | ||||
| +            '--export',
 | ||||
| +            'nbd,id=exp,node-name=null,name=exp,writable=true'
 | ||||
| +        )
 | ||||
| +
 | ||||
| +    def stop_nbd_export(self):
 | ||||
| +        self.qsd.stop()
 | ||||
| +        self.qsd = None
 | ||||
| +
 | ||||
|  if __name__ == '__main__': | ||||
|      iotests.main(supported_fmts=['qcow2'], | ||||
|                   supported_protocols=['file']) | ||||
| diff --git a/tests/qemu-iotests/281.out b/tests/qemu-iotests/281.out
 | ||||
| index 89968f35d7..914e3737bd 100644
 | ||||
| --- a/tests/qemu-iotests/281.out
 | ||||
| +++ b/tests/qemu-iotests/281.out
 | ||||
| @@ -1,5 +1,5 @@
 | ||||
| -....
 | ||||
| +.....
 | ||||
|  ---------------------------------------------------------------------- | ||||
| -Ran 4 tests
 | ||||
| +Ran 5 tests
 | ||||
|   | ||||
|  OK | ||||
| -- 
 | ||||
| 2.27.0 | ||||
| 
 | ||||
| @ -0,0 +1,106 @@ | ||||
| From 37593348e7d95580fb2b0009dcb026c07367f1f8 Mon Sep 17 00:00:00 2001 | ||||
| From: Kevin Wolf <kwolf@redhat.com> | ||||
| Date: Thu, 3 Feb 2022 15:05:34 +0100 | ||||
| Subject: [PATCH 2/8] iotests: Test blockdev-reopen with iothreads and | ||||
|  throttling | ||||
| 
 | ||||
| RH-Author: Kevin Wolf <kwolf@redhat.com> | ||||
| RH-MergeRequest: 73: block: Lock AioContext for drain_end in blockdev-reopen | ||||
| RH-Commit: [2/2] d19d5fa9efa4813ece75708436891041754ab910 (kmwolf/centos-qemu-kvm) | ||||
| RH-Bugzilla: 2046659 | ||||
| RH-Acked-by: Sergio Lopez <None> | ||||
| RH-Acked-by: Stefan Hajnoczi <stefanha@redhat.com> | ||||
| RH-Acked-by: Hanna Reitz <hreitz@redhat.com> | ||||
| 
 | ||||
| The 'throttle' block driver implements .bdrv_co_drain_end, so | ||||
| blockdev-reopen will have to wait for it to complete in the polling | ||||
| loop at the end of qmp_blockdev_reopen(). This makes AIO_WAIT_WHILE() | ||||
| release the AioContext lock, which causes a crash if the lock hasn't | ||||
| correctly been taken. | ||||
| 
 | ||||
| Signed-off-by: Kevin Wolf <kwolf@redhat.com> | ||||
| Message-Id: <20220203140534.36522-3-kwolf@redhat.com> | ||||
| Reviewed-by: Hanna Reitz <hreitz@redhat.com> | ||||
| Signed-off-by: Kevin Wolf <kwolf@redhat.com> | ||||
| (cherry picked from commit ee810602376125ca0e0afd6b7c715e13740978ea) | ||||
| Signed-off-by: Kevin Wolf <kwolf@redhat.com> | ||||
| ---
 | ||||
|  tests/qemu-iotests/245     | 36 +++++++++++++++++++++++++++++++++--- | ||||
|  tests/qemu-iotests/245.out |  4 ++-- | ||||
|  2 files changed, 35 insertions(+), 5 deletions(-) | ||||
| 
 | ||||
| diff --git a/tests/qemu-iotests/245 b/tests/qemu-iotests/245
 | ||||
| index 24ac43f70e..8cbed7821b 100755
 | ||||
| --- a/tests/qemu-iotests/245
 | ||||
| +++ b/tests/qemu-iotests/245
 | ||||
| @@ -1138,12 +1138,13 @@ class TestBlockdevReopen(iotests.QMPTestCase):
 | ||||
|          self.assertEqual(self.get_node('hd1'), None) | ||||
|          self.assert_qmp(self.get_node('hd2'), 'ro', True) | ||||
|   | ||||
| -    def run_test_iothreads(self, iothread_a, iothread_b, errmsg = None):
 | ||||
| -        opts = hd_opts(0)
 | ||||
| +    def run_test_iothreads(self, iothread_a, iothread_b, errmsg = None,
 | ||||
| +                           opts_a = None, opts_b = None):
 | ||||
| +        opts = opts_a or hd_opts(0)
 | ||||
|          result = self.vm.qmp('blockdev-add', conv_keys = False, **opts) | ||||
|          self.assert_qmp(result, 'return', {}) | ||||
|   | ||||
| -        opts2 = hd_opts(2)
 | ||||
| +        opts2 = opts_b or hd_opts(2)
 | ||||
|          result = self.vm.qmp('blockdev-add', conv_keys = False, **opts2) | ||||
|          self.assert_qmp(result, 'return', {}) | ||||
|   | ||||
| @@ -1194,6 +1195,35 @@ class TestBlockdevReopen(iotests.QMPTestCase):
 | ||||
|      def test_iothreads_switch_overlay(self): | ||||
|          self.run_test_iothreads('', 'iothread0') | ||||
|   | ||||
| +    def test_iothreads_with_throttling(self):
 | ||||
| +        # Create a throttle-group object
 | ||||
| +        opts = { 'qom-type': 'throttle-group', 'id': 'group0',
 | ||||
| +                 'limits': { 'iops-total': 1000 } }
 | ||||
| +        result = self.vm.qmp('object-add', conv_keys = False, **opts)
 | ||||
| +        self.assert_qmp(result, 'return', {})
 | ||||
| +
 | ||||
| +        # Options with a throttle filter between format and protocol
 | ||||
| +        opts = [
 | ||||
| +            {
 | ||||
| +                'driver': iotests.imgfmt,
 | ||||
| +                'node-name': f'hd{idx}',
 | ||||
| +                'file' : {
 | ||||
| +                    'node-name': f'hd{idx}-throttle',
 | ||||
| +                    'driver': 'throttle',
 | ||||
| +                    'throttle-group': 'group0',
 | ||||
| +                    'file': {
 | ||||
| +                        'driver': 'file',
 | ||||
| +                        'node-name': f'hd{idx}-file',
 | ||||
| +                        'filename': hd_path[idx],
 | ||||
| +                    },
 | ||||
| +                },
 | ||||
| +            }
 | ||||
| +            for idx in (0, 2)
 | ||||
| +        ]
 | ||||
| +
 | ||||
| +        self.run_test_iothreads('iothread0', 'iothread0', None,
 | ||||
| +                                opts[0], opts[1])
 | ||||
| +
 | ||||
|  if __name__ == '__main__': | ||||
|      iotests.activate_logging() | ||||
|      iotests.main(supported_fmts=["qcow2"], | ||||
| diff --git a/tests/qemu-iotests/245.out b/tests/qemu-iotests/245.out
 | ||||
| index 4eced19294..a4e04a3266 100644
 | ||||
| --- a/tests/qemu-iotests/245.out
 | ||||
| +++ b/tests/qemu-iotests/245.out
 | ||||
| @@ -17,8 +17,8 @@ read 1/1 bytes at offset 262152
 | ||||
|  read 1/1 bytes at offset 262160 | ||||
|  1 bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) | ||||
|   | ||||
| -...............
 | ||||
| +................
 | ||||
|  ---------------------------------------------------------------------- | ||||
| -Ran 25 tests
 | ||||
| +Ran 26 tests
 | ||||
|   | ||||
|  OK | ||||
| -- 
 | ||||
| 2.27.0 | ||||
| 
 | ||||
| @ -0,0 +1,81 @@ | ||||
| From 51f691acd8042351d005873996d7bf4c7b045508 Mon Sep 17 00:00:00 2001 | ||||
| From: Kevin Wolf <kwolf@redhat.com> | ||||
| Date: Fri, 17 Dec 2021 17:46:53 +0100 | ||||
| Subject: [PATCH 08/12] iotests: Test qemu-img convert of zeroed data cluster | ||||
| 
 | ||||
| RH-Author: Kevin Wolf <kwolf@redhat.com> | ||||
| RH-MergeRequest: 70: qemu-img convert: Fix sparseness of output image | ||||
| RH-Commit: [1/2] 0770582c553ac6b0f18c035f9a0238599d4763cc (kmwolf/centos-qemu-kvm) | ||||
| RH-Bugzilla: 1882917 | ||||
| RH-Acked-by: Eric Blake <eblake@redhat.com> | ||||
| RH-Acked-by: Stefan Hajnoczi <stefanha@redhat.com> | ||||
| RH-Acked-by: Hanna Reitz <hreitz@redhat.com> | ||||
| 
 | ||||
| This demonstrates what happens when the block status changes in | ||||
| sub-min_sparse granularity, but all of the parts are zeroed out. The | ||||
| alignment logic in is_allocated_sectors() prevents that the target image | ||||
| remains fully sparse as expected, but turns it into a data cluster of | ||||
| explicit zeros. | ||||
| 
 | ||||
| Signed-off-by: Kevin Wolf <kwolf@redhat.com> | ||||
| Signed-off-by: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com> | ||||
| Message-Id: <20211217164654.1184218-2-vsementsov@virtuozzo.com> | ||||
| Tested-by: Peter Lieven <pl@kamp.de> | ||||
| Signed-off-by: Kevin Wolf <kwolf@redhat.com> | ||||
| (cherry picked from commit 51cd8bddd63540514d44808f7920811439baa253) | ||||
| Signed-off-by: Kevin Wolf <kwolf@redhat.com> | ||||
| ---
 | ||||
|  tests/qemu-iotests/122     |  1 + | ||||
|  tests/qemu-iotests/122.out | 10 ++++++++-- | ||||
|  2 files changed, 9 insertions(+), 2 deletions(-) | ||||
| 
 | ||||
| diff --git a/tests/qemu-iotests/122 b/tests/qemu-iotests/122
 | ||||
| index efb260d822..be0f6b79e5 100755
 | ||||
| --- a/tests/qemu-iotests/122
 | ||||
| +++ b/tests/qemu-iotests/122
 | ||||
| @@ -251,6 +251,7 @@ $QEMU_IO -c "write -P 0 0 64k" "$TEST_IMG" 2>&1 | _filter_qemu_io | _filter_test
 | ||||
|  $QEMU_IO -c "write 0 1k" "$TEST_IMG" 2>&1 | _filter_qemu_io | _filter_testdir | ||||
|  $QEMU_IO -c "write 8k 1k" "$TEST_IMG" 2>&1 | _filter_qemu_io | _filter_testdir | ||||
|  $QEMU_IO -c "write 17k 1k" "$TEST_IMG" 2>&1 | _filter_qemu_io | _filter_testdir | ||||
| +$QEMU_IO -c "write -P 0 65k 1k" "$TEST_IMG" 2>&1 | _filter_qemu_io | _filter_testdir
 | ||||
|   | ||||
|  for min_sparse in 4k 8k; do | ||||
|      echo | ||||
| diff --git a/tests/qemu-iotests/122.out b/tests/qemu-iotests/122.out
 | ||||
| index 8fbdac2b39..69b8e8b803 100644
 | ||||
| --- a/tests/qemu-iotests/122.out
 | ||||
| +++ b/tests/qemu-iotests/122.out
 | ||||
| @@ -192,6 +192,8 @@ wrote 1024/1024 bytes at offset 8192
 | ||||
|  1 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) | ||||
|  wrote 1024/1024 bytes at offset 17408 | ||||
|  1 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) | ||||
| +wrote 1024/1024 bytes at offset 66560
 | ||||
| +1 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
 | ||||
|   | ||||
|  convert -S 4k | ||||
|  [{ "start": 0, "length": 4096, "depth": 0, "present": true, "zero": false, "data": true, "offset": OFFSET}, | ||||
| @@ -199,7 +201,9 @@ convert -S 4k
 | ||||
|  { "start": 8192, "length": 4096, "depth": 0, "present": true, "zero": false, "data": true, "offset": OFFSET}, | ||||
|  { "start": 12288, "length": 4096, "depth": 0, "present": false, "zero": true, "data": false}, | ||||
|  { "start": 16384, "length": 4096, "depth": 0, "present": true, "zero": false, "data": true, "offset": OFFSET}, | ||||
| -{ "start": 20480, "length": 67088384, "depth": 0, "present": false, "zero": true, "data": false}]
 | ||||
| +{ "start": 20480, "length": 46080, "depth": 0, "present": false, "zero": true, "data": false},
 | ||||
| +{ "start": 66560, "length": 1024, "depth": 0, "present": true, "zero": false, "data": true, "offset": OFFSET},
 | ||||
| +{ "start": 67584, "length": 67041280, "depth": 0, "present": false, "zero": true, "data": false}]
 | ||||
|   | ||||
|  convert -c -S 4k | ||||
|  [{ "start": 0, "length": 1024, "depth": 0, "present": true, "zero": false, "data": true}, | ||||
| @@ -211,7 +215,9 @@ convert -c -S 4k
 | ||||
|   | ||||
|  convert -S 8k | ||||
|  [{ "start": 0, "length": 24576, "depth": 0, "present": true, "zero": false, "data": true, "offset": OFFSET}, | ||||
| -{ "start": 24576, "length": 67084288, "depth": 0, "present": false, "zero": true, "data": false}]
 | ||||
| +{ "start": 24576, "length": 41984, "depth": 0, "present": false, "zero": true, "data": false},
 | ||||
| +{ "start": 66560, "length": 1024, "depth": 0, "present": true, "zero": false, "data": true, "offset": OFFSET},
 | ||||
| +{ "start": 67584, "length": 67041280, "depth": 0, "present": false, "zero": true, "data": false}]
 | ||||
|   | ||||
|  convert -c -S 8k | ||||
|  [{ "start": 0, "length": 1024, "depth": 0, "present": true, "zero": false, "data": true}, | ||||
| -- 
 | ||||
| 2.27.0 | ||||
| 
 | ||||
							
								
								
									
										197
									
								
								SOURCES/kvm-iotests-block-status-cache-New-test.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										197
									
								
								SOURCES/kvm-iotests-block-status-cache-New-test.patch
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,197 @@ | ||||
| From 89fe89491f89a7526ba864a9d94d3de930261d69 Mon Sep 17 00:00:00 2001 | ||||
| From: Hanna Reitz <hreitz@redhat.com> | ||||
| Date: Tue, 18 Jan 2022 18:00:00 +0100 | ||||
| Subject: [PATCH 07/12] iotests/block-status-cache: New test | ||||
| 
 | ||||
| RH-Author: Hanna Reitz <hreitz@redhat.com> | ||||
| RH-MergeRequest: 69: block/io: Update BSC only if want_zero is true | ||||
| RH-Commit: [2/2] 3c5a55aca1ac7a71c175a124d63bcf7a4430a022 (hreitz/qemu-kvm-c-9-s) | ||||
| RH-Bugzilla: 2041461 | ||||
| RH-Acked-by: Eric Blake <eblake@redhat.com> | ||||
| RH-Acked-by: Stefan Hajnoczi <stefanha@redhat.com> | ||||
| RH-Acked-by: Kevin Wolf <kwolf@redhat.com> | ||||
| 
 | ||||
| Add a new test to verify that want_zero=false block-status calls do not | ||||
| pollute the block-status cache for want_zero=true calls. | ||||
| 
 | ||||
| We check want_zero=true calls and their results using `qemu-img map` | ||||
| (over NBD), and want_zero=false calls also using `qemu-img map` over | ||||
| NBD, but using the qemu:allocation-depth context. | ||||
| 
 | ||||
| (This test case cannot be integrated into nbd-qemu-allocation, because | ||||
| that is a qcow2 test, and this is a raw test.) | ||||
| 
 | ||||
| Signed-off-by: Hanna Reitz <hreitz@redhat.com> | ||||
| Message-Id: <20220118170000.49423-3-hreitz@redhat.com> | ||||
| Reviewed-by: Nir Soffer <nsoffer@redhat.com> | ||||
| Reviewed-by: Eric Blake <eblake@redhat.com> | ||||
| Tested-by: Eric Blake <eblake@redhat.com> | ||||
| Signed-off-by: Eric Blake <eblake@redhat.com> | ||||
| (cherry picked from commit 6384dd534d742123d26c008d9794b20bc41359d5) | ||||
| Signed-off-by: Hanna Reitz <hreitz@redhat.com> | ||||
| ---
 | ||||
|  tests/qemu-iotests/tests/block-status-cache   | 139 ++++++++++++++++++ | ||||
|  .../qemu-iotests/tests/block-status-cache.out |   5 + | ||||
|  2 files changed, 144 insertions(+) | ||||
|  create mode 100755 tests/qemu-iotests/tests/block-status-cache | ||||
|  create mode 100644 tests/qemu-iotests/tests/block-status-cache.out | ||||
| 
 | ||||
| diff --git a/tests/qemu-iotests/tests/block-status-cache b/tests/qemu-iotests/tests/block-status-cache
 | ||||
| new file mode 100755 | ||||
| index 0000000000..6fa10bb8f8
 | ||||
| --- /dev/null
 | ||||
| +++ b/tests/qemu-iotests/tests/block-status-cache
 | ||||
| @@ -0,0 +1,139 @@
 | ||||
| +#!/usr/bin/env python3
 | ||||
| +# group: rw quick
 | ||||
| +#
 | ||||
| +# Test cases for the block-status cache.
 | ||||
| +#
 | ||||
| +# Copyright (C) 2022 Red Hat, Inc.
 | ||||
| +#
 | ||||
| +# This program is free software; you can redistribute it and/or modify
 | ||||
| +# it under the terms of the GNU General Public License as published by
 | ||||
| +# the Free Software Foundation; either version 2 of the License, or
 | ||||
| +# (at your option) any later version.
 | ||||
| +#
 | ||||
| +# This program is distributed in the hope that it will be useful,
 | ||||
| +# but WITHOUT ANY WARRANTY; without even the implied warranty of
 | ||||
| +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | ||||
| +# GNU General Public License for more details.
 | ||||
| +#
 | ||||
| +# You should have received a copy of the GNU General Public License
 | ||||
| +# along with this program.  If not, see <http://www.gnu.org/licenses/>.
 | ||||
| +#
 | ||||
| +
 | ||||
| +import os
 | ||||
| +import signal
 | ||||
| +import iotests
 | ||||
| +from iotests import qemu_img_create, qemu_img_pipe, qemu_nbd
 | ||||
| +
 | ||||
| +
 | ||||
| +image_size = 1 * 1024 * 1024
 | ||||
| +test_img = os.path.join(iotests.test_dir, 'test.img')
 | ||||
| +
 | ||||
| +nbd_pidfile = os.path.join(iotests.test_dir, 'nbd.pid')
 | ||||
| +nbd_sock = os.path.join(iotests.sock_dir, 'nbd.sock')
 | ||||
| +
 | ||||
| +
 | ||||
| +class TestBscWithNbd(iotests.QMPTestCase):
 | ||||
| +    def setUp(self) -> None:
 | ||||
| +        """Just create an empty image with a read-only NBD server on it"""
 | ||||
| +        assert qemu_img_create('-f', iotests.imgfmt, test_img,
 | ||||
| +                               str(image_size)) == 0
 | ||||
| +
 | ||||
| +        # Pass --allocation-depth to enable the qemu:allocation-depth context,
 | ||||
| +        # which we are going to query to provoke a block-status inquiry with
 | ||||
| +        # want_zero=false.
 | ||||
| +        assert qemu_nbd(f'--socket={nbd_sock}',
 | ||||
| +                        f'--format={iotests.imgfmt}',
 | ||||
| +                        '--persistent',
 | ||||
| +                        '--allocation-depth',
 | ||||
| +                        '--read-only',
 | ||||
| +                        f'--pid-file={nbd_pidfile}',
 | ||||
| +                        test_img) \
 | ||||
| +            == 0
 | ||||
| +
 | ||||
| +    def tearDown(self) -> None:
 | ||||
| +        with open(nbd_pidfile, encoding='utf-8') as f:
 | ||||
| +            pid = int(f.read())
 | ||||
| +        os.kill(pid, signal.SIGTERM)
 | ||||
| +        os.remove(nbd_pidfile)
 | ||||
| +        os.remove(test_img)
 | ||||
| +
 | ||||
| +    def test_with_zero_bug(self) -> None:
 | ||||
| +        """
 | ||||
| +        Verify that the block-status cache is not corrupted by a
 | ||||
| +        want_zero=false call.
 | ||||
| +        We can provoke a want_zero=false call with `qemu-img map` over NBD with
 | ||||
| +        x-dirty-bitmap=qemu:allocation-depth, so we first run a normal `map`
 | ||||
| +        (which results in want_zero=true), then using said
 | ||||
| +        qemu:allocation-depth context, and finally another normal `map` to
 | ||||
| +        verify that the cache has not been corrupted.
 | ||||
| +        """
 | ||||
| +
 | ||||
| +        nbd_img_opts = f'driver=nbd,server.type=unix,server.path={nbd_sock}'
 | ||||
| +        nbd_img_opts_alloc_depth = nbd_img_opts + \
 | ||||
| +            ',x-dirty-bitmap=qemu:allocation-depth'
 | ||||
| +
 | ||||
| +        # Normal map, results in want_zero=true.
 | ||||
| +        # This will probably detect an allocated data sector first (qemu likes
 | ||||
| +        # to allocate the first sector to facilitate alignment probing), and
 | ||||
| +        # then the rest to be zero.  The BSC will thus contain (if anything)
 | ||||
| +        # one range covering the first sector.
 | ||||
| +        map_pre = qemu_img_pipe('map', '--output=json', '--image-opts',
 | ||||
| +                                nbd_img_opts)
 | ||||
| +
 | ||||
| +        # qemu:allocation-depth maps for want_zero=false.
 | ||||
| +        # want_zero=false should (with the file driver, which the server is
 | ||||
| +        # using) report everything as data.  While this is sufficient for
 | ||||
| +        # want_zero=false, this is nothing that should end up in the
 | ||||
| +        # block-status cache.
 | ||||
| +        # Due to a bug, this information did end up in the cache, though, and
 | ||||
| +        # this would lead to wrong information being returned on subsequent
 | ||||
| +        # want_zero=true calls.
 | ||||
| +        #
 | ||||
| +        # We need to run this map twice: On the first call, we probably still
 | ||||
| +        # have the first sector in the cache, and so this will be served from
 | ||||
| +        # the cache; and only the subsequent range will be queried from the
 | ||||
| +        # block driver.  This subsequent range will then be entered into the
 | ||||
| +        # cache.
 | ||||
| +        # If we did a want_zero=true call at this point, we would thus get
 | ||||
| +        # correct information: The first sector is not covered by the cache, so
 | ||||
| +        # we would get fresh block-status information from the driver, which
 | ||||
| +        # would return a data range, and this would then go into the cache,
 | ||||
| +        # evicting the wrong range from the want_zero=false call before.
 | ||||
| +        #
 | ||||
| +        # Therefore, we need a second want_zero=false map to reproduce:
 | ||||
| +        # Since the first sector is not in the cache, the query for its status
 | ||||
| +        # will go to the driver, which will return a result that reports the
 | ||||
| +        # whole image to be a single data area.  This result will then go into
 | ||||
| +        # the cache, and so the cache will then report the whole image to
 | ||||
| +        # contain data.
 | ||||
| +        #
 | ||||
| +        # Note that once the cache reports the whole image to contain data, any
 | ||||
| +        # subsequent map operation will be served from the cache, and so we can
 | ||||
| +        # never loop too many times here.
 | ||||
| +        for _ in range(2):
 | ||||
| +            # (Ignore the result, this is just to contaminate the cache)
 | ||||
| +            qemu_img_pipe('map', '--output=json', '--image-opts',
 | ||||
| +                          nbd_img_opts_alloc_depth)
 | ||||
| +
 | ||||
| +        # Now let's see whether the cache reports everything as data, or
 | ||||
| +        # whether we get correct information (i.e. the same as we got on our
 | ||||
| +        # first attempt).
 | ||||
| +        map_post = qemu_img_pipe('map', '--output=json', '--image-opts',
 | ||||
| +                                 nbd_img_opts)
 | ||||
| +
 | ||||
| +        if map_pre != map_post:
 | ||||
| +            print('ERROR: Map information differs before and after querying ' +
 | ||||
| +                  'qemu:allocation-depth')
 | ||||
| +            print('Before:')
 | ||||
| +            print(map_pre)
 | ||||
| +            print('After:')
 | ||||
| +            print(map_post)
 | ||||
| +
 | ||||
| +            self.fail("Map information differs")
 | ||||
| +
 | ||||
| +
 | ||||
| +if __name__ == '__main__':
 | ||||
| +    # The block-status cache only works on the protocol layer, so to test it,
 | ||||
| +    # we can only use the raw format
 | ||||
| +    iotests.main(supported_fmts=['raw'],
 | ||||
| +                 supported_protocols=['file'])
 | ||||
| diff --git a/tests/qemu-iotests/tests/block-status-cache.out b/tests/qemu-iotests/tests/block-status-cache.out
 | ||||
| new file mode 100644 | ||||
| index 0000000000..ae1213e6f8
 | ||||
| --- /dev/null
 | ||||
| +++ b/tests/qemu-iotests/tests/block-status-cache.out
 | ||||
| @@ -0,0 +1,5 @@
 | ||||
| +.
 | ||||
| +----------------------------------------------------------------------
 | ||||
| +Ran 1 tests
 | ||||
| +
 | ||||
| +OK
 | ||||
| -- 
 | ||||
| 2.27.0 | ||||
| 
 | ||||
							
								
								
									
										196
									
								
								SOURCES/kvm-iotests-stream-error-on-reset-New-test.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										196
									
								
								SOURCES/kvm-iotests-stream-error-on-reset-New-test.patch
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,196 @@ | ||||
| From 300f912d4a5afe4ecca9c68a71429fbc9966ec34 Mon Sep 17 00:00:00 2001 | ||||
| From: Hanna Reitz <hreitz@redhat.com> | ||||
| Date: Tue, 11 Jan 2022 15:36:13 +0000 | ||||
| Subject: [PATCH 11/12] iotests/stream-error-on-reset: New test | ||||
| 
 | ||||
| RH-Author: Hanna Reitz <hreitz@redhat.com> | ||||
| RH-MergeRequest: 71: block-backend: prevent dangling BDS pointers across aio_poll() | ||||
| RH-Commit: [2/2] 3167f31b91eb433f338564201f4ef336e39f7f7d (hreitz/qemu-kvm-c-9-s) | ||||
| RH-Bugzilla: 2040123 | ||||
| RH-Acked-by: Kevin Wolf <kwolf@redhat.com> | ||||
| RH-Acked-by: Stefan Hajnoczi <stefanha@redhat.com> | ||||
| RH-Acked-by: Emanuele Giuseppe Esposito <eesposit@redhat.com> | ||||
| 
 | ||||
| Test the following scenario: | ||||
| - Simple stream block in two-layer backing chain (base and top)
 | ||||
| - The job is drained via blk_drain(), then an error occurs while the job
 | ||||
|   settles the ongoing request | ||||
| - And so the job completes while in blk_drain()
 | ||||
| 
 | ||||
| This was reported as a segfault, but is fixed by "block-backend: prevent | ||||
| dangling BDS pointers across aio_poll()". | ||||
| 
 | ||||
| Buglink: https://bugzilla.redhat.com/show_bug.cgi?id=2036178 | ||||
| Signed-off-by: Hanna Reitz <hreitz@redhat.com> | ||||
| Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com> | ||||
| Message-Id: <20220111153613.25453-3-stefanha@redhat.com> | ||||
| Signed-off-by: Kevin Wolf <kwolf@redhat.com> | ||||
| (cherry picked from commit 2ca1d5d6b91f8a52a5c651f660b2f58c94bf97ba) | ||||
| Signed-off-by: Hanna Reitz <hreitz@redhat.com> | ||||
| ---
 | ||||
|  .../qemu-iotests/tests/stream-error-on-reset  | 140 ++++++++++++++++++ | ||||
|  .../tests/stream-error-on-reset.out           |   5 + | ||||
|  2 files changed, 145 insertions(+) | ||||
|  create mode 100755 tests/qemu-iotests/tests/stream-error-on-reset | ||||
|  create mode 100644 tests/qemu-iotests/tests/stream-error-on-reset.out | ||||
| 
 | ||||
| diff --git a/tests/qemu-iotests/tests/stream-error-on-reset b/tests/qemu-iotests/tests/stream-error-on-reset
 | ||||
| new file mode 100755 | ||||
| index 0000000000..7eaedb24d7
 | ||||
| --- /dev/null
 | ||||
| +++ b/tests/qemu-iotests/tests/stream-error-on-reset
 | ||||
| @@ -0,0 +1,140 @@
 | ||||
| +#!/usr/bin/env python3
 | ||||
| +# group: rw quick
 | ||||
| +#
 | ||||
| +# Test what happens when a stream job completes in a blk_drain().
 | ||||
| +#
 | ||||
| +# Copyright (C) 2022 Red Hat, Inc.
 | ||||
| +#
 | ||||
| +# This program is free software; you can redistribute it and/or modify
 | ||||
| +# it under the terms of the GNU General Public License as published by
 | ||||
| +# the Free Software Foundation; either version 2 of the License, or
 | ||||
| +# (at your option) any later version.
 | ||||
| +#
 | ||||
| +# This program is distributed in the hope that it will be useful,
 | ||||
| +# but WITHOUT ANY WARRANTY; without even the implied warranty of
 | ||||
| +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | ||||
| +# GNU General Public License for more details.
 | ||||
| +#
 | ||||
| +# You should have received a copy of the GNU General Public License
 | ||||
| +# along with this program.  If not, see <http://www.gnu.org/licenses/>.
 | ||||
| +#
 | ||||
| +
 | ||||
| +import os
 | ||||
| +import iotests
 | ||||
| +from iotests import imgfmt, qemu_img_create, qemu_io_silent, QMPTestCase
 | ||||
| +
 | ||||
| +
 | ||||
| +image_size = 1 * 1024 * 1024
 | ||||
| +data_size = 64 * 1024
 | ||||
| +base = os.path.join(iotests.test_dir, 'base.img')
 | ||||
| +top = os.path.join(iotests.test_dir, 'top.img')
 | ||||
| +
 | ||||
| +
 | ||||
| +# We want to test completing a stream job in a blk_drain().
 | ||||
| +#
 | ||||
| +# The blk_drain() we are going to use is a virtio-scsi device resetting,
 | ||||
| +# which we can trigger by resetting the system.
 | ||||
| +#
 | ||||
| +# In order to have the block job complete on drain, we (1) throttle its
 | ||||
| +# base image so we can start the drain after it has begun, but before it
 | ||||
| +# completes, and (2) make it encounter an I/O error on the ensuing write.
 | ||||
| +# (If it completes regularly, the completion happens after the drain for
 | ||||
| +# some reason.)
 | ||||
| +
 | ||||
| +class TestStreamErrorOnReset(QMPTestCase):
 | ||||
| +    def setUp(self) -> None:
 | ||||
| +        """
 | ||||
| +        Create two images:
 | ||||
| +        - base image {base} with {data_size} bytes allocated
 | ||||
| +        - top image {top} without any data allocated
 | ||||
| +
 | ||||
| +        And the following VM configuration:
 | ||||
| +        - base image throttled to {data_size}
 | ||||
| +        - top image with a blkdebug configuration so the first write access
 | ||||
| +          to it will result in an error
 | ||||
| +        - top image is attached to a virtio-scsi device
 | ||||
| +        """
 | ||||
| +        assert qemu_img_create('-f', imgfmt, base, str(image_size)) == 0
 | ||||
| +        assert qemu_io_silent('-c', f'write 0 {data_size}', base) == 0
 | ||||
| +        assert qemu_img_create('-f', imgfmt, top, str(image_size)) == 0
 | ||||
| +
 | ||||
| +        self.vm = iotests.VM()
 | ||||
| +        self.vm.add_args('-accel', 'tcg') # Make throttling work properly
 | ||||
| +        self.vm.add_object(self.vm.qmp_to_opts({
 | ||||
| +            'qom-type': 'throttle-group',
 | ||||
| +            'id': 'thrgr',
 | ||||
| +            'x-bps-total': str(data_size)
 | ||||
| +        }))
 | ||||
| +        self.vm.add_blockdev(self.vm.qmp_to_opts({
 | ||||
| +            'driver': imgfmt,
 | ||||
| +            'node-name': 'base',
 | ||||
| +            'file': {
 | ||||
| +                'driver': 'throttle',
 | ||||
| +                'throttle-group': 'thrgr',
 | ||||
| +                'file': {
 | ||||
| +                    'driver': 'file',
 | ||||
| +                    'filename': base
 | ||||
| +                }
 | ||||
| +            }
 | ||||
| +        }))
 | ||||
| +        self.vm.add_blockdev(self.vm.qmp_to_opts({
 | ||||
| +            'driver': imgfmt,
 | ||||
| +            'node-name': 'top',
 | ||||
| +            'file': {
 | ||||
| +                'driver': 'blkdebug',
 | ||||
| +                'node-name': 'top-blkdebug',
 | ||||
| +                'inject-error': [{
 | ||||
| +                    'event': 'pwritev',
 | ||||
| +                    'immediately': 'true',
 | ||||
| +                    'once': 'true'
 | ||||
| +                }],
 | ||||
| +                'image': {
 | ||||
| +                    'driver': 'file',
 | ||||
| +                    'filename': top
 | ||||
| +                }
 | ||||
| +            },
 | ||||
| +            'backing': 'base'
 | ||||
| +        }))
 | ||||
| +        self.vm.add_device(self.vm.qmp_to_opts({
 | ||||
| +            'driver': 'virtio-scsi',
 | ||||
| +            'id': 'vscsi'
 | ||||
| +        }))
 | ||||
| +        self.vm.add_device(self.vm.qmp_to_opts({
 | ||||
| +            'driver': 'scsi-hd',
 | ||||
| +            'bus': 'vscsi.0',
 | ||||
| +            'drive': 'top'
 | ||||
| +        }))
 | ||||
| +        self.vm.launch()
 | ||||
| +
 | ||||
| +    def tearDown(self) -> None:
 | ||||
| +        self.vm.shutdown()
 | ||||
| +        os.remove(top)
 | ||||
| +        os.remove(base)
 | ||||
| +
 | ||||
| +    def test_stream_error_on_reset(self) -> None:
 | ||||
| +        # Launch a stream job, which will take at least a second to
 | ||||
| +        # complete, because the base image is throttled (so we can
 | ||||
| +        # get in between it having started and it having completed)
 | ||||
| +        res = self.vm.qmp('block-stream', job_id='stream', device='top')
 | ||||
| +        self.assert_qmp(res, 'return', {})
 | ||||
| +
 | ||||
| +        while True:
 | ||||
| +            ev = self.vm.event_wait('JOB_STATUS_CHANGE')
 | ||||
| +            if ev['data']['status'] == 'running':
 | ||||
| +                # Once the stream job is running, reset the system, which
 | ||||
| +                # forces the virtio-scsi device to be reset, thus draining
 | ||||
| +                # the stream job, and making it complete.  Completing
 | ||||
| +                # inside of that drain should not result in a segfault.
 | ||||
| +                res = self.vm.qmp('system_reset')
 | ||||
| +                self.assert_qmp(res, 'return', {})
 | ||||
| +            elif ev['data']['status'] == 'null':
 | ||||
| +                # The test is done once the job is gone
 | ||||
| +                break
 | ||||
| +
 | ||||
| +
 | ||||
| +if __name__ == '__main__':
 | ||||
| +    # Passes with any format with backing file support, but qed and
 | ||||
| +    # qcow1 do not seem to exercise the used-to-be problematic code
 | ||||
| +    # path, so there is no point in having them in this list
 | ||||
| +    iotests.main(supported_fmts=['qcow2', 'vmdk'],
 | ||||
| +                 supported_protocols=['file'])
 | ||||
| diff --git a/tests/qemu-iotests/tests/stream-error-on-reset.out b/tests/qemu-iotests/tests/stream-error-on-reset.out
 | ||||
| new file mode 100644 | ||||
| index 0000000000..ae1213e6f8
 | ||||
| --- /dev/null
 | ||||
| +++ b/tests/qemu-iotests/tests/stream-error-on-reset.out
 | ||||
| @@ -0,0 +1,5 @@
 | ||||
| +.
 | ||||
| +----------------------------------------------------------------------
 | ||||
| +Ran 1 tests
 | ||||
| +
 | ||||
| +OK
 | ||||
| -- 
 | ||||
| 2.27.0 | ||||
| 
 | ||||
							
								
								
									
										92
									
								
								SOURCES/kvm-iotests.py-Add-QemuStorageDaemon-class.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										92
									
								
								SOURCES/kvm-iotests.py-Add-QemuStorageDaemon-class.patch
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,92 @@ | ||||
| From c21502a220d107261c9a8627158f357489d86543 Mon Sep 17 00:00:00 2001 | ||||
| From: Hanna Reitz <hreitz@redhat.com> | ||||
| Date: Fri, 4 Feb 2022 12:10:09 +0100 | ||||
| Subject: [PATCH 5/8] iotests.py: Add QemuStorageDaemon class | ||||
| 
 | ||||
| RH-Author: Hanna Reitz <hreitz@redhat.com> | ||||
| RH-MergeRequest: 74: block/nbd: Handle AioContext changes | ||||
| RH-Commit: [3/6] 5da1cda4d025c1bd7029ed8071b4ccf25459a878 (hreitz/qemu-kvm-c-9-s) | ||||
| RH-Bugzilla: 2033626 | ||||
| RH-Acked-by: Miroslav Rezanina <mrezanin@redhat.com> | ||||
| RH-Acked-by: Eric Blake <eblake@redhat.com> | ||||
| RH-Acked-by: Stefan Hajnoczi <stefanha@redhat.com> | ||||
| 
 | ||||
| This is a rather simple class that allows creating a QSD instance | ||||
| running in the background and stopping it when no longer needed. | ||||
| 
 | ||||
| The __del__ handler is a safety net for when something goes so wrong in | ||||
| a test that e.g. the tearDown() method is not called (e.g. setUp() | ||||
| launches the QSD, but then launching a VM fails).  We do not want the | ||||
| QSD to continue running after the test has failed, so __del__() will | ||||
| take care to kill it. | ||||
| 
 | ||||
| Reviewed-by: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com> | ||||
| Signed-off-by: Hanna Reitz <hreitz@redhat.com> | ||||
| Signed-off-by: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com> | ||||
| (cherry picked from commit 091dc7b2b5553a529bff9a7bf9ad3bc85bc5bdcd) | ||||
| Signed-off-by: Hanna Reitz <hreitz@redhat.com> | ||||
| ---
 | ||||
|  tests/qemu-iotests/iotests.py | 40 +++++++++++++++++++++++++++++++++++ | ||||
|  1 file changed, 40 insertions(+) | ||||
| 
 | ||||
| diff --git a/tests/qemu-iotests/iotests.py b/tests/qemu-iotests/iotests.py
 | ||||
| index 83bfedb902..a51b5ce8cd 100644
 | ||||
| --- a/tests/qemu-iotests/iotests.py
 | ||||
| +++ b/tests/qemu-iotests/iotests.py
 | ||||
| @@ -72,6 +72,8 @@
 | ||||
|  qemu_prog = os.environ.get('QEMU_PROG', 'qemu') | ||||
|  qemu_opts = os.environ.get('QEMU_OPTIONS', '').strip().split(' ') | ||||
|   | ||||
| +qsd_prog = os.environ.get('QSD_PROG', 'qemu-storage-daemon')
 | ||||
| +
 | ||||
|  gdb_qemu_env = os.environ.get('GDB_OPTIONS') | ||||
|  qemu_gdb = [] | ||||
|  if gdb_qemu_env: | ||||
| @@ -312,6 +314,44 @@ def cmd(self, cmd):
 | ||||
|          return self._read_output() | ||||
|   | ||||
|   | ||||
| +class QemuStorageDaemon:
 | ||||
| +    def __init__(self, *args: str, instance_id: str = 'a'):
 | ||||
| +        assert '--pidfile' not in args
 | ||||
| +        self.pidfile = os.path.join(test_dir, f'qsd-{instance_id}-pid')
 | ||||
| +        all_args = [qsd_prog] + list(args) + ['--pidfile', self.pidfile]
 | ||||
| +
 | ||||
| +        # Cannot use with here, we want the subprocess to stay around
 | ||||
| +        # pylint: disable=consider-using-with
 | ||||
| +        self._p = subprocess.Popen(all_args)
 | ||||
| +        while not os.path.exists(self.pidfile):
 | ||||
| +            if self._p.poll() is not None:
 | ||||
| +                cmd = ' '.join(all_args)
 | ||||
| +                raise RuntimeError(
 | ||||
| +                    'qemu-storage-daemon terminated with exit code ' +
 | ||||
| +                    f'{self._p.returncode}: {cmd}')
 | ||||
| +
 | ||||
| +            time.sleep(0.01)
 | ||||
| +
 | ||||
| +        with open(self.pidfile, encoding='utf-8') as f:
 | ||||
| +            self._pid = int(f.read().strip())
 | ||||
| +
 | ||||
| +        assert self._pid == self._p.pid
 | ||||
| +
 | ||||
| +    def stop(self, kill_signal=15):
 | ||||
| +        self._p.send_signal(kill_signal)
 | ||||
| +        self._p.wait()
 | ||||
| +        self._p = None
 | ||||
| +
 | ||||
| +        try:
 | ||||
| +            os.remove(self.pidfile)
 | ||||
| +        except OSError:
 | ||||
| +            pass
 | ||||
| +
 | ||||
| +    def __del__(self):
 | ||||
| +        if self._p is not None:
 | ||||
| +            self.stop(kill_signal=9)
 | ||||
| +
 | ||||
| +
 | ||||
|  def qemu_nbd(*args): | ||||
|      '''Run qemu-nbd in daemon mode and return the parent's exit code''' | ||||
|      return subprocess.call(qemu_nbd_args + ['--fork'] + list(args)) | ||||
| -- 
 | ||||
| 2.27.0 | ||||
| 
 | ||||
| @ -0,0 +1,97 @@ | ||||
| From b169059c8fbf15c3ffeec0f68b938cb9febd8db7 Mon Sep 17 00:00:00 2001 | ||||
| From: Peter Xu <peterx@redhat.com> | ||||
| Date: Tue, 30 Nov 2021 16:00:28 +0800 | ||||
| Subject: [PATCH 5/6] memory: Fix incorrect calls of log_global_start/stop | ||||
| MIME-Version: 1.0 | ||||
| Content-Type: text/plain; charset=UTF-8 | ||||
| Content-Transfer-Encoding: 8bit | ||||
| 
 | ||||
| RH-Author: Peter Xu <peterx@redhat.com> | ||||
| RH-MergeRequest: 77: memory: Fix qemu crash on continuous migrations of stopped VM | ||||
| RH-Commit: [1/2] 6271ee689266b24d29d4c87f60e5b096ef5f5d63 (peterx/qemu-kvm) | ||||
| RH-Bugzilla: 2044818 | ||||
| RH-Acked-by: Paolo Bonzini <None> | ||||
| RH-Acked-by: David Hildenbrand <david@redhat.com> | ||||
| RH-Acked-by: quintela1 <quintela@redhat.com> | ||||
| 
 | ||||
| We should only call the log_global_start/stop when the global dirty track | ||||
| bitmask changes from zero<->non-zero. | ||||
| 
 | ||||
| No real issue reported for this yet probably because no immediate user to | ||||
| enable both dirty rate measurement and migration at the same time.  However | ||||
| it'll be good to be prepared for it. | ||||
| 
 | ||||
| Fixes: 63b41db4bc ("memory: make global_dirty_tracking a bitmask") | ||||
| Cc: qemu-stable@nongnu.org | ||||
| Cc: Hyman Huang <huangy81@chinatelecom.cn> | ||||
| Cc: Paolo Bonzini <pbonzini@redhat.com> | ||||
| Cc: Dr. David Alan Gilbert <dgilbert@redhat.com> | ||||
| Cc: Juan Quintela <quintela@redhat.com> | ||||
| Cc: David Hildenbrand <david@redhat.com> | ||||
| Signed-off-by: Peter Xu <peterx@redhat.com> | ||||
| Reviewed-by: David Hildenbrand <david@redhat.com> | ||||
| Message-Id: <20211130080028.6474-1-peterx@redhat.com> | ||||
| Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org> | ||||
| (cherry picked from commit 7b0538ed3a22ce30817f818449d10701fb0821f9) | ||||
| Signed-off-by: Peter Xu <peterx@redhat.com> | ||||
| ---
 | ||||
|  softmmu/memory.c | 27 ++++++++++++++------------- | ||||
|  1 file changed, 14 insertions(+), 13 deletions(-) | ||||
| 
 | ||||
| diff --git a/softmmu/memory.c b/softmmu/memory.c
 | ||||
| index 7340e19ff5..81d4bf1454 100644
 | ||||
| --- a/softmmu/memory.c
 | ||||
| +++ b/softmmu/memory.c
 | ||||
| @@ -2773,6 +2773,8 @@ static VMChangeStateEntry *vmstate_change;
 | ||||
|   | ||||
|  void memory_global_dirty_log_start(unsigned int flags) | ||||
|  { | ||||
| +    unsigned int old_flags = global_dirty_tracking;
 | ||||
| +
 | ||||
|      if (vmstate_change) { | ||||
|          qemu_del_vm_change_state_handler(vmstate_change); | ||||
|          vmstate_change = NULL; | ||||
| @@ -2781,15 +2783,14 @@ void memory_global_dirty_log_start(unsigned int flags)
 | ||||
|      assert(flags && !(flags & (~GLOBAL_DIRTY_MASK))); | ||||
|      assert(!(global_dirty_tracking & flags)); | ||||
|      global_dirty_tracking |= flags; | ||||
| -
 | ||||
|      trace_global_dirty_changed(global_dirty_tracking); | ||||
|   | ||||
| -    MEMORY_LISTENER_CALL_GLOBAL(log_global_start, Forward);
 | ||||
| -
 | ||||
| -    /* Refresh DIRTY_MEMORY_MIGRATION bit.  */
 | ||||
| -    memory_region_transaction_begin();
 | ||||
| -    memory_region_update_pending = true;
 | ||||
| -    memory_region_transaction_commit();
 | ||||
| +    if (!old_flags) {
 | ||||
| +        MEMORY_LISTENER_CALL_GLOBAL(log_global_start, Forward);
 | ||||
| +        memory_region_transaction_begin();
 | ||||
| +        memory_region_update_pending = true;
 | ||||
| +        memory_region_transaction_commit();
 | ||||
| +    }
 | ||||
|  } | ||||
|   | ||||
|  static void memory_global_dirty_log_do_stop(unsigned int flags) | ||||
| @@ -2800,12 +2801,12 @@ static void memory_global_dirty_log_do_stop(unsigned int flags)
 | ||||
|   | ||||
|      trace_global_dirty_changed(global_dirty_tracking); | ||||
|   | ||||
| -    /* Refresh DIRTY_MEMORY_MIGRATION bit.  */
 | ||||
| -    memory_region_transaction_begin();
 | ||||
| -    memory_region_update_pending = true;
 | ||||
| -    memory_region_transaction_commit();
 | ||||
| -
 | ||||
| -    MEMORY_LISTENER_CALL_GLOBAL(log_global_stop, Reverse);
 | ||||
| +    if (!global_dirty_tracking) {
 | ||||
| +        memory_region_transaction_begin();
 | ||||
| +        memory_region_update_pending = true;
 | ||||
| +        memory_region_transaction_commit();
 | ||||
| +        MEMORY_LISTENER_CALL_GLOBAL(log_global_stop, Reverse);
 | ||||
| +    }
 | ||||
|  } | ||||
|   | ||||
|  static void memory_vm_change_state_handler(void *opaque, bool running, | ||||
| -- 
 | ||||
| 2.27.0 | ||||
| 
 | ||||
| @ -0,0 +1,156 @@ | ||||
| From b3ed8e344c733bc8c2223c1b9e424a9fbcea56d4 Mon Sep 17 00:00:00 2001 | ||||
| From: Peter Xu <peterx@redhat.com> | ||||
| Date: Mon, 7 Feb 2022 20:30:19 +0800 | ||||
| Subject: [PATCH 6/6] memory: Fix qemu crash on starting dirty log twice with | ||||
|  stopped VM | ||||
| 
 | ||||
| RH-Author: Peter Xu <peterx@redhat.com> | ||||
| RH-MergeRequest: 77: memory: Fix qemu crash on continuous migrations of stopped VM | ||||
| RH-Commit: [2/2] 98ed2ef6226ec80a1896ebb554015aded0dc0c18 (peterx/qemu-kvm) | ||||
| RH-Bugzilla: 2044818 | ||||
| RH-Acked-by: Paolo Bonzini <None> | ||||
| RH-Acked-by: David Hildenbrand <david@redhat.com> | ||||
| RH-Acked-by: quintela1 <quintela@redhat.com> | ||||
| 
 | ||||
| QEMU can now easily crash with two continuous migration carried out: | ||||
| 
 | ||||
| (qemu) migrate -d exec:cat>out | ||||
| (qemu) migrate_cancel | ||||
| (qemu) migrate -d exec:cat>out | ||||
| [crash] ../softmmu/memory.c:2782: memory_global_dirty_log_start: Assertion | ||||
| `!(global_dirty_tracking & flags)' failed. | ||||
| 
 | ||||
| It's because memory API provides a way to postpone dirty log stop if the VM is | ||||
| stopped, and that'll be re-done until the next VM start.  It was added in 2017 | ||||
| with commit 1931076077 ("migration: optimize the downtime", 2017-08-01). | ||||
| 
 | ||||
| However the recent work on allowing dirty tracking to be bitmask broke it, | ||||
| which is commit 63b41db4bc ("memory: make global_dirty_tracking a bitmask", | ||||
| 2021-11-01). | ||||
| 
 | ||||
| The fix proposed in this patch contains two things: | ||||
| 
 | ||||
|   (1) Instead of passing over the flags to postpone stop dirty track, we add a | ||||
|       global variable (along with current vmstate_change variable) to record | ||||
|       what flags to stop dirty tracking. | ||||
| 
 | ||||
|   (2) When start dirty tracking, instead if remove the vmstate hook directly, | ||||
|       we also execute the postponed stop process so that we make sure all the | ||||
|       starts and stops will be paired. | ||||
| 
 | ||||
| This procedure is overlooked in the bitmask-ify work in 2021. | ||||
| 
 | ||||
| Cc: Hyman Huang <huangy81@chinatelecom.cn> | ||||
| Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=2044818 | ||||
| Fixes: 63b41db4bc ("memory: make global_dirty_tracking a bitmask") | ||||
| Signed-off-by: Peter Xu <peterx@redhat.com> | ||||
| Message-Id: <20220207123019.27223-1-peterx@redhat.com> | ||||
| Signed-off-by: Paolo Bonzini <pbonzini@redhat.com> | ||||
| (cherry picked from commit a5c90c61a118027b86155cffdf4fe4e2e9de1020) | ||||
| Signed-off-by: Peter Xu <peterx@redhat.com> | ||||
| ---
 | ||||
|  softmmu/memory.c | 61 +++++++++++++++++++++++++++++++++++------------- | ||||
|  1 file changed, 45 insertions(+), 16 deletions(-) | ||||
| 
 | ||||
| diff --git a/softmmu/memory.c b/softmmu/memory.c
 | ||||
| index 81d4bf1454..0311e362ee 100644
 | ||||
| --- a/softmmu/memory.c
 | ||||
| +++ b/softmmu/memory.c
 | ||||
| @@ -2769,19 +2769,32 @@ void memory_global_after_dirty_log_sync(void)
 | ||||
|      MEMORY_LISTENER_CALL_GLOBAL(log_global_after_sync, Forward); | ||||
|  } | ||||
|   | ||||
| +/*
 | ||||
| + * Dirty track stop flags that are postponed due to VM being stopped.  Should
 | ||||
| + * only be used within vmstate_change hook.
 | ||||
| + */
 | ||||
| +static unsigned int postponed_stop_flags;
 | ||||
|  static VMChangeStateEntry *vmstate_change; | ||||
| +static void memory_global_dirty_log_stop_postponed_run(void);
 | ||||
|   | ||||
|  void memory_global_dirty_log_start(unsigned int flags) | ||||
|  { | ||||
| -    unsigned int old_flags = global_dirty_tracking;
 | ||||
| +    unsigned int old_flags;
 | ||||
| +
 | ||||
| +    assert(flags && !(flags & (~GLOBAL_DIRTY_MASK)));
 | ||||
|   | ||||
|      if (vmstate_change) { | ||||
| -        qemu_del_vm_change_state_handler(vmstate_change);
 | ||||
| -        vmstate_change = NULL;
 | ||||
| +        /* If there is postponed stop(), operate on it first */
 | ||||
| +        postponed_stop_flags &= ~flags;
 | ||||
| +        memory_global_dirty_log_stop_postponed_run();
 | ||||
|      } | ||||
|   | ||||
| -    assert(flags && !(flags & (~GLOBAL_DIRTY_MASK)));
 | ||||
| -    assert(!(global_dirty_tracking & flags));
 | ||||
| +    flags &= ~global_dirty_tracking;
 | ||||
| +    if (!flags) {
 | ||||
| +        return;
 | ||||
| +    }
 | ||||
| +
 | ||||
| +    old_flags = global_dirty_tracking;
 | ||||
|      global_dirty_tracking |= flags; | ||||
|      trace_global_dirty_changed(global_dirty_tracking); | ||||
|   | ||||
| @@ -2809,29 +2822,45 @@ static void memory_global_dirty_log_do_stop(unsigned int flags)
 | ||||
|      } | ||||
|  } | ||||
|   | ||||
| +/*
 | ||||
| + * Execute the postponed dirty log stop operations if there is, then reset
 | ||||
| + * everything (including the flags and the vmstate change hook).
 | ||||
| + */
 | ||||
| +static void memory_global_dirty_log_stop_postponed_run(void)
 | ||||
| +{
 | ||||
| +    /* This must be called with the vmstate handler registered */
 | ||||
| +    assert(vmstate_change);
 | ||||
| +
 | ||||
| +    /* Note: postponed_stop_flags can be cleared in log start routine */
 | ||||
| +    if (postponed_stop_flags) {
 | ||||
| +        memory_global_dirty_log_do_stop(postponed_stop_flags);
 | ||||
| +        postponed_stop_flags = 0;
 | ||||
| +    }
 | ||||
| +
 | ||||
| +    qemu_del_vm_change_state_handler(vmstate_change);
 | ||||
| +    vmstate_change = NULL;
 | ||||
| +}
 | ||||
| +
 | ||||
|  static void memory_vm_change_state_handler(void *opaque, bool running, | ||||
|                                             RunState state) | ||||
|  { | ||||
| -    unsigned int flags = (unsigned int)(uintptr_t)opaque;
 | ||||
|      if (running) { | ||||
| -        memory_global_dirty_log_do_stop(flags);
 | ||||
| -
 | ||||
| -        if (vmstate_change) {
 | ||||
| -            qemu_del_vm_change_state_handler(vmstate_change);
 | ||||
| -            vmstate_change = NULL;
 | ||||
| -        }
 | ||||
| +        memory_global_dirty_log_stop_postponed_run();
 | ||||
|      } | ||||
|  } | ||||
|   | ||||
|  void memory_global_dirty_log_stop(unsigned int flags) | ||||
|  { | ||||
|      if (!runstate_is_running()) { | ||||
| +        /* Postpone the dirty log stop, e.g., to when VM starts again */
 | ||||
|          if (vmstate_change) { | ||||
| -            return;
 | ||||
| +            /* Batch with previous postponed flags */
 | ||||
| +            postponed_stop_flags |= flags;
 | ||||
| +        } else {
 | ||||
| +            postponed_stop_flags = flags;
 | ||||
| +            vmstate_change = qemu_add_vm_change_state_handler(
 | ||||
| +                memory_vm_change_state_handler, NULL);
 | ||||
|          } | ||||
| -        vmstate_change = qemu_add_vm_change_state_handler(
 | ||||
| -                                memory_vm_change_state_handler,
 | ||||
| -                                (void *)(uintptr_t)flags);
 | ||||
|          return; | ||||
|      } | ||||
|   | ||||
| -- 
 | ||||
| 2.27.0 | ||||
| 
 | ||||
							
								
								
									
										287
									
								
								SOURCES/kvm-numa-Enable-numa-for-SGX-EPC-sections.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										287
									
								
								SOURCES/kvm-numa-Enable-numa-for-SGX-EPC-sections.patch
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,287 @@ | ||||
| From 6274a2a09a8931188889467b104bf2e2fc39cb54 Mon Sep 17 00:00:00 2001 | ||||
| From: Yang Zhong <yang.zhong@intel.com> | ||||
| Date: Mon, 1 Nov 2021 12:20:05 -0400 | ||||
| Subject: [PATCH 01/12] numa: Enable numa for SGX EPC sections | ||||
| 
 | ||||
| RH-Author: Paul Lai <plai@redhat.com> | ||||
| RH-MergeRequest: 65: Enable SGX and add SGX Numa support | ||||
| RH-Commit: [1/5] ff69d138c3f5903096388ec7ccf8dc5e6c6c6ffb | ||||
| RH-Bugzilla: 2033708 | ||||
| RH-Acked-by: Paolo Bonzini <None> | ||||
| RH-Acked-by: Bandan Das <None> | ||||
| RH-Acked-by: Cornelia Huck <cohuck@redhat.com> | ||||
| 
 | ||||
| The basic SGX did not enable numa for SGX EPC sections, which | ||||
| result in all EPC sections located in numa node 0. This patch | ||||
| enable SGX numa function in the guest and the EPC section can | ||||
| work with RAM as one numa node. | ||||
| 
 | ||||
| The Guest kernel related log: | ||||
| [    0.009981] ACPI: SRAT: Node 0 PXM 0 [mem 0x180000000-0x183ffffff] | ||||
| [    0.009982] ACPI: SRAT: Node 1 PXM 1 [mem 0x184000000-0x185bfffff] | ||||
| The SRAT table can normally show SGX EPC sections menory info in different | ||||
| numa nodes. | ||||
| 
 | ||||
| The SGX EPC numa related command: | ||||
|  ...... | ||||
|  -m 4G,maxmem=20G \ | ||||
|  -smp sockets=2,cores=2 \ | ||||
|  -cpu host,+sgx-provisionkey \ | ||||
|  -object memory-backend-ram,size=2G,host-nodes=0,policy=bind,id=node0 \ | ||||
|  -object memory-backend-epc,id=mem0,size=64M,prealloc=on,host-nodes=0,policy=bind \ | ||||
|  -numa node,nodeid=0,cpus=0-1,memdev=node0 \ | ||||
|  -object memory-backend-ram,size=2G,host-nodes=1,policy=bind,id=node1 \ | ||||
|  -object memory-backend-epc,id=mem1,size=28M,prealloc=on,host-nodes=1,policy=bind \ | ||||
|  -numa node,nodeid=1,cpus=2-3,memdev=node1 \ | ||||
|  -M sgx-epc.0.memdev=mem0,sgx-epc.0.node=0,sgx-epc.1.memdev=mem1,sgx-epc.1.node=1 \ | ||||
|  ...... | ||||
| 
 | ||||
| Signed-off-by: Yang Zhong <yang.zhong@intel.com> | ||||
| Message-Id: <20211101162009.62161-2-yang.zhong@intel.com> | ||||
| Signed-off-by: Paolo Bonzini <pbonzini@redhat.com> | ||||
| (cherry picked from commit 1105812382e1126d86dddc16b3700f8c79dc93d1) | ||||
| Signed-off-by: Paul Lai <plai@redhat.com> | ||||
| ---
 | ||||
|  hw/core/numa.c            |  5 ++--- | ||||
|  hw/i386/acpi-build.c      |  2 ++ | ||||
|  hw/i386/sgx-epc.c         |  3 +++ | ||||
|  hw/i386/sgx-stub.c        |  4 ++++ | ||||
|  hw/i386/sgx.c             | 44 +++++++++++++++++++++++++++++++++++++++ | ||||
|  include/hw/i386/sgx-epc.h |  3 +++ | ||||
|  monitor/hmp-cmds.c        |  1 + | ||||
|  qapi/machine.json         | 10 ++++++++- | ||||
|  qemu-options.hx           |  4 ++-- | ||||
|  9 files changed, 70 insertions(+), 6 deletions(-) | ||||
| 
 | ||||
| diff --git a/hw/core/numa.c b/hw/core/numa.c
 | ||||
| index e6050b2273..1aa05dcf42 100644
 | ||||
| --- a/hw/core/numa.c
 | ||||
| +++ b/hw/core/numa.c
 | ||||
| @@ -784,9 +784,8 @@ static void numa_stat_memory_devices(NumaNodeMem node_mem[])
 | ||||
|                  break; | ||||
|              case MEMORY_DEVICE_INFO_KIND_SGX_EPC: | ||||
|                  se = value->u.sgx_epc.data; | ||||
| -                /* TODO: once we support numa, assign to right node */
 | ||||
| -                node_mem[0].node_mem += se->size;
 | ||||
| -                node_mem[0].node_plugged_mem += se->size;
 | ||||
| +                node_mem[se->node].node_mem += se->size;
 | ||||
| +                node_mem[se->node].node_plugged_mem = 0;
 | ||||
|                  break; | ||||
|              default: | ||||
|                  g_assert_not_reached(); | ||||
| diff --git a/hw/i386/acpi-build.c b/hw/i386/acpi-build.c
 | ||||
| index a99c6e4fe3..8383b83ee3 100644
 | ||||
| --- a/hw/i386/acpi-build.c
 | ||||
| +++ b/hw/i386/acpi-build.c
 | ||||
| @@ -2068,6 +2068,8 @@ build_srat(GArray *table_data, BIOSLinker *linker, MachineState *machine)
 | ||||
|          nvdimm_build_srat(table_data); | ||||
|      } | ||||
|   | ||||
| +    sgx_epc_build_srat(table_data);
 | ||||
| +
 | ||||
|      /* | ||||
|       * TODO: this part is not in ACPI spec and current linux kernel boots fine | ||||
|       * without these entries. But I recall there were issues the last time I | ||||
| diff --git a/hw/i386/sgx-epc.c b/hw/i386/sgx-epc.c
 | ||||
| index e508827e78..96b2940d75 100644
 | ||||
| --- a/hw/i386/sgx-epc.c
 | ||||
| +++ b/hw/i386/sgx-epc.c
 | ||||
| @@ -21,6 +21,7 @@
 | ||||
|   | ||||
|  static Property sgx_epc_properties[] = { | ||||
|      DEFINE_PROP_UINT64(SGX_EPC_ADDR_PROP, SGXEPCDevice, addr, 0), | ||||
| +    DEFINE_PROP_UINT32(SGX_EPC_NUMA_NODE_PROP, SGXEPCDevice, node, 0),
 | ||||
|      DEFINE_PROP_LINK(SGX_EPC_MEMDEV_PROP, SGXEPCDevice, hostmem, | ||||
|                       TYPE_MEMORY_BACKEND_EPC, HostMemoryBackendEpc *), | ||||
|      DEFINE_PROP_END_OF_LIST(), | ||||
| @@ -139,6 +140,8 @@ static void sgx_epc_md_fill_device_info(const MemoryDeviceState *md,
 | ||||
|      se->memaddr = epc->addr; | ||||
|      se->size = object_property_get_uint(OBJECT(epc), SGX_EPC_SIZE_PROP, | ||||
|                                          NULL); | ||||
| +    se->node = object_property_get_uint(OBJECT(epc), SGX_EPC_NUMA_NODE_PROP,
 | ||||
| +                                        NULL);
 | ||||
|      se->memdev = object_get_canonical_path(OBJECT(epc->hostmem)); | ||||
|   | ||||
|      info->u.sgx_epc.data = se; | ||||
| diff --git a/hw/i386/sgx-stub.c b/hw/i386/sgx-stub.c
 | ||||
| index c9b379e665..26833eb233 100644
 | ||||
| --- a/hw/i386/sgx-stub.c
 | ||||
| +++ b/hw/i386/sgx-stub.c
 | ||||
| @@ -6,6 +6,10 @@
 | ||||
|  #include "qapi/error.h" | ||||
|  #include "qapi/qapi-commands-misc-target.h" | ||||
|   | ||||
| +void sgx_epc_build_srat(GArray *table_data)
 | ||||
| +{
 | ||||
| +}
 | ||||
| +
 | ||||
|  SGXInfo *qmp_query_sgx(Error **errp) | ||||
|  { | ||||
|      error_setg(errp, "SGX support is not compiled in"); | ||||
| diff --git a/hw/i386/sgx.c b/hw/i386/sgx.c
 | ||||
| index 8fef3dd8fa..d04299904a 100644
 | ||||
| --- a/hw/i386/sgx.c
 | ||||
| +++ b/hw/i386/sgx.c
 | ||||
| @@ -23,6 +23,7 @@
 | ||||
|  #include "sysemu/hw_accel.h" | ||||
|  #include "sysemu/reset.h" | ||||
|  #include <sys/ioctl.h> | ||||
| +#include "hw/acpi/aml-build.h"
 | ||||
|   | ||||
|  #define SGX_MAX_EPC_SECTIONS            8 | ||||
|  #define SGX_CPUID_EPC_INVALID           0x0 | ||||
| @@ -36,6 +37,46 @@
 | ||||
|   | ||||
|  #define RETRY_NUM                       2 | ||||
|   | ||||
| +static int sgx_epc_device_list(Object *obj, void *opaque)
 | ||||
| +{
 | ||||
| +    GSList **list = opaque;
 | ||||
| +
 | ||||
| +    if (object_dynamic_cast(obj, TYPE_SGX_EPC)) {
 | ||||
| +        *list = g_slist_append(*list, DEVICE(obj));
 | ||||
| +    }
 | ||||
| +
 | ||||
| +    object_child_foreach(obj, sgx_epc_device_list, opaque);
 | ||||
| +    return 0;
 | ||||
| +}
 | ||||
| +
 | ||||
| +static GSList *sgx_epc_get_device_list(void)
 | ||||
| +{
 | ||||
| +    GSList *list = NULL;
 | ||||
| +
 | ||||
| +    object_child_foreach(qdev_get_machine(), sgx_epc_device_list, &list);
 | ||||
| +    return list;
 | ||||
| +}
 | ||||
| +
 | ||||
| +void sgx_epc_build_srat(GArray *table_data)
 | ||||
| +{
 | ||||
| +    GSList *device_list = sgx_epc_get_device_list();
 | ||||
| +
 | ||||
| +    for (; device_list; device_list = device_list->next) {
 | ||||
| +        DeviceState *dev = device_list->data;
 | ||||
| +        Object *obj = OBJECT(dev);
 | ||||
| +        uint64_t addr, size;
 | ||||
| +        int node;
 | ||||
| +
 | ||||
| +        node = object_property_get_uint(obj, SGX_EPC_NUMA_NODE_PROP,
 | ||||
| +                                        &error_abort);
 | ||||
| +        addr = object_property_get_uint(obj, SGX_EPC_ADDR_PROP, &error_abort);
 | ||||
| +        size = object_property_get_uint(obj, SGX_EPC_SIZE_PROP, &error_abort);
 | ||||
| +
 | ||||
| +        build_srat_memory(table_data, addr, size, node, MEM_AFFINITY_ENABLED);
 | ||||
| +    }
 | ||||
| +    g_slist_free(device_list);
 | ||||
| +}
 | ||||
| +
 | ||||
|  static uint64_t sgx_calc_section_metric(uint64_t low, uint64_t high) | ||||
|  { | ||||
|      return (low & MAKE_64BIT_MASK(12, 20)) + | ||||
| @@ -226,6 +267,9 @@ void pc_machine_init_sgx_epc(PCMachineState *pcms)
 | ||||
|          /* set the memdev link with memory backend */ | ||||
|          object_property_parse(obj, SGX_EPC_MEMDEV_PROP, list->value->memdev, | ||||
|                                &error_fatal); | ||||
| +        /* set the numa node property for sgx epc object */
 | ||||
| +        object_property_set_uint(obj, SGX_EPC_NUMA_NODE_PROP, list->value->node,
 | ||||
| +                             &error_fatal);
 | ||||
|          object_property_set_bool(obj, "realized", true, &error_fatal); | ||||
|          object_unref(obj); | ||||
|      } | ||||
| diff --git a/include/hw/i386/sgx-epc.h b/include/hw/i386/sgx-epc.h
 | ||||
| index a6a65be854..581fac389a 100644
 | ||||
| --- a/include/hw/i386/sgx-epc.h
 | ||||
| +++ b/include/hw/i386/sgx-epc.h
 | ||||
| @@ -25,6 +25,7 @@
 | ||||
|  #define SGX_EPC_ADDR_PROP "addr" | ||||
|  #define SGX_EPC_SIZE_PROP "size" | ||||
|  #define SGX_EPC_MEMDEV_PROP "memdev" | ||||
| +#define SGX_EPC_NUMA_NODE_PROP "node"
 | ||||
|   | ||||
|  /** | ||||
|   * SGXEPCDevice: | ||||
| @@ -38,6 +39,7 @@ typedef struct SGXEPCDevice {
 | ||||
|   | ||||
|      /* public */ | ||||
|      uint64_t addr; | ||||
| +    uint32_t node;
 | ||||
|      HostMemoryBackendEpc *hostmem; | ||||
|  } SGXEPCDevice; | ||||
|   | ||||
| @@ -56,6 +58,7 @@ typedef struct SGXEPCState {
 | ||||
|  } SGXEPCState; | ||||
|   | ||||
|  bool sgx_epc_get_section(int section_nr, uint64_t *addr, uint64_t *size); | ||||
| +void sgx_epc_build_srat(GArray *table_data);
 | ||||
|   | ||||
|  static inline uint64_t sgx_epc_above_4g_end(SGXEPCState *sgx_epc) | ||||
|  { | ||||
| diff --git a/monitor/hmp-cmds.c b/monitor/hmp-cmds.c
 | ||||
| index 9c91bf93e9..2669156b28 100644
 | ||||
| --- a/monitor/hmp-cmds.c
 | ||||
| +++ b/monitor/hmp-cmds.c
 | ||||
| @@ -1810,6 +1810,7 @@ void hmp_info_memory_devices(Monitor *mon, const QDict *qdict)
 | ||||
|                                 se->id ? se->id : ""); | ||||
|                  monitor_printf(mon, "  memaddr: 0x%" PRIx64 "\n", se->memaddr); | ||||
|                  monitor_printf(mon, "  size: %" PRIu64 "\n", se->size); | ||||
| +                monitor_printf(mon, "  node: %" PRId64 "\n", se->node);
 | ||||
|                  monitor_printf(mon, "  memdev: %s\n", se->memdev); | ||||
|                  break; | ||||
|              default: | ||||
| diff --git a/qapi/machine.json b/qapi/machine.json
 | ||||
| index 067e3f5378..16e771affc 100644
 | ||||
| --- a/qapi/machine.json
 | ||||
| +++ b/qapi/machine.json
 | ||||
| @@ -1207,12 +1207,15 @@
 | ||||
|  # | ||||
|  # @memdev: memory backend linked with device | ||||
|  # | ||||
| +# @node: the numa node
 | ||||
| +#
 | ||||
|  # Since: 6.2 | ||||
|  ## | ||||
|  { 'struct': 'SgxEPCDeviceInfo', | ||||
|    'data': { '*id': 'str', | ||||
|              'memaddr': 'size', | ||||
|              'size': 'size', | ||||
| +            'node': 'int',
 | ||||
|              'memdev': 'str' | ||||
|            } | ||||
|  } | ||||
| @@ -1285,10 +1288,15 @@
 | ||||
|  # | ||||
|  # @memdev: memory backend linked with device | ||||
|  # | ||||
| +# @node: the numa node
 | ||||
| +#
 | ||||
|  # Since: 6.2 | ||||
|  ## | ||||
|  { 'struct': 'SgxEPC', | ||||
| -  'data': { 'memdev': 'str' } }
 | ||||
| +  'data': { 'memdev': 'str',
 | ||||
| +            'node': 'int'
 | ||||
| +          }
 | ||||
| +}
 | ||||
|   | ||||
|  ## | ||||
|  # @SgxEPCProperties: | ||||
| diff --git a/qemu-options.hx b/qemu-options.hx
 | ||||
| index 94c4a8dbaf..4b7798088b 100644
 | ||||
| --- a/qemu-options.hx
 | ||||
| +++ b/qemu-options.hx
 | ||||
| @@ -127,11 +127,11 @@ SRST
 | ||||
|  ERST | ||||
|   | ||||
|  DEF("M", HAS_ARG, QEMU_OPTION_M, | ||||
| -    "                sgx-epc.0.memdev=memid\n",
 | ||||
| +    "                sgx-epc.0.memdev=memid,sgx-epc.0.node=numaid\n",
 | ||||
|      QEMU_ARCH_ALL) | ||||
|   | ||||
|  SRST | ||||
| -``sgx-epc.0.memdev=@var{memid}``
 | ||||
| +``sgx-epc.0.memdev=@var{memid},sgx-epc.0.node=@var{numaid}``
 | ||||
|      Define an SGX EPC section. | ||||
|  ERST | ||||
|   | ||||
| -- 
 | ||||
| 2.27.0 | ||||
| 
 | ||||
| @ -0,0 +1,210 @@ | ||||
| From 0f75501ba348dc9fb3ce0198ceafc8093149457d Mon Sep 17 00:00:00 2001 | ||||
| From: Yang Zhong <yang.zhong@intel.com> | ||||
| Date: Mon, 1 Nov 2021 12:20:07 -0400 | ||||
| Subject: [PATCH 02/12] numa: Support SGX numa in the monitor and Libvirt | ||||
|  interfaces | ||||
| 
 | ||||
| RH-Author: Paul Lai <plai@redhat.com> | ||||
| RH-MergeRequest: 65: Enable SGX and add SGX Numa support | ||||
| RH-Commit: [2/5] 8c19cfb1a139fd4dbac771e695a133f16a68437f | ||||
| RH-Bugzilla: 2033708 | ||||
| RH-Acked-by: Paolo Bonzini <None> | ||||
| RH-Acked-by: Bandan Das <None> | ||||
| RH-Acked-by: Cornelia Huck <cohuck@redhat.com> | ||||
| 
 | ||||
| Add the SGXEPCSection list into SGXInfo to show the multiple | ||||
| SGX EPC sections detailed info, not the total size like before. | ||||
| This patch can enable numa support for 'info sgx' command and | ||||
| QMP interfaces. The new interfaces show each EPC section info | ||||
| in one numa node. Libvirt can use QMP interface to get the | ||||
| detailed host SGX EPC capabilities to decide how to allocate | ||||
| host EPC sections to guest. | ||||
| 
 | ||||
| (qemu) info sgx | ||||
|  SGX support: enabled | ||||
|  SGX1 support: enabled | ||||
|  SGX2 support: enabled | ||||
|  FLC support: enabled | ||||
|  NUMA node #0: size=67108864 | ||||
|  NUMA node #1: size=29360128 | ||||
| 
 | ||||
| The QMP interface show: | ||||
| (QEMU) query-sgx | ||||
| {"return": {"sgx": true, "sgx2": true, "sgx1": true, "sections": \ | ||||
| [{"node": 0, "size": 67108864}, {"node": 1, "size": 29360128}], "flc": true}} | ||||
| 
 | ||||
| (QEMU) query-sgx-capabilities | ||||
| {"return": {"sgx": true, "sgx2": true, "sgx1": true, "sections": \ | ||||
| [{"node": 0, "size": 17070817280}, {"node": 1, "size": 17079205888}], "flc": true}} | ||||
| 
 | ||||
| Signed-off-by: Yang Zhong <yang.zhong@intel.com> | ||||
| Message-Id: <20211101162009.62161-4-yang.zhong@intel.com> | ||||
| Signed-off-by: Paolo Bonzini <pbonzini@redhat.com> | ||||
| (cherry picked from commit 4755927ae12547c2e7cb22c5fa1b39038c6c11b1) | ||||
| Signed-off-by: Paul Lai <plai@redhat.com> | ||||
| ---
 | ||||
|  hw/i386/sgx.c         | 51 +++++++++++++++++++++++++++++++++++-------- | ||||
|  qapi/misc-target.json | 19 ++++++++++++++-- | ||||
|  2 files changed, 59 insertions(+), 11 deletions(-) | ||||
| 
 | ||||
| diff --git a/hw/i386/sgx.c b/hw/i386/sgx.c
 | ||||
| index d04299904a..5de5dd0893 100644
 | ||||
| --- a/hw/i386/sgx.c
 | ||||
| +++ b/hw/i386/sgx.c
 | ||||
| @@ -83,11 +83,13 @@ static uint64_t sgx_calc_section_metric(uint64_t low, uint64_t high)
 | ||||
|             ((high & MAKE_64BIT_MASK(0, 20)) << 32); | ||||
|  } | ||||
|   | ||||
| -static uint64_t sgx_calc_host_epc_section_size(void)
 | ||||
| +static SGXEPCSectionList *sgx_calc_host_epc_sections(void)
 | ||||
|  { | ||||
| +    SGXEPCSectionList *head = NULL, **tail = &head;
 | ||||
| +    SGXEPCSection *section;
 | ||||
|      uint32_t i, type; | ||||
|      uint32_t eax, ebx, ecx, edx; | ||||
| -    uint64_t size = 0;
 | ||||
| +    uint32_t j = 0;
 | ||||
|   | ||||
|      for (i = 0; i < SGX_MAX_EPC_SECTIONS; i++) { | ||||
|          host_cpuid(0x12, i + 2, &eax, &ebx, &ecx, &edx); | ||||
| @@ -101,10 +103,13 @@ static uint64_t sgx_calc_host_epc_section_size(void)
 | ||||
|              break; | ||||
|          } | ||||
|   | ||||
| -        size += sgx_calc_section_metric(ecx, edx);
 | ||||
| +        section = g_new0(SGXEPCSection, 1);
 | ||||
| +        section->node = j++;
 | ||||
| +        section->size = sgx_calc_section_metric(ecx, edx);
 | ||||
| +        QAPI_LIST_APPEND(tail, section);
 | ||||
|      } | ||||
|   | ||||
| -    return size;
 | ||||
| +    return head;
 | ||||
|  } | ||||
|   | ||||
|  static void sgx_epc_reset(void *opaque) | ||||
| @@ -168,13 +173,35 @@ SGXInfo *qmp_query_sgx_capabilities(Error **errp)
 | ||||
|      info->sgx1 = eax & (1U << 0) ? true : false; | ||||
|      info->sgx2 = eax & (1U << 1) ? true : false; | ||||
|   | ||||
| -    info->section_size = sgx_calc_host_epc_section_size();
 | ||||
| +    info->sections = sgx_calc_host_epc_sections();
 | ||||
|   | ||||
|      close(fd); | ||||
|   | ||||
|      return info; | ||||
|  } | ||||
|   | ||||
| +static SGXEPCSectionList *sgx_get_epc_sections_list(void)
 | ||||
| +{
 | ||||
| +    GSList *device_list = sgx_epc_get_device_list();
 | ||||
| +    SGXEPCSectionList *head = NULL, **tail = &head;
 | ||||
| +    SGXEPCSection *section;
 | ||||
| +
 | ||||
| +    for (; device_list; device_list = device_list->next) {
 | ||||
| +        DeviceState *dev = device_list->data;
 | ||||
| +        Object *obj = OBJECT(dev);
 | ||||
| +
 | ||||
| +        section = g_new0(SGXEPCSection, 1);
 | ||||
| +        section->node = object_property_get_uint(obj, SGX_EPC_NUMA_NODE_PROP,
 | ||||
| +                                                 &error_abort);
 | ||||
| +        section->size = object_property_get_uint(obj, SGX_EPC_SIZE_PROP,
 | ||||
| +                                                 &error_abort);
 | ||||
| +        QAPI_LIST_APPEND(tail, section);
 | ||||
| +    }
 | ||||
| +    g_slist_free(device_list);
 | ||||
| +
 | ||||
| +    return head;
 | ||||
| +}
 | ||||
| +
 | ||||
|  SGXInfo *qmp_query_sgx(Error **errp) | ||||
|  { | ||||
|      SGXInfo *info = NULL; | ||||
| @@ -193,14 +220,13 @@ SGXInfo *qmp_query_sgx(Error **errp)
 | ||||
|          return NULL; | ||||
|      } | ||||
|   | ||||
| -    SGXEPCState *sgx_epc = &pcms->sgx_epc;
 | ||||
|      info = g_new0(SGXInfo, 1); | ||||
|   | ||||
|      info->sgx = true; | ||||
|      info->sgx1 = true; | ||||
|      info->sgx2 = true; | ||||
|      info->flc = true; | ||||
| -    info->section_size = sgx_epc->size;
 | ||||
| +    info->sections = sgx_get_epc_sections_list();
 | ||||
|   | ||||
|      return info; | ||||
|  } | ||||
| @@ -208,6 +234,7 @@ SGXInfo *qmp_query_sgx(Error **errp)
 | ||||
|  void hmp_info_sgx(Monitor *mon, const QDict *qdict) | ||||
|  { | ||||
|      Error *err = NULL; | ||||
| +    SGXEPCSectionList *section_list, *section;
 | ||||
|      g_autoptr(SGXInfo) info = qmp_query_sgx(&err); | ||||
|   | ||||
|      if (err) { | ||||
| @@ -222,8 +249,14 @@ void hmp_info_sgx(Monitor *mon, const QDict *qdict)
 | ||||
|                     info->sgx2 ? "enabled" : "disabled"); | ||||
|      monitor_printf(mon, "FLC support: %s\n", | ||||
|                     info->flc ? "enabled" : "disabled"); | ||||
| -    monitor_printf(mon, "size: %" PRIu64 "\n",
 | ||||
| -                   info->section_size);
 | ||||
| +
 | ||||
| +    section_list = info->sections;
 | ||||
| +    for (section = section_list; section; section = section->next) {
 | ||||
| +        monitor_printf(mon, "NUMA node #%" PRId64 ": ",
 | ||||
| +                       section->value->node);
 | ||||
| +        monitor_printf(mon, "size=%" PRIu64 "\n",
 | ||||
| +                       section->value->size);
 | ||||
| +    }
 | ||||
|  } | ||||
|   | ||||
|  bool sgx_epc_get_section(int section_nr, uint64_t *addr, uint64_t *size) | ||||
| diff --git a/qapi/misc-target.json b/qapi/misc-target.json
 | ||||
| index 5aa2b95b7d..1022aa0184 100644
 | ||||
| --- a/qapi/misc-target.json
 | ||||
| +++ b/qapi/misc-target.json
 | ||||
| @@ -337,6 +337,21 @@
 | ||||
|    'if': 'TARGET_ARM' } | ||||
|   | ||||
|   | ||||
| +##
 | ||||
| +# @SGXEPCSection:
 | ||||
| +#
 | ||||
| +# Information about intel SGX EPC section info
 | ||||
| +#
 | ||||
| +# @node: the numa node
 | ||||
| +#
 | ||||
| +# @size: the size of epc section
 | ||||
| +#
 | ||||
| +# Since: 6.2
 | ||||
| +##
 | ||||
| +{ 'struct': 'SGXEPCSection',
 | ||||
| +  'data': { 'node': 'int',
 | ||||
| +            'size': 'uint64'}}
 | ||||
| +
 | ||||
|  ## | ||||
|  # @SGXInfo: | ||||
|  # | ||||
| @@ -350,7 +365,7 @@
 | ||||
|  # | ||||
|  # @flc: true if FLC is supported | ||||
|  # | ||||
| -# @section-size: The EPC section size for guest
 | ||||
| +# @sections: The EPC sections info for guest
 | ||||
|  # | ||||
|  # Since: 6.2 | ||||
|  ## | ||||
| @@ -359,7 +374,7 @@
 | ||||
|              'sgx1': 'bool', | ||||
|              'sgx2': 'bool', | ||||
|              'flc': 'bool', | ||||
| -            'section-size': 'uint64'},
 | ||||
| +            'sections': ['SGXEPCSection']},
 | ||||
|     'if': 'TARGET_I386' } | ||||
|   | ||||
|  ## | ||||
| -- 
 | ||||
| 2.27.0 | ||||
| 
 | ||||
							
								
								
									
										73
									
								
								SOURCES/kvm-pci-expose-TYPE_XIO3130_DOWNSTREAM-name.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										73
									
								
								SOURCES/kvm-pci-expose-TYPE_XIO3130_DOWNSTREAM-name.patch
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,73 @@ | ||||
| From 0a200d937e63554c38db577961ef4f09c836cb2f Mon Sep 17 00:00:00 2001 | ||||
| From: Igor Mammedov <imammedo@redhat.com> | ||||
| Date: Tue, 1 Mar 2022 10:11:58 -0500 | ||||
| Subject: [PATCH 01/14] pci: expose TYPE_XIO3130_DOWNSTREAM name | ||||
| 
 | ||||
| RH-Author: Igor Mammedov <imammedo@redhat.com> | ||||
| RH-MergeRequest: 124: RHEL-9.0 Fix broken PCIe device after migration | ||||
| RH-Commit: [1/2] 38a5fef15d0b6c231b5ac268aad7d541e5303a7e | ||||
| RH-Bugzilla: 2053584 | ||||
| RH-Acked-by: Vitaly Kuznetsov <vkuznets@redhat.com> | ||||
| RH-Acked-by: MST <None> | ||||
| RH-Acked-by: Gerd Hoffmann <kraxel@redhat.com> | ||||
| 
 | ||||
| Type name will be used in followup patch for cast check | ||||
| in pcihp code. | ||||
| 
 | ||||
| Signed-off-by: Igor Mammedov <imammedo@redhat.com> | ||||
| Message-Id: <20220301151200.3507298-2-imammedo@redhat.com> | ||||
| Reviewed-by: Michael S. Tsirkin <mst@redhat.com> | ||||
| Signed-off-by: Michael S. Tsirkin <mst@redhat.com> | ||||
| (cherry picked from commit c41481af9a5d0d463607cc45b45c510875570817) | ||||
| Signed-off-by: Igor Mammedov <imammedo@redhat.com> | ||||
| ---
 | ||||
|  hw/pci-bridge/xio3130_downstream.c         |  3 ++- | ||||
|  include/hw/pci-bridge/xio3130_downstream.h | 15 +++++++++++++++ | ||||
|  2 files changed, 17 insertions(+), 1 deletion(-) | ||||
|  create mode 100644 include/hw/pci-bridge/xio3130_downstream.h | ||||
| 
 | ||||
| diff --git a/hw/pci-bridge/xio3130_downstream.c b/hw/pci-bridge/xio3130_downstream.c
 | ||||
| index 04aae72cd6..b17cafd359 100644
 | ||||
| --- a/hw/pci-bridge/xio3130_downstream.c
 | ||||
| +++ b/hw/pci-bridge/xio3130_downstream.c
 | ||||
| @@ -28,6 +28,7 @@
 | ||||
|  #include "migration/vmstate.h" | ||||
|  #include "qapi/error.h" | ||||
|  #include "qemu/module.h" | ||||
| +#include "hw/pci-bridge/xio3130_downstream.h"
 | ||||
|   | ||||
|  #define PCI_DEVICE_ID_TI_XIO3130D       0x8233  /* downstream port */ | ||||
|  #define XIO3130_REVISION                0x1 | ||||
| @@ -173,7 +174,7 @@ static void xio3130_downstream_class_init(ObjectClass *klass, void *data)
 | ||||
|  } | ||||
|   | ||||
|  static const TypeInfo xio3130_downstream_info = { | ||||
| -    .name          = "xio3130-downstream",
 | ||||
| +    .name          = TYPE_XIO3130_DOWNSTREAM,
 | ||||
|      .parent        = TYPE_PCIE_SLOT, | ||||
|      .class_init    = xio3130_downstream_class_init, | ||||
|      .interfaces = (InterfaceInfo[]) { | ||||
| diff --git a/include/hw/pci-bridge/xio3130_downstream.h b/include/hw/pci-bridge/xio3130_downstream.h
 | ||||
| new file mode 100644 | ||||
| index 0000000000..1d10139aea
 | ||||
| --- /dev/null
 | ||||
| +++ b/include/hw/pci-bridge/xio3130_downstream.h
 | ||||
| @@ -0,0 +1,15 @@
 | ||||
| +/*
 | ||||
| + * TI X3130 pci express downstream port switch
 | ||||
| + *
 | ||||
| + * Copyright (C) 2022 Igor Mammedov <imammedo@redhat.com>
 | ||||
| + *
 | ||||
| + * SPDX-License-Identifier: GPL-2.0-or-later
 | ||||
| + */
 | ||||
| +
 | ||||
| +#ifndef HW_PCI_BRIDGE_XIO3130_DOWNSTREAM_H
 | ||||
| +#define HW_PCI_BRIDGE_XIO3130_DOWNSTREAM_H
 | ||||
| +
 | ||||
| +#define TYPE_XIO3130_DOWNSTREAM "xio3130-downstream"
 | ||||
| +
 | ||||
| +#endif
 | ||||
| +
 | ||||
| -- 
 | ||||
| 2.31.1 | ||||
| 
 | ||||
| @ -0,0 +1,213 @@ | ||||
| From a6a327ae392c02b8e8c75b5d702d929ff8fe408d Mon Sep 17 00:00:00 2001 | ||||
| From: Yang Zhong <yang.zhong@intel.com> | ||||
| Date: Thu, 20 Jan 2022 17:31:04 -0500 | ||||
| Subject: [PATCH 05/12] qapi: Cleanup SGX related comments and restore | ||||
|  @section-size | ||||
| MIME-Version: 1.0 | ||||
| Content-Type: text/plain; charset=UTF-8 | ||||
| Content-Transfer-Encoding: 8bit | ||||
| 
 | ||||
| RH-Author: Paul Lai <plai@redhat.com> | ||||
| RH-MergeRequest: 65: Enable SGX and add SGX Numa support | ||||
| RH-Commit: [5/5] 0d3b9f37cd3cce202050ba3bd51eef4410ef3d38 | ||||
| RH-Bugzilla: 2033708 | ||||
| RH-Acked-by: Paolo Bonzini <None> | ||||
| RH-Acked-by: Bandan Das <None> | ||||
| RH-Acked-by: Cornelia Huck <cohuck@redhat.com> | ||||
| 
 | ||||
| The SGX NUMA patches were merged into Qemu 7.0 release, we need | ||||
| clarify detailed version history information and also change | ||||
| some related comments, which make SGX related comments clearer. | ||||
| 
 | ||||
| The QMP command schema promises backwards compatibility as standard. | ||||
| We temporarily restore "@section-size", which can avoid incompatible | ||||
| API breakage. The "@section-size" will be deprecated in 7.2 version. | ||||
| 
 | ||||
| Suggested-by: Daniel P. Berrangé <berrange@redhat.com> | ||||
| Signed-off-by: Yang Zhong <yang.zhong@intel.com> | ||||
| Reviewed-by: Daniel P. Berrangé <berrange@redhat.com> | ||||
| Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org> | ||||
| Message-Id: <20220120223104.437161-1-yang.zhong@intel.com> | ||||
| Signed-off-by: Paolo Bonzini <pbonzini@redhat.com> | ||||
| Signed-off-by: Paul Lai <plai@redhat.com> | ||||
| ---
 | ||||
|  docs/about/deprecated.rst | 13 +++++++++++++ | ||||
|  hw/i386/sgx.c             | 11 +++++++++-- | ||||
|  qapi/machine.json         |  4 ++-- | ||||
|  qapi/misc-target.json     | 22 +++++++++++++++++----- | ||||
|  4 files changed, 41 insertions(+), 9 deletions(-) | ||||
| 
 | ||||
| diff --git a/docs/about/deprecated.rst b/docs/about/deprecated.rst
 | ||||
| index ff7488cb63..33925edf45 100644
 | ||||
| --- a/docs/about/deprecated.rst
 | ||||
| +++ b/docs/about/deprecated.rst
 | ||||
| @@ -270,6 +270,19 @@ accepted incorrect commands will return an error. Users should make sure that
 | ||||
|  all arguments passed to ``device_add`` are consistent with the documented | ||||
|  property types. | ||||
|   | ||||
| +``query-sgx`` return value member ``section-size`` (since 7.0)
 | ||||
| +''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
 | ||||
| +
 | ||||
| +Member ``section-size`` in return value elements with meta-type ``uint64`` is
 | ||||
| +deprecated.  Use ``sections`` instead.
 | ||||
| +
 | ||||
| +
 | ||||
| +``query-sgx-capabilities`` return value member ``section-size`` (since 7.0)
 | ||||
| +'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
 | ||||
| +
 | ||||
| +Member ``section-size`` in return value elements with meta-type ``uint64`` is
 | ||||
| +deprecated.  Use ``sections`` instead.
 | ||||
| +
 | ||||
|  System accelerators | ||||
|  ------------------- | ||||
|   | ||||
| diff --git a/hw/i386/sgx.c b/hw/i386/sgx.c
 | ||||
| index 5de5dd0893..a2b318dd93 100644
 | ||||
| --- a/hw/i386/sgx.c
 | ||||
| +++ b/hw/i386/sgx.c
 | ||||
| @@ -83,7 +83,7 @@ static uint64_t sgx_calc_section_metric(uint64_t low, uint64_t high)
 | ||||
|             ((high & MAKE_64BIT_MASK(0, 20)) << 32); | ||||
|  } | ||||
|   | ||||
| -static SGXEPCSectionList *sgx_calc_host_epc_sections(void)
 | ||||
| +static SGXEPCSectionList *sgx_calc_host_epc_sections(uint64_t *size)
 | ||||
|  { | ||||
|      SGXEPCSectionList *head = NULL, **tail = &head; | ||||
|      SGXEPCSection *section; | ||||
| @@ -106,6 +106,7 @@ static SGXEPCSectionList *sgx_calc_host_epc_sections(void)
 | ||||
|          section = g_new0(SGXEPCSection, 1); | ||||
|          section->node = j++; | ||||
|          section->size = sgx_calc_section_metric(ecx, edx); | ||||
| +        *size += section->size;
 | ||||
|          QAPI_LIST_APPEND(tail, section); | ||||
|      } | ||||
|   | ||||
| @@ -156,6 +157,7 @@ SGXInfo *qmp_query_sgx_capabilities(Error **errp)
 | ||||
|  { | ||||
|      SGXInfo *info = NULL; | ||||
|      uint32_t eax, ebx, ecx, edx; | ||||
| +    uint64_t size = 0;
 | ||||
|   | ||||
|      int fd = qemu_open_old("/dev/sgx_vepc", O_RDWR); | ||||
|      if (fd < 0) { | ||||
| @@ -173,7 +175,8 @@ SGXInfo *qmp_query_sgx_capabilities(Error **errp)
 | ||||
|      info->sgx1 = eax & (1U << 0) ? true : false; | ||||
|      info->sgx2 = eax & (1U << 1) ? true : false; | ||||
|   | ||||
| -    info->sections = sgx_calc_host_epc_sections();
 | ||||
| +    info->sections = sgx_calc_host_epc_sections(&size);
 | ||||
| +    info->section_size = size;
 | ||||
|   | ||||
|      close(fd); | ||||
|   | ||||
| @@ -220,12 +223,14 @@ SGXInfo *qmp_query_sgx(Error **errp)
 | ||||
|          return NULL; | ||||
|      } | ||||
|   | ||||
| +    SGXEPCState *sgx_epc = &pcms->sgx_epc;
 | ||||
|      info = g_new0(SGXInfo, 1); | ||||
|   | ||||
|      info->sgx = true; | ||||
|      info->sgx1 = true; | ||||
|      info->sgx2 = true; | ||||
|      info->flc = true; | ||||
| +    info->section_size = sgx_epc->size;
 | ||||
|      info->sections = sgx_get_epc_sections_list(); | ||||
|   | ||||
|      return info; | ||||
| @@ -249,6 +254,8 @@ void hmp_info_sgx(Monitor *mon, const QDict *qdict)
 | ||||
|                     info->sgx2 ? "enabled" : "disabled"); | ||||
|      monitor_printf(mon, "FLC support: %s\n", | ||||
|                     info->flc ? "enabled" : "disabled"); | ||||
| +    monitor_printf(mon, "size: %" PRIu64 "\n",
 | ||||
| +                   info->section_size);
 | ||||
|   | ||||
|      section_list = info->sections; | ||||
|      for (section = section_list; section; section = section->next) { | ||||
| diff --git a/qapi/machine.json b/qapi/machine.json
 | ||||
| index 16e771affc..a9f33d0f27 100644
 | ||||
| --- a/qapi/machine.json
 | ||||
| +++ b/qapi/machine.json
 | ||||
| @@ -1207,7 +1207,7 @@
 | ||||
|  # | ||||
|  # @memdev: memory backend linked with device | ||||
|  # | ||||
| -# @node: the numa node
 | ||||
| +# @node: the numa node (Since: 7.0)
 | ||||
|  # | ||||
|  # Since: 6.2 | ||||
|  ## | ||||
| @@ -1288,7 +1288,7 @@
 | ||||
|  # | ||||
|  # @memdev: memory backend linked with device | ||||
|  # | ||||
| -# @node: the numa node
 | ||||
| +# @node: the numa node (Since: 7.0)
 | ||||
|  # | ||||
|  # Since: 6.2 | ||||
|  ## | ||||
| diff --git a/qapi/misc-target.json b/qapi/misc-target.json
 | ||||
| index 1022aa0184..4bc45d2474 100644
 | ||||
| --- a/qapi/misc-target.json
 | ||||
| +++ b/qapi/misc-target.json
 | ||||
| @@ -344,9 +344,9 @@
 | ||||
|  # | ||||
|  # @node: the numa node | ||||
|  # | ||||
| -# @size: the size of epc section
 | ||||
| +# @size: the size of EPC section
 | ||||
|  # | ||||
| -# Since: 6.2
 | ||||
| +# Since: 7.0
 | ||||
|  ## | ||||
|  { 'struct': 'SGXEPCSection', | ||||
|    'data': { 'node': 'int', | ||||
| @@ -365,7 +365,13 @@
 | ||||
|  # | ||||
|  # @flc: true if FLC is supported | ||||
|  # | ||||
| -# @sections: The EPC sections info for guest
 | ||||
| +# @section-size: The EPC section size for guest
 | ||||
| +#                Redundant with @sections.  Just for backward compatibility.
 | ||||
| +#
 | ||||
| +# @sections: The EPC sections info for guest (Since: 7.0)
 | ||||
| +#
 | ||||
| +# Features:
 | ||||
| +# @deprecated: Member @section-size is deprecated.  Use @sections instead.
 | ||||
|  # | ||||
|  # Since: 6.2 | ||||
|  ## | ||||
| @@ -374,6 +380,8 @@
 | ||||
|              'sgx1': 'bool', | ||||
|              'sgx2': 'bool', | ||||
|              'flc': 'bool', | ||||
| +            'section-size': { 'type': 'uint64',
 | ||||
| +                    'features': [ 'deprecated' ] },
 | ||||
|              'sections': ['SGXEPCSection']}, | ||||
|     'if': 'TARGET_I386' } | ||||
|   | ||||
| @@ -390,7 +398,9 @@
 | ||||
|  # | ||||
|  # -> { "execute": "query-sgx" } | ||||
|  # <- { "return": { "sgx": true, "sgx1" : true, "sgx2" : true, | ||||
| -#                  "flc": true, "section-size" : 0 } }
 | ||||
| +#                  "flc": true,  "section-size" : 96468992,
 | ||||
| +#                  "sections": [{"node": 0, "size": 67108864},
 | ||||
| +#                  {"node": 1, "size": 29360128}]} }
 | ||||
|  # | ||||
|  ## | ||||
|  { 'command': 'query-sgx', 'returns': 'SGXInfo', 'if': 'TARGET_I386' } | ||||
| @@ -408,7 +418,9 @@
 | ||||
|  # | ||||
|  # -> { "execute": "query-sgx-capabilities" } | ||||
|  # <- { "return": { "sgx": true, "sgx1" : true, "sgx2" : true, | ||||
| -#                  "flc": true, "section-size" : 0 } }
 | ||||
| +#                  "flc": true, "section-size" : 96468992,
 | ||||
| +#                  "section" : [{"node": 0, "size": 67108864},
 | ||||
| +#                  {"node": 1, "size": 29360128}]} }
 | ||||
|  # | ||||
|  ## | ||||
|  { 'command': 'query-sgx-capabilities', 'returns': 'SGXInfo', 'if': 'TARGET_I386' } | ||||
| -- 
 | ||||
| 2.27.0 | ||||
| 
 | ||||
| @ -0,0 +1,108 @@ | ||||
| From a221f5a8ed02690687e6709c49ae0e1e01c5f466 Mon Sep 17 00:00:00 2001 | ||||
| From: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com> | ||||
| Date: Fri, 17 Dec 2021 17:46:54 +0100 | ||||
| Subject: [PATCH 09/12] qemu-img: make is_allocated_sectors() more efficient | ||||
| 
 | ||||
| RH-Author: Kevin Wolf <kwolf@redhat.com> | ||||
| RH-MergeRequest: 70: qemu-img convert: Fix sparseness of output image | ||||
| RH-Commit: [2/2] cc05aa4ac506b57ff9b430c007618cdf1485a03f (kmwolf/centos-qemu-kvm) | ||||
| RH-Bugzilla: 1882917 | ||||
| RH-Acked-by: Eric Blake <eblake@redhat.com> | ||||
| RH-Acked-by: Stefan Hajnoczi <stefanha@redhat.com> | ||||
| RH-Acked-by: Hanna Reitz <hreitz@redhat.com> | ||||
| 
 | ||||
| Consider the case when the whole buffer is zero and end is unaligned. | ||||
| 
 | ||||
| If i <= tail, we return 1 and do one unaligned WRITE, RMW happens. | ||||
| 
 | ||||
| If i > tail, we do on aligned WRITE_ZERO (or skip if target is zeroed) | ||||
| and again one unaligned WRITE, RMW happens. | ||||
| 
 | ||||
| Let's do better: don't fragment the whole-zero buffer and report it as | ||||
| ZERO: in case of zeroed target we just do nothing and avoid RMW. If | ||||
| target is not zeroes, one unaligned WRITE_ZERO should not be much worse | ||||
| than one unaligned WRITE. | ||||
| 
 | ||||
| Signed-off-by: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com> | ||||
| Message-Id: <20211217164654.1184218-3-vsementsov@virtuozzo.com> | ||||
| Tested-by: Peter Lieven <pl@kamp.de> | ||||
| Signed-off-by: Kevin Wolf <kwolf@redhat.com> | ||||
| (cherry picked from commit 96054c76ff2db74165385a69f234c57a6bbc941e) | ||||
| Signed-off-by: Kevin Wolf <kwolf@redhat.com> | ||||
| ---
 | ||||
|  qemu-img.c                 | 23 +++++++++++++++++++---- | ||||
|  tests/qemu-iotests/122.out |  8 ++------ | ||||
|  2 files changed, 21 insertions(+), 10 deletions(-) | ||||
| 
 | ||||
| diff --git a/qemu-img.c b/qemu-img.c
 | ||||
| index f036a1d428..d7ddfcc528 100644
 | ||||
| --- a/qemu-img.c
 | ||||
| +++ b/qemu-img.c
 | ||||
| @@ -1171,19 +1171,34 @@ static int is_allocated_sectors(const uint8_t *buf, int n, int *pnum,
 | ||||
|          } | ||||
|      } | ||||
|   | ||||
| +    if (i == n) {
 | ||||
| +        /*
 | ||||
| +         * The whole buf is the same.
 | ||||
| +         * No reason to split it into chunks, so return now.
 | ||||
| +         */
 | ||||
| +        *pnum = i;
 | ||||
| +        return !is_zero;
 | ||||
| +    }
 | ||||
| +
 | ||||
|      tail = (sector_num + i) & (alignment - 1); | ||||
|      if (tail) { | ||||
|          if (is_zero && i <= tail) { | ||||
| -            /* treat unallocated areas which only consist
 | ||||
| -             * of a small tail as allocated. */
 | ||||
| +            /*
 | ||||
| +             * For sure next sector after i is data, and it will rewrite this
 | ||||
| +             * tail anyway due to RMW. So, let's just write data now.
 | ||||
| +             */
 | ||||
|              is_zero = false; | ||||
|          } | ||||
|          if (!is_zero) { | ||||
| -            /* align up end offset of allocated areas. */
 | ||||
| +            /* If possible, align up end offset of allocated areas. */
 | ||||
|              i += alignment - tail; | ||||
|              i = MIN(i, n); | ||||
|          } else { | ||||
| -            /* align down end offset of zero areas. */
 | ||||
| +            /*
 | ||||
| +             * For sure next sector after i is data, and it will rewrite this
 | ||||
| +             * tail anyway due to RMW. Better is avoid RMW and write zeroes up
 | ||||
| +             * to aligned bound.
 | ||||
| +             */
 | ||||
|              i -= tail; | ||||
|          } | ||||
|      } | ||||
| diff --git a/tests/qemu-iotests/122.out b/tests/qemu-iotests/122.out
 | ||||
| index 69b8e8b803..e18766e167 100644
 | ||||
| --- a/tests/qemu-iotests/122.out
 | ||||
| +++ b/tests/qemu-iotests/122.out
 | ||||
| @@ -201,9 +201,7 @@ convert -S 4k
 | ||||
|  { "start": 8192, "length": 4096, "depth": 0, "present": true, "zero": false, "data": true, "offset": OFFSET}, | ||||
|  { "start": 12288, "length": 4096, "depth": 0, "present": false, "zero": true, "data": false}, | ||||
|  { "start": 16384, "length": 4096, "depth": 0, "present": true, "zero": false, "data": true, "offset": OFFSET}, | ||||
| -{ "start": 20480, "length": 46080, "depth": 0, "present": false, "zero": true, "data": false},
 | ||||
| -{ "start": 66560, "length": 1024, "depth": 0, "present": true, "zero": false, "data": true, "offset": OFFSET},
 | ||||
| -{ "start": 67584, "length": 67041280, "depth": 0, "present": false, "zero": true, "data": false}]
 | ||||
| +{ "start": 20480, "length": 67088384, "depth": 0, "present": false, "zero": true, "data": false}]
 | ||||
|   | ||||
|  convert -c -S 4k | ||||
|  [{ "start": 0, "length": 1024, "depth": 0, "present": true, "zero": false, "data": true}, | ||||
| @@ -215,9 +213,7 @@ convert -c -S 4k
 | ||||
|   | ||||
|  convert -S 8k | ||||
|  [{ "start": 0, "length": 24576, "depth": 0, "present": true, "zero": false, "data": true, "offset": OFFSET}, | ||||
| -{ "start": 24576, "length": 41984, "depth": 0, "present": false, "zero": true, "data": false},
 | ||||
| -{ "start": 66560, "length": 1024, "depth": 0, "present": true, "zero": false, "data": true, "offset": OFFSET},
 | ||||
| -{ "start": 67584, "length": 67041280, "depth": 0, "present": false, "zero": true, "data": false}]
 | ||||
| +{ "start": 24576, "length": 67084288, "depth": 0, "present": false, "zero": true, "data": false}]
 | ||||
|   | ||||
|  convert -c -S 8k | ||||
|  [{ "start": 0, "length": 1024, "depth": 0, "present": true, "zero": false, "data": true}, | ||||
| -- 
 | ||||
| 2.27.0 | ||||
| 
 | ||||
| @ -0,0 +1,72 @@ | ||||
| From 0f4592f79f8c24f84db18a8c39c6056b2a0be524 Mon Sep 17 00:00:00 2001 | ||||
| From: =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= <philmd@redhat.com> | ||||
| Date: Fri, 7 Jan 2022 11:54:19 +0100 | ||||
| Subject: [PATCH 1/5] qemu-storage-daemon: Add vhost-user-blk help | ||||
| MIME-Version: 1.0 | ||||
| Content-Type: text/plain; charset=UTF-8 | ||||
| Content-Transfer-Encoding: 8bit | ||||
| 
 | ||||
| RH-Author: Kevin Wolf <kwolf@redhat.com> | ||||
| RH-MergeRequest: 63: qemu-storage-daemon: Add vhost-user-blk help | ||||
| RH-Commit: [1/2] 6b08fec5d6ceea9f8f3810321099310069e08b53 (kmwolf/centos-qemu-kvm) | ||||
| RH-Bugzilla: 1962088 | ||||
| RH-Acked-by: Miroslav Rezanina <mrezanin@redhat.com> | ||||
| RH-Acked-by: Stefano Garzarella <sgarzare@redhat.com> | ||||
| RH-Acked-by: Hanna Reitz <hreitz@redhat.com> | ||||
| 
 | ||||
| Add missing vhost-user-blk help: | ||||
| 
 | ||||
|   $ qemu-storage-daemon -h | ||||
|   ... | ||||
|     --export [type=]vhost-user-blk,id=<id>,node-name=<node-name>, | ||||
|              addr.type=unix,addr.path=<socket-path>[,writable=on|off] | ||||
|              [,logical-block-size=<block-size>][,num-queues=<num-queues>] | ||||
|                            export the specified block node as a | ||||
|                            vhosts-user-blk device over UNIX domain socket | ||||
|     --export [type=]vhost-user-blk,id=<id>,node-name=<node-name>, | ||||
|              fd,addr.str=<fd>[,writable=on|off] | ||||
|              [,logical-block-size=<block-size>][,num-queues=<num-queues>] | ||||
|                            export the specified block node as a | ||||
|                            vhosts-user-blk device over file descriptor | ||||
|   ... | ||||
| 
 | ||||
| Fixes: 90fc91d50b7 ("convert vhost-user-blk server to block export API") | ||||
| Reported-by: Qing Wang <qinwang@redhat.com> | ||||
| Reviewed-by: Eric Blake <eblake@redhat.com> | ||||
| Signed-off-by: Philippe Mathieu-Daudé <philmd@redhat.com> | ||||
| Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org> | ||||
| Message-Id: <20220107105420.395011-3-f4bug@amsat.org> | ||||
| Signed-off-by: Kevin Wolf <kwolf@redhat.com> | ||||
| (cherry picked from commit c8cbc9524269d9583749aaaea8aa244add7e1900) | ||||
| Signed-off-by: Kevin Wolf <kwolf@redhat.com> | ||||
| ---
 | ||||
|  storage-daemon/qemu-storage-daemon.c | 13 +++++++++++++ | ||||
|  1 file changed, 13 insertions(+) | ||||
| 
 | ||||
| diff --git a/storage-daemon/qemu-storage-daemon.c b/storage-daemon/qemu-storage-daemon.c
 | ||||
| index 52cf17e8ac..9d76d1114d 100644
 | ||||
| --- a/storage-daemon/qemu-storage-daemon.c
 | ||||
| +++ b/storage-daemon/qemu-storage-daemon.c
 | ||||
| @@ -104,6 +104,19 @@ static void help(void)
 | ||||
|  "                         export the specified block node over FUSE\n" | ||||
|  "\n" | ||||
|  #endif /* CONFIG_FUSE */ | ||||
| +#ifdef CONFIG_VHOST_USER_BLK_SERVER
 | ||||
| +"  --export [type=]vhost-user-blk,id=<id>,node-name=<node-name>,\n"
 | ||||
| +"           addr.type=unix,addr.path=<socket-path>[,writable=on|off]\n"
 | ||||
| +"           [,logical-block-size=<block-size>][,num-queues=<num-queues>]\n"
 | ||||
| +"                         export the specified block node as a\n"
 | ||||
| +"                         vhost-user-blk device over UNIX domain socket\n"
 | ||||
| +"  --export [type=]vhost-user-blk,id=<id>,node-name=<node-name>,\n"
 | ||||
| +"           fd,addr.str=<fd>[,writable=on|off]\n"
 | ||||
| +"           [,logical-block-size=<block-size>][,num-queues=<num-queues>]\n"
 | ||||
| +"                         export the specified block node as a\n"
 | ||||
| +"                         vhost-user-blk device over file descriptor\n"
 | ||||
| +"\n"
 | ||||
| +#endif /* CONFIG_VHOST_USER_BLK_SERVER */
 | ||||
|  "  --monitor [chardev=]name[,mode=control][,pretty[=on|off]]\n" | ||||
|  "                         configure a QMP monitor\n" | ||||
|  "\n" | ||||
| -- 
 | ||||
| 2.27.0 | ||||
| 
 | ||||
| @ -0,0 +1,41 @@ | ||||
| From 20edf203c8cb314e27409918399aa7cbdc6fdb02 Mon Sep 17 00:00:00 2001 | ||||
| From: Kevin Wolf <kwolf@redhat.com> | ||||
| Date: Tue, 25 Jan 2022 16:15:14 +0100 | ||||
| Subject: [PATCH 2/5] qemu-storage-daemon: Fix typo in vhost-user-blk help | ||||
| 
 | ||||
| RH-Author: Kevin Wolf <kwolf@redhat.com> | ||||
| RH-MergeRequest: 63: qemu-storage-daemon: Add vhost-user-blk help | ||||
| RH-Commit: [2/2] b7afb670c398799b6e49b926e296771453a55fba (kmwolf/centos-qemu-kvm) | ||||
| RH-Bugzilla: 1962088 | ||||
| RH-Acked-by: Miroslav Rezanina <mrezanin@redhat.com> | ||||
| RH-Acked-by: Stefano Garzarella <sgarzare@redhat.com> | ||||
| RH-Acked-by: Hanna Reitz <hreitz@redhat.com> | ||||
| 
 | ||||
| The syntax of the fd passing case misses the "addr.type=" key. Add it. | ||||
| 
 | ||||
| Signed-off-by: Kevin Wolf <kwolf@redhat.com> | ||||
| Message-Id: <20220125151514.49035-1-kwolf@redhat.com> | ||||
| Reviewed-by: Hanna Reitz <hreitz@redhat.com> | ||||
| Signed-off-by: Kevin Wolf <kwolf@redhat.com> | ||||
| (cherry picked from commit e66e665f15736f5ee1fbd8087926cb0f1e52f61a) | ||||
| Signed-off-by: Kevin Wolf <kwolf@redhat.com> | ||||
| ---
 | ||||
|  storage-daemon/qemu-storage-daemon.c | 2 +- | ||||
|  1 file changed, 1 insertion(+), 1 deletion(-) | ||||
| 
 | ||||
| diff --git a/storage-daemon/qemu-storage-daemon.c b/storage-daemon/qemu-storage-daemon.c
 | ||||
| index 9d76d1114d..ec9aa79b55 100644
 | ||||
| --- a/storage-daemon/qemu-storage-daemon.c
 | ||||
| +++ b/storage-daemon/qemu-storage-daemon.c
 | ||||
| @@ -111,7 +111,7 @@ static void help(void)
 | ||||
|  "                         export the specified block node as a\n" | ||||
|  "                         vhost-user-blk device over UNIX domain socket\n" | ||||
|  "  --export [type=]vhost-user-blk,id=<id>,node-name=<node-name>,\n" | ||||
| -"           fd,addr.str=<fd>[,writable=on|off]\n"
 | ||||
| +"           addr.type=fd,addr.str=<fd>[,writable=on|off]\n"
 | ||||
|  "           [,logical-block-size=<block-size>][,num-queues=<num-queues>]\n" | ||||
|  "                         export the specified block node as a\n" | ||||
|  "                         vhost-user-blk device over file descriptor\n" | ||||
| -- 
 | ||||
| 2.27.0 | ||||
| 
 | ||||
| @ -0,0 +1,82 @@ | ||||
| From 0e85c10b73c36f386723c842a797d5e2155e758f Mon Sep 17 00:00:00 2001 | ||||
| From: Thomas Huth <thuth@redhat.com> | ||||
| Date: Fri, 10 Dec 2021 10:07:40 +0100 | ||||
| Subject: [PATCH 1/2] redhat: Add rhel8.6.0 and rhel9.0.0 machine types for | ||||
|  s390x | ||||
| MIME-Version: 1.0 | ||||
| Content-Type: text/plain; charset=UTF-8 | ||||
| Content-Transfer-Encoding: 8bit | ||||
| 
 | ||||
| RH-Author: Thomas Huth <thuth@redhat.com> | ||||
| RH-MergeRequest: 55: redhat: Add rhel8.6.0 and rhel9.0.0 machine types for s390x | ||||
| RH-Commit: [1/1] ad8fd5c825ae52a8fbb3a28f700a514509c59978 (thuth/qemu-kvm-cs9) | ||||
| RH-Bugzilla: 2008060 | ||||
| RH-Acked-by: Philippe Mathieu-Daudé <philmd@redhat.com> | ||||
| RH-Acked-by: Laurent Vivier <lvivier@redhat.com> | ||||
| RH-Acked-by: David Hildenbrand <david@redhat.com> | ||||
| RH-Acked-by: Cornelia Huck <cohuck@redhat.com> | ||||
| 
 | ||||
| Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=2008060 | ||||
| 
 | ||||
| The new machine types have better default values for the upcoming | ||||
| "generation 16" mainframe. | ||||
| 
 | ||||
| Signed-off-by: Thomas Huth <thuth@redhat.com> | ||||
| ---
 | ||||
|  hw/s390x/s390-virtio-ccw.c | 26 +++++++++++++++++++++++++- | ||||
|  1 file changed, 25 insertions(+), 1 deletion(-) | ||||
| 
 | ||||
| diff --git a/hw/s390x/s390-virtio-ccw.c b/hw/s390x/s390-virtio-ccw.c
 | ||||
| index c654045964..9da6e9b1d4 100644
 | ||||
| --- a/hw/s390x/s390-virtio-ccw.c
 | ||||
| +++ b/hw/s390x/s390-virtio-ccw.c
 | ||||
| @@ -1103,10 +1103,33 @@ static void ccw_machine_2_4_class_options(MachineClass *mc)
 | ||||
|  DEFINE_CCW_MACHINE(2_4, "2.4", false); | ||||
|  #endif | ||||
|   | ||||
| +static void ccw_machine_rhel900_instance_options(MachineState *machine)
 | ||||
| +{
 | ||||
| +}
 | ||||
| +
 | ||||
| +static void ccw_machine_rhel900_class_options(MachineClass *mc)
 | ||||
| +{
 | ||||
| +}
 | ||||
| +DEFINE_CCW_MACHINE(rhel900, "rhel9.0.0", true);
 | ||||
| +
 | ||||
| +static void ccw_machine_rhel860_instance_options(MachineState *machine)
 | ||||
| +{
 | ||||
| +    /* Note: The -rhel8.6.0 and -rhel9.0.0 machines are technically identical */
 | ||||
| +    ccw_machine_rhel900_instance_options(machine);
 | ||||
| +}
 | ||||
| +
 | ||||
| +static void ccw_machine_rhel860_class_options(MachineClass *mc)
 | ||||
| +{
 | ||||
| +    ccw_machine_rhel900_class_options(mc);
 | ||||
| +}
 | ||||
| +DEFINE_CCW_MACHINE(rhel860, "rhel8.6.0", false);
 | ||||
| +
 | ||||
|  static void ccw_machine_rhel850_instance_options(MachineState *machine) | ||||
|  { | ||||
|      static const S390FeatInit qemu_cpu_feat = { S390_FEAT_LIST_QEMU_V6_0 }; | ||||
|   | ||||
| +    ccw_machine_rhel860_instance_options(machine);
 | ||||
| +
 | ||||
|      s390_set_qemu_cpu_model(0x2964, 13, 2, qemu_cpu_feat); | ||||
|   | ||||
|      s390_cpudef_featoff_greater(16, 1, S390_FEAT_NNPA); | ||||
| @@ -1118,10 +1141,11 @@ static void ccw_machine_rhel850_instance_options(MachineState *machine)
 | ||||
|   | ||||
|  static void ccw_machine_rhel850_class_options(MachineClass *mc) | ||||
|  { | ||||
| +    ccw_machine_rhel860_class_options(mc);
 | ||||
|      compat_props_add(mc->compat_props, hw_compat_rhel_8_5, hw_compat_rhel_8_5_len); | ||||
|      mc->smp_props.prefer_sockets = true; | ||||
|  } | ||||
| -DEFINE_CCW_MACHINE(rhel850, "rhel8.5.0", true);
 | ||||
| +DEFINE_CCW_MACHINE(rhel850, "rhel8.5.0", false);
 | ||||
|   | ||||
|  static void ccw_machine_rhel840_instance_options(MachineState *machine) | ||||
|  { | ||||
| -- 
 | ||||
| 2.27.0 | ||||
| 
 | ||||
| @ -0,0 +1,43 @@ | ||||
| From 24b44713de4b2a47c42dfeea813c8911694367a0 Mon Sep 17 00:00:00 2001 | ||||
| From: David Hildenbrand <david@redhat.com> | ||||
| Date: Fri, 17 Dec 2021 10:00:53 +0100 | ||||
| Subject: [PATCH 2/2] redhat: Enable virtio-mem as tech-preview on x86-64 | ||||
| MIME-Version: 1.0 | ||||
| Content-Type: text/plain; charset=UTF-8 | ||||
| Content-Transfer-Encoding: 8bit | ||||
| 
 | ||||
| RH-Author: David Hildenbrand <david@redhat.com> | ||||
| RH-MergeRequest: 56: redhat: Enable virtio-mem as tech-preview on x86-64 | ||||
| RH-Commit: [1/1] 255749cd877b91ce1978b67a088f7c0e181fd85e | ||||
| RH-Bugzilla: 2014484 | ||||
| RH-Acked-by: Philippe Mathieu-Daudé <philmd@redhat.com> | ||||
| RH-Acked-by: Thomas Huth <thuth@redhat.com> | ||||
| RH-Acked-by: Gavin Shan <gshan@redhat.com> | ||||
| 
 | ||||
| Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=2014484 | ||||
| Upstream-status: RHEL-only | ||||
| 
 | ||||
| Everything necesssary for tech-preview of virtio-mem in RHEL9 is | ||||
| included in QEMU v6.2. Let's enable it via the config option | ||||
| CONFIG_VIRTIO_MEM on x86-64. | ||||
| 
 | ||||
| Signed-off-by: David Hildenbrand <david@redhat.com> | ||||
| ---
 | ||||
|  configs/devices/x86_64-softmmu/x86_64-rh-devices.mak | 1 + | ||||
|  1 file changed, 1 insertion(+) | ||||
| 
 | ||||
| diff --git a/configs/devices/x86_64-softmmu/x86_64-rh-devices.mak b/configs/devices/x86_64-softmmu/x86_64-rh-devices.mak
 | ||||
| index 1f7a9ab024..dc03fbb671 100644
 | ||||
| --- a/configs/devices/x86_64-softmmu/x86_64-rh-devices.mak
 | ||||
| +++ b/configs/devices/x86_64-softmmu/x86_64-rh-devices.mak
 | ||||
| @@ -88,6 +88,7 @@ CONFIG_VGA_CIRRUS=y
 | ||||
|  CONFIG_VGA_PCI=y | ||||
|  CONFIG_VHOST_USER=y | ||||
|  CONFIG_VHOST_USER_BLK=y | ||||
| +CONFIG_VIRTIO_MEM=y
 | ||||
|  CONFIG_VIRTIO_PCI=y | ||||
|  CONFIG_VIRTIO_VGA=y | ||||
|  CONFIG_VMMOUSE=y | ||||
| -- 
 | ||||
| 2.27.0 | ||||
| 
 | ||||
							
								
								
									
										52
									
								
								SOURCES/kvm-rhel-machine-types-x86-set-prefer_sockets.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										52
									
								
								SOURCES/kvm-rhel-machine-types-x86-set-prefer_sockets.patch
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,52 @@ | ||||
| From ecadfaec992fda7f485522c9ee6e7c9b05614a22 Mon Sep 17 00:00:00 2001 | ||||
| From: "Dr. David Alan Gilbert" <dgilbert@redhat.com> | ||||
| Date: Tue, 7 Dec 2021 18:39:47 +0000 | ||||
| Subject: [PATCH 2/2] rhel machine types/x86: set prefer_sockets | ||||
| 
 | ||||
| RH-Author: Dr. David Alan Gilbert <dgilbert@redhat.com> | ||||
| RH-MergeRequest: 59: rhel machine types/x86: set prefer_sockets | ||||
| RH-Commit: [1/1] 9bcd9e2c95154e39ef30a8a342ad6c713fa4f1fb (dagrh/c-9-s-qemu-kvm) | ||||
| RH-Bugzilla: 2028623 | ||||
| RH-Acked-by: Miroslav Rezanina <mrezanin@redhat.com> | ||||
| RH-Acked-by: quintela1 <quintela@redhat.com> | ||||
| RH-Acked-by: Cornelia Huck <cohuck@redhat.com> | ||||
| 
 | ||||
| When I fixed up the machine types for 8.5 I missed the | ||||
|   prefer_sockets = true | ||||
| 
 | ||||
| add them in; it looks like Power, ARM already have them, and I see them | ||||
| in thuth's s390 patch. | ||||
| 
 | ||||
| Signed-off-by: Dr. David Alan Gilbert <dgilbert@redhat.com> | ||||
| ---
 | ||||
|  hw/i386/pc_piix.c | 1 + | ||||
|  hw/i386/pc_q35.c  | 1 + | ||||
|  2 files changed, 2 insertions(+) | ||||
| 
 | ||||
| diff --git a/hw/i386/pc_piix.c b/hw/i386/pc_piix.c
 | ||||
| index 183b5d5464..fccb7f5fc9 100644
 | ||||
| --- a/hw/i386/pc_piix.c
 | ||||
| +++ b/hw/i386/pc_piix.c
 | ||||
| @@ -973,6 +973,7 @@ static void pc_machine_rhel7_options(MachineClass *m)
 | ||||
|      compat_props_add(m->compat_props, pc_rhel_compat, pc_rhel_compat_len); | ||||
|      m->alias = "pc"; | ||||
|      m->is_default = 1; | ||||
| +    m->smp_props.prefer_sockets = true;
 | ||||
|  } | ||||
|   | ||||
|  static void pc_init_rhel760(MachineState *machine) | ||||
| diff --git a/hw/i386/pc_q35.c b/hw/i386/pc_q35.c
 | ||||
| index 0e7e885e78..3b748ddd7b 100644
 | ||||
| --- a/hw/i386/pc_q35.c
 | ||||
| +++ b/hw/i386/pc_q35.c
 | ||||
| @@ -662,6 +662,7 @@ static void pc_q35_machine_rhel850_options(MachineClass *m)
 | ||||
|                       hw_compat_rhel_8_5_len); | ||||
|      compat_props_add(m->compat_props, pc_rhel_8_5_compat, | ||||
|                       pc_rhel_8_5_compat_len); | ||||
| +    m->smp_props.prefer_sockets = true;
 | ||||
|  } | ||||
|   | ||||
|  DEFINE_PC_MACHINE(q35_rhel850, "pc-q35-rhel8.5.0", pc_q35_init_rhel850, | ||||
| -- 
 | ||||
| 2.27.0 | ||||
| 
 | ||||
							
								
								
									
										19
									
								
								SOURCES/kvm-s390x.conf
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										19
									
								
								SOURCES/kvm-s390x.conf
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,19 @@ | ||||
| # User changes in this file are preserved across upgrades. | ||||
| # | ||||
| # Setting "modprobe kvm nested=1" only enables Nested Virtualization until | ||||
| # the next reboot or module reload. Uncomment the option below to enable | ||||
| # the feature permanently. | ||||
| # | ||||
| #options kvm nested=1 | ||||
| # | ||||
| # | ||||
| # Setting "modprobe kvm hpage=1" only enables Huge Page Backing (1MB) | ||||
| # support until the next reboot or module reload. Uncomment the option | ||||
| # below to enable the feature permanently. | ||||
| # | ||||
| # Note: - Incompatible with "nested=1". Loading the module will fail. | ||||
| #       - Dirty page logging will be performed on a 1MB (not 4KB) basis, | ||||
| #         which can result in a lot of data having to be transferred during | ||||
| #         migration, and therefore taking very long to converge. | ||||
| # | ||||
| #options kvm hpage=1 | ||||
| @ -0,0 +1,130 @@ | ||||
| From 005339f7deaee639c38d30e5bf2235c292ce3937 Mon Sep 17 00:00:00 2001 | ||||
| From: =?UTF-8?q?Daniel=20P=2E=20Berrang=C3=A9?= <berrange@redhat.com> | ||||
| Date: Wed, 5 Jan 2022 12:38:47 +0000 | ||||
| Subject: [PATCH 3/3] softmmu: fix device deletion events with -device JSON | ||||
|  syntax | ||||
| MIME-Version: 1.0 | ||||
| Content-Type: text/plain; charset=UTF-8 | ||||
| Content-Transfer-Encoding: 8bit | ||||
| 
 | ||||
| RH-Author: Kevin Wolf <kwolf@redhat.com> | ||||
| RH-MergeRequest: 62: Fix hot unplug of devices created with -device JSON syntax | ||||
| RH-Commit: [1/1] 980e505ba215b5f9324c107481c5bb257ae03f42 (kmwolf/centos-qemu-kvm) | ||||
| RH-Bugzilla: 2036669 | ||||
| RH-Acked-by: Daniel P. Berrangé <berrange@redhat.com> | ||||
| RH-Acked-by: Laurent Vivier <lvivier@redhat.com> | ||||
| RH-Acked-by: Jano Tomko <None> | ||||
| 
 | ||||
| The -device JSON syntax impl leaks a reference on the created | ||||
| DeviceState instance. As a result when you hot-unplug the | ||||
| device, the device_finalize method won't be called and thus | ||||
| it will fail to emit the required DEVICE_DELETED event. | ||||
| 
 | ||||
| A 'json-cli' feature was previously added against the | ||||
| 'device_add' QMP command QAPI schema to indicated to mgmt | ||||
| apps that -device supported JSON syntax. Given the hotplug | ||||
| bug that feature flag is not usable for its purpose, so | ||||
| we add a new 'json-cli-hotplug' feature to indicate the | ||||
| -device supports JSON without breaking hotplug.
 | ||||
| 
 | ||||
| Fixes: 5dacda5167560b3af8eadbce5814f60ba44b467e | ||||
| Resolves: https://gitlab.com/qemu-project/qemu/-/issues/802 | ||||
| Signed-off-by: Daniel P. Berrangé <berrange@redhat.com> | ||||
| Message-Id: <20220105123847.4047954-2-berrange@redhat.com> | ||||
| Reviewed-by: Laurent Vivier <lvivier@redhat.com> | ||||
| Tested-by: Ján Tomko <jtomko@redhat.com> | ||||
| Reviewed-by: Thomas Huth <thuth@redhat.com> | ||||
| Signed-off-by: Kevin Wolf <kwolf@redhat.com> | ||||
| (cherry picked from commit 64b4529a432507ee84a924be69a03432639e87ba) | ||||
| Signed-off-by: Kevin Wolf <kwolf@redhat.com> | ||||
| ---
 | ||||
|  qapi/qdev.json                 |  5 ++++- | ||||
|  softmmu/vl.c                   |  4 +++- | ||||
|  tests/qtest/device-plug-test.c | 19 +++++++++++++++++++ | ||||
|  3 files changed, 26 insertions(+), 2 deletions(-) | ||||
| 
 | ||||
| diff --git a/qapi/qdev.json b/qapi/qdev.json
 | ||||
| index 69656b14df..26cd10106b 100644
 | ||||
| --- a/qapi/qdev.json
 | ||||
| +++ b/qapi/qdev.json
 | ||||
| @@ -44,6 +44,9 @@
 | ||||
|  # @json-cli: If present, the "-device" command line option supports JSON | ||||
|  #            syntax with a structure identical to the arguments of this | ||||
|  #            command. | ||||
| +# @json-cli-hotplug: If present, the "-device" command line option supports JSON
 | ||||
| +#                    syntax without the reference counting leak that broke
 | ||||
| +#                    hot-unplug
 | ||||
|  # | ||||
|  # Notes: | ||||
|  # | ||||
| @@ -74,7 +77,7 @@
 | ||||
|  { 'command': 'device_add', | ||||
|    'data': {'driver': 'str', '*bus': 'str', '*id': 'str'}, | ||||
|    'gen': false, # so we can get the additional arguments | ||||
| -  'features': ['json-cli'] }
 | ||||
| +  'features': ['json-cli', 'json-cli-hotplug'] }
 | ||||
|   | ||||
|  ## | ||||
|  # @device_del: | ||||
| diff --git a/softmmu/vl.c b/softmmu/vl.c
 | ||||
| index d46b8fb4ab..b3829e2edd 100644
 | ||||
| --- a/softmmu/vl.c
 | ||||
| +++ b/softmmu/vl.c
 | ||||
| @@ -2690,6 +2690,7 @@ static void qemu_create_cli_devices(void)
 | ||||
|      qemu_opts_foreach(qemu_find_opts("device"), | ||||
|                        device_init_func, NULL, &error_fatal); | ||||
|      QTAILQ_FOREACH(opt, &device_opts, next) { | ||||
| +        DeviceState *dev;
 | ||||
|          loc_push_restore(&opt->loc); | ||||
|          /* | ||||
|           * TODO Eventually we should call qmp_device_add() here to make sure it | ||||
| @@ -2698,7 +2699,8 @@ static void qemu_create_cli_devices(void)
 | ||||
|           * from the start, so call qdev_device_add_from_qdict() directly for | ||||
|           * now. | ||||
|           */ | ||||
| -        qdev_device_add_from_qdict(opt->opts, true, &error_fatal);
 | ||||
| +        dev = qdev_device_add_from_qdict(opt->opts, true, &error_fatal);
 | ||||
| +        object_unref(OBJECT(dev));
 | ||||
|          loc_pop(&opt->loc); | ||||
|      } | ||||
|      rom_reset_order_override(); | ||||
| diff --git a/tests/qtest/device-plug-test.c b/tests/qtest/device-plug-test.c
 | ||||
| index 559d47727a..ad79bd4c14 100644
 | ||||
| --- a/tests/qtest/device-plug-test.c
 | ||||
| +++ b/tests/qtest/device-plug-test.c
 | ||||
| @@ -77,6 +77,23 @@ static void test_pci_unplug_request(void)
 | ||||
|      qtest_quit(qtest); | ||||
|  } | ||||
|   | ||||
| +static void test_pci_unplug_json_request(void)
 | ||||
| +{
 | ||||
| +    QTestState *qtest = qtest_initf(
 | ||||
| +        "-device '{\"driver\": \"virtio-mouse-pci\", \"id\": \"dev0\"}'");
 | ||||
| +
 | ||||
| +    /*
 | ||||
| +     * Request device removal. As the guest is not running, the request won't
 | ||||
| +     * be processed. However during system reset, the removal will be
 | ||||
| +     * handled, removing the device.
 | ||||
| +     */
 | ||||
| +    device_del(qtest, "dev0");
 | ||||
| +    system_reset(qtest);
 | ||||
| +    wait_device_deleted_event(qtest, "dev0");
 | ||||
| +
 | ||||
| +    qtest_quit(qtest);
 | ||||
| +}
 | ||||
| +
 | ||||
|  static void test_ccw_unplug(void) | ||||
|  { | ||||
|      QTestState *qtest = qtest_initf("-device virtio-balloon-ccw,id=dev0"); | ||||
| @@ -145,6 +162,8 @@ int main(int argc, char **argv)
 | ||||
|       */ | ||||
|      qtest_add_func("/device-plug/pci-unplug-request", | ||||
|                     test_pci_unplug_request); | ||||
| +    qtest_add_func("/device-plug/pci-unplug-json-request",
 | ||||
| +                   test_pci_unplug_json_request);
 | ||||
|   | ||||
|      if (!strcmp(arch, "s390x")) { | ||||
|          qtest_add_func("/device-plug/ccw-unplug", | ||||
| -- 
 | ||||
| 2.27.0 | ||||
| 
 | ||||
							
								
								
									
										36
									
								
								SOURCES/kvm-tests-acpi-SLIC-update-expected-blobs.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										36
									
								
								SOURCES/kvm-tests-acpi-SLIC-update-expected-blobs.patch
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,36 @@ | ||||
| From 1dd4518bbf917158c9558dfb9e92be0a3f74b42b Mon Sep 17 00:00:00 2001 | ||||
| From: Igor Mammedov <imammedo@redhat.com> | ||||
| Date: Mon, 27 Dec 2021 14:31:20 -0500 | ||||
| Subject: [PATCH 08/14] tests: acpi: SLIC: update expected blobs | ||||
| 
 | ||||
| RH-Author: Igor Mammedov <imammedo@redhat.com> | ||||
| RH-MergeRequest: 130: acpi: fix QEMU crash when started with SLIC table | ||||
| RH-Commit: [4/10] 9023e98b18b9145ef889eec912b222e039fcc76f | ||||
| RH-Bugzilla: 2043531 | ||||
| RH-Acked-by: Gerd Hoffmann <kraxel@redhat.com> | ||||
| RH-Acked-by: Miroslav Rezanina <mrezanin@redhat.com> | ||||
| RH-Acked-by: MST <None> | ||||
| 
 | ||||
| Signed-off-by: Igor Mammedov <imammedo@redhat.com> | ||||
| Message-Id: <20211227193120.1084176-5-imammedo@redhat.com> | ||||
| Reviewed-by: Michael S. Tsirkin <mst@redhat.com> | ||||
| Signed-off-by: Michael S. Tsirkin <mst@redhat.com> | ||||
| (cherry picked from commit c8adb4d222c42951a9d0367e5f5d4e1f5e2c9ad7) | ||||
| Signed-off-by: Igor Mammedov <imammedo@redhat.com> | ||||
| ---
 | ||||
|  tests/data/acpi/q35/FACP.slic               | Bin 244 -> 244 bytes | ||||
|  tests/data/acpi/q35/SLIC.slic               | Bin 0 -> 36 bytes | ||||
|  tests/qtest/bios-tables-test-allowed-diff.h |   2 -- | ||||
|  3 files changed, 2 deletions(-) | ||||
| 
 | ||||
| diff --git a/tests/qtest/bios-tables-test-allowed-diff.h b/tests/qtest/bios-tables-test-allowed-diff.h
 | ||||
| index 49dbf8fa3e..dfb8523c8b 100644
 | ||||
| --- a/tests/qtest/bios-tables-test-allowed-diff.h
 | ||||
| +++ b/tests/qtest/bios-tables-test-allowed-diff.h
 | ||||
| @@ -1,3 +1 @@
 | ||||
|  /* List of comma-separated changed AML files to ignore */ | ||||
| -"tests/data/acpi/q35/FACP.slic",
 | ||||
| -"tests/data/acpi/q35/SLIC.slic",
 | ||||
| -- 
 | ||||
| 2.31.1 | ||||
| 
 | ||||
							
								
								
									
										69
									
								
								SOURCES/kvm-tests-acpi-add-SLIC-table-test.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										69
									
								
								SOURCES/kvm-tests-acpi-add-SLIC-table-test.patch
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,69 @@ | ||||
| From f897bc3aca1bb98b1907cfd76ba52cfa541b9b5c Mon Sep 17 00:00:00 2001 | ||||
| From: Igor Mammedov <imammedo@redhat.com> | ||||
| Date: Mon, 27 Dec 2021 14:31:19 -0500 | ||||
| Subject: [PATCH 07/14] tests: acpi: add SLIC table test | ||||
| 
 | ||||
| RH-Author: Igor Mammedov <imammedo@redhat.com> | ||||
| RH-MergeRequest: 130: acpi: fix QEMU crash when started with SLIC table | ||||
| RH-Commit: [3/10] b72e6f11e4d86bf39fa440df3902d9259d16d5db | ||||
| RH-Bugzilla: 2043531 | ||||
| RH-Acked-by: Gerd Hoffmann <kraxel@redhat.com> | ||||
| RH-Acked-by: Miroslav Rezanina <mrezanin@redhat.com> | ||||
| RH-Acked-by: MST <None> | ||||
| 
 | ||||
| When user uses '-acpitable' to add SLIC table, some ACPI | ||||
| tables (FADT) will change its 'Oem ID'/'Oem Table ID' fields to | ||||
| match that of SLIC. Test makes sure thati QEMU handles | ||||
| those fields correctly when SLIC table is added with | ||||
| '-acpitable' option. | ||||
| 
 | ||||
| Conflicts: | ||||
| 	tests/qtest/bios-tables-test.c | ||||
|         due to missing 39d7554b2009 ("tests/acpi: add test case for VIOT") | ||||
| 
 | ||||
| Signed-off-by: Igor Mammedov <imammedo@redhat.com> | ||||
| Message-Id: <20211227193120.1084176-4-imammedo@redhat.com> | ||||
| Reviewed-by: Michael S. Tsirkin <mst@redhat.com> | ||||
| Signed-off-by: Michael S. Tsirkin <mst@redhat.com> | ||||
| (cherry picked from commit 11edfabee443b149468a82b5efc88c96d1d259ec) | ||||
| Signed-off-by: Igor Mammedov <imammedo@redhat.com> | ||||
| ---
 | ||||
|  tests/qtest/bios-tables-test.c | 15 +++++++++++++++ | ||||
|  1 file changed, 15 insertions(+) | ||||
| 
 | ||||
| diff --git a/tests/qtest/bios-tables-test.c b/tests/qtest/bios-tables-test.c
 | ||||
| index 62745181a8..088609c196 100644
 | ||||
| --- a/tests/qtest/bios-tables-test.c
 | ||||
| +++ b/tests/qtest/bios-tables-test.c
 | ||||
| @@ -1465,6 +1465,20 @@ static void test_acpi_virt_tcg(void)
 | ||||
|      free_test_data(&data); | ||||
|  } | ||||
|   | ||||
| +static void test_acpi_q35_slic(void)
 | ||||
| +{
 | ||||
| +    test_data data = {
 | ||||
| +        .machine = MACHINE_Q35,
 | ||||
| +        .variant = ".slic",
 | ||||
| +    };
 | ||||
| +
 | ||||
| +    test_acpi_one("-acpitable sig=SLIC,oem_id='CRASH ',oem_table_id='ME',"
 | ||||
| +                  "oem_rev=00002210,asl_compiler_id='qemu',"
 | ||||
| +                  "asl_compiler_rev=00000000,data=/dev/null",
 | ||||
| +                  &data);
 | ||||
| +    free_test_data(&data);
 | ||||
| +}
 | ||||
| +
 | ||||
|  static void test_oem_fields(test_data *data) | ||||
|  { | ||||
|      int i; | ||||
| @@ -1639,6 +1653,7 @@ int main(int argc, char *argv[])
 | ||||
|              qtest_add_func("acpi/q35/kvm/xapic", test_acpi_q35_kvm_xapic); | ||||
|              qtest_add_func("acpi/q35/kvm/dmar", test_acpi_q35_kvm_dmar); | ||||
|          } | ||||
| +        qtest_add_func("acpi/q35/slic", test_acpi_q35_slic);
 | ||||
|      } else if (strcmp(arch, "aarch64") == 0) { | ||||
|          if (has_tcg) { | ||||
|              qtest_add_func("acpi/virt", test_acpi_virt_tcg); | ||||
| -- 
 | ||||
| 2.31.1 | ||||
| 
 | ||||
| @ -0,0 +1,76 @@ | ||||
| From 80fdb82bab21ab0d094795287ce903d0d48974fc Mon Sep 17 00:00:00 2001 | ||||
| From: Igor Mammedov <imammedo@redhat.com> | ||||
| Date: Wed, 12 Jan 2022 08:03:29 -0500 | ||||
| Subject: [PATCH 09/14] tests: acpi: manually pad OEM_ID/OEM_TABLE_ID for | ||||
|  test_oem_fields() test | ||||
| 
 | ||||
| RH-Author: Igor Mammedov <imammedo@redhat.com> | ||||
| RH-MergeRequest: 130: acpi: fix QEMU crash when started with SLIC table | ||||
| RH-Commit: [5/10] 7d55865be1e1574605734c2663bac233e87b8134 | ||||
| RH-Bugzilla: 2043531 | ||||
| RH-Acked-by: Gerd Hoffmann <kraxel@redhat.com> | ||||
| RH-Acked-by: Miroslav Rezanina <mrezanin@redhat.com> | ||||
| RH-Acked-by: MST <None> | ||||
| 
 | ||||
| The next commit will revert OEM fields padding with whitespace to | ||||
| padding with '\0' as it was before [1]. As result test_oem_fields() will | ||||
| fail due to unexpectedly smaller ID sizes read from QEMU ACPI tables. | ||||
| 
 | ||||
| Pad OEM_ID/OEM_TABLE_ID manually with spaces so that values the test | ||||
| puts on QEMU CLI and expected values match. | ||||
| 
 | ||||
| 1) 602b458201 ("acpi: Permit OEM ID and OEM table ID fields to be changed") | ||||
| Signed-off-by: Igor Mammedov <imammedo@redhat.com> | ||||
| Message-Id: <20220112130332.1648664-2-imammedo@redhat.com> | ||||
| Reviewed-by: Michael S. Tsirkin <mst@redhat.com> | ||||
| Signed-off-by: Michael S. Tsirkin <mst@redhat.com> | ||||
| (cherry picked from commit a849522f726767022203ef2b6c395ea19facb866) | ||||
| Signed-off-by: Igor Mammedov <imammedo@redhat.com> | ||||
| ---
 | ||||
|  tests/qtest/bios-tables-test.c | 15 ++++++--------- | ||||
|  1 file changed, 6 insertions(+), 9 deletions(-) | ||||
| 
 | ||||
| diff --git a/tests/qtest/bios-tables-test.c b/tests/qtest/bios-tables-test.c
 | ||||
| index 088609c196..cfccfd4408 100644
 | ||||
| --- a/tests/qtest/bios-tables-test.c
 | ||||
| +++ b/tests/qtest/bios-tables-test.c
 | ||||
| @@ -71,9 +71,10 @@
 | ||||
|   | ||||
|  #define ACPI_REBUILD_EXPECTED_AML "TEST_ACPI_REBUILD_AML" | ||||
|   | ||||
| -#define OEM_ID             "TEST"
 | ||||
| -#define OEM_TABLE_ID       "OEM"
 | ||||
| -#define OEM_TEST_ARGS      "-machine x-oem-id="OEM_ID",x-oem-table-id="OEM_TABLE_ID
 | ||||
| +#define OEM_ID             "TEST  "
 | ||||
| +#define OEM_TABLE_ID       "OEM     "
 | ||||
| +#define OEM_TEST_ARGS      "-machine x-oem-id='" OEM_ID "',x-oem-table-id='" \
 | ||||
| +                           OEM_TABLE_ID "'"
 | ||||
|   | ||||
|  typedef struct { | ||||
|      bool tcg_only; | ||||
| @@ -1482,11 +1483,7 @@ static void test_acpi_q35_slic(void)
 | ||||
|  static void test_oem_fields(test_data *data) | ||||
|  { | ||||
|      int i; | ||||
| -    char oem_id[6];
 | ||||
| -    char oem_table_id[8];
 | ||||
|   | ||||
| -    strpadcpy(oem_id, sizeof oem_id, OEM_ID, ' ');
 | ||||
| -    strpadcpy(oem_table_id, sizeof oem_table_id, OEM_TABLE_ID, ' ');
 | ||||
|      for (i = 0; i < data->tables->len; ++i) { | ||||
|          AcpiSdtTable *sdt; | ||||
|   | ||||
| @@ -1496,8 +1493,8 @@ static void test_oem_fields(test_data *data)
 | ||||
|              continue; | ||||
|          } | ||||
|   | ||||
| -        g_assert(memcmp(sdt->aml + 10, oem_id, 6) == 0);
 | ||||
| -        g_assert(memcmp(sdt->aml + 16, oem_table_id, 8) == 0);
 | ||||
| +        g_assert(memcmp(sdt->aml + 10, OEM_ID, 6) == 0);
 | ||||
| +        g_assert(memcmp(sdt->aml + 16, OEM_TABLE_ID, 8) == 0);
 | ||||
|      } | ||||
|  } | ||||
|   | ||||
| -- 
 | ||||
| 2.31.1 | ||||
| 
 | ||||
| @ -0,0 +1,69 @@ | ||||
| From d08941e96003ea6bd26d73b4270912670e39e1bc Mon Sep 17 00:00:00 2001 | ||||
| From: Igor Mammedov <imammedo@redhat.com> | ||||
| Date: Fri, 14 Jan 2022 09:26:41 -0500 | ||||
| Subject: [PATCH 13/14] tests: acpi: test short OEM_ID/OEM_TABLE_ID values in | ||||
|  test_oem_fields() | ||||
| 
 | ||||
| RH-Author: Igor Mammedov <imammedo@redhat.com> | ||||
| RH-MergeRequest: 130: acpi: fix QEMU crash when started with SLIC table | ||||
| RH-Commit: [9/10] f1f9991d5d7ef5afb2f98f4fa81aeb3e3cf32d8f | ||||
| RH-Bugzilla: 2043531 | ||||
| RH-Acked-by: Gerd Hoffmann <kraxel@redhat.com> | ||||
| RH-Acked-by: Miroslav Rezanina <mrezanin@redhat.com> | ||||
| RH-Acked-by: MST <None> | ||||
| 
 | ||||
| Previous patch [1] added explicit whitespace padding to OEM_ID/OEM_TABLE_ID | ||||
| values used in test_oem_fields() testcase to avoid false positive and | ||||
| bisection issues when QEMU is switched to \0' padding. As result | ||||
| testcase ceased to test values that were shorter than max possible | ||||
| length values. | ||||
| 
 | ||||
| Update testcase to make sure that it's testing shorter IDs like it | ||||
| used to before [2]. | ||||
| 
 | ||||
| 1) "tests: acpi: manually pad OEM_ID/OEM_TABLE_ID for  test_oem_fields() test" | ||||
| 2) 602b458201 ("acpi: Permit OEM ID and OEM table ID fields to be changed") | ||||
| 
 | ||||
| Signed-off-by: Igor Mammedov <imammedo@redhat.com> | ||||
| Message-Id: <20220114142641.1727679-1-imammedo@redhat.com> | ||||
| Reviewed-by: Michael S. Tsirkin <mst@redhat.com> | ||||
| Signed-off-by: Michael S. Tsirkin <mst@redhat.com> | ||||
| (cherry picked from commit 408ca92634770de5eac7965ed97c6260e770f2e7) | ||||
| Signed-off-by: Igor Mammedov <imammedo@redhat.com> | ||||
| ---
 | ||||
|  tests/qtest/bios-tables-test.c | 12 ++++++------ | ||||
|  1 file changed, 6 insertions(+), 6 deletions(-) | ||||
| 
 | ||||
| diff --git a/tests/qtest/bios-tables-test.c b/tests/qtest/bios-tables-test.c
 | ||||
| index cfccfd4408..0dd9a0a55b 100644
 | ||||
| --- a/tests/qtest/bios-tables-test.c
 | ||||
| +++ b/tests/qtest/bios-tables-test.c
 | ||||
| @@ -71,10 +71,10 @@
 | ||||
|   | ||||
|  #define ACPI_REBUILD_EXPECTED_AML "TEST_ACPI_REBUILD_AML" | ||||
|   | ||||
| -#define OEM_ID             "TEST  "
 | ||||
| -#define OEM_TABLE_ID       "OEM     "
 | ||||
| -#define OEM_TEST_ARGS      "-machine x-oem-id='" OEM_ID "',x-oem-table-id='" \
 | ||||
| -                           OEM_TABLE_ID "'"
 | ||||
| +#define OEM_ID             "TEST"
 | ||||
| +#define OEM_TABLE_ID       "OEM"
 | ||||
| +#define OEM_TEST_ARGS      "-machine x-oem-id=" OEM_ID ",x-oem-table-id=" \
 | ||||
| +                           OEM_TABLE_ID
 | ||||
|   | ||||
|  typedef struct { | ||||
|      bool tcg_only; | ||||
| @@ -1493,8 +1493,8 @@ static void test_oem_fields(test_data *data)
 | ||||
|              continue; | ||||
|          } | ||||
|   | ||||
| -        g_assert(memcmp(sdt->aml + 10, OEM_ID, 6) == 0);
 | ||||
| -        g_assert(memcmp(sdt->aml + 16, OEM_TABLE_ID, 8) == 0);
 | ||||
| +        g_assert(strncmp((char *)sdt->aml + 10, OEM_ID, 6) == 0);
 | ||||
| +        g_assert(strncmp((char *)sdt->aml + 16, OEM_TABLE_ID, 8) == 0);
 | ||||
|      } | ||||
|  } | ||||
|   | ||||
| -- 
 | ||||
| 2.31.1 | ||||
| 
 | ||||
							
								
								
									
										50
									
								
								SOURCES/kvm-tests-acpi-update-expected-blobs.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										50
									
								
								SOURCES/kvm-tests-acpi-update-expected-blobs.patch
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,50 @@ | ||||
| From b8831f75d186639385d75a4df9c510c7435fcdaf Mon Sep 17 00:00:00 2001 | ||||
| From: Igor Mammedov <imammedo@redhat.com> | ||||
| Date: Wed, 12 Jan 2022 08:03:32 -0500 | ||||
| Subject: [PATCH 12/14] tests: acpi: update expected blobs | ||||
| 
 | ||||
| RH-Author: Igor Mammedov <imammedo@redhat.com> | ||||
| RH-MergeRequest: 130: acpi: fix QEMU crash when started with SLIC table | ||||
| RH-Commit: [8/10] dddfa6e1b966bf7c5c00a20c98a778b060dc6983 | ||||
| RH-Bugzilla: 2043531 | ||||
| RH-Acked-by: Gerd Hoffmann <kraxel@redhat.com> | ||||
| RH-Acked-by: Miroslav Rezanina <mrezanin@redhat.com> | ||||
| RH-Acked-by: MST <None> | ||||
| 
 | ||||
| Expected changes caused by previous commit: | ||||
| 
 | ||||
| nvdimm ssdt (q35/pc/virt): | ||||
|   - *     OEM Table ID     "NVDIMM  " | ||||
|   + *     OEM Table ID     "NVDIMM" | ||||
| 
 | ||||
| SLIC test FADT (tests/data/acpi/q35/FACP.slic): | ||||
|   -[010h 0016   8]                 Oem Table ID : "ME      " | ||||
|   +[010h 0016   8]                 Oem Table ID : "ME" | ||||
| 
 | ||||
| Signed-off-by: Igor Mammedov <imammedo@redhat.com> | ||||
| Message-Id: <20220112130332.1648664-5-imammedo@redhat.com> | ||||
| Reviewed-by: Michael S. Tsirkin <mst@redhat.com> | ||||
| Signed-off-by: Michael S. Tsirkin <mst@redhat.com> | ||||
| (cherry picked from commit 5adc3aba875416b0e077d8a29ddd0357883746f4) | ||||
| Signed-off-by: Igor Mammedov <imammedo@redhat.com> | ||||
| ---
 | ||||
|  tests/data/acpi/pc/SSDT.dimmpxm             | Bin 734 -> 734 bytes | ||||
|  tests/data/acpi/q35/FACP.slic               | Bin 244 -> 244 bytes | ||||
|  tests/data/acpi/q35/SSDT.dimmpxm            | Bin 734 -> 734 bytes | ||||
|  tests/data/acpi/virt/SSDT.memhp             | Bin 736 -> 736 bytes | ||||
|  tests/qtest/bios-tables-test-allowed-diff.h |   4 ---- | ||||
|  5 files changed, 4 deletions(-) | ||||
| 
 | ||||
| diff --git a/tests/qtest/bios-tables-test-allowed-diff.h b/tests/qtest/bios-tables-test-allowed-diff.h
 | ||||
| index 7faa8f53be..dfb8523c8b 100644
 | ||||
| --- a/tests/qtest/bios-tables-test-allowed-diff.h
 | ||||
| +++ b/tests/qtest/bios-tables-test-allowed-diff.h
 | ||||
| @@ -1,5 +1 @@
 | ||||
|  /* List of comma-separated changed AML files to ignore */ | ||||
| -"tests/data/acpi/virt/SSDT.memhp",
 | ||||
| -"tests/data/acpi/pc/SSDT.dimmpxm",
 | ||||
| -"tests/data/acpi/q35/SSDT.dimmpxm",
 | ||||
| -"tests/data/acpi/q35/FACP.slic",
 | ||||
| -- 
 | ||||
| 2.31.1 | ||||
| 
 | ||||
| @ -0,0 +1,42 @@ | ||||
| From 9d8ab705fb0ffc55e78c22f4dd79c4c57437532e Mon Sep 17 00:00:00 2001 | ||||
| From: Igor Mammedov <imammedo@redhat.com> | ||||
| Date: Mon, 27 Dec 2021 14:31:18 -0500 | ||||
| Subject: [PATCH 06/14] tests: acpi: whitelist expected blobs before changing | ||||
|  them | ||||
| 
 | ||||
| RH-Author: Igor Mammedov <imammedo@redhat.com> | ||||
| RH-MergeRequest: 130: acpi: fix QEMU crash when started with SLIC table | ||||
| RH-Commit: [2/10] 677ac6f62a40479f88cc0d47bfece74bb39ae7a7 | ||||
| RH-Bugzilla: 2043531 | ||||
| RH-Acked-by: Gerd Hoffmann <kraxel@redhat.com> | ||||
| RH-Acked-by: Miroslav Rezanina <mrezanin@redhat.com> | ||||
| RH-Acked-by: MST <None> | ||||
| 
 | ||||
| Signed-off-by: Igor Mammedov <imammedo@redhat.com> | ||||
| Message-Id: <20211227193120.1084176-3-imammedo@redhat.com> | ||||
| Reviewed-by: Michael S. Tsirkin <mst@redhat.com> | ||||
| Signed-off-by: Michael S. Tsirkin <mst@redhat.com> | ||||
| (cherry picked from commit e71f6ab9d93a7d01e833647e7010c1079c4cef30) | ||||
| Signed-off-by: Igor Mammedov <imammedo@redhat.com> | ||||
| ---
 | ||||
|  tests/data/acpi/q35/FACP.slic               | Bin 0 -> 244 bytes | ||||
|  tests/data/acpi/q35/SLIC.slic               |   0 | ||||
|  tests/qtest/bios-tables-test-allowed-diff.h |   2 ++ | ||||
|  3 files changed, 2 insertions(+) | ||||
|  create mode 100644 tests/data/acpi/q35/FACP.slic | ||||
|  create mode 100644 tests/data/acpi/q35/SLIC.slic | ||||
| 
 | ||||
| diff --git a/tests/data/acpi/q35/SLIC.slic b/tests/data/acpi/q35/SLIC.slic
 | ||||
| new file mode 100644 | ||||
| index 0000000000..e69de29bb2
 | ||||
| diff --git a/tests/qtest/bios-tables-test-allowed-diff.h b/tests/qtest/bios-tables-test-allowed-diff.h
 | ||||
| index dfb8523c8b..49dbf8fa3e 100644
 | ||||
| --- a/tests/qtest/bios-tables-test-allowed-diff.h
 | ||||
| +++ b/tests/qtest/bios-tables-test-allowed-diff.h
 | ||||
| @@ -1 +1,3 @@
 | ||||
|  /* List of comma-separated changed AML files to ignore */ | ||||
| +"tests/data/acpi/q35/FACP.slic",
 | ||||
| +"tests/data/acpi/q35/SLIC.slic",
 | ||||
| -- 
 | ||||
| 2.31.1 | ||||
| 
 | ||||
| @ -0,0 +1,49 @@ | ||||
| From 667b82b02f7f3a1e5c37e3ff77b146cc3fd9da80 Mon Sep 17 00:00:00 2001 | ||||
| From: Igor Mammedov <imammedo@redhat.com> | ||||
| Date: Wed, 12 Jan 2022 08:03:30 -0500 | ||||
| Subject: [PATCH 10/14] tests: acpi: whitelist nvdimm's SSDT and FACP.slic | ||||
|  expected blobs | ||||
| 
 | ||||
| RH-Author: Igor Mammedov <imammedo@redhat.com> | ||||
| RH-MergeRequest: 130: acpi: fix QEMU crash when started with SLIC table | ||||
| RH-Commit: [6/10] 9b35b82e26499de3b7bdc0cdd089fda0a8ec031a | ||||
| RH-Bugzilla: 2043531 | ||||
| RH-Acked-by: Gerd Hoffmann <kraxel@redhat.com> | ||||
| RH-Acked-by: Miroslav Rezanina <mrezanin@redhat.com> | ||||
| RH-Acked-by: MST <None> | ||||
| 
 | ||||
| The next commit will revert OEM fields whitespace padding to | ||||
| padding with '\0' as it was before [1]. That will change OEM | ||||
| Table ID for: | ||||
|   * SSDT.*: where it was padded from 6 characters to 8 | ||||
|   * FACP.slic: where it was padded from 2 characters to 8 | ||||
| after reverting whitespace padding, it will be replaced with | ||||
| '\0' which effectively will shorten OEM table ID to 6 and 2 | ||||
| characters. | ||||
| 
 | ||||
| Whitelist affected tables before introducing the change. | ||||
| 
 | ||||
| 1) 602b458201 ("acpi: Permit OEM ID and OEM table ID fields to be changed") | ||||
| Signed-off-by: Igor Mammedov <imammedo@redhat.com> | ||||
| Message-Id: <20220112130332.1648664-3-imammedo@redhat.com> | ||||
| Reviewed-by: Michael S. Tsirkin <mst@redhat.com> | ||||
| Signed-off-by: Michael S. Tsirkin <mst@redhat.com> | ||||
| (cherry picked from commit d1e4a4654154925eddf0fc449fa9c92b806b9c8c) | ||||
| Signed-off-by: Igor Mammedov <imammedo@redhat.com> | ||||
| ---
 | ||||
|  tests/qtest/bios-tables-test-allowed-diff.h | 4 ++++ | ||||
|  1 file changed, 4 insertions(+) | ||||
| 
 | ||||
| diff --git a/tests/qtest/bios-tables-test-allowed-diff.h b/tests/qtest/bios-tables-test-allowed-diff.h
 | ||||
| index dfb8523c8b..7faa8f53be 100644
 | ||||
| --- a/tests/qtest/bios-tables-test-allowed-diff.h
 | ||||
| +++ b/tests/qtest/bios-tables-test-allowed-diff.h
 | ||||
| @@ -1 +1,5 @@
 | ||||
|  /* List of comma-separated changed AML files to ignore */ | ||||
| +"tests/data/acpi/virt/SSDT.memhp",
 | ||||
| +"tests/data/acpi/pc/SSDT.dimmpxm",
 | ||||
| +"tests/data/acpi/q35/SSDT.dimmpxm",
 | ||||
| +"tests/data/acpi/q35/FACP.slic",
 | ||||
| -- 
 | ||||
| 2.31.1 | ||||
| 
 | ||||
| @ -0,0 +1,63 @@ | ||||
| From c5ff43026547ea20fbb496c5b6734b7e64362151 Mon Sep 17 00:00:00 2001 | ||||
| From: Gerd Hoffmann <kraxel@redhat.com> | ||||
| Date: Mon, 14 Feb 2022 12:37:49 +0100 | ||||
| Subject: [PATCH 2/6] ui: avoid compiler warnings from unused clipboard info | ||||
|  variable | ||||
| MIME-Version: 1.0 | ||||
| Content-Type: text/plain; charset=UTF-8 | ||||
| Content-Transfer-Encoding: 8bit | ||||
| 
 | ||||
| RH-Author: Gerd Hoffmann <kraxel@redhat.com> | ||||
| RH-MergeRequest: 75: fix vnc cut+paste crash | ||||
| RH-Commit: [2/4] 6a7982a0bab86bf843fd65842e730a61b2fa2cb0 (kraxel/centos-qemu-kvm) | ||||
| RH-Bugzilla: 2042820 | ||||
| RH-Acked-by: Marc-André Lureau <marcandre.lureau@redhat.com> | ||||
| RH-Acked-by: Daniel P. Berrangé <berrange@redhat.com> | ||||
| RH-Acked-by: Miroslav Rezanina <mrezanin@redhat.com> | ||||
| 
 | ||||
| With latest clang 13.0.0 we get | ||||
| 
 | ||||
| ../ui/clipboard.c:47:34: error: variable 'old' set but not used [-Werror,-Wunused-but-set-variable] | ||||
|     g_autoptr(QemuClipboardInfo) old = NULL; | ||||
|                                  ^ | ||||
| 
 | ||||
| The compiler can't tell that we only declared this variable in | ||||
| order to get the side effect of free'ing it when out of scope. | ||||
| 
 | ||||
| This pattern is a little dubious for a use of g_autoptr, so | ||||
| rewrite the code to avoid it. | ||||
| 
 | ||||
| Reviewed-by: Richard Henderson <richard.henderson@linaro.org> | ||||
| Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com> | ||||
| Tested-by: Philippe Mathieu-Daudé <philmd@redhat.com> | ||||
| Signed-off-by: Daniel P. Berrangé <berrange@redhat.com> | ||||
| [AJB: fix merge conflict] | ||||
| Signed-off-by: Alex Bennée <alex.bennee@linaro.org> | ||||
| Message-Id: <20211215141949.3512719-2-berrange@redhat.com> | ||||
| Message-Id: <20220105135009.1584676-2-alex.bennee@linaro.org> | ||||
| (cherry picked from commit 70a54b01693eda3c61814b05d699aba41015ac48) | ||||
| ---
 | ||||
|  ui/clipboard.c | 3 +-- | ||||
|  1 file changed, 1 insertion(+), 2 deletions(-) | ||||
| 
 | ||||
| diff --git a/ui/clipboard.c b/ui/clipboard.c
 | ||||
| index d7b008d62a..7672058e84 100644
 | ||||
| --- a/ui/clipboard.c
 | ||||
| +++ b/ui/clipboard.c
 | ||||
| @@ -44,12 +44,11 @@ void qemu_clipboard_peer_release(QemuClipboardPeer *peer,
 | ||||
|   | ||||
|  void qemu_clipboard_update(QemuClipboardInfo *info) | ||||
|  { | ||||
| -    g_autoptr(QemuClipboardInfo) old = NULL;
 | ||||
|      assert(info->selection < QEMU_CLIPBOARD_SELECTION__COUNT); | ||||
|   | ||||
|      notifier_list_notify(&clipboard_notifiers, info); | ||||
|   | ||||
| -    old = cbinfo[info->selection];
 | ||||
| +    qemu_clipboard_info_unref(cbinfo[info->selection]);
 | ||||
|      cbinfo[info->selection] = qemu_clipboard_info_ref(info); | ||||
|  } | ||||
|   | ||||
| -- 
 | ||||
| 2.27.0 | ||||
| 
 | ||||
							
								
								
									
										49
									
								
								SOURCES/kvm-ui-clipboard-fix-use-after-free-regression.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										49
									
								
								SOURCES/kvm-ui-clipboard-fix-use-after-free-regression.patch
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,49 @@ | ||||
| From 965275cd87f8008f129509c6d6fd0096e8ac2d96 Mon Sep 17 00:00:00 2001 | ||||
| From: =?UTF-8?q?Marc-Andr=C3=A9=20Lureau?= <marcandre.lureau@redhat.com> | ||||
| Date: Mon, 14 Feb 2022 15:59:17 +0400 | ||||
| Subject: [PATCH 3/6] ui/clipboard: fix use-after-free regression | ||||
| MIME-Version: 1.0 | ||||
| Content-Type: text/plain; charset=UTF-8 | ||||
| Content-Transfer-Encoding: 8bit | ||||
| 
 | ||||
| RH-Author: Gerd Hoffmann <kraxel@redhat.com> | ||||
| RH-MergeRequest: 75: fix vnc cut+paste crash | ||||
| RH-Commit: [3/4] d8f68e0eb60d9aaa9a703d969f215816bf35f6f0 (kraxel/centos-qemu-kvm) | ||||
| RH-Bugzilla: 2042820 | ||||
| RH-Acked-by: Marc-André Lureau <marcandre.lureau@redhat.com> | ||||
| RH-Acked-by: Daniel P. Berrangé <berrange@redhat.com> | ||||
| RH-Acked-by: Miroslav Rezanina <mrezanin@redhat.com> | ||||
| 
 | ||||
| The same info may be used to update the clipboard, and may be freed | ||||
| before being ref'ed again. | ||||
| 
 | ||||
| Fixes: 70a54b01693ed ("ui: avoid compiler warnings from unused clipboard info variable") | ||||
| 
 | ||||
| Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com> | ||||
| Reviewed-by: Daniel P. Berrangé <berrange@redhat.com> | ||||
| Message-Id: <20220214115917.1679568-1-marcandre.lureau@redhat.com> | ||||
| Signed-off-by: Gerd Hoffmann <kraxel@redhat.com> | ||||
| ---
 | ||||
|  ui/clipboard.c | 6 ++++-- | ||||
|  1 file changed, 4 insertions(+), 2 deletions(-) | ||||
| 
 | ||||
| diff --git a/ui/clipboard.c b/ui/clipboard.c
 | ||||
| index 7672058e84..d7dae13760 100644
 | ||||
| --- a/ui/clipboard.c
 | ||||
| +++ b/ui/clipboard.c
 | ||||
| @@ -48,8 +48,10 @@ void qemu_clipboard_update(QemuClipboardInfo *info)
 | ||||
|   | ||||
|      notifier_list_notify(&clipboard_notifiers, info); | ||||
|   | ||||
| -    qemu_clipboard_info_unref(cbinfo[info->selection]);
 | ||||
| -    cbinfo[info->selection] = qemu_clipboard_info_ref(info);
 | ||||
| +    if (cbinfo[info->selection] != info) {
 | ||||
| +        qemu_clipboard_info_unref(cbinfo[info->selection]);
 | ||||
| +        cbinfo[info->selection] = qemu_clipboard_info_ref(info);
 | ||||
| +    }
 | ||||
|  } | ||||
|   | ||||
|  QemuClipboardInfo *qemu_clipboard_info(QemuClipboardSelection selection) | ||||
| -- 
 | ||||
| 2.27.0 | ||||
| 
 | ||||
							
								
								
									
										80
									
								
								SOURCES/kvm-ui-vnc.c-Fixed-a-deadlock-bug.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										80
									
								
								SOURCES/kvm-ui-vnc.c-Fixed-a-deadlock-bug.patch
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,80 @@ | ||||
| From 14582cfec72e52894f16ed5c3fb14adb2d6d8e25 Mon Sep 17 00:00:00 2001 | ||||
| From: Rao Lei <lei.rao@intel.com> | ||||
| Date: Wed, 5 Jan 2022 10:08:08 +0800 | ||||
| Subject: [PATCH 4/6] ui/vnc.c: Fixed a deadlock bug. | ||||
| MIME-Version: 1.0 | ||||
| Content-Type: text/plain; charset=UTF-8 | ||||
| Content-Transfer-Encoding: 8bit | ||||
| 
 | ||||
| RH-Author: Gerd Hoffmann <kraxel@redhat.com> | ||||
| RH-MergeRequest: 75: fix vnc cut+paste crash | ||||
| RH-Commit: [4/4] 5321e447de974d91e9a6c0cf01f4352166ffb7ce (kraxel/centos-qemu-kvm) | ||||
| RH-Bugzilla: 2042820 | ||||
| RH-Acked-by: Marc-André Lureau <marcandre.lureau@redhat.com> | ||||
| RH-Acked-by: Daniel P. Berrangé <berrange@redhat.com> | ||||
| RH-Acked-by: Miroslav Rezanina <mrezanin@redhat.com> | ||||
| 
 | ||||
| The GDB statck is as follows: | ||||
| (gdb) bt | ||||
| 0  __lll_lock_wait (futex=futex@entry=0x56211df20360, private=0) at lowlevellock.c:52 | ||||
| 1  0x00007f263caf20a3 in __GI___pthread_mutex_lock (mutex=0x56211df20360) at ../nptl/pthread_mutex_lock.c:80 | ||||
| 2  0x000056211a757364 in qemu_mutex_lock_impl (mutex=0x56211df20360, file=0x56211a804857 "../ui/vnc-jobs.h", line=60) | ||||
|     at ../util/qemu-thread-posix.c:80 | ||||
| 3  0x000056211a0ef8c7 in vnc_lock_output (vs=0x56211df14200) at ../ui/vnc-jobs.h:60 | ||||
| 4  0x000056211a0efcb7 in vnc_clipboard_send (vs=0x56211df14200, count=1, dwords=0x7ffdf1701338) at ../ui/vnc-clipboard.c:138 | ||||
| 5  0x000056211a0f0129 in vnc_clipboard_notify (notifier=0x56211df244c8, data=0x56211dd1bbf0) at ../ui/vnc-clipboard.c:209 | ||||
| 6  0x000056211a75dde8 in notifier_list_notify (list=0x56211afa17d0 <clipboard_notifiers>, data=0x56211dd1bbf0) at ../util/notify.c:39 | ||||
| 7  0x000056211a0bf0e6 in qemu_clipboard_update (info=0x56211dd1bbf0) at ../ui/clipboard.c:50 | ||||
| 8  0x000056211a0bf05d in qemu_clipboard_peer_release (peer=0x56211df244c0, selection=QEMU_CLIPBOARD_SELECTION_CLIPBOARD) | ||||
|     at ../ui/clipboard.c:41 | ||||
| 9  0x000056211a0bef9b in qemu_clipboard_peer_unregister (peer=0x56211df244c0) at ../ui/clipboard.c:19 | ||||
| 10 0x000056211a0d45f3 in vnc_disconnect_finish (vs=0x56211df14200) at ../ui/vnc.c:1358 | ||||
| 11 0x000056211a0d4c9d in vnc_client_read (vs=0x56211df14200) at ../ui/vnc.c:1611 | ||||
| 12 0x000056211a0d4df8 in vnc_client_io (ioc=0x56211ce70690, condition=G_IO_IN, opaque=0x56211df14200) at ../ui/vnc.c:1649 | ||||
| 13 0x000056211a5b976c in qio_channel_fd_source_dispatch | ||||
|     (source=0x56211ce50a00, callback=0x56211a0d4d71 <vnc_client_io>, user_data=0x56211df14200) at ../io/channel-watch.c:84 | ||||
| 14 0x00007f263ccede8e in g_main_context_dispatch () at /lib/x86_64-linux-gnu/libglib-2.0.so.0 | ||||
| 15 0x000056211a77d4a1 in glib_pollfds_poll () at ../util/main-loop.c:232 | ||||
| 16 0x000056211a77d51f in os_host_main_loop_wait (timeout=958545) at ../util/main-loop.c:255 | ||||
| 17 0x000056211a77d630 in main_loop_wait (nonblocking=0) at ../util/main-loop.c:531 | ||||
| 18 0x000056211a45bc8e in qemu_main_loop () at ../softmmu/runstate.c:726 | ||||
| 19 0x000056211a0b45fa in main (argc=69, argv=0x7ffdf1701778, envp=0x7ffdf17019a8) at ../softmmu/main.c:50 | ||||
| 
 | ||||
| From the call trace, we can see it is a deadlock bug. | ||||
| vnc_disconnect_finish will acquire the output_mutex. | ||||
| But, the output_mutex will be acquired again in vnc_clipboard_send. | ||||
| Repeated locking will cause deadlock. So, I move | ||||
| qemu_clipboard_peer_unregister() behind vnc_unlock_output(); | ||||
| 
 | ||||
| Fixes: 0bf41cab93e ("ui/vnc: clipboard support") | ||||
| Signed-off-by: Lei Rao <lei.rao@intel.com> | ||||
| Reviewed-by: Marc-André Lureau <marcandre.lureau@redhat.com> | ||||
| Message-Id: <20220105020808.597325-1-lei.rao@intel.com> | ||||
| Signed-off-by: Gerd Hoffmann <kraxel@redhat.com> | ||||
| (cherry picked from commit 1dbbe6f172810026c51dc84ed927a3cc23017949) | ||||
| ---
 | ||||
|  ui/vnc.c | 4 ++-- | ||||
|  1 file changed, 2 insertions(+), 2 deletions(-) | ||||
| 
 | ||||
| diff --git a/ui/vnc.c b/ui/vnc.c
 | ||||
| index af02522e84..b253e85c65 100644
 | ||||
| --- a/ui/vnc.c
 | ||||
| +++ b/ui/vnc.c
 | ||||
| @@ -1354,12 +1354,12 @@ void vnc_disconnect_finish(VncState *vs)
 | ||||
|          /* last client gone */ | ||||
|          vnc_update_server_surface(vs->vd); | ||||
|      } | ||||
| +    vnc_unlock_output(vs);
 | ||||
| +
 | ||||
|      if (vs->cbpeer.update.notify) { | ||||
|          qemu_clipboard_peer_unregister(&vs->cbpeer); | ||||
|      } | ||||
|   | ||||
| -    vnc_unlock_output(vs);
 | ||||
| -
 | ||||
|      qemu_mutex_destroy(&vs->output_mutex); | ||||
|      if (vs->bh != NULL) { | ||||
|          qemu_bh_delete(vs->bh); | ||||
| -- 
 | ||||
| 2.27.0 | ||||
| 
 | ||||
| @ -0,0 +1,110 @@ | ||||
| From 846192d22a1ddfa87682bb0b67febef5c30c9743 Mon Sep 17 00:00:00 2001 | ||||
| From: Vivek Goyal <vgoyal@redhat.com> | ||||
| Date: Tue, 25 Jan 2022 13:51:14 -0500 | ||||
| Subject: [PATCH 3/5] virtiofsd: Drop membership of all supplementary groups | ||||
|  (CVE-2022-0358) | ||||
| 
 | ||||
| RH-Author: Dr. David Alan Gilbert <dgilbert@redhat.com> | ||||
| RH-MergeRequest: 66: c9s:  virtiofsd security fix - drop secondary groups | ||||
| RH-Commit: [1/1] cdf3b0405ea3369933e76761890f16b040641036 (redhat/centos-stream/src/qemu-kvm) | ||||
| RH-Bugzilla: 2046201 | ||||
| RH-Acked-by: Hanna Reitz <hreitz@redhat.com> | ||||
| RH-Acked-by: Sergio Lopez <None> | ||||
| RH-Acked-by: Vivek Goyal <None> | ||||
| 
 | ||||
| At the start, drop membership of all supplementary groups. This is | ||||
| not required. | ||||
| 
 | ||||
| If we have membership of "root" supplementary group and when we switch | ||||
| uid/gid using setresuid/setsgid, we still retain membership of existing | ||||
| supplemntary groups. And that can allow some operations which are not | ||||
| normally allowed. | ||||
| 
 | ||||
| For example, if root in guest creates a dir as follows. | ||||
| 
 | ||||
| $ mkdir -m 03777 test_dir | ||||
| 
 | ||||
| This sets SGID on dir as well as allows unprivileged users to write into | ||||
| this dir. | ||||
| 
 | ||||
| And now as unprivileged user open file as follows. | ||||
| 
 | ||||
| $ su test | ||||
| $ fd = open("test_dir/priviledge_id", O_RDWR|O_CREAT|O_EXCL, 02755); | ||||
| 
 | ||||
| This will create SGID set executable in test_dir/. | ||||
| 
 | ||||
| And that's a problem because now an unpriviliged user can execute it, | ||||
| get egid=0 and get access to resources owned by "root" group. This is | ||||
| privilege escalation. | ||||
| 
 | ||||
| Fixes: https://bugzilla.redhat.com/show_bug.cgi?id=2044863 | ||||
| Fixes: CVE-2022-0358 | ||||
| Reported-by: JIETAO XIAO <shawtao1125@gmail.com> | ||||
| Suggested-by: Miklos Szeredi <mszeredi@redhat.com> | ||||
| Reviewed-by: Stefan Hajnoczi <stefanha@redhat.com> | ||||
| Reviewed-by: Dr. David Alan Gilbert <dgilbert@redhat.com> | ||||
| Signed-off-by: Vivek Goyal <vgoyal@redhat.com> | ||||
| Message-Id: <YfBGoriS38eBQrAb@redhat.com> | ||||
| Signed-off-by: Dr. David Alan Gilbert <dgilbert@redhat.com> | ||||
|   dgilbert: Fixed missing {}'s style nit | ||||
| (cherry picked from commit 449e8171f96a6a944d1f3b7d3627ae059eae21ca) | ||||
| ---
 | ||||
|  tools/virtiofsd/passthrough_ll.c | 27 +++++++++++++++++++++++++++ | ||||
|  1 file changed, 27 insertions(+) | ||||
| 
 | ||||
| diff --git a/tools/virtiofsd/passthrough_ll.c b/tools/virtiofsd/passthrough_ll.c
 | ||||
| index 64b5b4fbb1..b3d0674f6d 100644
 | ||||
| --- a/tools/virtiofsd/passthrough_ll.c
 | ||||
| +++ b/tools/virtiofsd/passthrough_ll.c
 | ||||
| @@ -54,6 +54,7 @@
 | ||||
|  #include <sys/wait.h> | ||||
|  #include <sys/xattr.h> | ||||
|  #include <syslog.h> | ||||
| +#include <grp.h>
 | ||||
|   | ||||
|  #include "qemu/cutils.h" | ||||
|  #include "passthrough_helpers.h" | ||||
| @@ -1161,6 +1162,30 @@ static void lo_lookup(fuse_req_t req, fuse_ino_t parent, const char *name)
 | ||||
|  #define OURSYS_setresuid SYS_setresuid | ||||
|  #endif | ||||
|   | ||||
| +static void drop_supplementary_groups(void)
 | ||||
| +{
 | ||||
| +    int ret;
 | ||||
| +
 | ||||
| +    ret = getgroups(0, NULL);
 | ||||
| +    if (ret == -1) {
 | ||||
| +        fuse_log(FUSE_LOG_ERR, "getgroups() failed with error=%d:%s\n",
 | ||||
| +                 errno, strerror(errno));
 | ||||
| +        exit(1);
 | ||||
| +    }
 | ||||
| +
 | ||||
| +    if (!ret) {
 | ||||
| +        return;
 | ||||
| +    }
 | ||||
| +
 | ||||
| +    /* Drop all supplementary groups. We should not need it */
 | ||||
| +    ret = setgroups(0, NULL);
 | ||||
| +    if (ret == -1) {
 | ||||
| +        fuse_log(FUSE_LOG_ERR, "setgroups() failed with error=%d:%s\n",
 | ||||
| +                 errno, strerror(errno));
 | ||||
| +        exit(1);
 | ||||
| +    }
 | ||||
| +}
 | ||||
| +
 | ||||
|  /* | ||||
|   * Change to uid/gid of caller so that file is created with | ||||
|   * ownership of caller. | ||||
| @@ -3926,6 +3951,8 @@ int main(int argc, char *argv[])
 | ||||
|   | ||||
|      qemu_init_exec_dir(argv[0]); | ||||
|   | ||||
| +    drop_supplementary_groups();
 | ||||
| +
 | ||||
|      pthread_mutex_init(&lo.mutex, NULL); | ||||
|      lo.inodes = g_hash_table_new(lo_key_hash, lo_key_equal); | ||||
|      lo.root.fd = -1; | ||||
| -- 
 | ||||
| 2.27.0 | ||||
| 
 | ||||
							
								
								
									
										49
									
								
								SOURCES/kvm-vmxcap-Add-5-level-EPT-bit.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										49
									
								
								SOURCES/kvm-vmxcap-Add-5-level-EPT-bit.patch
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,49 @@ | ||||
| From 5d8e4aefe49d4ea5237efc8132e44183b99ebabc Mon Sep 17 00:00:00 2001 | ||||
| From: Vitaly Kuznetsov <vkuznets@redhat.com> | ||||
| Date: Wed, 16 Mar 2022 09:35:23 +0100 | ||||
| Subject: [PATCH 03/14] vmxcap: Add 5-level EPT bit | ||||
| 
 | ||||
| RH-Author: Vitaly Kuznetsov <vkuznets@redhat.com> | ||||
| RH-MergeRequest: 126: i386: Add Icelake-Server-v6 CPU model with 5-level EPT support | ||||
| RH-Commit: [1/2] 3f74e192278b8886de5dbeaf607521e9d3b744eb | ||||
| RH-Bugzilla: 2038051 | ||||
| RH-Acked-by: Igor Mammedov <imammedo@redhat.com> | ||||
| RH-Acked-by: Cornelia Huck <cohuck@redhat.com> | ||||
| RH-Acked-by: Paolo Bonzini <pbonzini@redhat.com> | ||||
| 
 | ||||
| Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=2038051 | ||||
| Brew: https://brewweb.engineering.redhat.com/brew/taskinfo?taskID=43862630 | ||||
| 
 | ||||
| commit d312378e59658473aa91aa15c67ec6200d92e5ff | ||||
| Author: Vitaly Kuznetsov <vkuznets@redhat.com> | ||||
| Date:   Mon Feb 21 15:53:16 2022 +0100 | ||||
| 
 | ||||
|     vmxcap: Add 5-level EPT bit | ||||
| 
 | ||||
|     5-level EPT is present in Icelake Server CPUs and is supported by QEMU | ||||
|     ('vmx-page-walk-5'). | ||||
| 
 | ||||
|     Signed-off-by: Vitaly Kuznetsov <vkuznets@redhat.com> | ||||
|     Message-Id: <20220221145316.576138-2-vkuznets@redhat.com> | ||||
|     Signed-off-by: Paolo Bonzini <pbonzini@redhat.com> | ||||
| 
 | ||||
| Signed-off-by: Vitaly Kuznetsov <vkuznets@redhat.com> | ||||
| ---
 | ||||
|  scripts/kvm/vmxcap | 1 + | ||||
|  1 file changed, 1 insertion(+) | ||||
| 
 | ||||
| diff --git a/scripts/kvm/vmxcap b/scripts/kvm/vmxcap
 | ||||
| index 6fe66d5f57..f140040104 100755
 | ||||
| --- a/scripts/kvm/vmxcap
 | ||||
| +++ b/scripts/kvm/vmxcap
 | ||||
| @@ -249,6 +249,7 @@ controls = [
 | ||||
|          bits = { | ||||
|              0: 'Execute-only EPT translations', | ||||
|              6: 'Page-walk length 4', | ||||
| +            7: 'Page-walk length 5',
 | ||||
|              8: 'Paging-structure memory type UC', | ||||
|              14: 'Paging-structure memory type WB', | ||||
|              16: '2MB EPT pages', | ||||
| -- 
 | ||||
| 2.31.1 | ||||
| 
 | ||||
							
								
								
									
										65
									
								
								SOURCES/kvm-x86-Add-q35-RHEL-8.6.0-machine-type.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										65
									
								
								SOURCES/kvm-x86-Add-q35-RHEL-8.6.0-machine-type.patch
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,65 @@ | ||||
| From 1b8eeb1323fa21c7b26d0396fae5ae4a8cdb1ace Mon Sep 17 00:00:00 2001 | ||||
| From: "Dr. David Alan Gilbert" <dgilbert@redhat.com> | ||||
| Date: Tue, 11 Jan 2022 18:29:31 +0000 | ||||
| Subject: [PATCH 1/3] x86: Add q35 RHEL 8.6.0 machine type | ||||
| 
 | ||||
| RH-Author: Dr. David Alan Gilbert <dgilbert@redhat.com> | ||||
| RH-MergeRequest: 61: x86: Add rhel 8.6.0 & 9.0.0 machine types | ||||
| RH-Commit: [1/2] 189335cf0e4ad117e3e401f23aa07cddbbac50df (dagrh/c-9-s-qemu-kvm) | ||||
| RH-Bugzilla: 1945666 | ||||
| RH-Acked-by: Miroslav Rezanina <mrezanin@redhat.com> | ||||
| RH-Acked-by: Stefano Garzarella <sgarzare@redhat.com> | ||||
| RH-Acked-by: Cornelia Huck <cohuck@redhat.com> | ||||
| 
 | ||||
| Add the new 8.6.0 machine type;  note that while the -AV | ||||
| notation has gone in the product naming, just keep the smbios | ||||
| definitions the same for consistency. | ||||
| 
 | ||||
| Signed-off-by: Dr. David Alan Gilbert <dgilbert@redhat.com> | ||||
| ---
 | ||||
|  hw/i386/pc_q35.c | 21 ++++++++++++++++++++- | ||||
|  1 file changed, 20 insertions(+), 1 deletion(-) | ||||
| 
 | ||||
| diff --git a/hw/i386/pc_q35.c b/hw/i386/pc_q35.c
 | ||||
| index 3b748ddd7b..0c25305f15 100644
 | ||||
| --- a/hw/i386/pc_q35.c
 | ||||
| +++ b/hw/i386/pc_q35.c
 | ||||
| @@ -646,6 +646,24 @@ static void pc_q35_machine_rhel_options(MachineClass *m)
 | ||||
|      compat_props_add(m->compat_props, pc_rhel_compat, pc_rhel_compat_len); | ||||
|  } | ||||
|   | ||||
| +static void pc_q35_init_rhel860(MachineState *machine)
 | ||||
| +{
 | ||||
| +    pc_q35_init(machine);
 | ||||
| +}
 | ||||
| +
 | ||||
| +static void pc_q35_machine_rhel860_options(MachineClass *m)
 | ||||
| +{
 | ||||
| +    PCMachineClass *pcmc = PC_MACHINE_CLASS(m);
 | ||||
| +    pc_q35_machine_rhel_options(m);
 | ||||
| +    m->desc = "RHEL-8.6.0 PC (Q35 + ICH9, 2009)";
 | ||||
| +    pcmc->smbios_stream_product = "RHEL-AV";
 | ||||
| +    pcmc->smbios_stream_version = "8.6.0";
 | ||||
| +}
 | ||||
| +
 | ||||
| +DEFINE_PC_MACHINE(q35_rhel860, "pc-q35-rhel8.6.0", pc_q35_init_rhel860,
 | ||||
| +                  pc_q35_machine_rhel860_options);
 | ||||
| +
 | ||||
| +
 | ||||
|  static void pc_q35_init_rhel850(MachineState *machine) | ||||
|  { | ||||
|      pc_q35_init(machine); | ||||
| @@ -654,8 +672,9 @@ static void pc_q35_init_rhel850(MachineState *machine)
 | ||||
|  static void pc_q35_machine_rhel850_options(MachineClass *m) | ||||
|  { | ||||
|      PCMachineClass *pcmc = PC_MACHINE_CLASS(m); | ||||
| -    pc_q35_machine_rhel_options(m);
 | ||||
| +    pc_q35_machine_rhel860_options(m);
 | ||||
|      m->desc = "RHEL-8.5.0 PC (Q35 + ICH9, 2009)"; | ||||
| +    m->alias = NULL;
 | ||||
|      pcmc->smbios_stream_product = "RHEL-AV"; | ||||
|      pcmc->smbios_stream_version = "8.5.0"; | ||||
|      compat_props_add(m->compat_props, hw_compat_rhel_8_5, | ||||
| -- 
 | ||||
| 2.27.0 | ||||
| 
 | ||||
							
								
								
									
										75
									
								
								SOURCES/kvm-x86-Add-q35-RHEL-9.0.0-machine-type.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										75
									
								
								SOURCES/kvm-x86-Add-q35-RHEL-9.0.0-machine-type.patch
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,75 @@ | ||||
| From 3d5024fb9c904a649d07f0def3a90b3d36611215 Mon Sep 17 00:00:00 2001 | ||||
| From: "Dr. David Alan Gilbert" <dgilbert@redhat.com> | ||||
| Date: Wed, 12 Jan 2022 13:21:57 +0000 | ||||
| Subject: [PATCH 2/3] x86: Add q35 RHEL 9.0.0 machine type | ||||
| 
 | ||||
| RH-Author: Dr. David Alan Gilbert <dgilbert@redhat.com> | ||||
| RH-MergeRequest: 61: x86: Add rhel 8.6.0 & 9.0.0 machine types | ||||
| RH-Commit: [2/2] 743378502459b978efd632271f97ddb824422203 (dagrh/c-9-s-qemu-kvm) | ||||
| RH-Bugzilla: 1945666 | ||||
| RH-Acked-by: Miroslav Rezanina <mrezanin@redhat.com> | ||||
| RH-Acked-by: Stefano Garzarella <sgarzare@redhat.com> | ||||
| RH-Acked-by: Cornelia Huck <cohuck@redhat.com> | ||||
| 
 | ||||
| Add a rhel-9.0.0 q35 machine type; it's currently identical to 8.6.0; | ||||
| but having a separate machine type will make life easier in the future | ||||
| when the 8.x types go away. | ||||
| 
 | ||||
| Note: The smbios stream product name has now changed to 'RHEL' | ||||
| 
 | ||||
| bz: https://bugzilla.redhat.com/show_bug.cgi?id=1945666 | ||||
| Signed-off-by: Dr. David Alan Gilbert <dgilbert@redhat.com> | ||||
| ---
 | ||||
|  hw/i386/pc_q35.c | 21 +++++++++++++++++++-- | ||||
|  1 file changed, 19 insertions(+), 2 deletions(-) | ||||
| 
 | ||||
| diff --git a/hw/i386/pc_q35.c b/hw/i386/pc_q35.c
 | ||||
| index 0c25305f15..bf9ad32f0e 100644
 | ||||
| --- a/hw/i386/pc_q35.c
 | ||||
| +++ b/hw/i386/pc_q35.c
 | ||||
| @@ -646,6 +646,23 @@ static void pc_q35_machine_rhel_options(MachineClass *m)
 | ||||
|      compat_props_add(m->compat_props, pc_rhel_compat, pc_rhel_compat_len); | ||||
|  } | ||||
|   | ||||
| +static void pc_q35_init_rhel900(MachineState *machine)
 | ||||
| +{
 | ||||
| +    pc_q35_init(machine);
 | ||||
| +}
 | ||||
| +
 | ||||
| +static void pc_q35_machine_rhel900_options(MachineClass *m)
 | ||||
| +{
 | ||||
| +    PCMachineClass *pcmc = PC_MACHINE_CLASS(m);
 | ||||
| +    pc_q35_machine_rhel_options(m);
 | ||||
| +    m->desc = "RHEL-9.0.0 PC (Q35 + ICH9, 2009)";
 | ||||
| +    pcmc->smbios_stream_product = "RHEL";
 | ||||
| +    pcmc->smbios_stream_version = "9.0.0";
 | ||||
| +}
 | ||||
| +
 | ||||
| +DEFINE_PC_MACHINE(q35_rhel900, "pc-q35-rhel9.0.0", pc_q35_init_rhel900,
 | ||||
| +                  pc_q35_machine_rhel900_options);
 | ||||
| +
 | ||||
|  static void pc_q35_init_rhel860(MachineState *machine) | ||||
|  { | ||||
|      pc_q35_init(machine); | ||||
| @@ -654,8 +671,9 @@ static void pc_q35_init_rhel860(MachineState *machine)
 | ||||
|  static void pc_q35_machine_rhel860_options(MachineClass *m) | ||||
|  { | ||||
|      PCMachineClass *pcmc = PC_MACHINE_CLASS(m); | ||||
| -    pc_q35_machine_rhel_options(m);
 | ||||
| +    pc_q35_machine_rhel900_options(m);
 | ||||
|      m->desc = "RHEL-8.6.0 PC (Q35 + ICH9, 2009)"; | ||||
| +    m->alias = NULL;
 | ||||
|      pcmc->smbios_stream_product = "RHEL-AV"; | ||||
|      pcmc->smbios_stream_version = "8.6.0"; | ||||
|  } | ||||
| @@ -674,7 +692,6 @@ static void pc_q35_machine_rhel850_options(MachineClass *m)
 | ||||
|      PCMachineClass *pcmc = PC_MACHINE_CLASS(m); | ||||
|      pc_q35_machine_rhel860_options(m); | ||||
|      m->desc = "RHEL-8.5.0 PC (Q35 + ICH9, 2009)"; | ||||
| -    m->alias = NULL;
 | ||||
|      pcmc->smbios_stream_product = "RHEL-AV"; | ||||
|      pcmc->smbios_stream_version = "8.5.0"; | ||||
|      compat_props_add(m->compat_props, hw_compat_rhel_8_5, | ||||
| -- 
 | ||||
| 2.27.0 | ||||
| 
 | ||||
							
								
								
									
										12
									
								
								SOURCES/kvm-x86.conf
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										12
									
								
								SOURCES/kvm-x86.conf
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,12 @@ | ||||
| # Setting modprobe kvm_intel/kvm_amd nested = 1 | ||||
| # only enables Nested Virtualization until the next reboot or | ||||
| # module reload. Uncomment the option applicable | ||||
| # to your system below to enable the feature permanently. | ||||
| # | ||||
| # User changes in this file are preserved across upgrades. | ||||
| # | ||||
| # For Intel | ||||
| #options kvm_intel nested=1 | ||||
| # | ||||
| # For AMD | ||||
| #options kvm_amd nested=1 | ||||
							
								
								
									
										3
									
								
								SOURCES/kvm.conf
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										3
									
								
								SOURCES/kvm.conf
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,3 @@ | ||||
| # | ||||
| # User changes in this file are preserved across upgrades. | ||||
| # | ||||
							
								
								
									
										4
									
								
								SOURCES/modules-load.conf
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										4
									
								
								SOURCES/modules-load.conf
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,4 @@ | ||||
| # When using SELinux in libvirt, automatic loading of the kvm.ko kernel | ||||
| # module might not work when qemu-kvm tries to access /dev/kvm - thus we | ||||
| # simply always load this module during the boot process already. | ||||
| kvm | ||||
							
								
								
									
										19
									
								
								SOURCES/qemu-ga.sysconfig
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										19
									
								
								SOURCES/qemu-ga.sysconfig
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,19 @@ | ||||
| # This is a systemd environment file, not a shell script. | ||||
| # It provides settings for "/lib/systemd/system/qemu-guest-agent.service". | ||||
| 
 | ||||
| # Comma-separated blacklist of RPCs to disable, or empty list to enable all. | ||||
| # | ||||
| # You can get the list of RPC commands using "qemu-ga --blacklist='?'". | ||||
| # There should be no spaces between commas and commands in the blacklist. | ||||
| BLACKLIST_RPC=guest-file-open,guest-file-close,guest-file-read,guest-file-write,guest-file-seek,guest-file-flush,guest-exec,guest-exec-status | ||||
| 
 | ||||
| # Fsfreeze hook script specification. | ||||
| # | ||||
| # FSFREEZE_HOOK_PATHNAME=/dev/null           : disables the feature. | ||||
| # | ||||
| # FSFREEZE_HOOK_PATHNAME=/path/to/executable : enables the feature with the | ||||
| # specified binary or shell script. | ||||
| # | ||||
| # FSFREEZE_HOOK_PATHNAME=                    : enables the feature with the | ||||
| # default value (invoke "qemu-ga --help" to interrogate). | ||||
| FSFREEZE_HOOK_PATHNAME=/etc/qemu-ga/fsfreeze-hook | ||||
							
								
								
									
										19
									
								
								SOURCES/qemu-guest-agent.service
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										19
									
								
								SOURCES/qemu-guest-agent.service
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,19 @@ | ||||
| [Unit] | ||||
| Description=QEMU Guest Agent | ||||
| BindsTo=dev-virtio\x2dports-org.qemu.guest_agent.0.device | ||||
| After=dev-virtio\x2dports-org.qemu.guest_agent.0.device | ||||
| IgnoreOnIsolate=True | ||||
| 
 | ||||
| [Service] | ||||
| UMask=0077 | ||||
| EnvironmentFile=/etc/sysconfig/qemu-ga | ||||
| ExecStart=/usr/bin/qemu-ga \ | ||||
|   --method=virtio-serial \ | ||||
|   --path=/dev/virtio-ports/org.qemu.guest_agent.0 \ | ||||
|   --blacklist=${BLACKLIST_RPC} \ | ||||
|   -F${FSFREEZE_HOOK_PATHNAME} | ||||
| Restart=always | ||||
| RestartSec=0 | ||||
| 
 | ||||
| [Install] | ||||
| WantedBy=dev-virtio\x2dports-org.qemu.guest_agent.0.device | ||||
							
								
								
									
										
											BIN
										
									
								
								SOURCES/tests_data_acpi_pc_SSDT.dimmpxm
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								SOURCES/tests_data_acpi_pc_SSDT.dimmpxm
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										
											BIN
										
									
								
								SOURCES/tests_data_acpi_q35_FACP.slic
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								SOURCES/tests_data_acpi_q35_FACP.slic
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										
											BIN
										
									
								
								SOURCES/tests_data_acpi_q35_SSDT.dimmpxm
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								SOURCES/tests_data_acpi_q35_SSDT.dimmpxm
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										
											BIN
										
									
								
								SOURCES/tests_data_acpi_virt_SSDT.memhp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								SOURCES/tests_data_acpi_virt_SSDT.memhp
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										3
									
								
								SOURCES/vhost.conf
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										3
									
								
								SOURCES/vhost.conf
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,3 @@ | ||||
| # Increase default vhost memory map limit to match | ||||
| # KVM's memory slot limit | ||||
| options vhost max_mem_regions=509 | ||||
							
								
								
									
										4214
									
								
								SPECS/qemu-kvm.spec
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										4214
									
								
								SPECS/qemu-kvm.spec
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
		Loading…
	
		Reference in New Issue
	
	Block a user