qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Qemu-devel] [PATCH] virtio-net: require that config size is initial


From: Michael S. Tsirkin
Subject: Re: [Qemu-devel] [PATCH] virtio-net: require that config size is initialized
Date: Tue, 7 May 2013 18:55:30 +0300

On Tue, May 07, 2013 at 05:29:34PM +0200, KONRAD Frédéric wrote:
> On 07/05/2013 16:00, Michael S. Tsirkin wrote:
> >On Tue, May 07, 2013 at 02:54:38PM +0200, KONRAD Frédéric wrote:
> >>On 07/05/2013 14:33, Michael S. Tsirkin wrote:
> >>>On Tue, May 07, 2013 at 02:29:38PM +0200, KONRAD Frédéric wrote:
> >>>>Hi,
> >>>>
> >>>>I think it is not a good idea, as we wanted to make VirtIODevice
> >>>>hot-pluggable for virtio-mmio.
> >>>And then this hack will break cross version migration.
> >>Why?
> >>
> >>virtio_net_set_config_size is called by each "proxy" devices no?
> >If it's called then there's no need for a default,
> >so this patch should be fine.
> 
> True but as I told you, we made this refactoring to be able to hot-plug
> VirtIODevice on a virtio-bus, so calling this function won't be possible.

Going in circles aren't we? If it's not called
it's a bug. If it's called default is not needed.

> But you are right this must be fixed.
> 
> >
> >>>>Maybe we can use a callback which is called by virtio-bus before
> >>>>plugging, to ensure that this
> >>>>config size is computed?
> >>>OK, will you post such a patch?
> >>>
> >>The issue is as we said in the last thread, host_feature is part of
> >>the proxy.
> >Maybe you could add documentation on how initialization works?
> >If I could fiure it out I would maybe suggest some solutions.
> 
> Yes, where do you think I can add this?

Everywhere. Seriously.
Start with files. File headers should give some hint
as to what's in here
 * VirtioBus
in virtio-bus.h and virtio-bus.c is not helpful.
How about

        VirtioBus - a bus that drives from Newcastle to Edinburgh
        each Tuesday at noon. Drives back on Wednesdays mostly empty.
        It serves as a parent class for all the small taxi cars
        in both of these towns.

or some such.

Go over the interfaces and document what they do.
I mean more than just repeat the name:
        /* Destroy the VirtIODevice */
        void virtio_bus_destroy_device(VirtioBusState *bus)
is not really helpful.

        /* Destroy a device. Assumes you
           don't have valuables in there.  Calls 911 automatically. */

same for

/* Plug the VirtIODevice */
int virtio_bus_plug_device(VirtIODevice *vdev)

did you mean

        /* Plug the device so the content does not
           spill. This way you can take put it on the bus.
           You must use a corkscrew to unplug it later.
         */


> >>And if we want to move it to the devices, we must have a kind of
> >>property forwarding mechanism.
> >>
> >>Anthony said he had something about that.
> >>>>>All buses do this, and if they don't they get subtle
> >>>>>bugs related to cross version migration.
> >>>>>Let's add an assert to catch these bugs early.
> >>>>>
> >>>>>Signed-off-by: Michael S. Tsirkin <address@hidden>
> >>>>>---
> >>>>>
> >>>>>Just a cleanup so not 1.5 material.
> >>>>>Seems to work fine here - any opinions?
> >>>>>
> >>>>>  hw/net/virtio-net.c | 7 ++++---
> >>>>>  1 file changed, 4 insertions(+), 3 deletions(-)
> >>>>>
> >>>>>diff --git a/hw/net/virtio-net.c b/hw/net/virtio-net.c
> >>>>>index 908e7b8..f0a9272 100644
> >>>>>--- a/hw/net/virtio-net.c
> >>>>>+++ b/hw/net/virtio-net.c
> >>>>>@@ -1282,6 +1282,8 @@ static int virtio_net_device_init(VirtIODevice 
> >>>>>*vdev)
> >>>>>      DeviceState *qdev = DEVICE(vdev);
> >>>>>      VirtIONet *n = VIRTIO_NET(vdev);
> >>>>>+    /* Verify that config size has been initialized */
> >>>>>+    assert(n->config_size != (size_t)-1);
> >>>>>      virtio_init(VIRTIO_DEVICE(n), "virtio-net", VIRTIO_ID_NET,
> >>>>>                                    n->config_size);
> >>>>>@@ -1386,10 +1388,9 @@ static void virtio_net_instance_init(Object *obj)
> >>>>>      VirtIONet *n = VIRTIO_NET(obj);
> >>>>>      /*
> >>>>>-     * The default config_size is sizeof(struct virtio_net_config).
> >>>>>-     * Can be overriden with virtio_net_set_config_size.
> >>>>>+     * The config_size must be set later with 
> >>>>>virtio_net_set_config_size.
> >>>>>       */
> >>>>>-    n->config_size = sizeof(struct virtio_net_config);
> >>>>>+    n->config_size = (size_t)-1;
> >>>>>  }
> >>>>>  static Property virtio_net_properties[] = {



reply via email to

[Prev in Thread] Current Thread [Next in Thread]