[dpdk-dev,5/5] virtio: fix ring size negotiation

Message ID 1434038007-8964-6-git-send-email-stephen@networkplumber.org (mailing list archive)
State Accepted, archived
Headers

Commit Message

Stephen Hemminger June 11, 2015, 3:53 p.m. UTC
  From: Stephen Hemminger <shemming@brocade.com>

Negotate the virtio ring size. The host may allow for very large
rings but application may only want a smaller ring.
Conversely, if the number of descriptors requested exceeds the virtio
host queue size, then just silently use the smaller host size.

This fixes issues with virtio in non-QEMU envirionments.
For example Google Compute Engine allows up to 16K elements
in ring.

Signed-off-by: Stephen Hemminger <stephen@networkplumber.org>
---
 drivers/net/virtio/virtio_ethdev.c | 18 +++++++++++++-----
 1 file changed, 13 insertions(+), 5 deletions(-)
  

Comments

Ouyang Changchun June 12, 2015, 1:49 a.m. UTC | #1
> -----Original Message-----
> From: Stephen Hemminger [mailto:stephen@networkplumber.org]
> Sent: Thursday, June 11, 2015 11:53 PM
> To: Ouyang, Changchun
> Cc: dev@dpdk.org; Stephen Hemminger; Stephen Hemminger
> Subject: [PATCH 5/5] virtio: fix ring size negotiation
> 
> From: Stephen Hemminger <shemming@brocade.com>
> 
> Negotate the virtio ring size. The host may allow for very large rings but
> application may only want a smaller ring.
> Conversely, if the number of descriptors requested exceeds the virtio host
> queue size, then just silently use the smaller host size.
> 
> This fixes issues with virtio in non-QEMU envirionments.
> For example Google Compute Engine allows up to 16K elements in ring.
> 
> Signed-off-by: Stephen Hemminger <stephen@networkplumber.org>

Acked-by: Changchun Ouyang<changchun.ouyang@intel.com>
  

Patch

diff --git a/drivers/net/virtio/virtio_ethdev.c b/drivers/net/virtio/virtio_ethdev.c
index 2afa371..befd0bc 100644
--- a/drivers/net/virtio/virtio_ethdev.c
+++ b/drivers/net/virtio/virtio_ethdev.c
@@ -267,13 +267,21 @@  int virtio_dev_queue_setup(struct rte_eth_dev *dev,
 	if (vq_size == 0) {
 		PMD_INIT_LOG(ERR, "%s: virtqueue does not exist", __func__);
 		return -EINVAL;
-	} else if (!rte_is_power_of_2(vq_size)) {
+	}
+
+	if (!rte_is_power_of_2(vq_size)) {
 		PMD_INIT_LOG(ERR, "%s: virtqueue size is not powerof 2", __func__);
 		return -EINVAL;
-	} else if (nb_desc != vq_size) {
-		PMD_INIT_LOG(ERR, "Warning: nb_desc(%d) is not equal to vq size (%d), fall to vq size",
-			nb_desc, vq_size);
-		nb_desc = vq_size;
+	}
+
+	if (nb_desc < vq_size) {
+		if (!rte_is_power_of_2(nb_desc)) {
+			PMD_INIT_LOG(ERR,
+				     "nb_desc(%u) size is not powerof 2",
+				     nb_desc);
+			return -EINVAL;
+		}
+		vq_size = nb_desc;
 	}
 
 	if (queue_type == VTNET_RQ) {