Currently, when adding, removing, or configuring MAC and VLAN filters, we are using rte_zmalloc followed by an immediate rte_free. This memory does not need to be stored in hugepage memory, so replace it with regular malloc/free or stack allocation where appropriate.
Signed-off-by: Anatoly Burakov <[email protected]> --- drivers/net/intel/i40e/i40e_ethdev.c | 135 +++++++++++--------------- drivers/net/intel/i40e/rte_pmd_i40e.c | 17 ++-- 2 files changed, 65 insertions(+), 87 deletions(-) diff --git a/drivers/net/intel/i40e/i40e_ethdev.c b/drivers/net/intel/i40e/i40e_ethdev.c index ba66f9e3fd..672d337d99 100644 --- a/drivers/net/intel/i40e/i40e_ethdev.c +++ b/drivers/net/intel/i40e/i40e_ethdev.c @@ -6,6 +6,7 @@ #include <stdio.h> #include <errno.h> #include <stdint.h> +#include <stdlib.h> #include <string.h> #include <unistd.h> #include <stdarg.h> @@ -4128,7 +4129,6 @@ static int i40e_vlan_offload_set(struct rte_eth_dev *dev, int mask) { struct i40e_pf *pf = I40E_DEV_PRIVATE_TO_PF(dev->data->dev_private); - struct i40e_mac_filter_info *mac_filter; struct i40e_vsi *vsi = pf->main_vsi; struct rte_eth_rxmode *rxmode; struct i40e_mac_filter *f; @@ -4163,12 +4163,12 @@ i40e_vlan_offload_set(struct rte_eth_dev *dev, int mask) } if (mask & RTE_ETH_VLAN_EXTEND_MASK) { + struct i40e_mac_filter_info mac_filter[I40E_NUM_MACADDR_MAX] = {0}; i = 0; num = vsi->mac_num; - mac_filter = rte_zmalloc("mac_filter_info_data", - num * sizeof(*mac_filter), 0); - if (mac_filter == NULL) { - PMD_DRV_LOG(ERR, "failed to allocate memory"); + + if (num > I40E_NUM_MACADDR_MAX) { + PMD_DRV_LOG(ERR, "Too many MAC addresses"); return I40E_ERR_NO_MEMORY; } @@ -4206,7 +4206,6 @@ i40e_vlan_offload_set(struct rte_eth_dev *dev, int mask) if (ret) PMD_DRV_LOG(ERR, "i40e vsi add mac fail."); } - rte_free(mac_filter); } if (mask & RTE_ETH_QINQ_STRIP_MASK) { @@ -6198,7 +6197,7 @@ i40e_vsi_config_vlan_filter(struct i40e_vsi *vsi, bool on) int i, num; struct i40e_mac_filter *f; void *temp; - struct i40e_mac_filter_info *mac_filter; + struct i40e_mac_filter_info mac_filter[I40E_NUM_MACADDR_MAX] = {0}; enum i40e_mac_filter_type desired_filter; int ret = I40E_SUCCESS; @@ -6211,12 +6210,9 @@ i40e_vsi_config_vlan_filter(struct i40e_vsi *vsi, bool on) } num = vsi->mac_num; - - mac_filter = rte_zmalloc("mac_filter_info_data", - num * sizeof(*mac_filter), 0); - if (mac_filter == NULL) { - PMD_DRV_LOG(ERR, "failed to allocate memory"); - return I40E_ERR_NO_MEMORY; + if (num > I40E_NUM_MACADDR_MAX) { + PMD_DRV_LOG(ERR, "Too many MAC addresses"); + return -1; } i = 0; @@ -6228,7 +6224,7 @@ i40e_vsi_config_vlan_filter(struct i40e_vsi *vsi, bool on) if (ret) { PMD_DRV_LOG(ERR, "Update VSI failed to %s vlan filter", on ? "enable" : "disable"); - goto DONE; + return ret; } i++; } @@ -6240,13 +6236,11 @@ i40e_vsi_config_vlan_filter(struct i40e_vsi *vsi, bool on) if (ret) { PMD_DRV_LOG(ERR, "Update VSI failed to %s vlan filter", on ? "enable" : "disable"); - goto DONE; + return ret; } } -DONE: - rte_free(mac_filter); - return ret; + return 0; } /* Configure vlan stripping on or off */ @@ -7128,19 +7122,20 @@ i40e_add_macvlan_filters(struct i40e_vsi *vsi, uint16_t flags; int ret = I40E_SUCCESS; struct i40e_hw *hw = I40E_VSI_TO_HW(vsi); - struct i40e_aqc_add_macvlan_element_data *req_list; + uint8_t aq_buff[I40E_AQ_BUF_SZ] = {0}; + struct i40e_aqc_add_macvlan_element_data *req_list = + (struct i40e_aqc_add_macvlan_element_data *)aq_buff; + + if (hw->aq.asq_buf_size > I40E_AQ_BUF_SZ) { + PMD_DRV_LOG(ERR, "AdminQ size biffer than max"); + return I40E_ERR_NO_MEMORY; + } if (filter == NULL || total == 0) return I40E_ERR_PARAM; ele_num = hw->aq.asq_buf_size / sizeof(*req_list); ele_buff_size = hw->aq.asq_buf_size; - req_list = rte_zmalloc("macvlan_add", ele_buff_size, 0); - if (req_list == NULL) { - PMD_DRV_LOG(ERR, "Fail to allocate memory"); - return I40E_ERR_NO_MEMORY; - } - num = 0; do { actual_num = (num + ele_num > total) ? (total - num) : ele_num; @@ -7169,8 +7164,7 @@ i40e_add_macvlan_filters(struct i40e_vsi *vsi, break; default: PMD_DRV_LOG(ERR, "Invalid MAC match type"); - ret = I40E_ERR_PARAM; - goto DONE; + return I40E_ERR_PARAM; } req_list[i].queue_number = 0; @@ -7182,14 +7176,11 @@ i40e_add_macvlan_filters(struct i40e_vsi *vsi, actual_num, NULL); if (ret != I40E_SUCCESS) { PMD_DRV_LOG(ERR, "Failed to add macvlan filter"); - goto DONE; + return ret; } num += actual_num; } while (num < total); - -DONE: - rte_free(req_list); - return ret; + return I40E_SUCCESS; } int @@ -7202,21 +7193,22 @@ i40e_remove_macvlan_filters(struct i40e_vsi *vsi, uint16_t flags; int ret = I40E_SUCCESS; struct i40e_hw *hw = I40E_VSI_TO_HW(vsi); - struct i40e_aqc_remove_macvlan_element_data *req_list; + uint8_t aq_buff[I40E_AQ_BUF_SZ] = {0}; + struct i40e_aqc_remove_macvlan_element_data *req_list = + (struct i40e_aqc_remove_macvlan_element_data *)aq_buff; enum i40e_admin_queue_err aq_status; if (filter == NULL || total == 0) return I40E_ERR_PARAM; - ele_num = hw->aq.asq_buf_size / sizeof(*req_list); - ele_buff_size = hw->aq.asq_buf_size; - - req_list = rte_zmalloc("macvlan_remove", ele_buff_size, 0); - if (req_list == NULL) { - PMD_DRV_LOG(ERR, "Fail to allocate memory"); + if (hw->aq.asq_buf_size > I40E_AQ_BUF_SZ) { + PMD_DRV_LOG(ERR, "AdminQ size biffer than max"); return I40E_ERR_NO_MEMORY; } + ele_num = hw->aq.asq_buf_size / sizeof(*req_list); + ele_buff_size = hw->aq.asq_buf_size; + num = 0; do { actual_num = (num + ele_num > total) ? (total - num) : ele_num; @@ -7245,8 +7237,7 @@ i40e_remove_macvlan_filters(struct i40e_vsi *vsi, break; default: PMD_DRV_LOG(ERR, "Invalid MAC filter type"); - ret = I40E_ERR_PARAM; - goto DONE; + return I40E_ERR_PARAM; } req_list[i].flags = rte_cpu_to_le_16(flags); } @@ -7260,15 +7251,13 @@ i40e_remove_macvlan_filters(struct i40e_vsi *vsi, ret = I40E_SUCCESS; } else { PMD_DRV_LOG(ERR, "Failed to remove macvlan filter"); - goto DONE; + return ret; } } num += actual_num; } while (num < total); -DONE: - rte_free(req_list); - return ret; + return I40E_SUCCESS; } /* Find out specific MAC filter */ @@ -7436,7 +7425,7 @@ i40e_vsi_remove_all_macvlan_filter(struct i40e_vsi *vsi) else num = vsi->mac_num * vsi->vlan_num; - mv_f = rte_zmalloc("macvlan_data", num * sizeof(*mv_f), 0); + mv_f = calloc(num, sizeof(*mv_f)); if (mv_f == NULL) { PMD_DRV_LOG(ERR, "failed to allocate memory"); return I40E_ERR_NO_MEMORY; @@ -7465,7 +7454,7 @@ i40e_vsi_remove_all_macvlan_filter(struct i40e_vsi *vsi) ret = i40e_remove_macvlan_filters(vsi, mv_f, num); DONE: - rte_free(mv_f); + free(mv_f); return ret; } @@ -7473,7 +7462,7 @@ i40e_vsi_remove_all_macvlan_filter(struct i40e_vsi *vsi) int i40e_vsi_add_vlan(struct i40e_vsi *vsi, uint16_t vlan) { - struct i40e_macvlan_filter *mv_f; + struct i40e_macvlan_filter mv_f[I40E_NUM_MACADDR_MAX] = {0}; int mac_num; int ret = I40E_SUCCESS; @@ -7490,37 +7479,31 @@ i40e_vsi_add_vlan(struct i40e_vsi *vsi, uint16_t vlan) PMD_DRV_LOG(ERR, "Error! VSI doesn't have a mac addr"); return I40E_ERR_PARAM; } - - mv_f = rte_zmalloc("macvlan_data", mac_num * sizeof(*mv_f), 0); - - if (mv_f == NULL) { - PMD_DRV_LOG(ERR, "failed to allocate memory"); - return I40E_ERR_NO_MEMORY; + if (mac_num > I40E_NUM_MACADDR_MAX) { + PMD_DRV_LOG(ERR, "Error! Too many MAC addresses"); + return I40E_ERR_PARAM; } ret = i40e_find_all_mac_for_vlan(vsi, mv_f, mac_num, vlan); if (ret != I40E_SUCCESS) - goto DONE; + return ret; ret = i40e_add_macvlan_filters(vsi, mv_f, mac_num); if (ret != I40E_SUCCESS) - goto DONE; + return ret; i40e_set_vlan_filter(vsi, vlan, 1); vsi->vlan_num++; - ret = I40E_SUCCESS; -DONE: - rte_free(mv_f); - return ret; + return I40E_SUCCESS; } int i40e_vsi_delete_vlan(struct i40e_vsi *vsi, uint16_t vlan) { - struct i40e_macvlan_filter *mv_f; + struct i40e_macvlan_filter mv_f[I40E_NUM_MACADDR_MAX] = {0}; int mac_num; int ret = I40E_SUCCESS; @@ -7541,42 +7524,36 @@ i40e_vsi_delete_vlan(struct i40e_vsi *vsi, uint16_t vlan) PMD_DRV_LOG(ERR, "Error! VSI doesn't have a mac addr"); return I40E_ERR_PARAM; } - - mv_f = rte_zmalloc("macvlan_data", mac_num * sizeof(*mv_f), 0); - - if (mv_f == NULL) { - PMD_DRV_LOG(ERR, "failed to allocate memory"); - return I40E_ERR_NO_MEMORY; + if (mac_num > I40E_NUM_MACADDR_MAX) { + PMD_DRV_LOG(ERR, "Error! Too many MAC addresses"); + return I40E_ERR_PARAM; } ret = i40e_find_all_mac_for_vlan(vsi, mv_f, mac_num, vlan); if (ret != I40E_SUCCESS) - goto DONE; + return ret; ret = i40e_remove_macvlan_filters(vsi, mv_f, mac_num); if (ret != I40E_SUCCESS) - goto DONE; + return ret; /* This is last vlan to remove, replace all mac filter with vlan 0 */ if (vsi->vlan_num == 1) { ret = i40e_find_all_mac_for_vlan(vsi, mv_f, mac_num, 0); if (ret != I40E_SUCCESS) - goto DONE; + return ret; ret = i40e_add_macvlan_filters(vsi, mv_f, mac_num); if (ret != I40E_SUCCESS) - goto DONE; + return ret; } i40e_set_vlan_filter(vsi, vlan, 0); vsi->vlan_num--; - ret = I40E_SUCCESS; -DONE: - rte_free(mv_f); - return ret; + return I40E_SUCCESS; } int @@ -7607,7 +7584,7 @@ i40e_vsi_add_mac(struct i40e_vsi *vsi, struct i40e_mac_filter_info *mac_filter) mac_filter->filter_type == I40E_MAC_HASH_MATCH) vlan_num = 1; - mv_f = rte_zmalloc("macvlan_data", vlan_num * sizeof(*mv_f), 0); + mv_f = calloc(vlan_num, sizeof(*mv_f)); if (mv_f == NULL) { PMD_DRV_LOG(ERR, "failed to allocate memory"); return I40E_ERR_NO_MEMORY; @@ -7646,7 +7623,7 @@ i40e_vsi_add_mac(struct i40e_vsi *vsi, struct i40e_mac_filter_info *mac_filter) ret = I40E_SUCCESS; DONE: - rte_free(mv_f); + free(mv_f); return ret; } @@ -7677,7 +7654,7 @@ i40e_vsi_delete_mac(struct i40e_vsi *vsi, struct rte_ether_addr *addr) filter_type == I40E_MAC_HASH_MATCH) vlan_num = 1; - mv_f = rte_zmalloc("macvlan_data", vlan_num * sizeof(*mv_f), 0); + mv_f = calloc(vlan_num, sizeof(*mv_f)); if (mv_f == NULL) { PMD_DRV_LOG(ERR, "failed to allocate memory"); return I40E_ERR_NO_MEMORY; @@ -7706,7 +7683,7 @@ i40e_vsi_delete_mac(struct i40e_vsi *vsi, struct rte_ether_addr *addr) ret = I40E_SUCCESS; DONE: - rte_free(mv_f); + free(mv_f); return ret; } diff --git a/drivers/net/intel/i40e/rte_pmd_i40e.c b/drivers/net/intel/i40e/rte_pmd_i40e.c index a358f68bc5..4839a1d9bf 100644 --- a/drivers/net/intel/i40e/rte_pmd_i40e.c +++ b/drivers/net/intel/i40e/rte_pmd_i40e.c @@ -2,6 +2,7 @@ * Copyright(c) 2010-2017 Intel Corporation */ +#include <stdlib.h> #include <eal_export.h> #include <rte_string_fns.h> #include <rte_malloc.h> @@ -233,7 +234,7 @@ i40e_vsi_rm_mac_filter(struct i40e_vsi *vsi) filter_type == I40E_MAC_HASH_MATCH) vlan_num = 1; - mv_f = rte_zmalloc("macvlan_data", vlan_num * sizeof(*mv_f), 0); + mv_f = calloc(vlan_num, sizeof(*mv_f)); if (!mv_f) { PMD_DRV_LOG(ERR, "failed to allocate memory"); return I40E_ERR_NO_MEMORY; @@ -250,18 +251,18 @@ i40e_vsi_rm_mac_filter(struct i40e_vsi *vsi) ret = i40e_find_all_vlan_for_mac(vsi, mv_f, vlan_num, &f->mac_info.mac_addr); if (ret != I40E_SUCCESS) { - rte_free(mv_f); + free(mv_f); return ret; } } ret = i40e_remove_macvlan_filters(vsi, mv_f, vlan_num); if (ret != I40E_SUCCESS) { - rte_free(mv_f); + free(mv_f); return ret; } - rte_free(mv_f); + free(mv_f); ret = I40E_SUCCESS; } @@ -294,7 +295,7 @@ i40e_vsi_restore_mac_filter(struct i40e_vsi *vsi) f->mac_info.filter_type == I40E_MAC_HASH_MATCH) vlan_num = 1; - mv_f = rte_zmalloc("macvlan_data", vlan_num * sizeof(*mv_f), 0); + mv_f = calloc(vlan_num, sizeof(*mv_f)); if (!mv_f) { PMD_DRV_LOG(ERR, "failed to allocate memory"); return I40E_ERR_NO_MEMORY; @@ -312,18 +313,18 @@ i40e_vsi_restore_mac_filter(struct i40e_vsi *vsi) ret = i40e_find_all_vlan_for_mac(vsi, mv_f, vlan_num, &f->mac_info.mac_addr); if (ret != I40E_SUCCESS) { - rte_free(mv_f); + free(mv_f); return ret; } } ret = i40e_add_macvlan_filters(vsi, mv_f, vlan_num); if (ret != I40E_SUCCESS) { - rte_free(mv_f); + free(mv_f); return ret; } - rte_free(mv_f); + free(mv_f); ret = I40E_SUCCESS; } -- 2.47.3

