net/i40e: fix port segmentation fault when restart

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: 7cbecc2f74 ("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>
This commit is contained in:
Wei Zhao 2018-01-12 14:59:19 +08:00 committed by Ferruh Yigit
parent 8d1e8e70ff
commit 37b68eacfc
2 changed files with 14 additions and 16 deletions

View 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;
}

View 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_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_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);
}
i40e_init_queue_region_conf(dev);
return 0;
}