net/ice: support multi-process
authorXiao Zhang <xiao.zhang@intel.com>
Thu, 25 Jul 2019 11:18:35 +0000 (19:18 +0800)
committerFerruh Yigit <ferruh.yigit@intel.com>
Fri, 30 Aug 2019 16:06:35 +0000 (18:06 +0200)
Add multiple processes support for ice, secondary processes will share
memory and configuration with primary process, do not need further
initialization for secondary processes.

Signed-off-by: Xiao Zhang <xiao.zhang@intel.com>
Acked-by: Qi Zhang <qi.z.zhang@intel.com>
drivers/net/ice/ice_ethdev.c
drivers/net/ice/ice_ethdev.h
drivers/net/ice/ice_rxtx.c

index 44a14cb..63997fd 100644 (file)
@@ -1434,6 +1434,15 @@ ice_dev_init(struct rte_eth_dev *dev)
        dev->tx_pkt_burst = ice_xmit_pkts;
        dev->tx_pkt_prepare = ice_prep_pkts;
 
+       /* for secondary processes, we don't initialise any further as primary
+        * has already done this work.
+        */
+       if (rte_eal_process_type() != RTE_PROC_PRIMARY) {
+               ice_set_rx_function(dev);
+               ice_set_tx_function(dev);
+               return 0;
+       }
+
        ice_set_default_ptype_table(dev);
        pci_dev = RTE_DEV_TO_PCI(dev->device);
        intr_handle = &pci_dev->intr_handle;
@@ -1682,6 +1691,9 @@ ice_dev_uninit(struct rte_eth_dev *dev)
        struct ice_pf *pf = ICE_DEV_PRIVATE_TO_PF(dev->data->dev_private);
        struct rte_flow *p_flow;
 
+       if (rte_eal_process_type() != RTE_PROC_PRIMARY)
+               return 0;
+
        ice_dev_close(dev);
 
        dev->dev_ops = NULL;
index f569da8..c4444f9 100644 (file)
@@ -289,6 +289,8 @@ struct ice_adapter {
        struct rte_eth_dev *eth_dev;
        struct ice_pf pf;
        bool rx_bulk_alloc_allowed;
+       bool rx_vec_allowed;
+       bool tx_vec_allowed;
        bool tx_simple_allowed;
        /* ptype mapping table */
        uint32_t ptype_tbl[ICE_MAX_PKT_TYPE] __rte_cache_min_aligned;
index 0282b53..81af814 100644 (file)
@@ -2332,35 +2332,46 @@ ice_set_rx_function(struct rte_eth_dev *dev)
        int i;
        bool use_avx2 = false;
 
-       if (!ice_rx_vec_dev_check(dev)) {
-               for (i = 0; i < dev->data->nb_rx_queues; i++) {
-                       rxq = dev->data->rx_queues[i];
-                       (void)ice_rxq_vec_setup(rxq);
-               }
+       if (rte_eal_process_type() == RTE_PROC_PRIMARY) {
+               if (!ice_rx_vec_dev_check(dev) && ad->rx_bulk_alloc_allowed) {
+                       ad->rx_vec_allowed = true;
+                       for (i = 0; i < dev->data->nb_rx_queues; i++) {
+                               rxq = dev->data->rx_queues[i];
+                               if (rxq && ice_rxq_vec_setup(rxq)) {
+                                       ad->rx_vec_allowed = false;
+                                       break;
+                               }
+                       }
+
+                       if (rte_cpu_get_flag_enabled(RTE_CPUFLAG_AVX2) == 1 ||
+                       rte_cpu_get_flag_enabled(RTE_CPUFLAG_AVX512F) == 1)
+                               use_avx2 = true;
 
-               if (rte_cpu_get_flag_enabled(RTE_CPUFLAG_AVX2) == 1 ||
-                   rte_cpu_get_flag_enabled(RTE_CPUFLAG_AVX512F) == 1)
-                       use_avx2 = true;
+               } else {
+                       ad->rx_vec_allowed = false;
+               }
+       }
 
+       if (ad->rx_vec_allowed) {
                if (dev->data->scattered_rx) {
                        PMD_DRV_LOG(DEBUG,
-                                   "Using %sVector Scattered Rx (port %d).",
-                                   use_avx2 ? "avx2 " : "",
-                                   dev->data->port_id);
+                                       "Using %sVector Scattered Rx (port %d).",
+                                       use_avx2 ? "avx2 " : "",
+                                       dev->data->port_id);
                        dev->rx_pkt_burst = use_avx2 ?
-                                           ice_recv_scattered_pkts_vec_avx2 :
-                                           ice_recv_scattered_pkts_vec;
+                                       ice_recv_scattered_pkts_vec_avx2 :
+                                       ice_recv_scattered_pkts_vec;
                } else {
                        PMD_DRV_LOG(DEBUG, "Using %sVector Rx (port %d).",
-                                   use_avx2 ? "avx2 " : "",
-                                   dev->data->port_id);
+                                       use_avx2 ? "avx2 " : "",
+                                       dev->data->port_id);
                        dev->rx_pkt_burst = use_avx2 ?
-                                           ice_recv_pkts_vec_avx2 :
-                                           ice_recv_pkts_vec;
+                                               ice_recv_pkts_vec_avx2 :
+                                               ice_recv_pkts_vec;
                }
-
                return;
        }
+
 #endif
 
        if (dev->data->scattered_rx) {
@@ -2464,16 +2475,27 @@ ice_set_tx_function(struct rte_eth_dev *dev)
        int i;
        bool use_avx2 = false;
 
-       if (!ice_tx_vec_dev_check(dev)) {
-               for (i = 0; i < dev->data->nb_tx_queues; i++) {
-                       txq = dev->data->tx_queues[i];
-                       (void)ice_txq_vec_setup(txq);
-               }
+       if (rte_eal_process_type() == RTE_PROC_PRIMARY) {
+               if (!ice_tx_vec_dev_check(dev)) {
+                       ad->tx_vec_allowed = true;
+                       for (i = 0; i < dev->data->nb_tx_queues; i++) {
+                               txq = dev->data->tx_queues[i];
+                               if (txq && ice_txq_vec_setup(txq)) {
+                                       ad->tx_vec_allowed = false;
+                                       break;
+                               }
+                       }
 
-               if (rte_cpu_get_flag_enabled(RTE_CPUFLAG_AVX2) == 1 ||
-                   rte_cpu_get_flag_enabled(RTE_CPUFLAG_AVX512F) == 1)
-                       use_avx2 = true;
+                       if (rte_cpu_get_flag_enabled(RTE_CPUFLAG_AVX2) == 1 ||
+                       rte_cpu_get_flag_enabled(RTE_CPUFLAG_AVX512F) == 1)
+                               use_avx2 = true;
+
+               } else {
+                       ad->tx_vec_allowed = false;
+               }
+       }
 
+       if (ad->tx_vec_allowed) {
                PMD_DRV_LOG(DEBUG, "Using %sVector Tx (port %d).",
                            use_avx2 ? "avx2 " : "",
                            dev->data->port_id);