From 10e1093325de638db2b0f24c9a15363b5d81e644 Mon Sep 17 00:00:00 2001 From: Fiona Ebner Date: Tue, 17 Oct 2023 14:10:09 +0200 Subject: [PATCH] update submodule and patches to QEMU 8.1.2 Bigger notable changes: * Commit 1a30b0f5d7 ("block: .bdrv_open is non-coroutine and unlocked") broke the PVE backup patches, in particular setting up the backup dump block driver, because bdrv_new_open_driver() cannot be called from a coroutine. To fix it, bdrv_co_open() is used instead, and while it's a much more involved function, the result should be essentially the same. The only difference I noticed is that the BDRV_O_ALLOW_RDWR flag is also set in the resulting bds (block driver state), but that shouldn't hurt. Smaller notable changes: * aio_set_fd_handler() dropped its 'is_external' parameter stating that all callers now pass false in 60f782b6b7 ("aio: remove aio_disable_external() API"). The calls in the PVE patches also passed false, so just drop the parameter too. * global_state_store() does not have a return value anymore, so the user in the PVE savevm-async patch was adapted. For context, see c33f1829f8 ("migration: never fail in global_state_store()"). * Renames affecting the PVE savevm-async patch: migrate_use_block() -> migrate_block() and ram_counters -> mig_stats 9d4b1e5f22 ("migration: Move migrate_use_block() to options.c") aff3f6606d ("migration: Rename ram_counters to mig_stats") Signed-off-by: Fiona Ebner Signed-off-by: Thomas Lamprecht --- ...d-support-for-sync-bitmap-mode-never.patch | 124 ++++++++--------- ...-support-for-conditional-and-always-.patch | 10 +- ...check-for-bitmap-mode-without-bitmap.patch | 4 +- ...-to-bdrv_dirty_bitmap_merge_internal.patch | 6 +- .../0006-mirror-move-some-checks-to-qmp.patch | 8 +- ...race-with-clients-disconnecting-earl.patch | 22 +-- ...as-Internal-cdbs-have-16-byte-length.patch | 10 +- ...ial-deadlock-when-draining-during-tr.patch | 10 +- ...irty-bitmap-fix-loading-bitmap-when.patch} | 2 +- ...hen-getting-cursor-without-a-console.patch | 36 ----- ...el-async-DMA-operation-before-reset.patch} | 4 +- ...-memory-prevent-dma-reentracy-issues.patch | 130 ------------------ ...le-reentrancy-detection-for-script-R.patch | 39 ------ ...-disable-reentrancy-detection-for-io.patch | 37 ----- ...sable-reentrancy-detection-for-iomem.patch | 35 ----- ...le-reentrancy-detection-for-apic-msi.patch | 36 ----- .../extra/0011-vhost-fix-the-fd-leak.patch | 29 ---- ...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 | 4 +- ...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 | 12 +- ...E-Up-qemu-img-dd-add-isize-parameter.patch | 14 +- ...PVE-Up-qemu-img-dd-add-n-skip_create.patch | 10 +- ...-add-l-option-for-loading-a-snapshot.patch | 14 +- ...virtio-balloon-improve-query-balloon.patch | 12 +- .../0014-PVE-qapi-modify-query-machines.patch | 12 +- .../0015-PVE-qapi-modify-spice-query.patch | 4 +- ...nnel-implementation-for-savevm-async.patch | 8 +- ...async-for-background-state-snapshots.patch | 58 ++++---- ...add-optional-buffer-size-to-QEMUFile.patch | 44 +++--- ...add-the-zeroinit-block-driver-filter.patch | 10 +- ...-Add-dummy-id-command-line-parameter.patch | 10 +- ...le-posix-make-locking-optiono-on-cre.patch | 18 +-- ...3-PVE-monitor-disable-oob-capability.patch | 4 +- ...sed-balloon-qemu-4-0-config-size-fal.patch | 4 +- ...E-Allow-version-code-in-machine-type.patch | 22 +-- ...VE-Backup-add-vma-backup-format-code.patch | 22 +-- ...-Backup-add-backup-dump-block-driver.patch | 4 +- ...ckup-Proxmox-backup-patches-for-QEMU.patch | 127 ++++++++++++----- ...estore-new-command-to-restore-from-p.patch | 4 +- ...k-driver-to-map-backup-archives-into.patch | 54 ++++---- ...ct-stderr-to-journal-when-daemonized.patch | 12 +- ...igrate-dirty-bitmap-state-via-savevm.patch | 23 ++-- ...dirty-bitmap-migrate-other-bitmaps-e.patch | 4 +- ...all-back-to-open-iscsi-initiatorname.patch | 4 +- ...PVE-block-stream-increase-chunk-size.patch | 2 +- ...accept-NULL-qiov-in-bdrv_pad_request.patch | 14 +- .../0039-block-add-alloc-track-driver.patch | 2 +- ...apshots-hold-the-BQL-during-setup-ca.patch | 24 ++-- ...vm-async-don-t-hold-BQL-during-setup.patch | 4 +- debian/patches/series | 11 +- qemu | 2 +- 54 files changed, 411 insertions(+), 720 deletions(-) rename debian/patches/extra/{0010-migration-block-dirty-bitmap-fix-loading-bitmap-when.patch => 0004-migration-block-dirty-bitmap-fix-loading-bitmap-when.patch} (98%) delete mode 100644 debian/patches/extra/0004-ui-return-NULL-when-getting-cursor-without-a-console.patch rename debian/patches/extra/{0012-hw-ide-reset-cancel-async-DMA-operation-before-reset.patch => 0005-hw-ide-reset-cancel-async-DMA-operation-before-reset.patch} (97%) delete mode 100644 debian/patches/extra/0005-memory-prevent-dma-reentracy-issues.patch delete mode 100644 debian/patches/extra/0006-lsi53c895a-disable-reentrancy-detection-for-script-R.patch delete mode 100644 debian/patches/extra/0007-bcm2835_property-disable-reentrancy-detection-for-io.patch delete mode 100644 debian/patches/extra/0008-raven-disable-reentrancy-detection-for-iomem.patch delete mode 100644 debian/patches/extra/0009-apic-disable-reentrancy-detection-for-apic-msi.patch delete mode 100644 debian/patches/extra/0011-vhost-fix-the-fd-leak.patch 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 4d9b8b9..c0cb23f 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 @@ -27,18 +27,18 @@ Signed-off-by: Ma Haocong Signed-off-by: John Snow Signed-off-by: Fabian Grünbichler Signed-off-by: Thomas Lamprecht -[FE: rebased for 8.0] +[FE: rebased for 8.1.1] Signed-off-by: Fiona Ebner --- block/mirror.c | 98 +++++++++++++++++++++----- blockdev.c | 38 +++++++++- include/block/block_int-global-state.h | 4 +- - qapi/block-core.json | 29 ++++++-- + qapi/block-core.json | 25 ++++++- tests/unit/test-block-iothread.c | 4 +- - 5 files changed, 144 insertions(+), 29 deletions(-) + 5 files changed, 142 insertions(+), 27 deletions(-) diff --git a/block/mirror.c b/block/mirror.c -index 663e2b7002..9099c75992 100644 +index d3cacd1708..1ff42c8af1 100644 --- a/block/mirror.c +++ b/block/mirror.c @@ -51,7 +51,7 @@ typedef struct MirrorBlockJob { @@ -59,7 +59,7 @@ index 663e2b7002..9099c75992 100644 BdrvDirtyBitmap *dirty_bitmap; BdrvDirtyBitmapIter *dbi; uint8_t *buf; -@@ -703,7 +705,8 @@ static int mirror_exit_common(Job *job) +@@ -705,7 +707,8 @@ static int mirror_exit_common(Job *job) bdrv_child_refresh_perms(mirror_top_bs, mirror_top_bs->backing, &error_abort); if (!abort && s->backing_mode == MIRROR_SOURCE_BACKING_CHAIN) { @@ -69,7 +69,7 @@ index 663e2b7002..9099c75992 100644 BlockDriverState *unfiltered_target = bdrv_skip_filters(target_bs); if (bdrv_cow_bs(unfiltered_target) != backing) { -@@ -801,6 +804,16 @@ static void mirror_abort(Job *job) +@@ -809,6 +812,16 @@ static void mirror_abort(Job *job) assert(ret == 0); } @@ -86,7 +86,7 @@ index 663e2b7002..9099c75992 100644 static void coroutine_fn mirror_throttle(MirrorBlockJob *s) { int64_t now = qemu_clock_get_ns(QEMU_CLOCK_REALTIME); -@@ -987,7 +1000,8 @@ static int coroutine_fn mirror_run(Job *job, Error **errp) +@@ -997,7 +1010,8 @@ static int coroutine_fn mirror_run(Job *job, Error **errp) mirror_free_init(s); s->last_pause_ns = qemu_clock_get_ns(QEMU_CLOCK_REALTIME); @@ -96,7 +96,7 @@ index 663e2b7002..9099c75992 100644 ret = mirror_dirty_init(s); if (ret < 0 || job_is_cancelled(&s->common.job)) { goto immediate_exit; -@@ -1240,6 +1254,7 @@ static const BlockJobDriver mirror_job_driver = { +@@ -1251,6 +1265,7 @@ static const BlockJobDriver mirror_job_driver = { .run = mirror_run, .prepare = mirror_prepare, .abort = mirror_abort, @@ -104,7 +104,7 @@ index 663e2b7002..9099c75992 100644 .pause = mirror_pause, .complete = mirror_complete, .cancel = mirror_cancel, -@@ -1256,6 +1271,7 @@ static const BlockJobDriver commit_active_job_driver = { +@@ -1267,6 +1282,7 @@ static const BlockJobDriver commit_active_job_driver = { .run = mirror_run, .prepare = mirror_prepare, .abort = mirror_abort, @@ -112,7 +112,7 @@ index 663e2b7002..9099c75992 100644 .pause = mirror_pause, .complete = mirror_complete, .cancel = commit_active_cancel, -@@ -1647,7 +1663,10 @@ static BlockJob *mirror_start_job( +@@ -1658,7 +1674,10 @@ static BlockJob *mirror_start_job( BlockCompletionFunc *cb, void *opaque, const BlockJobDriver *driver, @@ -124,7 +124,7 @@ index 663e2b7002..9099c75992 100644 bool auto_complete, const char *filter_node_name, bool is_mirror, MirrorCopyMode copy_mode, Error **errp) -@@ -1659,10 +1678,39 @@ static BlockJob *mirror_start_job( +@@ -1670,10 +1689,39 @@ static BlockJob *mirror_start_job( uint64_t target_perms, target_shared_perms; int ret; @@ -166,7 +166,7 @@ index 663e2b7002..9099c75992 100644 assert(is_power_of_2(granularity)); if (buf_size < 0) { -@@ -1793,7 +1841,9 @@ static BlockJob *mirror_start_job( +@@ -1804,7 +1852,9 @@ static BlockJob *mirror_start_job( s->replaces = g_strdup(replaces); s->on_source_error = on_source_error; s->on_target_error = on_target_error; @@ -177,7 +177,7 @@ index 663e2b7002..9099c75992 100644 s->backing_mode = backing_mode; s->zero_target = zero_target; s->copy_mode = copy_mode; -@@ -1814,6 +1864,18 @@ static BlockJob *mirror_start_job( +@@ -1825,6 +1875,18 @@ static BlockJob *mirror_start_job( bdrv_disable_dirty_bitmap(s->dirty_bitmap); } @@ -196,7 +196,7 @@ index 663e2b7002..9099c75992 100644 ret = block_job_add_bdrv(&s->common, "source", bs, 0, BLK_PERM_WRITE_UNCHANGED | BLK_PERM_WRITE | BLK_PERM_CONSISTENT_READ, -@@ -1891,6 +1953,9 @@ fail: +@@ -1902,6 +1964,9 @@ fail: if (s->dirty_bitmap) { bdrv_release_dirty_bitmap(s->dirty_bitmap); } @@ -206,7 +206,7 @@ index 663e2b7002..9099c75992 100644 job_early_fail(&s->common.job); } -@@ -1908,31 +1973,25 @@ void mirror_start(const char *job_id, BlockDriverState *bs, +@@ -1919,31 +1984,25 @@ 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, @@ -243,7 +243,7 @@ index 663e2b7002..9099c75992 100644 } BlockJob *commit_active_start(const char *job_id, BlockDriverState *bs, -@@ -1959,7 +2018,8 @@ BlockJob *commit_active_start(const char *job_id, BlockDriverState *bs, +@@ -1970,7 +2029,8 @@ BlockJob *commit_active_start(const char *job_id, BlockDriverState *bs, job_id, bs, creation_flags, base, NULL, speed, 0, 0, MIRROR_LEAVE_BACKING_CHAIN, false, on_error, on_error, true, cb, opaque, @@ -254,10 +254,10 @@ index 663e2b7002..9099c75992 100644 errp); if (!job) { diff --git a/blockdev.c b/blockdev.c -index e464daea58..50e4a9c682 100644 +index e6eba61484..a8b1fd2a73 100644 --- a/blockdev.c +++ b/blockdev.c -@@ -2942,6 +2942,9 @@ static void blockdev_mirror_common(const char *job_id, BlockDriverState *bs, +@@ -2848,6 +2848,9 @@ static void blockdev_mirror_common(const char *job_id, BlockDriverState *bs, BlockDriverState *target, const char *replaces, enum MirrorSyncMode sync, @@ -267,15 +267,15 @@ index e464daea58..50e4a9c682 100644 BlockMirrorBackingMode backing_mode, bool zero_target, bool has_speed, int64_t speed, -@@ -2960,6 +2963,7 @@ static void blockdev_mirror_common(const char *job_id, BlockDriverState *bs, +@@ -2866,6 +2869,7 @@ static void blockdev_mirror_common(const char *job_id, BlockDriverState *bs, { BlockDriverState *unfiltered_bs; int job_flags = JOB_DEFAULT; + BdrvDirtyBitmap *bitmap = NULL; - if (!has_speed) { - speed = 0; -@@ -3011,6 +3015,29 @@ static void blockdev_mirror_common(const char *job_id, BlockDriverState *bs, + GLOBAL_STATE_CODE(); + GRAPH_RDLOCK_GUARD_MAINLOOP(); +@@ -2920,6 +2924,29 @@ static void blockdev_mirror_common(const char *job_id, BlockDriverState *bs, sync = MIRROR_SYNC_MODE_FULL; } @@ -305,7 +305,7 @@ index e464daea58..50e4a9c682 100644 if (!replaces) { /* We want to mirror from @bs, but keep implicit filters on top */ unfiltered_bs = bdrv_skip_implicit_filters(bs); -@@ -3056,8 +3083,8 @@ static void blockdev_mirror_common(const char *job_id, BlockDriverState *bs, +@@ -2965,8 +2992,8 @@ static void blockdev_mirror_common(const char *job_id, BlockDriverState *bs, * and will allow to check whether the node still exist at mirror completion */ mirror_start(job_id, bs, target, @@ -316,7 +316,7 @@ index e464daea58..50e4a9c682 100644 on_source_error, on_target_error, unmap, filter_node_name, copy_mode, errp); } -@@ -3202,6 +3229,8 @@ void qmp_drive_mirror(DriveMirror *arg, Error **errp) +@@ -3114,6 +3141,8 @@ void qmp_drive_mirror(DriveMirror *arg, Error **errp) blockdev_mirror_common(arg->job_id, bs, target_bs, arg->replaces, arg->sync, @@ -325,7 +325,7 @@ index e464daea58..50e4a9c682 100644 backing_mode, zero_target, arg->has_speed, arg->speed, arg->has_granularity, arg->granularity, -@@ -3223,6 +3252,8 @@ void qmp_blockdev_mirror(const char *job_id, +@@ -3135,6 +3164,8 @@ void qmp_blockdev_mirror(const char *job_id, const char *device, const char *target, const char *replaces, MirrorSyncMode sync, @@ -334,7 +334,7 @@ index e464daea58..50e4a9c682 100644 bool has_speed, int64_t speed, bool has_granularity, uint32_t granularity, bool has_buf_size, int64_t buf_size, -@@ -3271,7 +3302,8 @@ void qmp_blockdev_mirror(const char *job_id, +@@ -3183,7 +3214,8 @@ void qmp_blockdev_mirror(const char *job_id, } blockdev_mirror_common(job_id, bs, target_bs, @@ -345,7 +345,7 @@ index e464daea58..50e4a9c682 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 902406eb99..d559be928c 100644 +index da5fb31089..32f0f9858a 100644 --- a/include/block/block_int-global-state.h +++ b/include/block/block_int-global-state.h @@ -152,7 +152,9 @@ void mirror_start(const char *job_id, BlockDriverState *bs, @@ -360,31 +360,26 @@ index 902406eb99..d559be928c 100644 BlockdevOnError on_source_error, BlockdevOnError on_target_error, diff --git a/qapi/block-core.json b/qapi/block-core.json -index c05ad0c07e..3c945c1f93 100644 +index 2b1d493d6e..903392cb8f 100644 --- a/qapi/block-core.json +++ b/qapi/block-core.json -@@ -2095,10 +2095,19 @@ - # (all the disk, only the sectors allocated in the topmost image, or - # only new I/O). +@@ -2145,6 +2145,15 @@ + # destination (all the disk, only the sectors allocated in the + # topmost image, or only new I/O). # -+# @bitmap: The name of a bitmap to use for sync=bitmap mode. This argument must -+# be present for bitmap mode and absent otherwise. The bitmap's -+# granularity is used instead of @granularity (since 4.1). ++# @bitmap: The name of a bitmap to use for sync=bitmap mode. This ++# argument must be present for bitmap mode and absent otherwise. ++# The bitmap's granularity is used instead of @granularity (Since ++# 4.1). +# -+# @bitmap-mode: Specifies the type of data the bitmap should contain after -+# the operation concludes. Must be present if sync is "bitmap". -+# Must NOT be present otherwise. (Since 4.1) ++# @bitmap-mode: Specifies the type of data the bitmap should contain ++# after the operation concludes. Must be present if sync is ++# "bitmap". Must NOT be present otherwise. (Since 4.1) +# - # @granularity: granularity of the dirty bitmap, default is 64K - # if the image format doesn't have clusters, 4K if the clusters - # are smaller than that, else the cluster size. Must be a --# power of 2 between 512 and 64M (since 1.4). -+# power of 2 between 512 and 64M. Must not be specified if -+# @bitmap is present (since 1.4). - # - # @buf-size: maximum amount of data in flight from source to - # target (since 1.4). -@@ -2138,7 +2147,9 @@ + # @granularity: granularity of the dirty bitmap, default is 64K if the + # image format doesn't have clusters, 4K if the clusters are + # smaller than that, else the cluster size. Must be a power of 2 +@@ -2187,7 +2196,9 @@ { 'struct': 'DriveMirror', 'data': { '*job-id': 'str', 'device': 'str', 'target': 'str', '*format': 'str', '*node-name': 'str', '*replaces': 'str', @@ -395,28 +390,23 @@ index c05ad0c07e..3c945c1f93 100644 '*speed': 'int', '*granularity': 'uint32', '*buf-size': 'int', '*on-source-error': 'BlockdevOnError', '*on-target-error': 'BlockdevOnError', -@@ -2417,10 +2428,19 @@ - # (all the disk, only the sectors allocated in the topmost image, or - # only new I/O). +@@ -2471,6 +2482,15 @@ + # destination (all the disk, only the sectors allocated in the + # topmost image, or only new I/O). # -+# @bitmap: The name of a bitmap to use for sync=bitmap mode. This argument must -+# be present for bitmap mode and absent otherwise. The bitmap's -+# granularity is used instead of @granularity (since 4.1). ++# @bitmap: The name of a bitmap to use for sync=bitmap mode. This ++# argument must be present for bitmap mode and absent otherwise. ++# The bitmap's granularity is used instead of @granularity (since ++# 4.1). +# -+# @bitmap-mode: Specifies the type of data the bitmap should contain after -+# the operation concludes. Must be present if sync is "bitmap". -+# Must NOT be present otherwise. (Since 4.1) ++# @bitmap-mode: Specifies the type of data the bitmap should contain ++# after the operation concludes. Must be present if sync is ++# "bitmap". Must NOT be present otherwise. (Since 4.1) +# - # @granularity: granularity of the dirty bitmap, default is 64K - # if the image format doesn't have clusters, 4K if the clusters - # are smaller than that, else the cluster size. Must be a --# power of 2 between 512 and 64M -+# power of 2 between 512 and 64M . Must not be specified if -+# @bitmap is present. - # - # @buf-size: maximum amount of data in flight from source to - # target -@@ -2470,7 +2490,8 @@ + # @granularity: granularity of the dirty bitmap, default is 64K if the + # image format doesn't have clusters, 4K if the clusters are + # smaller than that, else the cluster size. Must be a power of 2 +@@ -2521,7 +2541,8 @@ { 'command': 'blockdev-mirror', 'data': { '*job-id': 'str', 'device': 'str', 'target': 'str', '*replaces': 'str', @@ -427,7 +417,7 @@ index c05ad0c07e..3c945c1f93 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 3a5e1eb2c4..c1ecc49073 100644 +index d727a5fee8..8a34aa2328 100644 --- a/tests/unit/test-block-iothread.c +++ b/tests/unit/test-block-iothread.c @@ -757,8 +757,8 @@ static void test_propagate_mirror(void) 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 b0ade68..a4a5a0b 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,10 +24,10 @@ Signed-off-by: Thomas Lamprecht 1 file changed, 18 insertions(+), 6 deletions(-) diff --git a/block/mirror.c b/block/mirror.c -index 9099c75992..e2ff42067b 100644 +index 1ff42c8af1..11b8a8e959 100644 --- a/block/mirror.c +++ b/block/mirror.c -@@ -680,8 +680,6 @@ static int mirror_exit_common(Job *job) +@@ -682,8 +682,6 @@ static int mirror_exit_common(Job *job) bdrv_unfreeze_backing_chain(mirror_top_bs, target_bs); } @@ -36,7 +36,7 @@ index 9099c75992..e2ff42067b 100644 /* Make sure that the source BDS doesn't go away during bdrv_replace_node, * before we can call bdrv_drained_end */ bdrv_ref(src); -@@ -782,6 +780,18 @@ static int mirror_exit_common(Job *job) +@@ -788,6 +786,18 @@ static int mirror_exit_common(Job *job) block_job_remove_all_bdrv(bjob); bdrv_replace_node(mirror_top_bs, mirror_top_bs->backing->bs, &error_abort); @@ -55,7 +55,7 @@ index 9099c75992..e2ff42067b 100644 bs_opaque->job = NULL; bdrv_drained_end(src); -@@ -1688,10 +1698,6 @@ static BlockJob *mirror_start_job( +@@ -1699,10 +1709,6 @@ static BlockJob *mirror_start_job( " sync mode", MirrorSyncMode_str(sync_mode)); return NULL; @@ -66,7 +66,7 @@ index 9099c75992..e2ff42067b 100644 } } else if (bitmap) { error_setg(errp, -@@ -1708,6 +1714,12 @@ static BlockJob *mirror_start_job( +@@ -1719,6 +1725,12 @@ static BlockJob *mirror_start_job( return NULL; } granularity = bdrv_dirty_bitmap_granularity(bitmap); 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 302bbc5..4546b78 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,10 +16,10 @@ Signed-off-by: Thomas Lamprecht 1 file changed, 3 insertions(+) diff --git a/blockdev.c b/blockdev.c -index 50e4a9c682..e6b2b1e338 100644 +index a8b1fd2a73..83d5cc1e49 100644 --- a/blockdev.c +++ b/blockdev.c -@@ -3036,6 +3036,9 @@ static void blockdev_mirror_common(const char *job_id, BlockDriverState *bs, +@@ -2945,6 +2945,9 @@ static void blockdev_mirror_common(const char *job_id, BlockDriverState *bs, if (bdrv_dirty_bitmap_check(bitmap, BDRV_BITMAP_ALLOW_RO, errp)) { return; } 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 b954682..93a1524 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,10 +16,10 @@ Signed-off-by: Thomas Lamprecht 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/block/mirror.c b/block/mirror.c -index e2ff42067b..f42953837b 100644 +index 11b8a8e959..00f2665ca4 100644 --- a/block/mirror.c +++ b/block/mirror.c -@@ -786,8 +786,8 @@ static int mirror_exit_common(Job *job) +@@ -792,8 +792,8 @@ static int mirror_exit_common(Job *job) job->ret == 0 && ret == 0)) { /* Success; synchronize copy back to sync. */ bdrv_clear_dirty_bitmap(s->sync_bitmap, NULL); @@ -30,7 +30,7 @@ index e2ff42067b..f42953837b 100644 } } bdrv_release_dirty_bitmap(s->dirty_bitmap); -@@ -1881,11 +1881,8 @@ static BlockJob *mirror_start_job( +@@ -1892,11 +1892,8 @@ static BlockJob *mirror_start_job( } if (s->sync_mode == MIRROR_SYNC_MODE_BITMAP) { 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 5298342..9a3108f 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 @@ -21,10 +21,10 @@ Signed-off-by: Fiona Ebner 3 files changed, 70 insertions(+), 59 deletions(-) diff --git a/block/mirror.c b/block/mirror.c -index f42953837b..8f79efaa87 100644 +index 00f2665ca4..60cf574de5 100644 --- a/block/mirror.c +++ b/block/mirror.c -@@ -1688,31 +1688,13 @@ static BlockJob *mirror_start_job( +@@ -1699,31 +1699,13 @@ static BlockJob *mirror_start_job( uint64_t target_perms, target_shared_perms; int ret; @@ -62,10 +62,10 @@ index f42953837b..8f79efaa87 100644 if (bitmap_mode != BITMAP_SYNC_MODE_NEVER) { diff --git a/blockdev.c b/blockdev.c -index e6b2b1e338..bdae211a54 100644 +index 83d5cc1e49..060d86a65f 100644 --- a/blockdev.c +++ b/blockdev.c -@@ -3015,7 +3015,36 @@ static void blockdev_mirror_common(const char *job_id, BlockDriverState *bs, +@@ -2924,7 +2924,36 @@ static void blockdev_mirror_common(const char *job_id, BlockDriverState *bs, sync = MIRROR_SYNC_MODE_FULL; } 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 a7fe592..5ed0d76 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 033390f699..ad35d4fea8 100644 +index 965f5d5450..e04bd059b6 100644 --- a/include/monitor/monitor.h +++ b/include/monitor/monitor.h @@ -16,6 +16,7 @@ extern QemuOptsList qemu_mon_opts; @@ -60,10 +60,10 @@ index 033390f699..ad35d4fea8 100644 void monitor_init_globals(void); void monitor_init_globals_core(void); diff --git a/monitor/monitor-internal.h b/monitor/monitor-internal.h -index 53e3808054..a19f8cbc2b 100644 +index 252de85681..8db28f9272 100644 --- a/monitor/monitor-internal.h +++ b/monitor/monitor-internal.h -@@ -152,6 +152,13 @@ typedef struct { +@@ -151,6 +151,13 @@ typedef struct { QemuMutex qmp_queue_lock; /* Input queue that holds all the parsed QMP requests */ GQueue *qmp_requests; @@ -78,10 +78,10 @@ index 53e3808054..a19f8cbc2b 100644 /** diff --git a/monitor/monitor.c b/monitor/monitor.c -index 8dc96f6af9..f3c38cb714 100644 +index dc352f9e9d..56e1307014 100644 --- a/monitor/monitor.c +++ b/monitor/monitor.c -@@ -135,6 +135,21 @@ bool monitor_cur_is_qmp(void) +@@ -117,6 +117,21 @@ bool monitor_cur_is_qmp(void) return cur_mon && monitor_is_qmp(cur_mon); } @@ -104,10 +104,10 @@ index 8dc96f6af9..f3c38cb714 100644 * Is @mon is using readline? * Note: not all HMP monitors use readline, e.g., gdbserver has a diff --git a/monitor/qmp.c b/monitor/qmp.c -index 092c527b6f..6b8cfcf6d8 100644 +index 6eee450fe4..c15bf1e1fc 100644 --- a/monitor/qmp.c +++ b/monitor/qmp.c -@@ -141,6 +141,8 @@ static void monitor_qmp_dispatch(MonitorQMP *mon, QObject *req) +@@ -165,6 +165,8 @@ static void monitor_qmp_dispatch(MonitorQMP *mon, QObject *req) QDict *rsp; QDict *error; @@ -116,7 +116,7 @@ index 092c527b6f..6b8cfcf6d8 100644 rsp = qmp_dispatch(mon->commands, req, qmp_oob_enabled(mon), &mon->common); -@@ -156,7 +158,17 @@ static void monitor_qmp_dispatch(MonitorQMP *mon, QObject *req) +@@ -180,7 +182,17 @@ static void monitor_qmp_dispatch(MonitorQMP *mon, QObject *req) } } @@ -135,7 +135,7 @@ index 092c527b6f..6b8cfcf6d8 100644 qobject_unref(rsp); } -@@ -444,6 +456,7 @@ static void monitor_qmp_event(void *opaque, QEMUChrEvent event) +@@ -478,6 +490,7 @@ static void monitor_qmp_event(void *opaque, QEMUChrEvent event) switch (event) { case CHR_EVENT_OPENED: @@ -144,7 +144,7 @@ index 092c527b6f..6b8cfcf6d8 100644 monitor_qmp_caps_reset(mon); data = qmp_greeting(mon); diff --git a/qapi/qmp-dispatch.c b/qapi/qmp-dispatch.c -index 0990873ec8..e605003771 100644 +index 555528b6bb..3baa508b4b 100644 --- a/qapi/qmp-dispatch.c +++ b/qapi/qmp-dispatch.c @@ -117,16 +117,28 @@ typedef struct QmpDispatchBH { @@ -180,7 +180,7 @@ index 0990873ec8..e605003771 100644 aio_co_wake(data->co); } -@@ -231,6 +243,7 @@ QDict *qmp_dispatch(const QmpCommandList *cmds, QObject *request, +@@ -231,6 +243,7 @@ QDict *coroutine_mixed_fn qmp_dispatch(const QmpCommandList *cmds, QObject *requ .ret = &ret, .errp = &err, .co = qemu_coroutine_self(), diff --git a/debian/patches/extra/0002-scsi-megasas-Internal-cdbs-have-16-byte-length.patch b/debian/patches/extra/0002-scsi-megasas-Internal-cdbs-have-16-byte-length.patch index 20ec053..328f6fb 100644 --- a/debian/patches/extra/0002-scsi-megasas-Internal-cdbs-have-16-byte-length.patch +++ b/debian/patches/extra/0002-scsi-megasas-Internal-cdbs-have-16-byte-length.patch @@ -22,10 +22,10 @@ Signed-off-by: Fiona Ebner 1 file changed, 2 insertions(+), 12 deletions(-) diff --git a/hw/scsi/megasas.c b/hw/scsi/megasas.c -index 9cbbb16121..d624866bb6 100644 +index 32c70c9e99..984b6a3145 100644 --- a/hw/scsi/megasas.c +++ b/hw/scsi/megasas.c -@@ -1780,7 +1780,7 @@ static int megasas_handle_io(MegasasState *s, MegasasCmd *cmd, int frame_cmd) +@@ -1781,7 +1781,7 @@ static int megasas_handle_io(MegasasState *s, MegasasCmd *cmd, int frame_cmd) uint8_t cdb[16]; int len; struct SCSIDevice *sdev = NULL; @@ -34,7 +34,7 @@ index 9cbbb16121..d624866bb6 100644 lba_count = le32_to_cpu(cmd->frame->io.header.data_len); lba_start_lo = le32_to_cpu(cmd->frame->io.lba_lo); -@@ -1789,7 +1789,6 @@ static int megasas_handle_io(MegasasState *s, MegasasCmd *cmd, int frame_cmd) +@@ -1790,7 +1790,6 @@ static int megasas_handle_io(MegasasState *s, MegasasCmd *cmd, int frame_cmd) target_id = cmd->frame->header.target_id; lun_id = cmd->frame->header.lun_id; @@ -42,7 +42,7 @@ index 9cbbb16121..d624866bb6 100644 if (target_id < MFI_MAX_LD && lun_id == 0) { sdev = scsi_device_find(&s->bus, 0, target_id, lun_id); -@@ -1804,15 +1803,6 @@ static int megasas_handle_io(MegasasState *s, MegasasCmd *cmd, int frame_cmd) +@@ -1805,15 +1804,6 @@ static int megasas_handle_io(MegasasState *s, MegasasCmd *cmd, int frame_cmd) return MFI_STAT_DEVICE_NOT_FOUND; } @@ -58,7 +58,7 @@ index 9cbbb16121..d624866bb6 100644 cmd->iov_size = lba_count * sdev->blocksize; if (megasas_map_sgl(s, cmd, &cmd->frame->io.sgl)) { megasas_write_sense(cmd, SENSE_CODE(TARGET_FAILURE)); -@@ -1823,7 +1813,7 @@ static int megasas_handle_io(MegasasState *s, MegasasCmd *cmd, int frame_cmd) +@@ -1824,7 +1814,7 @@ static int megasas_handle_io(MegasasState *s, MegasasCmd *cmd, int frame_cmd) megasas_encode_lba(cdb, lba_start, lba_count, is_write); cmd->req = scsi_req_new(sdev, cmd->index, diff --git a/debian/patches/extra/0003-ide-avoid-potential-deadlock-when-draining-during-tr.patch b/debian/patches/extra/0003-ide-avoid-potential-deadlock-when-draining-during-tr.patch index 89491a5..018f0c9 100644 --- a/debian/patches/extra/0003-ide-avoid-potential-deadlock-when-draining-during-tr.patch +++ b/debian/patches/extra/0003-ide-avoid-potential-deadlock-when-draining-during-tr.patch @@ -55,7 +55,7 @@ Signed-off-by: Fiona Ebner 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/hw/ide/core.c b/hw/ide/core.c -index 45d14a25e9..08e1f0c3d7 100644 +index 07971c0218..6a74afe564 100644 --- a/hw/ide/core.c +++ b/hw/ide/core.c @@ -444,7 +444,7 @@ static void ide_trim_bh_cb(void *opaque) @@ -76,8 +76,8 @@ index 45d14a25e9..08e1f0c3d7 100644 replay_bh_schedule_event(iocb->bh); } } -@@ -515,9 +517,6 @@ BlockAIOCB *ide_issue_trim( - IDEState *s = opaque; +@@ -516,9 +518,6 @@ BlockAIOCB *ide_issue_trim( + IDEDevice *dev = s->unit ? s->bus->slave : s->bus->master; TrimAIOCB *iocb; - /* Paired with a decrement in ide_trim_bh_cb() */ @@ -85,8 +85,8 @@ index 45d14a25e9..08e1f0c3d7 100644 - iocb = blk_aio_get(&trim_aiocb_info, s->blk, cb, cb_opaque); iocb->s = s; - iocb->bh = qemu_bh_new(ide_trim_bh_cb, iocb); -@@ -740,8 +739,9 @@ void ide_cancel_dma_sync(IDEState *s) + iocb->bh = qemu_bh_new_guarded(ide_trim_bh_cb, iocb, +@@ -742,8 +741,9 @@ void ide_cancel_dma_sync(IDEState *s) */ if (s->bus->dma->aiocb) { trace_ide_cancel_dma_sync_remaining(); diff --git a/debian/patches/extra/0010-migration-block-dirty-bitmap-fix-loading-bitmap-when.patch b/debian/patches/extra/0004-migration-block-dirty-bitmap-fix-loading-bitmap-when.patch similarity index 98% rename from debian/patches/extra/0010-migration-block-dirty-bitmap-fix-loading-bitmap-when.patch rename to debian/patches/extra/0004-migration-block-dirty-bitmap-fix-loading-bitmap-when.patch index bb01ced..4dae6ca 100644 --- a/debian/patches/extra/0010-migration-block-dirty-bitmap-fix-loading-bitmap-when.patch +++ b/debian/patches/extra/0004-migration-block-dirty-bitmap-fix-loading-bitmap-when.patch @@ -20,7 +20,7 @@ Signed-off-by: Fiona Ebner 1 file changed, 6 insertions(+) diff --git a/migration/block-dirty-bitmap.c b/migration/block-dirty-bitmap.c -index fe73aa94b1..7eaf498439 100644 +index 032fc5f405..e1ae3b7316 100644 --- a/migration/block-dirty-bitmap.c +++ b/migration/block-dirty-bitmap.c @@ -805,8 +805,11 @@ static int dirty_bitmap_load_start(QEMUFile *f, DBMLoadState *s) diff --git a/debian/patches/extra/0004-ui-return-NULL-when-getting-cursor-without-a-console.patch b/debian/patches/extra/0004-ui-return-NULL-when-getting-cursor-without-a-console.patch deleted file mode 100644 index 0b8d2c0..0000000 --- a/debian/patches/extra/0004-ui-return-NULL-when-getting-cursor-without-a-console.patch +++ /dev/null @@ -1,36 +0,0 @@ -From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?Marc-Andr=C3=A9=20Lureau?= -Date: Fri, 28 Apr 2023 19:48:06 +0400 -Subject: [PATCH] ui: return NULL when getting cursor without a console -MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit - -VNC may try to get the current cursor even when there are no consoles -and crashes. Simple reproducer is qemu with -nodefaults. - -Fixes: (again) -https://gitlab.com/qemu-project/qemu/-/issues/1548 - -Fixes: commit 385ac97f8 ("ui: keep current cursor with QemuConsole") -Signed-off-by: Marc-André Lureau -Reviewed-by: Philippe Mathieu-Daudé -(picked up from https://lists.nongnu.org/archive/html/qemu-devel/2023-04/msg05598.html) -Signed-off-by: Fiona Ebner ---- - ui/console.c | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -diff --git a/ui/console.c b/ui/console.c -index e173731e20..7461446e71 100644 ---- a/ui/console.c -+++ b/ui/console.c -@@ -2306,7 +2306,7 @@ QEMUCursor *qemu_console_get_cursor(QemuConsole *con) - if (con == NULL) { - con = active_console; - } -- return con->cursor; -+ return con ? con->cursor : NULL; - } - - bool qemu_console_is_visible(QemuConsole *con) diff --git a/debian/patches/extra/0012-hw-ide-reset-cancel-async-DMA-operation-before-reset.patch b/debian/patches/extra/0005-hw-ide-reset-cancel-async-DMA-operation-before-reset.patch similarity index 97% rename from debian/patches/extra/0012-hw-ide-reset-cancel-async-DMA-operation-before-reset.patch rename to debian/patches/extra/0005-hw-ide-reset-cancel-async-DMA-operation-before-reset.patch index d11ae00..ef1a649 100644 --- a/debian/patches/extra/0012-hw-ide-reset-cancel-async-DMA-operation-before-reset.patch +++ b/debian/patches/extra/0005-hw-ide-reset-cancel-async-DMA-operation-before-reset.patch @@ -68,10 +68,10 @@ Signed-off-by: Fiona Ebner 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/hw/ide/core.c b/hw/ide/core.c -index 08e1f0c3d7..148fccdef2 100644 +index 6a74afe564..289347af58 100644 --- a/hw/ide/core.c +++ b/hw/ide/core.c -@@ -2513,19 +2513,19 @@ static void ide_dummy_transfer_stop(IDEState *s) +@@ -2515,19 +2515,19 @@ static void ide_dummy_transfer_stop(IDEState *s) void ide_bus_reset(IDEBus *bus) { diff --git a/debian/patches/extra/0005-memory-prevent-dma-reentracy-issues.patch b/debian/patches/extra/0005-memory-prevent-dma-reentracy-issues.patch deleted file mode 100644 index c9d0cd5..0000000 --- a/debian/patches/extra/0005-memory-prevent-dma-reentracy-issues.patch +++ /dev/null @@ -1,130 +0,0 @@ -From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 -From: Alexander Bulekov -Date: Thu, 27 Apr 2023 17:10:06 -0400 -Subject: [PATCH] memory: prevent dma-reentracy issues - -Add a flag to the DeviceState, when a device is engaged in PIO/MMIO/DMA. -This flag is set/checked prior to calling a device's MemoryRegion -handlers, and set when device code initiates DMA. The purpose of this -flag is to prevent two types of DMA-based reentrancy issues: - -1.) mmio -> dma -> mmio case -2.) bh -> dma write -> mmio case - -These issues have led to problems such as stack-exhaustion and -use-after-frees. - -Summary of the problem from Peter Maydell: -https://lore.kernel.org/qemu-devel/CAFEAcA_23vc7hE3iaM-JVA6W38LK4hJoWae5KcknhPRD5fPBZA@mail.gmail.com - -Resolves: https://gitlab.com/qemu-project/qemu/-/issues/62 -Resolves: https://gitlab.com/qemu-project/qemu/-/issues/540 -Resolves: https://gitlab.com/qemu-project/qemu/-/issues/541 -Resolves: https://gitlab.com/qemu-project/qemu/-/issues/556 -Resolves: https://gitlab.com/qemu-project/qemu/-/issues/557 -Resolves: https://gitlab.com/qemu-project/qemu/-/issues/827 -Resolves: https://gitlab.com/qemu-project/qemu/-/issues/1282 -Resolves: CVE-2023-0330 - -Signed-off-by: Alexander Bulekov -Reviewed-by: Thomas Huth -Message-Id: <20230427211013.2994127-2-alxndr@bu.edu> -[thuth: Replace warn_report() with warn_report_once()] -Signed-off-by: Thomas Huth -(cherry-picked from commit a2e1753b8054344f32cf94f31c6399a58794a380) -Signed-off-by: Fiona Ebner ---- - include/exec/memory.h | 5 +++++ - include/hw/qdev-core.h | 7 +++++++ - softmmu/memory.c | 16 ++++++++++++++++ - 3 files changed, 28 insertions(+) - -diff --git a/include/exec/memory.h b/include/exec/memory.h -index 15ade918ba..e45ce6061f 100644 ---- a/include/exec/memory.h -+++ b/include/exec/memory.h -@@ -767,6 +767,8 @@ struct MemoryRegion { - bool is_iommu; - RAMBlock *ram_block; - Object *owner; -+ /* owner as TYPE_DEVICE. Used for re-entrancy checks in MR access hotpath */ -+ DeviceState *dev; - - const MemoryRegionOps *ops; - void *opaque; -@@ -791,6 +793,9 @@ struct MemoryRegion { - unsigned ioeventfd_nb; - MemoryRegionIoeventfd *ioeventfds; - RamDiscardManager *rdm; /* Only for RAM */ -+ -+ /* For devices designed to perform re-entrant IO into their own IO MRs */ -+ bool disable_reentrancy_guard; - }; - - struct IOMMUMemoryRegion { -diff --git a/include/hw/qdev-core.h b/include/hw/qdev-core.h -index bd50ad5ee1..7623703943 100644 ---- a/include/hw/qdev-core.h -+++ b/include/hw/qdev-core.h -@@ -162,6 +162,10 @@ struct NamedClockList { - QLIST_ENTRY(NamedClockList) node; - }; - -+typedef struct { -+ bool engaged_in_io; -+} MemReentrancyGuard; -+ - /** - * DeviceState: - * @realized: Indicates whether the device has been fully constructed. -@@ -194,6 +198,9 @@ struct DeviceState { - int alias_required_for_version; - ResettableState reset; - GSList *unplug_blockers; -+ -+ /* Is the device currently in mmio/pio/dma? Used to prevent re-entrancy */ -+ MemReentrancyGuard mem_reentrancy_guard; - }; - - struct DeviceListener { -diff --git a/softmmu/memory.c b/softmmu/memory.c -index b1a6cae6f5..b7b3386e9d 100644 ---- a/softmmu/memory.c -+++ b/softmmu/memory.c -@@ -542,6 +542,18 @@ static MemTxResult access_with_adjusted_size(hwaddr addr, - access_size_max = 4; - } - -+ /* Do not allow more than one simultaneous access to a device's IO Regions */ -+ if (mr->dev && !mr->disable_reentrancy_guard && -+ !mr->ram_device && !mr->ram && !mr->rom_device && !mr->readonly) { -+ if (mr->dev->mem_reentrancy_guard.engaged_in_io) { -+ warn_report_once("Blocked re-entrant IO on MemoryRegion: " -+ "%s at addr: 0x%" HWADDR_PRIX, -+ memory_region_name(mr), addr); -+ return MEMTX_ACCESS_ERROR; -+ } -+ mr->dev->mem_reentrancy_guard.engaged_in_io = true; -+ } -+ - /* FIXME: support unaligned access? */ - access_size = MAX(MIN(size, access_size_max), access_size_min); - access_mask = MAKE_64BIT_MASK(0, access_size * 8); -@@ -556,6 +568,9 @@ static MemTxResult access_with_adjusted_size(hwaddr addr, - access_mask, attrs); - } - } -+ if (mr->dev) { -+ mr->dev->mem_reentrancy_guard.engaged_in_io = false; -+ } - return r; - } - -@@ -1170,6 +1185,7 @@ static void memory_region_do_init(MemoryRegion *mr, - } - mr->name = g_strdup(name); - mr->owner = owner; -+ mr->dev = (DeviceState *) object_dynamic_cast(mr->owner, TYPE_DEVICE); - mr->ram_block = NULL; - - if (name) { diff --git a/debian/patches/extra/0006-lsi53c895a-disable-reentrancy-detection-for-script-R.patch b/debian/patches/extra/0006-lsi53c895a-disable-reentrancy-detection-for-script-R.patch deleted file mode 100644 index 96d254c..0000000 --- a/debian/patches/extra/0006-lsi53c895a-disable-reentrancy-detection-for-script-R.patch +++ /dev/null @@ -1,39 +0,0 @@ -From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 -From: Alexander Bulekov -Date: Thu, 27 Apr 2023 17:10:10 -0400 -Subject: [PATCH] lsi53c895a: disable reentrancy detection for script RAM - -As the code is designed to use the memory APIs to access the script ram, -disable reentrancy checks for the pseudo-RAM ram_io MemoryRegion. - -In the future, ram_io may be converted from an IO to a proper RAM MemoryRegion. - -Reported-by: Fiona Ebner -Signed-off-by: Alexander Bulekov -Reviewed-by: Thomas Huth -Reviewed-by: Darren Kenny -Message-Id: <20230427211013.2994127-6-alxndr@bu.edu> -Signed-off-by: Thomas Huth -(cherry-picked from commit bfd6e7ae6a72b84e2eb9574f56e6ec037f05182c) -Signed-off-by: Fiona Ebner ---- - hw/scsi/lsi53c895a.c | 6 ++++++ - 1 file changed, 6 insertions(+) - -diff --git a/hw/scsi/lsi53c895a.c b/hw/scsi/lsi53c895a.c -index bbf32d3f73..17af67935f 100644 ---- a/hw/scsi/lsi53c895a.c -+++ b/hw/scsi/lsi53c895a.c -@@ -2313,6 +2313,12 @@ static void lsi_scsi_realize(PCIDevice *dev, Error **errp) - memory_region_init_io(&s->io_io, OBJECT(s), &lsi_io_ops, s, - "lsi-io", 256); - -+ /* -+ * Since we use the address-space API to interact with ram_io, disable the -+ * re-entrancy guard. -+ */ -+ s->ram_io.disable_reentrancy_guard = true; -+ - address_space_init(&s->pci_io_as, pci_address_space_io(dev), "lsi-pci-io"); - qdev_init_gpio_out(d, &s->ext_irq, 1); - diff --git a/debian/patches/extra/0007-bcm2835_property-disable-reentrancy-detection-for-io.patch b/debian/patches/extra/0007-bcm2835_property-disable-reentrancy-detection-for-io.patch deleted file mode 100644 index 6ec9d03..0000000 --- a/debian/patches/extra/0007-bcm2835_property-disable-reentrancy-detection-for-io.patch +++ /dev/null @@ -1,37 +0,0 @@ -From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 -From: Alexander Bulekov -Date: Thu, 27 Apr 2023 17:10:11 -0400 -Subject: [PATCH] bcm2835_property: disable reentrancy detection for iomem - -As the code is designed for re-entrant calls from bcm2835_property to -bcm2835_mbox and back into bcm2835_property, mark iomem as -reentrancy-safe. - -Signed-off-by: Alexander Bulekov -Reviewed-by: Thomas Huth -Message-Id: <20230427211013.2994127-7-alxndr@bu.edu> -Signed-off-by: Thomas Huth -(cherry-picked from commit 985c4a4e547afb9573b6bd6843d20eb2c3d1d1cd) -Signed-off-by: Fiona Ebner ---- - hw/misc/bcm2835_property.c | 7 +++++++ - 1 file changed, 7 insertions(+) - -diff --git a/hw/misc/bcm2835_property.c b/hw/misc/bcm2835_property.c -index 890ae7bae5..de056ea2df 100644 ---- a/hw/misc/bcm2835_property.c -+++ b/hw/misc/bcm2835_property.c -@@ -382,6 +382,13 @@ static void bcm2835_property_init(Object *obj) - - memory_region_init_io(&s->iomem, OBJECT(s), &bcm2835_property_ops, s, - TYPE_BCM2835_PROPERTY, 0x10); -+ -+ /* -+ * bcm2835_property_ops call into bcm2835_mbox, which in-turn reads from -+ * iomem. As such, mark iomem as re-entracy safe. -+ */ -+ s->iomem.disable_reentrancy_guard = true; -+ - sysbus_init_mmio(SYS_BUS_DEVICE(s), &s->iomem); - sysbus_init_irq(SYS_BUS_DEVICE(s), &s->mbox_irq); - } diff --git a/debian/patches/extra/0008-raven-disable-reentrancy-detection-for-iomem.patch b/debian/patches/extra/0008-raven-disable-reentrancy-detection-for-iomem.patch deleted file mode 100644 index bea68d4..0000000 --- a/debian/patches/extra/0008-raven-disable-reentrancy-detection-for-iomem.patch +++ /dev/null @@ -1,35 +0,0 @@ -From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 -From: Alexander Bulekov -Date: Thu, 27 Apr 2023 17:10:12 -0400 -Subject: [PATCH] raven: disable reentrancy detection for iomem - -As the code is designed for re-entrant calls from raven_io_ops to -pci-conf, mark raven_io_ops as reentrancy-safe. - -Signed-off-by: Alexander Bulekov -Message-Id: <20230427211013.2994127-8-alxndr@bu.edu> -Signed-off-by: Thomas Huth -(cherry-picked from commit 6dad5a6810d9c60ca320d01276f6133bbcfa1fc7) -Signed-off-by: Fiona Ebner ---- - hw/pci-host/raven.c | 7 +++++++ - 1 file changed, 7 insertions(+) - -diff --git a/hw/pci-host/raven.c b/hw/pci-host/raven.c -index 072ffe3c5e..9a11ac4b2b 100644 ---- a/hw/pci-host/raven.c -+++ b/hw/pci-host/raven.c -@@ -294,6 +294,13 @@ static void raven_pcihost_initfn(Object *obj) - memory_region_init(&s->pci_memory, obj, "pci-memory", 0x3f000000); - address_space_init(&s->pci_io_as, &s->pci_io, "raven-io"); - -+ /* -+ * Raven's raven_io_ops use the address-space API to access pci-conf-idx -+ * (which is also owned by the raven device). As such, mark the -+ * pci_io_non_contiguous as re-entrancy safe. -+ */ -+ s->pci_io_non_contiguous.disable_reentrancy_guard = true; -+ - /* CPU address space */ - memory_region_add_subregion(address_space_mem, PCI_IO_BASE_ADDR, - &s->pci_io); diff --git a/debian/patches/extra/0009-apic-disable-reentrancy-detection-for-apic-msi.patch b/debian/patches/extra/0009-apic-disable-reentrancy-detection-for-apic-msi.patch deleted file mode 100644 index 154cc36..0000000 --- a/debian/patches/extra/0009-apic-disable-reentrancy-detection-for-apic-msi.patch +++ /dev/null @@ -1,36 +0,0 @@ -From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 -From: Alexander Bulekov -Date: Thu, 27 Apr 2023 17:10:13 -0400 -Subject: [PATCH] apic: disable reentrancy detection for apic-msi - -As the code is designed for re-entrant calls to apic-msi, mark apic-msi -as reentrancy-safe. - -Signed-off-by: Alexander Bulekov -Reviewed-by: Darren Kenny -Message-Id: <20230427211013.2994127-9-alxndr@bu.edu> -Signed-off-by: Thomas Huth -(cherry-picked from commit 50795ee051a342c681a9b45671c552fbd6274db8) -Signed-off-by: Fiona Ebner ---- - hw/intc/apic.c | 7 +++++++ - 1 file changed, 7 insertions(+) - -diff --git a/hw/intc/apic.c b/hw/intc/apic.c -index 20b5a94073..ac3d47d231 100644 ---- a/hw/intc/apic.c -+++ b/hw/intc/apic.c -@@ -885,6 +885,13 @@ static void apic_realize(DeviceState *dev, Error **errp) - memory_region_init_io(&s->io_memory, OBJECT(s), &apic_io_ops, s, "apic-msi", - APIC_SPACE_SIZE); - -+ /* -+ * apic-msi's apic_mem_write can call into ioapic_eoi_broadcast, which can -+ * write back to apic-msi. As such mark the apic-msi region re-entrancy -+ * safe. -+ */ -+ s->io_memory.disable_reentrancy_guard = true; -+ - s->timer = timer_new_ns(QEMU_CLOCK_VIRTUAL, apic_timer, s); - local_apics[s->id] = s; - diff --git a/debian/patches/extra/0011-vhost-fix-the-fd-leak.patch b/debian/patches/extra/0011-vhost-fix-the-fd-leak.patch deleted file mode 100644 index 31392fb..0000000 --- a/debian/patches/extra/0011-vhost-fix-the-fd-leak.patch +++ /dev/null @@ -1,29 +0,0 @@ -From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 -From: Li Feng -Date: Mon, 31 Jul 2023 20:10:06 +0800 -Subject: [PATCH] vhost: fix the fd leak - -When the vhost-user reconnect to the backend, the notifer should be -cleanup. Otherwise, the fd resource will be exhausted. - -Fixes: f9a09ca3ea ("vhost: add support for configure interrupt") - -Signed-off-by: Li Feng -Reviewed-by: Raphael Norwitz ---- - hw/virtio/vhost.c | 2 ++ - 1 file changed, 2 insertions(+) - -diff --git a/hw/virtio/vhost.c b/hw/virtio/vhost.c -index a266396576..8e3311781f 100644 ---- a/hw/virtio/vhost.c -+++ b/hw/virtio/vhost.c -@@ -2034,6 +2034,8 @@ void vhost_dev_stop(struct vhost_dev *hdev, VirtIODevice *vdev, bool vrings) - event_notifier_test_and_clear( - &hdev->vqs[VHOST_QUEUE_NUM_CONFIG_INR].masked_config_notifier); - event_notifier_test_and_clear(&vdev->config_notifier); -+ event_notifier_cleanup( -+ &hdev->vqs[VHOST_QUEUE_NUM_CONFIG_INR].masked_config_notifier); - - trace_vhost_dev_stop(hdev, vdev->name, vrings); - 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 4926a64..3d8785c 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 c2dee3f056..9681bd0434 100644 +index aa89789737..0db366a851 100644 --- a/block/file-posix.c +++ b/block/file-posix.c -@@ -553,7 +553,7 @@ static QemuOptsList raw_runtime_opts = { +@@ -564,7 +564,7 @@ static QemuOptsList raw_runtime_opts = { { .name = "locking", .type = QEMU_OPT_STRING, @@ -26,7 +26,7 @@ index c2dee3f056..9681bd0434 100644 }, { .name = "pr-manager", -@@ -653,7 +653,7 @@ static int raw_open_common(BlockDriverState *bs, QDict *options, +@@ -664,7 +664,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 2827fa4..297e250 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 d243e290d3..3489b05ec4 100644 +index e0771a1043..1018ccc0b8 100644 --- a/target/i386/cpu.h +++ b/target/i386/cpu.h -@@ -2203,9 +2203,9 @@ uint64_t cpu_get_tsc(CPUX86State *env); +@@ -2243,9 +2243,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 6f3afdb..947fc90 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 185a83e5e5..f11a40aa9e 100644 +index ad5fadbe79..d0011085c4 100644 --- a/block/gluster.c +++ b/block/gluster.c @@ -43,7 +43,7 @@ @@ -24,7 +24,7 @@ index 185a83e5e5..f11a40aa9e 100644 @@ -425,6 +425,7 @@ static struct glfs *qemu_gluster_glfs_init(BlockdevOptionsGluster *gconf, int old_errno; SocketAddressList *server; - unsigned long long port; + uint64_t port; + const char *logfile; glfs = glfs_find_preopened(gconf->volume); diff --git a/debian/patches/pve/0007-PVE-Up-glusterfs-allow-partial-reads.patch b/debian/patches/pve/0007-PVE-Up-glusterfs-allow-partial-reads.patch index 122a07d..c4e6729 100644 --- a/debian/patches/pve/0007-PVE-Up-glusterfs-allow-partial-reads.patch +++ b/debian/patches/pve/0007-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 f11a40aa9e..6756e6b886 100644 +index d0011085c4..2df3d6e35d 100644 --- a/block/gluster.c +++ b/block/gluster.c @@ -58,6 +58,7 @@ typedef struct GlusterAIOCB { diff --git a/debian/patches/pve/0008-PVE-Up-qemu-img-return-success-on-info-without-snaps.patch b/debian/patches/pve/0008-PVE-Up-qemu-img-return-success-on-info-without-snaps.patch index feb1ef3..fb505e5 100644 --- a/debian/patches/pve/0008-PVE-Up-qemu-img-return-success-on-info-without-snaps.patch +++ b/debian/patches/pve/0008-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 9aeac69fa6..0919fac1f1 100644 +index 27f48051b0..bb287d8538 100644 --- a/qemu-img.c +++ b/qemu-img.c -@@ -3059,7 +3059,8 @@ static int img_info(int argc, char **argv) +@@ -3062,7 +3062,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/0009-PVE-Up-qemu-img-dd-add-osize-and-read-from-to-stdin-.patch b/debian/patches/pve/0009-PVE-Up-qemu-img-dd-add-osize-and-read-from-to-stdin-.patch index ffc30d0..5b88664 100644 --- a/debian/patches/pve/0009-PVE-Up-qemu-img-dd-add-osize-and-read-from-to-stdin-.patch +++ b/debian/patches/pve/0009-PVE-Up-qemu-img-dd-add-osize-and-read-from-to-stdin-.patch @@ -54,10 +54,10 @@ index 1b1dab5b17..d1616c045a 100644 DEF("info", img_info, diff --git a/qemu-img.c b/qemu-img.c -index 0919fac1f1..c584de648c 100644 +index bb287d8538..09c0340d16 100644 --- a/qemu-img.c +++ b/qemu-img.c -@@ -4885,10 +4885,12 @@ static int img_bitmap(int argc, char **argv) +@@ -4888,10 +4888,12 @@ static int img_bitmap(int argc, char **argv) #define C_IF 04 #define C_OF 010 #define C_SKIP 020 @@ -70,7 +70,7 @@ index 0919fac1f1..c584de648c 100644 }; struct DdIo { -@@ -4964,6 +4966,19 @@ static int img_dd_skip(const char *arg, +@@ -4967,6 +4969,19 @@ static int img_dd_skip(const char *arg, return 0; } @@ -90,7 +90,7 @@ index 0919fac1f1..c584de648c 100644 static int img_dd(int argc, char **argv) { int ret = 0; -@@ -5004,6 +5019,7 @@ static int img_dd(int argc, char **argv) +@@ -5007,6 +5022,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 }, @@ -98,7 +98,7 @@ index 0919fac1f1..c584de648c 100644 { NULL, NULL, 0 } }; const struct option long_options[] = { -@@ -5079,91 +5095,112 @@ static int img_dd(int argc, char **argv) +@@ -5082,91 +5098,112 @@ static int img_dd(int argc, char **argv) arg = NULL; } @@ -275,7 +275,7 @@ index 0919fac1f1..c584de648c 100644 } if (dd.flags & C_SKIP && (in.offset > INT64_MAX / in.bsz || -@@ -5180,20 +5217,43 @@ static int img_dd(int argc, char **argv) +@@ -5183,20 +5220,43 @@ static int img_dd(int argc, char **argv) in.buf = g_new(uint8_t, in.bsz); for (out_pos = 0; in_pos < size; ) { diff --git a/debian/patches/pve/0010-PVE-Up-qemu-img-dd-add-isize-parameter.patch b/debian/patches/pve/0010-PVE-Up-qemu-img-dd-add-isize-parameter.patch index af21381..0325fe9 100644 --- a/debian/patches/pve/0010-PVE-Up-qemu-img-dd-add-isize-parameter.patch +++ b/debian/patches/pve/0010-PVE-Up-qemu-img-dd-add-isize-parameter.patch @@ -16,10 +16,10 @@ Signed-off-by: Fiona Ebner 1 file changed, 25 insertions(+), 3 deletions(-) diff --git a/qemu-img.c b/qemu-img.c -index c584de648c..a57ceeddfe 100644 +index 09c0340d16..556535d9d5 100644 --- a/qemu-img.c +++ b/qemu-img.c -@@ -4886,11 +4886,13 @@ static int img_bitmap(int argc, char **argv) +@@ -4889,11 +4889,13 @@ static int img_bitmap(int argc, char **argv) #define C_OF 010 #define C_SKIP 020 #define C_OSIZE 040 @@ -33,7 +33,7 @@ index c584de648c..a57ceeddfe 100644 }; struct DdIo { -@@ -4979,6 +4981,19 @@ static int img_dd_osize(const char *arg, +@@ -4982,6 +4984,19 @@ static int img_dd_osize(const char *arg, return 0; } @@ -53,7 +53,7 @@ index c584de648c..a57ceeddfe 100644 static int img_dd(int argc, char **argv) { int ret = 0; -@@ -4993,12 +5008,14 @@ static int img_dd(int argc, char **argv) +@@ -4996,12 +5011,14 @@ static int img_dd(int argc, char **argv) int c, i; const char *out_fmt = "raw"; const char *fmt = NULL; @@ -69,7 +69,7 @@ index c584de648c..a57ceeddfe 100644 }; struct DdIo in = { .bsz = 512, /* Block size is by default 512 bytes */ -@@ -5020,6 +5037,7 @@ static int img_dd(int argc, char **argv) +@@ -5023,6 +5040,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 }, @@ -77,7 +77,7 @@ index c584de648c..a57ceeddfe 100644 { NULL, NULL, 0 } }; const struct option long_options[] = { -@@ -5216,9 +5234,10 @@ static int img_dd(int argc, char **argv) +@@ -5219,9 +5237,10 @@ static int img_dd(int argc, char **argv) in.buf = g_new(uint8_t, in.bsz); @@ -90,7 +90,7 @@ index c584de648c..a57ceeddfe 100644 if (blk1) { in_ret = blk_pread(blk1, in_pos, bytes, in.buf, 0); if (in_ret == 0) { -@@ -5227,6 +5246,9 @@ static int img_dd(int argc, char **argv) +@@ -5230,6 +5249,9 @@ static int img_dd(int argc, char **argv) } else { in_ret = read(STDIN_FILENO, in.buf, bytes); if (in_ret == 0) { diff --git a/debian/patches/pve/0011-PVE-Up-qemu-img-dd-add-n-skip_create.patch b/debian/patches/pve/0011-PVE-Up-qemu-img-dd-add-n-skip_create.patch index 376aa67..5cca59a 100644 --- a/debian/patches/pve/0011-PVE-Up-qemu-img-dd-add-n-skip_create.patch +++ b/debian/patches/pve/0011-PVE-Up-qemu-img-dd-add-n-skip_create.patch @@ -65,10 +65,10 @@ index d1616c045a..b5b0bb4467 100644 DEF("info", img_info, diff --git a/qemu-img.c b/qemu-img.c -index a57ceeddfe..06d814e39c 100644 +index 556535d9d5..289c78febb 100644 --- a/qemu-img.c +++ b/qemu-img.c -@@ -5010,7 +5010,7 @@ static int img_dd(int argc, char **argv) +@@ -5013,7 +5013,7 @@ static int img_dd(int argc, char **argv) const char *fmt = NULL; int64_t size = 0, readsize = 0; int64_t out_pos, in_pos; @@ -77,7 +77,7 @@ index a57ceeddfe..06d814e39c 100644 struct DdInfo dd = { .flags = 0, .count = 0, -@@ -5048,7 +5048,7 @@ static int img_dd(int argc, char **argv) +@@ -5051,7 +5051,7 @@ static int img_dd(int argc, char **argv) { 0, 0, 0, 0 } }; @@ -86,7 +86,7 @@ index a57ceeddfe..06d814e39c 100644 if (c == EOF) { break; } -@@ -5068,6 +5068,9 @@ static int img_dd(int argc, char **argv) +@@ -5071,6 +5071,9 @@ static int img_dd(int argc, char **argv) case 'h': help(); break; @@ -96,7 +96,7 @@ index a57ceeddfe..06d814e39c 100644 case 'U': force_share = true; break; -@@ -5198,13 +5201,15 @@ static int img_dd(int argc, char **argv) +@@ -5201,13 +5204,15 @@ static int img_dd(int argc, char **argv) size - in.bsz * in.offset, &error_abort); } diff --git a/debian/patches/pve/0012-qemu-img-dd-add-l-option-for-loading-a-snapshot.patch b/debian/patches/pve/0012-qemu-img-dd-add-l-option-for-loading-a-snapshot.patch index debfc54..d649d24 100644 --- a/debian/patches/pve/0012-qemu-img-dd-add-l-option-for-loading-a-snapshot.patch +++ b/debian/patches/pve/0012-qemu-img-dd-add-l-option-for-loading-a-snapshot.patch @@ -46,10 +46,10 @@ index b5b0bb4467..36f97e1f19 100644 DEF("info", img_info, diff --git a/qemu-img.c b/qemu-img.c -index 06d814e39c..e2c06c496d 100644 +index 289c78febb..da543d05cb 100644 --- a/qemu-img.c +++ b/qemu-img.c -@@ -5002,6 +5002,7 @@ static int img_dd(int argc, char **argv) +@@ -5005,6 +5005,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 06d814e39c..e2c06c496d 100644 QemuOptsList *create_opts = NULL; Error *local_err = NULL; bool image_opts = false; -@@ -5011,6 +5012,7 @@ static int img_dd(int argc, char **argv) +@@ -5014,6 +5015,7 @@ static int img_dd(int argc, char **argv) int64_t size = 0, readsize = 0; int64_t out_pos, in_pos; bool force_share = false, skip_create = false; @@ -65,7 +65,7 @@ index 06d814e39c..e2c06c496d 100644 struct DdInfo dd = { .flags = 0, .count = 0, -@@ -5048,7 +5050,7 @@ static int img_dd(int argc, char **argv) +@@ -5051,7 +5053,7 @@ static int img_dd(int argc, char **argv) { 0, 0, 0, 0 } }; @@ -74,7 +74,7 @@ index 06d814e39c..e2c06c496d 100644 if (c == EOF) { break; } -@@ -5071,6 +5073,19 @@ static int img_dd(int argc, char **argv) +@@ -5074,6 +5076,19 @@ static int img_dd(int argc, char **argv) case 'n': skip_create = true; break; @@ -94,7 +94,7 @@ index 06d814e39c..e2c06c496d 100644 case 'U': force_share = true; break; -@@ -5130,11 +5145,24 @@ static int img_dd(int argc, char **argv) +@@ -5133,11 +5148,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 06d814e39c..e2c06c496d 100644 } if (dd.flags & C_OSIZE) { -@@ -5289,6 +5317,7 @@ static int img_dd(int argc, char **argv) +@@ -5292,6 +5320,7 @@ static int img_dd(int argc, char **argv) out: g_free(arg); qemu_opts_del(opts); 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 b465314..2c1524f 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 @@ -59,10 +59,10 @@ index c3e55ef9e9..0e32e6201f 100644 qapi_free_BalloonInfo(info); } diff --git a/hw/virtio/virtio-balloon.c b/hw/virtio/virtio-balloon.c -index 746f07c4d2..a41854b902 100644 +index d004cf29d2..2660ed520b 100644 --- a/hw/virtio/virtio-balloon.c +++ b/hw/virtio/virtio-balloon.c -@@ -804,8 +804,37 @@ static uint64_t virtio_balloon_get_features(VirtIODevice *vdev, uint64_t f, +@@ -782,8 +782,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; @@ -103,12 +103,12 @@ index 746f07c4d2..a41854b902 100644 static void virtio_balloon_to_target(void *opaque, ram_addr_t target) diff --git a/qapi/machine.json b/qapi/machine.json -index 604b686e59..15f5f86683 100644 +index a08b6576ca..5c9a4d55f4 100644 --- a/qapi/machine.json +++ b/qapi/machine.json -@@ -1056,9 +1056,29 @@ - # @actual: the logical size of the VM in bytes - # Formula used: logical_vm_size = vm_ram_size - balloon_size +@@ -1063,9 +1063,29 @@ + # @actual: the logical size of the VM in bytes Formula used: + # logical_vm_size = vm_ram_size - balloon_size # +# @last_update: time when stats got updated from guest +# 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 e40d67f..ab331f3 100644 --- a/debian/patches/pve/0014-PVE-qapi-modify-query-machines.patch +++ b/debian/patches/pve/0014-PVE-qapi-modify-query-machines.patch @@ -13,10 +13,10 @@ Signed-off-by: Dietmar Maurer 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/hw/core/machine-qmp-cmds.c b/hw/core/machine-qmp-cmds.c -index b98ff15089..24595f618c 100644 +index 3860a50c3b..40821e2317 100644 --- a/hw/core/machine-qmp-cmds.c +++ b/hw/core/machine-qmp-cmds.c -@@ -103,6 +103,12 @@ MachineInfoList *qmp_query_machines(Error **errp) +@@ -91,6 +91,12 @@ MachineInfoList *qmp_query_machines(Error **errp) info->numa_mem_supported = mc->numa_mem_supported; info->deprecated = !!mc->deprecation_reason; info->acpi = !!object_class_property_find(OBJECT_CLASS(mc), "acpi"); @@ -30,19 +30,19 @@ index b98ff15089..24595f618c 100644 info->default_cpu_type = g_strdup(mc->default_cpu_type); } diff --git a/qapi/machine.json b/qapi/machine.json -index 15f5f86683..c904280085 100644 +index 5c9a4d55f4..fbb61f18e4 100644 --- a/qapi/machine.json +++ b/qapi/machine.json -@@ -138,6 +138,8 @@ +@@ -139,6 +139,8 @@ # # @is-default: whether the machine is default # +# @is-current: whether this machine is currently used +# # @cpu-max: maximum number of CPUs supported by the machine type - # (since 1.5) + # (since 1.5) # -@@ -161,7 +163,7 @@ +@@ -163,7 +165,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 df551da..26c6840 100644 --- a/debian/patches/pve/0015-PVE-qapi-modify-spice-query.patch +++ b/debian/patches/pve/0015-PVE-qapi-modify-spice-query.patch @@ -14,10 +14,10 @@ Signed-off-by: Fiona Ebner 2 files changed, 7 insertions(+) diff --git a/qapi/ui.json b/qapi/ui.json -index 98322342f7..316d4dc933 100644 +index 006616aa77..dfd1d3e36b 100644 --- a/qapi/ui.json +++ b/qapi/ui.json -@@ -310,11 +310,14 @@ +@@ -317,11 +317,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 index ce12543..40c9b32 100644 --- 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 @@ -269,14 +269,14 @@ index 0000000000..17ae2cb261 + +#endif /* QIO_CHANNEL_SAVEVM_ASYNC_H */ diff --git a/migration/meson.build b/migration/meson.build -index 0d1bb9f96e..8a142fc7a9 100644 +index 1ae28523a1..37ddcb5d60 100644 --- a/migration/meson.build +++ b/migration/meson.build -@@ -13,6 +13,7 @@ softmmu_ss.add(files( +@@ -13,6 +13,7 @@ system_ss.add(files( 'block-dirty-bitmap.c', 'channel.c', 'channel-block.c', + 'channel-savevm-async.c', - 'colo-failover.c', - 'colo.c', + 'dirtyrate.c', 'exec.c', + 'fd.c', diff --git a/debian/patches/pve/0017-PVE-add-savevm-async-for-background-state-snapshots.patch b/debian/patches/pve/0017-PVE-add-savevm-async-for-background-state-snapshots.patch index 0c98142..976f73f 100644 --- a/debian/patches/pve/0017-PVE-add-savevm-async-for-background-state-snapshots.patch +++ b/debian/patches/pve/0017-PVE-add-savevm-async-for-background-state-snapshots.patch @@ -35,20 +35,20 @@ Signed-off-by: Fiona Ebner include/migration/snapshot.h | 2 + include/monitor/hmp.h | 3 + migration/meson.build | 1 + - migration/savevm-async.c | 533 +++++++++++++++++++++++++++++++++++ + migration/savevm-async.c | 531 +++++++++++++++++++++++++++++++++++ monitor/hmp-cmds.c | 38 +++ qapi/migration.json | 34 +++ qapi/misc.json | 16 ++ qemu-options.hx | 12 + softmmu/vl.c | 10 + - 11 files changed, 679 insertions(+) + 11 files changed, 677 insertions(+) create mode 100644 migration/savevm-async.c diff --git a/hmp-commands-info.hx b/hmp-commands-info.hx -index 47d63d26db..a166bff3d5 100644 +index f5b37eb74a..10fdd822e0 100644 --- a/hmp-commands-info.hx +++ b/hmp-commands-info.hx -@@ -540,6 +540,19 @@ SRST +@@ -525,6 +525,19 @@ SRST Show current migration parameters. ERST @@ -69,10 +69,10 @@ index 47d63d26db..a166bff3d5 100644 .name = "balloon", .args_type = "", diff --git a/hmp-commands.hx b/hmp-commands.hx -index bb85ee1d26..d9f9f42d11 100644 +index 2cbd0f77a0..e352f86872 100644 --- a/hmp-commands.hx +++ b/hmp-commands.hx -@@ -1846,3 +1846,20 @@ SRST +@@ -1865,3 +1865,20 @@ SRST List event channels in the guest ERST #endif @@ -105,7 +105,7 @@ index e72083b117..c846d37806 100644 + #endif diff --git a/include/monitor/hmp.h b/include/monitor/hmp.h -index fdb69b7f9c..fdf6b45fb8 100644 +index 13f9a2dedb..7a7def7530 100644 --- a/include/monitor/hmp.h +++ b/include/monitor/hmp.h @@ -28,6 +28,7 @@ void hmp_info_status(Monitor *mon, const QDict *qdict); @@ -126,11 +126,11 @@ index fdb69b7f9c..fdf6b45fb8 100644 void coroutine_fn 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 8a142fc7a9..a7824b5266 100644 +index 37ddcb5d60..07f6057acc 100644 --- a/migration/meson.build +++ b/migration/meson.build -@@ -25,6 +25,7 @@ softmmu_ss.add(files( - 'multifd-zlib.c', +@@ -26,6 +26,7 @@ system_ss.add(files( + 'options.c', 'postcopy-ram.c', 'savevm.c', + 'savevm-async.c', @@ -139,13 +139,15 @@ index 8a142fc7a9..a7824b5266 100644 'threadinfo.c', diff --git a/migration/savevm-async.c b/migration/savevm-async.c new file mode 100644 -index 0000000000..aa2017d496 +index 0000000000..e9fc18fb10 --- /dev/null +++ b/migration/savevm-async.c -@@ -0,0 +1,533 @@ +@@ -0,0 +1,531 @@ +#include "qemu/osdep.h" +#include "migration/channel-savevm-async.h" +#include "migration/migration.h" ++#include "migration/migration-stats.h" ++#include "migration/options.h" +#include "migration/savevm.h" +#include "migration/snapshot.h" +#include "migration/global_state.h" @@ -420,11 +422,7 @@ index 0000000000..aa2017d496 + DPRINTF("savevm iterate pending size %lu ret %d\n", pending_size, ret); + } else { + qemu_system_wakeup_request(QEMU_WAKEUP_REASON_OTHER, NULL); -+ ret = global_state_store(); -+ if (ret) { -+ save_snapshot_error("global_state_store error %d", ret); -+ break; -+ } ++ global_state_store(); + + DPRINTF("savevm iterate complete\n"); + break; @@ -485,7 +483,7 @@ index 0000000000..aa2017d496 + return; + } + -+ if (migrate_use_block()) { ++ if (migrate_block()) { + error_set(errp, ERROR_CLASS_GENERIC_ERROR, + "Block migration and snapshots are incompatible"); + return; @@ -538,7 +536,7 @@ index 0000000000..aa2017d496 + * here (blocking main thread, from QMP) to avoid race conditions. + */ + migrate_init(ms); -+ memset(&ram_counters, 0, sizeof(ram_counters)); ++ memset(&mig_stats, 0, sizeof(mig_stats)); + memset(&compression_counters, 0, sizeof(compression_counters)); + ms->to_dst_file = snap_state.file; + @@ -730,12 +728,12 @@ index 6c559b48c8..91be698308 100644 + } +} diff --git a/qapi/migration.json b/qapi/migration.json -index c84fa10e86..1702b92553 100644 +index 8843e74b59..aca0ca1ac1 100644 --- a/qapi/migration.json +++ b/qapi/migration.json -@@ -261,6 +261,40 @@ - '*compression': 'CompressionStats', - '*socket-address': ['SocketAddress'] } } +@@ -291,6 +291,40 @@ + '*dirty-limit-throttle-time-per-round': 'uint64', + '*dirty-limit-ring-full-time': 'uint64'} } +## +# @SaveVMInfo: @@ -775,10 +773,10 @@ index c84fa10e86..1702b92553 100644 # @query-migrate: # diff --git a/qapi/misc.json b/qapi/misc.json -index 6ddd16ea28..e5681ae8a2 100644 +index cda2effa81..94a58bb0bf 100644 --- a/qapi/misc.json +++ b/qapi/misc.json -@@ -469,6 +469,22 @@ +@@ -456,6 +456,22 @@ ## { 'command': 'query-fdsets', 'returns': ['FdsetInfo'] } @@ -802,10 +800,10 @@ index 6ddd16ea28..e5681ae8a2 100644 # @CommandLineParameterType: # diff --git a/qemu-options.hx b/qemu-options.hx -index fdddfab6ff..fdd551c2bb 100644 +index b56f6b2fb2..c8c78c92d4 100644 --- a/qemu-options.hx +++ b/qemu-options.hx -@@ -4398,6 +4398,18 @@ SRST +@@ -4479,6 +4479,18 @@ SRST Start right away with a saved state (``loadvm`` in monitor) ERST @@ -825,7 +823,7 @@ index fdddfab6ff..fdd551c2bb 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 ea20b23e4c..0eabc71b68 100644 +index b0b96f67fa..f3251de3e7 100644 --- a/softmmu/vl.c +++ b/softmmu/vl.c @@ -164,6 +164,7 @@ static const char *accelerators; @@ -836,7 +834,7 @@ index ea20b23e4c..0eabc71b68 100644 static QTAILQ_HEAD(, ObjectOption) object_opts = QTAILQ_HEAD_INITIALIZER(object_opts); static QTAILQ_HEAD(, DeviceOption) device_opts = QTAILQ_HEAD_INITIALIZER(device_opts); static int display_remote; -@@ -2612,6 +2613,12 @@ void qmp_x_exit_preconfig(Error **errp) +@@ -2643,6 +2644,12 @@ void qmp_x_exit_preconfig(Error **errp) if (loadvm) { load_snapshot(loadvm, NULL, false, NULL, &error_fatal); @@ -849,7 +847,7 @@ index ea20b23e4c..0eabc71b68 100644 } if (replay_mode != REPLAY_MODE_NONE) { replay_vmstate_init(); -@@ -3159,6 +3166,9 @@ void qemu_init(int argc, char **argv) +@@ -3190,6 +3197,9 @@ void qemu_init(int argc, char **argv) case QEMU_OPTION_loadvm: loadvm = optarg; break; diff --git a/debian/patches/pve/0018-PVE-add-optional-buffer-size-to-QEMUFile.patch b/debian/patches/pve/0018-PVE-add-optional-buffer-size-to-QEMUFile.patch index f5f6f7b..c946137 100644 --- a/debian/patches/pve/0018-PVE-add-optional-buffer-size-to-QEMUFile.patch +++ b/debian/patches/pve/0018-PVE-add-optional-buffer-size-to-QEMUFile.patch @@ -19,11 +19,11 @@ Signed-off-by: Fiona Ebner 3 files changed, 38 insertions(+), 18 deletions(-) diff --git a/migration/qemu-file.c b/migration/qemu-file.c -index 102ab3b439..5ced17aba4 100644 +index 19c33c9985..e9ffff0f0a 100644 --- a/migration/qemu-file.c +++ b/migration/qemu-file.c -@@ -31,8 +31,8 @@ - #include "trace.h" +@@ -33,8 +33,8 @@ + #include "options.h" #include "qapi/error.h" -#define IO_BUF_SIZE 32768 @@ -33,7 +33,7 @@ index 102ab3b439..5ced17aba4 100644 struct QEMUFile { const QEMUFileHooks *hooks; -@@ -55,7 +55,8 @@ struct QEMUFile { +@@ -46,7 +46,8 @@ struct QEMUFile { int buf_index; int buf_size; /* 0 when writing */ @@ -43,8 +43,8 @@ index 102ab3b439..5ced17aba4 100644 DECLARE_BITMAP(may_free, MAX_IOV_SIZE); struct iovec iov[MAX_IOV_SIZE]; -@@ -127,7 +128,9 @@ bool qemu_file_mode_is_not_valid(const char *mode) - return false; +@@ -100,7 +101,9 @@ int qemu_file_shutdown(QEMUFile *f) + return 0; } -static QEMUFile *qemu_file_new_impl(QIOChannel *ioc, bool is_writable) @@ -54,7 +54,7 @@ index 102ab3b439..5ced17aba4 100644 { QEMUFile *f; -@@ -136,6 +139,8 @@ static QEMUFile *qemu_file_new_impl(QIOChannel *ioc, bool is_writable) +@@ -109,6 +112,8 @@ static QEMUFile *qemu_file_new_impl(QIOChannel *ioc, bool is_writable) object_ref(ioc); f->ioc = ioc; f->is_writable = is_writable; @@ -63,7 +63,7 @@ index 102ab3b439..5ced17aba4 100644 return f; } -@@ -146,17 +151,27 @@ static QEMUFile *qemu_file_new_impl(QIOChannel *ioc, bool is_writable) +@@ -119,17 +124,27 @@ static QEMUFile *qemu_file_new_impl(QIOChannel *ioc, bool is_writable) */ QEMUFile *qemu_file_get_return_path(QEMUFile *f) { @@ -94,7 +94,7 @@ index 102ab3b439..5ced17aba4 100644 } void qemu_file_set_hooks(QEMUFile *f, const QEMUFileHooks *hooks) -@@ -414,7 +429,7 @@ static ssize_t qemu_fill_buffer(QEMUFile *f) +@@ -375,7 +390,7 @@ static ssize_t coroutine_mixed_fn qemu_fill_buffer(QEMUFile *f) do { len = qio_channel_read(f->ioc, (char *)f->buf + pending, @@ -103,7 +103,7 @@ index 102ab3b439..5ced17aba4 100644 &local_error); if (len == QIO_CHANNEL_ERR_BLOCK) { if (qemu_in_coroutine()) { -@@ -464,6 +479,8 @@ int qemu_fclose(QEMUFile *f) +@@ -425,6 +440,8 @@ int qemu_fclose(QEMUFile *f) } g_clear_pointer(&f->ioc, object_unref); @@ -112,7 +112,7 @@ index 102ab3b439..5ced17aba4 100644 /* If any error was spotted before closing, we should report it * instead of the close() return value. */ -@@ -518,7 +535,7 @@ static void add_buf_to_iovec(QEMUFile *f, size_t len) +@@ -479,7 +496,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; @@ -121,7 +121,7 @@ index 102ab3b439..5ced17aba4 100644 qemu_fflush(f); } } -@@ -544,7 +561,7 @@ void qemu_put_buffer(QEMUFile *f, const uint8_t *buf, size_t size) +@@ -504,7 +521,7 @@ void qemu_put_buffer(QEMUFile *f, const uint8_t *buf, size_t size) } while (size > 0) { @@ -130,7 +130,7 @@ index 102ab3b439..5ced17aba4 100644 if (l > size) { l = size; } -@@ -591,8 +608,8 @@ size_t qemu_peek_buffer(QEMUFile *f, uint8_t **buf, size_t size, size_t offset) +@@ -549,8 +566,8 @@ size_t coroutine_mixed_fn qemu_peek_buffer(QEMUFile *f, uint8_t **buf, size_t si size_t index; assert(!qemu_file_is_writable(f)); @@ -141,7 +141,7 @@ index 102ab3b439..5ced17aba4 100644 /* The 1st byte to read from */ index = f->buf_index + offset; -@@ -642,7 +659,7 @@ size_t qemu_get_buffer(QEMUFile *f, uint8_t *buf, size_t size) +@@ -600,7 +617,7 @@ size_t coroutine_mixed_fn qemu_get_buffer(QEMUFile *f, uint8_t *buf, size_t size size_t res; uint8_t *src; @@ -150,16 +150,16 @@ index 102ab3b439..5ced17aba4 100644 if (res == 0) { return done; } -@@ -676,7 +693,7 @@ size_t qemu_get_buffer(QEMUFile *f, uint8_t *buf, size_t size) +@@ -634,7 +651,7 @@ size_t coroutine_mixed_fn 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) + size_t coroutine_mixed_fn qemu_get_buffer_in_place(QEMUFile *f, uint8_t **buf, size_t size) { - if (size < IO_BUF_SIZE) { + if (size < f->buf_allocated_size) { size_t res; uint8_t *src = NULL; -@@ -701,7 +718,7 @@ int qemu_peek_byte(QEMUFile *f, int offset) +@@ -659,7 +676,7 @@ int coroutine_mixed_fn qemu_peek_byte(QEMUFile *f, int offset) int index = f->buf_index + offset; assert(!qemu_file_is_writable(f)); @@ -168,7 +168,7 @@ index 102ab3b439..5ced17aba4 100644 if (index >= f->buf_size) { qemu_fill_buffer(f); -@@ -853,7 +870,7 @@ static int qemu_compress_data(z_stream *stream, uint8_t *dest, size_t dest_len, +@@ -777,7 +794,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) { @@ -178,7 +178,7 @@ index 102ab3b439..5ced17aba4 100644 if (blen < compressBound(size)) { return -1; diff --git a/migration/qemu-file.h b/migration/qemu-file.h -index 9d0155a2a1..cc06240e8d 100644 +index 47015f5201..1312b7c903 100644 --- a/migration/qemu-file.h +++ b/migration/qemu-file.h @@ -63,7 +63,9 @@ typedef struct QEMUFileHooks { @@ -192,10 +192,10 @@ index 9d0155a2a1..cc06240e8d 100644 int qemu_fclose(QEMUFile *f); diff --git a/migration/savevm-async.c b/migration/savevm-async.c -index aa2017d496..b97f2c4f14 100644 +index e9fc18fb10..80624fada8 100644 --- a/migration/savevm-async.c +++ b/migration/savevm-async.c -@@ -380,7 +380,7 @@ void qmp_savevm_start(const char *statefile, Error **errp) +@@ -378,7 +378,7 @@ void qmp_savevm_start(const char *statefile, Error **errp) QIOChannel *ioc = QIO_CHANNEL(qio_channel_savevm_async_new(snap_state.target, &snap_state.bs_pos)); @@ -204,7 +204,7 @@ index aa2017d496..b97f2c4f14 100644 if (!snap_state.file) { error_set(errp, ERROR_CLASS_GENERIC_ERROR, "failed to open '%s'", statefile); -@@ -498,7 +498,8 @@ int load_snapshot_from_blockdev(const char *filename, Error **errp) +@@ -496,7 +496,8 @@ int load_snapshot_from_blockdev(const char *filename, Error **errp) blk_op_block_all(be, blocker); /* restore the VM state */ diff --git a/debian/patches/pve/0019-PVE-block-add-the-zeroinit-block-driver-filter.patch b/debian/patches/pve/0019-PVE-block-add-the-zeroinit-block-driver-filter.patch index 39264ee..1cb8166 100644 --- a/debian/patches/pve/0019-PVE-block-add-the-zeroinit-block-driver-filter.patch +++ b/debian/patches/pve/0019-PVE-block-add-the-zeroinit-block-driver-filter.patch @@ -13,17 +13,17 @@ Signed-off-by: Fiona Ebner create mode 100644 block/zeroinit.c diff --git a/block/meson.build b/block/meson.build -index 382bec0e7d..253fe49fa2 100644 +index 529fc172c6..1833c71ce9 100644 --- a/block/meson.build +++ b/block/meson.build -@@ -44,6 +44,7 @@ block_ss.add(files( - 'vmdk.c', - 'vpc.c', +@@ -40,6 +40,7 @@ block_ss.add(files( + 'throttle-groups.c', + 'throttle.c', 'write-threshold.c', + 'zeroinit.c', ), zstd, zlib, gnutls) - softmmu_ss.add(when: 'CONFIG_TCG', if_true: files('blkreplay.c')) + system_ss.add(when: 'CONFIG_TCG', if_true: files('blkreplay.c')) diff --git a/block/zeroinit.c b/block/zeroinit.c new file mode 100644 index 0000000000..1257342724 diff --git a/debian/patches/pve/0020-PVE-Add-dummy-id-command-line-parameter.patch b/debian/patches/pve/0020-PVE-Add-dummy-id-command-line-parameter.patch index 2c44e34..5327c11 100644 --- a/debian/patches/pve/0020-PVE-Add-dummy-id-command-line-parameter.patch +++ b/debian/patches/pve/0020-PVE-Add-dummy-id-command-line-parameter.patch @@ -14,10 +14,10 @@ Signed-off-by: Thomas Lamprecht 2 files changed, 11 insertions(+) diff --git a/qemu-options.hx b/qemu-options.hx -index fdd551c2bb..4eb43b7bc5 100644 +index c8c78c92d4..20ca2cdba7 100644 --- a/qemu-options.hx +++ b/qemu-options.hx -@@ -1162,6 +1162,9 @@ legacy PC, they are not recommended for modern configurations. +@@ -1197,6 +1197,9 @@ legacy PC, they are not recommended for modern configurations. ERST @@ -28,10 +28,10 @@ index fdd551c2bb..4eb43b7bc5 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 0eabc71b68..323f6a23d4 100644 +index f3251de3e7..1b63ffd33d 100644 --- a/softmmu/vl.c +++ b/softmmu/vl.c -@@ -2648,6 +2648,7 @@ void qemu_init(int argc, char **argv) +@@ -2679,6 +2679,7 @@ void qemu_init(int argc, char **argv) MachineClass *machine_class; bool userconfig = true; FILE *vmstate_dump_file = NULL; @@ -39,7 +39,7 @@ index 0eabc71b68..323f6a23d4 100644 qemu_add_opts(&qemu_drive_opts); qemu_add_drive_opts(&qemu_legacy_drive_opts); -@@ -3271,6 +3272,13 @@ void qemu_init(int argc, char **argv) +@@ -3302,6 +3303,13 @@ void qemu_init(int argc, char **argv) machine_parse_property_opt(qemu_find_opts("smp-opts"), "smp", optarg); break; diff --git a/debian/patches/pve/0022-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 index e9e9f12..766c4f9 100644 --- a/debian/patches/pve/0022-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 9681bd0434..044890822d 100644 +index 0db366a851..46f1ee38ae 100644 --- a/block/file-posix.c +++ b/block/file-posix.c -@@ -2483,6 +2483,7 @@ raw_co_create(BlockdevCreateOptions *options, Error **errp) +@@ -2870,6 +2870,7 @@ raw_co_create(BlockdevCreateOptions *options, Error **errp) int fd; uint64_t perm, shared; int result = 0; @@ -24,7 +24,7 @@ index 9681bd0434..044890822d 100644 /* Validate options and set default values */ assert(options->driver == BLOCKDEV_DRIVER_FILE); -@@ -2523,19 +2524,22 @@ raw_co_create(BlockdevCreateOptions *options, Error **errp) +@@ -2910,19 +2911,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 9681bd0434..044890822d 100644 } /* Clear the file by truncating it to 0 */ -@@ -2589,13 +2593,15 @@ raw_co_create(BlockdevCreateOptions *options, Error **errp) +@@ -2976,13 +2980,15 @@ raw_co_create(BlockdevCreateOptions *options, Error **errp) } out_unlock: @@ -82,7 +82,7 @@ index 9681bd0434..044890822d 100644 } out_close: -@@ -2619,6 +2625,7 @@ raw_co_create_opts(BlockDriver *drv, const char *filename, +@@ -3006,6 +3012,7 @@ raw_co_create_opts(BlockDriver *drv, const char *filename, PreallocMode prealloc; char *buf = NULL; Error *local_err = NULL; @@ -90,7 +90,7 @@ index 9681bd0434..044890822d 100644 /* Skip file: protocol prefix */ strstart(filename, "file:", &filename); -@@ -2641,6 +2648,18 @@ raw_co_create_opts(BlockDriver *drv, const char *filename, +@@ -3028,6 +3035,18 @@ raw_co_create_opts(BlockDriver *drv, const char *filename, return -EINVAL; } @@ -109,7 +109,7 @@ index 9681bd0434..044890822d 100644 options = (BlockdevCreateOptions) { .driver = BLOCKDEV_DRIVER_FILE, .u.file = { -@@ -2652,6 +2671,8 @@ raw_co_create_opts(BlockDriver *drv, const char *filename, +@@ -3039,6 +3058,8 @@ raw_co_create_opts(BlockDriver *drv, const char *filename, .nocow = nocow, .has_extent_size_hint = has_extent_size_hint, .extent_size_hint = extent_size_hint, @@ -119,10 +119,10 @@ index 9681bd0434..044890822d 100644 }; return raw_co_create(&options, errp); diff --git a/qapi/block-core.json b/qapi/block-core.json -index 3c945c1f93..542add004b 100644 +index 903392cb8f..125aa89858 100644 --- a/qapi/block-core.json +++ b/qapi/block-core.json -@@ -4740,7 +4740,8 @@ +@@ -4876,7 +4876,8 @@ 'size': 'size', '*preallocation': 'PreallocMode', '*nocow': 'bool', diff --git a/debian/patches/pve/0023-PVE-monitor-disable-oob-capability.patch b/debian/patches/pve/0023-PVE-monitor-disable-oob-capability.patch index 9abde33..e2f16af 100644 --- a/debian/patches/pve/0023-PVE-monitor-disable-oob-capability.patch +++ b/debian/patches/pve/0023-PVE-monitor-disable-oob-capability.patch @@ -18,10 +18,10 @@ Signed-off-by: Thomas Lamprecht 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/monitor/qmp.c b/monitor/qmp.c -index 6b8cfcf6d8..3ec67e32d3 100644 +index c15bf1e1fc..04fe25c62c 100644 --- a/monitor/qmp.c +++ b/monitor/qmp.c -@@ -519,8 +519,7 @@ void monitor_init_qmp(Chardev *chr, bool pretty, Error **errp) +@@ -553,8 +553,7 @@ void monitor_init_qmp(Chardev *chr, bool pretty, Error **errp) qemu_chr_fe_set_echo(&mon->common.chr, true); /* Note: we run QMP monitor in I/O thread when @chr supports that */ diff --git a/debian/patches/pve/0024-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 index 79008ee..277fa3f 100644 --- a/debian/patches/pve/0024-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 2f6ccf5623..a5927e92f1 100644 +index f0d35c6401..1427983543 100644 --- a/hw/core/machine.c +++ b/hw/core/machine.c -@@ -142,7 +142,8 @@ GlobalProperty hw_compat_4_0[] = { +@@ -148,7 +148,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/0025-PVE-Allow-version-code-in-machine-type.patch b/debian/patches/pve/0025-PVE-Allow-version-code-in-machine-type.patch index d88d1d0..5ec00c1 100644 --- a/debian/patches/pve/0025-PVE-Allow-version-code-in-machine-type.patch +++ b/debian/patches/pve/0025-PVE-Allow-version-code-in-machine-type.patch @@ -21,10 +21,10 @@ Signed-off-by: Fiona Ebner 4 files changed, 35 insertions(+), 1 deletion(-) diff --git a/hw/core/machine-qmp-cmds.c b/hw/core/machine-qmp-cmds.c -index 24595f618c..ee9cb0cd04 100644 +index 40821e2317..ee93ddd69a 100644 --- a/hw/core/machine-qmp-cmds.c +++ b/hw/core/machine-qmp-cmds.c -@@ -107,6 +107,11 @@ MachineInfoList *qmp_query_machines(Error **errp) +@@ -95,6 +95,11 @@ MachineInfoList *qmp_query_machines(Error **errp) if (strcmp(mc->name, MACHINE_GET_CLASS(current_machine)->name) == 0) { info->has_is_current = true; info->is_current = true; @@ -37,10 +37,10 @@ index 24595f618c..ee9cb0cd04 100644 if (mc->default_cpu_type) { diff --git a/include/hw/boards.h b/include/hw/boards.h -index 6fbbfd56c8..61a526e97d 100644 +index ed83360198..f8b88cd86a 100644 --- a/include/hw/boards.h +++ b/include/hw/boards.h -@@ -232,6 +232,8 @@ struct MachineClass { +@@ -235,6 +235,8 @@ struct MachineClass { const char *desc; const char *deprecation_reason; @@ -50,10 +50,10 @@ index 6fbbfd56c8..61a526e97d 100644 void (*reset)(MachineState *state, ShutdownCause reason); void (*wakeup)(MachineState *state); diff --git a/qapi/machine.json b/qapi/machine.json -index c904280085..47f3facdb2 100644 +index fbb61f18e4..7da3c519ba 100644 --- a/qapi/machine.json +++ b/qapi/machine.json -@@ -159,6 +159,8 @@ +@@ -161,6 +161,8 @@ # # @acpi: machine type supports ACPI (since 8.0) # @@ -62,7 +62,7 @@ index c904280085..47f3facdb2 100644 # Since: 1.2 ## { 'struct': 'MachineInfo', -@@ -166,7 +168,7 @@ +@@ -168,7 +170,7 @@ '*is-default': 'bool', '*is-current': 'bool', 'cpu-max': 'int', 'hotpluggable-cpus': 'bool', 'numa-mem-supported': 'bool', 'deprecated': 'bool', '*default-cpu-type': 'str', @@ -72,10 +72,10 @@ index c904280085..47f3facdb2 100644 ## # @query-machines: diff --git a/softmmu/vl.c b/softmmu/vl.c -index 323f6a23d4..25abdc9da7 100644 +index 1b63ffd33d..20ba2c5c87 100644 --- a/softmmu/vl.c +++ b/softmmu/vl.c -@@ -1578,6 +1578,7 @@ static const QEMUOption *lookup_opt(int argc, char **argv, +@@ -1597,6 +1597,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"); @@ -83,7 +83,7 @@ index 323f6a23d4..25abdc9da7 100644 GSList *machines = object_class_get_list(TYPE_MACHINE, false); MachineClass *machine_class; Error *local_err = NULL; -@@ -1595,6 +1596,11 @@ static MachineClass *select_machine(QDict *qdict, Error **errp) +@@ -1614,6 +1615,11 @@ static MachineClass *select_machine(QDict *qdict, Error **errp) } } @@ -95,7 +95,7 @@ index 323f6a23d4..25abdc9da7 100644 g_slist_free(machines); if (local_err) { error_append_hint(&local_err, "Use -machine help to list supported machines\n"); -@@ -3213,12 +3219,31 @@ void qemu_init(int argc, char **argv) +@@ -3244,12 +3250,31 @@ void qemu_init(int argc, char **argv) case QEMU_OPTION_machine: { bool help; diff --git a/debian/patches/pve/0027-PVE-Backup-add-vma-backup-format-code.patch b/debian/patches/pve/0027-PVE-Backup-add-vma-backup-format-code.patch index 857d22d..f42a06f 100644 --- a/debian/patches/pve/0027-PVE-Backup-add-vma-backup-format-code.patch +++ b/debian/patches/pve/0027-PVE-Backup-add-vma-backup-format-code.patch @@ -26,23 +26,23 @@ Signed-off-by: Fiona Ebner create mode 100644 vma.h diff --git a/block/meson.build b/block/meson.build -index 253fe49fa2..744b698a82 100644 +index 1833c71ce9..59b71ba9f3 100644 --- a/block/meson.build +++ b/block/meson.build -@@ -47,6 +47,8 @@ block_ss.add(files( +@@ -43,6 +43,8 @@ block_ss.add(files( 'zeroinit.c', ), zstd, zlib, gnutls) +block_ss.add(files('../vma-writer.c'), libuuid) + - softmmu_ss.add(when: 'CONFIG_TCG', if_true: files('blkreplay.c')) - softmmu_ss.add(files('block-ram-registrar.c')) + system_ss.add(when: 'CONFIG_TCG', if_true: files('blkreplay.c')) + system_ss.add(files('block-ram-registrar.c')) diff --git a/meson.build b/meson.build -index 30447cfaef..38a4e2bcef 100644 +index a9c4f28247..cd95530d3b 100644 --- a/meson.build +++ b/meson.build -@@ -1527,6 +1527,8 @@ keyutils = dependency('libkeyutils', required: false, +@@ -1778,6 +1778,8 @@ endif has_gettid = cc.has_function('gettid') @@ -51,7 +51,7 @@ index 30447cfaef..38a4e2bcef 100644 # libselinux selinux = dependency('libselinux', required: get_option('selinux'), -@@ -3650,6 +3652,9 @@ if have_tools +@@ -3908,6 +3910,9 @@ if have_tools dependencies: [blockdev, qemuutil, gnutls, selinux], install: true) @@ -936,7 +936,7 @@ index 0000000000..81a891c6b1 + diff --git a/vma-writer.c b/vma-writer.c new file mode 100644 -index 0000000000..ac7da237d0 +index 0000000000..6b7af81cae --- /dev/null +++ b/vma-writer.c @@ -0,0 +1,793 @@ @@ -1146,10 +1146,10 @@ index 0000000000..ac7da237d0 +{ + assert(qemu_in_coroutine()); + AioContext *ctx = qemu_get_current_aio_context(); -+ aio_set_fd_handler(ctx, fd, false, NULL, (IOHandler *)qemu_coroutine_enter, -+ NULL, NULL, qemu_coroutine_self()); ++ aio_set_fd_handler(ctx, fd, NULL, (IOHandler *)qemu_coroutine_enter, NULL, ++ NULL, qemu_coroutine_self()); + qemu_coroutine_yield(); -+ aio_set_fd_handler(ctx, fd, false, NULL, NULL, NULL, NULL, NULL); ++ aio_set_fd_handler(ctx, fd, NULL, NULL, NULL, NULL, NULL); +} + +static ssize_t coroutine_fn diff --git a/debian/patches/pve/0028-PVE-Backup-add-backup-dump-block-driver.patch b/debian/patches/pve/0028-PVE-Backup-add-backup-dump-block-driver.patch index cc4a679..0d7fd96 100644 --- a/debian/patches/pve/0028-PVE-Backup-add-backup-dump-block-driver.patch +++ b/debian/patches/pve/0028-PVE-Backup-add-backup-dump-block-driver.patch @@ -243,7 +243,7 @@ index 39410dcf8d..af87fa6aa9 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 744b698a82..f580f95395 100644 +index 59b71ba9f3..6fde9f7dcd 100644 --- a/block/meson.build +++ b/block/meson.build @@ -4,6 +4,7 @@ block_ss.add(files( @@ -255,7 +255,7 @@ index 744b698a82..f580f95395 100644 'blkdebug.c', 'blklogwrites.c', diff --git a/include/block/block_int-common.h b/include/block/block_int-common.h -index f01bb8b617..d7ffd1826e 100644 +index 74195c3004..0f2e1817ad 100644 --- a/include/block/block_int-common.h +++ b/include/block/block_int-common.h @@ -26,6 +26,7 @@ diff --git a/debian/patches/pve/0030-PVE-Backup-Proxmox-backup-patches-for-QEMU.patch b/debian/patches/pve/0030-PVE-Backup-Proxmox-backup-patches-for-QEMU.patch index 7a4881b..b32c995 100644 --- a/debian/patches/pve/0030-PVE-Backup-Proxmox-backup-patches-for-QEMU.patch +++ b/debian/patches/pve/0030-PVE-Backup-Proxmox-backup-patches-for-QEMU.patch @@ -84,30 +84,68 @@ Signed-off-by: Wolfgang Bumiller create jobs in a drained section] Signed-off-by: Fiona Ebner --- - block/meson.build | 5 + - block/monitor/block-hmp-cmds.c | 39 ++ - blockdev.c | 1 + - hmp-commands-info.hx | 14 + - hmp-commands.hx | 29 + - include/monitor/hmp.h | 3 + - meson.build | 1 + - monitor/hmp-cmds.c | 72 +++ - proxmox-backup-client.c | 146 +++++ - proxmox-backup-client.h | 60 ++ - pve-backup.c | 1067 ++++++++++++++++++++++++++++++++ - qapi/block-core.json | 229 +++++++ - qapi/common.json | 13 + - qapi/machine.json | 15 +- - 14 files changed, 1681 insertions(+), 13 deletions(-) + block/backup-dump.c | 10 +- + block/meson.build | 5 + + block/monitor/block-hmp-cmds.c | 39 ++ + blockdev.c | 1 + + hmp-commands-info.hx | 14 + + hmp-commands.hx | 29 + + include/block/block_int-common.h | 2 +- + include/monitor/hmp.h | 3 + + meson.build | 1 + + monitor/hmp-cmds.c | 72 ++ + proxmox-backup-client.c | 146 ++++ + proxmox-backup-client.h | 60 ++ + pve-backup.c | 1067 ++++++++++++++++++++++++++++++ + qapi/block-core.json | 229 +++++++ + qapi/common.json | 14 + + qapi/machine.json | 16 +- + 16 files changed, 1690 insertions(+), 18 deletions(-) create mode 100644 proxmox-backup-client.c create mode 100644 proxmox-backup-client.h create mode 100644 pve-backup.c +diff --git a/block/backup-dump.c b/block/backup-dump.c +index 232a094426..e46abf1070 100644 +--- a/block/backup-dump.c ++++ b/block/backup-dump.c +@@ -9,6 +9,8 @@ + */ + + #include "qemu/osdep.h" ++ ++#include "qapi/qmp/qdict.h" + #include "qom/object_interfaces.h" + #include "block/block_int.h" + +@@ -141,7 +143,7 @@ static void bdrv_backup_dump_init(void) + block_init(bdrv_backup_dump_init); + + +-BlockDriverState *bdrv_backup_dump_create( ++BlockDriverState *coroutine_fn bdrv_co_backup_dump_create( + int dump_cb_block_size, + uint64_t byte_size, + BackupDumpFunc *dump_cb, +@@ -149,9 +151,11 @@ BlockDriverState *bdrv_backup_dump_create( + Error **errp) + { + BDRVBackupDumpState *state; +- BlockDriverState *bs = bdrv_new_open_driver( +- &bdrv_backup_dump_drive, NULL, BDRV_O_RDWR, errp); + ++ QDict *options = qdict_new(); ++ qdict_put_str(options, "driver", "backup-dump-drive"); ++ ++ BlockDriverState *bs = bdrv_co_open(NULL, NULL, options, BDRV_O_RDWR, errp); + if (!bs) { + return NULL; + } diff --git a/block/meson.build b/block/meson.build -index f580f95395..5bcebb934b 100644 +index 6fde9f7dcd..6d468f89e5 100644 --- a/block/meson.build +++ b/block/meson.build -@@ -49,6 +49,11 @@ block_ss.add(files( +@@ -45,6 +45,11 @@ block_ss.add(files( ), zstd, zlib, gnutls) block_ss.add(files('../vma-writer.c'), libuuid) @@ -117,8 +155,8 @@ index f580f95395..5bcebb934b 100644 +), libproxmox_backup_qemu) + - softmmu_ss.add(when: 'CONFIG_TCG', if_true: files('blkreplay.c')) - softmmu_ss.add(files('block-ram-registrar.c')) + system_ss.add(when: 'CONFIG_TCG', if_true: files('blkreplay.c')) + system_ss.add(files('block-ram-registrar.c')) diff --git a/block/monitor/block-hmp-cmds.c b/block/monitor/block-hmp-cmds.c index ca2599de44..6efe28cef5 100644 --- a/block/monitor/block-hmp-cmds.c @@ -167,7 +205,7 @@ index ca2599de44..6efe28cef5 100644 + hmp_handle_error(mon, error); +} diff --git a/blockdev.c b/blockdev.c -index bdae211a54..315a27fc09 100644 +index 060d86a65f..79c3575612 100644 --- a/blockdev.c +++ b/blockdev.c @@ -37,6 +37,7 @@ @@ -179,10 +217,10 @@ index bdae211a54..315a27fc09 100644 #include "monitor/monitor.h" #include "qemu/error-report.h" diff --git a/hmp-commands-info.hx b/hmp-commands-info.hx -index a166bff3d5..4b75966c2e 100644 +index 10fdd822e0..15937793c1 100644 --- a/hmp-commands-info.hx +++ b/hmp-commands-info.hx -@@ -486,6 +486,20 @@ SRST +@@ -471,6 +471,20 @@ SRST Show the current VM UUID. ERST @@ -204,7 +242,7 @@ index a166bff3d5..4b75966c2e 100644 { .name = "usernet", diff --git a/hmp-commands.hx b/hmp-commands.hx -index d9f9f42d11..ddb9678dc3 100644 +index e352f86872..0c8b6725fb 100644 --- a/hmp-commands.hx +++ b/hmp-commands.hx @@ -101,6 +101,35 @@ ERST @@ -243,8 +281,21 @@ index d9f9f42d11..ddb9678dc3 100644 ERST { +diff --git a/include/block/block_int-common.h b/include/block/block_int-common.h +index 0f2e1817ad..0a0339eee4 100644 +--- a/include/block/block_int-common.h ++++ b/include/block/block_int-common.h +@@ -63,7 +63,7 @@ + + typedef int BackupDumpFunc(void *opaque, uint64_t offset, uint64_t bytes, const void *buf); + +-BlockDriverState *bdrv_backup_dump_create( ++BlockDriverState *coroutine_fn bdrv_co_backup_dump_create( + int dump_cb_block_size, + uint64_t byte_size, + BackupDumpFunc *dump_cb, diff --git a/include/monitor/hmp.h b/include/monitor/hmp.h -index fdf6b45fb8..e01b2201d8 100644 +index 7a7def7530..cba7afe70c 100644 --- a/include/monitor/hmp.h +++ b/include/monitor/hmp.h @@ -32,6 +32,7 @@ void hmp_info_savevm(Monitor *mon, const QDict *qdict); @@ -265,10 +316,10 @@ index fdf6b45fb8..e01b2201d8 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 38a4e2bcef..443b3238f9 100644 +index cd95530d3b..d53976d621 100644 --- a/meson.build +++ b/meson.build -@@ -1528,6 +1528,7 @@ keyutils = dependency('libkeyutils', required: false, +@@ -1779,6 +1779,7 @@ endif has_gettid = cc.has_function('gettid') libuuid = cc.find_library('uuid', required: true) @@ -586,7 +637,7 @@ index 0000000000..8cbf645b2c +#endif /* PROXMOX_BACKUP_CLIENT_H */ diff --git a/pve-backup.c b/pve-backup.c new file mode 100644 -index 0000000000..21441b2f97 +index 0000000000..d84d807654 --- /dev/null +++ b/pve-backup.c @@ -0,0 +1,1067 @@ @@ -1394,7 +1445,7 @@ index 0000000000..21441b2f97 + goto err_mutex; + } + -+ if (!(di->target = bdrv_backup_dump_create(dump_cb_block_size, di->size, pvebackup_co_dump_pbs_cb, di, errp))) { ++ if (!(di->target = bdrv_co_backup_dump_create(dump_cb_block_size, di->size, pvebackup_co_dump_pbs_cb, di, errp))) { + goto err_mutex; + } + @@ -1422,7 +1473,7 @@ index 0000000000..21441b2f97 + PVEBackupDevInfo *di = (PVEBackupDevInfo *)l->data; + l = g_list_next(l); + -+ if (!(di->target = bdrv_backup_dump_create(VMA_CLUSTER_SIZE, di->size, pvebackup_co_dump_vma_cb, di, errp))) { ++ if (!(di->target = bdrv_co_backup_dump_create(VMA_CLUSTER_SIZE, di->size, pvebackup_co_dump_vma_cb, di, errp))) { + goto err_mutex; + } + @@ -1658,10 +1709,10 @@ index 0000000000..21441b2f97 + return ret; +} diff --git a/qapi/block-core.json b/qapi/block-core.json -index 542add004b..985859ddee 100644 +index 125aa89858..331c8336d1 100644 --- a/qapi/block-core.json +++ b/qapi/block-core.json -@@ -835,6 +835,235 @@ +@@ -839,6 +839,235 @@ { 'command': 'query-block', 'returns': ['BlockInfo'], 'allow-preconfig': true } @@ -1898,10 +1949,10 @@ index 542add004b..985859ddee 100644 # @BlockDeviceTimedStats: # diff --git a/qapi/common.json b/qapi/common.json -index 356db3f670..aae8a3b682 100644 +index 6fed9cde1a..630a2a8f9a 100644 --- a/qapi/common.json +++ b/qapi/common.json -@@ -206,3 +206,16 @@ +@@ -207,3 +207,17 @@ ## { 'struct': 'HumanReadableText', 'data': { 'human-readable-text': 'str' } } @@ -1915,11 +1966,12 @@ index 356db3f670..aae8a3b682 100644 +# +# Since: 0.14.0 +# -+# Notes: If no UUID was specified for the guest, a null UUID is returned. ++# Notes: If no UUID was specified for the guest, a null UUID is ++# returned. +## +{ 'struct': 'UuidInfo', 'data': {'UUID': 'str'} } diff --git a/qapi/machine.json b/qapi/machine.json -index 47f3facdb2..46760978ae 100644 +index 7da3c519ba..888457f810 100644 --- a/qapi/machine.json +++ b/qapi/machine.json @@ -4,6 +4,8 @@ @@ -1931,7 +1983,7 @@ index 47f3facdb2..46760978ae 100644 ## # = Machines ## -@@ -228,19 +230,6 @@ +@@ -230,20 +232,6 @@ ## { 'command': 'query-target', 'returns': 'TargetInfo' } @@ -1944,7 +1996,8 @@ index 47f3facdb2..46760978ae 100644 -# -# Since: 0.14 -# --# Notes: If no UUID was specified for the guest, a null UUID is returned. +-# Notes: If no UUID was specified for the guest, a null UUID is +-# returned. -## -{ 'struct': 'UuidInfo', 'data': {'UUID': 'str'} } - diff --git a/debian/patches/pve/0031-PVE-Backup-pbs-restore-new-command-to-restore-from-p.patch b/debian/patches/pve/0031-PVE-Backup-pbs-restore-new-command-to-restore-from-p.patch index da798b9..2d35795 100644 --- a/debian/patches/pve/0031-PVE-Backup-pbs-restore-new-command-to-restore-from-p.patch +++ b/debian/patches/pve/0031-PVE-Backup-pbs-restore-new-command-to-restore-from-p.patch @@ -14,10 +14,10 @@ Signed-off-by: Wolfgang Bumiller create mode 100644 pbs-restore.c diff --git a/meson.build b/meson.build -index 443b3238f9..32ab849ce6 100644 +index d53976d621..c3330310d9 100644 --- a/meson.build +++ b/meson.build -@@ -3656,6 +3656,10 @@ if have_tools +@@ -3914,6 +3914,10 @@ if have_tools vma = executable('vma', files('vma.c', 'vma-reader.c') + genh, dependencies: [authz, block, crypto, io, qom], install: true) diff --git a/debian/patches/pve/0032-PVE-Add-PBS-block-driver-to-map-backup-archives-into.patch b/debian/patches/pve/0032-PVE-Add-PBS-block-driver-to-map-backup-archives-into.patch index 102cfcf..5657376 100644 --- a/debian/patches/pve/0032-PVE-Add-PBS-block-driver-to-map-backup-archives-into.patch +++ b/debian/patches/pve/0032-PVE-Add-PBS-block-driver-to-map-backup-archives-into.patch @@ -24,10 +24,10 @@ Signed-off-by: Fiona Ebner create mode 100644 block/pbs.c diff --git a/block/meson.build b/block/meson.build -index 5bcebb934b..eece0d5743 100644 +index 6d468f89e5..becc99ac4e 100644 --- a/block/meson.build +++ b/block/meson.build -@@ -54,6 +54,9 @@ block_ss.add(files( +@@ -50,6 +50,9 @@ block_ss.add(files( '../pve-backup.c', ), libproxmox_backup_qemu) @@ -35,8 +35,8 @@ index 5bcebb934b..eece0d5743 100644 +block_ss.add(when: 'CONFIG_PBS_BDRV', if_true: libproxmox_backup_qemu) + - softmmu_ss.add(when: 'CONFIG_TCG', if_true: files('blkreplay.c')) - softmmu_ss.add(files('block-ram-registrar.c')) + system_ss.add(when: 'CONFIG_TCG', if_true: files('blkreplay.c')) + system_ss.add(files('block-ram-registrar.c')) diff --git a/block/pbs.c b/block/pbs.c new file mode 100644 index 0000000000..a2211e0f3b @@ -349,40 +349,40 @@ index 0000000000..a2211e0f3b + +block_init(bdrv_pbs_init); diff --git a/configure b/configure -index a62a3e6be9..1ac0feb46b 100755 +index 133f4e3235..f5a830c1f3 100755 --- a/configure +++ b/configure -@@ -288,6 +288,7 @@ linux_user="" +@@ -256,6 +256,7 @@ qemu_suffix="qemu" + softmmu="yes" + linux_user="" bsd_user="" - pie="" - coroutine="" +pbs_bdrv="yes" plugins="$default_feature" - meson="" ninja="" -@@ -873,6 +874,10 @@ for opt do + python= +@@ -809,6 +810,10 @@ for opt do ;; - --with-coroutine=*) coroutine="$optarg" + --enable-download) download="enabled"; git_submodules_action=update; ;; + --disable-pbs-bdrv) pbs_bdrv="no" + ;; + --enable-pbs-bdrv) pbs_bdrv="yes" + ;; - --with-git=*) git="$optarg" - ;; - --with-git-submodules=*) -@@ -1049,6 +1054,7 @@ cat << EOF - debug-info debugging information - safe-stack SafeStack Stack Smash Protection. Depends on - clang/llvm and requires coroutine backend ucontext. + --enable-plugins) if test "$mingw32" = "yes"; then + error_exit "TCG plugins not currently supported on Windows platforms" + else +@@ -959,6 +964,7 @@ cat << EOF + bsd-user all BSD usermode emulation targets + pie Position Independent Executables + debug-tcg TCG debugging (default is disabled) + pbs-bdrv Proxmox backup server read-only block driver support NOTE: The object files are built at the place where configure is launched EOF -@@ -2386,6 +2392,9 @@ echo "TARGET_DIRS=$target_list" >> $config_host_mak - if test "$modules" = "yes"; then - echo "CONFIG_MODULES=y" >> $config_host_mak +@@ -1744,6 +1750,9 @@ if test "$solaris" = "yes" ; then fi + echo "SRC_PATH=$source_path" >> $config_host_mak + echo "TARGET_DIRS=$target_list" >> $config_host_mak +if test "$pbs_bdrv" = "yes" ; then + echo "CONFIG_PBS_BDRV=y" >> $config_host_mak +fi @@ -390,10 +390,10 @@ index a62a3e6be9..1ac0feb46b 100755 # XXX: suppress that if [ "$bsd" = "yes" ] ; then diff --git a/meson.build b/meson.build -index 32ab849ce6..69afe3441b 100644 +index c3330310d9..cbfc9a43fb 100644 --- a/meson.build +++ b/meson.build -@@ -4041,7 +4041,7 @@ summary_info += {'bzip2 support': libbzip2} +@@ -4319,7 +4319,7 @@ summary_info += {'bzip2 support': libbzip2} summary_info += {'lzfse support': liblzfse} summary_info += {'zstd support': zstd} summary_info += {'NUMA host support': numa} @@ -403,10 +403,10 @@ index 32ab849ce6..69afe3441b 100644 summary_info += {'libdaxctl support': libdaxctl} summary_info += {'libudev': libudev} diff --git a/qapi/block-core.json b/qapi/block-core.json -index 985859ddee..d601fb4ab2 100644 +index 331c8336d1..a818d5f90f 100644 --- a/qapi/block-core.json +++ b/qapi/block-core.json -@@ -3304,6 +3304,7 @@ +@@ -3396,6 +3396,7 @@ 'parallels', 'preallocate', 'qcow', 'qcow2', 'qed', 'quorum', 'raw', 'rbd', { 'name': 'replication', 'if': 'CONFIG_REPLICATION' }, @@ -414,7 +414,7 @@ index 985859ddee..d601fb4ab2 100644 'ssh', 'throttle', 'vdi', 'vhdx', { 'name': 'virtio-blk-vfio-pci', 'if': 'CONFIG_BLKIO' }, { 'name': 'virtio-blk-vhost-user', 'if': 'CONFIG_BLKIO' }, -@@ -3380,6 +3381,17 @@ +@@ -3482,6 +3483,17 @@ { 'struct': 'BlockdevOptionsNull', 'data': { '*size': 'int', '*latency-ns': 'uint64', '*read-zeroes': 'bool' } } @@ -432,7 +432,7 @@ index 985859ddee..d601fb4ab2 100644 ## # @BlockdevOptionsNVMe: # -@@ -4753,6 +4765,7 @@ +@@ -4886,6 +4898,7 @@ 'nfs': 'BlockdevOptionsNfs', 'null-aio': 'BlockdevOptionsNull', 'null-co': 'BlockdevOptionsNull', diff --git a/debian/patches/pve/0033-PVE-redirect-stderr-to-journal-when-daemonized.patch b/debian/patches/pve/0033-PVE-redirect-stderr-to-journal-when-daemonized.patch index 147951c..2a5b43e 100644 --- a/debian/patches/pve/0033-PVE-redirect-stderr-to-journal-when-daemonized.patch +++ b/debian/patches/pve/0033-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 69afe3441b..b2e9b2aec7 100644 +index cbfc9a43fb..8206270272 100644 --- a/meson.build +++ b/meson.build -@@ -1528,6 +1528,7 @@ keyutils = dependency('libkeyutils', required: false, +@@ -1779,6 +1779,7 @@ endif has_gettid = cc.has_function('gettid') libuuid = cc.find_library('uuid', required: true) @@ -25,16 +25,16 @@ index 69afe3441b..b2e9b2aec7 100644 libproxmox_backup_qemu = cc.find_library('proxmox_backup_qemu', required: true) # libselinux -@@ -3144,6 +3145,7 @@ if have_block +@@ -3406,6 +3407,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')) + blockdev_ss.add(when: 'CONFIG_POSIX', if_true: libsystemd) - softmmu_ss.add(when: 'CONFIG_WIN32', if_true: [files('os-win32.c')]) + system_ss.add(when: 'CONFIG_WIN32', if_true: [files('os-win32.c')]) endif diff --git a/os-posix.c b/os-posix.c -index 90ea71725f..33745a8c22 100644 +index cfcb96533c..fb2ad87009 100644 --- a/os-posix.c +++ b/os-posix.c @@ -28,6 +28,8 @@ @@ -46,7 +46,7 @@ index 90ea71725f..33745a8c22 100644 /* Needed early for CONFIG_BSD etc. */ #include "net/slirp.h" -@@ -301,9 +303,10 @@ void os_setup_post(void) +@@ -310,9 +312,10 @@ void os_setup_post(void) dup2(fd, 0); dup2(fd, 1); diff --git a/debian/patches/pve/0034-PVE-Migrate-dirty-bitmap-state-via-savevm.patch b/debian/patches/pve/0034-PVE-Migrate-dirty-bitmap-state-via-savevm.patch index 6da71b7..f6cd3c3 100644 --- a/debian/patches/pve/0034-PVE-Migrate-dirty-bitmap-state-via-savevm.patch +++ b/debian/patches/pve/0034-PVE-Migrate-dirty-bitmap-state-via-savevm.patch @@ -26,7 +26,7 @@ Signed-off-by: Fiona Ebner create mode 100644 migration/pbs-state.c diff --git a/include/migration/misc.h b/include/migration/misc.h -index 8b49841016..78f63ca400 100644 +index 7dcc0b5c2c..4c940b2475 100644 --- a/include/migration/misc.h +++ b/include/migration/misc.h @@ -77,4 +77,7 @@ bool migration_in_bg_snapshot(void); @@ -38,25 +38,24 @@ index 8b49841016..78f63ca400 100644 + #endif diff --git a/migration/meson.build b/migration/meson.build -index a7824b5266..de6a271b58 100644 +index 07f6057acc..343994d891 100644 --- a/migration/meson.build +++ b/migration/meson.build -@@ -6,8 +6,10 @@ migration_files = files( +@@ -7,7 +7,9 @@ migration_files = files( 'vmstate.c', 'qemu-file.c', 'yank_functions.c', + 'pbs-state.c', ) - softmmu_ss.add(migration_files) -+softmmu_ss.add(libproxmox_backup_qemu) ++system_ss.add(libproxmox_backup_qemu) - softmmu_ss.add(files( + system_ss.add(files( 'block-dirty-bitmap.c', diff --git a/migration/migration.c b/migration/migration.c -index 99f86bd6c2..db229e72c9 100644 +index 7a4c8beb5d..0a955a2a18 100644 --- a/migration/migration.c +++ b/migration/migration.c -@@ -245,6 +245,7 @@ void migration_object_init(void) +@@ -162,6 +162,7 @@ void migration_object_init(void) blk_mig_init(); ram_mig_init(); dirty_bitmap_mig_init(); @@ -175,7 +174,7 @@ index 0000000000..887e998b9e + NULL); +} diff --git a/pve-backup.c b/pve-backup.c -index 21441b2f97..5e5c37e06d 100644 +index d84d807654..9c8b88d075 100644 --- a/pve-backup.c +++ b/pve-backup.c @@ -1060,6 +1060,7 @@ ProxmoxSupportStatus *qmp_query_proxmox_support(Error **errp) @@ -187,10 +186,10 @@ index 21441b2f97..5e5c37e06d 100644 ret->pbs_masterkey = true; ret->backup_max_workers = true; diff --git a/qapi/block-core.json b/qapi/block-core.json -index d601fb4ab2..16be1e02ec 100644 +index a818d5f90f..48eb47c6ea 100644 --- a/qapi/block-core.json +++ b/qapi/block-core.json -@@ -987,6 +987,11 @@ +@@ -991,6 +991,11 @@ # @pbs-dirty-bitmap-savevm: True if 'dirty-bitmaps' migration capability can # safely be set for savevm-async. # @@ -202,7 +201,7 @@ index d601fb4ab2..16be1e02ec 100644 # @pbs-masterkey: True if the QMP backup call supports the 'master_keyfile' # parameter. # -@@ -997,6 +1002,7 @@ +@@ -1001,6 +1006,7 @@ 'data': { 'pbs-dirty-bitmap': 'bool', 'query-bitmap-info': 'bool', 'pbs-dirty-bitmap-savevm': 'bool', diff --git a/debian/patches/pve/0035-migration-block-dirty-bitmap-migrate-other-bitmaps-e.patch b/debian/patches/pve/0035-migration-block-dirty-bitmap-migrate-other-bitmaps-e.patch index bd721fc..75f5c28 100644 --- a/debian/patches/pve/0035-migration-block-dirty-bitmap-migrate-other-bitmaps-e.patch +++ b/debian/patches/pve/0035-migration-block-dirty-bitmap-migrate-other-bitmaps-e.patch @@ -19,10 +19,10 @@ Signed-off-by: Thomas Lamprecht 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/migration/block-dirty-bitmap.c b/migration/block-dirty-bitmap.c -index 7eaf498439..509f3df0a6 100644 +index e1ae3b7316..285dd1d148 100644 --- a/migration/block-dirty-bitmap.c +++ b/migration/block-dirty-bitmap.c -@@ -539,7 +539,7 @@ static int add_bitmaps_to_list(DBMSaveState *s, BlockDriverState *bs, +@@ -540,7 +540,7 @@ static int add_bitmaps_to_list(DBMSaveState *s, BlockDriverState *bs, if (bdrv_dirty_bitmap_check(bitmap, BDRV_BITMAP_DEFAULT, &local_err)) { error_report_err(local_err); diff --git a/debian/patches/pve/0036-PVE-fall-back-to-open-iscsi-initiatorname.patch b/debian/patches/pve/0036-PVE-fall-back-to-open-iscsi-initiatorname.patch index 0e50c93..f9fee14 100644 --- a/debian/patches/pve/0036-PVE-fall-back-to-open-iscsi-initiatorname.patch +++ b/debian/patches/pve/0036-PVE-fall-back-to-open-iscsi-initiatorname.patch @@ -21,10 +21,10 @@ Signed-off-by: Thomas Lamprecht 1 file changed, 30 insertions(+) diff --git a/block/iscsi.c b/block/iscsi.c -index 9fc0bed90b..1d40933165 100644 +index 34f97ab646..398782963d 100644 --- a/block/iscsi.c +++ b/block/iscsi.c -@@ -1392,12 +1392,42 @@ static char *get_initiator_name(QemuOpts *opts) +@@ -1391,12 +1391,42 @@ static char *get_initiator_name(QemuOpts *opts) const char *name; char *iscsi_name; UuidInfo *uuid_info; diff --git a/debian/patches/pve/0037-PVE-block-stream-increase-chunk-size.patch b/debian/patches/pve/0037-PVE-block-stream-increase-chunk-size.patch index 5707bee..28dd8d1 100644 --- a/debian/patches/pve/0037-PVE-block-stream-increase-chunk-size.patch +++ b/debian/patches/pve/0037-PVE-block-stream-increase-chunk-size.patch @@ -11,7 +11,7 @@ Signed-off-by: Thomas Lamprecht 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/block/stream.c b/block/stream.c -index 7f9e1ecdbb..6a29d80398 100644 +index e522bbdec5..afed72db55 100644 --- a/block/stream.c +++ b/block/stream.c @@ -27,7 +27,7 @@ enum { diff --git a/debian/patches/pve/0038-block-io-accept-NULL-qiov-in-bdrv_pad_request.patch b/debian/patches/pve/0038-block-io-accept-NULL-qiov-in-bdrv_pad_request.patch index d1bd74d..0e43de5 100644 --- a/debian/patches/pve/0038-block-io-accept-NULL-qiov-in-bdrv_pad_request.patch +++ b/debian/patches/pve/0038-block-io-accept-NULL-qiov-in-bdrv_pad_request.patch @@ -17,17 +17,17 @@ Signed-off-by: Thomas Lamprecht 1 file changed, 4 insertions(+) diff --git a/block/io.c b/block/io.c -index 2e267a85ab..449a44bf20 100644 +index 055fcf7438..63f7b3ad3e 100644 --- a/block/io.c +++ b/block/io.c -@@ -1576,6 +1576,10 @@ static int bdrv_pad_request(BlockDriverState *bs, - { - int ret; +@@ -1710,6 +1710,10 @@ static int bdrv_pad_request(BlockDriverState *bs, + int sliced_niov; + size_t sliced_head, sliced_tail; + if (!qiov) { + return 0; + } + - bdrv_check_qiov_request(*offset, *bytes, *qiov, *qiov_offset, &error_abort); - - if (!bdrv_init_padding(bs, *offset, *bytes, pad)) { + /* Should have been checked by the caller already */ + ret = bdrv_check_request32(*offset, *bytes, *qiov, *qiov_offset); + if (ret < 0) { diff --git a/debian/patches/pve/0039-block-add-alloc-track-driver.patch b/debian/patches/pve/0039-block-add-alloc-track-driver.patch index 823be87..ea5f105 100644 --- a/debian/patches/pve/0039-block-add-alloc-track-driver.patch +++ b/debian/patches/pve/0039-block-add-alloc-track-driver.patch @@ -393,7 +393,7 @@ index 0000000000..b75d7c6460 + +block_init(bdrv_alloc_track_init); diff --git a/block/meson.build b/block/meson.build -index eece0d5743..8a68162cc0 100644 +index becc99ac4e..0a69836593 100644 --- a/block/meson.build +++ b/block/meson.build @@ -2,6 +2,7 @@ block_ss.add(genh) diff --git a/debian/patches/pve/0044-migration-for-snapshots-hold-the-BQL-during-setup-ca.patch b/debian/patches/pve/0044-migration-for-snapshots-hold-the-BQL-during-setup-ca.patch index 04ef6cb..a7f6e4d 100644 --- a/debian/patches/pve/0044-migration-for-snapshots-hold-the-BQL-during-setup-ca.patch +++ b/debian/patches/pve/0044-migration-for-snapshots-hold-the-BQL-during-setup-ca.patch @@ -52,7 +52,7 @@ Signed-off-by: Fiona Ebner 5 files changed, 38 insertions(+), 12 deletions(-) diff --git a/include/migration/register.h b/include/migration/register.h -index a8dfd8fefd..fa9b0b0f10 100644 +index 90914f32f5..c728fd9120 100644 --- a/include/migration/register.h +++ b/include/migration/register.h @@ -43,9 +43,9 @@ typedef struct SaveVMHandlers { @@ -67,10 +67,10 @@ index a8dfd8fefd..fa9b0b0f10 100644 * must_precopy: * - must be migrated in precopy or in stopped state diff --git a/migration/block-dirty-bitmap.c b/migration/block-dirty-bitmap.c -index 509f3df0a6..42dc4a8d61 100644 +index 285dd1d148..f7ee5a74d9 100644 --- a/migration/block-dirty-bitmap.c +++ b/migration/block-dirty-bitmap.c -@@ -1220,10 +1220,17 @@ static int dirty_bitmap_save_setup(QEMUFile *f, void *opaque) +@@ -1219,10 +1219,17 @@ static int dirty_bitmap_save_setup(QEMUFile *f, void *opaque) { DBMSaveState *s = &((DBMState *)opaque)->save; SaveBitmapState *dbms = NULL; @@ -90,7 +90,7 @@ index 509f3df0a6..42dc4a8d61 100644 return -1; } -@@ -1231,7 +1238,9 @@ static int dirty_bitmap_save_setup(QEMUFile *f, void *opaque) +@@ -1230,7 +1237,9 @@ static int dirty_bitmap_save_setup(QEMUFile *f, void *opaque) send_bitmap_start(f, s, dbms); } qemu_put_bitmap_flags(f, DIRTY_BITMAP_MIG_FLAG_EOS); @@ -102,10 +102,10 @@ index 509f3df0a6..42dc4a8d61 100644 } diff --git a/migration/block.c b/migration/block.c -index b2497bbd32..c9d55be642 100644 +index 86c2256a2b..8423e0c9f9 100644 --- a/migration/block.c +++ b/migration/block.c -@@ -716,21 +716,30 @@ static void block_migration_cleanup(void *opaque) +@@ -725,21 +725,30 @@ static void block_migration_cleanup(void *opaque) static int block_save_setup(QEMUFile *f, void *opaque) { int ret; @@ -140,10 +140,10 @@ index b2497bbd32..c9d55be642 100644 if (ret) { return ret; diff --git a/migration/ram.c b/migration/ram.c -index 79d881f735..0ecbbc3202 100644 +index 9040d66e61..01532c9fc9 100644 --- a/migration/ram.c +++ b/migration/ram.c -@@ -3117,8 +3117,16 @@ static void migration_bitmap_clear_discarded_pages(RAMState *rs) +@@ -2895,8 +2895,16 @@ static void migration_bitmap_clear_discarded_pages(RAMState *rs) static void ram_init_bitmaps(RAMState *rs) { @@ -162,7 +162,7 @@ index 79d881f735..0ecbbc3202 100644 qemu_mutex_lock_ramlist(); WITH_RCU_READ_LOCK_GUARD() { -@@ -3130,7 +3138,9 @@ static void ram_init_bitmaps(RAMState *rs) +@@ -2908,7 +2916,9 @@ static void ram_init_bitmaps(RAMState *rs) } } qemu_mutex_unlock_ramlist(); @@ -174,11 +174,11 @@ index 79d881f735..0ecbbc3202 100644 /* * After an eventual first bitmap sync, fixup the initial bitmap diff --git a/migration/savevm.c b/migration/savevm.c -index aa54a67fda..fc6a82a555 100644 +index a2cb8855e2..ea8b30a630 100644 --- a/migration/savevm.c +++ b/migration/savevm.c -@@ -1621,10 +1621,8 @@ static int qemu_savevm_state(QEMUFile *f, Error **errp) - memset(&compression_counters, 0, sizeof(compression_counters)); +@@ -1625,10 +1625,8 @@ static int qemu_savevm_state(QEMUFile *f, Error **errp) + reset_vfio_bytes_transferred(); ms->to_dst_file = f; - qemu_mutex_unlock_iothread(); diff --git a/debian/patches/pve/0045-savevm-async-don-t-hold-BQL-during-setup.patch b/debian/patches/pve/0045-savevm-async-don-t-hold-BQL-during-setup.patch index f5fa200..3ff0bf7 100644 --- a/debian/patches/pve/0045-savevm-async-don-t-hold-BQL-during-setup.patch +++ b/debian/patches/pve/0045-savevm-async-don-t-hold-BQL-during-setup.patch @@ -13,10 +13,10 @@ Signed-off-by: Fiona Ebner 1 file changed, 2 deletions(-) diff --git a/migration/savevm-async.c b/migration/savevm-async.c -index b97f2c4f14..87ea0573d3 100644 +index 80624fada8..b1d85a4b41 100644 --- a/migration/savevm-async.c +++ b/migration/savevm-async.c -@@ -403,10 +403,8 @@ void qmp_savevm_start(const char *statefile, Error **errp) +@@ -401,10 +401,8 @@ void qmp_savevm_start(const char *statefile, Error **errp) snap_state.state = SAVE_STATE_ACTIVE; snap_state.finalize_bh = qemu_bh_new(process_savevm_finalize, &snap_state); snap_state.co = qemu_coroutine_create(&process_savevm_co, NULL); diff --git a/debian/patches/series b/debian/patches/series index 996fa1f..01d4d3c 100644 --- a/debian/patches/series +++ b/debian/patches/series @@ -1,15 +1,8 @@ extra/0001-monitor-qmp-fix-race-with-clients-disconnecting-earl.patch extra/0002-scsi-megasas-Internal-cdbs-have-16-byte-length.patch extra/0003-ide-avoid-potential-deadlock-when-draining-during-tr.patch -extra/0004-ui-return-NULL-when-getting-cursor-without-a-console.patch -extra/0005-memory-prevent-dma-reentracy-issues.patch -extra/0006-lsi53c895a-disable-reentrancy-detection-for-script-R.patch -extra/0007-bcm2835_property-disable-reentrancy-detection-for-io.patch -extra/0008-raven-disable-reentrancy-detection-for-iomem.patch -extra/0009-apic-disable-reentrancy-detection-for-apic-msi.patch -extra/0010-migration-block-dirty-bitmap-fix-loading-bitmap-when.patch -extra/0011-vhost-fix-the-fd-leak.patch -extra/0012-hw-ide-reset-cancel-async-DMA-operation-before-reset.patch +extra/0004-migration-block-dirty-bitmap-fix-loading-bitmap-when.patch +extra/0005-hw-ide-reset-cancel-async-DMA-operation-before-reset.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 diff --git a/qemu b/qemu index f7f686b..78385bc 160000 --- a/qemu +++ b/qemu @@ -1 +1 @@ -Subproject commit f7f686b61cf7ee142c9264d2e04ac2c6a96d37f8 +Subproject commit 78385bc738108a9b5b20e639520dc60425ca2a5a