X-Git-Url: http://git.droids-corp.org/?a=blobdiff_plain;f=drivers%2Fnet%2Fmlx5%2Fmlx5_flow_verbs.c;h=59291fbd09a2d0fce72bd6846d248eba8911fbc8;hb=f9210259cac7;hp=0bb17b5e01a18ae3b5a89e7a7bc487064d4795fc;hpb=cfbdc3f9383aec93c1fd1a66fca8e1c2faa74441;p=dpdk.git diff --git a/drivers/net/mlx5/mlx5_flow_verbs.c b/drivers/net/mlx5/mlx5_flow_verbs.c index 0bb17b5e01..59291fbd09 100644 --- a/drivers/net/mlx5/mlx5_flow_verbs.c +++ b/drivers/net/mlx5/mlx5_flow_verbs.c @@ -72,12 +72,12 @@ mlx5_flow_discover_priorities(struct rte_eth_dev *dev) }, }; struct ibv_flow *flow; - struct mlx5_hrxq *drop = mlx5_drop_action_create(dev); + struct mlx5_hrxq *drop = priv->drop_queue.hrxq; uint16_t vprio[] = { 8, 16 }; int i; int priority = 0; - if (!drop) { + if (!drop->qp) { rte_errno = ENOTSUP; return -rte_errno; } @@ -89,7 +89,6 @@ mlx5_flow_discover_priorities(struct rte_eth_dev *dev) claim_zero(mlx5_glue->destroy_flow(flow)); priority = vprio[i]; } - mlx5_drop_action_destroy(dev); switch (priority) { case 8: priority = RTE_DIM(priority_map_3); @@ -186,16 +185,16 @@ flow_verbs_counter_get_by_idx(struct rte_eth_dev *dev, */ 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; } @@ -208,23 +207,23 @@ flow_verbs_counter_create(struct rte_eth_dev *dev, 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; } @@ -256,7 +255,6 @@ 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_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; union mlx5_l3t_data data; uint32_t n_valid = cmng->n_valid; @@ -297,12 +295,10 @@ flow_verbs_counter_new(struct rte_eth_dev *dev, uint32_t shared, uint32_t id) 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 |= MLX5_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); @@ -312,6 +308,7 @@ flow_verbs_counter_new(struct rte_eth_dev *dev, uint32_t shared, uint32_t id) pool_idx = n_valid; cmng->n_valid++; } + TAILQ_REMOVE(&pool->counters[0], cnt, next); i = MLX5_CNT_ARRAY_IDX(pool, cnt); cnt_idx = MLX5_MAKE_CNT_IDX(pool_idx, i); if (shared) { @@ -321,15 +318,15 @@ flow_verbs_counter_new(struct rte_eth_dev *dev, uint32_t shared, uint32_t id) cnt->shared_info.id = id; cnt_idx |= MLX5_CNT_SHARED_OFFSET; } - cnt_ext = MLX5_GET_POOL_CNT_EXT(pool, i); - cnt->hits = 0; - cnt->bytes = 0; /* 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); + 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; @@ -349,21 +346,18 @@ 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); if (IS_SHARED_CNT(counter) && mlx5_l3t_clear_entry(priv->sh->cnt_id_tbl, cnt->shared_info.id)) return; - cnt_ext = MLX5_CNT_TO_CNT_EXT(pool, cnt); #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 - (void)cnt_ext; TAILQ_INSERT_HEAD(&pool->counters[0], cnt, next); } @@ -384,13 +378,12 @@ flow_verbs_counter_query(struct rte_eth_dev *dev __rte_unused, 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 = { @@ -401,7 +394,7 @@ flow_verbs_counter_query(struct rte_eth_dev *dev __rte_unused, &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 @@ -1188,7 +1181,6 @@ flow_verbs_translate_action_count(struct mlx5_flow *dev_flow, 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, @@ -1208,13 +1200,12 @@ flow_verbs_translate_action_count(struct mlx5_flow *dev_flow, } #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; @@ -1271,7 +1262,7 @@ flow_verbs_validate(struct rte_eth_dev *dev, break; case RTE_FLOW_ITEM_TYPE_ETH: ret = mlx5_flow_validate_item_eth(items, item_flags, - error); + false, error); if (ret < 0) return ret; last_item = tunnel ? MLX5_FLOW_LAYER_INNER_L2 : @@ -1406,6 +1397,12 @@ flow_verbs_validate(struct rte_eth_dev *dev, return ret; last_item = MLX5_FLOW_LAYER_MPLS; break; + case RTE_FLOW_ITEM_TYPE_ICMP: + case RTE_FLOW_ITEM_TYPE_ICMP6: + return rte_flow_error_set(error, ENOTSUP, + RTE_FLOW_ERROR_TYPE_ITEM, + NULL, "ICMP/ICMP6 " + "item not supported"); default: return rte_flow_error_set(error, ENOTSUP, RTE_FLOW_ERROR_TYPE_ITEM, @@ -1631,7 +1628,9 @@ flow_verbs_prepare(struct rte_eth_dev *dev, struct mlx5_flow *dev_flow; struct mlx5_flow_handle *dev_handle; struct mlx5_priv *priv = dev->data->dev_private; + struct mlx5_flow_workspace *wks = mlx5_flow_get_thread_workspace(); + MLX5_ASSERT(wks); size += flow_verbs_get_actions_size(actions); size += flow_verbs_get_items_size(items); if (size > MLX5_VERBS_MAX_SPEC_ACT_SIZE) { @@ -1641,7 +1640,7 @@ flow_verbs_prepare(struct rte_eth_dev *dev, return NULL; } /* In case of corrupting the memory. */ - if (priv->flow_idx >= MLX5_NUM_MAX_DEV_FLOWS) { + if (wks->flow_idx >= MLX5_NUM_MAX_DEV_FLOWS) { rte_flow_error_set(error, ENOSPC, RTE_FLOW_ERROR_TYPE_UNSPECIFIED, NULL, "not free temporary device flow"); @@ -1655,8 +1654,8 @@ flow_verbs_prepare(struct rte_eth_dev *dev, "not enough memory to create flow handle"); return NULL; } - /* No multi-thread supporting. */ - dev_flow = &((struct mlx5_flow *)priv->inter_flows)[priv->flow_idx++]; + MLX5_ASSERT(wks->flow_idx + 1 < RTE_DIM(wks->flows)); + dev_flow = &wks->flows[wks->flow_idx++]; dev_flow->handle = dev_handle; dev_flow->handle_idx = handle_idx; /* Memcpy is used, only size needs to be cleared to 0. */ @@ -1700,10 +1699,11 @@ flow_verbs_translate(struct rte_eth_dev *dev, uint64_t priority = attr->priority; uint32_t subpriority = 0; struct mlx5_priv *priv = dev->data->dev_private; - struct mlx5_flow_rss_desc *rss_desc = &((struct mlx5_flow_rss_desc *) - priv->rss_desc) - [!!priv->flow_nested_idx]; + struct mlx5_flow_workspace *wks = mlx5_flow_get_thread_workspace(); + struct mlx5_flow_rss_desc *rss_desc; + MLX5_ASSERT(wks); + rss_desc = &wks->rss_desc; if (priority == MLX5_FLOW_PRIO_RSVD) priority = priv->config.flow_prio - 1; for (; actions->type != RTE_FLOW_ACTION_TYPE_END; actions++) { @@ -1850,8 +1850,7 @@ flow_verbs_translate(struct rte_eth_dev *dev, default: return rte_flow_error_set(error, ENOTSUP, RTE_FLOW_ERROR_TYPE_ITEM, - NULL, - "item not supported"); + NULL, "item not supported"); } } dev_flow->handle->layers = item_flags; @@ -1886,15 +1885,10 @@ flow_verbs_remove(struct rte_eth_dev *dev, struct rte_flow *flow) handle->drv_flow = NULL; } /* 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_drop_action_destroy(dev); - handle->rix_hrxq = 0; - } else if (handle->fate_action == - MLX5_FLOW_FATE_QUEUE) { - mlx5_hrxq_release(dev, handle->rix_hrxq); - handle->rix_hrxq = 0; - } + if (handle->rix_hrxq && + handle->fate_action == MLX5_FLOW_FATE_QUEUE) { + mlx5_hrxq_release(dev, handle->rix_hrxq); + handle->rix_hrxq = 0; } if (handle->vf_vlan.tag && handle->vf_vlan.created) mlx5_vlan_vmwa_release(dev, &handle->vf_vlan); @@ -1959,40 +1953,26 @@ flow_verbs_apply(struct rte_eth_dev *dev, struct rte_flow *flow, uint32_t dev_handles; int err; int idx; + struct mlx5_flow_workspace *wks = mlx5_flow_get_thread_workspace(); - for (idx = priv->flow_idx - 1; idx >= priv->flow_nested_idx; idx--) { - dev_flow = &((struct mlx5_flow *)priv->inter_flows)[idx]; + MLX5_ASSERT(wks); + for (idx = wks->flow_idx - 1; idx >= 0; idx--) { + dev_flow = &wks->flows[idx]; handle = dev_flow->handle; if (handle->fate_action == MLX5_FLOW_FATE_DROP) { - hrxq = mlx5_drop_action_create(dev); - if (!hrxq) { - rte_flow_error_set - (error, errno, - RTE_FLOW_ERROR_TYPE_UNSPECIFIED, NULL, - "cannot get drop hash queue"); - goto error; - } + MLX5_ASSERT(priv->drop_queue.hrxq); + hrxq = priv->drop_queue.hrxq; } else { uint32_t hrxq_idx; - struct mlx5_flow_rss_desc *rss_desc = - &((struct mlx5_flow_rss_desc *)priv->rss_desc) - [!!priv->flow_nested_idx]; + struct mlx5_flow_rss_desc *rss_desc = &wks->rss_desc; 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); - 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)); + rss_desc->key_len = MLX5_RSS_HASH_KEY_LEN; + rss_desc->hash_fields = dev_flow->hash_fields; + rss_desc->tunnel = !!(handle->layers & + MLX5_FLOW_LAYER_TUNNEL); + rss_desc->shared_rss = 0; + hrxq_idx = mlx5_hrxq_get(dev, rss_desc); hrxq = mlx5_ipool_get(priv->sh->ipool[MLX5_IPOOL_HRXQ], hrxq_idx); if (!hrxq) { @@ -2031,15 +2011,10 @@ error: SILIST_FOREACH(priv->sh->ipool[MLX5_IPOOL_MLX5_FLOW], flow->dev_handles, dev_handles, handle, next) { /* 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_drop_action_destroy(dev); - handle->rix_hrxq = 0; - } else if (handle->fate_action == - MLX5_FLOW_FATE_QUEUE) { - mlx5_hrxq_release(dev, handle->rix_hrxq); - handle->rix_hrxq = 0; - } + if (handle->rix_hrxq && + handle->fate_action == MLX5_FLOW_FATE_QUEUE) { + mlx5_hrxq_release(dev, handle->rix_hrxq); + handle->rix_hrxq = 0; } if (handle->vf_vlan.tag && handle->vf_vlan.created) mlx5_vlan_vmwa_release(dev, &handle->vf_vlan); @@ -2080,6 +2055,17 @@ flow_verbs_query(struct rte_eth_dev *dev, return ret; } +static int +flow_verbs_sync_domain(struct rte_eth_dev *dev, uint32_t domains, + uint32_t flags) +{ + RTE_SET_USED(dev); + RTE_SET_USED(domains); + RTE_SET_USED(flags); + + return 0; +} + const struct mlx5_flow_driver_ops mlx5_flow_verbs_drv_ops = { .validate = flow_verbs_validate, .prepare = flow_verbs_prepare, @@ -2088,4 +2074,5 @@ const struct mlx5_flow_driver_ops mlx5_flow_verbs_drv_ops = { .remove = flow_verbs_remove, .destroy = flow_verbs_destroy, .query = flow_verbs_query, + .sync_domain = flow_verbs_sync_domain, };