qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
* [PULL V2 0/3] Net patches
@ 2020-07-28  9:10 Jason Wang
  2020-07-28  9:10 ` [PULL V2 1/3] virtio-pci: fix wrong index in virtio_pci_queue_enabled Jason Wang
                   ` (3 more replies)
  0 siblings, 4 replies; 5+ messages in thread
From: Jason Wang @ 2020-07-28  9:10 UTC (permalink / raw)
  To: peter.maydell; +Cc: Jason Wang, qemu-devel

The following changes since commit 93ea484375ab473379dd9c836261ef484bd71ab1:

  Merge remote-tracking branch 'remotes/mst/tags/for_upstream' into staging (2020-07-27 21:00:01 +0100)

are available in the git repository at:

  https://github.com/jasowang/qemu.git tags/net-pull-request

for you to fetch changes up to 22dc8663d9fc7baa22100544c600b6285a63c7a3:

  net: forbid the reentrant RX (2020-07-28 16:57:58 +0800)

----------------------------------------------------------------
Want to send earlier but most patches just come.

- fix vhost-vdpa issues when no peer
- fix virtio-pci queue enabling index value
- forbid reentrant RX

Changes from V1:

- drop the patch that has been merged

----------------------------------------------------------------
Jason Wang (2):
      virtio-net: check the existence of peer before accessing vDPA config
      net: forbid the reentrant RX

Yuri Benditovich (1):
      virtio-pci: fix wrong index in virtio_pci_queue_enabled

 hw/net/virtio-net.c    | 30 +++++++++++++++++++-----------
 hw/virtio/virtio-pci.c |  2 +-
 net/queue.c            |  3 +++
 3 files changed, 23 insertions(+), 12 deletions(-)



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

* [PULL V2 1/3] virtio-pci: fix wrong index in virtio_pci_queue_enabled
  2020-07-28  9:10 [PULL V2 0/3] Net patches Jason Wang
@ 2020-07-28  9:10 ` Jason Wang
  2020-07-28  9:10 ` [PULL V2 2/3] virtio-net: check the existence of peer before accessing vDPA config Jason Wang
                   ` (2 subsequent siblings)
  3 siblings, 0 replies; 5+ messages in thread
From: Jason Wang @ 2020-07-28  9:10 UTC (permalink / raw)
  To: peter.maydell; +Cc: Yuri Benditovich, Jason Wang, qemu-devel

From: Yuri Benditovich <yuri.benditovich@daynix.com>

We should use the index passed by the caller instead of the queue_sel
when checking the enablement of a specific virtqueue.

This is reported in https://bugzilla.redhat.com/show_bug.cgi?id=1702608

Fixes: f19bcdfedd53 ("virtio-pci: implement queue_enabled method")
Signed-off-by: Yuri Benditovich <yuri.benditovich@daynix.com>
Signed-off-by: Jason Wang <jasowang@redhat.com>
---
 hw/virtio/virtio-pci.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/hw/virtio/virtio-pci.c b/hw/virtio/virtio-pci.c
index 4ad3ad8..ccdf54e 100644
--- a/hw/virtio/virtio-pci.c
+++ b/hw/virtio/virtio-pci.c
@@ -1113,7 +1113,7 @@ static bool virtio_pci_queue_enabled(DeviceState *d, int n)
     VirtIODevice *vdev = virtio_bus_get_device(&proxy->bus);
 
     if (virtio_vdev_has_feature(vdev, VIRTIO_F_VERSION_1)) {
-        return proxy->vqs[vdev->queue_sel].enabled;
+        return proxy->vqs[n].enabled;
     }
 
     return virtio_queue_enabled_legacy(vdev, n);
-- 
2.7.4



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

* [PULL V2 2/3] virtio-net: check the existence of peer before accessing vDPA config
  2020-07-28  9:10 [PULL V2 0/3] Net patches Jason Wang
  2020-07-28  9:10 ` [PULL V2 1/3] virtio-pci: fix wrong index in virtio_pci_queue_enabled Jason Wang
@ 2020-07-28  9:10 ` Jason Wang
  2020-07-28  9:10 ` [PULL V2 3/3] net: forbid the reentrant RX Jason Wang
  2020-07-28 16:14 ` [PULL V2 0/3] Net patches Peter Maydell
  3 siblings, 0 replies; 5+ messages in thread
From: Jason Wang @ 2020-07-28  9:10 UTC (permalink / raw)
  To: peter.maydell; +Cc: Jason Wang, qemu-devel, Cindy Lu

We try to check whether a peer is VDPA in order to get config from
there - with no peer, this leads to a NULL
pointer dereference. Add a check before trying to access the peer
type. No peer means not VDPA.

Fixes: 108a64818e69b ("vhost-vdpa: introduce vhost-vdpa backend")
Cc: Cindy Lu <lulu@redhat.com>
Tested-by: Cornelia Huck <cohuck@redhat.com>
Reviewed-by: Cornelia Huck <cohuck@redhat.com>
Signed-off-by: Jason Wang <jasowang@redhat.com>
---
 hw/net/virtio-net.c | 30 +++++++++++++++++++-----------
 1 file changed, 19 insertions(+), 11 deletions(-)

diff --git a/hw/net/virtio-net.c b/hw/net/virtio-net.c
index 4895af1..a1fe9e9 100644
--- a/hw/net/virtio-net.c
+++ b/hw/net/virtio-net.c
@@ -125,6 +125,7 @@ static void virtio_net_get_config(VirtIODevice *vdev, uint8_t *config)
 {
     VirtIONet *n = VIRTIO_NET(vdev);
     struct virtio_net_config netcfg;
+    NetClientState *nc = qemu_get_queue(n->nic);
 
     int ret = 0;
     memset(&netcfg, 0 , sizeof(struct virtio_net_config));
@@ -142,13 +143,16 @@ static void virtio_net_get_config(VirtIODevice *vdev, uint8_t *config)
                  VIRTIO_NET_RSS_SUPPORTED_HASHES);
     memcpy(config, &netcfg, n->config_size);
 
-    NetClientState *nc = qemu_get_queue(n->nic);
-    if (nc->peer->info->type == NET_CLIENT_DRIVER_VHOST_VDPA) {
+    /*
+     * Is this VDPA? No peer means not VDPA: there's no way to
+     * disconnect/reconnect a VDPA peer.
+     */
+    if (nc->peer && nc->peer->info->type == NET_CLIENT_DRIVER_VHOST_VDPA) {
         ret = vhost_net_get_config(get_vhost_net(nc->peer), (uint8_t *)&netcfg,
-                             n->config_size);
-    if (ret != -1) {
-        memcpy(config, &netcfg, n->config_size);
-    }
+                                   n->config_size);
+        if (ret != -1) {
+            memcpy(config, &netcfg, n->config_size);
+        }
     }
 }
 
@@ -156,6 +160,7 @@ static void virtio_net_set_config(VirtIODevice *vdev, const uint8_t *config)
 {
     VirtIONet *n = VIRTIO_NET(vdev);
     struct virtio_net_config netcfg = {};
+    NetClientState *nc = qemu_get_queue(n->nic);
 
     memcpy(&netcfg, config, n->config_size);
 
@@ -166,11 +171,14 @@ static void virtio_net_set_config(VirtIODevice *vdev, const uint8_t *config)
         qemu_format_nic_info_str(qemu_get_queue(n->nic), n->mac);
     }
 
-    NetClientState *nc = qemu_get_queue(n->nic);
-    if (nc->peer->info->type == NET_CLIENT_DRIVER_VHOST_VDPA) {
-        vhost_net_set_config(get_vhost_net(nc->peer), (uint8_t *)&netcfg,
-                               0, n->config_size,
-                        VHOST_SET_CONFIG_TYPE_MASTER);
+    /*
+     * Is this VDPA? No peer means not VDPA: there's no way to
+     * disconnect/reconnect a VDPA peer.
+     */
+    if (nc->peer && nc->peer->info->type == NET_CLIENT_DRIVER_VHOST_VDPA) {
+        vhost_net_set_config(get_vhost_net(nc->peer),
+                             (uint8_t *)&netcfg, 0, n->config_size,
+                             VHOST_SET_CONFIG_TYPE_MASTER);
       }
 }
 
-- 
2.7.4



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

* [PULL V2 3/3] net: forbid the reentrant RX
  2020-07-28  9:10 [PULL V2 0/3] Net patches Jason Wang
  2020-07-28  9:10 ` [PULL V2 1/3] virtio-pci: fix wrong index in virtio_pci_queue_enabled Jason Wang
  2020-07-28  9:10 ` [PULL V2 2/3] virtio-net: check the existence of peer before accessing vDPA config Jason Wang
@ 2020-07-28  9:10 ` Jason Wang
  2020-07-28 16:14 ` [PULL V2 0/3] Net patches Peter Maydell
  3 siblings, 0 replies; 5+ messages in thread
From: Jason Wang @ 2020-07-28  9:10 UTC (permalink / raw)
  To: peter.maydell; +Cc: Jason Wang, qemu-devel

The memory API allows DMA into NIC's MMIO area. This means the NIC's
RX routine must be reentrant. Instead of auditing all the NIC, we can
simply detect the reentrancy and return early. The queue->delivering
is set and cleared by qemu_net_queue_deliver() for other queue helpers
to know whether the delivering in on going (NIC's receive is being
called). We can check it and return early in qemu_net_queue_flush() to
forbid reentrant RX.

Signed-off-by: Jason Wang <jasowang@redhat.com>
---
 net/queue.c | 3 +++
 1 file changed, 3 insertions(+)

diff --git a/net/queue.c b/net/queue.c
index 0164727..19e32c8 100644
--- a/net/queue.c
+++ b/net/queue.c
@@ -250,6 +250,9 @@ void qemu_net_queue_purge(NetQueue *queue, NetClientState *from)
 
 bool qemu_net_queue_flush(NetQueue *queue)
 {
+    if (queue->delivering)
+        return false;
+
     while (!QTAILQ_EMPTY(&queue->packets)) {
         NetPacket *packet;
         int ret;
-- 
2.7.4



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

* Re: [PULL V2 0/3] Net patches
  2020-07-28  9:10 [PULL V2 0/3] Net patches Jason Wang
                   ` (2 preceding siblings ...)
  2020-07-28  9:10 ` [PULL V2 3/3] net: forbid the reentrant RX Jason Wang
@ 2020-07-28 16:14 ` Peter Maydell
  3 siblings, 0 replies; 5+ messages in thread
From: Peter Maydell @ 2020-07-28 16:14 UTC (permalink / raw)
  To: Jason Wang; +Cc: QEMU Developers

On Tue, 28 Jul 2020 at 10:10, Jason Wang <jasowang@redhat.com> wrote:
>
> The following changes since commit 93ea484375ab473379dd9c836261ef484bd71ab1:
>
>   Merge remote-tracking branch 'remotes/mst/tags/for_upstream' into staging (2020-07-27 21:00:01 +0100)
>
> are available in the git repository at:
>
>   https://github.com/jasowang/qemu.git tags/net-pull-request
>
> for you to fetch changes up to 22dc8663d9fc7baa22100544c600b6285a63c7a3:
>
>   net: forbid the reentrant RX (2020-07-28 16:57:58 +0800)
>
> ----------------------------------------------------------------
> Want to send earlier but most patches just come.
>
> - fix vhost-vdpa issues when no peer
> - fix virtio-pci queue enabling index value
> - forbid reentrant RX
>
> Changes from V1:
>
> - drop the patch that has been merged
>
> ----------------------------------------------------------------
> Jason Wang (2):
>       virtio-net: check the existence of peer before accessing vDPA config
>       net: forbid the reentrant RX
>
> Yuri Benditovich (1):
>       virtio-pci: fix wrong index in virtio_pci_queue_enabled


Applied, thanks.

Please update the changelog at https://wiki.qemu.org/ChangeLog/5.1
for any user-visible changes.

-- PMM


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

end of thread, other threads:[~2020-07-28 16:16 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2020-07-28  9:10 [PULL V2 0/3] Net patches Jason Wang
2020-07-28  9:10 ` [PULL V2 1/3] virtio-pci: fix wrong index in virtio_pci_queue_enabled Jason Wang
2020-07-28  9:10 ` [PULL V2 2/3] virtio-net: check the existence of peer before accessing vDPA config Jason Wang
2020-07-28  9:10 ` [PULL V2 3/3] net: forbid the reentrant RX Jason Wang
2020-07-28 16:14 ` [PULL V2 0/3] Net patches Peter Maydell

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