diff mbox

[v2,12/12] virtio: add a wrapper for virtio-backend initialization

Message ID 1412057438-10004-13-git-send-email-arei.gonglei@huawei.com
State New
Headers show

Commit Message

Gonglei (Arei) Sept. 30, 2014, 6:10 a.m. UTC
From: Gonglei <arei.gonglei@huawei.com>

For better code sharing, add a wrapper help funciton
for various virtio devices.

Cc: Cornelia Huck <cornelia.huck@de.ibm.com>
Cc: Michael S. Tsirkin <mst@redhat.com>
Signed-off-by: Gonglei <arei.gonglei@huawei.com>
---
 hw/s390x/s390-virtio-bus.c | 42 +++++++++++++++++----------------------
 hw/s390x/virtio-ccw.c      | 42 +++++++++++++++++----------------------
 hw/virtio/virtio-pci.c     | 49 ++++++++++++++++++++--------------------------
 hw/virtio/virtio.c         | 11 +++++++++++
 include/hw/virtio/virtio.h |  3 +++
 5 files changed, 71 insertions(+), 76 deletions(-)

Comments

Cornelia Huck Sept. 30, 2014, 9:04 a.m. UTC | #1
On Tue, 30 Sep 2014 14:10:38 +0800
<arei.gonglei@huawei.com> wrote:

> From: Gonglei <arei.gonglei@huawei.com>
> 
> For better code sharing, add a wrapper help funciton

typo: s/funciton/function/

> for various virtio devices.

s/for various virtio devices/that handles referencing the virtio
backend for virtio proxy devices/ ?

> 
> Cc: Cornelia Huck <cornelia.huck@de.ibm.com>
> Cc: Michael S. Tsirkin <mst@redhat.com>
> Signed-off-by: Gonglei <arei.gonglei@huawei.com>
> ---
>  hw/s390x/s390-virtio-bus.c | 42 +++++++++++++++++----------------------
>  hw/s390x/virtio-ccw.c      | 42 +++++++++++++++++----------------------
>  hw/virtio/virtio-pci.c     | 49 ++++++++++++++++++++--------------------------
>  hw/virtio/virtio.c         | 11 +++++++++++
>  include/hw/virtio/virtio.h |  3 +++
>  5 files changed, 71 insertions(+), 76 deletions(-)

I'm wondering whether we should call the wrapper for virtio-balloon as
well. Even if it does not have any properties to alias, calling
qdev_alias_all_properties() probably doesn't hurt, does it?

Looks good to me otherwise.
Paolo Bonzini Sept. 30, 2014, 9:10 a.m. UTC | #2
Il 30/09/2014 11:04, Cornelia Huck ha scritto:
>> > For better code sharing, add a wrapper help funciton
> typo: s/funciton/function/
> 
>> > for various virtio devices.
> s/for various virtio devices/that handles referencing the virtio
> backend for virtio proxy devices/ ?
> 

"For better code sharing, add a helper function that handles
reference counting of the virtio backend for virtio proxy devices."

?

Paolo
Paolo Bonzini Sept. 30, 2014, 9:17 a.m. UTC | #3
Il 30/09/2014 11:04, Cornelia Huck ha scritto:
> On Tue, 30 Sep 2014 14:10:38 +0800
> <arei.gonglei@huawei.com> wrote:
> 
>> From: Gonglei <arei.gonglei@huawei.com>
>>
>> For better code sharing, add a wrapper help funciton
> 
> typo: s/funciton/function/
> 
>> for various virtio devices.
> 
> s/for various virtio devices/that handles referencing the virtio
> backend for virtio proxy devices/ ?
> 
>>
>> Cc: Cornelia Huck <cornelia.huck@de.ibm.com>
>> Cc: Michael S. Tsirkin <mst@redhat.com>
>> Signed-off-by: Gonglei <arei.gonglei@huawei.com>
>> ---
>>  hw/s390x/s390-virtio-bus.c | 42 +++++++++++++++++----------------------
>>  hw/s390x/virtio-ccw.c      | 42 +++++++++++++++++----------------------
>>  hw/virtio/virtio-pci.c     | 49 ++++++++++++++++++++--------------------------
>>  hw/virtio/virtio.c         | 11 +++++++++++
>>  include/hw/virtio/virtio.h |  3 +++
>>  5 files changed, 71 insertions(+), 76 deletions(-)
> 
> I'm wondering whether we should call the wrapper for virtio-balloon as
> well. Even if it does not have any properties to alias, calling
> qdev_alias_all_properties() probably doesn't hurt, does it?

Actually it has properties to alias: guest-stats and
guest-stats-polling-interval are effectively aliases,
so we could remove 30-odd lines of code from virtio-pci
and virtio-ccw.  It's okay IMO to put it in a separate patch,
since it is a bit different from the trivial replacement
done here.

Paolo
Gonglei (Arei) Sept. 30, 2014, 9:35 a.m. UTC | #4
> Subject: Re: [PATCH v2 12/12] virtio: add a wrapper for virtio-backend
> initialization
> 
> Il 30/09/2014 11:04, Cornelia Huck ha scritto:
> > On Tue, 30 Sep 2014 14:10:38 +0800
> > <arei.gonglei@huawei.com> wrote:
> >
> >> From: Gonglei <arei.gonglei@huawei.com>
> >>
> >> For better code sharing, add a wrapper help funciton
> >
> > typo: s/funciton/function/
> >
> >> for various virtio devices.
> >
> > s/for various virtio devices/that handles referencing the virtio
> > backend for virtio proxy devices/ ?
> >
> >>
> >> Cc: Cornelia Huck <cornelia.huck@de.ibm.com>
> >> Cc: Michael S. Tsirkin <mst@redhat.com>
> >> Signed-off-by: Gonglei <arei.gonglei@huawei.com>
> >> ---
> >>  hw/s390x/s390-virtio-bus.c | 42 +++++++++++++++++----------------------
> >>  hw/s390x/virtio-ccw.c      | 42 +++++++++++++++++----------------------
> >>  hw/virtio/virtio-pci.c     | 49 ++++++++++++++++++++--------------------------
> >>  hw/virtio/virtio.c         | 11 +++++++++++
> >>  include/hw/virtio/virtio.h |  3 +++
> >>  5 files changed, 71 insertions(+), 76 deletions(-)
> >
> > I'm wondering whether we should call the wrapper for virtio-balloon as
> > well. Even if it does not have any properties to alias, calling
> > qdev_alias_all_properties() probably doesn't hurt, does it?
> 
> Actually it has properties to alias: guest-stats and
> guest-stats-polling-interval are effectively aliases,
> so we could remove 30-odd lines of code from virtio-pci
> and virtio-ccw.  It's okay IMO to put it in a separate patch,
> since it is a bit different from the trivial replacement
> done here.
> 
> Paolo

Agreed. I can post a separate patch or patchset for this. :)

Best regards,
-Gonglei
Gonglei (Arei) Sept. 30, 2014, 9:45 a.m. UTC | #5
> Subject: Re: [PATCH v2 12/12] virtio: add a wrapper for virtio-backend
> initialization
> 
> Il 30/09/2014 11:04, Cornelia Huck ha scritto:
> >> > For better code sharing, add a wrapper help funciton
> > typo: s/funciton/function/
> >
> >> > for various virtio devices.
> > s/for various virtio devices/that handles referencing the virtio
> > backend for virtio proxy devices/ ?
> >
> 
> "For better code sharing, add a helper function that handles
> reference counting of the virtio backend for virtio proxy devices."
> 

Looks good to me. Thanks you both. :)

> ?
> 
> Paolo

Best regards,
-Gonglei
Markus Armbruster Sept. 30, 2014, 10:51 a.m. UTC | #6
Cornelia Huck <cornelia.huck@de.ibm.com> writes:

> On Tue, 30 Sep 2014 14:10:38 +0800
> <arei.gonglei@huawei.com> wrote:
>
>> From: Gonglei <arei.gonglei@huawei.com>
>> 
>> For better code sharing, add a wrapper help funciton
>
> typo: s/funciton/function/
>
>> for various virtio devices.
>
> s/for various virtio devices/that handles referencing the virtio
> backend for virtio proxy devices/ ?
>
>> 
>> Cc: Cornelia Huck <cornelia.huck@de.ibm.com>
>> Cc: Michael S. Tsirkin <mst@redhat.com>
>> Signed-off-by: Gonglei <arei.gonglei@huawei.com>
>> ---
>>  hw/s390x/s390-virtio-bus.c | 42 +++++++++++++++++----------------------
>>  hw/s390x/virtio-ccw.c      | 42 +++++++++++++++++----------------------
>>  hw/virtio/virtio-pci.c | 49
>> ++++++++++++++++++++--------------------------
>>  hw/virtio/virtio.c         | 11 +++++++++++
>>  include/hw/virtio/virtio.h |  3 +++
>>  5 files changed, 71 insertions(+), 76 deletions(-)
>
> I'm wondering whether we should call the wrapper for virtio-balloon as
> well. Even if it does not have any properties to alias, calling
> qdev_alias_all_properties() probably doesn't hurt, does it?
>
> Looks good to me otherwise.

I didn't follow this, pardon me if I babble nonsense: could the hackery
that creates usb-storage's implied scsi-disk profit from this mechanism?
Start reading at usb_msd_realize_storage().
Cornelia Huck Sept. 30, 2014, 10:58 a.m. UTC | #7
On Tue, 30 Sep 2014 11:17:29 +0200
Paolo Bonzini <pbonzini@redhat.com> wrote:

> Il 30/09/2014 11:04, Cornelia Huck ha scritto:
> > On Tue, 30 Sep 2014 14:10:38 +0800
> > <arei.gonglei@huawei.com> wrote:
> > 
> >> From: Gonglei <arei.gonglei@huawei.com>
> >>
> >> For better code sharing, add a wrapper help funciton
> > 
> > typo: s/funciton/function/
> > 
> >> for various virtio devices.
> > 
> > s/for various virtio devices/that handles referencing the virtio
> > backend for virtio proxy devices/ ?
> > 
> >>
> >> Cc: Cornelia Huck <cornelia.huck@de.ibm.com>
> >> Cc: Michael S. Tsirkin <mst@redhat.com>
> >> Signed-off-by: Gonglei <arei.gonglei@huawei.com>
> >> ---
> >>  hw/s390x/s390-virtio-bus.c | 42 +++++++++++++++++----------------------
> >>  hw/s390x/virtio-ccw.c      | 42 +++++++++++++++++----------------------
> >>  hw/virtio/virtio-pci.c     | 49 ++++++++++++++++++++--------------------------
> >>  hw/virtio/virtio.c         | 11 +++++++++++
> >>  include/hw/virtio/virtio.h |  3 +++
> >>  5 files changed, 71 insertions(+), 76 deletions(-)
> > 
> > I'm wondering whether we should call the wrapper for virtio-balloon as
> > well. Even if it does not have any properties to alias, calling
> > qdev_alias_all_properties() probably doesn't hurt, does it?
> 
> Actually it has properties to alias: guest-stats and
> guest-stats-polling-interval are effectively aliases,
> so we could remove 30-odd lines of code from virtio-pci
> and virtio-ccw.  It's okay IMO to put it in a separate patch,
> since it is a bit different from the trivial replacement
> done here.

Yup. Let's do the easy changes first.
diff mbox

Patch

diff --git a/hw/s390x/s390-virtio-bus.c b/hw/s390x/s390-virtio-bus.c
index ca682bb..f451ca1 100644
--- a/hw/s390x/s390-virtio-bus.c
+++ b/hw/s390x/s390-virtio-bus.c
@@ -159,10 +159,9 @@  static int s390_virtio_net_init(VirtIOS390Device *s390_dev)
 static void s390_virtio_net_instance_init(Object *obj)
 {
     VirtIONetS390 *dev = VIRTIO_NET_S390(obj);
-    object_initialize(&dev->vdev, sizeof(dev->vdev), TYPE_VIRTIO_NET);
-    object_property_add_child(obj, "virtio-backend", OBJECT(&dev->vdev), NULL);
-    object_unref(OBJECT(&dev->vdev));
-    qdev_alias_all_properties(DEVICE(&dev->vdev), obj);
+
+    virtio_instance_init_common(obj, &dev->vdev, sizeof(dev->vdev),
+                                TYPE_VIRTIO_NET);
 }
 
 static int s390_virtio_blk_init(VirtIOS390Device *s390_dev)
@@ -179,10 +178,9 @@  static int s390_virtio_blk_init(VirtIOS390Device *s390_dev)
 static void s390_virtio_blk_instance_init(Object *obj)
 {
     VirtIOBlkS390 *dev = VIRTIO_BLK_S390(obj);
-    object_initialize(&dev->vdev, sizeof(dev->vdev), TYPE_VIRTIO_BLK);
-    object_property_add_child(obj, "virtio-backend", OBJECT(&dev->vdev), NULL);
-    object_unref(OBJECT(&dev->vdev));
-    qdev_alias_all_properties(DEVICE(&dev->vdev), obj);
+
+    virtio_instance_init_common(obj, &dev->vdev, sizeof(dev->vdev),
+                                TYPE_VIRTIO_BLK);
     object_property_add_alias(obj, "iothread", OBJECT(&dev->vdev),"iothread",
                               &error_abort);
 }
@@ -224,10 +222,9 @@  static int s390_virtio_serial_init(VirtIOS390Device *s390_dev)
 static void s390_virtio_serial_instance_init(Object *obj)
 {
     VirtIOSerialS390 *dev = VIRTIO_SERIAL_S390(obj);
-    object_initialize(&dev->vdev, sizeof(dev->vdev), TYPE_VIRTIO_SERIAL);
-    object_property_add_child(obj, "virtio-backend", OBJECT(&dev->vdev), NULL);
-    qdev_alias_all_properties(DEVICE(&dev->vdev), obj);
-    object_unref(OBJECT(&dev->vdev));
+
+    virtio_instance_init_common(obj, &dev->vdev, sizeof(dev->vdev),
+                                TYPE_VIRTIO_SERIAL);
 }
 
 static int s390_virtio_scsi_init(VirtIOS390Device *s390_dev)
@@ -258,10 +255,9 @@  static int s390_virtio_scsi_init(VirtIOS390Device *s390_dev)
 static void s390_virtio_scsi_instance_init(Object *obj)
 {
     VirtIOSCSIS390 *dev = VIRTIO_SCSI_S390(obj);
-    object_initialize(&dev->vdev, sizeof(dev->vdev), TYPE_VIRTIO_SCSI);
-    object_property_add_child(obj, "virtio-backend", OBJECT(&dev->vdev), NULL);
-    object_unref(OBJECT(&dev->vdev));
-    qdev_alias_all_properties(DEVICE(&dev->vdev), obj);
+
+    virtio_instance_init_common(obj, &dev->vdev, sizeof(dev->vdev),
+                                TYPE_VIRTIO_SCSI);
 }
 
 #ifdef CONFIG_VHOST_SCSI
@@ -281,10 +277,9 @@  static int s390_vhost_scsi_init(VirtIOS390Device *s390_dev)
 static void s390_vhost_scsi_instance_init(Object *obj)
 {
     VHostSCSIS390 *dev = VHOST_SCSI_S390(obj);
-    object_initialize(&dev->vdev, sizeof(dev->vdev), TYPE_VHOST_SCSI);
-    object_property_add_child(obj, "virtio-backend", OBJECT(&dev->vdev), NULL);
-    object_unref(OBJECT(&dev->vdev));
-    qdev_alias_all_properties(DEVICE(&dev->vdev), obj);
+
+    virtio_instance_init_common(obj, &dev->vdev, sizeof(dev->vdev),
+                                TYPE_VHOST_SCSI);
 }
 #endif
 
@@ -309,10 +304,9 @@  static int s390_virtio_rng_init(VirtIOS390Device *s390_dev)
 static void s390_virtio_rng_instance_init(Object *obj)
 {
     VirtIORNGS390 *dev = VIRTIO_RNG_S390(obj);
-    object_initialize(&dev->vdev, sizeof(dev->vdev), TYPE_VIRTIO_RNG);
-    object_property_add_child(obj, "virtio-backend", OBJECT(&dev->vdev), NULL);
-    qdev_alias_all_properties(DEVICE(&dev->vdev), obj);
-    object_unref(OBJECT(&dev->vdev));
+
+    virtio_instance_init_common(obj, &dev->vdev, sizeof(dev->vdev),
+                                TYPE_VIRTIO_RNG);
     object_property_add_link(obj, "rng", TYPE_RNG_BACKEND,
                              (Object **)&dev->vdev.conf.rng,
                              qdev_prop_allow_set_link_before_realize,
diff --git a/hw/s390x/virtio-ccw.c b/hw/s390x/virtio-ccw.c
index c074f64..5175d57 100644
--- a/hw/s390x/virtio-ccw.c
+++ b/hw/s390x/virtio-ccw.c
@@ -792,10 +792,9 @@  static int virtio_ccw_net_init(VirtioCcwDevice *ccw_dev)
 static void virtio_ccw_net_instance_init(Object *obj)
 {
     VirtIONetCcw *dev = VIRTIO_NET_CCW(obj);
-    object_initialize(&dev->vdev, sizeof(dev->vdev), TYPE_VIRTIO_NET);
-    object_property_add_child(obj, "virtio-backend", OBJECT(&dev->vdev), NULL);
-    object_unref(OBJECT(&dev->vdev));
-    qdev_alias_all_properties(DEVICE(&dev->vdev), obj);
+
+    virtio_instance_init_common(obj, &dev->vdev, sizeof(dev->vdev),
+                                TYPE_VIRTIO_NET);
 }
 
 static int virtio_ccw_blk_init(VirtioCcwDevice *ccw_dev)
@@ -813,10 +812,9 @@  static int virtio_ccw_blk_init(VirtioCcwDevice *ccw_dev)
 static void virtio_ccw_blk_instance_init(Object *obj)
 {
     VirtIOBlkCcw *dev = VIRTIO_BLK_CCW(obj);
-    object_initialize(&dev->vdev, sizeof(dev->vdev), TYPE_VIRTIO_BLK);
-    object_property_add_child(obj, "virtio-backend", OBJECT(&dev->vdev), NULL);
-    object_unref(OBJECT(&dev->vdev));
-    qdev_alias_all_properties(DEVICE(&dev->vdev), obj);
+
+    virtio_instance_init_common(obj, &dev->vdev, sizeof(dev->vdev),
+                                TYPE_VIRTIO_BLK);
     object_property_add_alias(obj, "iothread", OBJECT(&dev->vdev),"iothread",
                               &error_abort);
 }
@@ -850,10 +848,9 @@  static int virtio_ccw_serial_init(VirtioCcwDevice *ccw_dev)
 static void virtio_ccw_serial_instance_init(Object *obj)
 {
     VirtioSerialCcw *dev = VIRTIO_SERIAL_CCW(obj);
-    object_initialize(&dev->vdev, sizeof(dev->vdev), TYPE_VIRTIO_SERIAL);
-    object_property_add_child(obj, "virtio-backend", OBJECT(&dev->vdev), NULL);
-    qdev_alias_all_properties(DEVICE(&dev->vdev), obj);
-    object_unref(OBJECT(&dev->vdev));
+
+    virtio_instance_init_common(obj, &dev->vdev, sizeof(dev->vdev),
+                                TYPE_VIRTIO_SERIAL);
 }
 
 static int virtio_ccw_balloon_init(VirtioCcwDevice *ccw_dev)
@@ -938,10 +935,9 @@  static int virtio_ccw_scsi_init(VirtioCcwDevice *ccw_dev)
 static void virtio_ccw_scsi_instance_init(Object *obj)
 {
     VirtIOSCSICcw *dev = VIRTIO_SCSI_CCW(obj);
-    object_initialize(&dev->vdev, sizeof(dev->vdev), TYPE_VIRTIO_SCSI);
-    object_property_add_child(obj, "virtio-backend", OBJECT(&dev->vdev), NULL);
-    object_unref(OBJECT(&dev->vdev));
-    qdev_alias_all_properties(DEVICE(&dev->vdev), obj);
+
+    virtio_instance_init_common(obj, &dev->vdev, sizeof(dev->vdev),
+                                TYPE_VIRTIO_SCSI);
 }
 
 #ifdef CONFIG_VHOST_SCSI
@@ -961,10 +957,9 @@  static int vhost_ccw_scsi_init(VirtioCcwDevice *ccw_dev)
 static void vhost_ccw_scsi_instance_init(Object *obj)
 {
     VHostSCSICcw *dev = VHOST_SCSI_CCW(obj);
-    object_initialize(&dev->vdev, sizeof(dev->vdev), TYPE_VHOST_SCSI);
-    object_property_add_child(obj, "virtio-backend", OBJECT(&dev->vdev), NULL);
-    object_unref(OBJECT(&dev->vdev));
-    qdev_alias_all_properties(DEVICE(&dev->vdev), obj);
+
+    virtio_instance_init_common(obj, &dev->vdev, sizeof(dev->vdev),
+                                TYPE_VHOST_SCSI);
 }
 #endif
 
@@ -1540,10 +1535,9 @@  static const TypeInfo vhost_ccw_scsi = {
 static void virtio_ccw_rng_instance_init(Object *obj)
 {
     VirtIORNGCcw *dev = VIRTIO_RNG_CCW(obj);
-    object_initialize(&dev->vdev, sizeof(dev->vdev), TYPE_VIRTIO_RNG);
-    object_property_add_child(obj, "virtio-backend", OBJECT(&dev->vdev), NULL);
-    qdev_alias_all_properties(DEVICE(&dev->vdev), obj);
-    object_unref(OBJECT(&dev->vdev));
+
+    virtio_instance_init_common(obj, &dev->vdev, sizeof(dev->vdev),
+                                TYPE_VIRTIO_RNG);
     object_property_add_link(obj, "rng", TYPE_RNG_BACKEND,
                              (Object **)&dev->vdev.conf.rng,
                              qdev_prop_allow_set_link_before_realize,
diff --git a/hw/virtio/virtio-pci.c b/hw/virtio/virtio-pci.c
index 8f3b79b..83a699f 100644
--- a/hw/virtio/virtio-pci.c
+++ b/hw/virtio/virtio-pci.c
@@ -947,10 +947,9 @@  static void virtio_9p_pci_class_init(ObjectClass *klass, void *data)
 static void virtio_9p_pci_instance_init(Object *obj)
 {
     V9fsPCIState *dev = VIRTIO_9P_PCI(obj);
-    object_initialize(&dev->vdev, sizeof(dev->vdev), TYPE_VIRTIO_9P);
-    object_property_add_child(obj, "virtio-backend", OBJECT(&dev->vdev), NULL);
-    qdev_alias_all_properties(DEVICE(&dev->vdev), obj);
-    object_unref(OBJECT(&dev->vdev));
+
+    virtio_instance_init_common(obj, &dev->vdev, sizeof(dev->vdev),
+                                TYPE_VIRTIO_9P);
 }
 
 static const TypeInfo virtio_9p_pci_info = {
@@ -1112,10 +1111,9 @@  static void virtio_blk_pci_class_init(ObjectClass *klass, void *data)
 static void virtio_blk_pci_instance_init(Object *obj)
 {
     VirtIOBlkPCI *dev = VIRTIO_BLK_PCI(obj);
-    object_initialize(&dev->vdev, sizeof(dev->vdev), TYPE_VIRTIO_BLK);
-    object_property_add_child(obj, "virtio-backend", OBJECT(&dev->vdev), NULL);
-    object_unref(OBJECT(&dev->vdev));
-    qdev_alias_all_properties(DEVICE(&dev->vdev), obj);
+
+    virtio_instance_init_common(obj, &dev->vdev, sizeof(dev->vdev),
+                                TYPE_VIRTIO_BLK);
     object_property_add_alias(obj, "iothread", OBJECT(&dev->vdev),"iothread",
                               &error_abort);
 }
@@ -1185,10 +1183,9 @@  static void virtio_scsi_pci_class_init(ObjectClass *klass, void *data)
 static void virtio_scsi_pci_instance_init(Object *obj)
 {
     VirtIOSCSIPCI *dev = VIRTIO_SCSI_PCI(obj);
-    object_initialize(&dev->vdev, sizeof(dev->vdev), TYPE_VIRTIO_SCSI);
-    object_property_add_child(obj, "virtio-backend", OBJECT(&dev->vdev), NULL);
-    object_unref(OBJECT(&dev->vdev));
-    qdev_alias_all_properties(DEVICE(&dev->vdev), obj);
+
+    virtio_instance_init_common(obj, &dev->vdev, sizeof(dev->vdev),
+                                TYPE_VIRTIO_SCSI);
 }
 
 static const TypeInfo virtio_scsi_pci_info = {
@@ -1242,10 +1239,9 @@  static void vhost_scsi_pci_class_init(ObjectClass *klass, void *data)
 static void vhost_scsi_pci_instance_init(Object *obj)
 {
     VHostSCSIPCI *dev = VHOST_SCSI_PCI(obj);
-    object_initialize(&dev->vdev, sizeof(dev->vdev), TYPE_VHOST_SCSI);
-    object_property_add_child(obj, "virtio-backend", OBJECT(&dev->vdev), NULL);
-    object_unref(OBJECT(&dev->vdev));
-    qdev_alias_all_properties(DEVICE(&dev->vdev), obj);
+
+    virtio_instance_init_common(obj, &dev->vdev, sizeof(dev->vdev),
+                                TYPE_VHOST_SCSI);
 }
 
 static const TypeInfo vhost_scsi_pci_info = {
@@ -1408,10 +1404,9 @@  static void virtio_serial_pci_class_init(ObjectClass *klass, void *data)
 static void virtio_serial_pci_instance_init(Object *obj)
 {
     VirtIOSerialPCI *dev = VIRTIO_SERIAL_PCI(obj);
-    object_initialize(&dev->vdev, sizeof(dev->vdev), TYPE_VIRTIO_SERIAL);
-    object_property_add_child(obj, "virtio-backend", OBJECT(&dev->vdev), NULL);
-    qdev_alias_all_properties(DEVICE(&dev->vdev), obj);
-    object_unref(OBJECT(&dev->vdev));
+
+    virtio_instance_init_common(obj, &dev->vdev, sizeof(dev->vdev),
+                                TYPE_VIRTIO_SERIAL);
 }
 
 static const TypeInfo virtio_serial_pci_info = {
@@ -1467,10 +1462,9 @@  static void virtio_net_pci_class_init(ObjectClass *klass, void *data)
 static void virtio_net_pci_instance_init(Object *obj)
 {
     VirtIONetPCI *dev = VIRTIO_NET_PCI(obj);
-    object_initialize(&dev->vdev, sizeof(dev->vdev), TYPE_VIRTIO_NET);
-    object_property_add_child(obj, "virtio-backend", OBJECT(&dev->vdev), NULL);
-    object_unref(OBJECT(&dev->vdev));
-    qdev_alias_all_properties(DEVICE(&dev->vdev), obj);
+
+    virtio_instance_init_common(obj, &dev->vdev, sizeof(dev->vdev),
+                                TYPE_VIRTIO_NET);
 }
 
 static const TypeInfo virtio_net_pci_info = {
@@ -1523,10 +1517,9 @@  static void virtio_rng_pci_class_init(ObjectClass *klass, void *data)
 static void virtio_rng_initfn(Object *obj)
 {
     VirtIORngPCI *dev = VIRTIO_RNG_PCI(obj);
-    object_initialize(&dev->vdev, sizeof(dev->vdev), TYPE_VIRTIO_RNG);
-    object_property_add_child(obj, "virtio-backend", OBJECT(&dev->vdev), NULL);
-    qdev_alias_all_properties(DEVICE(&dev->vdev), obj);
-    object_unref(OBJECT(&dev->vdev));
+
+    virtio_instance_init_common(obj, &dev->vdev, sizeof(dev->vdev),
+                                TYPE_VIRTIO_RNG);
     object_property_add_link(obj, "rng", TYPE_RNG_BACKEND,
                              (Object **)&dev->vdev.conf.rng,
                              qdev_prop_allow_set_link_before_realize,
diff --git a/hw/virtio/virtio.c b/hw/virtio/virtio.c
index 5c98180..2c236bf 100644
--- a/hw/virtio/virtio.c
+++ b/hw/virtio/virtio.c
@@ -1123,6 +1123,17 @@  static void virtio_vmstate_change(void *opaque, int running, RunState state)
     }
 }
 
+void virtio_instance_init_common(Object *proxy_obj, void *data,
+                                 size_t vdev_size, const char *vdev_name)
+{
+    DeviceState *vdev = data;
+
+    object_initialize(vdev, vdev_size, vdev_name);
+    object_property_add_child(proxy_obj, "virtio-backend", OBJECT(vdev), NULL);
+    object_unref(OBJECT(vdev));
+    qdev_alias_all_properties(vdev, proxy_obj);
+}
+
 void virtio_init(VirtIODevice *vdev, const char *name,
                  uint16_t device_id, size_t config_size)
 {
diff --git a/include/hw/virtio/virtio.h b/include/hw/virtio/virtio.h
index a60104c..0726d76 100644
--- a/include/hw/virtio/virtio.h
+++ b/include/hw/virtio/virtio.h
@@ -161,6 +161,9 @@  typedef struct VirtioDeviceClass {
     int (*load)(VirtIODevice *vdev, QEMUFile *f, int version_id);
 } VirtioDeviceClass;
 
+void virtio_instance_init_common(Object *proxy_obj, void *data,
+                                 size_t vdev_size, const char *vdev_name);
+
 void virtio_init(VirtIODevice *vdev, const char *name,
                          uint16_t device_id, size_t config_size);
 void virtio_cleanup(VirtIODevice *vdev);