From 5b15e2ecaf054107200a49c7d2509053fb91c9fe Mon Sep 17 00:00:00 2001 From: Fiona Ebner Date: Fri, 14 Oct 2022 14:07:13 +0200 Subject: [PATCH] update submodule and patches to 7.1.0 Notable changes: * The only big change is the switch to using a custom QIOChannel for savevm-async, because the previously used QEMUFileOps was dropped. Changes to the current implementation: * Switch to vector based methods as required for an IO channel. For short reads the passed-in IO vector is stuffed with zeroes at the end, just to be sure. * For reading: The documentation in include/io/channel.h states that at least one byte should be read, so also error out when whe are at the very end instead of returning 0. * For reading: Fix off-by-one error when request goes beyond end. The wrong code piece was: if ((pos + size) > maxlen) { size = maxlen - pos - 1; } Previously, the last byte would not be read. It's actually possible to get a snapshot .raw file that has content all the way up the final 512 byte (= BDRV_SECTOR_SIZE) boundary without any trailing zero bytes (I wrote a script to do it). Luckily, it didn't cause a real issue, because qemu_loadvm_state() is not interested in the final (i.e. QEMU_VM_VMDESCRIPTION) section. The buffer for reading it is simply freed up afterwards and the function will assume that it read the whole section, even if that's not the case. * For writing: Make use of the generated blk_pwritev() wrapper instead of manually wrapping the coroutine to simplify and save a few lines. * Adapt to changed interfaces for blk_{pread,pwrite}: * a9262f551e ("block: Change blk_{pread,pwrite}() param order") * 3b35d4542c ("block: Add a 'flags' param to blk_pread()") * bf5b16fa40 ("block: Make blk_{pread,pwrite}() return 0 on success") Those changes especially affected the qemu-img dd patches, because the context also changed, but also some of our block drivers used the functions. * Drop qemu-common.h include: it got renamed after essentially everything was moved to other headers. The only remaining user I could find for things dropped from the header between 7.0 and 7.1 was qemu_get_vm_name() in the iscsi-initiatorname patch, but it already includes the header to which the function was moved. Signed-off-by: Fiona Ebner --- ...d-support-for-sync-bitmap-mode-never.patch | 22 +- ...-support-for-conditional-and-always-.patch | 2 +- ...check-for-bitmap-mode-without-bitmap.patch | 2 +- ...-to-bdrv_dirty_bitmap_merge_internal.patch | 2 +- .../0006-mirror-move-some-checks-to-qmp.patch | 4 +- ...race-with-clients-disconnecting-earl.patch | 8 +- ...k-gluster-correctly-set-max_pdiscard.patch | 47 --- ...003-block-vmdk-Fix-reopening-bs-file.patch | 129 -------- ...balanced-plugged-counter-in-laio_io_.patch | 44 --- ...erflow-in-snprintf-string-formatting.patch | 100 ------- ...Fix-disabling-MPX-on-cpu-host-with-M.patch | 48 --- ...ontext-use-QEMU_DEFINE_STATIC_CO_TLS.patch | 121 -------- ...outine-use-QEMU_DEFINE_STATIC_CO_TLS.patch | 123 -------- ...ame-qemu_coroutine_inc-dec_pool_size.patch | 90 ------ ...outine-Revert-to-constant-batch-size.patch | 121 -------- ...-not-consult-nonexistent-host-leaves.patch | 117 -------- ...ctrl-and-event-handler-functions-in-.patch | 108 ------- ...t-waste-CPU-polling-the-event-virtqu.patch | 91 ------ ...k-descriptor-chain-in-private-at-SVQ.patch | 102 ------- ...Fix-device-s-used-descriptor-dequeue.patch | 62 ---- ...ex-calculus-at-vhost_vdpa_get_vring_.patch | 39 --- ...ex-calculus-at-vhost_vdpa_svqs_start.patch | 35 --- ...virtio-Replace-g_memdup-by-g_memdup2.patch | 74 ----- ...Fix-element-in-vhost_svq_add-failure.patch | 47 --- ...20-io_uring-fix-short-read-slow-path.patch | 49 --- ...criptor-status-in-a-separate-operati.patch | 82 ----- ...k-file-change-locking-default-to-off.patch | 6 +- ...he-CPU-model-to-kvm64-32-instead-of-.patch | 4 +- ...erfs-no-default-logfile-if-daemonize.patch | 2 +- ...lock-rbd-disable-rbd_cache_writethro.patch | 2 +- .../0007-PVE-Up-qmp-add-get_link_status.patch | 12 +- ...PVE-Up-glusterfs-allow-partial-reads.patch | 2 +- ...return-success-on-info-without-snaps.patch | 4 +- ...dd-add-osize-and-read-from-to-stdin-.patch | 70 +++-- ...E-Up-qemu-img-dd-add-isize-parameter.patch | 23 +- ...PVE-Up-qemu-img-dd-add-n-skip_create.patch | 12 +- ...virtio-balloon-improve-query-balloon.patch | 13 +- .../0014-PVE-qapi-modify-query-machines.patch | 6 +- .../0015-PVE-qapi-modify-spice-query.patch | 4 +- ...nnel-implementation-for-savevm-async.patch | 280 ++++++++++++++++++ ...sync-for-background-state-snapshots.patch} | 148 +++------ ...dd-optional-buffer-size-to-QEMUFile.patch} | 132 +++++---- ...dd-the-zeroinit-block-driver-filter.patch} | 2 +- ...Add-dummy-id-command-line-parameter.patch} | 12 +- ...-target-i386-disable-LINT0-after-re.patch} | 0 ...e-posix-make-locking-optiono-on-cre.patch} | 18 +- ...-PVE-monitor-disable-oob-capability.patch} | 0 ...ed-balloon-qemu-4-0-config-size-fal.patch} | 4 +- ...-Allow-version-code-in-machine-type.patch} | 16 +- ...-bcs-bitmap-initialization-to-job-c.patch} | 10 +- ...E-Backup-add-vma-backup-format-code.patch} | 26 +- ...Backup-add-backup-dump-block-driver.patch} | 15 +- ...kup-proxmox-backup-patches-for-qemu.patch} | 36 +-- ...store-new-command-to-restore-from-p.patch} | 15 +- ...rty-bitmap-tracking-for-incremental.patch} | 14 +- ...patch => 0032-PVE-various-PBS-fixes.patch} | 6 +- ...-driver-to-map-backup-archives-into.patch} | 63 ++-- ...d-query_proxmox_support-QMP-command.patch} | 4 +- ...-add-query-pbs-bitmap-info-QMP-call.patch} | 14 +- ...t-stderr-to-journal-when-daemonized.patch} | 14 +- ...-sequential-job-transaction-support.patch} | 0 ...transaction-to-synchronize-job-stat.patch} | 0 ...block-on-finishing-and-cleanup-crea.patch} | 4 +- ...grate-dirty-bitmap-state-via-savevm.patch} | 16 +- ...irty-bitmap-migrate-other-bitmaps-e.patch} | 0 ...ll-back-to-open-iscsi-initiatorname.patch} | 2 +- ...outine-QMP-for-backup-cancel_backup.patch} | 12 +- ... => 0044-PBS-add-master-key-support.patch} | 10 +- ...t-path-reads-without-allocation-if-.patch} | 0 ...VE-block-stream-increase-chunk-size.patch} | 0 ...ccept-NULL-qiov-in-bdrv_pad_request.patch} | 4 +- ...> 0048-block-add-alloc-track-driver.patch} | 2 +- ...alid-QAPI-names-for-backwards-compa.patch} | 4 +- ...register-yank-before-migration_inco.patch} | 6 +- ...add-l-option-for-loading-a-snapshot.patch} | 16 +- ...h => 0052-vma-allow-partial-restore.patch} | 32 +- ...patch => 0053-pbs-namespace-support.patch} | 20 +- ...rbd-workaround-for-ceph-issue-53784.patch} | 8 +- ...fix-handling-of-holes-in-.bdrv_co_b.patch} | 4 +- ...-rbd-implement-bdrv_co_block_status.patch} | 6 +- ...-jobs-correctly-cancel-in-error-sce.patch} | 0 ...sure-jobs-in-di_list-are-referenced.patch} | 0 ...-segfault-issues-upon-backup-cancel.patch} | 0 ...upport-64KiB-unaligned-input-images.patch} | 6 +- ...-triggering-assertion-in-error-case.patch} | 0 ...k-alloc-track-avoid-premature-break.patch} | 0 ...passing-max-workers-performance-set.patch} | 8 +- debian/patches/series | 115 +++---- qemu | 2 +- 89 files changed, 768 insertions(+), 2167 deletions(-) delete mode 100644 debian/patches/extra/0002-block-gluster-correctly-set-max_pdiscard.patch delete mode 100644 debian/patches/extra/0003-block-vmdk-Fix-reopening-bs-file.patch delete mode 100644 debian/patches/extra/0004-linux-aio-fix-unbalanced-plugged-counter-in-laio_io_.patch delete mode 100644 debian/patches/extra/0005-pci-fix-overflow-in-snprintf-string-formatting.patch delete mode 100644 debian/patches/extra/0006-target-i386-kvm-Fix-disabling-MPX-on-cpu-host-with-M.patch delete mode 100644 debian/patches/extra/0007-coroutine-ucontext-use-QEMU_DEFINE_STATIC_CO_TLS.patch delete mode 100644 debian/patches/extra/0008-coroutine-use-QEMU_DEFINE_STATIC_CO_TLS.patch delete mode 100644 debian/patches/extra/0009-coroutine-Rename-qemu_coroutine_inc-dec_pool_size.patch delete mode 100644 debian/patches/extra/0010-coroutine-Revert-to-constant-batch-size.patch delete mode 100644 debian/patches/extra/0011-target-i386-do-not-consult-nonexistent-host-leaves.patch delete mode 100644 debian/patches/extra/0012-virtio-scsi-fix-ctrl-and-event-handler-functions-in-.patch delete mode 100644 debian/patches/extra/0013-virtio-scsi-don-t-waste-CPU-polling-the-event-virtqu.patch delete mode 100644 debian/patches/extra/0014-vhost-Track-descriptor-chain-in-private-at-SVQ.patch delete mode 100644 debian/patches/extra/0015-vhost-Fix-device-s-used-descriptor-dequeue.patch delete mode 100644 debian/patches/extra/0016-vdpa-Fix-bad-index-calculus-at-vhost_vdpa_get_vring_.patch delete mode 100644 debian/patches/extra/0017-vdpa-Fix-index-calculus-at-vhost_vdpa_svqs_start.patch delete mode 100644 debian/patches/extra/0018-hw-virtio-Replace-g_memdup-by-g_memdup2.patch delete mode 100644 debian/patches/extra/0019-vhost-Fix-element-in-vhost_svq_add-failure.patch delete mode 100644 debian/patches/extra/0020-io_uring-fix-short-read-slow-path.patch delete mode 100644 debian/patches/extra/0021-e1000-set-RX-descriptor-status-in-a-separate-operati.patch create mode 100644 debian/patches/pve/0016-PVE-add-IOChannel-implementation-for-savevm-async.patch rename debian/patches/pve/{0016-PVE-add-savevm-async-for-background-state-snapshots.patch => 0017-PVE-add-savevm-async-for-background-state-snapshots.patch} (88%) rename debian/patches/pve/{0017-PVE-add-optional-buffer-size-to-QEMUFile.patch => 0018-PVE-add-optional-buffer-size-to-QEMUFile.patch} (52%) rename debian/patches/pve/{0018-PVE-block-add-the-zeroinit-block-driver-filter.patch => 0019-PVE-block-add-the-zeroinit-block-driver-filter.patch} (99%) rename debian/patches/pve/{0019-PVE-Add-dummy-id-command-line-parameter.patch => 0020-PVE-Add-dummy-id-command-line-parameter.patch} (86%) rename debian/patches/pve/{0020-PVE-Config-Revert-target-i386-disable-LINT0-after-re.patch => 0021-PVE-Config-Revert-target-i386-disable-LINT0-after-re.patch} (100%) rename debian/patches/pve/{0021-PVE-Up-Config-file-posix-make-locking-optiono-on-cre.patch => 0022-PVE-Up-Config-file-posix-make-locking-optiono-on-cre.patch} (90%) rename debian/patches/pve/{0022-PVE-monitor-disable-oob-capability.patch => 0023-PVE-monitor-disable-oob-capability.patch} (100%) rename debian/patches/pve/{0023-PVE-Compat-4.0-used-balloon-qemu-4-0-config-size-fal.patch => 0024-PVE-Compat-4.0-used-balloon-qemu-4-0-config-size-fal.patch} (95%) rename debian/patches/pve/{0024-PVE-Allow-version-code-in-machine-type.patch => 0025-PVE-Allow-version-code-in-machine-type.patch} (93%) rename debian/patches/pve/{0025-block-backup-move-bcs-bitmap-initialization-to-job-c.patch => 0026-block-backup-move-bcs-bitmap-initialization-to-job-c.patch} (88%) rename debian/patches/pve/{0026-PVE-Backup-add-vma-backup-format-code.patch => 0027-PVE-Backup-add-vma-backup-format-code.patch} (99%) rename debian/patches/pve/{0027-PVE-Backup-add-backup-dump-block-driver.patch => 0028-PVE-Backup-add-backup-dump-block-driver.patch} (96%) rename debian/patches/pve/{0028-PVE-Backup-proxmox-backup-patches-for-qemu.patch => 0029-PVE-Backup-proxmox-backup-patches-for-qemu.patch} (98%) rename debian/patches/pve/{0029-PVE-Backup-pbs-restore-new-command-to-restore-from-p.patch => 0030-PVE-Backup-pbs-restore-new-command-to-restore-from-p.patch} (95%) rename debian/patches/pve/{0030-PVE-Backup-Add-dirty-bitmap-tracking-for-incremental.patch => 0031-PVE-Backup-Add-dirty-bitmap-tracking-for-incremental.patch} (98%) rename debian/patches/pve/{0031-PVE-various-PBS-fixes.patch => 0032-PVE-various-PBS-fixes.patch} (99%) rename debian/patches/pve/{0032-PVE-Add-PBS-block-driver-to-map-backup-archives-into.patch => 0033-PVE-Add-PBS-block-driver-to-map-backup-archives-into.patch} (91%) rename debian/patches/pve/{0033-PVE-add-query_proxmox_support-QMP-command.patch => 0034-PVE-add-query_proxmox_support-QMP-command.patch} (97%) rename debian/patches/pve/{0034-PVE-add-query-pbs-bitmap-info-QMP-call.patch => 0035-PVE-add-query-pbs-bitmap-info-QMP-call.patch} (98%) rename debian/patches/pve/{0035-PVE-redirect-stderr-to-journal-when-daemonized.patch => 0036-PVE-redirect-stderr-to-journal-when-daemonized.patch} (86%) rename debian/patches/pve/{0036-PVE-Add-sequential-job-transaction-support.patch => 0037-PVE-Add-sequential-job-transaction-support.patch} (100%) rename debian/patches/pve/{0037-PVE-Backup-Use-a-transaction-to-synchronize-job-stat.patch => 0038-PVE-Backup-Use-a-transaction-to-synchronize-job-stat.patch} (100%) rename debian/patches/pve/{0038-PVE-Backup-Don-t-block-on-finishing-and-cleanup-crea.patch => 0039-PVE-Backup-Don-t-block-on-finishing-and-cleanup-crea.patch} (99%) rename debian/patches/pve/{0039-PVE-Migrate-dirty-bitmap-state-via-savevm.patch => 0040-PVE-Migrate-dirty-bitmap-state-via-savevm.patch} (96%) rename debian/patches/pve/{0040-migration-block-dirty-bitmap-migrate-other-bitmaps-e.patch => 0041-migration-block-dirty-bitmap-migrate-other-bitmaps-e.patch} (100%) rename debian/patches/pve/{0041-PVE-fall-back-to-open-iscsi-initiatorname.patch => 0042-PVE-fall-back-to-open-iscsi-initiatorname.patch} (98%) rename debian/patches/pve/{0042-PVE-Use-coroutine-QMP-for-backup-cancel_backup.patch => 0043-PVE-Use-coroutine-QMP-for-backup-cancel_backup.patch} (99%) rename debian/patches/pve/{0043-PBS-add-master-key-support.patch => 0044-PBS-add-master-key-support.patch} (97%) rename debian/patches/pve/{0044-PVE-block-pbs-fast-path-reads-without-allocation-if-.patch => 0045-PVE-block-pbs-fast-path-reads-without-allocation-if-.patch} (100%) rename debian/patches/pve/{0045-PVE-block-stream-increase-chunk-size.patch => 0046-PVE-block-stream-increase-chunk-size.patch} (100%) rename debian/patches/pve/{0046-block-io-accept-NULL-qiov-in-bdrv_pad_request.patch => 0047-block-io-accept-NULL-qiov-in-bdrv_pad_request.patch} (90%) rename debian/patches/pve/{0047-block-add-alloc-track-driver.patch => 0048-block-add-alloc-track-driver.patch} (99%) rename debian/patches/pve/{0048-PVE-whitelist-invalid-QAPI-names-for-backwards-compa.patch => 0049-PVE-whitelist-invalid-QAPI-names-for-backwards-compa.patch} (95%) rename debian/patches/pve/{0049-PVE-savevm-async-register-yank-before-migration_inco.patch => 0050-PVE-savevm-async-register-yank-before-migration_inco.patch} (90%) rename debian/patches/pve/{0050-qemu-img-dd-add-l-option-for-loading-a-snapshot.patch => 0051-qemu-img-dd-add-l-option-for-loading-a-snapshot.patch} (91%) rename debian/patches/pve/{0051-vma-allow-partial-restore.patch => 0052-vma-allow-partial-restore.patch} (94%) rename debian/patches/pve/{0052-pbs-namespace-support.patch => 0053-pbs-namespace-support.patch} (96%) rename debian/patches/pve/{0053-Revert-block-rbd-workaround-for-ceph-issue-53784.patch => 0054-Revert-block-rbd-workaround-for-ceph-issue-53784.patch} (92%) rename debian/patches/pve/{0054-Revert-block-rbd-fix-handling-of-holes-in-.bdrv_co_b.patch => 0055-Revert-block-rbd-fix-handling-of-holes-in-.bdrv_co_b.patch} (90%) rename debian/patches/pve/{0055-Revert-block-rbd-implement-bdrv_co_block_status.patch => 0056-Revert-block-rbd-implement-bdrv_co_block_status.patch} (97%) rename debian/patches/pve/{0056-PVE-Backup-create-jobs-correctly-cancel-in-error-sce.patch => 0057-PVE-Backup-create-jobs-correctly-cancel-in-error-sce.patch} (100%) rename debian/patches/pve/{0057-PVE-Backup-ensure-jobs-in-di_list-are-referenced.patch => 0058-PVE-Backup-ensure-jobs-in-di_list-are-referenced.patch} (100%) rename debian/patches/pve/{0058-PVE-Backup-avoid-segfault-issues-upon-backup-cancel.patch => 0059-PVE-Backup-avoid-segfault-issues-upon-backup-cancel.patch} (100%) rename debian/patches/pve/{0059-vma-create-support-64KiB-unaligned-input-images.patch => 0060-vma-create-support-64KiB-unaligned-input-images.patch} (92%) rename debian/patches/pve/{0060-vma-create-avoid-triggering-assertion-in-error-case.patch => 0061-vma-create-avoid-triggering-assertion-in-error-case.patch} (100%) rename debian/patches/pve/{0061-block-alloc-track-avoid-premature-break.patch => 0062-block-alloc-track-avoid-premature-break.patch} (100%) rename debian/patches/pve/{0062-PVE-Backup-allow-passing-max-workers-performance-set.patch => 0063-PVE-Backup-allow-passing-max-workers-performance-set.patch} (98%) diff --git a/debian/patches/bitmap-mirror/0001-drive-mirror-add-support-for-sync-bitmap-mode-never.patch b/debian/patches/bitmap-mirror/0001-drive-mirror-add-support-for-sync-bitmap-mode-never.patch index 5301cf0..8cdca68 100644 --- a/debian/patches/bitmap-mirror/0001-drive-mirror-add-support-for-sync-bitmap-mode-never.patch +++ b/debian/patches/bitmap-mirror/0001-drive-mirror-add-support-for-sync-bitmap-mode-never.patch @@ -36,7 +36,7 @@ Signed-off-by: Thomas Lamprecht 5 files changed, 145 insertions(+), 29 deletions(-) diff --git a/block/mirror.c b/block/mirror.c -index d8ecb9efa2..d95a7d7940 100644 +index 3c4ab1159d..f2eca983f1 100644 --- a/block/mirror.c +++ b/block/mirror.c @@ -51,7 +51,7 @@ typedef struct MirrorBlockJob { @@ -252,7 +252,7 @@ index d8ecb9efa2..d95a7d7940 100644 errp); if (!job) { diff --git a/blockdev.c b/blockdev.c -index e46e831212..fa601838a3 100644 +index 9230888e34..9a1a3118ed 100644 --- a/blockdev.c +++ b/blockdev.c @@ -2951,6 +2951,10 @@ static void blockdev_mirror_common(const char *job_id, BlockDriverState *bs, @@ -344,10 +344,10 @@ index e46e831212..fa601838a3 100644 has_granularity, granularity, has_buf_size, buf_size, diff --git a/include/block/block_int-global-state.h b/include/block/block_int-global-state.h -index 0f21b0570b..e7f901d048 100644 +index b49f4eb35b..9d744db618 100644 --- a/include/block/block_int-global-state.h +++ b/include/block/block_int-global-state.h -@@ -148,7 +148,9 @@ void mirror_start(const char *job_id, BlockDriverState *bs, +@@ -149,7 +149,9 @@ void mirror_start(const char *job_id, BlockDriverState *bs, BlockDriverState *target, const char *replaces, int creation_flags, int64_t speed, uint32_t granularity, int64_t buf_size, @@ -359,10 +359,10 @@ index 0f21b0570b..e7f901d048 100644 BlockdevOnError on_source_error, BlockdevOnError on_target_error, diff --git a/qapi/block-core.json b/qapi/block-core.json -index beeb91952a..fb25c2b245 100644 +index 2173e7734a..e1857e7094 100644 --- a/qapi/block-core.json +++ b/qapi/block-core.json -@@ -1993,10 +1993,19 @@ +@@ -2000,10 +2000,19 @@ # (all the disk, only the sectors allocated in the topmost image, or # only new I/O). # @@ -383,7 +383,7 @@ index beeb91952a..fb25c2b245 100644 # # @buf-size: maximum amount of data in flight from source to # target (since 1.4). -@@ -2034,7 +2043,9 @@ +@@ -2043,7 +2052,9 @@ { 'struct': 'DriveMirror', 'data': { '*job-id': 'str', 'device': 'str', 'target': 'str', '*format': 'str', '*node-name': 'str', '*replaces': 'str', @@ -394,7 +394,7 @@ index beeb91952a..fb25c2b245 100644 '*speed': 'int', '*granularity': 'uint32', '*buf-size': 'int', '*on-source-error': 'BlockdevOnError', '*on-target-error': 'BlockdevOnError', -@@ -2306,10 +2317,19 @@ +@@ -2322,10 +2333,19 @@ # (all the disk, only the sectors allocated in the topmost image, or # only new I/O). # @@ -415,7 +415,7 @@ index beeb91952a..fb25c2b245 100644 # # @buf-size: maximum amount of data in flight from source to # target -@@ -2358,7 +2378,8 @@ +@@ -2375,7 +2395,8 @@ { 'command': 'blockdev-mirror', 'data': { '*job-id': 'str', 'device': 'str', 'target': 'str', '*replaces': 'str', @@ -426,10 +426,10 @@ index beeb91952a..fb25c2b245 100644 '*buf-size': 'int', '*on-source-error': 'BlockdevOnError', '*on-target-error': 'BlockdevOnError', diff --git a/tests/unit/test-block-iothread.c b/tests/unit/test-block-iothread.c -index 94718c9319..7977ac14f4 100644 +index 8b55eccc89..f4650be8e5 100644 --- a/tests/unit/test-block-iothread.c +++ b/tests/unit/test-block-iothread.c -@@ -626,8 +626,8 @@ static void test_propagate_mirror(void) +@@ -753,8 +753,8 @@ static void test_propagate_mirror(void) /* Start a mirror job */ mirror_start("job0", src, target, NULL, JOB_DEFAULT, 0, 0, 0, diff --git a/debian/patches/bitmap-mirror/0002-drive-mirror-add-support-for-conditional-and-always-.patch b/debian/patches/bitmap-mirror/0002-drive-mirror-add-support-for-conditional-and-always-.patch index d30b46d..8c01d80 100644 --- a/debian/patches/bitmap-mirror/0002-drive-mirror-add-support-for-conditional-and-always-.patch +++ b/debian/patches/bitmap-mirror/0002-drive-mirror-add-support-for-conditional-and-always-.patch @@ -24,7 +24,7 @@ Signed-off-by: Thomas Lamprecht 1 file changed, 18 insertions(+), 6 deletions(-) diff --git a/block/mirror.c b/block/mirror.c -index d95a7d7940..2c79ee41af 100644 +index f2eca983f1..b6475d50ad 100644 --- a/block/mirror.c +++ b/block/mirror.c @@ -673,8 +673,6 @@ static int mirror_exit_common(Job *job) diff --git a/debian/patches/bitmap-mirror/0003-mirror-add-check-for-bitmap-mode-without-bitmap.patch b/debian/patches/bitmap-mirror/0003-mirror-add-check-for-bitmap-mode-without-bitmap.patch index ffd3efe..2fac2ca 100644 --- a/debian/patches/bitmap-mirror/0003-mirror-add-check-for-bitmap-mode-without-bitmap.patch +++ b/debian/patches/bitmap-mirror/0003-mirror-add-check-for-bitmap-mode-without-bitmap.patch @@ -16,7 +16,7 @@ Signed-off-by: Thomas Lamprecht 1 file changed, 3 insertions(+) diff --git a/blockdev.c b/blockdev.c -index fa601838a3..93fd0a61a4 100644 +index 9a1a3118ed..a57b0af2e7 100644 --- a/blockdev.c +++ b/blockdev.c @@ -3050,6 +3050,9 @@ static void blockdev_mirror_common(const char *job_id, BlockDriverState *bs, diff --git a/debian/patches/bitmap-mirror/0004-mirror-switch-to-bdrv_dirty_bitmap_merge_internal.patch b/debian/patches/bitmap-mirror/0004-mirror-switch-to-bdrv_dirty_bitmap_merge_internal.patch index c86ceca..4d5f62a 100644 --- a/debian/patches/bitmap-mirror/0004-mirror-switch-to-bdrv_dirty_bitmap_merge_internal.patch +++ b/debian/patches/bitmap-mirror/0004-mirror-switch-to-bdrv_dirty_bitmap_merge_internal.patch @@ -16,7 +16,7 @@ Signed-off-by: Thomas Lamprecht 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/block/mirror.c b/block/mirror.c -index 2c79ee41af..e04a3ea6f4 100644 +index b6475d50ad..8b3342f9ec 100644 --- a/block/mirror.c +++ b/block/mirror.c @@ -779,8 +779,8 @@ static int mirror_exit_common(Job *job) diff --git a/debian/patches/bitmap-mirror/0006-mirror-move-some-checks-to-qmp.patch b/debian/patches/bitmap-mirror/0006-mirror-move-some-checks-to-qmp.patch index 4d4747b..336efbe 100644 --- a/debian/patches/bitmap-mirror/0006-mirror-move-some-checks-to-qmp.patch +++ b/debian/patches/bitmap-mirror/0006-mirror-move-some-checks-to-qmp.patch @@ -19,7 +19,7 @@ Signed-off-by: Thomas Lamprecht 3 files changed, 70 insertions(+), 59 deletions(-) diff --git a/block/mirror.c b/block/mirror.c -index e04a3ea6f4..4feec2a002 100644 +index 8b3342f9ec..1d4ff0efad 100644 --- a/block/mirror.c +++ b/block/mirror.c @@ -1634,31 +1634,13 @@ static BlockJob *mirror_start_job( @@ -60,7 +60,7 @@ index e04a3ea6f4..4feec2a002 100644 if (bitmap_mode != BITMAP_SYNC_MODE_NEVER) { diff --git a/blockdev.c b/blockdev.c -index 93fd0a61a4..1af5a1fcb2 100644 +index a57b0af2e7..ce62a9b439 100644 --- a/blockdev.c +++ b/blockdev.c @@ -3029,7 +3029,36 @@ static void blockdev_mirror_common(const char *job_id, BlockDriverState *bs, diff --git a/debian/patches/extra/0001-monitor-qmp-fix-race-with-clients-disconnecting-earl.patch b/debian/patches/extra/0001-monitor-qmp-fix-race-with-clients-disconnecting-earl.patch index 9d8322c..cd72a8e 100644 --- a/debian/patches/extra/0001-monitor-qmp-fix-race-with-clients-disconnecting-earl.patch +++ b/debian/patches/extra/0001-monitor-qmp-fix-race-with-clients-disconnecting-earl.patch @@ -48,7 +48,7 @@ Signed-off-by: Thomas Lamprecht 6 files changed, 59 insertions(+), 5 deletions(-) diff --git a/include/monitor/monitor.h b/include/monitor/monitor.h -index cc4cc6c6ad..82f649d9ab 100644 +index a4b40e8391..d64ae8f34e 100644 --- a/include/monitor/monitor.h +++ b/include/monitor/monitor.h @@ -16,6 +16,7 @@ extern QemuOptsList qemu_mon_opts; @@ -78,7 +78,7 @@ index caa2e90ef2..e1596f79ab 100644 /** diff --git a/monitor/monitor.c b/monitor/monitor.c -index 21c7a68758..ad9813567a 100644 +index 86949024f6..c306cadcf4 100644 --- a/monitor/monitor.c +++ b/monitor/monitor.c @@ -135,6 +135,21 @@ bool monitor_cur_is_qmp(void) @@ -189,10 +189,10 @@ index 0990873ec8..e605003771 100644 aio_bh_schedule_oneshot(qemu_get_aio_context(), do_qmp_dispatch_bh, &data); diff --git a/stubs/monitor-core.c b/stubs/monitor-core.c -index d058a2a00d..3290b58120 100644 +index afa477aae6..d3ff124bf3 100644 --- a/stubs/monitor-core.c +++ b/stubs/monitor-core.c -@@ -13,6 +13,11 @@ Monitor *monitor_set_cur(Coroutine *co, Monitor *mon) +@@ -12,6 +12,11 @@ Monitor *monitor_set_cur(Coroutine *co, Monitor *mon) return NULL; } diff --git a/debian/patches/extra/0002-block-gluster-correctly-set-max_pdiscard.patch b/debian/patches/extra/0002-block-gluster-correctly-set-max_pdiscard.patch deleted file mode 100644 index c0b8ee0..0000000 --- a/debian/patches/extra/0002-block-gluster-correctly-set-max_pdiscard.patch +++ /dev/null @@ -1,47 +0,0 @@ -From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 -From: Fabian Ebner -Date: Fri, 20 May 2022 09:59:22 +0200 -Subject: [PATCH] block/gluster: correctly set max_pdiscard - -On 64-bit platforms, assigning SIZE_MAX to the int64_t max_pdiscard -results in a negative value, and the following assertion would trigger -down the line (it's not the same max_pdiscard, but computed from the -other one): -qemu-system-x86_64: ../block/io.c:3166: bdrv_co_pdiscard: Assertion -`max_pdiscard >= bs->bl.request_alignment' failed. - -On 32-bit platforms, it's fine to keep using SIZE_MAX. - -The assertion in qemu_gluster_co_pdiscard() is checking that the value -of 'bytes' can safely be passed to glfs_discard_async(), which takes a -size_t for the argument in question, so it is kept as is. And since -max_pdiscard is still <= SIZE_MAX, relying on max_pdiscard is still -fine. - -Fixes: 0c8022876f ("block: use int64_t instead of int in driver discard handlers") -Cc: qemu-stable@nongnu.org -Signed-off-by: Fabian Ebner -Message-Id: <20220520075922.43972-1-f.ebner@proxmox.com> -Reviewed-by: Eric Blake -Reviewed-by: Stefano Garzarella -Reviewed-by: Vladimir Sementsov-Ogievskiy -Signed-off-by: Kevin Wolf -(cherry-picked from commit 9b38fc56c054c7de65fa3bf7cdd82b32654f6b7d) -Signed-off-by: Fabian Ebner ---- - block/gluster.c | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -diff --git a/block/gluster.c b/block/gluster.c -index 80b75cb96c..1079b6186b 100644 ---- a/block/gluster.c -+++ b/block/gluster.c -@@ -901,7 +901,7 @@ out: - static void qemu_gluster_refresh_limits(BlockDriverState *bs, Error **errp) - { - bs->bl.max_transfer = GLUSTER_MAX_TRANSFER; -- bs->bl.max_pdiscard = SIZE_MAX; -+ bs->bl.max_pdiscard = MIN(SIZE_MAX, INT64_MAX); - } - - static int qemu_gluster_reopen_prepare(BDRVReopenState *state, diff --git a/debian/patches/extra/0003-block-vmdk-Fix-reopening-bs-file.patch b/debian/patches/extra/0003-block-vmdk-Fix-reopening-bs-file.patch deleted file mode 100644 index 65c43de..0000000 --- a/debian/patches/extra/0003-block-vmdk-Fix-reopening-bs-file.patch +++ /dev/null @@ -1,129 +0,0 @@ -From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 -From: Hanna Reitz -Date: Mon, 14 Mar 2022 17:27:18 +0100 -Subject: [PATCH] block/vmdk: Fix reopening bs->file - -VMDK disk data is stored in extents, which may or may not be separate -from bs->file. VmdkExtent.file points to where they are stored. Each -that is stored in bs->file will simply reuse the exact pointer value of -bs->file. - -(That is why vmdk_free_extents() will unref VmdkExtent.file (e->file) -only if e->file != bs->file.) - -Reopen operations can change bs->file (they will replace the whole -BdrvChild object, not just the BDS stored in that BdrvChild), and then -we will need to change all .file pointers of all such VmdkExtents to -point to the new BdrvChild. - -In vmdk_reopen_prepare(), we have to check which VmdkExtents are -affected, and in vmdk_reopen_commit(), we can modify them. We have to -split this because: -- The new BdrvChild is created only after prepare, so we can change - VmdkExtent.file only in commit -- In commit, there no longer is any (valid) reference to the old - BdrvChild object, so there would be nothing to compare VmdkExtent.file - against to see whether it was equal to bs->file before reopening - (There is BDRVReopenState.old_file_bs, but the old bs->file - BdrvChild's .bs pointer will be NULL-ed when the new BdrvChild is - created, and so we cannot compare VmdkExtent.file->bs against - BDRVReopenState.old_file_bs) - -Signed-off-by: Hanna Reitz -Message-Id: <20220314162719.65384-2-hreitz@redhat.com> -Signed-off-by: Kevin Wolf -(cherry-picked from commit 6d17e2879854d7d0e623c06a9286085e97bf3545) -Signed-off-by: Fabian Ebner ---- - block/vmdk.c | 56 +++++++++++++++++++++++++++++++++++++++++++++++++++- - 1 file changed, 55 insertions(+), 1 deletion(-) - -diff --git a/block/vmdk.c b/block/vmdk.c -index 37c0946066..38e5ab3806 100644 ---- a/block/vmdk.c -+++ b/block/vmdk.c -@@ -178,6 +178,10 @@ typedef struct BDRVVmdkState { - char *create_type; - } BDRVVmdkState; - -+typedef struct BDRVVmdkReopenState { -+ bool *extents_using_bs_file; -+} BDRVVmdkReopenState; -+ - typedef struct VmdkMetaData { - unsigned int l1_index; - unsigned int l2_index; -@@ -400,15 +404,63 @@ static int vmdk_is_cid_valid(BlockDriverState *bs) - return 1; - } - --/* We have nothing to do for VMDK reopen, stubs just return success */ - static int vmdk_reopen_prepare(BDRVReopenState *state, - BlockReopenQueue *queue, Error **errp) - { -+ BDRVVmdkState *s; -+ BDRVVmdkReopenState *rs; -+ int i; -+ - assert(state != NULL); - assert(state->bs != NULL); -+ assert(state->opaque == NULL); -+ -+ s = state->bs->opaque; -+ -+ rs = g_new0(BDRVVmdkReopenState, 1); -+ state->opaque = rs; -+ -+ /* -+ * Check whether there are any extents stored in bs->file; if bs->file -+ * changes, we will need to update their .file pointers to follow suit -+ */ -+ rs->extents_using_bs_file = g_new(bool, s->num_extents); -+ for (i = 0; i < s->num_extents; i++) { -+ rs->extents_using_bs_file[i] = s->extents[i].file == state->bs->file; -+ } -+ - return 0; - } - -+static void vmdk_reopen_clean(BDRVReopenState *state) -+{ -+ BDRVVmdkReopenState *rs = state->opaque; -+ -+ g_free(rs->extents_using_bs_file); -+ g_free(rs); -+ state->opaque = NULL; -+} -+ -+static void vmdk_reopen_commit(BDRVReopenState *state) -+{ -+ BDRVVmdkState *s = state->bs->opaque; -+ BDRVVmdkReopenState *rs = state->opaque; -+ int i; -+ -+ for (i = 0; i < s->num_extents; i++) { -+ if (rs->extents_using_bs_file[i]) { -+ s->extents[i].file = state->bs->file; -+ } -+ } -+ -+ vmdk_reopen_clean(state); -+} -+ -+static void vmdk_reopen_abort(BDRVReopenState *state) -+{ -+ vmdk_reopen_clean(state); -+} -+ - static int vmdk_parent_open(BlockDriverState *bs) - { - char *p_name; -@@ -3072,6 +3124,8 @@ static BlockDriver bdrv_vmdk = { - .bdrv_open = vmdk_open, - .bdrv_co_check = vmdk_co_check, - .bdrv_reopen_prepare = vmdk_reopen_prepare, -+ .bdrv_reopen_commit = vmdk_reopen_commit, -+ .bdrv_reopen_abort = vmdk_reopen_abort, - .bdrv_child_perm = bdrv_default_perms, - .bdrv_co_preadv = vmdk_co_preadv, - .bdrv_co_pwritev = vmdk_co_pwritev, diff --git a/debian/patches/extra/0004-linux-aio-fix-unbalanced-plugged-counter-in-laio_io_.patch b/debian/patches/extra/0004-linux-aio-fix-unbalanced-plugged-counter-in-laio_io_.patch deleted file mode 100644 index cf130ac..0000000 --- a/debian/patches/extra/0004-linux-aio-fix-unbalanced-plugged-counter-in-laio_io_.patch +++ /dev/null @@ -1,44 +0,0 @@ -From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 -From: Stefan Hajnoczi -Date: Thu, 9 Jun 2022 17:47:11 +0100 -Subject: [PATCH] linux-aio: fix unbalanced plugged counter in laio_io_unplug() - -Every laio_io_plug() call has a matching laio_io_unplug() call. There is -a plugged counter that tracks the number of levels of plugging and -allows for nesting. - -The plugged counter must reflect the balance between laio_io_plug() and -laio_io_unplug() calls accurately. Otherwise I/O stalls occur since -io_submit(2) calls are skipped while plugged. - -Reported-by: Nikolay Tenev -Signed-off-by: Stefan Hajnoczi -Reviewed-by: Stefano Garzarella -Message-id: 20220609164712.1539045-2-stefanha@redhat.com -Cc: Stefano Garzarella -Fixes: 68d7946648 ("linux-aio: add `dev_max_batch` parameter to laio_io_unplug()") -[Stefano Garzarella suggested adding a Fixes tag. ---Stefan] -Signed-off-by: Stefan Hajnoczi -(cherry-picked from commit f387cac5af030a58ac5a0dacf64cab5e5a4fe5c7) -Signed-off-by: Fabian Ebner ---- - block/linux-aio.c | 4 +++- - 1 file changed, 3 insertions(+), 1 deletion(-) - -diff --git a/block/linux-aio.c b/block/linux-aio.c -index 4c423fcccf..6078da7e42 100644 ---- a/block/linux-aio.c -+++ b/block/linux-aio.c -@@ -363,8 +363,10 @@ void laio_io_unplug(BlockDriverState *bs, LinuxAioState *s, - uint64_t dev_max_batch) - { - assert(s->io_q.plugged); -+ s->io_q.plugged--; -+ - if (s->io_q.in_queue >= laio_max_batch(s, dev_max_batch) || -- (--s->io_q.plugged == 0 && -+ (!s->io_q.plugged && - !s->io_q.blocked && !QSIMPLEQ_EMPTY(&s->io_q.pending))) { - ioq_submit(s); - } diff --git a/debian/patches/extra/0005-pci-fix-overflow-in-snprintf-string-formatting.patch b/debian/patches/extra/0005-pci-fix-overflow-in-snprintf-string-formatting.patch deleted file mode 100644 index 3f2dfa9..0000000 --- a/debian/patches/extra/0005-pci-fix-overflow-in-snprintf-string-formatting.patch +++ /dev/null @@ -1,100 +0,0 @@ -From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 -From: Claudio Fontana -Date: Tue, 31 May 2022 13:47:07 +0200 -Subject: [PATCH] pci: fix overflow in snprintf string formatting -MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit - -the code in pcibus_get_fw_dev_path contained the potential for a -stack buffer overflow of 1 byte, potentially writing to the stack an -extra NUL byte. - -This overflow could happen if the PCI slot is >= 0x10000000, -and the PCI function is >= 0x10000000, due to the size parameter -of snprintf being incorrectly calculated in the call: - - if (PCI_FUNC(d->devfn)) - snprintf(path + off, sizeof(path) + off, ",%x", PCI_FUNC(d->devfn)); - -since the off obtained from a previous call to snprintf is added -instead of subtracted from the total available size of the buffer. - -Without the accurate size guard from snprintf, we end up writing in the -worst case: - -name (32) + "@" (1) + SLOT (8) + "," (1) + FUNC (8) + term NUL (1) = 51 bytes - -In order to provide something more robust, replace all of the code in -pcibus_get_fw_dev_path with a single call to g_strdup_printf, -so there is no need to rely on manual calculations. - -Found by compiling QEMU with FORTIFY_SOURCE=3 as the error: - -*** buffer overflow detected ***: terminated - -Thread 1 "qemu-system-x86" received signal SIGABRT, Aborted. -[Switching to Thread 0x7ffff642c380 (LWP 121307)] -0x00007ffff71ff55c in __pthread_kill_implementation () from /lib64/libc.so.6 -(gdb) bt - #0 0x00007ffff71ff55c in __pthread_kill_implementation () at /lib64/libc.so.6 - #1 0x00007ffff71ac6f6 in raise () at /lib64/libc.so.6 - #2 0x00007ffff7195814 in abort () at /lib64/libc.so.6 - #3 0x00007ffff71f279e in __libc_message () at /lib64/libc.so.6 - #4 0x00007ffff729767a in __fortify_fail () at /lib64/libc.so.6 - #5 0x00007ffff7295c36 in () at /lib64/libc.so.6 - #6 0x00007ffff72957f5 in __snprintf_chk () at /lib64/libc.so.6 - #7 0x0000555555b1c1fd in pcibus_get_fw_dev_path () - #8 0x0000555555f2bde4 in qdev_get_fw_dev_path_helper.constprop () - #9 0x0000555555f2bd86 in qdev_get_fw_dev_path_helper.constprop () - #10 0x00005555559a6e5d in get_boot_device_path () - #11 0x00005555559a712c in get_boot_devices_list () - #12 0x0000555555b1a3d0 in fw_cfg_machine_reset () - #13 0x0000555555bf4c2d in pc_machine_reset () - #14 0x0000555555c66988 in qemu_system_reset () - #15 0x0000555555a6dff6 in qdev_machine_creation_done () - #16 0x0000555555c79186 in qmp_x_exit_preconfig.part () - #17 0x0000555555c7b459 in qemu_init () - #18 0x0000555555960a29 in main () - -Found-by: Dario Faggioli -Found-by: Martin Liška -Cc: qemu-stable@nongnu.org -Signed-off-by: Claudio Fontana -Message-Id: <20220531114707.18830-1-cfontana@suse.de> -Reviewed-by: Ani Sinha -(cherry-picked from commit 36f18c6989a3d1ff1d7a0e50b0868ef3958299b4) -Signed-off-by: Fabian Ebner ---- - hw/pci/pci.c | 18 +++++++++--------- - 1 file changed, 9 insertions(+), 9 deletions(-) - -diff --git a/hw/pci/pci.c b/hw/pci/pci.c -index dae9119bfe..c69b412434 100644 ---- a/hw/pci/pci.c -+++ b/hw/pci/pci.c -@@ -2625,15 +2625,15 @@ static char *pci_dev_fw_name(DeviceState *dev, char *buf, int len) - static char *pcibus_get_fw_dev_path(DeviceState *dev) - { - PCIDevice *d = (PCIDevice *)dev; -- char path[50], name[33]; -- int off; -- -- off = snprintf(path, sizeof(path), "%s@%x", -- pci_dev_fw_name(dev, name, sizeof name), -- PCI_SLOT(d->devfn)); -- if (PCI_FUNC(d->devfn)) -- snprintf(path + off, sizeof(path) + off, ",%x", PCI_FUNC(d->devfn)); -- return g_strdup(path); -+ char name[33]; -+ int has_func = !!PCI_FUNC(d->devfn); -+ -+ return g_strdup_printf("%s@%x%s%.*x", -+ pci_dev_fw_name(dev, name, sizeof(name)), -+ PCI_SLOT(d->devfn), -+ has_func ? "," : "", -+ has_func, -+ PCI_FUNC(d->devfn)); - } - - static char *pcibus_get_dev_path(DeviceState *dev) diff --git a/debian/patches/extra/0006-target-i386-kvm-Fix-disabling-MPX-on-cpu-host-with-M.patch b/debian/patches/extra/0006-target-i386-kvm-Fix-disabling-MPX-on-cpu-host-with-M.patch deleted file mode 100644 index d393ed1..0000000 --- a/debian/patches/extra/0006-target-i386-kvm-Fix-disabling-MPX-on-cpu-host-with-M.patch +++ /dev/null @@ -1,48 +0,0 @@ -From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 -From: "Maciej S. Szmigiero" -Date: Mon, 23 May 2022 18:26:58 +0200 -Subject: [PATCH] target/i386/kvm: Fix disabling MPX on "-cpu host" with - MPX-capable host - -Since KVM commit 5f76f6f5ff96 ("KVM: nVMX: Do not expose MPX VMX controls when guest MPX disabled") -it is not possible to disable MPX on a "-cpu host" just by adding "-mpx" -there if the host CPU does indeed support MPX. -QEMU will fail to set MSR_IA32_VMX_TRUE_{EXIT,ENTRY}_CTLS MSRs in this case -and so trigger an assertion failure. - -Instead, besides "-mpx" one has to explicitly add also -"-vmx-exit-clear-bndcfgs" and "-vmx-entry-load-bndcfgs" to QEMU command -line to make it work, which is a bit convoluted. - -Make the MPX-related bits in FEAT_VMX_{EXIT,ENTRY}_CTLS dependent on MPX -being actually enabled so such workarounds are no longer necessary. - -Signed-off-by: Maciej S. Szmigiero -Message-Id: <51aa2125c76363204cc23c27165e778097c33f0b.1653323077.git.maciej.szmigiero@oracle.com> -Cc: qemu-stable@nongnu.org -Signed-off-by: Paolo Bonzini -(cherry-picked from commit 267b5e7e378afd260004cb37a66a6fcd641e3b53) -Signed-off-by: Fabian Ebner ---- - target/i386/cpu.c | 8 ++++++++ - 1 file changed, 8 insertions(+) - -diff --git a/target/i386/cpu.c b/target/i386/cpu.c -index cb6b5467d0..6e6945139b 100644 ---- a/target/i386/cpu.c -+++ b/target/i386/cpu.c -@@ -1327,6 +1327,14 @@ static FeatureDep feature_dependencies[] = { - .from = { FEAT_7_0_EBX, CPUID_7_0_EBX_INVPCID }, - .to = { FEAT_VMX_SECONDARY_CTLS, VMX_SECONDARY_EXEC_ENABLE_INVPCID }, - }, -+ { -+ .from = { FEAT_7_0_EBX, CPUID_7_0_EBX_MPX }, -+ .to = { FEAT_VMX_EXIT_CTLS, VMX_VM_EXIT_CLEAR_BNDCFGS }, -+ }, -+ { -+ .from = { FEAT_7_0_EBX, CPUID_7_0_EBX_MPX }, -+ .to = { FEAT_VMX_ENTRY_CTLS, VMX_VM_ENTRY_LOAD_BNDCFGS }, -+ }, - { - .from = { FEAT_7_0_EBX, CPUID_7_0_EBX_RDSEED }, - .to = { FEAT_VMX_SECONDARY_CTLS, VMX_SECONDARY_EXEC_RDSEED_EXITING }, diff --git a/debian/patches/extra/0007-coroutine-ucontext-use-QEMU_DEFINE_STATIC_CO_TLS.patch b/debian/patches/extra/0007-coroutine-ucontext-use-QEMU_DEFINE_STATIC_CO_TLS.patch deleted file mode 100644 index 6c4d523..0000000 --- a/debian/patches/extra/0007-coroutine-ucontext-use-QEMU_DEFINE_STATIC_CO_TLS.patch +++ /dev/null @@ -1,121 +0,0 @@ -From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 -From: Stefan Hajnoczi -Date: Mon, 7 Mar 2022 15:38:51 +0000 -Subject: [PATCH] coroutine-ucontext: use QEMU_DEFINE_STATIC_CO_TLS() -MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit - -Thread-Local Storage variables cannot be used directly from coroutine -code because the compiler may optimize TLS variable accesses across -qemu_coroutine_yield() calls. When the coroutine is re-entered from -another thread the TLS variables from the old thread must no longer be -used. - -Use QEMU_DEFINE_STATIC_CO_TLS() for the current and leader variables. - -Signed-off-by: Stefan Hajnoczi -Message-Id: <20220307153853.602859-2-stefanha@redhat.com> -Reviewed-by: Philippe Mathieu-Daudé -Signed-off-by: Kevin Wolf -(cherry-picked from commit 34145a307d849d0b6734d0222a7aa0bb9eef7407) -Signed-off-by: Fabian Ebner ---- - util/coroutine-ucontext.c | 38 ++++++++++++++++++++++++-------------- - 1 file changed, 24 insertions(+), 14 deletions(-) - -diff --git a/util/coroutine-ucontext.c b/util/coroutine-ucontext.c -index 904b375192..127d5a13c8 100644 ---- a/util/coroutine-ucontext.c -+++ b/util/coroutine-ucontext.c -@@ -25,6 +25,7 @@ - #include "qemu/osdep.h" - #include - #include "qemu/coroutine_int.h" -+#include "qemu/coroutine-tls.h" - - #ifdef CONFIG_VALGRIND_H - #include -@@ -66,8 +67,8 @@ typedef struct { - /** - * Per-thread coroutine bookkeeping - */ --static __thread CoroutineUContext leader; --static __thread Coroutine *current; -+QEMU_DEFINE_STATIC_CO_TLS(Coroutine *, current); -+QEMU_DEFINE_STATIC_CO_TLS(CoroutineUContext, leader); - - /* - * va_args to makecontext() must be type 'int', so passing -@@ -97,14 +98,15 @@ static inline __attribute__((always_inline)) - void finish_switch_fiber(void *fake_stack_save) - { - #ifdef CONFIG_ASAN -+ CoroutineUContext *leaderp = get_ptr_leader(); - const void *bottom_old; - size_t size_old; - - __sanitizer_finish_switch_fiber(fake_stack_save, &bottom_old, &size_old); - -- if (!leader.stack) { -- leader.stack = (void *)bottom_old; -- leader.stack_size = size_old; -+ if (!leaderp->stack) { -+ leaderp->stack = (void *)bottom_old; -+ leaderp->stack_size = size_old; - } - #endif - #ifdef CONFIG_TSAN -@@ -161,8 +163,10 @@ static void coroutine_trampoline(int i0, int i1) - - /* Initialize longjmp environment and switch back the caller */ - if (!sigsetjmp(self->env, 0)) { -- start_switch_fiber_asan(COROUTINE_YIELD, &fake_stack_save, leader.stack, -- leader.stack_size); -+ CoroutineUContext *leaderp = get_ptr_leader(); -+ -+ start_switch_fiber_asan(COROUTINE_YIELD, &fake_stack_save, -+ leaderp->stack, leaderp->stack_size); - start_switch_fiber_tsan(&fake_stack_save, self, true); /* true=caller */ - siglongjmp(*(sigjmp_buf *)co->entry_arg, 1); - } -@@ -297,7 +301,7 @@ qemu_coroutine_switch(Coroutine *from_, Coroutine *to_, - int ret; - void *fake_stack_save = NULL; - -- current = to_; -+ set_current(to_); - - ret = sigsetjmp(from->env, 0); - if (ret == 0) { -@@ -315,18 +319,24 @@ qemu_coroutine_switch(Coroutine *from_, Coroutine *to_, - - Coroutine *qemu_coroutine_self(void) - { -- if (!current) { -- current = &leader.base; -+ Coroutine *self = get_current(); -+ CoroutineUContext *leaderp = get_ptr_leader(); -+ -+ if (!self) { -+ self = &leaderp->base; -+ set_current(self); - } - #ifdef CONFIG_TSAN -- if (!leader.tsan_co_fiber) { -- leader.tsan_co_fiber = __tsan_get_current_fiber(); -+ if (!leaderp->tsan_co_fiber) { -+ leaderp->tsan_co_fiber = __tsan_get_current_fiber(); - } - #endif -- return current; -+ return self; - } - - bool qemu_in_coroutine(void) - { -- return current && current->caller; -+ Coroutine *self = get_current(); -+ -+ return self && self->caller; - } diff --git a/debian/patches/extra/0008-coroutine-use-QEMU_DEFINE_STATIC_CO_TLS.patch b/debian/patches/extra/0008-coroutine-use-QEMU_DEFINE_STATIC_CO_TLS.patch deleted file mode 100644 index b5c4d3b..0000000 --- a/debian/patches/extra/0008-coroutine-use-QEMU_DEFINE_STATIC_CO_TLS.patch +++ /dev/null @@ -1,123 +0,0 @@ -From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 -From: Stefan Hajnoczi -Date: Mon, 7 Mar 2022 15:38:52 +0000 -Subject: [PATCH] coroutine: use QEMU_DEFINE_STATIC_CO_TLS() -MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit - -Thread-Local Storage variables cannot be used directly from coroutine -code because the compiler may optimize TLS variable accesses across -qemu_coroutine_yield() calls. When the coroutine is re-entered from -another thread the TLS variables from the old thread must no longer be -used. - -Use QEMU_DEFINE_STATIC_CO_TLS() for the current and leader variables. -The alloc_pool QSLIST needs a typedef so the return value of -get_ptr_alloc_pool() can be stored in a local variable. - -One example of why this code is necessary: a coroutine that yields -before calling qemu_coroutine_create() to create another coroutine is -affected by the TLS issue. - -Signed-off-by: Stefan Hajnoczi -Message-Id: <20220307153853.602859-3-stefanha@redhat.com> -Reviewed-by: Philippe Mathieu-Daudé -Signed-off-by: Kevin Wolf -(cherry-picked from commit ac387a08a9c9f6b36757da912f0339c25f421f90) -Signed-off-by: Fabian Ebner ---- - util/qemu-coroutine.c | 41 ++++++++++++++++++++++++----------------- - 1 file changed, 24 insertions(+), 17 deletions(-) - -diff --git a/util/qemu-coroutine.c b/util/qemu-coroutine.c -index c03b2422ff..f3e8300c8d 100644 ---- a/util/qemu-coroutine.c -+++ b/util/qemu-coroutine.c -@@ -18,6 +18,7 @@ - #include "qemu/atomic.h" - #include "qemu/coroutine.h" - #include "qemu/coroutine_int.h" -+#include "qemu/coroutine-tls.h" - #include "block/aio.h" - - /** Initial batch size is 64, and is increased on demand */ -@@ -29,17 +30,20 @@ enum { - static QSLIST_HEAD(, Coroutine) release_pool = QSLIST_HEAD_INITIALIZER(pool); - static unsigned int pool_batch_size = POOL_INITIAL_BATCH_SIZE; - static unsigned int release_pool_size; --static __thread QSLIST_HEAD(, Coroutine) alloc_pool = QSLIST_HEAD_INITIALIZER(pool); --static __thread unsigned int alloc_pool_size; --static __thread Notifier coroutine_pool_cleanup_notifier; -+ -+typedef QSLIST_HEAD(, Coroutine) CoroutineQSList; -+QEMU_DEFINE_STATIC_CO_TLS(CoroutineQSList, alloc_pool); -+QEMU_DEFINE_STATIC_CO_TLS(unsigned int, alloc_pool_size); -+QEMU_DEFINE_STATIC_CO_TLS(Notifier, coroutine_pool_cleanup_notifier); - - static void coroutine_pool_cleanup(Notifier *n, void *value) - { - Coroutine *co; - Coroutine *tmp; -+ CoroutineQSList *alloc_pool = get_ptr_alloc_pool(); - -- QSLIST_FOREACH_SAFE(co, &alloc_pool, pool_next, tmp) { -- QSLIST_REMOVE_HEAD(&alloc_pool, pool_next); -+ QSLIST_FOREACH_SAFE(co, alloc_pool, pool_next, tmp) { -+ QSLIST_REMOVE_HEAD(alloc_pool, pool_next); - qemu_coroutine_delete(co); - } - } -@@ -49,27 +53,30 @@ Coroutine *qemu_coroutine_create(CoroutineEntry *entry, void *opaque) - Coroutine *co = NULL; - - if (CONFIG_COROUTINE_POOL) { -- co = QSLIST_FIRST(&alloc_pool); -+ CoroutineQSList *alloc_pool = get_ptr_alloc_pool(); -+ -+ co = QSLIST_FIRST(alloc_pool); - if (!co) { - if (release_pool_size > qatomic_read(&pool_batch_size)) { - /* Slow path; a good place to register the destructor, too. */ -- if (!coroutine_pool_cleanup_notifier.notify) { -- coroutine_pool_cleanup_notifier.notify = coroutine_pool_cleanup; -- qemu_thread_atexit_add(&coroutine_pool_cleanup_notifier); -+ Notifier *notifier = get_ptr_coroutine_pool_cleanup_notifier(); -+ if (!notifier->notify) { -+ notifier->notify = coroutine_pool_cleanup; -+ qemu_thread_atexit_add(notifier); - } - - /* This is not exact; there could be a little skew between - * release_pool_size and the actual size of release_pool. But - * it is just a heuristic, it does not need to be perfect. - */ -- alloc_pool_size = qatomic_xchg(&release_pool_size, 0); -- QSLIST_MOVE_ATOMIC(&alloc_pool, &release_pool); -- co = QSLIST_FIRST(&alloc_pool); -+ set_alloc_pool_size(qatomic_xchg(&release_pool_size, 0)); -+ QSLIST_MOVE_ATOMIC(alloc_pool, &release_pool); -+ co = QSLIST_FIRST(alloc_pool); - } - } - if (co) { -- QSLIST_REMOVE_HEAD(&alloc_pool, pool_next); -- alloc_pool_size--; -+ QSLIST_REMOVE_HEAD(alloc_pool, pool_next); -+ set_alloc_pool_size(get_alloc_pool_size() - 1); - } - } - -@@ -93,9 +100,9 @@ static void coroutine_delete(Coroutine *co) - qatomic_inc(&release_pool_size); - return; - } -- if (alloc_pool_size < qatomic_read(&pool_batch_size)) { -- QSLIST_INSERT_HEAD(&alloc_pool, co, pool_next); -- alloc_pool_size++; -+ if (get_alloc_pool_size() < qatomic_read(&pool_batch_size)) { -+ QSLIST_INSERT_HEAD(get_ptr_alloc_pool(), co, pool_next); -+ set_alloc_pool_size(get_alloc_pool_size() + 1); - return; - } - } diff --git a/debian/patches/extra/0009-coroutine-Rename-qemu_coroutine_inc-dec_pool_size.patch b/debian/patches/extra/0009-coroutine-Rename-qemu_coroutine_inc-dec_pool_size.patch deleted file mode 100644 index 9459471..0000000 --- a/debian/patches/extra/0009-coroutine-Rename-qemu_coroutine_inc-dec_pool_size.patch +++ /dev/null @@ -1,90 +0,0 @@ -From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 -From: Kevin Wolf -Date: Tue, 10 May 2022 17:10:19 +0200 -Subject: [PATCH] coroutine: Rename qemu_coroutine_inc/dec_pool_size() - -It's true that these functions currently affect the batch size in which -coroutines are reused (i.e. moved from the global release pool to the -allocation pool of a specific thread), but this is a bug and will be -fixed in a separate patch. - -In fact, the comment in the header file already just promises that it -influences the pool size, so reflect this in the name of the functions. -As a nice side effect, the shorter function name makes some line -wrapping unnecessary. - -Cc: qemu-stable@nongnu.org -Signed-off-by: Kevin Wolf -Message-Id: <20220510151020.105528-2-kwolf@redhat.com> -Signed-off-by: Kevin Wolf -(cherry-picked from commit 98e3ab35054b946f7c2aba5408822532b0920b53) -Signed-off-by: Fabian Ebner ---- - hw/block/virtio-blk.c | 6 ++---- - include/qemu/coroutine.h | 6 +++--- - util/qemu-coroutine.c | 4 ++-- - 3 files changed, 7 insertions(+), 9 deletions(-) - -diff --git a/hw/block/virtio-blk.c b/hw/block/virtio-blk.c -index 540c38f829..6a1cc41877 100644 ---- a/hw/block/virtio-blk.c -+++ b/hw/block/virtio-blk.c -@@ -1215,8 +1215,7 @@ static void virtio_blk_device_realize(DeviceState *dev, Error **errp) - for (i = 0; i < conf->num_queues; i++) { - virtio_add_queue(vdev, conf->queue_size, virtio_blk_handle_output); - } -- qemu_coroutine_increase_pool_batch_size(conf->num_queues * conf->queue_size -- / 2); -+ qemu_coroutine_inc_pool_size(conf->num_queues * conf->queue_size / 2); - virtio_blk_data_plane_create(vdev, conf, &s->dataplane, &err); - if (err != NULL) { - error_propagate(errp, err); -@@ -1253,8 +1252,7 @@ static void virtio_blk_device_unrealize(DeviceState *dev) - for (i = 0; i < conf->num_queues; i++) { - virtio_del_queue(vdev, i); - } -- qemu_coroutine_decrease_pool_batch_size(conf->num_queues * conf->queue_size -- / 2); -+ qemu_coroutine_dec_pool_size(conf->num_queues * conf->queue_size / 2); - qemu_del_vm_change_state_handler(s->change); - blockdev_mark_auto_del(s->blk); - virtio_cleanup(vdev); -diff --git a/include/qemu/coroutine.h b/include/qemu/coroutine.h -index c828a95ee0..5b621d1295 100644 ---- a/include/qemu/coroutine.h -+++ b/include/qemu/coroutine.h -@@ -334,12 +334,12 @@ void coroutine_fn yield_until_fd_readable(int fd); - /** - * Increase coroutine pool size - */ --void qemu_coroutine_increase_pool_batch_size(unsigned int additional_pool_size); -+void qemu_coroutine_inc_pool_size(unsigned int additional_pool_size); - - /** -- * Devcrease coroutine pool size -+ * Decrease coroutine pool size - */ --void qemu_coroutine_decrease_pool_batch_size(unsigned int additional_pool_size); -+void qemu_coroutine_dec_pool_size(unsigned int additional_pool_size); - - #include "qemu/lockable.h" - -diff --git a/util/qemu-coroutine.c b/util/qemu-coroutine.c -index f3e8300c8d..ea23929a74 100644 ---- a/util/qemu-coroutine.c -+++ b/util/qemu-coroutine.c -@@ -212,12 +212,12 @@ AioContext *coroutine_fn qemu_coroutine_get_aio_context(Coroutine *co) - return co->ctx; - } - --void qemu_coroutine_increase_pool_batch_size(unsigned int additional_pool_size) -+void qemu_coroutine_inc_pool_size(unsigned int additional_pool_size) - { - qatomic_add(&pool_batch_size, additional_pool_size); - } - --void qemu_coroutine_decrease_pool_batch_size(unsigned int removing_pool_size) -+void qemu_coroutine_dec_pool_size(unsigned int removing_pool_size) - { - qatomic_sub(&pool_batch_size, removing_pool_size); - } diff --git a/debian/patches/extra/0010-coroutine-Revert-to-constant-batch-size.patch b/debian/patches/extra/0010-coroutine-Revert-to-constant-batch-size.patch deleted file mode 100644 index 711ffe0..0000000 --- a/debian/patches/extra/0010-coroutine-Revert-to-constant-batch-size.patch +++ /dev/null @@ -1,121 +0,0 @@ -From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 -From: Kevin Wolf -Date: Tue, 10 May 2022 17:10:20 +0200 -Subject: [PATCH] coroutine: Revert to constant batch size - -Commit 4c41c69e changed the way the coroutine pool is sized because for -virtio-blk devices with a large queue size and heavy I/O, it was just -too small and caused coroutines to be deleted and reallocated soon -afterwards. The change made the size dynamic based on the number of -queues and the queue size of virtio-blk devices. - -There are two important numbers here: Slightly simplified, when a -coroutine terminates, it is generally stored in the global release pool -up to a certain pool size, and if the pool is full, it is freed. -Conversely, when allocating a new coroutine, the coroutines in the -release pool are reused if the pool already has reached a certain -minimum size (the batch size), otherwise we allocate new coroutines. - -The problem after commit 4c41c69e is that it not only increases the -maximum pool size (which is the intended effect), but also the batch -size for reusing coroutines (which is a bug). It means that in cases -with many devices and/or a large queue size (which defaults to the -number of vcpus for virtio-blk-pci), many thousand coroutines could be -sitting in the release pool without being reused. - -This is not only a waste of memory and allocations, but it actually -makes the QEMU process likely to hit the vm.max_map_count limit on Linux -because each coroutine requires two mappings (its stack and the guard -page for the stack), causing it to abort() in qemu_alloc_stack() because -when the limit is hit, mprotect() starts to fail with ENOMEM. - -In order to fix the problem, change the batch size back to 64 to avoid -uselessly accumulating coroutines in the release pool, but keep the -dynamic maximum pool size so that coroutines aren't freed too early -in heavy I/O scenarios. - -Note that this fix doesn't strictly make it impossible to hit the limit, -but this would only happen if most of the coroutines are actually in use -at the same time, not just sitting in a pool. This is the same behaviour -as we already had before commit 4c41c69e. Fully preventing this would -require allowing qemu_coroutine_create() to return an error, but it -doesn't seem to be a scenario that people hit in practice. - -Cc: qemu-stable@nongnu.org -Resolves: https://bugzilla.redhat.com/show_bug.cgi?id=2079938 -Fixes: 4c41c69e05fe28c0f95f8abd2ebf407e95a4f04b -Signed-off-by: Kevin Wolf -Message-Id: <20220510151020.105528-3-kwolf@redhat.com> -Tested-by: Hiroki Narukawa -Signed-off-by: Kevin Wolf -(cherry-picked from commit 9ec7a59b5aad4b736871c378d30f5ef5ec51cb52) -Signed-off-by: Fabian Ebner ---- - util/qemu-coroutine.c | 22 ++++++++++++++-------- - 1 file changed, 14 insertions(+), 8 deletions(-) - -diff --git a/util/qemu-coroutine.c b/util/qemu-coroutine.c -index ea23929a74..4a8bd63ef0 100644 ---- a/util/qemu-coroutine.c -+++ b/util/qemu-coroutine.c -@@ -21,14 +21,20 @@ - #include "qemu/coroutine-tls.h" - #include "block/aio.h" - --/** Initial batch size is 64, and is increased on demand */ -+/** -+ * The minimal batch size is always 64, coroutines from the release_pool are -+ * reused as soon as there are 64 coroutines in it. The maximum pool size starts -+ * with 64 and is increased on demand so that coroutines are not deleted even if -+ * they are not immediately reused. -+ */ - enum { -- POOL_INITIAL_BATCH_SIZE = 64, -+ POOL_MIN_BATCH_SIZE = 64, -+ POOL_INITIAL_MAX_SIZE = 64, - }; - - /** Free list to speed up creation */ - static QSLIST_HEAD(, Coroutine) release_pool = QSLIST_HEAD_INITIALIZER(pool); --static unsigned int pool_batch_size = POOL_INITIAL_BATCH_SIZE; -+static unsigned int pool_max_size = POOL_INITIAL_MAX_SIZE; - static unsigned int release_pool_size; - - typedef QSLIST_HEAD(, Coroutine) CoroutineQSList; -@@ -57,7 +63,7 @@ Coroutine *qemu_coroutine_create(CoroutineEntry *entry, void *opaque) - - co = QSLIST_FIRST(alloc_pool); - if (!co) { -- if (release_pool_size > qatomic_read(&pool_batch_size)) { -+ if (release_pool_size > POOL_MIN_BATCH_SIZE) { - /* Slow path; a good place to register the destructor, too. */ - Notifier *notifier = get_ptr_coroutine_pool_cleanup_notifier(); - if (!notifier->notify) { -@@ -95,12 +101,12 @@ static void coroutine_delete(Coroutine *co) - co->caller = NULL; - - if (CONFIG_COROUTINE_POOL) { -- if (release_pool_size < qatomic_read(&pool_batch_size) * 2) { -+ if (release_pool_size < qatomic_read(&pool_max_size) * 2) { - QSLIST_INSERT_HEAD_ATOMIC(&release_pool, co, pool_next); - qatomic_inc(&release_pool_size); - return; - } -- if (get_alloc_pool_size() < qatomic_read(&pool_batch_size)) { -+ if (get_alloc_pool_size() < qatomic_read(&pool_max_size)) { - QSLIST_INSERT_HEAD(get_ptr_alloc_pool(), co, pool_next); - set_alloc_pool_size(get_alloc_pool_size() + 1); - return; -@@ -214,10 +220,10 @@ AioContext *coroutine_fn qemu_coroutine_get_aio_context(Coroutine *co) - - void qemu_coroutine_inc_pool_size(unsigned int additional_pool_size) - { -- qatomic_add(&pool_batch_size, additional_pool_size); -+ qatomic_add(&pool_max_size, additional_pool_size); - } - - void qemu_coroutine_dec_pool_size(unsigned int removing_pool_size) - { -- qatomic_sub(&pool_batch_size, removing_pool_size); -+ qatomic_sub(&pool_max_size, removing_pool_size); - } diff --git a/debian/patches/extra/0011-target-i386-do-not-consult-nonexistent-host-leaves.patch b/debian/patches/extra/0011-target-i386-do-not-consult-nonexistent-host-leaves.patch deleted file mode 100644 index cf535bb..0000000 --- a/debian/patches/extra/0011-target-i386-do-not-consult-nonexistent-host-leaves.patch +++ /dev/null @@ -1,117 +0,0 @@ -From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 -From: Paolo Bonzini -Date: Fri, 29 Apr 2022 21:16:28 +0200 -Subject: [PATCH] target/i386: do not consult nonexistent host leaves - -When cache_info_passthrough is requested, QEMU passes the host values -of the cache information CPUID leaves down to the guest. However, -it blindly assumes that the CPUID leaf exists on the host, and this -cannot be guaranteed: for example, KVM has recently started to -synthesize AMD leaves up to 0x80000021 in order to provide accurate -CPU bug information to guests. - -Querying a nonexistent host leaf fills the output arguments of -host_cpuid with data that (albeit deterministic) is nonsensical -as cache information, namely the data in the highest Intel CPUID -leaf. If said highest leaf is not ECX-dependent, this can even -cause an infinite loop when kvm_arch_init_vcpu prepares the input -to KVM_SET_CPUID2. The infinite loop is only terminated by an -abort() when the array gets full. - -Reported-by: Maxim Levitsky -Reviewed-by: Maxim Levitsky -Cc: qemu-stable@nongnu.org -Signed-off-by: Paolo Bonzini -(cherry-picked from commit 798d8ec0dacd4cc0034298d94f430c14f23e2919) -Signed-off-by: Fabian Ebner ---- - target/i386/cpu.c | 41 ++++++++++++++++++++++++++++++++++++----- - 1 file changed, 36 insertions(+), 5 deletions(-) - -diff --git a/target/i386/cpu.c b/target/i386/cpu.c -index 6e6945139b..c79e151887 100644 ---- a/target/i386/cpu.c -+++ b/target/i386/cpu.c -@@ -5030,6 +5030,37 @@ uint64_t x86_cpu_get_supported_feature_word(FeatureWord w, - return r; - } - -+static void x86_cpu_get_cache_cpuid(uint32_t func, uint32_t index, -+ uint32_t *eax, uint32_t *ebx, -+ uint32_t *ecx, uint32_t *edx) -+{ -+ uint32_t level, unused; -+ -+ /* Only return valid host leaves. */ -+ switch (func) { -+ case 2: -+ case 4: -+ host_cpuid(0, 0, &level, &unused, &unused, &unused); -+ break; -+ case 0x80000005: -+ case 0x80000006: -+ case 0x8000001d: -+ host_cpuid(0x80000000, 0, &level, &unused, &unused, &unused); -+ break; -+ default: -+ return; -+ } -+ -+ if (func > level) { -+ *eax = 0; -+ *ebx = 0; -+ *ecx = 0; -+ *edx = 0; -+ } else { -+ host_cpuid(func, index, eax, ebx, ecx, edx); -+ } -+} -+ - /* - * Only for builtin_x86_defs models initialized with x86_register_cpudef_types. - */ -@@ -5288,7 +5319,7 @@ void cpu_x86_cpuid(CPUX86State *env, uint32_t index, uint32_t count, - case 2: - /* cache info: needed for Pentium Pro compatibility */ - if (cpu->cache_info_passthrough) { -- host_cpuid(index, 0, eax, ebx, ecx, edx); -+ x86_cpu_get_cache_cpuid(index, 0, eax, ebx, ecx, edx); - break; - } else if (cpu->vendor_cpuid_only && IS_AMD_CPU(env)) { - *eax = *ebx = *ecx = *edx = 0; -@@ -5308,7 +5339,7 @@ void cpu_x86_cpuid(CPUX86State *env, uint32_t index, uint32_t count, - case 4: - /* cache info: needed for Core compatibility */ - if (cpu->cache_info_passthrough) { -- host_cpuid(index, count, eax, ebx, ecx, edx); -+ x86_cpu_get_cache_cpuid(index, count, eax, ebx, ecx, edx); - /* QEMU gives out its own APIC IDs, never pass down bits 31..26. */ - *eax &= ~0xFC000000; - if ((*eax & 31) && cs->nr_cores > 1) { -@@ -5710,7 +5741,7 @@ void cpu_x86_cpuid(CPUX86State *env, uint32_t index, uint32_t count, - case 0x80000005: - /* cache info (L1 cache) */ - if (cpu->cache_info_passthrough) { -- host_cpuid(index, 0, eax, ebx, ecx, edx); -+ x86_cpu_get_cache_cpuid(index, 0, eax, ebx, ecx, edx); - break; - } - *eax = (L1_DTLB_2M_ASSOC << 24) | (L1_DTLB_2M_ENTRIES << 16) | -@@ -5723,7 +5754,7 @@ void cpu_x86_cpuid(CPUX86State *env, uint32_t index, uint32_t count, - case 0x80000006: - /* cache info (L2 cache) */ - if (cpu->cache_info_passthrough) { -- host_cpuid(index, 0, eax, ebx, ecx, edx); -+ x86_cpu_get_cache_cpuid(index, 0, eax, ebx, ecx, edx); - break; - } - *eax = (AMD_ENC_ASSOC(L2_DTLB_2M_ASSOC) << 28) | -@@ -5783,7 +5814,7 @@ void cpu_x86_cpuid(CPUX86State *env, uint32_t index, uint32_t count, - case 0x8000001D: - *eax = 0; - if (cpu->cache_info_passthrough) { -- host_cpuid(index, count, eax, ebx, ecx, edx); -+ x86_cpu_get_cache_cpuid(index, count, eax, ebx, ecx, edx); - break; - } - switch (count) { diff --git a/debian/patches/extra/0012-virtio-scsi-fix-ctrl-and-event-handler-functions-in-.patch b/debian/patches/extra/0012-virtio-scsi-fix-ctrl-and-event-handler-functions-in-.patch deleted file mode 100644 index 92a57cf..0000000 --- a/debian/patches/extra/0012-virtio-scsi-fix-ctrl-and-event-handler-functions-in-.patch +++ /dev/null @@ -1,108 +0,0 @@ -From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 -From: Stefan Hajnoczi -Date: Wed, 27 Apr 2022 15:35:36 +0100 -Subject: [PATCH] virtio-scsi: fix ctrl and event handler functions in - dataplane mode - -Commit f34e8d8b8d48d73f36a67b6d5e492ef9784b5012 ("virtio-scsi: prepare -virtio_scsi_handle_cmd for dataplane") prepared the virtio-scsi cmd -virtqueue handler function to be used in both the dataplane and -non-datpalane code paths. - -It failed to convert the ctrl and event virtqueue handler functions, -which are not designed to be called from the dataplane code path but -will be since the ioeventfd is set up for those virtqueues when -dataplane starts. - -Convert the ctrl and event virtqueue handler functions now so they -operate correctly when called from the dataplane code path. Avoid code -duplication by extracting this code into a helper function. - -Fixes: f34e8d8b8d48d73f36a67b6d5e492ef9784b5012 ("virtio-scsi: prepare virtio_scsi_handle_cmd for dataplane") -Signed-off-by: Stefan Hajnoczi -Reviewed-by: Paolo Bonzini -Message-id: 20220427143541.119567-2-stefanha@redhat.com -[Fixed s/by used/be used/ typo pointed out by Michael Tokarev -. ---Stefan] -Signed-off-by: Stefan Hajnoczi -(cherry-picked from commit 2f743ef6366c2df4ef51ef3ae318138cdc0125ab) -Signed-off-by: Fabian Ebner ---- - hw/scsi/virtio-scsi.c | 42 +++++++++++++++++++++++++++--------------- - 1 file changed, 27 insertions(+), 15 deletions(-) - -diff --git a/hw/scsi/virtio-scsi.c b/hw/scsi/virtio-scsi.c -index 34a968ecfb..417fbc71d6 100644 ---- a/hw/scsi/virtio-scsi.c -+++ b/hw/scsi/virtio-scsi.c -@@ -472,16 +472,32 @@ bool virtio_scsi_handle_ctrl_vq(VirtIOSCSI *s, VirtQueue *vq) - return progress; - } - -+/* -+ * If dataplane is configured but not yet started, do so now and return true on -+ * success. -+ * -+ * Dataplane is started by the core virtio code but virtqueue handler functions -+ * can also be invoked when a guest kicks before DRIVER_OK, so this helper -+ * function helps us deal with manually starting ioeventfd in that case. -+ */ -+static bool virtio_scsi_defer_to_dataplane(VirtIOSCSI *s) -+{ -+ if (!s->ctx || s->dataplane_started) { -+ return false; -+ } -+ -+ virtio_device_start_ioeventfd(&s->parent_obj.parent_obj); -+ return !s->dataplane_fenced; -+} -+ - static void virtio_scsi_handle_ctrl(VirtIODevice *vdev, VirtQueue *vq) - { - VirtIOSCSI *s = (VirtIOSCSI *)vdev; - -- if (s->ctx) { -- virtio_device_start_ioeventfd(vdev); -- if (!s->dataplane_fenced) { -- return; -- } -+ if (virtio_scsi_defer_to_dataplane(s)) { -+ return; - } -+ - virtio_scsi_acquire(s); - virtio_scsi_handle_ctrl_vq(s, vq); - virtio_scsi_release(s); -@@ -720,12 +736,10 @@ static void virtio_scsi_handle_cmd(VirtIODevice *vdev, VirtQueue *vq) - /* use non-QOM casts in the data path */ - VirtIOSCSI *s = (VirtIOSCSI *)vdev; - -- if (s->ctx && !s->dataplane_started) { -- virtio_device_start_ioeventfd(vdev); -- if (!s->dataplane_fenced) { -- return; -- } -+ if (virtio_scsi_defer_to_dataplane(s)) { -+ return; - } -+ - virtio_scsi_acquire(s); - virtio_scsi_handle_cmd_vq(s, vq); - virtio_scsi_release(s); -@@ -855,12 +869,10 @@ static void virtio_scsi_handle_event(VirtIODevice *vdev, VirtQueue *vq) - { - VirtIOSCSI *s = VIRTIO_SCSI(vdev); - -- if (s->ctx) { -- virtio_device_start_ioeventfd(vdev); -- if (!s->dataplane_fenced) { -- return; -- } -+ if (virtio_scsi_defer_to_dataplane(s)) { -+ return; - } -+ - virtio_scsi_acquire(s); - virtio_scsi_handle_event_vq(s, vq); - virtio_scsi_release(s); diff --git a/debian/patches/extra/0013-virtio-scsi-don-t-waste-CPU-polling-the-event-virtqu.patch b/debian/patches/extra/0013-virtio-scsi-don-t-waste-CPU-polling-the-event-virtqu.patch deleted file mode 100644 index 238d456..0000000 --- a/debian/patches/extra/0013-virtio-scsi-don-t-waste-CPU-polling-the-event-virtqu.patch +++ /dev/null @@ -1,91 +0,0 @@ -From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 -From: Stefan Hajnoczi -Date: Wed, 27 Apr 2022 15:35:37 +0100 -Subject: [PATCH] virtio-scsi: don't waste CPU polling the event virtqueue - -The virtio-scsi event virtqueue is not emptied by its handler function. -This is typical for rx virtqueues where the device uses buffers when -some event occurs (e.g. a packet is received, an error condition -happens, etc). - -Polling non-empty virtqueues wastes CPU cycles. We are not waiting for -new buffers to become available, we are waiting for an event to occur, -so it's a misuse of CPU resources to poll for buffers. - -Introduce the new virtio_queue_aio_attach_host_notifier_no_poll() API, -which is identical to virtio_queue_aio_attach_host_notifier() except -that it does not poll the virtqueue. - -Before this patch the following command-line consumed 100% CPU in the -IOThread polling and calling virtio_scsi_handle_event(): - - $ qemu-system-x86_64 -M accel=kvm -m 1G -cpu host \ - --object iothread,id=iothread0 \ - --device virtio-scsi-pci,iothread=iothread0 \ - --blockdev file,filename=test.img,aio=native,cache.direct=on,node-name=drive0 \ - --device scsi-hd,drive=drive0 - -After this patch CPU is no longer wasted. - -Reported-by: Nir Soffer -Signed-off-by: Stefan Hajnoczi -Tested-by: Nir Soffer -Message-id: 20220427143541.119567-3-stefanha@redhat.com -Signed-off-by: Stefan Hajnoczi -(cherry-picked from commit 38738f7dbbda90fbc161757b7f4be35b52205552) -Signed-off-by: Fabian Ebner ---- - hw/scsi/virtio-scsi-dataplane.c | 2 +- - hw/virtio/virtio.c | 13 +++++++++++++ - include/hw/virtio/virtio.h | 1 + - 3 files changed, 15 insertions(+), 1 deletion(-) - -diff --git a/hw/scsi/virtio-scsi-dataplane.c b/hw/scsi/virtio-scsi-dataplane.c -index 29575cbaf6..8bb6e6acfc 100644 ---- a/hw/scsi/virtio-scsi-dataplane.c -+++ b/hw/scsi/virtio-scsi-dataplane.c -@@ -138,7 +138,7 @@ int virtio_scsi_dataplane_start(VirtIODevice *vdev) - - aio_context_acquire(s->ctx); - virtio_queue_aio_attach_host_notifier(vs->ctrl_vq, s->ctx); -- virtio_queue_aio_attach_host_notifier(vs->event_vq, s->ctx); -+ virtio_queue_aio_attach_host_notifier_no_poll(vs->event_vq, s->ctx); - - for (i = 0; i < vs->conf.num_queues; i++) { - virtio_queue_aio_attach_host_notifier(vs->cmd_vqs[i], s->ctx); -diff --git a/hw/virtio/virtio.c b/hw/virtio/virtio.c -index 9d637e043e..67a873f54a 100644 ---- a/hw/virtio/virtio.c -+++ b/hw/virtio/virtio.c -@@ -3534,6 +3534,19 @@ void virtio_queue_aio_attach_host_notifier(VirtQueue *vq, AioContext *ctx) - virtio_queue_host_notifier_aio_poll_end); - } - -+/* -+ * Same as virtio_queue_aio_attach_host_notifier() but without polling. Use -+ * this for rx virtqueues and similar cases where the virtqueue handler -+ * function does not pop all elements. When the virtqueue is left non-empty -+ * polling consumes CPU cycles and should not be used. -+ */ -+void virtio_queue_aio_attach_host_notifier_no_poll(VirtQueue *vq, AioContext *ctx) -+{ -+ aio_set_event_notifier(ctx, &vq->host_notifier, true, -+ virtio_queue_host_notifier_read, -+ NULL, NULL); -+} -+ - void virtio_queue_aio_detach_host_notifier(VirtQueue *vq, AioContext *ctx) - { - aio_set_event_notifier(ctx, &vq->host_notifier, true, NULL, NULL, NULL); -diff --git a/include/hw/virtio/virtio.h b/include/hw/virtio/virtio.h -index b31c4507f5..b62a35fdca 100644 ---- a/include/hw/virtio/virtio.h -+++ b/include/hw/virtio/virtio.h -@@ -317,6 +317,7 @@ EventNotifier *virtio_queue_get_host_notifier(VirtQueue *vq); - void virtio_queue_set_host_notifier_enabled(VirtQueue *vq, bool enabled); - void virtio_queue_host_notifier_read(EventNotifier *n); - void virtio_queue_aio_attach_host_notifier(VirtQueue *vq, AioContext *ctx); -+void virtio_queue_aio_attach_host_notifier_no_poll(VirtQueue *vq, AioContext *ctx); - void virtio_queue_aio_detach_host_notifier(VirtQueue *vq, AioContext *ctx); - VirtQueue *virtio_vector_first_queue(VirtIODevice *vdev, uint16_t vector); - VirtQueue *virtio_vector_next_queue(VirtQueue *vq); diff --git a/debian/patches/extra/0014-vhost-Track-descriptor-chain-in-private-at-SVQ.patch b/debian/patches/extra/0014-vhost-Track-descriptor-chain-in-private-at-SVQ.patch deleted file mode 100644 index 2f52fd3..0000000 --- a/debian/patches/extra/0014-vhost-Track-descriptor-chain-in-private-at-SVQ.patch +++ /dev/null @@ -1,102 +0,0 @@ -From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?Eugenio=20P=C3=A9rez?= -Date: Thu, 12 May 2022 19:57:42 +0200 -Subject: [PATCH] vhost: Track descriptor chain in private at SVQ -MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit - -The device could have access to modify them, and it definitely have -access when we implement packed vq. Harden SVQ maintaining a private -copy of the descriptor chain. Other fields like buffer addresses are -already maintained sepparatedly. - -Signed-off-by: Eugenio Pérez -Message-Id: <20220512175747.142058-2-eperezma@redhat.com> -Reviewed-by: Michael S. Tsirkin -Signed-off-by: Michael S. Tsirkin -(cherry-picked from commit 495fe3a78749c39c0e772c4e1a55d6cb8a7e5292) -Signed-off-by: Fabian Ebner ---- - hw/virtio/vhost-shadow-virtqueue.c | 12 +++++++----- - hw/virtio/vhost-shadow-virtqueue.h | 6 ++++++ - 2 files changed, 13 insertions(+), 5 deletions(-) - -diff --git a/hw/virtio/vhost-shadow-virtqueue.c b/hw/virtio/vhost-shadow-virtqueue.c -index b232803d1b..3155801f50 100644 ---- a/hw/virtio/vhost-shadow-virtqueue.c -+++ b/hw/virtio/vhost-shadow-virtqueue.c -@@ -138,6 +138,7 @@ static void vhost_vring_write_descs(VhostShadowVirtqueue *svq, hwaddr *sg, - for (n = 0; n < num; n++) { - if (more_descs || (n + 1 < num)) { - descs[i].flags = flags | cpu_to_le16(VRING_DESC_F_NEXT); -+ descs[i].next = cpu_to_le16(svq->desc_next[i]); - } else { - descs[i].flags = flags; - } -@@ -145,10 +146,10 @@ static void vhost_vring_write_descs(VhostShadowVirtqueue *svq, hwaddr *sg, - descs[i].len = cpu_to_le32(iovec[n].iov_len); - - last = i; -- i = cpu_to_le16(descs[i].next); -+ i = cpu_to_le16(svq->desc_next[i]); - } - -- svq->free_head = le16_to_cpu(descs[last].next); -+ svq->free_head = le16_to_cpu(svq->desc_next[last]); - } - - static bool vhost_svq_add_split(VhostShadowVirtqueue *svq, -@@ -336,7 +337,6 @@ static void vhost_svq_disable_notification(VhostShadowVirtqueue *svq) - static VirtQueueElement *vhost_svq_get_buf(VhostShadowVirtqueue *svq, - uint32_t *len) - { -- vring_desc_t *descs = svq->vring.desc; - const vring_used_t *used = svq->vring.used; - vring_used_elem_t used_elem; - uint16_t last_used; -@@ -365,7 +365,7 @@ static VirtQueueElement *vhost_svq_get_buf(VhostShadowVirtqueue *svq, - return NULL; - } - -- descs[used_elem.id].next = svq->free_head; -+ svq->desc_next[used_elem.id] = svq->free_head; - svq->free_head = used_elem.id; - - *len = used_elem.len; -@@ -540,8 +540,9 @@ void vhost_svq_start(VhostShadowVirtqueue *svq, VirtIODevice *vdev, - svq->vring.used = qemu_memalign(qemu_real_host_page_size, device_size); - memset(svq->vring.used, 0, device_size); - svq->ring_id_maps = g_new0(VirtQueueElement *, svq->vring.num); -+ svq->desc_next = g_new0(uint16_t, svq->vring.num); - for (unsigned i = 0; i < svq->vring.num - 1; i++) { -- svq->vring.desc[i].next = cpu_to_le16(i + 1); -+ svq->desc_next[i] = cpu_to_le16(i + 1); - } - } - -@@ -574,6 +575,7 @@ void vhost_svq_stop(VhostShadowVirtqueue *svq) - virtqueue_detach_element(svq->vq, next_avail_elem, 0); - } - svq->vq = NULL; -+ g_free(svq->desc_next); - g_free(svq->ring_id_maps); - qemu_vfree(svq->vring.desc); - qemu_vfree(svq->vring.used); -diff --git a/hw/virtio/vhost-shadow-virtqueue.h b/hw/virtio/vhost-shadow-virtqueue.h -index e5e24c536d..c132c994e9 100644 ---- a/hw/virtio/vhost-shadow-virtqueue.h -+++ b/hw/virtio/vhost-shadow-virtqueue.h -@@ -53,6 +53,12 @@ typedef struct VhostShadowVirtqueue { - /* Next VirtQueue element that guest made available */ - VirtQueueElement *next_guest_avail_elem; - -+ /* -+ * Backup next field for each descriptor so we can recover securely, not -+ * needing to trust the device access. -+ */ -+ uint16_t *desc_next; -+ - /* Next head to expose to the device */ - uint16_t shadow_avail_idx; - diff --git a/debian/patches/extra/0015-vhost-Fix-device-s-used-descriptor-dequeue.patch b/debian/patches/extra/0015-vhost-Fix-device-s-used-descriptor-dequeue.patch deleted file mode 100644 index 497bcec..0000000 --- a/debian/patches/extra/0015-vhost-Fix-device-s-used-descriptor-dequeue.patch +++ /dev/null @@ -1,62 +0,0 @@ -From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?Eugenio=20P=C3=A9rez?= -Date: Thu, 12 May 2022 19:57:43 +0200 -Subject: [PATCH] vhost: Fix device's used descriptor dequeue -MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit - -Only the first one of them were properly enqueued back. - -Fixes: 100890f7ca ("vhost: Shadow virtqueue buffers forwarding") - -Signed-off-by: Eugenio Pérez -Message-Id: <20220512175747.142058-3-eperezma@redhat.com> -Reviewed-by: Michael S. Tsirkin -Signed-off-by: Michael S. Tsirkin -(cherry-picked from commit 81abfa5724c9a6502d7a1d3a67c55f2a303a1170) -Signed-off-by: Fabian Ebner ---- - hw/virtio/vhost-shadow-virtqueue.c | 17 +++++++++++++++-- - 1 file changed, 15 insertions(+), 2 deletions(-) - -diff --git a/hw/virtio/vhost-shadow-virtqueue.c b/hw/virtio/vhost-shadow-virtqueue.c -index 3155801f50..31fc50907d 100644 ---- a/hw/virtio/vhost-shadow-virtqueue.c -+++ b/hw/virtio/vhost-shadow-virtqueue.c -@@ -334,12 +334,22 @@ static void vhost_svq_disable_notification(VhostShadowVirtqueue *svq) - svq->vring.avail->flags |= cpu_to_le16(VRING_AVAIL_F_NO_INTERRUPT); - } - -+static uint16_t vhost_svq_last_desc_of_chain(const VhostShadowVirtqueue *svq, -+ uint16_t num, uint16_t i) -+{ -+ for (uint16_t j = 0; j < (num - 1); ++j) { -+ i = le16_to_cpu(svq->desc_next[i]); -+ } -+ -+ return i; -+} -+ - static VirtQueueElement *vhost_svq_get_buf(VhostShadowVirtqueue *svq, - uint32_t *len) - { - const vring_used_t *used = svq->vring.used; - vring_used_elem_t used_elem; -- uint16_t last_used; -+ uint16_t last_used, last_used_chain, num; - - if (!vhost_svq_more_used(svq)) { - return NULL; -@@ -365,7 +375,10 @@ static VirtQueueElement *vhost_svq_get_buf(VhostShadowVirtqueue *svq, - return NULL; - } - -- svq->desc_next[used_elem.id] = svq->free_head; -+ num = svq->ring_id_maps[used_elem.id]->in_num + -+ svq->ring_id_maps[used_elem.id]->out_num; -+ last_used_chain = vhost_svq_last_desc_of_chain(svq, num, used_elem.id); -+ svq->desc_next[last_used_chain] = svq->free_head; - svq->free_head = used_elem.id; - - *len = used_elem.len; diff --git a/debian/patches/extra/0016-vdpa-Fix-bad-index-calculus-at-vhost_vdpa_get_vring_.patch b/debian/patches/extra/0016-vdpa-Fix-bad-index-calculus-at-vhost_vdpa_get_vring_.patch deleted file mode 100644 index 6f33164..0000000 --- a/debian/patches/extra/0016-vdpa-Fix-bad-index-calculus-at-vhost_vdpa_get_vring_.patch +++ /dev/null @@ -1,39 +0,0 @@ -From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?Eugenio=20P=C3=A9rez?= -Date: Thu, 12 May 2022 19:57:44 +0200 -Subject: [PATCH] vdpa: Fix bad index calculus at vhost_vdpa_get_vring_base -MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit - -Fixes: 6d0b222666 ("vdpa: Adapt vhost_vdpa_get_vring_base to SVQ") - -Acked-by: Jason Wang -Signed-off-by: Eugenio Pérez -Message-Id: <20220512175747.142058-4-eperezma@redhat.com> -Reviewed-by: Michael S. Tsirkin -Signed-off-by: Michael S. Tsirkin -(cherry-picked from commit 639036477ef890958415967e753ca2cbb348c16c) -Signed-off-by: Fabian Ebner ---- - hw/virtio/vhost-vdpa.c | 4 ++-- - 1 file changed, 2 insertions(+), 2 deletions(-) - -diff --git a/hw/virtio/vhost-vdpa.c b/hw/virtio/vhost-vdpa.c -index 8adf7c0b92..8555a84f87 100644 ---- a/hw/virtio/vhost-vdpa.c -+++ b/hw/virtio/vhost-vdpa.c -@@ -1170,11 +1170,11 @@ static int vhost_vdpa_get_vring_base(struct vhost_dev *dev, - struct vhost_vring_state *ring) - { - struct vhost_vdpa *v = dev->opaque; -+ int vdpa_idx = ring->index - dev->vq_index; - int ret; - - if (v->shadow_vqs_enabled) { -- VhostShadowVirtqueue *svq = g_ptr_array_index(v->shadow_vqs, -- ring->index); -+ VhostShadowVirtqueue *svq = g_ptr_array_index(v->shadow_vqs, vdpa_idx); - - /* - * Setting base as last used idx, so destination will see as available diff --git a/debian/patches/extra/0017-vdpa-Fix-index-calculus-at-vhost_vdpa_svqs_start.patch b/debian/patches/extra/0017-vdpa-Fix-index-calculus-at-vhost_vdpa_svqs_start.patch deleted file mode 100644 index 8c74f0c..0000000 --- a/debian/patches/extra/0017-vdpa-Fix-index-calculus-at-vhost_vdpa_svqs_start.patch +++ /dev/null @@ -1,35 +0,0 @@ -From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?Eugenio=20P=C3=A9rez?= -Date: Thu, 12 May 2022 19:57:45 +0200 -Subject: [PATCH] vdpa: Fix index calculus at vhost_vdpa_svqs_start -MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit - -With the introduction of MQ the index of the vq needs to be calculated -with the device model vq_index. - -Signed-off-by: Eugenio Pérez -Acked-by: Jason Wang -Message-Id: <20220512175747.142058-5-eperezma@redhat.com> -Reviewed-by: Michael S. Tsirkin -Signed-off-by: Michael S. Tsirkin -(cherry-picked from commit 1c82fdfef8a227518ffecae9d419bcada995c202) -Signed-off-by: Fabian Ebner ---- - hw/virtio/vhost-vdpa.c | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -diff --git a/hw/virtio/vhost-vdpa.c b/hw/virtio/vhost-vdpa.c -index 8555a84f87..aa43cfa7d9 100644 ---- a/hw/virtio/vhost-vdpa.c -+++ b/hw/virtio/vhost-vdpa.c -@@ -1016,7 +1016,7 @@ static bool vhost_vdpa_svqs_start(struct vhost_dev *dev) - VirtQueue *vq = virtio_get_queue(dev->vdev, dev->vq_index + i); - VhostShadowVirtqueue *svq = g_ptr_array_index(v->shadow_vqs, i); - struct vhost_vring_addr addr = { -- .index = i, -+ .index = dev->vq_index + i, - }; - int r; - bool ok = vhost_vdpa_svq_setup(dev, svq, i, &err); diff --git a/debian/patches/extra/0018-hw-virtio-Replace-g_memdup-by-g_memdup2.patch b/debian/patches/extra/0018-hw-virtio-Replace-g_memdup-by-g_memdup2.patch deleted file mode 100644 index 12ea0ad..0000000 --- a/debian/patches/extra/0018-hw-virtio-Replace-g_memdup-by-g_memdup2.patch +++ /dev/null @@ -1,74 +0,0 @@ -From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= -Date: Thu, 12 May 2022 19:57:46 +0200 -Subject: [PATCH] hw/virtio: Replace g_memdup() by g_memdup2() -MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit - -Per https://discourse.gnome.org/t/port-your-module-from-g-memdup-to-g-memdup2-now/5538 - - The old API took the size of the memory to duplicate as a guint, - whereas most memory functions take memory sizes as a gsize. This - made it easy to accidentally pass a gsize to g_memdup(). For large - values, that would lead to a silent truncation of the size from 64 - to 32 bits, and result in a heap area being returned which is - significantly smaller than what the caller expects. This can likely - be exploited in various modules to cause a heap buffer overflow. - -Replace g_memdup() by the safer g_memdup2() wrapper. - -Acked-by: Jason Wang -Acked-by: Eugenio Pérez -Signed-off-by: Philippe Mathieu-Daudé -Message-Id: <20220512175747.142058-6-eperezma@redhat.com> -Reviewed-by: Michael S. Tsirkin -Signed-off-by: Michael S. Tsirkin -(cherry-picked from commit d792199de55ca5cb5334016884039c740290b5c7) -Signed-off-by: Fabian Ebner ---- - hw/net/virtio-net.c | 3 ++- - hw/virtio/virtio-crypto.c | 6 +++--- - 2 files changed, 5 insertions(+), 4 deletions(-) - -diff --git a/hw/net/virtio-net.c b/hw/net/virtio-net.c -index 1067e72b39..e4748a7e6c 100644 ---- a/hw/net/virtio-net.c -+++ b/hw/net/virtio-net.c -@@ -1443,7 +1443,8 @@ static void virtio_net_handle_ctrl(VirtIODevice *vdev, VirtQueue *vq) - } - - iov_cnt = elem->out_num; -- iov2 = iov = g_memdup(elem->out_sg, sizeof(struct iovec) * elem->out_num); -+ iov2 = iov = g_memdup2(elem->out_sg, -+ sizeof(struct iovec) * elem->out_num); - s = iov_to_buf(iov, iov_cnt, 0, &ctrl, sizeof(ctrl)); - iov_discard_front(&iov, &iov_cnt, sizeof(ctrl)); - if (s != sizeof(ctrl)) { -diff --git a/hw/virtio/virtio-crypto.c b/hw/virtio/virtio-crypto.c -index dcd80b904d..0e31e3cc04 100644 ---- a/hw/virtio/virtio-crypto.c -+++ b/hw/virtio/virtio-crypto.c -@@ -242,7 +242,7 @@ static void virtio_crypto_handle_ctrl(VirtIODevice *vdev, VirtQueue *vq) - } - - out_num = elem->out_num; -- out_iov_copy = g_memdup(elem->out_sg, sizeof(out_iov[0]) * out_num); -+ out_iov_copy = g_memdup2(elem->out_sg, sizeof(out_iov[0]) * out_num); - out_iov = out_iov_copy; - - in_num = elem->in_num; -@@ -605,11 +605,11 @@ virtio_crypto_handle_request(VirtIOCryptoReq *request) - } - - out_num = elem->out_num; -- out_iov_copy = g_memdup(elem->out_sg, sizeof(out_iov[0]) * out_num); -+ out_iov_copy = g_memdup2(elem->out_sg, sizeof(out_iov[0]) * out_num); - out_iov = out_iov_copy; - - in_num = elem->in_num; -- in_iov_copy = g_memdup(elem->in_sg, sizeof(in_iov[0]) * in_num); -+ in_iov_copy = g_memdup2(elem->in_sg, sizeof(in_iov[0]) * in_num); - in_iov = in_iov_copy; - - if (unlikely(iov_to_buf(out_iov, out_num, 0, &req, sizeof(req)) diff --git a/debian/patches/extra/0019-vhost-Fix-element-in-vhost_svq_add-failure.patch b/debian/patches/extra/0019-vhost-Fix-element-in-vhost_svq_add-failure.patch deleted file mode 100644 index daa5bca..0000000 --- a/debian/patches/extra/0019-vhost-Fix-element-in-vhost_svq_add-failure.patch +++ /dev/null @@ -1,47 +0,0 @@ -From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?Eugenio=20P=C3=A9rez?= -Date: Thu, 12 May 2022 19:57:47 +0200 -Subject: [PATCH] vhost: Fix element in vhost_svq_add failure -MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit - -Coverity rightly reports that is not free in that case. - -Fixes: Coverity CID 1487559 -Fixes: 100890f7ca ("vhost: Shadow virtqueue buffers forwarding") - -Signed-off-by: Eugenio Pérez -Message-Id: <20220512175747.142058-7-eperezma@redhat.com> -Reviewed-by: Michael S. Tsirkin -Signed-off-by: Michael S. Tsirkin -(cherry-picked from commit 5181db132b587754dda3a520eec923b87a65bbb7) -Signed-off-by: Fabian Ebner ---- - hw/virtio/vhost-shadow-virtqueue.c | 8 ++++++++ - 1 file changed, 8 insertions(+) - -diff --git a/hw/virtio/vhost-shadow-virtqueue.c b/hw/virtio/vhost-shadow-virtqueue.c -index 31fc50907d..06d0bb39d9 100644 ---- a/hw/virtio/vhost-shadow-virtqueue.c -+++ b/hw/virtio/vhost-shadow-virtqueue.c -@@ -199,11 +199,19 @@ static bool vhost_svq_add_split(VhostShadowVirtqueue *svq, - return true; - } - -+/** -+ * Add an element to a SVQ. -+ * -+ * The caller must check that there is enough slots for the new element. It -+ * takes ownership of the element: In case of failure, it is free and the SVQ -+ * is considered broken. -+ */ - static bool vhost_svq_add(VhostShadowVirtqueue *svq, VirtQueueElement *elem) - { - unsigned qemu_head; - bool ok = vhost_svq_add_split(svq, elem, &qemu_head); - if (unlikely(!ok)) { -+ g_free(elem); - return false; - } - diff --git a/debian/patches/extra/0020-io_uring-fix-short-read-slow-path.patch b/debian/patches/extra/0020-io_uring-fix-short-read-slow-path.patch deleted file mode 100644 index 88cf137..0000000 --- a/debian/patches/extra/0020-io_uring-fix-short-read-slow-path.patch +++ /dev/null @@ -1,49 +0,0 @@ -From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 -From: Dominique Martinet -Date: Thu, 30 Jun 2022 10:01:37 +0900 -Subject: [PATCH] io_uring: fix short read slow path - -sqeq.off here is the offset to read within the disk image, so obviously -not 'nread' (the amount we just read), but as the author meant to write -its current value incremented by the amount we just read. - -Normally recent versions of linux will not issue short reads, -but it can happen so we should fix this. - -This lead to weird image corruptions when short read happened - -Fixes: 6663a0a33764 ("block/io_uring: implements interfaces for io_uring") -Link: https://lkml.kernel.org/r/YrrFGO4A1jS0GI0G@atmark-techno.com -Signed-off-by: Dominique Martinet -Message-Id: <20220630010137.2518851-1-dominique.martinet@atmark-techno.com> -Reviewed-by: Hanna Reitz -Reviewed-by: Stefano Garzarella -Signed-off-by: Stefan Hajnoczi -(cherry-picked from commit c06fc7ce147e57ab493bad9263f1601b8298484b) -Signed-off-by: Fabian Ebner ---- - block/io_uring.c | 4 ++-- - 1 file changed, 2 insertions(+), 2 deletions(-) - -diff --git a/block/io_uring.c b/block/io_uring.c -index 782afdb433..e451e55de0 100644 ---- a/block/io_uring.c -+++ b/block/io_uring.c -@@ -89,7 +89,7 @@ static void luring_resubmit_short_read(LuringState *s, LuringAIOCB *luringcb, - trace_luring_resubmit_short_read(s, luringcb, nread); - - /* Update read position */ -- luringcb->total_read = nread; -+ luringcb->total_read += nread; - remaining = luringcb->qiov->size - luringcb->total_read; - - /* Shorten qiov */ -@@ -103,7 +103,7 @@ static void luring_resubmit_short_read(LuringState *s, LuringAIOCB *luringcb, - remaining); - - /* Update sqe */ -- luringcb->sqeq.off = nread; -+ luringcb->sqeq.off += nread; - luringcb->sqeq.addr = (__u64)(uintptr_t)luringcb->resubmit_qiov.iov; - luringcb->sqeq.len = luringcb->resubmit_qiov.niov; - diff --git a/debian/patches/extra/0021-e1000-set-RX-descriptor-status-in-a-separate-operati.patch b/debian/patches/extra/0021-e1000-set-RX-descriptor-status-in-a-separate-operati.patch deleted file mode 100644 index ee66fba..0000000 --- a/debian/patches/extra/0021-e1000-set-RX-descriptor-status-in-a-separate-operati.patch +++ /dev/null @@ -1,82 +0,0 @@ -From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 -From: Ding Hui -Date: Wed, 29 Jun 2022 17:40:26 +0800 -Subject: [PATCH] e1000: set RX descriptor status in a separate operation - -The code of setting RX descriptor status field maybe work fine in -previously, however with the update of glibc version, it shows two -issues when guest using dpdk receive packets: - - 1. The dpdk has a certain probability getting wrong buffer_addr - - this impact may be not obvious, such as lost a packet once in - a while - - 2. The dpdk may consume a packet twice when scan the RX desc queue - over again - - this impact will lead a infinite wait in Qemu, since the RDT - (tail pointer) be inscreased to equal to RDH by unexpected, - which regard as the RX desc queue is full - -Write a whole of RX desc with DD flag on is not quite correct, because -when the underlying implementation of memcpy using XMM registers to -copy e1000_rx_desc (when AVX or something else CPU feature is usable), -the bytes order of desc writing to memory is indeterminacy - -We can use full-scale test case to reproduce the issue-2 by -https://github.com/BASM/qemu_dpdk_e1000_test (thanks to Leonid Myravjev) - -I also write a POC test case at https://github.com/cdkey/e1000_poc -which can reproduce both of them, and easy to verify the patch effect. - -The hw watchpoint also shows that, when Qemu using XMM related instructions -writing 16 bytes e1000_rx_desc, concurrent with DPDK using movb -writing 1 byte status, the final result of writing to memory will be one -of them, if it made by Qemu which DD flag is on, DPDK will consume it -again. - -Setting DD status in a separate operation, can prevent the impact of -disorder memory writing by memcpy, also avoid unexpected data when -concurrent writing status by qemu and guest dpdk. - -Links: https://lore.kernel.org/qemu-devel/20200102110504.GG121208@stefanha-x1.localdomain/T/ - -Reported-by: Leonid Myravjev -Cc: Stefan Hajnoczi -Cc: Paolo Bonzini -Cc: Michael S. Tsirkin -Cc: qemu-stable@nongnu.org -Tested-by: Jing Zhang -Reviewed-by: Frank Lee -Signed-off-by: Ding Hui -Signed-off-by: Jason Wang -(cherry-picked from commit 034d00d4858161e1d4cff82d8d230bce874a04d3) -Signed-off-by: Fabian Ebner ---- - hw/net/e1000.c | 5 ++++- - 1 file changed, 4 insertions(+), 1 deletion(-) - -diff --git a/hw/net/e1000.c b/hw/net/e1000.c -index f5bc81296d..e26e0a64c1 100644 ---- a/hw/net/e1000.c -+++ b/hw/net/e1000.c -@@ -979,7 +979,7 @@ e1000_receive_iov(NetClientState *nc, const struct iovec *iov, int iovcnt) - base = rx_desc_base(s) + sizeof(desc) * s->mac_reg[RDH]; - pci_dma_read(d, base, &desc, sizeof(desc)); - desc.special = vlan_special; -- desc.status |= (vlan_status | E1000_RXD_STAT_DD); -+ desc.status &= ~E1000_RXD_STAT_DD; - if (desc.buffer_addr) { - if (desc_offset < size) { - size_t iov_copy; -@@ -1013,6 +1013,9 @@ e1000_receive_iov(NetClientState *nc, const struct iovec *iov, int iovcnt) - DBGOUT(RX, "Null RX descriptor!!\n"); - } - pci_dma_write(d, base, &desc, sizeof(desc)); -+ desc.status |= (vlan_status | E1000_RXD_STAT_DD); -+ pci_dma_write(d, base + offsetof(struct e1000_rx_desc, status), -+ &desc.status, sizeof(desc.status)); - - if (++s->mac_reg[RDH] * sizeof(desc) >= s->mac_reg[RDLEN]) - s->mac_reg[RDH] = 0; diff --git a/debian/patches/pve/0001-PVE-Config-block-file-change-locking-default-to-off.patch b/debian/patches/pve/0001-PVE-Config-block-file-change-locking-default-to-off.patch index 700afed..b21d8a7 100644 --- a/debian/patches/pve/0001-PVE-Config-block-file-change-locking-default-to-off.patch +++ b/debian/patches/pve/0001-PVE-Config-block-file-change-locking-default-to-off.patch @@ -14,10 +14,10 @@ Signed-off-by: Thomas Lamprecht 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/block/file-posix.c b/block/file-posix.c -index 39a3d6dbe6..e5bf5d59bf 100644 +index 48cd096624..3d60b80286 100644 --- a/block/file-posix.c +++ b/block/file-posix.c -@@ -554,7 +554,7 @@ static QemuOptsList raw_runtime_opts = { +@@ -553,7 +553,7 @@ static QemuOptsList raw_runtime_opts = { { .name = "locking", .type = QEMU_OPT_STRING, @@ -26,7 +26,7 @@ index 39a3d6dbe6..e5bf5d59bf 100644 }, { .name = "pr-manager", -@@ -654,7 +654,7 @@ static int raw_open_common(BlockDriverState *bs, QDict *options, +@@ -653,7 +653,7 @@ static int raw_open_common(BlockDriverState *bs, QDict *options, s->use_lock = false; break; case ON_OFF_AUTO_AUTO: diff --git a/debian/patches/pve/0003-PVE-Config-set-the-CPU-model-to-kvm64-32-instead-of-.patch b/debian/patches/pve/0003-PVE-Config-set-the-CPU-model-to-kvm64-32-instead-of-.patch index 6a19ef0..0184097 100644 --- a/debian/patches/pve/0003-PVE-Config-set-the-CPU-model-to-kvm64-32-instead-of-.patch +++ b/debian/patches/pve/0003-PVE-Config-set-the-CPU-model-to-kvm64-32-instead-of-.patch @@ -10,10 +10,10 @@ Signed-off-by: Thomas Lamprecht 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/target/i386/cpu.h b/target/i386/cpu.h -index 982c532353..5395e7e471 100644 +index 82004b65b9..4868db8f94 100644 --- a/target/i386/cpu.h +++ b/target/i386/cpu.h -@@ -2087,9 +2087,9 @@ uint64_t cpu_get_tsc(CPUX86State *env); +@@ -2133,9 +2133,9 @@ uint64_t cpu_get_tsc(CPUX86State *env); #define CPU_RESOLVING_TYPE TYPE_X86_CPU #ifdef TARGET_X86_64 diff --git a/debian/patches/pve/0005-PVE-Config-glusterfs-no-default-logfile-if-daemonize.patch b/debian/patches/pve/0005-PVE-Config-glusterfs-no-default-logfile-if-daemonize.patch index f8775dc..0890369 100644 --- a/debian/patches/pve/0005-PVE-Config-glusterfs-no-default-logfile-if-daemonize.patch +++ b/debian/patches/pve/0005-PVE-Config-glusterfs-no-default-logfile-if-daemonize.patch @@ -9,7 +9,7 @@ Signed-off-by: Thomas Lamprecht 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/block/gluster.c b/block/gluster.c -index 592e71b22a..aebfece6eb 100644 +index b60213ab80..93da76bc31 100644 --- a/block/gluster.c +++ b/block/gluster.c @@ -42,7 +42,7 @@ diff --git a/debian/patches/pve/0006-PVE-Config-rbd-block-rbd-disable-rbd_cache_writethro.patch b/debian/patches/pve/0006-PVE-Config-rbd-block-rbd-disable-rbd_cache_writethro.patch index ce4366d..a87a46a 100644 --- a/debian/patches/pve/0006-PVE-Config-rbd-block-rbd-disable-rbd_cache_writethro.patch +++ b/debian/patches/pve/0006-PVE-Config-rbd-block-rbd-disable-rbd_cache_writethro.patch @@ -18,7 +18,7 @@ Signed-off-by: Thomas Lamprecht 1 file changed, 2 insertions(+) diff --git a/block/rbd.c b/block/rbd.c -index 6caf35cbba..0cec24c86d 100644 +index f826410f40..64a8d7d48b 100644 --- a/block/rbd.c +++ b/block/rbd.c @@ -820,6 +820,8 @@ static int qemu_rbd_connect(rados_t *cluster, rados_ioctx_t *io_ctx, diff --git a/debian/patches/pve/0007-PVE-Up-qmp-add-get_link_status.patch b/debian/patches/pve/0007-PVE-Up-qmp-add-get_link_status.patch index d6b5440..cd90b46 100644 --- a/debian/patches/pve/0007-PVE-Up-qmp-add-get_link_status.patch +++ b/debian/patches/pve/0007-PVE-Up-qmp-add-get_link_status.patch @@ -11,10 +11,10 @@ Signed-off-by: Thomas Lamprecht 3 files changed, 43 insertions(+) diff --git a/net/net.c b/net/net.c -index f0d14dbfc1..6d476c47ef 100644 +index 2db160e063..8329347891 100644 --- a/net/net.c +++ b/net/net.c -@@ -1334,6 +1334,33 @@ void hmp_info_network(Monitor *mon, const QDict *qdict) +@@ -1343,6 +1343,33 @@ void hmp_info_network(Monitor *mon, const QDict *qdict) } } @@ -49,7 +49,7 @@ index f0d14dbfc1..6d476c47ef 100644 { NetClientState *nc; diff --git a/qapi/net.json b/qapi/net.json -index b92f3f5fb4..52c7e1f82b 100644 +index 75ba2cb989..a3c93ab88f 100644 --- a/qapi/net.json +++ b/qapi/net.json @@ -35,6 +35,21 @@ @@ -75,12 +75,12 @@ index b92f3f5fb4..52c7e1f82b 100644 # @netdev_add: # diff --git a/qapi/pragma.json b/qapi/pragma.json -index e6a021c19c..41139d8645 100644 +index 7f810b0e97..a2358e303a 100644 --- a/qapi/pragma.json +++ b/qapi/pragma.json -@@ -25,6 +25,7 @@ - 'system_reset', +@@ -26,6 +26,7 @@ 'system_wakeup' ], + # Commands allowed to return a non-dictionary 'command-returns-exceptions': [ + 'get_link_status', 'human-monitor-command', diff --git a/debian/patches/pve/0008-PVE-Up-glusterfs-allow-partial-reads.patch b/debian/patches/pve/0008-PVE-Up-glusterfs-allow-partial-reads.patch index 1c16ff7..88becc5 100644 --- a/debian/patches/pve/0008-PVE-Up-glusterfs-allow-partial-reads.patch +++ b/debian/patches/pve/0008-PVE-Up-glusterfs-allow-partial-reads.patch @@ -16,7 +16,7 @@ Signed-off-by: Thomas Lamprecht 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/block/gluster.c b/block/gluster.c -index aebfece6eb..3b7ee2f649 100644 +index 93da76bc31..1079b6186b 100644 --- a/block/gluster.c +++ b/block/gluster.c @@ -57,6 +57,7 @@ typedef struct GlusterAIOCB { diff --git a/debian/patches/pve/0009-PVE-Up-qemu-img-return-success-on-info-without-snaps.patch b/debian/patches/pve/0009-PVE-Up-qemu-img-return-success-on-info-without-snaps.patch index 0d67cd2..b2a27d8 100644 --- a/debian/patches/pve/0009-PVE-Up-qemu-img-return-success-on-info-without-snaps.patch +++ b/debian/patches/pve/0009-PVE-Up-qemu-img-return-success-on-info-without-snaps.patch @@ -9,10 +9,10 @@ Signed-off-by: Thomas Lamprecht 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/qemu-img.c b/qemu-img.c -index 1caddfb23a..2782e181c0 100644 +index 7d4b33b3da..bb36f42dd2 100644 --- a/qemu-img.c +++ b/qemu-img.c -@@ -3005,7 +3005,8 @@ static int img_info(int argc, char **argv) +@@ -3010,7 +3010,8 @@ static int img_info(int argc, char **argv) list = collect_image_info_list(image_opts, filename, fmt, chain, force_share); if (!list) { diff --git a/debian/patches/pve/0010-PVE-Up-qemu-img-dd-add-osize-and-read-from-to-stdin-.patch b/debian/patches/pve/0010-PVE-Up-qemu-img-dd-add-osize-and-read-from-to-stdin-.patch index 7163f0f..bed5c25 100644 --- a/debian/patches/pve/0010-PVE-Up-qemu-img-dd-add-osize-and-read-from-to-stdin-.patch +++ b/debian/patches/pve/0010-PVE-Up-qemu-img-dd-add-osize-and-read-from-to-stdin-.patch @@ -31,10 +31,11 @@ override the output file's size. Signed-off-by: Wolfgang Bumiller Signed-off-by: Thomas Lamprecht +Signed-off-by: Fiona Ebner --- qemu-img-cmds.hx | 4 +- - qemu-img.c | 187 +++++++++++++++++++++++++++++------------------ - 2 files changed, 119 insertions(+), 72 deletions(-) + qemu-img.c | 202 ++++++++++++++++++++++++++++++----------------- + 2 files changed, 133 insertions(+), 73 deletions(-) diff --git a/qemu-img-cmds.hx b/qemu-img-cmds.hx index 1b1dab5b17..d1616c045a 100644 @@ -53,10 +54,10 @@ index 1b1dab5b17..d1616c045a 100644 DEF("info", img_info, diff --git a/qemu-img.c b/qemu-img.c -index 2782e181c0..8cd43b3601 100644 +index bb36f42dd2..74afcb79ef 100644 --- a/qemu-img.c +++ b/qemu-img.c -@@ -4821,10 +4821,12 @@ static int img_bitmap(int argc, char **argv) +@@ -4826,10 +4826,12 @@ static int img_bitmap(int argc, char **argv) #define C_IF 04 #define C_OF 010 #define C_SKIP 020 @@ -69,7 +70,7 @@ index 2782e181c0..8cd43b3601 100644 }; struct DdIo { -@@ -4900,6 +4902,19 @@ static int img_dd_skip(const char *arg, +@@ -4905,6 +4907,19 @@ static int img_dd_skip(const char *arg, return 0; } @@ -89,7 +90,7 @@ index 2782e181c0..8cd43b3601 100644 static int img_dd(int argc, char **argv) { int ret = 0; -@@ -4940,6 +4955,7 @@ static int img_dd(int argc, char **argv) +@@ -4945,6 +4960,7 @@ static int img_dd(int argc, char **argv) { "if", img_dd_if, C_IF }, { "of", img_dd_of, C_OF }, { "skip", img_dd_skip, C_SKIP }, @@ -97,7 +98,7 @@ index 2782e181c0..8cd43b3601 100644 { NULL, NULL, 0 } }; const struct option long_options[] = { -@@ -5015,91 +5031,112 @@ static int img_dd(int argc, char **argv) +@@ -5020,91 +5036,112 @@ static int img_dd(int argc, char **argv) arg = NULL; } @@ -153,9 +154,9 @@ index 2782e181c0..8cd43b3601 100644 } - create_opts = qemu_opts_append(create_opts, drv->create_opts); - create_opts = qemu_opts_append(create_opts, proto_drv->create_opts); - -- opts = qemu_opts_create(create_opts, NULL, 0, &error_abort); - +- opts = qemu_opts_create(create_opts, NULL, 0, &error_abort); + - size = blk_getlength(blk1); - if (size < 0) { - error_report("Failed to get size for '%s'", in.filename); @@ -274,41 +275,54 @@ index 2782e181c0..8cd43b3601 100644 } if (dd.flags & C_SKIP && (in.offset > INT64_MAX / in.bsz || -@@ -5117,11 +5154,17 @@ static int img_dd(int argc, char **argv) +@@ -5121,20 +5158,43 @@ static int img_dd(int argc, char **argv) + in.buf = g_new(uint8_t, in.bsz); for (out_pos = 0; in_pos < size; block_count++) { - int in_ret, out_ret; ++ int in_ret, out_ret; + int bytes = (in_pos + in.bsz > size) ? size - in_pos : in.bsz; - -- if (in_pos + in.bsz > size) { -- in_ret = blk_pread(blk1, in_pos, in.buf, size - in_pos); -+ size_t in_bsz = in_pos + in.bsz > size ? size - in_pos : in.bsz; +- ret = blk_pread(blk1, in_pos, bytes, in.buf, 0); +- if (ret < 0) { + if (blk1) { -+ in_ret = blk_pread(blk1, in_pos, in.buf, in_bsz); - } else { -- in_ret = blk_pread(blk1, in_pos, in.buf, in.bsz); -+ in_ret = read(STDIN_FILENO, in.buf, in_bsz); ++ in_ret = blk_pread(blk1, in_pos, bytes, in.buf, 0); ++ if (in_ret == 0) { ++ in_ret = bytes; ++ } ++ } else { ++ in_ret = read(STDIN_FILENO, in.buf, bytes); + if (in_ret == 0) { + /* early EOF is considered an error */ + error_report("Input ended unexpectedly"); + ret = -1; + goto out; + } - } - if (in_ret < 0) { ++ } ++ if (in_ret < 0) { error_report("error while reading from input image file: %s", -@@ -5131,9 +5174,13 @@ static int img_dd(int argc, char **argv) +- strerror(-ret)); ++ strerror(-in_ret)); ++ ret = -1; + goto out; } - in_pos += in_ret; + in_pos += bytes; -- out_ret = blk_pwrite(blk2, out_pos, in.buf, in_ret, 0); +- ret = blk_pwrite(blk2, out_pos, bytes, in.buf, 0); +- if (ret < 0) { + if (blk2) { -+ out_ret = blk_pwrite(blk2, out_pos, in.buf, in_ret, 0); ++ out_ret = blk_pwrite(blk2, out_pos, in_ret, in.buf, 0); ++ if (out_ret == 0) { ++ out_ret = in_ret; ++ } + } else { + out_ret = write(STDOUT_FILENO, in.buf, in_ret); + } - -- if (out_ret < 0) { ++ + if (out_ret != in_ret) { error_report("error while writing to output image file: %s", - strerror(-out_ret)); - ret = -1; +- strerror(-ret)); ++ strerror(-out_ret)); ++ ret = -1; + goto out; + } + out_pos += bytes; diff --git a/debian/patches/pve/0011-PVE-Up-qemu-img-dd-add-isize-parameter.patch b/debian/patches/pve/0011-PVE-Up-qemu-img-dd-add-isize-parameter.patch index 29df3de..f367a53 100644 --- a/debian/patches/pve/0011-PVE-Up-qemu-img-dd-add-isize-parameter.patch +++ b/debian/patches/pve/0011-PVE-Up-qemu-img-dd-add-isize-parameter.patch @@ -10,15 +10,16 @@ an expected end of input. Signed-off-by: Wolfgang Bumiller Signed-off-by: Thomas Lamprecht +Signed-off-by: Fiona Ebner --- qemu-img.c | 28 +++++++++++++++++++++++++--- 1 file changed, 25 insertions(+), 3 deletions(-) diff --git a/qemu-img.c b/qemu-img.c -index 8cd43b3601..67033b2d2c 100644 +index 74afcb79ef..14594d44b6 100644 --- a/qemu-img.c +++ b/qemu-img.c -@@ -4822,11 +4822,13 @@ static int img_bitmap(int argc, char **argv) +@@ -4827,11 +4827,13 @@ static int img_bitmap(int argc, char **argv) #define C_OF 010 #define C_SKIP 020 #define C_OSIZE 040 @@ -32,7 +33,7 @@ index 8cd43b3601..67033b2d2c 100644 }; struct DdIo { -@@ -4915,6 +4917,19 @@ static int img_dd_osize(const char *arg, +@@ -4920,6 +4922,19 @@ static int img_dd_osize(const char *arg, return 0; } @@ -52,7 +53,7 @@ index 8cd43b3601..67033b2d2c 100644 static int img_dd(int argc, char **argv) { int ret = 0; -@@ -4929,12 +4944,14 @@ static int img_dd(int argc, char **argv) +@@ -4934,12 +4949,14 @@ static int img_dd(int argc, char **argv) int c, i; const char *out_fmt = "raw"; const char *fmt = NULL; @@ -68,7 +69,7 @@ index 8cd43b3601..67033b2d2c 100644 }; struct DdIo in = { .bsz = 512, /* Block size is by default 512 bytes */ -@@ -4956,6 +4973,7 @@ static int img_dd(int argc, char **argv) +@@ -4961,6 +4978,7 @@ static int img_dd(int argc, char **argv) { "of", img_dd_of, C_OF }, { "skip", img_dd_skip, C_SKIP }, { "osize", img_dd_osize, C_OSIZE }, @@ -76,7 +77,7 @@ index 8cd43b3601..67033b2d2c 100644 { NULL, NULL, 0 } }; const struct option long_options[] = { -@@ -5152,14 +5170,18 @@ static int img_dd(int argc, char **argv) +@@ -5157,9 +5175,10 @@ static int img_dd(int argc, char **argv) in.buf = g_new(uint8_t, in.bsz); @@ -84,12 +85,14 @@ index 8cd43b3601..67033b2d2c 100644 + readsize = (dd.isize > 0) ? dd.isize : size; + for (out_pos = 0; in_pos < readsize; block_count++) { int in_ret, out_ret; -- size_t in_bsz = in_pos + in.bsz > size ? size - in_pos : in.bsz; -+ size_t in_bsz = in_pos + in.bsz > readsize ? readsize - in_pos : in.bsz; +- int bytes = (in_pos + in.bsz > size) ? size - in_pos : in.bsz; ++ int bytes = (in_pos + in.bsz > readsize) ? readsize - in_pos : in.bsz; if (blk1) { - in_ret = blk_pread(blk1, in_pos, in.buf, in_bsz); + in_ret = blk_pread(blk1, in_pos, bytes, in.buf, 0); + if (in_ret == 0) { +@@ -5168,6 +5187,9 @@ static int img_dd(int argc, char **argv) } else { - in_ret = read(STDIN_FILENO, in.buf, in_bsz); + in_ret = read(STDIN_FILENO, in.buf, bytes); if (in_ret == 0) { + if (dd.isize == 0) { + goto out; diff --git a/debian/patches/pve/0012-PVE-Up-qemu-img-dd-add-n-skip_create.patch b/debian/patches/pve/0012-PVE-Up-qemu-img-dd-add-n-skip_create.patch index 39991dd..f24932d 100644 --- a/debian/patches/pve/0012-PVE-Up-qemu-img-dd-add-n-skip_create.patch +++ b/debian/patches/pve/0012-PVE-Up-qemu-img-dd-add-n-skip_create.patch @@ -13,7 +13,7 @@ Signed-off-by: Fabian Ebner 3 files changed, 26 insertions(+), 12 deletions(-) diff --git a/docs/tools/qemu-img.rst b/docs/tools/qemu-img.rst -index 8885ea11cf..33979b7430 100644 +index 85a6e05b35..699229eef6 100644 --- a/docs/tools/qemu-img.rst +++ b/docs/tools/qemu-img.rst @@ -208,6 +208,10 @@ Parameters to convert subcommand: @@ -65,10 +65,10 @@ index d1616c045a..b5b0bb4467 100644 DEF("info", img_info, diff --git a/qemu-img.c b/qemu-img.c -index 67033b2d2c..35c2bdc95c 100644 +index 14594d44b6..c6b4a5567d 100644 --- a/qemu-img.c +++ b/qemu-img.c -@@ -4946,7 +4946,7 @@ static int img_dd(int argc, char **argv) +@@ -4951,7 +4951,7 @@ static int img_dd(int argc, char **argv) const char *fmt = NULL; int64_t size = 0, readsize = 0; int64_t block_count = 0, out_pos, in_pos; @@ -77,7 +77,7 @@ index 67033b2d2c..35c2bdc95c 100644 struct DdInfo dd = { .flags = 0, .count = 0, -@@ -4984,7 +4984,7 @@ static int img_dd(int argc, char **argv) +@@ -4989,7 +4989,7 @@ static int img_dd(int argc, char **argv) { 0, 0, 0, 0 } }; @@ -86,7 +86,7 @@ index 67033b2d2c..35c2bdc95c 100644 if (c == EOF) { break; } -@@ -5004,6 +5004,9 @@ static int img_dd(int argc, char **argv) +@@ -5009,6 +5009,9 @@ static int img_dd(int argc, char **argv) case 'h': help(); break; @@ -96,7 +96,7 @@ index 67033b2d2c..35c2bdc95c 100644 case 'U': force_share = true; break; -@@ -5134,13 +5137,15 @@ static int img_dd(int argc, char **argv) +@@ -5139,13 +5142,15 @@ static int img_dd(int argc, char **argv) size - in.bsz * in.offset, &error_abort); } diff --git a/debian/patches/pve/0013-PVE-virtio-balloon-improve-query-balloon.patch b/debian/patches/pve/0013-PVE-virtio-balloon-improve-query-balloon.patch index a52235f..12beef5 100644 --- a/debian/patches/pve/0013-PVE-virtio-balloon-improve-query-balloon.patch +++ b/debian/patches/pve/0013-PVE-virtio-balloon-improve-query-balloon.patch @@ -14,10 +14,10 @@ Signed-off-by: Thomas Lamprecht 3 files changed, 81 insertions(+), 4 deletions(-) diff --git a/hw/virtio/virtio-balloon.c b/hw/virtio/virtio-balloon.c -index 163d244eb4..389907f1f8 100644 +index 73ac5eb675..bbfe7eca62 100644 --- a/hw/virtio/virtio-balloon.c +++ b/hw/virtio/virtio-balloon.c -@@ -813,8 +813,37 @@ static uint64_t virtio_balloon_get_features(VirtIODevice *vdev, uint64_t f, +@@ -806,8 +806,37 @@ static uint64_t virtio_balloon_get_features(VirtIODevice *vdev, uint64_t f, static void virtio_balloon_stat(void *opaque, BalloonInfo *info) { VirtIOBalloon *dev = opaque; @@ -58,10 +58,10 @@ index 163d244eb4..389907f1f8 100644 static void virtio_balloon_to_target(void *opaque, ram_addr_t target) diff --git a/monitor/hmp-cmds.c b/monitor/hmp-cmds.c -index 634968498b..5482dd0569 100644 +index c6cd6f91dd..15572befb1 100644 --- a/monitor/hmp-cmds.c +++ b/monitor/hmp-cmds.c -@@ -708,7 +708,35 @@ void hmp_info_balloon(Monitor *mon, const QDict *qdict) +@@ -715,7 +715,35 @@ void hmp_info_balloon(Monitor *mon, const QDict *qdict) return; } @@ -99,10 +99,10 @@ index 634968498b..5482dd0569 100644 qapi_free_BalloonInfo(info); } diff --git a/qapi/machine.json b/qapi/machine.json -index d25a481ce4..3627172aed 100644 +index 6afd1936b0..8b4be9b718 100644 --- a/qapi/machine.json +++ b/qapi/machine.json -@@ -1018,10 +1018,30 @@ +@@ -1054,9 +1054,29 @@ # @actual: the logical size of the VM in bytes # Formula used: logical_vm_size = vm_ram_size - balloon_size # @@ -123,7 +123,6 @@ index d25a481ce4..3627172aed 100644 +# @max_mem: amount of memory (in bytes) assigned to the guest +# # Since: 0.14 - # ## -{ 'struct': 'BalloonInfo', 'data': {'actual': 'int' } } +{ 'struct': 'BalloonInfo', diff --git a/debian/patches/pve/0014-PVE-qapi-modify-query-machines.patch b/debian/patches/pve/0014-PVE-qapi-modify-query-machines.patch index 8c7d776..cc3c92e 100644 --- a/debian/patches/pve/0014-PVE-qapi-modify-query-machines.patch +++ b/debian/patches/pve/0014-PVE-qapi-modify-query-machines.patch @@ -30,10 +30,10 @@ index 4f4ab30f8c..76fff60a6b 100644 info->default_cpu_type = g_strdup(mc->default_cpu_type); info->has_default_cpu_type = true; diff --git a/qapi/machine.json b/qapi/machine.json -index 3627172aed..ca133e68ce 100644 +index 8b4be9b718..555458f785 100644 --- a/qapi/machine.json +++ b/qapi/machine.json -@@ -139,6 +139,8 @@ +@@ -138,6 +138,8 @@ # # @is-default: whether the machine is default # @@ -42,7 +42,7 @@ index 3627172aed..ca133e68ce 100644 # @cpu-max: maximum number of CPUs supported by the machine type # (since 1.5) # -@@ -160,7 +162,7 @@ +@@ -159,7 +161,7 @@ ## { 'struct': 'MachineInfo', 'data': { 'name': 'str', '*alias': 'str', diff --git a/debian/patches/pve/0015-PVE-qapi-modify-spice-query.patch b/debian/patches/pve/0015-PVE-qapi-modify-spice-query.patch index 3f7fd62..c3f3fc3 100644 --- a/debian/patches/pve/0015-PVE-qapi-modify-spice-query.patch +++ b/debian/patches/pve/0015-PVE-qapi-modify-spice-query.patch @@ -12,10 +12,10 @@ Signed-off-by: Thomas Lamprecht 2 files changed, 8 insertions(+) diff --git a/qapi/ui.json b/qapi/ui.json -index 13a8bb82aa..4c34436ba7 100644 +index cf58ab4283..0be2388941 100644 --- a/qapi/ui.json +++ b/qapi/ui.json -@@ -300,11 +300,14 @@ +@@ -310,11 +310,14 @@ # # @channels: a list of @SpiceChannel for each active spice channel # diff --git a/debian/patches/pve/0016-PVE-add-IOChannel-implementation-for-savevm-async.patch b/debian/patches/pve/0016-PVE-add-IOChannel-implementation-for-savevm-async.patch new file mode 100644 index 0000000..e48eb9d --- /dev/null +++ b/debian/patches/pve/0016-PVE-add-IOChannel-implementation-for-savevm-async.patch @@ -0,0 +1,280 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: Fiona Ebner +Date: Thu, 13 Oct 2022 11:33:50 +0200 +Subject: [PATCH] PVE: add IOChannel implementation for savevm-async + +based on migration/channel-block.c and the implementation that was +present in migration/savevm-async.c before QEMU 7.1. + +Passes along read/write requests to the given BlockBackend, while +ensuring that a read request going beyond the end results in a +graceful short read. + +Additionally, allows tracking the current position from the outside +(intended to be used for progress tracking). + +Signed-off-by: Fiona Ebner +--- + migration/channel-savevm-async.c | 181 +++++++++++++++++++++++++++++++ + migration/channel-savevm-async.h | 51 +++++++++ + migration/meson.build | 1 + + 3 files changed, 233 insertions(+) + create mode 100644 migration/channel-savevm-async.c + create mode 100644 migration/channel-savevm-async.h + +diff --git a/migration/channel-savevm-async.c b/migration/channel-savevm-async.c +new file mode 100644 +index 0000000000..efea3842cf +--- /dev/null ++++ b/migration/channel-savevm-async.c +@@ -0,0 +1,181 @@ ++/* ++ * QIO Channel implementation to be used by savevm-async QMP calls ++ */ ++#include "qemu/osdep.h" ++#include "migration/channel-savevm-async.h" ++#include "qapi/error.h" ++#include "sysemu/block-backend.h" ++#include "trace.h" ++ ++QIOChannelSavevmAsync * ++qio_channel_savevm_async_new(BlockBackend *be, size_t *bs_pos) ++{ ++ QIOChannelSavevmAsync *ioc; ++ ++ ioc = QIO_CHANNEL_SAVEVM_ASYNC(object_new(TYPE_QIO_CHANNEL_SAVEVM_ASYNC)); ++ ++ bdrv_ref(blk_bs(be)); ++ ioc->be = be; ++ ioc->bs_pos = bs_pos; ++ ++ return ioc; ++} ++ ++ ++static void ++qio_channel_savevm_async_finalize(Object *obj) ++{ ++ QIOChannelSavevmAsync *ioc = QIO_CHANNEL_SAVEVM_ASYNC(obj); ++ ++ if (ioc->be) { ++ bdrv_unref(blk_bs(ioc->be)); ++ ioc->be = NULL; ++ } ++ ioc->bs_pos = NULL; ++} ++ ++ ++static ssize_t ++qio_channel_savevm_async_readv(QIOChannel *ioc, ++ const struct iovec *iov, ++ size_t niov, ++ int **fds, ++ size_t *nfds, ++ Error **errp) ++{ ++ QIOChannelSavevmAsync *saioc = QIO_CHANNEL_SAVEVM_ASYNC(ioc); ++ BlockBackend *be = saioc->be; ++ int64_t maxlen = blk_getlength(be); ++ QEMUIOVector qiov; ++ size_t size; ++ int ret; ++ ++ qemu_iovec_init_external(&qiov, (struct iovec *)iov, niov); ++ ++ if (*saioc->bs_pos >= maxlen) { ++ error_setg(errp, "cannot read beyond maxlen"); ++ return -1; ++ } ++ ++ if (maxlen - *saioc->bs_pos < qiov.size) { ++ size = maxlen - *saioc->bs_pos; ++ } else { ++ size = qiov.size; ++ } ++ ++ // returns 0 on success ++ ret = blk_preadv(be, *saioc->bs_pos, size, &qiov, 0); ++ if (ret < 0) { ++ error_setg(errp, "blk_preadv returned %d", ret); ++ return -1; ++ } ++ ++ *saioc->bs_pos += size; ++ return size; ++} ++ ++ ++static ssize_t ++qio_channel_savevm_async_writev(QIOChannel *ioc, ++ const struct iovec *iov, ++ size_t niov, ++ int *fds, ++ size_t nfds, ++ int flags, ++ Error **errp) ++{ ++ QIOChannelSavevmAsync *saioc = QIO_CHANNEL_SAVEVM_ASYNC(ioc); ++ BlockBackend *be = saioc->be; ++ QEMUIOVector qiov; ++ int ret; ++ ++ qemu_iovec_init_external(&qiov, (struct iovec *)iov, niov); ++ ++ if (qemu_in_coroutine()) { ++ ret = blk_co_pwritev(be, *saioc->bs_pos, qiov.size, &qiov, 0); ++ aio_wait_kick(); ++ } else { ++ ret = blk_pwritev(be, *saioc->bs_pos, qiov.size, &qiov, 0); ++ } ++ ++ if (ret < 0) { ++ return ret; ++ } ++ ++ *saioc->bs_pos += qiov.size; ++ return qiov.size; ++} ++ ++ ++static int ++qio_channel_savevm_async_set_blocking(QIOChannel *ioc, ++ bool enabled, ++ Error **errp) ++{ ++ if (!enabled) { ++ error_setg(errp, "Non-blocking mode not supported for savevm-async"); ++ return -1; ++ } ++ return 0; ++} ++ ++ ++static int ++qio_channel_savevm_async_close(QIOChannel *ioc, ++ Error **errp) ++{ ++ QIOChannelSavevmAsync *saioc = QIO_CHANNEL_SAVEVM_ASYNC(ioc); ++ int rv = bdrv_flush(blk_bs(saioc->be)); ++ ++ if (rv < 0) { ++ error_setg_errno(errp, -rv, "Unable to flush VMState"); ++ return -1; ++ } ++ ++ bdrv_unref(blk_bs(saioc->be)); ++ saioc->be = NULL; ++ saioc->bs_pos = NULL; ++ ++ return 0; ++} ++ ++ ++static void ++qio_channel_savevm_async_set_aio_fd_handler(QIOChannel *ioc, ++ AioContext *ctx, ++ IOHandler *io_read, ++ IOHandler *io_write, ++ void *opaque) ++{ ++ // if channel-block starts doing something, check if this needs adaptation ++} ++ ++ ++static void ++qio_channel_savevm_async_class_init(ObjectClass *klass, ++ void *class_data G_GNUC_UNUSED) ++{ ++ QIOChannelClass *ioc_klass = QIO_CHANNEL_CLASS(klass); ++ ++ ioc_klass->io_writev = qio_channel_savevm_async_writev; ++ ioc_klass->io_readv = qio_channel_savevm_async_readv; ++ ioc_klass->io_set_blocking = qio_channel_savevm_async_set_blocking; ++ ioc_klass->io_close = qio_channel_savevm_async_close; ++ ioc_klass->io_set_aio_fd_handler = qio_channel_savevm_async_set_aio_fd_handler; ++} ++ ++static const TypeInfo qio_channel_savevm_async_info = { ++ .parent = TYPE_QIO_CHANNEL, ++ .name = TYPE_QIO_CHANNEL_SAVEVM_ASYNC, ++ .instance_size = sizeof(QIOChannelSavevmAsync), ++ .instance_finalize = qio_channel_savevm_async_finalize, ++ .class_init = qio_channel_savevm_async_class_init, ++}; ++ ++static void ++qio_channel_savevm_async_register_types(void) ++{ ++ type_register_static(&qio_channel_savevm_async_info); ++} ++ ++type_init(qio_channel_savevm_async_register_types); +diff --git a/migration/channel-savevm-async.h b/migration/channel-savevm-async.h +new file mode 100644 +index 0000000000..17ae2cb261 +--- /dev/null ++++ b/migration/channel-savevm-async.h +@@ -0,0 +1,51 @@ ++/* ++ * QEMU I/O channels driver for savevm-async.c ++ * ++ * Copyright (c) 2022 Proxmox Server Solutions ++ * ++ * Authors: ++ * Fiona Ebner (f.ebner@proxmox.com) ++ * ++ * This work is licensed under the terms of the GNU GPL, version 2 or later. ++ * See the COPYING file in the top-level directory. ++ */ ++ ++#ifndef QIO_CHANNEL_SAVEVM_ASYNC_H ++#define QIO_CHANNEL_SAVEVM_ASYNC_H ++ ++#include "io/channel.h" ++#include "qom/object.h" ++ ++#define TYPE_QIO_CHANNEL_SAVEVM_ASYNC "qio-channel-savevm-async" ++OBJECT_DECLARE_SIMPLE_TYPE(QIOChannelSavevmAsync, QIO_CHANNEL_SAVEVM_ASYNC) ++ ++ ++/** ++ * QIOChannelSavevmAsync: ++ * ++ * The QIOChannelBlock object provides a channel implementation that is able to ++ * perform I/O on any BlockBackend whose BlockDriverState directly contains a ++ * VMState (as opposed to indirectly, like qcow2). It allows tracking the ++ * current position from the outside. ++ */ ++struct QIOChannelSavevmAsync { ++ QIOChannel parent; ++ BlockBackend *be; ++ size_t *bs_pos; ++}; ++ ++ ++/** ++ * qio_channel_savevm_async_new: ++ * @be: the block backend ++ * @bs_pos: used to keep track of the IOChannels current position ++ * ++ * Create a new IO channel object that can perform I/O on a BlockBackend object ++ * whose BlockDriverState directly contains a VMState. ++ * ++ * Returns: the new channel object ++ */ ++QIOChannelSavevmAsync * ++qio_channel_savevm_async_new(BlockBackend *be, size_t *bs_pos); ++ ++#endif /* QIO_CHANNEL_SAVEVM_ASYNC_H */ +diff --git a/migration/meson.build b/migration/meson.build +index 690487cf1a..8cac83c06c 100644 +--- a/migration/meson.build ++++ b/migration/meson.build +@@ -13,6 +13,7 @@ softmmu_ss.add(files( + 'block-dirty-bitmap.c', + 'channel.c', + 'channel-block.c', ++ 'channel-savevm-async.c', + 'colo-failover.c', + 'colo.c', + 'exec.c', diff --git a/debian/patches/pve/0016-PVE-add-savevm-async-for-background-state-snapshots.patch b/debian/patches/pve/0017-PVE-add-savevm-async-for-background-state-snapshots.patch similarity index 88% rename from debian/patches/pve/0016-PVE-add-savevm-async-for-background-state-snapshots.patch rename to debian/patches/pve/0017-PVE-add-savevm-async-for-background-state-snapshots.patch index 6bb06ec..7058cb2 100644 --- a/debian/patches/pve/0016-PVE-add-savevm-async-for-background-state-snapshots.patch +++ b/debian/patches/pve/0017-PVE-add-savevm-async-for-background-state-snapshots.patch @@ -23,25 +23,26 @@ Signed-off-by: Dietmar Maurer Signed-off-by: Wolfgang Bumiller [improve aborting] Signed-off-by: Stefan Reiter -[FE: further improve aborting] +[FE: further improve aborting + adapt to removal of QEMUFileOps] Signed-off-by: Fiona Ebner --- hmp-commands-info.hx | 13 + - hmp-commands.hx | 33 ++ + hmp-commands.hx | 33 +++ include/migration/snapshot.h | 2 + include/monitor/hmp.h | 5 + migration/meson.build | 1 + - migration/savevm-async.c | 604 +++++++++++++++++++++++++++++++++++ + migration/savevm-async.c | 531 +++++++++++++++++++++++++++++++++++ monitor/hmp-cmds.c | 57 ++++ - qapi/migration.json | 34 ++ - qapi/misc.json | 32 ++ + qapi/migration.json | 34 +++ + qapi/misc.json | 32 +++ qemu-options.hx | 12 + softmmu/vl.c | 10 + - 11 files changed, 803 insertions(+) + 11 files changed, 730 insertions(+) create mode 100644 migration/savevm-async.c diff --git a/hmp-commands-info.hx b/hmp-commands-info.hx -index adfa085a9b..925e680e5a 100644 +index 188d9ece3b..97b88eaaad 100644 --- a/hmp-commands-info.hx +++ b/hmp-commands-info.hx @@ -538,6 +538,19 @@ SRST @@ -65,12 +66,12 @@ index adfa085a9b..925e680e5a 100644 .name = "balloon", .args_type = "", diff --git a/hmp-commands.hx b/hmp-commands.hx -index 8476277aa9..7f0ac498c4 100644 +index 182e639d14..bbcc73e942 100644 --- a/hmp-commands.hx +++ b/hmp-commands.hx -@@ -1746,3 +1746,36 @@ ERST - "\n\t\t\t -b to specify dirty bitmap as method of calculation)", - .cmd = hmp_calc_dirty_rate, +@@ -1800,3 +1800,36 @@ ERST + "\n\t\t\t\t\t limit on a specified virtual cpu", + .cmd = hmp_cancel_vcpu_dirty_limit, }, + + { @@ -117,7 +118,7 @@ index e72083b117..c846d37806 100644 + #endif diff --git a/include/monitor/hmp.h b/include/monitor/hmp.h -index 96d014826a..3a39ba41b5 100644 +index a618eb1e4e..55067beff1 100644 --- a/include/monitor/hmp.h +++ b/include/monitor/hmp.h @@ -26,6 +26,7 @@ void hmp_info_status(Monitor *mon, const QDict *qdict); @@ -140,10 +141,10 @@ index 96d014826a..3a39ba41b5 100644 void hmp_screendump(Monitor *mon, const QDict *qdict); void hmp_chardev_add(Monitor *mon, const QDict *qdict); diff --git a/migration/meson.build b/migration/meson.build -index 8b5ca5c047..1e2aec8486 100644 +index 8cac83c06c..0842d00cd2 100644 --- a/migration/meson.build +++ b/migration/meson.build -@@ -23,6 +23,7 @@ softmmu_ss.add(files( +@@ -24,6 +24,7 @@ softmmu_ss.add(files( 'multifd-zlib.c', 'postcopy-ram.c', 'savevm.c', @@ -153,11 +154,12 @@ index 8b5ca5c047..1e2aec8486 100644 ), gnutls) diff --git a/migration/savevm-async.c b/migration/savevm-async.c new file mode 100644 -index 0000000000..b9a43c56bc +index 0000000000..b3692739a0 --- /dev/null +++ b/migration/savevm-async.c -@@ -0,0 +1,604 @@ +@@ -0,0 +1,531 @@ +#include "qemu/osdep.h" ++#include "migration/channel-savevm-async.h" +#include "migration/migration.h" +#include "migration/savevm.h" +#include "migration/snapshot.h" @@ -181,9 +183,6 @@ index 0000000000..b9a43c56bc + +/* #define DEBUG_SAVEVM_STATE */ + -+/* used while emulated sync operation in progress */ -+#define NOT_DONE -EINPROGRESS -+ +#ifdef DEBUG_SAVEVM_STATE +#define DPRINTF(fmt, ...) \ + do { printf("savevm-async: " fmt, ## __VA_ARGS__); } while (0) @@ -270,6 +269,7 @@ index 0000000000..b9a43c56bc + + if (snap_state.file) { + ret = qemu_fclose(snap_state.file); ++ snap_state.file = NULL; + } + + if (snap_state.target) { @@ -313,60 +313,6 @@ index 0000000000..b9a43c56bc + snap_state.state = SAVE_STATE_ERROR; +} + -+static int block_state_close(void *opaque, Error **errp) -+{ -+ snap_state.file = NULL; -+ return blk_flush(snap_state.target); -+} -+ -+typedef struct BlkRwCo { -+ int64_t offset; -+ QEMUIOVector *qiov; -+ ssize_t ret; -+} BlkRwCo; -+ -+static void coroutine_fn block_state_write_entry(void *opaque) { -+ BlkRwCo *rwco = opaque; -+ rwco->ret = blk_co_pwritev(snap_state.target, rwco->offset, rwco->qiov->size, -+ rwco->qiov, 0); -+ aio_wait_kick(); -+} -+ -+static ssize_t block_state_writev_buffer(void *opaque, struct iovec *iov, -+ int iovcnt, int64_t pos, Error **errp) -+{ -+ QEMUIOVector qiov; -+ BlkRwCo rwco; -+ -+ assert(pos == snap_state.bs_pos); -+ rwco = (BlkRwCo) { -+ .offset = pos, -+ .qiov = &qiov, -+ .ret = NOT_DONE, -+ }; -+ -+ qemu_iovec_init_external(&qiov, iov, iovcnt); -+ -+ if (qemu_in_coroutine()) { -+ block_state_write_entry(&rwco); -+ } else { -+ Coroutine *co = qemu_coroutine_create(&block_state_write_entry, &rwco); -+ bdrv_coroutine_enter(blk_bs(snap_state.target), co); -+ BDRV_POLL_WHILE(blk_bs(snap_state.target), rwco.ret == NOT_DONE); -+ } -+ if (rwco.ret < 0) { -+ return rwco.ret; -+ } -+ -+ snap_state.bs_pos += qiov.size; -+ return qiov.size; -+} -+ -+static const QEMUFileOps block_file_ops = { -+ .writev_buffer = block_state_writev_buffer, -+ .close = block_state_close, -+}; -+ +static void process_savevm_finalize(void *opaque) +{ + int ret; @@ -579,7 +525,9 @@ index 0000000000..b9a43c56bc + goto restart; + } + -+ snap_state.file = qemu_fopen_ops(&snap_state, &block_file_ops); ++ QIOChannel *ioc = QIO_CHANNEL(qio_channel_savevm_async_new(snap_state.target, ++ &snap_state.bs_pos)); ++ snap_state.file = qemu_file_new_output(ioc); + + if (!snap_state.file) { + error_set(errp, ERROR_CLASS_GENERIC_ERROR, "failed to open '%s'", statefile); @@ -691,27 +639,6 @@ index 0000000000..b9a43c56bc + true, name, errp); +} + -+static ssize_t loadstate_get_buffer(void *opaque, uint8_t *buf, int64_t pos, -+ size_t size, Error **errp) -+{ -+ BlockBackend *be = opaque; -+ int64_t maxlen = blk_getlength(be); -+ if (pos > maxlen) { -+ return -EIO; -+ } -+ if ((pos + size) > maxlen) { -+ size = maxlen - pos - 1; -+ } -+ if (size == 0) { -+ return 0; -+ } -+ return blk_pread(be, pos, buf, size); -+} -+ -+static const QEMUFileOps loadstate_file_ops = { -+ .get_buffer = loadstate_get_buffer, -+}; -+ +int load_snapshot_from_blockdev(const char *filename, Error **errp) +{ + BlockBackend *be; @@ -719,6 +646,7 @@ index 0000000000..b9a43c56bc + Error *blocker = NULL; + + QEMUFile *f; ++ size_t bs_pos = 0; + int ret = -EINVAL; + + be = blk_new_open(filename, NULL, NULL, 0, &local_err); @@ -732,7 +660,7 @@ index 0000000000..b9a43c56bc + blk_op_block_all(be, blocker); + + /* restore the VM state */ -+ f = qemu_fopen_ops(be, &loadstate_file_ops); ++ f = qemu_file_new_input(QIO_CHANNEL(qio_channel_savevm_async_new(be, &bs_pos))); + if (!f) { + error_setg(errp, "Could not open VM state file"); + goto the_end; @@ -762,10 +690,10 @@ index 0000000000..b9a43c56bc + return ret; +} diff --git a/monitor/hmp-cmds.c b/monitor/hmp-cmds.c -index 5482dd0569..c64b959738 100644 +index 15572befb1..1507180990 100644 --- a/monitor/hmp-cmds.c +++ b/monitor/hmp-cmds.c -@@ -1906,6 +1906,63 @@ void hmp_info_memory_devices(Monitor *mon, const QDict *qdict) +@@ -1925,6 +1925,63 @@ void hmp_info_memory_devices(Monitor *mon, const QDict *qdict) hmp_handle_error(mon, err); } @@ -830,10 +758,10 @@ index 5482dd0569..c64b959738 100644 { IOThreadInfoList *info_list = qmp_query_iothreads(NULL); diff --git a/qapi/migration.json b/qapi/migration.json -index 27d7b28158..31d6cc902e 100644 +index 81185d4311..3129f71fa8 100644 --- a/qapi/migration.json +++ b/qapi/migration.json -@@ -258,6 +258,40 @@ +@@ -261,6 +261,40 @@ '*compression': 'CompressionStats', '*socket-address': ['SocketAddress'] } } @@ -875,7 +803,7 @@ index 27d7b28158..31d6cc902e 100644 # @query-migrate: # diff --git a/qapi/misc.json b/qapi/misc.json -index b83cc39029..1e5dd7db29 100644 +index 27ef5a2b20..b3ce75dcae 100644 --- a/qapi/misc.json +++ b/qapi/misc.json @@ -435,6 +435,38 @@ @@ -918,10 +846,10 @@ index b83cc39029..1e5dd7db29 100644 # @CommandLineParameterType: # diff --git a/qemu-options.hx b/qemu-options.hx -index 34e9b32a5c..aeade4ef80 100644 +index 31c04f7eea..c2ca6e91b5 100644 --- a/qemu-options.hx +++ b/qemu-options.hx -@@ -4254,6 +4254,18 @@ SRST +@@ -4341,6 +4341,18 @@ SRST Start right away with a saved state (``loadvm`` in monitor) ERST @@ -941,18 +869,18 @@ index 34e9b32a5c..aeade4ef80 100644 DEF("daemonize", 0, QEMU_OPTION_daemonize, \ "-daemonize daemonize QEMU after initializing\n", QEMU_ARCH_ALL) diff --git a/softmmu/vl.c b/softmmu/vl.c -index 6f646531a0..a3f2a3818c 100644 +index 706bd7cff7..b8637c4262 100644 --- a/softmmu/vl.c +++ b/softmmu/vl.c -@@ -157,6 +157,7 @@ static const char *incoming; - static const char *loadvm; - static const char *accelerators; +@@ -165,6 +165,7 @@ static const char *accelerators; + static bool have_custom_ram_size; + static const char *ram_memdev_id; static QDict *machine_opts_dict; +static const char *loadstate; static QTAILQ_HEAD(, ObjectOption) object_opts = QTAILQ_HEAD_INITIALIZER(object_opts); static QTAILQ_HEAD(, DeviceOption) device_opts = QTAILQ_HEAD_INITIALIZER(device_opts); - static ram_addr_t maxram_size; -@@ -2749,6 +2750,12 @@ void qmp_x_exit_preconfig(Error **errp) + static int display_remote; +@@ -2584,6 +2585,12 @@ void qmp_x_exit_preconfig(Error **errp) if (loadvm) { load_snapshot(loadvm, NULL, false, NULL, &error_fatal); @@ -965,7 +893,7 @@ index 6f646531a0..a3f2a3818c 100644 } if (replay_mode != REPLAY_MODE_NONE) { replay_vmstate_init(); -@@ -3289,6 +3296,9 @@ void qemu_init(int argc, char **argv, char **envp) +@@ -3133,6 +3140,9 @@ void qemu_init(int argc, char **argv, char **envp) case QEMU_OPTION_loadvm: loadvm = optarg; break; diff --git a/debian/patches/pve/0017-PVE-add-optional-buffer-size-to-QEMUFile.patch b/debian/patches/pve/0018-PVE-add-optional-buffer-size-to-QEMUFile.patch similarity index 52% rename from debian/patches/pve/0017-PVE-add-optional-buffer-size-to-QEMUFile.patch rename to debian/patches/pve/0018-PVE-add-optional-buffer-size-to-QEMUFile.patch index c5cca9d..71ee72d 100644 --- a/debian/patches/pve/0017-PVE-add-optional-buffer-size-to-QEMUFile.patch +++ b/debian/patches/pve/0018-PVE-add-optional-buffer-size-to-QEMUFile.patch @@ -10,14 +10,16 @@ Signed-off-by: Wolfgang Bumiller [increase max IOV count in QEMUFile to actually write more data] Signed-off-by: Stefan Reiter Signed-off-by: Thomas Lamprecht +[FE: adapt to removal of QEMUFileOps] +Signed-off-by: Fiona Ebner --- - migration/qemu-file.c | 38 +++++++++++++++++++++++++------------- - migration/qemu-file.h | 1 + - migration/savevm-async.c | 4 ++-- - 3 files changed, 28 insertions(+), 15 deletions(-) + migration/qemu-file.c | 49 +++++++++++++++++++++++++++------------- + migration/qemu-file.h | 2 ++ + migration/savevm-async.c | 5 ++-- + 3 files changed, 38 insertions(+), 18 deletions(-) diff --git a/migration/qemu-file.c b/migration/qemu-file.c -index 1479cddad9..21a3355ae2 100644 +index 4f400c2e52..21e8998867 100644 --- a/migration/qemu-file.c +++ b/migration/qemu-file.c @@ -31,8 +31,8 @@ @@ -30,9 +32,9 @@ index 1479cddad9..21a3355ae2 100644 +#define MAX_IOV_SIZE MIN_CONST(IOV_MAX, 256) struct QEMUFile { - const QEMUFileOps *ops; -@@ -46,7 +46,8 @@ struct QEMUFile { - when reading */ + const QEMUFileHooks *hooks; +@@ -55,7 +55,8 @@ struct QEMUFile { + int buf_index; int buf_size; /* 0 when writing */ - uint8_t buf[IO_BUF_SIZE]; @@ -41,53 +43,76 @@ index 1479cddad9..21a3355ae2 100644 DECLARE_BITMAP(may_free, MAX_IOV_SIZE); struct iovec iov[MAX_IOV_SIZE]; -@@ -104,7 +105,7 @@ bool qemu_file_mode_is_not_valid(const char *mode) +@@ -106,7 +107,9 @@ bool qemu_file_mode_is_not_valid(const char *mode) return false; } --QEMUFile *qemu_fopen_ops(void *opaque, const QEMUFileOps *ops, bool has_ioc) -+QEMUFile *qemu_fopen_ops_sized(void *opaque, const QEMUFileOps *ops, bool has_ioc, size_t buffer_size) +-static QEMUFile *qemu_file_new_impl(QIOChannel *ioc, bool is_writable) ++static QEMUFile *qemu_file_new_impl(QIOChannel *ioc, ++ bool is_writable, ++ size_t buffer_size) { QEMUFile *f; -@@ -113,9 +114,17 @@ QEMUFile *qemu_fopen_ops(void *opaque, const QEMUFileOps *ops, bool has_ioc) - f->opaque = opaque; - f->ops = ops; - f->has_ioc = has_ioc; +@@ -115,6 +118,8 @@ static QEMUFile *qemu_file_new_impl(QIOChannel *ioc, bool is_writable) + object_ref(ioc); + f->ioc = ioc; + f->is_writable = is_writable; + f->buf_allocated_size = buffer_size; + f->buf = malloc(buffer_size); -+ + return f; } +@@ -125,17 +130,27 @@ static QEMUFile *qemu_file_new_impl(QIOChannel *ioc, bool is_writable) + */ + QEMUFile *qemu_file_get_return_path(QEMUFile *f) + { +- return qemu_file_new_impl(f->ioc, !f->is_writable); ++ return qemu_file_new_impl(f->ioc, !f->is_writable, DEFAULT_IO_BUF_SIZE); + } -+QEMUFile *qemu_fopen_ops(void *opaque, const QEMUFileOps *ops, bool has_ioc) + QEMUFile *qemu_file_new_output(QIOChannel *ioc) + { +- return qemu_file_new_impl(ioc, true); ++ return qemu_file_new_impl(ioc, true, DEFAULT_IO_BUF_SIZE); ++} ++ ++QEMUFile *qemu_file_new_output_sized(QIOChannel *ioc, size_t buffer_size) +{ -+ return qemu_fopen_ops_sized(opaque, ops, has_ioc, DEFAULT_IO_BUF_SIZE); ++ return qemu_file_new_impl(ioc, true, buffer_size); + } + + QEMUFile *qemu_file_new_input(QIOChannel *ioc) + { +- return qemu_file_new_impl(ioc, false); ++ return qemu_file_new_impl(ioc, false, DEFAULT_IO_BUF_SIZE); +} + ++QEMUFile *qemu_file_new_input_sized(QIOChannel *ioc, size_t buffer_size) ++{ ++ return qemu_file_new_impl(ioc, false, buffer_size); + } void qemu_file_set_hooks(QEMUFile *f, const QEMUFileHooks *hooks) - { -@@ -350,7 +359,7 @@ static ssize_t qemu_fill_buffer(QEMUFile *f) +@@ -393,7 +408,7 @@ static ssize_t qemu_fill_buffer(QEMUFile *f) + do { + len = qio_channel_read(f->ioc, + (char *)f->buf + pending, +- IO_BUF_SIZE - pending, ++ f->buf_allocated_size - pending, + &local_error); + if (len == QIO_CHANNEL_ERR_BLOCK) { + if (qemu_in_coroutine()) { +@@ -443,6 +458,8 @@ int qemu_fclose(QEMUFile *f) } + g_clear_pointer(&f->ioc, object_unref); - len = f->ops->get_buffer(f->opaque, f->buf + pending, f->pos, -- IO_BUF_SIZE - pending, &local_error); -+ f->buf_allocated_size - pending, &local_error); - if (len > 0) { - f->buf_size += len; - f->pos += len; -@@ -390,6 +399,9 @@ int qemu_fclose(QEMUFile *f) - ret = ret2; - } - } -+ + free(f->buf); + /* If any error was spotted before closing, we should report it * instead of the close() return value. */ -@@ -444,7 +456,7 @@ static void add_buf_to_iovec(QEMUFile *f, size_t len) +@@ -497,7 +514,7 @@ static void add_buf_to_iovec(QEMUFile *f, size_t len) { if (!add_to_iovec(f, f->buf + f->buf_index, len, false)) { f->buf_index += len; @@ -96,7 +121,7 @@ index 1479cddad9..21a3355ae2 100644 qemu_fflush(f); } } -@@ -470,7 +482,7 @@ void qemu_put_buffer(QEMUFile *f, const uint8_t *buf, size_t size) +@@ -523,7 +540,7 @@ void qemu_put_buffer(QEMUFile *f, const uint8_t *buf, size_t size) } while (size > 0) { @@ -105,7 +130,7 @@ index 1479cddad9..21a3355ae2 100644 if (l > size) { l = size; } -@@ -517,8 +529,8 @@ size_t qemu_peek_buffer(QEMUFile *f, uint8_t **buf, size_t size, size_t offset) +@@ -570,8 +587,8 @@ size_t qemu_peek_buffer(QEMUFile *f, uint8_t **buf, size_t size, size_t offset) size_t index; assert(!qemu_file_is_writable(f)); @@ -116,7 +141,7 @@ index 1479cddad9..21a3355ae2 100644 /* The 1st byte to read from */ index = f->buf_index + offset; -@@ -568,7 +580,7 @@ size_t qemu_get_buffer(QEMUFile *f, uint8_t *buf, size_t size) +@@ -621,7 +638,7 @@ size_t qemu_get_buffer(QEMUFile *f, uint8_t *buf, size_t size) size_t res; uint8_t *src; @@ -125,7 +150,7 @@ index 1479cddad9..21a3355ae2 100644 if (res == 0) { return done; } -@@ -602,7 +614,7 @@ size_t qemu_get_buffer(QEMUFile *f, uint8_t *buf, size_t size) +@@ -655,7 +672,7 @@ size_t qemu_get_buffer(QEMUFile *f, uint8_t *buf, size_t size) */ size_t qemu_get_buffer_in_place(QEMUFile *f, uint8_t **buf, size_t size) { @@ -134,7 +159,7 @@ index 1479cddad9..21a3355ae2 100644 size_t res; uint8_t *src = NULL; -@@ -627,7 +639,7 @@ int qemu_peek_byte(QEMUFile *f, int offset) +@@ -680,7 +697,7 @@ int qemu_peek_byte(QEMUFile *f, int offset) int index = f->buf_index + offset; assert(!qemu_file_is_writable(f)); @@ -143,7 +168,7 @@ index 1479cddad9..21a3355ae2 100644 if (index >= f->buf_size) { qemu_fill_buffer(f); -@@ -779,7 +791,7 @@ static int qemu_compress_data(z_stream *stream, uint8_t *dest, size_t dest_len, +@@ -832,7 +849,7 @@ static int qemu_compress_data(z_stream *stream, uint8_t *dest, size_t dest_len, ssize_t qemu_put_compression_data(QEMUFile *f, z_stream *stream, const uint8_t *p, size_t size) { @@ -153,36 +178,39 @@ index 1479cddad9..21a3355ae2 100644 if (blen < compressBound(size)) { return -1; diff --git a/migration/qemu-file.h b/migration/qemu-file.h -index 3f36d4dc8c..67501fd9cf 100644 +index fa13d04d78..914f1a63a8 100644 --- a/migration/qemu-file.h +++ b/migration/qemu-file.h -@@ -121,6 +121,7 @@ typedef struct QEMUFileHooks { +@@ -63,7 +63,9 @@ typedef struct QEMUFileHooks { } QEMUFileHooks; - QEMUFile *qemu_fopen_ops(void *opaque, const QEMUFileOps *ops, bool has_ioc); -+QEMUFile *qemu_fopen_ops_sized(void *opaque, const QEMUFileOps *ops, bool has_ioc, size_t buffer_size); + QEMUFile *qemu_file_new_input(QIOChannel *ioc); ++QEMUFile *qemu_file_new_input_sized(QIOChannel *ioc, size_t buffer_size); + QEMUFile *qemu_file_new_output(QIOChannel *ioc); ++QEMUFile *qemu_file_new_output_sized(QIOChannel *ioc, size_t buffer_size); void qemu_file_set_hooks(QEMUFile *f, const QEMUFileHooks *hooks); - int qemu_get_fd(QEMUFile *f); int qemu_fclose(QEMUFile *f); + diff --git a/migration/savevm-async.c b/migration/savevm-async.c -index b9a43c56bc..0bc5799cf8 100644 +index b3692739a0..e65a5e3482 100644 --- a/migration/savevm-async.c +++ b/migration/savevm-async.c -@@ -420,7 +420,7 @@ void qmp_savevm_start(bool has_statefile, const char *statefile, Error **errp) - goto restart; - } +@@ -367,7 +367,7 @@ void qmp_savevm_start(bool has_statefile, const char *statefile, Error **errp) -- snap_state.file = qemu_fopen_ops(&snap_state, &block_file_ops); -+ snap_state.file = qemu_fopen_ops_sized(&snap_state, &block_file_ops, false, 4 * 1024 * 1024); + QIOChannel *ioc = QIO_CHANNEL(qio_channel_savevm_async_new(snap_state.target, + &snap_state.bs_pos)); +- snap_state.file = qemu_file_new_output(ioc); ++ snap_state.file = qemu_file_new_output_sized(ioc, 4 * 1024 * 1024); if (!snap_state.file) { error_set(errp, ERROR_CLASS_GENERIC_ERROR, "failed to open '%s'", statefile); -@@ -573,7 +573,7 @@ int load_snapshot_from_blockdev(const char *filename, Error **errp) +@@ -500,7 +500,8 @@ int load_snapshot_from_blockdev(const char *filename, Error **errp) blk_op_block_all(be, blocker); /* restore the VM state */ -- f = qemu_fopen_ops(be, &loadstate_file_ops); -+ f = qemu_fopen_ops_sized(be, &loadstate_file_ops, false, 4 * 1024 * 1024); +- f = qemu_file_new_input(QIO_CHANNEL(qio_channel_savevm_async_new(be, &bs_pos))); ++ f = qemu_file_new_input_sized(QIO_CHANNEL(qio_channel_savevm_async_new(be, &bs_pos)), ++ 4 * 1024 * 1024); if (!f) { error_setg(errp, "Could not open VM state file"); goto the_end; diff --git a/debian/patches/pve/0018-PVE-block-add-the-zeroinit-block-driver-filter.patch b/debian/patches/pve/0019-PVE-block-add-the-zeroinit-block-driver-filter.patch similarity index 99% rename from debian/patches/pve/0018-PVE-block-add-the-zeroinit-block-driver-filter.patch rename to debian/patches/pve/0019-PVE-block-add-the-zeroinit-block-driver-filter.patch index a0cc957..8f53db4 100644 --- a/debian/patches/pve/0018-PVE-block-add-the-zeroinit-block-driver-filter.patch +++ b/debian/patches/pve/0019-PVE-block-add-the-zeroinit-block-driver-filter.patch @@ -13,7 +13,7 @@ Signed-off-by: Fabian Ebner create mode 100644 block/zeroinit.c diff --git a/block/meson.build b/block/meson.build -index 0b2a60c99b..9451fc3ccd 100644 +index 60bc305597..ad40c10b6a 100644 --- a/block/meson.build +++ b/block/meson.build @@ -43,6 +43,7 @@ block_ss.add(files( diff --git a/debian/patches/pve/0019-PVE-Add-dummy-id-command-line-parameter.patch b/debian/patches/pve/0020-PVE-Add-dummy-id-command-line-parameter.patch similarity index 86% rename from debian/patches/pve/0019-PVE-Add-dummy-id-command-line-parameter.patch rename to debian/patches/pve/0020-PVE-Add-dummy-id-command-line-parameter.patch index 488a70c..f0b18f5 100644 --- a/debian/patches/pve/0019-PVE-Add-dummy-id-command-line-parameter.patch +++ b/debian/patches/pve/0020-PVE-Add-dummy-id-command-line-parameter.patch @@ -14,12 +14,12 @@ Signed-off-by: Thomas Lamprecht 2 files changed, 11 insertions(+) diff --git a/qemu-options.hx b/qemu-options.hx -index aeade4ef80..a26f0b0400 100644 +index c2ca6e91b5..ab4734ef32 100644 --- a/qemu-options.hx +++ b/qemu-options.hx -@@ -1075,6 +1075,9 @@ DEFHEADING() +@@ -1118,6 +1118,9 @@ backend describes how QEMU handles the data. - DEFHEADING(Block device options:) + ERST +DEF("id", HAS_ARG, QEMU_OPTION_id, + "-id n set the VMID", QEMU_ARCH_ALL) @@ -28,10 +28,10 @@ index aeade4ef80..a26f0b0400 100644 "-fda/-fdb file use 'file' as floppy disk 0/1 image\n", QEMU_ARCH_ALL) DEF("fdb", HAS_ARG, QEMU_OPTION_fdb, "", QEMU_ARCH_ALL) diff --git a/softmmu/vl.c b/softmmu/vl.c -index a3f2a3818c..4208142685 100644 +index b8637c4262..39f149924e 100644 --- a/softmmu/vl.c +++ b/softmmu/vl.c -@@ -2785,6 +2785,7 @@ void qemu_init(int argc, char **argv, char **envp) +@@ -2620,6 +2620,7 @@ void qemu_init(int argc, char **argv, char **envp) MachineClass *machine_class; bool userconfig = true; FILE *vmstate_dump_file = NULL; @@ -39,7 +39,7 @@ index a3f2a3818c..4208142685 100644 qemu_add_opts(&qemu_drive_opts); qemu_add_drive_opts(&qemu_legacy_drive_opts); -@@ -3420,6 +3421,13 @@ void qemu_init(int argc, char **argv, char **envp) +@@ -3245,6 +3246,13 @@ void qemu_init(int argc, char **argv, char **envp) machine_parse_property_opt(qemu_find_opts("smp-opts"), "smp", optarg); break; diff --git a/debian/patches/pve/0020-PVE-Config-Revert-target-i386-disable-LINT0-after-re.patch b/debian/patches/pve/0021-PVE-Config-Revert-target-i386-disable-LINT0-after-re.patch similarity index 100% rename from debian/patches/pve/0020-PVE-Config-Revert-target-i386-disable-LINT0-after-re.patch rename to debian/patches/pve/0021-PVE-Config-Revert-target-i386-disable-LINT0-after-re.patch diff --git a/debian/patches/pve/0021-PVE-Up-Config-file-posix-make-locking-optiono-on-cre.patch b/debian/patches/pve/0022-PVE-Up-Config-file-posix-make-locking-optiono-on-cre.patch similarity index 90% rename from debian/patches/pve/0021-PVE-Up-Config-file-posix-make-locking-optiono-on-cre.patch rename to debian/patches/pve/0022-PVE-Up-Config-file-posix-make-locking-optiono-on-cre.patch index 99299d3..96b0193 100644 --- a/debian/patches/pve/0021-PVE-Up-Config-file-posix-make-locking-optiono-on-cre.patch +++ b/debian/patches/pve/0022-PVE-Up-Config-file-posix-make-locking-optiono-on-cre.patch @@ -13,10 +13,10 @@ Signed-off-by: Thomas Lamprecht 2 files changed, 42 insertions(+), 20 deletions(-) diff --git a/block/file-posix.c b/block/file-posix.c -index e5bf5d59bf..b013668dce 100644 +index 3d60b80286..49ee1db5f9 100644 --- a/block/file-posix.c +++ b/block/file-posix.c -@@ -2461,6 +2461,7 @@ raw_co_create(BlockdevCreateOptions *options, Error **errp) +@@ -2475,6 +2475,7 @@ raw_co_create(BlockdevCreateOptions *options, Error **errp) int fd; uint64_t perm, shared; int result = 0; @@ -24,7 +24,7 @@ index e5bf5d59bf..b013668dce 100644 /* Validate options and set default values */ assert(options->driver == BLOCKDEV_DRIVER_FILE); -@@ -2501,19 +2502,22 @@ raw_co_create(BlockdevCreateOptions *options, Error **errp) +@@ -2515,19 +2516,22 @@ raw_co_create(BlockdevCreateOptions *options, Error **errp) perm = BLK_PERM_WRITE | BLK_PERM_RESIZE; shared = BLK_PERM_ALL & ~BLK_PERM_RESIZE; @@ -59,7 +59,7 @@ index e5bf5d59bf..b013668dce 100644 } /* Clear the file by truncating it to 0 */ -@@ -2567,13 +2571,15 @@ raw_co_create(BlockdevCreateOptions *options, Error **errp) +@@ -2581,13 +2585,15 @@ raw_co_create(BlockdevCreateOptions *options, Error **errp) } out_unlock: @@ -82,7 +82,7 @@ index e5bf5d59bf..b013668dce 100644 } out_close: -@@ -2598,6 +2604,7 @@ static int coroutine_fn raw_co_create_opts(BlockDriver *drv, +@@ -2612,6 +2618,7 @@ static int coroutine_fn raw_co_create_opts(BlockDriver *drv, PreallocMode prealloc; char *buf = NULL; Error *local_err = NULL; @@ -90,7 +90,7 @@ index e5bf5d59bf..b013668dce 100644 /* Skip file: protocol prefix */ strstart(filename, "file:", &filename); -@@ -2620,6 +2627,18 @@ static int coroutine_fn raw_co_create_opts(BlockDriver *drv, +@@ -2634,6 +2641,18 @@ static int coroutine_fn raw_co_create_opts(BlockDriver *drv, return -EINVAL; } @@ -109,7 +109,7 @@ index e5bf5d59bf..b013668dce 100644 options = (BlockdevCreateOptions) { .driver = BLOCKDEV_DRIVER_FILE, .u.file = { -@@ -2631,6 +2650,8 @@ static int coroutine_fn raw_co_create_opts(BlockDriver *drv, +@@ -2645,6 +2664,8 @@ static int coroutine_fn raw_co_create_opts(BlockDriver *drv, .nocow = nocow, .has_extent_size_hint = has_extent_size_hint, .extent_size_hint = extent_size_hint, @@ -119,10 +119,10 @@ index e5bf5d59bf..b013668dce 100644 }; return raw_co_create(&options, errp); diff --git a/qapi/block-core.json b/qapi/block-core.json -index fb25c2b245..564b6b43f7 100644 +index e1857e7094..ddac91e8f6 100644 --- a/qapi/block-core.json +++ b/qapi/block-core.json -@@ -4484,7 +4484,8 @@ +@@ -4537,7 +4537,8 @@ 'size': 'size', '*preallocation': 'PreallocMode', '*nocow': 'bool', diff --git a/debian/patches/pve/0022-PVE-monitor-disable-oob-capability.patch b/debian/patches/pve/0023-PVE-monitor-disable-oob-capability.patch similarity index 100% rename from debian/patches/pve/0022-PVE-monitor-disable-oob-capability.patch rename to debian/patches/pve/0023-PVE-monitor-disable-oob-capability.patch diff --git a/debian/patches/pve/0023-PVE-Compat-4.0-used-balloon-qemu-4-0-config-size-fal.patch b/debian/patches/pve/0024-PVE-Compat-4.0-used-balloon-qemu-4-0-config-size-fal.patch similarity index 95% rename from debian/patches/pve/0023-PVE-Compat-4.0-used-balloon-qemu-4-0-config-size-fal.patch rename to debian/patches/pve/0024-PVE-Compat-4.0-used-balloon-qemu-4-0-config-size-fal.patch index 61528fd..72f29ff 100644 --- a/debian/patches/pve/0023-PVE-Compat-4.0-used-balloon-qemu-4-0-config-size-fal.patch +++ b/debian/patches/pve/0024-PVE-Compat-4.0-used-balloon-qemu-4-0-config-size-fal.patch @@ -26,10 +26,10 @@ Signed-off-by: Thomas Lamprecht 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/hw/core/machine.c b/hw/core/machine.c -index 1e23fdc14b..8a50445ee8 100644 +index a673302cce..fa424440bd 100644 --- a/hw/core/machine.c +++ b/hw/core/machine.c -@@ -118,7 +118,8 @@ GlobalProperty hw_compat_4_0[] = { +@@ -127,7 +127,8 @@ GlobalProperty hw_compat_4_0[] = { { "virtio-vga", "edid", "false" }, { "virtio-gpu-device", "edid", "false" }, { "virtio-device", "use-started", "false" }, diff --git a/debian/patches/pve/0024-PVE-Allow-version-code-in-machine-type.patch b/debian/patches/pve/0025-PVE-Allow-version-code-in-machine-type.patch similarity index 93% rename from debian/patches/pve/0024-PVE-Allow-version-code-in-machine-type.patch rename to debian/patches/pve/0025-PVE-Allow-version-code-in-machine-type.patch index a0ca907..67fd0f6 100644 --- a/debian/patches/pve/0024-PVE-Allow-version-code-in-machine-type.patch +++ b/debian/patches/pve/0025-PVE-Allow-version-code-in-machine-type.patch @@ -36,7 +36,7 @@ index 76fff60a6b..ec9201fb9a 100644 if (mc->default_cpu_type) { diff --git a/include/hw/boards.h b/include/hw/boards.h -index c92ac8815c..572d911ed4 100644 +index 7b416c9787..8ae15c51aa 100644 --- a/include/hw/boards.h +++ b/include/hw/boards.h @@ -230,6 +230,8 @@ struct MachineClass { @@ -49,10 +49,10 @@ index c92ac8815c..572d911ed4 100644 void (*reset)(MachineState *state); void (*wakeup)(MachineState *state); diff --git a/qapi/machine.json b/qapi/machine.json -index ca133e68ce..39ba204b52 100644 +index 555458f785..d868e4d31d 100644 --- a/qapi/machine.json +++ b/qapi/machine.json -@@ -158,6 +158,8 @@ +@@ -157,6 +157,8 @@ # # @default-ram-id: the default ID of initial RAM memory backend (since 5.2) # @@ -61,7 +61,7 @@ index ca133e68ce..39ba204b52 100644 # Since: 1.2 ## { 'struct': 'MachineInfo', -@@ -165,7 +167,7 @@ +@@ -164,7 +166,7 @@ '*is-default': 'bool', '*is-current': 'bool', 'cpu-max': 'int', 'hotpluggable-cpus': 'bool', 'numa-mem-supported': 'bool', 'deprecated': 'bool', '*default-cpu-type': 'str', @@ -71,10 +71,10 @@ index ca133e68ce..39ba204b52 100644 ## # @query-machines: diff --git a/softmmu/vl.c b/softmmu/vl.c -index 4208142685..37d85f1b96 100644 +index 39f149924e..0d233d55f3 100644 --- a/softmmu/vl.c +++ b/softmmu/vl.c -@@ -1659,6 +1659,7 @@ static const QEMUOption *lookup_opt(int argc, char **argv, +@@ -1580,6 +1580,7 @@ static const QEMUOption *lookup_opt(int argc, char **argv, static MachineClass *select_machine(QDict *qdict, Error **errp) { const char *optarg = qdict_get_try_str(qdict, "type"); @@ -82,7 +82,7 @@ index 4208142685..37d85f1b96 100644 GSList *machines = object_class_get_list(TYPE_MACHINE, false); MachineClass *machine_class; Error *local_err = NULL; -@@ -1676,6 +1677,11 @@ static MachineClass *select_machine(QDict *qdict, Error **errp) +@@ -1597,6 +1598,11 @@ static MachineClass *select_machine(QDict *qdict, Error **errp) } } @@ -94,7 +94,7 @@ index 4208142685..37d85f1b96 100644 g_slist_free(machines); if (local_err) { error_append_hint(&local_err, "Use -machine help to list supported machines\n"); -@@ -3362,12 +3368,31 @@ void qemu_init(int argc, char **argv, char **envp) +@@ -3187,12 +3193,31 @@ void qemu_init(int argc, char **argv, char **envp) case QEMU_OPTION_machine: { bool help; diff --git a/debian/patches/pve/0025-block-backup-move-bcs-bitmap-initialization-to-job-c.patch b/debian/patches/pve/0026-block-backup-move-bcs-bitmap-initialization-to-job-c.patch similarity index 88% rename from debian/patches/pve/0025-block-backup-move-bcs-bitmap-initialization-to-job-c.patch rename to debian/patches/pve/0026-block-backup-move-bcs-bitmap-initialization-to-job-c.patch index 8621cdf..a1ce276 100644 --- a/debian/patches/pve/0025-block-backup-move-bcs-bitmap-initialization-to-job-c.patch +++ b/debian/patches/pve/0026-block-backup-move-bcs-bitmap-initialization-to-job-c.patch @@ -25,11 +25,11 @@ Signed-off-by: Thomas Lamprecht 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/block/backup.c b/block/backup.c -index 5cfd0b999c..07b899035c 100644 +index b2b649e305..b6fa9e8a69 100644 --- a/block/backup.c +++ b/block/backup.c -@@ -239,8 +239,8 @@ static void backup_init_bcs_bitmap(BackupBlockJob *job) - assert(ret); +@@ -237,8 +237,8 @@ static void backup_init_bcs_bitmap(BackupBlockJob *job) + true); } else if (job->sync_mode == MIRROR_SYNC_MODE_TOP) { /* - * We can't hog the coroutine to initialize this thoroughly. @@ -39,7 +39,7 @@ index 5cfd0b999c..07b899035c 100644 */ block_copy_set_skip_unallocated(job->bcs, true); } -@@ -254,8 +254,6 @@ static int coroutine_fn backup_run(Job *job, Error **errp) +@@ -252,8 +252,6 @@ static int coroutine_fn backup_run(Job *job, Error **errp) BackupBlockJob *s = container_of(job, BackupBlockJob, common.job); int ret; @@ -48,7 +48,7 @@ index 5cfd0b999c..07b899035c 100644 if (s->sync_mode == MIRROR_SYNC_MODE_TOP) { int64_t offset = 0; int64_t count; -@@ -494,6 +492,8 @@ BlockJob *backup_job_create(const char *job_id, BlockDriverState *bs, +@@ -492,6 +490,8 @@ BlockJob *backup_job_create(const char *job_id, BlockDriverState *bs, block_job_add_bdrv(&job->common, "target", target, 0, BLK_PERM_ALL, &error_abort); diff --git a/debian/patches/pve/0026-PVE-Backup-add-vma-backup-format-code.patch b/debian/patches/pve/0027-PVE-Backup-add-vma-backup-format-code.patch similarity index 99% rename from debian/patches/pve/0026-PVE-Backup-add-vma-backup-format-code.patch rename to debian/patches/pve/0027-PVE-Backup-add-vma-backup-format-code.patch index ced8e74..cf67937 100644 --- a/debian/patches/pve/0026-PVE-Backup-add-vma-backup-format-code.patch +++ b/debian/patches/pve/0027-PVE-Backup-add-vma-backup-format-code.patch @@ -9,18 +9,18 @@ Signed-off-by: Fabian Ebner --- block/meson.build | 2 + meson.build | 5 + - vma-reader.c | 860 ++++++++++++++++++++++++++++++++++++++++++++++ + vma-reader.c | 859 ++++++++++++++++++++++++++++++++++++++++++++++ vma-writer.c | 791 ++++++++++++++++++++++++++++++++++++++++++ - vma.c | 850 +++++++++++++++++++++++++++++++++++++++++++++ + vma.c | 849 +++++++++++++++++++++++++++++++++++++++++++++ vma.h | 150 ++++++++ - 6 files changed, 2658 insertions(+) + 6 files changed, 2656 insertions(+) create mode 100644 vma-reader.c create mode 100644 vma-writer.c create mode 100644 vma.c create mode 100644 vma.h diff --git a/block/meson.build b/block/meson.build -index 9451fc3ccd..819eb80951 100644 +index ad40c10b6a..3a0b84bc11 100644 --- a/block/meson.build +++ b/block/meson.build @@ -46,6 +46,8 @@ block_ss.add(files( @@ -33,10 +33,10 @@ index 9451fc3ccd..819eb80951 100644 if get_option('qcow1').allowed() diff --git a/meson.build b/meson.build -index 861de93c4f..96a91b95e4 100644 +index d5230eadd6..ffff66c0cc 100644 --- a/meson.build +++ b/meson.build -@@ -1267,6 +1267,8 @@ keyutils = dependency('libkeyutils', required: false, +@@ -1462,6 +1462,8 @@ keyutils = dependency('libkeyutils', required: false, has_gettid = cc.has_function('gettid') @@ -45,7 +45,7 @@ index 861de93c4f..96a91b95e4 100644 # libselinux selinux = dependency('libselinux', required: get_option('selinux'), -@@ -3359,6 +3361,9 @@ if have_tools +@@ -3607,6 +3609,9 @@ if have_tools dependencies: [blockdev, qemuutil, gnutls, selinux], install: true) @@ -57,10 +57,10 @@ index 861de93c4f..96a91b95e4 100644 subdir('contrib/elf2dmp') diff --git a/vma-reader.c b/vma-reader.c new file mode 100644 -index 0000000000..4f4ee2b47b +index 0000000000..e65f1e8415 --- /dev/null +++ b/vma-reader.c -@@ -0,0 +1,860 @@ +@@ -0,0 +1,859 @@ +/* + * VMA: Virtual Machine Archive + * @@ -78,7 +78,6 @@ index 0000000000..4f4ee2b47b +#include +#include + -+#include "qemu-common.h" +#include "qemu/timer.h" +#include "qemu/ratelimit.h" +#include "vma.h" @@ -589,7 +588,7 @@ index 0000000000..4f4ee2b47b + } + } + } else { -+ int res = blk_pwrite(target, sector_num * BDRV_SECTOR_SIZE, buf, nb_sectors * BDRV_SECTOR_SIZE, 0); ++ int res = blk_pwrite(target, sector_num * BDRV_SECTOR_SIZE, nb_sectors * BDRV_SECTOR_SIZE, buf, 0); + if (res < 0) { + error_setg(errp, "blk_pwrite to %s failed (%d)", + bdrv_get_device_name(blk_bs(target)), res); @@ -1720,10 +1719,10 @@ index 0000000000..df4b20793d +} diff --git a/vma.c b/vma.c new file mode 100644 -index 0000000000..91612d50a2 +index 0000000000..e8dffb43e0 --- /dev/null +++ b/vma.c -@@ -0,0 +1,850 @@ +@@ -0,0 +1,849 @@ +/* + * VMA: Virtual Machine Archive + * @@ -1741,7 +1740,6 @@ index 0000000000..91612d50a2 +#include + +#include "vma.h" -+#include "qemu-common.h" +#include "qemu/module.h" +#include "qemu/error-report.h" +#include "qemu/main-loop.h" diff --git a/debian/patches/pve/0027-PVE-Backup-add-backup-dump-block-driver.patch b/debian/patches/pve/0028-PVE-Backup-add-backup-dump-block-driver.patch similarity index 96% rename from debian/patches/pve/0027-PVE-Backup-add-backup-dump-block-driver.patch rename to debian/patches/pve/0028-PVE-Backup-add-backup-dump-block-driver.patch index ea3bb84..548ce20 100644 --- a/debian/patches/pve/0027-PVE-Backup-add-backup-dump-block-driver.patch +++ b/debian/patches/pve/0028-PVE-Backup-add-backup-dump-block-driver.patch @@ -10,20 +10,20 @@ Subject: [PATCH] PVE-Backup: add backup-dump block driver Signed-off-by: Thomas Lamprecht --- - block/backup-dump.c | 168 +++++++++++++++++++++++++++++++ + block/backup-dump.c | 167 +++++++++++++++++++++++++++++++ block/backup.c | 30 ++---- block/meson.build | 1 + include/block/block_int-common.h | 35 +++++++ job.c | 3 +- - 5 files changed, 214 insertions(+), 23 deletions(-) + 5 files changed, 213 insertions(+), 23 deletions(-) create mode 100644 block/backup-dump.c diff --git a/block/backup-dump.c b/block/backup-dump.c new file mode 100644 -index 0000000000..93d7f46950 +index 0000000000..04718a94e2 --- /dev/null +++ b/block/backup-dump.c -@@ -0,0 +1,168 @@ +@@ -0,0 +1,167 @@ +/* + * BlockDriver to send backup data stream to a callback function + * @@ -35,7 +35,6 @@ index 0000000000..93d7f46950 + */ + +#include "qemu/osdep.h" -+#include "qemu-common.h" +#include "qom/object_interfaces.h" +#include "block/block_int.h" + @@ -193,7 +192,7 @@ index 0000000000..93d7f46950 + return bs; +} diff --git a/block/backup.c b/block/backup.c -index 07b899035c..7b5d02f580 100644 +index b6fa9e8a69..789f8b7799 100644 --- a/block/backup.c +++ b/block/backup.c @@ -29,28 +29,6 @@ @@ -225,7 +224,7 @@ index 07b899035c..7b5d02f580 100644 static const BlockJobDriver backup_job_driver; static void backup_cleanup_sync_bitmap(BackupBlockJob *job, int ret) -@@ -456,6 +434,14 @@ BlockJob *backup_job_create(const char *job_id, BlockDriverState *bs, +@@ -454,6 +432,14 @@ BlockJob *backup_job_create(const char *job_id, BlockDriverState *bs, } cluster_size = block_copy_cluster_size(bcs); @@ -241,7 +240,7 @@ index 07b899035c..7b5d02f580 100644 if (perf->max_chunk && perf->max_chunk < cluster_size) { error_setg(errp, "Required max-chunk (%" PRIi64 ") is less than backup " diff --git a/block/meson.build b/block/meson.build -index 819eb80951..067708b7c0 100644 +index 3a0b84bc11..7f22e7f177 100644 --- a/block/meson.build +++ b/block/meson.build @@ -4,6 +4,7 @@ block_ss.add(files( diff --git a/debian/patches/pve/0028-PVE-Backup-proxmox-backup-patches-for-qemu.patch b/debian/patches/pve/0029-PVE-Backup-proxmox-backup-patches-for-qemu.patch similarity index 98% rename from debian/patches/pve/0028-PVE-Backup-proxmox-backup-patches-for-qemu.patch rename to debian/patches/pve/0029-PVE-Backup-proxmox-backup-patches-for-qemu.patch index faa9483..58bc045 100644 --- a/debian/patches/pve/0028-PVE-Backup-proxmox-backup-patches-for-qemu.patch +++ b/debian/patches/pve/0029-PVE-Backup-proxmox-backup-patches-for-qemu.patch @@ -30,7 +30,7 @@ Signed-off-by: Fabian Ebner create mode 100644 pve-backup.c diff --git a/block/meson.build b/block/meson.build -index 067708b7c0..42aac96dbb 100644 +index 7f22e7f177..2783b77e9c 100644 --- a/block/meson.build +++ b/block/meson.build @@ -48,6 +48,11 @@ block_ss.add(files( @@ -87,7 +87,7 @@ index bfb3c043a0..89ca64444d 100644 + hmp_handle_error(mon, error); +} diff --git a/blockdev.c b/blockdev.c -index 1af5a1fcb2..9916a72334 100644 +index ce62a9b439..1600b24eab 100644 --- a/blockdev.c +++ b/blockdev.c @@ -36,6 +36,7 @@ @@ -99,7 +99,7 @@ index 1af5a1fcb2..9916a72334 100644 #include "monitor/monitor.h" #include "qemu/error-report.h" diff --git a/hmp-commands-info.hx b/hmp-commands-info.hx -index 925e680e5a..d9b787d2c6 100644 +index 97b88eaaad..92a8867afb 100644 --- a/hmp-commands-info.hx +++ b/hmp-commands-info.hx @@ -484,6 +484,20 @@ SRST @@ -124,10 +124,10 @@ index 925e680e5a..d9b787d2c6 100644 { .name = "usernet", diff --git a/hmp-commands.hx b/hmp-commands.hx -index 7f0ac498c4..994445f301 100644 +index bbcc73e942..97f24942b3 100644 --- a/hmp-commands.hx +++ b/hmp-commands.hx -@@ -99,6 +99,35 @@ ERST +@@ -101,6 +101,35 @@ ERST SRST ``block_stream`` Copy data from a backing file into a block device. @@ -164,7 +164,7 @@ index 7f0ac498c4..994445f301 100644 { diff --git a/include/monitor/hmp.h b/include/monitor/hmp.h -index 3a39ba41b5..d269b4c99c 100644 +index 55067beff1..5a98d2d927 100644 --- a/include/monitor/hmp.h +++ b/include/monitor/hmp.h @@ -30,6 +30,7 @@ void hmp_info_savevm(Monitor *mon, const QDict *qdict); @@ -185,10 +185,10 @@ index 3a39ba41b5..d269b4c99c 100644 void hmp_device_add(Monitor *mon, const QDict *qdict); void hmp_device_del(Monitor *mon, const QDict *qdict); diff --git a/meson.build b/meson.build -index 96a91b95e4..76fcb23299 100644 +index ffff66c0cc..0bc2fb5b10 100644 --- a/meson.build +++ b/meson.build -@@ -1268,6 +1268,7 @@ keyutils = dependency('libkeyutils', required: false, +@@ -1463,6 +1463,7 @@ keyutils = dependency('libkeyutils', required: false, has_gettid = cc.has_function('gettid') libuuid = cc.find_library('uuid', required: true) @@ -197,10 +197,10 @@ index 96a91b95e4..76fcb23299 100644 # libselinux selinux = dependency('libselinux', diff --git a/monitor/hmp-cmds.c b/monitor/hmp-cmds.c -index c64b959738..ef654221c4 100644 +index 1507180990..1168773da7 100644 --- a/monitor/hmp-cmds.c +++ b/monitor/hmp-cmds.c -@@ -195,6 +195,50 @@ void hmp_info_mice(Monitor *mon, const QDict *qdict) +@@ -197,6 +197,50 @@ void hmp_info_mice(Monitor *mon, const QDict *qdict) qapi_free_MouseInfoList(mice_list); } @@ -1464,12 +1464,12 @@ index 0000000000..88f5ee133f + return info; +} diff --git a/qapi/block-core.json b/qapi/block-core.json -index 564b6b43f7..ffcc25367b 100644 +index ddac91e8f6..90ad07b7ee 100644 --- a/qapi/block-core.json +++ b/qapi/block-core.json -@@ -744,6 +744,115 @@ - { 'command': 'query-block', 'returns': ['BlockInfo'] } - +@@ -740,6 +740,115 @@ + { 'command': 'query-block', 'returns': ['BlockInfo'], + 'allow-preconfig': true } +## +# @BackupStatus: @@ -1584,10 +1584,10 @@ index 564b6b43f7..ffcc25367b 100644 # @BlockDeviceTimedStats: # diff --git a/qapi/common.json b/qapi/common.json -index 412cc4f5ae..3e7a77ea66 100644 +index 356db3f670..aae8a3b682 100644 --- a/qapi/common.json +++ b/qapi/common.json -@@ -208,3 +208,16 @@ +@@ -206,3 +206,16 @@ ## { 'struct': 'HumanReadableText', 'data': { 'human-readable-text': 'str' } } @@ -1605,7 +1605,7 @@ index 412cc4f5ae..3e7a77ea66 100644 +## +{ 'struct': 'UuidInfo', 'data': {'UUID': 'str'} } diff --git a/qapi/machine.json b/qapi/machine.json -index 39ba204b52..091aafeff7 100644 +index d868e4d31d..a63d9a078d 100644 --- a/qapi/machine.json +++ b/qapi/machine.json @@ -4,6 +4,8 @@ @@ -1617,7 +1617,7 @@ index 39ba204b52..091aafeff7 100644 ## # = Machines ## -@@ -227,19 +229,6 @@ +@@ -226,19 +228,6 @@ ## { 'command': 'query-target', 'returns': 'TargetInfo' } diff --git a/debian/patches/pve/0029-PVE-Backup-pbs-restore-new-command-to-restore-from-p.patch b/debian/patches/pve/0030-PVE-Backup-pbs-restore-new-command-to-restore-from-p.patch similarity index 95% rename from debian/patches/pve/0029-PVE-Backup-pbs-restore-new-command-to-restore-from-p.patch rename to debian/patches/pve/0030-PVE-Backup-pbs-restore-new-command-to-restore-from-p.patch index f1c77cb..6c61992 100644 --- a/debian/patches/pve/0029-PVE-Backup-pbs-restore-new-command-to-restore-from-p.patch +++ b/debian/patches/pve/0030-PVE-Backup-pbs-restore-new-command-to-restore-from-p.patch @@ -7,15 +7,15 @@ Subject: [PATCH] PVE-Backup: pbs-restore - new command to restore from proxmox Signed-off-by: Thomas Lamprecht --- meson.build | 4 + - pbs-restore.c | 224 ++++++++++++++++++++++++++++++++++++++++++++++++++ - 2 files changed, 228 insertions(+) + pbs-restore.c | 223 ++++++++++++++++++++++++++++++++++++++++++++++++++ + 2 files changed, 227 insertions(+) create mode 100644 pbs-restore.c diff --git a/meson.build b/meson.build -index 76fcb23299..9476ccbe07 100644 +index 0bc2fb5b10..f48d2e0457 100644 --- a/meson.build +++ b/meson.build -@@ -3365,6 +3365,10 @@ if have_tools +@@ -3613,6 +3613,10 @@ if have_tools vma = executable('vma', files('vma.c', 'vma-reader.c') + genh, dependencies: [authz, block, crypto, io, qom], install: true) @@ -28,10 +28,10 @@ index 76fcb23299..9476ccbe07 100644 subdir('contrib/elf2dmp') diff --git a/pbs-restore.c b/pbs-restore.c new file mode 100644 -index 0000000000..4d3f925a1b +index 0000000000..2f834cf42e --- /dev/null +++ b/pbs-restore.c -@@ -0,0 +1,224 @@ +@@ -0,0 +1,223 @@ +/* + * Qemu image restore helper for Proxmox Backup + * @@ -50,7 +50,6 @@ index 0000000000..4d3f925a1b +#include +#include + -+#include "qemu-common.h" +#include "qemu/module.h" +#include "qemu/error-report.h" +#include "qemu/main-loop.h" @@ -96,7 +95,7 @@ index 0000000000..4d3f925a1b + } + res = blk_pwrite_zeroes(callback_data->target, offset, data_len, 0); + } else { -+ res = blk_pwrite(callback_data->target, offset, data, data_len, 0); ++ res = blk_pwrite(callback_data->target, offset, data_len, data, 0); + } + + if (res < 0) { diff --git a/debian/patches/pve/0030-PVE-Backup-Add-dirty-bitmap-tracking-for-incremental.patch b/debian/patches/pve/0031-PVE-Backup-Add-dirty-bitmap-tracking-for-incremental.patch similarity index 98% rename from debian/patches/pve/0030-PVE-Backup-Add-dirty-bitmap-tracking-for-incremental.patch rename to debian/patches/pve/0031-PVE-Backup-Add-dirty-bitmap-tracking-for-incremental.patch index 012c0b3..8d37565 100644 --- a/debian/patches/pve/0030-PVE-Backup-Add-dirty-bitmap-tracking-for-incremental.patch +++ b/debian/patches/pve/0031-PVE-Backup-Add-dirty-bitmap-tracking-for-incremental.patch @@ -41,10 +41,10 @@ index 89ca64444d..45da74d7a0 100644 false, NULL, false, NULL, !!devlist, devlist, qdict_haskey(qdict, "speed"), speed, &error); diff --git a/monitor/hmp-cmds.c b/monitor/hmp-cmds.c -index ef654221c4..c5c74ac1dc 100644 +index 1168773da7..4c1671e289 100644 --- a/monitor/hmp-cmds.c +++ b/monitor/hmp-cmds.c -@@ -221,19 +221,42 @@ void hmp_info_backup(Monitor *mon, const QDict *qdict) +@@ -223,19 +223,42 @@ void hmp_info_backup(Monitor *mon, const QDict *qdict) monitor_printf(mon, "End time: %s", ctime(&info->end_time)); } @@ -405,10 +405,10 @@ index 88f5ee133f..1c49cd178d 100644 qemu_mutex_unlock(&backup_state.stat.lock); diff --git a/qapi/block-core.json b/qapi/block-core.json -index ffcc25367b..b332d8a8da 100644 +index 90ad07b7ee..3ad9eb5d1a 100644 --- a/qapi/block-core.json +++ b/qapi/block-core.json -@@ -757,8 +757,13 @@ +@@ -753,8 +753,13 @@ # # @total: total amount of bytes involved in the backup process # @@ -422,7 +422,7 @@ index ffcc25367b..b332d8a8da 100644 # @zero-bytes: amount of 'zero' bytes detected. # # @start-time: time (epoch) when backup job started. -@@ -771,8 +776,8 @@ +@@ -767,8 +772,8 @@ # ## { 'struct': 'BackupStatus', @@ -433,7 +433,7 @@ index ffcc25367b..b332d8a8da 100644 '*start-time': 'int', '*end-time': 'int', '*backup-file': 'str', '*uuid': 'str' } } -@@ -815,6 +820,8 @@ +@@ -811,6 +816,8 @@ # # @backup-time: backup timestamp (Unix epoch, required for format 'pbs') # @@ -442,7 +442,7 @@ index ffcc25367b..b332d8a8da 100644 # Returns: the uuid of the backup job # ## -@@ -825,6 +832,7 @@ +@@ -821,6 +828,7 @@ '*fingerprint': 'str', '*backup-id': 'str', '*backup-time': 'int', diff --git a/debian/patches/pve/0031-PVE-various-PBS-fixes.patch b/debian/patches/pve/0032-PVE-various-PBS-fixes.patch similarity index 99% rename from debian/patches/pve/0031-PVE-various-PBS-fixes.patch rename to debian/patches/pve/0032-PVE-various-PBS-fixes.patch index e5ebc18..3bd8426 100644 --- a/debian/patches/pve/0031-PVE-various-PBS-fixes.patch +++ b/debian/patches/pve/0032-PVE-various-PBS-fixes.patch @@ -194,10 +194,10 @@ index 1c49cd178d..c15abefdda 100644 .format = format, .has_config_file = has_config_file, diff --git a/qapi/block-core.json b/qapi/block-core.json -index b332d8a8da..abef91062a 100644 +index 3ad9eb5d1a..4120052690 100644 --- a/qapi/block-core.json +++ b/qapi/block-core.json -@@ -822,6 +822,10 @@ +@@ -818,6 +818,10 @@ # # @use-dirty-bitmap: use dirty bitmap to detect incremental changes since last job (optional for format 'pbs') # @@ -208,7 +208,7 @@ index b332d8a8da..abef91062a 100644 # Returns: the uuid of the backup job # ## -@@ -833,6 +837,8 @@ +@@ -829,6 +833,8 @@ '*backup-id': 'str', '*backup-time': 'int', '*use-dirty-bitmap': 'bool', diff --git a/debian/patches/pve/0032-PVE-Add-PBS-block-driver-to-map-backup-archives-into.patch b/debian/patches/pve/0033-PVE-Add-PBS-block-driver-to-map-backup-archives-into.patch similarity index 91% rename from debian/patches/pve/0032-PVE-Add-PBS-block-driver-to-map-backup-archives-into.patch rename to debian/patches/pve/0033-PVE-Add-PBS-block-driver-to-map-backup-archives-into.patch index 3b08ed1..9a850c0 100644 --- a/debian/patches/pve/0032-PVE-Add-PBS-block-driver-to-map-backup-archives-into.patch +++ b/debian/patches/pve/0033-PVE-Add-PBS-block-driver-to-map-backup-archives-into.patch @@ -13,13 +13,13 @@ Signed-off-by: Fabian Ebner block/meson.build | 3 + block/pbs.c | 276 +++++++++++++++++++++++++++++++++++++++++++ configure | 9 ++ - meson.build | 1 + + meson.build | 2 +- qapi/block-core.json | 13 ++ - 5 files changed, 302 insertions(+) + 5 files changed, 302 insertions(+), 1 deletion(-) create mode 100644 block/pbs.c diff --git a/block/meson.build b/block/meson.build -index 42aac96dbb..f94cc0cd25 100644 +index 2783b77e9c..a26a69434e 100644 --- a/block/meson.build +++ b/block/meson.build @@ -53,6 +53,9 @@ block_ss.add(files( @@ -315,63 +315,64 @@ index 0000000000..0b05ea9080 + +block_init(bdrv_pbs_init); diff --git a/configure b/configure -index 7c08c18358..08d164b4f5 100755 +index 72ab03f11a..7203c270ec 100755 --- a/configure +++ b/configure -@@ -325,6 +325,7 @@ trace_file="trace" - opengl="$default_feature" +@@ -309,6 +309,7 @@ linux_user="" + bsd_user="" + pie="" coroutine="" - tls_priority="NORMAL" +pbs_bdrv="yes" plugins="$default_feature" - secret_keyring="$default_feature" meson="" -@@ -991,6 +992,10 @@ for opt do - ;; - --disable-pvrdma) pvrdma="no" + meson_args="" +@@ -902,6 +903,10 @@ for opt do + --enable-uuid|--disable-uuid) + echo "$0: $opt is obsolete, UUID support is always built" >&2 ;; + --disable-pbs-bdrv) pbs_bdrv="no" + ;; + --enable-pbs-bdrv) pbs_bdrv="yes" + ;; - --disable-vhost-user) vhost_user="no" + --with-git=*) git="$optarg" ;; - --enable-vhost-user) vhost_user="yes" -@@ -1265,6 +1270,7 @@ cat << EOF - vhost-user vhost-user backend support - vhost-vdpa vhost-vdpa kernel backend support - opengl opengl support + --with-git-submodules=*) +@@ -1087,6 +1092,7 @@ cat << EOF + debug-info debugging information + safe-stack SafeStack Stack Smash Protection. Depends on + clang/llvm >= 3.7 and requires coroutine backend ucontext. + pbs-bdrv Proxmox backup server read-only block driver support - gio libgio support NOTE: The object files are built at the place where configure is launched -@@ -2848,6 +2854,9 @@ if test "$xen" = "enabled" ; then - echo "XEN_CFLAGS=$xen_cflags" >> $config_host_mak - echo "XEN_LIBS=$xen_libs" >> $config_host_mak + EOF +@@ -2463,6 +2469,9 @@ echo "TARGET_DIRS=$target_list" >> $config_host_mak + if test "$modules" = "yes"; then + echo "CONFIG_MODULES=y" >> $config_host_mak fi +if test "$pbs_bdrv" = "yes" ; then + echo "CONFIG_PBS_BDRV=y" >> $config_host_mak +fi - if test "$vhost_scsi" = "yes" ; then - echo "CONFIG_VHOST_SCSI=y" >> $config_host_mak - fi + + # XXX: suppress that + if [ "$bsd" = "yes" ] ; then diff --git a/meson.build b/meson.build -index 9476ccbe07..d3783a83e4 100644 +index f48d2e0457..be4785e2f6 100644 --- a/meson.build +++ b/meson.build -@@ -3743,6 +3743,7 @@ summary_info += {'bzip2 support': libbzip2} +@@ -3986,7 +3986,7 @@ summary_info += {'bzip2 support': libbzip2} summary_info += {'lzfse support': liblzfse} summary_info += {'zstd support': zstd} summary_info += {'NUMA host support': numa} +-summary_info += {'capstone': capstone} +summary_info += {'PBS bdrv support': config_host.has_key('CONFIG_PBS_BDRV')} - summary_info += {'capstone': capstone_opt == 'internal' ? capstone_opt : capstone} summary_info += {'libpmem support': libpmem} summary_info += {'libdaxctl support': libdaxctl} + summary_info += {'libudev': libudev} diff --git a/qapi/block-core.json b/qapi/block-core.json -index abef91062a..68591cb343 100644 +index 4120052690..96bc696aaa 100644 --- a/qapi/block-core.json +++ b/qapi/block-core.json -@@ -3073,6 +3073,7 @@ +@@ -3099,6 +3099,7 @@ 'luks', 'nbd', 'nfs', 'null-aio', 'null-co', 'nvme', 'parallels', 'preallocate', 'qcow', 'qcow2', 'qed', 'quorum', 'raw', 'rbd', { 'name': 'replication', 'if': 'CONFIG_REPLICATION' }, @@ -379,7 +380,7 @@ index abef91062a..68591cb343 100644 'ssh', 'throttle', 'vdi', 'vhdx', 'vmdk', 'vpc', 'vvfat' ] } ## -@@ -3145,6 +3146,17 @@ +@@ -3171,6 +3172,17 @@ { 'struct': 'BlockdevOptionsNull', 'data': { '*size': 'int', '*latency-ns': 'uint64', '*read-zeroes': 'bool' } } @@ -397,7 +398,7 @@ index abef91062a..68591cb343 100644 ## # @BlockdevOptionsNVMe: # -@@ -4405,6 +4417,7 @@ +@@ -4455,6 +4467,7 @@ 'nfs': 'BlockdevOptionsNfs', 'null-aio': 'BlockdevOptionsNull', 'null-co': 'BlockdevOptionsNull', diff --git a/debian/patches/pve/0033-PVE-add-query_proxmox_support-QMP-command.patch b/debian/patches/pve/0034-PVE-add-query_proxmox_support-QMP-command.patch similarity index 97% rename from debian/patches/pve/0033-PVE-add-query_proxmox_support-QMP-command.patch rename to debian/patches/pve/0034-PVE-add-query_proxmox_support-QMP-command.patch index 0f1f0c6..dbcef29 100644 --- a/debian/patches/pve/0033-PVE-add-query_proxmox_support-QMP-command.patch +++ b/debian/patches/pve/0034-PVE-add-query_proxmox_support-QMP-command.patch @@ -33,10 +33,10 @@ index c15abefdda..4684789813 100644 + return ret; +} diff --git a/qapi/block-core.json b/qapi/block-core.json -index 68591cb343..7d25aa4fa1 100644 +index 96bc696aaa..0b453c61d4 100644 --- a/qapi/block-core.json +++ b/qapi/block-core.json -@@ -867,6 +867,35 @@ +@@ -863,6 +863,35 @@ ## { 'command': 'backup-cancel' } diff --git a/debian/patches/pve/0034-PVE-add-query-pbs-bitmap-info-QMP-call.patch b/debian/patches/pve/0035-PVE-add-query-pbs-bitmap-info-QMP-call.patch similarity index 98% rename from debian/patches/pve/0034-PVE-add-query-pbs-bitmap-info-QMP-call.patch rename to debian/patches/pve/0035-PVE-add-query-pbs-bitmap-info-QMP-call.patch index d3ba75c..29a96d1 100644 --- a/debian/patches/pve/0034-PVE-add-query-pbs-bitmap-info-QMP-call.patch +++ b/debian/patches/pve/0035-PVE-add-query-pbs-bitmap-info-QMP-call.patch @@ -15,10 +15,10 @@ Signed-off-by: Thomas Lamprecht 3 files changed, 159 insertions(+), 42 deletions(-) diff --git a/monitor/hmp-cmds.c b/monitor/hmp-cmds.c -index c5c74ac1dc..df273f41fb 100644 +index 4c1671e289..c1152f55a7 100644 --- a/monitor/hmp-cmds.c +++ b/monitor/hmp-cmds.c -@@ -198,6 +198,7 @@ void hmp_info_mice(Monitor *mon, const QDict *qdict) +@@ -200,6 +200,7 @@ void hmp_info_mice(Monitor *mon, const QDict *qdict) void hmp_info_backup(Monitor *mon, const QDict *qdict) { BackupStatus *info; @@ -26,7 +26,7 @@ index c5c74ac1dc..df273f41fb 100644 info = qmp_query_backup(NULL); -@@ -228,26 +229,29 @@ void hmp_info_backup(Monitor *mon, const QDict *qdict) +@@ -230,26 +231,29 @@ void hmp_info_backup(Monitor *mon, const QDict *qdict) // this should not happen normally monitor_printf(mon, "Total size: %d\n", 0); } else { @@ -359,10 +359,10 @@ index 4684789813..f90abaa50a 100644 return ret; } diff --git a/qapi/block-core.json b/qapi/block-core.json -index 7d25aa4fa1..69571d86eb 100644 +index 0b453c61d4..16e184dd28 100644 --- a/qapi/block-core.json +++ b/qapi/block-core.json -@@ -875,6 +875,8 @@ +@@ -871,6 +871,8 @@ # @pbs-dirty-bitmap: True if dirty-bitmap-incremental backups to PBS are # supported. # @@ -371,7 +371,7 @@ index 7d25aa4fa1..69571d86eb 100644 # @pbs-dirty-bitmap-savevm: True if 'dirty-bitmaps' migration capability can # safely be set for savevm-async. # -@@ -883,6 +885,7 @@ +@@ -879,6 +881,7 @@ ## { 'struct': 'ProxmoxSupportStatus', 'data': { 'pbs-dirty-bitmap': 'bool', @@ -379,7 +379,7 @@ index 7d25aa4fa1..69571d86eb 100644 'pbs-dirty-bitmap-savevm': 'bool', 'pbs-library-version': 'str' } } -@@ -896,6 +899,59 @@ +@@ -892,6 +895,59 @@ ## { 'command': 'query-proxmox-support', 'returns': 'ProxmoxSupportStatus' } diff --git a/debian/patches/pve/0035-PVE-redirect-stderr-to-journal-when-daemonized.patch b/debian/patches/pve/0036-PVE-redirect-stderr-to-journal-when-daemonized.patch similarity index 86% rename from debian/patches/pve/0035-PVE-redirect-stderr-to-journal-when-daemonized.patch rename to debian/patches/pve/0036-PVE-redirect-stderr-to-journal-when-daemonized.patch index 89727a4..c5be26b 100644 --- a/debian/patches/pve/0035-PVE-redirect-stderr-to-journal-when-daemonized.patch +++ b/debian/patches/pve/0036-PVE-redirect-stderr-to-journal-when-daemonized.patch @@ -14,10 +14,10 @@ Signed-off-by: Thomas Lamprecht 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/meson.build b/meson.build -index d3783a83e4..715245ba20 100644 +index be4785e2f6..3fc7c8d435 100644 --- a/meson.build +++ b/meson.build -@@ -1268,6 +1268,7 @@ keyutils = dependency('libkeyutils', required: false, +@@ -1463,6 +1463,7 @@ keyutils = dependency('libkeyutils', required: false, has_gettid = cc.has_function('gettid') libuuid = cc.find_library('uuid', required: true) @@ -25,7 +25,7 @@ index d3783a83e4..715245ba20 100644 libproxmox_backup_qemu = cc.find_library('proxmox_backup_qemu', required: true) # libselinux -@@ -2861,6 +2862,7 @@ if have_block +@@ -3105,6 +3106,7 @@ if have_block # os-posix.c contains POSIX-specific functions used by qemu-storage-daemon, # os-win32.c does not blockdev_ss.add(when: 'CONFIG_POSIX', if_true: files('os-posix.c')) @@ -34,7 +34,7 @@ index d3783a83e4..715245ba20 100644 endif diff --git a/os-posix.c b/os-posix.c -index 24692c8593..d1bc5ac12d 100644 +index 321fc4bd13..b1870d2690 100644 --- a/os-posix.c +++ b/os-posix.c @@ -28,6 +28,8 @@ @@ -44,15 +44,15 @@ index 24692c8593..d1bc5ac12d 100644 +#include +#include - #include "qemu-common.h" /* Needed early for CONFIG_BSD etc. */ -@@ -291,9 +293,10 @@ void os_setup_post(void) + #include "net/slirp.h" +@@ -281,9 +283,10 @@ void os_setup_post(void) dup2(fd, 0); dup2(fd, 1); - /* In case -D is given do not redirect stderr to /dev/null */ + /* In case -D is given do not redirect stderr to journal */ - if (!qemu_logfile) { + if (!qemu_log_enabled()) { - dup2(fd, 2); + int journal_fd = sd_journal_stream_fd("QEMU", LOG_ERR, 0); + dup2(journal_fd, 2); diff --git a/debian/patches/pve/0036-PVE-Add-sequential-job-transaction-support.patch b/debian/patches/pve/0037-PVE-Add-sequential-job-transaction-support.patch similarity index 100% rename from debian/patches/pve/0036-PVE-Add-sequential-job-transaction-support.patch rename to debian/patches/pve/0037-PVE-Add-sequential-job-transaction-support.patch diff --git a/debian/patches/pve/0037-PVE-Backup-Use-a-transaction-to-synchronize-job-stat.patch b/debian/patches/pve/0038-PVE-Backup-Use-a-transaction-to-synchronize-job-stat.patch similarity index 100% rename from debian/patches/pve/0037-PVE-Backup-Use-a-transaction-to-synchronize-job-stat.patch rename to debian/patches/pve/0038-PVE-Backup-Use-a-transaction-to-synchronize-job-stat.patch diff --git a/debian/patches/pve/0038-PVE-Backup-Don-t-block-on-finishing-and-cleanup-crea.patch b/debian/patches/pve/0039-PVE-Backup-Don-t-block-on-finishing-and-cleanup-crea.patch similarity index 99% rename from debian/patches/pve/0038-PVE-Backup-Don-t-block-on-finishing-and-cleanup-crea.patch rename to debian/patches/pve/0039-PVE-Backup-Don-t-block-on-finishing-and-cleanup-crea.patch index 51a2b53..44c167b 100644 --- a/debian/patches/pve/0038-PVE-Backup-Don-t-block-on-finishing-and-cleanup-crea.patch +++ b/debian/patches/pve/0039-PVE-Backup-Don-t-block-on-finishing-and-cleanup-crea.patch @@ -481,10 +481,10 @@ index 63c686463f..6f05796fad 100644 qemu_mutex_unlock(&backup_state.stat.lock); diff --git a/qapi/block-core.json b/qapi/block-core.json -index 69571d86eb..e6c3687bea 100644 +index 16e184dd28..cb17d00fe0 100644 --- a/qapi/block-core.json +++ b/qapi/block-core.json -@@ -774,12 +774,15 @@ +@@ -770,12 +770,15 @@ # # @uuid: uuid for this backup job # diff --git a/debian/patches/pve/0039-PVE-Migrate-dirty-bitmap-state-via-savevm.patch b/debian/patches/pve/0040-PVE-Migrate-dirty-bitmap-state-via-savevm.patch similarity index 96% rename from debian/patches/pve/0039-PVE-Migrate-dirty-bitmap-state-via-savevm.patch rename to debian/patches/pve/0040-PVE-Migrate-dirty-bitmap-state-via-savevm.patch index 36c6d96..e80a716 100644 --- a/debian/patches/pve/0039-PVE-Migrate-dirty-bitmap-state-via-savevm.patch +++ b/debian/patches/pve/0040-PVE-Migrate-dirty-bitmap-state-via-savevm.patch @@ -36,11 +36,11 @@ index 465906710d..4f0aeceb6f 100644 + #endif diff --git a/migration/meson.build b/migration/meson.build -index 1e2aec8486..259e863a43 100644 +index 0842d00cd2..d012f4d8d3 100644 --- a/migration/meson.build +++ b/migration/meson.build -@@ -7,8 +7,10 @@ migration_files = files( - 'qemu-file-channel.c', +@@ -6,8 +6,10 @@ migration_files = files( + 'vmstate.c', 'qemu-file.c', 'yank_functions.c', + 'pbs-state.c', @@ -51,10 +51,10 @@ index 1e2aec8486..259e863a43 100644 softmmu_ss.add(files( 'block-dirty-bitmap.c', diff --git a/migration/migration.c b/migration/migration.c -index 695f0f2900..6e17f8e91c 100644 +index bb8bbddfe4..8109e468eb 100644 --- a/migration/migration.c +++ b/migration/migration.c -@@ -214,6 +214,7 @@ void migration_object_init(void) +@@ -229,6 +229,7 @@ void migration_object_init(void) blk_mig_init(); ram_mig_init(); dirty_bitmap_mig_init(); @@ -187,10 +187,10 @@ index 6f05796fad..5fa3cc1352 100644 return ret; } diff --git a/qapi/block-core.json b/qapi/block-core.json -index e6c3687bea..05382a1069 100644 +index cb17d00fe0..bd978ea562 100644 --- a/qapi/block-core.json +++ b/qapi/block-core.json -@@ -883,6 +883,11 @@ +@@ -879,6 +879,11 @@ # @pbs-dirty-bitmap-savevm: True if 'dirty-bitmaps' migration capability can # safely be set for savevm-async. # @@ -202,7 +202,7 @@ index e6c3687bea..05382a1069 100644 # @pbs-library-version: Running version of libproxmox-backup-qemu0 library. # ## -@@ -890,6 +895,7 @@ +@@ -886,6 +891,7 @@ 'data': { 'pbs-dirty-bitmap': 'bool', 'query-bitmap-info': 'bool', 'pbs-dirty-bitmap-savevm': 'bool', diff --git a/debian/patches/pve/0040-migration-block-dirty-bitmap-migrate-other-bitmaps-e.patch b/debian/patches/pve/0041-migration-block-dirty-bitmap-migrate-other-bitmaps-e.patch similarity index 100% rename from debian/patches/pve/0040-migration-block-dirty-bitmap-migrate-other-bitmaps-e.patch rename to debian/patches/pve/0041-migration-block-dirty-bitmap-migrate-other-bitmaps-e.patch diff --git a/debian/patches/pve/0041-PVE-fall-back-to-open-iscsi-initiatorname.patch b/debian/patches/pve/0042-PVE-fall-back-to-open-iscsi-initiatorname.patch similarity index 98% rename from debian/patches/pve/0041-PVE-fall-back-to-open-iscsi-initiatorname.patch rename to debian/patches/pve/0042-PVE-fall-back-to-open-iscsi-initiatorname.patch index c30bb2b..bed3e62 100644 --- a/debian/patches/pve/0041-PVE-fall-back-to-open-iscsi-initiatorname.patch +++ b/debian/patches/pve/0042-PVE-fall-back-to-open-iscsi-initiatorname.patch @@ -21,7 +21,7 @@ Signed-off-by: Thomas Lamprecht 1 file changed, 30 insertions(+) diff --git a/block/iscsi.c b/block/iscsi.c -index 51f2a5eeaa..f11591ac94 100644 +index d707d0b354..da6ed52323 100644 --- a/block/iscsi.c +++ b/block/iscsi.c @@ -1386,12 +1386,42 @@ static char *get_initiator_name(QemuOpts *opts) diff --git a/debian/patches/pve/0042-PVE-Use-coroutine-QMP-for-backup-cancel_backup.patch b/debian/patches/pve/0043-PVE-Use-coroutine-QMP-for-backup-cancel_backup.patch similarity index 99% rename from debian/patches/pve/0042-PVE-Use-coroutine-QMP-for-backup-cancel_backup.patch rename to debian/patches/pve/0043-PVE-Use-coroutine-QMP-for-backup-cancel_backup.patch index 3de10a6..c07cdce 100644 --- a/debian/patches/pve/0042-PVE-Use-coroutine-QMP-for-backup-cancel_backup.patch +++ b/debian/patches/pve/0043-PVE-Use-coroutine-QMP-for-backup-cancel_backup.patch @@ -54,10 +54,10 @@ index ea7b665aa2..ef45552e3b 100644 Error *error = NULL; diff --git a/hmp-commands.hx b/hmp-commands.hx -index 994445f301..aaea875970 100644 +index 97f24942b3..7a2be816da 100644 --- a/hmp-commands.hx +++ b/hmp-commands.hx -@@ -109,6 +109,7 @@ ERST +@@ -111,6 +111,7 @@ ERST "\n\t\t\t Use -d to dump data into a directory instead" "\n\t\t\t of using VMA format.", .cmd = hmp_backup, @@ -65,7 +65,7 @@ index 994445f301..aaea875970 100644 }, SRST -@@ -122,6 +123,7 @@ ERST +@@ -124,6 +125,7 @@ ERST .params = "", .help = "cancel the current VM backup", .cmd = hmp_backup_cancel, @@ -575,10 +575,10 @@ index 5fa3cc1352..323014744c 100644 BackupStatus *qmp_query_backup(Error **errp) diff --git a/qapi/block-core.json b/qapi/block-core.json -index 05382a1069..f0399bf249 100644 +index bd978ea562..ca1966f54b 100644 --- a/qapi/block-core.json +++ b/qapi/block-core.json -@@ -846,7 +846,7 @@ +@@ -842,7 +842,7 @@ '*config-file': 'str', '*firewall-file': 'str', '*devlist': 'str', '*speed': 'int' }, @@ -587,7 +587,7 @@ index 05382a1069..f0399bf249 100644 ## # @query-backup: -@@ -868,7 +868,7 @@ +@@ -864,7 +864,7 @@ # Notes: This command succeeds even if there is no backup process running. # ## diff --git a/debian/patches/pve/0043-PBS-add-master-key-support.patch b/debian/patches/pve/0044-PBS-add-master-key-support.patch similarity index 97% rename from debian/patches/pve/0043-PBS-add-master-key-support.patch rename to debian/patches/pve/0044-PBS-add-master-key-support.patch index 356cfd9..1716c05 100644 --- a/debian/patches/pve/0043-PBS-add-master-key-support.patch +++ b/debian/patches/pve/0044-PBS-add-master-key-support.patch @@ -58,10 +58,10 @@ index 323014744c..9f6c04a512 100644 return ret; } diff --git a/qapi/block-core.json b/qapi/block-core.json -index f0399bf249..13e03ca154 100644 +index ca1966f54b..fc8a125451 100644 --- a/qapi/block-core.json +++ b/qapi/block-core.json -@@ -817,6 +817,8 @@ +@@ -813,6 +813,8 @@ # # @key-password: password for keyfile (optional for format 'pbs') # @@ -70,7 +70,7 @@ index f0399bf249..13e03ca154 100644 # @fingerprint: server cert fingerprint (optional for format 'pbs') # # @backup-id: backup ID (required for format 'pbs') -@@ -836,6 +838,7 @@ +@@ -832,6 +834,7 @@ '*password': 'str', '*keyfile': 'str', '*key-password': 'str', @@ -78,7 +78,7 @@ index f0399bf249..13e03ca154 100644 '*fingerprint': 'str', '*backup-id': 'str', '*backup-time': 'int', -@@ -888,6 +891,9 @@ +@@ -884,6 +887,9 @@ # migration cap if this is false/unset may lead # to crashes on migration! # @@ -88,7 +88,7 @@ index f0399bf249..13e03ca154 100644 # @pbs-library-version: Running version of libproxmox-backup-qemu0 library. # ## -@@ -896,6 +902,7 @@ +@@ -892,6 +898,7 @@ 'query-bitmap-info': 'bool', 'pbs-dirty-bitmap-savevm': 'bool', 'pbs-dirty-bitmap-migration': 'bool', diff --git a/debian/patches/pve/0044-PVE-block-pbs-fast-path-reads-without-allocation-if-.patch b/debian/patches/pve/0045-PVE-block-pbs-fast-path-reads-without-allocation-if-.patch similarity index 100% rename from debian/patches/pve/0044-PVE-block-pbs-fast-path-reads-without-allocation-if-.patch rename to debian/patches/pve/0045-PVE-block-pbs-fast-path-reads-without-allocation-if-.patch diff --git a/debian/patches/pve/0045-PVE-block-stream-increase-chunk-size.patch b/debian/patches/pve/0046-PVE-block-stream-increase-chunk-size.patch similarity index 100% rename from debian/patches/pve/0045-PVE-block-stream-increase-chunk-size.patch rename to debian/patches/pve/0046-PVE-block-stream-increase-chunk-size.patch diff --git a/debian/patches/pve/0046-block-io-accept-NULL-qiov-in-bdrv_pad_request.patch b/debian/patches/pve/0047-block-io-accept-NULL-qiov-in-bdrv_pad_request.patch similarity index 90% rename from debian/patches/pve/0046-block-io-accept-NULL-qiov-in-bdrv_pad_request.patch rename to debian/patches/pve/0047-block-io-accept-NULL-qiov-in-bdrv_pad_request.patch index d1d30b1..b294d43 100644 --- a/debian/patches/pve/0046-block-io-accept-NULL-qiov-in-bdrv_pad_request.patch +++ b/debian/patches/pve/0047-block-io-accept-NULL-qiov-in-bdrv_pad_request.patch @@ -17,10 +17,10 @@ Signed-off-by: Thomas Lamprecht 1 file changed, 4 insertions(+) diff --git a/block/io.c b/block/io.c -index 3280144a17..cd7ba08768 100644 +index 0a8cbefe86..531b3b7a2d 100644 --- a/block/io.c +++ b/block/io.c -@@ -1794,6 +1794,10 @@ static int bdrv_pad_request(BlockDriverState *bs, +@@ -1734,6 +1734,10 @@ static int bdrv_pad_request(BlockDriverState *bs, { int ret; diff --git a/debian/patches/pve/0047-block-add-alloc-track-driver.patch b/debian/patches/pve/0048-block-add-alloc-track-driver.patch similarity index 99% rename from debian/patches/pve/0047-block-add-alloc-track-driver.patch rename to debian/patches/pve/0048-block-add-alloc-track-driver.patch index 1cf88ab..45c1c4d 100644 --- a/debian/patches/pve/0047-block-add-alloc-track-driver.patch +++ b/debian/patches/pve/0048-block-add-alloc-track-driver.patch @@ -389,7 +389,7 @@ index 0000000000..6b50fbe537 + +block_init(bdrv_alloc_track_init); diff --git a/block/meson.build b/block/meson.build -index f94cc0cd25..1716febb1d 100644 +index a26a69434e..74e5f49758 100644 --- a/block/meson.build +++ b/block/meson.build @@ -2,6 +2,7 @@ block_ss.add(genh) diff --git a/debian/patches/pve/0048-PVE-whitelist-invalid-QAPI-names-for-backwards-compa.patch b/debian/patches/pve/0049-PVE-whitelist-invalid-QAPI-names-for-backwards-compa.patch similarity index 95% rename from debian/patches/pve/0048-PVE-whitelist-invalid-QAPI-names-for-backwards-compa.patch rename to debian/patches/pve/0049-PVE-whitelist-invalid-QAPI-names-for-backwards-compa.patch index 0496b93..95f191f 100644 --- a/debian/patches/pve/0048-PVE-whitelist-invalid-QAPI-names-for-backwards-compa.patch +++ b/debian/patches/pve/0049-PVE-whitelist-invalid-QAPI-names-for-backwards-compa.patch @@ -10,7 +10,7 @@ Signed-off-by: Thomas Lamprecht 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/qapi/pragma.json b/qapi/pragma.json -index 41139d8645..a581acf7d4 100644 +index a2358e303a..9ff5c84ffd 100644 --- a/qapi/pragma.json +++ b/qapi/pragma.json @@ -15,6 +15,7 @@ @@ -21,7 +21,7 @@ index 41139d8645..a581acf7d4 100644 'migrate_cancel', 'netdev_add', 'netdev_del', -@@ -63,6 +64,8 @@ +@@ -64,6 +65,8 @@ 'SysEmuTarget', # query-cpu-fast, query-target 'UuidInfo', # query-uuid 'VncClientInfo', # query-vnc, query-vnc-servers, ... diff --git a/debian/patches/pve/0049-PVE-savevm-async-register-yank-before-migration_inco.patch b/debian/patches/pve/0050-PVE-savevm-async-register-yank-before-migration_inco.patch similarity index 90% rename from debian/patches/pve/0049-PVE-savevm-async-register-yank-before-migration_inco.patch rename to debian/patches/pve/0050-PVE-savevm-async-register-yank-before-migration_inco.patch index a9413ab..68622c2 100644 --- a/debian/patches/pve/0049-PVE-savevm-async-register-yank-before-migration_inco.patch +++ b/debian/patches/pve/0050-PVE-savevm-async-register-yank-before-migration_inco.patch @@ -11,10 +11,10 @@ Signed-off-by: Thomas Lamprecht 1 file changed, 5 insertions(+) diff --git a/migration/savevm-async.c b/migration/savevm-async.c -index 0bc5799cf8..10ebefef06 100644 +index e65a5e3482..2ed2536816 100644 --- a/migration/savevm-async.c +++ b/migration/savevm-async.c -@@ -19,6 +19,7 @@ +@@ -20,6 +20,7 @@ #include "qemu/timer.h" #include "qemu/main-loop.h" #include "qemu/rcu.h" @@ -22,7 +22,7 @@ index 0bc5799cf8..10ebefef06 100644 /* #define DEBUG_SAVEVM_STATE */ -@@ -586,6 +587,10 @@ int load_snapshot_from_blockdev(const char *filename, Error **errp) +@@ -514,6 +515,10 @@ int load_snapshot_from_blockdev(const char *filename, Error **errp) dirty_bitmap_mig_before_vm_start(); qemu_fclose(f); diff --git a/debian/patches/pve/0050-qemu-img-dd-add-l-option-for-loading-a-snapshot.patch b/debian/patches/pve/0051-qemu-img-dd-add-l-option-for-loading-a-snapshot.patch similarity index 91% rename from debian/patches/pve/0050-qemu-img-dd-add-l-option-for-loading-a-snapshot.patch rename to debian/patches/pve/0051-qemu-img-dd-add-l-option-for-loading-a-snapshot.patch index 9b7c51e..e5c467d 100644 --- a/debian/patches/pve/0050-qemu-img-dd-add-l-option-for-loading-a-snapshot.patch +++ b/debian/patches/pve/0051-qemu-img-dd-add-l-option-for-loading-a-snapshot.patch @@ -12,7 +12,7 @@ Signed-off-by: Thomas Lamprecht 3 files changed, 36 insertions(+), 7 deletions(-) diff --git a/docs/tools/qemu-img.rst b/docs/tools/qemu-img.rst -index 33979b7430..68e9c80788 100644 +index 699229eef6..4189ced8bc 100644 --- a/docs/tools/qemu-img.rst +++ b/docs/tools/qemu-img.rst @@ -492,10 +492,10 @@ Command description: @@ -46,10 +46,10 @@ index b5b0bb4467..36f97e1f19 100644 DEF("info", img_info, diff --git a/qemu-img.c b/qemu-img.c -index 35c2bdc95c..6e93bbd425 100644 +index c6b4a5567d..041c203fc3 100644 --- a/qemu-img.c +++ b/qemu-img.c -@@ -4938,6 +4938,7 @@ static int img_dd(int argc, char **argv) +@@ -4943,6 +4943,7 @@ static int img_dd(int argc, char **argv) BlockDriver *drv = NULL, *proto_drv = NULL; BlockBackend *blk1 = NULL, *blk2 = NULL; QemuOpts *opts = NULL; @@ -57,7 +57,7 @@ index 35c2bdc95c..6e93bbd425 100644 QemuOptsList *create_opts = NULL; Error *local_err = NULL; bool image_opts = false; -@@ -4947,6 +4948,7 @@ static int img_dd(int argc, char **argv) +@@ -4952,6 +4953,7 @@ static int img_dd(int argc, char **argv) int64_t size = 0, readsize = 0; int64_t block_count = 0, out_pos, in_pos; bool force_share = false, skip_create = false; @@ -65,7 +65,7 @@ index 35c2bdc95c..6e93bbd425 100644 struct DdInfo dd = { .flags = 0, .count = 0, -@@ -4984,7 +4986,7 @@ static int img_dd(int argc, char **argv) +@@ -4989,7 +4991,7 @@ static int img_dd(int argc, char **argv) { 0, 0, 0, 0 } }; @@ -74,7 +74,7 @@ index 35c2bdc95c..6e93bbd425 100644 if (c == EOF) { break; } -@@ -5007,6 +5009,19 @@ static int img_dd(int argc, char **argv) +@@ -5012,6 +5014,19 @@ static int img_dd(int argc, char **argv) case 'n': skip_create = true; break; @@ -94,7 +94,7 @@ index 35c2bdc95c..6e93bbd425 100644 case 'U': force_share = true; break; -@@ -5066,11 +5081,24 @@ static int img_dd(int argc, char **argv) +@@ -5071,11 +5086,24 @@ static int img_dd(int argc, char **argv) if (dd.flags & C_IF) { blk1 = img_open(image_opts, in.filename, fmt, 0, false, false, force_share); @@ -120,7 +120,7 @@ index 35c2bdc95c..6e93bbd425 100644 } if (dd.flags & C_OSIZE) { -@@ -5219,6 +5247,7 @@ static int img_dd(int argc, char **argv) +@@ -5230,6 +5258,7 @@ static int img_dd(int argc, char **argv) out: g_free(arg); qemu_opts_del(opts); diff --git a/debian/patches/pve/0051-vma-allow-partial-restore.patch b/debian/patches/pve/0052-vma-allow-partial-restore.patch similarity index 94% rename from debian/patches/pve/0051-vma-allow-partial-restore.patch rename to debian/patches/pve/0052-vma-allow-partial-restore.patch index ede4d67..f1fd7cb 100644 --- a/debian/patches/pve/0051-vma-allow-partial-restore.patch +++ b/debian/patches/pve/0052-vma-allow-partial-restore.patch @@ -24,10 +24,10 @@ Signed-off-by: Thomas Lamprecht 3 files changed, 126 insertions(+), 97 deletions(-) diff --git a/vma-reader.c b/vma-reader.c -index 4f4ee2b47b..844d95a5ba 100644 +index e65f1e8415..81a891c6b1 100644 --- a/vma-reader.c +++ b/vma-reader.c -@@ -29,6 +29,7 @@ typedef struct VmaRestoreState { +@@ -28,6 +28,7 @@ typedef struct VmaRestoreState { bool write_zeroes; unsigned long *bitmap; int bitmap_size; @@ -35,7 +35,7 @@ index 4f4ee2b47b..844d95a5ba 100644 } VmaRestoreState; struct VmaReader { -@@ -426,13 +427,14 @@ VmaDeviceInfo *vma_reader_get_device_info(VmaReader *vmar, guint8 dev_id) +@@ -425,13 +426,14 @@ VmaDeviceInfo *vma_reader_get_device_info(VmaReader *vmar, guint8 dev_id) } static void allocate_rstate(VmaReader *vmar, guint8 dev_id, @@ -51,7 +51,7 @@ index 4f4ee2b47b..844d95a5ba 100644 int64_t size = vmar->devinfo[dev_id].size; -@@ -447,28 +449,30 @@ static void allocate_rstate(VmaReader *vmar, guint8 dev_id, +@@ -446,28 +448,30 @@ static void allocate_rstate(VmaReader *vmar, guint8 dev_id, } int vma_reader_register_bs(VmaReader *vmar, guint8 dev_id, BlockBackend *target, @@ -99,7 +99,7 @@ index 4f4ee2b47b..844d95a5ba 100644 return 0; } -@@ -561,19 +565,23 @@ static int restore_extent(VmaReader *vmar, unsigned char *buf, +@@ -560,19 +564,23 @@ static int restore_extent(VmaReader *vmar, unsigned char *buf, VmaRestoreState *rstate = &vmar->rstate[dev_id]; BlockBackend *target = NULL; @@ -129,7 +129,7 @@ index 4f4ee2b47b..844d95a5ba 100644 max_sector = vmar->devinfo[dev_id].size/BDRV_SECTOR_SIZE; } else { -@@ -619,7 +627,7 @@ static int restore_extent(VmaReader *vmar, unsigned char *buf, +@@ -618,7 +626,7 @@ static int restore_extent(VmaReader *vmar, unsigned char *buf, return -1; } @@ -138,7 +138,7 @@ index 4f4ee2b47b..844d95a5ba 100644 int nb_sectors = end_sector - sector_num; if (restore_write_data(vmar, dev_id, target, vmstate_fd, buf + start, sector_num, nb_sectors, -@@ -655,7 +663,7 @@ static int restore_extent(VmaReader *vmar, unsigned char *buf, +@@ -654,7 +662,7 @@ static int restore_extent(VmaReader *vmar, unsigned char *buf, return -1; } @@ -147,7 +147,7 @@ index 4f4ee2b47b..844d95a5ba 100644 int nb_sectors = end_sector - sector_num; if (restore_write_data(vmar, dev_id, target, vmstate_fd, buf + start, sector_num, -@@ -680,7 +688,7 @@ static int restore_extent(VmaReader *vmar, unsigned char *buf, +@@ -679,7 +687,7 @@ static int restore_extent(VmaReader *vmar, unsigned char *buf, vmar->partial_zero_cluster_data += zero_size; } @@ -156,7 +156,7 @@ index 4f4ee2b47b..844d95a5ba 100644 if (restore_write_data(vmar, dev_id, target, vmstate_fd, zero_vma_block, sector_num, nb_sectors, errp) < 0) { -@@ -851,7 +859,7 @@ int vma_reader_verify(VmaReader *vmar, bool verbose, Error **errp) +@@ -850,7 +858,7 @@ int vma_reader_verify(VmaReader *vmar, bool verbose, Error **errp) for (dev_id = 1; dev_id < 255; dev_id++) { if (vma_reader_get_device_info(vmar, dev_id)) { @@ -166,10 +166,10 @@ index 4f4ee2b47b..844d95a5ba 100644 } diff --git a/vma.c b/vma.c -index 91612d50a2..e1a750ff50 100644 +index e8dffb43e0..e6e9ffc7fe 100644 --- a/vma.c +++ b/vma.c -@@ -139,6 +139,7 @@ typedef struct RestoreMap { +@@ -138,6 +138,7 @@ typedef struct RestoreMap { char *throttling_group; char *cache; bool write_zero; @@ -177,7 +177,7 @@ index 91612d50a2..e1a750ff50 100644 } RestoreMap; static bool try_parse_option(char **line, const char *optname, char **out, const char *inbuf) { -@@ -246,47 +247,61 @@ static int extract_content(int argc, char **argv) +@@ -245,47 +246,61 @@ static int extract_content(int argc, char **argv) char *bps = NULL; char *group = NULL; char *cache = NULL; @@ -265,7 +265,7 @@ index 91612d50a2..e1a750ff50 100644 if (!devname) { g_error("read map failed - no dev name specified ('%s')", inbuf); -@@ -300,6 +315,7 @@ static int extract_content(int argc, char **argv) +@@ -299,6 +314,7 @@ static int extract_content(int argc, char **argv) map->throttling_group = group; map->cache = cache; map->write_zero = write_zero; @@ -273,7 +273,7 @@ index 91612d50a2..e1a750ff50 100644 g_hash_table_insert(devmap, map->devname, map); -@@ -329,6 +345,7 @@ static int extract_content(int argc, char **argv) +@@ -328,6 +344,7 @@ static int extract_content(int argc, char **argv) const char *cache = NULL; int flags = BDRV_O_RDWR; bool write_zero = true; @@ -281,7 +281,7 @@ index 91612d50a2..e1a750ff50 100644 BlockBackend *blk = NULL; -@@ -344,6 +361,7 @@ static int extract_content(int argc, char **argv) +@@ -343,6 +360,7 @@ static int extract_content(int argc, char **argv) throttling_group = map->throttling_group; cache = map->cache; write_zero = map->write_zero; @@ -289,7 +289,7 @@ index 91612d50a2..e1a750ff50 100644 } else { devfn = g_strdup_printf("%s/tmp-disk-%s.raw", dirname, di->devname); -@@ -362,57 +380,60 @@ static int extract_content(int argc, char **argv) +@@ -361,57 +379,60 @@ static int extract_content(int argc, char **argv) write_zero = false; } diff --git a/debian/patches/pve/0052-pbs-namespace-support.patch b/debian/patches/pve/0053-pbs-namespace-support.patch similarity index 96% rename from debian/patches/pve/0052-pbs-namespace-support.patch rename to debian/patches/pve/0053-pbs-namespace-support.patch index 67bda69..dce468d 100644 --- a/debian/patches/pve/0052-pbs-namespace-support.patch +++ b/debian/patches/pve/0053-pbs-namespace-support.patch @@ -112,10 +112,10 @@ index c5eb4d5bad..7471e2ef9d 100644 static const char *const pbs_strong_runtime_opts[] = { diff --git a/pbs-restore.c b/pbs-restore.c -index 4d3f925a1b..62042bdd93 100644 +index 2f834cf42e..f03d9bab8d 100644 --- a/pbs-restore.c +++ b/pbs-restore.c -@@ -30,7 +30,7 @@ +@@ -29,7 +29,7 @@ static void help(void) { const char *help_msg = @@ -124,7 +124,7 @@ index 4d3f925a1b..62042bdd93 100644 ; printf("%s", help_msg); -@@ -78,6 +78,7 @@ int main(int argc, char **argv) +@@ -77,6 +77,7 @@ int main(int argc, char **argv) Error *main_loop_err = NULL; const char *format = "raw"; const char *repository = NULL; @@ -132,7 +132,7 @@ index 4d3f925a1b..62042bdd93 100644 const char *keyfile = NULL; int verbose = false; bool skip_zero = false; -@@ -91,6 +92,7 @@ int main(int argc, char **argv) +@@ -90,6 +91,7 @@ int main(int argc, char **argv) {"verbose", no_argument, 0, 'v'}, {"format", required_argument, 0, 'f'}, {"repository", required_argument, 0, 'r'}, @@ -140,7 +140,7 @@ index 4d3f925a1b..62042bdd93 100644 {"keyfile", required_argument, 0, 'k'}, {0, 0, 0, 0} }; -@@ -111,6 +113,9 @@ int main(int argc, char **argv) +@@ -110,6 +112,9 @@ int main(int argc, char **argv) case 'r': repository = g_strdup(argv[optind - 1]); break; @@ -150,7 +150,7 @@ index 4d3f925a1b..62042bdd93 100644 case 'k': keyfile = g_strdup(argv[optind - 1]); break; -@@ -161,8 +166,16 @@ int main(int argc, char **argv) +@@ -160,8 +165,16 @@ int main(int argc, char **argv) fprintf(stderr, "connecting to repository '%s'\n", repository); } char *pbs_error = NULL; @@ -202,10 +202,10 @@ index 9f6c04a512..f6a5f8c785 100644 backup_time, dump_cb_block_size, diff --git a/qapi/block-core.json b/qapi/block-core.json -index 13e03ca154..89875f309c 100644 +index fc8a125451..cc2ead0b75 100644 --- a/qapi/block-core.json +++ b/qapi/block-core.json -@@ -821,6 +821,8 @@ +@@ -817,6 +817,8 @@ # # @fingerprint: server cert fingerprint (optional for format 'pbs') # @@ -214,7 +214,7 @@ index 13e03ca154..89875f309c 100644 # @backup-id: backup ID (required for format 'pbs') # # @backup-time: backup timestamp (Unix epoch, required for format 'pbs') -@@ -840,6 +842,7 @@ +@@ -836,6 +838,7 @@ '*key-password': 'str', '*master-keyfile': 'str', '*fingerprint': 'str', @@ -222,7 +222,7 @@ index 13e03ca154..89875f309c 100644 '*backup-id': 'str', '*backup-time': 'int', '*use-dirty-bitmap': 'bool', -@@ -3256,7 +3259,7 @@ +@@ -3282,7 +3285,7 @@ { 'struct': 'BlockdevOptionsPbs', 'data': { 'repository': 'str', 'snapshot': 'str', 'archive': 'str', '*keyfile': 'str', '*password': 'str', '*fingerprint': 'str', diff --git a/debian/patches/pve/0053-Revert-block-rbd-workaround-for-ceph-issue-53784.patch b/debian/patches/pve/0054-Revert-block-rbd-workaround-for-ceph-issue-53784.patch similarity index 92% rename from debian/patches/pve/0053-Revert-block-rbd-workaround-for-ceph-issue-53784.patch rename to debian/patches/pve/0054-Revert-block-rbd-workaround-for-ceph-issue-53784.patch index 4fd82ac..9827983 100644 --- a/debian/patches/pve/0053-Revert-block-rbd-workaround-for-ceph-issue-53784.patch +++ b/debian/patches/pve/0054-Revert-block-rbd-workaround-for-ceph-issue-53784.patch @@ -12,10 +12,10 @@ Signed-off-by: Fabian Ebner 1 file changed, 2 insertions(+), 40 deletions(-) diff --git a/block/rbd.c b/block/rbd.c -index 0cec24c86d..0a9b97aa5e 100644 +index 64a8d7d48b..9fc6dcb957 100644 --- a/block/rbd.c +++ b/block/rbd.c -@@ -1324,7 +1324,6 @@ static int coroutine_fn qemu_rbd_co_block_status(BlockDriverState *bs, +@@ -1348,7 +1348,6 @@ static int coroutine_fn qemu_rbd_co_block_status(BlockDriverState *bs, int status, r; RBDDiffIterateReq req = { .offs = offset }; uint64_t features, flags; @@ -23,7 +23,7 @@ index 0cec24c86d..0a9b97aa5e 100644 assert(offset + bytes <= s->image_size); -@@ -1352,43 +1351,7 @@ static int coroutine_fn qemu_rbd_co_block_status(BlockDriverState *bs, +@@ -1376,43 +1375,7 @@ static int coroutine_fn qemu_rbd_co_block_status(BlockDriverState *bs, return status; } @@ -68,7 +68,7 @@ index 0cec24c86d..0a9b97aa5e 100644 qemu_rbd_diff_iterate_cb, &req); if (r < 0 && r != QEMU_RBD_EXIT_DIFF_ITERATE2) { return status; -@@ -1407,8 +1370,7 @@ static int coroutine_fn qemu_rbd_co_block_status(BlockDriverState *bs, +@@ -1431,8 +1394,7 @@ static int coroutine_fn qemu_rbd_co_block_status(BlockDriverState *bs, status = BDRV_BLOCK_ZERO | BDRV_BLOCK_OFFSET_VALID; } diff --git a/debian/patches/pve/0054-Revert-block-rbd-fix-handling-of-holes-in-.bdrv_co_b.patch b/debian/patches/pve/0055-Revert-block-rbd-fix-handling-of-holes-in-.bdrv_co_b.patch similarity index 90% rename from debian/patches/pve/0054-Revert-block-rbd-fix-handling-of-holes-in-.bdrv_co_b.patch rename to debian/patches/pve/0055-Revert-block-rbd-fix-handling-of-holes-in-.bdrv_co_b.patch index 6624c1d..6972373 100644 --- a/debian/patches/pve/0054-Revert-block-rbd-fix-handling-of-holes-in-.bdrv_co_b.patch +++ b/debian/patches/pve/0055-Revert-block-rbd-fix-handling-of-holes-in-.bdrv_co_b.patch @@ -13,10 +13,10 @@ Signed-off-by: Fabian Ebner 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/block/rbd.c b/block/rbd.c -index 0a9b97aa5e..1c585d23e9 100644 +index 9fc6dcb957..98f4ba2620 100644 --- a/block/rbd.c +++ b/block/rbd.c -@@ -1283,11 +1283,11 @@ static int qemu_rbd_diff_iterate_cb(uint64_t offs, size_t len, +@@ -1307,11 +1307,11 @@ static int qemu_rbd_diff_iterate_cb(uint64_t offs, size_t len, RBDDiffIterateReq *req = opaque; assert(req->offs + req->bytes <= offs); diff --git a/debian/patches/pve/0055-Revert-block-rbd-implement-bdrv_co_block_status.patch b/debian/patches/pve/0056-Revert-block-rbd-implement-bdrv_co_block_status.patch similarity index 97% rename from debian/patches/pve/0055-Revert-block-rbd-implement-bdrv_co_block_status.patch rename to debian/patches/pve/0056-Revert-block-rbd-implement-bdrv_co_block_status.patch index 13e71b7..f7025a3 100644 --- a/debian/patches/pve/0055-Revert-block-rbd-implement-bdrv_co_block_status.patch +++ b/debian/patches/pve/0056-Revert-block-rbd-implement-bdrv_co_block_status.patch @@ -23,7 +23,7 @@ Signed-off-by: Fabian Ebner 1 file changed, 112 deletions(-) diff --git a/block/rbd.c b/block/rbd.c -index 1c585d23e9..1704767041 100644 +index 98f4ba2620..efcbbe5949 100644 --- a/block/rbd.c +++ b/block/rbd.c @@ -97,12 +97,6 @@ typedef struct RBDTask { @@ -39,7 +39,7 @@ index 1c585d23e9..1704767041 100644 static int qemu_rbd_connect(rados_t *cluster, rados_ioctx_t *io_ctx, BlockdevOptionsRbd *opts, bool cache, const char *keypairs, const char *secretid, -@@ -1269,111 +1263,6 @@ static ImageInfoSpecific *qemu_rbd_get_specific_info(BlockDriverState *bs, +@@ -1293,111 +1287,6 @@ static ImageInfoSpecific *qemu_rbd_get_specific_info(BlockDriverState *bs, return spec_info; } @@ -151,7 +151,7 @@ index 1c585d23e9..1704767041 100644 static int64_t qemu_rbd_getlength(BlockDriverState *bs) { BDRVRBDState *s = bs->opaque; -@@ -1609,7 +1498,6 @@ static BlockDriver bdrv_rbd = { +@@ -1633,7 +1522,6 @@ static BlockDriver bdrv_rbd = { #ifdef LIBRBD_SUPPORTS_WRITE_ZEROES .bdrv_co_pwrite_zeroes = qemu_rbd_co_pwrite_zeroes, #endif diff --git a/debian/patches/pve/0056-PVE-Backup-create-jobs-correctly-cancel-in-error-sce.patch b/debian/patches/pve/0057-PVE-Backup-create-jobs-correctly-cancel-in-error-sce.patch similarity index 100% rename from debian/patches/pve/0056-PVE-Backup-create-jobs-correctly-cancel-in-error-sce.patch rename to debian/patches/pve/0057-PVE-Backup-create-jobs-correctly-cancel-in-error-sce.patch diff --git a/debian/patches/pve/0057-PVE-Backup-ensure-jobs-in-di_list-are-referenced.patch b/debian/patches/pve/0058-PVE-Backup-ensure-jobs-in-di_list-are-referenced.patch similarity index 100% rename from debian/patches/pve/0057-PVE-Backup-ensure-jobs-in-di_list-are-referenced.patch rename to debian/patches/pve/0058-PVE-Backup-ensure-jobs-in-di_list-are-referenced.patch diff --git a/debian/patches/pve/0058-PVE-Backup-avoid-segfault-issues-upon-backup-cancel.patch b/debian/patches/pve/0059-PVE-Backup-avoid-segfault-issues-upon-backup-cancel.patch similarity index 100% rename from debian/patches/pve/0058-PVE-Backup-avoid-segfault-issues-upon-backup-cancel.patch rename to debian/patches/pve/0059-PVE-Backup-avoid-segfault-issues-upon-backup-cancel.patch diff --git a/debian/patches/pve/0059-vma-create-support-64KiB-unaligned-input-images.patch b/debian/patches/pve/0060-vma-create-support-64KiB-unaligned-input-images.patch similarity index 92% rename from debian/patches/pve/0059-vma-create-support-64KiB-unaligned-input-images.patch rename to debian/patches/pve/0060-vma-create-support-64KiB-unaligned-input-images.patch index 3097cf6..ffa8d0e 100644 --- a/debian/patches/pve/0059-vma-create-support-64KiB-unaligned-input-images.patch +++ b/debian/patches/pve/0060-vma-create-support-64KiB-unaligned-input-images.patch @@ -25,10 +25,10 @@ Signed-off-by: Fabian Ebner 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/vma.c b/vma.c -index e1a750ff50..b1137e27a7 100644 +index e6e9ffc7fe..304f02bc84 100644 --- a/vma.c +++ b/vma.c -@@ -549,7 +549,7 @@ static void coroutine_fn backup_run(void *opaque) +@@ -548,7 +548,7 @@ static void coroutine_fn backup_run(void *opaque) struct iovec iov; QEMUIOVector qiov; @@ -37,7 +37,7 @@ index e1a750ff50..b1137e27a7 100644 int ret = 0; unsigned char *buf = blk_blockalign(job->target, VMA_CLUSTER_SIZE); -@@ -563,8 +563,16 @@ static void coroutine_fn backup_run(void *opaque) +@@ -562,8 +562,16 @@ static void coroutine_fn backup_run(void *opaque) iov.iov_len = VMA_CLUSTER_SIZE; qemu_iovec_init_external(&qiov, &iov, 1); diff --git a/debian/patches/pve/0060-vma-create-avoid-triggering-assertion-in-error-case.patch b/debian/patches/pve/0061-vma-create-avoid-triggering-assertion-in-error-case.patch similarity index 100% rename from debian/patches/pve/0060-vma-create-avoid-triggering-assertion-in-error-case.patch rename to debian/patches/pve/0061-vma-create-avoid-triggering-assertion-in-error-case.patch diff --git a/debian/patches/pve/0061-block-alloc-track-avoid-premature-break.patch b/debian/patches/pve/0062-block-alloc-track-avoid-premature-break.patch similarity index 100% rename from debian/patches/pve/0061-block-alloc-track-avoid-premature-break.patch rename to debian/patches/pve/0062-block-alloc-track-avoid-premature-break.patch diff --git a/debian/patches/pve/0062-PVE-Backup-allow-passing-max-workers-performance-set.patch b/debian/patches/pve/0063-PVE-Backup-allow-passing-max-workers-performance-set.patch similarity index 98% rename from debian/patches/pve/0062-PVE-Backup-allow-passing-max-workers-performance-set.patch rename to debian/patches/pve/0063-PVE-Backup-allow-passing-max-workers-performance-set.patch index 08df987..a20a383 100644 --- a/debian/patches/pve/0062-PVE-Backup-allow-passing-max-workers-performance-set.patch +++ b/debian/patches/pve/0063-PVE-Backup-allow-passing-max-workers-performance-set.patch @@ -109,10 +109,10 @@ index 2e22030eec..e9aa7e0f49 100644 return ret; } diff --git a/qapi/block-core.json b/qapi/block-core.json -index 89875f309c..43281aca79 100644 +index cc2ead0b75..e3f62faa81 100644 --- a/qapi/block-core.json +++ b/qapi/block-core.json -@@ -833,6 +833,8 @@ +@@ -829,6 +829,8 @@ # # @encrypt: use encryption ((optional for format 'pbs', defaults to true if there is a keyfile) # @@ -121,7 +121,7 @@ index 89875f309c..43281aca79 100644 # Returns: the uuid of the backup job # ## -@@ -851,7 +853,9 @@ +@@ -847,7 +849,9 @@ '*format': 'BackupFormat', '*config-file': 'str', '*firewall-file': 'str', @@ -132,7 +132,7 @@ index 89875f309c..43281aca79 100644 'returns': 'UuidInfo', 'coroutine': true } ## -@@ -906,7 +910,8 @@ +@@ -902,7 +906,8 @@ 'pbs-dirty-bitmap-savevm': 'bool', 'pbs-dirty-bitmap-migration': 'bool', 'pbs-masterkey': 'bool', diff --git a/debian/patches/series b/debian/patches/series index 8745fcc..b45710f 100644 --- a/debian/patches/series +++ b/debian/patches/series @@ -1,24 +1,4 @@ extra/0001-monitor-qmp-fix-race-with-clients-disconnecting-earl.patch -extra/0002-block-gluster-correctly-set-max_pdiscard.patch -extra/0003-block-vmdk-Fix-reopening-bs-file.patch -extra/0004-linux-aio-fix-unbalanced-plugged-counter-in-laio_io_.patch -extra/0005-pci-fix-overflow-in-snprintf-string-formatting.patch -extra/0006-target-i386-kvm-Fix-disabling-MPX-on-cpu-host-with-M.patch -extra/0007-coroutine-ucontext-use-QEMU_DEFINE_STATIC_CO_TLS.patch -extra/0008-coroutine-use-QEMU_DEFINE_STATIC_CO_TLS.patch -extra/0009-coroutine-Rename-qemu_coroutine_inc-dec_pool_size.patch -extra/0010-coroutine-Revert-to-constant-batch-size.patch -extra/0011-target-i386-do-not-consult-nonexistent-host-leaves.patch -extra/0012-virtio-scsi-fix-ctrl-and-event-handler-functions-in-.patch -extra/0013-virtio-scsi-don-t-waste-CPU-polling-the-event-virtqu.patch -extra/0014-vhost-Track-descriptor-chain-in-private-at-SVQ.patch -extra/0015-vhost-Fix-device-s-used-descriptor-dequeue.patch -extra/0016-vdpa-Fix-bad-index-calculus-at-vhost_vdpa_get_vring_.patch -extra/0017-vdpa-Fix-index-calculus-at-vhost_vdpa_svqs_start.patch -extra/0018-hw-virtio-Replace-g_memdup-by-g_memdup2.patch -extra/0019-vhost-Fix-element-in-vhost_svq_add-failure.patch -extra/0020-io_uring-fix-short-read-slow-path.patch -extra/0021-e1000-set-RX-descriptor-status-in-a-separate-operati.patch bitmap-mirror/0001-drive-mirror-add-support-for-sync-bitmap-mode-never.patch bitmap-mirror/0002-drive-mirror-add-support-for-conditional-and-always-.patch bitmap-mirror/0003-mirror-add-check-for-bitmap-mode-without-bitmap.patch @@ -40,50 +20,51 @@ pve/0012-PVE-Up-qemu-img-dd-add-n-skip_create.patch pve/0013-PVE-virtio-balloon-improve-query-balloon.patch pve/0014-PVE-qapi-modify-query-machines.patch pve/0015-PVE-qapi-modify-spice-query.patch -pve/0016-PVE-add-savevm-async-for-background-state-snapshots.patch -pve/0017-PVE-add-optional-buffer-size-to-QEMUFile.patch -pve/0018-PVE-block-add-the-zeroinit-block-driver-filter.patch -pve/0019-PVE-Add-dummy-id-command-line-parameter.patch -pve/0020-PVE-Config-Revert-target-i386-disable-LINT0-after-re.patch -pve/0021-PVE-Up-Config-file-posix-make-locking-optiono-on-cre.patch -pve/0022-PVE-monitor-disable-oob-capability.patch -pve/0023-PVE-Compat-4.0-used-balloon-qemu-4-0-config-size-fal.patch -pve/0024-PVE-Allow-version-code-in-machine-type.patch -pve/0025-block-backup-move-bcs-bitmap-initialization-to-job-c.patch -pve/0026-PVE-Backup-add-vma-backup-format-code.patch -pve/0027-PVE-Backup-add-backup-dump-block-driver.patch -pve/0028-PVE-Backup-proxmox-backup-patches-for-qemu.patch -pve/0029-PVE-Backup-pbs-restore-new-command-to-restore-from-p.patch -pve/0030-PVE-Backup-Add-dirty-bitmap-tracking-for-incremental.patch -pve/0031-PVE-various-PBS-fixes.patch -pve/0032-PVE-Add-PBS-block-driver-to-map-backup-archives-into.patch -pve/0033-PVE-add-query_proxmox_support-QMP-command.patch -pve/0034-PVE-add-query-pbs-bitmap-info-QMP-call.patch -pve/0035-PVE-redirect-stderr-to-journal-when-daemonized.patch -pve/0036-PVE-Add-sequential-job-transaction-support.patch -pve/0037-PVE-Backup-Use-a-transaction-to-synchronize-job-stat.patch -pve/0038-PVE-Backup-Don-t-block-on-finishing-and-cleanup-crea.patch -pve/0039-PVE-Migrate-dirty-bitmap-state-via-savevm.patch -pve/0040-migration-block-dirty-bitmap-migrate-other-bitmaps-e.patch -pve/0041-PVE-fall-back-to-open-iscsi-initiatorname.patch -pve/0042-PVE-Use-coroutine-QMP-for-backup-cancel_backup.patch -pve/0043-PBS-add-master-key-support.patch -pve/0044-PVE-block-pbs-fast-path-reads-without-allocation-if-.patch -pve/0045-PVE-block-stream-increase-chunk-size.patch -pve/0046-block-io-accept-NULL-qiov-in-bdrv_pad_request.patch -pve/0047-block-add-alloc-track-driver.patch -pve/0048-PVE-whitelist-invalid-QAPI-names-for-backwards-compa.patch -pve/0049-PVE-savevm-async-register-yank-before-migration_inco.patch -pve/0050-qemu-img-dd-add-l-option-for-loading-a-snapshot.patch -pve/0051-vma-allow-partial-restore.patch -pve/0052-pbs-namespace-support.patch -pve/0053-Revert-block-rbd-workaround-for-ceph-issue-53784.patch -pve/0054-Revert-block-rbd-fix-handling-of-holes-in-.bdrv_co_b.patch -pve/0055-Revert-block-rbd-implement-bdrv_co_block_status.patch -pve/0056-PVE-Backup-create-jobs-correctly-cancel-in-error-sce.patch -pve/0057-PVE-Backup-ensure-jobs-in-di_list-are-referenced.patch -pve/0058-PVE-Backup-avoid-segfault-issues-upon-backup-cancel.patch -pve/0059-vma-create-support-64KiB-unaligned-input-images.patch -pve/0060-vma-create-avoid-triggering-assertion-in-error-case.patch -pve/0061-block-alloc-track-avoid-premature-break.patch -pve/0062-PVE-Backup-allow-passing-max-workers-performance-set.patch +pve/0016-PVE-add-IOChannel-implementation-for-savevm-async.patch +pve/0017-PVE-add-savevm-async-for-background-state-snapshots.patch +pve/0018-PVE-add-optional-buffer-size-to-QEMUFile.patch +pve/0019-PVE-block-add-the-zeroinit-block-driver-filter.patch +pve/0020-PVE-Add-dummy-id-command-line-parameter.patch +pve/0021-PVE-Config-Revert-target-i386-disable-LINT0-after-re.patch +pve/0022-PVE-Up-Config-file-posix-make-locking-optiono-on-cre.patch +pve/0023-PVE-monitor-disable-oob-capability.patch +pve/0024-PVE-Compat-4.0-used-balloon-qemu-4-0-config-size-fal.patch +pve/0025-PVE-Allow-version-code-in-machine-type.patch +pve/0026-block-backup-move-bcs-bitmap-initialization-to-job-c.patch +pve/0027-PVE-Backup-add-vma-backup-format-code.patch +pve/0028-PVE-Backup-add-backup-dump-block-driver.patch +pve/0029-PVE-Backup-proxmox-backup-patches-for-qemu.patch +pve/0030-PVE-Backup-pbs-restore-new-command-to-restore-from-p.patch +pve/0031-PVE-Backup-Add-dirty-bitmap-tracking-for-incremental.patch +pve/0032-PVE-various-PBS-fixes.patch +pve/0033-PVE-Add-PBS-block-driver-to-map-backup-archives-into.patch +pve/0034-PVE-add-query_proxmox_support-QMP-command.patch +pve/0035-PVE-add-query-pbs-bitmap-info-QMP-call.patch +pve/0036-PVE-redirect-stderr-to-journal-when-daemonized.patch +pve/0037-PVE-Add-sequential-job-transaction-support.patch +pve/0038-PVE-Backup-Use-a-transaction-to-synchronize-job-stat.patch +pve/0039-PVE-Backup-Don-t-block-on-finishing-and-cleanup-crea.patch +pve/0040-PVE-Migrate-dirty-bitmap-state-via-savevm.patch +pve/0041-migration-block-dirty-bitmap-migrate-other-bitmaps-e.patch +pve/0042-PVE-fall-back-to-open-iscsi-initiatorname.patch +pve/0043-PVE-Use-coroutine-QMP-for-backup-cancel_backup.patch +pve/0044-PBS-add-master-key-support.patch +pve/0045-PVE-block-pbs-fast-path-reads-without-allocation-if-.patch +pve/0046-PVE-block-stream-increase-chunk-size.patch +pve/0047-block-io-accept-NULL-qiov-in-bdrv_pad_request.patch +pve/0048-block-add-alloc-track-driver.patch +pve/0049-PVE-whitelist-invalid-QAPI-names-for-backwards-compa.patch +pve/0050-PVE-savevm-async-register-yank-before-migration_inco.patch +pve/0051-qemu-img-dd-add-l-option-for-loading-a-snapshot.patch +pve/0052-vma-allow-partial-restore.patch +pve/0053-pbs-namespace-support.patch +pve/0054-Revert-block-rbd-workaround-for-ceph-issue-53784.patch +pve/0055-Revert-block-rbd-fix-handling-of-holes-in-.bdrv_co_b.patch +pve/0056-Revert-block-rbd-implement-bdrv_co_block_status.patch +pve/0057-PVE-Backup-create-jobs-correctly-cancel-in-error-sce.patch +pve/0058-PVE-Backup-ensure-jobs-in-di_list-are-referenced.patch +pve/0059-PVE-Backup-avoid-segfault-issues-upon-backup-cancel.patch +pve/0060-vma-create-support-64KiB-unaligned-input-images.patch +pve/0061-vma-create-avoid-triggering-assertion-in-error-case.patch +pve/0062-block-alloc-track-avoid-premature-break.patch +pve/0063-PVE-Backup-allow-passing-max-workers-performance-set.patch diff --git a/qemu b/qemu index 823a3f1..621da77 160000 --- a/qemu +++ b/qemu @@ -1 +1 @@ -Subproject commit 823a3f11fb8f04c3c3cc0f95f968fef1bfc6534f +Subproject commit 621da7789083b80d6f1ff1c0fb499334007b4f51 -- 2.39.2