Skip to content

Commit

Permalink
net/mlx5: support Rx queue count API
Browse files Browse the repository at this point in the history
This patch adds support for the rx_queue_count API in mlx5 driver

Signed-off-by: Tom Barbette <barbette@kth.se>
Acked-by: Shahaf Shuler <shahafs@mellanox.com>
  • Loading branch information
tbarbette authored and Ferruh Yigit committed Nov 5, 2018
1 parent a4391f8 commit 26f0488
Show file tree
Hide file tree
Showing 3 changed files with 70 additions and 10 deletions.
1 change: 1 addition & 0 deletions drivers/net/mlx5/mlx5.c
Original file line number Diff line number Diff line change
Expand Up @@ -399,6 +399,7 @@ const struct eth_dev_ops mlx5_dev_ops = {
.filter_ctrl = mlx5_dev_filter_ctrl,
.rx_descriptor_status = mlx5_rx_descriptor_status,
.tx_descriptor_status = mlx5_tx_descriptor_status,
.rx_queue_count = mlx5_rx_queue_count,
.rx_queue_intr_enable = mlx5_rx_intr_enable,
.rx_queue_intr_disable = mlx5_rx_intr_disable,
.is_removed = mlx5_is_removed,
Expand Down
78 changes: 68 additions & 10 deletions drivers/net/mlx5/mlx5_rxtx.c
Original file line number Diff line number Diff line change
Expand Up @@ -417,20 +417,17 @@ mlx5_tx_descriptor_status(void *tx_queue, uint16_t offset)
}

/**
* DPDK callback to check the status of a rx descriptor.
* Internal function to compute the number of used descriptors in an RX queue
*
* @param rx_queue
* The rx queue.
* @param[in] offset
* The index of the descriptor in the ring.
* @param rxq
* The Rx queue.
*
* @return
* The status of the tx descriptor.
* The number of used rx descriptor.
*/
int
mlx5_rx_descriptor_status(void *rx_queue, uint16_t offset)
static uint32_t
rx_queue_count(struct mlx5_rxq_data *rxq)
{
struct mlx5_rxq_data *rxq = rx_queue;
struct rxq_zip *zip = &rxq->zip;
volatile struct mlx5_cqe *cqe;
const unsigned int cqe_n = (1 << rxq->cqe_n);
Expand Down Expand Up @@ -461,11 +458,72 @@ mlx5_rx_descriptor_status(void *rx_queue, uint16_t offset)
cqe = &(*rxq->cqes)[cq_ci & cqe_cnt];
}
used = RTE_MIN(used, (1U << rxq->elts_n) - 1);
if (offset < used)
return used;
}

/**
* DPDK callback to check the status of a rx descriptor.
*
* @param rx_queue
* The Rx queue.
* @param[in] offset
* The index of the descriptor in the ring.
*
* @return
* The status of the tx descriptor.
*/
int
mlx5_rx_descriptor_status(void *rx_queue, uint16_t offset)
{
struct mlx5_rxq_data *rxq = rx_queue;
struct mlx5_rxq_ctrl *rxq_ctrl =
container_of(rxq, struct mlx5_rxq_ctrl, rxq);
struct rte_eth_dev *dev = ETH_DEV(rxq_ctrl->priv);

if (dev->rx_pkt_burst != mlx5_rx_burst) {
rte_errno = ENOTSUP;
return -rte_errno;
}
if (offset >= (1 << rxq->elts_n)) {
rte_errno = EINVAL;
return -rte_errno;
}
if (offset < rx_queue_count(rxq))
return RTE_ETH_RX_DESC_DONE;
return RTE_ETH_RX_DESC_AVAIL;
}

/**
* DPDK callback to get the number of used descriptors in a RX queue
*
* @param dev
* Pointer to the device structure.
*
* @param rx_queue_id
* The Rx queue.
*
* @return
* The number of used rx descriptor.
* -EINVAL if the queue is invalid
*/
uint32_t
mlx5_rx_queue_count(struct rte_eth_dev *dev, uint16_t rx_queue_id)
{
struct priv *priv = dev->data->dev_private;
struct mlx5_rxq_data *rxq;

if (dev->rx_pkt_burst != mlx5_rx_burst) {
rte_errno = ENOTSUP;
return -rte_errno;
}
rxq = (*priv->rxqs)[rx_queue_id];
if (!rxq) {
rte_errno = EINVAL;
return -rte_errno;
}
return rx_queue_count(rxq);
}

/**
* DPDK callback for TX.
*
Expand Down
1 change: 1 addition & 0 deletions drivers/net/mlx5/mlx5_rxtx.h
Original file line number Diff line number Diff line change
Expand Up @@ -345,6 +345,7 @@ uint16_t removed_rx_burst(void *dpdk_rxq, struct rte_mbuf **pkts,
uint16_t pkts_n);
int mlx5_rx_descriptor_status(void *rx_queue, uint16_t offset);
int mlx5_tx_descriptor_status(void *tx_queue, uint16_t offset);
uint32_t mlx5_rx_queue_count(struct rte_eth_dev *dev, uint16_t rx_queue_id);

/* Vectorized version of mlx5_rxtx.c */
int mlx5_check_raw_vec_tx_support(struct rte_eth_dev *dev);
Expand Down

0 comments on commit 26f0488

Please sign in to comment.