All of lore.kernel.org
 help / color / mirror / Atom feed
From: "Marc-André Lureau" <marcandre.lureau@redhat.com>
To: qemu-devel@nongnu.org
Cc: lvivier@redhat.com,
	"Marc-André Lureau" <marcandre.lureau@redhat.com>,
	qemu-stable@nongnu.org, ehabkost@redhat.com, mst@redhat.com
Subject: [Qemu-devel] [PATCH] virtio-pci: fix missing device properties
Date: Wed, 26 Jun 2019 01:23:33 +0200	[thread overview]
Message-ID: <20190625232333.30752-1-marcandre.lureau@redhat.com> (raw)

Since commit a4ee4c8baa37154 ("virtio: Helper for registering virtio
device types"), virtio-gpu-pci, virtio-vga, and virtio-crypto-pci lost
some properties: "ioeventfd" and "vectors". This may cause various
issues, such as failing migration or invalid properties.

Since those VirtioPCI devices do not have a base name, their class are
initialized with virtio_pci_generic_base_class_init(). However, if the
VirtioPCIDeviceTypeInfo provided a class_init which sets dc->props,
the properties were overwritten by virtio_pci_generic_class_init().

Instead, introduce an intermediary base-type to register the generic
properties.

Fixes: a4ee4c8baa37154f42b4dc6a13fee79268d15238
Cc: qemu-stable@nongnu.org
Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
---
 hw/virtio/virtio-pci.c | 28 ++++++++++++++--------------
 1 file changed, 14 insertions(+), 14 deletions(-)

diff --git a/hw/virtio/virtio-pci.c b/hw/virtio/virtio-pci.c
index e6d5467e54..62c4977332 100644
--- a/hw/virtio/virtio-pci.c
+++ b/hw/virtio/virtio-pci.c
@@ -1913,13 +1913,6 @@ static void virtio_pci_generic_class_init(ObjectClass *klass, void *data)
     dc->props = virtio_pci_generic_properties;
 }
 
-/* Used when the generic type and the base type is the same */
-static void virtio_pci_generic_base_class_init(ObjectClass *klass, void *data)
-{
-    virtio_pci_base_class_init(klass, data);
-    virtio_pci_generic_class_init(klass, NULL);
-}
-
 static void virtio_pci_transitional_instance_init(Object *obj)
 {
     VirtIOPCIProxy *proxy = VIRTIO_PCI(obj);
@@ -1938,14 +1931,13 @@ static void virtio_pci_non_transitional_instance_init(Object *obj)
 
 void virtio_pci_types_register(const VirtioPCIDeviceTypeInfo *t)
 {
+    char *base_name = NULL;
     TypeInfo base_type_info = {
         .name          = t->base_name,
         .parent        = t->parent ? t->parent : TYPE_VIRTIO_PCI,
         .instance_size = t->instance_size,
         .instance_init = t->instance_init,
         .class_size    = t->class_size,
-        .class_init    = virtio_pci_base_class_init,
-        .class_data    = (void *)t,
         .abstract      = true,
     };
     TypeInfo generic_type_info = {
@@ -1961,13 +1953,20 @@ void virtio_pci_types_register(const VirtioPCIDeviceTypeInfo *t)
 
     if (!base_type_info.name) {
         /* No base type -> register a single generic device type */
-        base_type_info.name = t->generic_name;
-        base_type_info.class_init = virtio_pci_generic_base_class_init;
-        base_type_info.interfaces = generic_type_info.interfaces;
-        base_type_info.abstract = false;
-        generic_type_info.name = NULL;
+        /* use intermediate %s-base-type to add generic device props */
+        base_name = g_strdup_printf("%s-base-type", t->generic_name);
+        base_type_info.name = base_name;
+        base_type_info.class_init = virtio_pci_generic_class_init;
+
+        generic_type_info.parent = base_name;
+        generic_type_info.class_init = virtio_pci_base_class_init;
+        generic_type_info.class_data = (void *)t;
+
         assert(!t->non_transitional_name);
         assert(!t->transitional_name);
+    } else {
+        base_type_info.class_init = virtio_pci_base_class_init;
+        base_type_info.class_data = (void *)t;
     }
 
     type_register(&base_type_info);
@@ -2005,6 +2004,7 @@ void virtio_pci_types_register(const VirtioPCIDeviceTypeInfo *t)
         };
         type_register(&transitional_type_info);
     }
+    g_free(base_name);
 }
 
 /* virtio-pci-bus */
-- 
2.22.0.rc2.384.g1a9a72ea1d



WARNING: multiple messages have this Message-ID (diff)
From: "Michael S. Tsirkin" <mst@redhat.com>
To: qemu-devel@nongnu.org
Cc: "Peter Maydell" <peter.maydell@linaro.org>,
	qemu-stable@nongnu.org,
	"Marc-André Lureau" <marcandre.lureau@redhat.com>
Subject: [Qemu-devel] [PULL 12/22] virtio-pci: fix missing device properties
Date: Tue, 2 Jul 2019 11:07:47 -0400	[thread overview]
Message-ID: <20190625232333.30752-1-marcandre.lureau@redhat.com> (raw)
Message-ID: <20190702150747.a6AU0jeM4VY3xh1o8JpUyTrviYp4nxksXW10fI0Id38@z> (raw)
In-Reply-To: <20190702150606.24851-1-mst@redhat.com>

From: Marc-André Lureau <marcandre.lureau@redhat.com>

Since commit a4ee4c8baa37154 ("virtio: Helper for registering virtio
device types"), virtio-gpu-pci, virtio-vga, and virtio-crypto-pci lost
some properties: "ioeventfd" and "vectors". This may cause various
issues, such as failing migration or invalid properties.

Since those VirtioPCI devices do not have a base name, their class are
initialized with virtio_pci_generic_base_class_init(). However, if the
VirtioPCIDeviceTypeInfo provided a class_init which sets dc->props,
the properties were overwritten by virtio_pci_generic_class_init().

Instead, introduce an intermediary base-type to register the generic
properties.

Fixes: a4ee4c8baa37154f42b4dc6a13fee79268d15238
Cc: qemu-stable@nongnu.org
Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
Message-Id: <20190625232333.30752-1-marcandre.lureau@redhat.com>
---
 hw/virtio/virtio-pci.c | 28 ++++++++++++++--------------
 1 file changed, 14 insertions(+), 14 deletions(-)

diff --git a/hw/virtio/virtio-pci.c b/hw/virtio/virtio-pci.c
index 62e78e98f5..ce928f2429 100644
--- a/hw/virtio/virtio-pci.c
+++ b/hw/virtio/virtio-pci.c
@@ -1913,13 +1913,6 @@ static void virtio_pci_generic_class_init(ObjectClass *klass, void *data)
     dc->props = virtio_pci_generic_properties;
 }
 
-/* Used when the generic type and the base type is the same */
-static void virtio_pci_generic_base_class_init(ObjectClass *klass, void *data)
-{
-    virtio_pci_base_class_init(klass, data);
-    virtio_pci_generic_class_init(klass, NULL);
-}
-
 static void virtio_pci_transitional_instance_init(Object *obj)
 {
     VirtIOPCIProxy *proxy = VIRTIO_PCI(obj);
@@ -1938,14 +1931,13 @@ static void virtio_pci_non_transitional_instance_init(Object *obj)
 
 void virtio_pci_types_register(const VirtioPCIDeviceTypeInfo *t)
 {
+    char *base_name = NULL;
     TypeInfo base_type_info = {
         .name          = t->base_name,
         .parent        = t->parent ? t->parent : TYPE_VIRTIO_PCI,
         .instance_size = t->instance_size,
         .instance_init = t->instance_init,
         .class_size    = t->class_size,
-        .class_init    = virtio_pci_base_class_init,
-        .class_data    = (void *)t,
         .abstract      = true,
         .interfaces    = t->interfaces,
     };
@@ -1962,13 +1954,20 @@ void virtio_pci_types_register(const VirtioPCIDeviceTypeInfo *t)
 
     if (!base_type_info.name) {
         /* No base type -> register a single generic device type */
-        base_type_info.name = t->generic_name;
-        base_type_info.class_init = virtio_pci_generic_base_class_init;
-        base_type_info.interfaces = generic_type_info.interfaces;
-        base_type_info.abstract = false;
-        generic_type_info.name = NULL;
+        /* use intermediate %s-base-type to add generic device props */
+        base_name = g_strdup_printf("%s-base-type", t->generic_name);
+        base_type_info.name = base_name;
+        base_type_info.class_init = virtio_pci_generic_class_init;
+
+        generic_type_info.parent = base_name;
+        generic_type_info.class_init = virtio_pci_base_class_init;
+        generic_type_info.class_data = (void *)t;
+
         assert(!t->non_transitional_name);
         assert(!t->transitional_name);
+    } else {
+        base_type_info.class_init = virtio_pci_base_class_init;
+        base_type_info.class_data = (void *)t;
     }
 
     type_register(&base_type_info);
@@ -2006,6 +2005,7 @@ void virtio_pci_types_register(const VirtioPCIDeviceTypeInfo *t)
         };
         type_register(&transitional_type_info);
     }
+    g_free(base_name);
 }
 
 /* virtio-pci-bus */
-- 
MST



             reply	other threads:[~2019-06-25 23:25 UTC|newest]

Thread overview: 95+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2019-06-25 23:23 Marc-André Lureau [this message]
2019-07-02 15:07 ` [Qemu-devel] [PULL 12/22] virtio-pci: fix missing device properties Michael S. Tsirkin
2019-06-26  1:55 ` [Qemu-devel] [PATCH] " Eduardo Habkost
2019-06-26  9:48   ` Marc-André Lureau
2019-06-26 12:39     ` Eduardo Habkost
  -- strict thread matches above, loose matches on Subject: below --
2019-07-02 15:06 [Qemu-devel] [PULL 00/22] virtio, pc, pci: features, fixes, cleanups Michael S. Tsirkin
2019-07-02 15:06 ` [Qemu-devel] [PULL 01/22] pcie: don't skip multi-mask events Michael S. Tsirkin
2019-07-02 15:06 ` [Qemu-devel] [PULL 02/22] pcie: check that slt ctrl changed before deleting Michael S. Tsirkin
2019-07-11 12:31   ` Peter Maydell
2019-07-02 15:06 ` [Qemu-devel] [PULL 03/22] pcie: work around for racy guest init Michael S. Tsirkin
2019-07-02 15:06 ` [Qemu-devel] [PULL 04/22] pcie: minor cleanups for slot control/status Michael S. Tsirkin
2019-07-02 15:56 ` [Qemu-devel] [PULL 00/22] virtio, pc, pci: features, fixes, cleanups Peter Maydell
2019-07-02 17:00   ` Michael S. Tsirkin
2019-07-02 17:20     ` Peter Maydell
2019-07-02 18:22       ` Michael S. Tsirkin
2019-07-02 18:27         ` Peter Maydell
2019-07-02 19:00           ` Michael S. Tsirkin
2019-07-26 12:39           ` Peter Maydell
2019-07-26 13:43             ` Michael S. Tsirkin
2019-07-04  9:25 ` Peter Maydell
2019-07-04 11:03   ` Pankaj Gupta
2019-07-04 21:24     ` Michael S. Tsirkin
2019-07-05  9:37       ` Pankaj Gupta
2019-07-04 21:29   ` Michael S. Tsirkin
2019-07-05  9:47     ` Peter Maydell
2019-06-28 20:02 [Qemu-devel] [PATCH] pc: Move compat_apic_id_mode variable to PCMachineClass Eduardo Habkost
2019-07-02 15:08 ` [Qemu-devel] [PULL 18/22] " Michael S. Tsirkin
2019-06-29 10:46 ` [Qemu-devel] [PATCH] " Philippe Mathieu-Daudé
2019-06-30 21:30 ` Michael S. Tsirkin
2019-06-26  7:48 [Qemu-devel] [PATCH v2 0/4] libvhost-user: VHOST_USER_PROTOCOL_F_MQ support Stefan Hajnoczi
2019-06-26  7:48 ` [Qemu-devel] [PATCH v2 1/4] libvhost-user: add vmsg_set_reply_u64() helper Stefan Hajnoczi
2019-07-02 15:08   ` [Qemu-devel] [PULL 19/22] " Michael S. Tsirkin
2019-06-26  7:48 ` [Qemu-devel] [PATCH v2 2/4] libvhost-user: support many virtqueues Stefan Hajnoczi
2019-07-02 15:08   ` [Qemu-devel] [PULL 20/22] " Michael S. Tsirkin
2019-06-26  7:48 ` [Qemu-devel] [PATCH v2 3/4] libvhost-user: implement VHOST_USER_PROTOCOL_F_MQ Stefan Hajnoczi
2019-07-02 15:08   ` [Qemu-devel] [PULL 21/22] " Michael S. Tsirkin
2019-06-26  7:48 ` [Qemu-devel] [PATCH v2 4/4] docs: avoid vhost-user-net specifics in multiqueue section Stefan Hajnoczi
2019-07-02 15:08   ` [Qemu-devel] [PULL 22/22] " Michael S. Tsirkin
2019-06-26  2:31 [Qemu-devel] [PATCH v4 0/5] virtio: fix some issues of "started" and "start_on_kick" flag elohimes
2019-06-26  2:31 ` [Qemu-devel] [PATCH v4 1/5] virtio: add "use-started" property elohimes
2019-07-02 15:07   ` [Qemu-devel] [PULL 13/22] " Michael S. Tsirkin
2019-06-26 10:17   ` [Qemu-devel] [PATCH v4 1/5] " Greg Kurz
2019-06-27  2:20     ` Yongji Xie
2019-06-26  2:31 ` [Qemu-devel] [PATCH v4 2/5] virtio: Set "start_on_kick" for legacy devices elohimes
2019-07-02 15:07   ` [Qemu-devel] [PULL 14/22] " Michael S. Tsirkin
2019-06-26  2:31 ` [Qemu-devel] [PATCH v4 3/5] virtio: Set "start_on_kick" on virtio_set_features() elohimes
2019-07-02 15:08   ` [Qemu-devel] [PULL 15/22] " Michael S. Tsirkin
2019-06-26  2:31 ` [Qemu-devel] [PATCH v4 4/5] virtio: Make sure we get correct state of device on handle_aio_output() elohimes
2019-07-02 15:08   ` [Qemu-devel] [PULL 16/22] " Michael S. Tsirkin
2019-06-26  2:31 ` [Qemu-devel] [PATCH v4 5/5] virtio: Don't change "started" flag on virtio_vmstate_change() elohimes
2019-07-02 15:08   ` [Qemu-devel] [PULL 17/22] " Michael S. Tsirkin
2019-06-26 10:43 ` [Qemu-devel] [PATCH v4 0/5] virtio: fix some issues of "started" and "start_on_kick" flag Laurent Vivier
2019-06-27  2:19   ` Yongji Xie
2019-06-19  9:49 [Qemu-devel] [PATCH v2 0/7] Qemu virtio pmem device Pankaj Gupta
2019-06-19  9:49 ` [Qemu-devel] [PATCH v2 1/7] virtio-pmem: add virtio device Pankaj Gupta
2019-07-02 15:07   ` [Qemu-devel] [PULL 05/22] " Michael S. Tsirkin
2019-07-02 11:46   ` [Qemu-devel] [PATCH v2 1/7] " Cornelia Huck
2019-07-11 12:57   ` [Qemu-devel] [PULL 05/22] " Peter Maydell
2019-07-11 14:05     ` Pankaj Gupta
2019-06-19  9:49 ` [Qemu-devel] [PATCH v2 2/7] virtio-pci: Allow to specify additional interfaces for the base type Pankaj Gupta
2019-07-02 15:07   ` [Qemu-devel] [PULL 06/22] " Michael S. Tsirkin
2019-06-19  9:49 ` [Qemu-devel] [PATCH v2 3/7] virtio-pmem: sync linux headers Pankaj Gupta
2019-07-02 15:07   ` [Qemu-devel] [PULL 07/22] " Michael S. Tsirkin
2019-07-02 11:50   ` [Qemu-devel] [PATCH v2 3/7] " Cornelia Huck
2019-07-02 11:59     ` Pankaj Gupta
2019-07-02 16:58       ` Michael S. Tsirkin
2019-07-02 17:09         ` Pankaj Gupta
2019-07-02 17:11           ` Michael S. Tsirkin
2019-07-02 17:21             ` Pankaj Gupta
2019-07-02 15:10     ` Michael S. Tsirkin
2019-06-19  9:49 ` [Qemu-devel] [PATCH v2 4/7] virtio-pci: Proxy for virtio-pmem Pankaj Gupta
2019-07-02 15:07   ` [Qemu-devel] [PULL 08/22] " Michael S. Tsirkin
2019-07-02 11:55   ` [Qemu-devel] [PATCH v2 4/7] " Cornelia Huck
2019-07-02 12:00     ` Pankaj Gupta
2019-07-02 17:09     ` Michael S. Tsirkin
2019-07-02 17:14       ` Pankaj Gupta
2019-07-11 12:59   ` [Qemu-devel] [PULL 08/22] " Peter Maydell
2019-07-11 13:27     ` Pankaj Gupta
2019-06-19  9:49 ` [Qemu-devel] [PATCH v2 5/7] hmp: Handle virtio-pmem when printing memory device infos Pankaj Gupta
2019-07-02 15:07   ` [Qemu-devel] [PULL 09/22] " Michael S. Tsirkin
2019-07-02  8:50   ` [Qemu-devel] [PATCH v2 5/7] " Wei Yang
2019-07-02 10:17     ` Pankaj Gupta
2019-06-19  9:49 ` [Qemu-devel] [PATCH v2 6/7] numa: Handle virtio-pmem in NUMA stats Pankaj Gupta
2019-07-02 15:07   ` [Qemu-devel] [PULL 10/22] " Michael S. Tsirkin
2019-06-19  9:49 ` [Qemu-devel] [PATCH v2 7/7] pc: Support for virtio-pmem-pci Pankaj Gupta
2019-07-02 15:07   ` [Qemu-devel] [PULL 11/22] " Michael S. Tsirkin
2019-07-01  3:53 ` [Qemu-devel] [PATCH v2 0/7] Qemu virtio pmem device Pankaj Gupta
2019-07-02  8:49 ` Wei Yang
2019-07-02 10:07   ` Pankaj Gupta
2019-07-03  0:58     ` Wei Yang
2019-07-03  1:31       ` Pankaj Gupta
2019-07-03  1:57         ` Wei Yang
2019-07-03  2:31           ` Pankaj Gupta
2019-07-03  2:42             ` Wei Yang
2019-07-03  3:21               ` Pankaj Gupta

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=20190625232333.30752-1-marcandre.lureau@redhat.com \
    --to=marcandre.lureau@redhat.com \
    --cc=ehabkost@redhat.com \
    --cc=lvivier@redhat.com \
    --cc=mst@redhat.com \
    --cc=qemu-devel@nongnu.org \
    --cc=qemu-stable@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 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.