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
next prev parent 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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.