qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
From: Corey Bryant <coreyb@linux.vnet.ibm.com>
To: Markus Armbruster <armbru@redhat.com>
Cc: Anthony Liguori <aliguori@us.ibm.com>,
	lcapitulino@redhat.com, qemu-devel@nongnu.org,
	Stefan Berger <stefanb@linux.vnet.ibm.com>
Subject: Re: [Qemu-devel] [PATCH] QMP: TPM QMP and man page documentation updates
Date: Wed, 20 Mar 2013 09:26:45 -0400	[thread overview]
Message-ID: <5149B915.2060808@linux.vnet.ibm.com> (raw)
In-Reply-To: <87wqt2jlol.fsf@blackfin.pond.sub.org>



On 03/20/2013 08:32 AM, Markus Armbruster wrote:
> Corey Bryant <coreyb@linux.vnet.ibm.com> writes:
>
>> On 03/19/2013 03:26 AM, Markus Armbruster wrote:
>>> [Note cc: Anthony for QAPI schema expertise]
>>>
>>> Stefan Berger <stefanb@linux.vnet.ibm.com> writes:
>>>
>>>> On 03/18/2013 12:16 PM, Markus Armbruster wrote:
>>>>> Corey Bryant <coreyb@linux.vnet.ibm.com> writes:
>>>>>
>>>>>> Signed-off-by: Corey Bryant <coreyb@linux.vnet.ibm.com>
>>>>>> ---
>>>>>>     qemu-options.hx |  3 ++-
>>>>>>     qmp-commands.hx | 59 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++
>>>>>>     2 files changed, 61 insertions(+), 1 deletion(-)
>>>>>>
>>>>>> diff --git a/qemu-options.hx b/qemu-options.hx
>>>>>> index 30fb85d..3b3cd0f 100644
>>>>>> --- a/qemu-options.hx
>>>>>> +++ b/qemu-options.hx
>>>>>> @@ -2237,7 +2237,8 @@ Backend type must be:
>>>>>>     @option{passthrough}.
>>>>>>       The specific backend type will determine the applicable
>>>>>> options.
>>>>>> -The @code{-tpmdev} option requires a @code{-device} option.
>>>>>> +The @code{-tpmdev} option creates the TPM backend and requires a
>>>>>> +@code{-device} option that specifies the TPM frontend interface model.
>>>>>>       Options to each backend are described below.
>>>>>>     diff --git a/qmp-commands.hx b/qmp-commands.hx
>>>>>> index b370060..4eda5ea 100644
>>>>>> --- a/qmp-commands.hx
>>>>>> +++ b/qmp-commands.hx
>>>>>> @@ -2721,18 +2721,77 @@ EQMP
>>>>>>             .mhandler.cmd_new = qmp_marshal_input_query_tpm,
>>>>>>         },
>>>>>>     +SQMP
>>>>>> +query-tpm
>>>>>> +---------
>>>>>> +
>>>>>> +Return information about the TPM device.
>>>>>> +
>>>>>> +Arguments: None
>>>>>> +
>>>>>> +Example:
>>>>>> +
>>>>>> +-> { "execute": "query-tpm" }
>>>>>> +<- { "return":
>>>>>> +     [
>>>>>> +       { "model": "tpm-tis",
>>>>>> +         "tpm-options":
>>>>>> +           { "type": "tpm-passthrough-options",
>>>>>> +             "data":
>>>>>> +               { "cancel-path": "/sys/class/misc/tpm0/device/cancel",
>>>>>> +                 "path": "/dev/tpm0"
>>>>>> +               }
>>>>>> +           },
>>>>>> +         "type": "passthrough",
>>>>>> +         "id": "tpm0"
>>>>>> +       }
>>>>>> +     ]
>>>>>> +   }
>>>>>> +
>>>>>> +EQMP
>>>>>> +
>>>>> "tpm-options" is a discriminated union.  How is its discriminator "type"
>>>>> (here: "tpm-passthrough-options") related to the outer "type" (here:
>>>>> "passthrough")?
>>>>
>>>> It gives you similar information twice. So there is a direct
>>>> relationship between the two types.
>>>
>>> Awkward and undocumented.
>>>
>>> Relevant parts of qapi-schema.json:
>>>
>>>       { 'enum': 'TpmType', 'data': [ 'passthrough' ] }
>>>
>>>       { 'union': 'TpmTypeOptions',
>>>          'data': { 'tpm-passthrough-options' : 'TPMPassthroughOptions' } }
>>>
>>>       { 'type': 'TPMInfo',
>>>         'data': {'id': 'str',
>>>                  'model': 'TpmModel',
>>>                  'type': 'TpmType',
>>>                  'tpm-options': 'TpmTypeOptions' } }
>>>
>>> Type Netdev solves the same problem more elegantly:
>>>
>>>       { 'union': 'NetClientOptions',
>>>         'data': {
>>>           'none':     'NetdevNoneOptions',
>>>           'nic':      'NetLegacyNicOptions',
>>>           'user':     'NetdevUserOptions',
>>>           'tap':      'NetdevTapOptions',
>>>           'socket':   'NetdevSocketOptions',
>>>           'vde':      'NetdevVdeOptions',
>>>           'dump':     'NetdevDumpOptions',
>>>           'bridge':   'NetdevBridgeOptions',
>>>           'hubport':  'NetdevHubPortOptions' } }
>>>
>>>       { 'type': 'Netdev',
>>>         'data': {
>>>           'id':   'str',
>>>           'opts': 'NetClientOptions' } }
>>>
>>> Uses the union's discriminator.  Straightforward.
>>>
>>> Following Netdev precedence, we get:
>>>
>>>       { 'union': 'TpmTypeOptions',
>>>         'data': { 'passthrough' : 'TPMPassthroughOptions' } }
>>>
>>>       { 'type': 'TPMInfo',
>>>         'data': {'id': 'str',
>>>                  'model': 'TpmModel',
>>>                  'opts': 'TpmTypeOptions' } }
>>>
>>
>> I can send a patch for this update if you'd like.
>
> Yes, please!
>

Will do.

>>> Duplication of type is gone.  No need for documentation.
>>>
>>> Since enum TpmType is used elsewhere, it still gets duplicated in the
>>> union's discriminator.  Anthony, is there a way to name the implicit
>>> discriminator enum type for reference elsewhere in the schema?
>>>
>>
>> Are you saying it still gets duplicated with this fix?  I'm not sure
>> what you mean.
>
> A union in the schema implicitely defines an C enumeration type to be
> used for its discriminator.  For instance, union TpmTypeOptions
> implicitely defines this one:
>
>      typedef enum TpmTypeOptionsKind
>      {
>          TPM_TYPE_OPTIONS_KIND_TPM_PASSTHROUGH_OPTIONS = 0,
>          TPM_TYPE_OPTIONS_KIND_MAX = 1,
>      } TpmTypeOptionsKind;
>
> QAPI's discriminated union becomes a C struct containing the
> discriminator and the union of the members:
>
>      struct TpmTypeOptions
>      {
>          TpmTypeOptionsKind kind;
>          union {
>              void *data;
>              TPMPassthroughOptions * tpm_passthrough_options;
>          };
>      };
>
> Enum TpmType and type TpmInfo become:
>
>      typedef enum TpmType
>      {
>          TPM_TYPE_PASSTHROUGH = 0,
>          TPM_TYPE_MAX = 1,
>      } TpmType;
>
>      struct TPMInfo
>      {
>          char * id;
>          TpmModel model;
>          TpmType type;
>          TpmTypeOptions * tpm_options;
>      };
>
> With the change I propose, TPM_TYPE_OPTIONS_KIND_TPM_PASSTHROUGH_OPTIONS
> becomes TPM_TYPE_OPTIONS_KIND_TPM_PASSTHROUGH, and TPMInfo member type
> goes away.
>
> Because TpmType is still used elsewhere, it doesn't go away, thus still
> duplicates TpmTypeOptionsKind.  My question to Anthony was about ways to
> avoid that remaining bit of duplication.  I don't expect you do answer
> it :)
>

Ok well thanks for the explanation anyway!

-- 
Regards,
Corey Bryant

  reply	other threads:[~2013-03-20 13:40 UTC|newest]

Thread overview: 10+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2013-03-15 17:17 [Qemu-devel] [PATCH] QMP: TPM QMP and man page documentation updates Corey Bryant
2013-03-15 17:54 ` Eric Blake
2013-03-18 16:16 ` Markus Armbruster
2013-03-18 17:46   ` Stefan Berger
2013-03-18 18:35     ` Corey Bryant
2013-03-19  7:26     ` Markus Armbruster
2013-03-19 14:59       ` Corey Bryant
2013-03-20 12:32         ` Markus Armbruster
2013-03-20 13:26           ` Corey Bryant [this message]
2013-03-20 16:36 ` Corey Bryant

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=5149B915.2060808@linux.vnet.ibm.com \
    --to=coreyb@linux.vnet.ibm.com \
    --cc=aliguori@us.ibm.com \
    --cc=armbru@redhat.com \
    --cc=lcapitulino@redhat.com \
    --cc=qemu-devel@nongnu.org \
    --cc=stefanb@linux.vnet.ibm.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).