qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Qemu-devel] [RFC] introduce a general query-config cmd


From: Amos Kong
Subject: Re: [Qemu-devel] [RFC] introduce a general query-config cmd
Date: Mon, 4 Mar 2013 18:20:15 +0800
User-agent: Mutt/1.5.21 (2010-09-15)

On Mon, Jan 28, 2013 at 11:19:34AM +0800, Amos Kong wrote:
> On Wed, Jan 23, 2013 at 06:41:44PM +0800, Amos Kong wrote:
> > On Tue, Jan 22, 2013 at 12:26:03PM -0600, Anthony Liguori wrote:
> > > Eric Blake <address@hidden> writes:
> > > > On 01/22/2013 08:52 AM, Amos Kong wrote:
> > > >>>>
> > > >>>> Libvirt will need to expose an attribute that lets the user control
> > > >>>> whether to use this new option; how do we probe via QMP whether the
> > > >>>> new
> > > >>>> -boot strict=on command-line option is available?
> > > >>>
> > > >>> Hi all,
> > > >>>
> > > >>> How about add new info/query command?
> > > >>>
> > > >>> (hmp) info strict-boot
> > > >>>       on
> > > >>>
> > > >>> (qmp) {"execute": "query-strict-boot"}
> > > >>>       {"return": {"state": true}}
> > > >> 
> > > >> It might be not a good solution, I already updated qemu-options.hx,
> > > >> we can check help message to know if this new option is added or not.
> > > >
> > > > Having libvirt probe the -help output is out of the question.  We
> > > > already declared that for qemu 1.3 and beyond, ALL command line behavior
> > > > must ALSO be probe-able via QMP.  I think Anthony had a trick for
> > > > testing for existence of various command line options without needing to
> > > > add a new query-strict-boot command, but I don't remember what that
> > > > trick was.
> > > 
> > > We need a generic query-config-schema command.
> > 
> > 
> > Hi all,
> > 
> > The config info is included in qemu-options.def, current
> > help() defines QEMU_OPTIONS_GENERATE_HELP, and includes
> > qemu-options-wrapper.h,  DEF macro will output the help 
> > message of options to the stdio.
> > 
> > I tried to add two branches in qemu-options-wrapper.h, which
> > are used to generate two string arraies (one for option name,
> > one for help message)
> > 
> > Thy help message is too long, it's failed to output all message to
> > hmp monitor, always got a segfault, the max limitation maybe reached.
> > It's more clear to only output help message of one option,
> > 
> > eg: {"execute": "query-config", "arguments" : {"name": "boot"}}
> > 
> > {"return": {"config": "-boot [order=drives][,once=drives][,menu=on|off]\n
> >   
> > [,splash=sp_name][,splash-time=sp_time][,reboot-timeout=rb_time][,strict=on|off]\n
> >   'drives': floppy (a), hard disk (c), CD-ROM (d), network (n)\n
> >   'sp_name': the file's name that would be passed to bios as logo picture, 
> > if menu=on\n
> >   'sp_time': the period that splash picture last if menu=on, unit is ms\n
> >   'rb_timeout': the timeout before guest reboot when boot failed, unit is 
> > ms\n"}}
> > 
> > But info command of hmp doesn't support parameter
> >   (eg: (hmp) info config boot)
>  
> Hi Anthony,
> 
> As we talked in IRC, you will send a patch to resolve the query issue.
> Can you post patch out when you have time? I will review it.

Anthony, ping :)

[1] http://lists.nongnu.org/archive/html/qemu-devel/2013-01/msg01259.html
[2] http://lists.nongnu.org/archive/html/qemu-devel/2013-01/msg05167.html
 
> Thanks, Amos
>  
> > Q1) Is my patch ok for resolve the issue in last email (libvirt can check
> > the help message of each option)?
> > 
> > Q2) Can we only added a command for qmp monitor?
> > 
> > Q3) Is it ok to output all help message for hmp (info config)?
> > 
> > Q4) query-config or query-config-schema ?
> > 
> > 
> > diff --git a/hmp-commands.hx b/hmp-commands.hx
> > index 010b8c9..13d1840 100644
> > --- a/hmp-commands.hx
> > +++ b/hmp-commands.hx
> > @@ -1552,6 +1552,8 @@ show the vnc server status
> >  show the current VM name
> >  @item info uuid
> >  show the current VM UUID
> > address@hidden info config
> > +show config
> >  @item info cpustats
> >  show CPU statistics
> >  @item info usernet
> > diff --git a/hmp.c b/hmp.c
> > index 9e9e624..c0d84d1 100644
> > --- a/hmp.c
> > +++ b/hmp.c
> > @@ -98,6 +98,17 @@ void hmp_info_uuid(Monitor *mon)
> >      qapi_free_UuidInfo(info);
> >  }
> >  
> > +void hmp_info_config(Monitor *mon)
> > +{
> > +    ConfigInfo *info;
> > +
> > +    /* Fixed ME: hmp info command doesn't support parameter */
> > +
> > +    info = qmp_query_config("boot", NULL);
> > +    monitor_printf(mon, "%s\n", info->config);
> > +    qapi_free_ConfigInfo(info);
> > +}
> > +
> >  void hmp_info_chardev(Monitor *mon)
> >  {
> >      ChardevInfoList *char_info, *info;
> > diff --git a/hmp.h b/hmp.h
> > index 21f3e05..f217a8c 100644
> > --- a/hmp.h
> > +++ b/hmp.h
> > @@ -23,6 +23,7 @@ void hmp_info_version(Monitor *mon);
> >  void hmp_info_kvm(Monitor *mon);
> >  void hmp_info_status(Monitor *mon);
> >  void hmp_info_uuid(Monitor *mon);
> > +void hmp_info_config(Monitor *mon);
> >  void hmp_info_chardev(Monitor *mon);
> >  void hmp_info_mice(Monitor *mon);
> >  void hmp_info_migrate(Monitor *mon);
> > diff --git a/monitor.c b/monitor.c
> > index 9cf419b..6f331fa 100644
> > --- a/monitor.c
> > +++ b/monitor.c
> > @@ -2661,6 +2661,13 @@ static mon_cmd_t info_cmds[] = {
> >          .help       = "show the current VM UUID",
> >          .mhandler.info = hmp_info_uuid,
> >      },
> > +    {
> > +        .name       = "config",
> > +        .args_type  = "",
> > +        .params     = "",
> > +        .help       = "show the config",
> > +        .mhandler.info = hmp_info_config,
> > +    },
> >  #if defined(TARGET_PPC)
> >      {
> >          .name       = "cpustats",
> > diff --git a/qapi-schema.json b/qapi-schema.json
> > index 5dfa052..8c46d57 100644
> > --- a/qapi-schema.json
> > +++ b/qapi-schema.json
> > @@ -3017,3 +3017,23 @@
> >  # Since: 1.3.0
> >  ##
> >  { 'command': 'nbd-server-stop' }
> > +
> > +##
> > +# @ConfigInfo:
> > +#
> > +# Commandline configration information.
> > +#
> > +##
> > +{ 'type': 'ConfigInfo', 'data': {'config': 'str'} }
> > +
> > +##
> > +# @query-config
> > +#
> > +# Query configuration information of one option
> > +#
> > +# @name: option name
> > +#
> > +# Returns: configuration information.
> > +#
> > +##
> > +{'command': 'query-config', 'data': {'name': 'str'}, 'returns': 
> > 'ConfigInfo'}
> > diff --git a/qemu-options-wrapper.h b/qemu-options-wrapper.h
> > index 13bfea0..97b44fb 100644
> > --- a/qemu-options-wrapper.h
> > +++ b/qemu-options-wrapper.h
> > @@ -18,6 +18,22 @@
> >  
> >  #define DEFHEADING(text) ARCHHEADING(text, QEMU_ARCH_ALL)
> >  
> > +#elif defined(QEMU_OPTIONS_GENERATE_CONFIG)
> > +
> > +#define DEF(option, opt_arg, opt_enum, opt_help, arch_mask)    \
> > +      opt_help,
> > +
> > +#define DEFHEADING(text)
> > +#define ARCHHEADING(text, arch_mask)
> > +
> > +#elif defined(QEMU_OPTIONS_GENERATE_NAME)
> > +
> > +#define DEF(option, opt_arg, opt_enum, opt_help, arch_mask)    \
> > +      option,
> > +
> > +#define DEFHEADING(text)
> > +#define ARCHHEADING(text, arch_mask)
> > +
> >  #elif defined(QEMU_OPTIONS_GENERATE_OPTIONS)
> >  
> >  #define DEF(option, opt_arg, opt_enum, opt_help, arch_mask)     \
> > diff --git a/qmp-commands.hx b/qmp-commands.hx
> > index 5c692d0..ed42525 100644
> > --- a/qmp-commands.hx
> > +++ b/qmp-commands.hx
> > @@ -2339,7 +2339,30 @@ EQMP
> >          .args_type  = "",
> >          .mhandler.cmd_new = qmp_marshal_input_query_uuid,
> >      },
> > +SQMP
> > +query-config
> > +------------
> > +
> > +Show config.
> > +
> > +- "Config": config
> > +
> > +Example:
> > +-> {"execute": "query-config", "arguments" : {"name": "boot"}}
> > +<- {"return": {"config": "-boot 
> > [order=drives][,once=drives][,menu=on|off]\n
> > +  
> > [,splash=sp_name][,splash-time=sp_time][,reboot-timeout=rb_time][,strict=on|off]\n
> > +  'drives': floppy (a), hard disk (c), CD-ROM (d), network (n)\n
> > +  'sp_name': the file's name that would be passed to bios as logo picture, 
> > if menu=on\n
> > +  'sp_time': the period that splash picture last if menu=on, unit is ms\n
> > +  'rb_timeout': the timeout before guest reboot when boot failed, unit is 
> > ms\n"}}
> > +
> > +EQMP
> >  
> > +    {
> > +        .name       = "query-config",
> > +        .args_type  = "name:s",
> > +        .mhandler.cmd_new = qmp_marshal_input_query_config,
> > +    },
> >  SQMP
> >  query-migrate
> >  -------------
> > diff --git a/qmp.c b/qmp.c
> > index 55b056b..6a3a13a 100644
> > --- a/qmp.c
> > +++ b/qmp.c
> > @@ -24,6 +24,7 @@
> >  #include "hw/qdev.h"
> >  #include "sysemu/blockdev.h"
> >  #include "qom/qom-qobject.h"
> > +#include "qemu-options.h"
> >  
> >  NameInfo *qmp_query_name(Error **errp)
> >  {
> > @@ -78,6 +79,31 @@ UuidInfo *qmp_query_uuid(Error **errp)
> >      return info;
> >  }
> >  
> > +ConfigInfo *qmp_query_config(const char *name, Error **errp)
> > +{
> > +    ConfigInfo *info = g_malloc0(sizeof(*info));
> > +
> > +    char const *optionstr[] = {
> > +#define QEMU_OPTIONS_GENERATE_NAME
> > +#include "qemu-options-wrapper.h"
> > +    };
> > +
> > +    char const *configstr[] = {
> > +#define QEMU_OPTIONS_GENERATE_CONFIG
> > +#include "qemu-options-wrapper.h"
> > +    };
> > +
> > +    int i;
> > +    for (i=0; i < sizeof(optionstr) / sizeof(char *); i++) {
> > +        if (!strcmp(name, optionstr[i])) {
> > +            info->config = g_strdup(configstr[i]);
> > +            break;
> > +        }
> > +    }
> > +
> > +    return info;
> > +}
> > +
> >  void qmp_quit(Error **err)
> >  {
> >      no_shutdown = 0;



reply via email to

[Prev in Thread] Current Thread [Next in Thread]