@@ -671,15 +671,15 @@ rte_eth_dev_rx_queue_config(struct rte_eth_dev *dev, uint16_t nb_queues)
671
671
void * * rxq ;
672
672
unsigned i ;
673
673
674
- if (dev -> data -> rx_queues == NULL ) { /* first time configuration */
674
+ if (dev -> data -> rx_queues == NULL && nb_queues != 0 ) { /* first time configuration */
675
675
dev -> data -> rx_queues = rte_zmalloc ("ethdev->rx_queues" ,
676
676
sizeof (dev -> data -> rx_queues [0 ]) * nb_queues ,
677
677
RTE_CACHE_LINE_SIZE );
678
678
if (dev -> data -> rx_queues == NULL ) {
679
679
dev -> data -> nb_rx_queues = 0 ;
680
680
return - (ENOMEM );
681
681
}
682
- } else { /* re-configure */
682
+ } else if ( dev -> data -> rx_queues != NULL && nb_queues != 0 ) { /* re-configure */
683
683
RTE_FUNC_PTR_OR_ERR_RET (* dev -> dev_ops -> rx_queue_release , - ENOTSUP );
684
684
685
685
rxq = dev -> data -> rx_queues ;
@@ -699,6 +699,13 @@ rte_eth_dev_rx_queue_config(struct rte_eth_dev *dev, uint16_t nb_queues)
699
699
700
700
dev -> data -> rx_queues = rxq ;
701
701
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 ]);
702
709
}
703
710
dev -> data -> nb_rx_queues = nb_queues ;
704
711
return 0 ;
@@ -815,15 +822,15 @@ rte_eth_dev_tx_queue_config(struct rte_eth_dev *dev, uint16_t nb_queues)
815
822
void * * txq ;
816
823
unsigned i ;
817
824
818
- if (dev -> data -> tx_queues == NULL ) { /* first time configuration */
825
+ if (dev -> data -> tx_queues == NULL && nb_queues != 0 ) { /* first time configuration */
819
826
dev -> data -> tx_queues = rte_zmalloc ("ethdev->tx_queues" ,
820
827
sizeof (dev -> data -> tx_queues [0 ]) * nb_queues ,
821
828
RTE_CACHE_LINE_SIZE );
822
829
if (dev -> data -> tx_queues == NULL ) {
823
830
dev -> data -> nb_tx_queues = 0 ;
824
831
return - (ENOMEM );
825
832
}
826
- } else { /* re-configure */
833
+ } else if ( dev -> data -> tx_queues != NULL && nb_queues != 0 ) { /* re-configure */
827
834
RTE_FUNC_PTR_OR_ERR_RET (* dev -> dev_ops -> tx_queue_release , - ENOTSUP );
828
835
829
836
txq = dev -> data -> tx_queues ;
@@ -843,6 +850,13 @@ rte_eth_dev_tx_queue_config(struct rte_eth_dev *dev, uint16_t nb_queues)
843
850
844
851
dev -> data -> tx_queues = txq ;
845
852
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 ]);
846
860
}
847
861
dev -> data -> nb_tx_queues = nb_queues ;
848
862
return 0 ;
@@ -889,25 +903,23 @@ rte_eth_dev_configure(uint8_t port_id, uint16_t nb_rx_q, uint16_t nb_tx_q,
889
903
* configured device.
890
904
*/
891
905
(* 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
+
892
912
if (nb_rx_q > dev_info .max_rx_queues ) {
893
913
RTE_PMD_DEBUG_TRACE ("ethdev port_id=%d nb_rx_queues=%d > %d\n" ,
894
914
port_id , nb_rx_q , dev_info .max_rx_queues );
895
915
return - EINVAL ;
896
916
}
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
- }
901
917
902
918
if (nb_tx_q > dev_info .max_tx_queues ) {
903
919
RTE_PMD_DEBUG_TRACE ("ethdev port_id=%d nb_tx_queues=%d > %d\n" ,
904
920
port_id , nb_tx_q , dev_info .max_tx_queues );
905
921
return - EINVAL ;
906
922
}
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
- }
911
923
912
924
/* Copy the dev_conf parameter into the dev structure */
913
925
memcpy (& dev -> data -> dev_conf , dev_conf , sizeof (dev -> data -> dev_conf ));
0 commit comments