virtio: use weaker barriers
[dpdk.git] / lib / librte_pmd_virtio / virtio_ethdev.c
index c009f2a..dc0c6b3 100644 (file)
@@ -175,7 +175,7 @@ virtio_send_command(struct virtqueue *vq, struct virtio_pmd_ctrl *ctrl,
                uint32_t idx, desc_idx, used_idx;
                struct vring_used_elem *uep;
 
-               rmb();
+               virtio_rmb();
 
                used_idx = (uint32_t)(vq->vq_used_cons_idx
                                & (vq->vq_nentries - 1));
@@ -274,18 +274,18 @@ int virtio_dev_queue_setup(struct rte_eth_dev *dev,
                snprintf(vq_name, sizeof(vq_name), "port%d_rvq%d",
                        dev->data->port_id, queue_idx);
                vq = rte_zmalloc(vq_name, sizeof(struct virtqueue) +
-                       vq_size * sizeof(struct vq_desc_extra), CACHE_LINE_SIZE);
+                       vq_size * sizeof(struct vq_desc_extra), RTE_CACHE_LINE_SIZE);
        } else if (queue_type == VTNET_TQ) {
                snprintf(vq_name, sizeof(vq_name), "port%d_tvq%d",
                        dev->data->port_id, queue_idx);
                vq = rte_zmalloc(vq_name, sizeof(struct virtqueue) +
-                       vq_size * sizeof(struct vq_desc_extra), CACHE_LINE_SIZE);
+                       vq_size * sizeof(struct vq_desc_extra), RTE_CACHE_LINE_SIZE);
        } else if (queue_type == VTNET_CQ) {
                snprintf(vq_name, sizeof(vq_name), "port%d_cvq",
                        dev->data->port_id);
                vq = rte_zmalloc(vq_name, sizeof(struct virtqueue) +
                        vq_size * sizeof(struct vq_desc_extra),
-                       CACHE_LINE_SIZE);
+                       RTE_CACHE_LINE_SIZE);
        }
        if (vq == NULL) {
                PMD_INIT_LOG(ERR, "%s: Can not allocate virtqueue", __func__);
@@ -342,7 +342,7 @@ int virtio_dev_queue_setup(struct rte_eth_dev *dev,
                        dev->data->port_id, queue_idx);
                vq->virtio_net_hdr_mz = rte_memzone_reserve_aligned(vq_name,
                        vq_size * hw->vtnet_hdr_size,
-                       socket_id, 0, CACHE_LINE_SIZE);
+                       socket_id, 0, RTE_CACHE_LINE_SIZE);
                if (vq->virtio_net_hdr_mz == NULL) {
                        rte_free(vq);
                        return -ENOMEM;
@@ -356,7 +356,7 @@ int virtio_dev_queue_setup(struct rte_eth_dev *dev,
                snprintf(vq_name, sizeof(vq_name), "port%d_cvq_hdrzone",
                        dev->data->port_id);
                vq->virtio_net_hdr_mz = rte_memzone_reserve_aligned(vq_name,
-                       PAGE_SIZE, socket_id, 0, CACHE_LINE_SIZE);
+                       PAGE_SIZE, socket_id, 0, RTE_CACHE_LINE_SIZE);
                if (vq->virtio_net_hdr_mz == NULL) {
                        rte_free(vq);
                        return -ENOMEM;
@@ -794,6 +794,41 @@ virtio_has_msix(const struct rte_pci_addr *loc)
 
        return (d != NULL);
 }
+
+/* Extract I/O port numbers from sysfs */
+static int virtio_resource_init(struct rte_pci_device *pci_dev)
+{
+       char dirname[PATH_MAX];
+       char filename[PATH_MAX];
+       unsigned long start, size;
+
+       if (get_uio_dev(&pci_dev->addr, dirname, sizeof(dirname)) < 0)
+               return -1;
+
+       /* get portio size */
+       snprintf(filename, sizeof(filename),
+                    "%s/portio/port0/size", dirname);
+       if (parse_sysfs_value(filename, &size) < 0) {
+               PMD_INIT_LOG(ERR, "%s(): cannot parse size",
+                            __func__);
+               return -1;
+       }
+
+       /* get portio start */
+       snprintf(filename, sizeof(filename),
+                "%s/portio/port0/start", dirname);
+       if (parse_sysfs_value(filename, &start) < 0) {
+               PMD_INIT_LOG(ERR, "%s(): cannot parse portio start",
+                            __func__);
+               return -1;
+       }
+       pci_dev->mem_resource[0].addr = (void *)(uintptr_t)start;
+       pci_dev->mem_resource[0].len =  (uint64_t)size;
+       PMD_INIT_LOG(DEBUG,
+                    "PCI Port IO found start=0x%lx with size=0x%lx",
+                    start, size);
+       return 0;
+}
 #else
 static int
 virtio_has_msix(const struct rte_pci_addr *loc __rte_unused)
@@ -801,6 +836,12 @@ virtio_has_msix(const struct rte_pci_addr *loc __rte_unused)
        /* nic_uio does not enable interrupts, return 0 (false). */
        return 0;
 }
+
+static int virtio_resource_init(struct rte_pci_device *pci_dev __rte_unused)
+{
+       /* no setup required */
+       return 0;
+}
 #endif
 
 /*
@@ -818,11 +859,7 @@ eth_virtio_dev_init(__rte_unused struct eth_driver *eth_drv,
        struct virtio_hw *hw =
                VIRTIO_DEV_PRIVATE_TO_HW(eth_dev->data->dev_private);
 
-       if (RTE_PKTMBUF_HEADROOM < sizeof(struct virtio_net_hdr)) {
-               PMD_INIT_LOG(ERR,
-                       "MBUF HEADROOM should be enough to hold virtio net hdr\n");
-               return -1;
-       }
+       RTE_BUILD_BUG_ON(RTE_PKTMBUF_HEADROOM < sizeof(struct virtio_net_hdr));
 
        eth_dev->dev_ops = &virtio_eth_dev_ops;
        eth_dev->tx_pkt_burst = &virtio_xmit_pkts;
@@ -831,40 +868,9 @@ eth_virtio_dev_init(__rte_unused struct eth_driver *eth_drv,
                return 0;
 
        pci_dev = eth_dev->pci_dev;
+       if (virtio_resource_init(pci_dev) < 0)
+               return -1;
 
-#ifdef RTE_EXEC_ENV_LINUXAPP
-       {
-               char dirname[PATH_MAX];
-               char filename[PATH_MAX];
-               unsigned long start, size;
-
-               if (get_uio_dev(&pci_dev->addr, dirname, sizeof(dirname)) < 0)
-                       return -1;
-
-               /* get portio size */
-               snprintf(filename, sizeof(filename),
-                            "%s/portio/port0/size", dirname);
-               if (parse_sysfs_value(filename, &size) < 0) {
-                       PMD_INIT_LOG(ERR, "%s(): cannot parse size",
-                                    __func__);
-                       return -1;
-               }
-
-               /* get portio start */
-               snprintf(filename, sizeof(filename),
-                            "%s/portio/port0/start", dirname);
-               if (parse_sysfs_value(filename, &start) < 0) {
-                       PMD_INIT_LOG(ERR, "%s(): cannot parse portio start",
-                                    __func__);
-                       return -1;
-               }
-               pci_dev->mem_resource[0].addr = (void *)(uintptr_t)start;
-               pci_dev->mem_resource[0].len =  (uint64_t)size;
-               PMD_INIT_LOG(DEBUG,
-                            "PCI Port IO found start=0x%lx with size=0x%lx",
-                            start, size);
-       }
-#endif
        hw->use_msix = virtio_has_msix(&pci_dev->addr);
        hw->io_base = (uint32_t)(uintptr_t)pci_dev->mem_resource[0].addr;