]> git.droids-corp.org - dpdk.git/commitdiff
net/virtio: move control queue configuration
authorOlivier Matz <olivier.matz@6wind.com>
Thu, 13 Oct 2016 14:16:01 +0000 (16:16 +0200)
committerThomas Monjalon <thomas.monjalon@6wind.com>
Thu, 13 Oct 2016 18:17:38 +0000 (20:17 +0200)
Move the configuration of control queue in the configure callback.
This is needed by next commit, which introduces the reinitialization
of the device in the configure callback to change the feature flags.
Therefore, the control queue will have to be restarted at the same
place.

As virtio_dev_cq_queue_setup() is called from a place where
config->max_virtqueue_pairs is not available, we need to store this in
the private structure. It replaces max_rx_queues and max_tx_queues which
have the same value. The log showing the value of max_rx_queues and
max_tx_queues is also removed since config->max_virtqueue_pairs is
already displayed above.

Signed-off-by: Olivier Matz <olivier.matz@6wind.com>
Reviewed-by: Maxime Coquelin <maxime.coquelin@redhat.com>
Acked-by: Yuanhan Liu <yuanhan.liu@linux.intel.com>
drivers/net/virtio/virtio_ethdev.c
drivers/net/virtio/virtio_ethdev.h
drivers/net/virtio/virtio_pci.h

index fed3f6d54247a3d5e99ee87f030fcbd2075bf8fe..9abcfc9a9a196d8f6a44f8952610b26d1a6c39ef 100644 (file)
@@ -553,6 +553,9 @@ virtio_dev_close(struct rte_eth_dev *dev)
        if (hw->started == 1)
                virtio_dev_stop(dev);
 
+       if (hw->cvq)
+               virtio_dev_queue_release(hw->cvq->vq);
+
        /* reset the NIC */
        if (dev->data->dev_flags & RTE_ETH_DEV_INTR_LSC)
                vtpci_irq_config(hw, VIRTIO_MSI_NO_VECTOR);
@@ -1209,16 +1212,7 @@ virtio_init_device(struct rte_eth_dev *eth_dev)
                        config->max_virtqueue_pairs = 1;
                }
 
-               hw->max_rx_queues =
-                       (VIRTIO_MAX_RX_QUEUES < config->max_virtqueue_pairs) ?
-                       VIRTIO_MAX_RX_QUEUES : config->max_virtqueue_pairs;
-               hw->max_tx_queues =
-                       (VIRTIO_MAX_TX_QUEUES < config->max_virtqueue_pairs) ?
-                       VIRTIO_MAX_TX_QUEUES : config->max_virtqueue_pairs;
-
-               virtio_dev_cq_queue_setup(eth_dev,
-                                       config->max_virtqueue_pairs * 2,
-                                       SOCKET_ID_ANY);
+               hw->max_queue_pairs = config->max_virtqueue_pairs;
 
                PMD_INIT_LOG(DEBUG, "config->max_virtqueue_pairs=%d",
                                config->max_virtqueue_pairs);
@@ -1229,19 +1223,15 @@ virtio_init_device(struct rte_eth_dev *eth_dev)
                                config->mac[2], config->mac[3],
                                config->mac[4], config->mac[5]);
        } else {
-               hw->max_rx_queues = 1;
-               hw->max_tx_queues = 1;
+               PMD_INIT_LOG(DEBUG, "config->max_virtqueue_pairs=1");
+               hw->max_queue_pairs = 1;
        }
 
-       PMD_INIT_LOG(DEBUG, "hw->max_rx_queues=%d   hw->max_tx_queues=%d",
-                       hw->max_rx_queues, hw->max_tx_queues);
        if (pci_dev)
                PMD_INIT_LOG(DEBUG, "port %d vendorID=0x%x deviceID=0x%x",
                        eth_dev->data->port_id, pci_dev->id.vendor_id,
                        pci_dev->id.device_id);
 
-       virtio_dev_cq_start(eth_dev);
-
        return 0;
 }
 
@@ -1303,7 +1293,6 @@ static int
 eth_virtio_dev_uninit(struct rte_eth_dev *eth_dev)
 {
        struct rte_pci_device *pci_dev;
-       struct virtio_hw *hw = eth_dev->data->dev_private;
 
        PMD_INIT_FUNC_TRACE();
 
@@ -1319,9 +1308,6 @@ eth_virtio_dev_uninit(struct rte_eth_dev *eth_dev)
        eth_dev->tx_pkt_burst = NULL;
        eth_dev->rx_pkt_burst = NULL;
 
-       if (hw->cvq)
-               virtio_dev_queue_release(hw->cvq->vq);
-
        rte_free(eth_dev->data->mac_addrs);
        eth_dev->data->mac_addrs = NULL;
 
@@ -1373,6 +1359,7 @@ virtio_dev_configure(struct rte_eth_dev *dev)
 {
        const struct rte_eth_rxmode *rxmode = &dev->data->dev_conf.rxmode;
        struct virtio_hw *hw = dev->data->dev_private;
+       int ret;
 
        PMD_INIT_LOG(DEBUG, "configure");
 
@@ -1381,6 +1368,16 @@ virtio_dev_configure(struct rte_eth_dev *dev)
                return -EINVAL;
        }
 
+       /* Setup and start control queue */
+       if (vtpci_with_feature(hw, VIRTIO_NET_F_CTRL_VQ)) {
+               ret = virtio_dev_cq_queue_setup(dev,
+                       hw->max_queue_pairs * 2,
+                       SOCKET_ID_ANY);
+               if (ret < 0)
+                       return ret;
+               virtio_dev_cq_start(dev);
+       }
+
        hw->vlan_strip = rxmode->hw_vlan_strip;
 
        if (rxmode->hw_vlan_filter
@@ -1574,8 +1571,10 @@ virtio_dev_info_get(struct rte_eth_dev *dev, struct rte_eth_dev_info *dev_info)
                dev_info->driver_name = dev->driver->pci_drv.driver.name;
        else
                dev_info->driver_name = "virtio_user PMD";
-       dev_info->max_rx_queues = (uint16_t)hw->max_rx_queues;
-       dev_info->max_tx_queues = (uint16_t)hw->max_tx_queues;
+       dev_info->max_rx_queues =
+               RTE_MIN(hw->max_queue_pairs, VIRTIO_MAX_RX_QUEUES);
+       dev_info->max_tx_queues =
+               RTE_MIN(hw->max_queue_pairs, VIRTIO_MAX_TX_QUEUES);
        dev_info->min_rx_bufsize = VIRTIO_MIN_RX_BUFSIZE;
        dev_info->max_rx_pktlen = VIRTIO_MAX_RX_PKTLEN;
        dev_info->max_mac_addrs = VIRTIO_MAX_MAC_ADDRS;
index b36202587974352b6f18ddecd150241bc351c497..2fd28ead23685ea9a99df7fee18f620484bb4395 100644 (file)
@@ -47,8 +47,8 @@
 #define PAGE_SIZE 4096
 #endif
 
-#define VIRTIO_MAX_RX_QUEUES 128
-#define VIRTIO_MAX_TX_QUEUES 128
+#define VIRTIO_MAX_RX_QUEUES 128U
+#define VIRTIO_MAX_TX_QUEUES 128U
 #define VIRTIO_MAX_MAC_ADDRS 64
 #define VIRTIO_MIN_RX_BUFSIZE 64
 #define VIRTIO_MAX_RX_PKTLEN  9728
index 6aa5fb816599cbb563e9b317e8e87f66cc69e538..38168e0b5ae9dc2ddc3bbf1d55dffbdb9594a320 100644 (file)
@@ -247,8 +247,7 @@ struct virtio_hw {
        struct virtnet_ctl *cvq;
        struct rte_pci_ioport io;
        uint64_t    guest_features;
-       uint32_t    max_tx_queues;
-       uint32_t    max_rx_queues;
+       uint32_t    max_queue_pairs;
        uint16_t    vtnet_hdr_size;
        uint8_t     vlan_strip;
        uint8_t     use_msix;