On Tue, 28 Jan 2014 14:22:06 +0800 qiaonuohan <qiaonuo...@cn.fujitsu.com> wrote:
> 'query-dump-guest-memory-capability' is used to query whether option 'format' > is available for 'dump-guest-memory' and the available format. The output > of the command will be like: > > -> { "execute": "query-dump-guest-memory-capability" } > <- { "return": { > "format-option": "optional", > "capabilities": [ > {"available": true, "format": "elf"}, > {"available": true, "format": "kdump-zlib"}, > {"available": true, "format": "kdump-lzo"}, > {"available": true, "format": "kdump-snappy"} > ] > } I don't want to hold this series anymore, this series is long and I know it took you and Laszlo's a long time to get it right. On the other hand we can't allow every single command to have its own introspection protocol. I think I'm fine accepting this one now, as long as it's fine for libvirt too. Eric, can you confirm this please? > > Signed-off-by: Qiao Nuohan <qiaonuo...@cn.fujitsu.com> > Reviewed-by: Laszlo Ersek <ler...@redhat.com> > --- > dump.c | 42 ++++++++++++++++++++++++++++++++++++++++++ > qapi-schema.json | 13 +++++++++++++ > qmp-commands.hx | 31 +++++++++++++++++++++++++++++++ > 3 files changed, 86 insertions(+), 0 deletions(-) > > diff --git a/dump.c b/dump.c > index 2ebbb23..8f64aab 100644 > --- a/dump.c > +++ b/dump.c > @@ -1788,3 +1788,45 @@ void qmp_dump_guest_memory(bool paging, const char > *file, bool has_begin, > > g_free(s); > } > + > +DumpGuestMemoryCapability *qmp_query_dump_guest_memory_capability(Error > **errp) > +{ > + int i; > + DumpGuestMemoryCapabilityStatusList *item; > + DumpGuestMemoryCapability *cap = > + > g_malloc0(sizeof(DumpGuestMemoryCapability)); > + > + cap->format_option = g_strdup_printf("optional"); > + > + for (i = 0; i < DUMP_GUEST_MEMORY_FORMAT_MAX; i++) { > + if (cap->capabilities == NULL) { > + item = g_malloc0(sizeof(DumpGuestMemoryCapabilityStatusList)); > + cap->capabilities = item; > + } else { > + item->next = > g_malloc0(sizeof(DumpGuestMemoryCapabilityStatusList)); > + item = item->next; > + } > + > + item->value = g_malloc0(sizeof(struct > DumpGuestMemoryCapabilityStatus)); > + item->value->format = i; > + > + if (i == DUMP_GUEST_MEMORY_FORMAT_ELF || > + i == DUMP_GUEST_MEMORY_FORMAT_KDUMP_ZLIB) { > + item->value->available = true; > + } > + > +#ifdef CONFIG_LZO > + if (i == DUMP_GUEST_MEMORY_FORMAT_KDUMP_LZO) { > + item->value->available = true; > + } > +#endif > + > +#ifdef CONFIG_SNAPPY > + if (i == DUMP_GUEST_MEMORY_FORMAT_KDUMP_SNAPPY) { > + item->value->available = true; > + } > +#endif > + } > + > + return cap; > +} > diff --git a/qapi-schema.json b/qapi-schema.json > index 7f62007..012c70c 100644 > --- a/qapi-schema.json > +++ b/qapi-schema.json > @@ -2783,6 +2783,19 @@ > '*length': 'int', '*format': 'DumpGuestMemoryFormat' } } > > ## > +# Since: 2.0 > +## > +{ 'type': 'DumpGuestMemoryCapabilityStatus', > + 'data': { 'format': 'DumpGuestMemoryFormat', 'available': 'bool' } } > + > +{ 'type': 'DumpGuestMemoryCapability', > + 'data': { > + 'format-option': 'str', > + 'capabilities': ['DumpGuestMemoryCapabilityStatus'] } } > + > +{ 'command': 'query-dump-guest-memory-capability', 'returns': > 'DumpGuestMemoryCapability' } > + > +## > # @netdev_add: > # > # Add a network backend. > diff --git a/qmp-commands.hx b/qmp-commands.hx > index 019dde6..e1b311a 100644 > --- a/qmp-commands.hx > +++ b/qmp-commands.hx > @@ -829,6 +829,37 @@ Notes: > EQMP > > { > + .name = "query-dump-guest-memory-capability", > + .args_type = "", > + .mhandler.cmd_new = > qmp_marshal_input_query_dump_guest_memory_capability, > + }, > + > +SQMP > +query-dump-guest-memory-capability > +---------- > + > +Show whether option 'format' is available for 'dump-guest-memory' and the > +available formats. > + > +Example: > + > +-> { "execute": "query-dump-guest-memory-capability" } > +<- { "return": { > + "format-option": "optional", > + "capabilities": [ > + {"available": true, "format": "elf"}, > + {"available": true, "format": "kdump-zlib"}, > + {"available": true, "format": "kdump-lzo"}, > + {"available": true, "format": "kdump-snappy"} > + ] > + } > + > +Note: This is a light-weight introspection to let management know whether > format > + option is available and the supported compression formats. > + > +EQMP > + > + { > .name = "netdev_add", > .args_type = "netdev:O", > .mhandler.cmd_new = qmp_netdev_add,