Copying our resident SPICE maintainer Gerd. Marc-André Lureau <marcandre.lur...@redhat.com> writes:
> Add #if defined(CONFIG_SPICE) in generated code, and adjust the > qmp/hmp code accordingly. > > Signed-off-by: Marc-André Lureau <marcandre.lur...@redhat.com> > --- > qapi-schema.json | 28 ++++++++++++++++++---------- > qapi/event.json | 12 ++++++++---- > monitor.c | 3 --- > qmp.c | 16 ---------------- > 4 files changed, 26 insertions(+), 33 deletions(-) > > diff --git a/qapi-schema.json b/qapi-schema.json > index 829c66f9eb..bcee3157b0 100644 > --- a/qapi-schema.json > +++ b/qapi-schema.json > @@ -1878,7 +1878,8 @@ > { 'struct': 'SpiceBasicInfo', > 'data': { 'host': 'str', > 'port': 'str', > - 'family': 'NetworkAddressFamily' } } > + 'family': 'NetworkAddressFamily' }, > + 'if': 'defined(CONFIG_SPICE)' } > > ## > # @SpiceServerInfo: > @@ -1891,7 +1892,8 @@ > ## > { 'struct': 'SpiceServerInfo', > 'base': 'SpiceBasicInfo', > - 'data': { '*auth': 'str' } } > + 'data': { '*auth': 'str' }, > + 'if': 'defined(CONFIG_SPICE)' } > > ## > # @SpiceChannel: > @@ -1916,7 +1918,8 @@ > { 'struct': 'SpiceChannel', > 'base': 'SpiceBasicInfo', > 'data': {'connection-id': 'int', 'channel-type': 'int', 'channel-id': > 'int', > - 'tls': 'bool'} } > + 'tls': 'bool'}, > + 'if': 'defined(CONFIG_SPICE)' } > > ## > # @SpiceQueryMouseMode: > @@ -1935,7 +1938,8 @@ > # Since: 1.1 > ## > { 'enum': 'SpiceQueryMouseMode', > - 'data': [ 'client', 'server', 'unknown' ] } > + 'data': [ 'client', 'server', 'unknown' ], > + 'if': 'defined(CONFIG_SPICE)' } > > ## > # @SpiceInfo: > @@ -1972,7 +1976,8 @@ > { 'struct': 'SpiceInfo', > 'data': {'enabled': 'bool', 'migrated': 'bool', '*host': 'str', '*port': > 'int', > '*tls-port': 'int', '*auth': 'str', '*compiled-version': 'str', > - 'mouse-mode': 'SpiceQueryMouseMode', '*channels': > ['SpiceChannel']} } > + 'mouse-mode': 'SpiceQueryMouseMode', '*channels': > ['SpiceChannel']}, > + 'if': 'defined(CONFIG_SPICE)' } > > ## > # @query-spice: > @@ -2017,7 +2022,8 @@ > # } > # > ## > -{ 'command': 'query-spice', 'returns': 'SpiceInfo' } > +{ 'command': 'query-spice', 'returns': 'SpiceInfo', > + 'if': 'defined(CONFIG_SPICE)' } > > ## > # @BalloonInfo: > @@ -5067,7 +5073,8 @@ > # Since: 1.5 > ## > { 'struct': 'ChardevSpiceChannel', 'data': { 'type' : 'str' }, > - 'base': 'ChardevCommon' } > + 'base': 'ChardevCommon', > + 'if': 'defined(CONFIG_SPICE)' } > > ## > # @ChardevSpicePort: > @@ -5079,7 +5086,8 @@ > # Since: 1.5 > ## > { 'struct': 'ChardevSpicePort', 'data': { 'fqdn' : 'str' }, > - 'base': 'ChardevCommon' } > + 'base': 'ChardevCommon', > + 'if': 'defined(CONFIG_SPICE)' } > > ## > # @ChardevVC: > @@ -5133,8 +5141,8 @@ > 'testdev': 'ChardevCommon', > 'stdio' : 'ChardevStdio', > 'console': 'ChardevCommon', > - 'spicevmc' : 'ChardevSpiceChannel', > - 'spiceport' : 'ChardevSpicePort', > + 'spicevmc' : { 'type': > 'ChardevSpiceChannel', 'if': 'defined(CONFIG_SPICE)' }, > + 'spiceport' : { 'type': > 'ChardevSpicePort', 'if': 'defined(CONFIG_SPICE)' }, > 'vc' : 'ChardevVC', > 'ringbuf': 'ChardevRingbuf', > # next one is just for compatibility > diff --git a/qapi/event.json b/qapi/event.json > index c8b8e9f384..ff59551914 100644 > --- a/qapi/event.json > +++ b/qapi/event.json > @@ -344,7 +344,8 @@ > ## > { 'event': 'SPICE_CONNECTED', > 'data': { 'server': 'SpiceBasicInfo', > - 'client': 'SpiceBasicInfo' } } > + 'client': 'SpiceBasicInfo' }, > + 'if': 'defined(CONFIG_SPICE)' } > > ## > # @SPICE_INITIALIZED: > @@ -372,7 +373,8 @@ > ## > { 'event': 'SPICE_INITIALIZED', > 'data': { 'server': 'SpiceServerInfo', > - 'client': 'SpiceChannel' } } > + 'client': 'SpiceChannel' }, > + 'if': 'defined(CONFIG_SPICE)' } > > ## > # @SPICE_DISCONNECTED: > @@ -397,7 +399,8 @@ > ## > { 'event': 'SPICE_DISCONNECTED', > 'data': { 'server': 'SpiceBasicInfo', > - 'client': 'SpiceBasicInfo' } } > + 'client': 'SpiceBasicInfo' }, > + 'if': 'defined(CONFIG_SPICE)' } > > ## > # @SPICE_MIGRATE_COMPLETED: > @@ -412,7 +415,8 @@ > # "event": "SPICE_MIGRATE_COMPLETED" } > # > ## > -{ 'event': 'SPICE_MIGRATE_COMPLETED' } > +{ 'event': 'SPICE_MIGRATE_COMPLETED', > + 'if': 'defined(CONFIG_SPICE)' } > > ## > # @MIGRATION: > diff --git a/monitor.c b/monitor.c > index a1773d5bc7..4bf6a3ea2e 100644 > --- a/monitor.c > +++ b/monitor.c > @@ -970,9 +970,6 @@ static void qmp_query_qmp_schema(QDict *qdict, QObject > **ret_data, > */ > static void qmp_unregister_commands_hack(void) > { > -#ifndef CONFIG_SPICE > - qmp_unregister_command(&qmp_commands, "query-spice"); > -#endif > #ifndef CONFIG_REPLICATION > qmp_unregister_command(&qmp_commands, "xen-set-replication"); > qmp_unregister_command(&qmp_commands, "query-xen-replication-status"); > diff --git a/qmp.c b/qmp.c > index 2c90dacb56..90816ba283 100644 > --- a/qmp.c > +++ b/qmp.c > @@ -130,22 +130,6 @@ void qmp_cpu_add(int64_t id, Error **errp) > } > } > > -#ifndef CONFIG_SPICE > -/* > - * qmp-commands.hx ensures that QMP command query-spice exists only > - * #ifdef CONFIG_SPICE. Necessary for an accurate query-commands > - * result. However, the QAPI schema is blissfully unaware of that, > - * and the QAPI code generator happily generates a dead > - * qmp_marshal_query_spice() that calls qmp_query_spice(). Provide it > - * one, or else linking fails. FIXME Educate the QAPI schema on > - * CONFIG_SPICE. > - */ > -SpiceInfo *qmp_query_spice(Error **errp) > -{ > - abort(); > -}; > -#endif > - > void qmp_cont(Error **errp) > { > BlockBackend *blk; Same drill as for PATCH 16. Commands you make conditional: * query-spice Before the patch, we first register the unconditionally command in generated code (requires a stub), then conditionally unregister in qmp_unregister_commands_hack(). Afterwards, we register only when CONFIG_SPICE. The command fails exactly the same, with CommandNotFound. Improvement, because now query-qmp-schema is accurate, and we're one step close to killing qmp_unregister_commands_hack(). Command arguments you make conditional: * chardev-add, chardev-change variants spicevmc, spiceport Before the patch, "spicevmc" and "spiceport" are valid values of "type", but char_get_class() can't map them to a QOM type name, and fails with "'FOO' is not a valid char driver name". Afterwards, they aren't valid values, and input_type_enum() rejects them with "Invalid parameter 'FOO'". That error message could use improvement, but that's not this patch's problem. Events you make conditional: * SPICE_CONNECTED, SPICE_INITIALIZED, SPICE_DISCONNECTED, SPICE_MIGRATE_COMPLETED Check for completeness by reviewing the case insensitive occurrences of SPICE in the schema not covered by your patch: * add_client Same rationale as for VNC (see my review of PATCH 16). Good. * query-chardev-backends No conditional, because ChardevBackendInfo member @name is 'str'. I think it should be an enum instead, and then we'd need to make some values conditional. Not this patch's problem. * client_migrate_info Similar to set_password and expire_password, this is generic in theory, documented for just "remote display", and implemented just for SPICE, with a stub for !CONFIG_SPICE. Okay for the same reasons set_password and expire_password are okay. * set_password, expire_password Same rationale as for VNC (see my review of PATCH 16). Okay. Some of this analysis should perhaps be worked into the commit message.