Skip to content

Commit d505ba8

Browse files
reshmapattanThomas Monjalon
authored andcommitted
ethdev: support unidirectional configuration
User should be able to configure ethdev with zero rx/tx queues, but both should not be zero. After above change, rte_eth_dev_tx_queue_config, rte_eth_dev_rx_queue_config should allocate memory for rx/tx queues only when number of rx/tx queues are nonzero. Signed-off-by: Reshma Pattan <reshma.pattan@intel.com> Acked-by: Konstantin Ananyev <konstantin.ananyev@intel.com>
1 parent dc30936 commit d505ba8

File tree

1 file changed

+24
-12
lines changed

1 file changed

+24
-12
lines changed

lib/librte_ether/rte_ethdev.c

Lines changed: 24 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -671,15 +671,15 @@ rte_eth_dev_rx_queue_config(struct rte_eth_dev *dev, uint16_t nb_queues)
671671
void **rxq;
672672
unsigned i;
673673

674-
if (dev->data->rx_queues == NULL) { /* first time configuration */
674+
if (dev->data->rx_queues == NULL && nb_queues != 0) { /* first time configuration */
675675
dev->data->rx_queues = rte_zmalloc("ethdev->rx_queues",
676676
sizeof(dev->data->rx_queues[0]) * nb_queues,
677677
RTE_CACHE_LINE_SIZE);
678678
if (dev->data->rx_queues == NULL) {
679679
dev->data->nb_rx_queues = 0;
680680
return -(ENOMEM);
681681
}
682-
} else { /* re-configure */
682+
} else if (dev->data->rx_queues != NULL && nb_queues != 0) { /* re-configure */
683683
RTE_FUNC_PTR_OR_ERR_RET(*dev->dev_ops->rx_queue_release, -ENOTSUP);
684684

685685
rxq = dev->data->rx_queues;
@@ -699,6 +699,13 @@ rte_eth_dev_rx_queue_config(struct rte_eth_dev *dev, uint16_t nb_queues)
699699

700700
dev->data->rx_queues = rxq;
701701

702+
} else if (dev->data->rx_queues != NULL && nb_queues == 0) {
703+
RTE_FUNC_PTR_OR_ERR_RET(*dev->dev_ops->rx_queue_release, -ENOTSUP);
704+
705+
rxq = dev->data->rx_queues;
706+
707+
for (i = nb_queues; i < old_nb_queues; i++)
708+
(*dev->dev_ops->rx_queue_release)(rxq[i]);
702709
}
703710
dev->data->nb_rx_queues = nb_queues;
704711
return 0;
@@ -815,15 +822,15 @@ rte_eth_dev_tx_queue_config(struct rte_eth_dev *dev, uint16_t nb_queues)
815822
void **txq;
816823
unsigned i;
817824

818-
if (dev->data->tx_queues == NULL) { /* first time configuration */
825+
if (dev->data->tx_queues == NULL && nb_queues != 0) { /* first time configuration */
819826
dev->data->tx_queues = rte_zmalloc("ethdev->tx_queues",
820827
sizeof(dev->data->tx_queues[0]) * nb_queues,
821828
RTE_CACHE_LINE_SIZE);
822829
if (dev->data->tx_queues == NULL) {
823830
dev->data->nb_tx_queues = 0;
824831
return -(ENOMEM);
825832
}
826-
} else { /* re-configure */
833+
} else if (dev->data->tx_queues != NULL && nb_queues != 0) { /* re-configure */
827834
RTE_FUNC_PTR_OR_ERR_RET(*dev->dev_ops->tx_queue_release, -ENOTSUP);
828835

829836
txq = dev->data->tx_queues;
@@ -843,6 +850,13 @@ rte_eth_dev_tx_queue_config(struct rte_eth_dev *dev, uint16_t nb_queues)
843850

844851
dev->data->tx_queues = txq;
845852

853+
} else if (dev->data->tx_queues != NULL && nb_queues == 0) {
854+
RTE_FUNC_PTR_OR_ERR_RET(*dev->dev_ops->tx_queue_release, -ENOTSUP);
855+
856+
txq = dev->data->tx_queues;
857+
858+
for (i = nb_queues; i < old_nb_queues; i++)
859+
(*dev->dev_ops->tx_queue_release)(txq[i]);
846860
}
847861
dev->data->nb_tx_queues = nb_queues;
848862
return 0;
@@ -889,25 +903,23 @@ rte_eth_dev_configure(uint8_t port_id, uint16_t nb_rx_q, uint16_t nb_tx_q,
889903
* configured device.
890904
*/
891905
(*dev->dev_ops->dev_infos_get)(dev, &dev_info);
906+
907+
if (nb_rx_q == 0 && nb_tx_q == 0) {
908+
RTE_PMD_DEBUG_TRACE("ethdev port_id=%d both rx and tx queue cannot be 0\n", port_id);
909+
return -EINVAL;
910+
}
911+
892912
if (nb_rx_q > dev_info.max_rx_queues) {
893913
RTE_PMD_DEBUG_TRACE("ethdev port_id=%d nb_rx_queues=%d > %d\n",
894914
port_id, nb_rx_q, dev_info.max_rx_queues);
895915
return -EINVAL;
896916
}
897-
if (nb_rx_q == 0) {
898-
RTE_PMD_DEBUG_TRACE("ethdev port_id=%d nb_rx_q == 0\n", port_id);
899-
return -EINVAL;
900-
}
901917

902918
if (nb_tx_q > dev_info.max_tx_queues) {
903919
RTE_PMD_DEBUG_TRACE("ethdev port_id=%d nb_tx_queues=%d > %d\n",
904920
port_id, nb_tx_q, dev_info.max_tx_queues);
905921
return -EINVAL;
906922
}
907-
if (nb_tx_q == 0) {
908-
RTE_PMD_DEBUG_TRACE("ethdev port_id=%d nb_tx_q == 0\n", port_id);
909-
return -EINVAL;
910-
}
911923

912924
/* Copy the dev_conf parameter into the dev structure */
913925
memcpy(&dev->data->dev_conf, dev_conf, sizeof(dev->data->dev_conf));

0 commit comments

Comments
 (0)