@@ -47,9 +47,15 @@
#
# @deprecated-input: how to handle deprecated input (default 'accept')
# @deprecated-output: how to handle deprecated output (default 'accept')
+# @unstable-input: how to handle unstable input (default 'accept')
+# (since 6.2)
+# @unstable-output: how to handle unstable output (default 'accept')
+# (since 6.2)
#
# Since: 6.0
##
{ 'struct': 'CompatPolicy',
'data': { '*deprecated-input': 'CompatPolicyInput',
- '*deprecated-output': 'CompatPolicyOutput' } }
+ '*deprecated-output': 'CompatPolicyOutput',
+ '*unstable-input': 'CompatPolicyInput',
+ '*unstable-output': 'CompatPolicyOutput' } }
@@ -13,6 +13,7 @@
typedef enum {
QAPI_DEPRECATED,
+ QAPI_UNSTABLE,
} QapiSpecialFeature;
typedef struct QEnumLookup {
@@ -49,6 +49,12 @@ bool compat_policy_input_ok(unsigned special_features,
error_class, kind, name, errp)) {
return false;
}
+ if ((special_features & (1u << QAPI_UNSTABLE))
+ && !compat_policy_input_ok1("Unstable",
+ policy->unstable_input,
+ error_class, kind, name, errp)) {
+ return false;
+ }
return true;
}
@@ -212,8 +212,12 @@ static bool qobject_output_type_null(Visitor *v, const char *name,
static bool qobject_output_policy_skip(Visitor *v, const char *name,
unsigned special_features)
{
- return !(special_features & 1u << QAPI_DEPRECATED)
- || v->compat_policy.deprecated_output == COMPAT_POLICY_OUTPUT_HIDE;
+ CompatPolicy *pol = &v->compat_policy;
+
+ return ((special_features & 1u << QAPI_DEPRECATED)
+ && pol->deprecated_output == COMPAT_POLICY_OUTPUT_HIDE)
+ || ((special_features & 1u << QAPI_UNSTABLE)
+ && pol->unstable_output == COMPAT_POLICY_OUTPUT_HIDE);
}
/* Finish building, and return the root object.
@@ -3641,7 +3641,9 @@ DEFHEADING(Debug/Expert options:)
DEF("compat", HAS_ARG, QEMU_OPTION_compat,
"-compat [deprecated-input=accept|reject|crash][,deprecated-output=accept|hide]\n"
- " Policy for handling deprecated management interfaces\n",
+ " Policy for handling deprecated management interfaces\n"
+ "-compat [unstable-input=accept|reject|crash][,unstable-output=accept|hide]\n"
+ " Policy for handling unstable management interfaces\n",
QEMU_ARCH_ALL)
SRST
``-compat [deprecated-input=@var{input-policy}][,deprecated-output=@var{output-policy}]``
@@ -3659,6 +3661,22 @@ SRST
Suppress deprecated command results and events
Limitation: covers only syntactic aspects of QMP.
+
+``-compat [unstable-input=@var{input-policy}][,unstable-output=@var{output-policy}]``
+ Set policy for handling unstable management interfaces (experimental):
+
+ ``unstable-input=accept`` (default)
+ Accept unstable commands and arguments
+ ``unstable-input=reject``
+ Reject unstable commands and arguments
+ ``unstable-input=crash``
+ Crash on unstable commands and arguments
+ ``unstable-output=accept`` (default)
+ Emit unstable command results and events
+ ``unstable-output=hide``
+ Suppress unstable command results and events
+
+ Limitation: covers only syntactic aspects of QMP.
ERST
DEF("fw_cfg", HAS_ARG, QEMU_OPTION_fwcfg,
@@ -109,13 +109,15 @@ def gen_event_send(name: str,
if not boxed:
ret += gen_param_var(arg_type)
- if 'deprecated' in [f.name for f in features]:
- ret += mcgen('''
+ for f in features:
+ if f.is_special():
+ ret += mcgen('''
- if (compat_policy.deprecated_output == COMPAT_POLICY_OUTPUT_HIDE) {
+ if (compat_policy.%(feat)s_output == COMPAT_POLICY_OUTPUT_HIDE) {
return;
}
-''')
+''',
+ feat=f.name)
ret += mcgen('''
@@ -254,9 +254,11 @@ def doc_type(self):
def check(self, schema):
QAPISchemaEntity.check(self, schema)
- if 'deprecated' in [f.name for f in self.features]:
- raise QAPISemError(
- self.info, "feature 'deprecated' is not supported for types")
+ for feat in self.features:
+ if feat.is_special():
+ raise QAPISemError(
+ self.info,
+ f"feature '{feat.name}' is not supported for types")
def describe(self):
assert self.meta
@@ -726,7 +728,7 @@ class QAPISchemaFeature(QAPISchemaMember):
role = 'feature'
def is_special(self):
- return self.name in ('deprecated')
+ return self.name in ('deprecated', 'unstable')
class QAPISchemaObjectTypeMember(QAPISchemaMember):