qemu-devel
[Top][All Lists]
Advanced

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

Re: [Qemu-devel] [PATCH] qmp: add query-qemu-capabilities


From: Stefan Hajnoczi
Subject: Re: [Qemu-devel] [PATCH] qmp: add query-qemu-capabilities
Date: Mon, 25 Feb 2019 17:40:01 +0000
User-agent: Mutt/1.10.1 (2018-07-13)

On Mon, Feb 25, 2019 at 10:28:46AM +0100, Peter Krempa wrote:
> On Mon, Feb 25, 2019 at 09:50:26 +0100, Markus Armbruster wrote:
> > Stefan Hajnoczi <address@hidden> writes:
> > 
> > > QMP clients can usually detect the presence of features via schema
> > > introspection.  There are rare features that do not involve schema
> > > changes and are therefore impossible to detect with schema
> > > introspection.
> > >
> > > This patch adds the query-qemu-capabilities command.  It returns a list
> > > of capabilities that this QEMU supports.
> > 
> > The name "capabilities" could be confusing, because we already have QMP
> > capabilities, complete with command qmp_capabilities.  Would "features"
> > work?
> > 
> > > The decision to make this a command rather than something statically
> > > defined in the schema is intentional.  It allows QEMU to decide which
> > > capabilities are available at runtime, if necessary.
> > >
> > > This new interface is necessary so that QMP clients can discover that
> > > migrating disk image files is safe with cache.direct=off on Linux.
> > > There is no other way to detect whether or not QEMU supports this.
> > 
> > I think what's unsaid here is that we don't want to make a completely
> > arbitrary schema change just to carry this bit of information.  We
> > could, but we don't want to.  Correct?
> 
> One example of such 'unrelated' change was a recent query- command which
> is used by libvirt just to detect presence of the feature but the
> queried result is never used and not very useful.
> 
> > > Cc: Markus Armbruster <address@hidden>
> > > Cc: Peter Krempa <address@hidden>
> > > Signed-off-by: Stefan Hajnoczi <address@hidden>
> > > ---
> > >  qapi/misc.json | 42 ++++++++++++++++++++++++++++++++++++++++++
> > >  qmp.c          | 18 ++++++++++++++++++
> > >  2 files changed, 60 insertions(+)
> 
> [...]
> 
> > > +QemuCapabilities *qmp_query_qemu_capabilities(Error **errp)
> > > +{
> > > +    QemuCapabilities *caps = g_new0(QemuCapabilities, 1);
> > > +    QemuCapabilityList **prev = &caps->capabilities;
> > > +    QemuCapability cap_val;
> > > +
> > > +    /* Add all QemuCapability enum values defined in the schema */
> > > +    for (cap_val = 0; cap_val < QEMU_CAPABILITY__MAX; cap_val++) {
> > > +        QemuCapabilityList *cap = g_new0(QemuCapabilityList, 1);
> > > +
> > > +        cap->value = cap_val;
> > > +        *prev = cap;
> > > +        prev = &cap->next;
> > > +    }
> > > +
> > > +    return caps;
> > > +}
> > 
> > All capabilities known to this build of QEMU are always present.  Okay;
> > no need to complicate things until we need to.  I just didn't expect it
> > to be this simple after the commit message's "It allows QEMU to decide
> > which capabilities are available at runtime, if necessary."
> 
> I'm slightly worried of misuse of the possibility to change the behavior
> on runtime. In libvirt we cache the capabilities to prevent a "chicken
> and egg" problem where we need to know what qemu is able to do when
> generating the command line which is obviously prior to starting qemu.
> This means that we will want to cache even information determined by
> interpreting results of this API.
> 
> If any further addition is not as simple as this one it may be
> challenging to be able to interpret the result correctly and be able to
> cache it.
> 
> Libvirt's use of capabilities is split to pre-startup steps and runtime
> usage. For the pre-startup case [A]  we obviously want to use the cached
> capabilities which are obtained by running same qemu with a different
> configuration that will be used later. After qemu is started we use
> QMP to interact [B] with it also depending to the capabilities
> determined from the cache. Scenario [B] also allows us to re-probe some
> things but they need to be strictly usable only with QMP afterwards.
> 
> The proposed API with the 'runtime' behaviour allows for these 3
> scenarios for a capability:
> 1) Static capability (as this patch shows)
>     This is easy to cache and also supports both [A] and [B]
> 
> 2) Capability depending on configuration
>     [A] is out of the window but if QMP only use is necessary we can
>     adapt.

Does "configuration" mean "QEMU command-line"?  The result of the query
command should not depend on command-line arguments.

> 3) Capability depending on host state.
>     Same commandline might not result in same behaviour. Obviously can't
>     be cached at all, but libvirt would not do it anyways. [B] is
>     possible, but it's unpleasant.

Say the kernel or a library dependency is updated, and this enables a
feature that QEMU was capable of but couldn't advertise before.  I guess
this might happen and this is why I noted that the features could be
selected at runtime.

> I propose that the docs for the function filling the result (and perhaps
> also the documentation for the QMP interface) clarify and/or guide devs
> to avoid situations 2) and 3) if possible and motivate them to document
> the limitations on when the capability is detactable.
> 
> Additionally a new field could be added that e.g. pledges that the given
> capability is of type 1) as described above and thus can be easily
> cached. That way we can make sure programatically that we pre-cache only
> the 'good' capabilities.
> 
> Other than the above, this is a welcome improvement as I've personally
> ran into scenarios where a feature in qemu was fixed but it was
> impossible to detect whether given qemu version contains the fix as it
> did not have any influence on the QMP schema.

I'd like to make things as simpler as possible, but no simpler :).

The simplest option is that the advertised features are set in stone at
build time (e.g. selected with #ifdef if necessary).  But then we have
no way of selecting features at runtime (e.g. based on kernel features).

What do you think?

Stefan

Attachment: signature.asc
Description: PGP signature


reply via email to

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