This patch will alloc counter pool at dev init and release counter pool at dev close.
Signed-off-by: Yahui Cao <yahui....@intel.com> --- drivers/net/ice/ice_ethdev.h | 33 +++++++++++ drivers/net/ice/ice_fdir_filter.c | 92 +++++++++++++++++++++++++++++++ 2 files changed, 125 insertions(+) diff --git a/drivers/net/ice/ice_ethdev.h b/drivers/net/ice/ice_ethdev.h index 30ab518cd..8a54f57f0 100644 --- a/drivers/net/ice/ice_ethdev.h +++ b/drivers/net/ice/ice_ethdev.h @@ -268,6 +268,37 @@ struct ice_fdir_fltr_pattern { struct ice_fdir_extra ext_mask; }; +#define ICE_FDIR_COUNTER_DEFAULT_POOL_SIZE 1 +#define ICE_FDIR_COUNTER_MAX_POOL_SIZE 32 +#define ICE_FDIR_COUNTERS_PER_BLOCK 256 +#define ICE_FDIR_COUNTER_INDEX(base_idx) \ + ((base_idx) * ICE_FDIR_COUNTERS_PER_BLOCK) +struct ice_fdir_counter { + TAILQ_ENTRY(ice_fdir_counter) next; + uint8_t shared; + uint32_t ref_cnt; + uint32_t id; + uint64_t hits; + uint64_t bytes; + uint32_t hw_index; +}; + +TAILQ_HEAD(ice_fdir_counter_list, ice_fdir_counter); + +struct ice_fdir_counter_pool { + TAILQ_ENTRY(ice_fdir_counter_pool) next; + struct ice_fdir_counter_list counter_list; + struct ice_fdir_counter counters[0]; +}; + +TAILQ_HEAD(ice_fdir_counter_pool_list, ice_fdir_counter_pool); + +struct ice_fdir_counter_pool_container { + struct ice_fdir_counter_pool_list pool_list; + struct ice_fdir_counter_pool *pools[ICE_FDIR_COUNTER_MAX_POOL_SIZE]; + uint8_t index_free; +}; + /** * A structure used to define fields of a FDIR related info. */ @@ -281,6 +312,8 @@ struct ice_fdir_info { struct ice_fdir_filter_conf **hash_map; struct rte_hash *hash_table; + + struct ice_fdir_counter_pool_container counter; }; struct ice_pf { diff --git a/drivers/net/ice/ice_fdir_filter.c b/drivers/net/ice/ice_fdir_filter.c index 1893aa0ee..5fab7441b 100644 --- a/drivers/net/ice/ice_fdir_filter.c +++ b/drivers/net/ice/ice_fdir_filter.c @@ -115,6 +115,88 @@ ice_init_fdir_filter_list(struct ice_pf *pf) return ret; } +static int +ice_fdir_counter_pool_add(__rte_unused struct ice_pf *pf, + struct ice_fdir_counter_pool_container *container, + uint32_t index_start, + uint32_t len) +{ + struct ice_fdir_counter_pool *pool; + uint32_t i; + int ret = 0; + + pool = rte_zmalloc("ice_fdir_counter_pool", + sizeof(*pool) + + sizeof(struct ice_fdir_counter) * len, + 0); + if (!pool) { + PMD_INIT_LOG(ERR, + "Failed to allocate memory for fdir counter pool"); + return -ENOMEM; + } + + TAILQ_INIT(&pool->counter_list); + TAILQ_INSERT_TAIL(&container->pool_list, pool, next); + + for (i = 0; i < len; i++) { + struct ice_fdir_counter *counter = &pool->counters[i]; + + counter->hw_index = index_start + i; + TAILQ_INSERT_TAIL(&pool->counter_list, counter, next); + } + + if (container->index_free == ICE_FDIR_COUNTER_MAX_POOL_SIZE) { + PMD_INIT_LOG(ERR, "FDIR counter pool is full"); + ret = -EINVAL; + goto free_pool; + } + + container->pools[container->index_free++] = pool; + return 0; + +free_pool: + rte_free(pool); + return ret; +} + +static int +ice_fdir_counter_init(struct ice_pf *pf) +{ + struct ice_hw *hw = ICE_PF_TO_HW(pf); + struct ice_fdir_info *fdir_info = &pf->fdir; + struct ice_fdir_counter_pool_container *container = + &fdir_info->counter; + uint32_t cnt_index, len; + int ret; + + TAILQ_INIT(&container->pool_list); + + cnt_index = ICE_FDIR_COUNTER_INDEX(hw->fd_ctr_base); + len = ICE_FDIR_COUNTERS_PER_BLOCK; + + ret = ice_fdir_counter_pool_add(pf, container, cnt_index, len); + if (ret) { + PMD_INIT_LOG(ERR, "Failed to add fdir pool to container"); + return ret; + } + + return 0; +} + +static int +ice_fdir_counter_release(struct ice_pf *pf) +{ + struct ice_fdir_info *fdir_info = &pf->fdir; + struct ice_fdir_counter_pool_container *container = + &fdir_info->counter; + uint8_t i; + + for (i = 0; i < container->index_free; i++) + rte_free(container->pools[i]); + + return 0; +} + static void ice_release_fdir_filter_list(struct ice_pf *pf) { @@ -169,6 +251,12 @@ ice_fdir_setup(struct ice_pf *pf) return -EINVAL; } + err = ice_fdir_counter_init(pf); + if (err) { + PMD_DRV_LOG(ERR, "Failed to init FDIR counter."); + return -EINVAL; + } + /*Fdir tx queue setup*/ err = ice_fdir_setup_tx_resources(pf); if (err) { @@ -250,6 +338,10 @@ ice_fdir_teardown(struct ice_pf *pf) if (err) PMD_DRV_LOG(ERR, "Failed to stop RX queue."); + err = ice_fdir_counter_release(pf); + if (err) + PMD_DRV_LOG(ERR, "Failed to release FDIR counter resource."); + ice_tx_queue_release(pf->fdir.txq); pf->fdir.txq = NULL; ice_rx_queue_release(pf->fdir.rxq); -- 2.17.1