qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
* [Qemu-devel] [PATCH] virtio-net: require that config size is initialized
@ 2013-05-07 10:22 Michael S. Tsirkin
  2013-05-07 12:29 ` KONRAD Frédéric
  0 siblings, 1 reply; 7+ messages in thread
From: Michael S. Tsirkin @ 2013-05-07 10:22 UTC (permalink / raw)
  To: qemu-devel
  Cc: Paolo Bonzini, Anthony Liguori, Jason Wang, Stefan Hajnoczi,
	fred.konrad

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 <mst@redhat.com>
---

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[] = {
-- 
MST

^ permalink raw reply related	[flat|nested] 7+ messages in thread

* Re: [Qemu-devel] [PATCH] virtio-net: require that config size is initialized
  2013-05-07 10:22 [Qemu-devel] [PATCH] virtio-net: require that config size is initialized Michael S. Tsirkin
@ 2013-05-07 12:29 ` KONRAD Frédéric
  2013-05-07 12:33   ` Michael S. Tsirkin
  0 siblings, 1 reply; 7+ messages in thread
From: KONRAD Frédéric @ 2013-05-07 12:29 UTC (permalink / raw)
  To: Michael S. Tsirkin
  Cc: Peter Maydell, Anthony Liguori, Jason Wang, qemu-devel,
	Stefan Hajnoczi, Paolo Bonzini

Hi,

I think it is not a good idea, as we wanted to make VirtIODevice 
hot-pluggable for virtio-mmio.

Maybe we can use a callback which is called by virtio-bus before 
plugging, to ensure that this
config size is computed?

On 07/05/2013 12:22, Michael S. Tsirkin wrote:
> 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 <mst@redhat.com>
> ---
>
> 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[] = {

^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [Qemu-devel] [PATCH] virtio-net: require that config size is initialized
  2013-05-07 12:29 ` KONRAD Frédéric
@ 2013-05-07 12:33   ` Michael S. Tsirkin
  2013-05-07 12:54     ` KONRAD Frédéric
  0 siblings, 1 reply; 7+ messages in thread
From: Michael S. Tsirkin @ 2013-05-07 12:33 UTC (permalink / raw)
  To: KONRAD Frédéric
  Cc: Peter Maydell, Anthony Liguori, Jason Wang, qemu-devel,
	Stefan Hajnoczi, Paolo Bonzini

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.

> 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?

> On 07/05/2013 12:22, Michael S. Tsirkin wrote:
> >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 <mst@redhat.com>
> >---
> >
> >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[] = {

^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [Qemu-devel] [PATCH] virtio-net: require that config size is initialized
  2013-05-07 12:33   ` Michael S. Tsirkin
@ 2013-05-07 12:54     ` KONRAD Frédéric
  2013-05-07 14:00       ` Michael S. Tsirkin
  0 siblings, 1 reply; 7+ messages in thread
From: KONRAD Frédéric @ 2013-05-07 12:54 UTC (permalink / raw)
  To: Michael S. Tsirkin
  Cc: Peter Maydell, Anthony Liguori, Jason Wang, qemu-devel,
	Stefan Hajnoczi, Paolo Bonzini

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?

>
>> 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.

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.

>> On 07/05/2013 12:22, Michael S. Tsirkin wrote:
>>> 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 <mst@redhat.com>
>>> ---
>>>
>>> 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[] = {

^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [Qemu-devel] [PATCH] virtio-net: require that config size is initialized
  2013-05-07 12:54     ` KONRAD Frédéric
@ 2013-05-07 14:00       ` Michael S. Tsirkin
  2013-05-07 15:29         ` KONRAD Frédéric
  0 siblings, 1 reply; 7+ messages in thread
From: Michael S. Tsirkin @ 2013-05-07 14:00 UTC (permalink / raw)
  To: KONRAD Frédéric
  Cc: Peter Maydell, Anthony Liguori, Jason Wang, qemu-devel,
	Stefan Hajnoczi, Paolo Bonzini

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.

> >
> >>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.

> 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 <mst@redhat.com>
> >>>---
> >>>
> >>>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[] = {

^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [Qemu-devel] [PATCH] virtio-net: require that config size is initialized
  2013-05-07 14:00       ` Michael S. Tsirkin
@ 2013-05-07 15:29         ` KONRAD Frédéric
  2013-05-07 15:55           ` Michael S. Tsirkin
  0 siblings, 1 reply; 7+ messages in thread
From: KONRAD Frédéric @ 2013-05-07 15:29 UTC (permalink / raw)
  To: Michael S. Tsirkin
  Cc: Peter Maydell, Anthony Liguori, Jason Wang, qemu-devel,
	Stefan Hajnoczi, Paolo Bonzini

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.

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?

>
>> 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 <mst@redhat.com>
>>>>> ---
>>>>>
>>>>> 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[] = {

^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [Qemu-devel] [PATCH] virtio-net: require that config size is initialized
  2013-05-07 15:29         ` KONRAD Frédéric
@ 2013-05-07 15:55           ` Michael S. Tsirkin
  0 siblings, 0 replies; 7+ messages in thread
From: Michael S. Tsirkin @ 2013-05-07 15:55 UTC (permalink / raw)
  To: KONRAD Frédéric
  Cc: Peter Maydell, Anthony Liguori, Jason Wang, qemu-devel,
	Stefan Hajnoczi, Paolo Bonzini

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 <mst@redhat.com>
> >>>>>---
> >>>>>
> >>>>>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[] = {

^ permalink raw reply	[flat|nested] 7+ messages in thread

end of thread, other threads:[~2013-05-07 15:55 UTC | newest]

Thread overview: 7+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2013-05-07 10:22 [Qemu-devel] [PATCH] virtio-net: require that config size is initialized Michael S. Tsirkin
2013-05-07 12:29 ` KONRAD Frédéric
2013-05-07 12:33   ` Michael S. Tsirkin
2013-05-07 12:54     ` KONRAD Frédéric
2013-05-07 14:00       ` Michael S. Tsirkin
2013-05-07 15:29         ` KONRAD Frédéric
2013-05-07 15:55           ` Michael S. Tsirkin

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).