[libvirt] [PATCH for-4.0 v3 1/2] virtio: Helper for registering virtio device types

Eduardo Habkost ehabkost at redhat.com
Tue Nov 27 12:48:27 UTC 2018


On Tue, Nov 27, 2018 at 11:45:23AM +0100, Cornelia Huck wrote:
> On Tue, 27 Nov 2018 00:49:58 -0200
> Eduardo Habkost <ehabkost at redhat.com> wrote:
> 
> > Introduce a helper for registering different flavours of virtio
> > devices.  Convert code to use the helper, but keep only the
> > existing generic types.  Transitional and non-transitional device
> > types will be added by another patch.
> > 
> > Acked-by: Andrea Bolognani <abologna at redhat.com>
> > Signed-off-by: Eduardo Habkost <ehabkost at redhat.com>
> > ---
> > Changes v2 -> v3:
> > * Split into two separate patches (type registration helper
> >   and introduction of new types)
> > * Rewrote comments describing each flavour
> > * Rewrote virtio_pci_types_register() completely:
> >   * Replaced magic generation of type names with explicit fields in
> >     VirtioPCIDeviceTypeInfo
> >   * Removed modern_only field (won't be used anymore)
> >   * Don't register a separate base type unless it's required by
> >     the caller
> > ---
> >  hw/virtio/virtio-pci.h        |  54 ++++++++
> >  hw/display/virtio-gpu-pci.c   |   7 +-
> >  hw/display/virtio-vga.c       |   7 +-
> >  hw/virtio/virtio-crypto-pci.c |   7 +-
> >  hw/virtio/virtio-pci.c        | 231 ++++++++++++++++++++++++----------
> >  5 files changed, 228 insertions(+), 78 deletions(-)
> > 
> > diff --git a/hw/virtio/virtio-pci.h b/hw/virtio/virtio-pci.h
> > index 813082b0d7..b26731a305 100644
> > --- a/hw/virtio/virtio-pci.h
> > +++ b/hw/virtio/virtio-pci.h
> > @@ -417,4 +417,58 @@ struct VirtIOCryptoPCI {
> >  /* Virtio ABI version, if we increment this, we break the guest driver. */
> >  #define VIRTIO_PCI_ABI_VERSION          0
> >  
> > +/* Input for virtio_pci_types_register() */
> > +typedef struct VirtioPCIDeviceTypeInfo {
> > +    /*
> > +     * Common base class for the subclasses below.
> > +     *
> > +     * Required only if transitional_name or non_transitional_name is set.
> > +     *
> > +     * We need a separate base type instead of making all types
> > +     * inherit from generic_name for two reasons:
> > +     * 1) generic_name implements INTERFACE_PCIE_DEVICE, but
> > +     *    transitional_name don't.
> 
> s/don't/does not/

Fixed, thanks!

> 
> > +     * 2) generic_name has the "disable-legacy" and "disable-modern"
> > +     *    properties, transitional_name and non_transitional name don't.
> > +     */
> > +    const char *base_name;
> > +    /*
> > +     * Generic device type.  Optional.
> > +     *
> > +     * Supports both transitional and non-transitional modes,
> > +     * using the disable-legacy and disable-modern properties.
> > +     * If disable-legacy=auto, (non-)transitional mode is selected
> > +     * depending on the bus where the device is plugged.
> > +     *
> > +     * Implements both INTERFACE_PCIE_DEVICE and INTERFACE_CONVENTIONAL_PCI_DEVICE,
> > +     * but PCI Express is supported only in non-transitional mode.
> > +     *
> > +     * The only type implemented by QEMU 3.1 and older.
> > +     */
> > +    const char *generic_name;
> > +    /*
> > +     * The non-transitional device type.  Optional.
> 
> That's transitional...

Oops.  Fixed, thanks!

> 
> > +     *
> > +     * Implements both INTERFACE_PCIE_DEVICE and INTERFACE_CONVENTIONAL_PCI_DEVICE.
> > +     */
> > +    const char *transitional_name;
> > +    /*
> > +     * The transitional device type.  Optional.
> 
> ...and that's non-transitional :)

Oops.  Fixed, thanks!

> 
> > +     *
> > +     * Implements INTERFACE_CONVENTIONAL_PCI_DEVICE only.
> > +     */
> > +    const char *non_transitional_name;
> > +
> > +    /* Parent type.  If NULL, TYPE_VIRTIO_PCI is used */
> > +    const char *parent;
> > +
> > +    /* Same as TypeInfo fields: */
> > +    size_t instance_size;
> > +    void (*instance_init)(Object *obj);
> > +    void (*class_init)(ObjectClass *klass, void *data);
> > +} VirtioPCIDeviceTypeInfo;
> 
> That's a bit of boilerplate, but the end result seems to be more
> greppable.

Right.  Also, only old devices that have transitional versions
will need to use all fields.  The modern-only devices now
have less boilerplate (because parent is optional).

> 
> > +
> > +/* Register virtio-pci type(s).  @t must be static. */
> > +void virtio_pci_types_register(const VirtioPCIDeviceTypeInfo *t);
> > +
> >  #endif
> 
> (...)
> 
> Looks sane to me. With the typos fixed,
> 
> Reviewed-by: Cornelia Huck <cohuck at redhat.com>

Thanks!

-- 
Eduardo




More information about the libvir-list mailing list