From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 15B3AC433F5 for ; Mon, 25 Oct 2021 19:08:40 +0000 (UTC) Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id 63C12600D3 for ; Mon, 25 Oct 2021 19:08:39 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.4.1 mail.kernel.org 63C12600D3 Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=redhat.com Authentication-Results: mail.kernel.org; spf=pass smtp.mailfrom=nongnu.org Received: from localhost ([::1]:54104 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1mf5Kn-0000Tv-BX for qemu-devel@archiver.kernel.org; Mon, 25 Oct 2021 15:08:38 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:40110) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1mf5Hd-00070v-8F for qemu-devel@nongnu.org; Mon, 25 Oct 2021 15:05:22 -0400 Received: from us-smtp-delivery-124.mimecast.com ([170.10.133.124]:36627) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1mf5HX-0000u9-H1 for qemu-devel@nongnu.org; Mon, 25 Oct 2021 15:05:18 -0400 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1635188714; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: in-reply-to:in-reply-to:references:references; bh=II+91Dt6ux8IaekPnxQAkUuOXnYjnQzDW9deG9MHiHU=; b=TcNg4gBCB5Jnx4d1Jv34q9HjPhEcHbw04imde5Rik4KPi4Rl+Ie/3nLLSzOXdQUaGfGff/ C0fpP29yKILblZsr8sBP/Yl4CdTN2VumslNjSwYlqFxOsWDy0vpwy7EAAxLYugg4Gu2wAx 5H57TYCdNzXt+IfIL0FUWYHHLS6lbdg= Received: from mail-ua1-f70.google.com (mail-ua1-f70.google.com [209.85.222.70]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-340-uPuye8BhNsa-wSld1ydkCA-1; Mon, 25 Oct 2021 15:05:13 -0400 X-MC-Unique: uPuye8BhNsa-wSld1ydkCA-1 Received: by mail-ua1-f70.google.com with SMTP id 97-20020ab0026a000000b002cb89a52468so3034343uas.19 for ; Mon, 25 Oct 2021 12:05:13 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:mime-version:references:in-reply-to:from:date :message-id:subject:to:cc; bh=II+91Dt6ux8IaekPnxQAkUuOXnYjnQzDW9deG9MHiHU=; b=mvjauUJ+4kMN08v21VOQaSwit9fFkJpeSabVfb+8DmYK47pEJxfZoAt5kGNB1fE7YC d/v6cDPyjFj5ihGahakQSo5cjTsTmCepS+9Xx1fEc7GDMggkeFkoCHh95Bh3cM/C1dY5 DGr5id2a8qQI6hVEkFVUs4pueWQA5XfNogUkmmweKf32cZFX/e7WgCpOV38r8qUdD2s/ Of/gaLVuq98hxXJ21jP12398C76PYCvHFKsXia46HuVP/1Ssxe+MMfhH6Y/DDP0Wk/9n o6V1brEDNDQBLAWzvy4BRoZgFk9zFq7JUlqPrf4yDg25UyqM1DASs0kqmh9xHfboz023 e23A== X-Gm-Message-State: AOAM530hilAEihuzkmfCZZMBxtTTUYonHU2DTlsH/HWXJInJ/Kx7CYfh U4oMM5G/NFbuRKsZcCnlxGrzP5syJNdFjMatWABnGX4wkbaJ+TOQtHyTfYMAlwCNLvtm+bLPnwa GVJ7+0eS4XBLnrdOh/dEy2x2G1HPih6M= X-Received: by 2002:ab0:3c54:: with SMTP id u20mr9468860uaw.32.1635188712838; Mon, 25 Oct 2021 12:05:12 -0700 (PDT) X-Google-Smtp-Source: ABdhPJwRS6UE1EH61sJwhwgJFmvz3Yzv4t5dhSvBGi3UEVTK47/pfsk4ObESuodfA2nG0kWIykpnzp1qBsbaq9eR+sI= X-Received: by 2002:ab0:3c54:: with SMTP id u20mr9468821uaw.32.1635188712593; Mon, 25 Oct 2021 12:05:12 -0700 (PDT) MIME-Version: 1.0 References: <20211025052532.3859634-1-armbru@redhat.com> <20211025052532.3859634-3-armbru@redhat.com> In-Reply-To: <20211025052532.3859634-3-armbru@redhat.com> From: John Snow Date: Mon, 25 Oct 2021 15:05:01 -0400 Message-ID: Subject: Re: [PATCH 2/9] qapi: Mark unstable QMP parts with feature 'unstable' To: Markus Armbruster Authentication-Results: relay.mimecast.com; auth=pass smtp.auth=CUSA124A263 smtp.mailfrom=jsnow@redhat.com X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Type: multipart/alternative; boundary="0000000000005aebad05cf320a9d" Received-SPF: pass client-ip=170.10.133.124; envelope-from=jsnow@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: -27 X-Spam_score: -2.8 X-Spam_bar: -- X-Spam_report: (-2.8 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.001, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, HTML_MESSAGE=0.001, RCVD_IN_DNSWL_LOW=-0.7, RCVD_IN_MSPIKE_H2=-0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Kevin Wolf , pkrempa@redhat.com, Daniel Berrange , Eduardo Habkost , qemu-block@nongnu.org, Juan Quintela , libvir-list@redhat.com, qemu-devel , mdroth@linux.vnet.ibm.com, "Dr. David Alan Gilbert" , Paolo Bonzini , =?UTF-8?B?TWFyYy1BbmRyw6kgTHVyZWF1?= , Eric Blake , libguestfs@redhat.com Errors-To: qemu-devel-bounces+qemu-devel=archiver.kernel.org@nongnu.org Sender: "Qemu-devel" --0000000000005aebad05cf320a9d Content-Type: text/plain; charset="UTF-8" On Mon, Oct 25, 2021 at 1:25 AM Markus Armbruster wrote: > Add special feature 'unstable' everywhere the name starts with 'x-', > except for InputBarrierProperties member x-origin and > MemoryBackendProperties member x-use-canonical-path-for-ramblock-id, > because these two are actually stable. > > Signed-off-by: Markus Armbruster > --- > qapi/block-core.json | 123 +++++++++++++++++++++++++++++++------------ > qapi/migration.json | 35 +++++++++--- > qapi/misc.json | 6 ++- > qapi/qom.json | 11 ++-- > 4 files changed, 130 insertions(+), 45 deletions(-) > > diff --git a/qapi/block-core.json b/qapi/block-core.json > index 6d3217abb6..ce2c1352cb 100644 > --- a/qapi/block-core.json > +++ b/qapi/block-core.json > @@ -1438,6 +1438,9 @@ > # > # @x-perf: Performance options. (Since 6.0) > # > +# Features: > +# @unstable: Member @x-perf is experimental. > +# > It'd be a lot cooler if we could annotate the unstable member directly instead of confusing it with the syntax that might describe the entire struct/union/command/etc, but ... eh, it's just a doc field, so I'm not gonna press on this. I don't have the energy to get into a doc formatting standard discussion right now, so: sure, why not? > # Note: @on-source-error and @on-target-error only affect background > # I/O. If an error occurs during a guest write request, the > device's > # rerror/werror actions will be used. > @@ -1452,7 +1455,9 @@ > '*on-source-error': 'BlockdevOnError', > '*on-target-error': 'BlockdevOnError', > '*auto-finalize': 'bool', '*auto-dismiss': 'bool', > - '*filter-node-name': 'str', '*x-perf': 'BackupPerf' } } > + '*filter-node-name': 'str', > + '*x-perf': { 'type': 'BackupPerf', > + 'features': [ 'unstable' ] } } } > > ## > # @DriveBackup: > @@ -1916,9 +1921,13 @@ > # > # Get the block graph. > # > +# Features: > +# @unstable: This command is meant for debugging. > +# > # Since: 4.0 > ## > -{ 'command': 'x-debug-query-block-graph', 'returns': 'XDbgBlockGraph' } > +{ 'command': 'x-debug-query-block-graph', 'returns': 'XDbgBlockGraph', > + 'features': [ 'unstable' ] } > > ## > # @drive-mirror: > @@ -2257,6 +2266,9 @@ > # > # Get bitmap SHA256. > # > +# Features: > +# @unstable: This command is meant for debugging. > +# > # Returns: - BlockDirtyBitmapSha256 on success > # - If @node is not a valid block device, DeviceNotFound > # - If @name is not found or if hashing has failed, GenericError > with an > @@ -2265,7 +2277,8 @@ > # Since: 2.10 > ## > { 'command': 'x-debug-block-dirty-bitmap-sha256', > - 'data': 'BlockDirtyBitmap', 'returns': 'BlockDirtyBitmapSha256' } > + 'data': 'BlockDirtyBitmap', 'returns': 'BlockDirtyBitmapSha256', > + 'features': [ 'unstable' ] } > > ## > # @blockdev-mirror: > @@ -2495,27 +2508,57 @@ > # > # Properties for throttle-group objects. > # > -# The options starting with x- are aliases for the same key without x- in > -# the @limits object. As indicated by the x- prefix, this is not a stable > -# interface and may be removed or changed incompatibly in the future. Use > -# @limits for a supported stable interface. > -# > # @limits: limits to apply for this throttle group > # > +# Features: > +# @unstable: All members starting with x- are aliases for the same key > +# without x- in the @limits object. This is not a stable > +# interface and may be removed or changed incompatibly in > +# the future. Use @limits for a supported stable > +# interface. > +# > # Since: 2.11 > ## > { 'struct': 'ThrottleGroupProperties', > 'data': { '*limits': 'ThrottleLimits', > - '*x-iops-total' : 'int', '*x-iops-total-max' : 'int', > - '*x-iops-total-max-length' : 'int', '*x-iops-read' : 'int', > - '*x-iops-read-max' : 'int', '*x-iops-read-max-length' : 'int', > - '*x-iops-write' : 'int', '*x-iops-write-max' : 'int', > - '*x-iops-write-max-length' : 'int', '*x-bps-total' : 'int', > - '*x-bps-total-max' : 'int', '*x-bps-total-max-length' : 'int', > - '*x-bps-read' : 'int', '*x-bps-read-max' : 'int', > - '*x-bps-read-max-length' : 'int', '*x-bps-write' : 'int', > - '*x-bps-write-max' : 'int', '*x-bps-write-max-length' : 'int', > - '*x-iops-size' : 'int' } } > + '*x-iops-total': { 'type': 'int', > + 'features': [ 'unstable' ] }, > + '*x-iops-total-max': { 'type': 'int', > + 'features': [ 'unstable' ] }, > + '*x-iops-total-max-length': { 'type': 'int', > + 'features': [ 'unstable' ] }, > + '*x-iops-read': { 'type': 'int', > + 'features': [ 'unstable' ] }, > + '*x-iops-read-max': { 'type': 'int', > + 'features': [ 'unstable' ] }, > + '*x-iops-read-max-length': { 'type': 'int', > + 'features': [ 'unstable' ] }, > + '*x-iops-write': { 'type': 'int', > + 'features': [ 'unstable' ] }, > + '*x-iops-write-max': { 'type': 'int', > + 'features': [ 'unstable' ] }, > + '*x-iops-write-max-length': { 'type': 'int', > + 'features': [ 'unstable' ] }, > + '*x-bps-total': { 'type': 'int', > + 'features': [ 'unstable' ] }, > + '*x-bps-total-max': { 'type': 'int', > + 'features': [ 'unstable' ] }, > + '*x-bps-total-max-length': { 'type': 'int', > + 'features': [ 'unstable' ] }, > + '*x-bps-read': { 'type': 'int', > + 'features': [ 'unstable' ] }, > + '*x-bps-read-max': { 'type': 'int', > + 'features': [ 'unstable' ] }, > + '*x-bps-read-max-length': { 'type': 'int', > + 'features': [ 'unstable' ] }, > + '*x-bps-write': { 'type': 'int', > + 'features': [ 'unstable' ] }, > + '*x-bps-write-max': { 'type': 'int', > + 'features': [ 'unstable' ] }, > + '*x-bps-write-max-length': { 'type': 'int', > + 'features': [ 'unstable' ] }, > + '*x-iops-size': { 'type': 'int', > + 'features': [ 'unstable' ] } } } > > ## > # @block-stream: > @@ -2916,6 +2959,7 @@ > # read-only when the last writer is detached. > This > # allows giving QEMU write permissions only on > demand > # when an operation actually needs write access. > +# @unstable: Member x-check-cache-dropped is meant for debugging. > # > # Since: 2.9 > ## > @@ -2926,7 +2970,8 @@ > '*aio': 'BlockdevAioOptions', > '*drop-cache': {'type': 'bool', > 'if': 'CONFIG_LINUX'}, > - '*x-check-cache-dropped': 'bool' }, > + '*x-check-cache-dropped': { 'type': 'bool', > + 'features': [ 'unstable' ] } }, > 'features': [ { 'name': 'dynamic-auto-read-only', > 'if': 'CONFIG_POSIX' } ] } > > @@ -4041,13 +4086,16 @@ > # future requests before a successful reconnect will > # immediately fail. Default 0 (Since 4.2) > # > +# Features: > +# @unstable: Member @x-dirty-bitmap is experimental. > +# > # Since: 2.9 > ## > { 'struct': 'BlockdevOptionsNbd', > 'data': { 'server': 'SocketAddress', > '*export': 'str', > '*tls-creds': 'str', > - '*x-dirty-bitmap': 'str', > + '*x-dirty-bitmap': { 'type': 'str', 'features': [ 'unstable' > ] }, > '*reconnect-delay': 'uint32' } } > > ## > @@ -4865,13 +4913,17 @@ > # and replacement of an active keyslot > # (possible loss of data if IO error happens) > # > +# Features: > +# @unstable: This command is experimental. > +# > # Since: 5.1 > ## > { 'command': 'x-blockdev-amend', > 'data': { 'job-id': 'str', > 'node-name': 'str', > 'options': 'BlockdevAmendOptions', > - '*force': 'bool' } } > + '*force': 'bool' }, > + 'features': [ 'unstable' ] } > > ## > # @BlockErrorAction: > @@ -5242,16 +5294,18 @@ > # > # @node: the name of the node that will be added. > # > -# Note: this command is experimental, and its API is not stable. It > -# does not support all kinds of operations, all kinds of children, > nor > -# all block drivers. > +# Features: > +# @unstable: This command is experimental, and its API is not stable. It > +# does not support all kinds of operations, all kinds of > +# children, nor all block drivers. > # > -# FIXME Removing children from a quorum node means introducing gaps > in the > -# child indices. This cannot be represented in the 'children' list > of > -# BlockdevOptionsQuorum, as returned by .bdrv_refresh_filename(). > +# FIXME Removing children from a quorum node means introducing > +# gaps in the child indices. This cannot be represented in the > +# 'children' list of BlockdevOptionsQuorum, as returned by > +# .bdrv_refresh_filename(). > # > -# Warning: The data in a new quorum child MUST be consistent with > that of > -# the rest of the array. > +# Warning: The data in a new quorum child MUST be consistent > +# with that of the rest of the array. > # > # Since: 2.7 > # > @@ -5280,7 +5334,8 @@ > { 'command': 'x-blockdev-change', > 'data' : { 'parent': 'str', > '*child': 'str', > - '*node': 'str' } } > + '*node': 'str' }, > + 'features': [ 'unstable' ] } > > ## > # @x-blockdev-set-iothread: > @@ -5297,8 +5352,9 @@ > # @force: true if the node and its children should be moved when a > BlockBackend > # is already attached > # > -# Note: this command is experimental and intended for test cases that need > -# control over IOThreads only. > +# Features: > +# @unstable: This command is experimental and intended for test cases that > +# need control over IOThreads only. > # > # Since: 2.12 > # > @@ -5320,7 +5376,8 @@ > { 'command': 'x-blockdev-set-iothread', > 'data' : { 'node-name': 'str', > 'iothread': 'StrOrNull', > - '*force': 'bool' } } > + '*force': 'bool' }, > + 'features': [ 'unstable' ] } > > ## > # @QuorumOpType: > diff --git a/qapi/migration.json b/qapi/migration.json > index 88f07baedd..9aa8bc5759 100644 > --- a/qapi/migration.json > +++ b/qapi/migration.json > @@ -452,14 +452,20 @@ > # procedure starts. The VM RAM is saved with > running VM. > # (since 6.0) > # > +# Features: > +# @unstable: Members @x-colo and @x-ignore-shared are experimental. > +# > # Since: 1.2 > ## > { 'enum': 'MigrationCapability', > 'data': ['xbzrle', 'rdma-pin-all', 'auto-converge', 'zero-blocks', > - 'compress', 'events', 'postcopy-ram', 'x-colo', 'release-ram', > + 'compress', 'events', 'postcopy-ram', > + { 'name': 'x-colo', 'features': [ 'unstable' ] }, > + 'release-ram', > 'block', 'return-path', 'pause-before-switchover', 'multifd', > 'dirty-bitmaps', 'postcopy-blocktime', 'late-block-activate', > - 'x-ignore-shared', 'validate-uuid', 'background-snapshot'] } > + { 'name': 'x-ignore-shared', 'features': [ 'unstable' ] }, > + 'validate-uuid', 'background-snapshot'] } > > ## > # @MigrationCapabilityStatus: > @@ -743,6 +749,9 @@ > # block device name if there is one, and to their > node name > # otherwise. (Since 5.2) > # > +# Features: > +# @unstable: Member @x-checkpoint-delay is experimental. > +# > # Since: 2.4 > ## > { 'enum': 'MigrationParameter', > @@ -753,7 +762,9 @@ > 'cpu-throttle-initial', 'cpu-throttle-increment', > 'cpu-throttle-tailslow', > 'tls-creds', 'tls-hostname', 'tls-authz', 'max-bandwidth', > - 'downtime-limit', 'x-checkpoint-delay', 'block-incremental', > + 'downtime-limit', > + { 'name': 'x-checkpoint-delay', 'features': [ 'unstable' ] }, > + 'block-incremental', > 'multifd-channels', > 'xbzrle-cache-size', 'max-postcopy-bandwidth', > 'max-cpu-throttle', 'multifd-compression', > @@ -903,6 +914,9 @@ > # block device name if there is one, and to their > node name > # otherwise. (Since 5.2) > # > +# Features: > +# @unstable: Member @x-checkpoint-delay is experimental. > +# > # Since: 2.4 > ## > # TODO either fuse back into MigrationParameters, or make > @@ -925,7 +939,8 @@ > '*tls-authz': 'StrOrNull', > '*max-bandwidth': 'size', > '*downtime-limit': 'uint64', > - '*x-checkpoint-delay': 'uint32', > + '*x-checkpoint-delay': { 'type': 'uint32', > + 'features': [ 'unstable' ] }, > '*block-incremental': 'bool', > '*multifd-channels': 'uint8', > '*xbzrle-cache-size': 'size', > @@ -1099,6 +1114,9 @@ > # block device name if there is one, and to their > node name > # otherwise. (Since 5.2) > # > +# Features: > +# @unstable: Member @x-checkpoint-delay is experimental. > +# > # Since: 2.4 > ## > { 'struct': 'MigrationParameters', > @@ -1119,7 +1137,8 @@ > '*tls-authz': 'str', > '*max-bandwidth': 'size', > '*downtime-limit': 'uint64', > - '*x-checkpoint-delay': 'uint32', > + '*x-checkpoint-delay': { 'type': 'uint32', > + 'features': [ 'unstable' ] }, > '*block-incremental': 'bool', > '*multifd-channels': 'uint8', > '*xbzrle-cache-size': 'size', > @@ -1351,6 +1370,9 @@ > # If sent to the Secondary, the Secondary side will run failover work, > # then takes over server operation to become the service VM. > # > +# Features: > +# @unstable: This command is experimental. > +# > # Since: 2.8 > # > # Example: > @@ -1359,7 +1381,8 @@ > # <- { "return": {} } > # > ## > -{ 'command': 'x-colo-lost-heartbeat' } > +{ 'command': 'x-colo-lost-heartbeat', > + 'features': [ 'unstable' ] } > > ## > # @migrate_cancel: > diff --git a/qapi/misc.json b/qapi/misc.json > index 5c2ca3b556..358548abe1 100644 > --- a/qapi/misc.json > +++ b/qapi/misc.json > @@ -185,6 +185,9 @@ > # available during the preconfig state (i.e. when the --preconfig command > # line option was in use). > # > +# Features: > +# @unstable: This command is experimental. > +# > # Since 3.0 > # > # Returns: nothing > @@ -195,7 +198,8 @@ > # <- { "return": {} } > # > ## > -{ 'command': 'x-exit-preconfig', 'allow-preconfig': true } > +{ 'command': 'x-exit-preconfig', 'allow-preconfig': true, > + 'features': [ 'unstable' ] } > > ## > # @human-monitor-command: > diff --git a/qapi/qom.json b/qapi/qom.json > index 7231ac3f34..ccd1167808 100644 > --- a/qapi/qom.json > +++ b/qapi/qom.json > @@ -559,10 +559,8 @@ > # for ramblock-id. Disable this > for 4.0 > # machine types or older to allow > # migration with newer QEMU > versions. > -# This option is considered stable > -# despite the x- prefix. (default: > -# false generally, but true for > machine > -# types <= 4.0) > +# (default: false generally, > +# but true for machine types <= > 4.0) > # > # Note: prealloc=true and reserve=false cannot be set at the same time. > With > # reserve=true, the behavior depends on the operating system: for > example, > @@ -785,6 +783,9 @@ > ## > # @ObjectType: > # > +# Features: > +# @unstable: Member @x-remote-object is experimental. > +# > # Since: 6.0 > ## > { 'enum': 'ObjectType', > @@ -836,7 +837,7 @@ > 'tls-creds-psk', > 'tls-creds-x509', > 'tls-cipher-suites', > - 'x-remote-object' > + { 'name': 'x-remote-object', 'features': [ 'unstable' ] } > ] } > > ## > -- > 2.31.1 > > Seems OK, but I didn't audit for false positives/negatives. Trusting your judgment here. (It looks like Phil started to audit this in his reply to your previous commit, so I'll trust that.) Acked-by: John Snow --0000000000005aebad05cf320a9d Content-Type: text/html; charset="UTF-8" Content-Transfer-Encoding: quoted-printable


=
On Mon, Oct 25, 2021 at 1:25 AM Marku= s Armbruster <armbru@redhat.com= > wrote:
Add = special feature 'unstable' everywhere the name starts with 'x-&= #39;,
except for InputBarrierProperties member x-origin and
MemoryBackendProperties member x-use-canonical-path-for-ramblock-id,
because these two are actually stable.

Signed-off-by: Markus Armbruster <armbru@redhat.com>
---
=C2=A0qapi/block-core.json | 123 +++++++++++++++++++++++++++++++-----------= -
=C2=A0qapi/migration.json=C2=A0 |=C2=A0 35 +++++++++---
=C2=A0qapi/misc.json=C2=A0 =C2=A0 =C2=A0 =C2=A0|=C2=A0 =C2=A06 ++-
=C2=A0qapi/qom.json=C2=A0 =C2=A0 =C2=A0 =C2=A0 |=C2=A0 11 ++--
=C2=A04 files changed, 130 insertions(+), 45 deletions(-)

diff --git a/qapi/block-core.json b/qapi/block-core.json
index 6d3217abb6..ce2c1352cb 100644
--- a/qapi/block-core.json
+++ b/qapi/block-core.json
@@ -1438,6 +1438,9 @@
=C2=A0#
=C2=A0# @x-perf: Performance options. (Since 6.0)
=C2=A0#
+# Features:
+# @unstable: Member @x-perf is experimental.
+#

It'd be a lot cooler if we could= annotate the unstable member directly instead of confusing it with the syn= tax that might describe the entire struct/union/command/etc, but ... eh, it= 's just a doc field, so I'm not gonna press on this. I don't ha= ve the energy to get into a doc formatting standard discussion right now, s= o: sure, why not?
=C2=A0
=C2=A0# Note: @on-source-error and @on-target-error only affect background<= br> =C2=A0#=C2=A0 =C2=A0 =C2=A0 =C2=A0I/O.=C2=A0 If an error occurs during a gu= est write request, the device's
=C2=A0#=C2=A0 =C2=A0 =C2=A0 =C2=A0rerror/werror actions will be used.
@@ -1452,7 +1455,9 @@
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0'*on-source-error':= 'BlockdevOnError',
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0'*on-target-error':= 'BlockdevOnError',
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0'*auto-finalize': &= #39;bool', '*auto-dismiss': 'bool',
-=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 '*filter-node-name': = 9;str', '*x-perf': 'BackupPerf'=C2=A0 } }
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 '*filter-node-name': = 9;str',
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 '*x-perf': { 'type&#= 39;: 'BackupPerf',
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0'features': [ 'unstable' ] } } }

=C2=A0##
=C2=A0# @DriveBackup:
@@ -1916,9 +1921,13 @@
=C2=A0#
=C2=A0# Get the block graph.
=C2=A0#
+# Features:
+# @unstable: This command is meant for debugging.
+#
=C2=A0# Since: 4.0
=C2=A0##
-{ 'command': 'x-debug-query-block-graph', 'returns'= ;: 'XDbgBlockGraph' }
+{ 'command': 'x-debug-query-block-graph', 'returns'= ;: 'XDbgBlockGraph',
+=C2=A0 'features': [ 'unstable' ] }

=C2=A0##
=C2=A0# @drive-mirror:
@@ -2257,6 +2266,9 @@
=C2=A0#
=C2=A0# Get bitmap SHA256.
=C2=A0#
+# Features:
+# @unstable: This command is meant for debugging.
+#
=C2=A0# Returns: - BlockDirtyBitmapSha256 on success
=C2=A0#=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 - If @node is not a valid block d= evice, DeviceNotFound
=C2=A0#=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 - If @name is not found or if has= hing has failed, GenericError with an
@@ -2265,7 +2277,8 @@
=C2=A0# Since: 2.10
=C2=A0##
=C2=A0{ 'command': 'x-debug-block-dirty-bitmap-sha256',
-=C2=A0 'data': 'BlockDirtyBitmap', 'returns': '= ;BlockDirtyBitmapSha256' }
+=C2=A0 'data': 'BlockDirtyBitmap', 'returns': '= ;BlockDirtyBitmapSha256',
+=C2=A0 'features': [ 'unstable' ] }

=C2=A0##
=C2=A0# @blockdev-mirror:
@@ -2495,27 +2508,57 @@
=C2=A0#
=C2=A0# Properties for throttle-group objects.
=C2=A0#
-# The options starting with x- are aliases for the same key without x- in<= br> -# the @limits object. As indicated by the x- prefix, this is not a stable<= br> -# interface and may be removed or changed incompatibly in the future. Use<= br> -# @limits for a supported stable interface.
-#
=C2=A0# @limits: limits to apply for this throttle group
=C2=A0#
+# Features:
+# @unstable: All members starting with x- are aliases for the same key
+#=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 without x- in the @limits objec= t.=C2=A0 This is not a stable
+#=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 interface and may be removed or= changed incompatibly in
+#=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 the future.=C2=A0 Use @limits f= or a supported stable
+#=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 interface.
+#
=C2=A0# Since: 2.11
=C2=A0##
=C2=A0{ 'struct': 'ThrottleGroupProperties',
=C2=A0 =C2=A0'data': { '*limits': 'ThrottleLimits',=
-=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 '*x-iops-total' : 'i= nt', '*x-iops-total-max' : 'int',
-=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 '*x-iops-total-max-length= 9; : 'int', '*x-iops-read' : 'int',
-=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 '*x-iops-read-max' : = 9;int', '*x-iops-read-max-length' : 'int',
-=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 '*x-iops-write' : 'i= nt', '*x-iops-write-max' : 'int',
-=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 '*x-iops-write-max-length= 9; : 'int', '*x-bps-total' : 'int',
-=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 '*x-bps-total-max' : = 9;int', '*x-bps-total-max-length' : 'int',
-=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 '*x-bps-read' : 'int= ', '*x-bps-read-max' : 'int',
-=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 '*x-bps-read-max-length'= : 'int', '*x-bps-write' : 'int',
-=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 '*x-bps-write-max' : = 9;int', '*x-bps-write-max-length' : 'int',
-=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 '*x-iops-size' : 'in= t' } }
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 '*x-iops-total': { '= type': 'int',
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0'features': [ 'unstable&#= 39; ] },
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 '*x-iops-total-max': { &= #39;type': 'int',
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0'features': [ &= #39;unstable' ] },
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 '*x-iops-total-max-length= 9;: { 'type': 'int',
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 &= #39;features': [ 'unstable' ] },
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 '*x-iops-read': { 't= ype': 'int',
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 'features': [ 'unstable' ] = },
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 '*x-iops-read-max': { &#= 39;type': 'int',
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 'features': [ 'un= stable' ] },
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 '*x-iops-read-max-length'= ;: { 'type': 'int',
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0&#= 39;features': [ 'unstable' ] },
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 '*x-iops-write': { '= type': 'int',
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0'features': [ 'unstable&#= 39; ] },
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 '*x-iops-write-max': { &= #39;type': 'int',
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0'features': [ &= #39;unstable' ] },
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 '*x-iops-write-max-length= 9;: { 'type': 'int',
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 &= #39;features': [ 'unstable' ] },
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 '*x-bps-total': { 't= ype': 'int',
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 'features': [ 'unstable' ] = },
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 '*x-bps-total-max': { &#= 39;type': 'int',
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 'features': [ 'un= stable' ] },
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 '*x-bps-total-max-length'= ;: { 'type': 'int',
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0&#= 39;features': [ 'unstable' ] },
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 '*x-bps-read': { 'ty= pe': 'int',
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0'features': [ 'unstable' ] }= ,
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 '*x-bps-read-max': { = 9;type': 'int',
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0'features': [ 'uns= table' ] },
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 '*x-bps-read-max-length'= : { 'type': 'int',
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 'fea= tures': [ 'unstable' ] },
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 '*x-bps-write': { 't= ype': 'int',
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 'features': [ 'unstable' ] = },
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 '*x-bps-write-max': { &#= 39;type': 'int',
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 'features': [ 'un= stable' ] },
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 '*x-bps-write-max-length'= ;: { 'type': 'int',
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0&#= 39;features': [ 'unstable' ] },
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 '*x-iops-size': { 't= ype': 'int',
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 'features': [ 'unstable' ] = } } }

=C2=A0##
=C2=A0# @block-stream:
@@ -2916,6 +2959,7 @@
=C2=A0#=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 read-only when the last writer is detached. This =C2=A0#=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 allows giving QEMU write permissions only on deman= d
=C2=A0#=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 when an operation actually needs write access.
+# @unstable: Member x-check-cache-dropped is meant for debugging.
=C2=A0#
=C2=A0# Since: 2.9
=C2=A0##
@@ -2926,7 +2970,8 @@
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0'*aio': 'Blockd= evAioOptions',
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0'*drop-cache': {= 9;type': 'bool',
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0'if': 'CONFIG_LINUX'},
-=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 '*x-check-cache-dropped'= : 'bool' },
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 '*x-check-cache-dropped'= : { 'type': 'bool',
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 'fea= tures': [ 'unstable' ] } },
=C2=A0 =C2=A0'features': [ { 'name': 'dynamic-auto-read= -only',
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0'i= f': 'CONFIG_POSIX' } ] }

@@ -4041,13 +4086,16 @@
=C2=A0#=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0future requests before a successful reconnect will
=C2=A0#=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0immediately fail. Default 0 (Since 4.2)
=C2=A0#
+# Features:
+# @unstable: Member @x-dirty-bitmap is experimental.
+#
=C2=A0# Since: 2.9
=C2=A0##
=C2=A0{ 'struct': 'BlockdevOptionsNbd',
=C2=A0 =C2=A0'data': { 'server': 'SocketAddress', =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0'*export': 'str= ',
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0'*tls-creds': '= str',
-=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 '*x-dirty-bitmap': '= str',
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 '*x-dirty-bitmap': { = 9;type': 'str', 'features': [ 'unstable' ] }, =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0'*reconnect-delay':= 'uint32' } }

=C2=A0##
@@ -4865,13 +4913,17 @@
=C2=A0#=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0and replacement of an active keyslot
=C2=A0#=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0(possible loss of data if IO error happens)
=C2=A0#
+# Features:
+# @unstable: This command is experimental.
+#
=C2=A0# Since: 5.1
=C2=A0##
=C2=A0{ 'command': 'x-blockdev-amend',
=C2=A0 =C2=A0'data': { 'job-id': 'str',
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0'node-name': 's= tr',
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0'options': 'Blo= ckdevAmendOptions',
-=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 '*force': 'bool'= } }
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 '*force': 'bool'= },
+=C2=A0 'features': [ 'unstable' ] }

=C2=A0##
=C2=A0# @BlockErrorAction:
@@ -5242,16 +5294,18 @@
=C2=A0#
=C2=A0# @node: the name of the node that will be added.
=C2=A0#
-# Note: this command is experimental, and its API is not stable. It
-#=C2=A0 =C2=A0 =C2=A0 =C2=A0does not support all kinds of operations, all = kinds of children, nor
-#=C2=A0 =C2=A0 =C2=A0 =C2=A0all block drivers.
+# Features:
+# @unstable: This command is experimental, and its API is not stable.=C2= =A0 It
+#=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 does not support all kinds of o= perations, all kinds of
+#=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 children, nor all block drivers= .
=C2=A0#
-#=C2=A0 =C2=A0 =C2=A0 =C2=A0FIXME Removing children from a quorum node mea= ns introducing gaps in the
-#=C2=A0 =C2=A0 =C2=A0 =C2=A0child indices. This cannot be represented in t= he 'children' list of
-#=C2=A0 =C2=A0 =C2=A0 =C2=A0BlockdevOptionsQuorum, as returned by .bdrv_re= fresh_filename().
+#=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 FIXME Removing children from a = quorum node means introducing
+#=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 gaps in the child indices. This= cannot be represented in the
+#=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 'children' list of Bloc= kdevOptionsQuorum, as returned by
+#=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 .bdrv_refresh_filename().
=C2=A0#
-#=C2=A0 =C2=A0 =C2=A0 =C2=A0Warning: The data in a new quorum child MUST b= e consistent with that of
-#=C2=A0 =C2=A0 =C2=A0 =C2=A0the rest of the array.
+#=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 Warning: The data in a new quor= um child MUST be consistent
+#=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 with that of the rest of the ar= ray.
=C2=A0#
=C2=A0# Since: 2.7
=C2=A0#
@@ -5280,7 +5334,8 @@
=C2=A0{ 'command': 'x-blockdev-change',
=C2=A0 =C2=A0'data' : { 'parent': 'str',
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 '*child': 'str= ',
-=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0'*node': 'str&= #39; } }
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0'*node': 'str&= #39; },
+=C2=A0 'features': [ 'unstable' ] }

=C2=A0##
=C2=A0# @x-blockdev-set-iothread:
@@ -5297,8 +5352,9 @@
=C2=A0# @force: true if the node and its children should be moved when a Bl= ockBackend
=C2=A0#=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0is already attached
=C2=A0#
-# Note: this command is experimental and intended for test cases that need=
-#=C2=A0 =C2=A0 =C2=A0 =C2=A0control over IOThreads only.
+# Features:
+# @unstable: This command is experimental and intended for test cases that=
+#=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 need control over IOThreads onl= y.
=C2=A0#
=C2=A0# Since: 2.12
=C2=A0#
@@ -5320,7 +5376,8 @@
=C2=A0{ 'command': 'x-blockdev-set-iothread',
=C2=A0 =C2=A0'data' : { 'node-name': 'str',
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 'iothread': 'S= trOrNull',
-=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0'*force': 'boo= l' } }
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0'*force': 'boo= l' },
+=C2=A0 'features': [ 'unstable' ] }

=C2=A0##
=C2=A0# @QuorumOpType:
diff --git a/qapi/migration.json b/qapi/migration.json
index 88f07baedd..9aa8bc5759 100644
--- a/qapi/migration.json
+++ b/qapi/migration.json
@@ -452,14 +452,20 @@
=C2=A0#=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0procedure starts. The VM RAM is saved with running VM.
=C2=A0#=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0(since 6.0)
=C2=A0#
+# Features:
+# @unstable: Members @x-colo and @x-ignore-shared are experimental.
+#
=C2=A0# Since: 1.2
=C2=A0##
=C2=A0{ 'enum': 'MigrationCapability',
=C2=A0 =C2=A0'data': ['xbzrle', 'rdma-pin-all', = 9;auto-converge', 'zero-blocks',
-=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0'compress', 'events&#= 39;, 'postcopy-ram', 'x-colo', 'release-ram',
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0'compress', 'events&#= 39;, 'postcopy-ram',
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0{ 'name': 'x-colo'= ;, 'features': [ 'unstable' ] },
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0'release-ram',
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 'block', 'return-path= ', 'pause-before-switchover', 'multifd',
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 'dirty-bitmaps', 'pos= tcopy-blocktime', 'late-block-activate',
-=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0'x-ignore-shared', 'v= alidate-uuid', 'background-snapshot'] }
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0{ 'name': 'x-ignore-s= hared', 'features': [ 'unstable' ] },
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0'validate-uuid', 'bac= kground-snapshot'] }

=C2=A0##
=C2=A0# @MigrationCapabilityStatus:
@@ -743,6 +749,9 @@
=C2=A0#=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 block device name if there is one, and to their node name=
=C2=A0#=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 otherwise. (Since 5.2)
=C2=A0#
+# Features:
+# @unstable: Member @x-checkpoint-delay is experimental.
+#
=C2=A0# Since: 2.4
=C2=A0##
=C2=A0{ 'enum': 'MigrationParameter',
@@ -753,7 +762,9 @@
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 'cpu-throttle-initial', &= #39;cpu-throttle-increment',
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 'cpu-throttle-tailslow',<= br> =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 'tls-creds', 'tls-hos= tname', 'tls-authz', 'max-bandwidth',
-=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0'downtime-limit', 'x-= checkpoint-delay', 'block-incremental',
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0'downtime-limit',
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0{ 'name': 'x-checkpoi= nt-delay', 'features': [ 'unstable' ] },
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0'block-incremental',
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 'multifd-channels',
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 'xbzrle-cache-size', '= ;max-postcopy-bandwidth',
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 'max-cpu-throttle', '= multifd-compression',
@@ -903,6 +914,9 @@
=C2=A0#=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 block device name if there is one, and to their node name=
=C2=A0#=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 otherwise. (Since 5.2)
=C2=A0#
+# Features:
+# @unstable: Member @x-checkpoint-delay is experimental.
+#
=C2=A0# Since: 2.4
=C2=A0##
=C2=A0# TODO either fuse back into MigrationParameters, or make
@@ -925,7 +939,8 @@
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0'*tls-authz': '= StrOrNull',
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0'*max-bandwidth': &= #39;size',
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0'*downtime-limit': = 'uint64',
-=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 '*x-checkpoint-delay': &= #39;uint32',
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 '*x-checkpoint-delay': {= 'type': 'uint32',
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0'features= 9;: [ 'unstable' ] },
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0'*block-incremental'= ;: 'bool',
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0'*multifd-channels'= : 'uint8',
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0'*xbzrle-cache-size'= ;: 'size',
@@ -1099,6 +1114,9 @@
=C2=A0#=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 block device name if there is one, and to their node name=
=C2=A0#=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 otherwise. (Since 5.2)
=C2=A0#
+# Features:
+# @unstable: Member @x-checkpoint-delay is experimental.
+#
=C2=A0# Since: 2.4
=C2=A0##
=C2=A0{ 'struct': 'MigrationParameters',
@@ -1119,7 +1137,8 @@
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0'*tls-authz': '= str',
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0'*max-bandwidth': &= #39;size',
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0'*downtime-limit': = 'uint64',
-=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 '*x-checkpoint-delay': &= #39;uint32',
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 '*x-checkpoint-delay': {= 'type': 'uint32',
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0'features= 9;: [ 'unstable' ] },
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0'*block-incremental'= ;: 'bool',
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0'*multifd-channels'= : 'uint8',
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0'*xbzrle-cache-size'= ;: 'size',
@@ -1351,6 +1370,9 @@
=C2=A0# If sent to the Secondary, the Secondary side will run failover work= ,
=C2=A0# then takes over server operation to become the service VM.
=C2=A0#
+# Features:
+# @unstable: This command is experimental.
+#
=C2=A0# Since: 2.8
=C2=A0#
=C2=A0# Example:
@@ -1359,7 +1381,8 @@
=C2=A0# <- { "return": {} }
=C2=A0#
=C2=A0##
-{ 'command': 'x-colo-lost-heartbeat' }
+{ 'command': 'x-colo-lost-heartbeat',
+=C2=A0 'features': [ 'unstable' ] }

=C2=A0##
=C2=A0# @migrate_cancel:
diff --git a/qapi/misc.json b/qapi/misc.json
index 5c2ca3b556..358548abe1 100644
--- a/qapi/misc.json
+++ b/qapi/misc.json
@@ -185,6 +185,9 @@
=C2=A0# available during the preconfig state (i.e. when the --preconfig com= mand
=C2=A0# line option was in use).
=C2=A0#
+# Features:
+# @unstable: This command is experimental.
+#
=C2=A0# Since 3.0
=C2=A0#
=C2=A0# Returns: nothing
@@ -195,7 +198,8 @@
=C2=A0# <- { "return": {} }
=C2=A0#
=C2=A0##
-{ 'command': 'x-exit-preconfig', 'allow-preconfig'= : true }
+{ 'command': 'x-exit-preconfig', 'allow-preconfig'= : true,
+=C2=A0 'features': [ 'unstable' ] }

=C2=A0##
=C2=A0# @human-monitor-command:
diff --git a/qapi/qom.json b/qapi/qom.json
index 7231ac3f34..ccd1167808 100644
--- a/qapi/qom.json
+++ b/qapi/qom.json
@@ -559,10 +559,8 @@
=C2=A0#=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 f= or ramblock-id. Disable this for 4.0
=C2=A0#=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 m= achine types or older to allow
=C2=A0#=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 m= igration with newer QEMU versions.
-#=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 This opt= ion is considered stable
-#=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 despite = the x- prefix. (default:
-#=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 false ge= nerally, but true for machine
-#=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 types &l= t;=3D 4.0)
+#=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (default= : false generally,
+#=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 but true= for machine types <=3D 4.0)
=C2=A0#
=C2=A0# Note: prealloc=3Dtrue and reserve=3Dfalse cannot be set at the same= time. With
=C2=A0#=C2=A0 =C2=A0 =C2=A0 =C2=A0reserve=3Dtrue, the behavior depends on t= he operating system: for example,
@@ -785,6 +783,9 @@
=C2=A0##
=C2=A0# @ObjectType:
=C2=A0#
+# Features:
+# @unstable: Member @x-remote-object is experimental.
+#
=C2=A0# Since: 6.0
=C2=A0##
=C2=A0{ 'enum': 'ObjectType',
@@ -836,7 +837,7 @@
=C2=A0 =C2=A0 =C2=A0'tls-creds-psk',
=C2=A0 =C2=A0 =C2=A0'tls-creds-x509',
=C2=A0 =C2=A0 =C2=A0'tls-cipher-suites',
-=C2=A0 =C2=A0 'x-remote-object'
+=C2=A0 =C2=A0 { 'name': 'x-remote-object', 'features&#= 39;: [ 'unstable' ] }
=C2=A0 =C2=A0] }

=C2=A0##
--
2.31.1


Seems OK, but I didn't audit for f= alse positives/negatives. Trusting your judgment here. (It looks like Phil = started to audit this in his reply to your previous commit, so I'll tru= st that.)

Acked-by: John Snow <jsnow@redhat.com>
--0000000000005aebad05cf320a9d--