},
};
struct ibv_flow *flow;
- struct mlx5_hrxq *drop = mlx5_hrxq_drop_new(dev);
+ struct mlx5_hrxq *drop = mlx5_drop_action_create(dev);
uint16_t vprio[] = { 8, 16 };
int i;
int priority = 0;
claim_zero(mlx5_glue->destroy_flow(flow));
priority = vprio[i];
}
- mlx5_hrxq_drop_release(dev);
+ mlx5_drop_action_destroy(dev);
switch (priority) {
case 8:
priority = RTE_DIM(priority_map_3);
struct mlx5_flow_counter_pool **ppool)
{
struct mlx5_priv *priv = dev->data->dev_private;
- struct mlx5_pools_container *cont = MLX5_CNT_CONTAINER(priv->sh, 0, 0);
+ struct mlx5_flow_counter_mng *cmng = &priv->sh->cmng;
struct mlx5_flow_counter_pool *pool;
- idx--;
- pool = cont->pools[idx / MLX5_COUNTERS_PER_POOL];
+ idx = (idx - 1) & (MLX5_CNT_SHARED_OFFSET - 1);
+ pool = cmng->pools[idx / MLX5_COUNTERS_PER_POOL];
MLX5_ASSERT(pool);
if (ppool)
*ppool = pool;
*/
static int
flow_verbs_counter_create(struct rte_eth_dev *dev,
- struct mlx5_flow_counter_ext *counter)
+ struct mlx5_flow_counter *counter)
{
#if defined(HAVE_IBV_DEVICE_COUNTERS_SET_V42)
struct mlx5_priv *priv = dev->data->dev_private;
struct ibv_context *ctx = priv->sh->ctx;
struct ibv_counter_set_init_attr init = {
- .counter_set_id = counter->id};
+ .counter_set_id = counter->shared_info.id};
- counter->cs = mlx5_glue->create_counter_set(ctx, &init);
- if (!counter->cs) {
+ counter->dcs_when_free = mlx5_glue->create_counter_set(ctx, &init);
+ if (!counter->dcs_when_free) {
rte_errno = ENOTSUP;
return -ENOTSUP;
}
int ret;
memset(&attach, 0, sizeof(attach));
- counter->cs = mlx5_glue->create_counters(ctx, &init);
- if (!counter->cs) {
+ counter->dcs_when_free = mlx5_glue->create_counters(ctx, &init);
+ if (!counter->dcs_when_free) {
rte_errno = ENOTSUP;
return -ENOTSUP;
}
attach.counter_desc = IBV_COUNTER_PACKETS;
attach.index = 0;
- ret = mlx5_glue->attach_counters(counter->cs, &attach, NULL);
+ ret = mlx5_glue->attach_counters(counter->dcs_when_free, &attach, NULL);
if (!ret) {
attach.counter_desc = IBV_COUNTER_BYTES;
attach.index = 1;
ret = mlx5_glue->attach_counters
- (counter->cs, &attach, NULL);
+ (counter->dcs_when_free, &attach, NULL);
}
if (ret) {
- claim_zero(mlx5_glue->destroy_counters(counter->cs));
- counter->cs = NULL;
+ claim_zero(mlx5_glue->destroy_counters(counter->dcs_when_free));
+ counter->dcs_when_free = NULL;
rte_errno = ret;
return -ret;
}
flow_verbs_counter_new(struct rte_eth_dev *dev, uint32_t shared, uint32_t id)
{
struct mlx5_priv *priv = dev->data->dev_private;
- struct mlx5_pools_container *cont = MLX5_CNT_CONTAINER(priv->sh, 0, 0);
+ struct mlx5_flow_counter_mng *cmng = &priv->sh->cmng;
struct mlx5_flow_counter_pool *pool = NULL;
- struct mlx5_flow_counter_ext *cnt_ext = NULL;
struct mlx5_flow_counter *cnt = NULL;
- uint32_t n_valid = rte_atomic16_read(&cont->n_valid);
- uint32_t pool_idx;
+ union mlx5_l3t_data data;
+ uint32_t n_valid = cmng->n_valid;
+ uint32_t pool_idx, cnt_idx;
uint32_t i;
int ret;
- if (shared) {
- for (pool_idx = 0; pool_idx < n_valid; ++pool_idx) {
- pool = cont->pools[pool_idx];
- for (i = 0; i < MLX5_COUNTERS_PER_POOL; ++i) {
- cnt_ext = MLX5_GET_POOL_CNT_EXT(pool, i);
- if (cnt_ext->shared && cnt_ext->id == id) {
- cnt_ext->ref_cnt++;
- return MLX5_MAKE_CNT_IDX(pool_idx, i);
- }
- }
- }
- }
+ if (shared && !mlx5_l3t_get_entry(priv->sh->cnt_id_tbl, id, &data) &&
+ data.dword)
+ return data.dword;
for (pool_idx = 0; pool_idx < n_valid; ++pool_idx) {
- pool = cont->pools[pool_idx];
+ pool = cmng->pools[pool_idx];
if (!pool)
continue;
cnt = TAILQ_FIRST(&pool->counters[0]);
struct mlx5_flow_counter_pool **pools;
uint32_t size;
- if (n_valid == cont->n) {
+ if (n_valid == cmng->n) {
/* Resize the container pool array. */
size = sizeof(struct mlx5_flow_counter_pool *) *
(n_valid + MLX5_CNT_CONTAINER_RESIZE);
if (!pools)
return 0;
if (n_valid) {
- memcpy(pools, cont->pools,
+ memcpy(pools, cmng->pools,
sizeof(struct mlx5_flow_counter_pool *) *
n_valid);
- mlx5_free(cont->pools);
+ mlx5_free(cmng->pools);
}
- cont->pools = pools;
- cont->n += MLX5_CNT_CONTAINER_RESIZE;
+ cmng->pools = pools;
+ cmng->n += MLX5_CNT_CONTAINER_RESIZE;
}
/* Allocate memory for new pool*/
- size = sizeof(*pool) + (sizeof(*cnt_ext) + sizeof(*cnt)) *
- MLX5_COUNTERS_PER_POOL;
+ size = sizeof(*pool) + sizeof(*cnt) * MLX5_COUNTERS_PER_POOL;
pool = mlx5_malloc(MLX5_MEM_ZERO, size, 0, SOCKET_ID_ANY);
if (!pool)
return 0;
- pool->type |= CNT_POOL_TYPE_EXT;
for (i = 0; i < MLX5_COUNTERS_PER_POOL; ++i) {
cnt = MLX5_POOL_GET_CNT(pool, i);
TAILQ_INSERT_HEAD(&pool->counters[0], cnt, next);
}
cnt = MLX5_POOL_GET_CNT(pool, 0);
- cont->pools[n_valid] = pool;
+ cmng->pools[n_valid] = pool;
pool_idx = n_valid;
- rte_atomic16_add(&cont->n_valid, 1);
- TAILQ_INSERT_HEAD(&cont->pool_list, pool, next);
+ cmng->n_valid++;
}
+ TAILQ_REMOVE(&pool->counters[0], cnt, next);
i = MLX5_CNT_ARRAY_IDX(pool, cnt);
- cnt_ext = MLX5_GET_POOL_CNT_EXT(pool, i);
- cnt_ext->id = id;
- cnt_ext->shared = shared;
- cnt_ext->ref_cnt = 1;
- cnt->hits = 0;
- cnt->bytes = 0;
+ cnt_idx = MLX5_MAKE_CNT_IDX(pool_idx, i);
+ if (shared) {
+ data.dword = cnt_idx;
+ if (mlx5_l3t_set_entry(priv->sh->cnt_id_tbl, id, &data))
+ return 0;
+ cnt->shared_info.id = id;
+ cnt_idx |= MLX5_CNT_SHARED_OFFSET;
+ }
/* Create counter with Verbs. */
- ret = flow_verbs_counter_create(dev, cnt_ext);
+ ret = flow_verbs_counter_create(dev, cnt);
if (!ret) {
- TAILQ_REMOVE(&pool->counters[0], cnt, next);
- return MLX5_MAKE_CNT_IDX(pool_idx, i);
+ cnt->dcs_when_active = cnt->dcs_when_free;
+ cnt->hits = 0;
+ cnt->bytes = 0;
+ return cnt_idx;
}
+ TAILQ_INSERT_HEAD(&pool->counters[0], cnt, next);
/* Some error occurred in Verbs library. */
rte_errno = -ret;
return 0;
static void
flow_verbs_counter_release(struct rte_eth_dev *dev, uint32_t counter)
{
+ struct mlx5_priv *priv = dev->data->dev_private;
struct mlx5_flow_counter_pool *pool;
struct mlx5_flow_counter *cnt;
- struct mlx5_flow_counter_ext *cnt_ext;
- cnt = flow_verbs_counter_get_by_idx(dev, counter,
- &pool);
- cnt_ext = MLX5_CNT_TO_CNT_EXT(pool, cnt);
- if (--cnt_ext->ref_cnt == 0) {
+ cnt = flow_verbs_counter_get_by_idx(dev, counter, &pool);
+ if (IS_SHARED_CNT(counter) &&
+ mlx5_l3t_clear_entry(priv->sh->cnt_id_tbl, cnt->shared_info.id))
+ return;
#if defined(HAVE_IBV_DEVICE_COUNTERS_SET_V42)
- claim_zero(mlx5_glue->destroy_counter_set(cnt_ext->cs));
- cnt_ext->cs = NULL;
+ claim_zero(mlx5_glue->destroy_counter_set
+ ((struct ibv_counter_set *)cnt->dcs_when_active));
#elif defined(HAVE_IBV_DEVICE_COUNTERS_SET_V45)
- claim_zero(mlx5_glue->destroy_counters(cnt_ext->cs));
- cnt_ext->cs = NULL;
+ claim_zero(mlx5_glue->destroy_counters
+ ((struct ibv_counters *)cnt->dcs_when_active));
#endif
- TAILQ_INSERT_HEAD(&pool->counters[0], cnt, next);
- }
+ TAILQ_INSERT_HEAD(&pool->counters[0], cnt, next);
}
/**
struct mlx5_flow_counter_pool *pool;
struct mlx5_flow_counter *cnt = flow_verbs_counter_get_by_idx
(dev, flow->counter, &pool);
- struct mlx5_flow_counter_ext *cnt_ext = MLX5_CNT_TO_CNT_EXT
- (pool, cnt);
struct rte_flow_query_count *qc = data;
uint64_t counters[2] = {0, 0};
#if defined(HAVE_IBV_DEVICE_COUNTERS_SET_V42)
struct ibv_query_counter_set_attr query_cs_attr = {
- .cs = cnt_ext->cs,
+ .dcs_when_free = (struct ibv_counter_set *)
+ cnt->dcs_when_active,
.query_flags = IBV_COUNTER_SET_FORCE_UPDATE,
};
struct ibv_counter_set_data query_out = {
&query_out);
#elif defined(HAVE_IBV_DEVICE_COUNTERS_SET_V45)
int err = mlx5_glue->query_counters
- (cnt_ext->cs, counters,
+ ((struct ibv_counters *)cnt->dcs_when_active, counters,
RTE_DIM(counters),
IBV_READ_COUNTERS_ATTR_PREFER_CACHED);
#endif
defined(HAVE_IBV_DEVICE_COUNTERS_SET_V45)
struct mlx5_flow_counter_pool *pool;
struct mlx5_flow_counter *cnt = NULL;
- struct mlx5_flow_counter_ext *cnt_ext;
unsigned int size = sizeof(struct ibv_flow_spec_counter_action);
struct ibv_flow_spec_counter_action counter = {
.type = IBV_FLOW_SPEC_ACTION_COUNT,
}
#if defined(HAVE_IBV_DEVICE_COUNTERS_SET_V42)
cnt = flow_verbs_counter_get_by_idx(dev, flow->counter, &pool);
- cnt_ext = MLX5_CNT_TO_CNT_EXT(pool, cnt);
- counter.counter_set_handle = cnt_ext->cs->handle;
+ counter.counter_set_handle =
+ ((struct ibv_counter_set *)cnt->dcs_when_active)->handle;
flow_verbs_spec_add(&dev_flow->verbs, &counter, size);
#elif defined(HAVE_IBV_DEVICE_COUNTERS_SET_V45)
cnt = flow_verbs_counter_get_by_idx(dev, flow->counter, &pool);
- cnt_ext = MLX5_CNT_TO_CNT_EXT(pool, cnt);
- counter.counters = cnt_ext->cs;
+ counter.counters = (struct ibv_counters *)cnt->dcs_when_active;
flow_verbs_spec_add(&dev_flow->verbs, &counter, size);
#endif
return 0;
}
break;
case RTE_FLOW_ITEM_TYPE_IPV4:
- ret = mlx5_flow_validate_item_ipv4(items, item_flags,
- last_item,
- ether_type, NULL,
- error);
+ ret = mlx5_flow_validate_item_ipv4
+ (items, item_flags,
+ last_item, ether_type, NULL,
+ MLX5_ITEM_RANGE_NOT_ACCEPTED,
+ error);
if (ret < 0)
return ret;
last_item = tunnel ? MLX5_FLOW_LAYER_INNER_L3_IPV4 :
/* hrxq is union, don't touch it only the flag is set. */
if (handle->rix_hrxq) {
if (handle->fate_action == MLX5_FLOW_FATE_DROP) {
- mlx5_hrxq_drop_release(dev);
+ mlx5_drop_action_destroy(dev);
handle->rix_hrxq = 0;
} else if (handle->fate_action ==
MLX5_FLOW_FATE_QUEUE) {
dev_flow = &((struct mlx5_flow *)priv->inter_flows)[idx];
handle = dev_flow->handle;
if (handle->fate_action == MLX5_FLOW_FATE_DROP) {
- hrxq = mlx5_hrxq_drop_new(dev);
+ hrxq = mlx5_drop_action_create(dev);
if (!hrxq) {
rte_flow_error_set
(error, errno,
MLX5_ASSERT(rss_desc->queue_num);
hrxq_idx = mlx5_hrxq_get(dev, rss_desc->key,
- MLX5_RSS_HASH_KEY_LEN,
- dev_flow->hash_fields,
- rss_desc->queue,
- rss_desc->queue_num);
+ MLX5_RSS_HASH_KEY_LEN,
+ dev_flow->hash_fields,
+ rss_desc->queue,
+ rss_desc->queue_num);
if (!hrxq_idx)
- hrxq_idx = mlx5_hrxq_new(dev, rss_desc->key,
- MLX5_RSS_HASH_KEY_LEN,
- dev_flow->hash_fields,
- rss_desc->queue,
- rss_desc->queue_num,
- !!(handle->layers &
- MLX5_FLOW_LAYER_TUNNEL));
+ hrxq_idx = mlx5_hrxq_new
+ (dev, rss_desc->key,
+ MLX5_RSS_HASH_KEY_LEN,
+ dev_flow->hash_fields,
+ rss_desc->queue,
+ rss_desc->queue_num,
+ !!(handle->layers &
+ MLX5_FLOW_LAYER_TUNNEL),
+ false);
hrxq = mlx5_ipool_get(priv->sh->ipool[MLX5_IPOOL_HRXQ],
- hrxq_idx);
+ hrxq_idx);
if (!hrxq) {
rte_flow_error_set
(error, rte_errno,
/* hrxq is union, don't touch it only the flag is set. */
if (handle->rix_hrxq) {
if (handle->fate_action == MLX5_FLOW_FATE_DROP) {
- mlx5_hrxq_drop_release(dev);
+ mlx5_drop_action_destroy(dev);
handle->rix_hrxq = 0;
} else if (handle->fate_action ==
MLX5_FLOW_FATE_QUEUE) {