net/mlx5: make flow table cache thread safe
[dpdk.git] / drivers / net / mlx5 / mlx5.c
index e5ca392..1d25a8e 100644 (file)
@@ -191,7 +191,7 @@ static const struct mlx5_indexed_pool_config mlx5_ipool_cfg[] = {
                .trunk_size = 64,
                .grow_trunk = 3,
                .grow_shift = 2,
-               .need_lock = 0,
+               .need_lock = 1,
                .release_mem_en = 1,
                .malloc = mlx5_malloc,
                .free = mlx5_free,
@@ -202,7 +202,7 @@ static const struct mlx5_indexed_pool_config mlx5_ipool_cfg[] = {
                .trunk_size = 64,
                .grow_trunk = 3,
                .grow_shift = 2,
-               .need_lock = 0,
+               .need_lock = 1,
                .release_mem_en = 1,
                .malloc = mlx5_malloc,
                .free = mlx5_free,
@@ -213,7 +213,7 @@ static const struct mlx5_indexed_pool_config mlx5_ipool_cfg[] = {
                .trunk_size = 64,
                .grow_trunk = 3,
                .grow_shift = 2,
-               .need_lock = 0,
+               .need_lock = 1,
                .release_mem_en = 1,
                .malloc = mlx5_malloc,
                .free = mlx5_free,
@@ -224,7 +224,7 @@ static const struct mlx5_indexed_pool_config mlx5_ipool_cfg[] = {
                .trunk_size = 64,
                .grow_trunk = 3,
                .grow_shift = 2,
-               .need_lock = 0,
+               .need_lock = 1,
                .release_mem_en = 1,
                .malloc = mlx5_malloc,
                .free = mlx5_free,
@@ -235,19 +235,41 @@ static const struct mlx5_indexed_pool_config mlx5_ipool_cfg[] = {
                .trunk_size = 64,
                .grow_trunk = 3,
                .grow_shift = 2,
-               .need_lock = 0,
+               .need_lock = 1,
                .release_mem_en = 1,
                .malloc = mlx5_malloc,
                .free = mlx5_free,
                .type = "mlx5_jump_ipool",
        },
+       {
+               .size = sizeof(struct mlx5_flow_dv_sample_resource),
+               .trunk_size = 64,
+               .grow_trunk = 3,
+               .grow_shift = 2,
+               .need_lock = 1,
+               .release_mem_en = 1,
+               .malloc = mlx5_malloc,
+               .free = mlx5_free,
+               .type = "mlx5_sample_ipool",
+       },
+       {
+               .size = sizeof(struct mlx5_flow_dv_dest_array_resource),
+               .trunk_size = 64,
+               .grow_trunk = 3,
+               .grow_shift = 2,
+               .need_lock = 1,
+               .release_mem_en = 1,
+               .malloc = mlx5_malloc,
+               .free = mlx5_free,
+               .type = "mlx5_dest_array_ipool",
+       },
 #endif
        {
                .size = sizeof(struct mlx5_flow_meter),
                .trunk_size = 64,
                .grow_trunk = 3,
                .grow_shift = 2,
-               .need_lock = 0,
+               .need_lock = 1,
                .release_mem_en = 1,
                .malloc = mlx5_malloc,
                .free = mlx5_free,
@@ -258,7 +280,7 @@ static const struct mlx5_indexed_pool_config mlx5_ipool_cfg[] = {
                .trunk_size = 64,
                .grow_trunk = 3,
                .grow_shift = 2,
-               .need_lock = 0,
+               .need_lock = 1,
                .release_mem_en = 1,
                .malloc = mlx5_malloc,
                .free = mlx5_free,
@@ -269,7 +291,7 @@ static const struct mlx5_indexed_pool_config mlx5_ipool_cfg[] = {
                .trunk_size = 64,
                .grow_trunk = 3,
                .grow_shift = 2,
-               .need_lock = 0,
+               .need_lock = 1,
                .release_mem_en = 1,
                .malloc = mlx5_malloc,
                .free = mlx5_free,
@@ -284,7 +306,7 @@ static const struct mlx5_indexed_pool_config mlx5_ipool_cfg[] = {
                .trunk_size = 64,
                .grow_trunk = 3,
                .grow_shift = 2,
-               .need_lock = 0,
+               .need_lock = 1,
                .release_mem_en = 1,
                .malloc = mlx5_malloc,
                .free = mlx5_free,
@@ -299,6 +321,21 @@ static const struct mlx5_indexed_pool_config mlx5_ipool_cfg[] = {
                .free = mlx5_free,
                .type = "rte_flow_ipool",
        },
+       {
+               .size = 0,
+               .need_lock = 1,
+               .type = "mlx5_flow_rss_id_ipool",
+       },
+       {
+               .size = 0,
+               .need_lock = 1,
+               .type = "mlx5_flow_tnl_flow_ipool",
+       },
+       {
+               .size = 0,
+               .need_lock = 1,
+               .type = "mlx5_flow_tnl_tbl_ipool",
+       },
 };
 
 
@@ -307,127 +344,6 @@ static const struct mlx5_indexed_pool_config mlx5_ipool_cfg[] = {
 
 #define MLX5_FLOW_TABLE_HLIST_ARRAY_SIZE 4096
 
-/**
- * Allocate ID pool structure.
- *
- * @param[in] max_id
- *   The maximum id can be allocated from the pool.
- *
- * @return
- *   Pointer to pool object, NULL value otherwise.
- */
-struct mlx5_flow_id_pool *
-mlx5_flow_id_pool_alloc(uint32_t max_id)
-{
-       struct mlx5_flow_id_pool *pool;
-       void *mem;
-
-       pool = mlx5_malloc(MLX5_MEM_ZERO, sizeof(*pool),
-                          RTE_CACHE_LINE_SIZE, SOCKET_ID_ANY);
-       if (!pool) {
-               DRV_LOG(ERR, "can't allocate id pool");
-               rte_errno  = ENOMEM;
-               return NULL;
-       }
-       mem = mlx5_malloc(MLX5_MEM_ZERO,
-                         MLX5_FLOW_MIN_ID_POOL_SIZE * sizeof(uint32_t),
-                         RTE_CACHE_LINE_SIZE, SOCKET_ID_ANY);
-       if (!mem) {
-               DRV_LOG(ERR, "can't allocate mem for id pool");
-               rte_errno  = ENOMEM;
-               goto error;
-       }
-       pool->free_arr = mem;
-       pool->curr = pool->free_arr;
-       pool->last = pool->free_arr + MLX5_FLOW_MIN_ID_POOL_SIZE;
-       pool->base_index = 0;
-       pool->max_id = max_id;
-       return pool;
-error:
-       mlx5_free(pool);
-       return NULL;
-}
-
-/**
- * Release ID pool structure.
- *
- * @param[in] pool
- *   Pointer to flow id pool object to free.
- */
-void
-mlx5_flow_id_pool_release(struct mlx5_flow_id_pool *pool)
-{
-       mlx5_free(pool->free_arr);
-       mlx5_free(pool);
-}
-
-/**
- * Generate ID.
- *
- * @param[in] pool
- *   Pointer to flow id pool.
- * @param[out] id
- *   The generated ID.
- *
- * @return
- *   0 on success, error value otherwise.
- */
-uint32_t
-mlx5_flow_id_get(struct mlx5_flow_id_pool *pool, uint32_t *id)
-{
-       if (pool->curr == pool->free_arr) {
-               if (pool->base_index == pool->max_id) {
-                       rte_errno  = ENOMEM;
-                       DRV_LOG(ERR, "no free id");
-                       return -rte_errno;
-               }
-               *id = ++pool->base_index;
-               return 0;
-       }
-       *id = *(--pool->curr);
-       return 0;
-}
-
-/**
- * Release ID.
- *
- * @param[in] pool
- *   Pointer to flow id pool.
- * @param[out] id
- *   The generated ID.
- *
- * @return
- *   0 on success, error value otherwise.
- */
-uint32_t
-mlx5_flow_id_release(struct mlx5_flow_id_pool *pool, uint32_t id)
-{
-       uint32_t size;
-       uint32_t size2;
-       void *mem;
-
-       if (pool->curr == pool->last) {
-               size = pool->curr - pool->free_arr;
-               size2 = size * MLX5_ID_GENERATION_ARRAY_FACTOR;
-               MLX5_ASSERT(size2 > size);
-               mem = mlx5_malloc(0, size2 * sizeof(uint32_t), 0,
-                                 SOCKET_ID_ANY);
-               if (!mem) {
-                       DRV_LOG(ERR, "can't allocate mem for id pool");
-                       rte_errno  = ENOMEM;
-                       return -rte_errno;
-               }
-               memcpy(mem, pool->free_arr, size * sizeof(uint32_t));
-               mlx5_free(pool->free_arr);
-               pool->free_arr = mem;
-               pool->curr = pool->free_arr + size;
-               pool->last = pool->free_arr + size2;
-       }
-       *pool->curr = id;
-       pool->curr++;
-       return 0;
-}
-
 /**
  * Initialize the shared aging list information per port.
  *
@@ -462,14 +378,13 @@ mlx5_flow_counters_mng_init(struct mlx5_dev_ctx_shared *sh)
 
        memset(&sh->cmng, 0, sizeof(sh->cmng));
        TAILQ_INIT(&sh->cmng.flow_counters);
-       for (i = 0; i < MLX5_CCONT_TYPE_MAX; ++i) {
-               sh->cmng.ccont[i].min_id = MLX5_CNT_BATCH_OFFSET;
-               sh->cmng.ccont[i].max_id = -1;
-               sh->cmng.ccont[i].last_pool_idx = POOL_IDX_INVALID;
-               TAILQ_INIT(&sh->cmng.ccont[i].pool_list);
-               rte_spinlock_init(&sh->cmng.ccont[i].resize_sl);
-               TAILQ_INIT(&sh->cmng.ccont[i].counters);
-               rte_spinlock_init(&sh->cmng.ccont[i].csl);
+       sh->cmng.min_id = MLX5_CNT_BATCH_OFFSET;
+       sh->cmng.max_id = -1;
+       sh->cmng.last_pool_idx = POOL_IDX_INVALID;
+       rte_spinlock_init(&sh->cmng.pool_update_sl);
+       for (i = 0; i < MLX5_COUNTER_TYPE_MAX; i++) {
+               TAILQ_INIT(&sh->cmng.counters[i]);
+               rte_spinlock_init(&sh->cmng.csl[i]);
        }
 }
 
@@ -500,8 +415,7 @@ static void
 mlx5_flow_counters_mng_close(struct mlx5_dev_ctx_shared *sh)
 {
        struct mlx5_counter_stats_mem_mng *mng;
-       int i;
-       int j;
+       int i, j;
        int retries = 1024;
 
        rte_errno = 0;
@@ -511,34 +425,33 @@ mlx5_flow_counters_mng_close(struct mlx5_dev_ctx_shared *sh)
                        break;
                rte_pause();
        }
-       for (i = 0; i < MLX5_CCONT_TYPE_MAX; ++i) {
+
+       if (sh->cmng.pools) {
                struct mlx5_flow_counter_pool *pool;
-               uint32_t batch = !!(i > 1);
+               uint16_t n_valid = sh->cmng.n_valid;
+               bool fallback = sh->cmng.counter_fallback;
 
-               if (!sh->cmng.ccont[i].pools)
-                       continue;
-               pool = TAILQ_FIRST(&sh->cmng.ccont[i].pool_list);
-               while (pool) {
-                       if (batch && pool->min_dcs)
+               for (i = 0; i < n_valid; ++i) {
+                       pool = sh->cmng.pools[i];
+                       if (!fallback && pool->min_dcs)
                                claim_zero(mlx5_devx_cmd_destroy
                                                               (pool->min_dcs));
                        for (j = 0; j < MLX5_COUNTERS_PER_POOL; ++j) {
-                               if (MLX5_POOL_GET_CNT(pool, j)->action)
+                               struct mlx5_flow_counter *cnt =
+                                               MLX5_POOL_GET_CNT(pool, j);
+
+                               if (cnt->action)
                                        claim_zero
                                         (mlx5_glue->destroy_flow_action
-                                         (MLX5_POOL_GET_CNT
-                                         (pool, j)->action));
-                               if (!batch && MLX5_GET_POOL_CNT_EXT
-                                   (pool, j)->dcs)
+                                         (cnt->action));
+                               if (fallback && MLX5_POOL_GET_CNT
+                                   (pool, j)->dcs_when_free)
                                        claim_zero(mlx5_devx_cmd_destroy
-                                                  (MLX5_GET_POOL_CNT_EXT
-                                                   (pool, j)->dcs));
+                                                  (cnt->dcs_when_free));
                        }
-                       TAILQ_REMOVE(&sh->cmng.ccont[i].pool_list, pool, next);
                        mlx5_free(pool);
-                       pool = TAILQ_FIRST(&sh->cmng.ccont[i].pool_list);
                }
-               mlx5_free(sh->cmng.ccont[i].pools);
+               mlx5_free(sh->cmng.pools);
        }
        mng = LIST_FIRST(&sh->cmng.mem_mngs);
        while (mng) {
@@ -925,10 +838,8 @@ mlx5_alloc_shared_dev_ctx(const struct mlx5_dev_spawn_data *spawn,
                goto error;
        }
        if (sh->devx) {
-               uint32_t lcore = (uint32_t)rte_lcore_to_cpu_id(-1);
-
                /* Query the EQN for this core. */
-               err = mlx5_glue->devx_query_eqn(sh->ctx, lcore, &sh->eqn);
+               err = mlx5_glue->devx_query_eqn(sh->ctx, 0, &sh->eqn);
                if (err) {
                        rte_errno = errno;
                        DRV_LOG(ERR, "Failed to query event queue number %d.",
@@ -962,13 +873,6 @@ mlx5_alloc_shared_dev_ctx(const struct mlx5_dev_spawn_data *spawn,
                MLX5_ASSERT(sh->devx_rx_uar);
                MLX5_ASSERT(mlx5_os_get_devx_uar_base_addr(sh->devx_rx_uar));
        }
-       sh->flow_id_pool = mlx5_flow_id_pool_alloc
-                                       ((1 << HAIRPIN_FLOW_ID_BITS) - 1);
-       if (!sh->flow_id_pool) {
-               DRV_LOG(ERR, "can't create flow id pool");
-               err = ENOMEM;
-               goto error;
-       }
 #ifndef RTE_ARCH_64
        /* Initialize UAR access locks for 32bit implementations. */
        rte_spinlock_init(&sh->uar_lock_cq);
@@ -1030,8 +934,6 @@ error:
                claim_zero(mlx5_glue->dealloc_pd(sh->pd));
        if (sh->ctx)
                claim_zero(mlx5_glue->close_device(sh->ctx));
-       if (sh->flow_id_pool)
-               mlx5_flow_id_pool_release(sh->flow_id_pool);
        mlx5_free(sh);
        MLX5_ASSERT(err > 0);
        rte_errno = err;
@@ -1102,8 +1004,6 @@ mlx5_free_shared_dev_ctx(struct mlx5_dev_ctx_shared *sh)
                mlx5_glue->devx_free_uar(sh->devx_rx_uar);
        if (sh->ctx)
                claim_zero(mlx5_glue->close_device(sh->ctx));
-       if (sh->flow_id_pool)
-               mlx5_flow_id_pool_release(sh->flow_id_pool);
        pthread_mutex_destroy(&sh->txpp.mutex);
        mlx5_free(sh);
        return;
@@ -1112,7 +1012,7 @@ exit:
 }
 
 /**
- * Destroy table hash list and all the root entries per domain.
+ * Destroy table hash list.
  *
  * @param[in] priv
  *   Pointer to the private device data structure.
@@ -1121,47 +1021,10 @@ void
 mlx5_free_table_hash_list(struct mlx5_priv *priv)
 {
        struct mlx5_dev_ctx_shared *sh = priv->sh;
-       struct mlx5_flow_tbl_data_entry *tbl_data;
-       union mlx5_flow_tbl_key table_key = {
-               {
-                       .table_id = 0,
-                       .reserved = 0,
-                       .domain = 0,
-                       .direction = 0,
-               }
-       };
-       struct mlx5_hlist_entry *pos;
 
        if (!sh->flow_tbls)
                return;
-       pos = mlx5_hlist_lookup(sh->flow_tbls, table_key.v64);
-       if (pos) {
-               tbl_data = container_of(pos, struct mlx5_flow_tbl_data_entry,
-                                       entry);
-               MLX5_ASSERT(tbl_data);
-               mlx5_hlist_remove(sh->flow_tbls, pos);
-               mlx5_free(tbl_data);
-       }
-       table_key.direction = 1;
-       pos = mlx5_hlist_lookup(sh->flow_tbls, table_key.v64);
-       if (pos) {
-               tbl_data = container_of(pos, struct mlx5_flow_tbl_data_entry,
-                                       entry);
-               MLX5_ASSERT(tbl_data);
-               mlx5_hlist_remove(sh->flow_tbls, pos);
-               mlx5_free(tbl_data);
-       }
-       table_key.direction = 0;
-       table_key.domain = 1;
-       pos = mlx5_hlist_lookup(sh->flow_tbls, table_key.v64);
-       if (pos) {
-               tbl_data = container_of(pos, struct mlx5_flow_tbl_data_entry,
-                                       entry);
-               MLX5_ASSERT(tbl_data);
-               mlx5_hlist_remove(sh->flow_tbls, pos);
-               mlx5_free(tbl_data);
-       }
-       mlx5_hlist_destroy(sh->flow_tbls, NULL, NULL);
+       mlx5_hlist_destroy(sh->flow_tbls);
 }
 
 /**
@@ -1175,79 +1038,45 @@ mlx5_free_table_hash_list(struct mlx5_priv *priv)
  *   Zero on success, positive error code otherwise.
  */
 int
-mlx5_alloc_table_hash_list(struct mlx5_priv *priv)
+mlx5_alloc_table_hash_list(struct mlx5_priv *priv __rte_unused)
 {
+       int err = 0;
+       /* Tables are only used in DV and DR modes. */
+#ifdef HAVE_IBV_FLOW_DV_SUPPORT
        struct mlx5_dev_ctx_shared *sh = priv->sh;
        char s[MLX5_HLIST_NAMESIZE];
-       int err = 0;
 
        MLX5_ASSERT(sh);
        snprintf(s, sizeof(s), "%s_flow_table", priv->sh->ibdev_name);
-       sh->flow_tbls = mlx5_hlist_create(s, MLX5_FLOW_TABLE_HLIST_ARRAY_SIZE);
+       sh->flow_tbls = mlx5_hlist_create(s, MLX5_FLOW_TABLE_HLIST_ARRAY_SIZE,
+                                         0, 0, flow_dv_tbl_create_cb, NULL,
+                                         flow_dv_tbl_remove_cb);
        if (!sh->flow_tbls) {
                DRV_LOG(ERR, "flow tables with hash creation failed.");
                err = ENOMEM;
                return err;
        }
+       sh->flow_tbls->ctx = sh;
 #ifndef HAVE_MLX5DV_DR
+       struct rte_flow_error error;
+       struct rte_eth_dev *dev = &rte_eth_devices[priv->dev_data->port_id];
+
        /*
         * In case we have not DR support, the zero tables should be created
         * because DV expect to see them even if they cannot be created by
         * RDMA-CORE.
         */
-       union mlx5_flow_tbl_key table_key = {
-               {
-                       .table_id = 0,
-                       .reserved = 0,
-                       .domain = 0,
-                       .direction = 0,
-               }
-       };
-       struct mlx5_flow_tbl_data_entry *tbl_data = mlx5_malloc(MLX5_MEM_ZERO,
-                                                         sizeof(*tbl_data), 0,
-                                                         SOCKET_ID_ANY);
-
-       if (!tbl_data) {
-               err = ENOMEM;
-               goto error;
-       }
-       tbl_data->entry.key = table_key.v64;
-       err = mlx5_hlist_insert(sh->flow_tbls, &tbl_data->entry);
-       if (err)
-               goto error;
-       rte_atomic32_init(&tbl_data->tbl.refcnt);
-       rte_atomic32_inc(&tbl_data->tbl.refcnt);
-       table_key.direction = 1;
-       tbl_data = mlx5_malloc(MLX5_MEM_ZERO, sizeof(*tbl_data), 0,
-                              SOCKET_ID_ANY);
-       if (!tbl_data) {
+       if (!flow_dv_tbl_resource_get(dev, 0, 0, 0, 0, NULL, 0, 1, &error) ||
+           !flow_dv_tbl_resource_get(dev, 0, 1, 0, 0, NULL, 0, 1, &error) ||
+           !flow_dv_tbl_resource_get(dev, 0, 0, 1, 0, NULL, 0, 1, &error)) {
                err = ENOMEM;
                goto error;
        }
-       tbl_data->entry.key = table_key.v64;
-       err = mlx5_hlist_insert(sh->flow_tbls, &tbl_data->entry);
-       if (err)
-               goto error;
-       rte_atomic32_init(&tbl_data->tbl.refcnt);
-       rte_atomic32_inc(&tbl_data->tbl.refcnt);
-       table_key.direction = 0;
-       table_key.domain = 1;
-       tbl_data = mlx5_malloc(MLX5_MEM_ZERO, sizeof(*tbl_data), 0,
-                              SOCKET_ID_ANY);
-       if (!tbl_data) {
-               err = ENOMEM;
-               goto error;
-       }
-       tbl_data->entry.key = table_key.v64;
-       err = mlx5_hlist_insert(sh->flow_tbls, &tbl_data->entry);
-       if (err)
-               goto error;
-       rte_atomic32_init(&tbl_data->tbl.refcnt);
-       rte_atomic32_inc(&tbl_data->tbl.refcnt);
        return err;
 error:
        mlx5_free_table_hash_list(priv);
 #endif /* HAVE_MLX5DV_DR */
+#endif
        return err;
 }
 
@@ -1384,9 +1213,8 @@ mlx5_dev_close(struct rte_eth_dev *dev)
         * then this will return directly without any action.
         */
        mlx5_flow_list_flush(dev, &priv->flows, true);
+       mlx5_shared_action_flush(dev);
        mlx5_flow_meter_flush(dev, NULL);
-       /* Free the intermediate buffers for flow creation. */
-       mlx5_flow_free_intermediate(dev);
        /* Prevent crashes when queues are still in use. */
        dev->rx_pkt_burst = removed_rx_burst;
        dev->tx_pkt_burst = removed_tx_burst;
@@ -1412,8 +1240,10 @@ mlx5_dev_close(struct rte_eth_dev *dev)
                priv->txqs = NULL;
        }
        mlx5_proc_priv_uninit(dev);
+       if (priv->drop_queue.hrxq)
+               mlx5_drop_action_destroy(dev);
        if (priv->mreg_cp_tbl)
-               mlx5_hlist_destroy(priv->mreg_cp_tbl, NULL, NULL);
+               mlx5_hlist_destroy(priv->mreg_cp_tbl);
        mlx5_mprq_free_mp(dev);
        mlx5_os_free_shared_dr(priv);
        if (priv->rss_conf.rss_key != NULL)
@@ -1601,13 +1431,17 @@ mlx5_args_check(const char *key, const char *val, void *opaque)
        } else if (strcmp(MLX5_DV_XMETA_EN, key) == 0) {
                if (tmp != MLX5_XMETA_MODE_LEGACY &&
                    tmp != MLX5_XMETA_MODE_META16 &&
-                   tmp != MLX5_XMETA_MODE_META32) {
+                   tmp != MLX5_XMETA_MODE_META32 &&
+                   tmp != MLX5_XMETA_MODE_MISS_INFO) {
                        DRV_LOG(ERR, "invalid extensive "
                                     "metadata parameter");
                        rte_errno = EINVAL;
                        return -rte_errno;
                }
-               config->dv_xmeta_en = tmp;
+               if (tmp != MLX5_XMETA_MODE_MISS_INFO)
+                       config->dv_xmeta_en = tmp;
+               else
+                       config->dv_miss_info = 1;
        } else if (strcmp(MLX5_LACP_BY_USER, key) == 0) {
                config->lacp_by_user = !!tmp;
        } else if (strcmp(MLX5_MR_EXT_MEMSEG_EN, key) == 0) {
@@ -2020,6 +1854,7 @@ static int
 mlx5_pci_remove(struct rte_pci_device *pci_dev)
 {
        uint16_t port_id;
+       int ret = 0;
 
        RTE_ETH_FOREACH_DEV_OF(port_id, &pci_dev->device) {
                /*
@@ -2027,11 +1862,11 @@ mlx5_pci_remove(struct rte_pci_device *pci_dev)
                 * call the close function explicitly for secondary process.
                 */
                if (rte_eal_process_type() == RTE_PROC_SECONDARY)
-                       mlx5_dev_close(&rte_eth_devices[port_id]);
+                       ret |= mlx5_dev_close(&rte_eth_devices[port_id]);
                else
-                       rte_eth_dev_close(port_id);
+                       ret |= rte_eth_dev_close(port_id);
        }
-       return 0;
+       return ret == 0 ? 0 : -EIO;
 }
 
 static const struct rte_pci_id mlx5_pci_id_map[] = {
@@ -2099,6 +1934,14 @@ static const struct rte_pci_id mlx5_pci_id_map[] = {
                RTE_PCI_DEVICE(PCI_VENDOR_ID_MELLANOX,
                                PCI_DEVICE_ID_MELLANOX_CONNECTX6LX)
        },
+       {
+               RTE_PCI_DEVICE(PCI_VENDOR_ID_MELLANOX,
+                               PCI_DEVICE_ID_MELLANOX_CONNECTX7)
+       },
+       {
+               RTE_PCI_DEVICE(PCI_VENDOR_ID_MELLANOX,
+                               PCI_DEVICE_ID_MELLANOX_CONNECTX7BF)
+       },
        {
                .vendor_id = 0
        }