git.droids-corp.org
/
dpdk.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
compress/qat: enable compression on GEN3
[dpdk.git]
/
drivers
/
net
/
virtio
/
virtio_ethdev.c
diff --git
a/drivers/net/virtio/virtio_ethdev.c
b/drivers/net/virtio/virtio_ethdev.c
index
b6eb9d6
..
090d946
100644
(file)
--- a/
drivers/net/virtio/virtio_ethdev.c
+++ b/
drivers/net/virtio/virtio_ethdev.c
@@
-9,14
+9,11
@@
#include <unistd.h>
#include <ethdev_driver.h>
#include <unistd.h>
#include <ethdev_driver.h>
-#include <ethdev_pci.h>
#include <rte_memcpy.h>
#include <rte_string_fns.h>
#include <rte_memzone.h>
#include <rte_malloc.h>
#include <rte_branch_prediction.h>
#include <rte_memcpy.h>
#include <rte_string_fns.h>
#include <rte_memzone.h>
#include <rte_malloc.h>
#include <rte_branch_prediction.h>
-#include <rte_pci.h>
-#include <rte_bus_pci.h>
#include <rte_ether.h>
#include <rte_ip.h>
#include <rte_arp.h>
#include <rte_ether.h>
#include <rte_ip.h>
#include <rte_arp.h>
@@
-24,15
+21,15
@@
#include <rte_errno.h>
#include <rte_cpuflags.h>
#include <rte_vect.h>
#include <rte_errno.h>
#include <rte_cpuflags.h>
#include <rte_vect.h>
-
#include <rte_memory.h>
#include <rte_memory.h>
+#include <rte_eal_paging.h>
#include <rte_eal.h>
#include <rte_dev.h>
#include <rte_cycles.h>
#include <rte_kvargs.h>
#include "virtio_ethdev.h"
#include <rte_eal.h>
#include <rte_dev.h>
#include <rte_cycles.h>
#include <rte_kvargs.h>
#include "virtio_ethdev.h"
-#include "virtio
_pci
.h"
+#include "virtio.h"
#include "virtio_logs.h"
#include "virtqueue.h"
#include "virtio_rxtx.h"
#include "virtio_logs.h"
#include "virtqueue.h"
#include "virtio_rxtx.h"
@@
-136,7
+133,7
@@
virtio_send_command_packed(struct virtnet_ctl *cvq,
struct virtio_pmd_ctrl *ctrl,
int *dlen, int pkt_num)
{
struct virtio_pmd_ctrl *ctrl,
int *dlen, int pkt_num)
{
- struct virtqueue *vq =
cvq->vq
;
+ struct virtqueue *vq =
virtnet_cq_to_vq(cvq)
;
int head;
struct vring_packed_desc *desc = vq->vq_packed.ring.desc;
struct virtio_pmd_ctrl *result;
int head;
struct vring_packed_desc *desc = vq->vq_packed.ring.desc;
struct virtio_pmd_ctrl *result;
@@
-232,7
+229,7
@@
virtio_send_command_split(struct virtnet_ctl *cvq,
int *dlen, int pkt_num)
{
struct virtio_pmd_ctrl *result;
int *dlen, int pkt_num)
{
struct virtio_pmd_ctrl *result;
- struct virtqueue *vq =
cvq->vq
;
+ struct virtqueue *vq =
virtnet_cq_to_vq(cvq)
;
uint32_t head, i;
int k, sum = 0;
uint32_t head, i;
int k, sum = 0;
@@
-319,13
+316,13
@@
virtio_send_command(struct virtnet_ctl *cvq, struct virtio_pmd_ctrl *ctrl,
ctrl->status = status;
ctrl->status = status;
- if (!cvq
|| !cvq->vq
) {
+ if (!cvq) {
PMD_INIT_LOG(ERR, "Control queue is not supported.");
return -1;
}
rte_spinlock_lock(&cvq->lock);
PMD_INIT_LOG(ERR, "Control queue is not supported.");
return -1;
}
rte_spinlock_lock(&cvq->lock);
- vq =
cvq->vq
;
+ vq =
virtnet_cq_to_vq(cvq)
;
PMD_INIT_LOG(DEBUG, "vq->vq_desc_head_idx = %d, status = %d, "
"vq->hw->cvq = %p vq = %p",
PMD_INIT_LOG(DEBUG, "vq->vq_desc_head_idx = %d, status = %d, "
"vq->hw->cvq = %p vq = %p",
@@
-422,7
+419,7
@@
virtio_init_vring(struct virtqueue *vq)
}
static int
}
static int
-virtio_init_queue(struct rte_eth_dev *dev, uint16_t
vtpci_
queue_idx)
+virtio_init_queue(struct rte_eth_dev *dev, uint16_t queue_idx)
{
char vq_name[VIRTQUEUE_MAX_NAME_SZ];
char vq_hdr_name[VIRTQUEUE_MAX_NAME_SZ];
{
char vq_name[VIRTQUEUE_MAX_NAME_SZ];
char vq_hdr_name[VIRTQUEUE_MAX_NAME_SZ];
@@
-435,18
+432,19
@@
virtio_init_queue(struct rte_eth_dev *dev, uint16_t vtpci_queue_idx)
struct virtqueue *vq;
size_t sz_hdr_mz = 0;
void *sw_ring = NULL;
struct virtqueue *vq;
size_t sz_hdr_mz = 0;
void *sw_ring = NULL;
- int queue_type = virtio_get_queue_type(hw,
vtpci_
queue_idx);
+ int queue_type = virtio_get_queue_type(hw, queue_idx);
int ret;
int numa_node = dev->device->numa_node;
int ret;
int numa_node = dev->device->numa_node;
+ struct rte_mbuf *fake_mbuf = NULL;
PMD_INIT_LOG(INFO, "setting up queue: %u on NUMA node %d",
PMD_INIT_LOG(INFO, "setting up queue: %u on NUMA node %d",
-
vtpci_
queue_idx, numa_node);
+ queue_idx, numa_node);
/*
* Read the virtqueue size from the Queue Size field
* Always power of 2 and if 0 virtqueue does not exist
*/
/*
* Read the virtqueue size from the Queue Size field
* Always power of 2 and if 0 virtqueue does not exist
*/
- vq_size = VIRTIO_OPS(hw)->get_queue_num(hw,
vtpci_
queue_idx);
+ vq_size = VIRTIO_OPS(hw)->get_queue_num(hw, queue_idx);
PMD_INIT_LOG(DEBUG, "vq_size: %u", vq_size);
if (vq_size == 0) {
PMD_INIT_LOG(ERR, "virtqueue does not exist");
PMD_INIT_LOG(DEBUG, "vq_size: %u", vq_size);
if (vq_size == 0) {
PMD_INIT_LOG(ERR, "virtqueue does not exist");
@@
-459,7
+457,7
@@
virtio_init_queue(struct rte_eth_dev *dev, uint16_t vtpci_queue_idx)
}
snprintf(vq_name, sizeof(vq_name), "port%d_vq%d",
}
snprintf(vq_name, sizeof(vq_name), "port%d_vq%d",
- dev->data->port_id,
vtpci_
queue_idx);
+ dev->data->port_id, queue_idx);
size = RTE_ALIGN_CEIL(sizeof(*vq) +
vq_size * sizeof(struct vq_desc_extra),
size = RTE_ALIGN_CEIL(sizeof(*vq) +
vq_size * sizeof(struct vq_desc_extra),
@@
-472,7
+470,7
@@
virtio_init_queue(struct rte_eth_dev *dev, uint16_t vtpci_queue_idx)
sz_hdr_mz = vq_size * sizeof(struct virtio_tx_region);
} else if (queue_type == VTNET_CQ) {
/* Allocate a page for control vq command, data and status */
sz_hdr_mz = vq_size * sizeof(struct virtio_tx_region);
} else if (queue_type == VTNET_CQ) {
/* Allocate a page for control vq command, data and status */
- sz_hdr_mz =
PAGE_SIZE
;
+ sz_hdr_mz =
rte_mem_page_size()
;
}
vq = rte_zmalloc_socket(vq_name, size, RTE_CACHE_LINE_SIZE,
}
vq = rte_zmalloc_socket(vq_name, size, RTE_CACHE_LINE_SIZE,
@@
-481,10
+479,10
@@
virtio_init_queue(struct rte_eth_dev *dev, uint16_t vtpci_queue_idx)
PMD_INIT_LOG(ERR, "can not allocate vq");
return -ENOMEM;
}
PMD_INIT_LOG(ERR, "can not allocate vq");
return -ENOMEM;
}
- hw->vqs[
vtpci_
queue_idx] = vq;
+ hw->vqs[queue_idx] = vq;
vq->hw = hw;
vq->hw = hw;
- vq->vq_queue_index =
vtpci_
queue_idx;
+ vq->vq_queue_index = queue_idx;
vq->vq_nentries = vq_size;
if (virtio_with_packed_queue(hw)) {
vq->vq_packed.used_wrap_counter = 1;
vq->vq_nentries = vq_size;
if (virtio_with_packed_queue(hw)) {
vq->vq_packed.used_wrap_counter = 1;
@@
-510,7
+508,7
@@
virtio_init_queue(struct rte_eth_dev *dev, uint16_t vtpci_queue_idx)
mz = rte_memzone_lookup(vq_name);
if (mz == NULL) {
ret = -ENOMEM;
mz = rte_memzone_lookup(vq_name);
if (mz == NULL) {
ret = -ENOMEM;
- goto f
ail_q_alloc
;
+ goto f
ree_vq
;
}
}
}
}
@@
-527,7
+525,7
@@
virtio_init_queue(struct rte_eth_dev *dev, uint16_t vtpci_queue_idx)
if (sz_hdr_mz) {
snprintf(vq_hdr_name, sizeof(vq_hdr_name), "port%d_vq%d_hdr",
if (sz_hdr_mz) {
snprintf(vq_hdr_name, sizeof(vq_hdr_name), "port%d_vq%d_hdr",
- dev->data->port_id,
vtpci_
queue_idx);
+ dev->data->port_id, queue_idx);
hdr_mz = rte_memzone_reserve_aligned(vq_hdr_name, sz_hdr_mz,
numa_node, RTE_MEMZONE_IOVA_CONTIG,
RTE_CACHE_LINE_SIZE);
hdr_mz = rte_memzone_reserve_aligned(vq_hdr_name, sz_hdr_mz,
numa_node, RTE_MEMZONE_IOVA_CONTIG,
RTE_CACHE_LINE_SIZE);
@@
-536,7
+534,7
@@
virtio_init_queue(struct rte_eth_dev *dev, uint16_t vtpci_queue_idx)
hdr_mz = rte_memzone_lookup(vq_hdr_name);
if (hdr_mz == NULL) {
ret = -ENOMEM;
hdr_mz = rte_memzone_lookup(vq_hdr_name);
if (hdr_mz == NULL) {
ret = -ENOMEM;
- goto f
ail_q_alloc
;
+ goto f
ree_mz
;
}
}
}
}
}
}
@@
-550,28
+548,34
@@
virtio_init_queue(struct rte_eth_dev *dev, uint16_t vtpci_queue_idx)
if (!sw_ring) {
PMD_INIT_LOG(ERR, "can not allocate RX soft ring");
ret = -ENOMEM;
if (!sw_ring) {
PMD_INIT_LOG(ERR, "can not allocate RX soft ring");
ret = -ENOMEM;
- goto fail_q_alloc;
+ goto free_hdr_mz;
+ }
+
+ fake_mbuf = rte_zmalloc_socket("sw_ring", sizeof(*fake_mbuf),
+ RTE_CACHE_LINE_SIZE, numa_node);
+ if (!fake_mbuf) {
+ PMD_INIT_LOG(ERR, "can not allocate fake mbuf");
+ ret = -ENOMEM;
+ goto free_sw_ring;
}
vq->sw_ring = sw_ring;
rxvq = &vq->rxq;
}
vq->sw_ring = sw_ring;
rxvq = &vq->rxq;
- rxvq->vq = vq;
rxvq->port_id = dev->data->port_id;
rxvq->mz = mz;
rxvq->port_id = dev->data->port_id;
rxvq->mz = mz;
+ rxvq->fake_mbuf = fake_mbuf;
} else if (queue_type == VTNET_TQ) {
txvq = &vq->txq;
} else if (queue_type == VTNET_TQ) {
txvq = &vq->txq;
- txvq->vq = vq;
txvq->port_id = dev->data->port_id;
txvq->mz = mz;
txvq->virtio_net_hdr_mz = hdr_mz;
txvq->virtio_net_hdr_mem = hdr_mz->iova;
} else if (queue_type == VTNET_CQ) {
cvq = &vq->cq;
txvq->port_id = dev->data->port_id;
txvq->mz = mz;
txvq->virtio_net_hdr_mz = hdr_mz;
txvq->virtio_net_hdr_mem = hdr_mz->iova;
} else if (queue_type == VTNET_CQ) {
cvq = &vq->cq;
- cvq->vq = vq;
cvq->mz = mz;
cvq->virtio_net_hdr_mz = hdr_mz;
cvq->virtio_net_hdr_mem = hdr_mz->iova;
cvq->mz = mz;
cvq->virtio_net_hdr_mz = hdr_mz;
cvq->virtio_net_hdr_mem = hdr_mz->iova;
- memset(cvq->virtio_net_hdr_mz->addr, 0,
PAGE_SIZE
);
+ memset(cvq->virtio_net_hdr_mz->addr, 0,
rte_mem_page_size()
);
hw->cvq = cvq;
}
hw->cvq = cvq;
}
@@
-610,15
+614,22
@@
virtio_init_queue(struct rte_eth_dev *dev, uint16_t vtpci_queue_idx)
if (VIRTIO_OPS(hw)->setup_queue(hw, vq) < 0) {
PMD_INIT_LOG(ERR, "setup_queue failed");
if (VIRTIO_OPS(hw)->setup_queue(hw, vq) < 0) {
PMD_INIT_LOG(ERR, "setup_queue failed");
- return -EINVAL;
+ ret = -EINVAL;
+ goto clean_vq;
}
return 0;
}
return 0;
-fail_q_alloc:
+clean_vq:
+ hw->cvq = NULL;
+ rte_free(fake_mbuf);
+free_sw_ring:
rte_free(sw_ring);
rte_free(sw_ring);
+free_hdr_mz:
rte_memzone_free(hdr_mz);
rte_memzone_free(hdr_mz);
+free_mz:
rte_memzone_free(mz);
rte_memzone_free(mz);
+free_vq:
rte_free(vq);
return ret;
rte_free(vq);
return ret;
@@
-642,6
+653,7
@@
virtio_free_queues(struct virtio_hw *hw)
queue_type = virtio_get_queue_type(hw, i);
if (queue_type == VTNET_RQ) {
queue_type = virtio_get_queue_type(hw, i);
if (queue_type == VTNET_RQ) {
+ rte_free(vq->rxq.fake_mbuf);
rte_free(vq->sw_ring);
rte_memzone_free(vq->rxq.mz);
} else if (queue_type == VTNET_TQ) {
rte_free(vq->sw_ring);
rte_memzone_free(vq->rxq.mz);
} else if (queue_type == VTNET_TQ) {
@@
-854,7
+866,7
@@
virtio_dev_rx_queue_intr_enable(struct rte_eth_dev *dev, uint16_t queue_id)
{
struct virtio_hw *hw = dev->data->dev_private;
struct virtnet_rx *rxvq = dev->data->rx_queues[queue_id];
{
struct virtio_hw *hw = dev->data->dev_private;
struct virtnet_rx *rxvq = dev->data->rx_queues[queue_id];
- struct virtqueue *vq =
rxvq->vq
;
+ struct virtqueue *vq =
virtnet_rxq_to_vq(rxvq)
;
virtqueue_enable_intr(vq);
virtio_mb(hw->weak_barriers);
virtqueue_enable_intr(vq);
virtio_mb(hw->weak_barriers);
@@
-865,7
+877,7
@@
static int
virtio_dev_rx_queue_intr_disable(struct rte_eth_dev *dev, uint16_t queue_id)
{
struct virtnet_rx *rxvq = dev->data->rx_queues[queue_id];
virtio_dev_rx_queue_intr_disable(struct rte_eth_dev *dev, uint16_t queue_id)
{
struct virtnet_rx *rxvq = dev->data->rx_queues[queue_id];
- struct virtqueue *vq =
rxvq->vq
;
+ struct virtqueue *vq =
virtnet_rxq_to_vq(rxvq)
;
virtqueue_disable_intr(vq);
return 0;
virtqueue_disable_intr(vq);
return 0;
@@
-1841,7
+1853,6
@@
eth_virtio_dev_init(struct rte_eth_dev *eth_dev)
return -ENOMEM;
}
return -ENOMEM;
}
- hw->port_id = eth_dev->data->port_id;
rte_spinlock_init(&hw->state_lock);
/* reset device and negotiate default features */
rte_spinlock_init(&hw->state_lock);
/* reset device and negotiate default features */
@@
-2184,8
+2195,7
@@
static int
virtio_dev_start(struct rte_eth_dev *dev)
{
uint16_t nb_queues, i;
virtio_dev_start(struct rte_eth_dev *dev)
{
uint16_t nb_queues, i;
- struct virtnet_rx *rxvq;
- struct virtnet_tx *txvq __rte_unused;
+ struct virtqueue *vq;
struct virtio_hw *hw = dev->data->dev_private;
int ret;
struct virtio_hw *hw = dev->data->dev_private;
int ret;
@@
-2242,27
+2252,27
@@
virtio_dev_start(struct rte_eth_dev *dev)
PMD_INIT_LOG(DEBUG, "nb_queues=%d", nb_queues);
for (i = 0; i < dev->data->nb_rx_queues; i++) {
PMD_INIT_LOG(DEBUG, "nb_queues=%d", nb_queues);
for (i = 0; i < dev->data->nb_rx_queues; i++) {
-
rxvq = dev->data->rx_queues[i]
;
+
vq = virtnet_rxq_to_vq(dev->data->rx_queues[i])
;
/* Flush the old packets */
/* Flush the old packets */
- virtqueue_rxvq_flush(
rxvq->
vq);
- virtqueue_notify(
rxvq->
vq);
+ virtqueue_rxvq_flush(vq);
+ virtqueue_notify(vq);
}
for (i = 0; i < dev->data->nb_tx_queues; i++) {
}
for (i = 0; i < dev->data->nb_tx_queues; i++) {
-
txvq = dev->data->tx_queues[i]
;
- virtqueue_notify(
txvq->
vq);
+
vq = virtnet_txq_to_vq(dev->data->tx_queues[i])
;
+ virtqueue_notify(vq);
}
PMD_INIT_LOG(DEBUG, "Notified backend at initialization");
for (i = 0; i < dev->data->nb_rx_queues; i++) {
}
PMD_INIT_LOG(DEBUG, "Notified backend at initialization");
for (i = 0; i < dev->data->nb_rx_queues; i++) {
-
rxvq = dev->data->rx_queues[i]
;
- VIRTQUEUE_DUMP(
rxvq->
vq);
+
vq = virtnet_rxq_to_vq(dev->data->rx_queues[i])
;
+ VIRTQUEUE_DUMP(vq);
}
for (i = 0; i < dev->data->nb_tx_queues; i++) {
}
for (i = 0; i < dev->data->nb_tx_queues; i++) {
-
txvq = dev->data->tx_queues[i]
;
- VIRTQUEUE_DUMP(
txvq->
vq);
+
vq = virtnet_txq_to_vq(dev->data->tx_queues[i])
;
+ VIRTQUEUE_DUMP(vq);
}
set_rxtx_funcs(dev);
}
set_rxtx_funcs(dev);