Re: [Qemu-devel] [PATCH v7 17/23] qapi: introduce new cmd option "allow-oob"

2018-03-08 Thread Peter Xu
On Thu, Mar 08, 2018 at 11:04:13AM +0100, Igor Mammedov wrote:

[...]

> > diff --git a/include/qapi/qmp/dispatch.h b/include/qapi/qmp/dispatch.h
> > index 20578dcd48..b76798800c 100644
> > --- a/include/qapi/qmp/dispatch.h
> > +++ b/include/qapi/qmp/dispatch.h
> > @@ -23,6 +23,7 @@ typedef enum QmpCommandOptions
> >  {
> >  QCO_NO_OPTIONS = 0x0,
> >  QCO_NO_SUCCESS_RESP = 0x1,
> > +QCO_ALLOW_OOB = 0x2,
> Options are essentially bitmask,
> so using shift for value would be more explicit way to express it.
> 
>   QCO_ALLOW_OOB = (1U << 1)

I'll squash the change into the patch:

diff --git a/include/qapi/qmp/dispatch.h b/include/qapi/qmp/dispatch.h 
index b4cb25888f..26eb13ff41 100644   
--- a/include/qapi/qmp/dispatch.h  
+++ b/include/qapi/qmp/dispatch.h  
@@ -20,9 +20,9 @@ typedef void (QmpCommandFunc)(QDict *, QObject **, Error **);
   
 typedef enum QmpCommandOptions
 { 
-QCO_NO_OPTIONS = 0x0, 
-QCO_NO_SUCCESS_RESP = 0x1,
-QCO_ALLOW_OOB = 0x2,  
+QCO_NO_OPTIONS=  0x0, 
+QCO_NO_SUCCESS_RESP   =  (1U << 0),   
+QCO_ALLOW_OOB =  (1U << 1),   
 } QmpCommandOptions;
   
 typedef struct QmpCommand 

Since the change is trivial, I'll keep r-bs for Stefan and Fam.
Anyone who thinks I shouldn't please shoot.  Thanks,

-- 
Peter Xu



Re: [Qemu-devel] [PATCH v7 17/23] qapi: introduce new cmd option "allow-oob"

2018-03-08 Thread Peter Xu
On Thu, Mar 08, 2018 at 11:04:13AM +0100, Igor Mammedov wrote:
> On Wed, 24 Jan 2018 13:39:51 +0800
> Peter Xu  wrote:
> 
> > Here "oob" stands for "Out-Of-Band".  When "allow-oob" is set, it means
> > the command allows out-of-band execution.
> > 
> > The "oob" idea is proposed by Markus Armbruster in following thread:
> > 
> >   https://lists.gnu.org/archive/html/qemu-devel/2017-09/msg02057.html
> > 
> > This new "allow-oob" boolean will be exposed by "query-qmp-schema" as
> > well for command entries, so that QMP clients can know which command can
> > be used as out-of-band calls. For example the command "migrate"
> > originally looks like:
> > 
> >   {"name": "migrate", "ret-type": "17", "meta-type": "command",
> >"arg-type": "86"}
> > 
> > And it'll be changed into:
> > 
> >   {"name": "migrate", "ret-type": "17", "allow-oob": false,
> >"meta-type": "command", "arg-type": "86"}
> > 
> > This patch only provides the QMP interface level changes.  It does not
> > contains the real out-of-band execution implementation yet.
> > 
> > Suggested-by: Markus Armbruster 
> > Reviewed-by: Stefan Hajnoczi 
> > Reviewed-by: Fam Zheng 
> > Signed-off-by: Peter Xu 
> > ---
> >  include/qapi/qmp/dispatch.h|  1 +
> >  qapi/introspect.json   |  6 +-
> >  scripts/qapi-commands.py   | 19 ++-
> >  scripts/qapi-introspect.py | 10 --
> >  scripts/qapi.py| 15 ++-
> >  scripts/qapi2texi.py   |  2 +-
> >  tests/qapi-schema/test-qapi.py |  2 +-
> >  7 files changed, 40 insertions(+), 15 deletions(-)
> > 
> > diff --git a/include/qapi/qmp/dispatch.h b/include/qapi/qmp/dispatch.h
> > index 20578dcd48..b76798800c 100644
> > --- a/include/qapi/qmp/dispatch.h
> > +++ b/include/qapi/qmp/dispatch.h
> > @@ -23,6 +23,7 @@ typedef enum QmpCommandOptions
> >  {
> >  QCO_NO_OPTIONS = 0x0,
> >  QCO_NO_SUCCESS_RESP = 0x1,
> > +QCO_ALLOW_OOB = 0x2,
> Options are essentially bitmask,
> so using shift for value would be more explicit way to express it.
> 
>   QCO_ALLOW_OOB = (1U << 1)

Yes, shifting would be more clear.  Thanks,

-- 
Peter Xu



Re: [Qemu-devel] [PATCH v7 17/23] qapi: introduce new cmd option "allow-oob"

2018-03-08 Thread Igor Mammedov
On Wed, 24 Jan 2018 13:39:51 +0800
Peter Xu  wrote:

> Here "oob" stands for "Out-Of-Band".  When "allow-oob" is set, it means
> the command allows out-of-band execution.
> 
> The "oob" idea is proposed by Markus Armbruster in following thread:
> 
>   https://lists.gnu.org/archive/html/qemu-devel/2017-09/msg02057.html
> 
> This new "allow-oob" boolean will be exposed by "query-qmp-schema" as
> well for command entries, so that QMP clients can know which command can
> be used as out-of-band calls. For example the command "migrate"
> originally looks like:
> 
>   {"name": "migrate", "ret-type": "17", "meta-type": "command",
>"arg-type": "86"}
> 
> And it'll be changed into:
> 
>   {"name": "migrate", "ret-type": "17", "allow-oob": false,
>"meta-type": "command", "arg-type": "86"}
> 
> This patch only provides the QMP interface level changes.  It does not
> contains the real out-of-band execution implementation yet.
> 
> Suggested-by: Markus Armbruster 
> Reviewed-by: Stefan Hajnoczi 
> Reviewed-by: Fam Zheng 
> Signed-off-by: Peter Xu 
> ---
>  include/qapi/qmp/dispatch.h|  1 +
>  qapi/introspect.json   |  6 +-
>  scripts/qapi-commands.py   | 19 ++-
>  scripts/qapi-introspect.py | 10 --
>  scripts/qapi.py| 15 ++-
>  scripts/qapi2texi.py   |  2 +-
>  tests/qapi-schema/test-qapi.py |  2 +-
>  7 files changed, 40 insertions(+), 15 deletions(-)
> 
> diff --git a/include/qapi/qmp/dispatch.h b/include/qapi/qmp/dispatch.h
> index 20578dcd48..b76798800c 100644
> --- a/include/qapi/qmp/dispatch.h
> +++ b/include/qapi/qmp/dispatch.h
> @@ -23,6 +23,7 @@ typedef enum QmpCommandOptions
>  {
>  QCO_NO_OPTIONS = 0x0,
>  QCO_NO_SUCCESS_RESP = 0x1,
> +QCO_ALLOW_OOB = 0x2,
Options are essentially bitmask,
so using shift for value would be more explicit way to express it.

  QCO_ALLOW_OOB = (1U << 1)

>  } QmpCommandOptions;
>  
>  typedef struct QmpCommand
[...]



[Qemu-devel] [PATCH v7 17/23] qapi: introduce new cmd option "allow-oob"

2018-01-23 Thread Peter Xu
Here "oob" stands for "Out-Of-Band".  When "allow-oob" is set, it means
the command allows out-of-band execution.

The "oob" idea is proposed by Markus Armbruster in following thread:

  https://lists.gnu.org/archive/html/qemu-devel/2017-09/msg02057.html

This new "allow-oob" boolean will be exposed by "query-qmp-schema" as
well for command entries, so that QMP clients can know which command can
be used as out-of-band calls. For example the command "migrate"
originally looks like:

  {"name": "migrate", "ret-type": "17", "meta-type": "command",
   "arg-type": "86"}

And it'll be changed into:

  {"name": "migrate", "ret-type": "17", "allow-oob": false,
   "meta-type": "command", "arg-type": "86"}

This patch only provides the QMP interface level changes.  It does not
contains the real out-of-band execution implementation yet.

Suggested-by: Markus Armbruster 
Reviewed-by: Stefan Hajnoczi 
Reviewed-by: Fam Zheng 
Signed-off-by: Peter Xu 
---
 include/qapi/qmp/dispatch.h|  1 +
 qapi/introspect.json   |  6 +-
 scripts/qapi-commands.py   | 19 ++-
 scripts/qapi-introspect.py | 10 --
 scripts/qapi.py| 15 ++-
 scripts/qapi2texi.py   |  2 +-
 tests/qapi-schema/test-qapi.py |  2 +-
 7 files changed, 40 insertions(+), 15 deletions(-)

diff --git a/include/qapi/qmp/dispatch.h b/include/qapi/qmp/dispatch.h
index 20578dcd48..b76798800c 100644
--- a/include/qapi/qmp/dispatch.h
+++ b/include/qapi/qmp/dispatch.h
@@ -23,6 +23,7 @@ typedef enum QmpCommandOptions
 {
 QCO_NO_OPTIONS = 0x0,
 QCO_NO_SUCCESS_RESP = 0x1,
+QCO_ALLOW_OOB = 0x2,
 } QmpCommandOptions;
 
 typedef struct QmpCommand
diff --git a/qapi/introspect.json b/qapi/introspect.json
index 5b3e6e9d78..c7f67b7d78 100644
--- a/qapi/introspect.json
+++ b/qapi/introspect.json
@@ -259,12 +259,16 @@
 #
 # @ret-type: the name of the command's result type.
 #
+# @allow-oob: whether the command allows out-of-band execution.
+# (Since: 2.12)
+#
 # TODO: @success-response (currently irrelevant, because it's QGA, not QMP)
 #
 # Since: 2.5
 ##
 { 'struct': 'SchemaInfoCommand',
-  'data': { 'arg-type': 'str', 'ret-type': 'str' } }
+  'data': { 'arg-type': 'str', 'ret-type': 'str',
+'allow-oob': 'bool' } }
 
 ##
 # @SchemaInfoEvent:
diff --git a/scripts/qapi-commands.py b/scripts/qapi-commands.py
index 974d0a4a80..b2b0bc0510 100644
--- a/scripts/qapi-commands.py
+++ b/scripts/qapi-commands.py
@@ -192,10 +192,18 @@ out:
 return ret
 
 
-def gen_register_command(name, success_response):
-options = 'QCO_NO_OPTIONS'
+def gen_register_command(name, success_response, allow_oob):
+options = []
+
 if not success_response:
-options = 'QCO_NO_SUCCESS_RESP'
+options += ['QCO_NO_SUCCESS_RESP']
+if allow_oob:
+options += ['QCO_ALLOW_OOB']
+
+if not options:
+options = ['QCO_NO_OPTIONS']
+
+options = " | ".join(options)
 
 ret = mcgen('''
 qmp_register_command(cmds, "%(name)s",
@@ -241,7 +249,7 @@ class QAPISchemaGenCommandVisitor(QAPISchemaVisitor):
 self._visited_ret_types = None
 
 def visit_command(self, name, info, arg_type, ret_type,
-  gen, success_response, boxed):
+  gen, success_response, boxed, allow_oob):
 if not gen:
 return
 self.decl += gen_command_decl(name, arg_type, boxed, ret_type)
@@ -250,7 +258,8 @@ class QAPISchemaGenCommandVisitor(QAPISchemaVisitor):
 self.defn += gen_marshal_output(ret_type)
 self.decl += gen_marshal_decl(name)
 self.defn += gen_marshal(name, arg_type, boxed, ret_type)
-self._regy += gen_register_command(name, success_response)
+self._regy += gen_register_command(name, success_response,
+   allow_oob)
 
 
 (input_file, output_dir, do_c, do_h, prefix, opts) = parse_command_line()
diff --git a/scripts/qapi-introspect.py b/scripts/qapi-introspect.py
index 032bcea491..9fbf88b644 100644
--- a/scripts/qapi-introspect.py
+++ b/scripts/qapi-introspect.py
@@ -28,6 +28,11 @@ def to_json(obj, level=0):
   to_json(obj[key], level + 1))
 for key in sorted(obj.keys())]
 ret = '{' + ', '.join(elts) + '}'
+elif isinstance(obj, bool):
+if obj:
+ret = 'true'
+else:
+ret = 'false'
 else:
 assert False# not implemented
 if level == 1:
@@ -154,12 +159,13 @@ const char %(c_name)s[] = %(c_string)s;
 for m in variants.variants]})
 
 def visit_command(self, name, info, arg_type, ret_type,
-  gen, success_response, boxed):
+  gen, success_response, boxed, allow_oob):
 arg_type = arg_type or self._schema.the_empty_object_type
 ret_type =