net/virtio: simplify queue allocation
Let rxq/txq/cq be the union field of the virtqueue struct. This would simplifies the vq allocation a bit: we don't need calculate the vq_size any more based on the queue type. Signed-off-by: Yuanhan Liu <yuanhan.liu@linux.intel.com> Reviewed-by: Maxime Coquelin <maxime.coquelin@redhat.com>
This commit is contained in:
parent
73d017dd9c
commit
905a246929
@ -312,7 +312,7 @@ int virtio_dev_queue_setup(struct rte_eth_dev *dev,
|
||||
struct virtnet_tx *txvq = NULL;
|
||||
struct virtnet_ctl *cvq = NULL;
|
||||
struct virtqueue *vq;
|
||||
size_t sz_vq, sz_q = 0, sz_hdr_mz = 0;
|
||||
size_t sz_hdr_mz = 0;
|
||||
void *sw_ring = NULL;
|
||||
int ret;
|
||||
|
||||
@ -337,25 +337,21 @@ int virtio_dev_queue_setup(struct rte_eth_dev *dev,
|
||||
snprintf(vq_name, sizeof(vq_name), "port%d_vq%d",
|
||||
dev->data->port_id, vtpci_queue_idx);
|
||||
|
||||
sz_vq = RTE_ALIGN_CEIL(sizeof(*vq) +
|
||||
size = RTE_ALIGN_CEIL(sizeof(*vq) +
|
||||
vq_size * sizeof(struct vq_desc_extra),
|
||||
RTE_CACHE_LINE_SIZE);
|
||||
if (queue_type == VTNET_RQ) {
|
||||
sz_q = sz_vq + sizeof(*rxvq);
|
||||
} else if (queue_type == VTNET_TQ) {
|
||||
sz_q = sz_vq + sizeof(*txvq);
|
||||
if (queue_type == VTNET_TQ) {
|
||||
/*
|
||||
* For each xmit packet, allocate a virtio_net_hdr
|
||||
* and indirect ring elements
|
||||
*/
|
||||
sz_hdr_mz = vq_size * sizeof(struct virtio_tx_region);
|
||||
} else if (queue_type == VTNET_CQ) {
|
||||
sz_q = sz_vq + sizeof(*cvq);
|
||||
/* Allocate a page for control vq command, data and status */
|
||||
sz_hdr_mz = PAGE_SIZE;
|
||||
}
|
||||
|
||||
vq = rte_zmalloc_socket(vq_name, sz_q, RTE_CACHE_LINE_SIZE, socket_id);
|
||||
vq = rte_zmalloc_socket(vq_name, size, RTE_CACHE_LINE_SIZE, socket_id);
|
||||
if (vq == NULL) {
|
||||
PMD_INIT_LOG(ERR, "can not allocate vq");
|
||||
return -ENOMEM;
|
||||
@ -425,14 +421,14 @@ int virtio_dev_queue_setup(struct rte_eth_dev *dev,
|
||||
}
|
||||
|
||||
vq->sw_ring = sw_ring;
|
||||
rxvq = (struct virtnet_rx *)RTE_PTR_ADD(vq, sz_vq);
|
||||
rxvq = &vq->rxq;
|
||||
rxvq->vq = vq;
|
||||
rxvq->port_id = dev->data->port_id;
|
||||
rxvq->queue_id = queue_idx;
|
||||
rxvq->mz = mz;
|
||||
*pvq = rxvq;
|
||||
} else if (queue_type == VTNET_TQ) {
|
||||
txvq = (struct virtnet_tx *)RTE_PTR_ADD(vq, sz_vq);
|
||||
txvq = &vq->txq;
|
||||
txvq->vq = vq;
|
||||
txvq->port_id = dev->data->port_id;
|
||||
txvq->queue_id = queue_idx;
|
||||
@ -442,7 +438,7 @@ int virtio_dev_queue_setup(struct rte_eth_dev *dev,
|
||||
|
||||
*pvq = txvq;
|
||||
} else if (queue_type == VTNET_CQ) {
|
||||
cvq = (struct virtnet_ctl *)RTE_PTR_ADD(vq, sz_vq);
|
||||
cvq = &vq->cq;
|
||||
cvq->vq = vq;
|
||||
cvq->mz = mz;
|
||||
cvq->virtio_net_hdr_mz = hdr_mz;
|
||||
|
@ -44,6 +44,7 @@
|
||||
#include "virtio_pci.h"
|
||||
#include "virtio_ring.h"
|
||||
#include "virtio_logs.h"
|
||||
#include "virtio_rxtx.h"
|
||||
|
||||
struct rte_mbuf;
|
||||
|
||||
@ -191,6 +192,12 @@ struct virtqueue {
|
||||
void *vq_ring_virt_mem; /**< linear address of vring*/
|
||||
unsigned int vq_ring_size;
|
||||
|
||||
union {
|
||||
struct virtnet_rx rxq;
|
||||
struct virtnet_tx txq;
|
||||
struct virtnet_ctl cq;
|
||||
};
|
||||
|
||||
phys_addr_t vq_ring_mem; /**< physical address of vring,
|
||||
* or virtual address for virtio_user. */
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user