> On Tue, Sep 09, 2014 at 02:35:02PM +0800, arei.gong...@huawei.com wrote: > > From: Gonglei <arei.gong...@huawei.com> > > > > virtio-net-pci, virtio-net-s390, and virtio-net-ccw all duplicate the > > qdev properties of their VirtIONet child. This approach does not work > > well with string or pointer properties since we must be careful about > > leaking or double-freeing them. > > > > Use the QOM alias property to forward property accesses to the > > VirtIONet child. This way no duplication is necessary. > > > > Signed-off-by: Gonglei <arei.gong...@huawei.com> > > --- > > hw/s390x/s390-virtio-bus.c | 3 +-- > > hw/s390x/virtio-ccw.c | 3 +-- > > hw/virtio/virtio-pci.c | 3 +-- > > 3 files changed, 3 insertions(+), 6 deletions(-) > > > > diff --git a/hw/s390x/s390-virtio-bus.c b/hw/s390x/s390-virtio-bus.c > > index 6b6fb61..5b5d595 100644 > > --- a/hw/s390x/s390-virtio-bus.c > > +++ b/hw/s390x/s390-virtio-bus.c > > @@ -161,6 +161,7 @@ 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); > > + qdev_alias_all_properties(DEVICE(&dev->vdev), obj); > > } > > > > static int s390_virtio_blk_init(VirtIOS390Device *s390_dev) > > @@ -493,10 +494,8 @@ static unsigned > virtio_s390_get_features(DeviceState *d) > > /**************** S390 Virtio Bus Device Descriptions > *******************/ > > > > static Property s390_virtio_net_properties[] = { > > - DEFINE_NIC_PROPERTIES(VirtIONetS390, vdev.nic_conf), > > DEFINE_VIRTIO_COMMON_FEATURES(VirtIOS390Device, > host_features), > > DEFINE_VIRTIO_NET_FEATURES(VirtIOS390Device, host_features), > > - DEFINE_VIRTIO_NET_PROPERTIES(VirtIONetS390, vdev.net_conf), > > DEFINE_PROP_END_OF_LIST(), > > }; > > > > diff --git a/hw/s390x/virtio-ccw.c b/hw/s390x/virtio-ccw.c > > index 33a1d86..7d67577 100644 > > --- a/hw/s390x/virtio-ccw.c > > +++ b/hw/s390x/virtio-ccw.c > > @@ -794,6 +794,7 @@ 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); > > + qdev_alias_all_properties(DEVICE(&dev->vdev), obj); > > } > > > > static int virtio_ccw_blk_init(VirtioCcwDevice *ccw_dev) > > @@ -1374,8 +1375,6 @@ static int virtio_ccw_load_config(DeviceState *d, > QEMUFile *f) > > static Property virtio_ccw_net_properties[] = { > > DEFINE_PROP_STRING("devno", VirtioCcwDevice, bus_id), > > DEFINE_VIRTIO_NET_FEATURES(VirtioCcwDevice, host_features[0]), > > - DEFINE_VIRTIO_NET_PROPERTIES(VirtIONetCcw, vdev.net_conf), > > - DEFINE_NIC_PROPERTIES(VirtIONetCcw, vdev.nic_conf), > > DEFINE_PROP_BIT("ioeventfd", VirtioCcwDevice, flags, > > VIRTIO_CCW_FLAG_USE_IOEVENTFD_BIT, true), > > DEFINE_PROP_END_OF_LIST(), > > diff --git a/hw/virtio/virtio-pci.c b/hw/virtio/virtio-pci.c > > index ddb5da1..6722156 100644 > > --- a/hw/virtio/virtio-pci.c > > +++ b/hw/virtio/virtio-pci.c > > @@ -1414,8 +1414,6 @@ static Property virtio_net_properties[] = { > > VIRTIO_PCI_FLAG_USE_IOEVENTFD_BIT, false), > > DEFINE_PROP_UINT32("vectors", VirtIOPCIProxy, nvectors, 3), > > DEFINE_VIRTIO_NET_FEATURES(VirtIOPCIProxy, host_features), > > - DEFINE_NIC_PROPERTIES(VirtIONetPCI, vdev.nic_conf), > > - DEFINE_VIRTIO_NET_PROPERTIES(VirtIONetPCI, vdev.net_conf), > > DEFINE_PROP_END_OF_LIST(), > > }; > > > > @@ -1456,6 +1454,7 @@ 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); > > + qdev_alias_all_properties(DEVICE(&dev->vdev), obj); > > } > > > > static const TypeInfo virtio_net_pci_info = { > > Does -device virtio-net-pci,? still list e.g. the mac property with this > patch? > Yes. Please see the properties of virtio-net-pci with this patch:
#./qemu-system-x86_64 -enable-kvm -m 4096 -smp 4 -name redhat6.2 -drive file=/home/redhat6.2, \ if=none,id=drive-ide0-0-0 -device ide-hd,bus=ide.0,unit=0,drive=drive-ide0-0-0,id=ide0-0-0,bootindex=1 \ -drive file=/mnt/sdb/gonglei/iso/rhel-server-7.0-x86_64-dvd.iso,if=none,id=drive-ide0-0-1 \ -device ide-cd,bus=ide.0,unit=1,drive=drive-ide0-0-1,id=ide0-0-1,bootindex=4 -vnc 0.0.0.0:10 \ -netdev type=user,id=net0 -device virtio-net-pci,netdev=net0,bootindex=3,id=nic1 -monitor stdio QEMU 2.1.50 monitor - type 'help' for more information (qemu) qom-list nic1 virtio-net-pci.rom[0] (child<qemu:memory-region>) virtio-pci[0] (child<qemu:memory-region>) msix-pba[0] (child<qemu:memory-region>) msix-table[0] (child<qemu:memory-region>) virtio-net-pci-msix[0] (child<qemu:memory-region>) virtio-bus (child<virtio-pci-bus>) bus master[0] (child<qemu:memory-region>) bootindex (int) tx (str) x-txburst (int32) x-txtimer (uint32) netdev (str) vlan (int32) mac (str) virtio-backend (child<virtio-net-device>) parent_bus (link<bus>) command_serr_enable (bool) multifunction (bool) rombar (uint32) romfile (str) addr (int32) legacy-addr (str) event_idx (bool) indirect_desc (bool) mq (bool) ctrl_guest_offloads (bool) ctrl_mac_addr (bool) ctrl_rx_extra (bool) ctrl_vlan (bool) ctrl_rx (bool) ctrl_vq (bool) status (bool) mrg_rxbuf (bool) host_ufo (bool) host_ecn (bool) host_tso6 (bool) host_tso4 (bool) guest_announce (bool) guest_ufo (bool) guest_ecn (bool) guest_tso6 (bool) guest_tso4 (bool) gso (bool) guest_csum (bool) csum (bool) any_layout (bool) vectors (uint32) ioeventfd (bool) hotplugged (bool) hotpluggable (bool) realized (bool) type (string) (qemu) qom-get nic1 mac "52:54:00:12:34:56" (qemu) qom-get nic1 bootindex 3 (0x3) (qemu) info network nic1: index=0,type=nic,model=virtio-net-pci,macaddr=52:54:00:12:34:56 \ net0: index=0,type=user,net=10.0.2.0,restrict=off (qemu) Best regards, -Gonglei