xref: /openbmc/qemu/qapi/migration.json (revision cbad45511840077dafb6e1d1bc2e228baabecff5)
148685a8eSMarkus Armbruster# -*- Mode: Python -*-
2f7160f32SAndrea Bolognani# vim: filetype=python
348685a8eSMarkus Armbruster#
448685a8eSMarkus Armbruster
548685a8eSMarkus Armbruster##
648685a8eSMarkus Armbruster# = Migration
748685a8eSMarkus Armbruster##
848685a8eSMarkus Armbruster
948685a8eSMarkus Armbruster{ 'include': 'common.json' }
109aca82baSJuan Quintela{ 'include': 'sockets.json' }
1148685a8eSMarkus Armbruster
1248685a8eSMarkus Armbruster##
1348685a8eSMarkus Armbruster# @MigrationStats:
1448685a8eSMarkus Armbruster#
1548685a8eSMarkus Armbruster# Detailed migration status.
1648685a8eSMarkus Armbruster#
1748685a8eSMarkus Armbruster# @transferred: amount of bytes already transferred to the target VM
1848685a8eSMarkus Armbruster#
19a937b6aaSMarkus Armbruster# @remaining: amount of bytes remaining to be transferred to the
20a937b6aaSMarkus Armbruster#     target VM
2148685a8eSMarkus Armbruster#
2248685a8eSMarkus Armbruster# @total: total amount of bytes involved in the migration process
2348685a8eSMarkus Armbruster#
2448685a8eSMarkus Armbruster# @duplicate: number of duplicate (zero) pages (since 1.2)
2548685a8eSMarkus Armbruster#
2648685a8eSMarkus Armbruster# @normal: number of normal pages (since 1.2)
2748685a8eSMarkus Armbruster#
2848685a8eSMarkus Armbruster# @normal-bytes: number of normal bytes sent (since 1.2)
2948685a8eSMarkus Armbruster#
30a937b6aaSMarkus Armbruster# @dirty-pages-rate: number of pages dirtied by second by the guest
31a937b6aaSMarkus Armbruster#     (since 1.3)
3248685a8eSMarkus Armbruster#
3348685a8eSMarkus Armbruster# @mbps: throughput in megabits/sec.  (since 1.6)
3448685a8eSMarkus Armbruster#
35a937b6aaSMarkus Armbruster# @dirty-sync-count: number of times that dirty ram was synchronized
36a937b6aaSMarkus Armbruster#     (since 2.1)
3748685a8eSMarkus Armbruster#
38a937b6aaSMarkus Armbruster# @postcopy-requests: The number of page requests received from the
39a937b6aaSMarkus Armbruster#     destination (since 2.7)
4048685a8eSMarkus Armbruster#
4148685a8eSMarkus Armbruster# @page-size: The number of bytes per page for the various page-based
4248685a8eSMarkus Armbruster#     statistics (since 2.10)
4348685a8eSMarkus Armbruster#
44a61c45bdSJuan Quintela# @multifd-bytes: The number of bytes sent through multifd (since 3.0)
45a61c45bdSJuan Quintela#
46aecbfe9cSXiao Guangrong# @pages-per-second: the number of memory pages transferred per second
47aecbfe9cSXiao Guangrong#     (Since 4.0)
48aecbfe9cSXiao Guangrong#
49ae680668SDavid Edmondson# @precopy-bytes: The number of bytes sent in the pre-copy phase
50ae680668SDavid Edmondson#     (since 7.0).
51ae680668SDavid Edmondson#
52ae680668SDavid Edmondson# @downtime-bytes: The number of bytes sent while the guest is paused
53ae680668SDavid Edmondson#     (since 7.0).
54ae680668SDavid Edmondson#
55ae680668SDavid Edmondson# @postcopy-bytes: The number of bytes sent during the post-copy phase
56ae680668SDavid Edmondson#     (since 7.0).
57ae680668SDavid Edmondson#
58a937b6aaSMarkus Armbruster# @dirty-sync-missed-zero-copy: Number of times dirty RAM
59a937b6aaSMarkus Armbruster#     synchronization could not avoid copying dirty pages.  This is
60a937b6aaSMarkus Armbruster#     between 0 and @dirty-sync-count * @multifd-channels.  (since
61a937b6aaSMarkus Armbruster#     7.1)
62a937b6aaSMarkus Armbruster#
639bc6e893SMarkus Armbruster# Since: 0.14
6448685a8eSMarkus Armbruster##
6548685a8eSMarkus Armbruster{ 'struct': 'MigrationStats',
6648685a8eSMarkus Armbruster  'data': {'transferred': 'int', 'remaining': 'int', 'total': 'int' ,
677b24d326SJuan Quintela           'duplicate': 'int',
687b24d326SJuan Quintela           'normal': 'int',
6948685a8eSMarkus Armbruster           'normal-bytes': 'int', 'dirty-pages-rate': 'int',
7048685a8eSMarkus Armbruster           'mbps': 'number', 'dirty-sync-count': 'int',
71a61c45bdSJuan Quintela           'postcopy-requests': 'int', 'page-size': 'int',
72ae680668SDavid Edmondson           'multifd-bytes': 'uint64', 'pages-per-second': 'uint64',
73ae680668SDavid Edmondson           'precopy-bytes': 'uint64', 'downtime-bytes': 'uint64',
74cf20c897SLeonardo Bras           'postcopy-bytes': 'uint64',
75cf20c897SLeonardo Bras           'dirty-sync-missed-zero-copy': 'uint64' } }
7648685a8eSMarkus Armbruster
7748685a8eSMarkus Armbruster##
7848685a8eSMarkus Armbruster# @XBZRLECacheStats:
7948685a8eSMarkus Armbruster#
8048685a8eSMarkus Armbruster# Detailed XBZRLE migration cache statistics
8148685a8eSMarkus Armbruster#
8248685a8eSMarkus Armbruster# @cache-size: XBZRLE cache size
8348685a8eSMarkus Armbruster#
8448685a8eSMarkus Armbruster# @bytes: amount of bytes already transferred to the target VM
8548685a8eSMarkus Armbruster#
8648685a8eSMarkus Armbruster# @pages: amount of pages transferred to the target VM
8748685a8eSMarkus Armbruster#
8848685a8eSMarkus Armbruster# @cache-miss: number of cache miss
8948685a8eSMarkus Armbruster#
9048685a8eSMarkus Armbruster# @cache-miss-rate: rate of cache miss (since 2.1)
9148685a8eSMarkus Armbruster#
92e460a4b1SWei Wang# @encoding-rate: rate of encoded bytes (since 5.1)
93e460a4b1SWei Wang#
9448685a8eSMarkus Armbruster# @overflow: number of overflows
9548685a8eSMarkus Armbruster#
9648685a8eSMarkus Armbruster# Since: 1.2
9748685a8eSMarkus Armbruster##
9848685a8eSMarkus Armbruster{ 'struct': 'XBZRLECacheStats',
998b9407a0SMarkus Armbruster  'data': {'cache-size': 'size', 'bytes': 'int', 'pages': 'int',
10048685a8eSMarkus Armbruster           'cache-miss': 'int', 'cache-miss-rate': 'number',
101e460a4b1SWei Wang           'encoding-rate': 'number', 'overflow': 'int' } }
10248685a8eSMarkus Armbruster
10348685a8eSMarkus Armbruster##
10476e03000SXiao Guangrong# @CompressionStats:
10576e03000SXiao Guangrong#
10676e03000SXiao Guangrong# Detailed migration compression statistics
10776e03000SXiao Guangrong#
10876e03000SXiao Guangrong# @pages: amount of pages compressed and transferred to the target VM
10976e03000SXiao Guangrong#
110a937b6aaSMarkus Armbruster# @busy: count of times that no free thread was available to compress
111a937b6aaSMarkus Armbruster#     data
11276e03000SXiao Guangrong#
11376e03000SXiao Guangrong# @busy-rate: rate of thread busy
11476e03000SXiao Guangrong#
11576e03000SXiao Guangrong# @compressed-size: amount of bytes after compression
11676e03000SXiao Guangrong#
11776e03000SXiao Guangrong# @compression-rate: rate of compressed size
11876e03000SXiao Guangrong#
11976e03000SXiao Guangrong# Since: 3.1
12076e03000SXiao Guangrong##
12176e03000SXiao Guangrong{ 'struct': 'CompressionStats',
12276e03000SXiao Guangrong  'data': {'pages': 'int', 'busy': 'int', 'busy-rate': 'number',
12376e03000SXiao Guangrong           'compressed-size': 'int', 'compression-rate': 'number' } }
12476e03000SXiao Guangrong
12576e03000SXiao Guangrong##
12648685a8eSMarkus Armbruster# @MigrationStatus:
12748685a8eSMarkus Armbruster#
12848685a8eSMarkus Armbruster# An enumeration of migration status.
12948685a8eSMarkus Armbruster#
13048685a8eSMarkus Armbruster# @none: no migration has ever happened.
13148685a8eSMarkus Armbruster#
13248685a8eSMarkus Armbruster# @setup: migration process has been initiated.
13348685a8eSMarkus Armbruster#
13448685a8eSMarkus Armbruster# @cancelling: in the process of cancelling migration.
13548685a8eSMarkus Armbruster#
13648685a8eSMarkus Armbruster# @cancelled: cancelling migration is finished.
13748685a8eSMarkus Armbruster#
13848685a8eSMarkus Armbruster# @active: in the process of doing migration.
13948685a8eSMarkus Armbruster#
140a937b6aaSMarkus Armbruster# @postcopy-active: like active, but now in postcopy mode.  (since
141a937b6aaSMarkus Armbruster#     2.5)
14248685a8eSMarkus Armbruster#
14351f63ec7SPeter Maydell# @postcopy-paused: during postcopy but paused.  (since 3.0)
144a688d2c1SPeter Xu#
14501bed0ffSMarkus Armbruster# @postcopy-recover-setup: setup phase for a postcopy recovery
14601bed0ffSMarkus Armbruster#     process, preparing for a recovery phase to start.  (since 9.1)
1474146b77eSPeter Xu#
148a937b6aaSMarkus Armbruster# @postcopy-recover: trying to recover from a paused postcopy.  (since
149a937b6aaSMarkus Armbruster#     3.0)
150135b87b4SPeter Xu#
15148685a8eSMarkus Armbruster# @completed: migration is finished.
15248685a8eSMarkus Armbruster#
15348685a8eSMarkus Armbruster# @failed: some error occurred during migration process.
15448685a8eSMarkus Armbruster#
155a937b6aaSMarkus Armbruster# @colo: VM is in the process of fault tolerance, VM can not get into
156a937b6aaSMarkus Armbruster#     this state unless colo capability is enabled for migration.
157a937b6aaSMarkus Armbruster#     (since 2.8)
15848685a8eSMarkus Armbruster#
15931e06077SDr. David Alan Gilbert# @pre-switchover: Paused before device serialisation.  (since 2.11)
16031e06077SDr. David Alan Gilbert#
161a937b6aaSMarkus Armbruster# @device: During device serialisation when pause-before-switchover is
162a937b6aaSMarkus Armbruster#     enabled (since 2.11)
16331e06077SDr. David Alan Gilbert#
164a937b6aaSMarkus Armbruster# @wait-unplug: wait for device unplug request by guest OS to be
165a937b6aaSMarkus Armbruster#     completed.  (since 4.2)
166c7e0acd5SJens Freimann#
16748685a8eSMarkus Armbruster# Since: 2.3
16848685a8eSMarkus Armbruster##
16948685a8eSMarkus Armbruster{ 'enum': 'MigrationStatus',
17048685a8eSMarkus Armbruster  'data': [ 'none', 'setup', 'cancelling', 'cancelled',
171a688d2c1SPeter Xu            'active', 'postcopy-active', 'postcopy-paused',
1724146b77eSPeter Xu            'postcopy-recover-setup',
173135b87b4SPeter Xu            'postcopy-recover', 'completed', 'failed', 'colo',
174c7e0acd5SJens Freimann            'pre-switchover', 'device', 'wait-unplug' ] }
1753710586cSKirti Wankhede##
1763710586cSKirti Wankhede# @VfioStats:
1773710586cSKirti Wankhede#
1783710586cSKirti Wankhede# Detailed VFIO devices migration statistics
1793710586cSKirti Wankhede#
180a937b6aaSMarkus Armbruster# @transferred: amount of bytes transferred to the target VM by VFIO
181a937b6aaSMarkus Armbruster#     devices
1823710586cSKirti Wankhede#
1833710586cSKirti Wankhede# Since: 5.2
1843710586cSKirti Wankhede##
1853710586cSKirti Wankhede{ 'struct': 'VfioStats',
1863710586cSKirti Wankhede  'data': {'transferred': 'int' } }
18748685a8eSMarkus Armbruster
18848685a8eSMarkus Armbruster##
18948685a8eSMarkus Armbruster# @MigrationInfo:
19048685a8eSMarkus Armbruster#
19148685a8eSMarkus Armbruster# Information about current migration process.
19248685a8eSMarkus Armbruster#
19348685a8eSMarkus Armbruster# @status: @MigrationStatus describing the current migration status.
194a937b6aaSMarkus Armbruster#     If this field is not returned, no migration process has been
195a937b6aaSMarkus Armbruster#     initiated
19648685a8eSMarkus Armbruster#
197a937b6aaSMarkus Armbruster# @ram: @MigrationStats containing detailed migration status, only
198a937b6aaSMarkus Armbruster#     returned if status is 'active' or 'completed'(since 1.2)
19948685a8eSMarkus Armbruster#
20048685a8eSMarkus Armbruster# @xbzrle-cache: @XBZRLECacheStats containing detailed XBZRLE
20148685a8eSMarkus Armbruster#     migration statistics, only returned if XBZRLE feature is on and
20248685a8eSMarkus Armbruster#     status is 'active' or 'completed' (since 1.2)
20348685a8eSMarkus Armbruster#
20448685a8eSMarkus Armbruster# @total-time: total amount of milliseconds since migration started.
205a937b6aaSMarkus Armbruster#     If migration has ended, it returns the total migration time.
206a937b6aaSMarkus Armbruster#     (since 1.2)
20748685a8eSMarkus Armbruster#
208a937b6aaSMarkus Armbruster# @downtime: only present when migration finishes correctly total
209a937b6aaSMarkus Armbruster#     downtime in milliseconds for the guest.  (since 1.3)
21048685a8eSMarkus Armbruster#
211a937b6aaSMarkus Armbruster# @expected-downtime: only present while migration is active expected
212a937b6aaSMarkus Armbruster#     downtime in milliseconds for the guest in last walk of the dirty
213a937b6aaSMarkus Armbruster#     bitmap.  (since 1.3)
21448685a8eSMarkus Armbruster#
215a660eed4SPeter Maydell# @setup-time: amount of setup time in milliseconds *before* the
216a937b6aaSMarkus Armbruster#     iterations begin but *after* the QMP command is issued.  This is
217a937b6aaSMarkus Armbruster#     designed to provide an accounting of any activities (such as
218a937b6aaSMarkus Armbruster#     RDMA pinning) which may be expensive, but do not actually occur
219a937b6aaSMarkus Armbruster#     during the iterative migration rounds themselves.  (since 1.6)
22048685a8eSMarkus Armbruster#
22148685a8eSMarkus Armbruster# @cpu-throttle-percentage: percentage of time guest cpus are being
222a937b6aaSMarkus Armbruster#     throttled during auto-converge.  This is only present when
223a937b6aaSMarkus Armbruster#     auto-converge has started throttling guest cpus.  (Since 2.7)
22448685a8eSMarkus Armbruster#
225c94143e5SPeter Xu# @error-desc: the human readable error description string.  Clients
226c94143e5SPeter Xu#     should not attempt to parse the error strings.  (Since 2.7)
22748685a8eSMarkus Armbruster#
228a937b6aaSMarkus Armbruster# @postcopy-blocktime: total time when all vCPU were blocked during
229a937b6aaSMarkus Armbruster#     postcopy live migration.  This is only present when the
230a937b6aaSMarkus Armbruster#     postcopy-blocktime migration capability is enabled.  (Since 3.0)
23165ace060SAlexey Perevalov#
232a937b6aaSMarkus Armbruster# @postcopy-vcpu-blocktime: list of the postcopy blocktime per vCPU.
233a937b6aaSMarkus Armbruster#     This is only present when the postcopy-blocktime migration
234a937b6aaSMarkus Armbruster#     capability is enabled.  (Since 3.0)
23565ace060SAlexey Perevalov#
236a937b6aaSMarkus Armbruster# @socket-address: Only used for tcp, to know what the real port is
237a937b6aaSMarkus Armbruster#     (Since 4.0)
2389aca82baSJuan Quintela#
239a937b6aaSMarkus Armbruster# @vfio: @VfioStats containing detailed VFIO devices migration
240a937b6aaSMarkus Armbruster#     statistics, only returned if VFIO device is present, migration
241a937b6aaSMarkus Armbruster#     is supported by all VFIO devices and status is 'active' or
242a937b6aaSMarkus Armbruster#     'completed' (since 5.2)
2433710586cSKirti Wankhede#
244a937b6aaSMarkus Armbruster# @blocked-reasons: A list of reasons an outgoing migration is
245a937b6aaSMarkus Armbruster#     blocked.  Present and non-empty when migration is blocked.
246e11ce6c0SMarkus Armbruster#     (since 6.0)
247e11ce6c0SMarkus Armbruster#
24801bed0ffSMarkus Armbruster# @dirty-limit-throttle-time-per-round: Maximum throttle time (in
24901bed0ffSMarkus Armbruster#     microseconds) of virtual CPUs each dirty ring full round, which
25001bed0ffSMarkus Armbruster#     shows how MigrationCapability dirty-limit affects the guest
25101bed0ffSMarkus Armbruster#     during live migration.  (Since 8.1)
25215699cf5SHyman Huang(黄勇)#
2538abc8115SHyman Huang(黄勇)# @dirty-limit-ring-full-time: Estimated average dirty ring full time
2548abc8115SHyman Huang(黄勇)#     (in microseconds) for each dirty ring full round.  The value
2558abc8115SHyman Huang(黄勇)#     equals the dirty ring memory size divided by the average dirty
2568abc8115SHyman Huang(黄勇)#     page rate of the virtual CPU, which can be used to observe the
2578abc8115SHyman Huang(黄勇)#     average memory load of the virtual CPU indirectly.  Note that
2588abc8115SHyman Huang(黄勇)#     zero means guest doesn't dirty memory.  (Since 8.1)
25915699cf5SHyman Huang(黄勇)#
2609bc6e893SMarkus Armbruster# Since: 0.14
26148685a8eSMarkus Armbruster##
26248685a8eSMarkus Armbruster{ 'struct': 'MigrationInfo',
26348685a8eSMarkus Armbruster  'data': {'*status': 'MigrationStatus', '*ram': 'MigrationStats',
2643710586cSKirti Wankhede           '*vfio': 'VfioStats',
26548685a8eSMarkus Armbruster           '*xbzrle-cache': 'XBZRLECacheStats',
26648685a8eSMarkus Armbruster           '*total-time': 'int',
26748685a8eSMarkus Armbruster           '*expected-downtime': 'int',
26848685a8eSMarkus Armbruster           '*downtime': 'int',
26948685a8eSMarkus Armbruster           '*setup-time': 'int',
27048685a8eSMarkus Armbruster           '*cpu-throttle-percentage': 'int',
27165ace060SAlexey Perevalov           '*error-desc': 'str',
2723af8554bSDr. David Alan Gilbert           '*blocked-reasons': ['str'],
27365ace060SAlexey Perevalov           '*postcopy-blocktime': 'uint32',
27476e03000SXiao Guangrong           '*postcopy-vcpu-blocktime': ['uint32'],
27515699cf5SHyman Huang(黄勇)           '*socket-address': ['SocketAddress'],
27615699cf5SHyman Huang(黄勇)           '*dirty-limit-throttle-time-per-round': 'uint64',
27715699cf5SHyman Huang(黄勇)           '*dirty-limit-ring-full-time': 'uint64'} }
27848685a8eSMarkus Armbruster
27948685a8eSMarkus Armbruster##
28048685a8eSMarkus Armbruster# @query-migrate:
28148685a8eSMarkus Armbruster#
28248685a8eSMarkus Armbruster# Returns information about current migration process.  If migration
28348685a8eSMarkus Armbruster# is active there will be another json-object with RAM migration
284eef0bae3SFabiano Rosas# status.
28548685a8eSMarkus Armbruster#
28648685a8eSMarkus Armbruster# Returns: @MigrationInfo
28748685a8eSMarkus Armbruster#
2889bc6e893SMarkus Armbruster# Since: 0.14
28948685a8eSMarkus Armbruster#
290a9eab6e2SJohn Snow# .. qmp-example::
291a9eab6e2SJohn Snow#    :title: Before the first migration
29248685a8eSMarkus Armbruster#
29348685a8eSMarkus Armbruster#     -> { "execute": "query-migrate" }
29448685a8eSMarkus Armbruster#     <- { "return": {} }
29548685a8eSMarkus Armbruster#
296a9eab6e2SJohn Snow# .. qmp-example::
297a9eab6e2SJohn Snow#    :title: Migration is done and has succeeded
29848685a8eSMarkus Armbruster#
29948685a8eSMarkus Armbruster#     -> { "execute": "query-migrate" }
30048685a8eSMarkus Armbruster#     <- { "return": {
30148685a8eSMarkus Armbruster#             "status": "completed",
302be1d2c49Sjialina01#             "total-time":12345,
303be1d2c49Sjialina01#             "setup-time":12345,
304be1d2c49Sjialina01#             "downtime":12345,
30548685a8eSMarkus Armbruster#             "ram":{
30648685a8eSMarkus Armbruster#               "transferred":123,
30748685a8eSMarkus Armbruster#               "remaining":123,
30848685a8eSMarkus Armbruster#               "total":246,
30948685a8eSMarkus Armbruster#               "duplicate":123,
31048685a8eSMarkus Armbruster#               "normal":123,
31148685a8eSMarkus Armbruster#               "normal-bytes":123456,
31248685a8eSMarkus Armbruster#               "dirty-sync-count":15
31348685a8eSMarkus Armbruster#             }
31448685a8eSMarkus Armbruster#          }
31548685a8eSMarkus Armbruster#        }
31648685a8eSMarkus Armbruster#
317a9eab6e2SJohn Snow# .. qmp-example::
318a9eab6e2SJohn Snow#    :title: Migration is done and has failed
31948685a8eSMarkus Armbruster#
32048685a8eSMarkus Armbruster#     -> { "execute": "query-migrate" }
32148685a8eSMarkus Armbruster#     <- { "return": { "status": "failed" } }
32248685a8eSMarkus Armbruster#
323a9eab6e2SJohn Snow# .. qmp-example::
324a9eab6e2SJohn Snow#    :title: Migration is being performed
32548685a8eSMarkus Armbruster#
32648685a8eSMarkus Armbruster#     -> { "execute": "query-migrate" }
32748685a8eSMarkus Armbruster#     <- {
32848685a8eSMarkus Armbruster#           "return":{
32948685a8eSMarkus Armbruster#              "status":"active",
330be1d2c49Sjialina01#              "total-time":12345,
331be1d2c49Sjialina01#              "setup-time":12345,
332be1d2c49Sjialina01#              "expected-downtime":12345,
33348685a8eSMarkus Armbruster#              "ram":{
33448685a8eSMarkus Armbruster#                 "transferred":123,
33548685a8eSMarkus Armbruster#                 "remaining":123,
33648685a8eSMarkus Armbruster#                 "total":246,
33748685a8eSMarkus Armbruster#                 "duplicate":123,
33848685a8eSMarkus Armbruster#                 "normal":123,
33948685a8eSMarkus Armbruster#                 "normal-bytes":123456,
34048685a8eSMarkus Armbruster#                 "dirty-sync-count":15
34148685a8eSMarkus Armbruster#              }
34248685a8eSMarkus Armbruster#           }
34348685a8eSMarkus Armbruster#        }
34448685a8eSMarkus Armbruster#
345a9eab6e2SJohn Snow# .. qmp-example::
346a9eab6e2SJohn Snow#    :title: Migration is being performed and XBZRLE is active
34748685a8eSMarkus Armbruster#
34848685a8eSMarkus Armbruster#     -> { "execute": "query-migrate" }
34948685a8eSMarkus Armbruster#     <- {
35048685a8eSMarkus Armbruster#           "return":{
35148685a8eSMarkus Armbruster#              "status":"active",
352be1d2c49Sjialina01#              "total-time":12345,
353be1d2c49Sjialina01#              "setup-time":12345,
354be1d2c49Sjialina01#              "expected-downtime":12345,
35548685a8eSMarkus Armbruster#              "ram":{
35648685a8eSMarkus Armbruster#                 "total":1057024,
35748685a8eSMarkus Armbruster#                 "remaining":1053304,
35848685a8eSMarkus Armbruster#                 "transferred":3720,
35948685a8eSMarkus Armbruster#                 "duplicate":10,
36048685a8eSMarkus Armbruster#                 "normal":3333,
36148685a8eSMarkus Armbruster#                 "normal-bytes":3412992,
36248685a8eSMarkus Armbruster#                 "dirty-sync-count":15
36348685a8eSMarkus Armbruster#              },
36448685a8eSMarkus Armbruster#              "xbzrle-cache":{
36548685a8eSMarkus Armbruster#                 "cache-size":67108864,
36648685a8eSMarkus Armbruster#                 "bytes":20971520,
36748685a8eSMarkus Armbruster#                 "pages":2444343,
36848685a8eSMarkus Armbruster#                 "cache-miss":2244,
36948685a8eSMarkus Armbruster#                 "cache-miss-rate":0.123,
370e460a4b1SWei Wang#                 "encoding-rate":80.1,
37148685a8eSMarkus Armbruster#                 "overflow":34434
37248685a8eSMarkus Armbruster#              }
37348685a8eSMarkus Armbruster#           }
37448685a8eSMarkus Armbruster#        }
37548685a8eSMarkus Armbruster##
37648685a8eSMarkus Armbruster{ 'command': 'query-migrate', 'returns': 'MigrationInfo' }
37748685a8eSMarkus Armbruster
37848685a8eSMarkus Armbruster##
37948685a8eSMarkus Armbruster# @MigrationCapability:
38048685a8eSMarkus Armbruster#
38148685a8eSMarkus Armbruster# Migration capabilities enumeration
38248685a8eSMarkus Armbruster#
383a937b6aaSMarkus Armbruster# @xbzrle: Migration supports xbzrle (Xor Based Zero Run Length
384a937b6aaSMarkus Armbruster#     Encoding).  This feature allows us to minimize migration traffic
385a937b6aaSMarkus Armbruster#     for certain work loads, by sending compressed difference of the
386a937b6aaSMarkus Armbruster#     pages
38748685a8eSMarkus Armbruster#
388a937b6aaSMarkus Armbruster# @rdma-pin-all: Controls whether or not the entire VM memory
389a937b6aaSMarkus Armbruster#     footprint is mlock()'d on demand or all at once.  Refer to
390a937b6aaSMarkus Armbruster#     docs/rdma.txt for usage.  Disabled by default.  (since 2.0)
39148685a8eSMarkus Armbruster#
392a937b6aaSMarkus Armbruster# @zero-blocks: During storage migration encode blocks of zeroes
393a937b6aaSMarkus Armbruster#     efficiently.  This essentially saves 1MB of zeroes per block on
394a937b6aaSMarkus Armbruster#     the wire.  Enabling requires source and target VM to support
395a937b6aaSMarkus Armbruster#     this feature.  To enable it is sufficient to enable the
39601bed0ffSMarkus Armbruster#     capability on the source VM.  The feature is disabled by
39701bed0ffSMarkus Armbruster#     default.  (since 1.6)
39848685a8eSMarkus Armbruster#
399e4ceec29SJuan Quintela# @events: generate events for each migration state change (since 2.4)
40048685a8eSMarkus Armbruster#
401a937b6aaSMarkus Armbruster# @auto-converge: If enabled, QEMU will automatically throttle down
402a937b6aaSMarkus Armbruster#     the guest to speed up convergence of RAM migration.  (since 1.6)
40348685a8eSMarkus Armbruster#
404a937b6aaSMarkus Armbruster# @postcopy-ram: Start executing on the migration target before all of
405a937b6aaSMarkus Armbruster#     RAM has been migrated, pulling the remaining pages along as
406a937b6aaSMarkus Armbruster#     needed.  The capacity must have the same setting on both source
407a937b6aaSMarkus Armbruster#     and target or migration will not even start.  NOTE: If the
408a937b6aaSMarkus Armbruster#     migration fails during postcopy the VM will fail.  (since 2.6)
40948685a8eSMarkus Armbruster#
410a937b6aaSMarkus Armbruster# @x-colo: If enabled, migration will never end, and the state of the
411a937b6aaSMarkus Armbruster#     VM on the primary side will be migrated continuously to the VM
412a937b6aaSMarkus Armbruster#     on secondary side, this process is called COarse-Grain LOck
413a937b6aaSMarkus Armbruster#     Stepping (COLO) for Non-stop Service.  (since 2.8)
41448685a8eSMarkus Armbruster#
415a937b6aaSMarkus Armbruster# @release-ram: if enabled, qemu will free the migrated ram pages on
416a937b6aaSMarkus Armbruster#     the source during postcopy-ram migration.  (since 2.9)
41748685a8eSMarkus Armbruster#
41848685a8eSMarkus Armbruster# @return-path: If enabled, migration will use the return path even
41948685a8eSMarkus Armbruster#     for precopy.  (since 2.10)
42048685a8eSMarkus Armbruster#
421a937b6aaSMarkus Armbruster# @pause-before-switchover: Pause outgoing migration before
422a937b6aaSMarkus Armbruster#     serialising device state and before disabling block IO (since
423a937b6aaSMarkus Armbruster#     2.11)
42493fbd031SDr. David Alan Gilbert#
425cbfd6c95SJuan Quintela# @multifd: Use more than one fd for migration (since 4.0)
42630126bbfSJuan Quintela#
42755efc8c2SVladimir Sementsov-Ogievskiy# @dirty-bitmaps: If enabled, QEMU will migrate named dirty bitmaps.
42855efc8c2SVladimir Sementsov-Ogievskiy#     (since 2.12)
42955efc8c2SVladimir Sementsov-Ogievskiy#
430f22f928eSAlexey Perevalov# @postcopy-blocktime: Calculate downtime for postcopy live migration
43151f63ec7SPeter Maydell#     (since 3.0)
432f22f928eSAlexey Perevalov#
433a937b6aaSMarkus Armbruster# @late-block-activate: If enabled, the destination will not activate
434a937b6aaSMarkus Armbruster#     block devices (and thus take locks) immediately at the end of
435a937b6aaSMarkus Armbruster#     migration.  (since 3.0)
4360f073f44SDr. David Alan Gilbert#
4379e272073SMarkus Armbruster# @x-ignore-shared: If enabled, QEMU will not migrate shared memory
4389e272073SMarkus Armbruster#     that is accessible on the destination machine.  (since 4.0)
43918269069SYury Kotov#
440b9d68df6SYury Kotov# @validate-uuid: Send the UUID of the source to allow the destination
441b9d68df6SYury Kotov#     to ensure it is the same.  (since 4.2)
442b9d68df6SYury Kotov#
443a937b6aaSMarkus Armbruster# @background-snapshot: If enabled, the migration stream will be a
444a937b6aaSMarkus Armbruster#     snapshot of the VM exactly at the point when the migration
445209e64d9SMarkus Armbruster#     procedure starts.  The VM RAM is saved with running VM.
446209e64d9SMarkus Armbruster#     (since 6.0)
4476e8c25b4SAndrey Gruzdev#
448a937b6aaSMarkus Armbruster# @zero-copy-send: Controls behavior on sending memory pages on
449a937b6aaSMarkus Armbruster#     migration.  When true, enables a zero-copy mechanism for sending
450a937b6aaSMarkus Armbruster#     memory pages, if host supports it.  Requires that QEMU be
451a937b6aaSMarkus Armbruster#     permitted to use locked memory for guest RAM pages.  (since 7.1)
452a937b6aaSMarkus Armbruster#
453a937b6aaSMarkus Armbruster# @postcopy-preempt: If enabled, the migration process will allow
454a937b6aaSMarkus Armbruster#     postcopy requests to preempt precopy stream, so postcopy
455a937b6aaSMarkus Armbruster#     requests will be handled faster.  This is a performance feature
456a937b6aaSMarkus Armbruster#     and should not affect the correctness of postcopy migration.
457ce5b0f4aSPeter Xu#     (since 7.1)
4581abaec9aSLeonardo Bras#
4596574232fSAvihai Horon# @switchover-ack: If enabled, migration will not stop the source VM
4606574232fSAvihai Horon#     and complete the migration until an ACK is received from the
4616574232fSAvihai Horon#     destination that it's OK to do so.  Exactly when this ACK is
4629e272073SMarkus Armbruster#     sent depends on the migrated devices that use this feature.  For
4639e272073SMarkus Armbruster#     example, a device can use it to make sure some of its data is
4649e272073SMarkus Armbruster#     sent and loaded in the destination before doing switchover.
4656574232fSAvihai Horon#     This can reduce downtime if devices that support this capability
4666574232fSAvihai Horon#     are present.  'return-path' capability must be enabled to use
4676574232fSAvihai Horon#     it.  (since 8.1)
4686574232fSAvihai Horon#
469ef965377SHyman Huang(黄勇)# @dirty-limit: If enabled, migration will throttle vCPUs as needed to
470ef965377SHyman Huang(黄勇)#     keep their dirty page rate within @vcpu-dirty-limit.  This can
471ef965377SHyman Huang(黄勇)#     improve responsiveness of large guests during live migration,
472ef965377SHyman Huang(黄勇)#     and can result in more stable read performance.  Requires KVM
473ef965377SHyman Huang(黄勇)#     with accelerator property "dirty-ring-size" set.  (Since 8.1)
474dc623955SHyman Huang(黄勇)#
4754ed49febSFabiano Rosas# @mapped-ram: Migrate using fixed offsets in the migration file for
4764ed49febSFabiano Rosas#     each RAM page.  Requires a migration URI that supports seeking,
4774ed49febSFabiano Rosas#     such as a file.  (since 9.0)
4784ed49febSFabiano Rosas#
4799fb49daaSMarkus Armbruster# Features:
480a937b6aaSMarkus Armbruster#
4819fb49daaSMarkus Armbruster# @unstable: Members @x-colo and @x-ignore-shared are experimental.
48273581a04SFabiano Rosas# @deprecated: Member @zero-blocks is deprecated as being part of
48373581a04SFabiano Rosas#     block migration which was already removed.
4849fb49daaSMarkus Armbruster#
48548685a8eSMarkus Armbruster# Since: 1.2
48648685a8eSMarkus Armbruster##
48748685a8eSMarkus Armbruster{ 'enum': 'MigrationCapability',
48873581a04SFabiano Rosas  'data': ['xbzrle', 'rdma-pin-all', 'auto-converge',
48973581a04SFabiano Rosas           { 'name': 'zero-blocks', 'features': [ 'deprecated' ] },
490864128dfSJuan Quintela           'events', 'postcopy-ram',
4919fb49daaSMarkus Armbruster           { 'name': 'x-colo', 'features': [ 'unstable' ] },
4929fb49daaSMarkus Armbruster           'release-ram',
49366db46caSJuan Quintela           'return-path', 'pause-before-switchover', 'multifd',
49418269069SYury Kotov           'dirty-bitmaps', 'postcopy-blocktime', 'late-block-activate',
4959fb49daaSMarkus Armbruster           { 'name': 'x-ignore-shared', 'features': [ 'unstable' ] },
4961abaec9aSLeonardo Bras           'validate-uuid', 'background-snapshot',
497dc623955SHyman Huang(黄勇)           'zero-copy-send', 'postcopy-preempt', 'switchover-ack',
4984ed49febSFabiano Rosas           'dirty-limit', 'mapped-ram'] }
49948685a8eSMarkus Armbruster
50048685a8eSMarkus Armbruster##
50148685a8eSMarkus Armbruster# @MigrationCapabilityStatus:
50248685a8eSMarkus Armbruster#
50348685a8eSMarkus Armbruster# Migration capability information
50448685a8eSMarkus Armbruster#
50548685a8eSMarkus Armbruster# @capability: capability enum
50648685a8eSMarkus Armbruster#
50748685a8eSMarkus Armbruster# @state: capability state bool
50848685a8eSMarkus Armbruster#
50948685a8eSMarkus Armbruster# Since: 1.2
51048685a8eSMarkus Armbruster##
51148685a8eSMarkus Armbruster{ 'struct': 'MigrationCapabilityStatus',
51248685a8eSMarkus Armbruster  'data': { 'capability': 'MigrationCapability', 'state': 'bool' } }
51348685a8eSMarkus Armbruster
51448685a8eSMarkus Armbruster##
51548685a8eSMarkus Armbruster# @migrate-set-capabilities:
51648685a8eSMarkus Armbruster#
51748685a8eSMarkus Armbruster# Enable/Disable the following migration capabilities (like xbzrle)
51848685a8eSMarkus Armbruster#
51948685a8eSMarkus Armbruster# @capabilities: json array of capability modifications to make
52048685a8eSMarkus Armbruster#
52148685a8eSMarkus Armbruster# Since: 1.2
52248685a8eSMarkus Armbruster#
52314b48aaaSJohn Snow# .. qmp-example::
52448685a8eSMarkus Armbruster#
52548685a8eSMarkus Armbruster#     -> { "execute": "migrate-set-capabilities" , "arguments":
52648685a8eSMarkus Armbruster#          { "capabilities": [ { "capability": "xbzrle", "state": true } ] } }
52737fa48a4SMarkus Armbruster#     <- { "return": {} }
52848685a8eSMarkus Armbruster##
52948685a8eSMarkus Armbruster{ 'command': 'migrate-set-capabilities',
53048685a8eSMarkus Armbruster  'data': { 'capabilities': ['MigrationCapabilityStatus'] } }
53148685a8eSMarkus Armbruster
53248685a8eSMarkus Armbruster##
53348685a8eSMarkus Armbruster# @query-migrate-capabilities:
53448685a8eSMarkus Armbruster#
53548685a8eSMarkus Armbruster# Returns information about the current migration capabilities status
53648685a8eSMarkus Armbruster#
537d93ed1bdSMarkus Armbruster# Returns: @MigrationCapabilityStatus
53848685a8eSMarkus Armbruster#
53948685a8eSMarkus Armbruster# Since: 1.2
54048685a8eSMarkus Armbruster#
54114b48aaaSJohn Snow# .. qmp-example::
54248685a8eSMarkus Armbruster#
54348685a8eSMarkus Armbruster#     -> { "execute": "query-migrate-capabilities" }
54448685a8eSMarkus Armbruster#     <- { "return": [
54548685a8eSMarkus Armbruster#           {"state": false, "capability": "xbzrle"},
54648685a8eSMarkus Armbruster#           {"state": false, "capability": "rdma-pin-all"},
54748685a8eSMarkus Armbruster#           {"state": false, "capability": "auto-converge"},
54848685a8eSMarkus Armbruster#           {"state": false, "capability": "zero-blocks"},
54948685a8eSMarkus Armbruster#           {"state": true, "capability": "events"},
55048685a8eSMarkus Armbruster#           {"state": false, "capability": "postcopy-ram"},
55148685a8eSMarkus Armbruster#           {"state": false, "capability": "x-colo"}
55248685a8eSMarkus Armbruster#        ]}
55348685a8eSMarkus Armbruster##
55448685a8eSMarkus Armbruster{ 'command': 'query-migrate-capabilities', 'returns':   ['MigrationCapabilityStatus']}
55548685a8eSMarkus Armbruster
55648685a8eSMarkus Armbruster##
55796eef042SJuan Quintela# @MultiFDCompression:
55896eef042SJuan Quintela#
55996eef042SJuan Quintela# An enumeration of multifd compression methods.
56096eef042SJuan Quintela#
56196eef042SJuan Quintela# @none: no compression.
562a937b6aaSMarkus Armbruster#
5637ec2c2b3SJuan Quintela# @zlib: use zlib compression method.
564a937b6aaSMarkus Armbruster#
56587dc6f5fSJuan Quintela# @zstd: use zstd compression method.
56696eef042SJuan Quintela#
56780484f94SBryan Zhang# @qatzip: use qatzip compression method.  (Since 9.2)
56880484f94SBryan Zhang#
569354cac28SYuan Liu# @qpl: use qpl compression method.  Query Processing Library(qpl) is
570354cac28SYuan Liu#     based on the deflate compression algorithm and use the Intel
57101bed0ffSMarkus Armbruster#     In-Memory Analytics Accelerator(IAA) accelerated compression and
57201bed0ffSMarkus Armbruster#     decompression.  (Since 9.1)
573354cac28SYuan Liu#
574f3d8bb75SShameer Kolothum# @uadk: use UADK library compression method.  (Since 9.1)
575f3d8bb75SShameer Kolothum#
57696eef042SJuan Quintela# Since: 5.0
57796eef042SJuan Quintela##
57896eef042SJuan Quintela{ 'enum': 'MultiFDCompression',
5797b29353fSMarkus Armbruster  'prefix': 'MULTIFD_COMPRESSION',
58087dc6f5fSJuan Quintela  'data': [ 'none', 'zlib',
581354cac28SYuan Liu            { 'name': 'zstd', 'if': 'CONFIG_ZSTD' },
58280484f94SBryan Zhang            { 'name': 'qatzip', 'if': 'CONFIG_QATZIP'},
583f3d8bb75SShameer Kolothum            { 'name': 'qpl', 'if': 'CONFIG_QPL' },
584f3d8bb75SShameer Kolothum            { 'name': 'uadk', 'if': 'CONFIG_UADK' } ] }
58596eef042SJuan Quintela
58696eef042SJuan Quintela##
587eea1e5c9SSteve Sistare# @MigMode:
588eea1e5c9SSteve Sistare#
589eea1e5c9SSteve Sistare# @normal: the original form of migration.  (since 8.2)
590eea1e5c9SSteve Sistare#
591209e64d9SMarkus Armbruster# @cpr-reboot: The migrate command stops the VM and saves state to the
592209e64d9SMarkus Armbruster#     URI.  After quitting QEMU, the user resumes by running QEMU
593209e64d9SMarkus Armbruster#     -incoming.
594ce5db1cbSSteve Sistare#
59587a28487SSteve Sistare#     This mode allows the user to quit QEMU, optionally update and
59687a28487SSteve Sistare#     reboot the OS, and restart QEMU.  If the user reboots, the URI
59787a28487SSteve Sistare#     must persist across the reboot, such as by using a file.
598ce5db1cbSSteve Sistare#
59987a28487SSteve Sistare#     Unlike normal mode, the use of certain local storage options
60087a28487SSteve Sistare#     does not block the migration, but the user must not modify the
60187a28487SSteve Sistare#     contents of guest block devices between the quit and restart.
602ce5db1cbSSteve Sistare#
603209e64d9SMarkus Armbruster#     This mode supports VFIO devices provided the user first puts the
604209e64d9SMarkus Armbruster#     guest in the suspended runstate, such as by issuing
60587a28487SSteve Sistare#     guest-suspend-ram to the QEMU guest agent.
606ce5db1cbSSteve Sistare#
60787a28487SSteve Sistare#     Best performance is achieved when the memory backend is shared
60887a28487SSteve Sistare#     and the @x-ignore-shared migration capability is set, but this
60987a28487SSteve Sistare#     is not required.  Further, if the user reboots before restarting
61087a28487SSteve Sistare#     such a configuration, the shared memory must persist across the
61187a28487SSteve Sistare#     reboot, such as by backing it with a dax device.
612ce5db1cbSSteve Sistare#
61387a28487SSteve Sistare#     @cpr-reboot may not be used with postcopy, background-snapshot,
61487a28487SSteve Sistare#     or COLO.
615cbdafc1bSSteve Sistare#
616a87e6451SSteve Sistare#     (since 8.2)
617eea1e5c9SSteve Sistare##
618eea1e5c9SSteve Sistare{ 'enum': 'MigMode',
619a87e6451SSteve Sistare  'data': [ 'normal', 'cpr-reboot' ] }
620eea1e5c9SSteve Sistare
621eea1e5c9SSteve Sistare##
6225fdbb1dfSHao Xiang# @ZeroPageDetection:
6235fdbb1dfSHao Xiang#
6245fdbb1dfSHao Xiang# @none: Do not perform zero page checking.
6255fdbb1dfSHao Xiang#
6265fdbb1dfSHao Xiang# @legacy: Perform zero page checking in main migration thread.
6275fdbb1dfSHao Xiang#
628303e6f54SHao Xiang# @multifd: Perform zero page checking in multifd sender thread if
629209e64d9SMarkus Armbruster#     multifd migration is enabled, else in the main migration thread
630209e64d9SMarkus Armbruster#     as for @legacy.
631303e6f54SHao Xiang#
6325fdbb1dfSHao Xiang# Since: 9.0
6335fdbb1dfSHao Xiang##
6345fdbb1dfSHao Xiang{ 'enum': 'ZeroPageDetection',
635303e6f54SHao Xiang  'data': [ 'none', 'legacy', 'multifd' ] }
6365fdbb1dfSHao Xiang
6375fdbb1dfSHao Xiang##
6386e9f21a2SPeter Krempa# @BitmapMigrationBitmapAliasTransform:
6396e9f21a2SPeter Krempa#
640a937b6aaSMarkus Armbruster# @persistent: If present, the bitmap will be made persistent or
641a937b6aaSMarkus Armbruster#     transient depending on this parameter.
6426e9f21a2SPeter Krempa#
6436e9f21a2SPeter Krempa# Since: 6.0
6446e9f21a2SPeter Krempa##
6456e9f21a2SPeter Krempa{ 'struct': 'BitmapMigrationBitmapAliasTransform',
6466e9f21a2SPeter Krempa  'data': {
6476e9f21a2SPeter Krempa      '*persistent': 'bool'
6486e9f21a2SPeter Krempa  } }
6496e9f21a2SPeter Krempa
6506e9f21a2SPeter Krempa##
65131e4c354SMax Reitz# @BitmapMigrationBitmapAlias:
65231e4c354SMax Reitz#
65331e4c354SMax Reitz# @name: The name of the bitmap.
65431e4c354SMax Reitz#
65531e4c354SMax Reitz# @alias: An alias name for migration (for example the bitmap name on
65631e4c354SMax Reitz#     the opposite site).
65731e4c354SMax Reitz#
658a937b6aaSMarkus Armbruster# @transform: Allows the modification of the migrated bitmap.  (since
659a937b6aaSMarkus Armbruster#     6.0)
6606e9f21a2SPeter Krempa#
66131e4c354SMax Reitz# Since: 5.2
66231e4c354SMax Reitz##
66331e4c354SMax Reitz{ 'struct': 'BitmapMigrationBitmapAlias',
66431e4c354SMax Reitz  'data': {
66531e4c354SMax Reitz      'name': 'str',
6666e9f21a2SPeter Krempa      'alias': 'str',
6676e9f21a2SPeter Krempa      '*transform': 'BitmapMigrationBitmapAliasTransform'
66831e4c354SMax Reitz  } }
66931e4c354SMax Reitz
67031e4c354SMax Reitz##
67131e4c354SMax Reitz# @BitmapMigrationNodeAlias:
67231e4c354SMax Reitz#
67331e4c354SMax Reitz# Maps a block node name and the bitmaps it has to aliases for dirty
67431e4c354SMax Reitz# bitmap migration.
67531e4c354SMax Reitz#
67631e4c354SMax Reitz# @node-name: A block node name.
67731e4c354SMax Reitz#
678a937b6aaSMarkus Armbruster# @alias: An alias block node name for migration (for example the node
679a937b6aaSMarkus Armbruster#     name on the opposite site).
68031e4c354SMax Reitz#
68131e4c354SMax Reitz# @bitmaps: Mappings for the bitmaps on this node.
68231e4c354SMax Reitz#
68331e4c354SMax Reitz# Since: 5.2
68431e4c354SMax Reitz##
68531e4c354SMax Reitz{ 'struct': 'BitmapMigrationNodeAlias',
68631e4c354SMax Reitz  'data': {
68731e4c354SMax Reitz      'node-name': 'str',
68831e4c354SMax Reitz      'alias': 'str',
68931e4c354SMax Reitz      'bitmaps': [ 'BitmapMigrationBitmapAlias' ]
69031e4c354SMax Reitz  } }
69131e4c354SMax Reitz
69231e4c354SMax Reitz##
69348685a8eSMarkus Armbruster# @MigrationParameter:
69448685a8eSMarkus Armbruster#
69548685a8eSMarkus Armbruster# Migration parameters enumeration
69648685a8eSMarkus Armbruster#
697a937b6aaSMarkus Armbruster# @announce-initial: Initial delay (in milliseconds) before sending
698a937b6aaSMarkus Armbruster#     the first announce (Since 4.0)
699ee3d96baSDr. David Alan Gilbert#
700a937b6aaSMarkus Armbruster# @announce-max: Maximum delay (in milliseconds) between packets in
701a937b6aaSMarkus Armbruster#     the announcement (Since 4.0)
702ee3d96baSDr. David Alan Gilbert#
703a937b6aaSMarkus Armbruster# @announce-rounds: Number of self-announce packets sent after
704a937b6aaSMarkus Armbruster#     migration (Since 4.0)
705ee3d96baSDr. David Alan Gilbert#
706a937b6aaSMarkus Armbruster# @announce-step: Increase in delay (in milliseconds) between
707a937b6aaSMarkus Armbruster#     subsequent packets in the announcement (Since 4.0)
708ee3d96baSDr. David Alan Gilbert#
709a937b6aaSMarkus Armbruster# @throttle-trigger-threshold: The ratio of bytes_dirty_period and
710a937b6aaSMarkus Armbruster#     bytes_xfer_period to trigger throttling.  It is expressed as
711a937b6aaSMarkus Armbruster#     percentage.  The default value is 50.  (Since 5.0)
712dc14a470SKeqian Zhu#
713a937b6aaSMarkus Armbruster# @cpu-throttle-initial: Initial percentage of time guest cpus are
714a937b6aaSMarkus Armbruster#     throttled when migration auto-converge is activated.  The
71548685a8eSMarkus Armbruster#     default value is 20.  (Since 2.7)
71648685a8eSMarkus Armbruster#
71748685a8eSMarkus Armbruster# @cpu-throttle-increment: throttle percentage increase each time
718a937b6aaSMarkus Armbruster#     auto-converge detects that migration is not making progress.
719a937b6aaSMarkus Armbruster#     The default value is 10.  (Since 2.7)
72048685a8eSMarkus Armbruster#
721a937b6aaSMarkus Armbruster# @cpu-throttle-tailslow: Make CPU throttling slower at tail stage At
722a937b6aaSMarkus Armbruster#     the tail stage of throttling, the Guest is very sensitive to CPU
723a937b6aaSMarkus Armbruster#     percentage while the @cpu-throttle -increment is excessive
724a937b6aaSMarkus Armbruster#     usually at tail stage.  If this parameter is true, we will
725a937b6aaSMarkus Armbruster#     compute the ideal CPU percentage used by the Guest, which may
726a937b6aaSMarkus Armbruster#     exactly make the dirty rate match the dirty rate threshold.
727a937b6aaSMarkus Armbruster#     Then we will choose a smaller throttle increment between the one
728a937b6aaSMarkus Armbruster#     specified by @cpu-throttle-increment and the one generated by
729a937b6aaSMarkus Armbruster#     ideal CPU percentage.  Therefore, it is compatible to
730a937b6aaSMarkus Armbruster#     traditional throttling, meanwhile the throttle increment won't
731a937b6aaSMarkus Armbruster#     be excessive at tail stage.  The default value is false.  (Since
732a937b6aaSMarkus Armbruster#     5.1)
733cbbf8182SKeqian Zhu#
734a937b6aaSMarkus Armbruster# @tls-creds: ID of the 'tls-creds' object that provides credentials
735a937b6aaSMarkus Armbruster#     for establishing a TLS connection over the migration data
736a937b6aaSMarkus Armbruster#     channel.  On the outgoing side of the migration, the credentials
737a937b6aaSMarkus Armbruster#     must be for a 'client' endpoint, while for the incoming side the
738e8c5503aSMarkus Armbruster#     credentials must be for a 'server' endpoint.  Setting this to a
739e8c5503aSMarkus Armbruster#     non-empty string enables TLS for all migrations.  An empty
740e8c5503aSMarkus Armbruster#     string means that QEMU will use plain text mode for migration,
741e8c5503aSMarkus Armbruster#     rather than TLS.  (Since 2.7)
74248685a8eSMarkus Armbruster#
743e8c5503aSMarkus Armbruster# @tls-hostname: migration target's hostname for validating the
744e8c5503aSMarkus Armbruster#     server's x509 certificate identity.  If empty, QEMU will use the
745e8c5503aSMarkus Armbruster#     hostname from the migration URI, if any.  A non-empty value is
746e8c5503aSMarkus Armbruster#     required when using x509 based TLS credentials and the migration
747e8c5503aSMarkus Armbruster#     URI does not include a hostname, such as fd: or exec: based
748e8c5503aSMarkus Armbruster#     migration.  (Since 2.7)
749e8c5503aSMarkus Armbruster#
750e8c5503aSMarkus Armbruster#     Note: empty value works only since 2.9.
75148685a8eSMarkus Armbruster#
752a937b6aaSMarkus Armbruster# @tls-authz: ID of the 'authz' object subclass that provides access
753a937b6aaSMarkus Armbruster#     control checking of the TLS x509 certificate distinguished name.
754d2f1d29bSDaniel P. Berrange#     This object is only resolved at time of use, so can be deleted
755d2f1d29bSDaniel P. Berrange#     and recreated on the fly while the migration server is active.
756d2f1d29bSDaniel P. Berrange#     If missing, it will default to denying access (Since 4.0)
757d2f1d29bSDaniel P. Berrange#
75873c67f38SMarkus Armbruster# @max-bandwidth: maximum speed for migration, in bytes per second.
75973c67f38SMarkus Armbruster#     (Since 2.8)
76048685a8eSMarkus Armbruster#
7618b239597SPeter Xu# @avail-switchover-bandwidth: to set the available bandwidth that
7628b239597SPeter Xu#     migration can use during switchover phase.  NOTE!  This does not
763209e64d9SMarkus Armbruster#     limit the bandwidth during switchover, but only for calculations
764209e64d9SMarkus Armbruster#     when making decisions to switchover.  By default, this value is
765209e64d9SMarkus Armbruster#     zero, which means QEMU will estimate the bandwidth
766209e64d9SMarkus Armbruster#     automatically.  This can be set when the estimated value is not
767209e64d9SMarkus Armbruster#     accurate, while the user is able to guarantee such bandwidth is
768209e64d9SMarkus Armbruster#     available when switching over.  When specified correctly, this
769209e64d9SMarkus Armbruster#     can make the switchover decision much more accurate.
770209e64d9SMarkus Armbruster#     (Since 8.2)
7718b239597SPeter Xu#
772a937b6aaSMarkus Armbruster# @downtime-limit: set maximum tolerated downtime for migration.
773a937b6aaSMarkus Armbruster#     maximum downtime in milliseconds (Since 2.8)
77448685a8eSMarkus Armbruster#
775a937b6aaSMarkus Armbruster# @x-checkpoint-delay: The delay time (in ms) between two COLO
776a937b6aaSMarkus Armbruster#     checkpoints in periodic mode.  (Since 2.8)
77748685a8eSMarkus Armbruster#
778cbfd6c95SJuan Quintela# @multifd-channels: Number of channels used to migrate data in
779a937b6aaSMarkus Armbruster#     parallel.  This is the same number that the number of sockets
780a937b6aaSMarkus Armbruster#     used for migration.  The default value is 2 (since 4.0)
7814075fb1cSJuan Quintela#
78273af8dd8SJuan Quintela# @xbzrle-cache-size: cache size to be used by XBZRLE migration.  It
783a937b6aaSMarkus Armbruster#     needs to be a multiple of the target page size and a power of 2
78473af8dd8SJuan Quintela#     (Since 2.11)
78573af8dd8SJuan Quintela#
786a937b6aaSMarkus Armbruster# @max-postcopy-bandwidth: Background transfer bandwidth during
787a937b6aaSMarkus Armbruster#     postcopy.  Defaults to 0 (unlimited).  In bytes per second.
7887e555c6cSDr. David Alan Gilbert#     (Since 3.0)
7894cbc9c7fSLi Qiang#
790a937b6aaSMarkus Armbruster# @max-cpu-throttle: maximum cpu throttle percentage.  Defaults to 99.
791a937b6aaSMarkus Armbruster#     (Since 3.1)
792ee3d96baSDr. David Alan Gilbert#
793a937b6aaSMarkus Armbruster# @multifd-compression: Which compression method to use.  Defaults to
794a937b6aaSMarkus Armbruster#     none.  (Since 5.0)
79596eef042SJuan Quintela#
7969004db48SJuan Quintela# @multifd-zlib-level: Set the compression level to be used in live
797a937b6aaSMarkus Armbruster#     migration, the compression level is an integer between 0 and 9,
798a937b6aaSMarkus Armbruster#     where 0 means no compression, 1 means the best compression
799a937b6aaSMarkus Armbruster#     speed, and 9 means best compression ratio which will consume
800a937b6aaSMarkus Armbruster#     more CPU.  Defaults to 1.  (Since 5.0)
8019004db48SJuan Quintela#
80286c6eb1fSBryan Zhang# @multifd-qatzip-level: Set the compression level to be used in live
80386c6eb1fSBryan Zhang#     migration. The level is an integer between 1 and 9, where 1 means
80486c6eb1fSBryan Zhang#     the best compression speed, and 9 means the best compression
80586c6eb1fSBryan Zhang#     ratio which will consume more CPU. Defaults to 1.  (Since 9.2)
80686c6eb1fSBryan Zhang#
8076a9ad154SJuan Quintela# @multifd-zstd-level: Set the compression level to be used in live
808a937b6aaSMarkus Armbruster#     migration, the compression level is an integer between 0 and 20,
809a937b6aaSMarkus Armbruster#     where 0 means no compression, 1 means the best compression
810a937b6aaSMarkus Armbruster#     speed, and 20 means best compression ratio which will consume
811a937b6aaSMarkus Armbruster#     more CPU.  Defaults to 1.  (Since 5.0)
812abb6295bSLeonardo Bras#
81331e4c354SMax Reitz# @block-bitmap-mapping: Maps block nodes and bitmaps on them to
814a937b6aaSMarkus Armbruster#     aliases for the purpose of dirty bitmap migration.  Such aliases
815a937b6aaSMarkus Armbruster#     may for example be the corresponding names on the opposite site.
816a937b6aaSMarkus Armbruster#     The mapping must be one-to-one, but not necessarily complete: On
817a937b6aaSMarkus Armbruster#     the source, unmapped bitmaps and all bitmaps on unmapped nodes
818a937b6aaSMarkus Armbruster#     will be ignored.  On the destination, encountering an unmapped
819a937b6aaSMarkus Armbruster#     alias in the incoming migration stream will result in a report,
820a937b6aaSMarkus Armbruster#     and all further bitmap migration data will then be discarded.
821a937b6aaSMarkus Armbruster#     Note that the destination does not know about bitmaps it does
822a937b6aaSMarkus Armbruster#     not receive, so there is no limitation or requirement regarding
823a937b6aaSMarkus Armbruster#     the number of bitmaps received, or how they are named, or on
824a937b6aaSMarkus Armbruster#     which nodes they are placed.  By default (when this parameter
825a937b6aaSMarkus Armbruster#     has never been set), bitmap names are mapped to themselves.
826a937b6aaSMarkus Armbruster#     Nodes are mapped to their block device name if there is one, and
827a937b6aaSMarkus Armbruster#     to their node name otherwise.  (Since 5.2)
82831e4c354SMax Reitz#
8298abc8115SHyman Huang(黄勇)# @x-vcpu-dirty-limit-period: Periodic time (in milliseconds) of dirty
830209e64d9SMarkus Armbruster#     limit during live migration.  Should be in the range 1 to
831209e64d9SMarkus Armbruster#     1000ms.  Defaults to 1000ms.  (Since 8.1)
8324d807857SHyman Huang(黄勇)#
83309f9ec99SHyman Huang(黄勇)# @vcpu-dirty-limit: Dirtyrate limit (MB/s) during live migration.
83409f9ec99SHyman Huang(黄勇)#     Defaults to 1.  (Since 8.1)
83509f9ec99SHyman Huang(黄勇)#
836209e64d9SMarkus Armbruster# @mode: Migration mode.  See description in @MigMode.  Default is
837209e64d9SMarkus Armbruster#     'normal'.  (Since 8.2)
838eea1e5c9SSteve Sistare#
8395fdbb1dfSHao Xiang# @zero-page-detection: Whether and how to detect zero pages.
84070c25c92SHao Xiang#     See description in @ZeroPageDetection.  Default is 'multifd'.
8415fdbb1dfSHao Xiang#     (since 9.0)
8425fdbb1dfSHao Xiang#
843b43b61d5SFabiano Rosas# @direct-io: Open migration files with O_DIRECT when possible.  This
844b43b61d5SFabiano Rosas#     only has effect if the @mapped-ram capability is enabled.
845b43b61d5SFabiano Rosas#     (Since 9.1)
846b43b61d5SFabiano Rosas#
8479fb49daaSMarkus Armbruster# Features:
848a937b6aaSMarkus Armbruster#
849209e64d9SMarkus Armbruster# @unstable: Members @x-checkpoint-delay and
850209e64d9SMarkus Armbruster#     @x-vcpu-dirty-limit-period are experimental.
8519fb49daaSMarkus Armbruster#
85248685a8eSMarkus Armbruster# Since: 2.4
85348685a8eSMarkus Armbruster##
85448685a8eSMarkus Armbruster{ 'enum': 'MigrationParameter',
855ee3d96baSDr. David Alan Gilbert  'data': ['announce-initial', 'announce-max',
856ee3d96baSDr. David Alan Gilbert           'announce-rounds', 'announce-step',
857864128dfSJuan Quintela           'throttle-trigger-threshold',
85848685a8eSMarkus Armbruster           'cpu-throttle-initial', 'cpu-throttle-increment',
859cbbf8182SKeqian Zhu           'cpu-throttle-tailslow',
860d2f1d29bSDaniel P. Berrange           'tls-creds', 'tls-hostname', 'tls-authz', 'max-bandwidth',
8618b239597SPeter Xu           'avail-switchover-bandwidth', 'downtime-limit',
8629fb49daaSMarkus Armbruster           { 'name': 'x-checkpoint-delay', 'features': [ 'unstable' ] },
863cbfd6c95SJuan Quintela           'multifd-channels',
8644cbc9c7fSLi Qiang           'xbzrle-cache-size', 'max-postcopy-bandwidth',
8659004db48SJuan Quintela           'max-cpu-throttle', 'multifd-compression',
86631e4c354SMax Reitz           'multifd-zlib-level', 'multifd-zstd-level',
86786c6eb1fSBryan Zhang           'multifd-qatzip-level',
8684d807857SHyman Huang(黄勇)           'block-bitmap-mapping',
86909f9ec99SHyman Huang(黄勇)           { 'name': 'x-vcpu-dirty-limit-period', 'features': ['unstable'] },
870eea1e5c9SSteve Sistare           'vcpu-dirty-limit',
8715fdbb1dfSHao Xiang           'mode',
872b43b61d5SFabiano Rosas           'zero-page-detection',
873b43b61d5SFabiano Rosas           'direct-io'] }
87448685a8eSMarkus Armbruster
87548685a8eSMarkus Armbruster##
87648685a8eSMarkus Armbruster# @MigrateSetParameters:
87748685a8eSMarkus Armbruster#
878a937b6aaSMarkus Armbruster# @announce-initial: Initial delay (in milliseconds) before sending
879a937b6aaSMarkus Armbruster#     the first announce (Since 4.0)
880ee3d96baSDr. David Alan Gilbert#
881a937b6aaSMarkus Armbruster# @announce-max: Maximum delay (in milliseconds) between packets in
882a937b6aaSMarkus Armbruster#     the announcement (Since 4.0)
883ee3d96baSDr. David Alan Gilbert#
884a937b6aaSMarkus Armbruster# @announce-rounds: Number of self-announce packets sent after
885a937b6aaSMarkus Armbruster#     migration (Since 4.0)
886ee3d96baSDr. David Alan Gilbert#
887a937b6aaSMarkus Armbruster# @announce-step: Increase in delay (in milliseconds) between
888a937b6aaSMarkus Armbruster#     subsequent packets in the announcement (Since 4.0)
889ee3d96baSDr. David Alan Gilbert#
890a937b6aaSMarkus Armbruster# @throttle-trigger-threshold: The ratio of bytes_dirty_period and
891a937b6aaSMarkus Armbruster#     bytes_xfer_period to trigger throttling.  It is expressed as
892a937b6aaSMarkus Armbruster#     percentage.  The default value is 50.  (Since 5.0)
893dc14a470SKeqian Zhu#
89448685a8eSMarkus Armbruster# @cpu-throttle-initial: Initial percentage of time guest cpus are
895a937b6aaSMarkus Armbruster#     throttled when migration auto-converge is activated.  The
896a937b6aaSMarkus Armbruster#     default value is 20.  (Since 2.7)
89748685a8eSMarkus Armbruster#
89848685a8eSMarkus Armbruster# @cpu-throttle-increment: throttle percentage increase each time
899a937b6aaSMarkus Armbruster#     auto-converge detects that migration is not making progress.
900a937b6aaSMarkus Armbruster#     The default value is 10.  (Since 2.7)
90148685a8eSMarkus Armbruster#
902a937b6aaSMarkus Armbruster# @cpu-throttle-tailslow: Make CPU throttling slower at tail stage At
903a937b6aaSMarkus Armbruster#     the tail stage of throttling, the Guest is very sensitive to CPU
904a937b6aaSMarkus Armbruster#     percentage while the @cpu-throttle -increment is excessive
905a937b6aaSMarkus Armbruster#     usually at tail stage.  If this parameter is true, we will
906a937b6aaSMarkus Armbruster#     compute the ideal CPU percentage used by the Guest, which may
907a937b6aaSMarkus Armbruster#     exactly make the dirty rate match the dirty rate threshold.
908a937b6aaSMarkus Armbruster#     Then we will choose a smaller throttle increment between the one
909a937b6aaSMarkus Armbruster#     specified by @cpu-throttle-increment and the one generated by
910a937b6aaSMarkus Armbruster#     ideal CPU percentage.  Therefore, it is compatible to
911a937b6aaSMarkus Armbruster#     traditional throttling, meanwhile the throttle increment won't
912a937b6aaSMarkus Armbruster#     be excessive at tail stage.  The default value is false.  (Since
913a937b6aaSMarkus Armbruster#     5.1)
914cbbf8182SKeqian Zhu#
91548685a8eSMarkus Armbruster# @tls-creds: ID of the 'tls-creds' object that provides credentials
91648685a8eSMarkus Armbruster#     for establishing a TLS connection over the migration data
91748685a8eSMarkus Armbruster#     channel.  On the outgoing side of the migration, the credentials
91848685a8eSMarkus Armbruster#     must be for a 'client' endpoint, while for the incoming side the
919a937b6aaSMarkus Armbruster#     credentials must be for a 'server' endpoint.  Setting this to a
920a937b6aaSMarkus Armbruster#     non-empty string enables TLS for all migrations.  An empty
921a937b6aaSMarkus Armbruster#     string means that QEMU will use plain text mode for migration,
922e8c5503aSMarkus Armbruster#     rather than TLS.  This is the default.  (Since 2.7)
92348685a8eSMarkus Armbruster#
924e8c5503aSMarkus Armbruster# @tls-hostname: migration target's hostname for validating the
925e8c5503aSMarkus Armbruster#     server's x509 certificate identity.  If empty, QEMU will use the
926e8c5503aSMarkus Armbruster#     hostname from the migration URI, if any.  A non-empty value is
927e8c5503aSMarkus Armbruster#     required when using x509 based TLS credentials and the migration
928e8c5503aSMarkus Armbruster#     URI does not include a hostname, such as fd: or exec: based
929e8c5503aSMarkus Armbruster#     migration.  (Since 2.7)
930e8c5503aSMarkus Armbruster#
931e8c5503aSMarkus Armbruster#     Note: empty value works only since 2.9.
93248685a8eSMarkus Armbruster#
93366fcb9d6SPeter Xu# @tls-authz: ID of the 'authz' object subclass that provides access
93466fcb9d6SPeter Xu#     control checking of the TLS x509 certificate distinguished name.
935e8c5503aSMarkus Armbruster#     This object is only resolved at time of use, so can be deleted
936e8c5503aSMarkus Armbruster#     and recreated on the fly while the migration server is active.
937e8c5503aSMarkus Armbruster#     If missing, it will default to denying access (Since 4.0)
93866fcb9d6SPeter Xu#
93973c67f38SMarkus Armbruster# @max-bandwidth: maximum speed for migration, in bytes per second.
94073c67f38SMarkus Armbruster#     (Since 2.8)
94148685a8eSMarkus Armbruster#
9428b239597SPeter Xu# @avail-switchover-bandwidth: to set the available bandwidth that
9438b239597SPeter Xu#     migration can use during switchover phase.  NOTE!  This does not
944209e64d9SMarkus Armbruster#     limit the bandwidth during switchover, but only for calculations
945209e64d9SMarkus Armbruster#     when making decisions to switchover.  By default, this value is
946209e64d9SMarkus Armbruster#     zero, which means QEMU will estimate the bandwidth
947209e64d9SMarkus Armbruster#     automatically.  This can be set when the estimated value is not
948209e64d9SMarkus Armbruster#     accurate, while the user is able to guarantee such bandwidth is
949209e64d9SMarkus Armbruster#     available when switching over.  When specified correctly, this
950209e64d9SMarkus Armbruster#     can make the switchover decision much more accurate.
951209e64d9SMarkus Armbruster#     (Since 8.2)
9528b239597SPeter Xu#
953a937b6aaSMarkus Armbruster# @downtime-limit: set maximum tolerated downtime for migration.
954a937b6aaSMarkus Armbruster#     maximum downtime in milliseconds (Since 2.8)
95548685a8eSMarkus Armbruster#
9568eb0a257SMarkus Armbruster# @x-checkpoint-delay: The delay time (in ms) between two COLO
9578eb0a257SMarkus Armbruster#     checkpoints in periodic mode.  (Since 2.8)
95848685a8eSMarkus Armbruster#
959cbfd6c95SJuan Quintela# @multifd-channels: Number of channels used to migrate data in
960a937b6aaSMarkus Armbruster#     parallel.  This is the same number that the number of sockets
961a937b6aaSMarkus Armbruster#     used for migration.  The default value is 2 (since 4.0)
9624075fb1cSJuan Quintela#
96373af8dd8SJuan Quintela# @xbzrle-cache-size: cache size to be used by XBZRLE migration.  It
964a937b6aaSMarkus Armbruster#     needs to be a multiple of the target page size and a power of 2
96573af8dd8SJuan Quintela#     (Since 2.11)
9667e555c6cSDr. David Alan Gilbert#
967a937b6aaSMarkus Armbruster# @max-postcopy-bandwidth: Background transfer bandwidth during
968a937b6aaSMarkus Armbruster#     postcopy.  Defaults to 0 (unlimited).  In bytes per second.
9697e555c6cSDr. David Alan Gilbert#     (Since 3.0)
9704cbc9c7fSLi Qiang#
9718eb0a257SMarkus Armbruster# @max-cpu-throttle: maximum cpu throttle percentage.  Defaults to 99.
9728eb0a257SMarkus Armbruster#     (Since 3.1)
9734cbc9c7fSLi Qiang#
974a937b6aaSMarkus Armbruster# @multifd-compression: Which compression method to use.  Defaults to
975a937b6aaSMarkus Armbruster#     none.  (Since 5.0)
97696eef042SJuan Quintela#
9779004db48SJuan Quintela# @multifd-zlib-level: Set the compression level to be used in live
978a937b6aaSMarkus Armbruster#     migration, the compression level is an integer between 0 and 9,
979a937b6aaSMarkus Armbruster#     where 0 means no compression, 1 means the best compression
980a937b6aaSMarkus Armbruster#     speed, and 9 means best compression ratio which will consume
981a937b6aaSMarkus Armbruster#     more CPU.  Defaults to 1.  (Since 5.0)
9829004db48SJuan Quintela#
98386c6eb1fSBryan Zhang# @multifd-qatzip-level: Set the compression level to be used in live
98486c6eb1fSBryan Zhang#     migration. The level is an integer between 1 and 9, where 1 means
98586c6eb1fSBryan Zhang#     the best compression speed, and 9 means the best compression
98686c6eb1fSBryan Zhang#     ratio which will consume more CPU. Defaults to 1.  (Since 9.2)
98786c6eb1fSBryan Zhang#
9886a9ad154SJuan Quintela# @multifd-zstd-level: Set the compression level to be used in live
989a937b6aaSMarkus Armbruster#     migration, the compression level is an integer between 0 and 20,
990a937b6aaSMarkus Armbruster#     where 0 means no compression, 1 means the best compression
991a937b6aaSMarkus Armbruster#     speed, and 20 means best compression ratio which will consume
992a937b6aaSMarkus Armbruster#     more CPU.  Defaults to 1.  (Since 5.0)
9936a9ad154SJuan Quintela#
99431e4c354SMax Reitz# @block-bitmap-mapping: Maps block nodes and bitmaps on them to
995a937b6aaSMarkus Armbruster#     aliases for the purpose of dirty bitmap migration.  Such aliases
996a937b6aaSMarkus Armbruster#     may for example be the corresponding names on the opposite site.
997a937b6aaSMarkus Armbruster#     The mapping must be one-to-one, but not necessarily complete: On
998a937b6aaSMarkus Armbruster#     the source, unmapped bitmaps and all bitmaps on unmapped nodes
999a937b6aaSMarkus Armbruster#     will be ignored.  On the destination, encountering an unmapped
1000a937b6aaSMarkus Armbruster#     alias in the incoming migration stream will result in a report,
1001a937b6aaSMarkus Armbruster#     and all further bitmap migration data will then be discarded.
1002a937b6aaSMarkus Armbruster#     Note that the destination does not know about bitmaps it does
1003a937b6aaSMarkus Armbruster#     not receive, so there is no limitation or requirement regarding
1004a937b6aaSMarkus Armbruster#     the number of bitmaps received, or how they are named, or on
1005a937b6aaSMarkus Armbruster#     which nodes they are placed.  By default (when this parameter
1006a937b6aaSMarkus Armbruster#     has never been set), bitmap names are mapped to themselves.
1007a937b6aaSMarkus Armbruster#     Nodes are mapped to their block device name if there is one, and
1008a937b6aaSMarkus Armbruster#     to their node name otherwise.  (Since 5.2)
100931e4c354SMax Reitz#
10108abc8115SHyman Huang(黄勇)# @x-vcpu-dirty-limit-period: Periodic time (in milliseconds) of dirty
1011209e64d9SMarkus Armbruster#     limit during live migration.  Should be in the range 1 to
1012209e64d9SMarkus Armbruster#     1000ms.  Defaults to 1000ms.  (Since 8.1)
10134d807857SHyman Huang(黄勇)#
101409f9ec99SHyman Huang(黄勇)# @vcpu-dirty-limit: Dirtyrate limit (MB/s) during live migration.
101509f9ec99SHyman Huang(黄勇)#     Defaults to 1.  (Since 8.1)
101609f9ec99SHyman Huang(黄勇)#
1017209e64d9SMarkus Armbruster# @mode: Migration mode.  See description in @MigMode.  Default is
1018209e64d9SMarkus Armbruster#     'normal'.  (Since 8.2)
1019eea1e5c9SSteve Sistare#
10205fdbb1dfSHao Xiang# @zero-page-detection: Whether and how to detect zero pages.
102170c25c92SHao Xiang#     See description in @ZeroPageDetection.  Default is 'multifd'.
10225fdbb1dfSHao Xiang#     (since 9.0)
10235fdbb1dfSHao Xiang#
1024b43b61d5SFabiano Rosas# @direct-io: Open migration files with O_DIRECT when possible.  This
1025b43b61d5SFabiano Rosas#     only has effect if the @mapped-ram capability is enabled.
1026b43b61d5SFabiano Rosas#     (Since 9.1)
1027b43b61d5SFabiano Rosas#
10289fb49daaSMarkus Armbruster# Features:
1029a937b6aaSMarkus Armbruster#
1030209e64d9SMarkus Armbruster# @unstable: Members @x-checkpoint-delay and
1031209e64d9SMarkus Armbruster#     @x-vcpu-dirty-limit-period are experimental.
10329fb49daaSMarkus Armbruster#
103356266c6dSMarkus Armbruster# TODO: either fuse back into MigrationParameters, or make
103456266c6dSMarkus Armbruster#     MigrationParameters members mandatory
103556266c6dSMarkus Armbruster#
103648685a8eSMarkus Armbruster# Since: 2.4
103748685a8eSMarkus Armbruster##
103848685a8eSMarkus Armbruster{ 'struct': 'MigrateSetParameters',
1039ee3d96baSDr. David Alan Gilbert  'data': { '*announce-initial': 'size',
1040ee3d96baSDr. David Alan Gilbert            '*announce-max': 'size',
1041ee3d96baSDr. David Alan Gilbert            '*announce-rounds': 'size',
1042ee3d96baSDr. David Alan Gilbert            '*announce-step': 'size',
1043ec17de0aSMarkus Armbruster            '*throttle-trigger-threshold': 'uint8',
1044ec17de0aSMarkus Armbruster            '*cpu-throttle-initial': 'uint8',
1045ec17de0aSMarkus Armbruster            '*cpu-throttle-increment': 'uint8',
1046cbbf8182SKeqian Zhu            '*cpu-throttle-tailslow': 'bool',
104748685a8eSMarkus Armbruster            '*tls-creds': 'StrOrNull',
104848685a8eSMarkus Armbruster            '*tls-hostname': 'StrOrNull',
1049d2f1d29bSDaniel P. Berrange            '*tls-authz': 'StrOrNull',
1050ec17de0aSMarkus Armbruster            '*max-bandwidth': 'size',
10518b239597SPeter Xu            '*avail-switchover-bandwidth': 'size',
1052ec17de0aSMarkus Armbruster            '*downtime-limit': 'uint64',
10539fb49daaSMarkus Armbruster            '*x-checkpoint-delay': { 'type': 'uint32',
10549fb49daaSMarkus Armbruster                                     'features': [ 'unstable' ] },
1055ec17de0aSMarkus Armbruster            '*multifd-channels': 'uint8',
10567e555c6cSDr. David Alan Gilbert            '*xbzrle-cache-size': 'size',
10574cbc9c7fSLi Qiang            '*max-postcopy-bandwidth': 'size',
1058ec17de0aSMarkus Armbruster            '*max-cpu-throttle': 'uint8',
10599004db48SJuan Quintela            '*multifd-compression': 'MultiFDCompression',
1060ec17de0aSMarkus Armbruster            '*multifd-zlib-level': 'uint8',
106186c6eb1fSBryan Zhang            '*multifd-qatzip-level': 'uint8',
1062ec17de0aSMarkus Armbruster            '*multifd-zstd-level': 'uint8',
10634d807857SHyman Huang(黄勇)            '*block-bitmap-mapping': [ 'BitmapMigrationNodeAlias' ],
10644d807857SHyman Huang(黄勇)            '*x-vcpu-dirty-limit-period': { 'type': 'uint64',
106509f9ec99SHyman Huang(黄勇)                                            'features': [ 'unstable' ] },
1066eea1e5c9SSteve Sistare            '*vcpu-dirty-limit': 'uint64',
10675fdbb1dfSHao Xiang            '*mode': 'MigMode',
1068b43b61d5SFabiano Rosas            '*zero-page-detection': 'ZeroPageDetection',
1069b43b61d5SFabiano Rosas            '*direct-io': 'bool' } }
107048685a8eSMarkus Armbruster
107148685a8eSMarkus Armbruster##
107248685a8eSMarkus Armbruster# @migrate-set-parameters:
107348685a8eSMarkus Armbruster#
107448685a8eSMarkus Armbruster# Set various migration parameters.
107548685a8eSMarkus Armbruster#
107648685a8eSMarkus Armbruster# Since: 2.4
107748685a8eSMarkus Armbruster#
107814b48aaaSJohn Snow# .. qmp-example::
107948685a8eSMarkus Armbruster#
108048685a8eSMarkus Armbruster#     -> { "execute": "migrate-set-parameters" ,
1081864128dfSJuan Quintela#          "arguments": { "multifd-channels": 5 } }
108237fa48a4SMarkus Armbruster#     <- { "return": {} }
108348685a8eSMarkus Armbruster##
108448685a8eSMarkus Armbruster{ 'command': 'migrate-set-parameters', 'boxed': true,
108548685a8eSMarkus Armbruster  'data': 'MigrateSetParameters' }
108648685a8eSMarkus Armbruster
108748685a8eSMarkus Armbruster##
108848685a8eSMarkus Armbruster# @MigrationParameters:
108948685a8eSMarkus Armbruster#
109048685a8eSMarkus Armbruster# The optional members aren't actually optional.
109148685a8eSMarkus Armbruster#
1092a937b6aaSMarkus Armbruster# @announce-initial: Initial delay (in milliseconds) before sending
1093a937b6aaSMarkus Armbruster#     the first announce (Since 4.0)
1094ee3d96baSDr. David Alan Gilbert#
1095a937b6aaSMarkus Armbruster# @announce-max: Maximum delay (in milliseconds) between packets in
1096a937b6aaSMarkus Armbruster#     the announcement (Since 4.0)
1097ee3d96baSDr. David Alan Gilbert#
1098a937b6aaSMarkus Armbruster# @announce-rounds: Number of self-announce packets sent after
1099a937b6aaSMarkus Armbruster#     migration (Since 4.0)
1100ee3d96baSDr. David Alan Gilbert#
1101a937b6aaSMarkus Armbruster# @announce-step: Increase in delay (in milliseconds) between
1102a937b6aaSMarkus Armbruster#     subsequent packets in the announcement (Since 4.0)
1103ee3d96baSDr. David Alan Gilbert#
1104a937b6aaSMarkus Armbruster# @throttle-trigger-threshold: The ratio of bytes_dirty_period and
1105a937b6aaSMarkus Armbruster#     bytes_xfer_period to trigger throttling.  It is expressed as
1106a937b6aaSMarkus Armbruster#     percentage.  The default value is 50.  (Since 5.0)
1107dc14a470SKeqian Zhu#
110848685a8eSMarkus Armbruster# @cpu-throttle-initial: Initial percentage of time guest cpus are
1109a937b6aaSMarkus Armbruster#     throttled when migration auto-converge is activated.  (Since
1110a937b6aaSMarkus Armbruster#     2.7)
111148685a8eSMarkus Armbruster#
111248685a8eSMarkus Armbruster# @cpu-throttle-increment: throttle percentage increase each time
1113a937b6aaSMarkus Armbruster#     auto-converge detects that migration is not making progress.
1114a937b6aaSMarkus Armbruster#     (Since 2.7)
111548685a8eSMarkus Armbruster#
1116a937b6aaSMarkus Armbruster# @cpu-throttle-tailslow: Make CPU throttling slower at tail stage At
1117a937b6aaSMarkus Armbruster#     the tail stage of throttling, the Guest is very sensitive to CPU
1118a937b6aaSMarkus Armbruster#     percentage while the @cpu-throttle -increment is excessive
1119a937b6aaSMarkus Armbruster#     usually at tail stage.  If this parameter is true, we will
1120a937b6aaSMarkus Armbruster#     compute the ideal CPU percentage used by the Guest, which may
1121a937b6aaSMarkus Armbruster#     exactly make the dirty rate match the dirty rate threshold.
1122a937b6aaSMarkus Armbruster#     Then we will choose a smaller throttle increment between the one
1123a937b6aaSMarkus Armbruster#     specified by @cpu-throttle-increment and the one generated by
1124a937b6aaSMarkus Armbruster#     ideal CPU percentage.  Therefore, it is compatible to
1125a937b6aaSMarkus Armbruster#     traditional throttling, meanwhile the throttle increment won't
1126a937b6aaSMarkus Armbruster#     be excessive at tail stage.  The default value is false.  (Since
1127a937b6aaSMarkus Armbruster#     5.1)
1128cbbf8182SKeqian Zhu#
112948685a8eSMarkus Armbruster# @tls-creds: ID of the 'tls-creds' object that provides credentials
113048685a8eSMarkus Armbruster#     for establishing a TLS connection over the migration data
113148685a8eSMarkus Armbruster#     channel.  On the outgoing side of the migration, the credentials
113248685a8eSMarkus Armbruster#     must be for a 'client' endpoint, while for the incoming side the
1133a937b6aaSMarkus Armbruster#     credentials must be for a 'server' endpoint.  An empty string
1134a937b6aaSMarkus Armbruster#     means that QEMU will use plain text mode for migration, rather
1135e8c5503aSMarkus Armbruster#     than TLS.  (Since 2.7)
113648685a8eSMarkus Armbruster#
1137e8c5503aSMarkus Armbruster#     Note: 2.8 omits empty @tls-creds instead.
1138e8c5503aSMarkus Armbruster#
1139e8c5503aSMarkus Armbruster# @tls-hostname: migration target's hostname for validating the
1140e8c5503aSMarkus Armbruster#     server's x509 certificate identity.  If empty, QEMU will use the
1141e8c5503aSMarkus Armbruster#     hostname from the migration URI, if any.  (Since 2.7)
1142e8c5503aSMarkus Armbruster#
1143e8c5503aSMarkus Armbruster#     Note: 2.8 omits empty @tls-hostname instead.
114448685a8eSMarkus Armbruster#
1145a937b6aaSMarkus Armbruster# @tls-authz: ID of the 'authz' object subclass that provides access
1146a937b6aaSMarkus Armbruster#     control checking of the TLS x509 certificate distinguished name.
1147a937b6aaSMarkus Armbruster#     (Since 4.0)
1148d2f1d29bSDaniel P. Berrange#
114973c67f38SMarkus Armbruster# @max-bandwidth: maximum speed for migration, in bytes per second.
115073c67f38SMarkus Armbruster#     (Since 2.8)
115148685a8eSMarkus Armbruster#
11528b239597SPeter Xu# @avail-switchover-bandwidth: to set the available bandwidth that
11538b239597SPeter Xu#     migration can use during switchover phase.  NOTE!  This does not
1154209e64d9SMarkus Armbruster#     limit the bandwidth during switchover, but only for calculations
1155209e64d9SMarkus Armbruster#     when making decisions to switchover.  By default, this value is
1156209e64d9SMarkus Armbruster#     zero, which means QEMU will estimate the bandwidth
1157209e64d9SMarkus Armbruster#     automatically.  This can be set when the estimated value is not
1158209e64d9SMarkus Armbruster#     accurate, while the user is able to guarantee such bandwidth is
1159209e64d9SMarkus Armbruster#     available when switching over.  When specified correctly, this
1160209e64d9SMarkus Armbruster#     can make the switchover decision much more accurate.
1161209e64d9SMarkus Armbruster#     (Since 8.2)
11628b239597SPeter Xu#
1163a937b6aaSMarkus Armbruster# @downtime-limit: set maximum tolerated downtime for migration.
1164a937b6aaSMarkus Armbruster#     maximum downtime in milliseconds (Since 2.8)
116548685a8eSMarkus Armbruster#
1166a937b6aaSMarkus Armbruster# @x-checkpoint-delay: the delay time between two COLO checkpoints.
1167a937b6aaSMarkus Armbruster#     (Since 2.8)
116848685a8eSMarkus Armbruster#
1169cbfd6c95SJuan Quintela# @multifd-channels: Number of channels used to migrate data in
1170a937b6aaSMarkus Armbruster#     parallel.  This is the same number that the number of sockets
1171a937b6aaSMarkus Armbruster#     used for migration.  The default value is 2 (since 4.0)
11724075fb1cSJuan Quintela#
117373af8dd8SJuan Quintela# @xbzrle-cache-size: cache size to be used by XBZRLE migration.  It
1174a937b6aaSMarkus Armbruster#     needs to be a multiple of the target page size and a power of 2
117573af8dd8SJuan Quintela#     (Since 2.11)
11767e555c6cSDr. David Alan Gilbert#
1177a937b6aaSMarkus Armbruster# @max-postcopy-bandwidth: Background transfer bandwidth during
1178a937b6aaSMarkus Armbruster#     postcopy.  Defaults to 0 (unlimited).  In bytes per second.
11797e555c6cSDr. David Alan Gilbert#     (Since 3.0)
11804cbc9c7fSLi Qiang#
1181a937b6aaSMarkus Armbruster# @max-cpu-throttle: maximum cpu throttle percentage.  Defaults to 99.
11824cbc9c7fSLi Qiang#     (Since 3.1)
11834cbc9c7fSLi Qiang#
1184a937b6aaSMarkus Armbruster# @multifd-compression: Which compression method to use.  Defaults to
1185a937b6aaSMarkus Armbruster#     none.  (Since 5.0)
118696eef042SJuan Quintela#
11879004db48SJuan Quintela# @multifd-zlib-level: Set the compression level to be used in live
1188a937b6aaSMarkus Armbruster#     migration, the compression level is an integer between 0 and 9,
1189a937b6aaSMarkus Armbruster#     where 0 means no compression, 1 means the best compression
1190a937b6aaSMarkus Armbruster#     speed, and 9 means best compression ratio which will consume
1191a937b6aaSMarkus Armbruster#     more CPU.  Defaults to 1.  (Since 5.0)
11929004db48SJuan Quintela#
119386c6eb1fSBryan Zhang# @multifd-qatzip-level: Set the compression level to be used in live
119486c6eb1fSBryan Zhang#     migration. The level is an integer between 1 and 9, where 1 means
119586c6eb1fSBryan Zhang#     the best compression speed, and 9 means the best compression
119686c6eb1fSBryan Zhang#     ratio which will consume more CPU. Defaults to 1.  (Since 9.2)
119786c6eb1fSBryan Zhang#
11986a9ad154SJuan Quintela# @multifd-zstd-level: Set the compression level to be used in live
1199a937b6aaSMarkus Armbruster#     migration, the compression level is an integer between 0 and 20,
1200a937b6aaSMarkus Armbruster#     where 0 means no compression, 1 means the best compression
1201a937b6aaSMarkus Armbruster#     speed, and 20 means best compression ratio which will consume
1202a937b6aaSMarkus Armbruster#     more CPU.  Defaults to 1.  (Since 5.0)
12036a9ad154SJuan Quintela#
120431e4c354SMax Reitz# @block-bitmap-mapping: Maps block nodes and bitmaps on them to
1205a937b6aaSMarkus Armbruster#     aliases for the purpose of dirty bitmap migration.  Such aliases
1206a937b6aaSMarkus Armbruster#     may for example be the corresponding names on the opposite site.
1207a937b6aaSMarkus Armbruster#     The mapping must be one-to-one, but not necessarily complete: On
1208a937b6aaSMarkus Armbruster#     the source, unmapped bitmaps and all bitmaps on unmapped nodes
1209a937b6aaSMarkus Armbruster#     will be ignored.  On the destination, encountering an unmapped
1210a937b6aaSMarkus Armbruster#     alias in the incoming migration stream will result in a report,
1211a937b6aaSMarkus Armbruster#     and all further bitmap migration data will then be discarded.
1212a937b6aaSMarkus Armbruster#     Note that the destination does not know about bitmaps it does
1213a937b6aaSMarkus Armbruster#     not receive, so there is no limitation or requirement regarding
1214a937b6aaSMarkus Armbruster#     the number of bitmaps received, or how they are named, or on
1215a937b6aaSMarkus Armbruster#     which nodes they are placed.  By default (when this parameter
1216a937b6aaSMarkus Armbruster#     has never been set), bitmap names are mapped to themselves.
1217a937b6aaSMarkus Armbruster#     Nodes are mapped to their block device name if there is one, and
1218a937b6aaSMarkus Armbruster#     to their node name otherwise.  (Since 5.2)
121931e4c354SMax Reitz#
12208abc8115SHyman Huang(黄勇)# @x-vcpu-dirty-limit-period: Periodic time (in milliseconds) of dirty
1221209e64d9SMarkus Armbruster#     limit during live migration.  Should be in the range 1 to
1222209e64d9SMarkus Armbruster#     1000ms.  Defaults to 1000ms.  (Since 8.1)
12234d807857SHyman Huang(黄勇)#
122409f9ec99SHyman Huang(黄勇)# @vcpu-dirty-limit: Dirtyrate limit (MB/s) during live migration.
122509f9ec99SHyman Huang(黄勇)#     Defaults to 1.  (Since 8.1)
122609f9ec99SHyman Huang(黄勇)#
1227209e64d9SMarkus Armbruster# @mode: Migration mode.  See description in @MigMode.  Default is
1228209e64d9SMarkus Armbruster#     'normal'.  (Since 8.2)
1229eea1e5c9SSteve Sistare#
12305fdbb1dfSHao Xiang# @zero-page-detection: Whether and how to detect zero pages.
123170c25c92SHao Xiang#     See description in @ZeroPageDetection.  Default is 'multifd'.
12325fdbb1dfSHao Xiang#     (since 9.0)
12335fdbb1dfSHao Xiang#
1234b43b61d5SFabiano Rosas# @direct-io: Open migration files with O_DIRECT when possible.  This
1235b43b61d5SFabiano Rosas#     only has effect if the @mapped-ram capability is enabled.
1236b43b61d5SFabiano Rosas#     (Since 9.1)
1237b43b61d5SFabiano Rosas#
12389fb49daaSMarkus Armbruster# Features:
1239a937b6aaSMarkus Armbruster#
1240209e64d9SMarkus Armbruster# @unstable: Members @x-checkpoint-delay and
1241209e64d9SMarkus Armbruster#     @x-vcpu-dirty-limit-period are experimental.
12429fb49daaSMarkus Armbruster#
124348685a8eSMarkus Armbruster# Since: 2.4
124448685a8eSMarkus Armbruster##
124548685a8eSMarkus Armbruster{ 'struct': 'MigrationParameters',
1246ee3d96baSDr. David Alan Gilbert  'data': { '*announce-initial': 'size',
1247ee3d96baSDr. David Alan Gilbert            '*announce-max': 'size',
1248ee3d96baSDr. David Alan Gilbert            '*announce-rounds': 'size',
1249ee3d96baSDr. David Alan Gilbert            '*announce-step': 'size',
1250dc14a470SKeqian Zhu            '*throttle-trigger-threshold': 'uint8',
1251741d4086SJuan Quintela            '*cpu-throttle-initial': 'uint8',
1252741d4086SJuan Quintela            '*cpu-throttle-increment': 'uint8',
1253cbbf8182SKeqian Zhu            '*cpu-throttle-tailslow': 'bool',
125448685a8eSMarkus Armbruster            '*tls-creds': 'str',
125548685a8eSMarkus Armbruster            '*tls-hostname': 'str',
1256d2f1d29bSDaniel P. Berrange            '*tls-authz': 'str',
1257741d4086SJuan Quintela            '*max-bandwidth': 'size',
12588b239597SPeter Xu            '*avail-switchover-bandwidth': 'size',
1259741d4086SJuan Quintela            '*downtime-limit': 'uint64',
12609fb49daaSMarkus Armbruster            '*x-checkpoint-delay': { 'type': 'uint32',
12619fb49daaSMarkus Armbruster                                     'features': [ 'unstable' ] },
1262cbfd6c95SJuan Quintela            '*multifd-channels': 'uint8',
12637e555c6cSDr. David Alan Gilbert            '*xbzrle-cache-size': 'size',
12644cbc9c7fSLi Qiang            '*max-postcopy-bandwidth': 'size',
126596eef042SJuan Quintela            '*max-cpu-throttle': 'uint8',
12669004db48SJuan Quintela            '*multifd-compression': 'MultiFDCompression',
12676a9ad154SJuan Quintela            '*multifd-zlib-level': 'uint8',
126886c6eb1fSBryan Zhang            '*multifd-qatzip-level': 'uint8',
126931e4c354SMax Reitz            '*multifd-zstd-level': 'uint8',
12704d807857SHyman Huang(黄勇)            '*block-bitmap-mapping': [ 'BitmapMigrationNodeAlias' ],
12714d807857SHyman Huang(黄勇)            '*x-vcpu-dirty-limit-period': { 'type': 'uint64',
127209f9ec99SHyman Huang(黄勇)                                            'features': [ 'unstable' ] },
1273eea1e5c9SSteve Sistare            '*vcpu-dirty-limit': 'uint64',
12745fdbb1dfSHao Xiang            '*mode': 'MigMode',
1275b43b61d5SFabiano Rosas            '*zero-page-detection': 'ZeroPageDetection',
1276b43b61d5SFabiano Rosas            '*direct-io': 'bool' } }
127748685a8eSMarkus Armbruster
127848685a8eSMarkus Armbruster##
127948685a8eSMarkus Armbruster# @query-migrate-parameters:
128048685a8eSMarkus Armbruster#
128148685a8eSMarkus Armbruster# Returns information about the current migration parameters
128248685a8eSMarkus Armbruster#
128348685a8eSMarkus Armbruster# Returns: @MigrationParameters
128448685a8eSMarkus Armbruster#
128548685a8eSMarkus Armbruster# Since: 2.4
128648685a8eSMarkus Armbruster#
128714b48aaaSJohn Snow# .. qmp-example::
128848685a8eSMarkus Armbruster#
128948685a8eSMarkus Armbruster#     -> { "execute": "query-migrate-parameters" }
129048685a8eSMarkus Armbruster#     <- { "return": {
1291864128dfSJuan Quintela#              "multifd-channels": 2,
129248685a8eSMarkus Armbruster#              "cpu-throttle-increment": 10,
129348685a8eSMarkus Armbruster#              "cpu-throttle-initial": 20,
129448685a8eSMarkus Armbruster#              "max-bandwidth": 33554432,
129548685a8eSMarkus Armbruster#              "downtime-limit": 300
129648685a8eSMarkus Armbruster#           }
129748685a8eSMarkus Armbruster#        }
129848685a8eSMarkus Armbruster##
129948685a8eSMarkus Armbruster{ 'command': 'query-migrate-parameters',
130048685a8eSMarkus Armbruster  'returns': 'MigrationParameters' }
130148685a8eSMarkus Armbruster
130248685a8eSMarkus Armbruster##
130348685a8eSMarkus Armbruster# @migrate-start-postcopy:
130448685a8eSMarkus Armbruster#
1305a937b6aaSMarkus Armbruster# Followup to a migration command to switch the migration to postcopy
1306a937b6aaSMarkus Armbruster# mode.  The postcopy-ram capability must be set on both source and
1307a937b6aaSMarkus Armbruster# destination before the original migration command.
130848685a8eSMarkus Armbruster#
130948685a8eSMarkus Armbruster# Since: 2.5
131048685a8eSMarkus Armbruster#
131114b48aaaSJohn Snow# .. qmp-example::
131248685a8eSMarkus Armbruster#
131348685a8eSMarkus Armbruster#     -> { "execute": "migrate-start-postcopy" }
131448685a8eSMarkus Armbruster#     <- { "return": {} }
131548685a8eSMarkus Armbruster##
131648685a8eSMarkus Armbruster{ 'command': 'migrate-start-postcopy' }
131748685a8eSMarkus Armbruster
131848685a8eSMarkus Armbruster##
131948685a8eSMarkus Armbruster# @MIGRATION:
132048685a8eSMarkus Armbruster#
132148685a8eSMarkus Armbruster# Emitted when a migration event happens
132248685a8eSMarkus Armbruster#
132348685a8eSMarkus Armbruster# @status: @MigrationStatus describing the current migration status.
132448685a8eSMarkus Armbruster#
132548685a8eSMarkus Armbruster# Since: 2.4
132648685a8eSMarkus Armbruster#
132714b48aaaSJohn Snow# .. qmp-example::
132848685a8eSMarkus Armbruster#
132948685a8eSMarkus Armbruster#     <- {"timestamp": {"seconds": 1432121972, "microseconds": 744001},
133048685a8eSMarkus Armbruster#         "event": "MIGRATION",
133148685a8eSMarkus Armbruster#         "data": {"status": "completed"} }
133248685a8eSMarkus Armbruster##
133348685a8eSMarkus Armbruster{ 'event': 'MIGRATION',
133448685a8eSMarkus Armbruster  'data': {'status': 'MigrationStatus'}}
133548685a8eSMarkus Armbruster
133648685a8eSMarkus Armbruster##
133748685a8eSMarkus Armbruster# @MIGRATION_PASS:
133848685a8eSMarkus Armbruster#
1339a937b6aaSMarkus Armbruster# Emitted from the source side of a migration at the start of each
1340a937b6aaSMarkus Armbruster# pass (when it syncs the dirty bitmap)
134148685a8eSMarkus Armbruster#
134248685a8eSMarkus Armbruster# @pass: An incrementing count (starting at 1 on the first pass)
134348685a8eSMarkus Armbruster#
134448685a8eSMarkus Armbruster# Since: 2.6
134548685a8eSMarkus Armbruster#
134614b48aaaSJohn Snow# .. qmp-example::
134748685a8eSMarkus Armbruster#
134837fa48a4SMarkus Armbruster#     <- { "timestamp": {"seconds": 1449669631, "microseconds": 239225},
134948685a8eSMarkus Armbruster#           "event": "MIGRATION_PASS", "data": {"pass": 2} }
135048685a8eSMarkus Armbruster##
135148685a8eSMarkus Armbruster{ 'event': 'MIGRATION_PASS',
135248685a8eSMarkus Armbruster  'data': { 'pass': 'int' } }
135348685a8eSMarkus Armbruster
135448685a8eSMarkus Armbruster##
135548685a8eSMarkus Armbruster# @COLOMessage:
135648685a8eSMarkus Armbruster#
135748685a8eSMarkus Armbruster# The message transmission between Primary side and Secondary side.
135848685a8eSMarkus Armbruster#
135948685a8eSMarkus Armbruster# @checkpoint-ready: Secondary VM (SVM) is ready for checkpointing
136048685a8eSMarkus Armbruster#
1361a937b6aaSMarkus Armbruster# @checkpoint-request: Primary VM (PVM) tells SVM to prepare for
1362a937b6aaSMarkus Armbruster#     checkpointing
136348685a8eSMarkus Armbruster#
136448685a8eSMarkus Armbruster# @checkpoint-reply: SVM gets PVM's checkpoint request
136548685a8eSMarkus Armbruster#
136648685a8eSMarkus Armbruster# @vmstate-send: VM's state will be sent by PVM.
136748685a8eSMarkus Armbruster#
136848685a8eSMarkus Armbruster# @vmstate-size: The total size of VMstate.
136948685a8eSMarkus Armbruster#
137048685a8eSMarkus Armbruster# @vmstate-received: VM's state has been received by SVM.
137148685a8eSMarkus Armbruster#
137248685a8eSMarkus Armbruster# @vmstate-loaded: VM's state has been loaded by SVM.
137348685a8eSMarkus Armbruster#
137448685a8eSMarkus Armbruster# Since: 2.8
137548685a8eSMarkus Armbruster##
137648685a8eSMarkus Armbruster{ 'enum': 'COLOMessage',
137748685a8eSMarkus Armbruster  'data': [ 'checkpoint-ready', 'checkpoint-request', 'checkpoint-reply',
137848685a8eSMarkus Armbruster            'vmstate-send', 'vmstate-size', 'vmstate-received',
137948685a8eSMarkus Armbruster            'vmstate-loaded' ] }
138048685a8eSMarkus Armbruster
138148685a8eSMarkus Armbruster##
138248685a8eSMarkus Armbruster# @COLOMode:
138348685a8eSMarkus Armbruster#
138441b6b779SZhang Chen# The COLO current mode.
138548685a8eSMarkus Armbruster#
138641b6b779SZhang Chen# @none: COLO is disabled.
138748685a8eSMarkus Armbruster#
138841b6b779SZhang Chen# @primary: COLO node in primary side.
138948685a8eSMarkus Armbruster#
139041b6b779SZhang Chen# @secondary: COLO node in slave side.
139148685a8eSMarkus Armbruster#
139248685a8eSMarkus Armbruster# Since: 2.8
139348685a8eSMarkus Armbruster##
139448685a8eSMarkus Armbruster{ 'enum': 'COLOMode',
139541b6b779SZhang Chen  'data': [ 'none', 'primary', 'secondary'] }
139648685a8eSMarkus Armbruster
139748685a8eSMarkus Armbruster##
139848685a8eSMarkus Armbruster# @FailoverStatus:
139948685a8eSMarkus Armbruster#
140048685a8eSMarkus Armbruster# An enumeration of COLO failover status
140148685a8eSMarkus Armbruster#
140248685a8eSMarkus Armbruster# @none: no failover has ever happened
140348685a8eSMarkus Armbruster#
140448685a8eSMarkus Armbruster# @require: got failover requirement but not handled
140548685a8eSMarkus Armbruster#
140648685a8eSMarkus Armbruster# @active: in the process of doing failover
140748685a8eSMarkus Armbruster#
140848685a8eSMarkus Armbruster# @completed: finish the process of failover
140948685a8eSMarkus Armbruster#
1410a937b6aaSMarkus Armbruster# @relaunch: restart the failover process, from 'none' -> 'completed'
1411a937b6aaSMarkus Armbruster#     (Since 2.9)
141248685a8eSMarkus Armbruster#
141348685a8eSMarkus Armbruster# Since: 2.8
141448685a8eSMarkus Armbruster##
141548685a8eSMarkus Armbruster{ 'enum': 'FailoverStatus',
141648685a8eSMarkus Armbruster  'data': [ 'none', 'require', 'active', 'completed', 'relaunch' ] }
141748685a8eSMarkus Armbruster
141848685a8eSMarkus Armbruster##
14199ecff6d6Szhanghailiang# @COLO_EXIT:
14209ecff6d6Szhanghailiang#
14219ecff6d6Szhanghailiang# Emitted when VM finishes COLO mode due to some errors happening or
14229ecff6d6Szhanghailiang# at the request of users.
14239ecff6d6Szhanghailiang#
14249ecff6d6Szhanghailiang# @mode: report COLO mode when COLO exited.
14259ecff6d6Szhanghailiang#
14269ecff6d6Szhanghailiang# @reason: describes the reason for the COLO exit.
14279ecff6d6Szhanghailiang#
14289ecff6d6Szhanghailiang# Since: 3.1
14299ecff6d6Szhanghailiang#
143014b48aaaSJohn Snow# .. qmp-example::
14319ecff6d6Szhanghailiang#
14329ecff6d6Szhanghailiang#     <- { "timestamp": {"seconds": 2032141960, "microseconds": 417172},
14339ecff6d6Szhanghailiang#          "event": "COLO_EXIT", "data": {"mode": "primary", "reason": "request" } }
14349ecff6d6Szhanghailiang##
14359ecff6d6Szhanghailiang{ 'event': 'COLO_EXIT',
14369ecff6d6Szhanghailiang  'data': {'mode': 'COLOMode', 'reason': 'COLOExitReason' } }
14379ecff6d6Szhanghailiang
14389ecff6d6Szhanghailiang##
14399ecff6d6Szhanghailiang# @COLOExitReason:
14409ecff6d6Szhanghailiang#
14413a43ac47SZhang Chen# The reason for a COLO exit.
14429ecff6d6Szhanghailiang#
1443a937b6aaSMarkus Armbruster# @none: failover has never happened.  This state does not occur in
1444a937b6aaSMarkus Armbruster#     the COLO_EXIT event, and is only visible in the result of
14453a43ac47SZhang Chen#     query-colo-status.
14469ecff6d6Szhanghailiang#
14473a43ac47SZhang Chen# @request: COLO exit is due to an external request.
14489ecff6d6Szhanghailiang#
14493a43ac47SZhang Chen# @error: COLO exit is due to an internal error.
14503a43ac47SZhang Chen#
14513a43ac47SZhang Chen# @processing: COLO is currently handling a failover (since 4.0).
14529ecff6d6Szhanghailiang#
14539ecff6d6Szhanghailiang# Since: 3.1
14549ecff6d6Szhanghailiang##
14559ecff6d6Szhanghailiang{ 'enum': 'COLOExitReason',
14563a43ac47SZhang Chen  'data': [ 'none', 'request', 'error' , 'processing' ] }
14579ecff6d6Szhanghailiang
14589ecff6d6Szhanghailiang##
145948685a8eSMarkus Armbruster# @x-colo-lost-heartbeat:
146048685a8eSMarkus Armbruster#
1461a937b6aaSMarkus Armbruster# Tell qemu that heartbeat is lost, request it to do takeover
1462a937b6aaSMarkus Armbruster# procedures.  If this command is sent to the PVM, the Primary side
1463a937b6aaSMarkus Armbruster# will exit COLO mode.  If sent to the Secondary, the Secondary side
1464a937b6aaSMarkus Armbruster# will run failover work, then takes over server operation to become
1465a937b6aaSMarkus Armbruster# the service VM.
146648685a8eSMarkus Armbruster#
14679fb49daaSMarkus Armbruster# Features:
1468a937b6aaSMarkus Armbruster#
14699fb49daaSMarkus Armbruster# @unstable: This command is experimental.
14709fb49daaSMarkus Armbruster#
147148685a8eSMarkus Armbruster# Since: 2.8
147248685a8eSMarkus Armbruster#
147314b48aaaSJohn Snow# .. qmp-example::
147448685a8eSMarkus Armbruster#
147548685a8eSMarkus Armbruster#     -> { "execute": "x-colo-lost-heartbeat" }
147648685a8eSMarkus Armbruster#     <- { "return": {} }
147748685a8eSMarkus Armbruster##
14789fb49daaSMarkus Armbruster{ 'command': 'x-colo-lost-heartbeat',
147951e47cf8SVladimir Sementsov-Ogievskiy  'features': [ 'unstable' ],
148051e47cf8SVladimir Sementsov-Ogievskiy  'if': 'CONFIG_REPLICATION' }
148148685a8eSMarkus Armbruster
148248685a8eSMarkus Armbruster##
148348685a8eSMarkus Armbruster# @migrate_cancel:
148448685a8eSMarkus Armbruster#
148548685a8eSMarkus Armbruster# Cancel the current executing migration process.
148648685a8eSMarkus Armbruster#
148701bed0ffSMarkus Armbruster# .. note:: This command succeeds even if there is no migration
148801bed0ffSMarkus Armbruster#    process running.
148948685a8eSMarkus Armbruster#
14909bc6e893SMarkus Armbruster# Since: 0.14
149148685a8eSMarkus Armbruster#
149214b48aaaSJohn Snow# .. qmp-example::
149348685a8eSMarkus Armbruster#
149448685a8eSMarkus Armbruster#     -> { "execute": "migrate_cancel" }
149548685a8eSMarkus Armbruster#     <- { "return": {} }
149648685a8eSMarkus Armbruster##
149748685a8eSMarkus Armbruster{ 'command': 'migrate_cancel' }
149848685a8eSMarkus Armbruster
149948685a8eSMarkus Armbruster##
150089cfc02cSDr. David Alan Gilbert# @migrate-continue:
150189cfc02cSDr. David Alan Gilbert#
150289cfc02cSDr. David Alan Gilbert# Continue migration when it's in a paused state.
150389cfc02cSDr. David Alan Gilbert#
150489cfc02cSDr. David Alan Gilbert# @state: The state the migration is currently expected to be in
150589cfc02cSDr. David Alan Gilbert#
150689cfc02cSDr. David Alan Gilbert# Since: 2.11
15074ae65a52SAndrea Bolognani#
150814b48aaaSJohn Snow# .. qmp-example::
150989cfc02cSDr. David Alan Gilbert#
151089cfc02cSDr. David Alan Gilbert#     -> { "execute": "migrate-continue" , "arguments":
151189cfc02cSDr. David Alan Gilbert#          { "state": "pre-switchover" } }
151289cfc02cSDr. David Alan Gilbert#     <- { "return": {} }
151389cfc02cSDr. David Alan Gilbert##
151489cfc02cSDr. David Alan Gilbert{ 'command': 'migrate-continue', 'data': {'state': 'MigrationStatus'} }
151589cfc02cSDr. David Alan Gilbert
151689cfc02cSDr. David Alan Gilbert##
1517e034f883SHet Gala# @MigrationAddressType:
1518e034f883SHet Gala#
1519e034f883SHet Gala# The migration stream transport mechanisms.
1520e034f883SHet Gala#
1521e034f883SHet Gala# @socket: Migrate via socket.
1522e034f883SHet Gala#
1523e034f883SHet Gala# @exec: Direct the migration stream to another process.
1524e034f883SHet Gala#
1525e034f883SHet Gala# @rdma: Migrate via RDMA.
1526e034f883SHet Gala#
1527e034f883SHet Gala# @file: Direct the migration stream to a file.
1528e034f883SHet Gala#
152937507c14SMarkus Armbruster# Since: 8.2
1530e034f883SHet Gala##
1531e034f883SHet Gala{ 'enum': 'MigrationAddressType',
1532e034f883SHet Gala  'data': [ 'socket', 'exec', 'rdma', 'file' ] }
1533e034f883SHet Gala
1534e034f883SHet Gala##
1535e034f883SHet Gala# @FileMigrationArgs:
1536e034f883SHet Gala#
1537e034f883SHet Gala# @filename: The file to receive the migration stream
1538e034f883SHet Gala#
1539e034f883SHet Gala# @offset: The file offset where the migration stream will start
1540e034f883SHet Gala#
154137507c14SMarkus Armbruster# Since: 8.2
1542e034f883SHet Gala##
1543e034f883SHet Gala{ 'struct': 'FileMigrationArgs',
1544e034f883SHet Gala  'data': { 'filename': 'str',
1545e034f883SHet Gala            'offset': 'uint64' } }
1546e034f883SHet Gala
1547e034f883SHet Gala##
1548e034f883SHet Gala# @MigrationExecCommand:
1549e034f883SHet Gala#
1550e034f883SHet Gala# @args: command (list head) and arguments to execute.
1551e034f883SHet Gala#
155237507c14SMarkus Armbruster# Since: 8.2
1553e034f883SHet Gala##
1554e034f883SHet Gala{ 'struct': 'MigrationExecCommand',
1555e034f883SHet Gala  'data': {'args': [ 'str' ] } }
1556e034f883SHet Gala
1557e034f883SHet Gala##
1558e034f883SHet Gala# @MigrationAddress:
1559e034f883SHet Gala#
1560e034f883SHet Gala# Migration endpoint configuration.
1561e034f883SHet Gala#
156289a2273bSMarkus Armbruster# @transport: The migration stream transport mechanism
156389a2273bSMarkus Armbruster#
156437507c14SMarkus Armbruster# Since: 8.2
1565e034f883SHet Gala##
1566e034f883SHet Gala{ 'union': 'MigrationAddress',
1567e034f883SHet Gala  'base': { 'transport' : 'MigrationAddressType'},
1568e034f883SHet Gala  'discriminator': 'transport',
1569e034f883SHet Gala  'data': {
1570e034f883SHet Gala    'socket': 'SocketAddress',
1571e034f883SHet Gala    'exec': 'MigrationExecCommand',
1572e034f883SHet Gala    'rdma': 'InetSocketAddress',
1573e034f883SHet Gala    'file': 'FileMigrationArgs' } }
1574e034f883SHet Gala
1575e034f883SHet Gala##
1576074dbce5SHet Gala# @MigrationChannelType:
1577074dbce5SHet Gala#
1578074dbce5SHet Gala# The migration channel-type request options.
1579074dbce5SHet Gala#
1580074dbce5SHet Gala# @main: Main outbound migration channel.
1581074dbce5SHet Gala#
158237507c14SMarkus Armbruster# Since: 8.1
1583074dbce5SHet Gala##
1584074dbce5SHet Gala{ 'enum': 'MigrationChannelType',
1585074dbce5SHet Gala  'data': [ 'main' ] }
1586074dbce5SHet Gala
1587074dbce5SHet Gala##
1588074dbce5SHet Gala# @MigrationChannel:
1589074dbce5SHet Gala#
1590074dbce5SHet Gala# Migration stream channel parameters.
1591074dbce5SHet Gala#
15924061c334SMichael Tokarev# @channel-type: Channel type for transferring packet information.
1593074dbce5SHet Gala#
1594074dbce5SHet Gala# @addr: Migration endpoint configuration on destination interface.
1595074dbce5SHet Gala#
159637507c14SMarkus Armbruster# Since: 8.1
1597074dbce5SHet Gala##
1598074dbce5SHet Gala{ 'struct': 'MigrationChannel',
1599074dbce5SHet Gala  'data': {
1600074dbce5SHet Gala      'channel-type': 'MigrationChannelType',
1601074dbce5SHet Gala      'addr': 'MigrationAddress' } }
1602074dbce5SHet Gala
1603074dbce5SHet Gala##
160448685a8eSMarkus Armbruster# @migrate:
160548685a8eSMarkus Armbruster#
160648685a8eSMarkus Armbruster# Migrates the current running guest to another Virtual Machine.
160748685a8eSMarkus Armbruster#
160848685a8eSMarkus Armbruster# @uri: the Uniform Resource Identifier of the destination VM
160948685a8eSMarkus Armbruster#
1610074dbce5SHet Gala# @channels: list of migration stream channels with each stream in the
1611074dbce5SHet Gala#     list connected to a destination interface endpoint.
1612074dbce5SHet Gala#
1613a937b6aaSMarkus Armbruster# @detach: this argument exists only for compatibility reasons and is
1614a937b6aaSMarkus Armbruster#     ignored by QEMU
161548685a8eSMarkus Armbruster#
161651f63ec7SPeter Maydell# @resume: resume one paused migration, default "off".  (since 3.0)
16177a4da28bSPeter Xu#
16189bc6e893SMarkus Armbruster# Since: 0.14
161948685a8eSMarkus Armbruster#
1620d461c279SJohn Snow# .. admonition:: Notes
162148685a8eSMarkus Armbruster#
16221ed1d4d6SMarkus Armbruster#     1. The 'query-migrate' command should be used to check
16231ed1d4d6SMarkus Armbruster#        migration's progress and final result (this information is
1624d461c279SJohn Snow#        provided by the 'status' member).
162548685a8eSMarkus Armbruster#
1626d461c279SJohn Snow#     2. All boolean arguments default to false.
162748685a8eSMarkus Armbruster#
16281ed1d4d6SMarkus Armbruster#     3. The user Monitor's "detach" argument is invalid in QMP and
1629d461c279SJohn Snow#        should not be used.
163048685a8eSMarkus Armbruster#
16311ed1d4d6SMarkus Armbruster#     4. The uri argument should have the Uniform Resource Identifier
16321ed1d4d6SMarkus Armbruster#        of default destination VM.  This connection will be bound to
16331ed1d4d6SMarkus Armbruster#        default network.
1634074dbce5SHet Gala#
16351ed1d4d6SMarkus Armbruster#     5. For now, number of migration streams is restricted to one,
16367d08424cSMarkus Armbruster#        i.e. number of items in 'channels' list is just 1.
1637074dbce5SHet Gala#
1638074dbce5SHet Gala#     6. The 'uri' and 'channels' arguments are mutually exclusive;
1639074dbce5SHet Gala#        exactly one of the two should be present.
1640074dbce5SHet Gala#
164114b48aaaSJohn Snow# .. qmp-example::
164248685a8eSMarkus Armbruster#
164348685a8eSMarkus Armbruster#     -> { "execute": "migrate", "arguments": { "uri": "tcp:0:4446" } }
164448685a8eSMarkus Armbruster#     <- { "return": {} }
16453cee17e7SHet Gala#
1646074dbce5SHet Gala#     -> { "execute": "migrate",
1647074dbce5SHet Gala#          "arguments": {
1648074dbce5SHet Gala#              "channels": [ { "channel-type": "main",
1649074dbce5SHet Gala#                              "addr": { "transport": "socket",
1650074dbce5SHet Gala#                                        "type": "inet",
1651074dbce5SHet Gala#                                        "host": "10.12.34.9",
1652074dbce5SHet Gala#                                        "port": "1050" } } ] } }
1653074dbce5SHet Gala#     <- { "return": {} }
1654074dbce5SHet Gala#
1655074dbce5SHet Gala#     -> { "execute": "migrate",
1656074dbce5SHet Gala#          "arguments": {
1657074dbce5SHet Gala#              "channels": [ { "channel-type": "main",
1658074dbce5SHet Gala#                              "addr": { "transport": "exec",
1659074dbce5SHet Gala#                                        "args": [ "/bin/nc", "-p", "6000",
1660074dbce5SHet Gala#                                                  "/some/sock" ] } } ] } }
1661074dbce5SHet Gala#     <- { "return": {} }
1662074dbce5SHet Gala#
1663074dbce5SHet Gala#     -> { "execute": "migrate",
1664074dbce5SHet Gala#          "arguments": {
1665074dbce5SHet Gala#              "channels": [ { "channel-type": "main",
1666074dbce5SHet Gala#                              "addr": { "transport": "rdma",
1667074dbce5SHet Gala#                                        "host": "10.12.34.9",
1668074dbce5SHet Gala#                                        "port": "1050" } } ] } }
1669074dbce5SHet Gala#     <- { "return": {} }
1670074dbce5SHet Gala#
1671074dbce5SHet Gala#     -> { "execute": "migrate",
1672074dbce5SHet Gala#          "arguments": {
1673074dbce5SHet Gala#              "channels": [ { "channel-type": "main",
1674074dbce5SHet Gala#                              "addr": { "transport": "file",
1675074dbce5SHet Gala#                                        "filename": "/tmp/migfile",
1676074dbce5SHet Gala#                                        "offset": "0x1000" } } ] } }
1677074dbce5SHet Gala#     <- { "return": {} }
167848685a8eSMarkus Armbruster##
167948685a8eSMarkus Armbruster{ 'command': 'migrate',
168057fd4b4eSHet Gala  'data': {'*uri': 'str',
1681074dbce5SHet Gala           '*channels': [ 'MigrationChannel' ],
16827a4da28bSPeter Xu           '*detach': 'bool', '*resume': 'bool' } }
168348685a8eSMarkus Armbruster
168448685a8eSMarkus Armbruster##
168548685a8eSMarkus Armbruster# @migrate-incoming:
168648685a8eSMarkus Armbruster#
1687a937b6aaSMarkus Armbruster# Start an incoming migration, the qemu must have been started with
1688a937b6aaSMarkus Armbruster# -incoming defer
168948685a8eSMarkus Armbruster#
169048685a8eSMarkus Armbruster# @uri: The Uniform Resource Identifier identifying the source or
169148685a8eSMarkus Armbruster#     address to listen on
169248685a8eSMarkus Armbruster#
1693074dbce5SHet Gala# @channels: list of migration stream channels with each stream in the
1694074dbce5SHet Gala#     list connected to a destination interface endpoint.
1695074dbce5SHet Gala#
1696dbea1c89SVladimir Sementsov-Ogievskiy# @exit-on-error: Exit on incoming migration failure.  Default true.
1697dbea1c89SVladimir Sementsov-Ogievskiy#     When set to false, the failure triggers a MIGRATION event, and
169801bed0ffSMarkus Armbruster#     error details could be retrieved with query-migrate.
169901bed0ffSMarkus Armbruster#     (since 9.1)
1700dbea1c89SVladimir Sementsov-Ogievskiy#
170148685a8eSMarkus Armbruster# Since: 2.3
170248685a8eSMarkus Armbruster#
1703d461c279SJohn Snow# .. admonition:: Notes
170448685a8eSMarkus Armbruster#
17051ed1d4d6SMarkus Armbruster#     1. It's a bad idea to use a string for the uri, but it needs to
17061ed1d4d6SMarkus Armbruster#        stay compatible with -incoming and the format of the uri is
17071ed1d4d6SMarkus Armbruster#        already exposed above libvirt.
170848685a8eSMarkus Armbruster#
1709a937b6aaSMarkus Armbruster#     2. QEMU must be started with -incoming defer to allow
1710a937b6aaSMarkus Armbruster#        migrate-incoming to be used.
171148685a8eSMarkus Armbruster#
171248685a8eSMarkus Armbruster#     3. The uri format is the same as for -incoming
171348685a8eSMarkus Armbruster#
17143cee17e7SHet Gala#     4. For now, number of migration streams is restricted to one,
17157d08424cSMarkus Armbruster#        i.e. number of items in 'channels' list is just 1.
1716074dbce5SHet Gala#
17173cee17e7SHet Gala#     5. The 'uri' and 'channels' arguments are mutually exclusive;
1718074dbce5SHet Gala#        exactly one of the two should be present.
1719074dbce5SHet Gala#
172014b48aaaSJohn Snow# .. qmp-example::
172148685a8eSMarkus Armbruster#
172248685a8eSMarkus Armbruster#     -> { "execute": "migrate-incoming",
17233cee17e7SHet Gala#          "arguments": { "uri": "tcp:0:4446" } }
172448685a8eSMarkus Armbruster#     <- { "return": {} }
1725074dbce5SHet Gala#
17263cee17e7SHet Gala#     -> { "execute": "migrate-incoming",
1727074dbce5SHet Gala#          "arguments": {
1728074dbce5SHet Gala#              "channels": [ { "channel-type": "main",
1729074dbce5SHet Gala#                              "addr": { "transport": "socket",
1730074dbce5SHet Gala#                                        "type": "inet",
1731074dbce5SHet Gala#                                        "host": "10.12.34.9",
1732074dbce5SHet Gala#                                        "port": "1050" } } ] } }
1733074dbce5SHet Gala#     <- { "return": {} }
1734074dbce5SHet Gala#
17353cee17e7SHet Gala#     -> { "execute": "migrate-incoming",
1736074dbce5SHet Gala#          "arguments": {
1737074dbce5SHet Gala#              "channels": [ { "channel-type": "main",
1738074dbce5SHet Gala#                              "addr": { "transport": "exec",
1739074dbce5SHet Gala#                                        "args": [ "/bin/nc", "-p", "6000",
1740074dbce5SHet Gala#                                                  "/some/sock" ] } } ] } }
1741074dbce5SHet Gala#     <- { "return": {} }
1742074dbce5SHet Gala#
17433cee17e7SHet Gala#     -> { "execute": "migrate-incoming",
1744074dbce5SHet Gala#          "arguments": {
1745074dbce5SHet Gala#              "channels": [ { "channel-type": "main",
1746074dbce5SHet Gala#                              "addr": { "transport": "rdma",
1747074dbce5SHet Gala#                                        "host": "10.12.34.9",
1748074dbce5SHet Gala#                                        "port": "1050" } } ] } }
1749074dbce5SHet Gala#     <- { "return": {} }
175048685a8eSMarkus Armbruster##
1751074dbce5SHet Gala{ 'command': 'migrate-incoming',
1752074dbce5SHet Gala             'data': {'*uri': 'str',
1753dbea1c89SVladimir Sementsov-Ogievskiy                      '*channels': [ 'MigrationChannel' ],
1754dbea1c89SVladimir Sementsov-Ogievskiy                      '*exit-on-error': 'bool' } }
175548685a8eSMarkus Armbruster
175648685a8eSMarkus Armbruster##
175748685a8eSMarkus Armbruster# @xen-save-devices-state:
175848685a8eSMarkus Armbruster#
1759a937b6aaSMarkus Armbruster# Save the state of all devices to file.  The RAM and the block
1760a937b6aaSMarkus Armbruster# devices of the VM are not saved by this command.
176148685a8eSMarkus Armbruster#
176248685a8eSMarkus Armbruster# @filename: the file to save the state of the devices to as binary
1763a937b6aaSMarkus Armbruster#     data.  See xen-save-devices-state.txt for a description of the
1764a937b6aaSMarkus Armbruster#     binary format.
176548685a8eSMarkus Armbruster#
1766a937b6aaSMarkus Armbruster# @live: Optional argument to ask QEMU to treat this command as part
1767a937b6aaSMarkus Armbruster#     of a live migration.  Default to true.  (since 2.11)
17685d6c599fSAnthony PERARD#
176948685a8eSMarkus Armbruster# Since: 1.1
177048685a8eSMarkus Armbruster#
177114b48aaaSJohn Snow# .. qmp-example::
177248685a8eSMarkus Armbruster#
177348685a8eSMarkus Armbruster#     -> { "execute": "xen-save-devices-state",
177448685a8eSMarkus Armbruster#          "arguments": { "filename": "/tmp/save" } }
177548685a8eSMarkus Armbruster#     <- { "return": {} }
177648685a8eSMarkus Armbruster##
17775d6c599fSAnthony PERARD{ 'command': 'xen-save-devices-state',
17785d6c599fSAnthony PERARD  'data': {'filename': 'str', '*live':'bool' } }
177948685a8eSMarkus Armbruster
178048685a8eSMarkus Armbruster##
178128af9ba2SPhilippe Mathieu-Daudé# @xen-set-global-dirty-log:
178228af9ba2SPhilippe Mathieu-Daudé#
178328af9ba2SPhilippe Mathieu-Daudé# Enable or disable the global dirty log mode.
178428af9ba2SPhilippe Mathieu-Daudé#
178528af9ba2SPhilippe Mathieu-Daudé# @enable: true to enable, false to disable.
178628af9ba2SPhilippe Mathieu-Daudé#
178728af9ba2SPhilippe Mathieu-Daudé# Since: 1.3
178828af9ba2SPhilippe Mathieu-Daudé#
178914b48aaaSJohn Snow# .. qmp-example::
179028af9ba2SPhilippe Mathieu-Daudé#
179128af9ba2SPhilippe Mathieu-Daudé#     -> { "execute": "xen-set-global-dirty-log",
179228af9ba2SPhilippe Mathieu-Daudé#          "arguments": { "enable": true } }
179328af9ba2SPhilippe Mathieu-Daudé#     <- { "return": {} }
179428af9ba2SPhilippe Mathieu-Daudé##
179528af9ba2SPhilippe Mathieu-Daudé{ 'command': 'xen-set-global-dirty-log', 'data': { 'enable': 'bool' } }
179628af9ba2SPhilippe Mathieu-Daudé
179728af9ba2SPhilippe Mathieu-Daudé##
179828af9ba2SPhilippe Mathieu-Daudé# @xen-load-devices-state:
179928af9ba2SPhilippe Mathieu-Daudé#
1800a937b6aaSMarkus Armbruster# Load the state of all devices from file.  The RAM and the block
1801a937b6aaSMarkus Armbruster# devices of the VM are not loaded by this command.
180228af9ba2SPhilippe Mathieu-Daudé#
180328af9ba2SPhilippe Mathieu-Daudé# @filename: the file to load the state of the devices from as binary
1804a937b6aaSMarkus Armbruster#     data.  See xen-save-devices-state.txt for a description of the
1805a937b6aaSMarkus Armbruster#     binary format.
180628af9ba2SPhilippe Mathieu-Daudé#
180728af9ba2SPhilippe Mathieu-Daudé# Since: 2.7
180828af9ba2SPhilippe Mathieu-Daudé#
180914b48aaaSJohn Snow# .. qmp-example::
181028af9ba2SPhilippe Mathieu-Daudé#
181128af9ba2SPhilippe Mathieu-Daudé#     -> { "execute": "xen-load-devices-state",
181228af9ba2SPhilippe Mathieu-Daudé#          "arguments": { "filename": "/tmp/resume" } }
181328af9ba2SPhilippe Mathieu-Daudé#     <- { "return": {} }
181428af9ba2SPhilippe Mathieu-Daudé##
181528af9ba2SPhilippe Mathieu-Daudé{ 'command': 'xen-load-devices-state', 'data': {'filename': 'str'} }
181628af9ba2SPhilippe Mathieu-Daudé
181728af9ba2SPhilippe Mathieu-Daudé##
181848685a8eSMarkus Armbruster# @xen-set-replication:
181948685a8eSMarkus Armbruster#
182048685a8eSMarkus Armbruster# Enable or disable replication.
182148685a8eSMarkus Armbruster#
182248685a8eSMarkus Armbruster# @enable: true to enable, false to disable.
182348685a8eSMarkus Armbruster#
182448685a8eSMarkus Armbruster# @primary: true for primary or false for secondary.
182548685a8eSMarkus Armbruster#
182673c67f38SMarkus Armbruster# @failover: true to do failover, false to stop.  Cannot be specified
182773c67f38SMarkus Armbruster#     if 'enable' is true.  Default value is false.
182848685a8eSMarkus Armbruster#
182914b48aaaSJohn Snow# .. qmp-example::
183048685a8eSMarkus Armbruster#
183148685a8eSMarkus Armbruster#     -> { "execute": "xen-set-replication",
183248685a8eSMarkus Armbruster#          "arguments": {"enable": true, "primary": false} }
183348685a8eSMarkus Armbruster#     <- { "return": {} }
183448685a8eSMarkus Armbruster#
183548685a8eSMarkus Armbruster# Since: 2.9
183648685a8eSMarkus Armbruster##
183748685a8eSMarkus Armbruster{ 'command': 'xen-set-replication',
1838335d10cdSMarc-André Lureau  'data': { 'enable': 'bool', 'primary': 'bool', '*failover': 'bool' },
18398a9f1e1dSMarc-André Lureau  'if': 'CONFIG_REPLICATION' }
184048685a8eSMarkus Armbruster
184148685a8eSMarkus Armbruster##
184248685a8eSMarkus Armbruster# @ReplicationStatus:
184348685a8eSMarkus Armbruster#
184448685a8eSMarkus Armbruster# The result format for 'query-xen-replication-status'.
184548685a8eSMarkus Armbruster#
184648685a8eSMarkus Armbruster# @error: true if an error happened, false if replication is normal.
184748685a8eSMarkus Armbruster#
1848a937b6aaSMarkus Armbruster# @desc: the human readable error description string, when @error is
1849a937b6aaSMarkus Armbruster#     'true'.
185048685a8eSMarkus Armbruster#
185148685a8eSMarkus Armbruster# Since: 2.9
185248685a8eSMarkus Armbruster##
185348685a8eSMarkus Armbruster{ 'struct': 'ReplicationStatus',
1854335d10cdSMarc-André Lureau  'data': { 'error': 'bool', '*desc': 'str' },
18558a9f1e1dSMarc-André Lureau  'if': 'CONFIG_REPLICATION' }
185648685a8eSMarkus Armbruster
185748685a8eSMarkus Armbruster##
185848685a8eSMarkus Armbruster# @query-xen-replication-status:
185948685a8eSMarkus Armbruster#
186048685a8eSMarkus Armbruster# Query replication status while the vm is running.
186148685a8eSMarkus Armbruster#
1862f4347129SAndrea Bolognani# Returns: A @ReplicationStatus object showing the status.
186348685a8eSMarkus Armbruster#
186414b48aaaSJohn Snow# .. qmp-example::
186548685a8eSMarkus Armbruster#
186648685a8eSMarkus Armbruster#     -> { "execute": "query-xen-replication-status" }
186748685a8eSMarkus Armbruster#     <- { "return": { "error": false } }
186848685a8eSMarkus Armbruster#
186948685a8eSMarkus Armbruster# Since: 2.9
187048685a8eSMarkus Armbruster##
187148685a8eSMarkus Armbruster{ 'command': 'query-xen-replication-status',
1872335d10cdSMarc-André Lureau  'returns': 'ReplicationStatus',
18738a9f1e1dSMarc-André Lureau  'if': 'CONFIG_REPLICATION' }
187448685a8eSMarkus Armbruster
187548685a8eSMarkus Armbruster##
187648685a8eSMarkus Armbruster# @xen-colo-do-checkpoint:
187748685a8eSMarkus Armbruster#
187848685a8eSMarkus Armbruster# Xen uses this command to notify replication to trigger a checkpoint.
187948685a8eSMarkus Armbruster#
188014b48aaaSJohn Snow# .. qmp-example::
188148685a8eSMarkus Armbruster#
188248685a8eSMarkus Armbruster#     -> { "execute": "xen-colo-do-checkpoint" }
188348685a8eSMarkus Armbruster#     <- { "return": {} }
188448685a8eSMarkus Armbruster#
188548685a8eSMarkus Armbruster# Since: 2.9
188648685a8eSMarkus Armbruster##
1887335d10cdSMarc-André Lureau{ 'command': 'xen-colo-do-checkpoint',
18888a9f1e1dSMarc-André Lureau  'if': 'CONFIG_REPLICATION' }
188902affd41SPeter Xu
189002affd41SPeter Xu##
1891f56c0065SZhang Chen# @COLOStatus:
1892f56c0065SZhang Chen#
1893f56c0065SZhang Chen# The result format for 'query-colo-status'.
1894f56c0065SZhang Chen#
1895a937b6aaSMarkus Armbruster# @mode: COLO running mode.  If COLO is running, this field will
1896a937b6aaSMarkus Armbruster#     return 'primary' or 'secondary'.
1897f56c0065SZhang Chen#
18985cc8f9ebSZhang Chen# @last-mode: COLO last running mode.  If COLO is running, this field
1899a937b6aaSMarkus Armbruster#     will return same like mode field, after failover we can use this
1900a937b6aaSMarkus Armbruster#     field to get last colo mode.  (since 4.0)
19015ed0decaSZhang Chen#
1902f56c0065SZhang Chen# @reason: describes the reason for the COLO exit.
1903f56c0065SZhang Chen#
1904ea3b23e5SZhang Chen# Since: 3.1
1905f56c0065SZhang Chen##
1906f56c0065SZhang Chen{ 'struct': 'COLOStatus',
19075cc8f9ebSZhang Chen  'data': { 'mode': 'COLOMode', 'last-mode': 'COLOMode',
190851e47cf8SVladimir Sementsov-Ogievskiy            'reason': 'COLOExitReason' },
190951e47cf8SVladimir Sementsov-Ogievskiy  'if': 'CONFIG_REPLICATION' }
1910f56c0065SZhang Chen
1911f56c0065SZhang Chen##
1912f56c0065SZhang Chen# @query-colo-status:
1913f56c0065SZhang Chen#
1914f56c0065SZhang Chen# Query COLO status while the vm is running.
1915f56c0065SZhang Chen#
1916f56c0065SZhang Chen# Returns: A @COLOStatus object showing the status.
1917f56c0065SZhang Chen#
191814b48aaaSJohn Snow# .. qmp-example::
1919f56c0065SZhang Chen#
1920f56c0065SZhang Chen#     -> { "execute": "query-colo-status" }
192151ec294dSVictor Toso#     <- { "return": { "mode": "primary", "last-mode": "none", "reason": "request" } }
1922f56c0065SZhang Chen#
1923ea3b23e5SZhang Chen# Since: 3.1
1924f56c0065SZhang Chen##
1925f56c0065SZhang Chen{ 'command': 'query-colo-status',
192651e47cf8SVladimir Sementsov-Ogievskiy  'returns': 'COLOStatus',
192751e47cf8SVladimir Sementsov-Ogievskiy  'if': 'CONFIG_REPLICATION' }
1928f56c0065SZhang Chen
1929f56c0065SZhang Chen##
193002affd41SPeter Xu# @migrate-recover:
193102affd41SPeter Xu#
193202affd41SPeter Xu# Provide a recovery migration stream URI.
193302affd41SPeter Xu#
193402affd41SPeter Xu# @uri: the URI to be used for the recovery of migration stream.
193502affd41SPeter Xu#
193614b48aaaSJohn Snow# .. qmp-example::
193702affd41SPeter Xu#
193802affd41SPeter Xu#     -> { "execute": "migrate-recover",
193902affd41SPeter Xu#          "arguments": { "uri": "tcp:192.168.1.200:12345" } }
194002affd41SPeter Xu#     <- { "return": {} }
194102affd41SPeter Xu#
194251f63ec7SPeter Maydell# Since: 3.0
194302affd41SPeter Xu##
1944b0ddeba2SMarc-André Lureau{ 'command': 'migrate-recover',
1945b0ddeba2SMarc-André Lureau  'data': { 'uri': 'str' },
194602affd41SPeter Xu  'allow-oob': true }
1947bfbf89c2SPeter Xu
1948bfbf89c2SPeter Xu##
1949bfbf89c2SPeter Xu# @migrate-pause:
1950bfbf89c2SPeter Xu#
1951bfbf89c2SPeter Xu# Pause a migration.  Currently it only supports postcopy.
1952bfbf89c2SPeter Xu#
195314b48aaaSJohn Snow# .. qmp-example::
1954bfbf89c2SPeter Xu#
1955bfbf89c2SPeter Xu#     -> { "execute": "migrate-pause" }
1956bfbf89c2SPeter Xu#     <- { "return": {} }
1957bfbf89c2SPeter Xu#
195851f63ec7SPeter Maydell# Since: 3.0
1959bfbf89c2SPeter Xu##
1960bfbf89c2SPeter Xu{ 'command': 'migrate-pause', 'allow-oob': true }
1961d328e6f3SJens Freimann
1962d328e6f3SJens Freimann##
1963d328e6f3SJens Freimann# @UNPLUG_PRIMARY:
1964d328e6f3SJens Freimann#
1965d328e6f3SJens Freimann# Emitted from source side of a migration when migration state is
196601bed0ffSMarkus Armbruster# WAIT_UNPLUG.  Device was unplugged by guest operating system.
196701bed0ffSMarkus Armbruster# Device resources in QEMU are kept on standby to be able to re-plug
196801bed0ffSMarkus Armbruster# it in case of migration failure.
1969d328e6f3SJens Freimann#
1970d328e6f3SJens Freimann# @device-id: QEMU device id of the unplugged device
1971d328e6f3SJens Freimann#
1972d328e6f3SJens Freimann# Since: 4.2
1973d328e6f3SJens Freimann#
197414b48aaaSJohn Snow# .. qmp-example::
19754ae65a52SAndrea Bolognani#
19760df5e9a3SVictor Toso#     <- { "event": "UNPLUG_PRIMARY",
19770df5e9a3SVictor Toso#          "data": { "device-id": "hostdev0" },
19780df5e9a3SVictor Toso#          "timestamp": { "seconds": 1265044230, "microseconds": 450486 } }
1979d328e6f3SJens Freimann##
1980d328e6f3SJens Freimann{ 'event': 'UNPLUG_PRIMARY',
1981d328e6f3SJens Freimann  'data': { 'device-id': 'str' } }
19827df3aa30SChuan Zheng
19837df3aa30SChuan Zheng##
198471864eadSHyman Huang(黄勇)# @DirtyRateVcpu:
198571864eadSHyman Huang(黄勇)#
198671864eadSHyman Huang(黄勇)# Dirty rate of vcpu.
198771864eadSHyman Huang(黄勇)#
198871864eadSHyman Huang(黄勇)# @id: vcpu index.
198971864eadSHyman Huang(黄勇)#
199071864eadSHyman Huang(黄勇)# @dirty-rate: dirty rate.
199171864eadSHyman Huang(黄勇)#
1992f78d4ed7SHyman Huang(黄勇)# Since: 6.2
199371864eadSHyman Huang(黄勇)##
199471864eadSHyman Huang(黄勇){ 'struct': 'DirtyRateVcpu',
199571864eadSHyman Huang(黄勇)  'data': { 'id': 'int', 'dirty-rate': 'int64' } }
199671864eadSHyman Huang(黄勇)
199771864eadSHyman Huang(黄勇)##
19987df3aa30SChuan Zheng# @DirtyRateStatus:
19997df3aa30SChuan Zheng#
20005034e3d4SAndrei Gudkov# Dirty page rate measurement status.
20017df3aa30SChuan Zheng#
20025034e3d4SAndrei Gudkov# @unstarted: measuring thread has not been started yet
20037df3aa30SChuan Zheng#
20045034e3d4SAndrei Gudkov# @measuring: measuring thread is running
20057df3aa30SChuan Zheng#
20065034e3d4SAndrei Gudkov# @measured: dirty page rate is measured and the results are available
20077df3aa30SChuan Zheng#
20087df3aa30SChuan Zheng# Since: 5.2
20097df3aa30SChuan Zheng##
20107df3aa30SChuan Zheng{ 'enum': 'DirtyRateStatus',
20117df3aa30SChuan Zheng  'data': [ 'unstarted', 'measuring', 'measured'] }
20124c437254SChuan Zheng
20134c437254SChuan Zheng##
201471864eadSHyman Huang(黄勇)# @DirtyRateMeasureMode:
201571864eadSHyman Huang(黄勇)#
20165034e3d4SAndrei Gudkov# Method used to measure dirty page rate.  Differences between
20175034e3d4SAndrei Gudkov# available methods are explained in @calc-dirty-rate.
201871864eadSHyman Huang(黄勇)#
20195034e3d4SAndrei Gudkov# @page-sampling: use page sampling
202071864eadSHyman Huang(黄勇)#
20215034e3d4SAndrei Gudkov# @dirty-ring: use dirty ring
2022826b8bc8SHyman Huang(黄勇)#
20235034e3d4SAndrei Gudkov# @dirty-bitmap: use dirty bitmap
202471864eadSHyman Huang(黄勇)#
2025f78d4ed7SHyman Huang(黄勇)# Since: 6.2
202671864eadSHyman Huang(黄勇)##
202771864eadSHyman Huang(黄勇){ 'enum': 'DirtyRateMeasureMode',
2028826b8bc8SHyman Huang(黄勇)  'data': ['page-sampling', 'dirty-ring', 'dirty-bitmap'] }
202971864eadSHyman Huang(黄勇)
203071864eadSHyman Huang(黄勇)##
203134a68001SAndrei Gudkov# @TimeUnit:
203234a68001SAndrei Gudkov#
203334a68001SAndrei Gudkov# Specifies unit in which time-related value is specified.
203434a68001SAndrei Gudkov#
203534a68001SAndrei Gudkov# @second: value is in seconds
203634a68001SAndrei Gudkov#
203734a68001SAndrei Gudkov# @millisecond: value is in milliseconds
203834a68001SAndrei Gudkov#
203937507c14SMarkus Armbruster# Since: 8.2
204034a68001SAndrei Gudkov##
204134a68001SAndrei Gudkov{ 'enum': 'TimeUnit',
204234a68001SAndrei Gudkov  'data': ['second', 'millisecond'] }
204334a68001SAndrei Gudkov
204434a68001SAndrei Gudkov##
20454c437254SChuan Zheng# @DirtyRateInfo:
20464c437254SChuan Zheng#
20475034e3d4SAndrei Gudkov# Information about measured dirty page rate.
20484c437254SChuan Zheng#
2049a937b6aaSMarkus Armbruster# @dirty-rate: an estimate of the dirty page rate of the VM in units
20505034e3d4SAndrei Gudkov#     of MiB/s.  Value is present only when @status is 'measured'.
20514c437254SChuan Zheng#
20525034e3d4SAndrei Gudkov# @status: current status of dirty page rate measurements
20534c437254SChuan Zheng#
20544c437254SChuan Zheng# @start-time: start time in units of second for calculation
20554c437254SChuan Zheng#
205634a68001SAndrei Gudkov# @calc-time: time period for which dirty page rate was measured,
205734a68001SAndrei Gudkov#     expressed and rounded down to @calc-time-unit.
205834a68001SAndrei Gudkov#
205934a68001SAndrei Gudkov# @calc-time-unit: time unit of @calc-time  (Since 8.2)
20604c437254SChuan Zheng#
20615034e3d4SAndrei Gudkov# @sample-pages: number of sampled pages per GiB of guest memory.
20625034e3d4SAndrei Gudkov#     Valid only in page-sampling mode (Since 6.1)
20637afa08cdSHyman Huang(黄勇)#
20645034e3d4SAndrei Gudkov# @mode: mode that was used to measure dirty page rate (Since 6.2)
20650e21bf24SHyman Huang(黄勇)#
20665034e3d4SAndrei Gudkov# @vcpu-dirty-rate: dirty rate for each vCPU if dirty-ring mode was
2067a937b6aaSMarkus Armbruster#     specified (Since 6.2)
20680e21bf24SHyman Huang(黄勇)#
20694c437254SChuan Zheng# Since: 5.2
20704c437254SChuan Zheng##
20714c437254SChuan Zheng{ 'struct': 'DirtyRateInfo',
2072b1a859cfSChuan Zheng  'data': {'*dirty-rate': 'int64',
20734c437254SChuan Zheng           'status': 'DirtyRateStatus',
20744c437254SChuan Zheng           'start-time': 'int64',
20757afa08cdSHyman Huang(黄勇)           'calc-time': 'int64',
207634a68001SAndrei Gudkov           'calc-time-unit': 'TimeUnit',
20770e21bf24SHyman Huang(黄勇)           'sample-pages': 'uint64',
20780e21bf24SHyman Huang(黄勇)           'mode': 'DirtyRateMeasureMode',
20790e21bf24SHyman Huang(黄勇)           '*vcpu-dirty-rate': [ 'DirtyRateVcpu' ] } }
20804c437254SChuan Zheng
20814c437254SChuan Zheng##
20824c437254SChuan Zheng# @calc-dirty-rate:
20834c437254SChuan Zheng#
20845034e3d4SAndrei Gudkov# Start measuring dirty page rate of the VM.  Results can be retrieved
20855034e3d4SAndrei Gudkov# with @query-dirty-rate after measurements are completed.
20864c437254SChuan Zheng#
20875034e3d4SAndrei Gudkov# Dirty page rate is the number of pages changed in a given time
20885034e3d4SAndrei Gudkov# period expressed in MiB/s.  The following methods of calculation are
20895034e3d4SAndrei Gudkov# available:
20904c437254SChuan Zheng#
20915034e3d4SAndrei Gudkov# 1. In page sampling mode, a random subset of pages are selected and
20925034e3d4SAndrei Gudkov#    hashed twice: once at the beginning of measurement time period,
20935034e3d4SAndrei Gudkov#    and once again at the end.  If two hashes for some page are
20945034e3d4SAndrei Gudkov#    different, the page is counted as changed.  Since this method
20955034e3d4SAndrei Gudkov#    relies on sampling and hashing, calculated dirty page rate is
20965034e3d4SAndrei Gudkov#    only an estimate of its true value.  Increasing @sample-pages
20975034e3d4SAndrei Gudkov#    improves estimation quality at the cost of higher computational
20985034e3d4SAndrei Gudkov#    overhead.
20997afa08cdSHyman Huang(黄勇)#
21005034e3d4SAndrei Gudkov# 2. Dirty bitmap mode captures writes to memory (for example by
21015034e3d4SAndrei Gudkov#    temporarily revoking write access to all pages) and counting page
21025034e3d4SAndrei Gudkov#    faults.  Information about modified pages is collected into a
21035034e3d4SAndrei Gudkov#    bitmap, where each bit corresponds to one guest page.  This mode
21045034e3d4SAndrei Gudkov#    requires that KVM accelerator property "dirty-ring-size" is *not*
21055034e3d4SAndrei Gudkov#    set.
21065034e3d4SAndrei Gudkov#
21075034e3d4SAndrei Gudkov# 3. Dirty ring mode is similar to dirty bitmap mode, but the
21085034e3d4SAndrei Gudkov#    information about modified pages is collected into ring buffer.
21095034e3d4SAndrei Gudkov#    This mode tracks page modification per each vCPU separately.  It
21105034e3d4SAndrei Gudkov#    requires that KVM accelerator property "dirty-ring-size" is set.
21115034e3d4SAndrei Gudkov#
211201bed0ffSMarkus Armbruster# @calc-time: time period for which dirty page rate is calculated.  By
211301bed0ffSMarkus Armbruster#     default it is specified in seconds, but the unit can be set
211434a68001SAndrei Gudkov#     explicitly with @calc-time-unit.  Note that larger @calc-time
211534a68001SAndrei Gudkov#     values will typically result in smaller dirty page rates because
211601bed0ffSMarkus Armbruster#     page dirtying is a one-time event.  Once some page is counted as
211701bed0ffSMarkus Armbruster#     dirty during @calc-time period, further writes to this page will
211801bed0ffSMarkus Armbruster#     not increase dirty page rate anymore.
211934a68001SAndrei Gudkov#
212001bed0ffSMarkus Armbruster# @calc-time-unit: time unit in which @calc-time is specified.  By
212101bed0ffSMarkus Armbruster#     default it is seconds.  (Since 8.2)
21225034e3d4SAndrei Gudkov#
21235034e3d4SAndrei Gudkov# @sample-pages: number of sampled pages per each GiB of guest memory.
21245034e3d4SAndrei Gudkov#     Default value is 512.  For 4KiB guest pages this corresponds to
21255034e3d4SAndrei Gudkov#     sampling ratio of 0.2%.  This argument is used only in page
21265034e3d4SAndrei Gudkov#     sampling mode.  (Since 6.1)
21275034e3d4SAndrei Gudkov#
21285034e3d4SAndrei Gudkov# @mode: mechanism for tracking dirty pages.  Default value is
21295034e3d4SAndrei Gudkov#     'page-sampling'.  Others are 'dirty-bitmap' and 'dirty-ring'.
21305034e3d4SAndrei Gudkov#     (Since 6.1)
21310e21bf24SHyman Huang(黄勇)#
21324c437254SChuan Zheng# Since: 5.2
21334c437254SChuan Zheng#
21346f07c59fSJohn Snow# .. qmp-example::
21354ae65a52SAndrea Bolognani#
213637fa48a4SMarkus Armbruster#     -> {"execute": "calc-dirty-rate", "arguments": {"calc-time": 1,
21379f2b8488SJohn Snow#                                                     "sample-pages": 512} }
213837fa48a4SMarkus Armbruster#     <- { "return": {} }
213934a68001SAndrei Gudkov#
21406f07c59fSJohn Snow# .. qmp-example::
21416f07c59fSJohn Snow#    :annotated:
21426f07c59fSJohn Snow#
21436f07c59fSJohn Snow#    Measure dirty rate using dirty bitmap for 500 milliseconds::
214434a68001SAndrei Gudkov#
214534a68001SAndrei Gudkov#     -> {"execute": "calc-dirty-rate", "arguments": {"calc-time": 500,
214634a68001SAndrei Gudkov#         "calc-time-unit": "millisecond", "mode": "dirty-bitmap"} }
214734a68001SAndrei Gudkov#
214834a68001SAndrei Gudkov#     <- { "return": {} }
21494c437254SChuan Zheng##
21507afa08cdSHyman Huang(黄勇){ 'command': 'calc-dirty-rate', 'data': {'calc-time': 'int64',
215134a68001SAndrei Gudkov                                         '*calc-time-unit': 'TimeUnit',
21520e21bf24SHyman Huang(黄勇)                                         '*sample-pages': 'int',
21530e21bf24SHyman Huang(黄勇)                                         '*mode': 'DirtyRateMeasureMode'} }
21544c437254SChuan Zheng
21554c437254SChuan Zheng##
21564c437254SChuan Zheng# @query-dirty-rate:
21574c437254SChuan Zheng#
21585034e3d4SAndrei Gudkov# Query results of the most recent invocation of @calc-dirty-rate.
21594c437254SChuan Zheng#
216034a68001SAndrei Gudkov# @calc-time-unit: time unit in which to report calculation time.
216134a68001SAndrei Gudkov#     By default it is reported in seconds.  (Since 8.2)
216234a68001SAndrei Gudkov#
21634c437254SChuan Zheng# Since: 5.2
21645034e3d4SAndrei Gudkov#
2165a9eab6e2SJohn Snow# .. qmp-example::
2166a9eab6e2SJohn Snow#    :title: Measurement is in progress
21675034e3d4SAndrei Gudkov#
21685034e3d4SAndrei Gudkov#     <- {"status": "measuring", "sample-pages": 512,
2169320a6cccSAndrei Gudkov#         "mode": "page-sampling", "start-time": 1693900454, "calc-time": 10,
217034a68001SAndrei Gudkov#         "calc-time-unit": "second"}
21715034e3d4SAndrei Gudkov#
2172a9eab6e2SJohn Snow# .. qmp-example::
2173a9eab6e2SJohn Snow#    :title: Measurement has been completed
21745034e3d4SAndrei Gudkov#
21755034e3d4SAndrei Gudkov#     <- {"status": "measured", "sample-pages": 512, "dirty-rate": 108,
2176320a6cccSAndrei Gudkov#         "mode": "page-sampling", "start-time": 1693900454, "calc-time": 10,
217734a68001SAndrei Gudkov#         "calc-time-unit": "second"}
21784c437254SChuan Zheng##
217934a68001SAndrei Gudkov{ 'command': 'query-dirty-rate', 'data': {'*calc-time-unit': 'TimeUnit' },
218034a68001SAndrei Gudkov                                 'returns': 'DirtyRateInfo' }
21810f0d83a4SDaniel P. Berrangé
21820f0d83a4SDaniel P. Berrangé##
2183f3b2e38cSHyman Huang(黄勇)# @DirtyLimitInfo:
2184f3b2e38cSHyman Huang(黄勇)#
2185f3b2e38cSHyman Huang(黄勇)# Dirty page rate limit information of a virtual CPU.
2186f3b2e38cSHyman Huang(黄勇)#
2187f3b2e38cSHyman Huang(黄勇)# @cpu-index: index of a virtual CPU.
2188f3b2e38cSHyman Huang(黄勇)#
2189f3b2e38cSHyman Huang(黄勇)# @limit-rate: upper limit of dirty page rate (MB/s) for a virtual
2190f3b2e38cSHyman Huang(黄勇)#     CPU, 0 means unlimited.
2191f3b2e38cSHyman Huang(黄勇)#
2192f3b2e38cSHyman Huang(黄勇)# @current-rate: current dirty page rate (MB/s) for a virtual CPU.
2193f3b2e38cSHyman Huang(黄勇)#
2194f3b2e38cSHyman Huang(黄勇)# Since: 7.1
2195f3b2e38cSHyman Huang(黄勇)##
2196f3b2e38cSHyman Huang(黄勇){ 'struct': 'DirtyLimitInfo',
2197f3b2e38cSHyman Huang(黄勇)  'data': { 'cpu-index': 'int',
2198f3b2e38cSHyman Huang(黄勇)            'limit-rate': 'uint64',
2199f3b2e38cSHyman Huang(黄勇)            'current-rate': 'uint64' } }
2200f3b2e38cSHyman Huang(黄勇)
2201f3b2e38cSHyman Huang(黄勇)##
2202f3b2e38cSHyman Huang(黄勇)# @set-vcpu-dirty-limit:
2203f3b2e38cSHyman Huang(黄勇)#
2204f3b2e38cSHyman Huang(黄勇)# Set the upper limit of dirty page rate for virtual CPUs.
2205f3b2e38cSHyman Huang(黄勇)#
2206a937b6aaSMarkus Armbruster# Requires KVM with accelerator property "dirty-ring-size" set.  A
2207a937b6aaSMarkus Armbruster# virtual CPU's dirty page rate is a measure of its memory load.  To
2208a937b6aaSMarkus Armbruster# observe dirty page rates, use @calc-dirty-rate.
2209f3b2e38cSHyman Huang(黄勇)#
2210f3b2e38cSHyman Huang(黄勇)# @cpu-index: index of a virtual CPU, default is all.
2211f3b2e38cSHyman Huang(黄勇)#
2212f3b2e38cSHyman Huang(黄勇)# @dirty-rate: upper limit of dirty page rate (MB/s) for virtual CPUs.
2213f3b2e38cSHyman Huang(黄勇)#
2214f3b2e38cSHyman Huang(黄勇)# Since: 7.1
2215f3b2e38cSHyman Huang(黄勇)#
221614b48aaaSJohn Snow# .. qmp-example::
221737fa48a4SMarkus Armbruster#
221837fa48a4SMarkus Armbruster#     -> {"execute": "set-vcpu-dirty-limit"}
2219f3b2e38cSHyman Huang(黄勇)#         "arguments": { "dirty-rate": 200,
2220f3b2e38cSHyman Huang(黄勇)#                        "cpu-index": 1 } }
222137fa48a4SMarkus Armbruster#     <- { "return": {} }
2222f3b2e38cSHyman Huang(黄勇)##
2223f3b2e38cSHyman Huang(黄勇){ 'command': 'set-vcpu-dirty-limit',
2224f3b2e38cSHyman Huang(黄勇)  'data': { '*cpu-index': 'int',
2225f3b2e38cSHyman Huang(黄勇)            'dirty-rate': 'uint64' } }
2226f3b2e38cSHyman Huang(黄勇)
2227f3b2e38cSHyman Huang(黄勇)##
2228f3b2e38cSHyman Huang(黄勇)# @cancel-vcpu-dirty-limit:
2229f3b2e38cSHyman Huang(黄勇)#
2230f3b2e38cSHyman Huang(黄勇)# Cancel the upper limit of dirty page rate for virtual CPUs.
2231f3b2e38cSHyman Huang(黄勇)#
2232f3b2e38cSHyman Huang(黄勇)# Cancel the dirty page limit for the vCPU which has been set with
2233f3b2e38cSHyman Huang(黄勇)# set-vcpu-dirty-limit command.  Note that this command requires
2234f3b2e38cSHyman Huang(黄勇)# support from dirty ring, same as the "set-vcpu-dirty-limit".
2235f3b2e38cSHyman Huang(黄勇)#
2236f3b2e38cSHyman Huang(黄勇)# @cpu-index: index of a virtual CPU, default is all.
2237f3b2e38cSHyman Huang(黄勇)#
2238f3b2e38cSHyman Huang(黄勇)# Since: 7.1
2239f3b2e38cSHyman Huang(黄勇)#
224014b48aaaSJohn Snow# .. qmp-example::
224137fa48a4SMarkus Armbruster#
224237fa48a4SMarkus Armbruster#     -> {"execute": "cancel-vcpu-dirty-limit"},
2243f3b2e38cSHyman Huang(黄勇)#         "arguments": { "cpu-index": 1 } }
224437fa48a4SMarkus Armbruster#     <- { "return": {} }
2245f3b2e38cSHyman Huang(黄勇)##
2246f3b2e38cSHyman Huang(黄勇){ 'command': 'cancel-vcpu-dirty-limit',
2247f3b2e38cSHyman Huang(黄勇)  'data': { '*cpu-index': 'int'} }
2248f3b2e38cSHyman Huang(黄勇)
2249f3b2e38cSHyman Huang(黄勇)##
2250f3b2e38cSHyman Huang(黄勇)# @query-vcpu-dirty-limit:
2251f3b2e38cSHyman Huang(黄勇)#
2252a937b6aaSMarkus Armbruster# Returns information about virtual CPU dirty page rate limits, if
2253a937b6aaSMarkus Armbruster# any.
2254f3b2e38cSHyman Huang(黄勇)#
2255f3b2e38cSHyman Huang(黄勇)# Since: 7.1
2256f3b2e38cSHyman Huang(黄勇)#
225714b48aaaSJohn Snow# .. qmp-example::
225837fa48a4SMarkus Armbruster#
225937fa48a4SMarkus Armbruster#     -> {"execute": "query-vcpu-dirty-limit"}
226037fa48a4SMarkus Armbruster#     <- {"return": [
226137fa48a4SMarkus Armbruster#            { "limit-rate": 60, "current-rate": 3, "cpu-index": 0},
226237fa48a4SMarkus Armbruster#            { "limit-rate": 60, "current-rate": 3, "cpu-index": 1}]}
2263f3b2e38cSHyman Huang(黄勇)##
2264f3b2e38cSHyman Huang(黄勇){ 'command': 'query-vcpu-dirty-limit',
2265f3b2e38cSHyman Huang(黄勇)  'returns': [ 'DirtyLimitInfo' ] }
2266f3b2e38cSHyman Huang(黄勇)
2267f3b2e38cSHyman Huang(黄勇)##
226867132620SJiang Jiacheng# @MigrationThreadInfo:
226967132620SJiang Jiacheng#
227067132620SJiang Jiacheng# Information about migrationthreads
227167132620SJiang Jiacheng#
227267132620SJiang Jiacheng# @name: the name of migration thread
227367132620SJiang Jiacheng#
227467132620SJiang Jiacheng# @thread-id: ID of the underlying host thread
227567132620SJiang Jiacheng#
227667132620SJiang Jiacheng# Since: 7.2
227767132620SJiang Jiacheng##
227867132620SJiang Jiacheng{ 'struct': 'MigrationThreadInfo',
227967132620SJiang Jiacheng  'data': {'name': 'str',
228067132620SJiang Jiacheng           'thread-id': 'int'} }
228167132620SJiang Jiacheng
228267132620SJiang Jiacheng##
228367132620SJiang Jiacheng# @query-migrationthreads:
228467132620SJiang Jiacheng#
228567132620SJiang Jiacheng# Returns information of migration threads
228667132620SJiang Jiacheng#
2287*228529d1SPeter Xu# Features:
2288*228529d1SPeter Xu#
2289*228529d1SPeter Xu# @deprecated: This command is deprecated with no replacement yet.
2290*228529d1SPeter Xu#
2291e6c60bf0SMarkus Armbruster# Returns: @MigrationThreadInfo
229267132620SJiang Jiacheng#
229367132620SJiang Jiacheng# Since: 7.2
229467132620SJiang Jiacheng##
229567132620SJiang Jiacheng{ 'command': 'query-migrationthreads',
2296*228529d1SPeter Xu  'returns': ['MigrationThreadInfo'],
2297*228529d1SPeter Xu  'features': ['deprecated'] }
229867132620SJiang Jiacheng
229967132620SJiang Jiacheng##
23000f0d83a4SDaniel P. Berrangé# @snapshot-save:
23010f0d83a4SDaniel P. Berrangé#
23020f0d83a4SDaniel P. Berrangé# Save a VM snapshot
23030f0d83a4SDaniel P. Berrangé#
23040f0d83a4SDaniel P. Berrangé# @job-id: identifier for the newly created job
2305a937b6aaSMarkus Armbruster#
23060f0d83a4SDaniel P. Berrangé# @tag: name of the snapshot to create
2307a937b6aaSMarkus Armbruster#
23080f0d83a4SDaniel P. Berrangé# @vmstate: block device node name to save vmstate to
2309a937b6aaSMarkus Armbruster#
23100f0d83a4SDaniel P. Berrangé# @devices: list of block device node names to save a snapshot to
23110f0d83a4SDaniel P. Berrangé#
23120f0d83a4SDaniel P. Berrangé# Applications should not assume that the snapshot save is complete
23130f0d83a4SDaniel P. Berrangé# when this command returns.  The job commands / events must be used
2314a937b6aaSMarkus Armbruster# to determine completion and to fetch details of any errors that
2315a937b6aaSMarkus Armbruster# arise.
23160f0d83a4SDaniel P. Berrangé#
2317a937b6aaSMarkus Armbruster# Note that execution of the guest CPUs may be stopped during the time
2318a937b6aaSMarkus Armbruster# it takes to save the snapshot.  A future version of QEMU may ensure
2319a937b6aaSMarkus Armbruster# CPUs are executing continuously.
23200f0d83a4SDaniel P. Berrangé#
2321a937b6aaSMarkus Armbruster# It is strongly recommended that @devices contain all writable block
2322a937b6aaSMarkus Armbruster# device nodes if a consistent snapshot is required.
23230f0d83a4SDaniel P. Berrangé#
23240f0d83a4SDaniel P. Berrangé# If @tag already exists, an error will be reported
23250f0d83a4SDaniel P. Berrangé#
232614b48aaaSJohn Snow# .. qmp-example::
23270f0d83a4SDaniel P. Berrangé#
23280f0d83a4SDaniel P. Berrangé#     -> { "execute": "snapshot-save",
2329b1ca5322SFabian Holler#          "arguments": {
23300f0d83a4SDaniel P. Berrangé#             "job-id": "snapsave0",
23310f0d83a4SDaniel P. Berrangé#             "tag": "my-snap",
23320f0d83a4SDaniel P. Berrangé#             "vmstate": "disk0",
23330f0d83a4SDaniel P. Berrangé#             "devices": ["disk0", "disk1"]
23340f0d83a4SDaniel P. Berrangé#          }
23350f0d83a4SDaniel P. Berrangé#        }
23360f0d83a4SDaniel P. Berrangé#     <- { "return": { } }
23370f0d83a4SDaniel P. Berrangé#     <- {"event": "JOB_STATUS_CHANGE",
23386e7a37ffSVictor Toso#         "timestamp": {"seconds": 1432121972, "microseconds": 744001},
23390f0d83a4SDaniel P. Berrangé#         "data": {"status": "created", "id": "snapsave0"}}
23400f0d83a4SDaniel P. Berrangé#     <- {"event": "JOB_STATUS_CHANGE",
23416e7a37ffSVictor Toso#         "timestamp": {"seconds": 1432122172, "microseconds": 744001},
23420f0d83a4SDaniel P. Berrangé#         "data": {"status": "running", "id": "snapsave0"}}
23436e7a37ffSVictor Toso#     <- {"event": "STOP",
23446e7a37ffSVictor Toso#         "timestamp": {"seconds": 1432122372, "microseconds": 744001} }
23456e7a37ffSVictor Toso#     <- {"event": "RESUME",
23466e7a37ffSVictor Toso#         "timestamp": {"seconds": 1432122572, "microseconds": 744001} }
23470f0d83a4SDaniel P. Berrangé#     <- {"event": "JOB_STATUS_CHANGE",
23486e7a37ffSVictor Toso#         "timestamp": {"seconds": 1432122772, "microseconds": 744001},
23490f0d83a4SDaniel P. Berrangé#         "data": {"status": "waiting", "id": "snapsave0"}}
23500f0d83a4SDaniel P. Berrangé#     <- {"event": "JOB_STATUS_CHANGE",
23516e7a37ffSVictor Toso#         "timestamp": {"seconds": 1432122972, "microseconds": 744001},
23520f0d83a4SDaniel P. Berrangé#         "data": {"status": "pending", "id": "snapsave0"}}
23530f0d83a4SDaniel P. Berrangé#     <- {"event": "JOB_STATUS_CHANGE",
23546e7a37ffSVictor Toso#         "timestamp": {"seconds": 1432123172, "microseconds": 744001},
23550f0d83a4SDaniel P. Berrangé#         "data": {"status": "concluded", "id": "snapsave0"}}
23560f0d83a4SDaniel P. Berrangé#     -> {"execute": "query-jobs"}
23570f0d83a4SDaniel P. Berrangé#     <- {"return": [{"current-progress": 1,
23580f0d83a4SDaniel P. Berrangé#                     "status": "concluded",
23590f0d83a4SDaniel P. Berrangé#                     "total-progress": 1,
23600f0d83a4SDaniel P. Berrangé#                     "type": "snapshot-save",
23610f0d83a4SDaniel P. Berrangé#                     "id": "snapsave0"}]}
23620f0d83a4SDaniel P. Berrangé#
23630f0d83a4SDaniel P. Berrangé# Since: 6.0
23640f0d83a4SDaniel P. Berrangé##
23650f0d83a4SDaniel P. Berrangé{ 'command': 'snapshot-save',
23660f0d83a4SDaniel P. Berrangé  'data': { 'job-id': 'str',
23670f0d83a4SDaniel P. Berrangé            'tag': 'str',
23680f0d83a4SDaniel P. Berrangé            'vmstate': 'str',
23690f0d83a4SDaniel P. Berrangé            'devices': ['str'] } }
23700f0d83a4SDaniel P. Berrangé
23710f0d83a4SDaniel P. Berrangé##
23720f0d83a4SDaniel P. Berrangé# @snapshot-load:
23730f0d83a4SDaniel P. Berrangé#
23740f0d83a4SDaniel P. Berrangé# Load a VM snapshot
23750f0d83a4SDaniel P. Berrangé#
23760f0d83a4SDaniel P. Berrangé# @job-id: identifier for the newly created job
2377a937b6aaSMarkus Armbruster#
23780f0d83a4SDaniel P. Berrangé# @tag: name of the snapshot to load.
2379a937b6aaSMarkus Armbruster#
23800f0d83a4SDaniel P. Berrangé# @vmstate: block device node name to load vmstate from
2381a937b6aaSMarkus Armbruster#
23820f0d83a4SDaniel P. Berrangé# @devices: list of block device node names to load a snapshot from
23830f0d83a4SDaniel P. Berrangé#
23840f0d83a4SDaniel P. Berrangé# Applications should not assume that the snapshot load is complete
23850f0d83a4SDaniel P. Berrangé# when this command returns.  The job commands / events must be used
2386a937b6aaSMarkus Armbruster# to determine completion and to fetch details of any errors that
2387a937b6aaSMarkus Armbruster# arise.
23880f0d83a4SDaniel P. Berrangé#
23890f0d83a4SDaniel P. Berrangé# Note that execution of the guest CPUs will be stopped during the
23900f0d83a4SDaniel P. Berrangé# time it takes to load the snapshot.
23910f0d83a4SDaniel P. Berrangé#
2392a937b6aaSMarkus Armbruster# It is strongly recommended that @devices contain all writable block
2393a937b6aaSMarkus Armbruster# device nodes that can have changed since the original @snapshot-save
2394a937b6aaSMarkus Armbruster# command execution.
23950f0d83a4SDaniel P. Berrangé#
239614b48aaaSJohn Snow# .. qmp-example::
23970f0d83a4SDaniel P. Berrangé#
23980f0d83a4SDaniel P. Berrangé#     -> { "execute": "snapshot-load",
2399b1ca5322SFabian Holler#          "arguments": {
24000f0d83a4SDaniel P. Berrangé#             "job-id": "snapload0",
24010f0d83a4SDaniel P. Berrangé#             "tag": "my-snap",
24020f0d83a4SDaniel P. Berrangé#             "vmstate": "disk0",
24030f0d83a4SDaniel P. Berrangé#             "devices": ["disk0", "disk1"]
24040f0d83a4SDaniel P. Berrangé#          }
24050f0d83a4SDaniel P. Berrangé#        }
24060f0d83a4SDaniel P. Berrangé#     <- { "return": { } }
24070f0d83a4SDaniel P. Berrangé#     <- {"event": "JOB_STATUS_CHANGE",
24086e7a37ffSVictor Toso#         "timestamp": {"seconds": 1472124172, "microseconds": 744001},
24090f0d83a4SDaniel P. Berrangé#         "data": {"status": "created", "id": "snapload0"}}
24100f0d83a4SDaniel P. Berrangé#     <- {"event": "JOB_STATUS_CHANGE",
24116e7a37ffSVictor Toso#         "timestamp": {"seconds": 1472125172, "microseconds": 744001},
24120f0d83a4SDaniel P. Berrangé#         "data": {"status": "running", "id": "snapload0"}}
24136e7a37ffSVictor Toso#     <- {"event": "STOP",
24146e7a37ffSVictor Toso#         "timestamp": {"seconds": 1472125472, "microseconds": 744001} }
24156e7a37ffSVictor Toso#     <- {"event": "RESUME",
24166e7a37ffSVictor Toso#         "timestamp": {"seconds": 1472125872, "microseconds": 744001} }
24170f0d83a4SDaniel P. Berrangé#     <- {"event": "JOB_STATUS_CHANGE",
24186e7a37ffSVictor Toso#         "timestamp": {"seconds": 1472126172, "microseconds": 744001},
24190f0d83a4SDaniel P. Berrangé#         "data": {"status": "waiting", "id": "snapload0"}}
24200f0d83a4SDaniel P. Berrangé#     <- {"event": "JOB_STATUS_CHANGE",
24216e7a37ffSVictor Toso#         "timestamp": {"seconds": 1472127172, "microseconds": 744001},
24220f0d83a4SDaniel P. Berrangé#         "data": {"status": "pending", "id": "snapload0"}}
24230f0d83a4SDaniel P. Berrangé#     <- {"event": "JOB_STATUS_CHANGE",
24246e7a37ffSVictor Toso#         "timestamp": {"seconds": 1472128172, "microseconds": 744001},
24250f0d83a4SDaniel P. Berrangé#         "data": {"status": "concluded", "id": "snapload0"}}
24260f0d83a4SDaniel P. Berrangé#     -> {"execute": "query-jobs"}
24270f0d83a4SDaniel P. Berrangé#     <- {"return": [{"current-progress": 1,
24280f0d83a4SDaniel P. Berrangé#                     "status": "concluded",
24290f0d83a4SDaniel P. Berrangé#                     "total-progress": 1,
24300f0d83a4SDaniel P. Berrangé#                     "type": "snapshot-load",
24310f0d83a4SDaniel P. Berrangé#                     "id": "snapload0"}]}
24320f0d83a4SDaniel P. Berrangé#
24330f0d83a4SDaniel P. Berrangé# Since: 6.0
24340f0d83a4SDaniel P. Berrangé##
24350f0d83a4SDaniel P. Berrangé{ 'command': 'snapshot-load',
24360f0d83a4SDaniel P. Berrangé  'data': { 'job-id': 'str',
24370f0d83a4SDaniel P. Berrangé            'tag': 'str',
24380f0d83a4SDaniel P. Berrangé            'vmstate': 'str',
24390f0d83a4SDaniel P. Berrangé            'devices': ['str'] } }
24400f0d83a4SDaniel P. Berrangé
24410f0d83a4SDaniel P. Berrangé##
24420f0d83a4SDaniel P. Berrangé# @snapshot-delete:
24430f0d83a4SDaniel P. Berrangé#
24440f0d83a4SDaniel P. Berrangé# Delete a VM snapshot
24450f0d83a4SDaniel P. Berrangé#
24460f0d83a4SDaniel P. Berrangé# @job-id: identifier for the newly created job
2447a937b6aaSMarkus Armbruster#
24480f0d83a4SDaniel P. Berrangé# @tag: name of the snapshot to delete.
2449a937b6aaSMarkus Armbruster#
24500f0d83a4SDaniel P. Berrangé# @devices: list of block device node names to delete a snapshot from
24510f0d83a4SDaniel P. Berrangé#
24520f0d83a4SDaniel P. Berrangé# Applications should not assume that the snapshot delete is complete
24530f0d83a4SDaniel P. Berrangé# when this command returns.  The job commands / events must be used
2454a937b6aaSMarkus Armbruster# to determine completion and to fetch details of any errors that
2455a937b6aaSMarkus Armbruster# arise.
24560f0d83a4SDaniel P. Berrangé#
245714b48aaaSJohn Snow# .. qmp-example::
24580f0d83a4SDaniel P. Berrangé#
24590f0d83a4SDaniel P. Berrangé#     -> { "execute": "snapshot-delete",
2460b1ca5322SFabian Holler#          "arguments": {
24610f0d83a4SDaniel P. Berrangé#             "job-id": "snapdelete0",
24620f0d83a4SDaniel P. Berrangé#             "tag": "my-snap",
24630f0d83a4SDaniel P. Berrangé#             "devices": ["disk0", "disk1"]
24640f0d83a4SDaniel P. Berrangé#          }
24650f0d83a4SDaniel P. Berrangé#        }
24660f0d83a4SDaniel P. Berrangé#     <- { "return": { } }
24670f0d83a4SDaniel P. Berrangé#     <- {"event": "JOB_STATUS_CHANGE",
24686e7a37ffSVictor Toso#         "timestamp": {"seconds": 1442124172, "microseconds": 744001},
24690f0d83a4SDaniel P. Berrangé#         "data": {"status": "created", "id": "snapdelete0"}}
24700f0d83a4SDaniel P. Berrangé#     <- {"event": "JOB_STATUS_CHANGE",
24716e7a37ffSVictor Toso#         "timestamp": {"seconds": 1442125172, "microseconds": 744001},
24720f0d83a4SDaniel P. Berrangé#         "data": {"status": "running", "id": "snapdelete0"}}
24730f0d83a4SDaniel P. Berrangé#     <- {"event": "JOB_STATUS_CHANGE",
24746e7a37ffSVictor Toso#         "timestamp": {"seconds": 1442126172, "microseconds": 744001},
24750f0d83a4SDaniel P. Berrangé#         "data": {"status": "waiting", "id": "snapdelete0"}}
24760f0d83a4SDaniel P. Berrangé#     <- {"event": "JOB_STATUS_CHANGE",
24776e7a37ffSVictor Toso#         "timestamp": {"seconds": 1442127172, "microseconds": 744001},
24780f0d83a4SDaniel P. Berrangé#         "data": {"status": "pending", "id": "snapdelete0"}}
24790f0d83a4SDaniel P. Berrangé#     <- {"event": "JOB_STATUS_CHANGE",
24806e7a37ffSVictor Toso#         "timestamp": {"seconds": 1442128172, "microseconds": 744001},
24810f0d83a4SDaniel P. Berrangé#         "data": {"status": "concluded", "id": "snapdelete0"}}
24820f0d83a4SDaniel P. Berrangé#     -> {"execute": "query-jobs"}
24830f0d83a4SDaniel P. Berrangé#     <- {"return": [{"current-progress": 1,
24840f0d83a4SDaniel P. Berrangé#                     "status": "concluded",
24850f0d83a4SDaniel P. Berrangé#                     "total-progress": 1,
24860f0d83a4SDaniel P. Berrangé#                     "type": "snapshot-delete",
24870f0d83a4SDaniel P. Berrangé#                     "id": "snapdelete0"}]}
24880f0d83a4SDaniel P. Berrangé#
24890f0d83a4SDaniel P. Berrangé# Since: 6.0
24900f0d83a4SDaniel P. Berrangé##
24910f0d83a4SDaniel P. Berrangé{ 'command': 'snapshot-delete',
24920f0d83a4SDaniel P. Berrangé  'data': { 'job-id': 'str',
24930f0d83a4SDaniel P. Berrangé            'tag': 'str',
24940f0d83a4SDaniel P. Berrangé            'devices': ['str'] } }
2495