]> git.proxmox.com Git - pve-qemu.git/commitdiff
update submodule and patches to QEMU 8.1.2
authorFiona Ebner <f.ebner@proxmox.com>
Tue, 17 Oct 2023 12:10:09 +0000 (14:10 +0200)
committerThomas Lamprecht <t.lamprecht@proxmox.com>
Tue, 24 Oct 2023 13:01:23 +0000 (15:01 +0200)
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 <f.ebner@proxmox.com>
Signed-off-by: Thomas Lamprecht <t.lamprecht@proxmox.com>
56 files changed:
debian/patches/bitmap-mirror/0001-drive-mirror-add-support-for-sync-bitmap-mode-never.patch
debian/patches/bitmap-mirror/0002-drive-mirror-add-support-for-conditional-and-always-.patch
debian/patches/bitmap-mirror/0003-mirror-add-check-for-bitmap-mode-without-bitmap.patch
debian/patches/bitmap-mirror/0004-mirror-switch-to-bdrv_dirty_bitmap_merge_internal.patch
debian/patches/bitmap-mirror/0006-mirror-move-some-checks-to-qmp.patch
debian/patches/extra/0001-monitor-qmp-fix-race-with-clients-disconnecting-earl.patch
debian/patches/extra/0002-scsi-megasas-Internal-cdbs-have-16-byte-length.patch
debian/patches/extra/0003-ide-avoid-potential-deadlock-when-draining-during-tr.patch
debian/patches/extra/0004-migration-block-dirty-bitmap-fix-loading-bitmap-when.patch [new file with mode: 0644]
debian/patches/extra/0004-ui-return-NULL-when-getting-cursor-without-a-console.patch [deleted file]
debian/patches/extra/0005-hw-ide-reset-cancel-async-DMA-operation-before-reset.patch [new file with mode: 0644]
debian/patches/extra/0005-memory-prevent-dma-reentracy-issues.patch [deleted file]
debian/patches/extra/0006-lsi53c895a-disable-reentrancy-detection-for-script-R.patch [deleted file]
debian/patches/extra/0007-bcm2835_property-disable-reentrancy-detection-for-io.patch [deleted file]
debian/patches/extra/0008-raven-disable-reentrancy-detection-for-iomem.patch [deleted file]
debian/patches/extra/0009-apic-disable-reentrancy-detection-for-apic-msi.patch [deleted file]
debian/patches/extra/0010-migration-block-dirty-bitmap-fix-loading-bitmap-when.patch [deleted file]
debian/patches/extra/0011-vhost-fix-the-fd-leak.patch [deleted file]
debian/patches/extra/0012-hw-ide-reset-cancel-async-DMA-operation-before-reset.patch [deleted file]
debian/patches/pve/0001-PVE-Config-block-file-change-locking-default-to-off.patch
debian/patches/pve/0003-PVE-Config-set-the-CPU-model-to-kvm64-32-instead-of-.patch
debian/patches/pve/0005-PVE-Config-glusterfs-no-default-logfile-if-daemonize.patch
debian/patches/pve/0007-PVE-Up-glusterfs-allow-partial-reads.patch
debian/patches/pve/0008-PVE-Up-qemu-img-return-success-on-info-without-snaps.patch
debian/patches/pve/0009-PVE-Up-qemu-img-dd-add-osize-and-read-from-to-stdin-.patch
debian/patches/pve/0010-PVE-Up-qemu-img-dd-add-isize-parameter.patch
debian/patches/pve/0011-PVE-Up-qemu-img-dd-add-n-skip_create.patch
debian/patches/pve/0012-qemu-img-dd-add-l-option-for-loading-a-snapshot.patch
debian/patches/pve/0013-PVE-virtio-balloon-improve-query-balloon.patch
debian/patches/pve/0014-PVE-qapi-modify-query-machines.patch
debian/patches/pve/0015-PVE-qapi-modify-spice-query.patch
debian/patches/pve/0016-PVE-add-IOChannel-implementation-for-savevm-async.patch
debian/patches/pve/0017-PVE-add-savevm-async-for-background-state-snapshots.patch
debian/patches/pve/0018-PVE-add-optional-buffer-size-to-QEMUFile.patch
debian/patches/pve/0019-PVE-block-add-the-zeroinit-block-driver-filter.patch
debian/patches/pve/0020-PVE-Add-dummy-id-command-line-parameter.patch
debian/patches/pve/0022-PVE-Up-Config-file-posix-make-locking-optiono-on-cre.patch
debian/patches/pve/0023-PVE-monitor-disable-oob-capability.patch
debian/patches/pve/0024-PVE-Compat-4.0-used-balloon-qemu-4-0-config-size-fal.patch
debian/patches/pve/0025-PVE-Allow-version-code-in-machine-type.patch
debian/patches/pve/0027-PVE-Backup-add-vma-backup-format-code.patch
debian/patches/pve/0028-PVE-Backup-add-backup-dump-block-driver.patch
debian/patches/pve/0030-PVE-Backup-Proxmox-backup-patches-for-QEMU.patch
debian/patches/pve/0031-PVE-Backup-pbs-restore-new-command-to-restore-from-p.patch
debian/patches/pve/0032-PVE-Add-PBS-block-driver-to-map-backup-archives-into.patch
debian/patches/pve/0033-PVE-redirect-stderr-to-journal-when-daemonized.patch
debian/patches/pve/0034-PVE-Migrate-dirty-bitmap-state-via-savevm.patch
debian/patches/pve/0035-migration-block-dirty-bitmap-migrate-other-bitmaps-e.patch
debian/patches/pve/0036-PVE-fall-back-to-open-iscsi-initiatorname.patch
debian/patches/pve/0037-PVE-block-stream-increase-chunk-size.patch
debian/patches/pve/0038-block-io-accept-NULL-qiov-in-bdrv_pad_request.patch
debian/patches/pve/0039-block-add-alloc-track-driver.patch
debian/patches/pve/0044-migration-for-snapshots-hold-the-BQL-during-setup-ca.patch
debian/patches/pve/0045-savevm-async-don-t-hold-BQL-during-setup.patch
debian/patches/series
qemu

index 4d9b8b96b1a5b24f3b970a9744c9fa2bca221c65..c0cb23f99555dd529412f7cff3237d927cfc6ca8 100644 (file)
@@ -27,18 +27,18 @@ Signed-off-by: Ma Haocong <mahaocong@didichuxing.com>
 Signed-off-by: John Snow <jsnow@redhat.com>
 Signed-off-by: Fabian Grünbichler <f.gruenbichler@proxmox.com>
 Signed-off-by: Thomas Lamprecht <t.lamprecht@proxmox.com>
-[FE: rebased for 8.0]
+[FE: rebased for 8.1.1]
 Signed-off-by: Fiona Ebner <f.ebner@proxmox.com>
 ---
  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)
index b0ade6850b70a339eef6391110fe0ec3f2c943ff..a4a5a0b460d9ad64d758be58d7d26de0ae6660a6 100644 (file)
@@ -24,10 +24,10 @@ Signed-off-by: Thomas Lamprecht <t.lamprecht@proxmox.com>
  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);
index 302bbc5e4b3dbccd3268e583bdc367db7284d256..4546b784d7873d98ebd1d285c9f31f4ddbcb6e36 100644 (file)
@@ -16,10 +16,10 @@ Signed-off-by: Thomas Lamprecht <t.lamprecht@proxmox.com>
  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;
          }
index b95468265936db98abd3dc12e01b7128659fe259..93a1524fab8e419cd8bd63352de67397f5d8256e 100644 (file)
@@ -16,10 +16,10 @@ Signed-off-by: Thomas Lamprecht <t.lamprecht@proxmox.com>
  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) {
index 5298342c3e37dce748d696ffa485555c6700a70c..9a3108ffe67e09ca41f60ad684eb2650c46a921d 100644 (file)
@@ -21,10 +21,10 @@ Signed-off-by: Fiona Ebner <f.ebner@proxmox.com>
  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;
      }
  
index a7fe59282f5060fab00da24ab866885baa73c752..5ed0d76cdeea0ac2f6e09594d2d692d451020e26 100644 (file)
@@ -48,7 +48,7 @@ Signed-off-by: Thomas Lamprecht <t.lamprecht@proxmox.com>
  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(),
index 20ec0538661ebb9ea1f6fe15e02b0893215b083f..328f6fb3877094aeeb85397b46cbbd6f05c116a0 100644 (file)
@@ -22,10 +22,10 @@ Signed-off-by: Fiona Ebner <f.ebner@proxmox.com>
  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,
index 89491a5533a7d316f263b3675e863ea184f1a1ba..018f0c9e52b3c7ab95b6f653e1aaeeb1242258df 100644 (file)
@@ -55,7 +55,7 @@ Signed-off-by: Fiona Ebner <f.ebner@proxmox.com>
  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/0004-migration-block-dirty-bitmap-fix-loading-bitmap-when.patch b/debian/patches/extra/0004-migration-block-dirty-bitmap-fix-loading-bitmap-when.patch
new file mode 100644 (file)
index 0000000..4dae6ca
--- /dev/null
@@ -0,0 +1,48 @@
+From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
+From: Fiona Ebner <f.ebner@proxmox.com>
+Date: Fri, 28 Jul 2023 10:47:48 +0200
+Subject: [PATCH] migration/block-dirty-bitmap: fix loading bitmap when there
+ is an iothread
+
+The bdrv_create_dirty_bitmap() function (which is also called by
+bdrv_dirty_bitmap_create_successor()) uses bdrv_getlength(bs). This is
+a wrapper around a coroutine, and thus uses bdrv_poll_co(). Polling
+tries to release the AioContext which will trigger an assert() if it
+hasn't been acquired before.
+
+The issue does not happen for migration, because there we are in a
+coroutine already, so the wrapper will just call bdrv_co_getlength()
+directly without polling.
+
+Signed-off-by: Fiona Ebner <f.ebner@proxmox.com>
+---
+ migration/block-dirty-bitmap.c | 6 ++++++
+ 1 file changed, 6 insertions(+)
+
+diff --git a/migration/block-dirty-bitmap.c b/migration/block-dirty-bitmap.c
+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)
+                      "destination", bdrv_dirty_bitmap_name(s->bitmap));
+         return -EINVAL;
+     } else {
++        AioContext *ctx = bdrv_get_aio_context(s->bs);
++        aio_context_acquire(ctx);
+         s->bitmap = bdrv_create_dirty_bitmap(s->bs, granularity,
+                                              s->bitmap_name, &local_err);
++        aio_context_release(ctx);
+         if (!s->bitmap) {
+             error_report_err(local_err);
+             return -EINVAL;
+@@ -833,7 +836,10 @@ static int dirty_bitmap_load_start(QEMUFile *f, DBMLoadState *s)
+     bdrv_disable_dirty_bitmap(s->bitmap);
+     if (flags & DIRTY_BITMAP_MIG_START_FLAG_ENABLED) {
++        AioContext *ctx = bdrv_get_aio_context(s->bs);
++        aio_context_acquire(ctx);
+         bdrv_dirty_bitmap_create_successor(s->bitmap, &local_err);
++        aio_context_release(ctx);
+         if (local_err) {
+             error_report_err(local_err);
+             return -EINVAL;
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 (file)
index 0b8d2c0..0000000
+++ /dev/null
@@ -1,36 +0,0 @@
-From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
-From: =?UTF-8?q?Marc-Andr=C3=A9=20Lureau?= <marcandre.lureau@redhat.com>
-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 <marcandre.lureau@redhat.com>
-Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
-(picked up from https://lists.nongnu.org/archive/html/qemu-devel/2023-04/msg05598.html)
-Signed-off-by: Fiona Ebner <f.ebner@proxmox.com>
----
- 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/0005-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
new file mode 100644 (file)
index 0000000..ef1a649
--- /dev/null
@@ -0,0 +1,100 @@
+From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
+From: Fiona Ebner <f.ebner@proxmox.com>
+Date: Thu, 24 Aug 2023 11:22:21 +0200
+Subject: [PATCH] hw/ide: reset: cancel async DMA operation before reseting
+ state
+
+If there is a pending DMA operation during ide_bus_reset(), the fact
+that the IDEstate is already reset before the operation is canceled
+can be problematic. In particular, ide_dma_cb() might be called and
+then use the reset IDEstate which contains the signature after the
+reset. When used to construct the IO operation this leads to
+ide_get_sector() returning 0 and nsector being 1. This is particularly
+bad, because a write command will thus destroy the first sector which
+often contains a partition table or similar.
+
+Traces showing the unsolicited write happening with IDEstate
+0x5595af6949d0 being used after reset:
+
+> ahci_port_write ahci(0x5595af6923f0)[0]: port write [reg:PxSCTL] @ 0x2c: 0x00000300
+> ahci_reset_port ahci(0x5595af6923f0)[0]: reset port
+> ide_reset IDEstate 0x5595af6949d0
+> ide_reset IDEstate 0x5595af694da8
+> ide_bus_reset_aio aio_cancel
+> dma_aio_cancel dbs=0x7f64600089a0
+> dma_blk_cb dbs=0x7f64600089a0 ret=0
+> dma_complete dbs=0x7f64600089a0 ret=0 cb=0x5595acd40b30
+> ahci_populate_sglist ahci(0x5595af6923f0)[0]
+> ahci_dma_prepare_buf ahci(0x5595af6923f0)[0]: prepare buf limit=512 prepared=512
+> ide_dma_cb IDEState 0x5595af6949d0; sector_num=0 n=1 cmd=DMA WRITE
+> dma_blk_io dbs=0x7f6420802010 bs=0x5595ae2c6c30 offset=0 to_dev=1
+> dma_blk_cb dbs=0x7f6420802010 ret=0
+
+> (gdb) p *qiov
+> $11 = {iov = 0x7f647c76d840, niov = 1, {{nalloc = 1, local_iov = {iov_base = 0x0,
+>       iov_len = 512}}, {__pad = "\001\000\000\000\000\000\000\000\000\000\000",
+>       size = 512}}}
+> (gdb) bt
+> #0  blk_aio_pwritev (blk=0x5595ae2c6c30, offset=0, qiov=0x7f6420802070, flags=0,
+>     cb=0x5595ace6f0b0 <dma_blk_cb>, opaque=0x7f6420802010)
+>     at ../block/block-backend.c:1682
+> #1  0x00005595ace6f185 in dma_blk_cb (opaque=0x7f6420802010, ret=<optimized out>)
+>     at ../softmmu/dma-helpers.c:179
+> #2  0x00005595ace6f778 in dma_blk_io (ctx=0x5595ae0609f0,
+>     sg=sg@entry=0x5595af694d00, offset=offset@entry=0, align=align@entry=512,
+>     io_func=io_func@entry=0x5595ace6ee30 <dma_blk_write_io_func>,
+>     io_func_opaque=io_func_opaque@entry=0x5595ae2c6c30,
+>     cb=0x5595acd40b30 <ide_dma_cb>, opaque=0x5595af6949d0,
+>     dir=DMA_DIRECTION_TO_DEVICE) at ../softmmu/dma-helpers.c:244
+> #3  0x00005595ace6f90a in dma_blk_write (blk=0x5595ae2c6c30,
+>     sg=sg@entry=0x5595af694d00, offset=offset@entry=0, align=align@entry=512,
+>     cb=cb@entry=0x5595acd40b30 <ide_dma_cb>, opaque=opaque@entry=0x5595af6949d0)
+>     at ../softmmu/dma-helpers.c:280
+> #4  0x00005595acd40e18 in ide_dma_cb (opaque=0x5595af6949d0, ret=<optimized out>)
+>     at ../hw/ide/core.c:953
+> #5  0x00005595ace6f319 in dma_complete (ret=0, dbs=0x7f64600089a0)
+>     at ../softmmu/dma-helpers.c:107
+> #6  dma_blk_cb (opaque=0x7f64600089a0, ret=0) at ../softmmu/dma-helpers.c:127
+> #7  0x00005595ad12227d in blk_aio_complete (acb=0x7f6460005b10)
+>     at ../block/block-backend.c:1527
+> #8  blk_aio_complete (acb=0x7f6460005b10) at ../block/block-backend.c:1524
+> #9  blk_aio_write_entry (opaque=0x7f6460005b10) at ../block/block-backend.c:1594
+> #10 0x00005595ad258cfb in coroutine_trampoline (i0=<optimized out>,
+>     i1=<optimized out>) at ../util/coroutine-ucontext.c:177
+
+Signed-off-by: Fiona Ebner <f.ebner@proxmox.com>
+---
+ hw/ide/core.c | 14 +++++++-------
+ 1 file changed, 7 insertions(+), 7 deletions(-)
+
+diff --git a/hw/ide/core.c b/hw/ide/core.c
+index 6a74afe564..289347af58 100644
+--- a/hw/ide/core.c
++++ b/hw/ide/core.c
+@@ -2515,19 +2515,19 @@ static void ide_dummy_transfer_stop(IDEState *s)
+ void ide_bus_reset(IDEBus *bus)
+ {
+-    bus->unit = 0;
+-    bus->cmd = 0;
+-    ide_reset(&bus->ifs[0]);
+-    ide_reset(&bus->ifs[1]);
+-    ide_clear_hob(bus);
+-
+-    /* pending async DMA */
++    /* pending async DMA - needs the IDEState before it is reset */
+     if (bus->dma->aiocb) {
+         trace_ide_bus_reset_aio();
+         blk_aio_cancel(bus->dma->aiocb);
+         bus->dma->aiocb = NULL;
+     }
++    bus->unit = 0;
++    bus->cmd = 0;
++    ide_reset(&bus->ifs[0]);
++    ide_reset(&bus->ifs[1]);
++    ide_clear_hob(bus);
++
+     /* reset dma provider too */
+     if (bus->dma->ops->reset) {
+         bus->dma->ops->reset(bus->dma);
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 (file)
index c9d0cd5..0000000
+++ /dev/null
@@ -1,130 +0,0 @@
-From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
-From: Alexander Bulekov <alxndr@bu.edu>
-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 <alxndr@bu.edu>
-Reviewed-by: Thomas Huth <thuth@redhat.com>
-Message-Id: <20230427211013.2994127-2-alxndr@bu.edu>
-[thuth: Replace warn_report() with warn_report_once()]
-Signed-off-by: Thomas Huth <thuth@redhat.com>
-(cherry-picked from commit a2e1753b8054344f32cf94f31c6399a58794a380)
-Signed-off-by: Fiona Ebner <f.ebner@proxmox.com>
----
- 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 (file)
index 96d254c..0000000
+++ /dev/null
@@ -1,39 +0,0 @@
-From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
-From: Alexander Bulekov <alxndr@bu.edu>
-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 <f.ebner@proxmox.com>
-Signed-off-by: Alexander Bulekov <alxndr@bu.edu>
-Reviewed-by: Thomas Huth <thuth@redhat.com>
-Reviewed-by: Darren Kenny <darren.kenny@oracle.com>
-Message-Id: <20230427211013.2994127-6-alxndr@bu.edu>
-Signed-off-by: Thomas Huth <thuth@redhat.com>
-(cherry-picked from commit bfd6e7ae6a72b84e2eb9574f56e6ec037f05182c)
-Signed-off-by: Fiona Ebner <f.ebner@proxmox.com>
----
- 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 (file)
index 6ec9d03..0000000
+++ /dev/null
@@ -1,37 +0,0 @@
-From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
-From: Alexander Bulekov <alxndr@bu.edu>
-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 <alxndr@bu.edu>
-Reviewed-by: Thomas Huth <thuth@redhat.com>
-Message-Id: <20230427211013.2994127-7-alxndr@bu.edu>
-Signed-off-by: Thomas Huth <thuth@redhat.com>
-(cherry-picked from commit 985c4a4e547afb9573b6bd6843d20eb2c3d1d1cd)
-Signed-off-by: Fiona Ebner <f.ebner@proxmox.com>
----
- 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 (file)
index bea68d4..0000000
+++ /dev/null
@@ -1,35 +0,0 @@
-From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
-From: Alexander Bulekov <alxndr@bu.edu>
-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 <alxndr@bu.edu>
-Message-Id: <20230427211013.2994127-8-alxndr@bu.edu>
-Signed-off-by: Thomas Huth <thuth@redhat.com>
-(cherry-picked from commit 6dad5a6810d9c60ca320d01276f6133bbcfa1fc7)
-Signed-off-by: Fiona Ebner <f.ebner@proxmox.com>
----
- 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 (file)
index 154cc36..0000000
+++ /dev/null
@@ -1,36 +0,0 @@
-From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
-From: Alexander Bulekov <alxndr@bu.edu>
-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 <alxndr@bu.edu>
-Reviewed-by: Darren Kenny <darren.kenny@oracle.com>
-Message-Id: <20230427211013.2994127-9-alxndr@bu.edu>
-Signed-off-by: Thomas Huth <thuth@redhat.com>
-(cherry-picked from commit 50795ee051a342c681a9b45671c552fbd6274db8)
-Signed-off-by: Fiona Ebner <f.ebner@proxmox.com>
----
- 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/0010-migration-block-dirty-bitmap-fix-loading-bitmap-when.patch b/debian/patches/extra/0010-migration-block-dirty-bitmap-fix-loading-bitmap-when.patch
deleted file mode 100644 (file)
index bb01ced..0000000
+++ /dev/null
@@ -1,48 +0,0 @@
-From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
-From: Fiona Ebner <f.ebner@proxmox.com>
-Date: Fri, 28 Jul 2023 10:47:48 +0200
-Subject: [PATCH] migration/block-dirty-bitmap: fix loading bitmap when there
- is an iothread
-
-The bdrv_create_dirty_bitmap() function (which is also called by
-bdrv_dirty_bitmap_create_successor()) uses bdrv_getlength(bs). This is
-a wrapper around a coroutine, and thus uses bdrv_poll_co(). Polling
-tries to release the AioContext which will trigger an assert() if it
-hasn't been acquired before.
-
-The issue does not happen for migration, because there we are in a
-coroutine already, so the wrapper will just call bdrv_co_getlength()
-directly without polling.
-
-Signed-off-by: Fiona Ebner <f.ebner@proxmox.com>
----
- migration/block-dirty-bitmap.c | 6 ++++++
- 1 file changed, 6 insertions(+)
-
-diff --git a/migration/block-dirty-bitmap.c b/migration/block-dirty-bitmap.c
-index fe73aa94b1..7eaf498439 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)
-                      "destination", bdrv_dirty_bitmap_name(s->bitmap));
-         return -EINVAL;
-     } else {
-+        AioContext *ctx = bdrv_get_aio_context(s->bs);
-+        aio_context_acquire(ctx);
-         s->bitmap = bdrv_create_dirty_bitmap(s->bs, granularity,
-                                              s->bitmap_name, &local_err);
-+        aio_context_release(ctx);
-         if (!s->bitmap) {
-             error_report_err(local_err);
-             return -EINVAL;
-@@ -833,7 +836,10 @@ static int dirty_bitmap_load_start(QEMUFile *f, DBMLoadState *s)
-     bdrv_disable_dirty_bitmap(s->bitmap);
-     if (flags & DIRTY_BITMAP_MIG_START_FLAG_ENABLED) {
-+        AioContext *ctx = bdrv_get_aio_context(s->bs);
-+        aio_context_acquire(ctx);
-         bdrv_dirty_bitmap_create_successor(s->bitmap, &local_err);
-+        aio_context_release(ctx);
-         if (local_err) {
-             error_report_err(local_err);
-             return -EINVAL;
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 (file)
index 31392fb..0000000
+++ /dev/null
@@ -1,29 +0,0 @@
-From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
-From: Li Feng <fengli@smartx.com>
-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 <fengli@smartx.com>
-Reviewed-by: Raphael Norwitz <raphael.norwitz@nutanix.com>
----
- 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/extra/0012-hw-ide-reset-cancel-async-DMA-operation-before-reset.patch b/debian/patches/extra/0012-hw-ide-reset-cancel-async-DMA-operation-before-reset.patch
deleted file mode 100644 (file)
index d11ae00..0000000
+++ /dev/null
@@ -1,100 +0,0 @@
-From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
-From: Fiona Ebner <f.ebner@proxmox.com>
-Date: Thu, 24 Aug 2023 11:22:21 +0200
-Subject: [PATCH] hw/ide: reset: cancel async DMA operation before reseting
- state
-
-If there is a pending DMA operation during ide_bus_reset(), the fact
-that the IDEstate is already reset before the operation is canceled
-can be problematic. In particular, ide_dma_cb() might be called and
-then use the reset IDEstate which contains the signature after the
-reset. When used to construct the IO operation this leads to
-ide_get_sector() returning 0 and nsector being 1. This is particularly
-bad, because a write command will thus destroy the first sector which
-often contains a partition table or similar.
-
-Traces showing the unsolicited write happening with IDEstate
-0x5595af6949d0 being used after reset:
-
-> ahci_port_write ahci(0x5595af6923f0)[0]: port write [reg:PxSCTL] @ 0x2c: 0x00000300
-> ahci_reset_port ahci(0x5595af6923f0)[0]: reset port
-> ide_reset IDEstate 0x5595af6949d0
-> ide_reset IDEstate 0x5595af694da8
-> ide_bus_reset_aio aio_cancel
-> dma_aio_cancel dbs=0x7f64600089a0
-> dma_blk_cb dbs=0x7f64600089a0 ret=0
-> dma_complete dbs=0x7f64600089a0 ret=0 cb=0x5595acd40b30
-> ahci_populate_sglist ahci(0x5595af6923f0)[0]
-> ahci_dma_prepare_buf ahci(0x5595af6923f0)[0]: prepare buf limit=512 prepared=512
-> ide_dma_cb IDEState 0x5595af6949d0; sector_num=0 n=1 cmd=DMA WRITE
-> dma_blk_io dbs=0x7f6420802010 bs=0x5595ae2c6c30 offset=0 to_dev=1
-> dma_blk_cb dbs=0x7f6420802010 ret=0
-
-> (gdb) p *qiov
-> $11 = {iov = 0x7f647c76d840, niov = 1, {{nalloc = 1, local_iov = {iov_base = 0x0,
->       iov_len = 512}}, {__pad = "\001\000\000\000\000\000\000\000\000\000\000",
->       size = 512}}}
-> (gdb) bt
-> #0  blk_aio_pwritev (blk=0x5595ae2c6c30, offset=0, qiov=0x7f6420802070, flags=0,
->     cb=0x5595ace6f0b0 <dma_blk_cb>, opaque=0x7f6420802010)
->     at ../block/block-backend.c:1682
-> #1  0x00005595ace6f185 in dma_blk_cb (opaque=0x7f6420802010, ret=<optimized out>)
->     at ../softmmu/dma-helpers.c:179
-> #2  0x00005595ace6f778 in dma_blk_io (ctx=0x5595ae0609f0,
->     sg=sg@entry=0x5595af694d00, offset=offset@entry=0, align=align@entry=512,
->     io_func=io_func@entry=0x5595ace6ee30 <dma_blk_write_io_func>,
->     io_func_opaque=io_func_opaque@entry=0x5595ae2c6c30,
->     cb=0x5595acd40b30 <ide_dma_cb>, opaque=0x5595af6949d0,
->     dir=DMA_DIRECTION_TO_DEVICE) at ../softmmu/dma-helpers.c:244
-> #3  0x00005595ace6f90a in dma_blk_write (blk=0x5595ae2c6c30,
->     sg=sg@entry=0x5595af694d00, offset=offset@entry=0, align=align@entry=512,
->     cb=cb@entry=0x5595acd40b30 <ide_dma_cb>, opaque=opaque@entry=0x5595af6949d0)
->     at ../softmmu/dma-helpers.c:280
-> #4  0x00005595acd40e18 in ide_dma_cb (opaque=0x5595af6949d0, ret=<optimized out>)
->     at ../hw/ide/core.c:953
-> #5  0x00005595ace6f319 in dma_complete (ret=0, dbs=0x7f64600089a0)
->     at ../softmmu/dma-helpers.c:107
-> #6  dma_blk_cb (opaque=0x7f64600089a0, ret=0) at ../softmmu/dma-helpers.c:127
-> #7  0x00005595ad12227d in blk_aio_complete (acb=0x7f6460005b10)
->     at ../block/block-backend.c:1527
-> #8  blk_aio_complete (acb=0x7f6460005b10) at ../block/block-backend.c:1524
-> #9  blk_aio_write_entry (opaque=0x7f6460005b10) at ../block/block-backend.c:1594
-> #10 0x00005595ad258cfb in coroutine_trampoline (i0=<optimized out>,
->     i1=<optimized out>) at ../util/coroutine-ucontext.c:177
-
-Signed-off-by: Fiona Ebner <f.ebner@proxmox.com>
----
- hw/ide/core.c | 14 +++++++-------
- 1 file changed, 7 insertions(+), 7 deletions(-)
-
-diff --git a/hw/ide/core.c b/hw/ide/core.c
-index 08e1f0c3d7..148fccdef2 100644
---- a/hw/ide/core.c
-+++ b/hw/ide/core.c
-@@ -2513,19 +2513,19 @@ static void ide_dummy_transfer_stop(IDEState *s)
- void ide_bus_reset(IDEBus *bus)
- {
--    bus->unit = 0;
--    bus->cmd = 0;
--    ide_reset(&bus->ifs[0]);
--    ide_reset(&bus->ifs[1]);
--    ide_clear_hob(bus);
--
--    /* pending async DMA */
-+    /* pending async DMA - needs the IDEState before it is reset */
-     if (bus->dma->aiocb) {
-         trace_ide_bus_reset_aio();
-         blk_aio_cancel(bus->dma->aiocb);
-         bus->dma->aiocb = NULL;
-     }
-+    bus->unit = 0;
-+    bus->cmd = 0;
-+    ide_reset(&bus->ifs[0]);
-+    ide_reset(&bus->ifs[1]);
-+    ide_clear_hob(bus);
-+
-     /* reset dma provider too */
-     if (bus->dma->ops->reset) {
-         bus->dma->ops->reset(bus->dma);
index 4926a642ee3556f33199675ad9320cc019d0fe01..3d8785cdfb15ff01e76e07ab0dd2b8df861ca743 100644 (file)
@@ -14,10 +14,10 @@ Signed-off-by: Thomas Lamprecht <t.lamprecht@proxmox.com>
  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:
index 2827fa4aa53c1cca2f4a8d3087e0ee0792c9a487..297e250b4c3ef6c7438e6eb850853697562e9d30 100644 (file)
@@ -10,10 +10,10 @@ Signed-off-by: Thomas Lamprecht <t.lamprecht@proxmox.com>
  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
index 6f3afdb33466282c56a0e2a9e3db5c925359ae88..947fc9076c653fb696546b7af3f8218ef877c30b 100644 (file)
@@ -9,7 +9,7 @@ Signed-off-by: Thomas Lamprecht <t.lamprecht@proxmox.com>
  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);
index 122a07dea33607b033a4e4a5563521e514358272..c4e67299e77785bee5b66b9adeef12ed46b1c53d 100644 (file)
@@ -16,7 +16,7 @@ Signed-off-by: Thomas Lamprecht <t.lamprecht@proxmox.com>
  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 {
index feb1ef35d915e9610df8d38c0b11103202cfa724..fb505e55fd758b5b0ab29954e690835fd8b4c607 100644 (file)
@@ -9,10 +9,10 @@ Signed-off-by: Thomas Lamprecht <t.lamprecht@proxmox.com>
  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) {
index ffc30d08ed27420b7d9c9a578bd2284f29f9a047..5b886648fdc16d9b72a4e97c65a45a27a9d9c024 100644 (file)
@@ -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; ) {
index af21381471eb3769014ede31e2efe87ca7c87305..0325fe9a6a5067a05a30376979f10d4c9ec654c8 100644 (file)
@@ -16,10 +16,10 @@ Signed-off-by: Fiona Ebner <f.ebner@proxmox.com>
  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) {
index 376aa673303a41ddb1d90dff4bf411b5f3448161..5cca59a0cf1649125b874536709ad8d7fbe9af32 100644 (file)
@@ -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);
          }
  
index debfc54ede8a602b6f6e4740aeb5a438af169729..d649d2405b9e505201c54c779a9dbae1bbc7d300 100644 (file)
@@ -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);
index b4653146153205fa15024135f9f7aee0e1a3b2dc..2c1524f55ff541a9290e37557cafeb0c913cc0cb 100644 (file)
@@ -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
 +#
index e40d67f237a3f192252632415b5f237039b6e54e..ab331f3c18eeb9d467d36bc4b041d565abd616ea 100644 (file)
@@ -13,10 +13,10 @@ Signed-off-by: Dietmar Maurer <dietmar@proxmox.com>
  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',
index df551da85db7f6fa9932d47206f09dcbc64b025d..26c6840da8e36c0c9d802ce0d8194e3107794d4b 100644 (file)
@@ -14,10 +14,10 @@ Signed-off-by: Fiona Ebner <f.ebner@proxmox.com>
  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
  #
index ce1254306d8ba9a722911c744e3e742b3207a54a..40c9b3284d327c8c69dee68dc56dfcefb2411602 100644 (file)
@@ -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',
index 0c98142a2d5d3700c1ee0299055d5e36eb301747..976f73f026a663c184b3f0c09ab80efbd30c83f8 100644 (file)
@@ -35,20 +35,20 @@ Signed-off-by: Fiona Ebner <f.ebner@proxmox.com>
  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;
index f5f6f7bf0ca032c93f8466cc79ba258cc584c124..c946137e82c9df3e2a9a82384844131cd4d28fae 100644 (file)
@@ -19,11 +19,11 @@ Signed-off-by: Fiona Ebner <f.ebner@proxmox.com>
  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 */
index 39264eea8f5564d063f28f41169287c4f08faa6e..1cb816632500186565967a97881474743d74d73d 100644 (file)
@@ -13,17 +13,17 @@ Signed-off-by: Fiona Ebner <f.ebner@proxmox.com>
  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
index 2c44e344a35beb2fd9ce0d7201d3979812edc3c2..5327c115c9f1c2bfa8d4cca3819313fbec334db7 100644 (file)
@@ -14,10 +14,10 @@ Signed-off-by: Thomas Lamprecht <t.lamprecht@proxmox.com>
  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;
index e9e9f1241aa941bce27b1472094904e20ded3234..766c4f94119da709ef28b959661e74c2ffb4e4b8 100644 (file)
@@ -13,10 +13,10 @@ Signed-off-by: Thomas Lamprecht <t.lamprecht@proxmox.com>
  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',
index 9abde33284022ec431c9979f43f9650b027f6e03..e2f16afd9010d51305dcc5dbd115950419918486 100644 (file)
@@ -18,10 +18,10 @@ Signed-off-by: Thomas Lamprecht <t.lamprecht@proxmox.com>
  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 */
index 79008ee476b05a3cd906986fcdf1407b5ea1c921..277fa3fa740668b84ad414fa1a1f2bcd214ec2cc 100644 (file)
@@ -26,10 +26,10 @@ Signed-off-by: Thomas Lamprecht <t.lamprecht@proxmox.com>
  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" },
index d88d1d0fa368511df828388962dac2c0c9145a82..5ec00c1001ee3d2401f1b1a17f9a2976a6669002 100644 (file)
@@ -21,10 +21,10 @@ Signed-off-by: Fiona Ebner <f.ebner@proxmox.com>
  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;
index 857d22d0d7bbb13d43ffdbfc71b789a7893088d3..f42a06f35cc666d0fafb8783c4b6fb17fa410f8d 100644 (file)
@@ -26,23 +26,23 @@ Signed-off-by: Fiona Ebner <f.ebner@proxmox.com>
  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
index cc4a679de7de05ca90bf726ce87024fb691ef3a2..0d7fd9672387c9b90a521a0b71658641db8fe6a5 100644 (file)
@@ -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 @@
index 7a4881bd57411eacb12618803519f7754eb95eb6..b32c995fcce3a8d3e1585ec72bce41ec9c0bafb8 100644 (file)
@@ -84,30 +84,68 @@ Signed-off-by: Wolfgang Bumiller <w.bumiller@proxmox.com>
      create jobs in a drained section]
 Signed-off-by: Fiona Ebner <f.ebner@proxmox.com>
 ---
- 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'} }
 -
index da798b93d1e342d03ca912efb93a7d7f0aac63e2..2d35795a231884b8d4c4a9255fc98fc9ff6ccfe8 100644 (file)
@@ -14,10 +14,10 @@ Signed-off-by: Wolfgang Bumiller <w.bumiller@proxmox.com>
  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)
  
index 102cfcf902e6cc944a67e49012c0d305dec1757c..56573766bbaed528a16c605a77534f36ca3aa41a 100644 (file)
@@ -24,10 +24,10 @@ Signed-off-by: Fiona Ebner <f.ebner@proxmox.com>
  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',
index 147951cf628110c971e518aebf568d379af3af56..2a5b43e0e18be082bd74c28e9e3d860e203736e4 100644 (file)
@@ -14,10 +14,10 @@ Signed-off-by: Thomas Lamprecht <t.lamprecht@proxmox.com>
  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);
index 6da71b7248f07e1f2145e8714824a7bc7a60b4a1..f6cd3c352677cdb9e9e9ca1f0f5a317eae0b9ebc 100644 (file)
@@ -26,7 +26,7 @@ Signed-off-by: Fiona Ebner <f.ebner@proxmox.com>
  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',
index bd721fc270bbac28b0e311d8a698a4c6d86af7cc..75f5c28f7466d2e6f8e246e1207726448527ed7f 100644 (file)
@@ -19,10 +19,10 @@ Signed-off-by: Thomas Lamprecht <t.lamprecht@proxmox.com>
  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);
index 0e50c93030c77b5e0e7a571e09f9bcc122d1f7fb..f9fee14217ac616fc8c78110c95953903374f1db 100644 (file)
@@ -21,10 +21,10 @@ Signed-off-by: Thomas Lamprecht <t.lamprecht@proxmox.com>
  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;
index 5707beed2f19dc24f7e0f857a24b53a7fd9f3466..28dd8d161ee13b0ff6174f3888cfb65a80e41e24 100644 (file)
@@ -11,7 +11,7 @@ Signed-off-by: Thomas Lamprecht <t.lamprecht@proxmox.com>
  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 {
index d1bd74dba07b4c7165d0873abbf2dea0591d0e01..0e43de5de69396d8507f2a8461de614282d9bb9e 100644 (file)
@@ -17,17 +17,17 @@ Signed-off-by: Thomas Lamprecht <t.lamprecht@proxmox.com>
  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) {
index 823be87b8ff6342775c36c534f389ff3c2ae6c15..ea5f105a48840ee24d886b2c9f93be4aebef706d 100644 (file)
@@ -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)
index 04ef6cbf08821a10505f6c2104e72e6bddece620..a7f6e4dee9e30322be2855c31b84ca98eacd028a 100644 (file)
@@ -52,7 +52,7 @@ Signed-off-by: Fiona Ebner <f.ebner@proxmox.com>
  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();
index f5fa200f278127d1bed27a1ca4fb9592ec4f0c18..3ff0bf7e8184d4be0118e4c39ba9a30fb9b35104 100644 (file)
@@ -13,10 +13,10 @@ Signed-off-by: Fiona Ebner <f.ebner@proxmox.com>
  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);
index 996fa1f9c34eacc4a62d7814379b75fdb0fb5021..01d4d3cd8da53f19eb9e0ac754e073847852cfa2 100644 (file)
@@ -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 f7f686b61cf7ee142c9264d2e04ac2c6a96d37f8..78385bc738108a9b5b20e639520dc60425ca2a5a 160000 (submodule)
--- a/qemu
+++ b/qemu
@@ -1 +1 @@
-Subproject commit f7f686b61cf7ee142c9264d2e04ac2c6a96d37f8
+Subproject commit 78385bc738108a9b5b20e639520dc60425ca2a5a