All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH 1/4] net/virtio: fix dev_unplug_pending
@ 2019-11-14 14:16 Jens Freimann
  2019-11-14 14:16 ` [PATCH 2/4] net/virtio: return early when failover primary alread added Jens Freimann
                   ` (3 more replies)
  0 siblings, 4 replies; 10+ messages in thread
From: Jens Freimann @ 2019-11-14 14:16 UTC (permalink / raw)
  To: qemu-devel; +Cc: peter.maydell, jasowang, dgilbert, mst

.dev_unplug_pending is set up by virtio-net code indepent of whether
failover=on was set for the device or not. This gives a wrong result when
we check for existing primary devices in migration code.

Fix this by actually calling dev_unplug_pending() instead of just
checking if the function pointer was set. When the feature was not
negotiated dev_unplug_pending() will always return false. This prevents
us from going into the wait-unplug state when there's no primary device
present.

Fixes: 9711cd0dfc3f ("net/virtio: add failover support")
Signed-off-by: Jens Freimann <jfreimann@redhat.com>
Reported-by: Dr. David Alan Gilbert <dgilbert@redhat.com>
---
 hw/net/virtio-net.c | 3 +++
 migration/savevm.c  | 3 ++-
 2 files changed, 5 insertions(+), 1 deletion(-)

diff --git a/hw/net/virtio-net.c b/hw/net/virtio-net.c
index 97a5113f7e..946039c0dc 100644
--- a/hw/net/virtio-net.c
+++ b/hw/net/virtio-net.c
@@ -3124,6 +3124,9 @@ static bool primary_unplug_pending(void *opaque)
     VirtIODevice *vdev = VIRTIO_DEVICE(dev);
     VirtIONet *n = VIRTIO_NET(vdev);
 
+    if (!virtio_vdev_has_feature(vdev, VIRTIO_NET_F_STANDBY)) {
+        return false;
+    }
     return n->primary_dev ? n->primary_dev->pending_deleted_event : false;
 }
 
diff --git a/migration/savevm.c b/migration/savevm.c
index 966a9c3bdb..a71b930b91 100644
--- a/migration/savevm.c
+++ b/migration/savevm.c
@@ -1119,7 +1119,8 @@ int qemu_savevm_nr_failover_devices(void)
     int n = 0;
 
     QTAILQ_FOREACH(se, &savevm_state.handlers, entry) {
-        if (se->vmsd && se->vmsd->dev_unplug_pending) {
+        if (se->vmsd && se->vmsd->dev_unplug_pending &&
+            se->vmsd->dev_unplug_pending(se->opaque)) {
             n++;
         }
     }
-- 
2.21.0



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

* [PATCH 2/4] net/virtio: return early when failover primary alread added
  2019-11-14 14:16 [PATCH 1/4] net/virtio: fix dev_unplug_pending Jens Freimann
@ 2019-11-14 14:16 ` Jens Freimann
  2019-11-20 10:40   ` Michael S. Tsirkin
  2019-11-14 14:16 ` [PATCH 3/4] net/virtio: avoid passing NULL to qdev_set_parent_bus Jens Freimann
                   ` (2 subsequent siblings)
  3 siblings, 1 reply; 10+ messages in thread
From: Jens Freimann @ 2019-11-14 14:16 UTC (permalink / raw)
  To: qemu-devel; +Cc: peter.maydell, jasowang, dgilbert, mst

Bail out when primary device was already added before.
This avoids printing a wrong warning message during reboot.

Fixes: 9711cd0dfc3f ("net/virtio: add failover support")
Signed-off-by: Jens Freimann <jfreimann@redhat.com>
---
 hw/net/virtio-net.c | 4 ++++
 1 file changed, 4 insertions(+)

diff --git a/hw/net/virtio-net.c b/hw/net/virtio-net.c
index 946039c0dc..ac4d19109e 100644
--- a/hw/net/virtio-net.c
+++ b/hw/net/virtio-net.c
@@ -759,6 +759,10 @@ static void failover_add_primary(VirtIONet *n, Error **errp)
 {
     Error *err = NULL;
 
+    if (n->primary_dev) {
+        return;
+    }
+
     n->primary_device_opts = qemu_opts_find(qemu_find_opts("device"),
             n->primary_device_id);
     if (n->primary_device_opts) {
-- 
2.21.0



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

* [PATCH 3/4] net/virtio: avoid passing NULL to qdev_set_parent_bus
  2019-11-14 14:16 [PATCH 1/4] net/virtio: fix dev_unplug_pending Jens Freimann
  2019-11-14 14:16 ` [PATCH 2/4] net/virtio: return early when failover primary alread added Jens Freimann
@ 2019-11-14 14:16 ` Jens Freimann
  2019-11-20 10:46   ` Michael S. Tsirkin
  2019-11-14 14:16 ` [PATCH 4/4] net/virtio: return error when device_opts arg is NULL Jens Freimann
  2019-11-20 10:39 ` [PATCH 1/4] net/virtio: fix dev_unplug_pending Michael S. Tsirkin
  3 siblings, 1 reply; 10+ messages in thread
From: Jens Freimann @ 2019-11-14 14:16 UTC (permalink / raw)
  To: qemu-devel; +Cc: peter.maydell, jasowang, dgilbert, mst

Make sure no arguments for qdev_set_parent_bus are NULL.
This fixes CID 1407224.

Fixes: 9711cd0dfc3f ("net/virtio: add failover support")
Signed-off-by: Jens Freimann <jfreimann@redhat.com>
---
 hw/net/virtio-net.c | 14 ++++++++++----
 1 file changed, 10 insertions(+), 4 deletions(-)

diff --git a/hw/net/virtio-net.c b/hw/net/virtio-net.c
index ac4d19109e..81650d4dc0 100644
--- a/hw/net/virtio-net.c
+++ b/hw/net/virtio-net.c
@@ -2809,8 +2809,16 @@ static bool failover_replug_primary(VirtIONet *n, Error **errp)
     if (n->primary_device_opts) {
         if (n->primary_dev) {
             n->primary_bus = n->primary_dev->parent_bus;
+            if (n->primary_bus) {
+                qdev_set_parent_bus(n->primary_dev, n->primary_bus);
+            } else  {
+                error_setg(errp, "virtio_net: couldn't set bus for primary");
+                goto out;
+            }
+        } else {
+            error_setg(errp, "virtio_net: couldn't find primary device");
+            goto out;
         }
-        qdev_set_parent_bus(n->primary_dev, n->primary_bus);
         n->primary_should_be_hidden = false;
         qemu_opt_set_bool(n->primary_device_opts,
                 "partially_hotplugged", true, errp);
@@ -2819,10 +2827,8 @@ static bool failover_replug_primary(VirtIONet *n, Error **errp)
             hotplug_handler_pre_plug(hotplug_ctrl, n->primary_dev, errp);
             hotplug_handler_plug(hotplug_ctrl, n->primary_dev, errp);
         }
-        if (!n->primary_dev) {
-            error_setg(errp, "virtio_net: couldn't find primary device");
-        }
     }
+out:
     return *errp != NULL;
 }
 
-- 
2.21.0



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

* [PATCH 4/4] net/virtio: return error when device_opts arg is NULL
  2019-11-14 14:16 [PATCH 1/4] net/virtio: fix dev_unplug_pending Jens Freimann
  2019-11-14 14:16 ` [PATCH 2/4] net/virtio: return early when failover primary alread added Jens Freimann
  2019-11-14 14:16 ` [PATCH 3/4] net/virtio: avoid passing NULL to qdev_set_parent_bus Jens Freimann
@ 2019-11-14 14:16 ` Jens Freimann
  2019-11-20 10:47   ` Michael S. Tsirkin
  2019-11-20 10:39 ` [PATCH 1/4] net/virtio: fix dev_unplug_pending Michael S. Tsirkin
  3 siblings, 1 reply; 10+ messages in thread
From: Jens Freimann @ 2019-11-14 14:16 UTC (permalink / raw)
  To: qemu-devel; +Cc: peter.maydell, jasowang, dgilbert, mst

device_opts could be NULL. Make sure we don't pass it to
qemu_opts_to_dict. When we made sure it can't be NULL we can also remove
it from the if condition.
This fixes CID 1407222.

Fixes: 9711cd0dfc3f ("net/virtio: add failover support")
Signed-off-by: Jens Freimann <jfreimann@redhat.com>
---
 hw/net/virtio-net.c | 9 ++++++---
 1 file changed, 6 insertions(+), 3 deletions(-)

diff --git a/hw/net/virtio-net.c b/hw/net/virtio-net.c
index 81650d4dc0..d53aa5796b 100644
--- a/hw/net/virtio-net.c
+++ b/hw/net/virtio-net.c
@@ -2878,9 +2878,12 @@ static int virtio_net_primary_should_be_hidden(DeviceListener *listener,
             QemuOpts *device_opts)
 {
     VirtIONet *n = container_of(listener, VirtIONet, primary_listener);
-    bool match_found;
-    bool hide;
+    bool match_found = false;
+    bool hide = false;
 
+    if (!device_opts) {
+        return -1;
+    }
     n->primary_device_dict = qemu_opts_to_qdict(device_opts,
             n->primary_device_dict);
     if (n->primary_device_dict) {
@@ -2888,7 +2891,7 @@ static int virtio_net_primary_should_be_hidden(DeviceListener *listener,
         n->standby_id = g_strdup(qdict_get_try_str(n->primary_device_dict,
                     "failover_pair_id"));
     }
-    if (device_opts && g_strcmp0(n->standby_id, n->netclient_name) == 0) {
+    if (g_strcmp0(n->standby_id, n->netclient_name) == 0) {
         match_found = true;
     } else {
         match_found = false;
-- 
2.21.0



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

* Re: [PATCH 1/4] net/virtio: fix dev_unplug_pending
  2019-11-14 14:16 [PATCH 1/4] net/virtio: fix dev_unplug_pending Jens Freimann
                   ` (2 preceding siblings ...)
  2019-11-14 14:16 ` [PATCH 4/4] net/virtio: return error when device_opts arg is NULL Jens Freimann
@ 2019-11-20 10:39 ` Michael S. Tsirkin
  3 siblings, 0 replies; 10+ messages in thread
From: Michael S. Tsirkin @ 2019-11-20 10:39 UTC (permalink / raw)
  To: Jens Freimann; +Cc: peter.maydell, jasowang, qemu-devel, dgilbert

On Thu, Nov 14, 2019 at 03:16:10PM +0100, Jens Freimann wrote:
> .dev_unplug_pending is set up by virtio-net code indepent of whether
> failover=on was set for the device or not. This gives a wrong result when
> we check for existing primary devices in migration code.
> 
> Fix this by actually calling dev_unplug_pending() instead of just
> checking if the function pointer was set. When the feature was not
> negotiated dev_unplug_pending() will always return false. This prevents
> us from going into the wait-unplug state when there's no primary device
> present.
> 
> Fixes: 9711cd0dfc3f ("net/virtio: add failover support")
> Signed-off-by: Jens Freimann <jfreimann@redhat.com>
> Reported-by: Dr. David Alan Gilbert <dgilbert@redhat.com>

This isn't really a series, is it?
Just a bunch of independent patches...

anyway:

Reviewed-by: Michael S. Tsirkin <mst@redhat.com>


> ---
>  hw/net/virtio-net.c | 3 +++
>  migration/savevm.c  | 3 ++-
>  2 files changed, 5 insertions(+), 1 deletion(-)
> 
> diff --git a/hw/net/virtio-net.c b/hw/net/virtio-net.c
> index 97a5113f7e..946039c0dc 100644
> --- a/hw/net/virtio-net.c
> +++ b/hw/net/virtio-net.c
> @@ -3124,6 +3124,9 @@ static bool primary_unplug_pending(void *opaque)
>      VirtIODevice *vdev = VIRTIO_DEVICE(dev);
>      VirtIONet *n = VIRTIO_NET(vdev);
>  
> +    if (!virtio_vdev_has_feature(vdev, VIRTIO_NET_F_STANDBY)) {
> +        return false;
> +    }
>      return n->primary_dev ? n->primary_dev->pending_deleted_event : false;
>  }
>  
> diff --git a/migration/savevm.c b/migration/savevm.c
> index 966a9c3bdb..a71b930b91 100644
> --- a/migration/savevm.c
> +++ b/migration/savevm.c
> @@ -1119,7 +1119,8 @@ int qemu_savevm_nr_failover_devices(void)
>      int n = 0;
>  
>      QTAILQ_FOREACH(se, &savevm_state.handlers, entry) {
> -        if (se->vmsd && se->vmsd->dev_unplug_pending) {
> +        if (se->vmsd && se->vmsd->dev_unplug_pending &&
> +            se->vmsd->dev_unplug_pending(se->opaque)) {
>              n++;
>          }
>      }
> -- 
> 2.21.0



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

* Re: [PATCH 2/4] net/virtio: return early when failover primary alread added
  2019-11-14 14:16 ` [PATCH 2/4] net/virtio: return early when failover primary alread added Jens Freimann
@ 2019-11-20 10:40   ` Michael S. Tsirkin
  0 siblings, 0 replies; 10+ messages in thread
From: Michael S. Tsirkin @ 2019-11-20 10:40 UTC (permalink / raw)
  To: Jens Freimann; +Cc: peter.maydell, jasowang, qemu-devel, dgilbert

On Thu, Nov 14, 2019 at 03:16:11PM +0100, Jens Freimann wrote:
> Bail out when primary device was already added before.
> This avoids printing a wrong warning message during reboot.
> 
> Fixes: 9711cd0dfc3f ("net/virtio: add failover support")
> Signed-off-by: Jens Freimann <jfreimann@redhat.com>

Reviewed-by: Michael S. Tsirkin <mst@redhat.com>

> ---
>  hw/net/virtio-net.c | 4 ++++
>  1 file changed, 4 insertions(+)
> 
> diff --git a/hw/net/virtio-net.c b/hw/net/virtio-net.c
> index 946039c0dc..ac4d19109e 100644
> --- a/hw/net/virtio-net.c
> +++ b/hw/net/virtio-net.c
> @@ -759,6 +759,10 @@ static void failover_add_primary(VirtIONet *n, Error **errp)
>  {
>      Error *err = NULL;
>  
> +    if (n->primary_dev) {
> +        return;
> +    }
> +
>      n->primary_device_opts = qemu_opts_find(qemu_find_opts("device"),
>              n->primary_device_id);
>      if (n->primary_device_opts) {
> -- 
> 2.21.0



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

* Re: [PATCH 3/4] net/virtio: avoid passing NULL to qdev_set_parent_bus
  2019-11-14 14:16 ` [PATCH 3/4] net/virtio: avoid passing NULL to qdev_set_parent_bus Jens Freimann
@ 2019-11-20 10:46   ` Michael S. Tsirkin
  2019-11-20 12:03     ` Jens Freimann
  0 siblings, 1 reply; 10+ messages in thread
From: Michael S. Tsirkin @ 2019-11-20 10:46 UTC (permalink / raw)
  To: Jens Freimann; +Cc: peter.maydell, jasowang, qemu-devel, dgilbert

On Thu, Nov 14, 2019 at 03:16:12PM +0100, Jens Freimann wrote:
> Make sure no arguments for qdev_set_parent_bus are NULL.
> This fixes CID 1407224.
> 
> Fixes: 9711cd0dfc3f ("net/virtio: add failover support")
> Signed-off-by: Jens Freimann <jfreimann@redhat.com>
> ---
>  hw/net/virtio-net.c | 14 ++++++++++----
>  1 file changed, 10 insertions(+), 4 deletions(-)
> 
> diff --git a/hw/net/virtio-net.c b/hw/net/virtio-net.c
> index ac4d19109e..81650d4dc0 100644
> --- a/hw/net/virtio-net.c
> +++ b/hw/net/virtio-net.c
> @@ -2809,8 +2809,16 @@ static bool failover_replug_primary(VirtIONet *n, Error **errp)
>      if (n->primary_device_opts) {
>          if (n->primary_dev) {
>              n->primary_bus = n->primary_dev->parent_bus;
> +            if (n->primary_bus) {
> +                qdev_set_parent_bus(n->primary_dev, n->primary_bus);
> +            } else  {
> +                error_setg(errp, "virtio_net: couldn't set bus for primary");
> +                goto out;
> +            }
> +        } else {
> +            error_setg(errp, "virtio_net: couldn't find primary device");
> +            goto out;
>          }


A bit less messy:

if (!n->primary_dev) {
            error_setg(errp, "virtio_net: couldn't find primary device");
            goto err;
}

n->primary_bus = n->primary_dev->parent_bus;
if (!n->primary_bus) {
      error_setg(errp, "virtio_net: couldn't find primary device");
          goto err;
}

qdev_set_parent_bus(n->primary_dev, n->primary_bus);

err:
	return false;

also is it valid for primary_device_opts to not be present at all?
Maybe we should check that too.



> -        qdev_set_parent_bus(n->primary_dev, n->primary_bus);
>          n->primary_should_be_hidden = false;
>          qemu_opt_set_bool(n->primary_device_opts,
>                  "partially_hotplugged", true, errp);
> @@ -2819,10 +2827,8 @@ static bool failover_replug_primary(VirtIONet *n, Error **errp)
>              hotplug_handler_pre_plug(hotplug_ctrl, n->primary_dev, errp);
>              hotplug_handler_plug(hotplug_ctrl, n->primary_dev, errp);
>          }
> -        if (!n->primary_dev) {
> -            error_setg(errp, "virtio_net: couldn't find primary device");
> -        }
>      }
> +out:
>      return *errp != NULL;
>  }

I'd handle errors separately from good path.
BTW I don't understand something here:
*errp != NULL is true on error, no?
Why are we returning success?
Confused.
Just return true would be cleaner imho.

>  
> -- 
> 2.21.0



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

* Re: [PATCH 4/4] net/virtio: return error when device_opts arg is NULL
  2019-11-14 14:16 ` [PATCH 4/4] net/virtio: return error when device_opts arg is NULL Jens Freimann
@ 2019-11-20 10:47   ` Michael S. Tsirkin
  0 siblings, 0 replies; 10+ messages in thread
From: Michael S. Tsirkin @ 2019-11-20 10:47 UTC (permalink / raw)
  To: Jens Freimann; +Cc: peter.maydell, jasowang, qemu-devel, dgilbert

On Thu, Nov 14, 2019 at 03:16:13PM +0100, Jens Freimann wrote:
> device_opts could be NULL. Make sure we don't pass it to
> qemu_opts_to_dict. When we made sure it can't be NULL we can also remove
> it from the if condition.
> This fixes CID 1407222.
> 
> Fixes: 9711cd0dfc3f ("net/virtio: add failover support")
> Signed-off-by: Jens Freimann <jfreimann@redhat.com>

Reviewed-by: Michael S. Tsirkin <mst@redhat.com>

> ---
>  hw/net/virtio-net.c | 9 ++++++---
>  1 file changed, 6 insertions(+), 3 deletions(-)
> 
> diff --git a/hw/net/virtio-net.c b/hw/net/virtio-net.c
> index 81650d4dc0..d53aa5796b 100644
> --- a/hw/net/virtio-net.c
> +++ b/hw/net/virtio-net.c
> @@ -2878,9 +2878,12 @@ static int virtio_net_primary_should_be_hidden(DeviceListener *listener,
>              QemuOpts *device_opts)
>  {
>      VirtIONet *n = container_of(listener, VirtIONet, primary_listener);
> -    bool match_found;
> -    bool hide;
> +    bool match_found = false;
> +    bool hide = false;
>  
> +    if (!device_opts) {
> +        return -1;
> +    }
>      n->primary_device_dict = qemu_opts_to_qdict(device_opts,
>              n->primary_device_dict);
>      if (n->primary_device_dict) {
> @@ -2888,7 +2891,7 @@ static int virtio_net_primary_should_be_hidden(DeviceListener *listener,
>          n->standby_id = g_strdup(qdict_get_try_str(n->primary_device_dict,
>                      "failover_pair_id"));
>      }
> -    if (device_opts && g_strcmp0(n->standby_id, n->netclient_name) == 0) {
> +    if (g_strcmp0(n->standby_id, n->netclient_name) == 0) {
>          match_found = true;
>      } else {
>          match_found = false;
> -- 
> 2.21.0



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

* Re: [PATCH 3/4] net/virtio: avoid passing NULL to qdev_set_parent_bus
  2019-11-20 10:46   ` Michael S. Tsirkin
@ 2019-11-20 12:03     ` Jens Freimann
  2019-11-20 12:05       ` Michael S. Tsirkin
  0 siblings, 1 reply; 10+ messages in thread
From: Jens Freimann @ 2019-11-20 12:03 UTC (permalink / raw)
  To: Michael S. Tsirkin; +Cc: peter.maydell, jasowang, qemu-devel, dgilbert

On Wed, Nov 20, 2019 at 05:46:36AM -0500, Michael S. Tsirkin wrote:
>On Thu, Nov 14, 2019 at 03:16:12PM +0100, Jens Freimann wrote:
>> Make sure no arguments for qdev_set_parent_bus are NULL.
>> This fixes CID 1407224.
>>
>> Fixes: 9711cd0dfc3f ("net/virtio: add failover support")
>> Signed-off-by: Jens Freimann <jfreimann@redhat.com>
>> ---
>>  hw/net/virtio-net.c | 14 ++++++++++----
>>  1 file changed, 10 insertions(+), 4 deletions(-)
>>
>> diff --git a/hw/net/virtio-net.c b/hw/net/virtio-net.c
>> index ac4d19109e..81650d4dc0 100644
>> --- a/hw/net/virtio-net.c
>> +++ b/hw/net/virtio-net.c
>> @@ -2809,8 +2809,16 @@ static bool failover_replug_primary(VirtIONet *n, Error **errp)
>>      if (n->primary_device_opts) {
>>          if (n->primary_dev) {
>>              n->primary_bus = n->primary_dev->parent_bus;
>> +            if (n->primary_bus) {
>> +                qdev_set_parent_bus(n->primary_dev, n->primary_bus);
>> +            } else  {
>> +                error_setg(errp, "virtio_net: couldn't set bus for primary");
>> +                goto out;
>> +            }
>> +        } else {
>> +            error_setg(errp, "virtio_net: couldn't find primary device");
>> +            goto out;
>>          }
>
>
>A bit less messy:
>
>if (!n->primary_dev) {
>            error_setg(errp, "virtio_net: couldn't find primary device");
>            goto err;
>}
>
>n->primary_bus = n->primary_dev->parent_bus;
>if (!n->primary_bus) {
>      error_setg(errp, "virtio_net: couldn't find primary device");
>          goto err;
>}
>
>qdev_set_parent_bus(n->primary_dev, n->primary_bus);
>
>err:
>	return false;
>
>also is it valid for primary_device_opts to not be present at all?
>Maybe we should check that too.
>
>
>
>> -        qdev_set_parent_bus(n->primary_dev, n->primary_bus);
>>          n->primary_should_be_hidden = false;
>>          qemu_opt_set_bool(n->primary_device_opts,
>>                  "partially_hotplugged", true, errp);
>> @@ -2819,10 +2827,8 @@ static bool failover_replug_primary(VirtIONet *n, Error **errp)
>>              hotplug_handler_pre_plug(hotplug_ctrl, n->primary_dev, errp);
>>              hotplug_handler_plug(hotplug_ctrl, n->primary_dev, errp);
>>          }
>> -        if (!n->primary_dev) {
>> -            error_setg(errp, "virtio_net: couldn't find primary device");
>> -        }
>>      }
>> +out:
>>      return *errp != NULL;
>>  }
>
>I'd handle errors separately from good path.
>BTW I don't understand something here:
>*errp != NULL is true on error, no?
>Why are we returning success?
>Confused.
>Just return true would be cleaner imho.

I'll fix this and sent a new version as a single patch. As you said
this is not really a series, just individual patches. 

Thanks!

regards
Jens



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

* Re: [PATCH 3/4] net/virtio: avoid passing NULL to qdev_set_parent_bus
  2019-11-20 12:03     ` Jens Freimann
@ 2019-11-20 12:05       ` Michael S. Tsirkin
  0 siblings, 0 replies; 10+ messages in thread
From: Michael S. Tsirkin @ 2019-11-20 12:05 UTC (permalink / raw)
  To: Jens Freimann; +Cc: peter.maydell, jasowang, qemu-devel, dgilbert

On Wed, Nov 20, 2019 at 01:03:57PM +0100, Jens Freimann wrote:
> On Wed, Nov 20, 2019 at 05:46:36AM -0500, Michael S. Tsirkin wrote:
> > On Thu, Nov 14, 2019 at 03:16:12PM +0100, Jens Freimann wrote:
> > > Make sure no arguments for qdev_set_parent_bus are NULL.
> > > This fixes CID 1407224.
> > > 
> > > Fixes: 9711cd0dfc3f ("net/virtio: add failover support")
> > > Signed-off-by: Jens Freimann <jfreimann@redhat.com>
> > > ---
> > >  hw/net/virtio-net.c | 14 ++++++++++----
> > >  1 file changed, 10 insertions(+), 4 deletions(-)
> > > 
> > > diff --git a/hw/net/virtio-net.c b/hw/net/virtio-net.c
> > > index ac4d19109e..81650d4dc0 100644
> > > --- a/hw/net/virtio-net.c
> > > +++ b/hw/net/virtio-net.c
> > > @@ -2809,8 +2809,16 @@ static bool failover_replug_primary(VirtIONet *n, Error **errp)
> > >      if (n->primary_device_opts) {
> > >          if (n->primary_dev) {
> > >              n->primary_bus = n->primary_dev->parent_bus;
> > > +            if (n->primary_bus) {
> > > +                qdev_set_parent_bus(n->primary_dev, n->primary_bus);
> > > +            } else  {
> > > +                error_setg(errp, "virtio_net: couldn't set bus for primary");
> > > +                goto out;
> > > +            }
> > > +        } else {
> > > +            error_setg(errp, "virtio_net: couldn't find primary device");
> > > +            goto out;
> > >          }
> > 
> > 
> > A bit less messy:
> > 
> > if (!n->primary_dev) {
> >            error_setg(errp, "virtio_net: couldn't find primary device");
> >            goto err;
> > }
> > 
> > n->primary_bus = n->primary_dev->parent_bus;
> > if (!n->primary_bus) {
> >      error_setg(errp, "virtio_net: couldn't find primary device");
> >          goto err;
> > }
> > 
> > qdev_set_parent_bus(n->primary_dev, n->primary_bus);
> > 
> > err:
> > 	return false;
> > 
> > also is it valid for primary_device_opts to not be present at all?
> > Maybe we should check that too.
> > 
> > 
> > 
> > > -        qdev_set_parent_bus(n->primary_dev, n->primary_bus);
> > >          n->primary_should_be_hidden = false;
> > >          qemu_opt_set_bool(n->primary_device_opts,
> > >                  "partially_hotplugged", true, errp);
> > > @@ -2819,10 +2827,8 @@ static bool failover_replug_primary(VirtIONet *n, Error **errp)
> > >              hotplug_handler_pre_plug(hotplug_ctrl, n->primary_dev, errp);
> > >              hotplug_handler_plug(hotplug_ctrl, n->primary_dev, errp);
> > >          }
> > > -        if (!n->primary_dev) {
> > > -            error_setg(errp, "virtio_net: couldn't find primary device");
> > > -        }
> > >      }
> > > +out:
> > >      return *errp != NULL;
> > >  }
> > 
> > I'd handle errors separately from good path.
> > BTW I don't understand something here:
> > *errp != NULL is true on error, no?
> > Why are we returning success?
> > Confused.
> > Just return true would be cleaner imho.
> 
> I'll fix this and sent a new version as a single patch. As you said
> this is not really a series, just individual patches.
> 
> Thanks!
> 
> regards
> Jens

I'd just repost them all then. The series was also threaded weirdly
(e.g. there's no cover letter instead patches 2 and on link to patch 1).

-- 
MST



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

end of thread, other threads:[~2019-11-20 12:08 UTC | newest]

Thread overview: 10+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2019-11-14 14:16 [PATCH 1/4] net/virtio: fix dev_unplug_pending Jens Freimann
2019-11-14 14:16 ` [PATCH 2/4] net/virtio: return early when failover primary alread added Jens Freimann
2019-11-20 10:40   ` Michael S. Tsirkin
2019-11-14 14:16 ` [PATCH 3/4] net/virtio: avoid passing NULL to qdev_set_parent_bus Jens Freimann
2019-11-20 10:46   ` Michael S. Tsirkin
2019-11-20 12:03     ` Jens Freimann
2019-11-20 12:05       ` Michael S. Tsirkin
2019-11-14 14:16 ` [PATCH 4/4] net/virtio: return error when device_opts arg is NULL Jens Freimann
2019-11-20 10:47   ` Michael S. Tsirkin
2019-11-20 10:39 ` [PATCH 1/4] net/virtio: fix dev_unplug_pending Michael S. Tsirkin

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.