]> git.droids-corp.org - dpdk.git/commitdiff
net/i40e: fix port segmentation fault when restart
authorWei Zhao <wei.zhao1@intel.com>
Fri, 12 Jan 2018 06:59:19 +0000 (14:59 +0800)
committerFerruh Yigit <ferruh.yigit@intel.com>
Tue, 16 Jan 2018 17:47:49 +0000 (18:47 +0100)
This patch will go into the process of clear all queue region
related configuration when dev stop even if there is no queue region
command before, so this is a bug, it may cause error. So add code
to check if there is queue configuration exist when flush queue
region config and remove this process when device stop. Queue region
clear only do when device initialization or PMD get flush command.

Fixes: 7cbecc2f7424 ("net/i40e: support queue region set and flush")
Cc: stable@dpdk.org
Signed-off-by: Wei Zhao <wei.zhao1@intel.com>
Acked-by: Qi Zhang <qi.z.zhang@intel.com>
drivers/net/i40e/i40e_ethdev.c
drivers/net/i40e/rte_pmd_i40e.c

index f8abd5bf75753e799ee3615cb84df9045725b335..46cd3fadffe39e1d6f713da0408f31a52a50bd37 100644 (file)
@@ -2144,9 +2144,6 @@ i40e_dev_stop(struct rte_eth_dev *dev)
        /* reset hierarchy commit */
        pf->tm_conf.committed = false;
 
-       /* Remove all the queue region configuration */
-       i40e_flush_queue_region_all_conf(dev, hw, pf, 0);
-
        hw->adapter_stopped = 1;
 }
 
index 55ae2fefbfea61781584d56b71ab069102152249..2cb22d473a3a9a1396a9bd515da9123eee1ab247 100644 (file)
@@ -2816,22 +2816,23 @@ i40e_flush_queue_region_all_conf(struct rte_eth_dev *dev,
                return 0;
        }
 
-       info->queue_region_number = 1;
-       info->region[0].queue_num = main_vsi->nb_used_qps;
-       info->region[0].queue_start_index = 0;
+       if (info->queue_region_number) {
+               info->queue_region_number = 1;
+               info->region[0].queue_num = main_vsi->nb_used_qps;
+               info->region[0].queue_start_index = 0;
 
-       ret = i40e_vsi_update_queue_region_mapping(hw, pf);
-       if (ret != I40E_SUCCESS)
-               PMD_DRV_LOG(INFO, "Failed to flush queue region mapping.");
-
-       ret = i40e_dcb_init_configure(dev, TRUE);
-       if (ret != I40E_SUCCESS) {
-               PMD_DRV_LOG(INFO, "Failed to flush dcb.");
-               pf->flags &= ~I40E_FLAG_DCB;
-       }
+               ret = i40e_vsi_update_queue_region_mapping(hw, pf);
+               if (ret != I40E_SUCCESS)
+                       PMD_DRV_LOG(INFO, "Failed to flush queue region mapping.");
 
-       i40e_init_queue_region_conf(dev);
+               ret = i40e_dcb_init_configure(dev, TRUE);
+               if (ret != I40E_SUCCESS) {
+                       PMD_DRV_LOG(INFO, "Failed to flush dcb.");
+                       pf->flags &= ~I40E_FLAG_DCB;
+               }
 
+               i40e_init_queue_region_conf(dev);
+       }
        return 0;
 }