qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
From: "Michael S. Tsirkin" <mst@redhat.com>
To: "Daniel P. Berrange" <berrange@redhat.com>
Cc: Cornelia Huck <cornelia.huck@de.ibm.com>,
	Gerd Hoffmann <kraxel@redhat.com>,
	qemu-devel@nongnu.org
Subject: Re: [Qemu-devel] [PATCH 17/33] virtio-pci: add flags to enable/disable legacy/modern
Date: Thu, 4 Jun 2015 13:07:36 +0200	[thread overview]
Message-ID: <20150604130221-mutt-send-email-mst@redhat.com> (raw)
In-Reply-To: <20150604105243.GA27201@redhat.com>

On Thu, Jun 04, 2015 at 11:52:43AM +0100, Daniel P. Berrange wrote:
> On Thu, Jun 04, 2015 at 12:34:26PM +0200, Gerd Hoffmann wrote:
> > Add VIRTIO_PCI_FLAG_DISABLE_LEGACY and VIRTIO_PCI_FLAG_DISABLE_MODERN
> > for VirtIOPCIProxy->flags.  Also add properties for them.  They can be
> > used to disable modern (virtio 1.0) or legacy (virtio 0.9) modes.
> > 
> > By default only legacy is advertized, modern will be turned on by
> > default once all remaining spec compilance issues are addressed.
> 
> What is the reason for adding these flags? From the pov of management
> app integration I think we'd really want the front/back to be automatically
> negotiating the right compatible featureset. Having mgmt need to set these
> legacy/modern flags based on guest OS needs seems rather painful. As such
> I'd be really loathe to support these in libvirt

Normally people want a transitional device which has both interfaces,
so most people don't set any flags, and we negotiate the best
compatible configuration.

Ability to suppress the modern interface from libvirt seems useful as
a safety latch: makes guest use legacy code.
Ability to suppress the legacy interface from libvirt might
serve to reduce the attack surface slightly.
It also frees up IO resources (which are allocated at boot
whether the interface is used or not) so it useful if
people have a huge # of devices.


To summarise, mgmt never needs to set these automatically,
but it is useful to expose them to users.

> > 
> > Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
> > Acked-by: Michael S. Tsirkin <mst@redhat.com>
> > Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
> > ---
> >  hw/virtio/virtio-pci.c | 48 ++++++++++++++++++++++++++++++++++--------------
> >  hw/virtio/virtio-pci.h |  6 ++++++
> >  2 files changed, 40 insertions(+), 14 deletions(-)
> > 
> > diff --git a/hw/virtio/virtio-pci.c b/hw/virtio/virtio-pci.c
> > index ddeaf63..2182b41 100644
> > --- a/hw/virtio/virtio-pci.c
> > +++ b/hw/virtio/virtio-pci.c
> > @@ -1190,6 +1190,8 @@ static void virtio_pci_device_plugged(DeviceState *d, Error **errp)
> >  {
> >      VirtIOPCIProxy *proxy = VIRTIO_PCI(d);
> >      VirtioBusState *bus = &proxy->bus;
> > +    bool legacy = !(proxy->flags & VIRTIO_PCI_FLAG_DISABLE_LEGACY);
> > +    bool modern = !(proxy->flags & VIRTIO_PCI_FLAG_DISABLE_MODERN);
> >      uint8_t *config;
> >      uint32_t size;
> >      VirtIODevice *vdev = virtio_bus_get_device(&proxy->bus);
> > @@ -1198,13 +1200,24 @@ static void virtio_pci_device_plugged(DeviceState *d, Error **errp)
> >      if (proxy->class_code) {
> >          pci_config_set_class(config, proxy->class_code);
> >      }
> > -    pci_set_word(config + PCI_SUBSYSTEM_VENDOR_ID,
> > -                 pci_get_word(config + PCI_VENDOR_ID));
> > -    pci_set_word(config + PCI_SUBSYSTEM_ID, virtio_bus_get_vdev_id(bus));
> > +
> > +    if (legacy) {
> > +        /* legacy and transitional */
> > +        pci_set_word(config + PCI_SUBSYSTEM_VENDOR_ID,
> > +                     pci_get_word(config + PCI_VENDOR_ID));
> > +        pci_set_word(config + PCI_SUBSYSTEM_ID, virtio_bus_get_vdev_id(bus));
> > +    } else {
> > +        /* pure virtio-1.0 */
> > +        pci_set_word(config + PCI_VENDOR_ID,
> > +                     PCI_VENDOR_ID_REDHAT_QUMRANET);
> > +        pci_set_word(config + PCI_DEVICE_ID,
> > +                     0x1040 + virtio_bus_get_vdev_id(bus));
> > +        pci_config_set_revision(config, 1);
> > +    }
> >      config[PCI_INTERRUPT_PIN] = 1;
> >  
> >  
> > -    if (1) { /* TODO: Make this optional, dependent on virtio 1.0 */
> > +    if (modern) {
> >          struct virtio_pci_cap common = {
> >              .cfg_type = VIRTIO_PCI_CAP_COMMON_CFG,
> >              .cap_len = sizeof common,
> > @@ -1318,18 +1331,21 @@ static void virtio_pci_device_plugged(DeviceState *d, Error **errp)
> >  
> >      proxy->pci_dev.config_write = virtio_write_config;
> >  
> > -    size = VIRTIO_PCI_REGION_SIZE(&proxy->pci_dev)
> > -         + virtio_bus_get_vdev_config_len(bus);
> > -    if (size & (size - 1)) {
> > -        size = 1 << qemu_fls(size);
> > +    if (legacy) {
> > +        size = VIRTIO_PCI_REGION_SIZE(&proxy->pci_dev)
> > +            + virtio_bus_get_vdev_config_len(bus);
> > +        if (size & (size - 1)) {
> > +            size = 1 << qemu_fls(size);
> > +        }
> > +
> > +        memory_region_init_io(&proxy->bar, OBJECT(proxy),
> > +                              &virtio_pci_config_ops,
> > +                              proxy, "virtio-pci", size);
> > +
> > +        pci_register_bar(&proxy->pci_dev, 0, PCI_BASE_ADDRESS_SPACE_IO,
> > +                         &proxy->bar);
> >      }
> >  
> > -    memory_region_init_io(&proxy->bar, OBJECT(proxy), &virtio_pci_config_ops,
> > -                          proxy, "virtio-pci", size);
> > -
> > -    pci_register_bar(&proxy->pci_dev, 0, PCI_BASE_ADDRESS_SPACE_IO,
> > -                     &proxy->bar);
> > -
> >      if (!kvm_has_many_ioeventfds()) {
> >          proxy->flags &= ~VIRTIO_PCI_FLAG_USE_IOEVENTFD;
> >      }
> > @@ -1372,6 +1388,10 @@ static void virtio_pci_reset(DeviceState *qdev)
> >  static Property virtio_pci_properties[] = {
> >      DEFINE_PROP_BIT("virtio-pci-bus-master-bug-migration", VirtIOPCIProxy, flags,
> >                      VIRTIO_PCI_FLAG_BUS_MASTER_BUG_MIGRATION_BIT, false),
> > +    DEFINE_PROP_BIT("disable-legacy", VirtIOPCIProxy, flags,
> > +                    VIRTIO_PCI_FLAG_DISABLE_LEGACY_BIT, false),
> > +    DEFINE_PROP_BIT("disable-modern", VirtIOPCIProxy, flags,
> > +                    VIRTIO_PCI_FLAG_DISABLE_MODERN_BIT, true),
> >      DEFINE_PROP_END_OF_LIST(),
> >  };
> >  
> > diff --git a/hw/virtio/virtio-pci.h b/hw/virtio/virtio-pci.h
> > index 7a6481f..4e9b2db 100644
> > --- a/hw/virtio/virtio-pci.h
> > +++ b/hw/virtio/virtio-pci.h
> > @@ -63,6 +63,12 @@ typedef struct VirtioBusClass VirtioPCIBusClass;
> >  #define VIRTIO_PCI_FLAG_USE_IOEVENTFD_BIT 1
> >  #define VIRTIO_PCI_FLAG_USE_IOEVENTFD   (1 << VIRTIO_PCI_FLAG_USE_IOEVENTFD_BIT)
> >  
> > +/* virtio version flags */
> > +#define VIRTIO_PCI_FLAG_DISABLE_LEGACY_BIT 2
> > +#define VIRTIO_PCI_FLAG_DISABLE_MODERN_BIT 3
> > +#define VIRTIO_PCI_FLAG_DISABLE_LEGACY (1 << VIRTIO_PCI_FLAG_DISABLE_LEGACY_BIT)
> > +#define VIRTIO_PCI_FLAG_DISABLE_MODERN (1 << VIRTIO_PCI_FLAG_DISABLE_MODERN_BIT)
> > +
> >  typedef struct {
> >      MSIMessage msg;
> >      int virq;
> > -- 
> > 1.8.3.1
> > 
> > 
> 
> Regards,
> Daniel
> -- 
> |: http://berrange.com      -o-    http://www.flickr.com/photos/dberrange/ :|
> |: http://libvirt.org              -o-             http://virt-manager.org :|
> |: http://autobuild.org       -o-         http://search.cpan.org/~danberr/ :|
> |: http://entangle-photo.org       -o-       http://live.gnome.org/gtk-vnc :|

  reply	other threads:[~2015-06-04 11:07 UTC|newest]

Thread overview: 44+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2015-06-04 10:34 [Qemu-devel] [PATCH 00/33] virtio 1.0 patch series rebased Gerd Hoffmann
2015-06-04 10:34 ` [Qemu-devel] [PATCH 01/33] virtio: 64bit features fixups Gerd Hoffmann
2015-06-04 10:34 ` [Qemu-devel] [PATCH 02/33] virtio: endianness checks for virtio 1.0 devices Gerd Hoffmann
2015-06-04 10:34 ` [Qemu-devel] [PATCH 03/33] virtio: allow virtio-1 queue layout Gerd Hoffmann
2015-06-04 10:34 ` [Qemu-devel] [PATCH 04/33] dataplane: allow virtio-1 devices Gerd Hoffmann
2015-06-04 10:34 ` [Qemu-devel] [PATCH 05/33] virtio: disallow late feature changes for virtio-1 Gerd Hoffmann
2015-06-04 10:34 ` [Qemu-devel] [PATCH 06/33] virtio: allow to fail setting status Gerd Hoffmann
2015-06-04 10:34 ` [Qemu-devel] [PATCH 07/33] virtio-net: no writeable mac for virtio-1 Gerd Hoffmann
2015-06-04 10:34 ` [Qemu-devel] [PATCH 08/33] virtio-net: support longer header Gerd Hoffmann
2015-06-04 10:34 ` [Qemu-devel] [PATCH 09/33] virtio-net: enable virtio 1.0 Gerd Hoffmann
2015-06-04 10:34 ` [Qemu-devel] [PATCH 10/33] vhost_net: add version_1 feature Gerd Hoffmann
2015-06-04 10:34 ` [Qemu-devel] [PATCH 11/33] vhost: 64 bit features Gerd Hoffmann
2015-06-04 10:34 ` [Qemu-devel] [PATCH 12/33] linux-headers: add virtio_pci Gerd Hoffmann
2015-06-04 10:34 ` [Qemu-devel] [PATCH 13/33] virtio-pci: initial virtio 1.0 support Gerd Hoffmann
2015-06-04 10:34 ` [Qemu-devel] [PATCH 14/33] virtio: generation counter support Gerd Hoffmann
2015-06-04 10:34 ` [Qemu-devel] [PATCH 15/33] virtio: add modern config accessors Gerd Hoffmann
2015-06-04 10:34 ` [Qemu-devel] [PATCH 16/33] virtio-pci: switch to modern accessors for 1.0 Gerd Hoffmann
2015-06-04 10:34 ` [Qemu-devel] [PATCH 17/33] virtio-pci: add flags to enable/disable legacy/modern Gerd Hoffmann
2015-06-04 10:52   ` Daniel P. Berrange
2015-06-04 11:07     ` Michael S. Tsirkin [this message]
2015-06-04 15:13     ` Gerd Hoffmann
2015-06-05 13:01       ` Gerd Hoffmann
2015-06-04 10:34 ` [Qemu-devel] [PATCH 18/33] virtio-pci: make QEMU_VIRTIO_PCI_QUEUE_MEM_MULT smaller Gerd Hoffmann
2015-06-04 10:34 ` [Qemu-devel] [PATCH 19/33] virtio-pci: change & document virtio pci bar layout Gerd Hoffmann
2015-06-04 10:34 ` [Qemu-devel] [PATCH 20/33] virtio-pci: make modern bar 64bit + prefetchable Gerd Hoffmann
2015-06-04 10:34 ` [Qemu-devel] [PATCH 21/33] virtio-pci: correctly set host notifiers for modern bar Gerd Hoffmann
2015-06-04 10:34 ` [Qemu-devel] [PATCH 22/33] virtio_balloon: header update Gerd Hoffmann
2015-06-04 10:34 ` [Qemu-devel] [PATCH 23/33] virtio-balloon: switch to virtio_add_feature Gerd Hoffmann
2015-06-04 10:34 ` [Qemu-devel] [PATCH 24/33] virtio-pci: add struct VirtIOPCIRegion for virtio-1 regions Gerd Hoffmann
2015-06-04 10:34 ` [Qemu-devel] [PATCH 25/33] virtio-pci: add virtio_pci_modern_regions_init() Gerd Hoffmann
2015-06-04 10:34 ` [Qemu-devel] [PATCH 26/33] virtio-pci: add virtio_pci_modern_region_map() Gerd Hoffmann
2015-06-04 10:34 ` [Qemu-devel] [PATCH 27/33] virtio-pci: move virtio_pci_add_mem_cap call to virtio_pci_modern_region_map Gerd Hoffmann
2015-06-04 10:34 ` [Qemu-devel] [PATCH 28/33] virtio-pci: move cap type to VirtIOPCIRegion Gerd Hoffmann
2015-06-04 10:34 ` [Qemu-devel] [PATCH 29/33] virtio-pci: drop identical virtio_pci_cap Gerd Hoffmann
2015-06-04 10:34 ` [Qemu-devel] [PATCH 30/33] virtio-pci: fill VirtIOPCIRegions early Gerd Hoffmann
2015-06-04 10:34 ` [Qemu-devel] [PATCH 31/33] pci: add PCI_CLASS_INPUT_* Gerd Hoffmann
2015-06-04 10:34 ` [Qemu-devel] [PATCH 32/33] virtio-input: core code & base class [pci] Gerd Hoffmann
2015-06-04 10:34 ` [Qemu-devel] [PATCH 33/33] virtio-input: emulated devices [pci] Gerd Hoffmann
2015-06-04 11:02 ` [Qemu-devel] [PATCH 00/33] virtio 1.0 patch series rebased Michael S. Tsirkin
2015-06-11  8:26   ` Gerd Hoffmann
2015-06-11 10:32     ` Michael S. Tsirkin
2015-06-09 10:32 ` Gerd Hoffmann
2015-06-09 10:53   ` Michael S. Tsirkin
2015-06-10 12:36 ` Michael S. Tsirkin

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=20150604130221-mutt-send-email-mst@redhat.com \
    --to=mst@redhat.com \
    --cc=berrange@redhat.com \
    --cc=cornelia.huck@de.ibm.com \
    --cc=kraxel@redhat.com \
    --cc=qemu-devel@nongnu.org \
    /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).