From a711492897fe1c48ddedda0fe902b6f27d59699c Mon Sep 17 00:00:00 2001 From: "Danilo C. L. de Paula" Date: Thu, 29 Nov 2018 10:09:34 -0200 Subject: [PATCH] Rebase to qemu 3.1.0-RC2 --- .gitignore | 2 +- ...-Fix-compilation-issue-when-disable-.patch | 128 +++ ...d.patch => 0005-Initial-redhat-build.patch | 80 +- ...0006-Enable-disable-devices-for-RHEL.patch | 492 ++++------ ...Machine-type-related-general-changes.patch | 56 +- ...ch => 0008-Add-aarch64-machine-types.patch | 30 +- ...atch => 0009-Add-ppc64-machine-types.patch | 46 +- ...atch => 0010-Add-s390x-machine-types.patch | 23 +- ...tch => 0011-Add-x86_64-machine-types.patch | 46 +- 0011-Enable-make-check.patch | 498 ---------- 0012-Enable-make-check.patch | 298 ++++++ ...ult.patch => 0013-Use-kvm-by-default.patch | 11 +- ...mber-of-devices-that-can-be-assigned.patch | 25 +- ...Add-support-statement-to-help-output.patch | 10 +- ...lly-limit-the-maximum-number-of-CPUs.patch | 89 -- ...lly-limit-the-maximum-number-of-CPUs.patch | 153 +++ ... => 0017-Add-support-for-simpletrace.patch | 23 +- ...documentation-instead-of-qemu-system.patch | 234 +++-- ...19-usb-xhci-Fix-PCI-capability-order.patch | 15 +- ...x-headers-asm-s390-kvm.h-header-sync.patch | 72 -- ...ct-scsi-cd-if-data-plane-enabled-RHE.patch | 7 +- ...Enable-KVM-huge-page-backing-support.patch | 114 --- 0022-s390x-kvm-add-etoken-facility.patch | 190 ---- ...efault-enable-bpb-and-ppa15-for-z196.patch | 51 - ...-arch_query_cpu_model_expansion-leak.patch | 87 -- ...sable-TOPOEXT-by-default-on-cpu-host.patch | 54 -- ...ify-off-disable-host-as-well-as-peer.patch | 77 -- ...on-postcopy-Clear-have_listen_thread.patch | 51 - ...ion-cleanup-in-error-paths-in-loadvm.patch | 52 - ...hange-start-callback-to-run-callback.patch | 372 -------- 0030-jobs-canonize-Error-object.patch | 283 ------ 0031-jobs-add-exit-shim.patch | 108 --- 0032-block-commit-utilize-job_exit-shim.patch | 115 --- 0033-block-mirror-utilize-job_exit-shim.patch | 152 --- 0034-jobs-utilize-job_exit-shim.patch | 307 ------ ...e-function-variables-consistently-na.patch | 165 ---- ...argument-to-job_completed-privatize-.patch | 153 --- 0037-jobs-remove-job_defer_to_main_loop.patch | 119 --- ...-commit-add-block-job-creation-flags.patch | 110 --- ...-mirror-add-block-job-creation-flags.patch | 100 -- ...-stream-add-block-job-creation-flags.patch | 100 -- ...refactor-commit-to-use-job-callbacks.patch | 180 ---- ...don-t-install-backing-chain-on-abort.patch | 45 - ...or-conservative-mirror_exit-refactor.patch | 136 --- ...refactor-stream-to-use-job-callbacks.patch | 94 -- ...s-blockjob-replace-Blockjob-with-Job.patch | 233 ----- ...s-test-blockjob-remove-exit-callback.patch | 88 -- ...st-blockjob-txn-move-.exit-to-.clean.patch | 53 -- 0048-jobs-remove-.exit-callback.patch | 156 --- ...ock-commit-expose-new-job-properties.patch | 90 -- ...ock-mirror-expose-new-job-properties.patch | 144 --- ...ock-stream-expose-new-job-properties.patch | 108 --- ...lock-backup-qapi-documentation-fixup.patch | 73 -- ...-document-transactional-shortcomings.patch | 53 -- ...YS-signal-instead-of-killing-the-thr.patch | 67 -- ...r-SCMP_ACT_KILL_PROCESS-if-available.patch | 110 --- ...et-the-seccomp-filter-to-all-threads.patch | 77 -- ...ide-effects-of-memory_region_init_fo.patch | 185 ---- ...or-Fail-gracefully-for-source-target.patch | 87 -- ...ommit-Add-top-node-base-node-options.patch | 141 --- ...-Test-commit-with-top-node-base-node.patch | 127 --- ...o-not-clear-user_paused-until-after-.patch | 59 -- ...catch-abort-on-forced-blockjob-cance.patch | 173 ---- ...uild-build-SRAT-memory-affinity-stru.patch | 117 --- ...count-ctx-notifier-as-progress-when-.patch | 48 - ...y_accept-only-during-blocking-aio_po.patch | 124 --- ...oncurrent-access-to-poll_disable_cnt.patch | 122 --- ...posix-compute-timeout-before-polling.patch | 186 ---- ...p-system-call-if-ctx-notifier-pollin.patch | 64 -- 0069-linux-headers-update.patch | 202 ---- ...et-up-CPU-model-for-AP-device-suppor.patch | 148 --- ...-AP-instruction-interpretation-for-g.patch | 89 -- ...se-Adjunct-Processor-AP-object-model.patch | 281 ------ ...90x-vfio-ap-Introduce-VFIO-AP-device.patch | 305 ------ ...d-specifications-for-AP-virtualizati.patch | 889 ------------------ ...-sasl_server_init-only-when-required.patch | 89 -- 0076-nbd-server-fix-NBD_CMD_CACHE.patch | 52 - 0077-nbd-fix-NBD_FLAG_SEND_CACHE-value.patch | 96 -- ...acquire-AioContext-before-qemu_laio_.patch | 134 --- ...emu_aio_coroutine_enter-in-co_schedu.patch | 78 -- ...ed-aio_poll-hanging-in-job_txn_apply.patch | 105 --- ...-Fix-missing-locking-due-to-mismerge.patch | 55 -- ...ob-Wake-up-BDS-when-job-becomes-idle.patch | 161 ---- ...ease-num_waiters-even-in-home-thread.patch | 64 -- ...Drain-with-block-jobs-in-an-I-O-thre.patch | 208 ---- ...quire-AioContext-around-job_cancel_s.patch | 86 -- ...se-AIO_WAIT_WHILE-in-job_finish_sync.patch | 77 -- ...Test-AIO_WAIT_WHILE-in-completion-ca.patch | 59 -- ...ssing-locking-in-bdrv_co_drain_bh_cb.patch | 96 -- ...k-backend-Add-.drained_poll-callback.patch | 66 -- ...kend-Fix-potential-double-blk_delete.patch | 67 -- ...crease-in_flight-only-after-callback.patch | 74 -- ...Lie-better-in-child_job_drained_poll.patch | 104 -- ...aio_poll-in-bdrv_drain_poll-variants.patch | 64 -- ...Test-nested-poll-in-bdrv_drain_poll_.patch | 63 -- ...deadlocks-in-job_completed_txn_abort.patch | 85 -- ...AIO_WAIT_WHILE-in-job-.commit-.abort.patch | 241 ----- ...est-bdrv-drain-Fix-outdated-comments.patch | 69 -- 0098-block-Use-a-single-global-AioWait.patch | 367 -------- ...Test-draining-job-source-child-and-p.patch | 198 ---- ...bd-pull-out-qemu_rbd_convert_options.patch | 95 -- ...bd-Attempt-to-parse-legacy-filenames.patch | 120 --- ...precation-documentation-for-filename.patch | 59 -- ...test-for-rbd-legacy-keyvalue-filenam.patch | 141 --- 0104-luks-Allow-share-rw-on.patch | 52 - qemu-kvm.spec | 229 +---- sources | 2 +- 107 files changed, 1155 insertions(+), 12453 deletions(-) create mode 100644 0001-migration-colo.c-Fix-compilation-issue-when-disable-.patch rename 0004-Initial-redhat-build.patch => 0005-Initial-redhat-build.patch (83%) rename 0005-Enable-disable-devices-for-RHEL-7.patch => 0006-Enable-disable-devices-for-RHEL.patch (74%) rename 0006-Machine-type-related-general-changes.patch => 0007-Machine-type-related-general-changes.patch (95%) rename 0007-Add-aarch64-machine-types.patch => 0008-Add-aarch64-machine-types.patch (92%) rename 0008-Add-ppc64-machine-types.patch => 0009-Add-ppc64-machine-types.patch (91%) rename 0009-Add-s390x-machine-types.patch => 0010-Add-s390x-machine-types.patch (78%) rename 0010-Add-x86_64-machine-types.patch => 0011-Add-x86_64-machine-types.patch (96%) delete mode 100644 0011-Enable-make-check.patch create mode 100644 0012-Enable-make-check.patch rename 0012-Use-kvm-by-default.patch => 0013-Use-kvm-by-default.patch (72%) rename 0013-vfio-cap-number-of-devices-that-can-be-assigned.patch => 0014-vfio-cap-number-of-devices-that-can-be-assigned.patch (73%) rename 0014-Add-support-statement-to-help-output.patch => 0015-Add-support-statement-to-help-output.patch (82%) delete mode 100644 0015-globally-limit-the-maximum-number-of-CPUs.patch create mode 100644 0016-globally-limit-the-maximum-number-of-CPUs.patch rename 0016-Add-support-for-simpletrace.patch => 0017-Add-support-for-simpletrace.patch (86%) rename 0017-Use-qemu-kvm-in-documentation-instead-of-qemu-system.patch => 0018-Use-qemu-kvm-in-documentation-instead-of-qemu-system.patch (85%) rename 0018-usb-xhci-Fix-PCI-capability-order.patch => 0019-usb-xhci-Fix-PCI-capability-order.patch (87%) delete mode 100644 0020-linux-headers-asm-s390-kvm.h-header-sync.patch rename 0019-virtio-scsi-Reject-scsi-cd-if-data-plane-enabled-RHE.patch => 0020-virtio-scsi-Reject-scsi-cd-if-data-plane-enabled-RHE.patch (90%) delete mode 100644 0021-s390x-Enable-KVM-huge-page-backing-support.patch delete mode 100644 0022-s390x-kvm-add-etoken-facility.patch delete mode 100644 0023-s390x-cpumodel-default-enable-bpb-and-ppa15-for-z196.patch delete mode 100644 0024-i386-Fix-arch_query_cpu_model_expansion-leak.patch delete mode 100644 0025-i386-Disable-TOPOEXT-by-default-on-cpu-host.patch delete mode 100644 0026-curl-Make-sslverify-off-disable-host-as-well-as-peer.patch delete mode 100644 0027-migration-postcopy-Clear-have_listen_thread.patch delete mode 100644 0028-migration-cleanup-in-error-paths-in-loadvm.patch delete mode 100644 0029-jobs-change-start-callback-to-run-callback.patch delete mode 100644 0030-jobs-canonize-Error-object.patch delete mode 100644 0031-jobs-add-exit-shim.patch delete mode 100644 0032-block-commit-utilize-job_exit-shim.patch delete mode 100644 0033-block-mirror-utilize-job_exit-shim.patch delete mode 100644 0034-jobs-utilize-job_exit-shim.patch delete mode 100644 0035-block-backup-make-function-variables-consistently-na.patch delete mode 100644 0036-jobs-remove-ret-argument-to-job_completed-privatize-.patch delete mode 100644 0037-jobs-remove-job_defer_to_main_loop.patch delete mode 100644 0038-block-commit-add-block-job-creation-flags.patch delete mode 100644 0039-block-mirror-add-block-job-creation-flags.patch delete mode 100644 0040-block-stream-add-block-job-creation-flags.patch delete mode 100644 0041-block-commit-refactor-commit-to-use-job-callbacks.patch delete mode 100644 0042-block-mirror-don-t-install-backing-chain-on-abort.patch delete mode 100644 0043-block-mirror-conservative-mirror_exit-refactor.patch delete mode 100644 0044-block-stream-refactor-stream-to-use-job-callbacks.patch delete mode 100644 0045-tests-blockjob-replace-Blockjob-with-Job.patch delete mode 100644 0046-tests-test-blockjob-remove-exit-callback.patch delete mode 100644 0047-tests-test-blockjob-txn-move-.exit-to-.clean.patch delete mode 100644 0048-jobs-remove-.exit-callback.patch delete mode 100644 0049-qapi-block-commit-expose-new-job-properties.patch delete mode 100644 0050-qapi-block-mirror-expose-new-job-properties.patch delete mode 100644 0051-qapi-block-stream-expose-new-job-properties.patch delete mode 100644 0052-block-backup-qapi-documentation-fixup.patch delete mode 100644 0053-blockdev-document-transactional-shortcomings.patch delete mode 100644 0054-seccomp-use-SIGSYS-signal-instead-of-killing-the-thr.patch delete mode 100644 0055-seccomp-prefer-SCMP_ACT_KILL_PROCESS-if-available.patch delete mode 100644 0056-seccomp-set-the-seccomp-filter-to-all-threads.patch delete mode 100644 0057-memory-cleanup-side-effects-of-memory_region_init_fo.patch delete mode 100644 0058-mirror-Fail-gracefully-for-source-target.patch delete mode 100644 0059-commit-Add-top-node-base-node-options.patch delete mode 100644 0060-qemu-iotests-Test-commit-with-top-node-base-node.patch delete mode 100644 0061-block-for-jobs-do-not-clear-user_paused-until-after-.patch delete mode 100644 0062-block-iotest-to-catch-abort-on-forced-blockjob-cance.patch delete mode 100644 0063-Revert-hw-acpi-build-build-SRAT-memory-affinity-stru.patch delete mode 100644 0064-aio-posix-Don-t-count-ctx-notifier-as-progress-when-.patch delete mode 100644 0065-aio-Do-aio_notify_accept-only-during-blocking-aio_po.patch delete mode 100644 0066-aio-posix-fix-concurrent-access-to-poll_disable_cnt.patch delete mode 100644 0067-aio-posix-compute-timeout-before-polling.patch delete mode 100644 0068-aio-posix-do-skip-system-call-if-ctx-notifier-pollin.patch delete mode 100644 0069-linux-headers-update.patch delete mode 100644 0070-s390x-cpumodel-Set-up-CPU-model-for-AP-device-suppor.patch delete mode 100644 0071-s390x-kvm-enable-AP-instruction-interpretation-for-g.patch delete mode 100644 0072-s390x-ap-base-Adjunct-Processor-AP-object-model.patch delete mode 100644 0073-s390x-vfio-ap-Introduce-VFIO-AP-device.patch delete mode 100644 0074-s390-doc-detailed-specifications-for-AP-virtualizati.patch delete mode 100644 0075-vnc-call-sasl_server_init-only-when-required.patch delete mode 100644 0076-nbd-server-fix-NBD_CMD_CACHE.patch delete mode 100644 0077-nbd-fix-NBD_FLAG_SEND_CACHE-value.patch delete mode 100644 0078-block-linux-aio-acquire-AioContext-before-qemu_laio_.patch delete mode 100644 0079-util-async-use-qemu_aio_coroutine_enter-in-co_schedu.patch delete mode 100644 0080-job-Fix-nested-aio_poll-hanging-in-job_txn_apply.patch delete mode 100644 0081-job-Fix-missing-locking-due-to-mismerge.patch delete mode 100644 0082-blockjob-Wake-up-BDS-when-job-becomes-idle.patch delete mode 100644 0083-aio-wait-Increase-num_waiters-even-in-home-thread.patch delete mode 100644 0084-test-bdrv-drain-Drain-with-block-jobs-in-an-I-O-thre.patch delete mode 100644 0085-test-blockjob-Acquire-AioContext-around-job_cancel_s.patch delete mode 100644 0086-job-Use-AIO_WAIT_WHILE-in-job_finish_sync.patch delete mode 100644 0087-test-bdrv-drain-Test-AIO_WAIT_WHILE-in-completion-ca.patch delete mode 100644 0088-block-Add-missing-locking-in-bdrv_co_drain_bh_cb.patch delete mode 100644 0089-block-backend-Add-.drained_poll-callback.patch delete mode 100644 0090-block-backend-Fix-potential-double-blk_delete.patch delete mode 100644 0091-block-backend-Decrease-in_flight-only-after-callback.patch delete mode 100644 0092-blockjob-Lie-better-in-child_job_drained_poll.patch delete mode 100644 0093-block-Remove-aio_poll-in-bdrv_drain_poll-variants.patch delete mode 100644 0094-test-bdrv-drain-Test-nested-poll-in-bdrv_drain_poll_.patch delete mode 100644 0095-job-Avoid-deadlocks-in-job_completed_txn_abort.patch delete mode 100644 0096-test-bdrv-drain-AIO_WAIT_WHILE-in-job-.commit-.abort.patch delete mode 100644 0097-test-bdrv-drain-Fix-outdated-comments.patch delete mode 100644 0098-block-Use-a-single-global-AioWait.patch delete mode 100644 0099-test-bdrv-drain-Test-draining-job-source-child-and-p.patch delete mode 100644 0100-block-rbd-pull-out-qemu_rbd_convert_options.patch delete mode 100644 0101-block-rbd-Attempt-to-parse-legacy-filenames.patch delete mode 100644 0102-block-rbd-add-deprecation-documentation-for-filename.patch delete mode 100644 0103-block-rbd-add-iotest-for-rbd-legacy-keyvalue-filenam.patch delete mode 100644 0104-luks-Allow-share-rw-on.patch diff --git a/.gitignore b/.gitignore index caaa10d..220f7bc 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1 @@ -/qemu-3.0.0.tar.xz +/qemu-3.1.0.tar.xz diff --git a/0001-migration-colo.c-Fix-compilation-issue-when-disable-.patch b/0001-migration-colo.c-Fix-compilation-issue-when-disable-.patch new file mode 100644 index 0000000..b2ca136 --- /dev/null +++ b/0001-migration-colo.c-Fix-compilation-issue-when-disable-.patch @@ -0,0 +1,128 @@ +From 5be2fefbc0999ada944c36a865b154d398e16e27 Mon Sep 17 00:00:00 2001 +From: Zhang Chen +Date: Thu, 1 Nov 2018 10:12:26 +0800 +Subject: migration/colo.c: Fix compilation issue when disable replication + +This compilation issue will occur when user use --disable-replication +to config Qemu. + +Reported-by: Thomas Huth +Signed-off-by: Zhang Chen +--- + migration/colo.c | 28 +++++++++++++++++++++++++++- + 1 file changed, 27 insertions(+), 1 deletion(-) + +diff --git a/migration/colo.c b/migration/colo.c +index 956ac23..fcff04c 100644 +--- a/migration/colo.c ++++ b/migration/colo.c +@@ -59,6 +59,8 @@ static bool colo_runstate_is_stopped(void) + + static void secondary_vm_do_failover(void) + { ++/* COLO needs enable block-replication */ ++#ifdef CONFIG_REPLICATION + int old_state; + MigrationIncomingState *mis = migration_incoming_get_current(); + Error *local_err = NULL; +@@ -121,10 +123,14 @@ static void secondary_vm_do_failover(void) + if (mis->migration_incoming_co) { + qemu_coroutine_enter(mis->migration_incoming_co); + } ++#else ++ abort(); ++#endif + } + + static void primary_vm_do_failover(void) + { ++#ifdef CONFIG_REPLICATION + MigrationState *s = migrate_get_current(); + int old_state; + Error *local_err = NULL; +@@ -165,6 +171,9 @@ static void primary_vm_do_failover(void) + + /* Notify COLO thread that failover work is finished */ + qemu_sem_post(&s->colo_exit_sem); ++#else ++ abort(); ++#endif + } + + COLOMode get_colo_mode(void) +@@ -415,11 +424,16 @@ static int colo_do_checkpoint_transaction(MigrationState *s, + /* Disable block migration */ + migrate_set_block_enabled(false, &local_err); + qemu_mutex_lock_iothread(); ++ ++#ifdef CONFIG_REPLICATION + replication_do_checkpoint_all(&local_err); + if (local_err) { + qemu_mutex_unlock_iothread(); + goto out; + } ++#else ++ abort(); ++#endif + + colo_send_message(s->to_dst_file, COLO_MESSAGE_VMSTATE_SEND, &local_err); + if (local_err) { +@@ -523,11 +537,15 @@ static void colo_process_checkpoint(MigrationState *s) + object_unref(OBJECT(bioc)); + + qemu_mutex_lock_iothread(); ++#ifdef CONFIG_REPLICATION + replication_start_all(REPLICATION_MODE_PRIMARY, &local_err); + if (local_err) { + qemu_mutex_unlock_iothread(); + goto out; + } ++#else ++ abort(); ++#endif + + vm_start(); + qemu_mutex_unlock_iothread(); +@@ -690,11 +708,15 @@ void *colo_process_incoming_thread(void *opaque) + object_unref(OBJECT(bioc)); + + qemu_mutex_lock_iothread(); ++#ifdef CONFIG_REPLICATION + replication_start_all(REPLICATION_MODE_SECONDARY, &local_err); + if (local_err) { + qemu_mutex_unlock_iothread(); + goto out; + } ++#else ++ abort(); ++#endif + vm_start(); + trace_colo_vm_state_change("stop", "run"); + qemu_mutex_unlock_iothread(); +@@ -785,18 +807,22 @@ void *colo_process_incoming_thread(void *opaque) + goto out; + } + ++#ifdef CONFIG_REPLICATION + replication_get_error_all(&local_err); + if (local_err) { + qemu_mutex_unlock_iothread(); + goto out; + } ++ + /* discard colo disk buffer */ + replication_do_checkpoint_all(&local_err); + if (local_err) { + qemu_mutex_unlock_iothread(); + goto out; + } +- ++#else ++ abort(); ++#endif + /* Notify all filters of all NIC to do checkpoint */ + colo_notify_filters_event(COLO_EVENT_CHECKPOINT, &local_err); + +-- +1.8.3.1 + diff --git a/0004-Initial-redhat-build.patch b/0005-Initial-redhat-build.patch similarity index 83% rename from 0004-Initial-redhat-build.patch rename to 0005-Initial-redhat-build.patch index 06670c5..2e1f16c 100644 --- a/0004-Initial-redhat-build.patch +++ b/0005-Initial-redhat-build.patch @@ -1,41 +1,39 @@ -From a1f1313c0c96b2a159647aabc6a4b0f3a3f4424a Mon Sep 17 00:00:00 2001 +From f0cd0ed26f3a3ae0610fad93c9dde26b54910abb Mon Sep 17 00:00:00 2001 From: Miroslav Rezanina -Date: Thu, 8 Nov 2018 11:17:08 +0100 +Date: Fri, 12 Oct 2018 07:31:11 +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 -- Use "/share/qemu-kvm" as SHARE_SUFFIX - - We reconfigured our share to qemu-kvm to be consistent with used name + - 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 + - Use "/share/qemu-kvm" as SHARE_SUFFIX + - We reconfigured our share to qemu-kvm to be consistent with used name -This commit is synchronized with qemu-kvm-2.12.0-42.el8 build. - -Signed-off-by: Miroslav Rezanina +This rebase includes changes up to qemu-kvm-2.12.0-42.el8 --- Makefile | 3 +- block/Makefile.objs | 2 +- block/vxhs.c | 119 ++- - configure | 40 +- + configure | 33 +- os-posix.c | 2 +- redhat/Makefile | 82 ++ redhat/Makefile.common | 49 ++ - redhat/qemu-kvm.spec.template | 1721 +++++++++++++++++++++++++++++++++++++++++ + redhat/qemu-kvm.spec.template | 1723 +++++++++++++++++++++++++++++++++++++++++ ui/vnc.c | 2 +- - 9 files changed, 1972 insertions(+), 48 deletions(-) + 9 files changed, 1972 insertions(+), 43 deletions(-) create mode 100644 redhat/Makefile create mode 100644 redhat/Makefile.common create mode 100644 redhat/qemu-kvm.spec.template diff --git a/Makefile b/Makefile -index 2da686b..eb4c57a 100644 +index f294718..152821a 100644 --- a/Makefile +++ b/Makefile -@@ -501,6 +501,7 @@ CAP_CFLAGS += -DCAPSTONE_HAS_ARM +@@ -503,6 +503,7 @@ CAP_CFLAGS += -DCAPSTONE_HAS_ARM CAP_CFLAGS += -DCAPSTONE_HAS_ARM64 CAP_CFLAGS += -DCAPSTONE_HAS_POWERPC CAP_CFLAGS += -DCAPSTONE_HAS_X86 @@ -43,7 +41,7 @@ index 2da686b..eb4c57a 100644 subdir-capstone: .git-submodule-status $(call quiet-command,$(MAKE) -C $(SRC_PATH)/capstone CAPSTONE_SHARED=no BUILDDIR="$(BUILD_DIR)/capstone" CC="$(CC)" AR="$(AR)" LD="$(LD)" RANLIB="$(RANLIB)" CFLAGS="$(CAP_CFLAGS)" $(SUBDIR_MAKEFLAGS) $(BUILD_DIR)/capstone/$(LIBCAPSTONE)) -@@ -819,7 +820,7 @@ install-doc: $(DOCS) +@@ -830,7 +831,7 @@ install-doc: $(DOCS) $(INSTALL_DATA) docs/interop/qemu-qmp-ref.txt "$(DESTDIR)$(qemu_docdir)" ifdef CONFIG_POSIX $(INSTALL_DIR) "$(DESTDIR)$(mandir)/man1" @@ -53,10 +51,10 @@ index 2da686b..eb4c57a 100644 $(INSTALL_DATA) docs/interop/qemu-qmp-ref.7 "$(DESTDIR)$(mandir)/man7" $(INSTALL_DATA) docs/qemu-block-drivers.7 "$(DESTDIR)$(mandir)/man7" diff --git a/block/Makefile.objs b/block/Makefile.objs -index c8337bf..cd1e309 100644 +index 46d585c..a244100 100644 --- a/block/Makefile.objs +++ b/block/Makefile.objs -@@ -21,7 +21,7 @@ block-obj-$(CONFIG_LIBNFS) += nfs.o +@@ -30,7 +30,7 @@ block-obj-$(CONFIG_LIBNFS) += nfs.o block-obj-$(CONFIG_CURL) += curl.o block-obj-$(CONFIG_RBD) += rbd.o block-obj-$(CONFIG_GLUSTERFS) += gluster.o @@ -257,26 +255,10 @@ index 0cb0a00..9164b3e 100644 trace_vxhs_get_vdisk_stat_err(s->vdisk_guid, ret, errno); return -EIO; diff --git a/configure b/configure -index 2a7796e..0a27137 100755 +index 0a3c6a7..98b05c5 100755 --- a/configure +++ b/configure -@@ -2216,13 +2216,10 @@ fi - ########################################## - # libseccomp check - -+libseccomp_minver="2.2.0" - if test "$seccomp" != "no" ; then - case "$cpu" in -- i386|x86_64) -- libseccomp_minver="2.1.0" -- ;; -- mips) -- libseccomp_minver="2.2.0" -+ i386|x86_64|mips) - ;; - arm|aarch64) - libseccomp_minver="2.2.3" -@@ -3460,7 +3457,7 @@ fi +@@ -3459,7 +3459,7 @@ fi glib_req_ver=2.40 glib_modules=gthread-2.0 @@ -285,7 +267,7 @@ index 2a7796e..0a27137 100755 glib_modules="$glib_modules gmodule-export-2.0" fi -@@ -5435,33 +5432,6 @@ if compile_prog "" "" ; then +@@ -5494,33 +5494,6 @@ if compile_prog "" "" ; then fi ########################################## @@ -319,7 +301,7 @@ index 2a7796e..0a27137 100755 # check for _Static_assert() have_static_assert=no -@@ -6759,8 +6729,8 @@ if test "$pthread_setname_np" = "yes" ; then +@@ -6854,8 +6827,8 @@ if test "$pthread_setname_np" = "yes" ; then fi if test "$vxhs" = "yes" ; then @@ -329,9 +311,9 @@ index 2a7796e..0a27137 100755 + echo "VXHS_LIBS= -lssl" >> $config_host_mak fi - if test "$tcg_interpreter" = "yes"; then + if test "$libpmem" = "yes" ; then diff --git a/os-posix.c b/os-posix.c -index 9ce6f74..c4cfd0d 100644 +index 4bd80e4..ca13206 100644 --- a/os-posix.c +++ b/os-posix.c @@ -82,7 +82,7 @@ void os_setup_signal_handling(void) @@ -344,18 +326,18 @@ index 9ce6f74..c4cfd0d 100644 char *os_find_datadir(void) { diff --git a/ui/vnc.c b/ui/vnc.c -index 3596932..050c421 100644 +index 0c1b477..d7903a7 100644 --- a/ui/vnc.c +++ b/ui/vnc.c -@@ -4054,7 +4054,7 @@ void vnc_display_open(const char *id, Error **errp) - trace_vnc_auth_init(vd, 1, vd->ws_auth, vd->ws_subauth); +@@ -3962,7 +3962,7 @@ void vnc_display_open(const char *id, Error **errp) #ifdef CONFIG_VNC_SASL -- if ((saslErr = sasl_server_init(NULL, "qemu")) != SASL_OK) { -+ if ((saslErr = sasl_server_init(NULL, "qemu-kvm")) != SASL_OK) { - error_setg(errp, "Failed to initialize SASL auth: %s", - sasl_errstring(saslErr, NULL, NULL)); - goto fail; + if (sasl) { +- 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", -- 1.8.3.1 diff --git a/0005-Enable-disable-devices-for-RHEL-7.patch b/0006-Enable-disable-devices-for-RHEL.patch similarity index 74% rename from 0005-Enable-disable-devices-for-RHEL-7.patch rename to 0006-Enable-disable-devices-for-RHEL.patch index ec26beb..6a367f2 100644 --- a/0005-Enable-disable-devices-for-RHEL-7.patch +++ b/0006-Enable-disable-devices-for-RHEL.patch @@ -1,88 +1,68 @@ -From b4a5b95153ca86eba72ff4a368a24ac31b77bbe5 Mon Sep 17 00:00:00 2001 +From 38eba79aaa865ffa3e85bfa56e644e0846731744 Mon Sep 17 00:00:00 2001 From: Miroslav Rezanina Date: Mon, 11 Jan 2016 11:53:33 +0100 -Subject: Enable/disable devices for RHEL 7 +Subject: Enable/disable devices for RHEL -This commit adds all changes related to changes in supported devices -up to qemu-kvm-2.12.0-42.el8. +This commit adds all changes related to changes in supported devices. Signed-off-by: Miroslav Rezanina -Rebase notes (3.0.0): -- Added CONFIG_SCSI -- Enabled SMMUV3 -- Using CONFIG_VIRTIO_CRYPTO to remove crypto -- Added CONFIG_VIRTIO_MMIO for aarch64 -- Disabled arvm7v.c compile -- Introduced virtio.mak -- Disabled make check -- Removed test changes (moved to next patch) - -Merged patches (3.0.0): -- a2721f6 Re-enable disabled Hyper-V enlightenments -- c670fa1 Disable aarch64 devices reappeared after 2.12 rebase -- 3ebdb95 Disable split-irq device -- d68f80c Disable AT24Cx i2c eeprom -- 3f953e9 Disable CAN bus devices -- 284c393 Disable new superio devices -- 747643c Disable new pvrdma device -- 0d4f38c s390x: Re-enable CONFIG_TERMINAL3270 -- 0f725e9 AArch64: Enable CONFIG_FW_CFG_DMA for aarch64 -- 67c5a8c Disable ivshmem +Rebase notes (qemu 3.1.0) +- spapr_rng disabled in default_config +- new hyperv.mak in default configs +- Move changes from x86_64-softmmu.mak to i386-softmmu.mak +- Added CONFIG_VIRTIO_MMIO to aarch64-softmmu.mak --- - default-configs/aarch64-softmmu.mak | 37 ++++++++++++++++++++++++++++-------- - default-configs/pci.mak | 38 ++++++++++++++++++------------------- - default-configs/ppc64-softmmu.mak | 25 ++++++++++++++++++------ + default-configs/aarch64-softmmu.mak | 40 +++++++++++++++++++++++++++---------- + default-configs/hyperv.mak | 2 +- + default-configs/i386-softmmu.mak | 26 ++++++++++++------------ + default-configs/pci.mak | 38 +++++++++++++++++------------------ + default-configs/ppc64-softmmu.mak | 28 +++++++++++++++++++------- default-configs/s390x-softmmu.mak | 5 +++-- default-configs/sound.mak | 8 ++++---- - default-configs/usb.mak | 14 +++++++------- + default-configs/usb.mak | 14 ++++++------- default-configs/virtio.mak | 5 ++--- - default-configs/x86_64-softmmu.mak | 28 +++++++++++++-------------- hw/acpi/ich9.c | 4 ++-- hw/arm/Makefile.objs | 2 +- hw/block/fdc.c | 1 + hw/char/serial-pci.c | 4 ++++ - hw/core/Makefile.objs | 9 +++++---- - hw/display/cirrus_vga.c | 2 ++ + hw/core/Makefile.objs | 10 ++++++---- + hw/display/cirrus_vga_isa.c | 2 ++ hw/i386/pc.c | 2 ++ hw/ide/piix.c | 5 ++++- hw/ide/via.c | 2 ++ hw/input/pckbd.c | 2 ++ hw/isa/Makefile.objs | 2 +- hw/misc/Makefile.objs | 2 +- - hw/misc/ivshmem.c | 11 +++++++++++ + hw/misc/ivshmem.c | 11 ++++++++++ hw/net/e1000.c | 2 ++ - hw/nvram/Makefile.objs | 2 +- hw/pci-host/piix.c | 4 ++++ - hw/ppc/Makefile.objs | 2 +- - hw/ppc/spapr.c | 3 ++- hw/ppc/spapr_cpu_core.c | 2 ++ hw/rdma/Makefile.objs | 3 ++- - hw/s390x/virtio-ccw.c | 8 ++++++++ hw/usb/ccid-card-emulated.c | 2 ++ - hw/vfio/Makefile.objs | 1 - + hw/vfio/Makefile.objs | 3 --- hw/vfio/pci-quirks.c | 5 +++++ hw/virtio/virtio-pci.c | 8 ++++---- qemu-options.hx | 5 ----- redhat/qemu-kvm.spec.template | 2 +- stubs/Makefile.objs | 1 + - stubs/ide-isa.c | 13 +++++++++++++ + stubs/ide-isa.c | 13 ++++++++++++ target/arm/cpu.c | 4 +++- - target/i386/cpu.c | 35 ++++++++++++++++++++++++++-------- - target/ppc/cpu-models.c | 17 ++++++++++++++++- + target/i386/cpu.c | 35 ++++++++++++++++++++++++-------- + target/ppc/cpu-models.c | 12 +++++++++++ target/s390x/cpu_models.c | 3 +++ target/s390x/kvm.c | 8 ++++++++ vl.c | 2 +- - 43 files changed, 241 insertions(+), 99 deletions(-) + 40 files changed, 229 insertions(+), 100 deletions(-) create mode 100644 stubs/ide-isa.c diff --git a/default-configs/aarch64-softmmu.mak b/default-configs/aarch64-softmmu.mak -index 6f790f0..3f27540 100644 +index 4ea9add..221e266 100644 --- a/default-configs/aarch64-softmmu.mak +++ b/default-configs/aarch64-softmmu.mak -@@ -1,11 +1,32 @@ +@@ -1,12 +1,32 @@ # Default configuration for aarch64-softmmu - +- -# We support all the 32 bit boards so need all their config -include arm-softmmu.mak - @@ -91,12 +71,14 @@ index 6f790f0..3f27540 100644 -CONFIG_DPCD=y -CONFIG_XLNX_ZYNQMP=y -CONFIG_XLNX_ZYNQMP_ARM=y - CONFIG_ARM_SMMUV3=y +-CONFIG_XLNX_VERSAL=y +# CONFIG_AUX=y +# CONFIG_DDC=y +# CONFIG_DPCD=y +# CONFIG_XLNX_ZYNQMP=y +# CONFIG_XLNX_ZYNQMP_ARM=y ++# CONFIG_XLNX_VERSAL=y + CONFIG_ARM_SMMUV3=y +CONFIG_PCI=y +CONFIG_PCI_TESTDEV=y +CONFIG_VIRTIO_PCI=y @@ -121,8 +103,71 @@ index 6f790f0..3f27540 100644 +CONFIG_USB=y +CONFIG_I2C=y +CONFIG_FW_CFG_DMA=y +diff --git a/default-configs/hyperv.mak b/default-configs/hyperv.mak +index 5d0d9fd..fce5d91 100644 +--- a/default-configs/hyperv.mak ++++ b/default-configs/hyperv.mak +@@ -1,2 +1,2 @@ + CONFIG_HYPERV=$(CONFIG_KVM) +-CONFIG_HYPERV_TESTDEV=y ++#CONFIG_HYPERV_TESTDEV=y +diff --git a/default-configs/i386-softmmu.mak b/default-configs/i386-softmmu.mak +index 64c998c..faea212 100644 +--- a/default-configs/i386-softmmu.mak ++++ b/default-configs/i386-softmmu.mak +@@ -5,20 +5,20 @@ include sound.mak + include usb.mak + include hyperv.mak + CONFIG_QXL=$(CONFIG_SPICE) +-CONFIG_VGA_ISA=y ++#CONFIG_VGA_ISA=y + CONFIG_VGA_CIRRUS=y +-CONFIG_VMWARE_VGA=y +-CONFIG_VMXNET3_PCI=y ++#CONFIG_VMWARE_VGA=y ++#CONFIG_VMXNET3_PCI=y + CONFIG_VIRTIO_VGA=y + CONFIG_VMMOUSE=y + CONFIG_IPMI=y +-CONFIG_IPMI_LOCAL=y +-CONFIG_IPMI_EXTERN=y +-CONFIG_ISA_IPMI_KCS=y +-CONFIG_ISA_IPMI_BT=y ++#CONFIG_IPMI_LOCAL=y ++#CONFIG_IPMI_EXTERN=y ++#CONFIG_ISA_IPMI_KCS=y ++#CONFIG_ISA_IPMI_BT=y + CONFIG_SERIAL=y + CONFIG_SERIAL_ISA=y +-CONFIG_PARALLEL=y ++#CONFIG_PARALLEL=y + CONFIG_I8254=y + CONFIG_PCSPK=y + CONFIG_PCKBD=y +@@ -30,11 +30,11 @@ CONFIG_ACPI_MEMORY_HOTPLUG=y + CONFIG_ACPI_CPU_HOTPLUG=y + CONFIG_APM=y + CONFIG_I8257=y +-CONFIG_IDE_ISA=y ++#CONFIG_IDE_ISA=y + CONFIG_IDE_PIIX=y +-CONFIG_NE2000_ISA=y +-CONFIG_HPET=y +-CONFIG_APPLESMC=y ++#CONFIG_NE2000_ISA=y ++#CONFIG_HPET=y ++#CONFIG_APPLESMC=y + CONFIG_I8259=y + CONFIG_PFLASH_CFI01=y + CONFIG_TPM_TIS=$(CONFIG_TPM) +@@ -66,4 +66,4 @@ CONFIG_FW_CFG_DMA=y + CONFIG_I2C=y + CONFIG_SEV=$(CONFIG_KVM) + CONFIG_VTD=y +-CONFIG_AMD_IOMMU=y ++#CONFIG_AMD_IOMMU=y diff --git a/default-configs/pci.mak b/default-configs/pci.mak -index de53d20..70e40ad 100644 +index 6c7be12..292b3f2 100644 --- a/default-configs/pci.mak +++ b/default-configs/pci.mak @@ -4,22 +4,22 @@ CONFIG_ISA_BUS=y @@ -158,7 +203,7 @@ index de53d20..70e40ad 100644 CONFIG_RTL8139_PCI=y CONFIG_E1000_PCI=y CONFIG_E1000E_PCI=y -@@ -27,22 +27,22 @@ CONFIG_IDE_CORE=y +@@ -27,23 +27,23 @@ CONFIG_IDE_CORE=y CONFIG_IDE_QDEV=y CONFIG_IDE_PCI=y CONFIG_AHCI=y @@ -186,19 +231,21 @@ index de53d20..70e40ad 100644 CONFIG_EDU=y CONFIG_VGA=y CONFIG_VGA_PCI=y + CONFIG_BOCHS_DISPLAY=y -CONFIG_IVSHMEM_DEVICE=$(CONFIG_IVSHMEM) -CONFIG_ROCKER=y +#CONFIG_IVSHMEM_DEVICE=$(CONFIG_IVSHMEM) +#CONFIG_ROCKER=y diff --git a/default-configs/ppc64-softmmu.mak b/default-configs/ppc64-softmmu.mak -index b94af6c..30ca76d 100644 +index aec2855..a492986 100644 --- a/default-configs/ppc64-softmmu.mak +++ b/default-configs/ppc64-softmmu.mak -@@ -1,14 +1,27 @@ +@@ -1,14 +1,28 @@ # Default configuration for ppc64-softmmu -# Include all 32-bit boards -include ppc-softmmu.mak ++include sound.mak +include usb.mak +include virtio.mak + @@ -228,11 +275,17 @@ index b94af6c..30ca76d 100644 # For pSeries CONFIG_PSERIES=y +@@ -18,4 +32,4 @@ CONFIG_XICS_SPAPR=$(CONFIG_PSERIES) + CONFIG_XICS_KVM=$(call land,$(CONFIG_PSERIES),$(CONFIG_KVM)) + CONFIG_MEM_DEVICE=y + CONFIG_DIMM=y +-CONFIG_SPAPR_RNG=y ++#CONFIG_SPAPR_RNG=y diff --git a/default-configs/s390x-softmmu.mak b/default-configs/s390x-softmmu.mak -index d6b67d5..8b2db3e 100644 +index 5eef375..49a59fc 100644 --- a/default-configs/s390x-softmmu.mak +++ b/default-configs/s390x-softmmu.mak -@@ -1,9 +1,10 @@ +@@ -1,10 +1,11 @@ CONFIG_PCI=y -CONFIG_VIRTIO_PCI=$(CONFIG_PCI) +#CONFIG_VIRTIO_PCI=$(CONFIG_PCI) @@ -245,6 +298,7 @@ index d6b67d5..8b2db3e 100644 +# Disabled for Red Hat Enterprise Linux: +# CONFIG_VFIO_CCW=$(CONFIG_LINUX) CONFIG_WDT_DIAG288=y + CONFIG_VFIO_AP=$(CONFIG_LINUX) diff --git a/default-configs/sound.mak b/default-configs/sound.mak index 4f22c34..1bead9b 100644 --- a/default-configs/sound.mak @@ -298,69 +352,6 @@ index 1304849..6330e6b 100644 CONFIG_VIRTIO_GPU=y CONFIG_VIRTIO_INPUT=y CONFIG_VIRTIO_NET=y -diff --git a/default-configs/x86_64-softmmu.mak b/default-configs/x86_64-softmmu.mak -index 0390b43..613fc50 100644 ---- a/default-configs/x86_64-softmmu.mak -+++ b/default-configs/x86_64-softmmu.mak -@@ -4,20 +4,20 @@ include pci.mak - include sound.mak - include usb.mak - CONFIG_QXL=$(CONFIG_SPICE) --CONFIG_VGA_ISA=y -+#CONFIG_VGA_ISA=y - CONFIG_VGA_CIRRUS=y --CONFIG_VMWARE_VGA=y --CONFIG_VMXNET3_PCI=y -+#CONFIG_VMWARE_VGA=y -+#CONFIG_VMXNET3_PCI=y - CONFIG_VIRTIO_VGA=y - CONFIG_VMMOUSE=y - CONFIG_IPMI=y --CONFIG_IPMI_LOCAL=y --CONFIG_IPMI_EXTERN=y --CONFIG_ISA_IPMI_KCS=y --CONFIG_ISA_IPMI_BT=y -+#CONFIG_IPMI_LOCAL=y -+#CONFIG_IPMI_EXTERN=y -+#CONFIG_ISA_IPMI_KCS=y -+#CONFIG_ISA_IPMI_BT=y - CONFIG_SERIAL=y - CONFIG_SERIAL_ISA=y --CONFIG_PARALLEL=y -+#CONFIG_PARALLEL=y - CONFIG_I8254=y - CONFIG_PCSPK=y - CONFIG_PCKBD=y -@@ -29,11 +29,11 @@ CONFIG_ACPI_MEMORY_HOTPLUG=y - CONFIG_ACPI_CPU_HOTPLUG=y - CONFIG_APM=y - CONFIG_I8257=y --CONFIG_IDE_ISA=y -+#CONFIG_IDE_ISA=y - CONFIG_IDE_PIIX=y --CONFIG_NE2000_ISA=y --CONFIG_HPET=y --CONFIG_APPLESMC=y -+#CONFIG_NE2000_ISA=y -+#CONFIG_HPET=y -+#CONFIG_APPLESMC=y - CONFIG_I8259=y - CONFIG_PFLASH_CFI01=y - CONFIG_TPM_TIS=$(CONFIG_TPM) -@@ -58,11 +58,11 @@ CONFIG_XIO3130=y - CONFIG_IOH3420=y - CONFIG_I82801B11=y - CONFIG_SMBIOS=y --CONFIG_HYPERV_TESTDEV=$(CONFIG_KVM) -+#CONFIG_HYPERV_TESTDEV=$(CONFIG_KVM) - CONFIG_PXB=y - CONFIG_ACPI_VMGENID=y - CONFIG_FW_CFG_DMA=y - CONFIG_I2C=y - CONFIG_SEV=$(CONFIG_KVM) - CONFIG_VTD=y --CONFIG_AMD_IOMMU=y -+#CONFIG_AMD_IOMMU=y diff --git a/hw/acpi/ich9.c b/hw/acpi/ich9.c index c5d8646..a4e87b8 100644 --- a/hw/acpi/ich9.c @@ -377,7 +368,7 @@ index c5d8646..a4e87b8 100644 object_property_add_uint32_ptr(obj, ACPI_PM_PROP_PM_IO_BASE, diff --git a/hw/arm/Makefile.objs b/hw/arm/Makefile.objs -index d51fcec..52ec91b 100644 +index 50c7b4a..149848e 100644 --- a/hw/arm/Makefile.objs +++ b/hw/arm/Makefile.objs @@ -16,7 +16,7 @@ obj-$(CONFIG_STRONGARM) += collie.o @@ -390,7 +381,7 @@ index d51fcec..52ec91b 100644 obj-$(CONFIG_PXA2XX) += pxa2xx.o pxa2xx_gpio.o pxa2xx_pic.o obj-$(CONFIG_DIGIC) += digic.o diff --git a/hw/block/fdc.c b/hw/block/fdc.c -index 2e9c1e1..f284df7 100644 +index 6f19f12..56b7aeb 100644 --- a/hw/block/fdc.c +++ b/hw/block/fdc.c @@ -599,6 +599,7 @@ static void floppy_drive_class_init(ObjectClass *klass, void *data) @@ -424,10 +415,10 @@ index cb0d04c..d426982 100644 static const TypeInfo serial_pci_info = { diff --git a/hw/core/Makefile.objs b/hw/core/Makefile.objs -index eb88ca9..e967fb2 100644 +index a799c83..1c7ba0b 100644 --- a/hw/core/Makefile.objs +++ b/hw/core/Makefile.objs -@@ -16,10 +16,11 @@ common-obj-$(CONFIG_SOFTMMU) += machine.o +@@ -16,9 +16,11 @@ common-obj-$(CONFIG_SOFTMMU) += machine.o common-obj-$(CONFIG_SOFTMMU) += loader.o common-obj-$(CONFIG_FITLOADER) += loader-fit.o common-obj-$(CONFIG_SOFTMMU) += qdev-properties-system.o @@ -435,19 +426,19 @@ index eb88ca9..e967fb2 100644 -common-obj-$(CONFIG_SOFTMMU) += or-irq.o -common-obj-$(CONFIG_SOFTMMU) += split-irq.o +# Disabled in Red Hat Enterprise Linux -+# common-obj-$(CONFIG_SOFTMMU) += register.o -+# obj-$(CONFIG_SOFTMMU) += generic-loader.o -+# common-obj-$(CONFIG_SOFTMMU) += or-irq.o ++#common-obj-$(CONFIG_SOFTMMU) += register.o ++#obj-$(CONFIG_SOFTMMU) += generic-loader.o ++#common-obj-$(CONFIG_SOFTMMU) += or-irq.o +#common-obj-$(CONFIG_SOFTMMU) += split-irq.o common-obj-$(CONFIG_PLATFORM_BUS) += platform-bus.o - --obj-$(CONFIG_SOFTMMU) += generic-loader.o - obj-$(CONFIG_SOFTMMU) += null-machine.o -diff --git a/hw/display/cirrus_vga.c b/hw/display/cirrus_vga.c -index 7583b18..9fd5665 100644 ---- a/hw/display/cirrus_vga.c -+++ b/hw/display/cirrus_vga.c -@@ -3075,6 +3075,8 @@ static void isa_cirrus_vga_class_init(ObjectClass *klass, void *data) +-common-obj-$(CONFIG_SOFTMMU) += generic-loader.o ++#common-obj-$(CONFIG_SOFTMMU) += generic-loader.o + common-obj-$(CONFIG_SOFTMMU) += null-machine.o +diff --git a/hw/display/cirrus_vga_isa.c b/hw/display/cirrus_vga_isa.c +index fa10b74..1cb607d 100644 +--- a/hw/display/cirrus_vga_isa.c ++++ b/hw/display/cirrus_vga_isa.c +@@ -81,6 +81,8 @@ static void isa_cirrus_vga_class_init(ObjectClass *klass, void *data) dc->realize = isa_cirrus_vga_realizefn; dc->props = isa_cirrus_vga_properties; set_bit(DEVICE_CATEGORY_DISPLAY, dc->categories); @@ -457,10 +448,10 @@ index 7583b18..9fd5665 100644 static const TypeInfo isa_cirrus_vga_info = { diff --git a/hw/i386/pc.c b/hw/i386/pc.c -index 83a4444..11c287e 100644 +index f095725..567439e 100644 --- a/hw/i386/pc.c +++ b/hw/i386/pc.c -@@ -1528,7 +1528,9 @@ static void pc_superio_init(ISABus *isa_bus, bool create_fdctrl, bool no_vmport) +@@ -1533,7 +1533,9 @@ static void pc_superio_init(ISABus *isa_bus, bool create_fdctrl, bool no_vmport) ISADevice *i8042, *port92, *vmmouse; serial_hds_isa_init(isa_bus, 0, MAX_ISA_SERIAL_PORTS); @@ -520,18 +511,18 @@ index 07c8801..c27a0f8 100644 static const TypeInfo i8042_info = { diff --git a/hw/isa/Makefile.objs b/hw/isa/Makefile.objs -index 83e06f6..7de4f44 100644 +index 9e106df..0828964 100644 --- a/hw/isa/Makefile.objs +++ b/hw/isa/Makefile.objs @@ -1,5 +1,5 @@ common-obj-$(CONFIG_ISA_BUS) += isa-bus.o --common-obj-$(CONFIG_ISA_BUS) += isa-superio.o smc37c669-superio.o -+#common-obj-$(CONFIG_ISA_BUS) += isa-superio.o smc37c669-superio.o +-common-obj-$(CONFIG_ISA_BUS) += isa-superio.o ++#common-obj-$(CONFIG_ISA_BUS) += isa-superio.o common-obj-$(CONFIG_APM) += apm.o common-obj-$(CONFIG_I82378) += i82378.o common-obj-$(CONFIG_PC87312) += pc87312.o diff --git a/hw/misc/Makefile.objs b/hw/misc/Makefile.objs -index 9350900..9c2c404 100644 +index 680350b..ed543a6 100644 --- a/hw/misc/Makefile.objs +++ b/hw/misc/Makefile.objs @@ -9,7 +9,7 @@ common-obj-$(CONFIG_PCI_TESTDEV) += pci-testdev.o @@ -544,7 +535,7 @@ index 9350900..9c2c404 100644 # ARM devices diff --git a/hw/misc/ivshmem.c b/hw/misc/ivshmem.c -index 6febbab..0786fb9 100644 +index ecfd10a..8059563 100644 --- a/hw/misc/ivshmem.c +++ b/hw/misc/ivshmem.c @@ -893,6 +893,13 @@ static void ivshmem_common_realize(PCIDevice *dev, Error **errp) @@ -561,7 +552,7 @@ index 6febbab..0786fb9 100644 pci_conf = dev->config; pci_conf[PCI_COMMAND] = PCI_COMMAND_IO | PCI_COMMAND_MEMORY; -@@ -1183,6 +1190,8 @@ static void ivshmem_doorbell_class_init(ObjectClass *klass, void *data) +@@ -1179,6 +1186,8 @@ static void ivshmem_doorbell_class_init(ObjectClass *klass, void *data) k->realize = ivshmem_doorbell_realize; dc->props = ivshmem_doorbell_properties; dc->vmsd = &ivshmem_doorbell_vmsd; @@ -570,7 +561,7 @@ index 6febbab..0786fb9 100644 } static const TypeInfo ivshmem_doorbell_info = { -@@ -1352,6 +1361,8 @@ static void ivshmem_class_init(ObjectClass *klass, void *data) +@@ -1349,6 +1358,8 @@ static void ivshmem_class_init(ObjectClass *klass, void *data) dc->desc = "Inter-VM shared memory (legacy)"; dc->props = ivshmem_properties; dc->vmsd = &ivshmem_vmsd; @@ -580,10 +571,10 @@ index 6febbab..0786fb9 100644 static const TypeInfo ivshmem_info = { diff --git a/hw/net/e1000.c b/hw/net/e1000.c -index 13a9494..742cd0a 100644 +index 5e144cb..2e07880 100644 --- a/hw/net/e1000.c +++ b/hw/net/e1000.c -@@ -1768,6 +1768,7 @@ static const E1000Info e1000_devices[] = { +@@ -1778,6 +1778,7 @@ static const E1000Info e1000_devices[] = { .revision = 0x03, .phy_id2 = E1000_PHY_ID2_8254xx_DEFAULT, }, @@ -591,7 +582,7 @@ index 13a9494..742cd0a 100644 { .name = "e1000-82544gc", .device_id = E1000_DEV_ID_82544GC_COPPER, -@@ -1780,6 +1781,7 @@ static const E1000Info e1000_devices[] = { +@@ -1790,6 +1791,7 @@ static const E1000Info e1000_devices[] = { .revision = 0x03, .phy_id2 = E1000_PHY_ID2_8254xx_DEFAULT, }, @@ -599,23 +590,11 @@ index 13a9494..742cd0a 100644 }; static void e1000_register_types(void) -diff --git a/hw/nvram/Makefile.objs b/hw/nvram/Makefile.objs -index a912d25..cbc8bba 100644 ---- a/hw/nvram/Makefile.objs -+++ b/hw/nvram/Makefile.objs -@@ -1,6 +1,6 @@ - common-obj-$(CONFIG_DS1225Y) += ds1225y.o - common-obj-y += eeprom93xx.o --common-obj-$(CONFIG_I2C) += eeprom_at24c.o -+#common-obj-$(CONFIG_I2C) += eeprom_at24c.o - common-obj-y += fw_cfg.o - common-obj-y += chrp_nvram.o - common-obj-$(CONFIG_MAC_NVRAM) += mac_nvram.o diff --git a/hw/pci-host/piix.c b/hw/pci-host/piix.c -index 0e60834..3ce4b14 100644 +index d9c70f7..f294fbc 100644 --- a/hw/pci-host/piix.c +++ b/hw/pci-host/piix.c -@@ -787,6 +787,7 @@ static const TypeInfo i440fx_info = { +@@ -801,6 +801,7 @@ static const TypeInfo i440fx_info = { }, }; @@ -623,7 +602,7 @@ index 0e60834..3ce4b14 100644 /* IGD Passthrough Host Bridge. */ typedef struct { uint8_t offset; -@@ -870,6 +871,7 @@ static const TypeInfo igd_passthrough_i440fx_info = { +@@ -884,6 +885,7 @@ static const TypeInfo igd_passthrough_i440fx_info = { .instance_size = sizeof(PCII440FXState), .class_init = igd_passthrough_i440fx_class_init, }; @@ -631,7 +610,7 @@ index 0e60834..3ce4b14 100644 static const char *i440fx_pcihost_root_bus_path(PCIHostState *host_bridge, PCIBus *rootbus) -@@ -915,7 +917,9 @@ static const TypeInfo i440fx_pcihost_info = { +@@ -929,7 +931,9 @@ static const TypeInfo i440fx_pcihost_info = { static void i440fx_register_types(void) { type_register_static(&i440fx_info); @@ -641,45 +620,11 @@ index 0e60834..3ce4b14 100644 type_register_static(&piix3_pci_type_info); type_register_static(&piix3_info); type_register_static(&piix3_xen_info); -diff --git a/hw/ppc/Makefile.objs b/hw/ppc/Makefile.objs -index bcab632..70e8780 100644 ---- a/hw/ppc/Makefile.objs -+++ b/hw/ppc/Makefile.objs -@@ -3,7 +3,7 @@ obj-y += ppc.o ppc_booke.o fdt.o - # IBM pSeries (sPAPR) - obj-$(CONFIG_PSERIES) += spapr.o spapr_caps.o spapr_vio.o spapr_events.o - obj-$(CONFIG_PSERIES) += spapr_hcall.o spapr_iommu.o spapr_rtas.o --obj-$(CONFIG_PSERIES) += spapr_pci.o spapr_rtc.o spapr_drc.o spapr_rng.o -+obj-$(CONFIG_PSERIES) += spapr_pci.o spapr_rtc.o spapr_drc.o - obj-$(CONFIG_PSERIES) += spapr_cpu_core.o spapr_ovec.o - # IBM PowerNV - obj-$(CONFIG_POWERNV) += pnv.o pnv_xscom.o pnv_core.o pnv_lpc.o pnv_psi.o pnv_occ.o pnv_bmc.o -diff --git a/hw/ppc/spapr.c b/hw/ppc/spapr.c -index 421b2dd..2f8c304 100644 ---- a/hw/ppc/spapr.c -+++ b/hw/ppc/spapr.c -@@ -1303,6 +1303,7 @@ static void *spapr_build_fdt(sPAPRMachineState *spapr, - /* /vdevice */ - spapr_dt_vdevice(spapr->vio_bus, fdt); - -+#if 0 /* Disabled in Red Hat Enterprise Linux */ - if (object_resolve_path_type("", TYPE_SPAPR_RNG, NULL)) { - ret = spapr_rng_populate_dt(fdt); - if (ret < 0) { -@@ -1310,7 +1311,7 @@ static void *spapr_build_fdt(sPAPRMachineState *spapr, - exit(1); - } - } -- -+#endif - QLIST_FOREACH(phb, &spapr->phbs, list) { - ret = spapr_populate_pci_dt(phb, PHANDLE_XICP, fdt); - if (ret < 0) { diff --git a/hw/ppc/spapr_cpu_core.c b/hw/ppc/spapr_cpu_core.c -index 993759d..fb29eec 100644 +index 2398ce6..63a7bb6 100644 --- a/hw/ppc/spapr_cpu_core.c +++ b/hw/ppc/spapr_cpu_core.c -@@ -378,10 +378,12 @@ static const TypeInfo spapr_cpu_core_type_infos[] = { +@@ -382,10 +382,12 @@ static const TypeInfo spapr_cpu_core_type_infos[] = { .instance_size = sizeof(sPAPRCPUCore), .class_size = sizeof(sPAPRCPUCoreClass), }, @@ -693,70 +638,22 @@ index 993759d..fb29eec 100644 DEFINE_SPAPR_CPU_CORE_TYPE("power7+_v2.1"), DEFINE_SPAPR_CPU_CORE_TYPE("power8_v2.0"), diff --git a/hw/rdma/Makefile.objs b/hw/rdma/Makefile.objs -index 3504c39..02ca2a9 100644 +index bd36cbf..e87e7e5 100644 --- a/hw/rdma/Makefile.objs +++ b/hw/rdma/Makefile.objs @@ -1,5 +1,6 @@ - ifeq ($(CONFIG_RDMA),y) + ifeq ($(CONFIG_PVRDMA),y) obj-$(CONFIG_PCI) += rdma_utils.o rdma_backend.o rdma_rm.o obj-$(CONFIG_PCI) += vmw/pvrdma_dev_ring.o vmw/pvrdma_cmd.o \ - vmw/pvrdma_qp_ops.o vmw/pvrdma_main.o + vmw/pvrdma_qp_ops.o +#obj-$(CONFIG_PCI) += vmw/pvrdma_main.o endif -diff --git a/hw/s390x/virtio-ccw.c b/hw/s390x/virtio-ccw.c -index 7ddb378..b131781 100644 ---- a/hw/s390x/virtio-ccw.c -+++ b/hw/s390x/virtio-ccw.c -@@ -925,6 +925,8 @@ static void virtio_ccw_rng_realize(VirtioCcwDevice *ccw_dev, Error **errp) - NULL); - } - -+#if 0 /* Disabled in Red Hat Enterprise Linux */ -+ - static void virtio_ccw_crypto_realize(VirtioCcwDevice *ccw_dev, Error **errp) - { - VirtIOCryptoCcw *dev = VIRTIO_CRYPTO_CCW(ccw_dev); -@@ -942,6 +944,7 @@ static void virtio_ccw_crypto_realize(VirtioCcwDevice *ccw_dev, Error **errp) - OBJECT(dev->vdev.conf.cryptodev), "cryptodev", - NULL); - } -+#endif - - static void virtio_ccw_gpu_realize(VirtioCcwDevice *ccw_dev, Error **errp) - { -@@ -1532,6 +1535,8 @@ static const TypeInfo virtio_ccw_rng = { - .class_init = virtio_ccw_rng_class_init, - }; - -+#if 0 /* Disabled in Red Hat Enterprise Linux */ -+ - static Property virtio_ccw_crypto_properties[] = { - DEFINE_PROP_BIT("ioeventfd", VirtioCcwDevice, flags, - VIRTIO_CCW_FLAG_USE_IOEVENTFD_BIT, true), -@@ -1568,6 +1573,7 @@ static const TypeInfo virtio_ccw_crypto = { - .instance_init = virtio_ccw_crypto_instance_init, - .class_init = virtio_ccw_crypto_class_init, - }; -+#endif - - static Property virtio_ccw_gpu_properties[] = { - DEFINE_PROP_BIT("ioeventfd", VirtioCcwDevice, flags, -@@ -1888,7 +1894,9 @@ static void virtio_ccw_register(void) - #ifdef CONFIG_VHOST_VSOCK - type_register_static(&vhost_vsock_ccw_info); - #endif -+#if 0 /* Disabled in Red Hat Enterprise Linux */ - type_register_static(&virtio_ccw_crypto); -+#endif - type_register_static(&virtio_ccw_gpu); - type_register_static(&virtio_ccw_input); - type_register_static(&virtio_ccw_input_hid); diff --git a/hw/usb/ccid-card-emulated.c b/hw/usb/ccid-card-emulated.c -index 5c8b3c9..d1cbe54 100644 +index 25976ed..a793584 100644 --- a/hw/usb/ccid-card-emulated.c +++ b/hw/usb/ccid-card-emulated.c -@@ -585,6 +585,8 @@ static void emulated_class_initfn(ObjectClass *klass, void *data) +@@ -600,6 +600,8 @@ static void emulated_class_initfn(ObjectClass *klass, void *data) set_bit(DEVICE_CATEGORY_INPUT, dc->categories); dc->desc = "emulated smartcard"; dc->props = emulated_card_properties; @@ -766,19 +663,21 @@ index 5c8b3c9..d1cbe54 100644 static const TypeInfo emulated_card_info = { diff --git a/hw/vfio/Makefile.objs b/hw/vfio/Makefile.objs -index a2e7a0a..d38205b 100644 +index 8b3f664..a6b6039 100644 --- a/hw/vfio/Makefile.objs +++ b/hw/vfio/Makefile.objs -@@ -2,7 +2,6 @@ ifeq ($(CONFIG_LINUX), y) +@@ -2,9 +2,6 @@ ifeq ($(CONFIG_LINUX), y) obj-$(CONFIG_SOFTMMU) += common.o obj-$(CONFIG_PCI) += pci.o pci-quirks.o display.o obj-$(CONFIG_VFIO_CCW) += ccw.o -obj-$(CONFIG_SOFTMMU) += platform.o - obj-$(CONFIG_VFIO_XGMAC) += calxeda-xgmac.o - obj-$(CONFIG_VFIO_AMD_XGBE) += amd-xgbe.o +-obj-$(CONFIG_VFIO_XGMAC) += calxeda-xgmac.o +-obj-$(CONFIG_VFIO_AMD_XGBE) += amd-xgbe.o obj-$(CONFIG_SOFTMMU) += spapr.o + obj-$(CONFIG_VFIO_AP) += ap.o + endif diff --git a/hw/vfio/pci-quirks.c b/hw/vfio/pci-quirks.c -index 481fd08..1c588f5 100644 +index eae31c7..4a6e98e 100644 --- a/hw/vfio/pci-quirks.c +++ b/hw/vfio/pci-quirks.c @@ -1387,6 +1387,8 @@ static void vfio_pci_igd_lpc_bridge_class_init(ObjectClass *klass, void *data) @@ -801,7 +700,7 @@ index 481fd08..1c588f5 100644 /* * We need to create an LPC/ISA bridge at PCI bus address 00:1f.0 that we diff --git a/hw/virtio/virtio-pci.c b/hw/virtio/virtio-pci.c -index 3a01fe9..3567faf 100644 +index a954799..9a987cb 100644 --- a/hw/virtio/virtio-pci.c +++ b/hw/virtio/virtio-pci.c @@ -2003,7 +2003,7 @@ static const TypeInfo virtio_blk_pci_info = { @@ -841,10 +740,10 @@ index 3a01fe9..3567faf 100644 #endif #ifdef CONFIG_VHOST_VSOCK diff --git a/qemu-options.hx b/qemu-options.hx -index b1bf0f4..37f2aa8 100644 +index f7df472..cd2b25b 100644 --- a/qemu-options.hx +++ b/qemu-options.hx -@@ -1811,11 +1811,6 @@ ETEXI +@@ -1741,11 +1741,6 @@ ETEXI DEF("no-hpet", 0, QEMU_OPTION_no_hpet, "-no-hpet disable HPET\n", QEMU_ARCH_I386) @@ -857,13 +756,13 @@ index b1bf0f4..37f2aa8 100644 DEF("acpitable", HAS_ARG, QEMU_OPTION_acpitable, "-acpitable [sig=str][,rev=n][,oem_id=str][,oem_table_id=str][,oem_rev=n][,asl_compiler_id=str][,asl_compiler_rev=n][,{data|file}=file1[:file2]...]\n" diff --git a/stubs/Makefile.objs b/stubs/Makefile.objs -index 53d3f32..b1360c4 100644 +index 5dd0aee..f27250e 100644 --- a/stubs/Makefile.objs +++ b/stubs/Makefile.objs -@@ -43,3 +43,4 @@ stub-obj-y += xen-common.o - stub-obj-y += xen-hvm.o +@@ -44,3 +44,4 @@ stub-obj-y += xen-hvm.o stub-obj-y += pci-host-piix.o stub-obj-y += ram-block.o + stub-obj-y += ramfb.o +stub-obj-y += ide-isa.o diff --git a/stubs/ide-isa.c b/stubs/ide-isa.c new file mode 100644 @@ -885,10 +784,10 @@ index 0000000..9fd50ef + abort(); +} diff --git a/target/arm/cpu.c b/target/arm/cpu.c -index 64a8005..bc8d09d 100644 +index 60411f6..d2ac5bb 100644 --- a/target/arm/cpu.c +++ b/target/arm/cpu.c -@@ -2029,7 +2029,9 @@ static void arm_cpu_register_types(void) +@@ -2149,7 +2149,9 @@ static void arm_cpu_register_types(void) type_register_static(&idau_interface_type_info); while (info->name) { @@ -900,10 +799,10 @@ index 64a8005..bc8d09d 100644 } diff --git a/target/i386/cpu.c b/target/i386/cpu.c -index 723e022..338ee37 100644 +index f81d35e..e9b9183 100644 --- a/target/i386/cpu.c +++ b/target/i386/cpu.c -@@ -1366,14 +1366,14 @@ static X86CPUDefinition builtin_x86_defs[] = { +@@ -1443,14 +1443,14 @@ static X86CPUDefinition builtin_x86_defs[] = { .family = 6, .model = 6, .stepping = 3, @@ -926,7 +825,7 @@ index 723e022..338ee37 100644 .features[FEAT_8000_0001_ECX] = CPUID_EXT3_LAHF_LM | CPUID_EXT3_SVM, .xlevel = 0x8000000A, -@@ -1603,6 +1603,25 @@ static X86CPUDefinition builtin_x86_defs[] = { +@@ -1680,6 +1680,25 @@ static X86CPUDefinition builtin_x86_defs[] = { .model_id = "Intel(R) Atom(TM) CPU N270 @ 1.60GHz", }, { @@ -953,7 +852,7 @@ index 723e022..338ee37 100644 .level = 10, .vendor = CPUID_VENDOR_INTEL, diff --git a/target/ppc/cpu-models.c b/target/ppc/cpu-models.c -index 6c9bfde..77cb298 100644 +index 7c75963..7f179ff 100644 --- a/target/ppc/cpu-models.c +++ b/target/ppc/cpu-models.c @@ -65,6 +65,7 @@ @@ -964,13 +863,22 @@ index 6c9bfde..77cb298 100644 /* Embedded PowerPC */ /* PowerPC 401 family */ POWERPC_DEF("401", CPU_POWERPC_401, 401, -@@ -739,10 +740,13 @@ +@@ -739,8 +740,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, +@@ -757,8 +760,11 @@ + "PowerPC 970MP v1.0") + POWERPC_DEF("970mp_v1.1", CPU_POWERPC_970MP_v11, 970, + "PowerPC 970MP v1.1") ++#endif +#if 0 /* Disabled for Red Hat Enterprise Linux */ POWERPC_DEF("power5+_v2.1", CPU_POWERPC_POWER5P_v21, POWER5P, "POWER5+ v2.1") @@ -978,32 +886,7 @@ index 6c9bfde..77cb298 100644 POWERPC_DEF("power7_v2.3", CPU_POWERPC_POWER7_v23, POWER7, "POWER7 v2.3") POWERPC_DEF("power7+_v2.1", CPU_POWERPC_POWER7P_v21, POWER7, -@@ -753,14 +757,17 @@ - "POWER8 v2.0") - POWERPC_DEF("power8nvl_v1.0", CPU_POWERPC_POWER8NVL_v10, POWER8, - "POWER8NVL v1.0") -+#if 0 /* Disabled for Red Hat Enterprise Linux */ - POWERPC_DEF("970_v2.2", CPU_POWERPC_970_v22, 970, - "PowerPC 970 v2.2") -+#endif - - POWERPC_DEF("power9_v1.0", CPU_POWERPC_POWER9_DD1, POWER9, - "POWER9 v1.0") - POWERPC_DEF("power9_v2.0", CPU_POWERPC_POWER9_DD20, POWER9, - "POWER9 v2.0") - -+#if 0 /* Disabled for Red Hat Enterprise Linux */ - POWERPC_DEF("970fx_v1.0", CPU_POWERPC_970FX_v10, 970, - "PowerPC 970FX v1.0 (G5)") - POWERPC_DEF("970fx_v2.0", CPU_POWERPC_970FX_v20, 970, -@@ -775,12 +782,14 @@ - "PowerPC 970MP v1.0") - POWERPC_DEF("970mp_v1.1", CPU_POWERPC_970MP_v11, 970, - "PowerPC 970MP v1.1") -+#endif - #endif /* defined (TARGET_PPC64) */ - - /***************************************************************************/ +@@ -779,6 +785,7 @@ /* PowerPC CPU aliases */ PowerPCCPUAlias ppc_cpu_aliases[] = { @@ -1011,34 +894,31 @@ index 6c9bfde..77cb298 100644 { "403", "403gc" }, { "405", "405d4" }, { "405cr", "405crc" }, -@@ -939,20 +948,25 @@ PowerPCCPUAlias ppc_cpu_aliases[] = { +@@ -937,12 +944,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" }, - { "power8", "power8_v2.0" }, - { "power8nvl", "power8nvl_v1.0" }, +@@ -951,6 +961,7 @@ PowerPCCPUAlias ppc_cpu_aliases[] = { { "power9", "power9_v2.0" }, -+#if 0 /* Disabled for Red Hat Enterprise Linux */ - { "970", "970_v2.2" }, - { "970fx", "970fx_v3.1" }, - { "970mp", "970mp_v1.1" }, #endif -- -+#endif + +#if 0 /* Disabled for Red Hat Enterprise Linux */ /* Generic PowerPCs */ #if defined(TARGET_PPC64) { "ppc64", "970fx_v3.1" }, -@@ -960,5 +974,6 @@ PowerPCCPUAlias ppc_cpu_aliases[] = { +@@ -958,5 +969,6 @@ PowerPCCPUAlias ppc_cpu_aliases[] = { { "ppc32", "604" }, { "ppc", "604" }, { "default", "604" }, @@ -1046,10 +926,10 @@ index 6c9bfde..77cb298 100644 { NULL, NULL } }; diff --git a/target/s390x/cpu_models.c b/target/s390x/cpu_models.c -index 604898a..9c469ff 100644 +index 7c253ff..e73f812 100644 --- a/target/s390x/cpu_models.c +++ b/target/s390x/cpu_models.c -@@ -373,6 +373,9 @@ static void check_unavailable_features(const S390CPUModel *max_model, +@@ -380,6 +380,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); @@ -1060,10 +940,10 @@ index 604898a..9c469ff 100644 /* detect missing features if any to properly report them */ diff --git a/target/s390x/kvm.c b/target/s390x/kvm.c -index d923cf4..bbcbeed 100644 +index 2ebf26a..3a0337a 100644 --- a/target/s390x/kvm.c +++ b/target/s390x/kvm.c -@@ -2277,6 +2277,14 @@ void kvm_s390_apply_cpu_model(const S390CPUModel *model, Error **errp) +@@ -2342,6 +2342,14 @@ void kvm_s390_apply_cpu_model(const S390CPUModel *model, Error **errp) error_setg(errp, "KVM doesn't support CPU models"); return; } @@ -1079,10 +959,10 @@ index d923cf4..bbcbeed 100644 prop.ibc = s390_ibc_from_cpu_model(model); /* configure cpu features indicated via STFL(e) */ diff --git a/vl.c b/vl.c -index 16b913f..4f96203 100644 +index fa25d1a..39d152a 100644 --- a/vl.c +++ b/vl.c -@@ -164,7 +164,7 @@ unsigned int max_cpus; +@@ -171,7 +171,7 @@ unsigned int max_cpus; int smp_cores = 1; int smp_threads = 1; int acpi_enabled = 1; diff --git a/0006-Machine-type-related-general-changes.patch b/0007-Machine-type-related-general-changes.patch similarity index 95% rename from 0006-Machine-type-related-general-changes.patch rename to 0007-Machine-type-related-general-changes.patch index 7693f8a..62a0b14 100644 --- a/0006-Machine-type-related-general-changes.patch +++ b/0007-Machine-type-related-general-changes.patch @@ -1,6 +1,6 @@ -From e34179d713443601a16936e2e80b8fbd044429be Mon Sep 17 00:00:00 2001 +From c59789ec7d5213bda9aeb48aacef2e3e897fdf7e Mon Sep 17 00:00:00 2001 From: Miroslav Rezanina -Date: Thu, 8 Nov 2018 11:59:55 +0100 +Date: Fri, 19 Oct 2018 12:36:59 +0200 Subject: Machine type related general changes This patch is first part of original "Add RHEL machine types" patch we @@ -12,7 +12,7 @@ Signed-off-by: Miroslav Rezanina hw/acpi/ich9.c | 16 +++ hw/acpi/piix4.c | 6 +- hw/char/serial.c | 16 +++ - hw/display/cirrus_vga.c | 2 +- + hw/display/cirrus_vga_isa.c | 2 +- hw/display/vga-isa.c | 2 +- hw/net/e1000.c | 18 ++- hw/net/e1000e.c | 21 ++++ @@ -67,7 +67,7 @@ index a4e87b8..23a7baa 100644 ich9_pm_get_disable_s3, ich9_pm_set_disable_s3, diff --git a/hw/acpi/piix4.c b/hw/acpi/piix4.c -index 6404af5..0f1f9e2 100644 +index e330f24..b213f65 100644 --- a/hw/acpi/piix4.c +++ b/hw/acpi/piix4.c @@ -310,7 +310,7 @@ static const VMStateDescription vmstate_cpuhp_state = { @@ -91,7 +91,7 @@ index 6404af5..0f1f9e2 100644 DEFINE_PROP_BOOL("acpi-pci-hotplug-with-bridge-support", PIIX4PMState, use_acpi_pci_hotplug, true), diff --git a/hw/char/serial.c b/hw/char/serial.c -index 251f40f..8e3520c 100644 +index 02463e3..a591387 100644 --- a/hw/char/serial.c +++ b/hw/char/serial.c @@ -30,6 +30,7 @@ @@ -145,11 +145,11 @@ index 251f40f..8e3520c 100644 return s->poll_msl >= 0; } -diff --git a/hw/display/cirrus_vga.c b/hw/display/cirrus_vga.c -index 9fd5665..6910014 100644 ---- a/hw/display/cirrus_vga.c -+++ b/hw/display/cirrus_vga.c -@@ -3061,7 +3061,7 @@ static void isa_cirrus_vga_realizefn(DeviceState *dev, Error **errp) +diff --git a/hw/display/cirrus_vga_isa.c b/hw/display/cirrus_vga_isa.c +index 1cb607d..22678a3 100644 +--- a/hw/display/cirrus_vga_isa.c ++++ b/hw/display/cirrus_vga_isa.c +@@ -67,7 +67,7 @@ static void isa_cirrus_vga_realizefn(DeviceState *dev, Error **errp) static Property isa_cirrus_vga_properties[] = { DEFINE_PROP_UINT32("vgamem_mb", struct ISACirrusVGAState, @@ -172,10 +172,10 @@ index fa44242..7835c83 100644 }; diff --git a/hw/net/e1000.c b/hw/net/e1000.c -index 742cd0a..7d568da 100644 +index 2e07880..e886e7c 100644 --- a/hw/net/e1000.c +++ b/hw/net/e1000.c -@@ -1663,6 +1663,16 @@ static void pci_e1000_realize(PCIDevice *pci_dev, Error **errp) +@@ -1673,6 +1673,16 @@ static void pci_e1000_realize(PCIDevice *pci_dev, Error **errp) pci_conf = pci_dev->config; @@ -192,7 +192,7 @@ index 742cd0a..7d568da 100644 /* TODO: RST# value should be 0, PCI spec 6.2.4 */ pci_conf[PCI_CACHE_LINE_SIZE] = 0x10; -@@ -1763,7 +1773,7 @@ static const TypeInfo e1000_base_info = { +@@ -1773,7 +1783,7 @@ static const TypeInfo e1000_base_info = { static const E1000Info e1000_devices[] = { { @@ -201,7 +201,7 @@ index 742cd0a..7d568da 100644 .device_id = E1000_DEV_ID_82540EM, .revision = 0x03, .phy_id2 = E1000_PHY_ID2_8254xx_DEFAULT, -@@ -1784,6 +1794,11 @@ static const E1000Info e1000_devices[] = { +@@ -1794,6 +1804,11 @@ static const E1000Info e1000_devices[] = { #endif }; @@ -213,7 +213,7 @@ index 742cd0a..7d568da 100644 static void e1000_register_types(void) { int i; -@@ -1801,6 +1816,7 @@ static void e1000_register_types(void) +@@ -1811,6 +1826,7 @@ static void e1000_register_types(void) type_register(&type_info); } @@ -296,7 +296,7 @@ index 510ddb3..f1de9e5 100644 e1000e_prop_disable_vnet, bool), DEFINE_PROP_SIGNED("subsys_ven", E1000EState, subsys_ven, diff --git a/hw/net/rtl8139.c b/hw/net/rtl8139.c -index 46daa16..05453e7 100644 +index 2342a09..0c916b7 100644 --- a/hw/net/rtl8139.c +++ b/hw/net/rtl8139.c @@ -3174,7 +3174,7 @@ static int rtl8139_pre_save(void *opaque) @@ -319,7 +319,7 @@ index 46daa16..05453e7 100644 VMSTATE_UINT16(tally_counters.TxUndrn, RTL8139State), diff --git a/hw/smbios/smbios.c b/hw/smbios/smbios.c -index a27e54b..144e6e9 100644 +index 9209394..43cf057 100644 --- a/hw/smbios/smbios.c +++ b/hw/smbios/smbios.c @@ -775,6 +775,7 @@ void smbios_set_defaults(const char *manufacturer, const char *product, @@ -344,18 +344,18 @@ index 6190b6f..ad2ad2d 100644 vmstate_pit_channel, PITChannelState), VMSTATE_INT64(channels[0].next_transition_time, diff --git a/hw/timer/mc146818rtc.c b/hw/timer/mc146818rtc.c -index 6f1f723..68c353f 100644 +index e4e4de8..3eced9c 100644 --- a/hw/timer/mc146818rtc.c +++ b/hw/timer/mc146818rtc.c -@@ -34,6 +34,7 @@ - #include "qapi/qapi-commands-misc.h" +@@ -35,6 +35,7 @@ #include "qapi/qapi-events-misc.h" #include "qapi/visitor.h" + #include "exec/address-spaces.h" +#include "migration/migration.h" #ifdef TARGET_I386 #include "hw/i386/apic.h" -@@ -839,6 +840,11 @@ static int rtc_post_load(void *opaque, int version_id) +@@ -841,6 +842,11 @@ 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; @@ -456,10 +456,10 @@ index 59aeb06..7b5cc25 100644 #define ACPI_PM_PROP_TCO_ENABLED "enable_tco" diff --git a/include/hw/compat.h b/include/hw/compat.h -index c08f404..22262c7 100644 +index 6f4d5fc..f08cc7c 100644 --- a/include/hw/compat.h +++ b/include/hw/compat.h -@@ -282,4 +282,233 @@ +@@ -285,4 +285,233 @@ .value = "on",\ }, @@ -707,10 +707,10 @@ index a5080ad..b943ec9 100644 + #endif diff --git a/migration/migration.c b/migration/migration.c -index b7d9854..381039c 100644 +index b261c1e..fb425b5 100644 --- a/migration/migration.c +++ b/migration/migration.c -@@ -106,6 +106,8 @@ enum mig_rp_message_type { +@@ -105,6 +105,8 @@ enum mig_rp_message_type { MIG_RP_MSG_MAX }; @@ -720,10 +720,10 @@ index b7d9854..381039c 100644 migrations at once. For now we don't need to add dynamic creation of migration */ diff --git a/migration/migration.h b/migration/migration.h -index 64a7b33..405d984 100644 +index e413d4d..795238c 100644 --- a/migration/migration.h +++ b/migration/migration.h -@@ -288,6 +288,11 @@ void migrate_send_rp_resume_ack(MigrationIncomingState *mis, uint32_t value); +@@ -292,6 +292,11 @@ void migrate_send_rp_resume_ack(MigrationIncomingState *mis, uint32_t value); void dirty_bitmap_mig_before_vm_start(void); void init_dirty_bitmap_incoming_migration(void); @@ -736,7 +736,7 @@ index 64a7b33..405d984 100644 #define qemu_ram_foreach_block \ #warning "Use qemu_ram_foreach_block_migratable in migration code" diff --git a/qdev-monitor.c b/qdev-monitor.c -index 61e0300..f439b83 100644 +index 07147c6..47ea051 100644 --- a/qdev-monitor.c +++ b/qdev-monitor.c @@ -47,7 +47,6 @@ typedef struct QDevAlias diff --git a/0007-Add-aarch64-machine-types.patch b/0008-Add-aarch64-machine-types.patch similarity index 92% rename from 0007-Add-aarch64-machine-types.patch rename to 0008-Add-aarch64-machine-types.patch index c546843..ede1ec5 100644 --- a/0007-Add-aarch64-machine-types.patch +++ b/0008-Add-aarch64-machine-types.patch @@ -1,6 +1,6 @@ -From 2c0d79871ccb5383b1a91e5fc9139b6f8e8ed8e0 Mon Sep 17 00:00:00 2001 +From 6df04926524e1a9f1178b53bf2b7b8978a6d5935 Mon Sep 17 00:00:00 2001 From: Miroslav Rezanina -Date: Thu, 8 Nov 2018 12:00:54 +0100 +Date: Fri, 19 Oct 2018 12:53:31 +0200 Subject: Add aarch64 machine types Adding changes to add RHEL machine types for aarch64 architecture. @@ -12,7 +12,7 @@ Signed-off-by: Miroslav Rezanina 2 files changed, 147 insertions(+), 1 deletion(-) diff --git a/hw/arm/virt.c b/hw/arm/virt.c -index 281ddcd..b02e4a0 100644 +index a2b8d8f..703f0dd 100644 --- a/hw/arm/virt.c +++ b/hw/arm/virt.c @@ -60,6 +60,7 @@ @@ -61,7 +61,7 @@ index 281ddcd..b02e4a0 100644 /* Number of external interrupt lines to configure the GIC with */ #define NUM_IRQS 256 -@@ -1539,6 +1569,7 @@ static void machvirt_init(MachineState *machine) +@@ -1577,6 +1607,7 @@ static void machvirt_init(MachineState *machine) qemu_add_machine_init_done_notifier(&vms->machine_done); } @@ -69,7 +69,7 @@ index 281ddcd..b02e4a0 100644 static bool virt_get_secure(Object *obj, Error **errp) { VirtMachineState *vms = VIRT_MACHINE(obj); -@@ -1567,6 +1598,7 @@ static void virt_set_virt(Object *obj, bool value, Error **errp) +@@ -1605,6 +1636,7 @@ static void virt_set_virt(Object *obj, bool value, Error **errp) vms->virt = value; } @@ -77,7 +77,7 @@ index 281ddcd..b02e4a0 100644 static bool virt_get_highmem(Object *obj, Error **errp) { VirtMachineState *vms = VIRT_MACHINE(obj); -@@ -1621,6 +1653,7 @@ static void virt_set_gic_version(Object *obj, const char *value, Error **errp) +@@ -1659,6 +1691,7 @@ static void virt_set_gic_version(Object *obj, const char *value, Error **errp) } } @@ -85,7 +85,7 @@ index 281ddcd..b02e4a0 100644 static char *virt_get_iommu(Object *obj, Error **errp) { VirtMachineState *vms = VIRT_MACHINE(obj); -@@ -1648,6 +1681,7 @@ static void virt_set_iommu(Object *obj, const char *value, Error **errp) +@@ -1686,6 +1719,7 @@ static void virt_set_iommu(Object *obj, const char *value, Error **errp) error_append_hint(errp, "Valid values are none, smmuv3.\n"); } } @@ -93,7 +93,7 @@ index 281ddcd..b02e4a0 100644 static CpuInstanceProperties virt_cpu_index_to_props(MachineState *ms, unsigned cpu_index) -@@ -1687,6 +1721,7 @@ static const CPUArchIdList *virt_possible_cpu_arch_ids(MachineState *ms) +@@ -1725,6 +1759,7 @@ static const CPUArchIdList *virt_possible_cpu_arch_ids(MachineState *ms) return ms->possible_cpus; } @@ -101,9 +101,9 @@ index 281ddcd..b02e4a0 100644 static void virt_machine_device_plug_cb(HotplugHandler *hotplug_dev, DeviceState *dev, Error **errp) { -@@ -1835,6 +1870,9 @@ static void virt_machine_3_0_options(MachineClass *mc) - } - DEFINE_VIRT_MACHINE_AS_LATEST(3, 0) +@@ -1889,6 +1924,9 @@ DEFINE_VIRT_MACHINE(3, 0) + #define VIRT_COMPAT_2_12 \ + HW_COMPAT_2_12 +#define VIRT_COMPAT_2_12 \ + HW_COMPAT_2_12 @@ -111,7 +111,7 @@ index 281ddcd..b02e4a0 100644 static void virt_2_12_instance_init(Object *obj) { virt_3_0_instance_init(obj); -@@ -1960,3 +1998,89 @@ static void virt_machine_2_6_options(MachineClass *mc) +@@ -2016,3 +2054,89 @@ static void virt_machine_2_6_options(MachineClass *mc) vmc->no_pmu = true; } DEFINE_VIRT_MACHINE(2, 6) @@ -202,10 +202,10 @@ index 281ddcd..b02e4a0 100644 +} +DEFINE_RHEL_MACHINE_AS_LATEST(7, 6, 0) diff --git a/include/hw/arm/virt.h b/include/hw/arm/virt.h -index 9a870cc..2293315 100644 +index 4cc57a7..3237e97 100644 --- a/include/hw/arm/virt.h +++ b/include/hw/arm/virt.h -@@ -128,6 +128,7 @@ typedef struct { +@@ -130,6 +130,7 @@ typedef struct { #define VIRT_ECAM_ID(high) (high ? VIRT_PCIE_ECAM_HIGH : VIRT_PCIE_ECAM) @@ -213,7 +213,7 @@ index 9a870cc..2293315 100644 #define TYPE_VIRT_MACHINE MACHINE_TYPE_NAME("virt") #define VIRT_MACHINE(obj) \ OBJECT_CHECK(VirtMachineState, (obj), TYPE_VIRT_MACHINE) -@@ -136,6 +137,27 @@ typedef struct { +@@ -138,6 +139,27 @@ typedef struct { #define VIRT_MACHINE_CLASS(klass) \ OBJECT_CLASS_CHECK(VirtMachineClass, klass, TYPE_VIRT_MACHINE) diff --git a/0008-Add-ppc64-machine-types.patch b/0009-Add-ppc64-machine-types.patch similarity index 91% rename from 0008-Add-ppc64-machine-types.patch rename to 0009-Add-ppc64-machine-types.patch index dbe223e..2fd63fd 100644 --- a/0008-Add-ppc64-machine-types.patch +++ b/0009-Add-ppc64-machine-types.patch @@ -1,6 +1,6 @@ -From b6c41d9cfe7ae58455737c967f2e47d6bc99d21e Mon Sep 17 00:00:00 2001 +From 0f1a361c4bd8fc0874cc5d05e611fadb67524a1e Mon Sep 17 00:00:00 2001 From: Miroslav Rezanina -Date: Thu, 8 Nov 2018 12:01:38 +0100 +Date: Fri, 19 Oct 2018 13:27:13 +0200 Subject: Add ppc64 machine types Adding changes to add RHEL machine types for ppc64 architecture. @@ -15,26 +15,26 @@ Signed-off-by: Miroslav Rezanina 5 files changed, 279 insertions(+), 1 deletion(-) diff --git a/hw/ppc/spapr.c b/hw/ppc/spapr.c -index 2f8c304..b8bdb69 100644 +index 7afd1a1..76a4e83 100644 --- a/hw/ppc/spapr.c +++ b/hw/ppc/spapr.c -@@ -4009,6 +4009,7 @@ static void spapr_machine_class_init(ObjectClass *oc, void *data) - smc->default_caps.caps[SPAPR_CAP_IBS] = SPAPR_CAP_BROKEN; - smc->default_caps.caps[SPAPR_CAP_HPT_MAXPAGESIZE] = 16; /* 64kiB */ +@@ -3906,6 +3906,7 @@ static void spapr_machine_class_init(ObjectClass *oc, void *data) + smc->default_caps.caps[SPAPR_CAP_NESTED_KVM_HV] = SPAPR_CAP_OFF; spapr_caps_add_properties(smc, &error_abort); + smc->irq = &spapr_irq_xics; + smc->has_power9_support = true; } static const TypeInfo spapr_machine_info = { -@@ -4059,6 +4060,7 @@ static const TypeInfo spapr_machine_info = { +@@ -3956,6 +3957,7 @@ static const TypeInfo spapr_machine_info = { } \ type_init(spapr_machine_register_##suffix) +#if 0 /* Disabled for Red Hat Enterprise Linux */ - /* - * pseries-3.0 + /* + * pseries-3.1 */ -@@ -4248,6 +4250,7 @@ DEFINE_SPAPR_MACHINE(2_8, "2.8", false); +@@ -4169,6 +4171,7 @@ DEFINE_SPAPR_MACHINE(2_8, "2.8", false); .property = "pre-2.8-migration", \ .value = "on", \ }, @@ -42,7 +42,7 @@ index 2f8c304..b8bdb69 100644 static void phb_placement_2_7(sPAPRMachineState *spapr, uint32_t index, uint64_t *buid, hwaddr *pio, -@@ -4298,6 +4301,7 @@ static void phb_placement_2_7(sPAPRMachineState *spapr, uint32_t index, +@@ -4219,6 +4222,7 @@ static void phb_placement_2_7(sPAPRMachineState *spapr, uint32_t index, */ } @@ -50,7 +50,7 @@ index 2f8c304..b8bdb69 100644 static void spapr_machine_2_7_instance_options(MachineState *machine) { sPAPRMachineState *spapr = SPAPR_MACHINE(machine); -@@ -4457,6 +4461,254 @@ static void spapr_machine_2_1_class_options(MachineClass *mc) +@@ -4378,6 +4382,254 @@ static void spapr_machine_2_1_class_options(MachineClass *mc) SET_MACHINE_COMPAT(mc, SPAPR_COMPAT_2_1); } DEFINE_SPAPR_MACHINE(2_1, "2.1", false); @@ -306,10 +306,10 @@ index 2f8c304..b8bdb69 100644 static void spapr_machine_register_types(void) { diff --git a/hw/ppc/spapr_cpu_core.c b/hw/ppc/spapr_cpu_core.c -index fb29eec..a081b01 100644 +index 63a7bb6..fcf6174 100644 --- a/hw/ppc/spapr_cpu_core.c +++ b/hw/ppc/spapr_cpu_core.c -@@ -21,6 +21,7 @@ +@@ -22,6 +22,7 @@ #include "sysemu/numa.h" #include "sysemu/hw_accel.h" #include "qemu/error-report.h" @@ -317,15 +317,15 @@ index fb29eec..a081b01 100644 static void spapr_cpu_reset(void *opaque) { -@@ -212,6 +213,7 @@ static void spapr_realize_vcpu(PowerPCCPU *cpu, sPAPRMachineState *spapr, - { +@@ -218,6 +219,7 @@ static void spapr_realize_vcpu(PowerPCCPU *cpu, sPAPRMachineState *spapr, CPUPPCState *env = &cpu->env; + CPUState *cs = CPU(cpu); Error *local_err = NULL; + sPAPRMachineClass *smc = SPAPR_MACHINE_GET_CLASS(spapr); object_property_set_bool(OBJECT(cpu), true, "realized", &local_err); if (local_err) { -@@ -224,6 +226,17 @@ static void spapr_realize_vcpu(PowerPCCPU *cpu, sPAPRMachineState *spapr, +@@ -230,6 +232,17 @@ static void spapr_realize_vcpu(PowerPCCPU *cpu, sPAPRMachineState *spapr, cpu_ppc_set_vhyp(cpu, PPC_VIRTUAL_HYPERVISOR(spapr)); kvmppc_set_papr(cpu); @@ -344,13 +344,13 @@ index fb29eec..a081b01 100644 spapr_cpu_reset(cpu); diff --git a/include/hw/ppc/spapr.h b/include/hw/ppc/spapr.h -index 7e5de1a..330c370 100644 +index 6279711..d2370e5 100644 --- a/include/hw/ppc/spapr.h +++ b/include/hw/ppc/spapr.h -@@ -101,6 +101,7 @@ struct sPAPRMachineClass { - bool dr_lmb_enabled; /* enable dynamic-reconfig/hotplug of LMBs */ - bool use_ohci_by_default; /* use USB-OHCI instead of XHCI */ +@@ -106,6 +106,7 @@ struct sPAPRMachineClass { bool pre_2_10_has_unused_icps; + bool legacy_irq_allocation; + + bool has_power9_support; void (*phb_placement)(sPAPRMachineState *spapr, uint32_t index, uint64_t *buid, hwaddr *pio, @@ -381,10 +381,10 @@ index 7de4bf3..3e2e353 100644 const CompatInfo *compat = compat_by_pvr(compat_pvr); const CompatInfo *min = compat_by_pvr(min_compat_pvr); diff --git a/target/ppc/cpu.h b/target/ppc/cpu.h -index 4edcf62..532f0d5 100644 +index ab68abe..c559740 100644 --- a/target/ppc/cpu.h +++ b/target/ppc/cpu.h -@@ -1365,6 +1365,7 @@ static inline int cpu_mmu_index (CPUPPCState *env, bool ifetch) +@@ -1376,6 +1376,7 @@ static inline int cpu_mmu_index (CPUPPCState *env, bool ifetch) /* Compatibility modes */ #if defined(TARGET_PPC64) diff --git a/0009-Add-s390x-machine-types.patch b/0010-Add-s390x-machine-types.patch similarity index 78% rename from 0009-Add-s390x-machine-types.patch rename to 0010-Add-s390x-machine-types.patch index 92b5cbd..7159bb4 100644 --- a/0009-Add-s390x-machine-types.patch +++ b/0010-Add-s390x-machine-types.patch @@ -1,20 +1,23 @@ -From 05b950dccdf9e8f58f3358730aa4705642d0196f Mon Sep 17 00:00:00 2001 +From a47c6d2b9d75dcb15810fcfedcddf5eadf0ec227 Mon Sep 17 00:00:00 2001 From: Miroslav Rezanina -Date: Thu, 8 Nov 2018 12:02:37 +0100 +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 + +Merged patches (3.1.0): +- 29df663 s390x/cpumodel: default enable bpb and ppa15 for z196 and later --- - hw/s390x/s390-virtio-ccw.c | 46 +++++++++++++++++++++++++++++++++++++++++++++- - 1 file changed, 45 insertions(+), 1 deletion(-) + hw/s390x/s390-virtio-ccw.c | 50 +++++++++++++++++++++++++++++++++++++++++++++- + 1 file changed, 49 insertions(+), 1 deletion(-) diff --git a/hw/s390x/s390-virtio-ccw.c b/hw/s390x/s390-virtio-ccw.c -index 7983185..0f135c9 100644 +index a0615a8..04f4c1a 100644 --- a/hw/s390x/s390-virtio-ccw.c +++ b/hw/s390x/s390-virtio-ccw.c -@@ -649,7 +649,7 @@ bool css_migration_enabled(void) +@@ -627,7 +627,7 @@ bool css_migration_enabled(void) { \ MachineClass *mc = MACHINE_CLASS(oc); \ ccw_machine_##suffix##_class_options(mc); \ @@ -23,7 +26,7 @@ index 7983185..0f135c9 100644 if (latest) { \ mc->alias = "s390-ccw-virtio"; \ mc->is_default = 1; \ -@@ -676,6 +676,8 @@ bool css_migration_enabled(void) +@@ -657,6 +657,8 @@ bool css_migration_enabled(void) #define CCW_COMPAT_2_12 \ HW_COMPAT_2_12 @@ -32,7 +35,7 @@ index 7983185..0f135c9 100644 #define CCW_COMPAT_2_11 \ HW_COMPAT_2_11 \ {\ -@@ -898,6 +900,48 @@ static void ccw_machine_2_4_class_options(MachineClass *mc) +@@ -894,6 +896,52 @@ static void ccw_machine_2_4_class_options(MachineClass *mc) } DEFINE_CCW_MACHINE(2_4, "2.4", false); @@ -67,6 +70,10 @@ index 7983185..0f135c9 100644 + /* before 2.12 we emulated the very first z900, and RHEL 7.5 is + based on 2.10 */ + s390_set_qemu_cpu_model(0x2064, 7, 1, qemu_cpu_feat); ++ ++ /* bpb and ppa15 were only in the full model in RHEL 7.5 */ ++ s390_cpudef_featoff_greater(11, 1, S390_FEAT_PPA15); ++ s390_cpudef_featoff_greater(11, 1, S390_FEAT_BPB); +} + +static void ccw_machine_rhel750_class_options(MachineClass *mc) diff --git a/0010-Add-x86_64-machine-types.patch b/0011-Add-x86_64-machine-types.patch similarity index 96% rename from 0010-Add-x86_64-machine-types.patch rename to 0011-Add-x86_64-machine-types.patch index 30ec2d5..84feac0 100644 --- a/0010-Add-x86_64-machine-types.patch +++ b/0011-Add-x86_64-machine-types.patch @@ -1,6 +1,6 @@ -From b95483e9a18050c7dac0e6c17b049f0733a409cd Mon Sep 17 00:00:00 2001 +From edae60c4f30697c3c859cc9c88f80c0ed3dc0f0e Mon Sep 17 00:00:00 2001 From: Miroslav Rezanina -Date: Thu, 8 Nov 2018 12:03:11 +0100 +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. @@ -17,7 +17,7 @@ Signed-off-by: Miroslav Rezanina 7 files changed, 884 insertions(+), 7 deletions(-) diff --git a/hw/i386/acpi-build.c b/hw/i386/acpi-build.c -index e1ee8ae..be9bdb5 100644 +index 236a20e..3360da9 100644 --- a/hw/i386/acpi-build.c +++ b/hw/i386/acpi-build.c @@ -184,6 +184,9 @@ static void acpi_get_pm_info(AcpiPmInfo *pm) @@ -31,10 +31,10 @@ index e1ee8ae..be9bdb5 100644 } assert(obj); diff --git a/hw/i386/pc.c b/hw/i386/pc.c -index 11c287e..253d48d 100644 +index 567439e..a609332 100644 --- a/hw/i386/pc.c +++ b/hw/i386/pc.c -@@ -1419,7 +1419,8 @@ void pc_memory_init(PCMachineState *pcms, +@@ -1424,7 +1424,8 @@ void pc_memory_init(PCMachineState *pcms, option_rom_mr = g_malloc(sizeof(*option_rom_mr)); memory_region_init_ram(option_rom_mr, NULL, "pc.rom", PC_ROM_SIZE, &error_fatal); @@ -44,7 +44,7 @@ index 11c287e..253d48d 100644 memory_region_set_readonly(option_rom_mr, true); } memory_region_add_subregion_overlap(rom_memory, -@@ -2387,6 +2388,7 @@ static void pc_machine_class_init(ObjectClass *oc, void *data) +@@ -2389,6 +2390,7 @@ static void pc_machine_class_init(ObjectClass *oc, void *data) pcmc->save_tsc_khz = true; pcmc->linuxboot_dma_enabled = true; assert(!mc->get_hotplug_handler); @@ -52,7 +52,7 @@ index 11c287e..253d48d 100644 mc->get_hotplug_handler = pc_get_hotpug_handler; mc->cpu_index_to_instance_props = pc_cpu_index_to_props; mc->get_default_cpu_node_id = pc_get_default_cpu_node_id; -@@ -2396,7 +2398,8 @@ static void pc_machine_class_init(ObjectClass *oc, void *data) +@@ -2398,7 +2400,8 @@ static void pc_machine_class_init(ObjectClass *oc, void *data) mc->default_boot_order = "cad"; mc->hot_add_cpu = pc_hot_add_cpu; mc->block_default_type = IF_IDE; @@ -63,7 +63,7 @@ index 11c287e..253d48d 100644 hc->pre_plug = pc_machine_device_pre_plug_cb; hc->plug = pc_machine_device_plug_cb; diff --git a/hw/i386/pc_piix.c b/hw/i386/pc_piix.c -index dc09466..f0484ec 100644 +index 7092d6d..83c22ae 100644 --- a/hw/i386/pc_piix.c +++ b/hw/i386/pc_piix.c @@ -50,6 +50,7 @@ @@ -93,15 +93,15 @@ index dc09466..f0484ec 100644 static void pc_compat_2_3(MachineState *machine) { PCMachineState *pcms = PC_MACHINE(machine); -@@ -433,6 +435,7 @@ static void pc_i440fx_3_0_machine_options(MachineClass *m) +@@ -433,6 +435,7 @@ static void pc_i440fx_3_1_machine_options(MachineClass *m) pc_i440fx_machine_options(m); m->alias = "pc"; m->is_default = 1; + SET_MACHINE_COMPAT(m, PC_COMPAT_2_12); } - DEFINE_I440FX_MACHINE(v3_0, "pc-i440fx-3.0", NULL, -@@ -1148,3 +1151,190 @@ static void xenfv_machine_options(MachineClass *m) + DEFINE_I440FX_MACHINE(v3_1, "pc-i440fx-3.1", NULL, +@@ -1157,3 +1160,190 @@ static void xenfv_machine_options(MachineClass *m) DEFINE_PC_MACHINE(xenfv, "xenfv", pc_xen_hvm_init, xenfv_machine_options); #endif @@ -293,7 +293,7 @@ index dc09466..f0484ec 100644 +DEFINE_PC_MACHINE(rhel700, "pc-i440fx-rhel7.0.0", pc_init_rhel700, + pc_machine_rhel700_options); diff --git a/hw/i386/pc_q35.c b/hw/i386/pc_q35.c -index 532241e..c1024c5 100644 +index 4702bb1..163546e 100644 --- a/hw/i386/pc_q35.c +++ b/hw/i386/pc_q35.c @@ -145,8 +145,8 @@ static void pc_q35_init(MachineState *machine) @@ -315,15 +315,15 @@ index 532241e..c1024c5 100644 static void pc_q35_machine_options(MachineClass *m) { PCMachineClass *pcmc = PC_MACHINE_CLASS(m); -@@ -315,6 +316,7 @@ static void pc_q35_3_0_machine_options(MachineClass *m) +@@ -315,6 +316,7 @@ static void pc_q35_3_1_machine_options(MachineClass *m) { pc_q35_machine_options(m); m->alias = "q35"; + SET_MACHINE_COMPAT(m, PC_COMPAT_2_12); } - DEFINE_Q35_MACHINE(v3_0, "pc-q35-3.0", NULL, -@@ -416,3 +418,90 @@ static void pc_q35_2_4_machine_options(MachineClass *m) + DEFINE_Q35_MACHINE(v3_1, "pc-q35-3.1", NULL, +@@ -425,3 +427,90 @@ 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); @@ -415,7 +415,7 @@ index 532241e..c1024c5 100644 +DEFINE_PC_MACHINE(q35_rhel730, "pc-q35-rhel7.3.0", pc_q35_init_rhel730, + pc_q35_machine_rhel730_options); diff --git a/include/hw/i386/pc.h b/include/hw/i386/pc.h -index 6894f37..ef82513 100644 +index 136fe49..f8f35af 100644 --- a/include/hw/i386/pc.h +++ b/include/hw/i386/pc.h @@ -134,6 +134,9 @@ struct PCMachineClass { @@ -428,7 +428,7 @@ index 6894f37..ef82513 100644 }; #define TYPE_PC_MACHINE "generic-pc-machine" -@@ -960,4 +963,565 @@ bool e820_get_entry(int, uint32_t, uint64_t *, uint64_t *); +@@ -976,4 +979,565 @@ bool e820_get_entry(int, uint32_t, uint64_t *, uint64_t *); type_init(pc_machine_init_##suffix) extern void igd_passthrough_isa_bridge_create(PCIBus *bus, uint16_t gpu_dev_id); @@ -995,10 +995,10 @@ index 6894f37..ef82513 100644 + }, #endif diff --git a/target/i386/cpu.c b/target/i386/cpu.c -index 338ee37..051018a 100644 +index e9b9183..573de14 100644 --- a/target/i386/cpu.c +++ b/target/i386/cpu.c -@@ -1360,11 +1360,17 @@ static CPUCaches epyc_cache_info = { +@@ -1437,11 +1437,17 @@ static CPUCaches epyc_cache_info = { static X86CPUDefinition builtin_x86_defs[] = { { @@ -1017,7 +1017,7 @@ index 338ee37..051018a 100644 .stepping = 3, .features[FEAT_1_EDX] = CPUID_SSE2 | CPUID_SSE | CPUID_FXSR | CPUID_MMX | CPUID_CLFLUSH | CPUID_PSE36 | CPUID_PAT | CPUID_CMOV | -@@ -2684,6 +2690,7 @@ static PropValue kvm_default_props[] = { +@@ -2934,6 +2940,7 @@ static PropValue kvm_default_props[] = { { "acpi", "off" }, { "monitor", "off" }, { "svm", "off" }, @@ -1026,10 +1026,10 @@ index 338ee37..051018a 100644 }; diff --git a/target/i386/machine.c b/target/i386/machine.c -index 084c2c7..0c57c26 100644 +index 225b5d4..c60e1b8 100644 --- a/target/i386/machine.c +++ b/target/i386/machine.c -@@ -955,6 +955,26 @@ static const VMStateDescription vmstate_svm_npt = { +@@ -964,6 +964,26 @@ static const VMStateDescription vmstate_svm_npt = { } }; @@ -1056,7 +1056,7 @@ index 084c2c7..0c57c26 100644 VMStateDescription vmstate_x86_cpu = { .name = "cpu", .version_id = 12, -@@ -1080,6 +1100,7 @@ VMStateDescription vmstate_x86_cpu = { +@@ -1089,6 +1109,7 @@ VMStateDescription vmstate_x86_cpu = { &vmstate_msr_intel_pt, &vmstate_msr_virt_ssbd, &vmstate_svm_npt, diff --git a/0011-Enable-make-check.patch b/0011-Enable-make-check.patch deleted file mode 100644 index 1be86ed..0000000 --- a/0011-Enable-make-check.patch +++ /dev/null @@ -1,498 +0,0 @@ -From f4e3d697cb6a18301b1279c0b07896eb5b228aa9 Mon Sep 17 00:00:00 2001 -From: Miroslav Rezanina -Date: Thu, 8 Nov 2018 12:03:48 +0100 -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 ---- - redhat/qemu-kvm.spec.template | 2 +- - tests/Makefile.include | 123 +++++++++++++++++++++--------------------- - tests/boot-serial-test.c | 6 ++- - tests/cpu-plug-test.c | 3 +- - tests/e1000-test.c | 2 + - tests/endianness-test.c | 2 + - tests/prom-env-test.c | 2 + - tests/qemu-iotests/051 | 12 ++--- - tests/qemu-iotests/group | 4 +- - tests/qom-test.c | 2 +- - tests/test-x86-cpuid-compat.c | 2 + - tests/usb-hcd-xhci-test.c | 4 ++ - 12 files changed, 91 insertions(+), 73 deletions(-) - -diff --git a/tests/Makefile.include b/tests/Makefile.include -index a492827..4b78396 100644 ---- a/tests/Makefile.include -+++ b/tests/Makefile.include -@@ -184,8 +184,8 @@ gcov-files-generic-y = qdev-monitor.c qmp.c - check-qtest-generic-y += tests/cdrom-test$(EXESUF) - - gcov-files-ipack-y += hw/ipack/ipack.c --check-qtest-ipack-y += tests/ipoctal232-test$(EXESUF) --gcov-files-ipack-y += hw/char/ipoctal232.c -+#check-qtest-ipack-y += tests/ipoctal232-test$(EXESUF) -+#gcov-files-ipack-y += hw/char/ipoctal232.c - - check-qtest-virtioserial-y += tests/virtio-console-test$(EXESUF) - gcov-files-virtioserial-y += hw/char/virtio-console.c -@@ -217,23 +217,23 @@ check-qtest-pci-y += tests/e1000e-test$(EXESUF) - gcov-files-pci-y += hw/net/e1000e.c hw/net/e1000e_core.c - check-qtest-pci-y += tests/rtl8139-test$(EXESUF) - gcov-files-pci-y += hw/net/rtl8139.c --check-qtest-pci-y += tests/pcnet-test$(EXESUF) --gcov-files-pci-y += hw/net/pcnet.c --gcov-files-pci-y += hw/net/pcnet-pci.c --check-qtest-pci-y += tests/eepro100-test$(EXESUF) --gcov-files-pci-y += hw/net/eepro100.c --check-qtest-pci-y += tests/ne2000-test$(EXESUF) --gcov-files-pci-y += hw/net/ne2000.c --check-qtest-pci-y += tests/nvme-test$(EXESUF) --gcov-files-pci-y += hw/block/nvme.c -+#check-qtest-pci-y += tests/pcnet-test$(EXESUF) -+#gcov-files-pci-y += hw/net/pcnet.c -+#gcov-files-pci-y += hw/net/pcnet-pci.c -+#check-qtest-pci-y += tests/eepro100-test$(EXESUF) -+#gcov-files-pci-y += hw/net/eepro100.c -+#check-qtest-pci-y += tests/ne2000-test$(EXESUF) -+#gcov-files-pci-y += hw/net/ne2000.c -+#check-qtest-pci-y += tests/nvme-test$(EXESUF) -+#gcov-files-pci-y += hw/block/nvme.c - check-qtest-pci-y += tests/ac97-test$(EXESUF) - gcov-files-pci-y += hw/audio/ac97.c --check-qtest-pci-y += tests/es1370-test$(EXESUF) --gcov-files-pci-y += hw/audio/es1370.c -+#check-qtest-pci-y += tests/es1370-test$(EXESUF) -+#gcov-files-pci-y += hw/audio/es1370.c - check-qtest-pci-y += $(check-qtest-virtio-y) - gcov-files-pci-y += $(gcov-files-virtio-y) hw/virtio/virtio-pci.c --check-qtest-pci-y += tests/tpci200-test$(EXESUF) --gcov-files-pci-y += hw/ipack/tpci200.c -+#check-qtest-pci-y += tests/tpci200-test$(EXESUF) -+#gcov-files-pci-y += hw/ipack/tpci200.c - check-qtest-pci-y += $(check-qtest-ipack-y) - gcov-files-pci-y += $(gcov-files-ipack-y) - check-qtest-pci-y += tests/display-vga-test$(EXESUF) -@@ -245,25 +245,25 @@ gcov-files-pci-y += hw/display/virtio-gpu-pci.c - gcov-files-pci-$(CONFIG_VIRTIO_VGA) += hw/display/virtio-vga.c - check-qtest-pci-y += tests/intel-hda-test$(EXESUF) - gcov-files-pci-y += hw/audio/intel-hda.c hw/audio/hda-codec.c --check-qtest-pci-$(CONFIG_IVSHMEM) += tests/ivshmem-test$(EXESUF) --gcov-files-pci-y += hw/misc/ivshmem.c --check-qtest-pci-y += tests/megasas-test$(EXESUF) --gcov-files-pci-y += hw/scsi/megasas.c -+check-qtest-pci-$(CONFIG_IVSHMEM_DEVICE) += tests/ivshmem-test$(EXESUF) -+gcov-files-pci-$(CONFIG_IVSHMEM_DEVICE) += hw/misc/ivshmem.c -+#check-qtest-pci-y += tests/megasas-test$(EXESUF) -+#gcov-files-pci-y += hw/scsi/megasas.c - - check-qtest-i386-y = tests/endianness-test$(EXESUF) --check-qtest-i386-y += tests/fdc-test$(EXESUF) --gcov-files-i386-y = hw/block/fdc.c -+#check-qtest-i386-y += tests/fdc-test$(EXESUF) -+#gcov-files-i386-y = hw/block/fdc.c - check-qtest-i386-y += tests/ide-test$(EXESUF) - check-qtest-i386-y += tests/ahci-test$(EXESUF) - check-qtest-i386-y += tests/hd-geo-test$(EXESUF) - gcov-files-i386-y += hw/block/hd-geometry.c - check-qtest-i386-y += tests/boot-order-test$(EXESUF) --check-qtest-i386-y += tests/bios-tables-test$(EXESUF) -+#check-qtest-i386-y += tests/bios-tables-test$(EXESUF) - check-qtest-i386-y += tests/boot-serial-test$(EXESUF) - check-qtest-i386-$(CONFIG_SLIRP) += tests/pxe-test$(EXESUF) - check-qtest-i386-y += tests/rtc-test$(EXESUF) --check-qtest-i386-y += tests/ipmi-kcs-test$(EXESUF) --check-qtest-i386-y += tests/ipmi-bt-test$(EXESUF) -+#check-qtest-i386-y += tests/ipmi-kcs-test$(EXESUF) -+#check-qtest-i386-y += tests/ipmi-bt-test$(EXESUF) - check-qtest-i386-y += tests/i440fx-test$(EXESUF) - check-qtest-i386-y += tests/fw_cfg-test$(EXESUF) - check-qtest-i386-y += tests/drive_del-test$(EXESUF) -@@ -272,8 +272,8 @@ check-qtest-i386-y += tests/tco-test$(EXESUF) - gcov-files-i386-y += hw/watchdog/watchdog.c hw/watchdog/wdt_ib700.c - check-qtest-i386-y += $(check-qtest-pci-y) - gcov-files-i386-y += $(gcov-files-pci-y) --check-qtest-i386-y += tests/vmxnet3-test$(EXESUF) --gcov-files-i386-y += hw/net/vmxnet3.c -+#check-qtest-i386-y += tests/vmxnet3-test$(EXESUF) -+#gcov-files-i386-y += hw/net/vmxnet3.c - gcov-files-i386-y += hw/net/net_rx_pkt.c - gcov-files-i386-y += hw/net/net_tx_pkt.c - check-qtest-i386-y += tests/pvpanic-test$(EXESUF) -@@ -282,8 +282,8 @@ check-qtest-i386-y += tests/i82801b11-test$(EXESUF) - gcov-files-i386-y += hw/pci-bridge/i82801b11.c - check-qtest-i386-y += tests/ioh3420-test$(EXESUF) - gcov-files-i386-y += hw/pci-bridge/ioh3420.c --check-qtest-i386-y += tests/usb-hcd-ohci-test$(EXESUF) --gcov-files-i386-y += hw/usb/hcd-ohci.c -+#check-qtest-i386-y += tests/usb-hcd-ohci-test$(EXESUF) -+#gcov-files-i386-y += hw/usb/hcd-ohci.c - check-qtest-i386-y += tests/usb-hcd-uhci-test$(EXESUF) - gcov-files-i386-y += hw/usb/hcd-uhci.c - check-qtest-i386-y += tests/usb-hcd-ehci-test$(EXESUF) -@@ -311,7 +311,7 @@ check-qtest-i386-y += tests/migration-test$(EXESUF) - check-qtest-i386-y += tests/test-x86-cpuid-compat$(EXESUF) - check-qtest-i386-y += tests/numa-test$(EXESUF) - check-qtest-x86_64-y += $(check-qtest-i386-y) --check-qtest-x86_64-y += tests/sdhci-test$(EXESUF) -+#check-qtest-x86_64-y += tests/sdhci-test$(EXESUF) - gcov-files-i386-y += i386-softmmu/hw/timer/mc146818rtc.c - gcov-files-x86_64-y = $(subst i386-softmmu/,x86_64-softmmu/,$(gcov-files-i386-y)) - -@@ -332,34 +332,35 @@ check-qtest-mips64el-y = tests/endianness-test$(EXESUF) - check-qtest-moxie-y = tests/boot-serial-test$(EXESUF) - - check-qtest-ppc-y = tests/endianness-test$(EXESUF) --check-qtest-ppc-y += tests/boot-order-test$(EXESUF) -+#check-qtest-ppc-y += tests/boot-order-test$(EXESUF) - check-qtest-ppc-y += tests/prom-env-test$(EXESUF) - check-qtest-ppc-y += tests/drive_del-test$(EXESUF) - check-qtest-ppc-y += tests/boot-serial-test$(EXESUF) --check-qtest-ppc-y += tests/m48t59-test$(EXESUF) --gcov-files-ppc-y += hw/timer/m48t59.c -+#check-qtest-ppc-y += tests/m48t59-test$(EXESUF) -+#gcov-files-ppc-y += hw/timer/m48t59.c - - check-qtest-ppc64-y = $(check-qtest-ppc-y) - gcov-files-ppc64-y = $(subst ppc-softmmu/,ppc64-softmmu/,$(gcov-files-ppc-y)) - check-qtest-ppc64-y += tests/spapr-phb-test$(EXESUF) - gcov-files-ppc64-y += ppc64-softmmu/hw/ppc/spapr_pci.c --check-qtest-ppc64-y += tests/pnv-xscom-test$(EXESUF) -+#check-qtest-ppc64-y += tests/pnv-xscom-test$(EXESUF) - check-qtest-ppc64-y += tests/migration-test$(EXESUF) - check-qtest-ppc64-y += tests/rtas-test$(EXESUF) - check-qtest-ppc64-$(CONFIG_SLIRP) += tests/pxe-test$(EXESUF) --check-qtest-ppc64-y += tests/usb-hcd-ohci-test$(EXESUF) --gcov-files-ppc64-y += hw/usb/hcd-ohci.c --check-qtest-ppc64-y += tests/usb-hcd-uhci-test$(EXESUF) --gcov-files-ppc64-y += hw/usb/hcd-uhci.c -+#check-qtest-ppc64-y += tests/usb-hcd-ohci-test$(EXESUF) -+#gcov-files-ppc64-y += hw/usb/hcd-ohci.c -+#check-qtest-ppc64-y += tests/usb-hcd-uhci-test$(EXESUF) -+#gcov-files-ppc64-y += hw/usb/hcd-uhci.c - check-qtest-ppc64-y += tests/usb-hcd-xhci-test$(EXESUF) - gcov-files-ppc64-y += hw/usb/hcd-xhci.c - check-qtest-ppc64-y += $(check-qtest-virtio-y) --check-qtest-ppc64-$(CONFIG_SLIRP) += tests/test-netfilter$(EXESUF) --check-qtest-ppc64-$(CONFIG_POSIX) += tests/test-filter-mirror$(EXESUF) --check-qtest-ppc64-$(CONFIG_POSIX) += tests/test-filter-redirector$(EXESUF) -+#check-qtest-ppc64-$(CONFIG_SLIRP) += tests/test-netfilter$(EXESUF) -+#check-qtest-ppc64-$(CONFIG_POSIX) += tests/test-filter-mirror$(EXESUF) -+#check-qtest-ppc64-$(CONFIG_POSIX) += tests/test-filter-redirector$(EXESUF) - check-qtest-ppc64-y += tests/display-vga-test$(EXESUF) - check-qtest-ppc64-y += tests/numa-test$(EXESUF) --check-qtest-ppc64-$(CONFIG_IVSHMEM) += tests/ivshmem-test$(EXESUF) -+check-qtest-ppc64-$(CONFIG_IVSHMEM_DEVICE) += tests/ivshmem-test$(EXESUF) -+gcov-files-ppc64-$(CONFIG_IVSHMEM_DEVICE) += hw/misc/ivshmem.c - check-qtest-ppc64-y += tests/cpu-plug-test$(EXESUF) - - check-qtest-sh4-y = tests/endianness-test$(EXESUF) -@@ -388,7 +389,7 @@ check-qtest-arm-y += tests/boot-serial-test$(EXESUF) - check-qtest-arm-y += tests/sdhci-test$(EXESUF) - - check-qtest-aarch64-y = tests/numa-test$(EXESUF) --check-qtest-aarch64-y += tests/sdhci-test$(EXESUF) -+#check-qtest-aarch64-y += tests/sdhci-test$(EXESUF) - check-qtest-aarch64-y += tests/boot-serial-test$(EXESUF) - - check-qtest-microblazeel-y = $(check-qtest-microblaze-y) -@@ -777,15 +778,15 @@ tests/endianness-test$(EXESUF): tests/endianness-test.o - tests/spapr-phb-test$(EXESUF): tests/spapr-phb-test.o $(libqos-obj-y) - tests/prom-env-test$(EXESUF): tests/prom-env-test.o $(libqos-obj-y) - tests/rtas-test$(EXESUF): tests/rtas-test.o $(libqos-spapr-obj-y) --tests/fdc-test$(EXESUF): tests/fdc-test.o -+#tests/fdc-test$(EXESUF): tests/fdc-test.o - tests/ide-test$(EXESUF): tests/ide-test.o $(libqos-pc-obj-y) - tests/ahci-test$(EXESUF): tests/ahci-test.o $(libqos-pc-obj-y) --tests/ipmi-kcs-test$(EXESUF): tests/ipmi-kcs-test.o --tests/ipmi-bt-test$(EXESUF): tests/ipmi-bt-test.o -+#tests/ipmi-kcs-test$(EXESUF): tests/ipmi-kcs-test.o -+#tests/ipmi-bt-test$(EXESUF): tests/ipmi-bt-test.o - tests/hd-geo-test$(EXESUF): tests/hd-geo-test.o - tests/boot-order-test$(EXESUF): tests/boot-order-test.o $(libqos-obj-y) - tests/boot-serial-test$(EXESUF): tests/boot-serial-test.o $(libqos-obj-y) --tests/bios-tables-test$(EXESUF): tests/bios-tables-test.o \ -+#tests/bios-tables-test$(EXESUF): tests/bios-tables-test.o \ - tests/boot-sector.o tests/acpi-utils.o $(libqos-obj-y) - tests/pxe-test$(EXESUF): tests/pxe-test.o tests/boot-sector.o $(libqos-obj-y) - tests/tmp105-test$(EXESUF): tests/tmp105-test.o $(libqos-omap-obj-y) -@@ -798,11 +799,11 @@ tests/fw_cfg-test$(EXESUF): tests/fw_cfg-test.o $(libqos-pc-obj-y) - tests/e1000-test$(EXESUF): tests/e1000-test.o - tests/e1000e-test$(EXESUF): tests/e1000e-test.o $(libqos-pc-obj-y) - tests/rtl8139-test$(EXESUF): tests/rtl8139-test.o $(libqos-pc-obj-y) --tests/pcnet-test$(EXESUF): tests/pcnet-test.o --tests/pnv-xscom-test$(EXESUF): tests/pnv-xscom-test.o --tests/eepro100-test$(EXESUF): tests/eepro100-test.o --tests/vmxnet3-test$(EXESUF): tests/vmxnet3-test.o --tests/ne2000-test$(EXESUF): tests/ne2000-test.o -+#tests/pcnet-test$(EXESUF): tests/pcnet-test.o -+#tests/pnv-xscom-test$(EXESUF): tests/pnv-xscom-test.o -+#tests/eepro100-test$(EXESUF): tests/eepro100-test.o -+#tests/vmxnet3-test$(EXESUF): tests/vmxnet3-test.o -+#tests/ne2000-test$(EXESUF): tests/ne2000-test.o - tests/wdt_ib700-test$(EXESUF): tests/wdt_ib700-test.o - tests/tco-test$(EXESUF): tests/tco-test.o $(libqos-pc-obj-y) - tests/virtio-balloon-test$(EXESUF): tests/virtio-balloon-test.o $(libqos-virtio-obj-y) -@@ -813,22 +814,22 @@ tests/virtio-scsi-test$(EXESUF): tests/virtio-scsi-test.o $(libqos-virtio-obj-y) - tests/virtio-9p-test$(EXESUF): tests/virtio-9p-test.o $(libqos-virtio-obj-y) - tests/virtio-serial-test$(EXESUF): tests/virtio-serial-test.o $(libqos-virtio-obj-y) - tests/virtio-console-test$(EXESUF): tests/virtio-console-test.o $(libqos-virtio-obj-y) --tests/tpci200-test$(EXESUF): tests/tpci200-test.o -+#tests/tpci200-test$(EXESUF): tests/tpci200-test.o - tests/display-vga-test$(EXESUF): tests/display-vga-test.o --tests/ipoctal232-test$(EXESUF): tests/ipoctal232-test.o -+#tests/ipoctal232-test$(EXESUF): tests/ipoctal232-test.o - tests/qom-test$(EXESUF): tests/qom-test.o - tests/test-hmp$(EXESUF): tests/test-hmp.o - tests/machine-none-test$(EXESUF): tests/machine-none-test.o - tests/drive_del-test$(EXESUF): tests/drive_del-test.o $(libqos-virtio-obj-y) - tests/qdev-monitor-test$(EXESUF): tests/qdev-monitor-test.o $(libqos-pc-obj-y) --tests/nvme-test$(EXESUF): tests/nvme-test.o -+#tests/nvme-test$(EXESUF): tests/nvme-test.o - tests/pvpanic-test$(EXESUF): tests/pvpanic-test.o - tests/i82801b11-test$(EXESUF): tests/i82801b11-test.o - tests/ac97-test$(EXESUF): tests/ac97-test.o --tests/es1370-test$(EXESUF): tests/es1370-test.o -+#tests/es1370-test$(EXESUF): tests/es1370-test.o - tests/intel-hda-test$(EXESUF): tests/intel-hda-test.o - tests/ioh3420-test$(EXESUF): tests/ioh3420-test.o --tests/usb-hcd-ohci-test$(EXESUF): tests/usb-hcd-ohci-test.o $(libqos-usb-obj-y) -+#tests/usb-hcd-ohci-test$(EXESUF): tests/usb-hcd-ohci-test.o $(libqos-usb-obj-y) - tests/usb-hcd-uhci-test$(EXESUF): tests/usb-hcd-uhci-test.o $(libqos-usb-obj-y) - tests/usb-hcd-ehci-test$(EXESUF): tests/usb-hcd-ehci-test.o $(libqos-usb-obj-y) - tests/usb-hcd-xhci-test$(EXESUF): tests/usb-hcd-xhci-test.o $(libqos-usb-obj-y) -@@ -841,19 +842,19 @@ tests/qemu-iotests/socket_scm_helper$(EXESUF): tests/qemu-iotests/socket_scm_hel - tests/test-qemu-opts$(EXESUF): tests/test-qemu-opts.o $(test-util-obj-y) - tests/test-keyval$(EXESUF): tests/test-keyval.o $(test-util-obj-y) $(test-qapi-obj-y) - tests/test-write-threshold$(EXESUF): tests/test-write-threshold.o $(test-block-obj-y) --tests/test-netfilter$(EXESUF): tests/test-netfilter.o $(qtest-obj-y) --tests/test-filter-mirror$(EXESUF): tests/test-filter-mirror.o $(qtest-obj-y) --tests/test-filter-redirector$(EXESUF): tests/test-filter-redirector.o $(qtest-obj-y) -+#tests/test-netfilter$(EXESUF): tests/test-netfilter.o $(qtest-obj-y) -+#tests/test-filter-mirror$(EXESUF): tests/test-filter-mirror.o $(qtest-obj-y) -+#tests/test-filter-redirector$(EXESUF): tests/test-filter-redirector.o $(qtest-obj-y) - tests/test-x86-cpuid-compat$(EXESUF): tests/test-x86-cpuid-compat.o $(qtest-obj-y) - tests/ivshmem-test$(EXESUF): tests/ivshmem-test.o contrib/ivshmem-server/ivshmem-server.o $(libqos-pc-obj-y) $(libqos-spapr-obj-y) --tests/megasas-test$(EXESUF): tests/megasas-test.o $(libqos-spapr-obj-y) $(libqos-pc-obj-y) -+#tests/megasas-test$(EXESUF): tests/megasas-test.o $(libqos-spapr-obj-y) $(libqos-pc-obj-y) - tests/vhost-user-bridge$(EXESUF): tests/vhost-user-bridge.o $(test-util-obj-y) libvhost-user.a - tests/test-uuid$(EXESUF): tests/test-uuid.o $(test-util-obj-y) - tests/test-arm-mptimer$(EXESUF): tests/test-arm-mptimer.o - tests/test-qapi-util$(EXESUF): tests/test-qapi-util.o $(test-util-obj-y) - tests/numa-test$(EXESUF): tests/numa-test.o - tests/vmgenid-test$(EXESUF): tests/vmgenid-test.o tests/boot-sector.o tests/acpi-utils.o --tests/sdhci-test$(EXESUF): tests/sdhci-test.o $(libqos-pc-obj-y) -+#tests/sdhci-test$(EXESUF): tests/sdhci-test.o $(libqos-pc-obj-y) - tests/cdrom-test$(EXESUF): tests/cdrom-test.o tests/boot-sector.o $(libqos-obj-y) - - tests/migration/stress$(EXESUF): tests/migration/stress.o -diff --git a/tests/boot-serial-test.c b/tests/boot-serial-test.c -index 952a2e7..5217a39 100644 ---- a/tests/boot-serial-test.c -+++ b/tests/boot-serial-test.c -@@ -80,17 +80,21 @@ 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", "prep", "-boot e", "Booting from device e" }, - { "ppc64", "40p", "-m 192", "Memory size: 192 MB" }, - { "ppc64", "mac99", "", "PowerPC,970FX" }, -+#endif - { "ppc64", "pseries", "", "Open Firmware" }, -+#if 0 /* Disabled for Red Hat Enterprise Linux */ - { "ppc64", "powernv", "-cpu POWER8", "OPAL" }, - { "ppc64", "sam460ex", "-device e1000", "8086 100e" }, -+#endif - { "i386", "isapc", "-cpu qemu32 -device sga", "SGABIOS" }, - { "i386", "pc", "-device sga", "SGABIOS" }, - { "i386", "q35", "-device sga", "SGABIOS" }, -- { "x86_64", "isapc", "-cpu qemu32 -device sga", "SGABIOS" }, -+ { "x86_64", "pc", "-cpu qemu32 -device sga", "SGABIOS" }, - { "x86_64", "q35", "-device sga", "SGABIOS" }, - { "sparc", "LX", "", "TMS390S10" }, - { "sparc", "SS-4", "", "MB86904" }, -diff --git a/tests/cpu-plug-test.c b/tests/cpu-plug-test.c -index 5f39ba0..48b8d09 100644 ---- a/tests/cpu-plug-test.c -+++ b/tests/cpu-plug-test.c -@@ -192,7 +192,8 @@ static void add_pseries_test_case(const char *mname) - PlugTestData *data; - - if (!g_str_has_prefix(mname, "pseries-") || -- (g_str_has_prefix(mname, "pseries-2.") && atoi(&mname[10]) < 7)) { -+ (g_str_has_prefix(mname, "pseries-2.") && atoi(&mname[10]) < 7) || -+ strcmp(mname,"pseries-rhel7.2.0") == 0) { - return; - } - data = g_new(PlugTestData, 1); -diff --git a/tests/e1000-test.c b/tests/e1000-test.c -index 0c5fcdc..b830432 100644 ---- a/tests/e1000-test.c -+++ b/tests/e1000-test.c -@@ -29,8 +29,10 @@ static void test_device(gconstpointer data) - static const char *models[] = { - "e1000", - "e1000-82540em", -+#if 0 /* Disabled for Red Hat Enterprise Linux */ - "e1000-82544gc", - "e1000-82545em", -+#endif - }; - - int main(int argc, char **argv) -diff --git a/tests/endianness-test.c b/tests/endianness-test.c -index 546e096..440353d 100644 ---- a/tests/endianness-test.c -+++ b/tests/endianness-test.c -@@ -37,10 +37,12 @@ static const TestCase test_cases[] = { - { "ppc", "g3beige", 0xfe000000, .bswap = true, .superio = "i82378" }, - { "ppc", "prep", 0x80000000, .bswap = true }, - { "ppc", "bamboo", 0xe8000000, .bswap = true, .superio = "i82378" }, -+#if 0 /* Disabled for RHEL, since ISA is not enabled */ - { "ppc64", "mac99", 0xf2000000, .bswap = true, .superio = "i82378" }, - { "ppc64", "pseries", (1ULL << 45), .bswap = true, .superio = "i82378" }, - { "ppc64", "pseries-2.7", 0x10080000000ULL, - .bswap = true, .superio = "i82378" }, -+#endif /* Disabled for RHEL, since ISA is not enabled */ - { "sh4", "r2d", 0xfe240000, .superio = "i82378" }, - { "sh4eb", "r2d", 0xfe240000, .bswap = true, .superio = "i82378" }, - { "sparc64", "sun4u", 0x1fe02000000LL, .bswap = true }, -diff --git a/tests/prom-env-test.c b/tests/prom-env-test.c -index 8c867e6..cc9b6ec 100644 ---- a/tests/prom-env-test.c -+++ b/tests/prom-env-test.c -@@ -82,7 +82,9 @@ 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); -+#endif - if (g_test_slow()) { - qtest_add_data_func("prom-env/pseries", "pseries", test_machine); - } -diff --git a/tests/qemu-iotests/051 b/tests/qemu-iotests/051 -index ee9c820..c5cc0ee 100755 ---- a/tests/qemu-iotests/051 -+++ b/tests/qemu-iotests/051 -@@ -183,11 +183,11 @@ run_qemu -drive if=virtio - case "$QEMU_DEFAULT_MACHINE" in - pc) - run_qemu -drive if=none,id=disk -device ide-cd,drive=disk -- 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-drive,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-disk,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-disk,drive=disk -+# run_qemu -drive if=none,id=disk -device lsi53c895a -device scsi-hd,drive=disk - ;; - *) - ;; -@@ -212,11 +212,11 @@ run_qemu -drive file="$TEST_IMG",if=virtio,readonly=on - case "$QEMU_DEFAULT_MACHINE" in - pc) - run_qemu -drive file="$TEST_IMG",if=none,id=disk,readonly=on -device ide-cd,drive=disk -- 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-drive,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-disk,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-disk,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/qemu-iotests/group b/tests/qemu-iotests/group -index b973dc8..f1059f6 100644 ---- a/tests/qemu-iotests/group -+++ b/tests/qemu-iotests/group -@@ -77,7 +77,7 @@ - 068 rw auto quick - 069 rw auto quick - 070 rw auto quick --071 rw auto quick -+# 071 rw auto quick -- requires whitelisted blkverify - 072 rw auto quick - 073 rw auto quick - 074 rw auto quick -@@ -105,7 +105,7 @@ - 096 rw auto quick - 097 rw auto backing - 098 rw auto backing quick --099 rw auto quick -+# 099 rw auto quick -- requires whitelisted blkverify - # 100 was removed, do not reuse - 101 rw auto quick - 102 rw auto quick -diff --git a/tests/qom-test.c b/tests/qom-test.c -index e6f712c..ebd15fd 100644 ---- a/tests/qom-test.c -+++ b/tests/qom-test.c -@@ -16,7 +16,7 @@ - #include "libqtest.h" - - static const char *blacklist_x86[] = { -- "xenfv", "xenpv", NULL -+ "xenfv", "xenpv", "isapc", NULL - }; - - static const struct { -diff --git a/tests/test-x86-cpuid-compat.c b/tests/test-x86-cpuid-compat.c -index 84ce9c7..c1ee197 100644 ---- a/tests/test-x86-cpuid-compat.c -+++ b/tests/test-x86-cpuid-compat.c -@@ -306,6 +306,7 @@ int main(int argc, char **argv) - "-cpu 486,xlevel2=0xC0000002,+xstore", - "xlevel2", 0xC0000002); - -+#if 0 /* Disabled in Red Hat Enterprise Linux */ - /* Check compatibility of old machine-types that didn't - * auto-increase level/xlevel/xlevel2: */ - -@@ -356,6 +357,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,+npt", - "xlevel", 0x80000008); -+#endif - - /* Test feature parsing */ - add_feature_test("x86/cpuid/features/plus", -diff --git a/tests/usb-hcd-xhci-test.c b/tests/usb-hcd-xhci-test.c -index 5b1b681..85fa150 100644 ---- a/tests/usb-hcd-xhci-test.c -+++ b/tests/usb-hcd-xhci-test.c -@@ -21,6 +21,7 @@ static void test_xhci_hotplug(void) - usb_test_hotplug("xhci", 1, NULL); - } - -+#if 0 /* Disabled for Red Hat Enterprise Linux */ - static void test_usb_uas_hotplug(void) - { - qtest_qmp_device_add("usb-uas", "uas", NULL); -@@ -34,6 +35,7 @@ static void test_usb_uas_hotplug(void) - qtest_qmp_device_del("scsihd"); - qtest_qmp_device_del("uas"); - } -+#endif - - static void test_usb_ccid_hotplug(void) - { -@@ -52,7 +54,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" --- -1.8.3.1 - diff --git a/0012-Enable-make-check.patch b/0012-Enable-make-check.patch new file mode 100644 index 0000000..23edace --- /dev/null +++ b/0012-Enable-make-check.patch @@ -0,0 +1,298 @@ +From 51a0ce09fb01c87cb9bd7f1fca850e8d5d573f5f Mon Sep 17 00:00:00 2001 +From: Miroslav Rezanina +Date: Fri, 19 Oct 2018 13:48: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 +--- + redhat/qemu-kvm.spec.template | 2 +- + tests/Makefile.include | 32 ++++++++++++++++---------------- + tests/boot-serial-test.c | 6 +++++- + tests/cpu-plug-test.c | 3 ++- + tests/e1000-test.c | 2 ++ + tests/prom-env-test.c | 2 ++ + tests/qemu-iotests/051 | 12 ++++++------ + tests/qemu-iotests/group | 4 ++-- + tests/test-x86-cpuid-compat.c | 2 ++ + tests/usb-hcd-xhci-test.c | 4 ++++ + 10 files changed, 42 insertions(+), 27 deletions(-) + +diff --git a/tests/Makefile.include b/tests/Makefile.include +index 613242b..baeb608 100644 +--- a/tests/Makefile.include ++++ b/tests/Makefile.include +@@ -171,20 +171,20 @@ check-qtest-pci-$(CONFIG_IPACK) += $(check-qtest-ipack-y) + check-qtest-pci-y += tests/display-vga-test$(EXESUF) + check-qtest-pci-$(CONFIG_HDA) += tests/intel-hda-test$(EXESUF) + check-qtest-pci-$(CONFIG_IVSHMEM_DEVICE) += tests/ivshmem-test$(EXESUF) +-check-qtest-pci-y += tests/megasas-test$(EXESUF) ++#check-qtest-pci-y += tests/megasas-test$(EXESUF) + + check-qtest-i386-$(CONFIG_ISA_TESTDEV) = tests/endianness-test$(EXESUF) +-check-qtest-i386-y += tests/fdc-test$(EXESUF) ++#check-qtest-i386-y += tests/fdc-test$(EXESUF) + check-qtest-i386-y += tests/ide-test$(EXESUF) + check-qtest-i386-y += tests/ahci-test$(EXESUF) + check-qtest-i386-y += tests/hd-geo-test$(EXESUF) + check-qtest-i386-y += tests/boot-order-test$(EXESUF) +-check-qtest-i386-y += tests/bios-tables-test$(EXESUF) ++#check-qtest-i386-y += tests/bios-tables-test$(EXESUF) + check-qtest-i386-$(CONFIG_SGA) += tests/boot-serial-test$(EXESUF) + check-qtest-i386-$(CONFIG_SLIRP) += tests/pxe-test$(EXESUF) + check-qtest-i386-y += tests/rtc-test$(EXESUF) +-check-qtest-i386-y += tests/ipmi-kcs-test$(EXESUF) +-check-qtest-i386-y += tests/ipmi-bt-test$(EXESUF) ++#check-qtest-i386-y += tests/ipmi-kcs-test$(EXESUF) ++#check-qtest-i386-y += tests/ipmi-bt-test$(EXESUF) + check-qtest-i386-y += tests/i440fx-test$(EXESUF) + check-qtest-i386-y += tests/fw_cfg-test$(EXESUF) + check-qtest-i386-y += tests/drive_del-test$(EXESUF) +@@ -238,15 +238,15 @@ check-qtest-mips64el-$(CONFIG_ISA_TESTDEV) = tests/endianness-test$(EXESUF) + check-qtest-moxie-y += tests/boot-serial-test$(EXESUF) + + check-qtest-ppc-$(CONFIG_ISA_TESTDEV) = tests/endianness-test$(EXESUF) +-check-qtest-ppc-y += tests/boot-order-test$(EXESUF) ++#check-qtest-ppc-y += tests/boot-order-test$(EXESUF) + check-qtest-ppc-y += tests/prom-env-test$(EXESUF) + check-qtest-ppc-y += tests/drive_del-test$(EXESUF) + check-qtest-ppc-y += tests/boot-serial-test$(EXESUF) +-check-qtest-ppc-y += tests/m48t59-test$(EXESUF) ++#check-qtest-ppc-y += tests/m48t59-test$(EXESUF) + + check-qtest-ppc64-y += $(check-qtest-ppc-y) + check-qtest-ppc64-y += tests/spapr-phb-test$(EXESUF) +-check-qtest-ppc64-y += tests/pnv-xscom-test$(EXESUF) ++#check-qtest-ppc64-y += tests/pnv-xscom-test$(EXESUF) + check-qtest-ppc64-y += tests/migration-test$(EXESUF) + check-qtest-ppc64-y += tests/rtas-test$(EXESUF) + check-qtest-ppc64-$(CONFIG_SLIRP) += tests/pxe-test$(EXESUF) +@@ -254,8 +254,8 @@ check-qtest-ppc64-$(CONFIG_USB_OHCI) += tests/usb-hcd-ohci-test$(EXESUF) + check-qtest-ppc64-$(CONFIG_USB_UHCI) += tests/usb-hcd-uhci-test$(EXESUF) + check-qtest-ppc64-$(CONFIG_USB_XHCI_NEC) += tests/usb-hcd-xhci-test$(EXESUF) + check-qtest-ppc64-y += $(check-qtest-virtio-y) +-check-qtest-ppc64-$(CONFIG_SLIRP) += tests/test-netfilter$(EXESUF) +-check-qtest-ppc64-$(CONFIG_POSIX) += tests/test-filter-mirror$(EXESUF) ++#check-qtest-ppc64-$(CONFIG_SLIRP) += tests/test-netfilter$(EXESUF) ++#check-qtest-ppc64-$(CONFIG_POSIX) += tests/test-filter-mirror$(EXESUF) + check-qtest-ppc64-$(CONFIG_RTL8139_PCI) += tests/test-filter-redirector$(EXESUF) + check-qtest-ppc64-y += tests/display-vga-test$(EXESUF) + check-qtest-ppc64-y += tests/numa-test$(EXESUF) +@@ -685,15 +685,15 @@ tests/endianness-test$(EXESUF): tests/endianness-test.o + tests/spapr-phb-test$(EXESUF): tests/spapr-phb-test.o $(libqos-obj-y) + tests/prom-env-test$(EXESUF): tests/prom-env-test.o $(libqos-obj-y) + tests/rtas-test$(EXESUF): tests/rtas-test.o $(libqos-spapr-obj-y) +-tests/fdc-test$(EXESUF): tests/fdc-test.o ++#tests/fdc-test$(EXESUF): tests/fdc-test.o + tests/ide-test$(EXESUF): tests/ide-test.o $(libqos-pc-obj-y) + tests/ahci-test$(EXESUF): tests/ahci-test.o $(libqos-pc-obj-y) +-tests/ipmi-kcs-test$(EXESUF): tests/ipmi-kcs-test.o +-tests/ipmi-bt-test$(EXESUF): tests/ipmi-bt-test.o ++#tests/ipmi-kcs-test$(EXESUF): tests/ipmi-kcs-test.o ++#tests/ipmi-bt-test$(EXESUF): tests/ipmi-bt-test.o + tests/hd-geo-test$(EXESUF): tests/hd-geo-test.o + tests/boot-order-test$(EXESUF): tests/boot-order-test.o $(libqos-obj-y) + tests/boot-serial-test$(EXESUF): tests/boot-serial-test.o $(libqos-obj-y) +-tests/bios-tables-test$(EXESUF): tests/bios-tables-test.o \ ++#tests/bios-tables-test$(EXESUF): tests/bios-tables-test.o \ + tests/boot-sector.o tests/acpi-utils.o $(libqos-obj-y) + tests/pxe-test$(EXESUF): tests/pxe-test.o tests/boot-sector.o $(libqos-obj-y) + tests/tmp105-test$(EXESUF): tests/tmp105-test.o $(libqos-omap-obj-y) +@@ -707,7 +707,7 @@ tests/e1000-test$(EXESUF): tests/e1000-test.o + tests/e1000e-test$(EXESUF): tests/e1000e-test.o $(libqos-pc-obj-y) + tests/rtl8139-test$(EXESUF): tests/rtl8139-test.o $(libqos-pc-obj-y) + tests/pcnet-test$(EXESUF): tests/pcnet-test.o +-tests/pnv-xscom-test$(EXESUF): tests/pnv-xscom-test.o ++#tests/pnv-xscom-test$(EXESUF): tests/pnv-xscom-test.o + tests/eepro100-test$(EXESUF): tests/eepro100-test.o + tests/vmxnet3-test$(EXESUF): tests/vmxnet3-test.o + tests/ne2000-test$(EXESUF): tests/ne2000-test.o +@@ -755,7 +755,7 @@ tests/test-filter-mirror$(EXESUF): tests/test-filter-mirror.o $(qtest-obj-y) + tests/test-filter-redirector$(EXESUF): tests/test-filter-redirector.o $(qtest-obj-y) + tests/test-x86-cpuid-compat$(EXESUF): tests/test-x86-cpuid-compat.o $(qtest-obj-y) + tests/ivshmem-test$(EXESUF): tests/ivshmem-test.o contrib/ivshmem-server/ivshmem-server.o $(libqos-pc-obj-y) $(libqos-spapr-obj-y) +-tests/megasas-test$(EXESUF): tests/megasas-test.o $(libqos-spapr-obj-y) $(libqos-pc-obj-y) ++#tests/megasas-test$(EXESUF): tests/megasas-test.o $(libqos-spapr-obj-y) $(libqos-pc-obj-y) + tests/vhost-user-bridge$(EXESUF): tests/vhost-user-bridge.o $(test-util-obj-y) libvhost-user.a + tests/test-uuid$(EXESUF): tests/test-uuid.o $(test-util-obj-y) + tests/test-arm-mptimer$(EXESUF): tests/test-arm-mptimer.o +diff --git a/tests/boot-serial-test.c b/tests/boot-serial-test.c +index 8ec6aed..6a533b9 100644 +--- a/tests/boot-serial-test.c ++++ b/tests/boot-serial-test.c +@@ -97,16 +97,20 @@ 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", "", "Open Firmware" }, ++#if 0 /* Disabled for Red Hat Enterprise Linux */ + { "ppc64", "powernv", "-cpu POWER8", "OPAL" }, + { "ppc64", "sam460ex", "-device e1000", "8086 100e" }, ++#endif + { "i386", "isapc", "-cpu qemu32 -device sga", "SGABIOS" }, + { "i386", "pc", "-device sga", "SGABIOS" }, + { "i386", "q35", "-device sga", "SGABIOS" }, +- { "x86_64", "isapc", "-cpu qemu32 -device sga", "SGABIOS" }, ++ { "x86_64", "pc", "-cpu qemu32 -device sga", "SGABIOS" }, + { "x86_64", "q35", "-device sga", "SGABIOS" }, + { "sparc", "LX", "", "TMS390S10" }, + { "sparc", "SS-4", "", "MB86904" }, +diff --git a/tests/cpu-plug-test.c b/tests/cpu-plug-test.c +index f4a677d..70a3d1d 100644 +--- a/tests/cpu-plug-test.c ++++ b/tests/cpu-plug-test.c +@@ -193,7 +193,8 @@ static void add_pseries_test_case(const char *mname) + PlugTestData *data; + + if (!g_str_has_prefix(mname, "pseries-") || +- (g_str_has_prefix(mname, "pseries-2.") && atoi(&mname[10]) < 7)) { ++ (g_str_has_prefix(mname, "pseries-2.") && atoi(&mname[10]) < 7) || ++ strcmp(mname,"pseries-rhel7.2.0") == 0) { + return; + } + data = g_new(PlugTestData, 1); +diff --git a/tests/e1000-test.c b/tests/e1000-test.c +index 0c5fcdc..b830432 100644 +--- a/tests/e1000-test.c ++++ b/tests/e1000-test.c +@@ -29,8 +29,10 @@ static void test_device(gconstpointer data) + static const char *models[] = { + "e1000", + "e1000-82540em", ++#if 0 /* Disabled for Red Hat Enterprise Linux */ + "e1000-82544gc", + "e1000-82545em", ++#endif + }; + + int main(int argc, char **argv) +diff --git a/tests/prom-env-test.c b/tests/prom-env-test.c +index 198d007..4bea07f 100644 +--- a/tests/prom-env-test.c ++++ b/tests/prom-env-test.c +@@ -82,7 +82,9 @@ 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); ++#endif + if (g_test_slow()) { + qtest_add_data_func("prom-env/pseries", "pseries", test_machine); + } +diff --git a/tests/qemu-iotests/051 b/tests/qemu-iotests/051 +index 32741d7..85ef52e 100755 +--- a/tests/qemu-iotests/051 ++++ b/tests/qemu-iotests/051 +@@ -182,11 +182,11 @@ 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-drive,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-disk,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-disk,drive=disk ++# run_qemu -drive if=none,id=disk -device lsi53c895a -device scsi-hd,drive=disk + ;; + *) + ;; +@@ -211,11 +211,11 @@ run_qemu -drive file="$TEST_IMG",if=virtio,readonly=on + case "$QEMU_DEFAULT_MACHINE" in + pc) + run_qemu -drive file="$TEST_IMG",if=none,id=disk,readonly=on -device ide-cd,drive=disk +- 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-drive,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-disk,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-disk,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/qemu-iotests/group b/tests/qemu-iotests/group +index 2722103..ede8887 100644 +--- a/tests/qemu-iotests/group ++++ b/tests/qemu-iotests/group +@@ -77,7 +77,7 @@ + 068 rw auto quick + 069 rw auto quick + 070 rw auto quick +-071 rw auto quick ++# 071 rw auto quick -- requires whitelisted blkverify + 072 rw auto quick + 073 rw auto quick + 074 rw auto quick +@@ -105,7 +105,7 @@ + 096 rw auto quick + 097 rw auto backing + 098 rw auto backing quick +-099 rw auto quick ++# 099 rw auto quick -- requires whitelisted blkverify + # 100 was removed, do not reuse + 101 rw auto quick + 102 rw auto quick +diff --git a/tests/test-x86-cpuid-compat.c b/tests/test-x86-cpuid-compat.c +index e75b959..6b46b73 100644 +--- a/tests/test-x86-cpuid-compat.c ++++ b/tests/test-x86-cpuid-compat.c +@@ -300,6 +300,7 @@ int main(int argc, char **argv) + "-cpu 486,xlevel2=0xC0000002,+xstore", + "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,+npt", + "xlevel", 0x80000008); ++#endif + + /* Test feature parsing */ + add_feature_test("x86/cpuid/features/plus", +diff --git a/tests/usb-hcd-xhci-test.c b/tests/usb-hcd-xhci-test.c +index 9eb24b0..465ed26 100644 +--- a/tests/usb-hcd-xhci-test.c ++++ b/tests/usb-hcd-xhci-test.c +@@ -21,6 +21,7 @@ static void test_xhci_hotplug(void) + usb_test_hotplug("xhci", "1", NULL); + } + ++#if 0 /* Disabled for Red Hat Enterprise Linux */ + static void test_usb_uas_hotplug(void) + { + qtest_qmp_device_add("usb-uas", "uas", "{}"); +@@ -34,6 +35,7 @@ static void test_usb_uas_hotplug(void) + qtest_qmp_device_del("scsihd"); + qtest_qmp_device_del("uas"); + } ++#endif + + static void test_usb_ccid_hotplug(void) + { +@@ -52,7 +54,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" +-- +1.8.3.1 + diff --git a/0012-Use-kvm-by-default.patch b/0013-Use-kvm-by-default.patch similarity index 72% rename from 0012-Use-kvm-by-default.patch rename to 0013-Use-kvm-by-default.patch index d6e2835..2c59bf6 100644 --- a/0012-Use-kvm-by-default.patch +++ b/0013-Use-kvm-by-default.patch @@ -1,4 +1,4 @@ -From ce4cd21e28e1511e056877e3cc8dcf6f0b8c7baa Mon Sep 17 00:00:00 2001 +From b91ee13e30cef65d02e3e0f9324931f1e2589426 Mon Sep 17 00:00:00 2001 From: Miroslav Rezanina Date: Thu, 18 Dec 2014 06:27:49 +0100 Subject: Use kvm by default @@ -8,6 +8,15 @@ Bugzilla: 906185 RHEL uses kvm accelerator by default, if available. Signed-off-by: Miroslav Rezanina + +Rebase notes (2.10.0) +- variable rename (upstream) + +Rebase notes (2.2.0): +- Move code from vl.c to accel.c + +(cherry picked from commit abcd662eb8e516ebe4a6b401e83a62f749491a15) +(cherry picked from commit eca6d5766d956c37e3f7f28d70903d357308c846) --- accel/accel.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/0013-vfio-cap-number-of-devices-that-can-be-assigned.patch b/0014-vfio-cap-number-of-devices-that-can-be-assigned.patch similarity index 73% rename from 0013-vfio-cap-number-of-devices-that-can-be-assigned.patch rename to 0014-vfio-cap-number-of-devices-that-can-be-assigned.patch index 9e22d48..c445c7f 100644 --- a/0013-vfio-cap-number-of-devices-that-can-be-assigned.patch +++ b/0014-vfio-cap-number-of-devices-that-can-be-assigned.patch @@ -1,4 +1,4 @@ -From 43a09e06e76cba94c6ecd448f51912362b42f94d Mon Sep 17 00:00:00 2001 +From 3094b4ac400f54f26b837226f44fc0a18f0726e6 Mon Sep 17 00:00:00 2001 From: Bandan Das Date: Tue, 3 Dec 2013 20:05:13 +0100 Subject: vfio: cap number of devices that can be assigned @@ -23,12 +23,21 @@ matches the number of slots on a PCI bus and is also a nice power of two. Signed-off-by: Bandan Das + +Rebase notes (2.8.0): +- removed return value for vfio_realize (commit 1a22aca) + +Merged patches (2.9.0): +- 17eb774 vfio: Use error_setg when reporting max assigned device overshoot + +(cherry picked from commit 9fa3c9fc6dfcde76d80db1aa601b2d577f72ceec) +(cherry picked from commit 3cb35556dc7d994f203d732fe952f95fcdb03c0a) --- hw/vfio/pci.c | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/hw/vfio/pci.c b/hw/vfio/pci.c -index 6cbb8fa..59b3c0f 100644 +index 5c7bd96..598f771 100644 --- a/hw/vfio/pci.c +++ b/hw/vfio/pci.c @@ -36,6 +36,7 @@ @@ -37,15 +46,16 @@ index 6cbb8fa..59b3c0f 100644 #define MSIX_CAP_LENGTH 12 +#define MAX_DEV_ASSIGN_CMDLINE 32 - static void vfio_disable_interrupts(VFIOPCIDevice *vdev); - static void vfio_mmap_set_enabled(VFIOPCIDevice *vdev, bool enabled); -@@ -2809,7 +2810,19 @@ static void vfio_realize(PCIDevice *pdev, Error **errp) + #define TYPE_VFIO_PCI "vfio-pci" + #define PCI_VFIO(obj) OBJECT_CHECK(VFIOPCIDevice, obj, TYPE_VFIO_PCI) +@@ -2811,9 +2812,21 @@ 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; + + QLIST_FOREACH(group, &vfio_group_list, next) { + QLIST_FOREACH(vbasedev_iter, &group->device_list, next) { + i++; @@ -57,9 +67,10 @@ index 6cbb8fa..59b3c0f 100644 + "already attached", MAX_DEV_ASSIGN_CMDLINE); + return; + } - ++ if (!vdev->vbasedev.sysfsdev) { if (!(~vdev->host.domain || ~vdev->host.bus || + ~vdev->host.slot || ~vdev->host.function)) { -- 1.8.3.1 diff --git a/0014-Add-support-statement-to-help-output.patch b/0015-Add-support-statement-to-help-output.patch similarity index 82% rename from 0014-Add-support-statement-to-help-output.patch rename to 0015-Add-support-statement-to-help-output.patch index ea0d9ea..6e991bb 100644 --- a/0014-Add-support-statement-to-help-output.patch +++ b/0015-Add-support-statement-to-help-output.patch @@ -1,4 +1,4 @@ -From f8e7911bb97eb942a4eadad1731b7c59c43fd2eb Mon Sep 17 00:00:00 2001 +From 2bfcbb3ece3cda4cf977cb3983df84830bde90a3 Mon Sep 17 00:00:00 2001 From: Eduardo Habkost Date: Wed, 4 Dec 2013 18:53:17 +0100 Subject: Add support statement to -help output @@ -16,15 +16,17 @@ 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 +(cherry picked from commit 2a07700936e39856cc9f149c6a6517f0715536a6) +(cherry picked from commit 5dd2f4706e2fef945771949e59a8fcc1b5452de9) --- vl.c | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/vl.c b/vl.c -index 4f96203..43c4b78 100644 +index 39d152a..db628b8 100644 --- a/vl.c +++ b/vl.c -@@ -1876,9 +1876,17 @@ static void version(void) +@@ -1904,9 +1904,17 @@ static void version(void) QEMU_COPYRIGHT "\n"); } @@ -42,7 +44,7 @@ index 4f96203..43c4b78 100644 printf("usage: %s [options] [disk_image]\n\n" "'disk_image' is a raw hard disk image for IDE hard disk 0\n\n", error_get_progname()); -@@ -1895,6 +1903,7 @@ static void help(int exitcode) +@@ -1923,6 +1931,7 @@ static void help(int exitcode) "\n" QEMU_HELP_BOTTOM "\n"); diff --git a/0015-globally-limit-the-maximum-number-of-CPUs.patch b/0015-globally-limit-the-maximum-number-of-CPUs.patch deleted file mode 100644 index 3543fec..0000000 --- a/0015-globally-limit-the-maximum-number-of-CPUs.patch +++ /dev/null @@ -1,89 +0,0 @@ -From 8413778453742aeb3ad6b38d5f4440a0dbabca7d Mon Sep 17 00:00:00 2001 -From: Andrew Jones -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 -Signed-off-by: Miroslav Rezanina -Signed-off-by: Danilo Cesar Lemes de Paula ---- - accel/kvm/kvm-all.c | 12 ++++++++++++ - vl.c | 18 ++++++++++++++++++ - 2 files changed, 30 insertions(+) - -diff --git a/accel/kvm/kvm-all.c b/accel/kvm/kvm-all.c -index eb7db92..c2e7095 100644 ---- a/accel/kvm/kvm-all.c -+++ b/accel/kvm/kvm-all.c -@@ -1586,6 +1586,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 " -diff --git a/vl.c b/vl.c -index 43c4b78..b50dbe4 100644 ---- a/vl.c -+++ b/vl.c -@@ -133,6 +133,8 @@ int main(int argc, char **argv) - - #define MAX_VIRTIO_CONSOLES 1 - -+#define RHEL_MAX_CPUS 384 -+ - static const char *data_dir[16]; - static int data_dir_idx; - const char *bios_name = NULL; -@@ -1430,6 +1432,20 @@ MachineClass *find_default_machine(void) - return mc; - } - -+/* Maximum number of CPUs limited for Red Hat Enterprise Linux */ -+static void limit_max_cpus_in_machines(void) -+{ -+ GSList *el, *machines = object_class_get_list(TYPE_MACHINE, false); -+ -+ for (el = machines; el; el = el->next) { -+ MachineClass *mc = el->data; -+ -+ if (mc->max_cpus > RHEL_MAX_CPUS) { -+ mc->max_cpus = RHEL_MAX_CPUS; -+ } -+ } -+} -+ - MachineInfoList *qmp_query_machines(Error **errp) - { - GSList *el, *machines = object_class_get_list(TYPE_MACHINE, false); -@@ -3993,6 +4009,8 @@ int main(int argc, char **argv, char **envp) - "mutually exclusive"); - exit(EXIT_FAILURE); - } -+ /* Maximum number of CPUs limited for Red Hat Enterprise Linux */ -+ limit_max_cpus_in_machines(); - - machine_class = select_machine(); - --- -1.8.3.1 - diff --git a/0016-globally-limit-the-maximum-number-of-CPUs.patch b/0016-globally-limit-the-maximum-number-of-CPUs.patch new file mode 100644 index 0000000..5c51d59 --- /dev/null +++ b/0016-globally-limit-the-maximum-number-of-CPUs.patch @@ -0,0 +1,153 @@ +From c214bfc318a3128dc92fe5017ca0dd54fc50ffed Mon Sep 17 00:00:00 2001 +From: Andrew Jones +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 +Signed-off-by: Miroslav Rezanina +Signed-off-by: Danilo Cesar Lemes de Paula + +Rebase notes (2.11.0): +- Removed CONFIG_RHV reference +- Update commit log + +Merged patches (2.11.0): +- 92fef14623 redhat: remove manual max_cpus limitations for ppc +- bb722e9eff redhat: globally limit the maximum number of CPUs +- fdeef3c1c7 RHEL: Set vcpus hard limit to 240 for Power +- 0584216921 Match POWER max cpus to x86 + +Signed-off-by: Andrew Jones +(cherry picked from commit a4ceb63bdc5cbac19f5f633ec761b9de0dedb55e) +(cherry picked from commit a1f26d85171b4d554225150053700e93ba6eba10) + +redhat: globally limit the maximum number of CPUs + +RH-Author: David Hildenbrand +Message-id: <20180109103253.24517-2-david@redhat.com> +Patchwork-id: 78531 +O-Subject: [RHEL-7.5 qemu-kvm-ma PATCH v2 1/2] redhat: globally limit the maximum number of CPUs +Bugzilla: 1527449 +RH-Acked-by: David Gibson +RH-Acked-by: Thomas Huth +RH-Acked-by: Cornelia Huck + +Upstream-status: n/a + +For RHEL, we support 240, for RHV up to 384 VCPUs. Let's limit this +globally instead of fixing up all machines. This way, we can easily +change (increase) the product specific levels later. + +Signed-off-by: David Hildenbrand +Signed-off-by: Miroslav Rezanina + +redhat: remove manual max_cpus limitations for ppc + +RH-Author: David Hildenbrand +Message-id: <20180109103253.24517-3-david@redhat.com> +Patchwork-id: 78532 +O-Subject: [RHEL-7.5 qemu-kvm-ma PATCH v2 2/2] redhat: remove manual max_cpus limitations for ppc +Bugzilla: 1527449 +RH-Acked-by: David Gibson +RH-Acked-by: Thomas Huth +RH-Acked-by: Cornelia Huck + +Upstream-status: n/a + +RH-Author: Andrew Jones +Message-id: <1390301212-15344-1-git-send-email-drjones@redhat.com> +Patchwork-id: 56862 +O-Subject: [RHEL7.0 qemu-kvm PATCH v6] use recommended max vcpu count +Bugzilla: 998708 +RH-Acked-by: Paolo Bonzini +RH-Acked-by: Laszlo Ersek +RH-Acked-by: Marcelo Tosatti + +The recommended vcpu max limit (KVM_CAP_NR_VCPUS) should be used instead +of the actual max vcpu limit (KVM_CAP_MAX_VCPUS) to give an error. + +This commit matches the limit to current KVM_CAP_NR_VCPUS value. + +Conflicts: + vl.c +--- + accel/kvm/kvm-all.c | 12 ++++++++++++ + vl.c | 18 ++++++++++++++++++ + 2 files changed, 30 insertions(+) + +diff --git a/accel/kvm/kvm-all.c b/accel/kvm/kvm-all.c +index 4880a05..a8f5d47 100644 +--- a/accel/kvm/kvm-all.c ++++ b/accel/kvm/kvm-all.c +@@ -1627,6 +1627,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 " +diff --git a/vl.c b/vl.c +index db628b8..7b0f19a 100644 +--- a/vl.c ++++ b/vl.c +@@ -133,6 +133,8 @@ int main(int argc, char **argv) + + #define MAX_VIRTIO_CONSOLES 1 + ++#define RHEL_MAX_CPUS 384 ++ + static const char *data_dir[16]; + static int data_dir_idx; + const char *bios_name = NULL; +@@ -1460,6 +1462,20 @@ MachineClass *find_default_machine(void) + return mc; + } + ++/* Maximum number of CPUs limited for Red Hat Enterprise Linux */ ++static void limit_max_cpus_in_machines(void) ++{ ++ GSList *el, *machines = object_class_get_list(TYPE_MACHINE, false); ++ ++ for (el = machines; el; el = el->next) { ++ MachineClass *mc = el->data; ++ ++ if (mc->max_cpus > RHEL_MAX_CPUS) { ++ mc->max_cpus = RHEL_MAX_CPUS; ++ } ++ } ++} ++ + MachineInfoList *qmp_query_machines(Error **errp) + { + GSList *el, *machines = object_class_get_list(TYPE_MACHINE, false); +@@ -4012,6 +4028,8 @@ int main(int argc, char **argv, char **envp) + "mutually exclusive"); + exit(EXIT_FAILURE); + } ++ /* Maximum number of CPUs limited for Red Hat Enterprise Linux */ ++ limit_max_cpus_in_machines(); + + configure_rtc(qemu_find_opts_singleton("rtc")); + +-- +1.8.3.1 + diff --git a/0016-Add-support-for-simpletrace.patch b/0017-Add-support-for-simpletrace.patch similarity index 86% rename from 0016-Add-support-for-simpletrace.patch rename to 0017-Add-support-for-simpletrace.patch index 4b945c5..3e295c3 100644 --- a/0016-Add-support-for-simpletrace.patch +++ b/0017-Add-support-for-simpletrace.patch @@ -1,4 +1,4 @@ -From f262acdee88f36b625fcbd5eb1cd66739428cca3 Mon Sep 17 00:00:00 2001 +From 30887ffc7e908ebed5381c08181cd6a2a6bc5e98 Mon Sep 17 00:00:00 2001 From: Miroslav Rezanina Date: Thu, 8 Oct 2015 09:50:17 +0200 Subject: Add support for simpletrace @@ -6,6 +6,23 @@ Subject: Add support for simpletrace As simpletrace is upstream, we just need to properly handle it during rpmbuild. Signed-off-by: Miroslav Rezanina + +Rebase notes (weekly-180727): +- Fixed python 2 to python3 switch + +Rebase notes (2.9.0): +- Added group argument for tracetool.py (upstream) + +Rebase notes (2.8.0): +- Changed tracetool.py parameters + +Merged patches (2.3.0): +- db959d6 redhat/qemu-kvm.spec.template: Install qemu-kvm-simpletrace.stp +- 5292fc3 trace: add SystemTap init scripts for simpletrace bridge +- eda9e5e simpletrace: install simpletrace.py +- 85c4c8f trace: add systemtap-initscript README file to RPM + +(cherry picked from commit bfc1d7f3628f2ffbabbae71d57a506cea6663ddf) --- .gitignore | 2 ++ Makefile | 4 +++ @@ -19,10 +36,10 @@ Signed-off-by: Miroslav Rezanina create mode 100644 scripts/systemtap/script.d/qemu_kvm.stp diff --git a/Makefile b/Makefile -index eb4c57a..6b6d3f6 100644 +index 152821a..8710720 100644 --- a/Makefile +++ b/Makefile -@@ -880,6 +880,10 @@ endif +@@ -892,6 +892,10 @@ endif $(INSTALL_DATA) $(SRC_PATH)/pc-bios/keymaps/$$x "$(DESTDIR)$(qemu_datadir)/keymaps"; \ done $(INSTALL_DATA) $(BUILD_DIR)/trace-events-all "$(DESTDIR)$(qemu_datadir)/trace-events-all" diff --git a/0017-Use-qemu-kvm-in-documentation-instead-of-qemu-system.patch b/0018-Use-qemu-kvm-in-documentation-instead-of-qemu-system.patch similarity index 85% rename from 0017-Use-qemu-kvm-in-documentation-instead-of-qemu-system.patch rename to 0018-Use-qemu-kvm-in-documentation-instead-of-qemu-system.patch index aca5827..109b97c 100644 --- a/0017-Use-qemu-kvm-in-documentation-instead-of-qemu-system.patch +++ b/0018-Use-qemu-kvm-in-documentation-instead-of-qemu-system.patch @@ -1,4 +1,4 @@ -From 33e2c01c1b0b64a76d5193b60378d2329a86626b Mon Sep 17 00:00:00 2001 +From d0656d8b2e0de42d04c224db36fe9c1ec015a9cc Mon Sep 17 00:00:00 2001 From: Miroslav Rezanina Date: Fri, 14 Nov 2014 08:51:50 +0100 Subject: Use qemu-kvm in documentation instead of qemu-system- @@ -17,15 +17,39 @@ to reflect this change. Only architectures available in RHEL are updated. Signed-off-by: Miroslav Rezanina --- + docs/COLO-FT.txt | 4 +- docs/can.txt | 8 +-- docs/pr-manager.rst | 4 +- - docs/qemu-block-drivers.texi | 70 ++++++++++----------- + docs/qemu-block-drivers.texi | 70 +++++++++++----------- + docs/qemu-cpu-models.texi | 8 +-- docs/replay.txt | 4 +- docs/specs/tpm.txt | 8 +-- - qemu-doc.texi | 70 ++++++++++----------- - qemu-options.hx | 144 ++++++++++++++++++++++--------------------- - 7 files changed, 156 insertions(+), 152 deletions(-) + qemu-doc.texi | 70 +++++++++++----------- + qemu-options.hx | 140 ++++++++++++++++++++++--------------------- + 9 files changed, 160 insertions(+), 156 deletions(-) +diff --git a/docs/COLO-FT.txt b/docs/COLO-FT.txt +index e2686bb..8c48f86 100644 +--- a/docs/COLO-FT.txt ++++ b/docs/COLO-FT.txt +@@ -147,7 +147,7 @@ in test procedure. + == Test procedure == + 1. Startup qemu + Primary: +-# qemu-system-x86_64 -accel kvm -m 2048 -smp 2 -qmp stdio -name primary \ ++# qemu-kvm -accel kvm -m 2048 -smp 2 -qmp stdio -name primary \ + -device piix3-usb-uhci -vnc :7 \ + -device usb-tablet -netdev tap,id=hn0,vhost=off \ + -device virtio-net-pci,id=net-pci0,netdev=hn0 \ +@@ -155,7 +155,7 @@ Primary: + children.0.file.filename=1.raw,\ + children.0.driver=raw -S + Secondary: +-# qemu-system-x86_64 -accel kvm -m 2048 -smp 2 -qmp stdio -name secondary \ ++# qemu-kvm -accel kvm -m 2048 -smp 2 -qmp stdio -name secondary \ + -device piix3-usb-uhci -vnc :7 \ + -device usb-tablet -netdev tap,id=hn0,vhost=off \ + -device virtio-net-pci,id=net-pci0,netdev=hn0 \ diff --git a/docs/can.txt b/docs/can.txt index 7ba23b2..4ae5690 100644 --- a/docs/can.txt @@ -287,8 +311,42 @@ index 38e9f34..2e71ec9 100644 @end example @var{host}:@var{bus}:@var{slot}.@var{func} is the NVMe controller's PCI device +diff --git a/docs/qemu-cpu-models.texi b/docs/qemu-cpu-models.texi +index 1935f98..93672de 100644 +--- a/docs/qemu-cpu-models.texi ++++ b/docs/qemu-cpu-models.texi +@@ -387,25 +387,25 @@ CPU models / features in QEMU and libvirt + @item Host passthrough + + @example +- $ qemu-system-x86_64 -cpu host ++ $ qemu-kvm -cpu host + @end example + + With feature customization: + + @example +- $ qemu-system-x86_64 -cpu host,-vmx,... ++ $ qemu-kvm -cpu host,-vmx,... + @end example + + @item Named CPU models + + @example +- $ qemu-system-x86_64 -cpu Westmere ++ $ qemu-kvm -cpu Westmere + @end example + + With feature customization: + + @example +- $ qemu-system-x86_64 -cpu Westmere,+pcid,... ++ $ qemu-kvm -cpu Westmere,+pcid,... + @end example + + @end table diff --git a/docs/replay.txt b/docs/replay.txt -index 2e21e9c..f1923e8 100644 +index 3497585..8d67ea7 100644 --- a/docs/replay.txt +++ b/docs/replay.txt @@ -25,7 +25,7 @@ Deterministic replay has the following features: @@ -310,10 +368,10 @@ index 2e21e9c..f1923e8 100644 -drive file=disk.qcow2,if=none,id=img-direct \ -drive driver=blkreplay,if=none,image=img-direct,id=img-blkreplay \ diff --git a/docs/specs/tpm.txt b/docs/specs/tpm.txt -index 0e9bbeb..9320fbd 100644 +index 1af82bb..b2741ac 100644 --- a/docs/specs/tpm.txt +++ b/docs/specs/tpm.txt -@@ -98,7 +98,7 @@ QEMU files related to the TPM passthrough device: +@@ -113,7 +113,7 @@ QEMU files related to the TPM passthrough device: Command line to start QEMU with the TPM passthrough device using the host's hardware TPM /dev/tpm0: @@ -322,7 +380,7 @@ index 0e9bbeb..9320fbd 100644 -m 1024 -boot d -bios bios-256k.bin -boot menu=on \ -tpmdev passthrough,id=tpm0,path=/dev/tpm0 \ -device tpm-tis,tpmdev=tpm0 test.img -@@ -164,7 +164,7 @@ swtpm socket --tpmstate dir=/tmp/mytpm1 \ +@@ -179,7 +179,7 @@ swtpm socket --tpmstate dir=/tmp/mytpm1 \ Command line to start QEMU with the TPM emulator device communicating with the swtpm: @@ -331,7 +389,7 @@ index 0e9bbeb..9320fbd 100644 -m 1024 -boot d -bios bios-256k.bin -boot menu=on \ -chardev socket,id=chrtpm,path=/tmp/mytpm1/swtpm-sock \ -tpmdev emulator,id=tpm0,chardev=chrtpm \ -@@ -222,7 +222,7 @@ swtpm socket --tpmstate dir=/tmp/mytpm1 \ +@@ -237,7 +237,7 @@ swtpm socket --tpmstate dir=/tmp/mytpm1 \ In a 2nd terminal start the VM: @@ -340,7 +398,7 @@ index 0e9bbeb..9320fbd 100644 -m 1024 -boot d -bios bios-256k.bin -boot menu=on \ -chardev socket,id=chrtpm,path=/tmp/mytpm1/swtpm-sock \ -tpmdev emulator,id=tpm0,chardev=chrtpm \ -@@ -255,7 +255,7 @@ swtpm socket --tpmstate dir=/tmp/mytpm1 \ +@@ -270,7 +270,7 @@ swtpm socket --tpmstate dir=/tmp/mytpm1 \ In the 2nd terminal restore the state of the VM using the additional '-incoming' option. @@ -350,10 +408,10 @@ index 0e9bbeb..9320fbd 100644 -chardev socket,id=chrtpm,path=/tmp/mytpm1/swtpm-sock \ -tpmdev emulator,id=tpm0,chardev=chrtpm \ diff --git a/qemu-doc.texi b/qemu-doc.texi -index abfd2db..5827bed 100644 +index f7ad1df..0e4b34a 100644 --- a/qemu-doc.texi +++ b/qemu-doc.texi -@@ -204,12 +204,12 @@ Note that, by default, GUS shares IRQ(7) with parallel ports and so +@@ -205,12 +205,12 @@ Note that, by default, GUS shares IRQ(7) with parallel ports and so QEMU must be told to not have parallel ports to have working GUS. @example @@ -368,7 +426,7 @@ index abfd2db..5827bed 100644 @end example Or some other unclaimed IRQ. -@@ -225,7 +225,7 @@ CS4231A is the chip used in Windows Sound System and GUSMAX products +@@ -226,7 +226,7 @@ CS4231A is the chip used in Windows Sound System and GUSMAX products Download and uncompress the linux image (@file{linux.img}) and type: @example @@ -377,7 +435,7 @@ index abfd2db..5827bed 100644 @end example Linux should boot and give you a prompt. -@@ -235,7 +235,7 @@ Linux should boot and give you a prompt. +@@ -236,7 +236,7 @@ Linux should boot and give you a prompt. @example @c man begin SYNOPSIS @@ -386,7 +444,7 @@ index abfd2db..5827bed 100644 @c man end @end example -@@ -275,21 +275,21 @@ is specified in seconds. The default is 0 which means no timeout. Libiscsi +@@ -276,21 +276,21 @@ is specified in seconds. The default is 0 which means no timeout. Libiscsi Example (without authentication): @example @@ -411,7 +469,7 @@ index abfd2db..5827bed 100644 @end example @item NBD -@@ -304,12 +304,12 @@ Syntax for specifying a NBD device using Unix Domain Sockets +@@ -305,12 +305,12 @@ Syntax for specifying a NBD device using Unix Domain Sockets Example for TCP @example @@ -426,7 +484,7 @@ index abfd2db..5827bed 100644 @end example @item SSH -@@ -317,8 +317,8 @@ QEMU supports SSH (Secure Shell) access to remote disks. +@@ -318,8 +318,8 @@ QEMU supports SSH (Secure Shell) access to remote disks. Examples: @example @@ -437,7 +495,7 @@ index abfd2db..5827bed 100644 @end example Currently authentication must be done using ssh-agent. Other -@@ -336,7 +336,7 @@ sheepdog[+tcp|+unix]://[host:port]/vdiname[?socket=path][#snapid|#tag] +@@ -337,7 +337,7 @@ sheepdog[+tcp|+unix]://[host:port]/vdiname[?socket=path][#snapid|#tag] Example @example @@ -446,7 +504,7 @@ index abfd2db..5827bed 100644 @end example See also @url{https://sheepdog.github.io/sheepdog/}. -@@ -362,17 +362,17 @@ JSON: +@@ -363,17 +363,17 @@ JSON: Example @example URI: @@ -467,7 +525,7 @@ index abfd2db..5827bed 100644 @ file.debug=9,file.logfile=/var/log/qemu-gluster.log, @ file.server.0.type=tcp,file.server.0.host=1.2.3.4,file.server.0.port=24007, @ file.server.1.type=unix,file.server.1.socket=/var/run/glusterd.socket -@@ -437,9 +437,9 @@ of . +@@ -438,9 +438,9 @@ of . Example: boot from a remote Fedora 20 live ISO image @example @@ -479,7 +537,7 @@ index abfd2db..5827bed 100644 @end example Example: boot from a remote Fedora 20 cloud image using a local overlay for -@@ -447,7 +447,7 @@ writes, copy-on-read, and a readahead of 64k +@@ -448,7 +448,7 @@ writes, copy-on-read, and a readahead of 64k @example qemu-img create -f qcow2 -o backing_file='json:@{"file.driver":"http",, "file.url":"https://dl.fedoraproject.org/pub/fedora/linux/releases/20/Images/x86_64/Fedora-x86_64-20-20131211.1-sda.qcow2",, "file.readahead":"64k"@}' /tmp/Fedora-x86_64-20-20131211.1-sda.qcow2 @@ -488,7 +546,7 @@ index abfd2db..5827bed 100644 @end example Example: boot from an image stored on a VMware vSphere server with a self-signed -@@ -456,7 +456,7 @@ of 10 seconds. +@@ -457,7 +457,7 @@ of 10 seconds. @example qemu-img create -f qcow2 -o backing_file='json:@{"file.driver":"https",, "file.url":"https://user:password@@vsphere.example.com/folder/test/test-flat.vmdk?dcPath=Datacenter&dsName=datastore1",, "file.sslverify":"off",, "file.readahead":"64k",, "file.timeout":10@}' /tmp/test.qcow2 @@ -497,7 +555,7 @@ index abfd2db..5827bed 100644 @end example @end table -@@ -818,7 +818,7 @@ On Linux hosts, a shared memory device is available. The basic syntax +@@ -824,7 +824,7 @@ On Linux hosts, a shared memory device is available. The basic syntax is: @example @@ -506,7 +564,7 @@ index abfd2db..5827bed 100644 @end example where @var{hostmem} names a host memory backend. For a POSIX shared -@@ -839,7 +839,7 @@ memory server is: +@@ -845,7 +845,7 @@ memory server is: ivshmem-server -p @var{pidfile} -S @var{path} -m @var{shm-name} -l @var{shm-size} -n @var{vectors} # Then start your qemu instances with matching arguments @@ -515,7 +573,7 @@ index abfd2db..5827bed 100644 -chardev socket,path=@var{path},id=@var{id} @end example -@@ -864,7 +864,7 @@ Instead of specifying the using POSIX shm, you may specify +@@ -870,7 +870,7 @@ Instead of specifying the using POSIX shm, you may specify a memory backend that has hugepage support: @example @@ -524,7 +582,7 @@ index abfd2db..5827bed 100644 -device ivshmem-plain,memdev=mb1 @end example -@@ -880,7 +880,7 @@ kernel testing. +@@ -886,7 +886,7 @@ kernel testing. The syntax is: @example @@ -533,7 +591,7 @@ index abfd2db..5827bed 100644 @end example Use @option{-kernel} to provide the Linux kernel image and -@@ -895,7 +895,7 @@ If you do not need graphical output, you can disable it and redirect +@@ -901,7 +901,7 @@ If you do not need graphical output, you can disable it and redirect the virtual serial port and the QEMU monitor to the console with the @option{-nographic} option. The typical command line is: @example @@ -542,7 +600,7 @@ index abfd2db..5827bed 100644 -append "root=/dev/hda console=ttyS0" -nographic @end example -@@ -961,7 +961,7 @@ Network adapter that supports CDC ethernet and RNDIS protocols. @var{id} +@@ -967,7 +967,7 @@ Network adapter that supports CDC ethernet and RNDIS protocols. @var{id} specifies a netdev defined with @code{-netdev @dots{},id=@var{id}}. For instance, user-mode networking can be used with @example @@ -551,7 +609,7 @@ index abfd2db..5827bed 100644 @end example @item usb-ccid Smartcard reader device -@@ -980,7 +980,7 @@ no type is given, the HCI logic corresponds to @code{-bt hci,vlan=0}. +@@ -986,7 +986,7 @@ no type is given, the HCI logic corresponds to @code{-bt hci,vlan=0}. This USB device implements the USB Transport Layer of HCI. Example usage: @example @@ -560,7 +618,7 @@ index abfd2db..5827bed 100644 @end example @end table -@@ -1057,7 +1057,7 @@ For this setup it is recommended to restrict it to listen on a UNIX domain +@@ -1063,7 +1063,7 @@ For this setup it is recommended to restrict it to listen on a UNIX domain socket only. For example @example @@ -569,7 +627,7 @@ index abfd2db..5827bed 100644 @end example This ensures that only users on local box with read/write access to that -@@ -1080,7 +1080,7 @@ is running the password is set with the monitor. Until the monitor is used to +@@ -1086,7 +1086,7 @@ is running the password is set with the monitor. Until the monitor is used to set the password all clients will be rejected. @example @@ -578,34 +636,34 @@ index abfd2db..5827bed 100644 (qemu) change vnc password Password: ******** (qemu) -@@ -1097,7 +1097,7 @@ support provides a secure session, but no authentication. This allows any +@@ -1103,7 +1103,7 @@ support provides a secure session, but no authentication. This allows any client to connect, and provides an encrypted session. @example --qemu-system-i386 [...OPTIONS...] -vnc :1,tls,x509=/etc/pki/qemu -monitor stdio -+qemu-kvm [...OPTIONS...] -vnc :1,tls,x509=/etc/pki/qemu -monitor stdio +-qemu-system-i386 [...OPTIONS...] \ ++qemu-kvm [...OPTIONS...] \ + -object tls-creds-x509,id=tls0,dir=/etc/pki/qemu,endpoint=server,verify-peer=no \ + -vnc :1,tls-creds=tls0 -monitor stdio @end example - - In the above example @code{/etc/pki/qemu} should contain at least three files, -@@ -1115,7 +1115,7 @@ then validate against the CA certificate. This is a good choice if deploying - in an environment with a private internal certificate authority. +@@ -1125,7 +1125,7 @@ same syntax as previously, but with @code{verify-peer} set to @code{yes} + instead. @example --qemu-system-i386 [...OPTIONS...] -vnc :1,tls,x509verify=/etc/pki/qemu -monitor stdio -+qemu-kvm [...OPTIONS...] -vnc :1,tls,x509verify=/etc/pki/qemu -monitor stdio +-qemu-system-i386 [...OPTIONS...] \ ++qemu-kvm [...OPTIONS...] \ + -object tls-creds-x509,id=tls0,dir=/etc/pki/qemu,endpoint=server,verify-peer=yes \ + -vnc :1,tls-creds=tls0 -monitor stdio @end example - - -@@ -1126,7 +1126,7 @@ Finally, the previous method can be combined with VNC password authentication +@@ -1138,7 +1138,7 @@ Finally, the previous method can be combined with VNC password authentication to provide two layers of authentication for clients. @example --qemu-system-i386 [...OPTIONS...] -vnc :1,password,tls,x509verify=/etc/pki/qemu -monitor stdio -+qemu-kvm [...OPTIONS...] -vnc :1,password,tls,x509verify=/etc/pki/qemu -monitor stdio +-qemu-system-i386 [...OPTIONS...] \ ++qemu-kvm [...OPTIONS...] \ + -object tls-creds-x509,id=tls0,dir=/etc/pki/qemu,endpoint=server,verify-peer=yes \ + -vnc :1,tls-creds=tls0,password -monitor stdio (qemu) change vnc password - Password: ******** - (qemu) -@@ -1149,7 +1149,7 @@ used for authentication, but assuming use of one supporting SSF, +@@ -1163,7 +1163,7 @@ used for authentication, but assuming use of one supporting SSF, then QEMU can be launched with: @example @@ -614,16 +672,16 @@ index abfd2db..5827bed 100644 @end example @node vnc_sec_certificate_sasl -@@ -1163,7 +1163,7 @@ credentials. This can be enabled, by combining the 'sasl' option +@@ -1177,7 +1177,7 @@ credentials. This can be enabled, by combining the 'sasl' option with the aforementioned TLS + x509 options: @example --qemu-system-i386 [...OPTIONS...] -vnc :1,tls,x509,sasl -monitor stdio -+qemu-kvm [...OPTIONS...] -vnc :1,tls,x509,sasl -monitor stdio +-qemu-system-i386 [...OPTIONS...] \ ++qemu-kvm [...OPTIONS...] \ + -object tls-creds-x509,id=tls0,dir=/etc/pki/qemu,endpoint=server,verify-peer=yes \ + -vnc :1,tls-creds=tls0,sasl -monitor stdio @end example - - @node vnc_setup_sasl -@@ -1556,7 +1556,7 @@ QEMU has a primitive support to work with gdb, so that you can do +@@ -1572,7 +1572,7 @@ QEMU has a primitive support to work with gdb, so that you can do In order to use gdb, launch QEMU with the '-s' option. It will wait for a gdb connection: @example @@ -632,7 +690,7 @@ index abfd2db..5827bed 100644 -append "root=/dev/hda" Connected to host network interface: tun0 Waiting gdb connection on port 1234 -@@ -1802,7 +1802,7 @@ Set the initial VGA graphic mode. The default is 800x600x32. +@@ -1818,7 +1818,7 @@ Set the initial VGA graphic mode. The default is 800x600x32. Set OpenBIOS variables in NVRAM, for example: @example @@ -642,10 +700,10 @@ index abfd2db..5827bed 100644 -prom-env 'boot-args=conf=hd:2,\yaboot.conf' @end example diff --git a/qemu-options.hx b/qemu-options.hx -index 37f2aa8..41cb1f3 100644 +index cd2b25b..a65c63b 100644 --- a/qemu-options.hx +++ b/qemu-options.hx -@@ -263,7 +263,7 @@ This option defines a free-form string that can be used to describe @var{fd}. +@@ -253,7 +253,7 @@ This option defines a free-form string that can be used to describe @var{fd}. You can open an image using pre-opened file descriptors from an fd set: @example @@ -654,7 +712,7 @@ index 37f2aa8..41cb1f3 100644 -add-fd fd=3,set=2,opaque="rdwr:/path/to/file" -add-fd fd=4,set=2,opaque="rdonly:/path/to/file" -drive file=/dev/fdset/2,index=0,media=disk -@@ -292,7 +292,7 @@ STEXI +@@ -282,7 +282,7 @@ STEXI Set default value of @var{driver}'s property @var{prop} to @var{value}, e.g.: @example @@ -663,7 +721,7 @@ index 37f2aa8..41cb1f3 100644 @end example In particular, you can use this to set driver properties for devices which are -@@ -346,11 +346,11 @@ bootindex options. The default is non-strict boot. +@@ -336,11 +336,11 @@ bootindex options. The default is non-strict boot. @example # try to boot from network first, then from hard disk @@ -678,7 +736,7 @@ index 37f2aa8..41cb1f3 100644 @end example Note: The legacy format '-boot @var{drives}' is still supported but its -@@ -379,7 +379,7 @@ For example, the following command-line sets the guest startup RAM size to +@@ -369,7 +369,7 @@ For example, the following command-line sets the guest startup RAM size to memory the guest can reach to 4GB: @example @@ -687,7 +745,7 @@ index 37f2aa8..41cb1f3 100644 @end example If @var{slots} and @var{maxmem} are not specified, memory hotplug won't -@@ -448,12 +448,12 @@ Enable audio and selected sound hardware. Use 'help' to print all +@@ -438,12 +438,12 @@ Enable audio and selected sound hardware. Use 'help' to print all available sound hardware. @example @@ -706,7 +764,7 @@ index 37f2aa8..41cb1f3 100644 @end example Note that Linux's i810_audio OSS kernel (for AC97) module might -@@ -946,21 +946,21 @@ is off. +@@ -918,21 +918,21 @@ is off. Instead of @option{-cdrom} you can use: @example @@ -734,7 +792,7 @@ index 37f2aa8..41cb1f3 100644 -add-fd fd=3,set=2,opaque="rdwr:/path/to/file" -add-fd fd=4,set=2,opaque="rdonly:/path/to/file" -drive file=/dev/fdset/2,index=0,media=disk -@@ -968,28 +968,28 @@ qemu-system-i386 +@@ -940,28 +940,28 @@ qemu-system-i386 You can connect a CDROM to the slave of ide0: @example @@ -769,7 +827,7 @@ index 37f2aa8..41cb1f3 100644 @end example ETEXI -@@ -2055,8 +2055,8 @@ The following two example do exactly the same, to show how @option{-nic} can +@@ -1975,8 +1975,8 @@ The following two example do exactly the same, to show how @option{-nic} can be used to shorten the command line length (note that the e1000 is the default on i386, so the @option{model=e1000} parameter could even be omitted here, too): @example @@ -780,7 +838,7 @@ index 37f2aa8..41cb1f3 100644 @end example @item -nic none -@@ -2127,7 +2127,7 @@ can not be resolved. +@@ -2047,7 +2047,7 @@ can not be resolved. Example: @example @@ -789,7 +847,7 @@ index 37f2aa8..41cb1f3 100644 @end example @item domainname=@var{domain} -@@ -2146,7 +2146,7 @@ a guest from a local directory. +@@ -2071,7 +2071,7 @@ a guest from a local directory. Example (using pxelinux): @example @@ -798,7 +856,7 @@ index 37f2aa8..41cb1f3 100644 -netdev user,id=n1,tftp=/path/to/tftp/files,bootfile=/pxelinux.0 @end example -@@ -2180,7 +2180,7 @@ screen 0, use the following: +@@ -2105,7 +2105,7 @@ screen 0, use the following: @example # on the host @@ -807,7 +865,7 @@ index 37f2aa8..41cb1f3 100644 # this host xterm should open in the guest X11 server xterm -display :1 @end example -@@ -2190,7 +2190,7 @@ the guest, use the following: +@@ -2115,7 +2115,7 @@ the guest, use the following: @example # on the host @@ -816,7 +874,7 @@ index 37f2aa8..41cb1f3 100644 telnet localhost 5555 @end example -@@ -2209,7 +2209,7 @@ lifetime, like in the following example: +@@ -2134,7 +2134,7 @@ lifetime, like in the following example: @example # open 10.10.1.1:4321 on bootup, connect 10.0.2.100:1234 to it whenever # the guest accesses it @@ -825,7 +883,7 @@ index 37f2aa8..41cb1f3 100644 @end example Or you can execute a command on every TCP connection established by the guest, -@@ -2218,7 +2218,7 @@ so that QEMU behaves similar to an inetd process for that virtual server: +@@ -2143,7 +2143,7 @@ so that QEMU behaves similar to an inetd process for that virtual server: @example # call "netcat 10.10.1.1 4321" on every TCP connection to 10.0.2.100:1234 # and connect the TCP stream to its stdin/stdout @@ -834,7 +892,7 @@ index 37f2aa8..41cb1f3 100644 @end example @end table -@@ -2250,21 +2250,22 @@ Examples: +@@ -2170,21 +2170,22 @@ Examples: @example #launch a QEMU instance with the default network script @@ -860,7 +918,7 @@ index 37f2aa8..41cb1f3 100644 -netdev tap,id=n1,"helper=/path/to/qemu-bridge-helper" @end example -@@ -2281,13 +2282,13 @@ Examples: +@@ -2201,13 +2202,13 @@ Examples: @example #launch a QEMU instance with the default network helper to #connect a TAP device to bridge br0 @@ -876,7 +934,7 @@ index 37f2aa8..41cb1f3 100644 @end example @item -netdev socket,id=@var{id}[,fd=@var{h}][,listen=[@var{host}]:@var{port}][,connect=@var{host}:@var{port}] -@@ -2302,13 +2303,13 @@ specifies an already opened TCP socket. +@@ -2222,13 +2223,13 @@ specifies an already opened TCP socket. Example: @example # launch a first QEMU instance @@ -896,7 +954,7 @@ index 37f2aa8..41cb1f3 100644 @end example @item -netdev socket,id=@var{id}[,fd=@var{h}][,mcast=@var{maddr}:@var{port}[,localaddr=@var{addr}]] -@@ -2331,23 +2332,23 @@ Use @option{fd=h} to specify an already opened UDP multicast socket. +@@ -2251,15 +2252,15 @@ Use @option{fd=h} to specify an already opened UDP multicast socket. Example: @example # launch one QEMU instance @@ -915,13 +973,11 @@ index 37f2aa8..41cb1f3 100644 + -netdev socket,id=n2,mcast=230.0.0.1:1234 # launch yet another QEMU instance on same "bus" -qemu-system-i386 linux.img \ -- -device e1000,netdev=n3,macaddr=52:54:00:12:34:58 \ -- -netdev socket,id=n3,mcast=230.0.0.1:1234 +qemu-kvm linux.img \ -+ -device e1000,netdev=n3,macaddr=52:54:00:12:34:58 \ -+ -netdev socket,id=n3,mcast=230.0.0.1:1234 + -device e1000,netdev=n3,mac=52:54:00:12:34:58 \ + -netdev socket,id=n3,mcast=230.0.0.1:1234 @end example - +@@ -2267,7 +2268,7 @@ qemu-system-i386 linux.img \ Example (User Mode Linux compat.): @example # launch QEMU instance (note mcast address selected is UML's default) @@ -930,7 +986,7 @@ index 37f2aa8..41cb1f3 100644 -device e1000,netdev=n1,mac=52:54:00:12:34:56 \ -netdev socket,id=n1,mcast=239.192.168.1:1102 # launch UML -@@ -2356,9 +2357,12 @@ qemu-system-i386 linux.img \ +@@ -2276,9 +2277,12 @@ qemu-system-i386 linux.img \ Example (send packets from host's 1.2.3.4): @example @@ -946,7 +1002,7 @@ index 37f2aa8..41cb1f3 100644 @end example @item -netdev l2tpv3,id=@var{id},src=@var{srcaddr},dst=@var{dstaddr}[,srcport=@var{srcport}][,dstport=@var{dstport}],txsession=@var{txsession}[,rxsession=@var{rxsession}][,ipv6][,udp][,cookie64][,counter][,pincounter][,txcookie=@var{txcookie}][,rxcookie=@var{rxcookie}][,offset=@var{offset}] -@@ -2416,7 +2420,7 @@ brctl addif br-lan vmtunnel0 +@@ -2336,7 +2340,7 @@ brctl addif br-lan vmtunnel0 # on 4.3.2.1 # launch QEMU instance - if your network has reorder or is very lossy add ,pincounter @@ -955,7 +1011,7 @@ index 37f2aa8..41cb1f3 100644 -netdev l2tpv3,id=n1,src=4.2.3.1,dst=1.2.3.4,udp,srcport=16384,dstport=16384,rxsession=0xffffffff,txsession=0xffffffff,counter @end example -@@ -2433,7 +2437,7 @@ Example: +@@ -2353,7 +2357,7 @@ Example: # launch vde switch vde_switch -F -sock /tmp/myswitch # launch QEMU instance @@ -964,7 +1020,7 @@ index 37f2aa8..41cb1f3 100644 @end example @item -netdev vhost-user,chardev=@var{id}[,vhostforce=on|off][,queues=n] -@@ -2447,11 +2451,11 @@ be created for multiqueue vhost-user. +@@ -2367,11 +2371,11 @@ be created for multiqueue vhost-user. Example: @example @@ -981,7 +1037,7 @@ index 37f2aa8..41cb1f3 100644 @end example @item -netdev hubport,id=@var{id},hubid=@var{hubid}[,netdev=@var{nd}] -@@ -2877,7 +2881,7 @@ and communicate. Requires the Linux @code{vhci} driver installed. Can +@@ -2804,7 +2808,7 @@ and communicate. Requires the Linux @code{vhci} driver installed. Can be used as following: @example @@ -990,7 +1046,7 @@ index 37f2aa8..41cb1f3 100644 @end example @item -bt device:@var{dev}[,vlan=@var{n}] -@@ -3322,14 +3326,14 @@ ETEXI +@@ -3253,14 +3257,14 @@ ETEXI DEF("realtime", HAS_ARG, QEMU_OPTION_realtime, "-realtime [mlock=on|off]\n" @@ -1008,7 +1064,7 @@ index 37f2aa8..41cb1f3 100644 (enabled by default). ETEXI -@@ -3367,7 +3371,7 @@ connections will likely be TCP-based, but also UDP, pseudo TTY, or even +@@ -3298,7 +3302,7 @@ connections will likely be TCP-based, but also UDP, pseudo TTY, or even stdio are reasonable use case. The latter is allowing to start QEMU from within gdb and establish the connection via a pipe: @example @@ -1017,7 +1073,7 @@ index 37f2aa8..41cb1f3 100644 @end example ETEXI -@@ -4299,7 +4303,7 @@ which specify the queue number of cryptodev backend, the default of +@@ -4247,7 +4251,7 @@ which specify the queue number of cryptodev backend, the default of @example @@ -1026,7 +1082,7 @@ index 37f2aa8..41cb1f3 100644 [...] \ -object cryptodev-backend-builtin,id=cryptodev0 \ -device virtio-crypto-pci,id=crypto0,cryptodev=cryptodev0 \ -@@ -4319,7 +4323,7 @@ of cryptodev backend for multiqueue vhost-user, the default of @var{queues} is 1 +@@ -4267,7 +4271,7 @@ of cryptodev backend for multiqueue vhost-user, the default of @var{queues} is 1 @example diff --git a/0018-usb-xhci-Fix-PCI-capability-order.patch b/0019-usb-xhci-Fix-PCI-capability-order.patch similarity index 87% rename from 0018-usb-xhci-Fix-PCI-capability-order.patch rename to 0019-usb-xhci-Fix-PCI-capability-order.patch index a44ef20..881fdd0 100644 --- a/0018-usb-xhci-Fix-PCI-capability-order.patch +++ b/0019-usb-xhci-Fix-PCI-capability-order.patch @@ -1,4 +1,4 @@ -From 69912b533a88bda6377292231fb94475a674a90d Mon Sep 17 00:00:00 2001 +From 0c8a71a5751106013f9ecfdc20f308cc1e44045b Mon Sep 17 00:00:00 2001 From: "Dr. David Alan Gilbert" Date: Fri, 5 May 2017 19:06:14 +0200 Subject: usb-xhci: Fix PCI capability order @@ -43,6 +43,19 @@ qemu-kvm: load of migration failed: Invalid argument Signed-off-by: Dr. David Alan Gilbert Signed-off-by: Miroslav Rezanina + +-- +Rebase notes (2.9.0): +- Change in assert condition (upstream) + +(cherry picked from commit aad727a5ecde1ad4935eb8427604d4df5a1f1f35) +(cherry picked from commit 2dd7402227e77d748a7375233ac9e7feab244bda) + +Conflicts: + hw/usb/hcd-xhci.c + +(cherry picked from commit a42f86dc906cc7d2c16d02bf125ed76847b469cb) +(cherry picked from commit 992ab2e4f6e15d3e51bc716763aa8d6f45c6d29d) --- hw/usb/hcd-xhci.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/0020-linux-headers-asm-s390-kvm.h-header-sync.patch b/0020-linux-headers-asm-s390-kvm.h-header-sync.patch deleted file mode 100644 index cb0ee04..0000000 --- a/0020-linux-headers-asm-s390-kvm.h-header-sync.patch +++ /dev/null @@ -1,72 +0,0 @@ -From f3d0b355f946ab87b281ef75ebfb52f7b7592f2a Mon Sep 17 00:00:00 2001 -From: Thomas Huth -Date: Thu, 9 Aug 2018 10:15:08 +0000 -Subject: linux-headers: asm-s390/kvm.h header sync - -RH-Author: Thomas Huth -Message-id: <1533813309-9643-2-git-send-email-thuth@redhat.com> -Patchwork-id: 81688 -O-Subject: [RHEL-8.0 qemu-kvm PATCH 1/2] linux-headers: asm-s390/kvm.h header sync -Bugzilla: 1612938 -RH-Acked-by: David Hildenbrand -RH-Acked-by: Cornelia Huck -RH-Acked-by: Jens Freimann - -This is a header sync with the linux uapi header. The corresponding -kernel commit id is a3da7b4a3be51f37f434f14e11e60491f098b6ea (in -the kvm/next branch) - -Signed-off-by: Thomas Huth - -Merged patches (3.0.0): -- 57332f1 linux-headers: Update to include KVM_CAP_S390_HPAGE_1M ---- - linux-headers/asm-s390/kvm.h | 5 ++++- - linux-headers/linux/kvm.h | 1 + - 2 files changed, 5 insertions(+), 1 deletion(-) - -diff --git a/linux-headers/asm-s390/kvm.h b/linux-headers/asm-s390/kvm.h -index 11def14..1ab9901 100644 ---- a/linux-headers/asm-s390/kvm.h -+++ b/linux-headers/asm-s390/kvm.h -@@ -4,7 +4,7 @@ - /* - * KVM s390 specific structures and definitions - * -- * Copyright IBM Corp. 2008 -+ * Copyright IBM Corp. 2008, 2018 - * - * Author(s): Carsten Otte - * Christian Borntraeger -@@ -225,6 +225,7 @@ struct kvm_guest_debug_arch { - #define KVM_SYNC_FPRS (1UL << 8) - #define KVM_SYNC_GSCB (1UL << 9) - #define KVM_SYNC_BPBC (1UL << 10) -+#define KVM_SYNC_ETOKEN (1UL << 11) - /* length and alignment of the sdnx as a power of two */ - #define SDNXC 8 - #define SDNXL (1UL << SDNXC) -@@ -258,6 +259,8 @@ struct kvm_sync_regs { - struct { - __u64 reserved1[2]; - __u64 gscb[4]; -+ __u64 etoken; -+ __u64 etoken_extension; - }; - }; - }; -diff --git a/linux-headers/linux/kvm.h b/linux-headers/linux/kvm.h -index 98f389a..2aae948 100644 ---- a/linux-headers/linux/kvm.h -+++ b/linux-headers/linux/kvm.h -@@ -949,6 +949,7 @@ struct kvm_ppc_resize_hpt { - #define KVM_CAP_GET_MSR_FEATURES 153 - #define KVM_CAP_HYPERV_EVENTFD 154 - #define KVM_CAP_HYPERV_TLBFLUSH 155 -+#define KVM_CAP_S390_HPAGE_1M 156 - - #ifdef KVM_CAP_IRQ_ROUTING - --- -1.8.3.1 - diff --git a/0019-virtio-scsi-Reject-scsi-cd-if-data-plane-enabled-RHE.patch b/0020-virtio-scsi-Reject-scsi-cd-if-data-plane-enabled-RHE.patch similarity index 90% rename from 0019-virtio-scsi-Reject-scsi-cd-if-data-plane-enabled-RHE.patch rename to 0020-virtio-scsi-Reject-scsi-cd-if-data-plane-enabled-RHE.patch index e5e93ce..af07bfd 100644 --- a/0019-virtio-scsi-Reject-scsi-cd-if-data-plane-enabled-RHE.patch +++ b/0020-virtio-scsi-Reject-scsi-cd-if-data-plane-enabled-RHE.patch @@ -1,4 +1,4 @@ -From a883dbcc1c55cab189ff4a48cbdd12c4b4246b9c Mon Sep 17 00:00:00 2001 +From 7d316f7aebb9634c3ac5b79f5b1198e27726a0fd Mon Sep 17 00:00:00 2001 From: Fam Zheng Date: Wed, 14 Jun 2017 15:37:01 +0200 Subject: virtio-scsi: Reject scsi-cd if data plane enabled [RHEL only] @@ -36,13 +36,16 @@ crashing. Signed-off-by: Fam Zheng Signed-off-by: Miroslav Rezanina +(cherry picked from commit b0caf00bbc35c7d89e02999bdce86e1f867728e8) +(cherry picked from commit c9c4f117d8b507c2f86035c282d537c0a327364f) +(cherry picked from commit 5d586bb2543337f0ff172c6ce942dba3acbcedff) Signed-off-by: Danilo C. L. de Paula --- 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 5a3057d..52a3c1d 100644 +index 3aa9971..9f754c4 100644 --- a/hw/scsi/virtio-scsi.c +++ b/hw/scsi/virtio-scsi.c @@ -790,6 +790,15 @@ static void virtio_scsi_hotplug(HotplugHandler *hotplug_dev, DeviceState *dev, diff --git a/0021-s390x-Enable-KVM-huge-page-backing-support.patch b/0021-s390x-Enable-KVM-huge-page-backing-support.patch deleted file mode 100644 index 636c94d..0000000 --- a/0021-s390x-Enable-KVM-huge-page-backing-support.patch +++ /dev/null @@ -1,114 +0,0 @@ -From 3b4526245dcb2daad3a6393b6b129f85f9e2c7a2 Mon Sep 17 00:00:00 2001 -From: David Hildenbrand -Date: Mon, 6 Aug 2018 14:18:41 +0100 -Subject: s390x: Enable KVM huge page backing support - -RH-Author: David Hildenbrand -Message-id: <20180806141842.23963-3-david@redhat.com> -Patchwork-id: 81645 -O-Subject: [RHEL-8.0 qemu-kvm PATCH v2 2/3] s390x: Enable KVM huge page backing support -Bugzilla: 1610906 -RH-Acked-by: Thomas Huth -RH-Acked-by: Cornelia Huck -RH-Acked-by: Paolo Bonzini - -BZ: https://bugzilla.redhat.com/show_bug.cgi?id=1610906 -Brew: https://brewweb.engineering.redhat.com/brew/taskinfo?taskID=17624600 -Upstream: N/A - -Kernel part is in kvm/next, scheduled for 4.19. Patch has been reviewed -upstream but cannot get picked up yet due to the outstanding linux -header sync. Conflict to upstream patch: We have no units.h, therefore -we have to unfold "4*KiB" and "1*MiB". - -QEMU has had huge page support for a longer time already, but KVM -memory management under s390x needed some changes to work with huge -backings. - -Now that we have support, let's enable it if requested and -available. Otherwise we now properly tell the user if there is no -support and back out instead of failing to run the VM later on. - -Signed-off-by: Janosch Frank -Reviewed-by: David Hildenbrand -Reviewed-by: Thomas Huth -Signed-off-by: David Hildenbrand -Signed-off-by: Danilo C. L. de Paula ---- - target/s390x/kvm.c | 34 ++++++++++++++++++++++++++++++++-- - 1 file changed, 32 insertions(+), 2 deletions(-) - -diff --git a/target/s390x/kvm.c b/target/s390x/kvm.c -index bbcbeed..c36ff36f 100644 ---- a/target/s390x/kvm.c -+++ b/target/s390x/kvm.c -@@ -34,6 +34,7 @@ - #include "qapi/error.h" - #include "qemu/error-report.h" - #include "qemu/timer.h" -+#include "qemu/mmap-alloc.h" - #include "sysemu/sysemu.h" - #include "sysemu/hw_accel.h" - #include "hw/hw.h" -@@ -139,6 +140,7 @@ static int cap_mem_op; - static int cap_s390_irq; - static int cap_ri; - static int cap_gs; -+static int cap_hpage_1m; - - static int active_cmma; - -@@ -220,9 +222,9 @@ static void kvm_s390_enable_cmma(void) - .attr = KVM_S390_VM_MEM_ENABLE_CMMA, - }; - -- if (mem_path) { -+ if (cap_hpage_1m) { - warn_report("CMM will not be enabled because it is not " -- "compatible with hugetlbfs."); -+ "compatible with huge memory backings."); - return; - } - rc = kvm_vm_ioctl(kvm_state, KVM_SET_DEVICE_ATTR, &attr); -@@ -281,10 +283,38 @@ void kvm_s390_crypto_reset(void) - } - } - -+static int kvm_s390_configure_mempath_backing(KVMState *s) -+{ -+ size_t path_psize = qemu_mempath_getpagesize(mem_path); -+ -+ if (path_psize == 4 * 1024) { -+ return 0; -+ } -+ -+ if (path_psize != 1024 * 1024) { -+ error_report("Memory backing with 2G pages was specified, " -+ "but KVM does not support this memory backing"); -+ return -EINVAL; -+ } -+ -+ if (kvm_vm_enable_cap(s, KVM_CAP_S390_HPAGE_1M, 0)) { -+ error_report("Memory backing with 1M pages was specified, " -+ "but KVM does not support this memory backing"); -+ return -EINVAL; -+ } -+ -+ cap_hpage_1m = 1; -+ return 0; -+} -+ - int kvm_arch_init(MachineState *ms, KVMState *s) - { - MachineClass *mc = MACHINE_GET_CLASS(ms); - -+ if (mem_path && kvm_s390_configure_mempath_backing(s)) { -+ return -EINVAL; -+ } -+ - mc->default_cpu_type = S390_CPU_TYPE_NAME("host"); - cap_sync_regs = kvm_check_extension(s, KVM_CAP_SYNC_REGS); - cap_async_pf = kvm_check_extension(s, KVM_CAP_ASYNC_PF); --- -1.8.3.1 - diff --git a/0022-s390x-kvm-add-etoken-facility.patch b/0022-s390x-kvm-add-etoken-facility.patch deleted file mode 100644 index d56ba50..0000000 --- a/0022-s390x-kvm-add-etoken-facility.patch +++ /dev/null @@ -1,190 +0,0 @@ -From 8eacbf0e8e26b2a8aa3de955a57a7a3cb680d922 Mon Sep 17 00:00:00 2001 -From: Thomas Huth -Date: Thu, 9 Aug 2018 10:15:09 +0000 -Subject: s390x/kvm: add etoken facility - -RH-Author: Thomas Huth -Message-id: <1533813309-9643-3-git-send-email-thuth@redhat.com> -Patchwork-id: 81687 -O-Subject: [RHEL-8.0 qemu-kvm PATCH 2/2] s390x/kvm: add etoken facility -Bugzilla: 1612938 -RH-Acked-by: David Hildenbrand -RH-Acked-by: Cornelia Huck -RH-Acked-by: Jens Freimann - -Provide the etoken facility. We need to handle cpu model, migration and -clear reset. - -Signed-off-by: Christian Borntraeger -Acked-by: Janosch Frank -Signed-off-by: Thomas Huth ---- - target/s390x/cpu.h | 3 +++ - target/s390x/cpu_features.c | 3 ++- - target/s390x/cpu_features_def.h | 3 ++- - target/s390x/gen-features.c | 3 ++- - target/s390x/kvm.c | 11 +++++++++++ - target/s390x/machine.c | 20 +++++++++++++++++++- - 6 files changed, 39 insertions(+), 4 deletions(-) - -diff --git a/target/s390x/cpu.h b/target/s390x/cpu.h -index 2c3dd2d..21b2f21 100644 ---- a/target/s390x/cpu.h -+++ b/target/s390x/cpu.h -@@ -2,6 +2,7 @@ - * S/390 virtual CPU header - * - * Copyright (c) 2009 Ulrich Hecht -+ * Copyright IBM Corp. 2012, 2018 - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public -@@ -68,6 +69,8 @@ struct CPUS390XState { - uint32_t aregs[16]; /* access registers */ - uint8_t riccb[64]; /* runtime instrumentation control */ - uint64_t gscb[4]; /* guarded storage control */ -+ uint64_t etoken; /* etoken */ -+ uint64_t etoken_extension; /* etoken extension */ - - /* Fields up to this point are not cleared by initial CPU reset */ - struct {} start_initial_reset_fields; -diff --git a/target/s390x/cpu_features.c b/target/s390x/cpu_features.c -index 3b9e274..e05e6aa 100644 ---- a/target/s390x/cpu_features.c -+++ b/target/s390x/cpu_features.c -@@ -1,7 +1,7 @@ - /* - * CPU features/facilities for s390x - * -- * Copyright 2016 IBM Corp. -+ * Copyright IBM Corp. 2016, 2018 - * - * Author(s): David Hildenbrand - * -@@ -106,6 +106,7 @@ static const S390FeatDef s390_features[] = { - FEAT_INIT("irbm", S390_FEAT_TYPE_STFL, 145, "Insert-reference-bits-multiple facility"), - FEAT_INIT("msa8-base", S390_FEAT_TYPE_STFL, 146, "Message-security-assist-extension-8 facility (excluding subfunctions)"), - FEAT_INIT("cmmnt", S390_FEAT_TYPE_STFL, 147, "CMM: ESSA-enhancement (no translate) facility"), -+ FEAT_INIT("etoken", S390_FEAT_TYPE_STFL, 156, "Etoken facility"), - - /* SCLP SCCB Byte 80 - 98 (bit numbers relative to byte-80) */ - FEAT_INIT("gsls", S390_FEAT_TYPE_SCLP_CONF_CHAR, 40, "SIE: Guest-storage-limit-suppression facility"), -diff --git a/target/s390x/cpu_features_def.h b/target/s390x/cpu_features_def.h -index 7c5915c..ac2c947 100644 ---- a/target/s390x/cpu_features_def.h -+++ b/target/s390x/cpu_features_def.h -@@ -1,7 +1,7 @@ - /* - * CPU features/facilities for s390 - * -- * Copyright 2016 IBM Corp. -+ * Copyright IBM Corp. 2016, 2018 - * - * Author(s): Michael Mueller - * David Hildenbrand -@@ -93,6 +93,7 @@ typedef enum { - S390_FEAT_INSERT_REFERENCE_BITS_MULT, - S390_FEAT_MSA_EXT_8, - S390_FEAT_CMM_NT, -+ S390_FEAT_ETOKEN, - - /* Sclp Conf Char */ - S390_FEAT_SIE_GSLS, -diff --git a/target/s390x/gen-features.c b/target/s390x/gen-features.c -index 6626b6f..5af042c 100644 ---- a/target/s390x/gen-features.c -+++ b/target/s390x/gen-features.c -@@ -1,7 +1,7 @@ - /* - * S390 feature list generator - * -- * Copyright 2016 IBM Corp. -+ * Copyright IBM Corp. 2016, 2018 - * - * Author(s): Michael Mueller - * David Hildenbrand -@@ -471,6 +471,7 @@ static uint16_t full_GEN14_GA1[] = { - S390_FEAT_GROUP_MSA_EXT_7, - S390_FEAT_GROUP_MSA_EXT_8, - S390_FEAT_CMM_NT, -+ S390_FEAT_ETOKEN, - S390_FEAT_HPMA2, - S390_FEAT_SIE_KSS, - S390_FEAT_GROUP_MULTIPLE_EPOCH_PTFF, -diff --git a/target/s390x/kvm.c b/target/s390x/kvm.c -index c36ff36f..71d90f2 100644 ---- a/target/s390x/kvm.c -+++ b/target/s390x/kvm.c -@@ -523,6 +523,12 @@ int kvm_arch_put_registers(CPUState *cs, int level) - cs->kvm_run->kvm_dirty_regs |= KVM_SYNC_BPBC; - } - -+ if (can_sync_regs(cs, KVM_SYNC_ETOKEN)) { -+ cs->kvm_run->s.regs.etoken = env->etoken; -+ cs->kvm_run->s.regs.etoken_extension = env->etoken_extension; -+ cs->kvm_run->kvm_dirty_regs |= KVM_SYNC_ETOKEN; -+ } -+ - /* Finally the prefix */ - if (can_sync_regs(cs, KVM_SYNC_PREFIX)) { - cs->kvm_run->s.regs.prefix = env->psa; -@@ -637,6 +643,11 @@ int kvm_arch_get_registers(CPUState *cs) - env->bpbc = cs->kvm_run->s.regs.bpbc; - } - -+ if (can_sync_regs(cs, KVM_SYNC_ETOKEN)) { -+ env->etoken = cs->kvm_run->s.regs.etoken; -+ env->etoken_extension = cs->kvm_run->s.regs.etoken_extension; -+ } -+ - /* pfault parameters */ - if (can_sync_regs(cs, KVM_SYNC_PFAULT)) { - env->pfault_token = cs->kvm_run->s.regs.pft; -diff --git a/target/s390x/machine.c b/target/s390x/machine.c -index bd3230d..cb792aa 100644 ---- a/target/s390x/machine.c -+++ b/target/s390x/machine.c -@@ -1,7 +1,7 @@ - /* - * S390x machine definitions and functions - * -- * Copyright IBM Corp. 2014 -+ * Copyright IBM Corp. 2014, 2018 - * - * Authors: - * Thomas Huth -@@ -216,6 +216,23 @@ const VMStateDescription vmstate_bpbc = { - } - }; - -+static bool etoken_needed(void *opaque) -+{ -+ return s390_has_feat(S390_FEAT_ETOKEN); -+} -+ -+const VMStateDescription vmstate_etoken = { -+ .name = "cpu/etoken", -+ .version_id = 1, -+ .minimum_version_id = 1, -+ .needed = etoken_needed, -+ .fields = (VMStateField[]) { -+ VMSTATE_UINT64(env.etoken, S390CPU), -+ VMSTATE_UINT64(env.etoken_extension, S390CPU), -+ VMSTATE_END_OF_LIST() -+ } -+}; -+ - const VMStateDescription vmstate_s390_cpu = { - .name = "cpu", - .post_load = cpu_post_load, -@@ -251,6 +268,7 @@ const VMStateDescription vmstate_s390_cpu = { - &vmstate_exval, - &vmstate_gscb, - &vmstate_bpbc, -+ &vmstate_etoken, - NULL - }, - }; --- -1.8.3.1 - diff --git a/0023-s390x-cpumodel-default-enable-bpb-and-ppa15-for-z196.patch b/0023-s390x-cpumodel-default-enable-bpb-and-ppa15-for-z196.patch deleted file mode 100644 index 01227d7..0000000 --- a/0023-s390x-cpumodel-default-enable-bpb-and-ppa15-for-z196.patch +++ /dev/null @@ -1,51 +0,0 @@ -From 29df663d045345a8c498dc3966cc59dcf091a50d Mon Sep 17 00:00:00 2001 -From: Cornelia Huck -Date: Tue, 7 Aug 2018 09:05:54 +0000 -Subject: s390x/cpumodel: default enable bpb and ppa15 for z196 and later - -RH-Author: Cornelia Huck -Message-id: <20180807100554.29643-3-cohuck@redhat.com> -Patchwork-id: 81660 -O-Subject: [qemu-kvm RHEL8/virt212 PATCH 2/2] s390x/cpumodel: default enable bpb and ppa15 for z196 and later -Bugzilla: 1595718 -RH-Acked-by: David Hildenbrand -RH-Acked-by: Thomas Huth -RH-Acked-by: Jens Freimann - -Upstream: downstream version of 8727315111 ("s390x/cpumodel: default - enable bpb and ppa15 for z196 and later"); downstream does - not have the upstream machine types, instead we need to - turn off the bits for the RHEL 7.5 machine - -Most systems and host kernels provide the necessary building blocks for -bpb and ppa15. We can reverse the logic and default enable those -features, while still allowing to disable it via cpu model. - -So let us add bpb and ppa15 to z196 and later default CPU model for the -qemu rhel7.6.0 machine. (like -cpu z13). Older machine types (i.e. -s390-ccw-virtio-rhel7.5.0) will retain the old value and not provide those -bits in the default model. - -Signed-off-by: Cornelia Huck ---- - hw/s390x/s390-virtio-ccw.c | 4 ++++ - 1 file changed, 4 insertions(+) - -diff --git a/hw/s390x/s390-virtio-ccw.c b/hw/s390x/s390-virtio-ccw.c -index 0f135c9..cdf4558 100644 ---- a/hw/s390x/s390-virtio-ccw.c -+++ b/hw/s390x/s390-virtio-ccw.c -@@ -931,6 +931,10 @@ static void ccw_machine_rhel750_instance_options(MachineState *machine) - /* before 2.12 we emulated the very first z900, and RHEL 7.5 is - based on 2.10 */ - s390_set_qemu_cpu_model(0x2064, 7, 1, qemu_cpu_feat); -+ -+ /* bpb and ppa15 were only in the full model in RHEL 7.5 */ -+ s390_cpudef_featoff_greater(11, 1, S390_FEAT_PPA15); -+ s390_cpudef_featoff_greater(11, 1, S390_FEAT_BPB); - } - - static void ccw_machine_rhel750_class_options(MachineClass *mc) --- -1.8.3.1 - diff --git a/0024-i386-Fix-arch_query_cpu_model_expansion-leak.patch b/0024-i386-Fix-arch_query_cpu_model_expansion-leak.patch deleted file mode 100644 index e2570c5..0000000 --- a/0024-i386-Fix-arch_query_cpu_model_expansion-leak.patch +++ /dev/null @@ -1,87 +0,0 @@ -From 43b08a1e4bc47d810212f569cc0fc30eebfd7036 Mon Sep 17 00:00:00 2001 -From: Markus Armbruster -Date: Fri, 31 Aug 2018 13:59:22 +0100 -Subject: i386: Fix arch_query_cpu_model_expansion() leak - -RH-Author: Markus Armbruster -Message-id: <20180831135922.6073-3-armbru@redhat.com> -Patchwork-id: 81980 -O-Subject: [qemu-kvm RHEL8/virt212 PATCH 2/2] i386: Fix arch_query_cpu_model_expansion() leak -Bugzilla: 1615717 -RH-Acked-by: Eduardo Habkost -RH-Acked-by: Laszlo Ersek -RH-Acked-by: Miroslav Rezanina - -From: Eduardo Habkost - -Reported by Coverity: - -Error: RESOURCE_LEAK (CWE-772): [#def439] -qemu-2.12.0/target/i386/cpu.c:3179: alloc_fn: Storage is returned from allocation function "qdict_new". -qemu-2.12.0/qobject/qdict.c:34:5: alloc_fn: Storage is returned from allocation function "g_malloc0". -qemu-2.12.0/qobject/qdict.c:34:5: var_assign: Assigning: "qdict" = "g_malloc0(4120UL)". -qemu-2.12.0/qobject/qdict.c:37:5: return_alloc: Returning allocated memory "qdict". -qemu-2.12.0/target/i386/cpu.c:3179: var_assign: Assigning: "props" = storage returned from "qdict_new()". -qemu-2.12.0/target/i386/cpu.c:3217: leaked_storage: Variable "props" going out of scope leaks the storage it points to. - -This was introduced by commit b8097deb359b ("i386: Improve -query-cpu-model-expansion full mode"). - -The leak is only theoretical: if ret->model->props is set to -props, the qapi_free_CpuModelExpansionInfo() call will free props -too in case of errors. The only way for this to not happen is if -we enter the default branch of the switch statement, which would -never happen because all CpuModelExpansionType values are being -handled. - -It's still worth to change this to make the allocation logic -easier to follow and make the Coverity error go away. To make -everything simpler, initialize ret->model and ret->model->props -earlier in the function. - -While at it, remove redundant check for !prop because prop is -always initialized at the beginning of the function. - -Fixes: b8097deb359bbbd92592b9670adfe9e245b2d0bd -Signed-off-by: Eduardo Habkost -Message-Id: <20180816183509.8231-1-ehabkost@redhat.com> -Signed-off-by: Paolo Bonzini -(cherry picked from commit e38bf612477fca62b205ebd909b1372a7e45a8c0) -Signed-off-by: Danilo C. L. de Paula ---- - target/i386/cpu.c | 9 +++------ - 1 file changed, 3 insertions(+), 6 deletions(-) - -diff --git a/target/i386/cpu.c b/target/i386/cpu.c -index 051018a..71e2808 100644 ---- a/target/i386/cpu.c -+++ b/target/i386/cpu.c -@@ -3784,6 +3784,9 @@ arch_query_cpu_model_expansion(CpuModelExpansionType type, - } - - props = qdict_new(); -+ ret->model = g_new0(CpuModelInfo, 1); -+ ret->model->props = QOBJECT(props); -+ ret->model->has_props = true; - - switch (type) { - case CPU_MODEL_EXPANSION_TYPE_STATIC: -@@ -3804,15 +3807,9 @@ arch_query_cpu_model_expansion(CpuModelExpansionType type, - goto out; - } - -- if (!props) { -- props = qdict_new(); -- } - x86_cpu_to_dict(xc, props); - -- ret->model = g_new0(CpuModelInfo, 1); - ret->model->name = g_strdup(base_name); -- ret->model->props = QOBJECT(props); -- ret->model->has_props = true; - - out: - object_unref(OBJECT(xc)); --- -1.8.3.1 - diff --git a/0025-i386-Disable-TOPOEXT-by-default-on-cpu-host.patch b/0025-i386-Disable-TOPOEXT-by-default-on-cpu-host.patch deleted file mode 100644 index 12692e8..0000000 --- a/0025-i386-Disable-TOPOEXT-by-default-on-cpu-host.patch +++ /dev/null @@ -1,54 +0,0 @@ -From 628b10cd4d5cd8fde97dab66f143db78fe03398a Mon Sep 17 00:00:00 2001 -From: Eduardo Habkost -Date: Tue, 21 Aug 2018 19:15:41 +0100 -Subject: i386: Disable TOPOEXT by default on "-cpu host" - -RH-Author: Eduardo Habkost -Message-id: <20180821191541.31916-2-ehabkost@redhat.com> -Patchwork-id: 81904 -O-Subject: [qemu-kvm RHEL8/virt212 PATCH v2 1/1] i386: Disable TOPOEXT by default on "-cpu host" -Bugzilla: 1619804 -RH-Acked-by: Miroslav Rezanina -RH-Acked-by: Paolo Bonzini -RH-Acked-by: Igor Mammedov - -Enabling TOPOEXT is always allowed, but it can't be enabled -blindly by "-cpu host" because it may make guests crash if the -rest of the cache topology information isn't provided or isn't -consistent. - -This addresses the bug reported at: -https://bugzilla.redhat.com/show_bug.cgi?id=1613277 - -Signed-off-by: Eduardo Habkost -Message-Id: <20180809221852.15285-1-ehabkost@redhat.com> -Tested-by: Richard W.M. Jones -Reviewed-by: Babu Moger -Signed-off-by: Eduardo Habkost -(cherry picked from commit 7210a02c58572b2686a3a8d610c6628f87864aed) -Signed-off-by: Eduardo Habkost -Signed-off-by: Danilo C. L. de Paula ---- - target/i386/cpu.c | 6 ++++++ - 1 file changed, 6 insertions(+) - -diff --git a/target/i386/cpu.c b/target/i386/cpu.c -index 71e2808..198d578 100644 ---- a/target/i386/cpu.c -+++ b/target/i386/cpu.c -@@ -849,6 +849,12 @@ static FeatureWordInfo feature_word_info[FEATURE_WORDS] = { - }, - .cpuid_eax = 0x80000001, .cpuid_reg = R_ECX, - .tcg_features = TCG_EXT3_FEATURES, -+ /* -+ * TOPOEXT is always allowed but can't be enabled blindly by -+ * "-cpu host", as it requires consistent cache topology info -+ * to be provided so it doesn't confuse guests. -+ */ -+ .no_autoenable_flags = CPUID_EXT3_TOPOEXT, - }, - [FEAT_C000_0001_EDX] = { - .feat_names = { --- -1.8.3.1 - diff --git a/0026-curl-Make-sslverify-off-disable-host-as-well-as-peer.patch b/0026-curl-Make-sslverify-off-disable-host-as-well-as-peer.patch deleted file mode 100644 index 3f2736c..0000000 --- a/0026-curl-Make-sslverify-off-disable-host-as-well-as-peer.patch +++ /dev/null @@ -1,77 +0,0 @@ -From 1ed2bb0d831983b68bcdecd057c2c5bfd419c304 Mon Sep 17 00:00:00 2001 -From: Jeffrey Cody -Date: Wed, 26 Sep 2018 04:08:14 +0100 -Subject: curl: Make sslverify=off disable host as well as peer verification. - -RH-Author: Jeffrey Cody -Message-id: <543d2f667af465dd809329fcba5175bc974d58d4.1537933576.git.jcody@redhat.com> -Patchwork-id: 82293 -O-Subject: [RHEL8/rhel qemu-kvm PATCH 1/1] curl: Make sslverify=off disable host as well as peer verification. -Bugzilla: 1575925 -RH-Acked-by: Richard Jones -RH-Acked-by: John Snow -RH-Acked-by: Max Reitz - -From: "Richard W.M. Jones" - -The sslverify setting is supposed to turn off all TLS certificate -checks in libcurl. However because of the way we use it, it only -turns off peer certificate authenticity checks -(CURLOPT_SSL_VERIFYPEER). This patch makes it also turn off the check -that the server name in the certificate is the same as the server -you're connecting to (CURLOPT_SSL_VERIFYHOST). - -We can use Google's server at 8.8.8.8 which happens to have a bad TLS -certificate to demonstrate this: - -$ ./qemu-img create -q -f qcow2 -b 'json: { "file.sslverify": "off", "file.driver": "https", "file.url": "https://8.8.8.8/foo" }' /var/tmp/file.qcow2 -qemu-img: /var/tmp/file.qcow2: CURL: Error opening file: SSL: no alternative certificate subject name matches target host name '8.8.8.8' -Could not open backing image to determine size. - -With this patch applied, qemu-img connects to the server regardless of -the bad certificate: - -$ ./qemu-img create -q -f qcow2 -b 'json: { "file.sslverify": "off", "file.driver": "https", "file.url": "https://8.8.8.8/foo" }' /var/tmp/file.qcow2 -qemu-img: /var/tmp/file.qcow2: CURL: Error opening file: The requested URL returned error: 404 Not Found - -(The 404 error is expected because 8.8.8.8 is not actually serving a -file called "/foo".) - -Of course the default (without sslverify=off) remains to always check -the certificate: - -$ ./qemu-img create -q -f qcow2 -b 'json: { "file.driver": "https", "file.url": "https://8.8.8.8/foo" }' /var/tmp/file.qcow2 -qemu-img: /var/tmp/file.qcow2: CURL: Error opening file: SSL: no alternative certificate subject name matches target host name '8.8.8.8' -Could not open backing image to determine size. - -Further information about the two settings is available here: - -https://curl.haxx.se/libcurl/c/CURLOPT_SSL_VERIFYPEER.html -https://curl.haxx.se/libcurl/c/CURLOPT_SSL_VERIFYHOST.html - -Signed-off-by: Richard W.M. Jones -Message-id: 20180914095622.19698-1-rjones@redhat.com -Signed-off-by: Jeff Cody -(cherry picked from commit 637fa44ab80c6b317adf1d117494325a95daad60) -Signed-off-by: Jeff Cody -Signed-off-by: Danilo C. L. de Paula ---- - block/curl.c | 2 ++ - 1 file changed, 2 insertions(+) - -diff --git a/block/curl.c b/block/curl.c -index 229bb84..fabb2b4 100644 ---- a/block/curl.c -+++ b/block/curl.c -@@ -483,6 +483,8 @@ static int curl_init_state(BDRVCURLState *s, CURLState *state) - curl_easy_setopt(state->curl, CURLOPT_URL, s->url); - curl_easy_setopt(state->curl, CURLOPT_SSL_VERIFYPEER, - (long) s->sslverify); -+ curl_easy_setopt(state->curl, CURLOPT_SSL_VERIFYHOST, -+ s->sslverify ? 2L : 0L); - if (s->cookie) { - curl_easy_setopt(state->curl, CURLOPT_COOKIE, s->cookie); - } --- -1.8.3.1 - diff --git a/0027-migration-postcopy-Clear-have_listen_thread.patch b/0027-migration-postcopy-Clear-have_listen_thread.patch deleted file mode 100644 index 86157d9..0000000 --- a/0027-migration-postcopy-Clear-have_listen_thread.patch +++ /dev/null @@ -1,51 +0,0 @@ -From 096b7abf1d2755ad469e4bcb3dc6302021979814 Mon Sep 17 00:00:00 2001 -From: "Dr. David Alan Gilbert" -Date: Mon, 1 Oct 2018 10:54:48 +0100 -Subject: migration/postcopy: Clear have_listen_thread - -RH-Author: Dr. David Alan Gilbert -Message-id: <20181001105449.41090-2-dgilbert@redhat.com> -Patchwork-id: 82326 -O-Subject: [RHEL-8.0 qemu-kvm PATCH 1/2] migration/postcopy: Clear have_listen_thread -Bugzilla: 1608765 -RH-Acked-by: Pankaj Gupta -RH-Acked-by: Laszlo Ersek -RH-Acked-by: Laurent Vivier - -From: "Dr. David Alan Gilbert" - -Clear have_listen_thread when we exit the thread. -The fallout from this was that various things thought there was -an ongoing postcopy after the postcopy had finished. - -The case that failed was postcopy->savevm->loadvm. - -This corresponds to RH bug https://bugzilla.redhat.com/show_bug.cgi?id=1608765 - -Signed-off-by: Dr. David Alan Gilbert -Message-Id: <20180914170430.54271-2-dgilbert@redhat.com> -Reviewed-by: Peter Xu -Signed-off-by: Dr. David Alan Gilbert -(cherry picked from commit 9cf4bb8730c669c40550e635a9e2b8ee4f1664ca) - Manual merge due to context - -Signed-off-by: Danilo C. L. de Paula ---- - migration/savevm.c | 1 + - 1 file changed, 1 insertion(+) - -diff --git a/migration/savevm.c b/migration/savevm.c -index 7f92567..762c4b2 100644 ---- a/migration/savevm.c -+++ b/migration/savevm.c -@@ -1676,6 +1676,7 @@ static void *postcopy_ram_listen_thread(void *opaque) - migration_incoming_state_destroy(); - qemu_loadvm_state_cleanup(); - -+ mis->have_listen_thread = false; - return NULL; - } - --- -1.8.3.1 - diff --git a/0028-migration-cleanup-in-error-paths-in-loadvm.patch b/0028-migration-cleanup-in-error-paths-in-loadvm.patch deleted file mode 100644 index f576c82..0000000 --- a/0028-migration-cleanup-in-error-paths-in-loadvm.patch +++ /dev/null @@ -1,52 +0,0 @@ -From bff052b89b0c32c179d858bd8eed91e0d9f98db4 Mon Sep 17 00:00:00 2001 -From: "Dr. David Alan Gilbert" -Date: Mon, 1 Oct 2018 10:54:49 +0100 -Subject: migration: cleanup in error paths in loadvm - -RH-Author: Dr. David Alan Gilbert -Message-id: <20181001105449.41090-3-dgilbert@redhat.com> -Patchwork-id: 82325 -O-Subject: [RHEL-8.0 qemu-kvm PATCH 2/2] migration: cleanup in error paths in loadvm -Bugzilla: 1608765 -RH-Acked-by: Pankaj Gupta -RH-Acked-by: Laszlo Ersek -RH-Acked-by: Laurent Vivier - -From: "Dr. David Alan Gilbert" - -There's a couple of error paths in qemu_loadvm_state -which happen early on but after we've initialised the -load state; that needs to be cleaned up otherwise -we can hit asserts if the state gets reinitialised later. - -Signed-off-by: Dr. David Alan Gilbert -Message-Id: <20180914170430.54271-3-dgilbert@redhat.com> -Reviewed-by: Peter Xu -Signed-off-by: Dr. David Alan Gilbert -(cherry picked from commit 096c83b7219c5a2145435afc8be750281e9cb447) -Signed-off-by: Danilo C. L. de Paula ---- - migration/savevm.c | 2 ++ - 1 file changed, 2 insertions(+) - -diff --git a/migration/savevm.c b/migration/savevm.c -index 762c4b2..27e054d 100644 ---- a/migration/savevm.c -+++ b/migration/savevm.c -@@ -2328,11 +2328,13 @@ int qemu_loadvm_state(QEMUFile *f) - if (migrate_get_current()->send_configuration) { - if (qemu_get_byte(f) != QEMU_VM_CONFIGURATION) { - error_report("Configuration section missing"); -+ qemu_loadvm_state_cleanup(); - return -EINVAL; - } - ret = vmstate_load_state(f, &vmstate_configuration, &savevm_state, 0); - - if (ret) { -+ qemu_loadvm_state_cleanup(); - return ret; - } - } --- -1.8.3.1 - diff --git a/0029-jobs-change-start-callback-to-run-callback.patch b/0029-jobs-change-start-callback-to-run-callback.patch deleted file mode 100644 index 0955ee2..0000000 --- a/0029-jobs-change-start-callback-to-run-callback.patch +++ /dev/null @@ -1,372 +0,0 @@ -From 2999207ffd4de9f139922b444edba07b051d4a67 Mon Sep 17 00:00:00 2001 -From: John Snow -Date: Tue, 25 Sep 2018 22:34:07 +0100 -Subject: jobs: change start callback to run callback - -RH-Author: John Snow -Message-id: <20180925223431.24791-2-jsnow@redhat.com> -Patchwork-id: 82261 -O-Subject: [RHEL8/rhel qemu-kvm PATCH 01/25] jobs: change start callback to run callback -Bugzilla: 1632939 -RH-Acked-by: Jeffrey Cody -RH-Acked-by: Max Reitz -RH-Acked-by: Kevin Wolf - -Presently we codify the entry point for a job as the "start" callback, -but a more apt name would be "run" to clarify the idea that when this -function returns we consider the job to have "finished," except for -any cleanup which occurs in separate callbacks later. - -As part of this clarification, change the signature to include an error -object and a return code. The error ptr is not yet used, and the return -code while captured, will be overwritten by actions in the job_completed -function. - -Signed-off-by: John Snow -Reviewed-by: Max Reitz -Message-id: 20180830015734.19765-2-jsnow@redhat.com -Reviewed-by: Jeff Cody -Signed-off-by: Max Reitz -(cherry picked from commit f67432a2019caf05b57a146bf45c1024a5cb608e) -Signed-off-by: John Snow -Signed-off-by: Danilo C. L. de Paula ---- - block/backup.c | 7 ++++--- - block/commit.c | 7 ++++--- - block/create.c | 8 +++++--- - block/mirror.c | 10 ++++++---- - block/stream.c | 7 ++++--- - include/qemu/job.h | 2 +- - job.c | 6 +++--- - tests/test-bdrv-drain.c | 7 ++++--- - tests/test-blockjob-txn.c | 16 ++++++++-------- - tests/test-blockjob.c | 7 ++++--- - 10 files changed, 43 insertions(+), 34 deletions(-) - -diff --git a/block/backup.c b/block/backup.c -index 8630d32..5d47781 100644 ---- a/block/backup.c -+++ b/block/backup.c -@@ -480,9 +480,9 @@ static void backup_incremental_init_copy_bitmap(BackupBlockJob *job) - bdrv_dirty_iter_free(dbi); - } - --static void coroutine_fn backup_run(void *opaque) -+static int coroutine_fn backup_run(Job *opaque_job, Error **errp) - { -- BackupBlockJob *job = opaque; -+ BackupBlockJob *job = container_of(opaque_job, BackupBlockJob, common.job); - BackupCompleteData *data; - BlockDriverState *bs = blk_bs(job->common.blk); - int64_t offset, nb_clusters; -@@ -587,6 +587,7 @@ static void coroutine_fn backup_run(void *opaque) - data = g_malloc(sizeof(*data)); - data->ret = ret; - job_defer_to_main_loop(&job->common.job, backup_complete, data); -+ return ret; - } - - static const BlockJobDriver backup_job_driver = { -@@ -596,7 +597,7 @@ static const BlockJobDriver backup_job_driver = { - .free = block_job_free, - .user_resume = block_job_user_resume, - .drain = block_job_drain, -- .start = backup_run, -+ .run = backup_run, - .commit = backup_commit, - .abort = backup_abort, - .clean = backup_clean, -diff --git a/block/commit.c b/block/commit.c -index e1814d9..905a1c5 100644 ---- a/block/commit.c -+++ b/block/commit.c -@@ -134,9 +134,9 @@ static void commit_complete(Job *job, void *opaque) - bdrv_unref(top); - } - --static void coroutine_fn commit_run(void *opaque) -+static int coroutine_fn commit_run(Job *job, Error **errp) - { -- CommitBlockJob *s = opaque; -+ CommitBlockJob *s = container_of(job, CommitBlockJob, common.job); - CommitCompleteData *data; - int64_t offset; - uint64_t delay_ns = 0; -@@ -213,6 +213,7 @@ out: - data = g_malloc(sizeof(*data)); - data->ret = ret; - job_defer_to_main_loop(&s->common.job, commit_complete, data); -+ return ret; - } - - static const BlockJobDriver commit_job_driver = { -@@ -222,7 +223,7 @@ static const BlockJobDriver commit_job_driver = { - .free = block_job_free, - .user_resume = block_job_user_resume, - .drain = block_job_drain, -- .start = commit_run, -+ .run = commit_run, - }, - }; - -diff --git a/block/create.c b/block/create.c -index 915cd41..04733c3 100644 ---- a/block/create.c -+++ b/block/create.c -@@ -45,9 +45,9 @@ static void blockdev_create_complete(Job *job, void *opaque) - job_completed(job, s->ret, s->err); - } - --static void coroutine_fn blockdev_create_run(void *opaque) -+static int coroutine_fn blockdev_create_run(Job *job, Error **errp) - { -- BlockdevCreateJob *s = opaque; -+ BlockdevCreateJob *s = container_of(job, BlockdevCreateJob, common); - - job_progress_set_remaining(&s->common, 1); - s->ret = s->drv->bdrv_co_create(s->opts, &s->err); -@@ -55,12 +55,14 @@ static void coroutine_fn blockdev_create_run(void *opaque) - - qapi_free_BlockdevCreateOptions(s->opts); - job_defer_to_main_loop(&s->common, blockdev_create_complete, NULL); -+ -+ return s->ret; - } - - static const JobDriver blockdev_create_job_driver = { - .instance_size = sizeof(BlockdevCreateJob), - .job_type = JOB_TYPE_CREATE, -- .start = blockdev_create_run, -+ .run = blockdev_create_run, - }; - - void qmp_blockdev_create(const char *job_id, BlockdevCreateOptions *options, -diff --git a/block/mirror.c b/block/mirror.c -index b48c3f8..b3363e9 100644 ---- a/block/mirror.c -+++ b/block/mirror.c -@@ -812,9 +812,9 @@ static int mirror_flush(MirrorBlockJob *s) - return ret; - } - --static void coroutine_fn mirror_run(void *opaque) -+static int coroutine_fn mirror_run(Job *job, Error **errp) - { -- MirrorBlockJob *s = opaque; -+ MirrorBlockJob *s = container_of(job, MirrorBlockJob, common.job); - MirrorExitData *data; - BlockDriverState *bs = s->mirror_top_bs->backing->bs; - BlockDriverState *target_bs = blk_bs(s->target); -@@ -1041,7 +1041,9 @@ immediate_exit: - if (need_drain) { - bdrv_drained_begin(bs); - } -+ - job_defer_to_main_loop(&s->common.job, mirror_exit, data); -+ return ret; - } - - static void mirror_complete(Job *job, Error **errp) -@@ -1138,7 +1140,7 @@ static const BlockJobDriver mirror_job_driver = { - .free = block_job_free, - .user_resume = block_job_user_resume, - .drain = block_job_drain, -- .start = mirror_run, -+ .run = mirror_run, - .pause = mirror_pause, - .complete = mirror_complete, - }, -@@ -1154,7 +1156,7 @@ static const BlockJobDriver commit_active_job_driver = { - .free = block_job_free, - .user_resume = block_job_user_resume, - .drain = block_job_drain, -- .start = mirror_run, -+ .run = mirror_run, - .pause = mirror_pause, - .complete = mirror_complete, - }, -diff --git a/block/stream.c b/block/stream.c -index 9264b68..b4b987d 100644 ---- a/block/stream.c -+++ b/block/stream.c -@@ -97,9 +97,9 @@ out: - g_free(data); - } - --static void coroutine_fn stream_run(void *opaque) -+static int coroutine_fn stream_run(Job *job, Error **errp) - { -- StreamBlockJob *s = opaque; -+ StreamBlockJob *s = container_of(job, StreamBlockJob, common.job); - StreamCompleteData *data; - BlockBackend *blk = s->common.blk; - BlockDriverState *bs = blk_bs(blk); -@@ -206,6 +206,7 @@ out: - data = g_malloc(sizeof(*data)); - data->ret = ret; - job_defer_to_main_loop(&s->common.job, stream_complete, data); -+ return ret; - } - - static const BlockJobDriver stream_job_driver = { -@@ -213,7 +214,7 @@ static const BlockJobDriver stream_job_driver = { - .instance_size = sizeof(StreamBlockJob), - .job_type = JOB_TYPE_STREAM, - .free = block_job_free, -- .start = stream_run, -+ .run = stream_run, - .user_resume = block_job_user_resume, - .drain = block_job_drain, - }, -diff --git a/include/qemu/job.h b/include/qemu/job.h -index 18c9223..9cf463d 100644 ---- a/include/qemu/job.h -+++ b/include/qemu/job.h -@@ -169,7 +169,7 @@ struct JobDriver { - JobType job_type; - - /** Mandatory: Entrypoint for the Coroutine. */ -- CoroutineEntry *start; -+ int coroutine_fn (*run)(Job *job, Error **errp); - - /** - * If the callback is not NULL, it will be invoked when the job transitions -diff --git a/job.c b/job.c -index fa671b4..898260b 100644 ---- a/job.c -+++ b/job.c -@@ -544,16 +544,16 @@ static void coroutine_fn job_co_entry(void *opaque) - { - Job *job = opaque; - -- assert(job && job->driver && job->driver->start); -+ assert(job && job->driver && job->driver->run); - job_pause_point(job); -- job->driver->start(job); -+ job->ret = job->driver->run(job, NULL); - } - - - void job_start(Job *job) - { - assert(job && !job_started(job) && job->paused && -- job->driver && job->driver->start); -+ job->driver && job->driver->run); - job->co = qemu_coroutine_create(job_co_entry, job); - job->pause_count--; - job->busy = true; -diff --git a/tests/test-bdrv-drain.c b/tests/test-bdrv-drain.c -index 17bb850..a753386 100644 ---- a/tests/test-bdrv-drain.c -+++ b/tests/test-bdrv-drain.c -@@ -757,9 +757,9 @@ static void test_job_completed(Job *job, void *opaque) - job_completed(job, 0, NULL); - } - --static void coroutine_fn test_job_start(void *opaque) -+static int coroutine_fn test_job_run(Job *job, Error **errp) - { -- TestBlockJob *s = opaque; -+ TestBlockJob *s = container_of(job, TestBlockJob, common.job); - - job_transition_to_ready(&s->common.job); - while (!s->should_complete) { -@@ -771,6 +771,7 @@ static void coroutine_fn test_job_start(void *opaque) - } - - job_defer_to_main_loop(&s->common.job, test_job_completed, NULL); -+ return 0; - } - - static void test_job_complete(Job *job, Error **errp) -@@ -785,7 +786,7 @@ BlockJobDriver test_job_driver = { - .free = block_job_free, - .user_resume = block_job_user_resume, - .drain = block_job_drain, -- .start = test_job_start, -+ .run = test_job_run, - .complete = test_job_complete, - }, - }; -diff --git a/tests/test-blockjob-txn.c b/tests/test-blockjob-txn.c -index 58d9b87..3194924 100644 ---- a/tests/test-blockjob-txn.c -+++ b/tests/test-blockjob-txn.c -@@ -38,25 +38,25 @@ static void test_block_job_complete(Job *job, void *opaque) - bdrv_unref(bs); - } - --static void coroutine_fn test_block_job_run(void *opaque) -+static int coroutine_fn test_block_job_run(Job *job, Error **errp) - { -- TestBlockJob *s = opaque; -- BlockJob *job = &s->common; -+ TestBlockJob *s = container_of(job, TestBlockJob, common.job); - - while (s->iterations--) { - if (s->use_timer) { -- job_sleep_ns(&job->job, 0); -+ job_sleep_ns(job, 0); - } else { -- job_yield(&job->job); -+ job_yield(job); - } - -- if (job_is_cancelled(&job->job)) { -+ if (job_is_cancelled(job)) { - break; - } - } - -- job_defer_to_main_loop(&job->job, test_block_job_complete, -+ job_defer_to_main_loop(job, test_block_job_complete, - (void *)(intptr_t)s->rc); -+ return s->rc; - } - - typedef struct { -@@ -80,7 +80,7 @@ static const BlockJobDriver test_block_job_driver = { - .free = block_job_free, - .user_resume = block_job_user_resume, - .drain = block_job_drain, -- .start = test_block_job_run, -+ .run = test_block_job_run, - }, - }; - -diff --git a/tests/test-blockjob.c b/tests/test-blockjob.c -index cb42f06..b0462bf 100644 ---- a/tests/test-blockjob.c -+++ b/tests/test-blockjob.c -@@ -176,9 +176,9 @@ static void cancel_job_complete(Job *job, Error **errp) - s->should_complete = true; - } - --static void coroutine_fn cancel_job_start(void *opaque) -+static int coroutine_fn cancel_job_run(Job *job, Error **errp) - { -- CancelJob *s = opaque; -+ CancelJob *s = container_of(job, CancelJob, common.job); - - while (!s->should_complete) { - if (job_is_cancelled(&s->common.job)) { -@@ -194,6 +194,7 @@ static void coroutine_fn cancel_job_start(void *opaque) - - defer: - job_defer_to_main_loop(&s->common.job, cancel_job_completed, s); -+ return 0; - } - - static const BlockJobDriver test_cancel_driver = { -@@ -202,7 +203,7 @@ static const BlockJobDriver test_cancel_driver = { - .free = block_job_free, - .user_resume = block_job_user_resume, - .drain = block_job_drain, -- .start = cancel_job_start, -+ .run = cancel_job_run, - .complete = cancel_job_complete, - }, - }; --- -1.8.3.1 - diff --git a/0030-jobs-canonize-Error-object.patch b/0030-jobs-canonize-Error-object.patch deleted file mode 100644 index 92dc0b8..0000000 --- a/0030-jobs-canonize-Error-object.patch +++ /dev/null @@ -1,283 +0,0 @@ -From df9702d737eea1720a10d350c24bdcc3f54bcba9 Mon Sep 17 00:00:00 2001 -From: John Snow -Date: Wed, 29 Aug 2018 21:57:27 -0400 -Subject: jobs: canonize Error object - -RH-Author: John Snow -Message-id: <20180925223431.24791-3-jsnow@redhat.com> -Patchwork-id: 82262 -O-Subject: [RHEL8/rhel qemu-kvm PATCH 02/25] jobs: canonize Error object -Bugzilla: 1632939 -RH-Acked-by: Jeffrey Cody -RH-Acked-by: Max Reitz -RH-Acked-by: Kevin Wolf - -Jobs presently use both an Error object in the case of the create job, -and char strings in the case of generic errors elsewhere. - -Unify the two paths as just j->err, and remove the extra argument from -job_completed. The integer error code for job_completed is kept for now, -to be removed shortly in a separate patch. - -Signed-off-by: John Snow -Message-id: 20180830015734.19765-3-jsnow@redhat.com -[mreitz: Dropped a superfluous g_strdup()] -Reviewed-by: Eric Blake -Signed-off-by: Max Reitz -(cherry picked from commit 3d1f8b07a4c241f81949eff507d9f3a8fd73b87b) -Signed-off-by: John Snow ---- - block/backup.c | 2 +- - block/commit.c | 2 +- - block/create.c | 5 ++--- - block/mirror.c | 2 +- - block/stream.c | 2 +- - include/qemu/job.h | 14 ++++++++------ - job-qmp.c | 5 +++-- - job.c | 18 ++++++------------ - tests/test-bdrv-drain.c | 2 +- - tests/test-blockjob-txn.c | 2 +- - tests/test-blockjob.c | 2 +- - 11 files changed, 26 insertions(+), 30 deletions(-) - -diff --git a/block/backup.c b/block/backup.c -index 5d47781..1e965d5 100644 ---- a/block/backup.c -+++ b/block/backup.c -@@ -388,7 +388,7 @@ static void backup_complete(Job *job, void *opaque) - { - BackupCompleteData *data = opaque; - -- job_completed(job, data->ret, NULL); -+ job_completed(job, data->ret); - g_free(data); - } - -diff --git a/block/commit.c b/block/commit.c -index 905a1c5..af7579d 100644 ---- a/block/commit.c -+++ b/block/commit.c -@@ -117,7 +117,7 @@ static void commit_complete(Job *job, void *opaque) - * bdrv_set_backing_hd() to fail. */ - block_job_remove_all_bdrv(bjob); - -- job_completed(job, ret, NULL); -+ job_completed(job, ret); - g_free(data); - - /* If bdrv_drop_intermediate() didn't already do that, remove the commit -diff --git a/block/create.c b/block/create.c -index 04733c3..26a385c 100644 ---- a/block/create.c -+++ b/block/create.c -@@ -35,14 +35,13 @@ typedef struct BlockdevCreateJob { - BlockDriver *drv; - BlockdevCreateOptions *opts; - int ret; -- Error *err; - } BlockdevCreateJob; - - static void blockdev_create_complete(Job *job, void *opaque) - { - BlockdevCreateJob *s = container_of(job, BlockdevCreateJob, common); - -- job_completed(job, s->ret, s->err); -+ job_completed(job, s->ret); - } - - static int coroutine_fn blockdev_create_run(Job *job, Error **errp) -@@ -50,7 +49,7 @@ static int coroutine_fn blockdev_create_run(Job *job, Error **errp) - BlockdevCreateJob *s = container_of(job, BlockdevCreateJob, common); - - job_progress_set_remaining(&s->common, 1); -- s->ret = s->drv->bdrv_co_create(s->opts, &s->err); -+ s->ret = s->drv->bdrv_co_create(s->opts, errp); - job_progress_update(&s->common, 1); - - qapi_free_BlockdevCreateOptions(s->opts); -diff --git a/block/mirror.c b/block/mirror.c -index b3363e9..6637f2b 100644 ---- a/block/mirror.c -+++ b/block/mirror.c -@@ -710,7 +710,7 @@ static void mirror_exit(Job *job, void *opaque) - blk_insert_bs(bjob->blk, mirror_top_bs, &error_abort); - - bs_opaque->job = NULL; -- job_completed(job, data->ret, NULL); -+ job_completed(job, data->ret); - - g_free(data); - bdrv_drained_end(src); -diff --git a/block/stream.c b/block/stream.c -index b4b987d..26a7753 100644 ---- a/block/stream.c -+++ b/block/stream.c -@@ -93,7 +93,7 @@ out: - } - - g_free(s->backing_file_str); -- job_completed(job, data->ret, NULL); -+ job_completed(job, data->ret); - g_free(data); - } - -diff --git a/include/qemu/job.h b/include/qemu/job.h -index 9cf463d..e0e9987 100644 ---- a/include/qemu/job.h -+++ b/include/qemu/job.h -@@ -124,12 +124,16 @@ typedef struct Job { - /** Estimated progress_current value at the completion of the job */ - int64_t progress_total; - -- /** Error string for a failed job (NULL if, and only if, job->ret == 0) */ -- char *error; -- - /** ret code passed to job_completed. */ - int ret; - -+ /** -+ * Error object for a failed job. -+ * If job->ret is nonzero and an error object was not set, it will be set -+ * to strerror(-job->ret) during job_completed. -+ */ -+ Error *err; -+ - /** The completion function that will be called when the job completes. */ - BlockCompletionFunc *cb; - -@@ -484,15 +488,13 @@ void job_transition_to_ready(Job *job); - /** - * @job: The job being completed. - * @ret: The status code. -- * @error: The error message for a failing job (only with @ret < 0). If @ret is -- * negative, but NULL is given for @error, strerror() is used. - * - * Marks @job as completed. If @ret is non-zero, the job transaction it is part - * of is aborted. If @ret is zero, the job moves into the WAITING state. If it - * is the last job to complete in its transaction, all jobs in the transaction - * move from WAITING to PENDING. - */ --void job_completed(Job *job, int ret, Error *error); -+void job_completed(Job *job, int ret); - - /** Asynchronously complete the specified @job. */ - void job_complete(Job *job, Error **errp); -diff --git a/job-qmp.c b/job-qmp.c -index 410775d..a969b2b 100644 ---- a/job-qmp.c -+++ b/job-qmp.c -@@ -146,8 +146,9 @@ static JobInfo *job_query_single(Job *job, Error **errp) - .status = job->status, - .current_progress = job->progress_current, - .total_progress = job->progress_total, -- .has_error = !!job->error, -- .error = g_strdup(job->error), -+ .has_error = !!job->err, -+ .error = job->err ? \ -+ g_strdup(error_get_pretty(job->err)) : NULL, - }; - - return info; -diff --git a/job.c b/job.c -index 898260b..276024a 100644 ---- a/job.c -+++ b/job.c -@@ -369,7 +369,7 @@ void job_unref(Job *job) - - QLIST_REMOVE(job, job_list); - -- g_free(job->error); -+ error_free(job->err); - g_free(job->id); - g_free(job); - } -@@ -546,7 +546,7 @@ static void coroutine_fn job_co_entry(void *opaque) - - assert(job && job->driver && job->driver->run); - job_pause_point(job); -- job->ret = job->driver->run(job, NULL); -+ job->ret = job->driver->run(job, &job->err); - } - - -@@ -666,8 +666,8 @@ static void job_update_rc(Job *job) - job->ret = -ECANCELED; - } - if (job->ret) { -- if (!job->error) { -- job->error = g_strdup(strerror(-job->ret)); -+ if (!job->err) { -+ error_setg(&job->err, "%s", strerror(-job->ret)); - } - job_state_transition(job, JOB_STATUS_ABORTING); - } -@@ -865,17 +865,11 @@ static void job_completed_txn_success(Job *job) - } - } - --void job_completed(Job *job, int ret, Error *error) -+void job_completed(Job *job, int ret) - { - assert(job && job->txn && !job_is_completed(job)); - - job->ret = ret; -- if (error) { -- assert(job->ret < 0); -- job->error = g_strdup(error_get_pretty(error)); -- error_free(error); -- } -- - job_update_rc(job); - trace_job_completed(job, ret, job->ret); - if (job->ret) { -@@ -893,7 +887,7 @@ void job_cancel(Job *job, bool force) - } - job_cancel_async(job, force); - if (!job_started(job)) { -- job_completed(job, -ECANCELED, NULL); -+ job_completed(job, -ECANCELED); - } else if (job->deferred_to_main_loop) { - job_completed_txn_abort(job); - } else { -diff --git a/tests/test-bdrv-drain.c b/tests/test-bdrv-drain.c -index a753386..00604df 100644 ---- a/tests/test-bdrv-drain.c -+++ b/tests/test-bdrv-drain.c -@@ -754,7 +754,7 @@ typedef struct TestBlockJob { - - static void test_job_completed(Job *job, void *opaque) - { -- job_completed(job, 0, NULL); -+ job_completed(job, 0); - } - - static int coroutine_fn test_job_run(Job *job, Error **errp) -diff --git a/tests/test-blockjob-txn.c b/tests/test-blockjob-txn.c -index 3194924..82cedee 100644 ---- a/tests/test-blockjob-txn.c -+++ b/tests/test-blockjob-txn.c -@@ -34,7 +34,7 @@ static void test_block_job_complete(Job *job, void *opaque) - rc = -ECANCELED; - } - -- job_completed(job, rc, NULL); -+ job_completed(job, rc); - bdrv_unref(bs); - } - -diff --git a/tests/test-blockjob.c b/tests/test-blockjob.c -index b0462bf..408a226 100644 ---- a/tests/test-blockjob.c -+++ b/tests/test-blockjob.c -@@ -167,7 +167,7 @@ static void cancel_job_completed(Job *job, void *opaque) - { - CancelJob *s = opaque; - s->completed = true; -- job_completed(job, 0, NULL); -+ job_completed(job, 0); - } - - static void cancel_job_complete(Job *job, Error **errp) --- -1.8.3.1 - diff --git a/0031-jobs-add-exit-shim.patch b/0031-jobs-add-exit-shim.patch deleted file mode 100644 index 2a0ccb0..0000000 --- a/0031-jobs-add-exit-shim.patch +++ /dev/null @@ -1,108 +0,0 @@ -From 17511eb281e005da6e617acd12c81a0a1fa1771d Mon Sep 17 00:00:00 2001 -From: John Snow -Date: Tue, 25 Sep 2018 22:34:09 +0100 -Subject: jobs: add exit shim - -RH-Author: John Snow -Message-id: <20180925223431.24791-4-jsnow@redhat.com> -Patchwork-id: 82273 -O-Subject: [RHEL8/rhel qemu-kvm PATCH 03/25] jobs: add exit shim -Bugzilla: 1632939 -RH-Acked-by: Jeffrey Cody -RH-Acked-by: Max Reitz -RH-Acked-by: Kevin Wolf - -All jobs do the same thing when they leave their running loop: -- Store the return code in a structure -- wait to receive this structure in the main thread -- signal job completion via job_completed - -Few jobs do anything beyond exactly this. Consolidate this exit -logic for a net reduction in SLOC. - -More seriously, when we utilize job_defer_to_main_loop_bh to call -a function that calls job_completed, job_finalize_single will run -in a context where it has recursively taken the aio_context lock, -which can cause hangs if it puts down a reference that causes a flush. - -You can observe this in practice by looking at mirror_exit's careful -placement of job_completed and bdrv_unref calls. - -If we centralize job exiting, we can signal job completion from outside -of the aio_context, which should allow for job cleanup code to run with -only one lock, which makes cleanup callbacks less tricky to write. - -Signed-off-by: John Snow -Reviewed-by: Max Reitz -Message-id: 20180830015734.19765-4-jsnow@redhat.com -Reviewed-by: Jeff Cody -Signed-off-by: Max Reitz -(cherry picked from commit 00359a71d45a414ee47d8e423104dc0afd24ec65) -Signed-off-by: John Snow -Signed-off-by: Danilo C. L. de Paula ---- - include/qemu/job.h | 11 +++++++++++ - job.c | 18 ++++++++++++++++++ - 2 files changed, 29 insertions(+) - -diff --git a/include/qemu/job.h b/include/qemu/job.h -index e0e9987..1144d67 100644 ---- a/include/qemu/job.h -+++ b/include/qemu/job.h -@@ -209,6 +209,17 @@ struct JobDriver { - void (*drain)(Job *job); - - /** -+ * If the callback is not NULL, exit will be invoked from the main thread -+ * when the job's coroutine has finished, but before transactional -+ * convergence; before @prepare or @abort. -+ * -+ * FIXME TODO: This callback is only temporary to transition remaining jobs -+ * to prepare/commit/abort/clean callbacks and will be removed before 3.1. -+ * is released. -+ */ -+ void (*exit)(Job *job); -+ -+ /** - * If the callback is not NULL, prepare will be invoked when all the jobs - * belonging to the same transaction complete; or upon this job's completion - * if it is not in a transaction. -diff --git a/job.c b/job.c -index 276024a..abe91af 100644 ---- a/job.c -+++ b/job.c -@@ -535,6 +535,18 @@ void job_drain(Job *job) - } - } - -+static void job_exit(void *opaque) -+{ -+ Job *job = (Job *)opaque; -+ AioContext *aio_context = job->aio_context; -+ -+ if (job->driver->exit) { -+ aio_context_acquire(aio_context); -+ job->driver->exit(job); -+ aio_context_release(aio_context); -+ } -+ job_completed(job, job->ret); -+} - - /** - * All jobs must allow a pause point before entering their job proper. This -@@ -547,6 +559,12 @@ static void coroutine_fn job_co_entry(void *opaque) - assert(job && job->driver && job->driver->run); - job_pause_point(job); - job->ret = job->driver->run(job, &job->err); -+ if (!job->deferred_to_main_loop) { -+ job->deferred_to_main_loop = true; -+ aio_bh_schedule_oneshot(qemu_get_aio_context(), -+ job_exit, -+ job); -+ } - } - - --- -1.8.3.1 - diff --git a/0032-block-commit-utilize-job_exit-shim.patch b/0032-block-commit-utilize-job_exit-shim.patch deleted file mode 100644 index 3994481..0000000 --- a/0032-block-commit-utilize-job_exit-shim.patch +++ /dev/null @@ -1,115 +0,0 @@ -From 912e8eaa87f8dab40466cf0d45c3290d02e6a9d5 Mon Sep 17 00:00:00 2001 -From: John Snow -Date: Tue, 25 Sep 2018 22:34:10 +0100 -Subject: block/commit: utilize job_exit shim - -RH-Author: John Snow -Message-id: <20180925223431.24791-5-jsnow@redhat.com> -Patchwork-id: 82265 -O-Subject: [RHEL8/rhel qemu-kvm PATCH 04/25] block/commit: utilize job_exit shim -Bugzilla: 1632939 -RH-Acked-by: Jeffrey Cody -RH-Acked-by: Max Reitz -RH-Acked-by: Kevin Wolf - -Change the manual deferment to commit_complete into the implicit -callback to job_exit, renaming commit_complete to commit_exit. - -This conversion does change the timing of when job_completed is -called to after the bdrv_replace_node and bdrv_unref calls, which -could have implications for bjob->blk which will now be put down -after this cleanup. - -Kevin highlights that we did not take any permissions for that backend -at job creation time, so it is safe to reorder these operations. - -Signed-off-by: John Snow -Reviewed-by: Max Reitz -Message-id: 20180830015734.19765-5-jsnow@redhat.com -Reviewed-by: Jeff Cody -Signed-off-by: Max Reitz -(cherry picked from commit f369b48dc4095861223f9bc4329935599e03b1c5) -Signed-off-by: John Snow -Signed-off-by: Danilo C. L. de Paula ---- - block/commit.c | 22 +++++----------------- - 1 file changed, 5 insertions(+), 17 deletions(-) - -diff --git a/block/commit.c b/block/commit.c -index af7579d..25b3cb8 100644 ---- a/block/commit.c -+++ b/block/commit.c -@@ -68,19 +68,13 @@ static int coroutine_fn commit_populate(BlockBackend *bs, BlockBackend *base, - return 0; - } - --typedef struct { -- int ret; --} CommitCompleteData; -- --static void commit_complete(Job *job, void *opaque) -+static void commit_exit(Job *job) - { - CommitBlockJob *s = container_of(job, CommitBlockJob, common.job); - BlockJob *bjob = &s->common; -- CommitCompleteData *data = opaque; - BlockDriverState *top = blk_bs(s->top); - BlockDriverState *base = blk_bs(s->base); - BlockDriverState *commit_top_bs = s->commit_top_bs; -- int ret = data->ret; - bool remove_commit_top_bs = false; - - /* Make sure commit_top_bs and top stay around until bdrv_replace_node() */ -@@ -91,10 +85,10 @@ static void commit_complete(Job *job, void *opaque) - * the normal backing chain can be restored. */ - blk_unref(s->base); - -- if (!job_is_cancelled(job) && ret == 0) { -+ if (!job_is_cancelled(job) && job->ret == 0) { - /* success */ -- ret = bdrv_drop_intermediate(s->commit_top_bs, base, -- s->backing_file_str); -+ job->ret = bdrv_drop_intermediate(s->commit_top_bs, base, -+ s->backing_file_str); - } else { - /* XXX Can (or should) we somehow keep 'consistent read' blocked even - * after the failed/cancelled commit job is gone? If we already wrote -@@ -117,9 +111,6 @@ static void commit_complete(Job *job, void *opaque) - * bdrv_set_backing_hd() to fail. */ - block_job_remove_all_bdrv(bjob); - -- job_completed(job, ret); -- g_free(data); -- - /* If bdrv_drop_intermediate() didn't already do that, remove the commit - * filter driver from the backing chain. Do this as the final step so that - * the 'consistent read' permission can be granted. */ -@@ -137,7 +128,6 @@ static void commit_complete(Job *job, void *opaque) - static int coroutine_fn commit_run(Job *job, Error **errp) - { - CommitBlockJob *s = container_of(job, CommitBlockJob, common.job); -- CommitCompleteData *data; - int64_t offset; - uint64_t delay_ns = 0; - int ret = 0; -@@ -210,9 +200,6 @@ static int coroutine_fn commit_run(Job *job, Error **errp) - out: - qemu_vfree(buf); - -- data = g_malloc(sizeof(*data)); -- data->ret = ret; -- job_defer_to_main_loop(&s->common.job, commit_complete, data); - return ret; - } - -@@ -224,6 +211,7 @@ static const BlockJobDriver commit_job_driver = { - .user_resume = block_job_user_resume, - .drain = block_job_drain, - .run = commit_run, -+ .exit = commit_exit, - }, - }; - --- -1.8.3.1 - diff --git a/0033-block-mirror-utilize-job_exit-shim.patch b/0033-block-mirror-utilize-job_exit-shim.patch deleted file mode 100644 index 65eb25a..0000000 --- a/0033-block-mirror-utilize-job_exit-shim.patch +++ /dev/null @@ -1,152 +0,0 @@ -From 2322917770da98e175e7ae8bf0bb1a624ec3cebc Mon Sep 17 00:00:00 2001 -From: John Snow -Date: Wed, 29 Aug 2018 21:57:30 -0400 -Subject: block/mirror: utilize job_exit shim - -RH-Author: John Snow -Message-id: <20180925223431.24791-6-jsnow@redhat.com> -Patchwork-id: 82269 -O-Subject: [RHEL8/rhel qemu-kvm PATCH 05/25] block/mirror: utilize job_exit -Bugzilla: 1632939 -RH-Acked-by: Jeffrey Cody -RH-Acked-by: Max Reitz -RH-Acked-by: Kevin Wolf - -Change the manual deferment to mirror_exit into the implicit -callback to job_exit and the mirror_exit callback. - -This does change the order of some bdrv_unref calls and job_completed, -but thanks to the new context in which we call .exit, this is safe to -defer the possible flushing of any nodes to the job_finalize_single -cleanup stage. - -Signed-off-by: John Snow -Message-id: 20180830015734.19765-6-jsnow@redhat.com -Reviewed-by: Max Reitz -Reviewed-by: Jeff Cody -Signed-off-by: Max Reitz -(cherry picked from commit 7b508f6b7a38a8d9729772fa6e525da883fb120b) -Signed-off-by: John Snow ---- - block/mirror.c | 29 +++++++++++------------------ - 1 file changed, 11 insertions(+), 18 deletions(-) - -diff --git a/block/mirror.c b/block/mirror.c -index 6637f2b..4a9558d 100644 ---- a/block/mirror.c -+++ b/block/mirror.c -@@ -607,26 +607,22 @@ static void mirror_wait_for_all_io(MirrorBlockJob *s) - } - } - --typedef struct { -- int ret; --} MirrorExitData; -- --static void mirror_exit(Job *job, void *opaque) -+static void mirror_exit(Job *job) - { - MirrorBlockJob *s = container_of(job, MirrorBlockJob, common.job); - BlockJob *bjob = &s->common; -- MirrorExitData *data = opaque; - MirrorBDSOpaque *bs_opaque = s->mirror_top_bs->opaque; - AioContext *replace_aio_context = NULL; - BlockDriverState *src = s->mirror_top_bs->backing->bs; - BlockDriverState *target_bs = blk_bs(s->target); - BlockDriverState *mirror_top_bs = s->mirror_top_bs; - Error *local_err = NULL; -+ int ret = job->ret; - - bdrv_release_dirty_bitmap(src, s->dirty_bitmap); - -- /* Make sure that the source BDS doesn't go away before we called -- * job_completed(). */ -+ /* Make sure that the source BDS doesn't go away during bdrv_replace_node, -+ * before we can call bdrv_drained_end */ - bdrv_ref(src); - bdrv_ref(mirror_top_bs); - bdrv_ref(target_bs); -@@ -652,7 +648,7 @@ static void mirror_exit(Job *job, void *opaque) - bdrv_set_backing_hd(target_bs, backing, &local_err); - if (local_err) { - error_report_err(local_err); -- data->ret = -EPERM; -+ ret = -EPERM; - } - } - } -@@ -662,7 +658,7 @@ static void mirror_exit(Job *job, void *opaque) - aio_context_acquire(replace_aio_context); - } - -- if (s->should_complete && data->ret == 0) { -+ if (s->should_complete && ret == 0) { - BlockDriverState *to_replace = src; - if (s->to_replace) { - to_replace = s->to_replace; -@@ -679,7 +675,7 @@ static void mirror_exit(Job *job, void *opaque) - bdrv_drained_end(target_bs); - if (local_err) { - error_report_err(local_err); -- data->ret = -EPERM; -+ ret = -EPERM; - } - } - if (s->to_replace) { -@@ -710,12 +706,12 @@ static void mirror_exit(Job *job, void *opaque) - blk_insert_bs(bjob->blk, mirror_top_bs, &error_abort); - - bs_opaque->job = NULL; -- job_completed(job, data->ret); - -- g_free(data); - bdrv_drained_end(src); - bdrv_unref(mirror_top_bs); - bdrv_unref(src); -+ -+ job->ret = ret; - } - - static void mirror_throttle(MirrorBlockJob *s) -@@ -815,7 +811,6 @@ static int mirror_flush(MirrorBlockJob *s) - static int coroutine_fn mirror_run(Job *job, Error **errp) - { - MirrorBlockJob *s = container_of(job, MirrorBlockJob, common.job); -- MirrorExitData *data; - BlockDriverState *bs = s->mirror_top_bs->backing->bs; - BlockDriverState *target_bs = blk_bs(s->target); - bool need_drain = true; -@@ -1035,14 +1030,10 @@ immediate_exit: - g_free(s->in_flight_bitmap); - bdrv_dirty_iter_free(s->dbi); - -- data = g_malloc(sizeof(*data)); -- data->ret = ret; -- - if (need_drain) { - bdrv_drained_begin(bs); - } - -- job_defer_to_main_loop(&s->common.job, mirror_exit, data); - return ret; - } - -@@ -1141,6 +1132,7 @@ static const BlockJobDriver mirror_job_driver = { - .user_resume = block_job_user_resume, - .drain = block_job_drain, - .run = mirror_run, -+ .exit = mirror_exit, - .pause = mirror_pause, - .complete = mirror_complete, - }, -@@ -1157,6 +1149,7 @@ static const BlockJobDriver commit_active_job_driver = { - .user_resume = block_job_user_resume, - .drain = block_job_drain, - .run = mirror_run, -+ .exit = mirror_exit, - .pause = mirror_pause, - .complete = mirror_complete, - }, --- -1.8.3.1 - diff --git a/0034-jobs-utilize-job_exit-shim.patch b/0034-jobs-utilize-job_exit-shim.patch deleted file mode 100644 index 8b765d8..0000000 --- a/0034-jobs-utilize-job_exit-shim.patch +++ /dev/null @@ -1,307 +0,0 @@ -From 83d2840eeadd8a55b796eae5454783d42913963c Mon Sep 17 00:00:00 2001 -From: John Snow -Date: Tue, 25 Sep 2018 22:34:12 +0100 -Subject: jobs: utilize job_exit shim - -RH-Author: John Snow -Message-id: <20180925223431.24791-7-jsnow@redhat.com> -Patchwork-id: 82267 -O-Subject: [RHEL8/rhel qemu-kvm PATCH 06/25] jobs: utilize job_exit shim -Bugzilla: 1632939 -RH-Acked-by: Jeffrey Cody -RH-Acked-by: Max Reitz -RH-Acked-by: Kevin Wolf - -Utilize the job_exit shim by not calling job_defer_to_main_loop, and -where applicable, converting the deferred callback into the job_exit -callback. - -This converts backup, stream, create, and the unit tests all at once. -Most of these jobs do not see any changes to the order in which they -clean up their resources, except the test-blockjob-txn test, which -now puts down its bs before job_completed is called. - -This is safe for the same reason the reordering in the mirror job is -safe, because job_completed no longer runs under two locks, making -the unref safe even if it causes a flush. - -Signed-off-by: John Snow -Reviewed-by: Max Reitz -Message-id: 20180830015734.19765-7-jsnow@redhat.com -Signed-off-by: Max Reitz -(cherry picked from commit eb23654dbe43b549ea2a9ebff9d8edf544d34a73) -Signed-off-by: John Snow -Signed-off-by: Danilo C. L. de Paula ---- - block/backup.c | 16 ---------------- - block/create.c | 14 +++----------- - block/stream.c | 22 +++++++--------------- - tests/test-bdrv-drain.c | 6 ------ - tests/test-blockjob-txn.c | 11 ++--------- - tests/test-blockjob.c | 10 ++++------ - 6 files changed, 16 insertions(+), 63 deletions(-) - -diff --git a/block/backup.c b/block/backup.c -index 1e965d5..a67b7fa 100644 ---- a/block/backup.c -+++ b/block/backup.c -@@ -380,18 +380,6 @@ static BlockErrorAction backup_error_action(BackupBlockJob *job, - } - } - --typedef struct { -- int ret; --} BackupCompleteData; -- --static void backup_complete(Job *job, void *opaque) --{ -- BackupCompleteData *data = opaque; -- -- job_completed(job, data->ret); -- g_free(data); --} -- - static bool coroutine_fn yield_and_check(BackupBlockJob *job) - { - uint64_t delay_ns; -@@ -483,7 +471,6 @@ static void backup_incremental_init_copy_bitmap(BackupBlockJob *job) - static int coroutine_fn backup_run(Job *opaque_job, Error **errp) - { - BackupBlockJob *job = container_of(opaque_job, BackupBlockJob, common.job); -- BackupCompleteData *data; - BlockDriverState *bs = blk_bs(job->common.blk); - int64_t offset, nb_clusters; - int ret = 0; -@@ -584,9 +571,6 @@ static int coroutine_fn backup_run(Job *opaque_job, Error **errp) - qemu_co_rwlock_unlock(&job->flush_rwlock); - hbitmap_free(job->copy_bitmap); - -- data = g_malloc(sizeof(*data)); -- data->ret = ret; -- job_defer_to_main_loop(&job->common.job, backup_complete, data); - return ret; - } - -diff --git a/block/create.c b/block/create.c -index 26a385c..9534121 100644 ---- a/block/create.c -+++ b/block/create.c -@@ -34,28 +34,20 @@ typedef struct BlockdevCreateJob { - Job common; - BlockDriver *drv; - BlockdevCreateOptions *opts; -- int ret; - } BlockdevCreateJob; - --static void blockdev_create_complete(Job *job, void *opaque) --{ -- BlockdevCreateJob *s = container_of(job, BlockdevCreateJob, common); -- -- job_completed(job, s->ret); --} -- - static int coroutine_fn blockdev_create_run(Job *job, Error **errp) - { - BlockdevCreateJob *s = container_of(job, BlockdevCreateJob, common); -+ int ret; - - job_progress_set_remaining(&s->common, 1); -- s->ret = s->drv->bdrv_co_create(s->opts, errp); -+ ret = s->drv->bdrv_co_create(s->opts, errp); - job_progress_update(&s->common, 1); - - qapi_free_BlockdevCreateOptions(s->opts); -- job_defer_to_main_loop(&s->common, blockdev_create_complete, NULL); - -- return s->ret; -+ return ret; - } - - static const JobDriver blockdev_create_job_driver = { -diff --git a/block/stream.c b/block/stream.c -index 26a7753..67e1e72 100644 ---- a/block/stream.c -+++ b/block/stream.c -@@ -54,20 +54,16 @@ static int coroutine_fn stream_populate(BlockBackend *blk, - return blk_co_preadv(blk, offset, qiov.size, &qiov, BDRV_REQ_COPY_ON_READ); - } - --typedef struct { -- int ret; --} StreamCompleteData; -- --static void stream_complete(Job *job, void *opaque) -+static void stream_exit(Job *job) - { - StreamBlockJob *s = container_of(job, StreamBlockJob, common.job); - BlockJob *bjob = &s->common; -- StreamCompleteData *data = opaque; - BlockDriverState *bs = blk_bs(bjob->blk); - BlockDriverState *base = s->base; - Error *local_err = NULL; -+ int ret = job->ret; - -- if (!job_is_cancelled(job) && bs->backing && data->ret == 0) { -+ if (!job_is_cancelled(job) && bs->backing && ret == 0) { - const char *base_id = NULL, *base_fmt = NULL; - if (base) { - base_id = s->backing_file_str; -@@ -75,11 +71,11 @@ static void stream_complete(Job *job, void *opaque) - base_fmt = base->drv->format_name; - } - } -- data->ret = bdrv_change_backing_file(bs, base_id, base_fmt); -+ ret = bdrv_change_backing_file(bs, base_id, base_fmt); - bdrv_set_backing_hd(bs, base, &local_err); - if (local_err) { - error_report_err(local_err); -- data->ret = -EPERM; -+ ret = -EPERM; - goto out; - } - } -@@ -93,14 +89,12 @@ out: - } - - g_free(s->backing_file_str); -- job_completed(job, data->ret); -- g_free(data); -+ job->ret = ret; - } - - static int coroutine_fn stream_run(Job *job, Error **errp) - { - StreamBlockJob *s = container_of(job, StreamBlockJob, common.job); -- StreamCompleteData *data; - BlockBackend *blk = s->common.blk; - BlockDriverState *bs = blk_bs(blk); - BlockDriverState *base = s->base; -@@ -203,9 +197,6 @@ static int coroutine_fn stream_run(Job *job, Error **errp) - - out: - /* Modify backing chain and close BDSes in main loop */ -- data = g_malloc(sizeof(*data)); -- data->ret = ret; -- job_defer_to_main_loop(&s->common.job, stream_complete, data); - return ret; - } - -@@ -215,6 +206,7 @@ static const BlockJobDriver stream_job_driver = { - .job_type = JOB_TYPE_STREAM, - .free = block_job_free, - .run = stream_run, -+ .exit = stream_exit, - .user_resume = block_job_user_resume, - .drain = block_job_drain, - }, -diff --git a/tests/test-bdrv-drain.c b/tests/test-bdrv-drain.c -index 00604df..9bcb3c7 100644 ---- a/tests/test-bdrv-drain.c -+++ b/tests/test-bdrv-drain.c -@@ -752,11 +752,6 @@ typedef struct TestBlockJob { - bool should_complete; - } TestBlockJob; - --static void test_job_completed(Job *job, void *opaque) --{ -- job_completed(job, 0); --} -- - static int coroutine_fn test_job_run(Job *job, Error **errp) - { - TestBlockJob *s = container_of(job, TestBlockJob, common.job); -@@ -770,7 +765,6 @@ static int coroutine_fn test_job_run(Job *job, Error **errp) - job_pause_point(&s->common.job); - } - -- job_defer_to_main_loop(&s->common.job, test_job_completed, NULL); - return 0; - } - -diff --git a/tests/test-blockjob-txn.c b/tests/test-blockjob-txn.c -index 82cedee..ef29f35 100644 ---- a/tests/test-blockjob-txn.c -+++ b/tests/test-blockjob-txn.c -@@ -24,17 +24,11 @@ typedef struct { - int *result; - } TestBlockJob; - --static void test_block_job_complete(Job *job, void *opaque) -+static void test_block_job_exit(Job *job) - { - BlockJob *bjob = container_of(job, BlockJob, job); - BlockDriverState *bs = blk_bs(bjob->blk); -- int rc = (intptr_t)opaque; - -- if (job_is_cancelled(job)) { -- rc = -ECANCELED; -- } -- -- job_completed(job, rc); - bdrv_unref(bs); - } - -@@ -54,8 +48,6 @@ static int coroutine_fn test_block_job_run(Job *job, Error **errp) - } - } - -- job_defer_to_main_loop(job, test_block_job_complete, -- (void *)(intptr_t)s->rc); - return s->rc; - } - -@@ -81,6 +73,7 @@ static const BlockJobDriver test_block_job_driver = { - .user_resume = block_job_user_resume, - .drain = block_job_drain, - .run = test_block_job_run, -+ .exit = test_block_job_exit, - }, - }; - -diff --git a/tests/test-blockjob.c b/tests/test-blockjob.c -index 408a226..ad4a65b 100644 ---- a/tests/test-blockjob.c -+++ b/tests/test-blockjob.c -@@ -163,11 +163,10 @@ typedef struct CancelJob { - bool completed; - } CancelJob; - --static void cancel_job_completed(Job *job, void *opaque) -+static void cancel_job_exit(Job *job) - { -- CancelJob *s = opaque; -+ CancelJob *s = container_of(job, CancelJob, common.job); - s->completed = true; -- job_completed(job, 0); - } - - static void cancel_job_complete(Job *job, Error **errp) -@@ -182,7 +181,7 @@ static int coroutine_fn cancel_job_run(Job *job, Error **errp) - - while (!s->should_complete) { - if (job_is_cancelled(&s->common.job)) { -- goto defer; -+ return 0; - } - - if (!job_is_ready(&s->common.job) && s->should_converge) { -@@ -192,8 +191,6 @@ static int coroutine_fn cancel_job_run(Job *job, Error **errp) - job_sleep_ns(&s->common.job, 100000); - } - -- defer: -- job_defer_to_main_loop(&s->common.job, cancel_job_completed, s); - return 0; - } - -@@ -204,6 +201,7 @@ static const BlockJobDriver test_cancel_driver = { - .user_resume = block_job_user_resume, - .drain = block_job_drain, - .run = cancel_job_run, -+ .exit = cancel_job_exit, - .complete = cancel_job_complete, - }, - }; --- -1.8.3.1 - diff --git a/0035-block-backup-make-function-variables-consistently-na.patch b/0035-block-backup-make-function-variables-consistently-na.patch deleted file mode 100644 index ab0af70..0000000 --- a/0035-block-backup-make-function-variables-consistently-na.patch +++ /dev/null @@ -1,165 +0,0 @@ -From b5532575bb8aa748dc066834d7ac150bbb6575a7 Mon Sep 17 00:00:00 2001 -From: John Snow -Date: Tue, 25 Sep 2018 22:34:13 +0100 -Subject: block/backup: make function variables consistently named - -RH-Author: John Snow -Message-id: <20180925223431.24791-8-jsnow@redhat.com> -Patchwork-id: 82272 -O-Subject: [RHEL8/rhel qemu-kvm PATCH 07/25] block/backup: make function variables consistently named -Bugzilla: 1632939 -RH-Acked-by: Jeffrey Cody -RH-Acked-by: Max Reitz -RH-Acked-by: Kevin Wolf - -Rename opaque_job to job to be consistent with other job implementations. -Rename 'job', the BackupBlockJob object, to 's' to also be consistent. - -Suggested-by: Eric Blake -Signed-off-by: John Snow -Reviewed-by: Max Reitz -Message-id: 20180830015734.19765-8-jsnow@redhat.com -Signed-off-by: Max Reitz -(cherry picked from commit 6870277535493fea31761d8d11ec23add2de0fb0) -Signed-off-by: John Snow -Signed-off-by: Danilo C. L. de Paula ---- - block/backup.c | 62 +++++++++++++++++++++++++++++----------------------------- - 1 file changed, 31 insertions(+), 31 deletions(-) - -diff --git a/block/backup.c b/block/backup.c -index a67b7fa..4d084f6 100644 ---- a/block/backup.c -+++ b/block/backup.c -@@ -468,59 +468,59 @@ static void backup_incremental_init_copy_bitmap(BackupBlockJob *job) - bdrv_dirty_iter_free(dbi); - } - --static int coroutine_fn backup_run(Job *opaque_job, Error **errp) -+static int coroutine_fn backup_run(Job *job, Error **errp) - { -- BackupBlockJob *job = container_of(opaque_job, BackupBlockJob, common.job); -- BlockDriverState *bs = blk_bs(job->common.blk); -+ BackupBlockJob *s = container_of(job, BackupBlockJob, common.job); -+ BlockDriverState *bs = blk_bs(s->common.blk); - int64_t offset, nb_clusters; - int ret = 0; - -- QLIST_INIT(&job->inflight_reqs); -- qemu_co_rwlock_init(&job->flush_rwlock); -+ QLIST_INIT(&s->inflight_reqs); -+ qemu_co_rwlock_init(&s->flush_rwlock); - -- nb_clusters = DIV_ROUND_UP(job->len, job->cluster_size); -- job_progress_set_remaining(&job->common.job, job->len); -+ nb_clusters = DIV_ROUND_UP(s->len, s->cluster_size); -+ job_progress_set_remaining(job, s->len); - -- job->copy_bitmap = hbitmap_alloc(nb_clusters, 0); -- if (job->sync_mode == MIRROR_SYNC_MODE_INCREMENTAL) { -- backup_incremental_init_copy_bitmap(job); -+ s->copy_bitmap = hbitmap_alloc(nb_clusters, 0); -+ if (s->sync_mode == MIRROR_SYNC_MODE_INCREMENTAL) { -+ backup_incremental_init_copy_bitmap(s); - } else { -- hbitmap_set(job->copy_bitmap, 0, nb_clusters); -+ hbitmap_set(s->copy_bitmap, 0, nb_clusters); - } - - -- job->before_write.notify = backup_before_write_notify; -- bdrv_add_before_write_notifier(bs, &job->before_write); -+ s->before_write.notify = backup_before_write_notify; -+ bdrv_add_before_write_notifier(bs, &s->before_write); - -- if (job->sync_mode == MIRROR_SYNC_MODE_NONE) { -+ if (s->sync_mode == MIRROR_SYNC_MODE_NONE) { - /* All bits are set in copy_bitmap to allow any cluster to be copied. - * This does not actually require them to be copied. */ -- while (!job_is_cancelled(&job->common.job)) { -+ while (!job_is_cancelled(job)) { - /* Yield until the job is cancelled. We just let our before_write - * notify callback service CoW requests. */ -- job_yield(&job->common.job); -+ job_yield(job); - } -- } else if (job->sync_mode == MIRROR_SYNC_MODE_INCREMENTAL) { -- ret = backup_run_incremental(job); -+ } else if (s->sync_mode == MIRROR_SYNC_MODE_INCREMENTAL) { -+ ret = backup_run_incremental(s); - } else { - /* Both FULL and TOP SYNC_MODE's require copying.. */ -- for (offset = 0; offset < job->len; -- offset += job->cluster_size) { -+ for (offset = 0; offset < s->len; -+ offset += s->cluster_size) { - bool error_is_read; - int alloced = 0; - -- if (yield_and_check(job)) { -+ if (yield_and_check(s)) { - break; - } - -- if (job->sync_mode == MIRROR_SYNC_MODE_TOP) { -+ if (s->sync_mode == MIRROR_SYNC_MODE_TOP) { - int i; - int64_t n; - - /* Check to see if these blocks are already in the - * backing file. */ - -- for (i = 0; i < job->cluster_size;) { -+ for (i = 0; i < s->cluster_size;) { - /* bdrv_is_allocated() only returns true/false based - * on the first set of sectors it comes across that - * are are all in the same state. -@@ -529,7 +529,7 @@ static int coroutine_fn backup_run(Job *opaque_job, Error **errp) - * needed but at some point that is always the case. */ - alloced = - bdrv_is_allocated(bs, offset + i, -- job->cluster_size - i, &n); -+ s->cluster_size - i, &n); - i += n; - - if (alloced || n == 0) { -@@ -547,29 +547,29 @@ static int coroutine_fn backup_run(Job *opaque_job, Error **errp) - if (alloced < 0) { - ret = alloced; - } else { -- ret = backup_do_cow(job, offset, job->cluster_size, -+ ret = backup_do_cow(s, offset, s->cluster_size, - &error_is_read, false); - } - if (ret < 0) { - /* Depending on error action, fail now or retry cluster */ - BlockErrorAction action = -- backup_error_action(job, error_is_read, -ret); -+ backup_error_action(s, error_is_read, -ret); - if (action == BLOCK_ERROR_ACTION_REPORT) { - break; - } else { -- offset -= job->cluster_size; -+ offset -= s->cluster_size; - continue; - } - } - } - } - -- notifier_with_return_remove(&job->before_write); -+ notifier_with_return_remove(&s->before_write); - - /* wait until pending backup_do_cow() calls have completed */ -- qemu_co_rwlock_wrlock(&job->flush_rwlock); -- qemu_co_rwlock_unlock(&job->flush_rwlock); -- hbitmap_free(job->copy_bitmap); -+ qemu_co_rwlock_wrlock(&s->flush_rwlock); -+ qemu_co_rwlock_unlock(&s->flush_rwlock); -+ hbitmap_free(s->copy_bitmap); - - return ret; - } --- -1.8.3.1 - diff --git a/0036-jobs-remove-ret-argument-to-job_completed-privatize-.patch b/0036-jobs-remove-ret-argument-to-job_completed-privatize-.patch deleted file mode 100644 index 6d2791c..0000000 --- a/0036-jobs-remove-ret-argument-to-job_completed-privatize-.patch +++ /dev/null @@ -1,153 +0,0 @@ -From 7fe6d53387852907871d82997fbccc2cf774bdb4 Mon Sep 17 00:00:00 2001 -From: John Snow -Date: Tue, 25 Sep 2018 22:34:14 +0100 -Subject: jobs: remove ret argument to job_completed; privatize it - -RH-Author: John Snow -Message-id: <20180925223431.24791-9-jsnow@redhat.com> -Patchwork-id: 82271 -O-Subject: [RHEL8/rhel qemu-kvm PATCH 08/25] jobs: remove ret argument to job_completed; privatize it -Bugzilla: 1632939 -RH-Acked-by: Jeffrey Cody -RH-Acked-by: Max Reitz -RH-Acked-by: Kevin Wolf - -Jobs are now expected to return their retcode on the stack, from the -.run callback, so we can remove that argument. - -job_cancel does not need to set -ECANCELED because job_completed will -update the return code itself if the job was canceled. - -While we're here, make job_completed static to job.c and remove it from -job.h; move the documentation of return code to the .run() callback and -to the job->ret property, accordingly. - -Signed-off-by: John Snow -Message-id: 20180830015734.19765-9-jsnow@redhat.com -Reviewed-by: Max Reitz -Signed-off-by: Max Reitz -(cherry picked from commit 404ff28d6ae59fc1c24d631710d4063fc68aed03) -Signed-off-by: John Snow -Signed-off-by: Danilo C. L. de Paula ---- - include/qemu/job.h | 28 +++++++++++++++------------- - job.c | 11 ++++++----- - trace-events | 2 +- - 3 files changed, 22 insertions(+), 19 deletions(-) - -diff --git a/include/qemu/job.h b/include/qemu/job.h -index 1144d67..23395c1 100644 ---- a/include/qemu/job.h -+++ b/include/qemu/job.h -@@ -124,7 +124,11 @@ typedef struct Job { - /** Estimated progress_current value at the completion of the job */ - int64_t progress_total; - -- /** ret code passed to job_completed. */ -+ /** -+ * Return code from @run and/or @prepare callback(s). -+ * Not final until the job has reached the CONCLUDED status. -+ * 0 on success, -errno on failure. -+ */ - int ret; - - /** -@@ -172,7 +176,16 @@ struct JobDriver { - /** Enum describing the operation */ - JobType job_type; - -- /** Mandatory: Entrypoint for the Coroutine. */ -+ /** -+ * Mandatory: Entrypoint for the Coroutine. -+ * -+ * This callback will be invoked when moving from CREATED to RUNNING. -+ * -+ * If this callback returns nonzero, the job transaction it is part of is -+ * aborted. If it returns zero, the job moves into the WAITING state. If it -+ * is the last job to complete in its transaction, all jobs in the -+ * transaction move from WAITING to PENDING. -+ */ - int coroutine_fn (*run)(Job *job, Error **errp); - - /** -@@ -496,17 +509,6 @@ void job_early_fail(Job *job); - /** Moves the @job from RUNNING to READY */ - void job_transition_to_ready(Job *job); - --/** -- * @job: The job being completed. -- * @ret: The status code. -- * -- * Marks @job as completed. If @ret is non-zero, the job transaction it is part -- * of is aborted. If @ret is zero, the job moves into the WAITING state. If it -- * is the last job to complete in its transaction, all jobs in the transaction -- * move from WAITING to PENDING. -- */ --void job_completed(Job *job, int ret); -- - /** Asynchronously complete the specified @job. */ - void job_complete(Job *job, Error **errp); - -diff --git a/job.c b/job.c -index abe91af..61e091a 100644 ---- a/job.c -+++ b/job.c -@@ -535,6 +535,8 @@ void job_drain(Job *job) - } - } - -+static void job_completed(Job *job); -+ - static void job_exit(void *opaque) - { - Job *job = (Job *)opaque; -@@ -545,7 +547,7 @@ static void job_exit(void *opaque) - job->driver->exit(job); - aio_context_release(aio_context); - } -- job_completed(job, job->ret); -+ job_completed(job); - } - - /** -@@ -883,13 +885,12 @@ static void job_completed_txn_success(Job *job) - } - } - --void job_completed(Job *job, int ret) -+static void job_completed(Job *job) - { - assert(job && job->txn && !job_is_completed(job)); - -- job->ret = ret; - job_update_rc(job); -- trace_job_completed(job, ret, job->ret); -+ trace_job_completed(job, job->ret); - if (job->ret) { - job_completed_txn_abort(job); - } else { -@@ -905,7 +906,7 @@ void job_cancel(Job *job, bool force) - } - job_cancel_async(job, force); - if (!job_started(job)) { -- job_completed(job, -ECANCELED); -+ job_completed(job); - } else if (job->deferred_to_main_loop) { - job_completed_txn_abort(job); - } else { -diff --git a/trace-events b/trace-events -index c445f54..4fd2cb4 100644 ---- a/trace-events -+++ b/trace-events -@@ -107,7 +107,7 @@ gdbstub_err_checksum_incorrect(uint8_t expected, uint8_t got) "got command packe - # job.c - job_state_transition(void *job, int ret, const char *legal, const char *s0, const char *s1) "job %p (ret: %d) attempting %s transition (%s-->%s)" - job_apply_verb(void *job, const char *state, const char *verb, const char *legal) "job %p in state %s; applying verb %s (%s)" --job_completed(void *job, int ret, int jret) "job %p ret %d corrected ret %d" -+job_completed(void *job, int ret) "job %p ret %d" - - # job-qmp.c - qmp_job_cancel(void *job) "job %p" --- -1.8.3.1 - diff --git a/0037-jobs-remove-job_defer_to_main_loop.patch b/0037-jobs-remove-job_defer_to_main_loop.patch deleted file mode 100644 index 2b0fec4..0000000 --- a/0037-jobs-remove-job_defer_to_main_loop.patch +++ /dev/null @@ -1,119 +0,0 @@ -From 1827993a08cc8c86cc40ca9ccb7ef668261b2bc4 Mon Sep 17 00:00:00 2001 -From: John Snow -Date: Tue, 25 Sep 2018 22:34:15 +0100 -Subject: jobs: remove job_defer_to_main_loop - -RH-Author: John Snow -Message-id: <20180925223431.24791-10-jsnow@redhat.com> -Patchwork-id: 82275 -O-Subject: [RHEL8/rhel qemu-kvm PATCH 09/25] jobs: remove job_defer_to_main_loop -Bugzilla: 1632939 -RH-Acked-by: Jeffrey Cody -RH-Acked-by: Max Reitz -RH-Acked-by: Kevin Wolf - -Now that the job infrastructure is handling the job_completed call for -all implemented jobs, we can remove the interface that allowed jobs to -schedule their own completion. - -Signed-off-by: John Snow -Reviewed-by: Max Reitz -Message-id: 20180830015734.19765-10-jsnow@redhat.com -Signed-off-by: Max Reitz -(cherry picked from commit e21a1c9831fc80ae3f3c1affdfa43350035d8588) -Signed-off-by: John Snow -Signed-off-by: Danilo C. L. de Paula ---- - include/qemu/job.h | 17 ----------------- - job.c | 40 ++-------------------------------------- - 2 files changed, 2 insertions(+), 55 deletions(-) - -diff --git a/include/qemu/job.h b/include/qemu/job.h -index 23395c1..e0cff70 100644 ---- a/include/qemu/job.h -+++ b/include/qemu/job.h -@@ -568,23 +568,6 @@ void job_finalize(Job *job, Error **errp); - */ - void job_dismiss(Job **job, Error **errp); - --typedef void JobDeferToMainLoopFn(Job *job, void *opaque); -- --/** -- * @job: The job -- * @fn: The function to run in the main loop -- * @opaque: The opaque value that is passed to @fn -- * -- * This function must be called by the main job coroutine just before it -- * returns. @fn is executed in the main loop with the job AioContext acquired. -- * -- * Block jobs must call bdrv_unref(), bdrv_close(), and anything that uses -- * bdrv_drain_all() in the main loop. -- * -- * The @job AioContext is held while @fn executes. -- */ --void job_defer_to_main_loop(Job *job, JobDeferToMainLoopFn *fn, void *opaque); -- - /** - * Synchronously finishes the given @job. If @finish is given, it is called to - * trigger completion or cancellation of the job. -diff --git a/job.c b/job.c -index 61e091a..e8d7aee 100644 ---- a/job.c -+++ b/job.c -@@ -561,12 +561,8 @@ static void coroutine_fn job_co_entry(void *opaque) - assert(job && job->driver && job->driver->run); - job_pause_point(job); - job->ret = job->driver->run(job, &job->err); -- if (!job->deferred_to_main_loop) { -- job->deferred_to_main_loop = true; -- aio_bh_schedule_oneshot(qemu_get_aio_context(), -- job_exit, -- job); -- } -+ job->deferred_to_main_loop = true; -+ aio_bh_schedule_oneshot(qemu_get_aio_context(), job_exit, job); - } - - -@@ -969,38 +965,6 @@ void job_complete(Job *job, Error **errp) - job->driver->complete(job, errp); - } - -- --typedef struct { -- Job *job; -- JobDeferToMainLoopFn *fn; -- void *opaque; --} JobDeferToMainLoopData; -- --static void job_defer_to_main_loop_bh(void *opaque) --{ -- JobDeferToMainLoopData *data = opaque; -- Job *job = data->job; -- AioContext *aio_context = job->aio_context; -- -- aio_context_acquire(aio_context); -- data->fn(data->job, data->opaque); -- aio_context_release(aio_context); -- -- g_free(data); --} -- --void job_defer_to_main_loop(Job *job, JobDeferToMainLoopFn *fn, void *opaque) --{ -- JobDeferToMainLoopData *data = g_malloc(sizeof(*data)); -- data->job = job; -- data->fn = fn; -- data->opaque = opaque; -- job->deferred_to_main_loop = true; -- -- aio_bh_schedule_oneshot(qemu_get_aio_context(), -- job_defer_to_main_loop_bh, data); --} -- - int job_finish_sync(Job *job, void (*finish)(Job *, Error **errp), Error **errp) - { - Error *local_err = NULL; --- -1.8.3.1 - diff --git a/0038-block-commit-add-block-job-creation-flags.patch b/0038-block-commit-add-block-job-creation-flags.patch deleted file mode 100644 index b145fc1..0000000 --- a/0038-block-commit-add-block-job-creation-flags.patch +++ /dev/null @@ -1,110 +0,0 @@ -From 6c8da2ba018d7546a15c3917f52ad1cc2b5b133c Mon Sep 17 00:00:00 2001 -From: John Snow -Date: Tue, 25 Sep 2018 22:34:16 +0100 -Subject: block/commit: add block job creation flags - -RH-Author: John Snow -Message-id: <20180925223431.24791-11-jsnow@redhat.com> -Patchwork-id: 82264 -O-Subject: [RHEL8/rhel qemu-kvm PATCH 10/25] block/commit: add block job creation flags -Bugzilla: 1632939 -RH-Acked-by: Jeffrey Cody -RH-Acked-by: Max Reitz -RH-Acked-by: Kevin Wolf - -Add support for taking and passing forward job creation flags. - -Signed-off-by: John Snow -Reviewed-by: Max Reitz -Reviewed-by: Jeff Cody -Message-id: 20180906130225.5118-2-jsnow@redhat.com -Signed-off-by: Max Reitz -(cherry picked from commit 5360782d0827854383097d560715d8d8027ee590) -Signed-off-by: John Snow -Signed-off-by: Danilo C. L. de Paula ---- - block/commit.c | 5 +++-- - blockdev.c | 7 ++++--- - include/block/block_int.h | 5 ++++- - 3 files changed, 11 insertions(+), 6 deletions(-) - -diff --git a/block/commit.c b/block/commit.c -index 25b3cb8..c737664 100644 ---- a/block/commit.c -+++ b/block/commit.c -@@ -254,7 +254,8 @@ static BlockDriver bdrv_commit_top = { - }; - - void commit_start(const char *job_id, BlockDriverState *bs, -- BlockDriverState *base, BlockDriverState *top, int64_t speed, -+ BlockDriverState *base, BlockDriverState *top, -+ int creation_flags, int64_t speed, - BlockdevOnError on_error, const char *backing_file_str, - const char *filter_node_name, Error **errp) - { -@@ -272,7 +273,7 @@ void commit_start(const char *job_id, BlockDriverState *bs, - } - - s = block_job_create(job_id, &commit_job_driver, NULL, bs, 0, BLK_PERM_ALL, -- speed, JOB_DEFAULT, NULL, NULL, errp); -+ speed, creation_flags, NULL, NULL, errp); - if (!s) { - return; - } -diff --git a/blockdev.c b/blockdev.c -index dcf8c8d..88ad8d9 100644 ---- a/blockdev.c -+++ b/blockdev.c -@@ -3324,6 +3324,7 @@ void qmp_block_commit(bool has_job_id, const char *job_id, const char *device, - * BlockdevOnError change for blkmirror makes it in - */ - BlockdevOnError on_error = BLOCKDEV_ON_ERROR_REPORT; -+ int job_flags = JOB_DEFAULT; - - if (!has_speed) { - speed = 0; -@@ -3405,15 +3406,15 @@ void qmp_block_commit(bool has_job_id, const char *job_id, const char *device, - goto out; - } - commit_active_start(has_job_id ? job_id : NULL, bs, base_bs, -- JOB_DEFAULT, speed, on_error, -+ job_flags, speed, on_error, - filter_node_name, NULL, NULL, false, &local_err); - } else { - BlockDriverState *overlay_bs = bdrv_find_overlay(bs, top_bs); - if (bdrv_op_is_blocked(overlay_bs, BLOCK_OP_TYPE_COMMIT_TARGET, errp)) { - goto out; - } -- commit_start(has_job_id ? job_id : NULL, bs, base_bs, top_bs, speed, -- on_error, has_backing_file ? backing_file : NULL, -+ commit_start(has_job_id ? job_id : NULL, bs, base_bs, top_bs, job_flags, -+ speed, on_error, has_backing_file ? backing_file : NULL, - filter_node_name, &local_err); - } - if (local_err != NULL) { -diff --git a/include/block/block_int.h b/include/block/block_int.h -index 903b9c1..ffab0b4 100644 ---- a/include/block/block_int.h -+++ b/include/block/block_int.h -@@ -980,6 +980,8 @@ void stream_start(const char *job_id, BlockDriverState *bs, - * @bs: Active block device. - * @top: Top block device to be committed. - * @base: Block device that will be written into, and become the new top. -+ * @creation_flags: Flags that control the behavior of the Job lifetime. -+ * See @BlockJobCreateFlags - * @speed: The maximum speed, in bytes per second, or 0 for unlimited. - * @on_error: The action to take upon error. - * @backing_file_str: String to use as the backing file in @top's overlay -@@ -990,7 +992,8 @@ void stream_start(const char *job_id, BlockDriverState *bs, - * - */ - void commit_start(const char *job_id, BlockDriverState *bs, -- BlockDriverState *base, BlockDriverState *top, int64_t speed, -+ BlockDriverState *base, BlockDriverState *top, -+ int creation_flags, int64_t speed, - BlockdevOnError on_error, const char *backing_file_str, - const char *filter_node_name, Error **errp); - /** --- -1.8.3.1 - diff --git a/0039-block-mirror-add-block-job-creation-flags.patch b/0039-block-mirror-add-block-job-creation-flags.patch deleted file mode 100644 index fec813e..0000000 --- a/0039-block-mirror-add-block-job-creation-flags.patch +++ /dev/null @@ -1,100 +0,0 @@ -From d4f6cfe194df3236bf53b1093e0a7f98f0a5da0e Mon Sep 17 00:00:00 2001 -From: John Snow -Date: Tue, 25 Sep 2018 22:34:17 +0100 -Subject: block/mirror: add block job creation flags - -RH-Author: John Snow -Message-id: <20180925223431.24791-12-jsnow@redhat.com> -Patchwork-id: 82268 -O-Subject: [RHEL8/rhel qemu-kvm PATCH 11/25] block/mirror: add block job creation flags -Bugzilla: 1632939 -RH-Acked-by: Jeffrey Cody -RH-Acked-by: Max Reitz -RH-Acked-by: Kevin Wolf - -Add support for taking and passing forward job creation flags. - -Signed-off-by: John Snow -Reviewed-by: Max Reitz -Reviewed-by: Jeff Cody -Message-id: 20180906130225.5118-3-jsnow@redhat.com -Signed-off-by: Max Reitz -(cherry picked from commit a1999b33488daba68a1bcd7c6fdf314ddeacc6a2) -Signed-off-by: John Snow -Signed-off-by: Danilo C. L. de Paula ---- - block/mirror.c | 5 +++-- - blockdev.c | 3 ++- - include/block/block_int.h | 5 ++++- - 3 files changed, 9 insertions(+), 4 deletions(-) - -diff --git a/block/mirror.c b/block/mirror.c -index 4a9558d..cd13835 100644 ---- a/block/mirror.c -+++ b/block/mirror.c -@@ -1639,7 +1639,8 @@ fail: - - void mirror_start(const char *job_id, BlockDriverState *bs, - BlockDriverState *target, const char *replaces, -- int64_t speed, uint32_t granularity, int64_t buf_size, -+ int creation_flags, int64_t speed, -+ uint32_t granularity, int64_t buf_size, - MirrorSyncMode mode, BlockMirrorBackingMode backing_mode, - BlockdevOnError on_source_error, - BlockdevOnError on_target_error, -@@ -1655,7 +1656,7 @@ void mirror_start(const char *job_id, BlockDriverState *bs, - } - is_none_mode = mode == MIRROR_SYNC_MODE_NONE; - base = mode == MIRROR_SYNC_MODE_TOP ? backing_bs(bs) : NULL; -- mirror_start_job(job_id, bs, JOB_DEFAULT, target, replaces, -+ mirror_start_job(job_id, bs, creation_flags, target, replaces, - speed, granularity, buf_size, backing_mode, - on_source_error, on_target_error, unmap, NULL, NULL, - &mirror_job_driver, is_none_mode, base, false, -diff --git a/blockdev.c b/blockdev.c -index 88ad8d9..d31750b 100644 ---- a/blockdev.c -+++ b/blockdev.c -@@ -3700,6 +3700,7 @@ static void blockdev_mirror_common(const char *job_id, BlockDriverState *bs, - bool has_copy_mode, MirrorCopyMode copy_mode, - Error **errp) - { -+ int job_flags = JOB_DEFAULT; - - if (!has_speed) { - speed = 0; -@@ -3752,7 +3753,7 @@ static void blockdev_mirror_common(const char *job_id, BlockDriverState *bs, - * and will allow to check whether the node still exist at mirror completion - */ - mirror_start(job_id, bs, target, -- has_replaces ? replaces : NULL, -+ has_replaces ? replaces : NULL, job_flags, - speed, granularity, buf_size, sync, backing_mode, - on_source_error, on_target_error, unmap, filter_node_name, - copy_mode, errp); -diff --git a/include/block/block_int.h b/include/block/block_int.h -index ffab0b4..b40f0bf 100644 ---- a/include/block/block_int.h -+++ b/include/block/block_int.h -@@ -1029,6 +1029,8 @@ void commit_active_start(const char *job_id, BlockDriverState *bs, - * @target: Block device to write to. - * @replaces: Block graph node name to replace once the mirror is done. Can - * only be used when full mirroring is selected. -+ * @creation_flags: Flags that control the behavior of the Job lifetime. -+ * See @BlockJobCreateFlags - * @speed: The maximum speed, in bytes per second, or 0 for unlimited. - * @granularity: The chosen granularity for the dirty bitmap. - * @buf_size: The amount of data that can be in flight at one time. -@@ -1050,7 +1052,8 @@ void commit_active_start(const char *job_id, BlockDriverState *bs, - */ - void mirror_start(const char *job_id, BlockDriverState *bs, - BlockDriverState *target, const char *replaces, -- int64_t speed, uint32_t granularity, int64_t buf_size, -+ int creation_flags, int64_t speed, -+ uint32_t granularity, int64_t buf_size, - MirrorSyncMode mode, BlockMirrorBackingMode backing_mode, - BlockdevOnError on_source_error, - BlockdevOnError on_target_error, --- -1.8.3.1 - diff --git a/0040-block-stream-add-block-job-creation-flags.patch b/0040-block-stream-add-block-job-creation-flags.patch deleted file mode 100644 index 224be80..0000000 --- a/0040-block-stream-add-block-job-creation-flags.patch +++ /dev/null @@ -1,100 +0,0 @@ -From 4fd98648eb0df8157c1238a1cee36373278d44a5 Mon Sep 17 00:00:00 2001 -From: John Snow -Date: Tue, 25 Sep 2018 22:34:18 +0100 -Subject: block/stream: add block job creation flags - -RH-Author: John Snow -Message-id: <20180925223431.24791-13-jsnow@redhat.com> -Patchwork-id: 82263 -O-Subject: [RHEL8/rhel qemu-kvm PATCH 12/25] block/stream: add block job creation flags -Bugzilla: 1632939 -RH-Acked-by: Jeffrey Cody -RH-Acked-by: Max Reitz -RH-Acked-by: Kevin Wolf - -Add support for taking and passing forward job creation flags. - -Signed-off-by: John Snow -Reviewed-by: Max Reitz -Reviewed-by: Jeff Cody -Message-id: 20180906130225.5118-4-jsnow@redhat.com -Signed-off-by: Max Reitz -(cherry picked from commit cf6320df581e6cbde6a95075266859a8f9ba9d55) -Signed-off-by: John Snow -Signed-off-by: Danilo C. L. de Paula ---- - block/stream.c | 5 +++-- - blockdev.c | 3 ++- - include/block/block_int.h | 5 ++++- - 3 files changed, 9 insertions(+), 4 deletions(-) - -diff --git a/block/stream.c b/block/stream.c -index 67e1e72..700eb23 100644 ---- a/block/stream.c -+++ b/block/stream.c -@@ -214,7 +214,8 @@ static const BlockJobDriver stream_job_driver = { - - void stream_start(const char *job_id, BlockDriverState *bs, - BlockDriverState *base, const char *backing_file_str, -- int64_t speed, BlockdevOnError on_error, Error **errp) -+ int creation_flags, int64_t speed, -+ BlockdevOnError on_error, Error **errp) - { - StreamBlockJob *s; - BlockDriverState *iter; -@@ -236,7 +237,7 @@ void stream_start(const char *job_id, BlockDriverState *bs, - BLK_PERM_GRAPH_MOD, - BLK_PERM_CONSISTENT_READ | BLK_PERM_WRITE_UNCHANGED | - BLK_PERM_WRITE, -- speed, JOB_DEFAULT, NULL, NULL, errp); -+ speed, creation_flags, NULL, NULL, errp); - if (!s) { - goto fail; - } -diff --git a/blockdev.c b/blockdev.c -index d31750b..c2e6402 100644 ---- a/blockdev.c -+++ b/blockdev.c -@@ -3233,6 +3233,7 @@ void qmp_block_stream(bool has_job_id, const char *job_id, const char *device, - AioContext *aio_context; - Error *local_err = NULL; - const char *base_name = NULL; -+ int job_flags = JOB_DEFAULT; - - if (!has_on_error) { - on_error = BLOCKDEV_ON_ERROR_REPORT; -@@ -3295,7 +3296,7 @@ void qmp_block_stream(bool has_job_id, const char *job_id, const char *device, - base_name = has_backing_file ? backing_file : base_name; - - stream_start(has_job_id ? job_id : NULL, bs, base_bs, base_name, -- has_speed ? speed : 0, on_error, &local_err); -+ job_flags, has_speed ? speed : 0, on_error, &local_err); - if (local_err) { - error_propagate(errp, local_err); - goto out; -diff --git a/include/block/block_int.h b/include/block/block_int.h -index b40f0bf..4000d2a 100644 ---- a/include/block/block_int.h -+++ b/include/block/block_int.h -@@ -958,6 +958,8 @@ int is_windows_drive(const char *filename); - * flatten the whole backing file chain onto @bs. - * @backing_file_str: The file name that will be written to @bs as the - * the new backing file if the job completes. Ignored if @base is %NULL. -+ * @creation_flags: Flags that control the behavior of the Job lifetime. -+ * See @BlockJobCreateFlags - * @speed: The maximum speed, in bytes per second, or 0 for unlimited. - * @on_error: The action to take upon error. - * @errp: Error object. -@@ -971,7 +973,8 @@ int is_windows_drive(const char *filename); - */ - void stream_start(const char *job_id, BlockDriverState *bs, - BlockDriverState *base, const char *backing_file_str, -- int64_t speed, BlockdevOnError on_error, Error **errp); -+ int creation_flags, int64_t speed, -+ BlockdevOnError on_error, Error **errp); - - /** - * commit_start: --- -1.8.3.1 - diff --git a/0041-block-commit-refactor-commit-to-use-job-callbacks.patch b/0041-block-commit-refactor-commit-to-use-job-callbacks.patch deleted file mode 100644 index 212513e..0000000 --- a/0041-block-commit-refactor-commit-to-use-job-callbacks.patch +++ /dev/null @@ -1,180 +0,0 @@ -From b0b7d48f97dd97efacf93e5529d7597bd2280095 Mon Sep 17 00:00:00 2001 -From: John Snow -Date: Tue, 25 Sep 2018 22:34:19 +0100 -Subject: block/commit: refactor commit to use job callbacks - -RH-Author: John Snow -Message-id: <20180925223431.24791-14-jsnow@redhat.com> -Patchwork-id: 82279 -O-Subject: [RHEL8/rhel qemu-kvm PATCH 13/25] block/commit: refactor commit to use job callbacks -Bugzilla: 1632939 -RH-Acked-by: Jeffrey Cody -RH-Acked-by: Max Reitz -RH-Acked-by: Kevin Wolf - -Use the component callbacks; prepare, abort, and clean. - -NB: prepare is only called when the job has not yet failed; -and abort can be called after prepare. - -complete -> prepare -> abort -> clean -complete -> abort -> clean - -During refactor, a potential problem with bdrv_drop_intermediate -was identified, the patched behavior is no worse than the pre-patch -behavior, so leave a FIXME for now to be fixed in a future patch. - -Signed-off-by: John Snow -Reviewed-by: Max Reitz -Message-id: 20180906130225.5118-5-jsnow@redhat.com -Reviewed-by: Jeff Cody -Signed-off-by: Max Reitz -(cherry picked from commit 22dffcbec62ba918db690ed44beba4bd4e970bb9) -Signed-off-by: John Snow -Signed-off-by: Danilo C. L. de Paula ---- - block/commit.c | 92 ++++++++++++++++++++++++++++++++-------------------------- - 1 file changed, 51 insertions(+), 41 deletions(-) - -diff --git a/block/commit.c b/block/commit.c -index c737664..b387765 100644 ---- a/block/commit.c -+++ b/block/commit.c -@@ -36,6 +36,7 @@ typedef struct CommitBlockJob { - BlockDriverState *commit_top_bs; - BlockBackend *top; - BlockBackend *base; -+ BlockDriverState *base_bs; - BlockdevOnError on_error; - int base_flags; - char *backing_file_str; -@@ -68,61 +69,67 @@ static int coroutine_fn commit_populate(BlockBackend *bs, BlockBackend *base, - return 0; - } - --static void commit_exit(Job *job) -+static int commit_prepare(Job *job) - { - CommitBlockJob *s = container_of(job, CommitBlockJob, common.job); -- BlockJob *bjob = &s->common; -- BlockDriverState *top = blk_bs(s->top); -- BlockDriverState *base = blk_bs(s->base); -- BlockDriverState *commit_top_bs = s->commit_top_bs; -- bool remove_commit_top_bs = false; -- -- /* Make sure commit_top_bs and top stay around until bdrv_replace_node() */ -- bdrv_ref(top); -- bdrv_ref(commit_top_bs); - - /* Remove base node parent that still uses BLK_PERM_WRITE/RESIZE before - * the normal backing chain can be restored. */ - blk_unref(s->base); -+ s->base = NULL; -+ -+ /* FIXME: bdrv_drop_intermediate treats total failures and partial failures -+ * identically. Further work is needed to disambiguate these cases. */ -+ return bdrv_drop_intermediate(s->commit_top_bs, s->base_bs, -+ s->backing_file_str); -+} - -- if (!job_is_cancelled(job) && job->ret == 0) { -- /* success */ -- job->ret = bdrv_drop_intermediate(s->commit_top_bs, base, -- s->backing_file_str); -- } else { -- /* XXX Can (or should) we somehow keep 'consistent read' blocked even -- * after the failed/cancelled commit job is gone? If we already wrote -- * something to base, the intermediate images aren't valid any more. */ -- remove_commit_top_bs = true; -+static void commit_abort(Job *job) -+{ -+ CommitBlockJob *s = container_of(job, CommitBlockJob, common.job); -+ BlockDriverState *top_bs = blk_bs(s->top); -+ -+ /* Make sure commit_top_bs and top stay around until bdrv_replace_node() */ -+ bdrv_ref(top_bs); -+ bdrv_ref(s->commit_top_bs); -+ -+ if (s->base) { -+ blk_unref(s->base); - } - -+ /* free the blockers on the intermediate nodes so that bdrv_replace_nodes -+ * can succeed */ -+ block_job_remove_all_bdrv(&s->common); -+ -+ /* If bdrv_drop_intermediate() failed (or was not invoked), remove the -+ * commit filter driver from the backing chain now. Do this as the final -+ * step so that the 'consistent read' permission can be granted. -+ * -+ * XXX Can (or should) we somehow keep 'consistent read' blocked even -+ * after the failed/cancelled commit job is gone? If we already wrote -+ * something to base, the intermediate images aren't valid any more. */ -+ bdrv_child_try_set_perm(s->commit_top_bs->backing, 0, BLK_PERM_ALL, -+ &error_abort); -+ bdrv_replace_node(s->commit_top_bs, backing_bs(s->commit_top_bs), -+ &error_abort); -+ -+ bdrv_unref(s->commit_top_bs); -+ bdrv_unref(top_bs); -+} -+ -+static void commit_clean(Job *job) -+{ -+ CommitBlockJob *s = container_of(job, CommitBlockJob, common.job); -+ - /* restore base open flags here if appropriate (e.g., change the base back - * to r/o). These reopens do not need to be atomic, since we won't abort - * even on failure here */ -- if (s->base_flags != bdrv_get_flags(base)) { -- bdrv_reopen(base, s->base_flags, NULL); -+ if (s->base_flags != bdrv_get_flags(s->base_bs)) { -+ bdrv_reopen(s->base_bs, s->base_flags, NULL); - } -+ - g_free(s->backing_file_str); - blk_unref(s->top); -- -- /* If there is more than one reference to the job (e.g. if called from -- * job_finish_sync()), job_completed() won't free it and therefore the -- * blockers on the intermediate nodes remain. This would cause -- * bdrv_set_backing_hd() to fail. */ -- block_job_remove_all_bdrv(bjob); -- -- /* If bdrv_drop_intermediate() didn't already do that, remove the commit -- * filter driver from the backing chain. Do this as the final step so that -- * the 'consistent read' permission can be granted. */ -- if (remove_commit_top_bs) { -- bdrv_child_try_set_perm(commit_top_bs->backing, 0, BLK_PERM_ALL, -- &error_abort); -- bdrv_replace_node(commit_top_bs, backing_bs(commit_top_bs), -- &error_abort); -- } -- -- bdrv_unref(commit_top_bs); -- bdrv_unref(top); - } - - static int coroutine_fn commit_run(Job *job, Error **errp) -@@ -211,7 +218,9 @@ static const BlockJobDriver commit_job_driver = { - .user_resume = block_job_user_resume, - .drain = block_job_drain, - .run = commit_run, -- .exit = commit_exit, -+ .prepare = commit_prepare, -+ .abort = commit_abort, -+ .clean = commit_clean - }, - }; - -@@ -350,6 +359,7 @@ void commit_start(const char *job_id, BlockDriverState *bs, - if (ret < 0) { - goto fail; - } -+ s->base_bs = base; - - /* Required permissions are already taken with block_job_add_bdrv() */ - s->top = blk_new(0, BLK_PERM_ALL); --- -1.8.3.1 - diff --git a/0042-block-mirror-don-t-install-backing-chain-on-abort.patch b/0042-block-mirror-don-t-install-backing-chain-on-abort.patch deleted file mode 100644 index 8a2f14f..0000000 --- a/0042-block-mirror-don-t-install-backing-chain-on-abort.patch +++ /dev/null @@ -1,45 +0,0 @@ -From e849bf276e59b282f3288b42abe9d6dff51dc678 Mon Sep 17 00:00:00 2001 -From: John Snow -Date: Tue, 25 Sep 2018 22:34:20 +0100 -Subject: block/mirror: don't install backing chain on abort - -RH-Author: John Snow -Message-id: <20180925223431.24791-15-jsnow@redhat.com> -Patchwork-id: 82277 -O-Subject: [RHEL8/rhel qemu-kvm PATCH 14/25] block/mirror: don't install backing chain on abort -Bugzilla: 1632939 -RH-Acked-by: Jeffrey Cody -RH-Acked-by: Max Reitz -RH-Acked-by: Kevin Wolf - -In cases where we abort the block/mirror job, there's no point in -installing the new backing chain before we finish aborting. - -Signed-off-by: John Snow -Message-id: 20180906130225.5118-6-jsnow@redhat.com -Reviewed-by: Jeff Cody -Reviewed-by: Max Reitz -Signed-off-by: Max Reitz -(cherry picked from commit c2924ceaa7f1866148e2847c969fc1902a2524fa) -Signed-off-by: John Snow -Signed-off-by: Danilo C. L. de Paula ---- - block/mirror.c | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -diff --git a/block/mirror.c b/block/mirror.c -index cd13835..19b57b8 100644 ---- a/block/mirror.c -+++ b/block/mirror.c -@@ -642,7 +642,7 @@ static void mirror_exit(Job *job) - * required before it could become a backing file of target_bs. */ - bdrv_child_try_set_perm(mirror_top_bs->backing, 0, BLK_PERM_ALL, - &error_abort); -- if (s->backing_mode == MIRROR_SOURCE_BACKING_CHAIN) { -+ if (ret == 0 && s->backing_mode == MIRROR_SOURCE_BACKING_CHAIN) { - BlockDriverState *backing = s->is_none_mode ? src : s->base; - if (backing_bs(target_bs) != backing) { - bdrv_set_backing_hd(target_bs, backing, &local_err); --- -1.8.3.1 - diff --git a/0043-block-mirror-conservative-mirror_exit-refactor.patch b/0043-block-mirror-conservative-mirror_exit-refactor.patch deleted file mode 100644 index b964981..0000000 --- a/0043-block-mirror-conservative-mirror_exit-refactor.patch +++ /dev/null @@ -1,136 +0,0 @@ -From 430c298d6bf9a7c8b90ad30bc2cd445e5cd6dd50 Mon Sep 17 00:00:00 2001 -From: John Snow -Date: Thu, 6 Sep 2018 09:02:15 -0400 -Subject: block/mirror: conservative mirror_exit refactor - -RH-Author: John Snow -Message-id: <20180925223431.24791-16-jsnow@redhat.com> -Patchwork-id: 82270 -O-Subject: [RHEL8/rhel qemu-kvm PATCH 15/25] block/mirror: conservative mirr -Bugzilla: 1632939 -RH-Acked-by: Jeffrey Cody -RH-Acked-by: Max Reitz -RH-Acked-by: Kevin Wolf - -For purposes of minimum code movement, refactor the mirror_exit -callback to use the post-finalization callbacks in a trivial way. - -Signed-off-by: John Snow -Message-id: 20180906130225.5118-7-jsnow@redhat.com -Reviewed-by: Jeff Cody -Reviewed-by: Max Reitz -[mreitz: Added comment for the mirror_exit() function] -Signed-off-by: Max Reitz -(cherry picked from commit 737efc1eda23b904fbe0e66b37715fb0e5c3e58b) -Signed-off-by: John Snow ---- - block/mirror.c | 44 +++++++++++++++++++++++++++++++++----------- - 1 file changed, 33 insertions(+), 11 deletions(-) - -diff --git a/block/mirror.c b/block/mirror.c -index 19b57b8..7efba77 100644 ---- a/block/mirror.c -+++ b/block/mirror.c -@@ -79,6 +79,7 @@ typedef struct MirrorBlockJob { - int max_iov; - bool initial_zeroing_ongoing; - int in_active_write_counter; -+ bool prepared; - } MirrorBlockJob; - - typedef struct MirrorBDSOpaque { -@@ -607,7 +608,12 @@ static void mirror_wait_for_all_io(MirrorBlockJob *s) - } - } - --static void mirror_exit(Job *job) -+/** -+ * mirror_exit_common: handle both abort() and prepare() cases. -+ * for .prepare, returns 0 on success and -errno on failure. -+ * for .abort cases, denoted by abort = true, MUST return 0. -+ */ -+static int mirror_exit_common(Job *job) - { - MirrorBlockJob *s = container_of(job, MirrorBlockJob, common.job); - BlockJob *bjob = &s->common; -@@ -617,7 +623,13 @@ static void mirror_exit(Job *job) - BlockDriverState *target_bs = blk_bs(s->target); - BlockDriverState *mirror_top_bs = s->mirror_top_bs; - Error *local_err = NULL; -- int ret = job->ret; -+ bool abort = job->ret < 0; -+ int ret = 0; -+ -+ if (s->prepared) { -+ return 0; -+ } -+ s->prepared = true; - - bdrv_release_dirty_bitmap(src, s->dirty_bitmap); - -@@ -642,7 +654,7 @@ static void mirror_exit(Job *job) - * required before it could become a backing file of target_bs. */ - bdrv_child_try_set_perm(mirror_top_bs->backing, 0, BLK_PERM_ALL, - &error_abort); -- if (ret == 0 && s->backing_mode == MIRROR_SOURCE_BACKING_CHAIN) { -+ if (!abort && s->backing_mode == MIRROR_SOURCE_BACKING_CHAIN) { - BlockDriverState *backing = s->is_none_mode ? src : s->base; - if (backing_bs(target_bs) != backing) { - bdrv_set_backing_hd(target_bs, backing, &local_err); -@@ -658,11 +670,8 @@ static void mirror_exit(Job *job) - aio_context_acquire(replace_aio_context); - } - -- if (s->should_complete && ret == 0) { -- BlockDriverState *to_replace = src; -- if (s->to_replace) { -- to_replace = s->to_replace; -- } -+ if (s->should_complete && !abort) { -+ BlockDriverState *to_replace = s->to_replace ?: src; - - if (bdrv_get_flags(target_bs) != bdrv_get_flags(to_replace)) { - bdrv_reopen(target_bs, bdrv_get_flags(to_replace), NULL); -@@ -711,7 +720,18 @@ static void mirror_exit(Job *job) - bdrv_unref(mirror_top_bs); - bdrv_unref(src); - -- job->ret = ret; -+ return ret; -+} -+ -+static int mirror_prepare(Job *job) -+{ -+ return mirror_exit_common(job); -+} -+ -+static void mirror_abort(Job *job) -+{ -+ int ret = mirror_exit_common(job); -+ assert(ret == 0); - } - - static void mirror_throttle(MirrorBlockJob *s) -@@ -1132,7 +1152,8 @@ static const BlockJobDriver mirror_job_driver = { - .user_resume = block_job_user_resume, - .drain = block_job_drain, - .run = mirror_run, -- .exit = mirror_exit, -+ .prepare = mirror_prepare, -+ .abort = mirror_abort, - .pause = mirror_pause, - .complete = mirror_complete, - }, -@@ -1149,7 +1170,8 @@ static const BlockJobDriver commit_active_job_driver = { - .user_resume = block_job_user_resume, - .drain = block_job_drain, - .run = mirror_run, -- .exit = mirror_exit, -+ .prepare = mirror_prepare, -+ .abort = mirror_abort, - .pause = mirror_pause, - .complete = mirror_complete, - }, --- -1.8.3.1 - diff --git a/0044-block-stream-refactor-stream-to-use-job-callbacks.patch b/0044-block-stream-refactor-stream-to-use-job-callbacks.patch deleted file mode 100644 index c798419..0000000 --- a/0044-block-stream-refactor-stream-to-use-job-callbacks.patch +++ /dev/null @@ -1,94 +0,0 @@ -From 57ede8577bbecac73a2945ca5278662dfc019dca Mon Sep 17 00:00:00 2001 -From: John Snow -Date: Tue, 25 Sep 2018 22:34:22 +0100 -Subject: block/stream: refactor stream to use job callbacks - -RH-Author: John Snow -Message-id: <20180925223431.24791-17-jsnow@redhat.com> -Patchwork-id: 82280 -O-Subject: [RHEL8/rhel qemu-kvm PATCH 16/25] block/stream: refactor stream to use job callbacks -Bugzilla: 1632939 -RH-Acked-by: Jeffrey Cody -RH-Acked-by: Max Reitz -RH-Acked-by: Kevin Wolf - -Signed-off-by: John Snow -Reviewed-by: Max Reitz -Message-id: 20180906130225.5118-8-jsnow@redhat.com -Reviewed-by: Jeff Cody -Signed-off-by: Max Reitz -(cherry picked from commit 1b57488acf1beba157bcd8c926e596342bcb5c60) -Signed-off-by: John Snow -Signed-off-by: Danilo C. L. de Paula ---- - block/stream.c | 23 +++++++++++++++-------- - 1 file changed, 15 insertions(+), 8 deletions(-) - -diff --git a/block/stream.c b/block/stream.c -index 700eb23..81a7ec8 100644 ---- a/block/stream.c -+++ b/block/stream.c -@@ -54,16 +54,16 @@ static int coroutine_fn stream_populate(BlockBackend *blk, - return blk_co_preadv(blk, offset, qiov.size, &qiov, BDRV_REQ_COPY_ON_READ); - } - --static void stream_exit(Job *job) -+static int stream_prepare(Job *job) - { - StreamBlockJob *s = container_of(job, StreamBlockJob, common.job); - BlockJob *bjob = &s->common; - BlockDriverState *bs = blk_bs(bjob->blk); - BlockDriverState *base = s->base; - Error *local_err = NULL; -- int ret = job->ret; -+ int ret = 0; - -- if (!job_is_cancelled(job) && bs->backing && ret == 0) { -+ if (bs->backing) { - const char *base_id = NULL, *base_fmt = NULL; - if (base) { - base_id = s->backing_file_str; -@@ -75,12 +75,19 @@ static void stream_exit(Job *job) - bdrv_set_backing_hd(bs, base, &local_err); - if (local_err) { - error_report_err(local_err); -- ret = -EPERM; -- goto out; -+ return -EPERM; - } - } - --out: -+ return ret; -+} -+ -+static void stream_clean(Job *job) -+{ -+ StreamBlockJob *s = container_of(job, StreamBlockJob, common.job); -+ BlockJob *bjob = &s->common; -+ BlockDriverState *bs = blk_bs(bjob->blk); -+ - /* Reopen the image back in read-only mode if necessary */ - if (s->bs_flags != bdrv_get_flags(bs)) { - /* Give up write permissions before making it read-only */ -@@ -89,7 +96,6 @@ out: - } - - g_free(s->backing_file_str); -- job->ret = ret; - } - - static int coroutine_fn stream_run(Job *job, Error **errp) -@@ -206,7 +212,8 @@ static const BlockJobDriver stream_job_driver = { - .job_type = JOB_TYPE_STREAM, - .free = block_job_free, - .run = stream_run, -- .exit = stream_exit, -+ .prepare = stream_prepare, -+ .clean = stream_clean, - .user_resume = block_job_user_resume, - .drain = block_job_drain, - }, --- -1.8.3.1 - diff --git a/0045-tests-blockjob-replace-Blockjob-with-Job.patch b/0045-tests-blockjob-replace-Blockjob-with-Job.patch deleted file mode 100644 index 3d9bf41..0000000 --- a/0045-tests-blockjob-replace-Blockjob-with-Job.patch +++ /dev/null @@ -1,233 +0,0 @@ -From 3817b0c67fb4636bacd9c4ebdef39f51b18e05c1 Mon Sep 17 00:00:00 2001 -From: John Snow -Date: Tue, 25 Sep 2018 22:34:23 +0100 -Subject: tests/blockjob: replace Blockjob with Job - -RH-Author: John Snow -Message-id: <20180925223431.24791-18-jsnow@redhat.com> -Patchwork-id: 82281 -O-Subject: [RHEL8/rhel qemu-kvm PATCH 17/25] tests/blockjob: replace Blockjob with Job -Bugzilla: 1632939 -RH-Acked-by: Jeffrey Cody -RH-Acked-by: Max Reitz -RH-Acked-by: Kevin Wolf - -These tests don't actually test blockjobs anymore, they test -generic Job lifetimes. Change the types accordingly. - -Signed-off-by: John Snow -Reviewed-by: Max Reitz -Message-id: 20180906130225.5118-9-jsnow@redhat.com -Reviewed-by: Jeff Cody -Signed-off-by: Max Reitz -(cherry picked from commit 0cc4643b01a0138543e886db8e3bf8a3f74ff8f9) -Signed-off-by: John Snow -Signed-off-by: Danilo C. L. de Paula ---- - tests/test-blockjob.c | 98 ++++++++++++++++++++++++++------------------------- - 1 file changed, 50 insertions(+), 48 deletions(-) - -diff --git a/tests/test-blockjob.c b/tests/test-blockjob.c -index ad4a65b..8e8b680 100644 ---- a/tests/test-blockjob.c -+++ b/tests/test-blockjob.c -@@ -206,18 +206,20 @@ static const BlockJobDriver test_cancel_driver = { - }, - }; - --static CancelJob *create_common(BlockJob **pjob) -+static CancelJob *create_common(Job **pjob) - { - BlockBackend *blk; -- BlockJob *job; -+ Job *job; -+ BlockJob *bjob; - CancelJob *s; - - blk = create_blk(NULL); -- job = mk_job(blk, "Steve", &test_cancel_driver, true, -- JOB_MANUAL_FINALIZE | JOB_MANUAL_DISMISS); -- job_ref(&job->job); -- assert(job->job.status == JOB_STATUS_CREATED); -- s = container_of(job, CancelJob, common); -+ bjob = mk_job(blk, "Steve", &test_cancel_driver, true, -+ JOB_MANUAL_FINALIZE | JOB_MANUAL_DISMISS); -+ job = &bjob->job; -+ job_ref(job); -+ assert(job->status == JOB_STATUS_CREATED); -+ s = container_of(bjob, CancelJob, common); - s->blk = blk; - - *pjob = job; -@@ -242,7 +244,7 @@ static void cancel_common(CancelJob *s) - - static void test_cancel_created(void) - { -- BlockJob *job; -+ Job *job; - CancelJob *s; - - s = create_common(&job); -@@ -251,119 +253,119 @@ static void test_cancel_created(void) - - static void test_cancel_running(void) - { -- BlockJob *job; -+ Job *job; - CancelJob *s; - - s = create_common(&job); - -- job_start(&job->job); -- assert(job->job.status == JOB_STATUS_RUNNING); -+ job_start(job); -+ assert(job->status == JOB_STATUS_RUNNING); - - cancel_common(s); - } - - static void test_cancel_paused(void) - { -- BlockJob *job; -+ Job *job; - CancelJob *s; - - s = create_common(&job); - -- job_start(&job->job); -- assert(job->job.status == JOB_STATUS_RUNNING); -+ job_start(job); -+ assert(job->status == JOB_STATUS_RUNNING); - -- job_user_pause(&job->job, &error_abort); -- job_enter(&job->job); -- assert(job->job.status == JOB_STATUS_PAUSED); -+ job_user_pause(job, &error_abort); -+ job_enter(job); -+ assert(job->status == JOB_STATUS_PAUSED); - - cancel_common(s); - } - - static void test_cancel_ready(void) - { -- BlockJob *job; -+ Job *job; - CancelJob *s; - - s = create_common(&job); - -- job_start(&job->job); -- assert(job->job.status == JOB_STATUS_RUNNING); -+ job_start(job); -+ assert(job->status == JOB_STATUS_RUNNING); - - s->should_converge = true; -- job_enter(&job->job); -- assert(job->job.status == JOB_STATUS_READY); -+ job_enter(job); -+ assert(job->status == JOB_STATUS_READY); - - cancel_common(s); - } - - static void test_cancel_standby(void) - { -- BlockJob *job; -+ Job *job; - CancelJob *s; - - s = create_common(&job); - -- job_start(&job->job); -- assert(job->job.status == JOB_STATUS_RUNNING); -+ job_start(job); -+ assert(job->status == JOB_STATUS_RUNNING); - - s->should_converge = true; -- job_enter(&job->job); -- assert(job->job.status == JOB_STATUS_READY); -+ job_enter(job); -+ assert(job->status == JOB_STATUS_READY); - -- job_user_pause(&job->job, &error_abort); -- job_enter(&job->job); -- assert(job->job.status == JOB_STATUS_STANDBY); -+ job_user_pause(job, &error_abort); -+ job_enter(job); -+ assert(job->status == JOB_STATUS_STANDBY); - - cancel_common(s); - } - - static void test_cancel_pending(void) - { -- BlockJob *job; -+ Job *job; - CancelJob *s; - - s = create_common(&job); - -- job_start(&job->job); -- assert(job->job.status == JOB_STATUS_RUNNING); -+ job_start(job); -+ assert(job->status == JOB_STATUS_RUNNING); - - s->should_converge = true; -- job_enter(&job->job); -- assert(job->job.status == JOB_STATUS_READY); -+ job_enter(job); -+ assert(job->status == JOB_STATUS_READY); - -- job_complete(&job->job, &error_abort); -- job_enter(&job->job); -+ job_complete(job, &error_abort); -+ job_enter(job); - while (!s->completed) { - aio_poll(qemu_get_aio_context(), true); - } -- assert(job->job.status == JOB_STATUS_PENDING); -+ assert(job->status == JOB_STATUS_PENDING); - - cancel_common(s); - } - - static void test_cancel_concluded(void) - { -- BlockJob *job; -+ Job *job; - CancelJob *s; - - s = create_common(&job); - -- job_start(&job->job); -- assert(job->job.status == JOB_STATUS_RUNNING); -+ job_start(job); -+ assert(job->status == JOB_STATUS_RUNNING); - - s->should_converge = true; -- job_enter(&job->job); -- assert(job->job.status == JOB_STATUS_READY); -+ job_enter(job); -+ assert(job->status == JOB_STATUS_READY); - -- job_complete(&job->job, &error_abort); -- job_enter(&job->job); -+ job_complete(job, &error_abort); -+ job_enter(job); - while (!s->completed) { - aio_poll(qemu_get_aio_context(), true); - } -- assert(job->job.status == JOB_STATUS_PENDING); -+ assert(job->status == JOB_STATUS_PENDING); - -- job_finalize(&job->job, &error_abort); -- assert(job->job.status == JOB_STATUS_CONCLUDED); -+ job_finalize(job, &error_abort); -+ assert(job->status == JOB_STATUS_CONCLUDED); - - cancel_common(s); - } --- -1.8.3.1 - diff --git a/0046-tests-test-blockjob-remove-exit-callback.patch b/0046-tests-test-blockjob-remove-exit-callback.patch deleted file mode 100644 index 81856fb..0000000 --- a/0046-tests-test-blockjob-remove-exit-callback.patch +++ /dev/null @@ -1,88 +0,0 @@ -From f641d3f6946af31724c578aa6f09ba883bb5fab3 Mon Sep 17 00:00:00 2001 -From: John Snow -Date: Tue, 25 Sep 2018 22:34:24 +0100 -Subject: tests/test-blockjob: remove exit callback - -RH-Author: John Snow -Message-id: <20180925223431.24791-19-jsnow@redhat.com> -Patchwork-id: 82276 -O-Subject: [RHEL8/rhel qemu-kvm PATCH 18/25] tests/test-blockjob: remove exit callback -Bugzilla: 1632939 -RH-Acked-by: Jeffrey Cody -RH-Acked-by: Max Reitz -RH-Acked-by: Kevin Wolf - -We remove the exit callback and the completed boolean along with it. -We can simulate it just fine by waiting for the job to defer to the -main loop, and then giving it one final kick to get the main loop -portion to run. - -Signed-off-by: John Snow -Reviewed-by: Max Reitz -Message-id: 20180906130225.5118-10-jsnow@redhat.com -Reviewed-by: Jeff Cody -Signed-off-by: Max Reitz -(cherry picked from commit 977d26fdbeb35d8d2d0f203f9556d44a353e0dfd) -Signed-off-by: John Snow -Signed-off-by: Danilo C. L. de Paula ---- - tests/test-blockjob.c | 16 ++++++---------- - 1 file changed, 6 insertions(+), 10 deletions(-) - -diff --git a/tests/test-blockjob.c b/tests/test-blockjob.c -index 8e8b680..de4c1c2 100644 ---- a/tests/test-blockjob.c -+++ b/tests/test-blockjob.c -@@ -160,15 +160,8 @@ typedef struct CancelJob { - BlockBackend *blk; - bool should_converge; - bool should_complete; -- bool completed; - } CancelJob; - --static void cancel_job_exit(Job *job) --{ -- CancelJob *s = container_of(job, CancelJob, common.job); -- s->completed = true; --} -- - static void cancel_job_complete(Job *job, Error **errp) - { - CancelJob *s = container_of(job, CancelJob, common.job); -@@ -201,7 +194,6 @@ static const BlockJobDriver test_cancel_driver = { - .user_resume = block_job_user_resume, - .drain = block_job_drain, - .run = cancel_job_run, -- .exit = cancel_job_exit, - .complete = cancel_job_complete, - }, - }; -@@ -335,9 +327,11 @@ static void test_cancel_pending(void) - - job_complete(job, &error_abort); - job_enter(job); -- while (!s->completed) { -+ while (!job->deferred_to_main_loop) { - aio_poll(qemu_get_aio_context(), true); - } -+ assert(job->status == JOB_STATUS_READY); -+ aio_poll(qemu_get_aio_context(), true); - assert(job->status == JOB_STATUS_PENDING); - - cancel_common(s); -@@ -359,9 +353,11 @@ static void test_cancel_concluded(void) - - job_complete(job, &error_abort); - job_enter(job); -- while (!s->completed) { -+ while (!job->deferred_to_main_loop) { - aio_poll(qemu_get_aio_context(), true); - } -+ assert(job->status == JOB_STATUS_READY); -+ aio_poll(qemu_get_aio_context(), true); - assert(job->status == JOB_STATUS_PENDING); - - job_finalize(job, &error_abort); --- -1.8.3.1 - diff --git a/0047-tests-test-blockjob-txn-move-.exit-to-.clean.patch b/0047-tests-test-blockjob-txn-move-.exit-to-.clean.patch deleted file mode 100644 index b6cc4fd..0000000 --- a/0047-tests-test-blockjob-txn-move-.exit-to-.clean.patch +++ /dev/null @@ -1,53 +0,0 @@ -From 43b1e07411d06cd676f3f55e14e0ac1082a679d0 Mon Sep 17 00:00:00 2001 -From: John Snow -Date: Tue, 25 Sep 2018 22:34:25 +0100 -Subject: tests/test-blockjob-txn: move .exit to .clean - -RH-Author: John Snow -Message-id: <20180925223431.24791-20-jsnow@redhat.com> -Patchwork-id: 82282 -O-Subject: [RHEL8/rhel qemu-kvm PATCH 19/25] tests/test-blockjob-txn: move .exit to .clean -Bugzilla: 1632939 -RH-Acked-by: Jeffrey Cody -RH-Acked-by: Max Reitz -RH-Acked-by: Kevin Wolf - -The exit callback in this test actually only performs cleanup. - -Signed-off-by: John Snow -Reviewed-by: Max Reitz -Message-id: 20180906130225.5118-11-jsnow@redhat.com -Reviewed-by: Jeff Cody -Signed-off-by: Max Reitz -(cherry picked from commit e4dad4275d51b594c8abbe726a4927f6f388e427) -Signed-off-by: John Snow -Signed-off-by: Danilo C. L. de Paula ---- - tests/test-blockjob-txn.c | 4 ++-- - 1 file changed, 2 insertions(+), 2 deletions(-) - -diff --git a/tests/test-blockjob-txn.c b/tests/test-blockjob-txn.c -index ef29f35..86606f9 100644 ---- a/tests/test-blockjob-txn.c -+++ b/tests/test-blockjob-txn.c -@@ -24,7 +24,7 @@ typedef struct { - int *result; - } TestBlockJob; - --static void test_block_job_exit(Job *job) -+static void test_block_job_clean(Job *job) - { - BlockJob *bjob = container_of(job, BlockJob, job); - BlockDriverState *bs = blk_bs(bjob->blk); -@@ -73,7 +73,7 @@ static const BlockJobDriver test_block_job_driver = { - .user_resume = block_job_user_resume, - .drain = block_job_drain, - .run = test_block_job_run, -- .exit = test_block_job_exit, -+ .clean = test_block_job_clean, - }, - }; - --- -1.8.3.1 - diff --git a/0048-jobs-remove-.exit-callback.patch b/0048-jobs-remove-.exit-callback.patch deleted file mode 100644 index b4ece99..0000000 --- a/0048-jobs-remove-.exit-callback.patch +++ /dev/null @@ -1,156 +0,0 @@ -From ea31341d12bc2080f7a1b606dcf578376d6a4637 Mon Sep 17 00:00:00 2001 -From: John Snow -Date: Tue, 25 Sep 2018 22:34:26 +0100 -Subject: jobs: remove .exit callback - -RH-Author: John Snow -Message-id: <20180925223431.24791-21-jsnow@redhat.com> -Patchwork-id: 82283 -O-Subject: [RHEL8/rhel qemu-kvm PATCH 20/25] jobs: remove .exit callback -Bugzilla: 1632939 -RH-Acked-by: Jeffrey Cody -RH-Acked-by: Max Reitz -RH-Acked-by: Kevin Wolf - -Now that all of the jobs use the component finalization callbacks, -there's no use for the heavy-hammer .exit callback anymore. - -job_exit becomes a glorified type shim so that we can call -job_completed from aio_bh_schedule_oneshot. - -Move these three functions down into job.c to eliminate a -forward reference. - -Signed-off-by: John Snow -Reviewed-by: Max Reitz -Message-id: 20180906130225.5118-12-jsnow@redhat.com -Reviewed-by: Jeff Cody -Signed-off-by: Max Reitz -(cherry picked from commit ccbfb3319aa265e71c16dac976ff857d0a5bcb4b) -Signed-off-by: John Snow -Signed-off-by: Danilo C. L. de Paula ---- - include/qemu/job.h | 11 -------- - job.c | 77 ++++++++++++++++++++++++------------------------------ - 2 files changed, 34 insertions(+), 54 deletions(-) - -diff --git a/include/qemu/job.h b/include/qemu/job.h -index e0cff70..5cb0681 100644 ---- a/include/qemu/job.h -+++ b/include/qemu/job.h -@@ -222,17 +222,6 @@ struct JobDriver { - void (*drain)(Job *job); - - /** -- * If the callback is not NULL, exit will be invoked from the main thread -- * when the job's coroutine has finished, but before transactional -- * convergence; before @prepare or @abort. -- * -- * FIXME TODO: This callback is only temporary to transition remaining jobs -- * to prepare/commit/abort/clean callbacks and will be removed before 3.1. -- * is released. -- */ -- void (*exit)(Job *job); -- -- /** - * If the callback is not NULL, prepare will be invoked when all the jobs - * belonging to the same transaction complete; or upon this job's completion - * if it is not in a transaction. -diff --git a/job.c b/job.c -index e8d7aee..87c9aa4 100644 ---- a/job.c -+++ b/job.c -@@ -535,49 +535,6 @@ void job_drain(Job *job) - } - } - --static void job_completed(Job *job); -- --static void job_exit(void *opaque) --{ -- Job *job = (Job *)opaque; -- AioContext *aio_context = job->aio_context; -- -- if (job->driver->exit) { -- aio_context_acquire(aio_context); -- job->driver->exit(job); -- aio_context_release(aio_context); -- } -- job_completed(job); --} -- --/** -- * All jobs must allow a pause point before entering their job proper. This -- * ensures that jobs can be paused prior to being started, then resumed later. -- */ --static void coroutine_fn job_co_entry(void *opaque) --{ -- Job *job = opaque; -- -- assert(job && job->driver && job->driver->run); -- job_pause_point(job); -- job->ret = job->driver->run(job, &job->err); -- job->deferred_to_main_loop = true; -- aio_bh_schedule_oneshot(qemu_get_aio_context(), job_exit, job); --} -- -- --void job_start(Job *job) --{ -- assert(job && !job_started(job) && job->paused && -- job->driver && job->driver->run); -- job->co = qemu_coroutine_create(job_co_entry, job); -- job->pause_count--; -- job->busy = true; -- job->paused = false; -- job_state_transition(job, JOB_STATUS_RUNNING); -- aio_co_enter(job->aio_context, job->co); --} -- - /* Assumes the block_job_mutex is held */ - static bool job_timer_not_pending(Job *job) - { -@@ -894,6 +851,40 @@ static void job_completed(Job *job) - } - } - -+/** Useful only as a type shim for aio_bh_schedule_oneshot. */ -+static void job_exit(void *opaque) -+{ -+ Job *job = (Job *)opaque; -+ job_completed(job); -+} -+ -+/** -+ * All jobs must allow a pause point before entering their job proper. This -+ * ensures that jobs can be paused prior to being started, then resumed later. -+ */ -+static void coroutine_fn job_co_entry(void *opaque) -+{ -+ Job *job = opaque; -+ -+ assert(job && job->driver && job->driver->run); -+ job_pause_point(job); -+ job->ret = job->driver->run(job, &job->err); -+ job->deferred_to_main_loop = true; -+ aio_bh_schedule_oneshot(qemu_get_aio_context(), job_exit, job); -+} -+ -+void job_start(Job *job) -+{ -+ assert(job && !job_started(job) && job->paused && -+ job->driver && job->driver->run); -+ job->co = qemu_coroutine_create(job_co_entry, job); -+ job->pause_count--; -+ job->busy = true; -+ job->paused = false; -+ job_state_transition(job, JOB_STATUS_RUNNING); -+ aio_co_enter(job->aio_context, job->co); -+} -+ - void job_cancel(Job *job, bool force) - { - if (job->status == JOB_STATUS_CONCLUDED) { --- -1.8.3.1 - diff --git a/0049-qapi-block-commit-expose-new-job-properties.patch b/0049-qapi-block-commit-expose-new-job-properties.patch deleted file mode 100644 index 97a192c..0000000 --- a/0049-qapi-block-commit-expose-new-job-properties.patch +++ /dev/null @@ -1,90 +0,0 @@ -From 756c3ccf83d5612ca2b326a8fed8fdf1f7958adb Mon Sep 17 00:00:00 2001 -From: John Snow -Date: Tue, 25 Sep 2018 22:34:27 +0100 -Subject: qapi/block-commit: expose new job properties - -RH-Author: John Snow -Message-id: <20180925223431.24791-22-jsnow@redhat.com> -Patchwork-id: 82285 -O-Subject: [RHEL8/rhel qemu-kvm PATCH 21/25] qapi/block-commit: expose new job properties -Bugzilla: 1632939 -RH-Acked-by: Jeffrey Cody -RH-Acked-by: Max Reitz -RH-Acked-by: Kevin Wolf - -Signed-off-by: John Snow -Reviewed-by: Max Reitz -Message-id: 20180906130225.5118-13-jsnow@redhat.com -Reviewed-by: Jeff Cody -Signed-off-by: Max Reitz -(cherry picked from commit 96fbf5345f60a87fab8e7ea79a2406f381027db9) -Signed-off-by: John Snow -Signed-off-by: Danilo C. L. de Paula ---- - blockdev.c | 8 ++++++++ - qapi/block-core.json | 16 +++++++++++++++- - 2 files changed, 23 insertions(+), 1 deletion(-) - -diff --git a/blockdev.c b/blockdev.c -index c2e6402..8efc47e 100644 ---- a/blockdev.c -+++ b/blockdev.c -@@ -3314,6 +3314,8 @@ void qmp_block_commit(bool has_job_id, const char *job_id, const char *device, - bool has_backing_file, const char *backing_file, - bool has_speed, int64_t speed, - bool has_filter_node_name, const char *filter_node_name, -+ bool has_auto_finalize, bool auto_finalize, -+ bool has_auto_dismiss, bool auto_dismiss, - Error **errp) - { - BlockDriverState *bs; -@@ -3333,6 +3335,12 @@ void qmp_block_commit(bool has_job_id, const char *job_id, const char *device, - if (!has_filter_node_name) { - filter_node_name = NULL; - } -+ if (has_auto_finalize && !auto_finalize) { -+ job_flags |= JOB_MANUAL_FINALIZE; -+ } -+ if (has_auto_dismiss && !auto_dismiss) { -+ job_flags |= JOB_MANUAL_DISMISS; -+ } - - /* Important Note: - * libvirt relies on the DeviceNotFound error class in order to probe for -diff --git a/qapi/block-core.json b/qapi/block-core.json -index 5b9084a..ca7d1b3 100644 ---- a/qapi/block-core.json -+++ b/qapi/block-core.json -@@ -1498,6 +1498,19 @@ - # above @top. If this option is not given, a node name is - # autogenerated. (Since: 2.9) - # -+# @auto-finalize: When false, this job will wait in a PENDING state after it has -+# finished its work, waiting for @block-job-finalize before -+# making any block graph changes. -+# When true, this job will automatically -+# perform its abort or commit actions. -+# Defaults to true. (Since 3.1) -+# -+# @auto-dismiss: When false, this job will wait in a CONCLUDED state after it -+# has completely ceased all work, and awaits @block-job-dismiss. -+# When true, this job will automatically disappear from the query -+# list without user intervention. -+# Defaults to true. (Since 3.1) -+# - # Returns: Nothing on success - # If commit or stream is already active on this device, DeviceInUse - # If @device does not exist, DeviceNotFound -@@ -1518,7 +1531,8 @@ - { 'command': 'block-commit', - 'data': { '*job-id': 'str', 'device': 'str', '*base': 'str', '*top': 'str', - '*backing-file': 'str', '*speed': 'int', -- '*filter-node-name': 'str' } } -+ '*filter-node-name': 'str', -+ '*auto-finalize': 'bool', '*auto-dismiss': 'bool' } } - - ## - # @drive-backup: --- -1.8.3.1 - diff --git a/0050-qapi-block-mirror-expose-new-job-properties.patch b/0050-qapi-block-mirror-expose-new-job-properties.patch deleted file mode 100644 index 7f6443a..0000000 --- a/0050-qapi-block-mirror-expose-new-job-properties.patch +++ /dev/null @@ -1,144 +0,0 @@ -From 254a2b41a647cf39abaa5d94f17aef62f035d30f Mon Sep 17 00:00:00 2001 -From: John Snow -Date: Thu, 6 Sep 2018 09:02:22 -0400 -Subject: qapi/block-mirror: expose new job properties - -RH-Author: John Snow -Message-id: <20180925223431.24791-23-jsnow@redhat.com> -Patchwork-id: 82274 -O-Subject: [RHEL8/rhel qemu-kvm PATCH 22/25] qapi/block-mirror: expose new j -Bugzilla: 1632939 -RH-Acked-by: Jeffrey Cody -RH-Acked-by: Max Reitz -RH-Acked-by: Kevin Wolf - -Signed-off-by: John Snow -Reviewed-by: Max Reitz -Message-id: 20180906130225.5118-14-jsnow@redhat.com -Reviewed-by: Jeff Cody -Signed-off-by: Max Reitz -(cherry picked from commit a6b58adec28ff43c0f29ff7c95cdd5d11e87cf61) -Signed-off-by: John Snow ---- - blockdev.c | 14 ++++++++++++++ - qapi/block-core.json | 30 ++++++++++++++++++++++++++++-- - 2 files changed, 42 insertions(+), 2 deletions(-) - -diff --git a/blockdev.c b/blockdev.c -index 8efc47e..bbb3279 100644 ---- a/blockdev.c -+++ b/blockdev.c -@@ -3707,6 +3707,8 @@ static void blockdev_mirror_common(const char *job_id, BlockDriverState *bs, - bool has_filter_node_name, - const char *filter_node_name, - bool has_copy_mode, MirrorCopyMode copy_mode, -+ bool has_auto_finalize, bool auto_finalize, -+ bool has_auto_dismiss, bool auto_dismiss, - Error **errp) - { - int job_flags = JOB_DEFAULT; -@@ -3735,6 +3737,12 @@ static void blockdev_mirror_common(const char *job_id, BlockDriverState *bs, - if (!has_copy_mode) { - copy_mode = MIRROR_COPY_MODE_BACKGROUND; - } -+ if (has_auto_finalize && !auto_finalize) { -+ job_flags |= JOB_MANUAL_FINALIZE; -+ } -+ if (has_auto_dismiss && !auto_dismiss) { -+ job_flags |= JOB_MANUAL_DISMISS; -+ } - - if (granularity != 0 && (granularity < 512 || granularity > 1048576 * 64)) { - error_setg(errp, QERR_INVALID_PARAMETER_VALUE, "granularity", -@@ -3912,6 +3920,8 @@ void qmp_drive_mirror(DriveMirror *arg, Error **errp) - arg->has_unmap, arg->unmap, - false, NULL, - arg->has_copy_mode, arg->copy_mode, -+ arg->has_auto_finalize, arg->auto_finalize, -+ arg->has_auto_dismiss, arg->auto_dismiss, - &local_err); - bdrv_unref(target_bs); - error_propagate(errp, local_err); -@@ -3933,6 +3943,8 @@ void qmp_blockdev_mirror(bool has_job_id, const char *job_id, - bool has_filter_node_name, - const char *filter_node_name, - bool has_copy_mode, MirrorCopyMode copy_mode, -+ bool has_auto_finalize, bool auto_finalize, -+ bool has_auto_dismiss, bool auto_dismiss, - Error **errp) - { - BlockDriverState *bs; -@@ -3966,6 +3978,8 @@ void qmp_blockdev_mirror(bool has_job_id, const char *job_id, - true, true, - has_filter_node_name, filter_node_name, - has_copy_mode, copy_mode, -+ has_auto_finalize, auto_finalize, -+ has_auto_dismiss, auto_dismiss, - &local_err); - error_propagate(errp, local_err); - -diff --git a/qapi/block-core.json b/qapi/block-core.json -index ca7d1b3..9193d49 100644 ---- a/qapi/block-core.json -+++ b/qapi/block-core.json -@@ -1732,6 +1732,18 @@ - # @copy-mode: when to copy data to the destination; defaults to 'background' - # (Since: 3.0) - # -+# @auto-finalize: When false, this job will wait in a PENDING state after it has -+# finished its work, waiting for @block-job-finalize before -+# making any block graph changes. -+# When true, this job will automatically -+# perform its abort or commit actions. -+# Defaults to true. (Since 3.1) -+# -+# @auto-dismiss: When false, this job will wait in a CONCLUDED state after it -+# has completely ceased all work, and awaits @block-job-dismiss. -+# When true, this job will automatically disappear from the query -+# list without user intervention. -+# Defaults to true. (Since 3.1) - # Since: 1.3 - ## - { 'struct': 'DriveMirror', -@@ -1741,7 +1753,8 @@ - '*speed': 'int', '*granularity': 'uint32', - '*buf-size': 'int', '*on-source-error': 'BlockdevOnError', - '*on-target-error': 'BlockdevOnError', -- '*unmap': 'bool', '*copy-mode': 'MirrorCopyMode' } } -+ '*unmap': 'bool', '*copy-mode': 'MirrorCopyMode', -+ '*auto-finalize': 'bool', '*auto-dismiss': 'bool' } } - - ## - # @BlockDirtyBitmap: -@@ -2007,6 +2020,18 @@ - # @copy-mode: when to copy data to the destination; defaults to 'background' - # (Since: 3.0) - # -+# @auto-finalize: When false, this job will wait in a PENDING state after it has -+# finished its work, waiting for @block-job-finalize before -+# making any block graph changes. -+# When true, this job will automatically -+# perform its abort or commit actions. -+# Defaults to true. (Since 3.1) -+# -+# @auto-dismiss: When false, this job will wait in a CONCLUDED state after it -+# has completely ceased all work, and awaits @block-job-dismiss. -+# When true, this job will automatically disappear from the query -+# list without user intervention. -+# Defaults to true. (Since 3.1) - # Returns: nothing on success. - # - # Since: 2.6 -@@ -2028,7 +2053,8 @@ - '*buf-size': 'int', '*on-source-error': 'BlockdevOnError', - '*on-target-error': 'BlockdevOnError', - '*filter-node-name': 'str', -- '*copy-mode': 'MirrorCopyMode' } } -+ '*copy-mode': 'MirrorCopyMode', -+ '*auto-finalize': 'bool', '*auto-dismiss': 'bool' } } - - ## - # @block_set_io_throttle: --- -1.8.3.1 - diff --git a/0051-qapi-block-stream-expose-new-job-properties.patch b/0051-qapi-block-stream-expose-new-job-properties.patch deleted file mode 100644 index c55039a..0000000 --- a/0051-qapi-block-stream-expose-new-job-properties.patch +++ /dev/null @@ -1,108 +0,0 @@ -From 50990953696a8803f6b2b7ad71901c58c375eb8c Mon Sep 17 00:00:00 2001 -From: John Snow -Date: Tue, 25 Sep 2018 22:34:29 +0100 -Subject: qapi/block-stream: expose new job properties - -RH-Author: John Snow -Message-id: <20180925223431.24791-24-jsnow@redhat.com> -Patchwork-id: 82278 -O-Subject: [RHEL8/rhel qemu-kvm PATCH 23/25] qapi/block-stream: expose new job properties -Bugzilla: 1632939 -RH-Acked-by: Jeffrey Cody -RH-Acked-by: Max Reitz -RH-Acked-by: Kevin Wolf - -Signed-off-by: John Snow -Reviewed-by: Max Reitz -Message-id: 20180906130225.5118-15-jsnow@redhat.com -Reviewed-by: Jeff Cody -Signed-off-by: Max Reitz -(cherry picked from commit 241ca1ab78542f02e666636e0323bcfe3cb1d5e8) -Signed-off-by: John Snow -Signed-off-by: Danilo C. L. de Paula ---- - blockdev.c | 9 +++++++++ - hmp.c | 5 +++-- - qapi/block-core.json | 16 +++++++++++++++- - 3 files changed, 27 insertions(+), 3 deletions(-) - -diff --git a/blockdev.c b/blockdev.c -index bbb3279..806531d 100644 ---- a/blockdev.c -+++ b/blockdev.c -@@ -3226,6 +3226,8 @@ void qmp_block_stream(bool has_job_id, const char *job_id, const char *device, - bool has_backing_file, const char *backing_file, - bool has_speed, int64_t speed, - bool has_on_error, BlockdevOnError on_error, -+ bool has_auto_finalize, bool auto_finalize, -+ bool has_auto_dismiss, bool auto_dismiss, - Error **errp) - { - BlockDriverState *bs, *iter; -@@ -3295,6 +3297,13 @@ void qmp_block_stream(bool has_job_id, const char *job_id, const char *device, - /* backing_file string overrides base bs filename */ - base_name = has_backing_file ? backing_file : base_name; - -+ if (has_auto_finalize && !auto_finalize) { -+ job_flags |= JOB_MANUAL_FINALIZE; -+ } -+ if (has_auto_dismiss && !auto_dismiss) { -+ job_flags |= JOB_MANUAL_DISMISS; -+ } -+ - stream_start(has_job_id ? job_id : NULL, bs, base_bs, base_name, - job_flags, has_speed ? speed : 0, on_error, &local_err); - if (local_err) { -diff --git a/hmp.c b/hmp.c -index 2aafb50..e3c3ecd 100644 ---- a/hmp.c -+++ b/hmp.c -@@ -1865,8 +1865,9 @@ void hmp_block_stream(Monitor *mon, const QDict *qdict) - int64_t speed = qdict_get_try_int(qdict, "speed", 0); - - qmp_block_stream(true, device, device, base != NULL, base, false, NULL, -- false, NULL, qdict_haskey(qdict, "speed"), speed, -- true, BLOCKDEV_ON_ERROR_REPORT, &error); -+ false, NULL, qdict_haskey(qdict, "speed"), speed, true, -+ BLOCKDEV_ON_ERROR_REPORT, false, false, false, false, -+ &error); - - hmp_handle_error(mon, &error); - } -diff --git a/qapi/block-core.json b/qapi/block-core.json -index 9193d49..d1a9c3e 100644 ---- a/qapi/block-core.json -+++ b/qapi/block-core.json -@@ -2320,6 +2320,19 @@ - # 'stop' and 'enospc' can only be used if the block device - # supports io-status (see BlockInfo). Since 1.3. - # -+# @auto-finalize: When false, this job will wait in a PENDING state after it has -+# finished its work, waiting for @block-job-finalize before -+# making any block graph changes. -+# When true, this job will automatically -+# perform its abort or commit actions. -+# Defaults to true. (Since 3.1) -+# -+# @auto-dismiss: When false, this job will wait in a CONCLUDED state after it -+# has completely ceased all work, and awaits @block-job-dismiss. -+# When true, this job will automatically disappear from the query -+# list without user intervention. -+# Defaults to true. (Since 3.1) -+# - # Returns: Nothing on success. If @device does not exist, DeviceNotFound. - # - # Since: 1.1 -@@ -2335,7 +2348,8 @@ - { 'command': 'block-stream', - 'data': { '*job-id': 'str', 'device': 'str', '*base': 'str', - '*base-node': 'str', '*backing-file': 'str', '*speed': 'int', -- '*on-error': 'BlockdevOnError' } } -+ '*on-error': 'BlockdevOnError', -+ '*auto-finalize': 'bool', '*auto-dismiss': 'bool' } } - - ## - # @block-job-set-speed: --- -1.8.3.1 - diff --git a/0052-block-backup-qapi-documentation-fixup.patch b/0052-block-backup-qapi-documentation-fixup.patch deleted file mode 100644 index fb695b0..0000000 --- a/0052-block-backup-qapi-documentation-fixup.patch +++ /dev/null @@ -1,73 +0,0 @@ -From 6ecfc87059e78892c868227319a91adea909e09e Mon Sep 17 00:00:00 2001 -From: John Snow -Date: Tue, 25 Sep 2018 22:34:30 +0100 -Subject: block/backup: qapi documentation fixup - -RH-Author: John Snow -Message-id: <20180925223431.24791-25-jsnow@redhat.com> -Patchwork-id: 82284 -O-Subject: [RHEL8/rhel qemu-kvm PATCH 24/25] block/backup: qapi documentation fixup -Bugzilla: 1632939 -RH-Acked-by: Jeffrey Cody -RH-Acked-by: Max Reitz -RH-Acked-by: Kevin Wolf - -Fix documentation to match the other jobs amended for 3.1. - -Signed-off-by: John Snow -Reviewed-by: Max Reitz -Message-id: 20180906130225.5118-16-jsnow@redhat.com -Reviewed-by: Jeff Cody -Signed-off-by: Max Reitz -(cherry picked from commit dfaff2c37dfa52ab045cf87503e60ea56317230a) -Signed-off-by: John Snow -Signed-off-by: Danilo C. L. de Paula ---- - qapi/block-core.json | 18 ++++++++++-------- - 1 file changed, 10 insertions(+), 8 deletions(-) - -diff --git a/qapi/block-core.json b/qapi/block-core.json -index d1a9c3e..2953991 100644 ---- a/qapi/block-core.json -+++ b/qapi/block-core.json -@@ -1272,13 +1272,14 @@ - # a different block device than @device). - # - # @auto-finalize: When false, this job will wait in a PENDING state after it has --# finished its work, waiting for @block-job-finalize. --# When true, this job will automatically perform its abort or --# commit actions. -+# finished its work, waiting for @block-job-finalize before -+# making any block graph changes. -+# When true, this job will automatically -+# perform its abort or commit actions. - # Defaults to true. (Since 2.12) - # - # @auto-dismiss: When false, this job will wait in a CONCLUDED state after it --# has completed ceased all work, and wait for @block-job-dismiss. -+# has completely ceased all work, and awaits @block-job-dismiss. - # When true, this job will automatically disappear from the query - # list without user intervention. - # Defaults to true. (Since 2.12) -@@ -1327,13 +1328,14 @@ - # a different block device than @device). - # - # @auto-finalize: When false, this job will wait in a PENDING state after it has --# finished its work, waiting for @block-job-finalize. --# When true, this job will automatically perform its abort or --# commit actions. -+# finished its work, waiting for @block-job-finalize before -+# making any block graph changes. -+# When true, this job will automatically -+# perform its abort or commit actions. - # Defaults to true. (Since 2.12) - # - # @auto-dismiss: When false, this job will wait in a CONCLUDED state after it --# has completed ceased all work, and wait for @block-job-dismiss. -+# has completely ceased all work, and awaits @block-job-dismiss. - # When true, this job will automatically disappear from the query - # list without user intervention. - # Defaults to true. (Since 2.12) --- -1.8.3.1 - diff --git a/0053-blockdev-document-transactional-shortcomings.patch b/0053-blockdev-document-transactional-shortcomings.patch deleted file mode 100644 index 50e40af..0000000 --- a/0053-blockdev-document-transactional-shortcomings.patch +++ /dev/null @@ -1,53 +0,0 @@ -From 00a437d87c6bd8ec956b25fc0dffe8397ce475b8 Mon Sep 17 00:00:00 2001 -From: John Snow -Date: Tue, 25 Sep 2018 22:34:31 +0100 -Subject: blockdev: document transactional shortcomings - -RH-Author: John Snow -Message-id: <20180925223431.24791-26-jsnow@redhat.com> -Patchwork-id: 82286 -O-Subject: [RHEL8/rhel qemu-kvm PATCH 25/25] blockdev: document transactional shortcomings -Bugzilla: 1632939 -RH-Acked-by: Jeffrey Cody -RH-Acked-by: Max Reitz -RH-Acked-by: Kevin Wolf - -Presently only the backup job really guarantees what one would consider -transactional semantics. To guard against someone helpfully adding them -in the future, document that there are shortcomings in the model that -would need to be audited at that time. - -Signed-off-by: John Snow -Message-id: 20180906130225.5118-17-jsnow@redhat.com -Reviewed-by: Jeff Cody -Reviewed-by: Max Reitz -Signed-off-by: Max Reitz -(cherry picked from commit 66da04ddd3dcb8c61ee664b6faced132da002006) -Signed-off-by: John Snow -Signed-off-by: Danilo C. L. de Paula ---- - blockdev.c | 8 +++++++- - 1 file changed, 7 insertions(+), 1 deletion(-) - -diff --git a/blockdev.c b/blockdev.c -index 806531d..d97202a 100644 ---- a/blockdev.c -+++ b/blockdev.c -@@ -2292,7 +2292,13 @@ static const BlkActionOps actions[] = { - .instance_size = sizeof(BlockDirtyBitmapState), - .prepare = block_dirty_bitmap_disable_prepare, - .abort = block_dirty_bitmap_disable_abort, -- } -+ }, -+ /* Where are transactions for MIRROR, COMMIT and STREAM? -+ * Although these blockjobs use transaction callbacks like the backup job, -+ * these jobs do not necessarily adhere to transaction semantics. -+ * These jobs may not fully undo all of their actions on abort, nor do they -+ * necessarily work in transactions with more than one job in them. -+ */ - }; - - /** --- -1.8.3.1 - diff --git a/0054-seccomp-use-SIGSYS-signal-instead-of-killing-the-thr.patch b/0054-seccomp-use-SIGSYS-signal-instead-of-killing-the-thr.patch deleted file mode 100644 index f7a741f..0000000 --- a/0054-seccomp-use-SIGSYS-signal-instead-of-killing-the-thr.patch +++ /dev/null @@ -1,67 +0,0 @@ -From 5b9ccef27363b61223b31312062cde1210216985 Mon Sep 17 00:00:00 2001 -From: Eduardo Otubo -Date: Fri, 28 Sep 2018 07:56:36 +0100 -Subject: seccomp: use SIGSYS signal instead of killing the thread -MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit - -RH-Author: Eduardo Otubo -Message-id: <20180928075639.16746-3-otubo@redhat.com> -Patchwork-id: 82314 -O-Subject: [RHEL-8 qemu-kvm PATCH 2/5] seccomp: use SIGSYS signal instead of killing the thread -Bugzilla: 1618356 -RH-Acked-by: Dr. David Alan Gilbert -RH-Acked-by: Marc-André Lureau -RH-Acked-by: Thomas Huth - -From: Marc-André Lureau - -commit 6f2231e9b0931e1998d9ed0c509adf7aedc02db2 -Author: Marc-André Lureau -Date: Wed Aug 22 19:02:47 2018 +0200 - - seccomp: use SIGSYS signal instead of killing the thread - - The seccomp action SCMP_ACT_KILL results in immediate termination of - the thread that made the bad system call. However, qemu being - multi-threaded, it keeps running. There is no easy way for parent - process / management layer (libvirt) to know about that situation. - - Instead, the default SIGSYS handler when invoked with SCMP_ACT_TRAP - will terminate the program and core dump. - - This may not be the most secure solution, but probably better than - just killing the offending thread. SCMP_ACT_KILL_PROCESS has been - added in Linux 4.14 to improve the situation, which I propose to use - by default if available in the next patch. - - Related to: - https://bugzilla.redhat.com/show_bug.cgi?id=1594456 - - Signed-off-by: Marc-André Lureau - Reviewed-by: Daniel P. Berrangé - Acked-by: Eduardo Otubo - -Signed-off-by: Eduardo Otubo -Signed-off-by: Danilo C. L. de Paula ---- - qemu-seccomp.c | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -diff --git a/qemu-seccomp.c b/qemu-seccomp.c -index 9cd8eb9..b117a92 100644 ---- a/qemu-seccomp.c -+++ b/qemu-seccomp.c -@@ -125,7 +125,7 @@ static int seccomp_start(uint32_t seccomp_opts) - continue; - } - -- rc = seccomp_rule_add_array(ctx, SCMP_ACT_KILL, blacklist[i].num, -+ rc = seccomp_rule_add_array(ctx, SCMP_ACT_TRAP, blacklist[i].num, - blacklist[i].narg, blacklist[i].arg_cmp); - if (rc < 0) { - goto seccomp_return; --- -1.8.3.1 - diff --git a/0055-seccomp-prefer-SCMP_ACT_KILL_PROCESS-if-available.patch b/0055-seccomp-prefer-SCMP_ACT_KILL_PROCESS-if-available.patch deleted file mode 100644 index 809c9c2..0000000 --- a/0055-seccomp-prefer-SCMP_ACT_KILL_PROCESS-if-available.patch +++ /dev/null @@ -1,110 +0,0 @@ -From 80574fd1c226ca5c8555b3bb37bc3fe121bbf69f Mon Sep 17 00:00:00 2001 -From: Eduardo Otubo -Date: Fri, 28 Sep 2018 07:56:37 +0100 -Subject: seccomp: prefer SCMP_ACT_KILL_PROCESS if available -MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit - -RH-Author: Eduardo Otubo -Message-id: <20180928075639.16746-4-otubo@redhat.com> -Patchwork-id: 82315 -O-Subject: [RHEL-8 qemu-kvm PATCH 3/5] seccomp: prefer SCMP_ACT_KILL_PROCESS if available -Bugzilla: 1618356 -RH-Acked-by: Dr. David Alan Gilbert -RH-Acked-by: Marc-André Lureau -RH-Acked-by: Thomas Huth - -From: Marc-André Lureau - -commit bda08a5764d470f101fa38635d30b41179a313e1 -Author: Marc-André Lureau -Date: Wed Aug 22 19:02:48 2018 +0200 - - seccomp: prefer SCMP_ACT_KILL_PROCESS if available - - The upcoming libseccomp release should have SCMP_ACT_KILL_PROCESS - action (https://github.com/seccomp/libseccomp/issues/96). - - SCMP_ACT_KILL_PROCESS is preferable to immediately terminate the - offending process, rather than having the SIGSYS handler running. - - Use SECCOMP_GET_ACTION_AVAIL to check availability of kernel support, - as libseccomp will fallback on SCMP_ACT_KILL otherwise, and we still - prefer SCMP_ACT_TRAP. - - Signed-off-by: Marc-André Lureau - Reviewed-by: Daniel P. Berrangé - Acked-by: Eduardo Otubo - -Signed-off-by: Eduardo Otubo -Signed-off-by: Danilo C. L. de Paula ---- - qemu-seccomp.c | 31 ++++++++++++++++++++++++++++++- - 1 file changed, 30 insertions(+), 1 deletion(-) - -diff --git a/qemu-seccomp.c b/qemu-seccomp.c -index b117a92..f0c833f 100644 ---- a/qemu-seccomp.c -+++ b/qemu-seccomp.c -@@ -20,6 +20,7 @@ - #include - #include - #include "sysemu/seccomp.h" -+#include - - /* For some architectures (notably ARM) cacheflush is not supported until - * libseccomp 2.2.3, but configure enforces that we are using a more recent -@@ -107,12 +108,40 @@ static const struct QemuSeccompSyscall blacklist[] = { - { SCMP_SYS(sched_get_priority_min), QEMU_SECCOMP_SET_RESOURCECTL }, - }; - -+static inline __attribute__((unused)) int -+qemu_seccomp(unsigned int operation, unsigned int flags, void *args) -+{ -+#ifdef __NR_seccomp -+ return syscall(__NR_seccomp, operation, flags, args); -+#else -+ errno = ENOSYS; -+ return -1; -+#endif -+} -+ -+static uint32_t qemu_seccomp_get_kill_action(void) -+{ -+#if defined(SECCOMP_GET_ACTION_AVAIL) && defined(SCMP_ACT_KILL_PROCESS) && \ -+ defined(SECCOMP_RET_KILL_PROCESS) -+ { -+ uint32_t action = SECCOMP_RET_KILL_PROCESS; -+ -+ if (qemu_seccomp(SECCOMP_GET_ACTION_AVAIL, 0, &action) == 0) { -+ return SCMP_ACT_KILL_PROCESS; -+ } -+ } -+#endif -+ -+ return SCMP_ACT_TRAP; -+} -+ - - static int seccomp_start(uint32_t seccomp_opts) - { - int rc = 0; - unsigned int i = 0; - scmp_filter_ctx ctx; -+ uint32_t action = qemu_seccomp_get_kill_action(); - - ctx = seccomp_init(SCMP_ACT_ALLOW); - if (ctx == NULL) { -@@ -125,7 +154,7 @@ static int seccomp_start(uint32_t seccomp_opts) - continue; - } - -- rc = seccomp_rule_add_array(ctx, SCMP_ACT_TRAP, blacklist[i].num, -+ rc = seccomp_rule_add_array(ctx, action, blacklist[i].num, - blacklist[i].narg, blacklist[i].arg_cmp); - if (rc < 0) { - goto seccomp_return; --- -1.8.3.1 - diff --git a/0056-seccomp-set-the-seccomp-filter-to-all-threads.patch b/0056-seccomp-set-the-seccomp-filter-to-all-threads.patch deleted file mode 100644 index b1e37ad..0000000 --- a/0056-seccomp-set-the-seccomp-filter-to-all-threads.patch +++ /dev/null @@ -1,77 +0,0 @@ -From ef8bae877ca544af956f8314cdd702d1c62a9b15 Mon Sep 17 00:00:00 2001 -From: Eduardo Otubo -Date: Fri, 28 Sep 2018 07:56:39 +0100 -Subject: seccomp: set the seccomp filter to all threads -MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit - -RH-Author: Eduardo Otubo -Message-id: <20180928075639.16746-6-otubo@redhat.com> -Patchwork-id: 82316 -O-Subject: [RHEL-8 qemu-kvm PATCH 5/5] seccomp: set the seccomp filter to all threads -Bugzilla: 1618356 -RH-Acked-by: Dr. David Alan Gilbert -RH-Acked-by: Marc-André Lureau -RH-Acked-by: Thomas Huth - -From: Marc-André Lureau - -commit 70dfabeaa79ba4d7a3b699abe1a047c8012db114 -Author: Marc-André Lureau -Date: Wed Aug 22 19:02:50 2018 +0200 - - seccomp: set the seccomp filter to all threads - - When using "-seccomp on", the seccomp policy is only applied to the - main thread, the vcpu worker thread and other worker threads created - after seccomp policy is applied; the seccomp policy is not applied to - e.g. the RCU thread because it is created before the seccomp policy is - applied and SECCOMP_FILTER_FLAG_TSYNC isn't used. - - This can be verified with - for task in /proc/`pidof qemu`/task/*; do cat $task/status | grep Secc ; done - Seccomp: 2 - Seccomp: 0 - Seccomp: 0 - Seccomp: 2 - Seccomp: 2 - Seccomp: 2 - - Starting with libseccomp 2.2.0 and kernel >= 3.17, we can use - seccomp_attr_set(ctx, > SCMP_FLTATR_CTL_TSYNC, 1) to update the policy - on all threads. - - libseccomp requirement was bumped to 2.2.0 in previous patch. - libseccomp should fail to set the filter if it can't honour - SCMP_FLTATR_CTL_TSYNC (untested), and thus -sandbox will now fail on - kernel < 3.17. - - Signed-off-by: Marc-André Lureau - Acked-by: Eduardo Otubo - -Signed-off-by: Eduardo Otubo -Signed-off-by: Danilo C. L. de Paula ---- - qemu-seccomp.c | 5 +++++ - 1 file changed, 5 insertions(+) - -diff --git a/qemu-seccomp.c b/qemu-seccomp.c -index f0c833f..4729eb1 100644 ---- a/qemu-seccomp.c -+++ b/qemu-seccomp.c -@@ -149,6 +149,11 @@ static int seccomp_start(uint32_t seccomp_opts) - goto seccomp_return; - } - -+ rc = seccomp_attr_set(ctx, SCMP_FLTATR_CTL_TSYNC, 1); -+ if (rc != 0) { -+ goto seccomp_return; -+ } -+ - for (i = 0; i < ARRAY_SIZE(blacklist); i++) { - if (!(seccomp_opts & blacklist[i].set)) { - continue; --- -1.8.3.1 - diff --git a/0057-memory-cleanup-side-effects-of-memory_region_init_fo.patch b/0057-memory-cleanup-side-effects-of-memory_region_init_fo.patch deleted file mode 100644 index e866c28..0000000 --- a/0057-memory-cleanup-side-effects-of-memory_region_init_fo.patch +++ /dev/null @@ -1,185 +0,0 @@ -From da9c980b19783915f8675894b88da631f27dd34d Mon Sep 17 00:00:00 2001 -From: Igor Mammedov -Date: Fri, 5 Oct 2018 12:59:47 +0100 -Subject: memory: cleanup side effects of memory_region_init_foo() on failure - -RH-Author: Igor Mammedov -Message-id: <1538744387-84898-1-git-send-email-imammedo@redhat.com> -Patchwork-id: 82391 -O-Subject: [RHEL-8 qemu-kvm PATCH] memory: cleanup side effects of memory_region_init_foo() on failure -Bugzilla: 1600365 -RH-Acked-by: Paolo Bonzini -RH-Acked-by: Dr. David Alan Gilbert -RH-Acked-by: Pankaj Gupta -RH-Acked-by: Laszlo Ersek - -Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1600365 -Brew: https://brewweb.engineering.redhat.com/brew/taskinfo?taskID=18658506 - -if MemoryRegion intialization fails it's left in semi-initialized state, -where it's size is not 0 and attached as child to owner object. -And this leds to crash in following use-case: - (monitor) object_add memory-backend-file,id=mem1,size=99999G,mem-path=/tmp/foo,discard-data=yes - memory.c:2083: memory_region_get_ram_ptr: Assertion `mr->ram_block' failed - Aborted (core dumped) -it happens due to assumption that memory region is intialized when - memory_region_size() != 0 -and therefore it's ok to access it in - file_backend_unparent() - if (memory_region_size() != 0) - memory_region_get_ram_ptr() - -which happens when object_add fails and unparents failed backend making -file_backend_unparent() access invalid memory region. - -Fix it by making sure that memory_region_init_foo() APIs cleanup externally -visible side effects on failure (like set size to 0 and unparenting object) - -Signed-off-by: Igor Mammedov -Message-Id: <1536064777-42312-1-git-send-email-imammedo@redhat.com> -Signed-off-by: Paolo Bonzini -(cherry picked from commit 1cd3d492624da399d66c4c3e6a5eabb8f96bb0a2) -Signed-off-by: Igor Mammedov -Signed-off-by: Danilo C. L. de Paula - -Conflicts: - memory.c - due missing (cbfc01710 "memory, exec: switch file ram allocation functions to 'flags' parameters") - not related to the patch signature mismatch of - qemu_ram_alloc_from_file()/qemu_ram_alloc_from_fd() ---- - memory.c | 48 ++++++++++++++++++++++++++++++++++++++++++------ - 1 file changed, 42 insertions(+), 6 deletions(-) - -diff --git a/memory.c b/memory.c -index e9cd446..88c75d8 100644 ---- a/memory.c -+++ b/memory.c -@@ -1518,12 +1518,18 @@ void memory_region_init_ram_shared_nomigrate(MemoryRegion *mr, - bool share, - Error **errp) - { -+ Error *err = NULL; - memory_region_init(mr, owner, name, size); - mr->ram = true; - mr->terminates = true; - mr->destructor = memory_region_destructor_ram; -- mr->ram_block = qemu_ram_alloc(size, share, mr, errp); -+ mr->ram_block = qemu_ram_alloc(size, share, mr, &err); - mr->dirty_log_mask = tcg_enabled() ? (1 << DIRTY_MEMORY_CODE) : 0; -+ if (err) { -+ mr->size = int128_zero(); -+ object_unparent(OBJECT(mr)); -+ error_propagate(errp, err); -+ } - } - - void memory_region_init_resizeable_ram(MemoryRegion *mr, -@@ -1536,13 +1542,19 @@ void memory_region_init_resizeable_ram(MemoryRegion *mr, - void *host), - Error **errp) - { -+ Error *err = NULL; - memory_region_init(mr, owner, name, size); - mr->ram = true; - mr->terminates = true; - mr->destructor = memory_region_destructor_ram; - mr->ram_block = qemu_ram_alloc_resizeable(size, max_size, resized, -- mr, errp); -+ mr, &err); - mr->dirty_log_mask = tcg_enabled() ? (1 << DIRTY_MEMORY_CODE) : 0; -+ if (err) { -+ mr->size = int128_zero(); -+ object_unparent(OBJECT(mr)); -+ error_propagate(errp, err); -+ } - } - - #ifdef __linux__ -@@ -1555,13 +1567,19 @@ void memory_region_init_ram_from_file(MemoryRegion *mr, - const char *path, - Error **errp) - { -+ Error *err = NULL; - memory_region_init(mr, owner, name, size); - mr->ram = true; - mr->terminates = true; - mr->destructor = memory_region_destructor_ram; - mr->align = align; -- mr->ram_block = qemu_ram_alloc_from_file(size, mr, share, path, errp); -+ mr->ram_block = qemu_ram_alloc_from_file(size, mr, share, path, &err); - mr->dirty_log_mask = tcg_enabled() ? (1 << DIRTY_MEMORY_CODE) : 0; -+ if (err) { -+ mr->size = int128_zero(); -+ object_unparent(OBJECT(mr)); -+ error_propagate(errp, err); -+ } - } - - void memory_region_init_ram_from_fd(MemoryRegion *mr, -@@ -1572,12 +1590,18 @@ void memory_region_init_ram_from_fd(MemoryRegion *mr, - int fd, - Error **errp) - { -+ Error *err = NULL; - memory_region_init(mr, owner, name, size); - mr->ram = true; - mr->terminates = true; - mr->destructor = memory_region_destructor_ram; -- mr->ram_block = qemu_ram_alloc_from_fd(size, mr, share, fd, errp); -+ mr->ram_block = qemu_ram_alloc_from_fd(size, mr, share, fd, &err); - mr->dirty_log_mask = tcg_enabled() ? (1 << DIRTY_MEMORY_CODE) : 0; -+ if (err) { -+ mr->size = int128_zero(); -+ object_unparent(OBJECT(mr)); -+ error_propagate(errp, err); -+ } - } - #endif - -@@ -1628,13 +1652,19 @@ void memory_region_init_rom_nomigrate(MemoryRegion *mr, - uint64_t size, - Error **errp) - { -+ Error *err = NULL; - memory_region_init(mr, owner, name, size); - mr->ram = true; - mr->readonly = true; - mr->terminates = true; - mr->destructor = memory_region_destructor_ram; -- mr->ram_block = qemu_ram_alloc(size, false, mr, errp); -+ mr->ram_block = qemu_ram_alloc(size, false, mr, &err); - mr->dirty_log_mask = tcg_enabled() ? (1 << DIRTY_MEMORY_CODE) : 0; -+ if (err) { -+ mr->size = int128_zero(); -+ object_unparent(OBJECT(mr)); -+ error_propagate(errp, err); -+ } - } - - void memory_region_init_rom_device_nomigrate(MemoryRegion *mr, -@@ -1645,6 +1675,7 @@ void memory_region_init_rom_device_nomigrate(MemoryRegion *mr, - uint64_t size, - Error **errp) - { -+ Error *err = NULL; - assert(ops); - memory_region_init(mr, owner, name, size); - mr->ops = ops; -@@ -1652,7 +1683,12 @@ void memory_region_init_rom_device_nomigrate(MemoryRegion *mr, - mr->terminates = true; - mr->rom_device = true; - mr->destructor = memory_region_destructor_ram; -- mr->ram_block = qemu_ram_alloc(size, false, mr, errp); -+ mr->ram_block = qemu_ram_alloc(size, false, mr, &err); -+ if (err) { -+ mr->size = int128_zero(); -+ object_unparent(OBJECT(mr)); -+ error_propagate(errp, err); -+ } - } - - void memory_region_init_iommu(void *_iommu_mr, --- -1.8.3.1 - diff --git a/0058-mirror-Fail-gracefully-for-source-target.patch b/0058-mirror-Fail-gracefully-for-source-target.patch deleted file mode 100644 index 56c3baf..0000000 --- a/0058-mirror-Fail-gracefully-for-source-target.patch +++ /dev/null @@ -1,87 +0,0 @@ -From a96ed7a8374891516e626b797321d4be69cb071d Mon Sep 17 00:00:00 2001 -From: Kevin Wolf -Date: Wed, 10 Oct 2018 13:19:57 +0100 -Subject: mirror: Fail gracefully for source == target - -RH-Author: Kevin Wolf -Message-id: <20181010131957.23198-2-kwolf@redhat.com> -Patchwork-id: 82564 -O-Subject: [RHEL-8 qemu-kvm PATCH 1/1] mirror: Fail gracefully for source == target -Bugzilla: 1637963 -RH-Acked-by: John Snow -RH-Acked-by: Fam Zheng -RH-Acked-by: Stefan Hajnoczi - -blockdev-mirror with the same node for source and target segfaults -today: A node is in its own backing chain, so mirror_start_job() decides -that this is an active commit. When adding the intermediate nodes with -block_job_add_bdrv(), it starts the iteration through the subchain with -the backing file of source, though, so it never reaches target and -instead runs into NULL at the base. - -While we could fix that by starting with source itself, there is no -point in allowing mirroring a node into itself and I wouldn't be -surprised if this caused more problems later. - -So just check for this scenario and error out. - -Cc: qemu-stable@nongnu.org -Signed-off-by: Kevin Wolf -Reviewed-by: Eric Blake -(cherry picked from commit 86fae10c64d642256cf019e6829929fa0d259c7a) -Signed-off-by: Kevin Wolf -Signed-off-by: Danilo C. L. de Paula ---- - block/mirror.c | 5 +++++ - tests/qemu-iotests/041 | 6 ++++++ - tests/qemu-iotests/041.out | 4 ++-- - 3 files changed, 13 insertions(+), 2 deletions(-) - -diff --git a/block/mirror.c b/block/mirror.c -index 7efba77..b61f99b 100644 ---- a/block/mirror.c -+++ b/block/mirror.c -@@ -1516,6 +1516,11 @@ static void mirror_start_job(const char *job_id, BlockDriverState *bs, - buf_size = DEFAULT_MIRROR_BUF_SIZE; - } - -+ if (bs == target) { -+ error_setg(errp, "Can't mirror node into itself"); -+ return; -+ } -+ - /* In the case of active commit, add dummy driver to provide consistent - * reads on the top, while disabling it in the intermediate nodes, and make - * the backing chain writable. */ -diff --git a/tests/qemu-iotests/041 b/tests/qemu-iotests/041 -index c20ac7d..9336ab6 100755 ---- a/tests/qemu-iotests/041 -+++ b/tests/qemu-iotests/041 -@@ -234,6 +234,12 @@ class TestSingleBlockdev(TestSingleDrive): - result = self.vm.qmp("blockdev-add", **args) - self.assert_qmp(result, 'return', {}) - -+ def test_mirror_to_self(self): -+ result = self.vm.qmp(self.qmp_cmd, job_id='job0', -+ device=self.qmp_target, sync='full', -+ target=self.qmp_target) -+ self.assert_qmp(result, 'error/class', 'GenericError') -+ - test_large_cluster = None - test_image_not_found = None - test_small_buffer2 = None -diff --git a/tests/qemu-iotests/041.out b/tests/qemu-iotests/041.out -index c28b392..e071d0b 100644 ---- a/tests/qemu-iotests/041.out -+++ b/tests/qemu-iotests/041.out -@@ -1,5 +1,5 @@ --..................................................................................... -+........................................................................................ - ---------------------------------------------------------------------- --Ran 85 tests -+Ran 88 tests - - OK --- -1.8.3.1 - diff --git a/0059-commit-Add-top-node-base-node-options.patch b/0059-commit-Add-top-node-base-node-options.patch deleted file mode 100644 index c3cde82..0000000 --- a/0059-commit-Add-top-node-base-node-options.patch +++ /dev/null @@ -1,141 +0,0 @@ -From 0086e14eef7fc78bc1254ee888bd7d720d6ee5b9 Mon Sep 17 00:00:00 2001 -From: Kevin Wolf -Date: Wed, 10 Oct 2018 13:50:54 +0100 -Subject: commit: Add top-node/base-node options - -RH-Author: Kevin Wolf -Message-id: <20181010135055.3874-2-kwolf@redhat.com> -Patchwork-id: 82569 -O-Subject: [RHEL-8 qemu-kvm PATCH 1/2] commit: Add top-node/base-node options -Bugzilla: 1637970 -RH-Acked-by: John Snow -RH-Acked-by: Fam Zheng -RH-Acked-by: Stefan Hajnoczi - -The block-commit QMP command required specifying the top and base nodes -of the commit jobs using the file name of that node. While this works -in simple cases (local files with absolute paths), the file names -generated for more complicated setups can be hard to predict. - -The block-commit command has more problems than just this, so we want to -replace it altogether in the long run, but libvirt needs a reliable way -to address nodes now. So we don't want to wait for a new, cleaner -command, but just add the minimal thing needed right now. - -This adds two new options top-node and base-node to the command, which -allow specifying node names instead. They are mutually exclusive with -the old options. - -Signed-off-by: Kevin Wolf -(cherry picked from commit 3c605f4074ebeb97970eb660fb56a9cb06525923) -Signed-off-by: Kevin Wolf -Signed-off-by: Danilo C. L. de Paula ---- - blockdev.c | 32 ++++++++++++++++++++++++++++++-- - qapi/block-core.json | 24 ++++++++++++++++++------ - 2 files changed, 48 insertions(+), 8 deletions(-) - -diff --git a/blockdev.c b/blockdev.c -index d97202a..df256e6 100644 ---- a/blockdev.c -+++ b/blockdev.c -@@ -3324,7 +3324,9 @@ out: - } - - void qmp_block_commit(bool has_job_id, const char *job_id, const char *device, -+ bool has_base_node, const char *base_node, - bool has_base, const char *base, -+ bool has_top_node, const char *top_node, - bool has_top, const char *top, - bool has_backing_file, const char *backing_file, - bool has_speed, int64_t speed, -@@ -3385,7 +3387,20 @@ void qmp_block_commit(bool has_job_id, const char *job_id, const char *device, - /* default top_bs is the active layer */ - top_bs = bs; - -- if (has_top && top) { -+ if (has_top_node && has_top) { -+ error_setg(errp, "'top-node' and 'top' are mutually exclusive"); -+ goto out; -+ } else if (has_top_node) { -+ top_bs = bdrv_lookup_bs(NULL, top_node, errp); -+ if (top_bs == NULL) { -+ goto out; -+ } -+ if (!bdrv_chain_contains(bs, top_bs)) { -+ error_setg(errp, "'%s' is not in this backing file chain", -+ top_node); -+ goto out; -+ } -+ } else if (has_top && top) { - if (strcmp(bs->filename, top) != 0) { - top_bs = bdrv_find_backing_image(bs, top); - } -@@ -3398,7 +3413,20 @@ void qmp_block_commit(bool has_job_id, const char *job_id, const char *device, - - assert(bdrv_get_aio_context(top_bs) == aio_context); - -- if (has_base && base) { -+ if (has_base_node && has_base) { -+ error_setg(errp, "'base-node' and 'base' are mutually exclusive"); -+ goto out; -+ } else if (has_base_node) { -+ base_bs = bdrv_lookup_bs(NULL, base_node, errp); -+ if (base_bs == NULL) { -+ goto out; -+ } -+ if (!bdrv_chain_contains(top_bs, base_bs)) { -+ error_setg(errp, "'%s' is not in this backing file chain", -+ base_node); -+ goto out; -+ } -+ } else if (has_base && base) { - base_bs = bdrv_find_backing_image(top_bs, base); - } else { - base_bs = bdrv_find_base(top_bs); -diff --git a/qapi/block-core.json b/qapi/block-core.json -index 2953991..6f38dc0 100644 ---- a/qapi/block-core.json -+++ b/qapi/block-core.json -@@ -1457,12 +1457,23 @@ - # - # @device: the device name or node-name of a root node - # --# @base: The file name of the backing image to write data into. --# If not specified, this is the deepest backing image. -+# @base-node: The node name of the backing image to write data into. -+# If not specified, this is the deepest backing image. -+# (since: 3.1) - # --# @top: The file name of the backing image within the image chain, --# which contains the topmost data to be committed down. If --# not specified, this is the active layer. -+# @base: Same as @base-node, except that it is a file name rather than a node -+# name. This must be the exact filename string that was used to open the -+# node; other strings, even if addressing the same file, are not -+# accepted (deprecated, use @base-node instead) -+# -+# @top-node: The node name of the backing image within the image chain -+# which contains the topmost data to be committed down. If -+# not specified, this is the active layer. (since: 3.1) -+# -+# @top: Same as @top-node, except that it is a file name rather than a node -+# name. This must be the exact filename string that was used to open the -+# node; other strings, even if addressing the same file, are not -+# accepted (deprecated, use @base-node instead) - # - # @backing-file: The backing file string to write into the overlay - # image of 'top'. If 'top' is the active layer, -@@ -1531,7 +1542,8 @@ - # - ## - { 'command': 'block-commit', -- 'data': { '*job-id': 'str', 'device': 'str', '*base': 'str', '*top': 'str', -+ 'data': { '*job-id': 'str', 'device': 'str', '*base-node': 'str', -+ '*base': 'str', '*top-node': 'str', '*top': 'str', - '*backing-file': 'str', '*speed': 'int', - '*filter-node-name': 'str', - '*auto-finalize': 'bool', '*auto-dismiss': 'bool' } } --- -1.8.3.1 - diff --git a/0060-qemu-iotests-Test-commit-with-top-node-base-node.patch b/0060-qemu-iotests-Test-commit-with-top-node-base-node.patch deleted file mode 100644 index a593117..0000000 --- a/0060-qemu-iotests-Test-commit-with-top-node-base-node.patch +++ /dev/null @@ -1,127 +0,0 @@ -From bb9687c8dadef42d11f3606e68e956a7c60b2487 Mon Sep 17 00:00:00 2001 -From: Kevin Wolf -Date: Wed, 10 Oct 2018 13:50:55 +0100 -Subject: qemu-iotests: Test commit with top-node/base-node - -RH-Author: Kevin Wolf -Message-id: <20181010135055.3874-3-kwolf@redhat.com> -Patchwork-id: 82568 -O-Subject: [RHEL-8 qemu-kvm PATCH 2/2] qemu-iotests: Test commit with top-node/base-node -Bugzilla: 1637970 -RH-Acked-by: John Snow -RH-Acked-by: Fam Zheng -RH-Acked-by: Stefan Hajnoczi - -This adds some tests for block-commit with the new options top-node and -base-node (taking node names) instead of top and base (taking file -names). - -Signed-off-by: Kevin Wolf -(cherry picked from commit d57177a48fc604e5427921bf20b22ee0e6d578b3) -Signed-off-by: Kevin Wolf -Signed-off-by: Danilo C. L. de Paula ---- - tests/qemu-iotests/040 | 52 ++++++++++++++++++++++++++++++++++++++++++++-- - tests/qemu-iotests/040.out | 4 ++-- - 2 files changed, 52 insertions(+), 4 deletions(-) - -diff --git a/tests/qemu-iotests/040 b/tests/qemu-iotests/040 -index 1beb5e6..1cb1cee 100755 ---- a/tests/qemu-iotests/040 -+++ b/tests/qemu-iotests/040 -@@ -57,9 +57,12 @@ class ImageCommitTestCase(iotests.QMPTestCase): - self.assert_no_active_block_jobs() - self.vm.shutdown() - -- def run_commit_test(self, top, base, need_ready=False): -+ def run_commit_test(self, top, base, need_ready=False, node_names=False): - self.assert_no_active_block_jobs() -- result = self.vm.qmp('block-commit', device='drive0', top=top, base=base) -+ if node_names: -+ result = self.vm.qmp('block-commit', device='drive0', top_node=top, base_node=base) -+ else: -+ result = self.vm.qmp('block-commit', device='drive0', top=top, base=base) - self.assert_qmp(result, 'return', {}) - self.wait_for_complete(need_ready) - -@@ -101,6 +104,11 @@ class TestSingleDrive(ImageCommitTestCase): - self.assertEqual(-1, qemu_io('-f', 'raw', '-c', 'read -P 0xab 0 524288', backing_img).find("verification failed")) - self.assertEqual(-1, qemu_io('-f', 'raw', '-c', 'read -P 0xef 524288 524288', backing_img).find("verification failed")) - -+ def test_commit_node(self): -+ self.run_commit_test("mid", "base", node_names=True) -+ self.assertEqual(-1, qemu_io('-f', 'raw', '-c', 'read -P 0xab 0 524288', backing_img).find("verification failed")) -+ self.assertEqual(-1, qemu_io('-f', 'raw', '-c', 'read -P 0xef 524288 524288', backing_img).find("verification failed")) -+ - def test_device_not_found(self): - result = self.vm.qmp('block-commit', device='nonexistent', top='%s' % mid_img) - self.assert_qmp(result, 'error/class', 'DeviceNotFound') -@@ -123,6 +131,30 @@ class TestSingleDrive(ImageCommitTestCase): - self.assert_qmp(result, 'error/class', 'GenericError') - self.assert_qmp(result, 'error/desc', 'Base \'badfile\' not found') - -+ def test_top_node_invalid(self): -+ self.assert_no_active_block_jobs() -+ result = self.vm.qmp('block-commit', device='drive0', top_node='badfile', base_node='base') -+ self.assert_qmp(result, 'error/class', 'GenericError') -+ self.assert_qmp(result, 'error/desc', "Cannot find device= nor node_name=badfile") -+ -+ def test_base_node_invalid(self): -+ self.assert_no_active_block_jobs() -+ result = self.vm.qmp('block-commit', device='drive0', top_node='mid', base_node='badfile') -+ self.assert_qmp(result, 'error/class', 'GenericError') -+ self.assert_qmp(result, 'error/desc', "Cannot find device= nor node_name=badfile") -+ -+ def test_top_path_and_node(self): -+ self.assert_no_active_block_jobs() -+ result = self.vm.qmp('block-commit', device='drive0', top_node='mid', base_node='base', top='%s' % mid_img) -+ self.assert_qmp(result, 'error/class', 'GenericError') -+ self.assert_qmp(result, 'error/desc', "'top-node' and 'top' are mutually exclusive") -+ -+ def test_base_path_and_node(self): -+ self.assert_no_active_block_jobs() -+ result = self.vm.qmp('block-commit', device='drive0', top_node='mid', base_node='base', base='%s' % backing_img) -+ self.assert_qmp(result, 'error/class', 'GenericError') -+ self.assert_qmp(result, 'error/desc', "'base-node' and 'base' are mutually exclusive") -+ - def test_top_is_active(self): - self.run_commit_test(test_img, backing_img, need_ready=True) - self.assertEqual(-1, qemu_io('-f', 'raw', '-c', 'read -P 0xab 0 524288', backing_img).find("verification failed")) -@@ -139,6 +171,22 @@ class TestSingleDrive(ImageCommitTestCase): - self.assert_qmp(result, 'error/class', 'GenericError') - self.assert_qmp(result, 'error/desc', 'Base \'%s\' not found' % mid_img) - -+ def test_top_and_base_node_reversed(self): -+ self.assert_no_active_block_jobs() -+ result = self.vm.qmp('block-commit', device='drive0', top_node='base', base_node='top') -+ self.assert_qmp(result, 'error/class', 'GenericError') -+ self.assert_qmp(result, 'error/desc', "'top' is not in this backing file chain") -+ -+ def test_top_node_in_wrong_chain(self): -+ self.assert_no_active_block_jobs() -+ -+ result = self.vm.qmp('blockdev-add', driver='null-co', node_name='null') -+ self.assert_qmp(result, 'return', {}) -+ -+ result = self.vm.qmp('block-commit', device='drive0', top_node='null', base_node='base') -+ self.assert_qmp(result, 'error/class', 'GenericError') -+ self.assert_qmp(result, 'error/desc', "'null' is not in this backing file chain") -+ - # When the job is running on a BB that is automatically deleted on hot - # unplug, the job is cancelled when the device disappears - def test_hot_unplug(self): -diff --git a/tests/qemu-iotests/040.out b/tests/qemu-iotests/040.out -index e20a75c..802ffaa 100644 ---- a/tests/qemu-iotests/040.out -+++ b/tests/qemu-iotests/040.out -@@ -1,5 +1,5 @@ --............................. -+........................................... - ---------------------------------------------------------------------- --Ran 29 tests -+Ran 43 tests - - OK --- -1.8.3.1 - diff --git a/0061-block-for-jobs-do-not-clear-user_paused-until-after-.patch b/0061-block-for-jobs-do-not-clear-user_paused-until-after-.patch deleted file mode 100644 index f3c3385..0000000 --- a/0061-block-for-jobs-do-not-clear-user_paused-until-after-.patch +++ /dev/null @@ -1,59 +0,0 @@ -From 0908cd5291828eca03bbba206f133a37b87c8b41 Mon Sep 17 00:00:00 2001 -From: John Snow -Date: Wed, 10 Oct 2018 20:50:58 +0100 -Subject: block: for jobs, do not clear user_paused until after the resume - -RH-Author: John Snow -Message-id: <20181010205100.17689-2-jsnow@redhat.com> -Patchwork-id: 82631 -O-Subject: [RHEL8/rhel qemu-kvm PATCH 1/3] block: for jobs, do not clear user_paused until after the resume -Bugzilla: 1635583 -RH-Acked-by: Stefan Hajnoczi -RH-Acked-by: Max Reitz -RH-Acked-by: Kevin Wolf - -From: Jeff Cody - -The function job_cancel_async() will always cause an assert for blockjob -user resume. We set job->user_paused to false, and then call -job->driver->user_resume(). In the case of blockjobs, this is the -block_job_user_resume() function. - -In that function, we assert that job.user_paused is set to true. -Unfortunately, right before calling this function, it has explicitly -been set to false. - -The fix is pretty simple: set job->user_paused to false only after the -job user_resume() function has been called. - -Reviewed-by: John Snow -Reviewed-by: Eric Blake -Signed-off-by: Jeff Cody -Message-id: bb183b77d8f2dd6bd67b8da559a90ac1e74b2052.1534868459.git.jcody@redhat.com -Signed-off-by: Jeff Cody -(cherry picked from commit e321c0597c7590499bacab239d7f86e257f96bcd) -Signed-off-by: John Snow -Signed-off-by: Danilo C. L. de Paula ---- - job.c | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -diff --git a/job.c b/job.c -index 87c9aa4..bb322de 100644 ---- a/job.c -+++ b/job.c -@@ -705,10 +705,10 @@ static void job_cancel_async(Job *job, bool force) - { - if (job->user_paused) { - /* Do not call job_enter here, the caller will handle it. */ -- job->user_paused = false; - if (job->driver->user_resume) { - job->driver->user_resume(job); - } -+ job->user_paused = false; - assert(job->pause_count > 0); - job->pause_count--; - } --- -1.8.3.1 - diff --git a/0062-block-iotest-to-catch-abort-on-forced-blockjob-cance.patch b/0062-block-iotest-to-catch-abort-on-forced-blockjob-cance.patch deleted file mode 100644 index 5c30cf9..0000000 --- a/0062-block-iotest-to-catch-abort-on-forced-blockjob-cance.patch +++ /dev/null @@ -1,173 +0,0 @@ -From d26430360b5996c99c0e1dd95b4dbb48bd894944 Mon Sep 17 00:00:00 2001 -From: John Snow -Date: Wed, 10 Oct 2018 20:51:00 +0100 -Subject: block: iotest to catch abort on forced blockjob cancel - -RH-Author: John Snow -Message-id: <20181010205100.17689-4-jsnow@redhat.com> -Patchwork-id: 82632 -O-Subject: [RHEL8/rhel qemu-kvm PATCH 3/3] block: iotest to catch abort on forced blockjob cancel -Bugzilla: 1635583 -RH-Acked-by: Stefan Hajnoczi -RH-Acked-by: Max Reitz -RH-Acked-by: Kevin Wolf - -From: Jeff Cody - -Signed-off-by: Jeff Cody -Reviewed-by: John Snow -Message-id: df317f617fbe5affcf699cb8560e7b0c2e028a64.1534868459.git.jcody@redhat.com -Signed-off-by: Jeff Cody -(cherry picked from commit 26bf474ba92c76e61bea51726e22da6dfd185296) -Signed-off-by: John Snow -Signed-off-by: Danilo C. L. de Paula ---- - tests/qemu-iotests/229 | 95 ++++++++++++++++++++++++++++++++++++++++++++++ - tests/qemu-iotests/229.out | 23 +++++++++++ - tests/qemu-iotests/group | 1 + - 3 files changed, 119 insertions(+) - create mode 100755 tests/qemu-iotests/229 - create mode 100644 tests/qemu-iotests/229.out - -diff --git a/tests/qemu-iotests/229 b/tests/qemu-iotests/229 -new file mode 100755 -index 0000000..ff851ec ---- /dev/null -+++ b/tests/qemu-iotests/229 -@@ -0,0 +1,95 @@ -+#!/bin/bash -+# -+# Test for force canceling a running blockjob that is paused in -+# an error state. -+# -+# Copyright (C) 2018 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 . -+# -+ -+# creator -+owner=jcody@redhat.com -+ -+seq="$(basename $0)" -+echo "QA output created by $seq" -+ -+here="$PWD" -+status=1 # failure is the default! -+ -+_cleanup() -+{ -+ _cleanup_qemu -+ _cleanup_test_img -+ rm -f "$TEST_IMG" "$DEST_IMG" -+} -+trap "_cleanup; exit \$status" 0 1 2 3 15 -+ -+# get standard environment, filters and checks -+. ./common.rc -+. ./common.filter -+. ./common.qemu -+ -+# Needs backing file and backing format support -+_supported_fmt qcow2 qed -+_supported_proto file -+_supported_os Linux -+ -+ -+DEST_IMG="$TEST_DIR/d.$IMGFMT" -+TEST_IMG="$TEST_DIR/b.$IMGFMT" -+ -+_make_test_img 2M -+ -+# destination for mirror will be too small, causing error -+TEST_IMG=$DEST_IMG _make_test_img 1M -+ -+$QEMU_IO -c 'write 0 2M' "$TEST_IMG" | _filter_qemu_io -+ -+_launch_qemu -drive id=testdisk,file="$TEST_IMG",format="$IMGFMT" -+ -+_send_qemu_cmd $QEMU_HANDLE \ -+ "{'execute': 'qmp_capabilities'}" \ -+ 'return' -+ -+echo -+echo '=== Starting drive-mirror, causing error & stop ===' -+echo -+ -+_send_qemu_cmd $QEMU_HANDLE \ -+ "{'execute': 'drive-mirror', -+ 'arguments': {'device': 'testdisk', -+ 'mode': 'absolute-paths', -+ 'format': '$IMGFMT', -+ 'target': '$DEST_IMG', -+ 'sync': 'full', -+ 'mode': 'existing', -+ 'on-source-error': 'stop', -+ 'on-target-error': 'stop' }}" \ -+ "JOB_STATUS_CHANGE.*pause" -+ -+echo -+echo '=== Force cancel job paused in error state ===' -+echo -+ -+success_or_failure="y" _send_qemu_cmd $QEMU_HANDLE \ -+ "{'execute': 'block-job-cancel', -+ 'arguments': { 'device': 'testdisk', -+ 'force': true}}" \ -+ "BLOCK_JOB_CANCELLED" "Assertion" -+ -+# success, all done -+echo "*** done" -+rm -f $seq.full -+status=0 -diff --git a/tests/qemu-iotests/229.out b/tests/qemu-iotests/229.out -new file mode 100644 -index 0000000..4c41128 ---- /dev/null -+++ b/tests/qemu-iotests/229.out -@@ -0,0 +1,23 @@ -+QA output created by 229 -+Formatting 'TEST_DIR/b.IMGFMT', fmt=IMGFMT size=2097152 -+Formatting 'TEST_DIR/d.IMGFMT', fmt=IMGFMT size=1048576 -+wrote 2097152/2097152 bytes at offset 0 -+2 MiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) -+{"return": {}} -+ -+=== Starting drive-mirror, causing error & stop === -+ -+{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "JOB_STATUS_CHANGE", "data": {"status": "created", "id": "testdisk"}} -+{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "JOB_STATUS_CHANGE", "data": {"status": "running", "id": "testdisk"}} -+{"return": {}} -+{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "BLOCK_JOB_ERROR", "data": {"device": "testdisk", "operation": "write", "action": "stop"}} -+{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "JOB_STATUS_CHANGE", "data": {"status": "paused", "id": "testdisk"}} -+ -+=== Force cancel job paused in error state === -+ -+{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "JOB_STATUS_CHANGE", "data": {"status": "running", "id": "testdisk"}} -+{"return": {}} -+{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "BLOCK_JOB_ERROR", "data": {"device": "testdisk", "operation": "write", "action": "stop"}} -+{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "JOB_STATUS_CHANGE", "data": {"status": "aborting", "id": "testdisk"}} -+{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "BLOCK_JOB_CANCELLED", "data": {"device": "testdisk", "len": 2097152, "offset": 1048576, "speed": 0, "type": "mirror"}} -+*** done -diff --git a/tests/qemu-iotests/group b/tests/qemu-iotests/group -index f1059f6..23ab4d3 100644 ---- a/tests/qemu-iotests/group -+++ b/tests/qemu-iotests/group -@@ -225,3 +225,4 @@ - 225 rw auto quick - 226 auto quick - 227 auto quick -+229 auto quick --- -1.8.3.1 - diff --git a/0063-Revert-hw-acpi-build-build-SRAT-memory-affinity-stru.patch b/0063-Revert-hw-acpi-build-build-SRAT-memory-affinity-stru.patch deleted file mode 100644 index 9776c47..0000000 --- a/0063-Revert-hw-acpi-build-build-SRAT-memory-affinity-stru.patch +++ /dev/null @@ -1,117 +0,0 @@ -From c0bedad9bd133c14096eeeae49877fbb9eb179c3 Mon Sep 17 00:00:00 2001 -From: Igor Mammedov -Date: Thu, 4 Oct 2018 10:31:31 +0100 -Subject: Revert "hw/acpi-build: build SRAT memory affinity structures for DIMM - devices" - -RH-Author: Igor Mammedov -Message-id: <1538649091-70517-1-git-send-email-imammedo@redhat.com> -Patchwork-id: 82373 -O-Subject: [RHEL8/virt-8.0.0 qemu-kvm PATCH] Revert "hw/acpi-build: build SRAT memory affinity structures for DIMM devices" -Bugzilla: 1609235 -RH-Acked-by: Laszlo Ersek -RH-Acked-by: Michael S. Tsirkin -RH-Acked-by: Thomas Huth - -Since upstream commits - (0efd7e108 "pc: acpi: fix memory hotplug regression by reducing stub SRAT entry size") - (dbb6da8ba7 "pc: acpi: revert back to 1 SRAT entry for hotpluggable area") -hasn't been backported to RHEL8, it's sufficient to revert commit - (848a1cc1e8 "hw/acpi-build: build SRAT memory affinity structures for DIMM devices") -for the result to match the current upstream state and fix the bug. - -Signed-off-by: Igor Mammedov -Signed-off-by: Danilo C. L. de Paula - -Rebase notes (3.0.0): -- Replace hotplug_memory with device_memory in PCMachineState ---- - hw/i386/acpi-build.c | 65 ++++------------------------------------------------ - 1 file changed, 4 insertions(+), 61 deletions(-) - -diff --git a/hw/i386/acpi-build.c b/hw/i386/acpi-build.c -index be9bdb5..f95516c 100644 ---- a/hw/i386/acpi-build.c -+++ b/hw/i386/acpi-build.c -@@ -2254,64 +2254,6 @@ build_tpm2(GArray *table_data, BIOSLinker *linker, GArray *tcpalog) - #define HOLE_640K_START (640 * KiB) - #define HOLE_640K_END (1 * MiB) - --static void build_srat_hotpluggable_memory(GArray *table_data, uint64_t base, -- uint64_t len, int default_node) --{ -- MemoryDeviceInfoList *info_list = qmp_memory_device_list(); -- MemoryDeviceInfoList *info; -- MemoryDeviceInfo *mi; -- PCDIMMDeviceInfo *di; -- uint64_t end = base + len, cur, size; -- bool is_nvdimm; -- AcpiSratMemoryAffinity *numamem; -- MemoryAffinityFlags flags; -- -- for (cur = base, info = info_list; -- cur < end; -- cur += size, info = info->next) { -- numamem = acpi_data_push(table_data, sizeof *numamem); -- -- if (!info) { -- /* -- * Entry is required for Windows to enable memory hotplug in OS -- * and for Linux to enable SWIOTLB when booted with less than -- * 4G of RAM. Windows works better if the entry sets proximity -- * to the highest NUMA node in the machine at the end of the -- * reserved space. -- * Memory devices may override proximity set by this entry, -- * providing _PXM method if necessary. -- */ -- build_srat_memory(numamem, end - 1, 1, default_node, -- MEM_AFFINITY_HOTPLUGGABLE | MEM_AFFINITY_ENABLED); -- break; -- } -- -- mi = info->value; -- is_nvdimm = (mi->type == MEMORY_DEVICE_INFO_KIND_NVDIMM); -- di = !is_nvdimm ? mi->u.dimm.data : mi->u.nvdimm.data; -- -- if (cur < di->addr) { -- build_srat_memory(numamem, cur, di->addr - cur, default_node, -- MEM_AFFINITY_HOTPLUGGABLE | MEM_AFFINITY_ENABLED); -- numamem = acpi_data_push(table_data, sizeof *numamem); -- } -- -- size = di->size; -- -- flags = MEM_AFFINITY_ENABLED; -- if (di->hotpluggable) { -- flags |= MEM_AFFINITY_HOTPLUGGABLE; -- } -- if (is_nvdimm) { -- flags |= MEM_AFFINITY_NON_VOLATILE; -- } -- -- build_srat_memory(numamem, di->addr, size, di->node, flags); -- } -- -- qapi_free_MemoryDeviceInfoList(info_list); --} -- - static void - build_srat(GArray *table_data, BIOSLinker *linker, MachineState *machine) - { -@@ -2418,9 +2360,10 @@ build_srat(GArray *table_data, BIOSLinker *linker, MachineState *machine) - } - - if (hotplugabble_address_space_size) { -- build_srat_hotpluggable_memory(table_data, machine->device_memory->base, -- hotplugabble_address_space_size, -- pcms->numa_nodes - 1); -+ numamem = acpi_data_push(table_data, sizeof *numamem); -+ build_srat_memory(numamem, machine->device_memory->base, -+ hotplugabble_address_space_size, pcms->numa_nodes - 1, -+ MEM_AFFINITY_HOTPLUGGABLE | MEM_AFFINITY_ENABLED); - } - - build_header(linker, table_data, --- -1.8.3.1 - diff --git a/0064-aio-posix-Don-t-count-ctx-notifier-as-progress-when-.patch b/0064-aio-posix-Don-t-count-ctx-notifier-as-progress-when-.patch deleted file mode 100644 index 3fc21dd..0000000 --- a/0064-aio-posix-Don-t-count-ctx-notifier-as-progress-when-.patch +++ /dev/null @@ -1,48 +0,0 @@ -From c476cf6c76298803fe896eb7c597085af3b73c12 Mon Sep 17 00:00:00 2001 -From: Fam Zheng -Date: Tue, 9 Oct 2018 08:16:47 +0100 -Subject: aio-posix: Don't count ctx->notifier as progress when polling - -RH-Author: Fam Zheng -Message-id: <20181009081651.15463-2-famz@redhat.com> -Patchwork-id: 82454 -O-Subject: [RHEL8/rhel qemu-kvm PATCH 1/5] aio-posix: Don't count ctx->notifier as progress when polling -Bugzilla: 1623085 -RH-Acked-by: Thomas Huth -RH-Acked-by: Stefan Hajnoczi -RH-Acked-by: Danilo de Paula - -BZ: 1623085 - -The same logic exists in fd polling. This change is especially important -to avoid busy loop once we limit aio_notify_accept() to blocking -aio_poll(). - -Cc: qemu-stable@nongnu.org -Signed-off-by: Fam Zheng -Message-Id: <20180809132259.18402-2-famz@redhat.com> -Signed-off-by: Fam Zheng -(cherry picked from commit 70232b5253a3c4e03ed1ac47ef9246a8ac66c6fa) -Signed-off-by: Fam Zheng -Signed-off-by: Danilo C. L. de Paula ---- - util/aio-posix.c | 3 ++- - 1 file changed, 2 insertions(+), 1 deletion(-) - -diff --git a/util/aio-posix.c b/util/aio-posix.c -index 118bf57..b5c7f46 100644 ---- a/util/aio-posix.c -+++ b/util/aio-posix.c -@@ -494,7 +494,8 @@ static bool run_poll_handlers_once(AioContext *ctx) - QLIST_FOREACH_RCU(node, &ctx->aio_handlers, node) { - if (!node->deleted && node->io_poll && - aio_node_check(ctx, node->is_external) && -- node->io_poll(node->opaque)) { -+ node->io_poll(node->opaque) && -+ node->opaque != &ctx->notifier) { - progress = true; - } - --- -1.8.3.1 - diff --git a/0065-aio-Do-aio_notify_accept-only-during-blocking-aio_po.patch b/0065-aio-Do-aio_notify_accept-only-during-blocking-aio_po.patch deleted file mode 100644 index 7b815ae..0000000 --- a/0065-aio-Do-aio_notify_accept-only-during-blocking-aio_po.patch +++ /dev/null @@ -1,124 +0,0 @@ -From 1580d01151ceea428dc9a25dd3d83990a594e286 Mon Sep 17 00:00:00 2001 -From: Fam Zheng -Date: Tue, 9 Oct 2018 08:16:48 +0100 -Subject: aio: Do aio_notify_accept only during blocking aio_poll - -RH-Author: Fam Zheng -Message-id: <20181009081651.15463-3-famz@redhat.com> -Patchwork-id: 82450 -O-Subject: [RHEL8/rhel qemu-kvm PATCH 2/5] aio: Do aio_notify_accept only during blocking aio_poll -Bugzilla: 1623085 -RH-Acked-by: Thomas Huth -RH-Acked-by: Stefan Hajnoczi -RH-Acked-by: Danilo de Paula - -BZ: 1623085 - -An aio_notify() pairs with an aio_notify_accept(). The former should -happen in the main thread or a vCPU thread, and the latter should be -done in the IOThread. - -There is one rare case that the main thread or vCPU thread may "steal" -the aio_notify() event just raised by itself, in bdrv_set_aio_context() -[1]. The sequence is like this: - - main thread IO Thread - =============================================================== - bdrv_drained_begin() - aio_disable_external(ctx) - aio_poll(ctx, true) - ctx->notify_me += 2 - ... - bdrv_drained_end() - ... - aio_notify() - ... - bdrv_set_aio_context() - aio_poll(ctx, false) -[1] aio_notify_accept(ctx) - ppoll() /* Hang! */ - -[1] is problematic. It will clear the ctx->notifier event so that -the blocked ppoll() will not return. - -(For the curious, this bug was noticed when booting a number of VMs -simultaneously in RHV. One or two of the VMs will hit this race -condition, making the VIRTIO device unresponsive to I/O commands. When -it hangs, Seabios is busy waiting for a read request to complete (read -MBR), right after initializing the virtio-blk-pci device, using 100% -guest CPU. See also https://bugzilla.redhat.com/show_bug.cgi?id=1562750 -for the original bug analysis.) - -aio_notify() only injects an event when ctx->notify_me is set, -correspondingly aio_notify_accept() is only useful when ctx->notify_me -_was_ set. Move the call to it into the "blocking" branch. This will -effectively skip [1] and fix the hang. - -Furthermore, blocking aio_poll is only allowed on home thread -(in_aio_context_home_thread), because otherwise two blocking -aio_poll()'s can steal each other's ctx->notifier event and cause -hanging just like described above. - -Cc: qemu-stable@nongnu.org -Suggested-by: Paolo Bonzini -Signed-off-by: Fam Zheng -Message-Id: <20180809132259.18402-3-famz@redhat.com> -Signed-off-by: Fam Zheng -(cherry picked from commit b37548fcd1b8ac2e88e185a395bef851f3fc4e65) -Signed-off-by: Fam Zheng -Signed-off-by: Danilo C. L. de Paula ---- - util/aio-posix.c | 4 ++-- - util/aio-win32.c | 3 ++- - 2 files changed, 4 insertions(+), 3 deletions(-) - -diff --git a/util/aio-posix.c b/util/aio-posix.c -index b5c7f46..b5c609b 100644 ---- a/util/aio-posix.c -+++ b/util/aio-posix.c -@@ -591,6 +591,7 @@ bool aio_poll(AioContext *ctx, bool blocking) - * so disable the optimization now. - */ - if (blocking) { -+ assert(in_aio_context_home_thread(ctx)); - atomic_add(&ctx->notify_me, 2); - } - -@@ -633,6 +634,7 @@ bool aio_poll(AioContext *ctx, bool blocking) - - if (blocking) { - atomic_sub(&ctx->notify_me, 2); -+ aio_notify_accept(ctx); - } - - /* Adjust polling time */ -@@ -676,8 +678,6 @@ bool aio_poll(AioContext *ctx, bool blocking) - } - } - -- aio_notify_accept(ctx); -- - /* if we have any readable fds, dispatch event */ - if (ret > 0) { - for (i = 0; i < npfd; i++) { -diff --git a/util/aio-win32.c b/util/aio-win32.c -index e676a8d..c58957c 100644 ---- a/util/aio-win32.c -+++ b/util/aio-win32.c -@@ -373,11 +373,12 @@ bool aio_poll(AioContext *ctx, bool blocking) - ret = WaitForMultipleObjects(count, events, FALSE, timeout); - if (blocking) { - assert(first); -+ assert(in_aio_context_home_thread(ctx)); - atomic_sub(&ctx->notify_me, 2); -+ aio_notify_accept(ctx); - } - - if (first) { -- aio_notify_accept(ctx); - progress |= aio_bh_poll(ctx); - first = false; - } --- -1.8.3.1 - diff --git a/0066-aio-posix-fix-concurrent-access-to-poll_disable_cnt.patch b/0066-aio-posix-fix-concurrent-access-to-poll_disable_cnt.patch deleted file mode 100644 index b1c677f..0000000 --- a/0066-aio-posix-fix-concurrent-access-to-poll_disable_cnt.patch +++ /dev/null @@ -1,122 +0,0 @@ -From 07bbb6779b2a628b3e83b5474be550009aae034d Mon Sep 17 00:00:00 2001 -From: Fam Zheng -Date: Tue, 9 Oct 2018 08:16:49 +0100 -Subject: aio-posix: fix concurrent access to poll_disable_cnt - -RH-Author: Fam Zheng -Message-id: <20181009081651.15463-4-famz@redhat.com> -Patchwork-id: 82452 -O-Subject: [RHEL8/rhel qemu-kvm PATCH 3/5] aio-posix: fix concurrent access to poll_disable_cnt -Bugzilla: 1632622 -RH-Acked-by: Thomas Huth -RH-Acked-by: Stefan Hajnoczi -RH-Acked-by: Danilo de Paula - -From: Paolo Bonzini - -BZ: 1632622 - -It is valid for an aio_set_fd_handler to happen concurrently with -aio_poll. In that case, poll_disable_cnt can change under the heels -of aio_poll, and the assertion on poll_disable_cnt can fail in -run_poll_handlers. - -Therefore, this patch simply checks the counter on every polling -iteration. There are no particular needs for ordering, since the -polling loop is terminated anyway by aio_notify at the end of -aio_set_fd_handler. - -Signed-off-by: Paolo Bonzini -Message-Id: <20180912171040.1732-2-pbonzini@redhat.com> -Reviewed-by: Fam Zheng -Signed-off-by: Fam Zheng -(cherry picked from commit d7be5dd19c0df7f76e1b42f0c2cbbabefa1974cb) -Signed-off-by: Fam Zheng -Signed-off-by: Danilo C. L. de Paula ---- - util/aio-posix.c | 26 +++++++++++++++----------- - 1 file changed, 15 insertions(+), 11 deletions(-) - -diff --git a/util/aio-posix.c b/util/aio-posix.c -index b5c609b..9189033 100644 ---- a/util/aio-posix.c -+++ b/util/aio-posix.c -@@ -211,6 +211,7 @@ void aio_set_fd_handler(AioContext *ctx, - AioHandler *node; - bool is_new = false; - bool deleted = false; -+ int poll_disable_change; - - qemu_lockcnt_lock(&ctx->list_lock); - -@@ -244,11 +245,9 @@ void aio_set_fd_handler(AioContext *ctx, - QLIST_REMOVE(node, node); - deleted = true; - } -- -- if (!node->io_poll) { -- ctx->poll_disable_cnt--; -- } -+ poll_disable_change = -!node->io_poll; - } else { -+ poll_disable_change = !io_poll - (node && !node->io_poll); - if (node == NULL) { - /* Alloc and insert if it's not already there */ - node = g_new0(AioHandler, 1); -@@ -257,10 +256,6 @@ void aio_set_fd_handler(AioContext *ctx, - - g_source_add_poll(&ctx->source, &node->pfd); - is_new = true; -- -- ctx->poll_disable_cnt += !io_poll; -- } else { -- ctx->poll_disable_cnt += !io_poll - !node->io_poll; - } - - /* Update handler with latest information */ -@@ -274,6 +269,15 @@ void aio_set_fd_handler(AioContext *ctx, - node->pfd.events |= (io_write ? G_IO_OUT | G_IO_ERR : 0); - } - -+ /* No need to order poll_disable_cnt writes against other updates; -+ * the counter is only used to avoid wasting time and latency on -+ * iterated polling when the system call will be ultimately necessary. -+ * Changing handlers is a rare event, and a little wasted polling until -+ * the aio_notify below is not an issue. -+ */ -+ atomic_set(&ctx->poll_disable_cnt, -+ atomic_read(&ctx->poll_disable_cnt) + poll_disable_change); -+ - aio_epoll_update(ctx, node, is_new); - qemu_lockcnt_unlock(&ctx->list_lock); - aio_notify(ctx); -@@ -525,7 +529,6 @@ static bool run_poll_handlers(AioContext *ctx, int64_t max_ns) - - assert(ctx->notify_me); - assert(qemu_lockcnt_count(&ctx->list_lock) > 0); -- assert(ctx->poll_disable_cnt == 0); - - trace_run_poll_handlers_begin(ctx, max_ns); - -@@ -533,7 +536,8 @@ static bool run_poll_handlers(AioContext *ctx, int64_t max_ns) - - do { - progress = run_poll_handlers_once(ctx); -- } while (!progress && qemu_clock_get_ns(QEMU_CLOCK_REALTIME) < end_time); -+ } while (!progress && qemu_clock_get_ns(QEMU_CLOCK_REALTIME) < end_time -+ && !atomic_read(&ctx->poll_disable_cnt)); - - trace_run_poll_handlers_end(ctx, progress); - -@@ -552,7 +556,7 @@ static bool run_poll_handlers(AioContext *ctx, int64_t max_ns) - */ - static bool try_poll_mode(AioContext *ctx, bool blocking) - { -- if (blocking && ctx->poll_max_ns && ctx->poll_disable_cnt == 0) { -+ if (blocking && ctx->poll_max_ns && !atomic_read(&ctx->poll_disable_cnt)) { - /* See qemu_soonest_timeout() uint64_t hack */ - int64_t max_ns = MIN((uint64_t)aio_compute_timeout(ctx), - (uint64_t)ctx->poll_ns); --- -1.8.3.1 - diff --git a/0067-aio-posix-compute-timeout-before-polling.patch b/0067-aio-posix-compute-timeout-before-polling.patch deleted file mode 100644 index 3a5c4fe..0000000 --- a/0067-aio-posix-compute-timeout-before-polling.patch +++ /dev/null @@ -1,186 +0,0 @@ -From 44bb29739a1cfa471447d6c5880e7527399b146f Mon Sep 17 00:00:00 2001 -From: Fam Zheng -Date: Tue, 9 Oct 2018 08:16:50 +0100 -Subject: aio-posix: compute timeout before polling - -RH-Author: Fam Zheng -Message-id: <20181009081651.15463-5-famz@redhat.com> -Patchwork-id: 82453 -O-Subject: [RHEL8/rhel qemu-kvm PATCH 4/5] aio-posix: compute timeout before polling -Bugzilla: 1632622 -RH-Acked-by: Thomas Huth -RH-Acked-by: Stefan Hajnoczi -RH-Acked-by: Danilo de Paula - -From: Paolo Bonzini - -BZ: 1632622 - -This is a preparation for the next patch, and also a very small -optimization. Compute the timeout only once, before invoking -try_poll_mode, and adjust it in run_poll_handlers. The adjustment -is the polling time when polling fails, or zero (non-blocking) if -polling succeeds. - -Fixes: 70232b5253a3c4e03ed1ac47ef9246a8ac66c6fa -Signed-off-by: Paolo Bonzini -Message-Id: <20180912171040.1732-3-pbonzini@redhat.com> -Reviewed-by: Fam Zheng -Signed-off-by: Fam Zheng -(cherry picked from commit e30cffa04d52e35996569f1cfac111be19576bde) -Signed-off-by: Fam Zheng -Signed-off-by: Danilo C. L. de Paula ---- - util/aio-posix.c | 59 ++++++++++++++++++++++++++++++++----------------------- - util/trace-events | 4 ++-- - 2 files changed, 36 insertions(+), 27 deletions(-) - -diff --git a/util/aio-posix.c b/util/aio-posix.c -index 9189033..bb862e1 100644 ---- a/util/aio-posix.c -+++ b/util/aio-posix.c -@@ -490,7 +490,7 @@ static void add_pollfd(AioHandler *node) - npfd++; - } - --static bool run_poll_handlers_once(AioContext *ctx) -+static bool run_poll_handlers_once(AioContext *ctx, int64_t *timeout) - { - bool progress = false; - AioHandler *node; -@@ -500,6 +500,7 @@ static bool run_poll_handlers_once(AioContext *ctx) - aio_node_check(ctx, node->is_external) && - node->io_poll(node->opaque) && - node->opaque != &ctx->notifier) { -+ *timeout = 0; - progress = true; - } - -@@ -522,31 +523,38 @@ static bool run_poll_handlers_once(AioContext *ctx) - * - * Returns: true if progress was made, false otherwise - */ --static bool run_poll_handlers(AioContext *ctx, int64_t max_ns) -+static bool run_poll_handlers(AioContext *ctx, int64_t max_ns, int64_t *timeout) - { - bool progress; -- int64_t end_time; -+ int64_t start_time, elapsed_time; - - assert(ctx->notify_me); - assert(qemu_lockcnt_count(&ctx->list_lock) > 0); - -- trace_run_poll_handlers_begin(ctx, max_ns); -- -- end_time = qemu_clock_get_ns(QEMU_CLOCK_REALTIME) + max_ns; -+ trace_run_poll_handlers_begin(ctx, max_ns, *timeout); - -+ start_time = qemu_clock_get_ns(QEMU_CLOCK_REALTIME); - do { -- progress = run_poll_handlers_once(ctx); -- } while (!progress && qemu_clock_get_ns(QEMU_CLOCK_REALTIME) < end_time -+ progress = run_poll_handlers_once(ctx, timeout); -+ elapsed_time = qemu_clock_get_ns(QEMU_CLOCK_REALTIME) - start_time; -+ } while (!progress && elapsed_time < max_ns - && !atomic_read(&ctx->poll_disable_cnt)); - -- trace_run_poll_handlers_end(ctx, progress); -+ /* If time has passed with no successful polling, adjust *timeout to -+ * keep the same ending time. -+ */ -+ if (*timeout != -1) { -+ *timeout -= MIN(*timeout, elapsed_time); -+ } - -+ trace_run_poll_handlers_end(ctx, progress, *timeout); - return progress; - } - - /* try_poll_mode: - * @ctx: the AioContext -- * @blocking: busy polling is only attempted when blocking is true -+ * @timeout: timeout for blocking wait, computed by the caller and updated if -+ * polling succeeds. - * - * ctx->notify_me must be non-zero so this function can detect aio_notify(). - * -@@ -554,19 +562,16 @@ static bool run_poll_handlers(AioContext *ctx, int64_t max_ns) - * - * Returns: true if progress was made, false otherwise - */ --static bool try_poll_mode(AioContext *ctx, bool blocking) -+static bool try_poll_mode(AioContext *ctx, int64_t *timeout) - { -- if (blocking && ctx->poll_max_ns && !atomic_read(&ctx->poll_disable_cnt)) { -- /* See qemu_soonest_timeout() uint64_t hack */ -- int64_t max_ns = MIN((uint64_t)aio_compute_timeout(ctx), -- (uint64_t)ctx->poll_ns); -+ /* See qemu_soonest_timeout() uint64_t hack */ -+ int64_t max_ns = MIN((uint64_t)*timeout, (uint64_t)ctx->poll_ns); - -- if (max_ns) { -- poll_set_started(ctx, true); -+ if (max_ns && !atomic_read(&ctx->poll_disable_cnt)) { -+ poll_set_started(ctx, true); - -- if (run_poll_handlers(ctx, max_ns)) { -- return true; -- } -+ if (run_poll_handlers(ctx, max_ns, timeout)) { -+ return true; - } - } - -@@ -575,7 +580,7 @@ static bool try_poll_mode(AioContext *ctx, bool blocking) - /* Even if we don't run busy polling, try polling once in case it can make - * progress and the caller will be able to avoid ppoll(2)/epoll_wait(2). - */ -- return run_poll_handlers_once(ctx); -+ return run_poll_handlers_once(ctx, timeout); - } - - bool aio_poll(AioContext *ctx, bool blocking) -@@ -605,8 +610,14 @@ bool aio_poll(AioContext *ctx, bool blocking) - start = qemu_clock_get_ns(QEMU_CLOCK_REALTIME); - } - -- progress = try_poll_mode(ctx, blocking); -- if (!progress) { -+ timeout = blocking ? aio_compute_timeout(ctx) : 0; -+ progress = try_poll_mode(ctx, &timeout); -+ assert(!(timeout && progress)); -+ -+ /* If polling is allowed, non-blocking aio_poll does not need the -+ * system call---a single round of run_poll_handlers_once suffices. -+ */ -+ if (timeout || atomic_read(&ctx->poll_disable_cnt)) { - assert(npfd == 0); - - /* fill pollfds */ -@@ -620,8 +631,6 @@ bool aio_poll(AioContext *ctx, bool blocking) - } - } - -- timeout = blocking ? aio_compute_timeout(ctx) : 0; -- - /* wait until next event */ - if (aio_epoll_check_poll(ctx, pollfds, npfd, timeout)) { - AioHandler epoll_handler; -diff --git a/util/trace-events b/util/trace-events -index 4822434..79569b7 100644 ---- a/util/trace-events -+++ b/util/trace-events -@@ -1,8 +1,8 @@ - # See docs/devel/tracing.txt for syntax documentation. - - # util/aio-posix.c --run_poll_handlers_begin(void *ctx, int64_t max_ns) "ctx %p max_ns %"PRId64 --run_poll_handlers_end(void *ctx, bool progress) "ctx %p progress %d" -+run_poll_handlers_begin(void *ctx, int64_t max_ns, int64_t timeout) "ctx %p max_ns %"PRId64 " timeout %"PRId64 -+run_poll_handlers_end(void *ctx, bool progress, int64_t timeout) "ctx %p progress %d new timeout %"PRId64 - poll_shrink(void *ctx, int64_t old, int64_t new) "ctx %p old %"PRId64" new %"PRId64 - poll_grow(void *ctx, int64_t old, int64_t new) "ctx %p old %"PRId64" new %"PRId64 - --- -1.8.3.1 - diff --git a/0068-aio-posix-do-skip-system-call-if-ctx-notifier-pollin.patch b/0068-aio-posix-do-skip-system-call-if-ctx-notifier-pollin.patch deleted file mode 100644 index cf50d42..0000000 --- a/0068-aio-posix-do-skip-system-call-if-ctx-notifier-pollin.patch +++ /dev/null @@ -1,64 +0,0 @@ -From ea1db6ad3fcbcda2068d3aeb21c384d42004aaaf Mon Sep 17 00:00:00 2001 -From: Fam Zheng -Date: Tue, 9 Oct 2018 08:16:51 +0100 -Subject: aio-posix: do skip system call if ctx->notifier polling succeeds - -RH-Author: Fam Zheng -Message-id: <20181009081651.15463-6-famz@redhat.com> -Patchwork-id: 82449 -O-Subject: [RHEL8/rhel qemu-kvm PATCH 5/5] aio-posix: do skip system call if ctx->notifier polling succeeds -Bugzilla: 1632622 -RH-Acked-by: Thomas Huth -RH-Acked-by: Stefan Hajnoczi -RH-Acked-by: Danilo de Paula - -From: Paolo Bonzini - -BZ: 1632622 - -Commit 70232b5253 ("aio-posix: Don't count ctx->notifier as progress when -2018-08-15), by not reporting progress, causes aio_poll to execute the -system call when polling succeeds because of ctx->notifier. This introduces -latency before the call to aio_bh_poll() and negates the advantages of -polling, unfortunately. - -The fix builds on the previous patch, separating the effect of polling on -the timeout from the progress reported to aio_poll(). ctx->notifier -does zero the timeout, causing the caller to skip the system call, -but it does not report progress, so that the bug fix of commit 70232b5253 -still stands. - -Fixes: 70232b5253a3c4e03ed1ac47ef9246a8ac66c6fa -Signed-off-by: Paolo Bonzini -Message-Id: <20180912171040.1732-4-pbonzini@redhat.com> -Reviewed-by: Fam Zheng -Signed-off-by: Fam Zheng -(cherry picked from commit cfeb35d6774b2e936046aa9923217818bd160299) -Signed-off-by: Fam Zheng -Signed-off-by: Danilo C. L. de Paula ---- - util/aio-posix.c | 7 ++++--- - 1 file changed, 4 insertions(+), 3 deletions(-) - -diff --git a/util/aio-posix.c b/util/aio-posix.c -index bb862e1..a959ff6 100644 ---- a/util/aio-posix.c -+++ b/util/aio-posix.c -@@ -498,10 +498,11 @@ static bool run_poll_handlers_once(AioContext *ctx, int64_t *timeout) - QLIST_FOREACH_RCU(node, &ctx->aio_handlers, node) { - if (!node->deleted && node->io_poll && - aio_node_check(ctx, node->is_external) && -- node->io_poll(node->opaque) && -- node->opaque != &ctx->notifier) { -+ node->io_poll(node->opaque)) { - *timeout = 0; -- progress = true; -+ if (node->opaque != &ctx->notifier) { -+ progress = true; -+ } - } - - /* Caller handles freeing deleted nodes. Don't do it here. */ --- -1.8.3.1 - diff --git a/0069-linux-headers-update.patch b/0069-linux-headers-update.patch deleted file mode 100644 index a48ddbc..0000000 --- a/0069-linux-headers-update.patch +++ /dev/null @@ -1,202 +0,0 @@ -From 7e13447e23269939c3d1267a957187a60fef36e9 Mon Sep 17 00:00:00 2001 -From: Thomas Huth -Date: Mon, 15 Oct 2018 10:19:26 +0100 -Subject: linux-headers: update - -RH-Author: Thomas Huth -Message-id: <1539598771-16223-2-git-send-email-thuth@redhat.com> -Patchwork-id: 82696 -O-Subject: [RHEL-8 qemu-kvm PATCH 1/6] linux-headers: update -Bugzilla: 1508142 -RH-Acked-by: David Hildenbrand -RH-Acked-by: Cornelia Huck -RH-Acked-by: Jens Freimann - -From: Cornelia Huck - -Update to kvm/next commit dd5bd0a65ff6 ("Merge tag 'kvm-s390-next-4.20-1' -of git://git.kernel.org/pub/scm/linux/kernel/git/kvms390/linux into HEAD") - -Signed-off-by: Cornelia Huck -(cherry picked from commit 8f3cd250a897213d39e621e3d824507b48158d42) -Signed-off-by: Danilo C. L. de Paula - -Conflicts: - linux-headers/linux/kvm.h - linux-headers/linux/vhost.h - (simple contextual conflicts due to some missing patches in downstream) - -Signed-off-by: Thomas Huth ---- - include/standard-headers/linux/input.h | 9 +++++---- - linux-headers/asm-arm/kvm.h | 13 +++++++++++++ - linux-headers/asm-arm64/kvm.h | 13 +++++++++++++ - linux-headers/asm-s390/kvm.h | 2 ++ - linux-headers/asm-x86/kvm.h | 1 + - linux-headers/linux/kvm.h | 3 +++ - linux-headers/linux/vfio.h | 2 ++ - linux-headers/linux/vhost.h | 8 ++++++++ - 8 files changed, 47 insertions(+), 4 deletions(-) - -diff --git a/include/standard-headers/linux/input.h b/include/standard-headers/linux/input.h -index 6d6128c..c0ad9fc 100644 ---- a/include/standard-headers/linux/input.h -+++ b/include/standard-headers/linux/input.h -@@ -267,10 +267,11 @@ struct input_mask { - /* - * MT_TOOL types - */ --#define MT_TOOL_FINGER 0 --#define MT_TOOL_PEN 1 --#define MT_TOOL_PALM 2 --#define MT_TOOL_MAX 2 -+#define MT_TOOL_FINGER 0x00 -+#define MT_TOOL_PEN 0x01 -+#define MT_TOOL_PALM 0x02 -+#define MT_TOOL_DIAL 0x0a -+#define MT_TOOL_MAX 0x0f - - /* - * Values describing the status of a force-feedback effect -diff --git a/linux-headers/asm-arm/kvm.h b/linux-headers/asm-arm/kvm.h -index 72aa226..e1f8b74 100644 ---- a/linux-headers/asm-arm/kvm.h -+++ b/linux-headers/asm-arm/kvm.h -@@ -27,6 +27,7 @@ - #define __KVM_HAVE_GUEST_DEBUG - #define __KVM_HAVE_IRQ_LINE - #define __KVM_HAVE_READONLY_MEM -+#define __KVM_HAVE_VCPU_EVENTS - - #define KVM_COALESCED_MMIO_PAGE_OFFSET 1 - -@@ -125,6 +126,18 @@ struct kvm_sync_regs { - struct kvm_arch_memory_slot { - }; - -+/* for KVM_GET/SET_VCPU_EVENTS */ -+struct kvm_vcpu_events { -+ struct { -+ __u8 serror_pending; -+ __u8 serror_has_esr; -+ /* Align it to 8 bytes */ -+ __u8 pad[6]; -+ __u64 serror_esr; -+ } exception; -+ __u32 reserved[12]; -+}; -+ - /* If you need to interpret the index values, here is the key: */ - #define KVM_REG_ARM_COPROC_MASK 0x000000000FFF0000 - #define KVM_REG_ARM_COPROC_SHIFT 16 -diff --git a/linux-headers/asm-arm64/kvm.h b/linux-headers/asm-arm64/kvm.h -index 99cb9ad..e6a98c1 100644 ---- a/linux-headers/asm-arm64/kvm.h -+++ b/linux-headers/asm-arm64/kvm.h -@@ -39,6 +39,7 @@ - #define __KVM_HAVE_GUEST_DEBUG - #define __KVM_HAVE_IRQ_LINE - #define __KVM_HAVE_READONLY_MEM -+#define __KVM_HAVE_VCPU_EVENTS - - #define KVM_COALESCED_MMIO_PAGE_OFFSET 1 - -@@ -154,6 +155,18 @@ struct kvm_sync_regs { - struct kvm_arch_memory_slot { - }; - -+/* for KVM_GET/SET_VCPU_EVENTS */ -+struct kvm_vcpu_events { -+ struct { -+ __u8 serror_pending; -+ __u8 serror_has_esr; -+ /* Align it to 8 bytes */ -+ __u8 pad[6]; -+ __u64 serror_esr; -+ } exception; -+ __u32 reserved[12]; -+}; -+ - /* If you need to interpret the index values, here is the key: */ - #define KVM_REG_ARM_COPROC_MASK 0x000000000FFF0000 - #define KVM_REG_ARM_COPROC_SHIFT 16 -diff --git a/linux-headers/asm-s390/kvm.h b/linux-headers/asm-s390/kvm.h -index 1ab9901..0265482 100644 ---- a/linux-headers/asm-s390/kvm.h -+++ b/linux-headers/asm-s390/kvm.h -@@ -160,6 +160,8 @@ struct kvm_s390_vm_cpu_subfunc { - #define KVM_S390_VM_CRYPTO_ENABLE_DEA_KW 1 - #define KVM_S390_VM_CRYPTO_DISABLE_AES_KW 2 - #define KVM_S390_VM_CRYPTO_DISABLE_DEA_KW 3 -+#define KVM_S390_VM_CRYPTO_ENABLE_APIE 4 -+#define KVM_S390_VM_CRYPTO_DISABLE_APIE 5 - - /* kvm attributes for migration mode */ - #define KVM_S390_VM_MIGRATION_STOP 0 -diff --git a/linux-headers/asm-x86/kvm.h b/linux-headers/asm-x86/kvm.h -index c535c2f..9bba973 100644 ---- a/linux-headers/asm-x86/kvm.h -+++ b/linux-headers/asm-x86/kvm.h -@@ -377,5 +377,6 @@ struct kvm_sync_regs { - - #define KVM_X86_QUIRK_LINT0_REENABLED (1 << 0) - #define KVM_X86_QUIRK_CD_NW_CLEARED (1 << 1) -+#define KVM_X86_QUIRK_LAPIC_MMIO_HOLE (1 << 2) - - #endif /* _ASM_X86_KVM_H */ -diff --git a/linux-headers/linux/kvm.h b/linux-headers/linux/kvm.h -index 2aae948..c4a5542 100644 ---- a/linux-headers/linux/kvm.h -+++ b/linux-headers/linux/kvm.h -@@ -950,6 +950,9 @@ struct kvm_ppc_resize_hpt { - #define KVM_CAP_HYPERV_EVENTFD 154 - #define KVM_CAP_HYPERV_TLBFLUSH 155 - #define KVM_CAP_S390_HPAGE_1M 156 -+#define KVM_CAP_NESTED_STATE 157 -+#define KVM_CAP_ARM_INJECT_SERROR_ESR 158 -+#define KVM_CAP_MSR_PLATFORM_INFO 159 - - #ifdef KVM_CAP_IRQ_ROUTING - -diff --git a/linux-headers/linux/vfio.h b/linux-headers/linux/vfio.h -index 3615a26..ceb6453 100644 ---- a/linux-headers/linux/vfio.h -+++ b/linux-headers/linux/vfio.h -@@ -200,6 +200,7 @@ struct vfio_device_info { - #define VFIO_DEVICE_FLAGS_PLATFORM (1 << 2) /* vfio-platform device */ - #define VFIO_DEVICE_FLAGS_AMBA (1 << 3) /* vfio-amba device */ - #define VFIO_DEVICE_FLAGS_CCW (1 << 4) /* vfio-ccw device */ -+#define VFIO_DEVICE_FLAGS_AP (1 << 5) /* vfio-ap device */ - __u32 num_regions; /* Max region index + 1 */ - __u32 num_irqs; /* Max IRQ index + 1 */ - }; -@@ -215,6 +216,7 @@ struct vfio_device_info { - #define VFIO_DEVICE_API_PLATFORM_STRING "vfio-platform" - #define VFIO_DEVICE_API_AMBA_STRING "vfio-amba" - #define VFIO_DEVICE_API_CCW_STRING "vfio-ccw" -+#define VFIO_DEVICE_API_AP_STRING "vfio-ap" - - /** - * VFIO_DEVICE_GET_REGION_INFO - _IOWR(VFIO_TYPE, VFIO_BASE + 8, -diff --git a/linux-headers/linux/vhost.h b/linux-headers/linux/vhost.h -index e336395..3421624 100644 ---- a/linux-headers/linux/vhost.h -+++ b/linux-headers/linux/vhost.h -@@ -160,6 +160,14 @@ struct vhost_memory { - #define VHOST_GET_VRING_BUSYLOOP_TIMEOUT _IOW(VHOST_VIRTIO, 0x24, \ - struct vhost_vring_state) - -+/* Set or get vhost backend capability */ -+ -+/* Use message type V2 */ -+#define VHOST_BACKEND_F_IOTLB_MSG_V2 0x1 -+ -+#define VHOST_SET_BACKEND_FEATURES _IOW(VHOST_VIRTIO, 0x25, __u64) -+#define VHOST_GET_BACKEND_FEATURES _IOR(VHOST_VIRTIO, 0x26, __u64) -+ - /* VHOST_NET specific defines */ - - /* Attach virtio net ring to a raw socket, or tap device. --- -1.8.3.1 - diff --git a/0070-s390x-cpumodel-Set-up-CPU-model-for-AP-device-suppor.patch b/0070-s390x-cpumodel-Set-up-CPU-model-for-AP-device-suppor.patch deleted file mode 100644 index dea147b..0000000 --- a/0070-s390x-cpumodel-Set-up-CPU-model-for-AP-device-suppor.patch +++ /dev/null @@ -1,148 +0,0 @@ -From 9ceba72eb99b073a86b0aa529154de3e06330720 Mon Sep 17 00:00:00 2001 -From: Thomas Huth -Date: Mon, 15 Oct 2018 10:19:27 +0100 -Subject: s390x/cpumodel: Set up CPU model for AP device support - -RH-Author: Thomas Huth -Message-id: <1539598771-16223-3-git-send-email-thuth@redhat.com> -Patchwork-id: 82694 -O-Subject: [RHEL-8 qemu-kvm PATCH 2/6] s390x/cpumodel: Set up CPU model for AP device support -Bugzilla: 1508142 -RH-Acked-by: David Hildenbrand -RH-Acked-by: Cornelia Huck -RH-Acked-by: Jens Freimann - -From: Tony Krowiak - -A new CPU model feature and two new CPU model facilities are -introduced to support AP devices for a KVM guest. - -CPU model features: - -1. The S390_FEAT_AP CPU model feature indicates whether AP - instructions are available to the guest. This feature will - be enabled only if the AP instructions are available on the - linux host as determined by the availability of the - KVM_S390_VM_CRYPTO_ENABLE_APIE VM attribute which is exposed - by KVM only if the AP instructions are available on the - host. - - This feature must be turned on from userspace to execute AP - instructions on the KVM guest. The QEMU command line to turn - this feature on looks something like this: - - qemu-system-s390x ... -cpu xxx,ap=on ... - - This feature will be supported for zEC12 and newer CPU models. - The feature will not be supported for older models because - there are few older systems on which to test and the older - crypto cards will be going out of service in the relatively - near future. - -CPU model facilities: - -1. The S390_FEAT_AP_QUERY_CONFIG_INFO feature indicates whether the - AP Query Configuration Information (QCI) facility is available - to the guest as determined by whether the facility is available - on the host. This feature will be exposed by KVM only if the - QCI facility is installed on the host. - -2. The S390_FEAT_AP_FACILITY_TEST feature indicates whether the AP - Facility Test (APFT) facility is available to the guest as - determined by whether the facility is available on the host. - This feature will be exposed by KVM only if APFT is installed - on the host. - -Signed-off-by: Tony Krowiak -Tested-by: Pierre Morel -Reviewed-by: David Hildenbrand -Reviewed-by: Halil Pasic -Reviewed-by: Christian Borntraeger -Tested-by: Christian Borntraeger -Message-Id: <20181010170309.12045-3-akrowiak@linux.ibm.com> -Signed-off-by: Cornelia Huck -(cherry picked from commit c5cd17afddda89376712b315a41ede96b034e4c2) -Signed-off-by: Danilo C. L. de Paula ---- - target/s390x/cpu_features.c | 3 +++ - target/s390x/cpu_features_def.h | 3 +++ - target/s390x/cpu_models.c | 2 ++ - target/s390x/gen-features.c | 3 +++ - 4 files changed, 11 insertions(+) - -diff --git a/target/s390x/cpu_features.c b/target/s390x/cpu_features.c -index e05e6aa..0fbee27 100644 ---- a/target/s390x/cpu_features.c -+++ b/target/s390x/cpu_features.c -@@ -40,8 +40,10 @@ static const S390FeatDef s390_features[] = { - FEAT_INIT("srs", S390_FEAT_TYPE_STFL, 9, "Sense-running-status facility"), - FEAT_INIT("csske", S390_FEAT_TYPE_STFL, 10, "Conditional-SSKE facility"), - FEAT_INIT("ctop", S390_FEAT_TYPE_STFL, 11, "Configuration-topology facility"), -+ FEAT_INIT("apqci", S390_FEAT_TYPE_STFL, 12, "Query AP Configuration Information facility"), - FEAT_INIT("ipter", S390_FEAT_TYPE_STFL, 13, "IPTE-range facility"), - FEAT_INIT("nonqks", S390_FEAT_TYPE_STFL, 14, "Nonquiescing key-setting facility"), -+ FEAT_INIT("apft", S390_FEAT_TYPE_STFL, 15, "AP Facilities Test facility"), - FEAT_INIT("etf2", S390_FEAT_TYPE_STFL, 16, "Extended-translation facility 2"), - FEAT_INIT("msa-base", S390_FEAT_TYPE_STFL, 17, "Message-security-assist facility (excluding subfunctions)"), - FEAT_INIT("ldisp", S390_FEAT_TYPE_STFL, 18, "Long-displacement facility"), -@@ -130,6 +132,7 @@ static const S390FeatDef s390_features[] = { - - FEAT_INIT_MISC("dateh2", "DAT-enhancement facility 2"), - FEAT_INIT_MISC("cmm", "Collaborative-memory-management facility"), -+ FEAT_INIT_MISC("ap", "AP instructions installed"), - - FEAT_INIT("plo-cl", S390_FEAT_TYPE_PLO, 0, "PLO Compare and load (32 bit in general registers)"), - FEAT_INIT("plo-clg", S390_FEAT_TYPE_PLO, 1, "PLO Compare and load (64 bit in parameter list)"), -diff --git a/target/s390x/cpu_features_def.h b/target/s390x/cpu_features_def.h -index ac2c947..5fc7e7b 100644 ---- a/target/s390x/cpu_features_def.h -+++ b/target/s390x/cpu_features_def.h -@@ -27,8 +27,10 @@ typedef enum { - S390_FEAT_SENSE_RUNNING_STATUS, - S390_FEAT_CONDITIONAL_SSKE, - S390_FEAT_CONFIGURATION_TOPOLOGY, -+ S390_FEAT_AP_QUERY_CONFIG_INFO, - S390_FEAT_IPTE_RANGE, - S390_FEAT_NONQ_KEY_SETTING, -+ S390_FEAT_AP_FACILITIES_TEST, - S390_FEAT_EXTENDED_TRANSLATION_2, - S390_FEAT_MSA, - S390_FEAT_LONG_DISPLACEMENT, -@@ -119,6 +121,7 @@ typedef enum { - /* Misc */ - S390_FEAT_DAT_ENH_2, - S390_FEAT_CMM, -+ S390_FEAT_AP, - - /* PLO */ - S390_FEAT_PLO_CL, -diff --git a/target/s390x/cpu_models.c b/target/s390x/cpu_models.c -index 9c469ff..a8722cd 100644 ---- a/target/s390x/cpu_models.c -+++ b/target/s390x/cpu_models.c -@@ -782,6 +782,8 @@ static void check_consistency(const S390CPUModel *model) - { S390_FEAT_PRNO_TRNG_QRTCR, S390_FEAT_MSA_EXT_5 }, - { S390_FEAT_PRNO_TRNG, S390_FEAT_MSA_EXT_5 }, - { S390_FEAT_SIE_KSS, S390_FEAT_SIE_F2 }, -+ { S390_FEAT_AP_QUERY_CONFIG_INFO, S390_FEAT_AP }, -+ { S390_FEAT_AP_FACILITIES_TEST, S390_FEAT_AP }, - }; - int i; - -diff --git a/target/s390x/gen-features.c b/target/s390x/gen-features.c -index 5af042c..7302269 100644 ---- a/target/s390x/gen-features.c -+++ b/target/s390x/gen-features.c -@@ -447,6 +447,9 @@ static uint16_t full_GEN12_GA1[] = { - S390_FEAT_ADAPTER_INT_SUPPRESSION, - S390_FEAT_EDAT_2, - S390_FEAT_SIDE_EFFECT_ACCESS_ESOP2, -+ S390_FEAT_AP_QUERY_CONFIG_INFO, -+ S390_FEAT_AP_FACILITIES_TEST, -+ S390_FEAT_AP, - }; - - static uint16_t full_GEN12_GA2[] = { --- -1.8.3.1 - diff --git a/0071-s390x-kvm-enable-AP-instruction-interpretation-for-g.patch b/0071-s390x-kvm-enable-AP-instruction-interpretation-for-g.patch deleted file mode 100644 index 47012cd..0000000 --- a/0071-s390x-kvm-enable-AP-instruction-interpretation-for-g.patch +++ /dev/null @@ -1,89 +0,0 @@ -From ef6a15cefa04a4f29d0d800d17caa9a37c40b05c Mon Sep 17 00:00:00 2001 -From: Thomas Huth -Date: Mon, 15 Oct 2018 10:19:28 +0100 -Subject: s390x/kvm: enable AP instruction interpretation for guest - -RH-Author: Thomas Huth -Message-id: <1539598771-16223-4-git-send-email-thuth@redhat.com> -Patchwork-id: 82697 -O-Subject: [RHEL-8 qemu-kvm PATCH 3/6] s390x/kvm: enable AP instruction interpretation for guest -Bugzilla: 1508142 -RH-Acked-by: David Hildenbrand -RH-Acked-by: Cornelia Huck -RH-Acked-by: Jens Freimann - -From: Tony Krowiak - -Let's use the KVM_SET_DEVICE_ATTR ioctl to enable hardware -interpretation of AP instructions executed on the guest. -If the S390_FEAT_AP feature is switched on for the guest, -AP instructions must be interpreted by default; otherwise, -they will be intercepted. - -This attribute setting may be overridden by a device. For example, -a device may want to provide AP instructions to the guest (i.e., -S390_FEAT_AP turned on), but it may want to emulate them. In this -case, the AP instructions executed on the guest must be -intercepted; so when the device is realized, it must disable -interpretation. - -Signed-off-by: Tony Krowiak -Tested-by: Pierre Morel -Reviewed-by: David Hildenbrand -Reviewed-by: Thomas Huth -Reviewed-by: Christian Borntraeger -Acked-by: Halil Pasic -Tested-by: Christian Borntraeger -Message-Id: <20181010170309.12045-4-akrowiak@linux.ibm.com> -Signed-off-by: Cornelia Huck -(cherry picked from commit 1d7db85b61cb9888b8ed8c8923343b468405b7a0) -Signed-off-by: Danilo C. L. de Paula ---- - target/s390x/kvm.c | 19 +++++++++++++++++++ - 1 file changed, 19 insertions(+) - -diff --git a/target/s390x/kvm.c b/target/s390x/kvm.c -index 71d90f2..d25e2e2 100644 ---- a/target/s390x/kvm.c -+++ b/target/s390x/kvm.c -@@ -2290,11 +2290,26 @@ void kvm_s390_get_host_cpu_model(S390CPUModel *model, Error **errp) - error_setg(errp, "KVM: host CPU model could not be identified"); - return; - } -+ /* for now, we can only provide the AP feature with HW support */ -+ if (kvm_vm_check_attr(kvm_state, KVM_S390_VM_CRYPTO, -+ KVM_S390_VM_CRYPTO_ENABLE_APIE)) { -+ set_bit(S390_FEAT_AP, model->features); -+ } - /* strip of features that are not part of the maximum model */ - bitmap_and(model->features, model->features, model->def->full_feat, - S390_FEAT_MAX); - } - -+static void kvm_s390_configure_apie(bool interpret) -+{ -+ uint64_t attr = interpret ? KVM_S390_VM_CRYPTO_ENABLE_APIE : -+ KVM_S390_VM_CRYPTO_DISABLE_APIE; -+ -+ if (kvm_vm_check_attr(kvm_state, KVM_S390_VM_CRYPTO, attr)) { -+ kvm_s390_set_attr(attr); -+ } -+} -+ - void kvm_s390_apply_cpu_model(const S390CPUModel *model, Error **errp) - { - struct kvm_s390_vm_cpu_processor prop = { -@@ -2352,6 +2367,10 @@ void kvm_s390_apply_cpu_model(const S390CPUModel *model, Error **errp) - if (test_bit(S390_FEAT_CMM, model->features)) { - kvm_s390_enable_cmma(); - } -+ -+ if (test_bit(S390_FEAT_AP, model->features)) { -+ kvm_s390_configure_apie(true); -+ } - } - - void kvm_s390_restart_interrupt(S390CPU *cpu) --- -1.8.3.1 - diff --git a/0072-s390x-ap-base-Adjunct-Processor-AP-object-model.patch b/0072-s390x-ap-base-Adjunct-Processor-AP-object-model.patch deleted file mode 100644 index 9059681..0000000 --- a/0072-s390x-ap-base-Adjunct-Processor-AP-object-model.patch +++ /dev/null @@ -1,281 +0,0 @@ -From a57558fc97a82853d0c5e1e190297f7677598d5a Mon Sep 17 00:00:00 2001 -From: Thomas Huth -Date: Mon, 15 Oct 2018 10:19:29 +0100 -Subject: s390x/ap: base Adjunct Processor (AP) object model - -RH-Author: Thomas Huth -Message-id: <1539598771-16223-5-git-send-email-thuth@redhat.com> -Patchwork-id: 82695 -O-Subject: [RHEL-8 qemu-kvm PATCH 4/6] s390x/ap: base Adjunct Processor (AP) object model -Bugzilla: 1508142 -RH-Acked-by: David Hildenbrand -RH-Acked-by: Cornelia Huck -RH-Acked-by: Jens Freimann - -From: Tony Krowiak - -Introduces the base object model for virtualizing AP devices. - -Signed-off-by: Tony Krowiak -Tested-by: Pierre Morel -Acked-by: David Hildenbrand -Reviewed-by: Thomas Huth -Reviewed-by: Halil Pasic -Tested-by: Christian Borntraeger -Message-Id: <20181010170309.12045-5-akrowiak@linux.ibm.com> -Signed-off-by: Cornelia Huck -(cherry picked from commit a51b31535a8ec13997de29b357f7cc1dcd8a7f9c) -Signed-off-by: Danilo C. L. de Paula ---- - MAINTAINERS | 12 +++++++ - hw/s390x/Makefile.objs | 2 ++ - hw/s390x/ap-bridge.c | 78 ++++++++++++++++++++++++++++++++++++++++++++ - hw/s390x/ap-device.c | 38 +++++++++++++++++++++ - hw/s390x/s390-virtio-ccw.c | 4 +++ - include/hw/s390x/ap-bridge.h | 19 +++++++++++ - include/hw/s390x/ap-device.h | 22 +++++++++++++ - 7 files changed, 175 insertions(+) - create mode 100644 hw/s390x/ap-bridge.c - create mode 100644 hw/s390x/ap-device.c - create mode 100644 include/hw/s390x/ap-bridge.h - create mode 100644 include/hw/s390x/ap-device.h - -diff --git a/MAINTAINERS b/MAINTAINERS -index 666e936..d5b3c18 100644 ---- a/MAINTAINERS -+++ b/MAINTAINERS -@@ -1184,6 +1184,18 @@ F: include/hw/s390x/s390-ccw.h - T: git git://github.com/cohuck/qemu.git s390-next - L: qemu-s390x@nongnu.org - -+vfio-ap -+M: Christian Borntraeger -+M: Tony Krowiak -+M: Halil Pasic -+M: Pierre Morel -+S: Supported -+F: hw/s390x/ap-device.c -+F: hw/s390x/ap-bridge.c -+F: include/hw/s390x/ap-device.h -+F: include/hw/s390x/ap-bridge.h -+L: qemu-s390x@nongnu.org -+ - vhost - M: Michael S. Tsirkin - S: Supported -diff --git a/hw/s390x/Makefile.objs b/hw/s390x/Makefile.objs -index 93282f7..add89b1 100644 ---- a/hw/s390x/Makefile.objs -+++ b/hw/s390x/Makefile.objs -@@ -20,3 +20,5 @@ obj-$(CONFIG_TCG) += tod-qemu.o - obj-$(CONFIG_KVM) += s390-skeys-kvm.o - obj-$(CONFIG_KVM) += s390-stattrib-kvm.o - obj-y += s390-ccw.o -+obj-y += ap-device.o -+obj-y += ap-bridge.o -diff --git a/hw/s390x/ap-bridge.c b/hw/s390x/ap-bridge.c -new file mode 100644 -index 0000000..3795d30 ---- /dev/null -+++ b/hw/s390x/ap-bridge.c -@@ -0,0 +1,78 @@ -+/* -+ * ap bridge -+ * -+ * Copyright 2018 IBM Corp. -+ * -+ * This work is licensed under the terms of the GNU GPL, version 2 or (at -+ * your option) any later version. See the COPYING file in the top-level -+ * directory. -+ */ -+#include "qemu/osdep.h" -+#include "qapi/error.h" -+#include "hw/sysbus.h" -+#include "qemu/bitops.h" -+#include "hw/s390x/ap-bridge.h" -+#include "cpu.h" -+ -+static char *ap_bus_get_dev_path(DeviceState *dev) -+{ -+ /* at most one */ -+ return g_strdup_printf("/1"); -+} -+ -+static void ap_bus_class_init(ObjectClass *oc, void *data) -+{ -+ BusClass *k = BUS_CLASS(oc); -+ -+ k->get_dev_path = ap_bus_get_dev_path; -+ /* More than one ap device does not make sense */ -+ k->max_dev = 1; -+} -+ -+static const TypeInfo ap_bus_info = { -+ .name = TYPE_AP_BUS, -+ .parent = TYPE_BUS, -+ .instance_size = 0, -+ .class_init = ap_bus_class_init, -+}; -+ -+void s390_init_ap(void) -+{ -+ DeviceState *dev; -+ -+ /* If no AP instructions then no need for AP bridge */ -+ if (!s390_has_feat(S390_FEAT_AP)) { -+ return; -+ } -+ -+ /* Create bridge device */ -+ dev = qdev_create(NULL, TYPE_AP_BRIDGE); -+ object_property_add_child(qdev_get_machine(), TYPE_AP_BRIDGE, -+ OBJECT(dev), NULL); -+ qdev_init_nofail(dev); -+ -+ /* Create bus on bridge device */ -+ qbus_create(TYPE_AP_BUS, dev, TYPE_AP_BUS); -+ } -+ -+static void ap_bridge_class_init(ObjectClass *oc, void *data) -+{ -+ DeviceClass *dc = DEVICE_CLASS(oc); -+ -+ set_bit(DEVICE_CATEGORY_BRIDGE, dc->categories); -+} -+ -+static const TypeInfo ap_bridge_info = { -+ .name = TYPE_AP_BRIDGE, -+ .parent = TYPE_SYS_BUS_DEVICE, -+ .instance_size = 0, -+ .class_init = ap_bridge_class_init, -+}; -+ -+static void ap_register(void) -+{ -+ type_register_static(&ap_bridge_info); -+ type_register_static(&ap_bus_info); -+} -+ -+type_init(ap_register) -diff --git a/hw/s390x/ap-device.c b/hw/s390x/ap-device.c -new file mode 100644 -index 0000000..f5ac8db ---- /dev/null -+++ b/hw/s390x/ap-device.c -@@ -0,0 +1,38 @@ -+/* -+ * Adjunct Processor (AP) matrix device -+ * -+ * Copyright 2018 IBM Corp. -+ * -+ * This work is licensed under the terms of the GNU GPL, version 2 or (at -+ * your option) any later version. See the COPYING file in the top-level -+ * directory. -+ */ -+#include "qemu/osdep.h" -+#include "qemu/module.h" -+#include "qapi/error.h" -+#include "hw/qdev.h" -+#include "hw/s390x/ap-device.h" -+ -+static void ap_class_init(ObjectClass *klass, void *data) -+{ -+ DeviceClass *dc = DEVICE_CLASS(klass); -+ -+ dc->desc = "AP device class"; -+ dc->hotpluggable = false; -+} -+ -+static const TypeInfo ap_device_info = { -+ .name = AP_DEVICE_TYPE, -+ .parent = TYPE_DEVICE, -+ .instance_size = sizeof(APDevice), -+ .class_size = sizeof(DeviceClass), -+ .class_init = ap_class_init, -+ .abstract = true, -+}; -+ -+static void ap_device_register(void) -+{ -+ type_register_static(&ap_device_info); -+} -+ -+type_init(ap_device_register) -diff --git a/hw/s390x/s390-virtio-ccw.c b/hw/s390x/s390-virtio-ccw.c -index cdf4558..a4b8b62 100644 ---- a/hw/s390x/s390-virtio-ccw.c -+++ b/hw/s390x/s390-virtio-ccw.c -@@ -32,6 +32,7 @@ - #include "ipl.h" - #include "hw/s390x/s390-virtio-ccw.h" - #include "hw/s390x/css-bridge.h" -+#include "hw/s390x/ap-bridge.h" - #include "migration/register.h" - #include "cpu_models.h" - #include "hw/nmi.h" -@@ -263,6 +264,9 @@ static void ccw_init(MachineState *machine) - /* init the SIGP facility */ - s390_init_sigp(); - -+ /* create AP bridge and bus(es) */ -+ s390_init_ap(); -+ - /* get a BUS */ - css_bus = virtual_css_bus_init(); - s390_init_ipl_dev(machine->kernel_filename, machine->kernel_cmdline, -diff --git a/include/hw/s390x/ap-bridge.h b/include/hw/s390x/ap-bridge.h -new file mode 100644 -index 0000000..470e439 ---- /dev/null -+++ b/include/hw/s390x/ap-bridge.h -@@ -0,0 +1,19 @@ -+/* -+ * ap bridge -+ * -+ * Copyright 2018 IBM Corp. -+ * -+ * This work is licensed under the terms of the GNU GPL, version 2 or (at -+ * your option) any later version. See the COPYING file in the top-level -+ * directory. -+ */ -+ -+#ifndef HW_S390X_AP_BRIDGE_H -+#define HW_S390X_AP_BRIDGE_H -+ -+#define TYPE_AP_BRIDGE "ap-bridge" -+#define TYPE_AP_BUS "ap-bus" -+ -+void s390_init_ap(void); -+ -+#endif -diff --git a/include/hw/s390x/ap-device.h b/include/hw/s390x/ap-device.h -new file mode 100644 -index 0000000..765e908 ---- /dev/null -+++ b/include/hw/s390x/ap-device.h -@@ -0,0 +1,22 @@ -+/* -+ * Adjunct Processor (AP) matrix device interfaces -+ * -+ * Copyright 2018 IBM Corp. -+ * -+ * This work is licensed under the terms of the GNU GPL, version 2 or (at -+ * your option) any later version. See the COPYING file in the top-level -+ * directory. -+ */ -+#ifndef HW_S390X_AP_DEVICE_H -+#define HW_S390X_AP_DEVICE_H -+ -+#define AP_DEVICE_TYPE "ap-device" -+ -+typedef struct APDevice { -+ DeviceState parent_obj; -+} APDevice; -+ -+#define AP_DEVICE(obj) \ -+ OBJECT_CHECK(APDevice, (obj), AP_DEVICE_TYPE) -+ -+#endif /* HW_S390X_AP_DEVICE_H */ --- -1.8.3.1 - diff --git a/0073-s390x-vfio-ap-Introduce-VFIO-AP-device.patch b/0073-s390x-vfio-ap-Introduce-VFIO-AP-device.patch deleted file mode 100644 index d4e8441..0000000 --- a/0073-s390x-vfio-ap-Introduce-VFIO-AP-device.patch +++ /dev/null @@ -1,305 +0,0 @@ -From 9f3a3325bb6859b1d3b46818a7d5b75c5d609f32 Mon Sep 17 00:00:00 2001 -From: Thomas Huth -Date: Mon, 15 Oct 2018 10:19:30 +0100 -Subject: s390x/vfio: ap: Introduce VFIO AP device - -RH-Author: Thomas Huth -Message-id: <1539598771-16223-6-git-send-email-thuth@redhat.com> -Patchwork-id: 82700 -O-Subject: [RHEL-8 qemu-kvm PATCH 5/6] s390x/vfio: ap: Introduce VFIO AP device -Bugzilla: 1508142 -RH-Acked-by: David Hildenbrand -RH-Acked-by: Cornelia Huck -RH-Acked-by: Jens Freimann - -From: Tony Krowiak - -Introduces a VFIO based AP device. The device is defined via -the QEMU command line by specifying: - - -device vfio-ap,sysfsdev= - -There may be only one vfio-ap device configured for a guest. - -The mediated matrix device is created by the VFIO AP device -driver by writing a UUID to a sysfs attribute file (see -docs/vfio-ap.txt). The mediated matrix device will be named -after the UUID. Symbolic links to the $uuid are created in -many places, so the path to the mediated matrix device $uuid -can be specified in any of the following ways: - -/sys/devices/vfio_ap/matrix/$uuid -/sys/devices/vfio_ap/matrix/mdev_supported_types/vfio_ap-passthrough/devices/$uuid -/sys/bus/mdev/devices/$uuid -/sys/bus/mdev/drivers/vfio_mdev/$uuid - -When the vfio-ap device is realized, it acquires and opens the -VFIO iommu group to which the mediated matrix device is -bound. This causes a VFIO group notification event to be -signaled. The vfio_ap device driver's group notification -handler will get called at which time the device driver -will configure the the AP devices to which the guest will -be granted access. - -Signed-off-by: Tony Krowiak -Tested-by: Pierre Morel -Acked-by: Halil Pasic -Tested-by: Pierre Morel -Tested-by: Christian Borntraeger -Message-Id: <20181010170309.12045-6-akrowiak@linux.ibm.com> -Reviewed-by: Thomas Huth -[CH: added missing g_free and device category] -Signed-off-by: Cornelia Huck - -(cherry picked from commit 2fe2942cd6ddad8ddd40fe5d16d67599c28959d7) -Signed-off-by: Danilo C. L. de Paula ---- - MAINTAINERS | 2 + - default-configs/s390x-softmmu.mak | 1 + - hw/vfio/Makefile.objs | 1 + - hw/vfio/ap.c | 181 ++++++++++++++++++++++++++++++++++++++ - include/hw/vfio/vfio-common.h | 1 + - 5 files changed, 186 insertions(+) - create mode 100644 hw/vfio/ap.c - -diff --git a/MAINTAINERS b/MAINTAINERS -index d5b3c18..f2fa1b8 100644 ---- a/MAINTAINERS -+++ b/MAINTAINERS -@@ -88,6 +88,7 @@ F: hw/char/terminal3270.c - F: hw/intc/s390_flic.c - F: hw/intc/s390_flic_kvm.c - F: hw/s390x/ -+F: hw/vfio/ap.c - F: hw/vfio/ccw.c - F: hw/watchdog/wdt_diag288.c - F: include/hw/s390x/ -@@ -1194,6 +1195,7 @@ F: hw/s390x/ap-device.c - F: hw/s390x/ap-bridge.c - F: include/hw/s390x/ap-device.h - F: include/hw/s390x/ap-bridge.h -+F: hw/vfio/ap.c - L: qemu-s390x@nongnu.org - - vhost -diff --git a/default-configs/s390x-softmmu.mak b/default-configs/s390x-softmmu.mak -index 8b2db3e..49a59fc 100644 ---- a/default-configs/s390x-softmmu.mak -+++ b/default-configs/s390x-softmmu.mak -@@ -8,3 +8,4 @@ CONFIG_S390_FLIC_KVM=$(CONFIG_KVM) - # Disabled for Red Hat Enterprise Linux: - # CONFIG_VFIO_CCW=$(CONFIG_LINUX) - CONFIG_WDT_DIAG288=y -+CONFIG_VFIO_AP=$(CONFIG_LINUX) -diff --git a/hw/vfio/Makefile.objs b/hw/vfio/Makefile.objs -index d38205b..53b4cbe 100644 ---- a/hw/vfio/Makefile.objs -+++ b/hw/vfio/Makefile.objs -@@ -5,4 +5,5 @@ obj-$(CONFIG_VFIO_CCW) += ccw.o - obj-$(CONFIG_VFIO_XGMAC) += calxeda-xgmac.o - obj-$(CONFIG_VFIO_AMD_XGBE) += amd-xgbe.o - obj-$(CONFIG_SOFTMMU) += spapr.o -+obj-$(CONFIG_VFIO_AP) += ap.o - endif -diff --git a/hw/vfio/ap.c b/hw/vfio/ap.c -new file mode 100644 -index 0000000..3962bb7 ---- /dev/null -+++ b/hw/vfio/ap.c -@@ -0,0 +1,181 @@ -+/* -+ * VFIO based AP matrix device assignment -+ * -+ * Copyright 2018 IBM Corp. -+ * Author(s): Tony Krowiak -+ * Halil Pasic -+ * -+ * This work is licensed under the terms of the GNU GPL, version 2 or (at -+ * your option) any later version. See the COPYING file in the top-level -+ * directory. -+ */ -+ -+#include -+#include -+#include "qemu/osdep.h" -+#include "qapi/error.h" -+#include "hw/sysbus.h" -+#include "hw/vfio/vfio.h" -+#include "hw/vfio/vfio-common.h" -+#include "hw/s390x/ap-device.h" -+#include "qemu/error-report.h" -+#include "qemu/queue.h" -+#include "qemu/option.h" -+#include "qemu/config-file.h" -+#include "cpu.h" -+#include "kvm_s390x.h" -+#include "sysemu/sysemu.h" -+#include "hw/s390x/ap-bridge.h" -+#include "exec/address-spaces.h" -+ -+#define VFIO_AP_DEVICE_TYPE "vfio-ap" -+ -+typedef struct VFIOAPDevice { -+ APDevice apdev; -+ VFIODevice vdev; -+} VFIOAPDevice; -+ -+#define VFIO_AP_DEVICE(obj) \ -+ OBJECT_CHECK(VFIOAPDevice, (obj), VFIO_AP_DEVICE_TYPE) -+ -+static void vfio_ap_compute_needs_reset(VFIODevice *vdev) -+{ -+ vdev->needs_reset = false; -+} -+ -+/* -+ * We don't need vfio_hot_reset_multi and vfio_eoi operations for -+ * vfio-ap device now. -+ */ -+struct VFIODeviceOps vfio_ap_ops = { -+ .vfio_compute_needs_reset = vfio_ap_compute_needs_reset, -+}; -+ -+static void vfio_ap_put_device(VFIOAPDevice *vapdev) -+{ -+ g_free(vapdev->vdev.name); -+ vfio_put_base_device(&vapdev->vdev); -+} -+ -+static VFIOGroup *vfio_ap_get_group(VFIOAPDevice *vapdev, Error **errp) -+{ -+ GError *gerror = NULL; -+ char *symlink, *group_path; -+ int groupid; -+ -+ symlink = g_strdup_printf("%s/iommu_group", vapdev->vdev.sysfsdev); -+ group_path = g_file_read_link(symlink, &gerror); -+ g_free(symlink); -+ -+ if (!group_path) { -+ error_setg(errp, "%s: no iommu_group found for %s: %s", -+ VFIO_AP_DEVICE_TYPE, vapdev->vdev.sysfsdev, gerror->message); -+ return NULL; -+ } -+ -+ if (sscanf(basename(group_path), "%d", &groupid) != 1) { -+ error_setg(errp, "vfio: failed to read %s", group_path); -+ g_free(group_path); -+ return NULL; -+ } -+ -+ g_free(group_path); -+ -+ return vfio_get_group(groupid, &address_space_memory, errp); -+} -+ -+static void vfio_ap_realize(DeviceState *dev, Error **errp) -+{ -+ int ret; -+ char *mdevid; -+ Error *local_err = NULL; -+ VFIOGroup *vfio_group; -+ APDevice *apdev = AP_DEVICE(dev); -+ VFIOAPDevice *vapdev = VFIO_AP_DEVICE(apdev); -+ -+ vfio_group = vfio_ap_get_group(vapdev, &local_err); -+ if (!vfio_group) { -+ goto out_err; -+ } -+ -+ vapdev->vdev.ops = &vfio_ap_ops; -+ vapdev->vdev.type = VFIO_DEVICE_TYPE_AP; -+ mdevid = basename(vapdev->vdev.sysfsdev); -+ vapdev->vdev.name = g_strdup_printf("%s", mdevid); -+ vapdev->vdev.dev = dev; -+ -+ ret = vfio_get_device(vfio_group, mdevid, &vapdev->vdev, &local_err); -+ if (ret) { -+ goto out_get_dev_err; -+ } -+ -+ return; -+ -+out_get_dev_err: -+ vfio_ap_put_device(vapdev); -+ vfio_put_group(vfio_group); -+out_err: -+ error_propagate(errp, local_err); -+} -+ -+static void vfio_ap_unrealize(DeviceState *dev, Error **errp) -+{ -+ APDevice *apdev = AP_DEVICE(dev); -+ VFIOAPDevice *vapdev = VFIO_AP_DEVICE(apdev); -+ VFIOGroup *group = vapdev->vdev.group; -+ -+ vfio_ap_put_device(vapdev); -+ vfio_put_group(group); -+} -+ -+static Property vfio_ap_properties[] = { -+ DEFINE_PROP_STRING("sysfsdev", VFIOAPDevice, vdev.sysfsdev), -+ DEFINE_PROP_END_OF_LIST(), -+}; -+ -+static void vfio_ap_reset(DeviceState *dev) -+{ -+ int ret; -+ APDevice *apdev = AP_DEVICE(dev); -+ VFIOAPDevice *vapdev = VFIO_AP_DEVICE(apdev); -+ -+ ret = ioctl(vapdev->vdev.fd, VFIO_DEVICE_RESET); -+ if (ret) { -+ error_report("%s: failed to reset %s device: %s", __func__, -+ vapdev->vdev.name, strerror(ret)); -+ } -+} -+ -+static const VMStateDescription vfio_ap_vmstate = { -+ .name = VFIO_AP_DEVICE_TYPE, -+ .unmigratable = 1, -+}; -+ -+static void vfio_ap_class_init(ObjectClass *klass, void *data) -+{ -+ DeviceClass *dc = DEVICE_CLASS(klass); -+ -+ dc->props = vfio_ap_properties; -+ dc->vmsd = &vfio_ap_vmstate; -+ dc->desc = "VFIO-based AP device assignment"; -+ set_bit(DEVICE_CATEGORY_MISC, dc->categories); -+ dc->realize = vfio_ap_realize; -+ dc->unrealize = vfio_ap_unrealize; -+ dc->hotpluggable = false; -+ dc->reset = vfio_ap_reset; -+ dc->bus_type = TYPE_AP_BUS; -+} -+ -+static const TypeInfo vfio_ap_info = { -+ .name = VFIO_AP_DEVICE_TYPE, -+ .parent = AP_DEVICE_TYPE, -+ .instance_size = sizeof(VFIOAPDevice), -+ .class_init = vfio_ap_class_init, -+}; -+ -+static void vfio_ap_type_init(void) -+{ -+ type_register_static(&vfio_ap_info); -+} -+ -+type_init(vfio_ap_type_init) -diff --git a/include/hw/vfio/vfio-common.h b/include/hw/vfio/vfio-common.h -index a903692..1389da4 100644 ---- a/include/hw/vfio/vfio-common.h -+++ b/include/hw/vfio/vfio-common.h -@@ -37,6 +37,7 @@ enum { - VFIO_DEVICE_TYPE_PCI = 0, - VFIO_DEVICE_TYPE_PLATFORM = 1, - VFIO_DEVICE_TYPE_CCW = 2, -+ VFIO_DEVICE_TYPE_AP = 3, - }; - - typedef struct VFIOMmap { --- -1.8.3.1 - diff --git a/0074-s390-doc-detailed-specifications-for-AP-virtualizati.patch b/0074-s390-doc-detailed-specifications-for-AP-virtualizati.patch deleted file mode 100644 index 166fbc5..0000000 --- a/0074-s390-doc-detailed-specifications-for-AP-virtualizati.patch +++ /dev/null @@ -1,889 +0,0 @@ -From 8f59c31a8b0c4cde4bc92126d7102c1be9da97d4 Mon Sep 17 00:00:00 2001 -From: Thomas Huth -Date: Mon, 15 Oct 2018 10:19:31 +0100 -Subject: s390: doc: detailed specifications for AP virtualization - -RH-Author: Thomas Huth -Message-id: <1539598771-16223-7-git-send-email-thuth@redhat.com> -Patchwork-id: 82699 -O-Subject: [RHEL-8 qemu-kvm PATCH 6/6] s390: doc: detailed specifications for AP virtualization -Bugzilla: 1508142 -RH-Acked-by: David Hildenbrand -RH-Acked-by: Cornelia Huck -RH-Acked-by: Jens Freimann - -From: Tony Krowiak - -This patch provides documentation describing the AP architecture and -design concepts behind the virtualization of AP devices. It also -includes an example of how to configure AP devices for exclusive -use of KVM guests. - -Signed-off-by: Tony Krowiak -Reviewed-by: Pierre Morel -Tested-by: Pierre Morel -Tested-by: Christian Borntraeger -Message-Id: <20181010170309.12045-7-akrowiak@linux.ibm.com> -Signed-off-by: Cornelia Huck -(cherry picked from commit 694a8d703bfe06226a0574f5ec4af17a2b7060ef) -Signed-off-by: Danilo C. L. de Paula ---- - MAINTAINERS | 2 + - docs/vfio-ap.txt | 825 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ - 2 files changed, 827 insertions(+) - create mode 100644 docs/vfio-ap.txt - -diff --git a/MAINTAINERS b/MAINTAINERS -index f2fa1b8..fdbfc04 100644 ---- a/MAINTAINERS -+++ b/MAINTAINERS -@@ -96,6 +96,7 @@ F: include/hw/watchdog/wdt_diag288.h - F: pc-bios/s390-ccw/ - F: pc-bios/s390-ccw.img - F: target/s390x/ -+F: docs/vfio-ap.txt - K: ^Subject:.*(?i)s390x? - T: git git://github.com/cohuck/qemu.git s390-next - L: qemu-s390x@nongnu.org -@@ -1196,6 +1197,7 @@ F: hw/s390x/ap-bridge.c - F: include/hw/s390x/ap-device.h - F: include/hw/s390x/ap-bridge.h - F: hw/vfio/ap.c -+F: docs/vfio-ap.txt - L: qemu-s390x@nongnu.org - - vhost -diff --git a/docs/vfio-ap.txt b/docs/vfio-ap.txt -new file mode 100644 -index 0000000..1233968 ---- /dev/null -+++ b/docs/vfio-ap.txt -@@ -0,0 +1,825 @@ -+Adjunct Processor (AP) Device -+============================= -+ -+Contents: -+========= -+* Introduction -+* AP Architectural Overview -+* Start Interpretive Execution (SIE) Instruction -+* AP Matrix Configuration on Linux Host -+* Starting a Linux Guest Configured with an AP Matrix -+* Example: Configure AP Matrices for Three Linux Guests -+ -+Introduction: -+============ -+The IBM Adjunct Processor (AP) Cryptographic Facility is comprised -+of three AP instructions and from 1 to 256 PCIe cryptographic adapter cards. -+These AP devices provide cryptographic functions to all CPUs assigned to a -+linux system running in an IBM Z system LPAR. -+ -+On s390x, AP adapter cards are exposed via the AP bus. This document -+describes how those cards may be made available to KVM guests using the -+VFIO mediated device framework. -+ -+AP Architectural Overview: -+========================= -+In order understand the terminology used in the rest of this document, let's -+start with some definitions: -+ -+* AP adapter -+ -+ An AP adapter is an IBM Z adapter card that can perform cryptographic -+ functions. There can be from 0 to 256 adapters assigned to an LPAR depending -+ on the machine model. Adapters assigned to the LPAR in which a linux host is -+ running will be available to the linux host. Each adapter is identified by a -+ number from 0 to 255; however, the maximum adapter number allowed is -+ determined by machine model. When installed, an AP adapter is accessed by -+ AP instructions executed by any CPU. -+ -+* AP domain -+ -+ An adapter is partitioned into domains. Each domain can be thought of as -+ a set of hardware registers for processing AP instructions. An adapter can -+ hold up to 256 domains; however, the maximum domain number allowed is -+ determined by machine model. Each domain is identified by a number from 0 to -+ 255. Domains can be further classified into two types: -+ -+ * Usage domains are domains that can be accessed directly to process AP -+ commands -+ -+ * Control domains are domains that are accessed indirectly by AP -+ commands sent to a usage domain to control or change the domain; for -+ example, to set a secure private key for the domain. -+ -+* AP Queue -+ -+ An AP queue is the means by which an AP command-request message is sent to an -+ AP usage domain inside a specific AP. An AP queue is identified by a tuple -+ comprised of an AP adapter ID (APID) and an AP queue index (APQI). The -+ APQI corresponds to a given usage domain number within the adapter. This tuple -+ forms an AP Queue Number (APQN) uniquely identifying an AP queue. AP -+ instructions include a field containing the APQN to identify the AP queue to -+ which the AP command-request message is to be sent for processing. -+ -+* AP Instructions: -+ -+ There are three AP instructions: -+ -+ * NQAP: to enqueue an AP command-request message to a queue -+ * DQAP: to dequeue an AP command-reply message from a queue -+ * PQAP: to administer the queues -+ -+ AP instructions identify the domain that is targeted to process the AP -+ command; this must be one of the usage domains. An AP command may modify a -+ domain that is not one of the usage domains, but the modified domain -+ must be one of the control domains. -+ -+Start Interpretive Execution (SIE) Instruction -+============================================== -+A KVM guest is started by executing the Start Interpretive Execution (SIE) -+instruction. The SIE state description is a control block that contains the -+state information for a KVM guest and is supplied as input to the SIE -+instruction. The SIE state description contains a satellite control block called -+the Crypto Control Block (CRYCB). The CRYCB contains three fields to identify -+the adapters, usage domains and control domains assigned to the KVM guest: -+ -+* The AP Mask (APM) field is a bit mask that identifies the AP adapters assigned -+ to the KVM guest. Each bit in the mask, from left to right, corresponds to -+ an APID from 0-255. If a bit is set, the corresponding adapter is valid for -+ use by the KVM guest. -+ -+* The AP Queue Mask (AQM) field is a bit mask identifying the AP usage domains -+ assigned to the KVM guest. Each bit in the mask, from left to right, -+ corresponds to an AP queue index (APQI) from 0-255. If a bit is set, the -+ corresponding queue is valid for use by the KVM guest. -+ -+* The AP Domain Mask field is a bit mask that identifies the AP control domains -+ assigned to the KVM guest. The ADM bit mask controls which domains can be -+ changed by an AP command-request message sent to a usage domain from the -+ guest. Each bit in the mask, from left to right, corresponds to a domain from -+ 0-255. If a bit is set, the corresponding domain can be modified by an AP -+ command-request message sent to a usage domain. -+ -+If you recall from the description of an AP Queue, AP instructions include -+an APQN to identify the AP adapter and AP queue to which an AP command-request -+message is to be sent (NQAP and PQAP instructions), or from which a -+command-reply message is to be received (DQAP instruction). The validity of an -+APQN is defined by the matrix calculated from the APM and AQM; it is the -+cross product of all assigned adapter numbers (APM) with all assigned queue -+indexes (AQM). For example, if adapters 1 and 2 and usage domains 5 and 6 are -+assigned to a guest, the APQNs (1,5), (1,6), (2,5) and (2,6) will be valid for -+the guest. -+ -+The APQNs can provide secure key functionality - i.e., a private key is stored -+on the adapter card for each of its domains - so each APQN must be assigned to -+at most one guest or the linux host. -+ -+ Example 1: Valid configuration: -+ ------------------------------ -+ Guest1: adapters 1,2 domains 5,6 -+ Guest2: adapter 1,2 domain 7 -+ -+ This is valid because both guests have a unique set of APQNs: Guest1 has -+ APQNs (1,5), (1,6), (2,5) and (2,6); Guest2 has APQNs (1,7) and (2,7). -+ -+ Example 2: Valid configuration: -+ ------------------------------ -+ Guest1: adapters 1,2 domains 5,6 -+ Guest2: adapters 3,4 domains 5,6 -+ -+ This is also valid because both guests have a unique set of APQNs: -+ Guest1 has APQNs (1,5), (1,6), (2,5), (2,6); -+ Guest2 has APQNs (3,5), (3,6), (4,5), (4,6) -+ -+ Example 3: Invalid configuration: -+ -------------------------------- -+ Guest1: adapters 1,2 domains 5,6 -+ Guest2: adapter 1 domains 6,7 -+ -+ This is an invalid configuration because both guests have access to -+ APQN (1,6). -+ -+AP Matrix Configuration on Linux Host: -+===================================== -+A linux system is a guest of the LPAR in which it is running and has access to -+the AP resources configured for the LPAR. The LPAR's AP matrix is -+configured via its Activation Profile which can be edited on the HMC. When the -+linux system is started, the AP bus will detect the AP devices assigned to the -+LPAR and create the following in sysfs: -+ -+/sys/bus/ap -+... [devices] -+...... xx.yyyy -+...... ... -+...... cardxx -+...... ... -+ -+Where: -+ cardxx is AP adapter number xx (in hex) -+....xx.yyyy is an APQN with xx specifying the APID and yyyy specifying the -+ APQI -+ -+For example, if AP adapters 5 and 6 and domains 4, 71 (0x47), 171 (0xab) and -+255 (0xff) are configured for the LPAR, the sysfs representation on the linux -+host system would look like this: -+ -+/sys/bus/ap -+... [devices] -+...... 05.0004 -+...... 05.0047 -+...... 05.00ab -+...... 05.00ff -+...... 06.0004 -+...... 06.0047 -+...... 06.00ab -+...... 06.00ff -+...... card05 -+...... card06 -+ -+A set of default device drivers are also created to control each type of AP -+device that can be assigned to the LPAR on which a linux host is running: -+ -+/sys/bus/ap -+... [drivers] -+...... [cex2acard] for Crypto Express 2/3 accelerator cards -+...... [cex2aqueue] for AP queues served by Crypto Express 2/3 -+ accelerator cards -+...... [cex4card] for Crypto Express 4/5/6 accelerator and coprocessor -+ cards -+...... [cex4queue] for AP queues served by Crypto Express 4/5/6 -+ accelerator and coprocessor cards -+...... [pcixcccard] for Crypto Express 2/3 coprocessor cards -+...... [pcixccqueue] for AP queues served by Crypto Express 2/3 -+ coprocessor cards -+ -+Binding AP devices to device drivers -+------------------------------------ -+There are two sysfs files that specify bitmasks marking a subset of the APQN -+range as 'usable by the default AP queue device drivers' or 'not usable by the -+default device drivers' and thus available for use by the alternate device -+driver(s). The sysfs locations of the masks are: -+ -+ /sys/bus/ap/apmask -+ /sys/bus/ap/aqmask -+ -+ The 'apmask' is a 256-bit mask that identifies a set of AP adapter IDs -+ (APID). Each bit in the mask, from left to right (i.e., from most significant -+ to least significant bit in big endian order), corresponds to an APID from -+ 0-255. If a bit is set, the APID is marked as usable only by the default AP -+ queue device drivers; otherwise, the APID is usable by the vfio_ap -+ device driver. -+ -+ The 'aqmask' is a 256-bit mask that identifies a set of AP queue indexes -+ (APQI). Each bit in the mask, from left to right (i.e., from most significant -+ to least significant bit in big endian order), corresponds to an APQI from -+ 0-255. If a bit is set, the APQI is marked as usable only by the default AP -+ queue device drivers; otherwise, the APQI is usable by the vfio_ap device -+ driver. -+ -+ Take, for example, the following mask: -+ -+ 0x7dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -+ -+ It indicates: -+ -+ 1, 2, 3, 4, 5, and 7-255 belong to the default drivers' pool, and 0 and 6 -+ belong to the vfio_ap device driver's pool. -+ -+ The APQN of each AP queue device assigned to the linux host is checked by the -+ AP bus against the set of APQNs derived from the cross product of APIDs -+ and APQIs marked as usable only by the default AP queue device drivers. If a -+ match is detected, only the default AP queue device drivers will be probed; -+ otherwise, the vfio_ap device driver will be probed. -+ -+ By default, the two masks are set to reserve all APQNs for use by the default -+ AP queue device drivers. There are two ways the default masks can be changed: -+ -+ 1. The sysfs mask files can be edited by echoing a string into the -+ respective sysfs mask file in one of two formats: -+ -+ * An absolute hex string starting with 0x - like "0x12345678" - sets -+ the mask. If the given string is shorter than the mask, it is padded -+ with 0s on the right; for example, specifying a mask value of 0x41 is -+ the same as specifying: -+ -+ 0x4100000000000000000000000000000000000000000000000000000000000000 -+ -+ Keep in mind that the mask reads from left to right (i.e., most -+ significant to least significant bit in big endian order), so the mask -+ above identifies device numbers 1 and 7 (01000001). -+ -+ If the string is longer than the mask, the operation is terminated with -+ an error (EINVAL). -+ -+ * Individual bits in the mask can be switched on and off by specifying -+ each bit number to be switched in a comma separated list. Each bit -+ number string must be prepended with a ('+') or minus ('-') to indicate -+ the corresponding bit is to be switched on ('+') or off ('-'). Some -+ valid values are: -+ -+ "+0" switches bit 0 on -+ "-13" switches bit 13 off -+ "+0x41" switches bit 65 on -+ "-0xff" switches bit 255 off -+ -+ The following example: -+ +0,-6,+0x47,-0xf0 -+ -+ Switches bits 0 and 71 (0x47) on -+ Switches bits 6 and 240 (0xf0) off -+ -+ Note that the bits not specified in the list remain as they were before -+ the operation. -+ -+ 2. The masks can also be changed at boot time via parameters on the kernel -+ command line like this: -+ -+ ap.apmask=0xffff ap.aqmask=0x40 -+ -+ This would create the following masks: -+ -+ apmask: -+ 0xffff000000000000000000000000000000000000000000000000000000000000 -+ -+ aqmask: -+ 0x4000000000000000000000000000000000000000000000000000000000000000 -+ -+ Resulting in these two pools: -+ -+ default drivers pool: adapter 0-15, domain 1 -+ alternate drivers pool: adapter 16-255, domains 0, 2-255 -+ -+Configuring an AP matrix for a linux guest. -+------------------------------------------ -+The sysfs interfaces for configuring an AP matrix for a guest are built on the -+VFIO mediated device framework. To configure an AP matrix for a guest, a -+mediated matrix device must first be created for the /sys/devices/vfio_ap/matrix -+device. When the vfio_ap device driver is loaded, it registers with the VFIO -+mediated device framework. When the driver registers, the sysfs interfaces for -+creating mediated matrix devices is created: -+ -+/sys/devices -+... [vfio_ap] -+......[matrix] -+......... [mdev_supported_types] -+............ [vfio_ap-passthrough] -+............... create -+............... [devices] -+ -+A mediated AP matrix device is created by writing a UUID to the attribute file -+named 'create', for example: -+ -+ uuidgen > create -+ -+ or -+ -+ echo $uuid > create -+ -+When a mediated AP matrix device is created, a sysfs directory named after -+the UUID is created in the 'devices' subdirectory: -+ -+/sys/devices -+... [vfio_ap] -+......[matrix] -+......... [mdev_supported_types] -+............ [vfio_ap-passthrough] -+............... create -+............... [devices] -+.................. [$uuid] -+ -+There will also be three sets of attribute files created in the mediated -+matrix device's sysfs directory to configure an AP matrix for the -+KVM guest: -+ -+/sys/devices -+... [vfio_ap] -+......[matrix] -+......... [mdev_supported_types] -+............ [vfio_ap-passthrough] -+............... create -+............... [devices] -+.................. [$uuid] -+..................... assign_adapter -+..................... assign_control_domain -+..................... assign_domain -+..................... matrix -+..................... unassign_adapter -+..................... unassign_control_domain -+..................... unassign_domain -+ -+assign_adapter -+ To assign an AP adapter to the mediated matrix device, its APID is written -+ to the 'assign_adapter' file. This may be done multiple times to assign more -+ than one adapter. The APID may be specified using conventional semantics -+ as a decimal, hexadecimal, or octal number. For example, to assign adapters -+ 4, 5 and 16 to a mediated matrix device in decimal, hexadecimal and octal -+ respectively: -+ -+ echo 4 > assign_adapter -+ echo 0x5 > assign_adapter -+ echo 020 > assign_adapter -+ -+ In order to successfully assign an adapter: -+ -+ * The adapter number specified must represent a value from 0 up to the -+ maximum adapter number allowed by the machine model. If an adapter number -+ higher than the maximum is specified, the operation will terminate with -+ an error (ENODEV). -+ -+ * All APQNs that can be derived from the adapter ID being assigned and the -+ IDs of the previously assigned domains must be bound to the vfio_ap device -+ driver. If no domains have yet been assigned, then there must be at least -+ one APQN with the specified APID bound to the vfio_ap driver. If no such -+ APQNs are bound to the driver, the operation will terminate with an -+ error (EADDRNOTAVAIL). -+ -+ No APQN that can be derived from the adapter ID and the IDs of the -+ previously assigned domains can be assigned to another mediated matrix -+ device. If an APQN is assigned to another mediated matrix device, the -+ operation will terminate with an error (EADDRINUSE). -+ -+unassign_adapter -+ To unassign an AP adapter, its APID is written to the 'unassign_adapter' -+ file. This may also be done multiple times to unassign more than one adapter. -+ -+assign_domain -+ To assign a usage domain, the domain number is written into the -+ 'assign_domain' file. This may be done multiple times to assign more than one -+ usage domain. The domain number is specified using conventional semantics as -+ a decimal, hexadecimal, or octal number. For example, to assign usage domains -+ 4, 8, and 71 to a mediated matrix device in decimal, hexadecimal and octal -+ respectively: -+ -+ echo 4 > assign_domain -+ echo 0x8 > assign_domain -+ echo 0107 > assign_domain -+ -+ In order to successfully assign a domain: -+ -+ * The domain number specified must represent a value from 0 up to the -+ maximum domain number allowed by the machine model. If a domain number -+ higher than the maximum is specified, the operation will terminate with -+ an error (ENODEV). -+ -+ * All APQNs that can be derived from the domain ID being assigned and the IDs -+ of the previously assigned adapters must be bound to the vfio_ap device -+ driver. If no domains have yet been assigned, then there must be at least -+ one APQN with the specified APQI bound to the vfio_ap driver. If no such -+ APQNs are bound to the driver, the operation will terminate with an -+ error (EADDRNOTAVAIL). -+ -+ No APQN that can be derived from the domain ID being assigned and the IDs -+ of the previously assigned adapters can be assigned to another mediated -+ matrix device. If an APQN is assigned to another mediated matrix device, -+ the operation will terminate with an error (EADDRINUSE). -+ -+unassign_domain -+ To unassign a usage domain, the domain number is written into the -+ 'unassign_domain' file. This may be done multiple times to unassign more than -+ one usage domain. -+ -+assign_control_domain -+ To assign a control domain, the domain number is written into the -+ 'assign_control_domain' file. This may be done multiple times to -+ assign more than one control domain. The domain number may be specified using -+ conventional semantics as a decimal, hexadecimal, or octal number. For -+ example, to assign control domains 4, 8, and 71 to a mediated matrix device -+ in decimal, hexadecimal and octal respectively: -+ -+ echo 4 > assign_domain -+ echo 0x8 > assign_domain -+ echo 0107 > assign_domain -+ -+ In order to successfully assign a control domain, the domain number -+ specified must represent a value from 0 up to the maximum domain number -+ allowed by the machine model. If a control domain number higher than the -+ maximum is specified, the operation will terminate with an error (ENODEV). -+ -+unassign_control_domain -+ To unassign a control domain, the domain number is written into the -+ 'unassign_domain' file. This may be done multiple times to unassign more than -+ one control domain. -+ -+Notes: Hot plug/unplug is not currently supported for mediated AP matrix -+devices, so no changes to the AP matrix will be allowed while a guest using -+the mediated matrix device is running. Attempts to assign an adapter, -+domain or control domain will be rejected and an error (EBUSY) returned. -+ -+Starting a Linux Guest Configured with an AP Matrix: -+=================================================== -+To provide a mediated matrix device for use by a guest, the following option -+must be specified on the QEMU command line: -+ -+ -device vfio_ap,sysfsdev=$path-to-mdev -+ -+The sysfsdev parameter specifies the path to the mediated matrix device. -+There are a number of ways to specify this path: -+ -+/sys/devices/vfio_ap/matrix/$uuid -+/sys/bus/mdev/devices/$uuid -+/sys/bus/mdev/drivers/vfio_mdev/$uuid -+/sys/devices/vfio_ap/matrix/mdev_supported_types/vfio_ap-passthrough/devices/$uuid -+ -+When the linux guest is started, the guest will open the mediated -+matrix device's file descriptor to get information about the mediated matrix -+device. The vfio_ap device driver will update the APM, AQM, and ADM fields in -+the guest's CRYCB with the adapter, usage domain and control domains assigned -+via the mediated matrix device's sysfs attribute files. Programs running on the -+linux guest will then: -+ -+1. Have direct access to the APQNs derived from the cross product of the AP -+ adapter numbers (APID) and queue indexes (APQI) specified in the APM and AQM -+ fields of the guests's CRYCB respectively. These APQNs identify the AP queues -+ that are valid for use by the guest; meaning, AP commands can be sent by the -+ guest to any of these queues for processing. -+ -+2. Have authorization to process AP commands to change a control domain -+ identified in the ADM field of the guest's CRYCB. The AP command must be sent -+ to a valid APQN (see 1 above). -+ -+CPU model features: -+ -+Three CPU model features are available for controlling guest access to AP -+facilities: -+ -+1. AP facilities feature -+ -+ The AP facilities feature indicates that AP facilities are installed on the -+ guest. This feature will be exposed for use only if the AP facilities -+ are installed on the host system. The feature is s390-specific and is -+ represented as a parameter of the -cpu option on the QEMU command line: -+ -+ qemu-system-s390x -cpu $model,ap=on|off -+ -+ Where: -+ -+ $model is the CPU model defined for the guest (defaults to the model of -+ the host system if not specified). -+ -+ ap=on|off indicates whether AP facilities are installed (on) or not -+ (off). The default for CPU models zEC12 or newer -+ is ap=on. AP facilities must be installed on the guest if a -+ vfio-ap device (-device vfio-ap,sysfsdev=$path) is configured -+ for the guest, or the guest will fail to start. -+ -+2. Query Configuration Information (QCI) facility -+ -+ The QCI facility is used by the AP bus running on the guest to query the -+ configuration of the AP facilities. This facility will be available -+ only if the QCI facility is installed on the host system. The feature is -+ s390-specific and is represented as a parameter of the -cpu option on the -+ QEMU command line: -+ -+ qemu-system-s390x -cpu $model,apqci=on|off -+ -+ Where: -+ -+ $model is the CPU model defined for the guest -+ -+ apqci=on|off indicates whether the QCI facility is installed (on) or -+ not (off). The default for CPU models zEC12 or newer -+ is apqci=on; for older models, QCI will not be installed. -+ -+ If QCI is installed (apqci=on) but AP facilities are not -+ (ap=off), an error message will be logged, but the guest -+ will be allowed to start. It makes no sense to have QCI -+ installed if the AP facilities are not; this is considered -+ an invalid configuration. -+ -+ If the QCI facility is not installed, APQNs with an APQI -+ greater than 15 will not be detected by the AP bus -+ running on the guest. -+ -+3. Adjunct Process Facility Test (APFT) facility -+ -+ The APFT facility is used by the AP bus running on the guest to test the -+ AP facilities available for a given AP queue. This facility will be available -+ only if the APFT facility is installed on the host system. The feature is -+ s390-specific and is represented as a parameter of the -cpu option on the -+ QEMU command line: -+ -+ qemu-system-s390x -cpu $model,apft=on|off -+ -+ Where: -+ -+ $model is the CPU model defined for the guest (defaults to the model of -+ the host system if not specified). -+ -+ apft=on|off indicates whether the APFT facility is installed (on) or -+ not (off). The default for CPU models zEC12 and -+ newer is apft=on for older models, APFT will not be -+ installed. -+ -+ If APFT is installed (apft=on) but AP facilities are not -+ (ap=off), an error message will be logged, but the guest -+ will be allowed to start. It makes no sense to have APFT -+ installed if the AP facilities are not; this is considered -+ an invalid configuration. -+ -+ It also makes no sense to turn APFT off because the AP bus -+ running on the guest will not detect CEX4 and newer devices -+ without it. Since only CEX4 and newer devices are supported -+ for guest usage, no AP devices can be made accessible to a -+ guest started without APFT installed. -+ -+Example: Configure AP Matrixes for Three Linux Guests: -+===================================================== -+Let's now provide an example to illustrate how KVM guests may be given -+access to AP facilities. For this example, we will show how to configure -+three guests such that executing the lszcrypt command on the guests would -+look like this: -+ -+Guest1 -+------ -+CARD.DOMAIN TYPE MODE -+------------------------------ -+05 CEX5C CCA-Coproc -+05.0004 CEX5C CCA-Coproc -+05.00ab CEX5C CCA-Coproc -+06 CEX5A Accelerator -+06.0004 CEX5A Accelerator -+06.00ab CEX5C CCA-Coproc -+ -+Guest2 -+------ -+CARD.DOMAIN TYPE MODE -+------------------------------ -+05 CEX5A Accelerator -+05.0047 CEX5A Accelerator -+05.00ff CEX5A Accelerator (5,4), (5,171), (6,4), (6,171), -+ -+Guest3 -+------ -+CARD.DOMAIN TYPE MODE -+------------------------------ -+06 CEX5A Accelerator -+06.0047 CEX5A Accelerator -+06.00ff CEX5A Accelerator -+ -+These are the steps: -+ -+1. Install the vfio_ap module on the linux host. The dependency chain for the -+ vfio_ap module is: -+ * iommu -+ * s390 -+ * zcrypt -+ * vfio -+ * vfio_mdev -+ * vfio_mdev_device -+ * KVM -+ -+ To build the vfio_ap module, the kernel build must be configured with the -+ following Kconfig elements selected: -+ * IOMMU_SUPPORT -+ * S390 -+ * ZCRYPT -+ * S390_AP_IOMMU -+ * VFIO -+ * VFIO_MDEV -+ * VFIO_MDEV_DEVICE -+ * KVM -+ -+ If using make menuconfig select the following to build the vfio_ap module: -+ -> Device Drivers -+ -> IOMMU Hardware Support -+ select S390 AP IOMMU Support -+ -> VFIO Non-Privileged userspace driver framework -+ -> Mediated device driver frramework -+ -> VFIO driver for Mediated devices -+ -> I/O subsystem -+ -> VFIO support for AP devices -+ -+2. Secure the AP queues to be used by the three guests so that the host can not -+ access them. To secure the AP queues 05.0004, 05.0047, 05.00ab, 05.00ff, -+ 06.0004, 06.0047, 06.00ab, and 06.00ff for use by the vfio_ap device driver, -+ the corresponding APQNs must be removed from the default queue drivers pool -+ as follows: -+ -+ echo -5,-6 > /sys/bus/ap/apmask -+ -+ echo -4,-0x47,-0xab,-0xff > /sys/bus/ap/aqmask -+ -+ This will result in AP queues 05.0004, 05.0047, 05.00ab, 05.00ff, 06.0004, -+ 06.0047, 06.00ab, and 06.00ff getting bound to the vfio_ap device driver. The -+ sysfs directory for the vfio_ap device driver will now contain symbolic links -+ to the AP queue devices bound to it: -+ -+ /sys/bus/ap -+ ... [drivers] -+ ...... [vfio_ap] -+ ......... [05.0004] -+ ......... [05.0047] -+ ......... [05.00ab] -+ ......... [05.00ff] -+ ......... [06.0004] -+ ......... [06.0047] -+ ......... [06.00ab] -+ ......... [06.00ff] -+ -+ Keep in mind that only type 10 and newer adapters (i.e., CEX4 and later) -+ can be bound to the vfio_ap device driver. The reason for this is to -+ simplify the implementation by not needlessly complicating the design by -+ supporting older devices that will go out of service in the relatively near -+ future, and for which there are few older systems on which to test. -+ -+ The administrator, therefore, must take care to secure only AP queues that -+ can be bound to the vfio_ap device driver. The device type for a given AP -+ queue device can be read from the parent card's sysfs directory. For example, -+ to see the hardware type of the queue 05.0004: -+ -+ cat /sys/bus/ap/devices/card05/hwtype -+ -+ The hwtype must be 10 or higher (CEX4 or newer) in order to be bound to the -+ vfio_ap device driver. -+ -+3. Create the mediated devices needed to configure the AP matrixes for the -+ three guests and to provide an interface to the vfio_ap driver for -+ use by the guests: -+ -+ /sys/devices/vfio_ap/matrix/ -+ --- [mdev_supported_types] -+ ------ [vfio_ap-passthrough] (passthrough mediated matrix device type) -+ --------- create -+ --------- [devices] -+ -+ To create the mediated devices for the three guests: -+ -+ uuidgen > create -+ uuidgen > create -+ uuidgen > create -+ -+ or -+ -+ echo $uuid1 > create -+ echo $uuid2 > create -+ echo $uuid3 > create -+ -+ This will create three mediated devices in the [devices] subdirectory named -+ after the UUID used to create the mediated device. We'll call them $uuid1, -+ $uuid2 and $uuid3 and this is the sysfs directory structure after creation: -+ -+ /sys/devices/vfio_ap/matrix/ -+ --- [mdev_supported_types] -+ ------ [vfio_ap-passthrough] -+ --------- [devices] -+ ------------ [$uuid1] -+ --------------- assign_adapter -+ --------------- assign_control_domain -+ --------------- assign_domain -+ --------------- matrix -+ --------------- unassign_adapter -+ --------------- unassign_control_domain -+ --------------- unassign_domain -+ -+ ------------ [$uuid2] -+ --------------- assign_adapter -+ --------------- assign_control_domain -+ --------------- assign_domain -+ --------------- matrix -+ --------------- unassign_adapter -+ ----------------unassign_control_domain -+ ----------------unassign_domain -+ -+ ------------ [$uuid3] -+ --------------- assign_adapter -+ --------------- assign_control_domain -+ --------------- assign_domain -+ --------------- matrix -+ --------------- unassign_adapter -+ ----------------unassign_control_domain -+ ----------------unassign_domain -+ -+4. The administrator now needs to configure the matrixes for the mediated -+ devices $uuid1 (for Guest1), $uuid2 (for Guest2) and $uuid3 (for Guest3). -+ -+ This is how the matrix is configured for Guest1: -+ -+ echo 5 > assign_adapter -+ echo 6 > assign_adapter -+ echo 4 > assign_domain -+ echo 0xab > assign_domain -+ -+ Control domains can similarly be assigned using the assign_control_domain -+ sysfs file. -+ -+ If a mistake is made configuring an adapter, domain or control domain, -+ you can use the unassign_xxx interfaces to unassign the adapter, domain or -+ control domain. -+ -+ To display the matrix configuration for Guest1: -+ -+ cat matrix -+ -+ The output will display the APQNs in the format xx.yyyy, where xx is -+ the adapter number and yyyy is the domain number. The output for Guest1 -+ will look like this: -+ -+ 05.0004 -+ 05.00ab -+ 06.0004 -+ 06.00ab -+ -+ This is how the matrix is configured for Guest2: -+ -+ echo 5 > assign_adapter -+ echo 0x47 > assign_domain -+ echo 0xff > assign_domain -+ -+ This is how the matrix is configured for Guest3: -+ -+ echo 6 > assign_adapter -+ echo 0x47 > assign_domain -+ echo 0xff > assign_domain -+ -+5. Start Guest1: -+ -+ /usr/bin/qemu-system-s390x ... -cpu host,ap=on,apqci=on,apft=on \ -+ -device vfio-ap,sysfsdev=/sys/devices/vfio_ap/matrix/$uuid1 ... -+ -+7. Start Guest2: -+ -+ /usr/bin/qemu-system-s390x ... -cpu host,ap=on,apqci=on,apft=on \ -+ -device vfio-ap,sysfsdev=/sys/devices/vfio_ap/matrix/$uuid2 ... -+ -+7. Start Guest3: -+ -+ /usr/bin/qemu-system-s390x ... -cpu host,ap=on,apqci=on,apft=on \ -+ -device vfio-ap,sysfsdev=/sys/devices/vfio_ap/matrix/$uuid3 ... -+ -+When the guest is shut down, the mediated matrix devices may be removed. -+ -+Using our example again, to remove the mediated matrix device $uuid1: -+ -+ /sys/devices/vfio_ap/matrix/ -+ --- [mdev_supported_types] -+ ------ [vfio_ap-passthrough] -+ --------- [devices] -+ ------------ [$uuid1] -+ --------------- remove -+ -+ -+ echo 1 > remove -+ -+ This will remove all of the mdev matrix device's sysfs structures including -+ the mdev device itself. To recreate and reconfigure the mdev matrix device, -+ all of the steps starting with step 3 will have to be performed again. Note -+ that the remove will fail if a guest using the mdev is still running. -+ -+ It is not necessary to remove an mdev matrix device, but one may want to -+ remove it if no guest will use it during the remaining lifetime of the linux -+ host. If the mdev matrix device is removed, one may want to also reconfigure -+ the pool of adapters and queues reserved for use by the default drivers. -+ -+Limitations -+=========== -+* The KVM/kernel interfaces do not provide a way to prevent restoring an APQN -+ to the default drivers pool of a queue that is still assigned to a mediated -+ device in use by a guest. It is incumbent upon the administrator to -+ ensure there is no mediated device in use by a guest to which the APQN is -+ assigned lest the host be given access to the private data of the AP queue -+ device, such as a private key configured specifically for the guest. -+ -+* Dynamically modifying the AP matrix for a running guest (which would amount to -+ hot(un)plug of AP devices for the guest) is currently not supported -+ -+* Live guest migration is not supported for guests using AP devices. --- -1.8.3.1 - diff --git a/0075-vnc-call-sasl_server_init-only-when-required.patch b/0075-vnc-call-sasl_server_init-only-when-required.patch deleted file mode 100644 index 292688c..0000000 --- a/0075-vnc-call-sasl_server_init-only-when-required.patch +++ /dev/null @@ -1,89 +0,0 @@ -From dbf0257cf3587d5580765cbd2040f370820fb5e3 Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?Marc-Andr=C3=A9=20Lureau?= -Date: Tue, 2 Oct 2018 12:34:03 +0100 -Subject: vnc: call sasl_server_init() only when required -MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit - -RH-Author: Marc-André Lureau -Message-id: <20181002123403.20747-2-marcandre.lureau@redhat.com> -Patchwork-id: 82356 -O-Subject: [RHEL8/rhel qemu-kvm PATCH 1/1] vnc: call sasl_server_init() only when required -Bugzilla: 1609327 -RH-Acked-by: Daniel P. Berrange -RH-Acked-by: Thomas Huth -RH-Acked-by: Danilo de Paula - -VNC server is calling sasl_server_init() during startup of QEMU, even -if SASL auth has not been enabled. - -This may create undesirable warnings like "Could not find keytab file: -/etc/qemu/krb5.tab" when the user didn't configure SASL on host and -started VNC server. - -Instead, only initialize SASL when needed. Note that HMP/QMP "change -vnc" calls vnc_display_open() again, which will initialize SASL if -needed. - -Fix assignment in if condition, while touching this code. - -Related to: -https://bugzilla.redhat.com/show_bug.cgi?id=1609327 - -Signed-off-by: Marc-André Lureau -Reviewed-by: Daniel P. Berrangé -Message-id: 20180907063634.359-1-marcandre.lureau@redhat.com -Signed-off-by: Gerd Hoffmann - -(cherry picked from commit b5dc0d7d565048fcf2767060261d8385805aced1) - -BZ: https://bugzilla.redhat.com/show_bug.cgi?id=1609327 -Brew: https://brewweb.engineering.redhat.com/brew/taskinfo?taskID=18601393 -Signed-off-by: Danilo C. L. de Paula - -Conflicts: - ui/vnc.c - Due to "qemu"->"qemu-kvm" rename. - -Signed-off-by: Marc-André Lureau ---- - ui/vnc.c | 15 ++++++++------- - 1 file changed, 8 insertions(+), 7 deletions(-) - -diff --git a/ui/vnc.c b/ui/vnc.c -index 050c421..b3fe7d7 100644 ---- a/ui/vnc.c -+++ b/ui/vnc.c -@@ -3878,9 +3878,6 @@ void vnc_display_open(const char *id, Error **errp) - bool reverse = false; - const char *credid; - bool sasl = false; --#ifdef CONFIG_VNC_SASL -- int saslErr; --#endif - int acl = 0; - int lock_key_sync = 1; - int key_delay_ms; -@@ -4054,10 +4051,14 @@ void vnc_display_open(const char *id, Error **errp) - trace_vnc_auth_init(vd, 1, vd->ws_auth, vd->ws_subauth); - - #ifdef CONFIG_VNC_SASL -- if ((saslErr = sasl_server_init(NULL, "qemu-kvm")) != SASL_OK) { -- error_setg(errp, "Failed to initialize SASL auth: %s", -- sasl_errstring(saslErr, NULL, NULL)); -- goto fail; -+ if (sasl) { -+ int saslErr = sasl_server_init(NULL, "qemu-kvm"); -+ -+ if (saslErr != SASL_OK) { -+ error_setg(errp, "Failed to initialize SASL auth: %s", -+ sasl_errstring(saslErr, NULL, NULL)); -+ goto fail; -+ } - } - #endif - vd->lock_key_sync = lock_key_sync; --- -1.8.3.1 - diff --git a/0076-nbd-server-fix-NBD_CMD_CACHE.patch b/0076-nbd-server-fix-NBD_CMD_CACHE.patch deleted file mode 100644 index 05c36f6..0000000 --- a/0076-nbd-server-fix-NBD_CMD_CACHE.patch +++ /dev/null @@ -1,52 +0,0 @@ -From c10de200e291af4a6a5cb41ac10e1ae7a2b9c5b2 Mon Sep 17 00:00:00 2001 -From: John Snow -Date: Wed, 10 Oct 2018 18:19:23 +0100 -Subject: nbd/server: fix NBD_CMD_CACHE - -RH-Author: John Snow -Message-id: <20181010181924.30470-2-jsnow@redhat.com> -Patchwork-id: 82576 -O-Subject: [RHEL8/rhel qemu-kvm PATCH 1/2] nbd/server: fix NBD_CMD_CACHE -Bugzilla: 1636142 -RH-Acked-by: Stefan Hajnoczi -RH-Acked-by: Danilo de Paula -RH-Acked-by: Thomas Huth - -From: Vladimir Sementsov-Ogievskiy - -We should not go to structured-read branch on CACHE command, fix that. - -Bug introduced in bc37b06a5cde24 "nbd/server: introduce NBD_CMD_CACHE" -with the whole feature and affects 3.0.0 release. - -Signed-off-by: Vladimir Sementsov-Ogievskiy -CC: qemu-stable@nongnu.org -Message-Id: <20181003144738.70670-1-vsementsov@virtuozzo.com> -Reviewed-by: Eric Blake -[eblake: commit message typo fix] -Signed-off-by: Eric Blake -(cherry picked from commit 2f454defc23e1be78f2a96bad2877ce7829f61b4) -Signed-off-by: John Snow - -Signed-off-by: Danilo C. L. de Paula ---- - nbd/server.c | 3 ++- - 1 file changed, 2 insertions(+), 1 deletion(-) - -diff --git a/nbd/server.c b/nbd/server.c -index ea5fe0e..1ce3f44 100644 ---- a/nbd/server.c -+++ b/nbd/server.c -@@ -2135,7 +2135,8 @@ static coroutine_fn int nbd_do_cmd_read(NBDClient *client, NBDRequest *request, - } - - if (client->structured_reply && !(request->flags & NBD_CMD_FLAG_DF) && -- request->len) { -+ request->len && request->type != NBD_CMD_CACHE) -+ { - return nbd_co_send_sparse_read(client, request->handle, request->from, - data, request->len, errp); - } --- -1.8.3.1 - diff --git a/0077-nbd-fix-NBD_FLAG_SEND_CACHE-value.patch b/0077-nbd-fix-NBD_FLAG_SEND_CACHE-value.patch deleted file mode 100644 index c876e37..0000000 --- a/0077-nbd-fix-NBD_FLAG_SEND_CACHE-value.patch +++ /dev/null @@ -1,96 +0,0 @@ -From 24022cbbfd2230d4781a079d1856e0315895c8ce Mon Sep 17 00:00:00 2001 -From: John Snow -Date: Wed, 10 Oct 2018 18:19:24 +0100 -Subject: nbd: fix NBD_FLAG_SEND_CACHE value - -RH-Author: John Snow -Message-id: <20181010181924.30470-3-jsnow@redhat.com> -Patchwork-id: 82578 -O-Subject: [RHEL8/rhel qemu-kvm PATCH 2/2] nbd: fix NBD_FLAG_SEND_CACHE value -Bugzilla: 1636142 -RH-Acked-by: Stefan Hajnoczi -RH-Acked-by: Danilo de Paula -RH-Acked-by: Thomas Huth - -From: "Denis V. Lunev" - -Commit bc37b06a5 added NBD_CMD_CACHE support, but used the wrong value -for NBD_FLAG_SEND_CACHE flag for negotiation. That commit picked bit 8, -which had already been assigned by the NBD specification to mean -NBD_FLAG_CAN_MULTI_CONN, and which was already implemented in the -Linux kernel as a part of stable userspace-kernel API since 4.10: - -"bit 8, NBD_FLAG_CAN_MULTI_CONN: Indicates that the server operates -entirely without cache, or that the cache it uses is shared among all -connections to the given device. In particular, if this flag is -present, then the effects of NBD_CMD_FLUSH and NBD_CMD_FLAG_FUA -MUST be visible across all connections when the server sends its reply -to that command to the client. In the absense of this flag, clients -SHOULD NOT multiplex their commands over more than one connection to -the export. -... -bit 10, NBD_FLAG_SEND_CACHE: documents that the server understands -NBD_CMD_CACHE; however, note that server implementations exist -which support the command without advertising this bit, and -conversely that this bit does not guarantee that the command will -succeed or have an impact." - -Consequences: -- a client trying to use NBD_CMD_CACHE per the NBD spec will not -see the feature as available from a qemu 3.0 server (not fatal, -clients already have to be prepared for caching to not exist) -- a client accidentally coded to the qemu 3.0 bit value instead -of following the spec may interpret NBD_CMD_CACHE as being available -when it is not (probably not fatal, the spec says the server should -gracefully fail unknown commands, and that clients of NBD_CMD_CACHE -should be prepared for failure even when the feature is advertised); -such clients are unlikely (perhaps only in unreleased Virtuozzo code), -and will disappear over time -- a client prepared to use multiple connections based on -NBD_FLAG_CAN_MULTI_CONN may cause data corruption when it assumes -that caching is consistent when in reality qemu 3.0 did not have -a consistent cache. Partially mitigated by using read-only -connections (where nothing needs to be flushed, so caching is -indeed consistent) or when using qemu-nbd with the default -e 1 -(at most one client at a time); visible only when using -e 2 or -more for a writable export. - -Thus the commit fixes negotiation flag in QEMU according to the -specification. - -Signed-off-by: Denis V. Lunev -CC: Vladimir Sementsov-Ogievskiy -CC: Valery Vdovin -CC: Eric Blake -CC: Paolo Bonzini -CC: qemu-stable@nongnu.org -Message-Id: <20181004100313.4253-1-den@openvz.org> -Reviewed-by: Eric Blake -[eblake: enhance commit message, add defines for unimplemented flags] -Signed-off-by: Eric Blake -(cherry picked from commit df91328adab8490367776d2b21b35d790a606120) -Signed-off-by: John Snow - -Signed-off-by: Danilo C. L. de Paula ---- - include/block/nbd.h | 4 +++- - 1 file changed, 3 insertions(+), 1 deletion(-) - -diff --git a/include/block/nbd.h b/include/block/nbd.h -index 4638c83..a53b0cf 100644 ---- a/include/block/nbd.h -+++ b/include/block/nbd.h -@@ -135,7 +135,9 @@ typedef struct NBDExtent { - #define NBD_FLAG_SEND_TRIM (1 << 5) /* Send TRIM (discard) */ - #define NBD_FLAG_SEND_WRITE_ZEROES (1 << 6) /* Send WRITE_ZEROES */ - #define NBD_FLAG_SEND_DF (1 << 7) /* Send DF (Do not Fragment) */ --#define NBD_FLAG_SEND_CACHE (1 << 8) /* Send CACHE (prefetch) */ -+#define NBD_FLAG_CAN_MULTI_CONN (1 << 8) /* Multi-client cache consistent */ -+#define NBD_FLAG_SEND_RESIZE (1 << 9) /* Send resize */ -+#define NBD_FLAG_SEND_CACHE (1 << 10) /* Send CACHE (prefetch) */ - - /* New-style handshake (global) flags, sent from server to client, and - control what will happen during handshake phase. */ --- -1.8.3.1 - diff --git a/0078-block-linux-aio-acquire-AioContext-before-qemu_laio_.patch b/0078-block-linux-aio-acquire-AioContext-before-qemu_laio_.patch deleted file mode 100644 index 0e324f3..0000000 --- a/0078-block-linux-aio-acquire-AioContext-before-qemu_laio_.patch +++ /dev/null @@ -1,134 +0,0 @@ -From ca570895f9825c8ed6691bb520341ac9e07bac5a Mon Sep 17 00:00:00 2001 -From: Kevin Wolf -Date: Wed, 10 Oct 2018 20:21:52 +0100 -Subject: block/linux-aio: acquire AioContext before - qemu_laio_process_completions - -RH-Author: Kevin Wolf -Message-id: <20181010202213.7372-14-kwolf@redhat.com> -Patchwork-id: 82603 -O-Subject: [RHEL-8 qemu-kvm PATCH 23/44] block/linux-aio: acquire AioContext before qemu_laio_process_completions -Bugzilla: 1637976 -RH-Acked-by: Max Reitz -RH-Acked-by: John Snow -RH-Acked-by: Thomas Huth - -From: Sergio Lopez - -In qemu_laio_process_completions_and_submit, the AioContext is acquired -before the ioq_submit iteration and after qemu_laio_process_completions, -but the latter is not thread safe either. - -This change avoids a number of random crashes when the Main Thread and -an IO Thread collide processing completions for the same AioContext. -This is an example of such crash: - - - The IO Thread is trying to acquire the AioContext at aio_co_enter, - which evidences that it didn't lock it before: - -Thread 3 (Thread 0x7fdfd8bd8700 (LWP 36743)): - #0 0x00007fdfe0dd542d in __lll_lock_wait () at ../nptl/sysdeps/unix/sysv/linux/x86_64/lowlevellock.S:135 - #1 0x00007fdfe0dd0de6 in _L_lock_870 () at /lib64/libpthread.so.0 - #2 0x00007fdfe0dd0cdf in __GI___pthread_mutex_lock (mutex=mutex@entry=0x5631fde0e6c0) - at ../nptl/pthread_mutex_lock.c:114 - #3 0x00005631fc0603a7 in qemu_mutex_lock_impl (mutex=0x5631fde0e6c0, file=0x5631fc23520f "util/async.c", line=511) at util/qemu-thread-posix.c:66 - #4 0x00005631fc05b558 in aio_co_enter (ctx=0x5631fde0e660, co=0x7fdfcc0c2b40) at util/async.c:493 - #5 0x00005631fc05b5ac in aio_co_wake (co=) at util/async.c:478 - #6 0x00005631fbfc51ad in qemu_laio_process_completion (laiocb=) at block/linux-aio.c:104 - #7 0x00005631fbfc523c in qemu_laio_process_completions (s=s@entry=0x7fdfc0297670) - at block/linux-aio.c:222 - #8 0x00005631fbfc5499 in qemu_laio_process_completions_and_submit (s=0x7fdfc0297670) - at block/linux-aio.c:237 - #9 0x00005631fc05d978 in aio_dispatch_handlers (ctx=ctx@entry=0x5631fde0e660) at util/aio-posix.c:406 - #10 0x00005631fc05e3ea in aio_poll (ctx=0x5631fde0e660, blocking=blocking@entry=true) - at util/aio-posix.c:693 - #11 0x00005631fbd7ad96 in iothread_run (opaque=0x5631fde0e1c0) at iothread.c:64 - #12 0x00007fdfe0dcee25 in start_thread (arg=0x7fdfd8bd8700) at pthread_create.c:308 - #13 0x00007fdfe0afc34d in clone () at ../sysdeps/unix/sysv/linux/x86_64/clone.S:113 - - - The Main Thread is also processing completions from the same - AioContext, and crashes due to failed assertion at util/iov.c:78: - -Thread 1 (Thread 0x7fdfeb5eac80 (LWP 36740)): - #0 0x00007fdfe0a391f7 in __GI_raise (sig=sig@entry=6) at ../nptl/sysdeps/unix/sysv/linux/raise.c:56 - #1 0x00007fdfe0a3a8e8 in __GI_abort () at abort.c:90 - #2 0x00007fdfe0a32266 in __assert_fail_base (fmt=0x7fdfe0b84e68 "%s%s%s:%u: %s%sAssertion `%s' failed.\n%n", assertion=assertion@entry=0x5631fc238ccb "offset == 0", file=file@entry=0x5631fc23698e "util/iov.c", line=line@entry=78, function=function@entry=0x5631fc236adc <__PRETTY_FUNCTION__.15220> "iov_memset") - at assert.c:92 - #3 0x00007fdfe0a32312 in __GI___assert_fail (assertion=assertion@entry=0x5631fc238ccb "offset == 0", file=file@entry=0x5631fc23698e "util/iov.c", line=line@entry=78, function=function@entry=0x5631fc236adc <__PRETTY_FUNCTION__.15220> "iov_memset") at assert.c:101 - #4 0x00005631fc065287 in iov_memset (iov=, iov_cnt=, offset=, offset@entry=65536, fillc=fillc@entry=0, bytes=15515191315812405248) at util/iov.c:78 - #5 0x00005631fc065a63 in qemu_iovec_memset (qiov=, offset=offset@entry=65536, fillc=fillc@entry=0, bytes=) at util/iov.c:410 - #6 0x00005631fbfc5178 in qemu_laio_process_completion (laiocb=0x7fdd920df630) at block/linux-aio.c:88 - #7 0x00005631fbfc523c in qemu_laio_process_completions (s=s@entry=0x7fdfc0297670) - at block/linux-aio.c:222 - #8 0x00005631fbfc5499 in qemu_laio_process_completions_and_submit (s=0x7fdfc0297670) - at block/linux-aio.c:237 - #9 0x00005631fbfc54ed in qemu_laio_poll_cb (opaque=) at block/linux-aio.c:272 - #10 0x00005631fc05d85e in run_poll_handlers_once (ctx=ctx@entry=0x5631fde0e660) at util/aio-posix.c:497 - #11 0x00005631fc05e2ca in aio_poll (blocking=false, ctx=0x5631fde0e660) at util/aio-posix.c:574 - #12 0x00005631fc05e2ca in aio_poll (ctx=0x5631fde0e660, blocking=blocking@entry=false) - at util/aio-posix.c:604 - #13 0x00005631fbfcb8a3 in bdrv_do_drained_begin (ignore_parent=, recursive=, bs=) at block/io.c:273 - #14 0x00005631fbfcb8a3 in bdrv_do_drained_begin (bs=0x5631fe8b6200, recursive=, parent=0x0, ignore_bds_parents=, poll=) at block/io.c:390 - #15 0x00005631fbfbcd2e in blk_drain (blk=0x5631fe83ac80) at block/block-backend.c:1590 - #16 0x00005631fbfbe138 in blk_remove_bs (blk=blk@entry=0x5631fe83ac80) at block/block-backend.c:774 - #17 0x00005631fbfbe3d6 in blk_unref (blk=0x5631fe83ac80) at block/block-backend.c:401 - #18 0x00005631fbfbe3d6 in blk_unref (blk=0x5631fe83ac80) at block/block-backend.c:449 - #19 0x00005631fbfc9a69 in commit_complete (job=0x5631fe8b94b0, opaque=0x7fdfcc1bb080) - at block/commit.c:92 - #20 0x00005631fbf7d662 in job_defer_to_main_loop_bh (opaque=0x7fdfcc1b4560) at job.c:973 - #21 0x00005631fc05ad41 in aio_bh_poll (bh=0x7fdfcc01ad90) at util/async.c:90 - #22 0x00005631fc05ad41 in aio_bh_poll (ctx=ctx@entry=0x5631fddffdb0) at util/async.c:118 - #23 0x00005631fc05e210 in aio_dispatch (ctx=0x5631fddffdb0) at util/aio-posix.c:436 - #24 0x00005631fc05ac1e in aio_ctx_dispatch (source=, callback=, user_data=) at util/async.c:261 - #25 0x00007fdfeaae44c9 in g_main_context_dispatch (context=0x5631fde00140) at gmain.c:3201 - #26 0x00007fdfeaae44c9 in g_main_context_dispatch (context=context@entry=0x5631fde00140) at gmain.c:3854 - #27 0x00005631fc05d503 in main_loop_wait () at util/main-loop.c:215 - #28 0x00005631fc05d503 in main_loop_wait (timeout=) at util/main-loop.c:238 - #29 0x00005631fc05d503 in main_loop_wait (nonblocking=nonblocking@entry=0) at util/main-loop.c:497 - #30 0x00005631fbd81412 in main_loop () at vl.c:1866 - #31 0x00005631fbc18ff3 in main (argc=, argv=, envp=) - at vl.c:4647 - - - A closer examination shows that s->io_q.in_flight appears to have - gone backwards: - -(gdb) frame 7 - #7 0x00005631fbfc523c in qemu_laio_process_completions (s=s@entry=0x7fdfc0297670) - at block/linux-aio.c:222 -222 qemu_laio_process_completion(laiocb); -(gdb) p s -$2 = (LinuxAioState *) 0x7fdfc0297670 -(gdb) p *s -$3 = {aio_context = 0x5631fde0e660, ctx = 0x7fdfeb43b000, e = {rfd = 33, wfd = 33}, io_q = {plugged = 0, - in_queue = 0, in_flight = 4294967280, blocked = false, pending = {sqh_first = 0x0, - sqh_last = 0x7fdfc0297698}}, completion_bh = 0x7fdfc0280ef0, event_idx = 21, event_max = 241} -(gdb) p/x s->io_q.in_flight -$4 = 0xfffffff0 - -Signed-off-by: Sergio Lopez -Signed-off-by: Kevin Wolf -(cherry picked from commit e091f0e905a4481f347913420f327d427f18d9d4) -Signed-off-by: Kevin Wolf -Signed-off-by: Danilo C. L. de Paula ---- - block/linux-aio.c | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -diff --git a/block/linux-aio.c b/block/linux-aio.c -index 19eb922..217ce60 100644 ---- a/block/linux-aio.c -+++ b/block/linux-aio.c -@@ -234,9 +234,9 @@ static void qemu_laio_process_completions(LinuxAioState *s) - - static void qemu_laio_process_completions_and_submit(LinuxAioState *s) - { -+ aio_context_acquire(s->aio_context); - qemu_laio_process_completions(s); - -- aio_context_acquire(s->aio_context); - if (!s->io_q.plugged && !QSIMPLEQ_EMPTY(&s->io_q.pending)) { - ioq_submit(s); - } --- -1.8.3.1 - diff --git a/0079-util-async-use-qemu_aio_coroutine_enter-in-co_schedu.patch b/0079-util-async-use-qemu_aio_coroutine_enter-in-co_schedu.patch deleted file mode 100644 index 7288227..0000000 --- a/0079-util-async-use-qemu_aio_coroutine_enter-in-co_schedu.patch +++ /dev/null @@ -1,78 +0,0 @@ -From faa3d5106cb296858227cc240e045ca16cb28c81 Mon Sep 17 00:00:00 2001 -From: Kevin Wolf -Date: Wed, 10 Oct 2018 20:21:53 +0100 -Subject: util/async: use qemu_aio_coroutine_enter in co_schedule_bh_cb - -RH-Author: Kevin Wolf -Message-id: <20181010202213.7372-15-kwolf@redhat.com> -Patchwork-id: 82604 -O-Subject: [RHEL-8 qemu-kvm PATCH 24/44] util/async: use qemu_aio_coroutine_enter in co_schedule_bh_cb -Bugzilla: 1637976 -RH-Acked-by: Max Reitz -RH-Acked-by: John Snow -RH-Acked-by: Thomas Huth - -From: Sergio Lopez - -AIO Coroutines shouldn't by managed by an AioContext different than the -one assigned when they are created. aio_co_enter avoids entering a -coroutine from a different AioContext, calling aio_co_schedule instead. - -Scheduled coroutines are then entered by co_schedule_bh_cb using -qemu_coroutine_enter, which just calls qemu_aio_coroutine_enter with the -current AioContext obtained with qemu_get_current_aio_context. -Eventually, co->ctx will be set to the AioContext passed as an argument -to qemu_aio_coroutine_enter. - -This means that, if an IO Thread's AioConext is being processed by the -Main Thread (due to aio_poll being called with a BDS AioContext, as it -happens in AIO_WAIT_WHILE among other places), the AioContext from some -coroutines may be wrongly replaced with the one from the Main Thread. - -This is the root cause behind some crashes, mainly triggered by the -drain code at block/io.c. The most common are these abort and failed -assertion: - -util/async.c:aio_co_schedule -456 if (scheduled) { -457 fprintf(stderr, -458 "%s: Co-routine was already scheduled in '%s'\n", -459 __func__, scheduled); -460 abort(); -461 } - -util/qemu-coroutine-lock.c: -286 assert(mutex->holder == self); - -But it's also known to cause random errors at different locations, and -even SIGSEGV with broken coroutine backtraces. - -By using qemu_aio_coroutine_enter directly in co_schedule_bh_cb, we can -pass the correct AioContext as an argument, making sure co->ctx is not -wrongly altered. - -Signed-off-by: Sergio Lopez -Signed-off-by: Kevin Wolf -(cherry picked from commit 6808ae0417131f8dbe7b051256dff7a16634dc1d) -Signed-off-by: Kevin Wolf -Signed-off-by: Danilo C. L. de Paula ---- - util/async.c | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -diff --git a/util/async.c b/util/async.c -index 05979f8..c10642a 100644 ---- a/util/async.c -+++ b/util/async.c -@@ -400,7 +400,7 @@ static void co_schedule_bh_cb(void *opaque) - - /* Protected by write barrier in qemu_aio_coroutine_enter */ - atomic_set(&co->scheduled, NULL); -- qemu_coroutine_enter(co); -+ qemu_aio_coroutine_enter(ctx, co); - aio_context_release(ctx); - } - } --- -1.8.3.1 - diff --git a/0080-job-Fix-nested-aio_poll-hanging-in-job_txn_apply.patch b/0080-job-Fix-nested-aio_poll-hanging-in-job_txn_apply.patch deleted file mode 100644 index 568e097..0000000 --- a/0080-job-Fix-nested-aio_poll-hanging-in-job_txn_apply.patch +++ /dev/null @@ -1,105 +0,0 @@ -From f78998e365809f77ed146ee2afdcf132b12c838c Mon Sep 17 00:00:00 2001 -From: Kevin Wolf -Date: Wed, 10 Oct 2018 20:21:54 +0100 -Subject: job: Fix nested aio_poll() hanging in job_txn_apply - -RH-Author: Kevin Wolf -Message-id: <20181010202213.7372-16-kwolf@redhat.com> -Patchwork-id: 82605 -O-Subject: [RHEL-8 qemu-kvm PATCH 25/44] job: Fix nested aio_poll() hanging in job_txn_apply -Bugzilla: 1637976 -RH-Acked-by: Max Reitz -RH-Acked-by: John Snow -RH-Acked-by: Thomas Huth - -From: Fam Zheng - -All callers have acquired ctx already. Doing that again results in -aio_poll() hang. This fixes the problem that a BDRV_POLL_WHILE() in the -callback cannot make progress because ctx is recursively locked, for -example, when drive-backup finishes. - -There are two callers of job_finalize(): - - fam@lemon:~/work/qemu [master]$ git grep -w -A1 '^\s*job_finalize' - blockdev.c: job_finalize(&job->job, errp); - blockdev.c- aio_context_release(aio_context); - -- - job-qmp.c: job_finalize(job, errp); - job-qmp.c- aio_context_release(aio_context); - -- - tests/test-blockjob.c: job_finalize(&job->job, &error_abort); - tests/test-blockjob.c- assert(job->job.status == JOB_STATUS_CONCLUDED); - -Ignoring the test, it's easy to see both callers to job_finalize (and -job_do_finalize) have acquired the context. - -Cc: qemu-stable@nongnu.org -Reported-by: Gu Nini -Reviewed-by: Eric Blake -Signed-off-by: Fam Zheng -Signed-off-by: Kevin Wolf -(cherry picked from commit 49880165a44f26dc84651858750facdee31f2513) -Signed-off-by: Kevin Wolf -Signed-off-by: Danilo C. L. de Paula ---- - job.c | 18 +++++------------- - 1 file changed, 5 insertions(+), 13 deletions(-) - -diff --git a/job.c b/job.c -index bb322de..82b4692 100644 ---- a/job.c -+++ b/job.c -@@ -136,21 +136,13 @@ static void job_txn_del_job(Job *job) - } - } - --static int job_txn_apply(JobTxn *txn, int fn(Job *), bool lock) -+static int job_txn_apply(JobTxn *txn, int fn(Job *)) - { -- AioContext *ctx; - Job *job, *next; - int rc = 0; - - QLIST_FOREACH_SAFE(job, &txn->jobs, txn_list, next) { -- if (lock) { -- ctx = job->aio_context; -- aio_context_acquire(ctx); -- } - rc = fn(job); -- if (lock) { -- aio_context_release(ctx); -- } - if (rc) { - break; - } -@@ -780,11 +772,11 @@ static void job_do_finalize(Job *job) - assert(job && job->txn); - - /* prepare the transaction to complete */ -- rc = job_txn_apply(job->txn, job_prepare, true); -+ rc = job_txn_apply(job->txn, job_prepare); - if (rc) { - job_completed_txn_abort(job); - } else { -- job_txn_apply(job->txn, job_finalize_single, true); -+ job_txn_apply(job->txn, job_finalize_single); - } - } - -@@ -830,10 +822,10 @@ static void job_completed_txn_success(Job *job) - assert(other_job->ret == 0); - } - -- job_txn_apply(txn, job_transition_to_pending, false); -+ job_txn_apply(txn, job_transition_to_pending); - - /* If no jobs need manual finalization, automatically do so */ -- if (job_txn_apply(txn, job_needs_finalize, false) == 0) { -+ if (job_txn_apply(txn, job_needs_finalize) == 0) { - job_do_finalize(job); - } - } --- -1.8.3.1 - diff --git a/0081-job-Fix-missing-locking-due-to-mismerge.patch b/0081-job-Fix-missing-locking-due-to-mismerge.patch deleted file mode 100644 index 76074d2..0000000 --- a/0081-job-Fix-missing-locking-due-to-mismerge.patch +++ /dev/null @@ -1,55 +0,0 @@ -From bb58f00a6c09bd1fe9af6dabe9ea173adc406d7b Mon Sep 17 00:00:00 2001 -From: Kevin Wolf -Date: Wed, 10 Oct 2018 20:21:55 +0100 -Subject: job: Fix missing locking due to mismerge - -RH-Author: Kevin Wolf -Message-id: <20181010202213.7372-17-kwolf@redhat.com> -Patchwork-id: 82607 -O-Subject: [RHEL-8 qemu-kvm PATCH 26/44] job: Fix missing locking due to mismerge -Bugzilla: 1637976 -RH-Acked-by: Max Reitz -RH-Acked-by: John Snow -RH-Acked-by: Thomas Huth - -job_completed() had a problem with double locking that was recently -fixed independently by two different commits: - -"job: Fix nested aio_poll() hanging in job_txn_apply" -"jobs: add exit shim" - -One fix removed the first aio_context_acquire(), the other fix removed -the other one. Now we have a bug again and the code is run without any -locking. - -Add it back in one of the places. - -Signed-off-by: Kevin Wolf -Reviewed-by: Max Reitz -Reviewed-by: John Snow -(cherry picked from commit d1756c780b7879fb64e41135feac781d84a1f995) -Signed-off-by: Kevin Wolf -Signed-off-by: Danilo C. L. de Paula ---- - job.c | 4 ++++ - 1 file changed, 4 insertions(+) - -diff --git a/job.c b/job.c -index 82b4692..5c4e84f 100644 ---- a/job.c -+++ b/job.c -@@ -847,7 +847,11 @@ static void job_completed(Job *job) - static void job_exit(void *opaque) - { - Job *job = (Job *)opaque; -+ AioContext *ctx = job->aio_context; -+ -+ aio_context_acquire(ctx); - job_completed(job); -+ aio_context_release(ctx); - } - - /** --- -1.8.3.1 - diff --git a/0082-blockjob-Wake-up-BDS-when-job-becomes-idle.patch b/0082-blockjob-Wake-up-BDS-when-job-becomes-idle.patch deleted file mode 100644 index f51df38..0000000 --- a/0082-blockjob-Wake-up-BDS-when-job-becomes-idle.patch +++ /dev/null @@ -1,161 +0,0 @@ -From ac751d8909fa4b734fab48e27c0213df48ffd76b Mon Sep 17 00:00:00 2001 -From: Kevin Wolf -Date: Wed, 10 Oct 2018 20:21:56 +0100 -Subject: blockjob: Wake up BDS when job becomes idle - -RH-Author: Kevin Wolf -Message-id: <20181010202213.7372-18-kwolf@redhat.com> -Patchwork-id: 82610 -O-Subject: [RHEL-8 qemu-kvm PATCH 27/44] blockjob: Wake up BDS when job becomes idle -Bugzilla: 1637976 -RH-Acked-by: Max Reitz -RH-Acked-by: John Snow -RH-Acked-by: Thomas Huth - -In the context of draining a BDS, the .drained_poll callback of block -jobs is called. If this returns true (i.e. there is still some activity -pending), the drain operation may call aio_poll() with blocking=true to -wait for completion. - -As soon as the pending activity is completed and the job finally arrives -in a quiescent state (i.e. its coroutine either yields with busy=false -or terminates), the block job must notify the aio_poll() loop to wake -up, otherwise we get a deadlock if both are running in different -threads. - -Signed-off-by: Kevin Wolf -Reviewed-by: Fam Zheng -Reviewed-by: Max Reitz -(cherry picked from commit 34dc97b9a0e592bc466bdb0bbfe45d77304a72b6) -Signed-off-by: Kevin Wolf -Signed-off-by: Danilo C. L. de Paula ---- - blockjob.c | 18 ++++++++++++++++++ - include/block/blockjob.h | 13 +++++++++++++ - include/qemu/job.h | 3 +++ - job.c | 7 +++++++ - 4 files changed, 41 insertions(+) - -diff --git a/blockjob.c b/blockjob.c -index be5903a..8d27e8e 100644 ---- a/blockjob.c -+++ b/blockjob.c -@@ -221,6 +221,22 @@ int block_job_add_bdrv(BlockJob *job, const char *name, BlockDriverState *bs, - return 0; - } - -+void block_job_wakeup_all_bdrv(BlockJob *job) -+{ -+ GSList *l; -+ -+ for (l = job->nodes; l; l = l->next) { -+ BdrvChild *c = l->data; -+ bdrv_wakeup(c->bs); -+ } -+} -+ -+static void block_job_on_idle(Notifier *n, void *opaque) -+{ -+ BlockJob *job = opaque; -+ block_job_wakeup_all_bdrv(job); -+} -+ - bool block_job_is_internal(BlockJob *job) - { - return (job->job.id == NULL); -@@ -419,6 +435,7 @@ void *block_job_create(const char *job_id, const BlockJobDriver *driver, - job->finalize_completed_notifier.notify = block_job_event_completed; - job->pending_notifier.notify = block_job_event_pending; - job->ready_notifier.notify = block_job_event_ready; -+ job->idle_notifier.notify = block_job_on_idle; - - notifier_list_add(&job->job.on_finalize_cancelled, - &job->finalize_cancelled_notifier); -@@ -426,6 +443,7 @@ void *block_job_create(const char *job_id, const BlockJobDriver *driver, - &job->finalize_completed_notifier); - notifier_list_add(&job->job.on_pending, &job->pending_notifier); - notifier_list_add(&job->job.on_ready, &job->ready_notifier); -+ notifier_list_add(&job->job.on_idle, &job->idle_notifier); - - error_setg(&job->blocker, "block device is in use by block job: %s", - job_type_str(&job->job)); -diff --git a/include/block/blockjob.h b/include/block/blockjob.h -index 32c00b7..2290bbb 100644 ---- a/include/block/blockjob.h -+++ b/include/block/blockjob.h -@@ -70,6 +70,9 @@ typedef struct BlockJob { - /** Called when the job transitions to READY */ - Notifier ready_notifier; - -+ /** Called when the job coroutine yields or terminates */ -+ Notifier idle_notifier; -+ - /** BlockDriverStates that are involved in this block job */ - GSList *nodes; - } BlockJob; -@@ -119,6 +122,16 @@ int block_job_add_bdrv(BlockJob *job, const char *name, BlockDriverState *bs, - void block_job_remove_all_bdrv(BlockJob *job); - - /** -+ * block_job_wakeup_all_bdrv: -+ * @job: The block job -+ * -+ * Calls bdrv_wakeup() for all BlockDriverStates that have been added to the -+ * job. This function is to be called whenever child_job_drained_poll() would -+ * go from true to false to notify waiting drain requests. -+ */ -+void block_job_wakeup_all_bdrv(BlockJob *job); -+ -+/** - * block_job_set_speed: - * @job: The job to set the speed for. - * @speed: The new value -diff --git a/include/qemu/job.h b/include/qemu/job.h -index 5cb0681..b4a784d 100644 ---- a/include/qemu/job.h -+++ b/include/qemu/job.h -@@ -156,6 +156,9 @@ typedef struct Job { - /** Notifiers called when the job transitions to READY */ - NotifierList on_ready; - -+ /** Notifiers called when the job coroutine yields or terminates */ -+ NotifierList on_idle; -+ - /** Element of the list of jobs */ - QLIST_ENTRY(Job) job_list; - -diff --git a/job.c b/job.c -index 5c4e84f..48a767c 100644 ---- a/job.c -+++ b/job.c -@@ -402,6 +402,11 @@ static void job_event_ready(Job *job) - notifier_list_notify(&job->on_ready, job); - } - -+static void job_event_idle(Job *job) -+{ -+ notifier_list_notify(&job->on_idle, job); -+} -+ - void job_enter_cond(Job *job, bool(*fn)(Job *job)) - { - if (!job_started(job)) { -@@ -447,6 +452,7 @@ static void coroutine_fn job_do_yield(Job *job, uint64_t ns) - timer_mod(&job->sleep_timer, ns); - } - job->busy = false; -+ job_event_idle(job); - job_unlock(); - qemu_coroutine_yield(); - -@@ -865,6 +871,7 @@ static void coroutine_fn job_co_entry(void *opaque) - assert(job && job->driver && job->driver->run); - job_pause_point(job); - job->ret = job->driver->run(job, &job->err); -+ job_event_idle(job); - job->deferred_to_main_loop = true; - aio_bh_schedule_oneshot(qemu_get_aio_context(), job_exit, job); - } --- -1.8.3.1 - diff --git a/0083-aio-wait-Increase-num_waiters-even-in-home-thread.patch b/0083-aio-wait-Increase-num_waiters-even-in-home-thread.patch deleted file mode 100644 index 14b67eb..0000000 --- a/0083-aio-wait-Increase-num_waiters-even-in-home-thread.patch +++ /dev/null @@ -1,64 +0,0 @@ -From 0e651f939d3fd65071a8edc8090a777bdb45b921 Mon Sep 17 00:00:00 2001 -From: Kevin Wolf -Date: Wed, 10 Oct 2018 20:21:57 +0100 -Subject: aio-wait: Increase num_waiters even in home thread - -RH-Author: Kevin Wolf -Message-id: <20181010202213.7372-19-kwolf@redhat.com> -Patchwork-id: 82609 -O-Subject: [RHEL-8 qemu-kvm PATCH 28/44] aio-wait: Increase num_waiters even in home thread -Bugzilla: 1637976 -RH-Acked-by: Max Reitz -RH-Acked-by: John Snow -RH-Acked-by: Thomas Huth - -Even if AIO_WAIT_WHILE() is called in the home context of the -AioContext, we still want to allow the condition to change depending on -other threads as long as they kick the AioWait. Specfically block jobs -can be running in an I/O thread and should then be able to kick a drain -in the main loop context. - -Signed-off-by: Kevin Wolf -Reviewed-by: Fam Zheng -(cherry picked from commit 486574483aba988c83b20e7d3f1ccd50c4c333d8) -Signed-off-by: Kevin Wolf -Signed-off-by: Danilo C. L. de Paula ---- - include/block/aio-wait.h | 6 +++--- - 1 file changed, 3 insertions(+), 3 deletions(-) - -diff --git a/include/block/aio-wait.h b/include/block/aio-wait.h -index c85a62f..600fad1 100644 ---- a/include/block/aio-wait.h -+++ b/include/block/aio-wait.h -@@ -76,6 +76,8 @@ typedef struct { - bool waited_ = false; \ - AioWait *wait_ = (wait); \ - AioContext *ctx_ = (ctx); \ -+ /* Increment wait_->num_waiters before evaluating cond. */ \ -+ atomic_inc(&wait_->num_waiters); \ - if (ctx_ && in_aio_context_home_thread(ctx_)) { \ - while ((cond)) { \ - aio_poll(ctx_, true); \ -@@ -84,8 +86,6 @@ typedef struct { - } else { \ - assert(qemu_get_current_aio_context() == \ - qemu_get_aio_context()); \ -- /* Increment wait_->num_waiters before evaluating cond. */ \ -- atomic_inc(&wait_->num_waiters); \ - while ((cond)) { \ - if (ctx_) { \ - aio_context_release(ctx_); \ -@@ -96,8 +96,8 @@ typedef struct { - } \ - waited_ = true; \ - } \ -- atomic_dec(&wait_->num_waiters); \ - } \ -+ atomic_dec(&wait_->num_waiters); \ - waited_; }) - - /** --- -1.8.3.1 - diff --git a/0084-test-bdrv-drain-Drain-with-block-jobs-in-an-I-O-thre.patch b/0084-test-bdrv-drain-Drain-with-block-jobs-in-an-I-O-thre.patch deleted file mode 100644 index 38d58ff..0000000 --- a/0084-test-bdrv-drain-Drain-with-block-jobs-in-an-I-O-thre.patch +++ /dev/null @@ -1,208 +0,0 @@ -From 6d374393478f0d57ec8cd338342687d043565662 Mon Sep 17 00:00:00 2001 -From: Kevin Wolf -Date: Wed, 10 Oct 2018 20:21:58 +0100 -Subject: test-bdrv-drain: Drain with block jobs in an I/O thread - -RH-Author: Kevin Wolf -Message-id: <20181010202213.7372-20-kwolf@redhat.com> -Patchwork-id: 82608 -O-Subject: [RHEL-8 qemu-kvm PATCH 29/44] test-bdrv-drain: Drain with block jobs in an I/O thread -Bugzilla: 1637976 -RH-Acked-by: Max Reitz -RH-Acked-by: John Snow -RH-Acked-by: Thomas Huth - -This extends the existing drain test with a block job to include -variants where the block job runs in a different AioContext. - -Signed-off-by: Kevin Wolf -Reviewed-by: Fam Zheng -(cherry picked from commit f62c172959cd2b6de4dd8ba782e855d64d94764b) -Signed-off-by: Kevin Wolf -Signed-off-by: Danilo C. L. de Paula ---- - tests/test-bdrv-drain.c | 92 +++++++++++++++++++++++++++++++++++++++++++++---- - 1 file changed, 86 insertions(+), 6 deletions(-) - -diff --git a/tests/test-bdrv-drain.c b/tests/test-bdrv-drain.c -index 9bcb3c7..3cf3ba3 100644 ---- a/tests/test-bdrv-drain.c -+++ b/tests/test-bdrv-drain.c -@@ -174,6 +174,28 @@ static void do_drain_end(enum drain_type drain_type, BlockDriverState *bs) - } - } - -+static void do_drain_begin_unlocked(enum drain_type drain_type, BlockDriverState *bs) -+{ -+ if (drain_type != BDRV_DRAIN_ALL) { -+ aio_context_acquire(bdrv_get_aio_context(bs)); -+ } -+ do_drain_begin(drain_type, bs); -+ if (drain_type != BDRV_DRAIN_ALL) { -+ aio_context_release(bdrv_get_aio_context(bs)); -+ } -+} -+ -+static void do_drain_end_unlocked(enum drain_type drain_type, BlockDriverState *bs) -+{ -+ if (drain_type != BDRV_DRAIN_ALL) { -+ aio_context_acquire(bdrv_get_aio_context(bs)); -+ } -+ do_drain_end(drain_type, bs); -+ if (drain_type != BDRV_DRAIN_ALL) { -+ aio_context_release(bdrv_get_aio_context(bs)); -+ } -+} -+ - static void test_drv_cb_common(enum drain_type drain_type, bool recursive) - { - BlockBackend *blk; -@@ -785,11 +807,13 @@ BlockJobDriver test_job_driver = { - }, - }; - --static void test_blockjob_common(enum drain_type drain_type) -+static void test_blockjob_common(enum drain_type drain_type, bool use_iothread) - { - BlockBackend *blk_src, *blk_target; - BlockDriverState *src, *target; - BlockJob *job; -+ IOThread *iothread = NULL; -+ AioContext *ctx; - int ret; - - src = bdrv_new_open_driver(&bdrv_test, "source", BDRV_O_RDWR, -@@ -797,21 +821,31 @@ static void test_blockjob_common(enum drain_type drain_type) - blk_src = blk_new(BLK_PERM_ALL, BLK_PERM_ALL); - blk_insert_bs(blk_src, src, &error_abort); - -+ if (use_iothread) { -+ iothread = iothread_new(); -+ ctx = iothread_get_aio_context(iothread); -+ blk_set_aio_context(blk_src, ctx); -+ } else { -+ ctx = qemu_get_aio_context(); -+ } -+ - target = bdrv_new_open_driver(&bdrv_test, "target", BDRV_O_RDWR, - &error_abort); - blk_target = blk_new(BLK_PERM_ALL, BLK_PERM_ALL); - blk_insert_bs(blk_target, target, &error_abort); - -+ aio_context_acquire(ctx); - job = block_job_create("job0", &test_job_driver, NULL, src, 0, BLK_PERM_ALL, - 0, 0, NULL, NULL, &error_abort); - block_job_add_bdrv(job, "target", target, 0, BLK_PERM_ALL, &error_abort); - job_start(&job->job); -+ aio_context_release(ctx); - - g_assert_cmpint(job->job.pause_count, ==, 0); - g_assert_false(job->job.paused); - g_assert_true(job->job.busy); /* We're in job_sleep_ns() */ - -- do_drain_begin(drain_type, src); -+ do_drain_begin_unlocked(drain_type, src); - - if (drain_type == BDRV_DRAIN_ALL) { - /* bdrv_drain_all() drains both src and target */ -@@ -822,7 +856,14 @@ static void test_blockjob_common(enum drain_type drain_type) - g_assert_true(job->job.paused); - g_assert_false(job->job.busy); /* The job is paused */ - -- do_drain_end(drain_type, src); -+ do_drain_end_unlocked(drain_type, src); -+ -+ if (use_iothread) { -+ /* paused is reset in the I/O thread, wait for it */ -+ while (job->job.paused) { -+ aio_poll(qemu_get_aio_context(), false); -+ } -+ } - - g_assert_cmpint(job->job.pause_count, ==, 0); - g_assert_false(job->job.paused); -@@ -841,32 +882,64 @@ static void test_blockjob_common(enum drain_type drain_type) - - do_drain_end(drain_type, target); - -+ if (use_iothread) { -+ /* paused is reset in the I/O thread, wait for it */ -+ while (job->job.paused) { -+ aio_poll(qemu_get_aio_context(), false); -+ } -+ } -+ - g_assert_cmpint(job->job.pause_count, ==, 0); - g_assert_false(job->job.paused); - g_assert_true(job->job.busy); /* We're in job_sleep_ns() */ - -+ aio_context_acquire(ctx); - ret = job_complete_sync(&job->job, &error_abort); - g_assert_cmpint(ret, ==, 0); - -+ if (use_iothread) { -+ blk_set_aio_context(blk_src, qemu_get_aio_context()); -+ } -+ aio_context_release(ctx); -+ - blk_unref(blk_src); - blk_unref(blk_target); - bdrv_unref(src); - bdrv_unref(target); -+ -+ if (iothread) { -+ iothread_join(iothread); -+ } - } - - static void test_blockjob_drain_all(void) - { -- test_blockjob_common(BDRV_DRAIN_ALL); -+ test_blockjob_common(BDRV_DRAIN_ALL, false); - } - - static void test_blockjob_drain(void) - { -- test_blockjob_common(BDRV_DRAIN); -+ test_blockjob_common(BDRV_DRAIN, false); - } - - static void test_blockjob_drain_subtree(void) - { -- test_blockjob_common(BDRV_SUBTREE_DRAIN); -+ test_blockjob_common(BDRV_SUBTREE_DRAIN, false); -+} -+ -+static void test_blockjob_iothread_drain_all(void) -+{ -+ test_blockjob_common(BDRV_DRAIN_ALL, true); -+} -+ -+static void test_blockjob_iothread_drain(void) -+{ -+ test_blockjob_common(BDRV_DRAIN, true); -+} -+ -+static void test_blockjob_iothread_drain_subtree(void) -+{ -+ test_blockjob_common(BDRV_SUBTREE_DRAIN, true); - } - - -@@ -1337,6 +1410,13 @@ int main(int argc, char **argv) - g_test_add_func("/bdrv-drain/blockjob/drain_subtree", - test_blockjob_drain_subtree); - -+ g_test_add_func("/bdrv-drain/blockjob/iothread/drain_all", -+ test_blockjob_iothread_drain_all); -+ g_test_add_func("/bdrv-drain/blockjob/iothread/drain", -+ test_blockjob_iothread_drain); -+ g_test_add_func("/bdrv-drain/blockjob/iothread/drain_subtree", -+ test_blockjob_iothread_drain_subtree); -+ - g_test_add_func("/bdrv-drain/deletion/drain", test_delete_by_drain); - g_test_add_func("/bdrv-drain/detach/drain_all", test_detach_by_drain_all); - g_test_add_func("/bdrv-drain/detach/drain", test_detach_by_drain); --- -1.8.3.1 - diff --git a/0085-test-blockjob-Acquire-AioContext-around-job_cancel_s.patch b/0085-test-blockjob-Acquire-AioContext-around-job_cancel_s.patch deleted file mode 100644 index 976ce6a..0000000 --- a/0085-test-blockjob-Acquire-AioContext-around-job_cancel_s.patch +++ /dev/null @@ -1,86 +0,0 @@ -From 99172abebcedfb48ca06d4c1bd0cd16372449600 Mon Sep 17 00:00:00 2001 -From: Kevin Wolf -Date: Wed, 10 Oct 2018 20:21:59 +0100 -Subject: test-blockjob: Acquire AioContext around job_cancel_sync() - -RH-Author: Kevin Wolf -Message-id: <20181010202213.7372-21-kwolf@redhat.com> -Patchwork-id: 82606 -O-Subject: [RHEL-8 qemu-kvm PATCH 30/44] test-blockjob: Acquire AioContext around job_cancel_sync() -Bugzilla: 1637976 -RH-Acked-by: Max Reitz -RH-Acked-by: John Snow -RH-Acked-by: Thomas Huth - -All callers in QEMU proper hold the AioContext lock when calling -job_finish_sync(). test-blockjob should do the same when it calls the -function indirectly through job_cancel_sync(). - -Signed-off-by: Kevin Wolf -Reviewed-by: Fam Zheng -(cherry picked from commit 30c070a547322a5e41ce129d540bca3653b1a9c8) -Signed-off-by: Kevin Wolf -Signed-off-by: Danilo C. L. de Paula ---- - include/qemu/job.h | 6 ++++++ - tests/test-blockjob.c | 6 ++++++ - 2 files changed, 12 insertions(+) - -diff --git a/include/qemu/job.h b/include/qemu/job.h -index b4a784d..63c60ef 100644 ---- a/include/qemu/job.h -+++ b/include/qemu/job.h -@@ -524,6 +524,8 @@ void job_user_cancel(Job *job, bool force, Error **errp); - * - * Returns the return value from the job if the job actually completed - * during the call, or -ECANCELED if it was canceled. -+ * -+ * Callers must hold the AioContext lock of job->aio_context. - */ - int job_cancel_sync(Job *job); - -@@ -541,6 +543,8 @@ void job_cancel_sync_all(void); - * function). - * - * Returns the return value from the job. -+ * -+ * Callers must hold the AioContext lock of job->aio_context. - */ - int job_complete_sync(Job *job, Error **errp); - -@@ -566,6 +570,8 @@ void job_dismiss(Job **job, Error **errp); - * - * Returns 0 if the job is successfully completed, -ECANCELED if the job was - * cancelled before completing, and -errno in other error cases. -+ * -+ * Callers must hold the AioContext lock of job->aio_context. - */ - int job_finish_sync(Job *job, void (*finish)(Job *, Error **errp), Error **errp); - -diff --git a/tests/test-blockjob.c b/tests/test-blockjob.c -index de4c1c2..652d1e8 100644 ---- a/tests/test-blockjob.c -+++ b/tests/test-blockjob.c -@@ -223,6 +223,10 @@ static void cancel_common(CancelJob *s) - BlockJob *job = &s->common; - BlockBackend *blk = s->blk; - JobStatus sts = job->job.status; -+ AioContext *ctx; -+ -+ ctx = job->job.aio_context; -+ aio_context_acquire(ctx); - - job_cancel_sync(&job->job); - if (sts != JOB_STATUS_CREATED && sts != JOB_STATUS_CONCLUDED) { -@@ -232,6 +236,8 @@ static void cancel_common(CancelJob *s) - assert(job->job.status == JOB_STATUS_NULL); - job_unref(&job->job); - destroy_blk(blk); -+ -+ aio_context_release(ctx); - } - - static void test_cancel_created(void) --- -1.8.3.1 - diff --git a/0086-job-Use-AIO_WAIT_WHILE-in-job_finish_sync.patch b/0086-job-Use-AIO_WAIT_WHILE-in-job_finish_sync.patch deleted file mode 100644 index b16aa60..0000000 --- a/0086-job-Use-AIO_WAIT_WHILE-in-job_finish_sync.patch +++ /dev/null @@ -1,77 +0,0 @@ -From 3f3282c8ffa29e3dbcf58618beefb36afe8ba79b Mon Sep 17 00:00:00 2001 -From: Kevin Wolf -Date: Wed, 10 Oct 2018 20:22:00 +0100 -Subject: job: Use AIO_WAIT_WHILE() in job_finish_sync() - -RH-Author: Kevin Wolf -Message-id: <20181010202213.7372-22-kwolf@redhat.com> -Patchwork-id: 82612 -O-Subject: [RHEL-8 qemu-kvm PATCH 31/44] job: Use AIO_WAIT_WHILE() in job_finish_sync() -Bugzilla: 1637976 -RH-Acked-by: Max Reitz -RH-Acked-by: John Snow -RH-Acked-by: Thomas Huth - -job_finish_sync() needs to release the AioContext lock of the job before -calling aio_poll(). Otherwise, callbacks called by aio_poll() would -possibly take the lock a second time and run into a deadlock with a -nested AIO_WAIT_WHILE() call. - -Also, job_drain() without aio_poll() isn't necessarily enough to make -progress on a job, it could depend on bottom halves to be executed. - -Combine both open-coded while loops into a single AIO_WAIT_WHILE() call -that solves both of these problems. - -Signed-off-by: Kevin Wolf -Reviewed-by: Fam Zheng -Reviewed-by: Max Reitz -(cherry picked from commit de0fbe64806321fc3e6399bfab360553db87a41d) -Signed-off-by: Kevin Wolf -Signed-off-by: Danilo C. L. de Paula ---- - job.c | 14 ++++++-------- - 1 file changed, 6 insertions(+), 8 deletions(-) - -diff --git a/job.c b/job.c -index 48a767c..fa74558 100644 ---- a/job.c -+++ b/job.c -@@ -29,6 +29,7 @@ - #include "qemu/job.h" - #include "qemu/id.h" - #include "qemu/main-loop.h" -+#include "block/aio-wait.h" - #include "trace-root.h" - #include "qapi/qapi-events-job.h" - -@@ -962,6 +963,7 @@ void job_complete(Job *job, Error **errp) - int job_finish_sync(Job *job, void (*finish)(Job *, Error **errp), Error **errp) - { - Error *local_err = NULL; -+ AioWait dummy_wait = {}; - int ret; - - job_ref(job); -@@ -974,14 +976,10 @@ int job_finish_sync(Job *job, void (*finish)(Job *, Error **errp), Error **errp) - job_unref(job); - return -EBUSY; - } -- /* job_drain calls job_enter, and it should be enough to induce progress -- * until the job completes or moves to the main thread. */ -- while (!job->deferred_to_main_loop && !job_is_completed(job)) { -- job_drain(job); -- } -- while (!job_is_completed(job)) { -- aio_poll(qemu_get_aio_context(), true); -- } -+ -+ AIO_WAIT_WHILE(&dummy_wait, job->aio_context, -+ (job_drain(job), !job_is_completed(job))); -+ - ret = (job_is_cancelled(job) && job->ret == 0) ? -ECANCELED : job->ret; - job_unref(job); - return ret; --- -1.8.3.1 - diff --git a/0087-test-bdrv-drain-Test-AIO_WAIT_WHILE-in-completion-ca.patch b/0087-test-bdrv-drain-Test-AIO_WAIT_WHILE-in-completion-ca.patch deleted file mode 100644 index 978a41d..0000000 --- a/0087-test-bdrv-drain-Test-AIO_WAIT_WHILE-in-completion-ca.patch +++ /dev/null @@ -1,59 +0,0 @@ -From b9c555343b6567159effe1b3eb736fd1e02257bd Mon Sep 17 00:00:00 2001 -From: Kevin Wolf -Date: Wed, 10 Oct 2018 20:22:01 +0100 -Subject: test-bdrv-drain: Test AIO_WAIT_WHILE() in completion callback - -RH-Author: Kevin Wolf -Message-id: <20181010202213.7372-23-kwolf@redhat.com> -Patchwork-id: 82611 -O-Subject: [RHEL-8 qemu-kvm PATCH 32/44] test-bdrv-drain: Test AIO_WAIT_WHILE() in completion callback -Bugzilla: 1637976 -RH-Acked-by: Max Reitz -RH-Acked-by: John Snow -RH-Acked-by: Thomas Huth - -This is a regression test for a deadlock that occurred in block job -completion callbacks (via job_defer_to_main_loop) because the AioContext -lock was taken twice: once in job_finish_sync() and then again in -job_defer_to_main_loop_bh(). This would cause AIO_WAIT_WHILE() to hang. - -Signed-off-by: Kevin Wolf -Reviewed-by: Fam Zheng -(cherry picked from commit ae23dde9dd486e57e152a0ebc9802caddedc45fc) -Signed-off-by: Kevin Wolf -Signed-off-by: Danilo C. L. de Paula ---- - tests/test-bdrv-drain.c | 10 ++++++++++ - 1 file changed, 10 insertions(+) - -diff --git a/tests/test-bdrv-drain.c b/tests/test-bdrv-drain.c -index 3cf3ba3..05f3b55 100644 ---- a/tests/test-bdrv-drain.c -+++ b/tests/test-bdrv-drain.c -@@ -774,6 +774,15 @@ typedef struct TestBlockJob { - bool should_complete; - } TestBlockJob; - -+static int test_job_prepare(Job *job) -+{ -+ TestBlockJob *s = container_of(job, TestBlockJob, common.job); -+ -+ /* Provoke an AIO_WAIT_WHILE() call to verify there is no deadlock */ -+ blk_flush(s->common.blk); -+ return 0; -+} -+ - static int coroutine_fn test_job_run(Job *job, Error **errp) - { - TestBlockJob *s = container_of(job, TestBlockJob, common.job); -@@ -804,6 +813,7 @@ BlockJobDriver test_job_driver = { - .drain = block_job_drain, - .run = test_job_run, - .complete = test_job_complete, -+ .prepare = test_job_prepare, - }, - }; - --- -1.8.3.1 - diff --git a/0088-block-Add-missing-locking-in-bdrv_co_drain_bh_cb.patch b/0088-block-Add-missing-locking-in-bdrv_co_drain_bh_cb.patch deleted file mode 100644 index 1d2abee..0000000 --- a/0088-block-Add-missing-locking-in-bdrv_co_drain_bh_cb.patch +++ /dev/null @@ -1,96 +0,0 @@ -From 51c1069568d78941554c70f9084531c279899c83 Mon Sep 17 00:00:00 2001 -From: Kevin Wolf -Date: Wed, 10 Oct 2018 20:22:02 +0100 -Subject: block: Add missing locking in bdrv_co_drain_bh_cb() - -RH-Author: Kevin Wolf -Message-id: <20181010202213.7372-24-kwolf@redhat.com> -Patchwork-id: 82613 -O-Subject: [RHEL-8 qemu-kvm PATCH 33/44] block: Add missing locking in bdrv_co_drain_bh_cb() -Bugzilla: 1637976 -RH-Acked-by: Max Reitz -RH-Acked-by: John Snow -RH-Acked-by: Thomas Huth - -bdrv_do_drained_begin/end() assume that they are called with the -AioContext lock of bs held. If we call drain functions from a coroutine -with the AioContext lock held, we yield and schedule a BH to move out of -coroutine context. This means that the lock for the home context of the -coroutine is released and must be re-acquired in the bottom half. - -Signed-off-by: Kevin Wolf -Reviewed-by: Max Reitz -(cherry picked from commit aa1361d54aac43094b98024b8b6c804eb6e41661) -Signed-off-by: Kevin Wolf -Signed-off-by: Danilo C. L. de Paula ---- - block/io.c | 15 +++++++++++++++ - include/qemu/coroutine.h | 5 +++++ - util/qemu-coroutine.c | 5 +++++ - 3 files changed, 25 insertions(+) - -diff --git a/block/io.c b/block/io.c -index 7100344..914ba78 100644 ---- a/block/io.c -+++ b/block/io.c -@@ -288,6 +288,18 @@ static void bdrv_co_drain_bh_cb(void *opaque) - BlockDriverState *bs = data->bs; - - if (bs) { -+ AioContext *ctx = bdrv_get_aio_context(bs); -+ AioContext *co_ctx = qemu_coroutine_get_aio_context(co); -+ -+ /* -+ * When the coroutine yielded, the lock for its home context was -+ * released, so we need to re-acquire it here. If it explicitly -+ * acquired a different context, the lock is still held and we don't -+ * want to lock it a second time (or AIO_WAIT_WHILE() would hang). -+ */ -+ if (ctx == co_ctx) { -+ aio_context_acquire(ctx); -+ } - bdrv_dec_in_flight(bs); - if (data->begin) { - bdrv_do_drained_begin(bs, data->recursive, data->parent, -@@ -296,6 +308,9 @@ static void bdrv_co_drain_bh_cb(void *opaque) - bdrv_do_drained_end(bs, data->recursive, data->parent, - data->ignore_bds_parents); - } -+ if (ctx == co_ctx) { -+ aio_context_release(ctx); -+ } - } else { - assert(data->begin); - bdrv_drain_all_begin(); -diff --git a/include/qemu/coroutine.h b/include/qemu/coroutine.h -index 6f8a487..9801e7f 100644 ---- a/include/qemu/coroutine.h -+++ b/include/qemu/coroutine.h -@@ -90,6 +90,11 @@ void qemu_aio_coroutine_enter(AioContext *ctx, Coroutine *co); - void coroutine_fn qemu_coroutine_yield(void); - - /** -+ * Get the AioContext of the given coroutine -+ */ -+AioContext *coroutine_fn qemu_coroutine_get_aio_context(Coroutine *co); -+ -+/** - * Get the currently executing coroutine - */ - Coroutine *coroutine_fn qemu_coroutine_self(void); -diff --git a/util/qemu-coroutine.c b/util/qemu-coroutine.c -index 1ba4191..2295928 100644 ---- a/util/qemu-coroutine.c -+++ b/util/qemu-coroutine.c -@@ -198,3 +198,8 @@ bool qemu_coroutine_entered(Coroutine *co) - { - return co->caller; - } -+ -+AioContext *coroutine_fn qemu_coroutine_get_aio_context(Coroutine *co) -+{ -+ return co->ctx; -+} --- -1.8.3.1 - diff --git a/0089-block-backend-Add-.drained_poll-callback.patch b/0089-block-backend-Add-.drained_poll-callback.patch deleted file mode 100644 index 64eae39..0000000 --- a/0089-block-backend-Add-.drained_poll-callback.patch +++ /dev/null @@ -1,66 +0,0 @@ -From ea3026a59a3772f84697af9b62b6272cfb41f40c Mon Sep 17 00:00:00 2001 -From: Kevin Wolf -Date: Wed, 10 Oct 2018 20:22:03 +0100 -Subject: block-backend: Add .drained_poll callback - -RH-Author: Kevin Wolf -Message-id: <20181010202213.7372-25-kwolf@redhat.com> -Patchwork-id: 82614 -O-Subject: [RHEL-8 qemu-kvm PATCH 34/44] block-backend: Add .drained_poll callback -Bugzilla: 1637976 -RH-Acked-by: Max Reitz -RH-Acked-by: John Snow -RH-Acked-by: Thomas Huth - -A bdrv_drain operation must ensure that all parents are quiesced, this -includes BlockBackends. Otherwise, callbacks called by requests that are -completed on the BDS layer, but not quite yet on the BlockBackend layer -could still create new requests. - -Signed-off-by: Kevin Wolf -Reviewed-by: Fam Zheng -Reviewed-by: Max Reitz -(cherry picked from commit fe5258a503a87e69be37c9ac48799e293809386e) -Signed-off-by: Kevin Wolf -Signed-off-by: Danilo C. L. de Paula ---- - block/block-backend.c | 9 +++++++++ - 1 file changed, 9 insertions(+) - -diff --git a/block/block-backend.c b/block/block-backend.c -index f2f75a9..2b837d1 100644 ---- a/block/block-backend.c -+++ b/block/block-backend.c -@@ -121,6 +121,7 @@ static void blk_root_inherit_options(int *child_flags, QDict *child_options, - abort(); - } - static void blk_root_drained_begin(BdrvChild *child); -+static bool blk_root_drained_poll(BdrvChild *child); - static void blk_root_drained_end(BdrvChild *child); - - static void blk_root_change_media(BdrvChild *child, bool load); -@@ -294,6 +295,7 @@ static const BdrvChildRole child_root = { - .get_parent_desc = blk_root_get_parent_desc, - - .drained_begin = blk_root_drained_begin, -+ .drained_poll = blk_root_drained_poll, - .drained_end = blk_root_drained_end, - - .activate = blk_root_activate, -@@ -2192,6 +2194,13 @@ static void blk_root_drained_begin(BdrvChild *child) - } - } - -+static bool blk_root_drained_poll(BdrvChild *child) -+{ -+ BlockBackend *blk = child->opaque; -+ assert(blk->quiesce_counter); -+ return !!blk->in_flight; -+} -+ - static void blk_root_drained_end(BdrvChild *child) - { - BlockBackend *blk = child->opaque; --- -1.8.3.1 - diff --git a/0090-block-backend-Fix-potential-double-blk_delete.patch b/0090-block-backend-Fix-potential-double-blk_delete.patch deleted file mode 100644 index 56799a1..0000000 --- a/0090-block-backend-Fix-potential-double-blk_delete.patch +++ /dev/null @@ -1,67 +0,0 @@ -From 21a2ef76c6aa33f0058d149b1bfdde1d27ba1df4 Mon Sep 17 00:00:00 2001 -From: Kevin Wolf -Date: Wed, 10 Oct 2018 20:22:04 +0100 -Subject: block-backend: Fix potential double blk_delete() - -RH-Author: Kevin Wolf -Message-id: <20181010202213.7372-26-kwolf@redhat.com> -Patchwork-id: 82615 -O-Subject: [RHEL-8 qemu-kvm PATCH 35/44] block-backend: Fix potential double blk_delete() -Bugzilla: 1637976 -RH-Acked-by: Max Reitz -RH-Acked-by: John Snow -RH-Acked-by: Thomas Huth - -blk_unref() first decreases the refcount of the BlockBackend and calls -blk_delete() if the refcount reaches zero. Requests can still be in -flight at this point, they are only drained during blk_delete(): - -At this point, arbitrary callbacks can run. If any callback takes a -temporary BlockBackend reference, it will first increase the refcount to -1 and then decrease it to 0 again, triggering another blk_delete(). This -will cause a use-after-free crash in the outer blk_delete(). - -Fix it by draining the BlockBackend before decreasing to refcount to 0. -Assert in blk_ref() that it never takes the first refcount (which would -mean that the BlockBackend is already being deleted). - -Signed-off-by: Kevin Wolf -Reviewed-by: Fam Zheng -Reviewed-by: Max Reitz -(cherry picked from commit 5ca9d21bd1c8eeb578d0964e31bd03d47c25773d) -Signed-off-by: Kevin Wolf -Signed-off-by: Danilo C. L. de Paula ---- - block/block-backend.c | 9 ++++++++- - 1 file changed, 8 insertions(+), 1 deletion(-) - -diff --git a/block/block-backend.c b/block/block-backend.c -index 2b837d1..94046f0 100644 ---- a/block/block-backend.c -+++ b/block/block-backend.c -@@ -436,6 +436,7 @@ int blk_get_refcnt(BlockBackend *blk) - */ - void blk_ref(BlockBackend *blk) - { -+ assert(blk->refcnt > 0); - blk->refcnt++; - } - -@@ -448,7 +449,13 @@ void blk_unref(BlockBackend *blk) - { - if (blk) { - assert(blk->refcnt > 0); -- if (!--blk->refcnt) { -+ if (blk->refcnt > 1) { -+ blk->refcnt--; -+ } else { -+ blk_drain(blk); -+ /* blk_drain() cannot resurrect blk, nobody held a reference */ -+ assert(blk->refcnt == 1); -+ blk->refcnt = 0; - blk_delete(blk); - } - } --- -1.8.3.1 - diff --git a/0091-block-backend-Decrease-in_flight-only-after-callback.patch b/0091-block-backend-Decrease-in_flight-only-after-callback.patch deleted file mode 100644 index 69805e9..0000000 --- a/0091-block-backend-Decrease-in_flight-only-after-callback.patch +++ /dev/null @@ -1,74 +0,0 @@ -From 91ae719381f75ed3554b0c5e1d8bf58583a9208f Mon Sep 17 00:00:00 2001 -From: Kevin Wolf -Date: Wed, 10 Oct 2018 20:22:05 +0100 -Subject: block-backend: Decrease in_flight only after callback - -RH-Author: Kevin Wolf -Message-id: <20181010202213.7372-27-kwolf@redhat.com> -Patchwork-id: 82617 -O-Subject: [RHEL-8 qemu-kvm PATCH 36/44] block-backend: Decrease in_flight only after callback -Bugzilla: 1637976 -RH-Acked-by: Max Reitz -RH-Acked-by: John Snow -RH-Acked-by: Thomas Huth - -Request callbacks can do pretty much anything, including operations that -will yield from the coroutine (such as draining the backend). In that -case, a decreased in_flight would be visible to other code and could -lead to a drain completing while the callback hasn't actually completed -yet. - -Note that reordering these operations forbids calling drain directly -inside an AIO callback. As Paolo explains, indirectly calling it is -okay: - -- Calling it through a coroutine is okay, because then - bdrv_drained_begin() goes through bdrv_co_yield_to_drain() and you - have in_flight=2 when bdrv_co_yield_to_drain() yields, then soon - in_flight=1 when the aio_co_wake() in the AIO callback completes, then - in_flight=0 after the bottom half starts. - -- Calling it through a bottom half would be okay too, as long as the AIO - callback remembers to do inc_in_flight/dec_in_flight just like - bdrv_co_yield_to_drain() and bdrv_co_drain_bh_cb() do - -A few more important cases that come to mind: - -- A coroutine that yields because of I/O is okay, with a sequence - similar to bdrv_co_yield_to_drain(). - -- A coroutine that yields with no I/O pending will correctly decrease - in_flight to zero before yielding. - -- Calling more AIO from the callback won't overflow the counter just - because of mutual recursion, because AIO functions always yield at - least once before invoking the callback. - -Signed-off-by: Kevin Wolf -Reviewed-by: Fam Zheng -Reviewed-by: Max Reitz -Reviewed-by: Paolo Bonzini -(cherry picked from commit 46aaf2a566e364a62315219255099cbf1c9b990d) -Signed-off-by: Kevin Wolf -Signed-off-by: Danilo C. L. de Paula ---- - block/block-backend.c | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -diff --git a/block/block-backend.c b/block/block-backend.c -index 94046f0..9a3e060 100644 ---- a/block/block-backend.c -+++ b/block/block-backend.c -@@ -1341,8 +1341,8 @@ static const AIOCBInfo blk_aio_em_aiocb_info = { - static void blk_aio_complete(BlkAioEmAIOCB *acb) - { - if (acb->has_returned) { -- blk_dec_in_flight(acb->rwco.blk); - acb->common.cb(acb->common.opaque, acb->rwco.ret); -+ blk_dec_in_flight(acb->rwco.blk); - qemu_aio_unref(acb); - } - } --- -1.8.3.1 - diff --git a/0092-blockjob-Lie-better-in-child_job_drained_poll.patch b/0092-blockjob-Lie-better-in-child_job_drained_poll.patch deleted file mode 100644 index 64f5aaa..0000000 --- a/0092-blockjob-Lie-better-in-child_job_drained_poll.patch +++ /dev/null @@ -1,104 +0,0 @@ -From bc17446b1e7c9578a3e3079173891c93998dfa00 Mon Sep 17 00:00:00 2001 -From: Kevin Wolf -Date: Wed, 10 Oct 2018 20:22:06 +0100 -Subject: blockjob: Lie better in child_job_drained_poll() - -RH-Author: Kevin Wolf -Message-id: <20181010202213.7372-28-kwolf@redhat.com> -Patchwork-id: 82616 -O-Subject: [RHEL-8 qemu-kvm PATCH 37/44] blockjob: Lie better in child_job_drained_poll() -Bugzilla: 1637976 -RH-Acked-by: Max Reitz -RH-Acked-by: John Snow -RH-Acked-by: Thomas Huth - -Block jobs claim in .drained_poll() that they are in a quiescent state -as soon as job->deferred_to_main_loop is true. This is obviously wrong, -they still have a completion BH to run. We only get away with this -because commit 91af091f923 added an unconditional aio_poll(false) to the -drain functions, but this is bypassing the regular drain mechanisms. - -However, just removing this and telling that the job is still active -doesn't work either: The completion callbacks themselves call drain -functions (directly, or indirectly with bdrv_reopen), so they would -deadlock then. - -As a better lie, tell that the job is active as long as the BH is -pending, but falsely call it quiescent from the point in the BH when the -completion callback is called. At this point, nested drain calls won't -deadlock because they ignore the job, and outer drains will wait for the -job to really reach a quiescent state because the callback is already -running. - -Signed-off-by: Kevin Wolf -Reviewed-by: Max Reitz -(cherry picked from commit b5a7a0573530698ee448b063ac01d485e30446bd) -Signed-off-by: Kevin Wolf -Signed-off-by: Danilo C. L. de Paula ---- - blockjob.c | 2 +- - include/qemu/job.h | 3 +++ - job.c | 11 ++++++++++- - 3 files changed, 14 insertions(+), 2 deletions(-) - -diff --git a/blockjob.c b/blockjob.c -index 8d27e8e..617d86f 100644 ---- a/blockjob.c -+++ b/blockjob.c -@@ -164,7 +164,7 @@ static bool child_job_drained_poll(BdrvChild *c) - /* An inactive or completed job doesn't have any pending requests. Jobs - * with !job->busy are either already paused or have a pause point after - * being reentered, so no job driver code will run before they pause. */ -- if (!job->busy || job_is_completed(job) || job->deferred_to_main_loop) { -+ if (!job->busy || job_is_completed(job)) { - return false; - } - -diff --git a/include/qemu/job.h b/include/qemu/job.h -index 63c60ef..9e7cd1e 100644 ---- a/include/qemu/job.h -+++ b/include/qemu/job.h -@@ -76,6 +76,9 @@ typedef struct Job { - * Set to false by the job while the coroutine has yielded and may be - * re-entered by job_enter(). There may still be I/O or event loop activity - * pending. Accessed under block_job_mutex (in blockjob.c). -+ * -+ * When the job is deferred to the main loop, busy is true as long as the -+ * bottom half is still pending. - */ - bool busy; - -diff --git a/job.c b/job.c -index fa74558..00a1cd1 100644 ---- a/job.c -+++ b/job.c -@@ -857,7 +857,16 @@ static void job_exit(void *opaque) - AioContext *ctx = job->aio_context; - - aio_context_acquire(ctx); -+ -+ /* This is a lie, we're not quiescent, but still doing the completion -+ * callbacks. However, completion callbacks tend to involve operations that -+ * drain block nodes, and if .drained_poll still returned true, we would -+ * deadlock. */ -+ job->busy = false; -+ job_event_idle(job); -+ - job_completed(job); -+ - aio_context_release(ctx); - } - -@@ -872,8 +881,8 @@ static void coroutine_fn job_co_entry(void *opaque) - assert(job && job->driver && job->driver->run); - job_pause_point(job); - job->ret = job->driver->run(job, &job->err); -- job_event_idle(job); - job->deferred_to_main_loop = true; -+ job->busy = true; - aio_bh_schedule_oneshot(qemu_get_aio_context(), job_exit, job); - } - --- -1.8.3.1 - diff --git a/0093-block-Remove-aio_poll-in-bdrv_drain_poll-variants.patch b/0093-block-Remove-aio_poll-in-bdrv_drain_poll-variants.patch deleted file mode 100644 index 60cdc36..0000000 --- a/0093-block-Remove-aio_poll-in-bdrv_drain_poll-variants.patch +++ /dev/null @@ -1,64 +0,0 @@ -From ce7a9c21d6a43b736d5aa2041acbd5d1edca0070 Mon Sep 17 00:00:00 2001 -From: Kevin Wolf -Date: Wed, 10 Oct 2018 20:22:07 +0100 -Subject: block: Remove aio_poll() in bdrv_drain_poll variants - -RH-Author: Kevin Wolf -Message-id: <20181010202213.7372-29-kwolf@redhat.com> -Patchwork-id: 82619 -O-Subject: [RHEL-8 qemu-kvm PATCH 38/44] block: Remove aio_poll() in bdrv_drain_poll variants -Bugzilla: 1637976 -RH-Acked-by: Max Reitz -RH-Acked-by: John Snow -RH-Acked-by: Thomas Huth - -bdrv_drain_poll_top_level() was buggy because it didn't release the -AioContext lock of the node to be drained before calling aio_poll(). -This way, callbacks called by aio_poll() would possibly take the lock a -second time and run into a deadlock with a nested AIO_WAIT_WHILE() call. - -However, it turns out that the aio_poll() call isn't actually needed any -more. It was introduced in commit 91af091f923, which is effectively -reverted by this patch. The cases it was supposed to fix are now covered -by bdrv_drain_poll(), which waits for block jobs to reach a quiescent -state. - -Signed-off-by: Kevin Wolf -Reviewed-by: Fam Zheng -Reviewed-by: Max Reitz -(cherry picked from commit 4cf077b59fc73eec29f8b7d082919dbb278bdc86) -Signed-off-by: Kevin Wolf -Signed-off-by: Danilo C. L. de Paula ---- - block/io.c | 8 -------- - 1 file changed, 8 deletions(-) - -diff --git a/block/io.c b/block/io.c -index 914ba78..8b81ff3 100644 ---- a/block/io.c -+++ b/block/io.c -@@ -268,10 +268,6 @@ bool bdrv_drain_poll(BlockDriverState *bs, bool recursive, - static bool bdrv_drain_poll_top_level(BlockDriverState *bs, bool recursive, - BdrvChild *ignore_parent) - { -- /* Execute pending BHs first and check everything else only after the BHs -- * have executed. */ -- while (aio_poll(bs->aio_context, false)); -- - return bdrv_drain_poll(bs, recursive, ignore_parent, false); - } - -@@ -511,10 +507,6 @@ static bool bdrv_drain_all_poll(void) - BlockDriverState *bs = NULL; - bool result = false; - -- /* Execute pending BHs first (may modify the graph) and check everything -- * else only after the BHs have executed. */ -- while (aio_poll(qemu_get_aio_context(), false)); -- - /* bdrv_drain_poll() can't make changes to the graph and we are holding the - * main AioContext lock, so iterating bdrv_next_all_states() is safe. */ - while ((bs = bdrv_next_all_states(bs))) { --- -1.8.3.1 - diff --git a/0094-test-bdrv-drain-Test-nested-poll-in-bdrv_drain_poll_.patch b/0094-test-bdrv-drain-Test-nested-poll-in-bdrv_drain_poll_.patch deleted file mode 100644 index 8de1ae2..0000000 --- a/0094-test-bdrv-drain-Test-nested-poll-in-bdrv_drain_poll_.patch +++ /dev/null @@ -1,63 +0,0 @@ -From 6c315602205e494dd084a4692a06c16b0e233875 Mon Sep 17 00:00:00 2001 -From: Kevin Wolf -Date: Wed, 10 Oct 2018 20:22:08 +0100 -Subject: test-bdrv-drain: Test nested poll in bdrv_drain_poll_top_level() - -RH-Author: Kevin Wolf -Message-id: <20181010202213.7372-30-kwolf@redhat.com> -Patchwork-id: 82618 -O-Subject: [RHEL-8 qemu-kvm PATCH 39/44] test-bdrv-drain: Test nested poll in bdrv_drain_poll_top_level() -Bugzilla: 1637976 -RH-Acked-by: Max Reitz -RH-Acked-by: John Snow -RH-Acked-by: Thomas Huth - -This is a regression test for a deadlock that could occur in callbacks -called from the aio_poll() in bdrv_drain_poll_top_level(). The -AioContext lock wasn't released and therefore would be taken a second -time in the callback. This would cause a possible AIO_WAIT_WHILE() in -the callback to hang. - -Signed-off-by: Kevin Wolf -Reviewed-by: Fam Zheng -(cherry picked from commit ecc1a5c790cf2c7732cb9755ca388c2fe108d1a1) -Signed-off-by: Kevin Wolf -Signed-off-by: Danilo C. L. de Paula ---- - tests/test-bdrv-drain.c | 13 +++++++++++++ - 1 file changed, 13 insertions(+) - -diff --git a/tests/test-bdrv-drain.c b/tests/test-bdrv-drain.c -index 05f3b55..f4b57f7 100644 ---- a/tests/test-bdrv-drain.c -+++ b/tests/test-bdrv-drain.c -@@ -636,6 +636,17 @@ static void test_iothread_aio_cb(void *opaque, int ret) - qemu_event_set(&done_event); - } - -+static void test_iothread_main_thread_bh(void *opaque) -+{ -+ struct test_iothread_data *data = opaque; -+ -+ /* Test that the AioContext is not yet locked in a random BH that is -+ * executed during drain, otherwise this would deadlock. */ -+ aio_context_acquire(bdrv_get_aio_context(data->bs)); -+ bdrv_flush(data->bs); -+ aio_context_release(bdrv_get_aio_context(data->bs)); -+} -+ - /* - * Starts an AIO request on a BDS that runs in the AioContext of iothread 1. - * The request involves a BH on iothread 2 before it can complete. -@@ -705,6 +716,8 @@ static void test_iothread_common(enum drain_type drain_type, int drain_thread) - aio_context_acquire(ctx_a); - } - -+ aio_bh_schedule_oneshot(ctx_a, test_iothread_main_thread_bh, &data); -+ - /* The request is running on the IOThread a. Draining its block device - * will make sure that it has completed as far as the BDS is concerned, - * but the drain in this thread can continue immediately after --- -1.8.3.1 - diff --git a/0095-job-Avoid-deadlocks-in-job_completed_txn_abort.patch b/0095-job-Avoid-deadlocks-in-job_completed_txn_abort.patch deleted file mode 100644 index 0b8a8fd..0000000 --- a/0095-job-Avoid-deadlocks-in-job_completed_txn_abort.patch +++ /dev/null @@ -1,85 +0,0 @@ -From 287d4267dcb2d5f262dba7f6e7f35dcd294b622a Mon Sep 17 00:00:00 2001 -From: Kevin Wolf -Date: Wed, 10 Oct 2018 20:22:09 +0100 -Subject: job: Avoid deadlocks in job_completed_txn_abort() - -RH-Author: Kevin Wolf -Message-id: <20181010202213.7372-31-kwolf@redhat.com> -Patchwork-id: 82622 -O-Subject: [RHEL-8 qemu-kvm PATCH 40/44] job: Avoid deadlocks in job_completed_txn_abort() -Bugzilla: 1637976 -RH-Acked-by: Max Reitz -RH-Acked-by: John Snow -RH-Acked-by: Thomas Huth - -Amongst others, job_finalize_single() calls the .prepare/.commit/.abort -callbacks of the individual job driver. Recently, their use was adapted -for all block jobs so that they involve code calling AIO_WAIT_WHILE() -now. Such code must be called under the AioContext lock for the -respective job, but without holding any other AioContext lock. - -Signed-off-by: Kevin Wolf -Reviewed-by: Max Reitz -(cherry picked from commit 644f3a29bd4974aefd46d2adb5062d86063c8a50) -Signed-off-by: Kevin Wolf -Signed-off-by: Danilo C. L. de Paula ---- - job.c | 16 +++++++++++----- - 1 file changed, 11 insertions(+), 5 deletions(-) - -diff --git a/job.c b/job.c -index 00a1cd1..0b02186 100644 ---- a/job.c -+++ b/job.c -@@ -718,6 +718,7 @@ static void job_cancel_async(Job *job, bool force) - - static void job_completed_txn_abort(Job *job) - { -+ AioContext *outer_ctx = job->aio_context; - AioContext *ctx; - JobTxn *txn = job->txn; - Job *other_job; -@@ -731,23 +732,26 @@ static void job_completed_txn_abort(Job *job) - txn->aborting = true; - job_txn_ref(txn); - -- /* We are the first failed job. Cancel other jobs. */ -- QLIST_FOREACH(other_job, &txn->jobs, txn_list) { -- ctx = other_job->aio_context; -- aio_context_acquire(ctx); -- } -+ /* We can only hold the single job's AioContext lock while calling -+ * job_finalize_single() because the finalization callbacks can involve -+ * calls of AIO_WAIT_WHILE(), which could deadlock otherwise. */ -+ aio_context_release(outer_ctx); - - /* Other jobs are effectively cancelled by us, set the status for - * them; this job, however, may or may not be cancelled, depending - * on the caller, so leave it. */ - QLIST_FOREACH(other_job, &txn->jobs, txn_list) { - if (other_job != job) { -+ ctx = other_job->aio_context; -+ aio_context_acquire(ctx); - job_cancel_async(other_job, false); -+ aio_context_release(ctx); - } - } - while (!QLIST_EMPTY(&txn->jobs)) { - other_job = QLIST_FIRST(&txn->jobs); - ctx = other_job->aio_context; -+ aio_context_acquire(ctx); - if (!job_is_completed(other_job)) { - assert(job_is_cancelled(other_job)); - job_finish_sync(other_job, NULL, NULL); -@@ -756,6 +760,8 @@ static void job_completed_txn_abort(Job *job) - aio_context_release(ctx); - } - -+ aio_context_acquire(outer_ctx); -+ - job_txn_unref(txn); - } - --- -1.8.3.1 - diff --git a/0096-test-bdrv-drain-AIO_WAIT_WHILE-in-job-.commit-.abort.patch b/0096-test-bdrv-drain-AIO_WAIT_WHILE-in-job-.commit-.abort.patch deleted file mode 100644 index 44cdf9f..0000000 --- a/0096-test-bdrv-drain-AIO_WAIT_WHILE-in-job-.commit-.abort.patch +++ /dev/null @@ -1,241 +0,0 @@ -From 10fbd3c89739a1879f47f2a2256831ce5e1ae7ad Mon Sep 17 00:00:00 2001 -From: Kevin Wolf -Date: Wed, 10 Oct 2018 20:22:10 +0100 -Subject: test-bdrv-drain: AIO_WAIT_WHILE() in job .commit/.abort - -RH-Author: Kevin Wolf -Message-id: <20181010202213.7372-32-kwolf@redhat.com> -Patchwork-id: 82620 -O-Subject: [RHEL-8 qemu-kvm PATCH 41/44] test-bdrv-drain: AIO_WAIT_WHILE() in job .commit/.abort -Bugzilla: 1637976 -RH-Acked-by: Max Reitz -RH-Acked-by: John Snow -RH-Acked-by: Thomas Huth - -This adds tests for calling AIO_WAIT_WHILE() in the .commit and .abort -callbacks. Both reasons why .abort could be called for a single job are -tested: Either .run or .prepare could return an error. - -Signed-off-by: Kevin Wolf -Reviewed-by: Max Reitz -(cherry picked from commit d49725af46a7710cde02cc120b7f1e485154b483) -Signed-off-by: Kevin Wolf -Signed-off-by: Danilo C. L. de Paula ---- - tests/test-bdrv-drain.c | 116 +++++++++++++++++++++++++++++++++++++++++++----- - 1 file changed, 104 insertions(+), 12 deletions(-) - -diff --git a/tests/test-bdrv-drain.c b/tests/test-bdrv-drain.c -index f4b57f7..d6202b2 100644 ---- a/tests/test-bdrv-drain.c -+++ b/tests/test-bdrv-drain.c -@@ -784,6 +784,8 @@ static void test_iothread_drain_subtree(void) - - typedef struct TestBlockJob { - BlockJob common; -+ int run_ret; -+ int prepare_ret; - bool should_complete; - } TestBlockJob; - -@@ -793,7 +795,23 @@ static int test_job_prepare(Job *job) - - /* Provoke an AIO_WAIT_WHILE() call to verify there is no deadlock */ - blk_flush(s->common.blk); -- return 0; -+ return s->prepare_ret; -+} -+ -+static void test_job_commit(Job *job) -+{ -+ TestBlockJob *s = container_of(job, TestBlockJob, common.job); -+ -+ /* Provoke an AIO_WAIT_WHILE() call to verify there is no deadlock */ -+ blk_flush(s->common.blk); -+} -+ -+static void test_job_abort(Job *job) -+{ -+ TestBlockJob *s = container_of(job, TestBlockJob, common.job); -+ -+ /* Provoke an AIO_WAIT_WHILE() call to verify there is no deadlock */ -+ blk_flush(s->common.blk); - } - - static int coroutine_fn test_job_run(Job *job, Error **errp) -@@ -809,7 +827,7 @@ static int coroutine_fn test_job_run(Job *job, Error **errp) - job_pause_point(&s->common.job); - } - -- return 0; -+ return s->run_ret; - } - - static void test_job_complete(Job *job, Error **errp) -@@ -827,14 +845,24 @@ BlockJobDriver test_job_driver = { - .run = test_job_run, - .complete = test_job_complete, - .prepare = test_job_prepare, -+ .commit = test_job_commit, -+ .abort = test_job_abort, - }, - }; - --static void test_blockjob_common(enum drain_type drain_type, bool use_iothread) -+enum test_job_result { -+ TEST_JOB_SUCCESS, -+ TEST_JOB_FAIL_RUN, -+ TEST_JOB_FAIL_PREPARE, -+}; -+ -+static void test_blockjob_common(enum drain_type drain_type, bool use_iothread, -+ enum test_job_result result) - { - BlockBackend *blk_src, *blk_target; - BlockDriverState *src, *target; - BlockJob *job; -+ TestBlockJob *tjob; - IOThread *iothread = NULL; - AioContext *ctx; - int ret; -@@ -858,9 +886,23 @@ static void test_blockjob_common(enum drain_type drain_type, bool use_iothread) - blk_insert_bs(blk_target, target, &error_abort); - - aio_context_acquire(ctx); -- job = block_job_create("job0", &test_job_driver, NULL, src, 0, BLK_PERM_ALL, -- 0, 0, NULL, NULL, &error_abort); -+ tjob = block_job_create("job0", &test_job_driver, NULL, src, -+ 0, BLK_PERM_ALL, -+ 0, 0, NULL, NULL, &error_abort); -+ job = &tjob->common; - block_job_add_bdrv(job, "target", target, 0, BLK_PERM_ALL, &error_abort); -+ -+ switch (result) { -+ case TEST_JOB_SUCCESS: -+ break; -+ case TEST_JOB_FAIL_RUN: -+ tjob->run_ret = -EIO; -+ break; -+ case TEST_JOB_FAIL_PREPARE: -+ tjob->prepare_ret = -EIO; -+ break; -+ } -+ - job_start(&job->job); - aio_context_release(ctx); - -@@ -918,7 +960,7 @@ static void test_blockjob_common(enum drain_type drain_type, bool use_iothread) - - aio_context_acquire(ctx); - ret = job_complete_sync(&job->job, &error_abort); -- g_assert_cmpint(ret, ==, 0); -+ g_assert_cmpint(ret, ==, (result == TEST_JOB_SUCCESS ? 0 : -EIO)); - - if (use_iothread) { - blk_set_aio_context(blk_src, qemu_get_aio_context()); -@@ -937,32 +979,68 @@ static void test_blockjob_common(enum drain_type drain_type, bool use_iothread) - - static void test_blockjob_drain_all(void) - { -- test_blockjob_common(BDRV_DRAIN_ALL, false); -+ test_blockjob_common(BDRV_DRAIN_ALL, false, TEST_JOB_SUCCESS); - } - - static void test_blockjob_drain(void) - { -- test_blockjob_common(BDRV_DRAIN, false); -+ test_blockjob_common(BDRV_DRAIN, false, TEST_JOB_SUCCESS); - } - - static void test_blockjob_drain_subtree(void) - { -- test_blockjob_common(BDRV_SUBTREE_DRAIN, false); -+ test_blockjob_common(BDRV_SUBTREE_DRAIN, false, TEST_JOB_SUCCESS); -+} -+ -+static void test_blockjob_error_drain_all(void) -+{ -+ test_blockjob_common(BDRV_DRAIN_ALL, false, TEST_JOB_FAIL_RUN); -+ test_blockjob_common(BDRV_DRAIN_ALL, false, TEST_JOB_FAIL_PREPARE); -+} -+ -+static void test_blockjob_error_drain(void) -+{ -+ test_blockjob_common(BDRV_DRAIN, false, TEST_JOB_FAIL_RUN); -+ test_blockjob_common(BDRV_DRAIN, false, TEST_JOB_FAIL_PREPARE); -+} -+ -+static void test_blockjob_error_drain_subtree(void) -+{ -+ test_blockjob_common(BDRV_SUBTREE_DRAIN, false, TEST_JOB_FAIL_RUN); -+ test_blockjob_common(BDRV_SUBTREE_DRAIN, false, TEST_JOB_FAIL_PREPARE); - } - - static void test_blockjob_iothread_drain_all(void) - { -- test_blockjob_common(BDRV_DRAIN_ALL, true); -+ test_blockjob_common(BDRV_DRAIN_ALL, true, TEST_JOB_SUCCESS); - } - - static void test_blockjob_iothread_drain(void) - { -- test_blockjob_common(BDRV_DRAIN, true); -+ test_blockjob_common(BDRV_DRAIN, true, TEST_JOB_SUCCESS); - } - - static void test_blockjob_iothread_drain_subtree(void) - { -- test_blockjob_common(BDRV_SUBTREE_DRAIN, true); -+ test_blockjob_common(BDRV_SUBTREE_DRAIN, true, TEST_JOB_SUCCESS); -+} -+ -+static void test_blockjob_iothread_error_drain_all(void) -+{ -+ test_blockjob_common(BDRV_DRAIN_ALL, true, TEST_JOB_FAIL_RUN); -+ test_blockjob_common(BDRV_DRAIN_ALL, true, TEST_JOB_FAIL_PREPARE); -+} -+ -+static void test_blockjob_iothread_error_drain(void) -+{ -+ test_blockjob_common(BDRV_DRAIN, true, TEST_JOB_FAIL_RUN); -+ test_blockjob_common(BDRV_DRAIN, true, TEST_JOB_FAIL_PREPARE); -+} -+ -+static void test_blockjob_iothread_error_drain_subtree(void) -+{ -+ test_blockjob_common(BDRV_SUBTREE_DRAIN, true, TEST_JOB_FAIL_RUN); -+ test_blockjob_common(BDRV_SUBTREE_DRAIN, true, TEST_JOB_FAIL_PREPARE); - } - - -@@ -1433,6 +1511,13 @@ int main(int argc, char **argv) - g_test_add_func("/bdrv-drain/blockjob/drain_subtree", - test_blockjob_drain_subtree); - -+ g_test_add_func("/bdrv-drain/blockjob/error/drain_all", -+ test_blockjob_error_drain_all); -+ g_test_add_func("/bdrv-drain/blockjob/error/drain", -+ test_blockjob_error_drain); -+ g_test_add_func("/bdrv-drain/blockjob/error/drain_subtree", -+ test_blockjob_error_drain_subtree); -+ - g_test_add_func("/bdrv-drain/blockjob/iothread/drain_all", - test_blockjob_iothread_drain_all); - g_test_add_func("/bdrv-drain/blockjob/iothread/drain", -@@ -1440,6 +1525,13 @@ int main(int argc, char **argv) - g_test_add_func("/bdrv-drain/blockjob/iothread/drain_subtree", - test_blockjob_iothread_drain_subtree); - -+ g_test_add_func("/bdrv-drain/blockjob/iothread/error/drain_all", -+ test_blockjob_iothread_error_drain_all); -+ g_test_add_func("/bdrv-drain/blockjob/iothread/error/drain", -+ test_blockjob_iothread_error_drain); -+ g_test_add_func("/bdrv-drain/blockjob/iothread/error/drain_subtree", -+ test_blockjob_iothread_error_drain_subtree); -+ - g_test_add_func("/bdrv-drain/deletion/drain", test_delete_by_drain); - g_test_add_func("/bdrv-drain/detach/drain_all", test_detach_by_drain_all); - g_test_add_func("/bdrv-drain/detach/drain", test_detach_by_drain); --- -1.8.3.1 - diff --git a/0097-test-bdrv-drain-Fix-outdated-comments.patch b/0097-test-bdrv-drain-Fix-outdated-comments.patch deleted file mode 100644 index 08e50a7..0000000 --- a/0097-test-bdrv-drain-Fix-outdated-comments.patch +++ /dev/null @@ -1,69 +0,0 @@ -From 1eaa60bc24cb3fecba8da61f21c44e6f4c9ee4c1 Mon Sep 17 00:00:00 2001 -From: Kevin Wolf -Date: Wed, 10 Oct 2018 20:22:11 +0100 -Subject: test-bdrv-drain: Fix outdated comments - -RH-Author: Kevin Wolf -Message-id: <20181010202213.7372-33-kwolf@redhat.com> -Patchwork-id: 82621 -O-Subject: [RHEL-8 qemu-kvm PATCH 42/44] test-bdrv-drain: Fix outdated comments -Bugzilla: 1637976 -RH-Acked-by: Max Reitz -RH-Acked-by: John Snow -RH-Acked-by: Thomas Huth - -Commit 89bd030533e changed the test case from using job_sleep_ns() to -using qemu_co_sleep_ns() instead. Also, block_job_sleep_ns() became -job_sleep_ns() in commit 5d43e86e11f. - -In both cases, some comments in the test case were not updated. Do that -now. - -Reported-by: Max Reitz -Signed-off-by: Kevin Wolf -Reviewed-by: Eric Blake -(cherry picked from commit 5599c162c3bec2bc8f0123e4d5802a70d9984b3b) -Signed-off-by: Kevin Wolf -Signed-off-by: Danilo C. L. de Paula ---- - tests/test-bdrv-drain.c | 10 +++++----- - 1 file changed, 5 insertions(+), 5 deletions(-) - -diff --git a/tests/test-bdrv-drain.c b/tests/test-bdrv-drain.c -index d6202b2..7e7ba9b 100644 ---- a/tests/test-bdrv-drain.c -+++ b/tests/test-bdrv-drain.c -@@ -820,9 +820,9 @@ static int coroutine_fn test_job_run(Job *job, Error **errp) - - job_transition_to_ready(&s->common.job); - while (!s->should_complete) { -- /* Avoid block_job_sleep_ns() because it marks the job as !busy. We -- * want to emulate some actual activity (probably some I/O) here so -- * that drain has to wait for this acitivity to stop. */ -+ /* Avoid job_sleep_ns() because it marks the job as !busy. We want to -+ * emulate some actual activity (probably some I/O) here so that drain -+ * has to wait for this activity to stop. */ - qemu_co_sleep_ns(QEMU_CLOCK_REALTIME, 100000); - job_pause_point(&s->common.job); - } -@@ -908,7 +908,7 @@ static void test_blockjob_common(enum drain_type drain_type, bool use_iothread, - - g_assert_cmpint(job->job.pause_count, ==, 0); - g_assert_false(job->job.paused); -- g_assert_true(job->job.busy); /* We're in job_sleep_ns() */ -+ g_assert_true(job->job.busy); /* We're in qemu_co_sleep_ns() */ - - do_drain_begin_unlocked(drain_type, src); - -@@ -956,7 +956,7 @@ static void test_blockjob_common(enum drain_type drain_type, bool use_iothread, - - g_assert_cmpint(job->job.pause_count, ==, 0); - g_assert_false(job->job.paused); -- g_assert_true(job->job.busy); /* We're in job_sleep_ns() */ -+ g_assert_true(job->job.busy); /* We're in qemu_co_sleep_ns() */ - - aio_context_acquire(ctx); - ret = job_complete_sync(&job->job, &error_abort); --- -1.8.3.1 - diff --git a/0098-block-Use-a-single-global-AioWait.patch b/0098-block-Use-a-single-global-AioWait.patch deleted file mode 100644 index 4fc26b8..0000000 --- a/0098-block-Use-a-single-global-AioWait.patch +++ /dev/null @@ -1,367 +0,0 @@ -From ea2355d819127ace6195e1d007bc305a49e7d465 Mon Sep 17 00:00:00 2001 -From: Kevin Wolf -Date: Wed, 10 Oct 2018 20:22:12 +0100 -Subject: block: Use a single global AioWait - -RH-Author: Kevin Wolf -Message-id: <20181010202213.7372-34-kwolf@redhat.com> -Patchwork-id: 82623 -O-Subject: [RHEL-8 qemu-kvm PATCH 43/44] block: Use a single global AioWait -Bugzilla: 1637976 -RH-Acked-by: Max Reitz -RH-Acked-by: John Snow -RH-Acked-by: Thomas Huth - -When draining a block node, we recurse to its parent and for subtree -drains also to its children. A single AIO_WAIT_WHILE() is then used to -wait for bdrv_drain_poll() to become true, which depends on all of the -nodes we recursed to. However, if the respective child or parent becomes -quiescent and calls bdrv_wakeup(), only the AioWait of the child/parent -is checked, while AIO_WAIT_WHILE() depends on the AioWait of the -original node. - -Fix this by using a single AioWait for all callers of AIO_WAIT_WHILE(). - -This may mean that the draining thread gets a few more unnecessary -wakeups because an unrelated operation got completed, but we already -wake it up when something _could_ have changed rather than only if it -has certainly changed. - -Apart from that, drain is a slow path anyway. In theory it would be -possible to use wakeups more selectively and still correctly, but the -gains are likely not worth the additional complexity. In fact, this -patch is a nice simplification for some places in the code. - -Signed-off-by: Kevin Wolf -Reviewed-by: Eric Blake -Reviewed-by: Max Reitz -(cherry picked from commit cfe29d8294e06420e15d4938421ae006c8ac49e7) -Signed-off-by: Kevin Wolf -Signed-off-by: Danilo C. L. de Paula ---- - block.c | 5 ----- - block/block-backend.c | 11 ++++------- - block/io.c | 7 ++----- - blockjob.c | 13 +------------ - include/block/aio-wait.h | 22 +++++++++++----------- - include/block/block.h | 6 +----- - include/block/block_int.h | 3 --- - include/block/blockjob.h | 10 ---------- - job.c | 3 +-- - util/aio-wait.c | 11 ++++++----- - 10 files changed, 26 insertions(+), 65 deletions(-) - -diff --git a/block.c b/block.c -index 39f373e..9b55956 100644 ---- a/block.c -+++ b/block.c -@@ -4865,11 +4865,6 @@ AioContext *bdrv_get_aio_context(BlockDriverState *bs) - return bs ? bs->aio_context : qemu_get_aio_context(); - } - --AioWait *bdrv_get_aio_wait(BlockDriverState *bs) --{ -- return bs ? &bs->wait : NULL; --} -- - void bdrv_coroutine_enter(BlockDriverState *bs, Coroutine *co) - { - aio_co_enter(bdrv_get_aio_context(bs), co); -diff --git a/block/block-backend.c b/block/block-backend.c -index 9a3e060..723ab5a 100644 ---- a/block/block-backend.c -+++ b/block/block-backend.c -@@ -88,7 +88,6 @@ struct BlockBackend { - * Accessed with atomic ops. - */ - unsigned int in_flight; -- AioWait wait; - }; - - typedef struct BlockBackendAIOCB { -@@ -1300,7 +1299,7 @@ static void blk_inc_in_flight(BlockBackend *blk) - static void blk_dec_in_flight(BlockBackend *blk) - { - atomic_dec(&blk->in_flight); -- aio_wait_kick(&blk->wait); -+ aio_wait_kick(); - } - - static void error_callback_bh(void *opaque) -@@ -1601,9 +1600,8 @@ void blk_drain(BlockBackend *blk) - } - - /* We may have -ENOMEDIUM completions in flight */ -- AIO_WAIT_WHILE(&blk->wait, -- blk_get_aio_context(blk), -- atomic_mb_read(&blk->in_flight) > 0); -+ AIO_WAIT_WHILE(blk_get_aio_context(blk), -+ atomic_mb_read(&blk->in_flight) > 0); - - if (bs) { - bdrv_drained_end(bs); -@@ -1622,8 +1620,7 @@ void blk_drain_all(void) - aio_context_acquire(ctx); - - /* We may have -ENOMEDIUM completions in flight */ -- AIO_WAIT_WHILE(&blk->wait, ctx, -- atomic_mb_read(&blk->in_flight) > 0); -+ AIO_WAIT_WHILE(ctx, atomic_mb_read(&blk->in_flight) > 0); - - aio_context_release(ctx); - } -diff --git a/block/io.c b/block/io.c -index 8b81ff3..bd9d688 100644 ---- a/block/io.c -+++ b/block/io.c -@@ -38,8 +38,6 @@ - /* Maximum bounce buffer for copy-on-read and write zeroes, in bytes */ - #define MAX_BOUNCE_BUFFER (32768 << BDRV_SECTOR_BITS) - --static AioWait drain_all_aio_wait; -- - static void bdrv_parent_cb_resize(BlockDriverState *bs); - static int coroutine_fn bdrv_co_do_pwrite_zeroes(BlockDriverState *bs, - int64_t offset, int bytes, BdrvRequestFlags flags); -@@ -557,7 +555,7 @@ void bdrv_drain_all_begin(void) - } - - /* Now poll the in-flight requests */ -- AIO_WAIT_WHILE(&drain_all_aio_wait, NULL, bdrv_drain_all_poll()); -+ AIO_WAIT_WHILE(NULL, bdrv_drain_all_poll()); - - while ((bs = bdrv_next_all_states(bs))) { - bdrv_drain_assert_idle(bs); -@@ -713,8 +711,7 @@ void bdrv_inc_in_flight(BlockDriverState *bs) - - void bdrv_wakeup(BlockDriverState *bs) - { -- aio_wait_kick(bdrv_get_aio_wait(bs)); -- aio_wait_kick(&drain_all_aio_wait); -+ aio_wait_kick(); - } - - void bdrv_dec_in_flight(BlockDriverState *bs) -diff --git a/blockjob.c b/blockjob.c -index 617d86f..06f2429 100644 ---- a/blockjob.c -+++ b/blockjob.c -@@ -221,20 +221,9 @@ int block_job_add_bdrv(BlockJob *job, const char *name, BlockDriverState *bs, - return 0; - } - --void block_job_wakeup_all_bdrv(BlockJob *job) --{ -- GSList *l; -- -- for (l = job->nodes; l; l = l->next) { -- BdrvChild *c = l->data; -- bdrv_wakeup(c->bs); -- } --} -- - static void block_job_on_idle(Notifier *n, void *opaque) - { -- BlockJob *job = opaque; -- block_job_wakeup_all_bdrv(job); -+ aio_wait_kick(); - } - - bool block_job_is_internal(BlockJob *job) -diff --git a/include/block/aio-wait.h b/include/block/aio-wait.h -index 600fad1..afd0ff7 100644 ---- a/include/block/aio-wait.h -+++ b/include/block/aio-wait.h -@@ -30,14 +30,15 @@ - /** - * AioWait: - * -- * An object that facilitates synchronous waiting on a condition. The main -- * loop can wait on an operation running in an IOThread as follows: -+ * An object that facilitates synchronous waiting on a condition. A single -+ * global AioWait object (global_aio_wait) is used internally. -+ * -+ * The main loop can wait on an operation running in an IOThread as follows: - * -- * AioWait *wait = ...; - * AioContext *ctx = ...; - * MyWork work = { .done = false }; - * schedule_my_work_in_iothread(ctx, &work); -- * AIO_WAIT_WHILE(wait, ctx, !work.done); -+ * AIO_WAIT_WHILE(ctx, !work.done); - * - * The IOThread must call aio_wait_kick() to notify the main loop when - * work.done changes: -@@ -46,7 +47,7 @@ - * { - * ... - * work.done = true; -- * aio_wait_kick(wait); -+ * aio_wait_kick(); - * } - */ - typedef struct { -@@ -54,9 +55,10 @@ typedef struct { - unsigned num_waiters; - } AioWait; - -+extern AioWait global_aio_wait; -+ - /** - * AIO_WAIT_WHILE: -- * @wait: the aio wait object - * @ctx: the aio context, or NULL if multiple aio contexts (for which the - * caller does not hold a lock) are involved in the polling condition. - * @cond: wait while this conditional expression is true -@@ -72,9 +74,9 @@ typedef struct { - * wait on conditions between two IOThreads since that could lead to deadlock, - * go via the main loop instead. - */ --#define AIO_WAIT_WHILE(wait, ctx, cond) ({ \ -+#define AIO_WAIT_WHILE(ctx, cond) ({ \ - bool waited_ = false; \ -- AioWait *wait_ = (wait); \ -+ AioWait *wait_ = &global_aio_wait; \ - AioContext *ctx_ = (ctx); \ - /* Increment wait_->num_waiters before evaluating cond. */ \ - atomic_inc(&wait_->num_waiters); \ -@@ -102,14 +104,12 @@ typedef struct { - - /** - * aio_wait_kick: -- * @wait: the aio wait object that should re-evaluate its condition -- * - * Wake up the main thread if it is waiting on AIO_WAIT_WHILE(). During - * synchronous operations performed in an IOThread, the main thread lets the - * IOThread's event loop run, waiting for the operation to complete. A - * aio_wait_kick() call will wake up the main thread. - */ --void aio_wait_kick(AioWait *wait); -+void aio_wait_kick(void); - - /** - * aio_wait_bh_oneshot: -diff --git a/include/block/block.h b/include/block/block.h -index 4e0871a..4edc1e8 100644 ---- a/include/block/block.h -+++ b/include/block/block.h -@@ -410,13 +410,9 @@ void bdrv_drain_all_begin(void); - void bdrv_drain_all_end(void); - void bdrv_drain_all(void); - --/* Returns NULL when bs == NULL */ --AioWait *bdrv_get_aio_wait(BlockDriverState *bs); -- - #define BDRV_POLL_WHILE(bs, cond) ({ \ - BlockDriverState *bs_ = (bs); \ -- AIO_WAIT_WHILE(bdrv_get_aio_wait(bs_), \ -- bdrv_get_aio_context(bs_), \ -+ AIO_WAIT_WHILE(bdrv_get_aio_context(bs_), \ - cond); }) - - int bdrv_pdiscard(BdrvChild *child, int64_t offset, int bytes); -diff --git a/include/block/block_int.h b/include/block/block_int.h -index 4000d2a..92ecbd8 100644 ---- a/include/block/block_int.h -+++ b/include/block/block_int.h -@@ -794,9 +794,6 @@ struct BlockDriverState { - unsigned int in_flight; - unsigned int serialising_in_flight; - -- /* Kicked to signal main loop when a request completes. */ -- AioWait wait; -- - /* counter for nested bdrv_io_plug. - * Accessed with atomic ops. - */ -diff --git a/include/block/blockjob.h b/include/block/blockjob.h -index 2290bbb..ede0bd8 100644 ---- a/include/block/blockjob.h -+++ b/include/block/blockjob.h -@@ -122,16 +122,6 @@ int block_job_add_bdrv(BlockJob *job, const char *name, BlockDriverState *bs, - void block_job_remove_all_bdrv(BlockJob *job); - - /** -- * block_job_wakeup_all_bdrv: -- * @job: The block job -- * -- * Calls bdrv_wakeup() for all BlockDriverStates that have been added to the -- * job. This function is to be called whenever child_job_drained_poll() would -- * go from true to false to notify waiting drain requests. -- */ --void block_job_wakeup_all_bdrv(BlockJob *job); -- --/** - * block_job_set_speed: - * @job: The job to set the speed for. - * @speed: The new value -diff --git a/job.c b/job.c -index 0b02186..ed4da6f 100644 ---- a/job.c -+++ b/job.c -@@ -978,7 +978,6 @@ void job_complete(Job *job, Error **errp) - int job_finish_sync(Job *job, void (*finish)(Job *, Error **errp), Error **errp) - { - Error *local_err = NULL; -- AioWait dummy_wait = {}; - int ret; - - job_ref(job); -@@ -992,7 +991,7 @@ int job_finish_sync(Job *job, void (*finish)(Job *, Error **errp), Error **errp) - return -EBUSY; - } - -- AIO_WAIT_WHILE(&dummy_wait, job->aio_context, -+ AIO_WAIT_WHILE(job->aio_context, - (job_drain(job), !job_is_completed(job))); - - ret = (job_is_cancelled(job) && job->ret == 0) ? -ECANCELED : job->ret; -diff --git a/util/aio-wait.c b/util/aio-wait.c -index b8a8f86..b487749 100644 ---- a/util/aio-wait.c -+++ b/util/aio-wait.c -@@ -26,21 +26,22 @@ - #include "qemu/main-loop.h" - #include "block/aio-wait.h" - -+AioWait global_aio_wait; -+ - static void dummy_bh_cb(void *opaque) - { - /* The point is to make AIO_WAIT_WHILE()'s aio_poll() return */ - } - --void aio_wait_kick(AioWait *wait) -+void aio_wait_kick(void) - { - /* The barrier (or an atomic op) is in the caller. */ -- if (atomic_read(&wait->num_waiters)) { -+ if (atomic_read(&global_aio_wait.num_waiters)) { - aio_bh_schedule_oneshot(qemu_get_aio_context(), dummy_bh_cb, NULL); - } - } - - typedef struct { -- AioWait wait; - bool done; - QEMUBHFunc *cb; - void *opaque; -@@ -54,7 +55,7 @@ static void aio_wait_bh(void *opaque) - data->cb(data->opaque); - - data->done = true; -- aio_wait_kick(&data->wait); -+ aio_wait_kick(); - } - - void aio_wait_bh_oneshot(AioContext *ctx, QEMUBHFunc *cb, void *opaque) -@@ -67,5 +68,5 @@ void aio_wait_bh_oneshot(AioContext *ctx, QEMUBHFunc *cb, void *opaque) - assert(qemu_get_current_aio_context() == qemu_get_aio_context()); - - aio_bh_schedule_oneshot(ctx, aio_wait_bh, &data); -- AIO_WAIT_WHILE(&data.wait, ctx, !data.done); -+ AIO_WAIT_WHILE(ctx, !data.done); - } --- -1.8.3.1 - diff --git a/0099-test-bdrv-drain-Test-draining-job-source-child-and-p.patch b/0099-test-bdrv-drain-Test-draining-job-source-child-and-p.patch deleted file mode 100644 index 5533b5f..0000000 --- a/0099-test-bdrv-drain-Test-draining-job-source-child-and-p.patch +++ /dev/null @@ -1,198 +0,0 @@ -From f31ce5e7d486c860d44cb103b672f81de9bc537c Mon Sep 17 00:00:00 2001 -From: Kevin Wolf -Date: Wed, 10 Oct 2018 20:22:13 +0100 -Subject: test-bdrv-drain: Test draining job source child and parent - -RH-Author: Kevin Wolf -Message-id: <20181010202213.7372-35-kwolf@redhat.com> -Patchwork-id: 82624 -O-Subject: [RHEL-8 qemu-kvm PATCH 44/44] test-bdrv-drain: Test draining job source child and parent -Bugzilla: 1637976 -RH-Acked-by: Max Reitz -RH-Acked-by: John Snow -RH-Acked-by: Thomas Huth - -For the block job drain test, don't only test draining the source and -the target node, but create a backing chain for the source -(source_backing <- source <- source_overlay) and test draining each of -the nodes in it. - -When using iothreads, the source node (and therefore the job) is in a -different AioContext than the drain, which happens from the main -thread. This way, the main thread waits in AIO_WAIT_WHILE() for the -iothread to make process and aio_wait_kick() is required to notify it. -The test validates that calling bdrv_wakeup() for a child or a parent -node will actually notify AIO_WAIT_WHILE() instead of letting it hang. - -Increase the sleep time a bit (to 1 ms) because the test case is racy -and with the shorter sleep, it didn't reproduce the bug it is supposed -to test for me under 'rr record -n'. - -This was because bdrv_drain_invoke_entry() (in the main thread) was only -called after the job had already reached the pause point, so we got a -bdrv_dec_in_flight() from the main thread and the additional -aio_wait_kick() when the job becomes idle (that we really wanted to test -here) wasn't even necessary any more to make progress. - -Signed-off-by: Kevin Wolf -Reviewed-by: Eric Blake -Reviewed-by: Max Reitz -(cherry picked from commit d8b3afd597d54e496809b05ac39ac29a5799664f) -Signed-off-by: Kevin Wolf -Signed-off-by: Danilo C. L. de Paula ---- - tests/test-bdrv-drain.c | 77 ++++++++++++++++++++++++++++++++++++++++++++----- - 1 file changed, 69 insertions(+), 8 deletions(-) - -diff --git a/tests/test-bdrv-drain.c b/tests/test-bdrv-drain.c -index 7e7ba9b..8641b54 100644 ---- a/tests/test-bdrv-drain.c -+++ b/tests/test-bdrv-drain.c -@@ -786,6 +786,7 @@ typedef struct TestBlockJob { - BlockJob common; - int run_ret; - int prepare_ret; -+ bool running; - bool should_complete; - } TestBlockJob; - -@@ -818,12 +819,17 @@ static int coroutine_fn test_job_run(Job *job, Error **errp) - { - TestBlockJob *s = container_of(job, TestBlockJob, common.job); - -+ /* We are running the actual job code past the pause point in -+ * job_co_entry(). */ -+ s->running = true; -+ - job_transition_to_ready(&s->common.job); - while (!s->should_complete) { - /* Avoid job_sleep_ns() because it marks the job as !busy. We want to - * emulate some actual activity (probably some I/O) here so that drain - * has to wait for this activity to stop. */ -- qemu_co_sleep_ns(QEMU_CLOCK_REALTIME, 100000); -+ qemu_co_sleep_ns(QEMU_CLOCK_REALTIME, 1000000); -+ - job_pause_point(&s->common.job); - } - -@@ -856,11 +862,19 @@ enum test_job_result { - TEST_JOB_FAIL_PREPARE, - }; - --static void test_blockjob_common(enum drain_type drain_type, bool use_iothread, -- enum test_job_result result) -+enum test_job_drain_node { -+ TEST_JOB_DRAIN_SRC, -+ TEST_JOB_DRAIN_SRC_CHILD, -+ TEST_JOB_DRAIN_SRC_PARENT, -+}; -+ -+static void test_blockjob_common_drain_node(enum drain_type drain_type, -+ bool use_iothread, -+ enum test_job_result result, -+ enum test_job_drain_node drain_node) - { - BlockBackend *blk_src, *blk_target; -- BlockDriverState *src, *target; -+ BlockDriverState *src, *src_backing, *src_overlay, *target, *drain_bs; - BlockJob *job; - TestBlockJob *tjob; - IOThread *iothread = NULL; -@@ -869,8 +883,32 @@ static void test_blockjob_common(enum drain_type drain_type, bool use_iothread, - - src = bdrv_new_open_driver(&bdrv_test, "source", BDRV_O_RDWR, - &error_abort); -+ src_backing = bdrv_new_open_driver(&bdrv_test, "source-backing", -+ BDRV_O_RDWR, &error_abort); -+ src_overlay = bdrv_new_open_driver(&bdrv_test, "source-overlay", -+ BDRV_O_RDWR, &error_abort); -+ -+ bdrv_set_backing_hd(src_overlay, src, &error_abort); -+ bdrv_unref(src); -+ bdrv_set_backing_hd(src, src_backing, &error_abort); -+ bdrv_unref(src_backing); -+ - blk_src = blk_new(BLK_PERM_ALL, BLK_PERM_ALL); -- blk_insert_bs(blk_src, src, &error_abort); -+ blk_insert_bs(blk_src, src_overlay, &error_abort); -+ -+ switch (drain_node) { -+ case TEST_JOB_DRAIN_SRC: -+ drain_bs = src; -+ break; -+ case TEST_JOB_DRAIN_SRC_CHILD: -+ drain_bs = src_backing; -+ break; -+ case TEST_JOB_DRAIN_SRC_PARENT: -+ drain_bs = src_overlay; -+ break; -+ default: -+ g_assert_not_reached(); -+ } - - if (use_iothread) { - iothread = iothread_new(); -@@ -906,11 +944,21 @@ static void test_blockjob_common(enum drain_type drain_type, bool use_iothread, - job_start(&job->job); - aio_context_release(ctx); - -+ if (use_iothread) { -+ /* job_co_entry() is run in the I/O thread, wait for the actual job -+ * code to start (we don't want to catch the job in the pause point in -+ * job_co_entry(). */ -+ while (!tjob->running) { -+ aio_poll(qemu_get_aio_context(), false); -+ } -+ } -+ - g_assert_cmpint(job->job.pause_count, ==, 0); - g_assert_false(job->job.paused); -+ g_assert_true(tjob->running); - g_assert_true(job->job.busy); /* We're in qemu_co_sleep_ns() */ - -- do_drain_begin_unlocked(drain_type, src); -+ do_drain_begin_unlocked(drain_type, drain_bs); - - if (drain_type == BDRV_DRAIN_ALL) { - /* bdrv_drain_all() drains both src and target */ -@@ -921,7 +969,7 @@ static void test_blockjob_common(enum drain_type drain_type, bool use_iothread, - g_assert_true(job->job.paused); - g_assert_false(job->job.busy); /* The job is paused */ - -- do_drain_end_unlocked(drain_type, src); -+ do_drain_end_unlocked(drain_type, drain_bs); - - if (use_iothread) { - /* paused is reset in the I/O thread, wait for it */ -@@ -969,7 +1017,7 @@ static void test_blockjob_common(enum drain_type drain_type, bool use_iothread, - - blk_unref(blk_src); - blk_unref(blk_target); -- bdrv_unref(src); -+ bdrv_unref(src_overlay); - bdrv_unref(target); - - if (iothread) { -@@ -977,6 +1025,19 @@ static void test_blockjob_common(enum drain_type drain_type, bool use_iothread, - } - } - -+static void test_blockjob_common(enum drain_type drain_type, bool use_iothread, -+ enum test_job_result result) -+{ -+ test_blockjob_common_drain_node(drain_type, use_iothread, result, -+ TEST_JOB_DRAIN_SRC); -+ test_blockjob_common_drain_node(drain_type, use_iothread, result, -+ TEST_JOB_DRAIN_SRC_CHILD); -+ if (drain_type == BDRV_SUBTREE_DRAIN) { -+ test_blockjob_common_drain_node(drain_type, use_iothread, result, -+ TEST_JOB_DRAIN_SRC_PARENT); -+ } -+} -+ - static void test_blockjob_drain_all(void) - { - test_blockjob_common(BDRV_DRAIN_ALL, false, TEST_JOB_SUCCESS); --- -1.8.3.1 - diff --git a/0100-block-rbd-pull-out-qemu_rbd_convert_options.patch b/0100-block-rbd-pull-out-qemu_rbd_convert_options.patch deleted file mode 100644 index a88abfb..0000000 --- a/0100-block-rbd-pull-out-qemu_rbd_convert_options.patch +++ /dev/null @@ -1,95 +0,0 @@ -From 5fcd80dc34d84739e75e6d1ec5e21ad73af14ff9 Mon Sep 17 00:00:00 2001 -From: John Snow -Date: Wed, 10 Oct 2018 20:30:12 +0100 -Subject: block/rbd: pull out qemu_rbd_convert_options - -RH-Author: John Snow -Message-id: <20181010203015.11719-2-jsnow@redhat.com> -Patchwork-id: 82627 -O-Subject: [RHEL8/rhel qemu-kvm PATCH 1/4] block/rbd: pull out qemu_rbd_convert_options -Bugzilla: 1635585 -RH-Acked-by: Markus Armbruster -RH-Acked-by: Stefan Hajnoczi -RH-Acked-by: Thomas Huth - -From: Jeff Cody - -Code movement to pull the conversion from Qdict to BlockdevOptionsRbd -into a helper function. - -Reviewed-by: Eric Blake -Reviewed-by: John Snow -Signed-off-by: Jeff Cody -Message-id: 5b49a980f2cde6610ab1df41bb0277d00b5db893.1536704901.git.jcody@redhat.com -Signed-off-by: Jeff Cody -(cherry picked from commit f24b03b56cdb28d753b4ff9ae210d555f14cb0d8) -Signed-off-by: John Snow -Signed-off-by: Danilo C. L. de Paula ---- - block/rbd.c | 36 ++++++++++++++++++++++++------------ - 1 file changed, 24 insertions(+), 12 deletions(-) - -diff --git a/block/rbd.c b/block/rbd.c -index ca8e5bb..b199450 100644 ---- a/block/rbd.c -+++ b/block/rbd.c -@@ -655,12 +655,34 @@ failed_opts: - return r; - } - -+static int qemu_rbd_convert_options(QDict *options, BlockdevOptionsRbd **opts, -+ Error **errp) -+{ -+ Visitor *v; -+ Error *local_err = NULL; -+ -+ /* Convert the remaining options into a QAPI object */ -+ v = qobject_input_visitor_new_flat_confused(options, errp); -+ if (!v) { -+ return -EINVAL; -+ } -+ -+ visit_type_BlockdevOptionsRbd(v, NULL, opts, &local_err); -+ visit_free(v); -+ -+ if (local_err) { -+ error_propagate(errp, local_err); -+ return -EINVAL; -+ } -+ -+ return 0; -+} -+ - static int qemu_rbd_open(BlockDriverState *bs, QDict *options, int flags, - Error **errp) - { - BDRVRBDState *s = bs->opaque; - BlockdevOptionsRbd *opts = NULL; -- Visitor *v; - const QDictEntry *e; - Error *local_err = NULL; - char *keypairs, *secretid; -@@ -676,19 +698,9 @@ static int qemu_rbd_open(BlockDriverState *bs, QDict *options, int flags, - qdict_del(options, "password-secret"); - } - -- /* Convert the remaining options into a QAPI object */ -- v = qobject_input_visitor_new_flat_confused(options, errp); -- if (!v) { -- r = -EINVAL; -- goto out; -- } -- -- visit_type_BlockdevOptionsRbd(v, NULL, &opts, &local_err); -- visit_free(v); -- -+ r = qemu_rbd_convert_options(options, &opts, &local_err); - if (local_err) { - error_propagate(errp, local_err); -- r = -EINVAL; - goto out; - } - --- -1.8.3.1 - diff --git a/0101-block-rbd-Attempt-to-parse-legacy-filenames.patch b/0101-block-rbd-Attempt-to-parse-legacy-filenames.patch deleted file mode 100644 index 24add45..0000000 --- a/0101-block-rbd-Attempt-to-parse-legacy-filenames.patch +++ /dev/null @@ -1,120 +0,0 @@ -From 6198ce651b242298fa6f5cc7ba79eb168789899c Mon Sep 17 00:00:00 2001 -From: John Snow -Date: Wed, 10 Oct 2018 20:30:13 +0100 -Subject: block/rbd: Attempt to parse legacy filenames - -RH-Author: John Snow -Message-id: <20181010203015.11719-3-jsnow@redhat.com> -Patchwork-id: 82629 -O-Subject: [RHEL8/rhel qemu-kvm PATCH 2/4] block/rbd: Attempt to parse legacy filenames -Bugzilla: 1635585 -RH-Acked-by: Markus Armbruster -RH-Acked-by: Stefan Hajnoczi -RH-Acked-by: Thomas Huth - -From: Jeff Cody - -When we converted rbd to get rid of the older key/value-centric -encoding format, we broke compatibility with image files with backing -file strings encoded in the old format. - -This leaves a bit of an ugly conundrum, and a hacky solution. - -If the initial attempt to parse the "proper" options fails, it assumes -that we may have an older key/value encoded filename. Fall back to -attempting to parse the filename, and extract the required options from -it. If that fails, pass along the original error message. - -We do not support mixed modern usage alongside legacy keyvalue pair -usage. - -A deprecation warning has been added, although care should be taken -when actually deprecating since the impact is not limited to -commandline or qapi usage, but also opening existing images. - -Reviewed-by: Eric Blake -Signed-off-by: Jeff Cody -Message-id: 15b332e5432ad069441f7275a46080f465d789a0.1536704901.git.jcody@redhat.com -Signed-off-by: Jeff Cody -(cherry picked from commit 084d1d13bdb753d558b991996e7686c077bd6d80) -Signed-off-by: John Snow -Signed-off-by: Danilo C. L. de Paula ---- - block/rbd.c | 54 ++++++++++++++++++++++++++++++++++++++++++++++++++++-- - 1 file changed, 52 insertions(+), 2 deletions(-) - -diff --git a/block/rbd.c b/block/rbd.c -index b199450..014c68d 100644 ---- a/block/rbd.c -+++ b/block/rbd.c -@@ -678,6 +678,33 @@ static int qemu_rbd_convert_options(QDict *options, BlockdevOptionsRbd **opts, - return 0; - } - -+static int qemu_rbd_attempt_legacy_options(QDict *options, -+ BlockdevOptionsRbd **opts, -+ char **keypairs) -+{ -+ char *filename; -+ int r; -+ -+ filename = g_strdup(qdict_get_try_str(options, "filename")); -+ if (!filename) { -+ return -EINVAL; -+ } -+ qdict_del(options, "filename"); -+ -+ qemu_rbd_parse_filename(filename, options, NULL); -+ -+ /* keypairs freed by caller */ -+ *keypairs = g_strdup(qdict_get_try_str(options, "=keyvalue-pairs")); -+ if (*keypairs) { -+ qdict_del(options, "=keyvalue-pairs"); -+ } -+ -+ r = qemu_rbd_convert_options(options, opts, NULL); -+ -+ g_free(filename); -+ return r; -+} -+ - static int qemu_rbd_open(BlockDriverState *bs, QDict *options, int flags, - Error **errp) - { -@@ -700,8 +727,31 @@ static int qemu_rbd_open(BlockDriverState *bs, QDict *options, int flags, - - r = qemu_rbd_convert_options(options, &opts, &local_err); - if (local_err) { -- error_propagate(errp, local_err); -- goto out; -+ /* If keypairs are present, that means some options are present in -+ * the modern option format. Don't attempt to parse legacy option -+ * formats, as we won't support mixed usage. */ -+ if (keypairs) { -+ error_propagate(errp, local_err); -+ goto out; -+ } -+ -+ /* If the initial attempt to convert and process the options failed, -+ * we may be attempting to open an image file that has the rbd options -+ * specified in the older format consisting of all key/value pairs -+ * encoded in the filename. Go ahead and attempt to parse the -+ * filename, and see if we can pull out the required options. */ -+ r = qemu_rbd_attempt_legacy_options(options, &opts, &keypairs); -+ if (r < 0) { -+ /* Propagate the original error, not the legacy parsing fallback -+ * error, as the latter was just a best-effort attempt. */ -+ error_propagate(errp, local_err); -+ goto out; -+ } -+ /* Take care whenever deciding to actually deprecate; once this ability -+ * is removed, we will not be able to open any images with legacy-styled -+ * backing image strings. */ -+ error_report("RBD options encoded in the filename as keyvalue pairs " -+ "is deprecated"); - } - - /* Remove the processed options from the QDict (the visitor processes --- -1.8.3.1 - diff --git a/0102-block-rbd-add-deprecation-documentation-for-filename.patch b/0102-block-rbd-add-deprecation-documentation-for-filename.patch deleted file mode 100644 index fdd94ea..0000000 --- a/0102-block-rbd-add-deprecation-documentation-for-filename.patch +++ /dev/null @@ -1,59 +0,0 @@ -From aed464e31c9f6d92aa67960dc1a0891461393305 Mon Sep 17 00:00:00 2001 -From: John Snow -Date: Tue, 11 Sep 2018 18:32:33 -0400 -Subject: block/rbd: add deprecation documentation for filename keyvalue pairs - -RH-Author: John Snow -Message-id: <20181010203015.11719-5-jsnow@redhat.com> -Patchwork-id: 82625 -O-Subject: [RHEL8/rhel qemu-kvm PATCH 4/4] block/rbd: add deprecation docume -Bugzilla: 1635585 -RH-Acked-by: Markus Armbruster -RH-Acked-by: Stefan Hajnoczi -RH-Acked-by: Thomas Huth - -From: Jeff Cody - -Signed-off-by: Jeff Cody -Message-id: 647f5b5ab7efd8bf567a504c832b1d2d6f719b23.1536704901.git.jcody@re -Signed-off-by: Jeff Cody -(cherry picked from commit 3bebd37e04f972775b1ece1bdda95451bc9fb14c) -Signed-off-by: John Snow -Signed-off-by: Danilo C. L. de Paula -Signed-off-by: John Snow - -Rebase notes (3.0.0): -- Used upstream version ---- - qemu-deprecated.texi | 15 +++++++++++++++ - 1 file changed, 15 insertions(+) - -diff --git a/qemu-deprecated.texi b/qemu-deprecated.texi -index 9920a85..cff0e8b 100644 ---- a/qemu-deprecated.texi -+++ b/qemu-deprecated.texi -@@ -227,6 +227,21 @@ from old QEMU versions anymore. A newer machine type should be used instead. - In order to prevent QEMU from automatically opening an image's backing - chain, use ``"backing": null'' instead. - -+@subsubsection rbd keyvalue pair encoded filenames: "" (since 3.1.0) -+ -+Options for ``rbd'' should be specified according to its runtime options, -+like other block drivers. Legacy parsing of keyvalue pair encoded -+filenames is useful to open images with the old format for backing files; -+These image files should be updated to use the current format. -+ -+Example of legacy encoding: -+ -+@code{json:@{"file.driver":"rbd", "file.filename":"rbd:rbd/name"@}} -+ -+The above, converted to the current supported format: -+ -+@code{json:@{"file.driver":"rbd", "file.pool":"rbd", "file.image":"name"@}} -+ - @subsection vio-spapr-device device options - - @subsubsection "irq": "" (since 3.0.0) --- -1.8.3.1 - diff --git a/0103-block-rbd-add-iotest-for-rbd-legacy-keyvalue-filenam.patch b/0103-block-rbd-add-iotest-for-rbd-legacy-keyvalue-filenam.patch deleted file mode 100644 index 397826f..0000000 --- a/0103-block-rbd-add-iotest-for-rbd-legacy-keyvalue-filenam.patch +++ /dev/null @@ -1,141 +0,0 @@ -From 76eb6df2dfd755e7cbda2eb07df464d25f9d73c5 Mon Sep 17 00:00:00 2001 -From: John Snow -Date: Wed, 10 Oct 2018 20:30:14 +0100 -Subject: block/rbd: add iotest for rbd legacy keyvalue filename parsing - -RH-Author: John Snow -Message-id: <20181010203015.11719-4-jsnow@redhat.com> -Patchwork-id: 82628 -O-Subject: [RHEL8/rhel qemu-kvm PATCH 3/4] block/rbd: add iotest for rbd legacy keyvalue filename parsing -Bugzilla: 1635585 -RH-Acked-by: Markus Armbruster -RH-Acked-by: Stefan Hajnoczi -RH-Acked-by: Thomas Huth - -From: Jeff Cody - -This is a small test that will check for the ability to parse -both legacy and modern options for rbd. - -The way the test is set up is for failure to occur, but without -having to wait to timeout on a non-existent rbd server. The error -messages in the success path show that the arguments were parsed. - -The failure behavior prior to the patch series that has this test, is -qemu-img complaining about mandatory options (e.g. 'pool') not being -provided. - -Reviewed-by: Eric Blake -Signed-off-by: Jeff Cody -Message-id: f830580e339b974a83ed4870d11adcdc17f49a47.1536704901.git.jcody@redhat.com -Signed-off-by: Jeff Cody -(cherry picked from commit 66e6a735e97450ac50fcaf40f78600c688534cae) -Signed-off-by: John Snow -Signed-off-by: Danilo C. L. de Paula - -Conflicts: - tests/qemu-iotests/group: context (missing prior tests) -Signed-off-by: John Snow ---- - tests/qemu-iotests/231 | 62 ++++++++++++++++++++++++++++++++++++++++++++++ - tests/qemu-iotests/231.out | 9 +++++++ - tests/qemu-iotests/group | 1 + - 3 files changed, 72 insertions(+) - create mode 100755 tests/qemu-iotests/231 - create mode 100644 tests/qemu-iotests/231.out - -diff --git a/tests/qemu-iotests/231 b/tests/qemu-iotests/231 -new file mode 100755 -index 0000000..3e28370 ---- /dev/null -+++ b/tests/qemu-iotests/231 -@@ -0,0 +1,62 @@ -+#!/bin/bash -+# -+# Test legacy and modern option parsing for rbd/ceph. This will not -+# actually connect to a ceph server, but rather looks for the appropriate -+# error message that indicates we parsed the options correctly. -+# -+# Copyright (C) 2018 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 . -+# -+ -+# creator -+owner=jcody@redhat.com -+ -+seq=`basename $0` -+echo "QA output created by $seq" -+ -+here=`pwd` -+status=1 # failure is the default! -+ -+_cleanup() -+{ -+ rm "${BOGUS_CONF}" -+} -+trap "_cleanup; exit \$status" 0 1 2 3 15 -+ -+# get standard environment, filters and checks -+. ./common.rc -+. ./common.filter -+ -+_supported_fmt generic -+_supported_proto rbd -+_supported_os Linux -+ -+BOGUS_CONF=${TEST_DIR}/ceph-$$.conf -+touch "${BOGUS_CONF}" -+ -+_filter_conf() -+{ -+ sed -e "s#$BOGUS_CONF#BOGUS_CONF#g" -+} -+ -+# We expect this to fail, with no monitor ip provided and a null conf file. Just want it -+# to fail in the right way. -+$QEMU_IMG info "json:{'file.driver':'rbd','file.filename':'rbd:rbd/bogus:conf=${BOGUS_CONF}'}" 2>&1 | _filter_conf -+$QEMU_IMG info "json:{'file.driver':'rbd','file.pool':'rbd','file.image':'bogus','file.conf':'${BOGUS_CONF}'}" 2>&1 | _filter_conf -+ -+# success, all done -+echo "*** done" -+rm -f $seq.full -+status=0 -diff --git a/tests/qemu-iotests/231.out b/tests/qemu-iotests/231.out -new file mode 100644 -index 0000000..579ba11 ---- /dev/null -+++ b/tests/qemu-iotests/231.out -@@ -0,0 +1,9 @@ -+QA output created by 231 -+qemu-img: RBD options encoded in the filename as keyvalue pairs is deprecated. Future versions may cease to parse these options in the future. -+unable to get monitor info from DNS SRV with service name: ceph-mon -+no monitors specified to connect to. -+qemu-img: Could not open 'json:{'file.driver':'rbd','file.filename':'rbd:rbd/bogus:conf=BOGUS_CONF'}': error connecting: No such file or directory -+unable to get monitor info from DNS SRV with service name: ceph-mon -+no monitors specified to connect to. -+qemu-img: Could not open 'json:{'file.driver':'rbd','file.pool':'rbd','file.image':'bogus','file.conf':'BOGUS_CONF'}': error connecting: No such file or directory -+*** done -diff --git a/tests/qemu-iotests/group b/tests/qemu-iotests/group -index 23ab4d3..cc1ca7e 100644 ---- a/tests/qemu-iotests/group -+++ b/tests/qemu-iotests/group -@@ -226,3 +226,4 @@ - 226 auto quick - 227 auto quick - 229 auto quick -+231 auto quick --- -1.8.3.1 - diff --git a/0104-luks-Allow-share-rw-on.patch b/0104-luks-Allow-share-rw-on.patch deleted file mode 100644 index bdb3f47..0000000 --- a/0104-luks-Allow-share-rw-on.patch +++ /dev/null @@ -1,52 +0,0 @@ -From 8a08519b748ec41c6f542f4ef9406647269db18c Mon Sep 17 00:00:00 2001 -From: Fam Zheng -Date: Fri, 28 Sep 2018 06:09:52 +0100 -Subject: luks: Allow share-rw=on -MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit - -RH-Author: Fam Zheng -Message-id: <20180928060952.8616-2-famz@redhat.com> -Patchwork-id: 82311 -O-Subject: [RHEL8/rhel qemu-kvm PATCH 1/1] luks: Allow share-rw=on -Bugzilla: 1629701 -RH-Acked-by: Laszlo Ersek -RH-Acked-by: John Snow -RH-Acked-by: Thomas Huth - -Format drivers such as qcow2 don't allow sharing the same image between -two QEMU instances in order to prevent image corruptions, because of -metadata cache. LUKS driver don't modify metadata except for when -creating image, so it is safe to relax the permission. This makes -share-rw=on property work on virtual devices. - -Suggested-by: Daniel P. Berrangé -Signed-off-by: Fam Zheng -Reviewed-by: Daniel P. Berrangé -Signed-off-by: Kevin Wolf -(cherry picked from commit 497da8236ab2663a8108858ba7ea59aac21c5fe6) -Signed-off-by: Fam Zheng -Signed-off-by: Danilo C. L. de Paula ---- - block/crypto.c | 4 +++- - 1 file changed, 3 insertions(+), 1 deletion(-) - -diff --git a/block/crypto.c b/block/crypto.c -index 146d81c..33ee01b 100644 ---- a/block/crypto.c -+++ b/block/crypto.c -@@ -627,7 +627,9 @@ BlockDriver bdrv_crypto_luks = { - .bdrv_probe = block_crypto_probe_luks, - .bdrv_open = block_crypto_open_luks, - .bdrv_close = block_crypto_close, -- .bdrv_child_perm = bdrv_format_default_perms, -+ /* This driver doesn't modify LUKS metadata except when creating image. -+ * Allow share-rw=on as a special case. */ -+ .bdrv_child_perm = bdrv_filter_default_perms, - .bdrv_co_create = block_crypto_co_create_luks, - .bdrv_co_create_opts = block_crypto_co_create_opts_luks, - .bdrv_co_truncate = block_crypto_co_truncate, --- -1.8.3.1 - diff --git a/qemu-kvm.spec b/qemu-kvm.spec index 75804fb..ef0e02b 100644 --- a/qemu-kvm.spec +++ b/qemu-kvm.spec @@ -71,8 +71,8 @@ Provides: %1-rhel = %{epoch}:%{version}-%{release} Summary: QEMU is a machine emulator and virtualizer Name: qemu-kvm -Version: 3.0.0 -Release: 2%{?dist} +Version: 3.1.0 +Release: 0%{?dist}.next.candidate # Epoch because we pushed a qemu-1.0 package. AIUI this can't ever be dropped Epoch: 15 License: GPLv2 and GPLv2+ and CC-BY @@ -86,7 +86,7 @@ ExclusiveArch: x86_64 %{power64} aarch64 s390x %define _smp_mflags %{nil} %endif -Source0: http://wiki.qemu.org/download/qemu-3.0.0.tar.xz +Source0: http://wiki.qemu.org/download/qemu-3.1.0.tar.xz # KSM control scripts Source4: ksm.service @@ -114,107 +114,23 @@ Source35: udev-kvm-check.c -Patch0004: 0004-Initial-redhat-build.patch -Patch0005: 0005-Enable-disable-devices-for-RHEL-7.patch -Patch0006: 0006-Machine-type-related-general-changes.patch -Patch0007: 0007-Add-aarch64-machine-types.patch -Patch0008: 0008-Add-ppc64-machine-types.patch -Patch0009: 0009-Add-s390x-machine-types.patch -Patch0010: 0010-Add-x86_64-machine-types.patch -Patch0011: 0011-Enable-make-check.patch -Patch0012: 0012-Use-kvm-by-default.patch -Patch0013: 0013-vfio-cap-number-of-devices-that-can-be-assigned.patch -Patch0014: 0014-Add-support-statement-to-help-output.patch -Patch0015: 0015-globally-limit-the-maximum-number-of-CPUs.patch -Patch0016: 0016-Add-support-for-simpletrace.patch -Patch0017: 0017-Use-qemu-kvm-in-documentation-instead-of-qemu-system.patch -Patch0018: 0018-usb-xhci-Fix-PCI-capability-order.patch -Patch0019: 0019-virtio-scsi-Reject-scsi-cd-if-data-plane-enabled-RHE.patch -Patch0020: 0020-linux-headers-asm-s390-kvm.h-header-sync.patch -Patch0021: 0021-s390x-Enable-KVM-huge-page-backing-support.patch -Patch0022: 0022-s390x-kvm-add-etoken-facility.patch -Patch0023: 0023-s390x-cpumodel-default-enable-bpb-and-ppa15-for-z196.patch -Patch0024: 0024-i386-Fix-arch_query_cpu_model_expansion-leak.patch -Patch0025: 0025-i386-Disable-TOPOEXT-by-default-on-cpu-host.patch -Patch0026: 0026-curl-Make-sslverify-off-disable-host-as-well-as-peer.patch -Patch0027: 0027-migration-postcopy-Clear-have_listen_thread.patch -Patch0028: 0028-migration-cleanup-in-error-paths-in-loadvm.patch -Patch0029: 0029-jobs-change-start-callback-to-run-callback.patch -Patch0030: 0030-jobs-canonize-Error-object.patch -Patch0031: 0031-jobs-add-exit-shim.patch -Patch0032: 0032-block-commit-utilize-job_exit-shim.patch -Patch0033: 0033-block-mirror-utilize-job_exit-shim.patch -Patch0034: 0034-jobs-utilize-job_exit-shim.patch -Patch0035: 0035-block-backup-make-function-variables-consistently-na.patch -Patch0036: 0036-jobs-remove-ret-argument-to-job_completed-privatize-.patch -Patch0037: 0037-jobs-remove-job_defer_to_main_loop.patch -Patch0038: 0038-block-commit-add-block-job-creation-flags.patch -Patch0039: 0039-block-mirror-add-block-job-creation-flags.patch -Patch0040: 0040-block-stream-add-block-job-creation-flags.patch -Patch0041: 0041-block-commit-refactor-commit-to-use-job-callbacks.patch -Patch0042: 0042-block-mirror-don-t-install-backing-chain-on-abort.patch -Patch0043: 0043-block-mirror-conservative-mirror_exit-refactor.patch -Patch0044: 0044-block-stream-refactor-stream-to-use-job-callbacks.patch -Patch0045: 0045-tests-blockjob-replace-Blockjob-with-Job.patch -Patch0046: 0046-tests-test-blockjob-remove-exit-callback.patch -Patch0047: 0047-tests-test-blockjob-txn-move-.exit-to-.clean.patch -Patch0048: 0048-jobs-remove-.exit-callback.patch -Patch0049: 0049-qapi-block-commit-expose-new-job-properties.patch -Patch0050: 0050-qapi-block-mirror-expose-new-job-properties.patch -Patch0051: 0051-qapi-block-stream-expose-new-job-properties.patch -Patch0052: 0052-block-backup-qapi-documentation-fixup.patch -Patch0053: 0053-blockdev-document-transactional-shortcomings.patch -Patch0054: 0054-seccomp-use-SIGSYS-signal-instead-of-killing-the-thr.patch -Patch0055: 0055-seccomp-prefer-SCMP_ACT_KILL_PROCESS-if-available.patch -Patch0056: 0056-seccomp-set-the-seccomp-filter-to-all-threads.patch -Patch0057: 0057-memory-cleanup-side-effects-of-memory_region_init_fo.patch -Patch0058: 0058-mirror-Fail-gracefully-for-source-target.patch -Patch0059: 0059-commit-Add-top-node-base-node-options.patch -Patch0060: 0060-qemu-iotests-Test-commit-with-top-node-base-node.patch -Patch0061: 0061-block-for-jobs-do-not-clear-user_paused-until-after-.patch -Patch0062: 0062-block-iotest-to-catch-abort-on-forced-blockjob-cance.patch -Patch0063: 0063-Revert-hw-acpi-build-build-SRAT-memory-affinity-stru.patch -Patch0064: 0064-aio-posix-Don-t-count-ctx-notifier-as-progress-when-.patch -Patch0065: 0065-aio-Do-aio_notify_accept-only-during-blocking-aio_po.patch -Patch0066: 0066-aio-posix-fix-concurrent-access-to-poll_disable_cnt.patch -Patch0067: 0067-aio-posix-compute-timeout-before-polling.patch -Patch0068: 0068-aio-posix-do-skip-system-call-if-ctx-notifier-pollin.patch -Patch0069: 0069-linux-headers-update.patch -Patch0070: 0070-s390x-cpumodel-Set-up-CPU-model-for-AP-device-suppor.patch -Patch0071: 0071-s390x-kvm-enable-AP-instruction-interpretation-for-g.patch -Patch0072: 0072-s390x-ap-base-Adjunct-Processor-AP-object-model.patch -Patch0073: 0073-s390x-vfio-ap-Introduce-VFIO-AP-device.patch -Patch0074: 0074-s390-doc-detailed-specifications-for-AP-virtualizati.patch -Patch0075: 0075-vnc-call-sasl_server_init-only-when-required.patch -Patch0076: 0076-nbd-server-fix-NBD_CMD_CACHE.patch -Patch0077: 0077-nbd-fix-NBD_FLAG_SEND_CACHE-value.patch -Patch0078: 0078-block-linux-aio-acquire-AioContext-before-qemu_laio_.patch -Patch0079: 0079-util-async-use-qemu_aio_coroutine_enter-in-co_schedu.patch -Patch0080: 0080-job-Fix-nested-aio_poll-hanging-in-job_txn_apply.patch -Patch0081: 0081-job-Fix-missing-locking-due-to-mismerge.patch -Patch0082: 0082-blockjob-Wake-up-BDS-when-job-becomes-idle.patch -Patch0083: 0083-aio-wait-Increase-num_waiters-even-in-home-thread.patch -Patch0084: 0084-test-bdrv-drain-Drain-with-block-jobs-in-an-I-O-thre.patch -Patch0085: 0085-test-blockjob-Acquire-AioContext-around-job_cancel_s.patch -Patch0086: 0086-job-Use-AIO_WAIT_WHILE-in-job_finish_sync.patch -Patch0087: 0087-test-bdrv-drain-Test-AIO_WAIT_WHILE-in-completion-ca.patch -Patch0088: 0088-block-Add-missing-locking-in-bdrv_co_drain_bh_cb.patch -Patch0089: 0089-block-backend-Add-.drained_poll-callback.patch -Patch0090: 0090-block-backend-Fix-potential-double-blk_delete.patch -Patch0091: 0091-block-backend-Decrease-in_flight-only-after-callback.patch -Patch0092: 0092-blockjob-Lie-better-in-child_job_drained_poll.patch -Patch0093: 0093-block-Remove-aio_poll-in-bdrv_drain_poll-variants.patch -Patch0094: 0094-test-bdrv-drain-Test-nested-poll-in-bdrv_drain_poll_.patch -Patch0095: 0095-job-Avoid-deadlocks-in-job_completed_txn_abort.patch -Patch0096: 0096-test-bdrv-drain-AIO_WAIT_WHILE-in-job-.commit-.abort.patch -Patch0097: 0097-test-bdrv-drain-Fix-outdated-comments.patch -Patch0098: 0098-block-Use-a-single-global-AioWait.patch -Patch0099: 0099-test-bdrv-drain-Test-draining-job-source-child-and-p.patch -Patch0100: 0100-block-rbd-pull-out-qemu_rbd_convert_options.patch -Patch0101: 0101-block-rbd-Attempt-to-parse-legacy-filenames.patch -Patch0102: 0102-block-rbd-add-deprecation-documentation-for-filename.patch -Patch0103: 0103-block-rbd-add-iotest-for-rbd-legacy-keyvalue-filenam.patch -Patch0104: 0104-luks-Allow-share-rw-on.patch +Patch0001: 0001-migration-colo.c-Fix-compilation-issue-when-disable-.patch +Patch0005: 0005-Initial-redhat-build.patch +Patch0006: 0006-Enable-disable-devices-for-RHEL.patch +Patch0007: 0007-Machine-type-related-general-changes.patch +Patch0008: 0008-Add-aarch64-machine-types.patch +Patch0009: 0009-Add-ppc64-machine-types.patch +Patch0010: 0010-Add-s390x-machine-types.patch +Patch0011: 0011-Add-x86_64-machine-types.patch +Patch0012: 0012-Enable-make-check.patch +Patch0013: 0013-Use-kvm-by-default.patch +Patch0014: 0014-vfio-cap-number-of-devices-that-can-be-assigned.patch +Patch0015: 0015-Add-support-statement-to-help-output.patch +Patch0016: 0016-globally-limit-the-maximum-number-of-CPUs.patch +Patch0017: 0017-Add-support-for-simpletrace.patch +Patch0018: 0018-Use-qemu-kvm-in-documentation-instead-of-qemu-system.patch +Patch0019: 0019-usb-xhci-Fix-PCI-capability-order.patch +Patch0020: 0020-virtio-scsi-Reject-scsi-cd-if-data-plane-enabled-RHE.patch BuildRequires: zlib-devel BuildRequires: glib2-devel @@ -483,7 +399,7 @@ the Secure Shell (SSH) protocol. %prep %setup -q -n qemu-%{version} -%patch0004 -p1 +%patch0001 -p1 %patch0005 -p1 %patch0006 -p1 %patch0007 -p1 @@ -500,90 +416,6 @@ the Secure Shell (SSH) protocol. %patch0018 -p1 %patch0019 -p1 %patch0020 -p1 -%patch0021 -p1 -%patch0022 -p1 -%patch0023 -p1 -%patch0024 -p1 -%patch0025 -p1 -%patch0026 -p1 -%patch0027 -p1 -%patch0028 -p1 -%patch0029 -p1 -%patch0030 -p1 -%patch0031 -p1 -%patch0032 -p1 -%patch0033 -p1 -%patch0034 -p1 -%patch0035 -p1 -%patch0036 -p1 -%patch0037 -p1 -%patch0038 -p1 -%patch0039 -p1 -%patch0040 -p1 -%patch0041 -p1 -%patch0042 -p1 -%patch0043 -p1 -%patch0044 -p1 -%patch0045 -p1 -%patch0046 -p1 -%patch0047 -p1 -%patch0048 -p1 -%patch0049 -p1 -%patch0050 -p1 -%patch0051 -p1 -%patch0052 -p1 -%patch0053 -p1 -%patch0054 -p1 -%patch0055 -p1 -%patch0056 -p1 -%patch0057 -p1 -%patch0058 -p1 -%patch0059 -p1 -%patch0060 -p1 -%patch0061 -p1 -%patch0062 -p1 -%patch0063 -p1 -%patch0064 -p1 -%patch0065 -p1 -%patch0066 -p1 -%patch0067 -p1 -%patch0068 -p1 -%patch0069 -p1 -%patch0070 -p1 -%patch0071 -p1 -%patch0072 -p1 -%patch0073 -p1 -%patch0074 -p1 -%patch0075 -p1 -%patch0076 -p1 -%patch0077 -p1 -%patch0078 -p1 -%patch0079 -p1 -%patch0080 -p1 -%patch0081 -p1 -%patch0082 -p1 -%patch0083 -p1 -%patch0084 -p1 -%patch0085 -p1 -%patch0086 -p1 -%patch0087 -p1 -%patch0088 -p1 -%patch0089 -p1 -%patch0090 -p1 -%patch0091 -p1 -%patch0092 -p1 -%patch0093 -p1 -%patch0094 -p1 -%patch0095 -p1 -%patch0096 -p1 -%patch0097 -p1 -%patch0098 -p1 -%patch0099 -p1 -%patch0100 -p1 -%patch0101 -p1 -%patch0102 -p1 -%patch0103 -p1 -%patch0104 -p1 %build %global buildarch %{kvm_target}-softmmu @@ -1056,8 +888,10 @@ useradd -r -u 107 -g qemu -G kvm -d / -s /sbin/nologin \ %doc %{qemudocdir}/qemu-qmp-ref.html %doc %{qemudocdir}/qemu-qmp-ref.txt %{_mandir}/man7/qemu-qmp-ref.7* +%{_mandir}/man7/qemu-cpu-models.7* %{_bindir}/qemu-keymap %{_bindir}/qemu-pr-helper +%{_bindir}/qemu-edid %{_unitdir}/qemu-pr-helper.service %{_unitdir}/qemu-pr-helper.socket %{_mandir}/man7/qemu-ga-ref.7* @@ -1170,9 +1004,10 @@ useradd -r -u 107 -g qemu -G kvm -d / -s /sbin/nologin \ %changelog -* Thu Nov 08 2018 Danilo Cesar Lemes de Paula - 3.0.0-2.el8 -- Mass import 2.12.0 fixes into 3.0 +* Mon Nov 05 2018 Danilo Cesar Lemes de Paula - 3.1.0-0.el8 +- Rebase qemu-kvm to qemu 3.1.0 RC2 +* Mon Nov 05 2018 Danilo Cesar Lemes de Paula - 2.12.0-42.el8 - kvm-luks-Allow-share-rw-on.patch [bz#1629701] - kvm-redhat-reenable-gluster-support.patch [bz#1599340] - kvm-redhat-bump-libusb-requirement.patch [bz#1627970] @@ -1183,6 +1018,7 @@ useradd -r -u 107 -g qemu -G kvm -d / -s /sbin/nologin \ - Resolves: bz#1629701 ("share-rw=on" does not work for luks format image - Fast Train) +* Tue Oct 16 2018 Danilo Cesar Lemes de Paula - 2.12.0-41.el8 - kvm-block-rbd-pull-out-qemu_rbd_convert_options.patch [bz#1635585] - kvm-block-rbd-Attempt-to-parse-legacy-filenames.patch [bz#1635585] - kvm-block-rbd-add-deprecation-documentation-for-filename.patch [bz#1635585] @@ -1190,6 +1026,8 @@ useradd -r -u 107 -g qemu -G kvm -d / -s /sbin/nologin \ - Resolves: bz#1635585 (rbd json format of 7.6 is incompatible with 7.5) +* Tue Oct 16 2018 Danilo Cesar Lemes de Paula - 2.12.0-40.el8 + - kvm-vnc-call-sasl_server_init-only-when-required.patch [bz#1609327] - kvm-nbd-server-fix-NBD_CMD_CACHE.patch [bz#1636142] - kvm-nbd-fix-NBD_FLAG_SEND_CACHE-value.patch [bz#1636142] @@ -1248,6 +1086,7 @@ useradd -r -u 107 -g qemu -G kvm -d / -s /sbin/nologin \ - Resolves: bz#1639374 (qemu-img map 'Aborted (core dumped)' when specifying a plain file) +* Tue Oct 16 2018 Danilo Cesar Lemes de Paula - - kvm-linux-headers-update.patch [bz#1508142] - kvm-s390x-cpumodel-Set-up-CPU-model-for-AP-device-suppor.patch [bz#1508142] - kvm-s390x-kvm-enable-AP-instruction-interpretation-for-g.patch [bz#1508142] @@ -1257,6 +1096,7 @@ useradd -r -u 107 -g qemu -G kvm -d / -s /sbin/nologin \ - Resolves: bz#1508142 ([IBM 8.0 FEAT] KVM: Guest-dedicated Crypto Adapters - qemu part) +* Mon Oct 15 2018 Danilo Cesar Lemes de Paula - 2.12.0-38.el8 - kvm-Revert-hw-acpi-build-build-SRAT-memory-affinity-stru.patch [bz#1609235] - kvm-add-udev-kvm-check.patch [bz#1552663] - kvm-aio-posix-Don-t-count-ctx-notifier-as-progress-when-.patch [bz#1623085] @@ -1287,12 +1127,14 @@ useradd -r -u 107 -g qemu -G kvm -d / -s /sbin/nologin \ - Resolves: bz#1633928 (CVE-2018-3639 qemu-kvm: hw: cpu: speculative store bypass [rhel-8.0]) +* Fri Oct 12 2018 Danilo Cesar Lemes de Paula - 2.12.0-37.el8 - kvm-block-for-jobs-do-not-clear-user_paused-until-after-.patch [bz#1635583] - kvm-iotests-Add-failure-matching-to-common.qemu.patch [bz#1635583] - kvm-block-iotest-to-catch-abort-on-forced-blockjob-cance.patch [bz#1635583] - Resolves: bz#1635583 (Quitting VM causes qemu core dump once the block mirror job paused for no enough target space) +* Fri Oct 12 2018 Danilo Cesar Lemes de Paula - qemu-kvm-2.12.0-36 - kvm-check-Only-test-ivshm-when-it-is-compiled-in.patch [bz#1621817] - kvm-Disable-ivshmem.patch [bz#1621817] - kvm-mirror-Fail-gracefully-for-source-target.patch [bz#1637963] @@ -1305,10 +1147,12 @@ useradd -r -u 107 -g qemu -G kvm -d / -s /sbin/nologin \ - Resolves: bz#1637970 (allow using node-names with block-commit) +* Thu Oct 11 2018 Danilo Cesar Lemes de Paula - 2.12.0-35.el8 - kvm-redhat-make-the-plugins-executable.patch [bz#1638304] - Resolves: bz#1638304 (the driver packages lack all the library Requires) +* Thu Oct 11 2018 Danilo Cesar Lemes de Paula - 2.12.0-34.el8 - kvm-seccomp-allow-sched_setscheduler-with-SCHED_IDLE-pol.patch [bz#1618356] - kvm-seccomp-use-SIGSYS-signal-instead-of-killing-the-thr.patch [bz#1618356] - kvm-seccomp-prefer-SCMP_ACT_KILL_PROCESS-if-available.patch [bz#1618356] @@ -1320,9 +1164,6 @@ useradd -r -u 107 -g qemu -G kvm -d / -s /sbin/nologin \ - Resolves: bz#1618356 (qemu-kvm: Qemu: seccomp: blacklist is not applied to all threads [rhel-8]) -* Fri Oct 12 2018 Danilo Cesar Lemes de Paula - 3.0.0-1.el8 -- Rebase on qemu-kvm 3.0.0 - * Fri Oct 05 2018 Danilo Cesar Lemes de Paula - 2.12.0-33.el8 - kvm-migration-postcopy-Clear-have_listen_thread.patch [bz#1608765] - kvm-migration-cleanup-in-error-paths-in-loadvm.patch [bz#1608765] diff --git a/sources b/sources index c7b3cb2..5fb3730 100644 --- a/sources +++ b/sources @@ -1 +1 @@ -SHA512 (qemu-3.0.0.tar.xz) = a764302f50b9aca4134bbbc1f361b98e71240cdc7b25600dfe733bf4cf17bd86000bd28357697b08f3b656899dceb9e459350b8d55557817444ed5d7fa380a5a +SHA512 (qemu-3.1.0.tar.xz) = 610ec222853ebeea764a2c972418645dea7917e796a0f540d6c4a0f588244e6fdf6f5e6c214f161eb11fbc497f136a43e000fc85554ebb2cf8f10c846a186437