net/mlx5: reduce PCI dependency
[dpdk.git] / drivers / net / mlx5 / linux / mlx5_os.c
index 9377964..4ab30fd 100644 (file)
@@ -50,8 +50,6 @@
 #include "mlx5_nl.h"
 #include "mlx5_devx.h"
 
-#define MLX5_TAGS_HLIST_ARRAY_SIZE 8192
-
 #ifndef HAVE_IBV_MLX5_MOD_MPW
 #define MLX5DV_CONTEXT_FLAGS_MPW_ALLOWED (1 << 2)
 #define MLX5DV_CONTEXT_FLAGS_ENHANCED_MPW (1 << 3)
@@ -334,7 +332,7 @@ static int
 mlx5_alloc_shared_dr(struct mlx5_priv *priv)
 {
        struct mlx5_dev_ctx_shared *sh = priv->sh;
-       char s[MLX5_HLIST_NAMESIZE] __rte_unused;
+       char s[MLX5_NAME_SIZE] __rte_unused;
        int err;
 
        MLX5_ASSERT(sh && sh->refcnt);
@@ -347,76 +345,44 @@ mlx5_alloc_shared_dr(struct mlx5_priv *priv)
 #ifdef HAVE_IBV_FLOW_DV_SUPPORT
        /* Init port id action list. */
        snprintf(s, sizeof(s), "%s_port_id_action_list", sh->ibdev_name);
-       mlx5_list_create(&sh->port_id_action_list, s, sh,
-                        flow_dv_port_id_create_cb,
-                        flow_dv_port_id_match_cb,
-                        flow_dv_port_id_remove_cb,
-                        flow_dv_port_id_clone_cb,
-                        flow_dv_port_id_clone_free_cb);
+       sh->port_id_action_list = mlx5_list_create(s, sh, true,
+                                                  flow_dv_port_id_create_cb,
+                                                  flow_dv_port_id_match_cb,
+                                                  flow_dv_port_id_remove_cb,
+                                                  flow_dv_port_id_clone_cb,
+                                                flow_dv_port_id_clone_free_cb);
+       if (!sh->port_id_action_list)
+               goto error;
        /* Init push vlan action list. */
        snprintf(s, sizeof(s), "%s_push_vlan_action_list", sh->ibdev_name);
-       mlx5_list_create(&sh->push_vlan_action_list, s, sh,
-                        flow_dv_push_vlan_create_cb,
-                        flow_dv_push_vlan_match_cb,
-                        flow_dv_push_vlan_remove_cb,
-                        flow_dv_push_vlan_clone_cb,
-                        flow_dv_push_vlan_clone_free_cb);
+       sh->push_vlan_action_list = mlx5_list_create(s, sh, true,
+                                                   flow_dv_push_vlan_create_cb,
+                                                   flow_dv_push_vlan_match_cb,
+                                                   flow_dv_push_vlan_remove_cb,
+                                                   flow_dv_push_vlan_clone_cb,
+                                              flow_dv_push_vlan_clone_free_cb);
+       if (!sh->push_vlan_action_list)
+               goto error;
        /* Init sample action list. */
        snprintf(s, sizeof(s), "%s_sample_action_list", sh->ibdev_name);
-       mlx5_list_create(&sh->sample_action_list, s, sh,
-                        flow_dv_sample_create_cb,
-                        flow_dv_sample_match_cb,
-                        flow_dv_sample_remove_cb,
-                        flow_dv_sample_clone_cb,
-                        flow_dv_sample_clone_free_cb);
+       sh->sample_action_list = mlx5_list_create(s, sh, true,
+                                                 flow_dv_sample_create_cb,
+                                                 flow_dv_sample_match_cb,
+                                                 flow_dv_sample_remove_cb,
+                                                 flow_dv_sample_clone_cb,
+                                                 flow_dv_sample_clone_free_cb);
+       if (!sh->sample_action_list)
+               goto error;
        /* Init dest array action list. */
        snprintf(s, sizeof(s), "%s_dest_array_list", sh->ibdev_name);
-       mlx5_list_create(&sh->dest_array_list, s, sh,
-                        flow_dv_dest_array_create_cb,
-                        flow_dv_dest_array_match_cb,
-                        flow_dv_dest_array_remove_cb,
-                        flow_dv_dest_array_clone_cb,
-                        flow_dv_dest_array_clone_free_cb);
-       /* Create tags hash list table. */
-       snprintf(s, sizeof(s), "%s_tags", sh->ibdev_name);
-       sh->tag_table = mlx5_hlist_create(s, MLX5_TAGS_HLIST_ARRAY_SIZE, 0,
-                                         MLX5_HLIST_WRITE_MOST,
-                                         flow_dv_tag_create_cb,
-                                         flow_dv_tag_match_cb,
-                                         flow_dv_tag_remove_cb);
-       if (!sh->tag_table) {
-               DRV_LOG(ERR, "tags with hash creation failed.");
-               err = ENOMEM;
-               goto error;
-       }
-       sh->tag_table->ctx = sh;
-       snprintf(s, sizeof(s), "%s_hdr_modify", sh->ibdev_name);
-       sh->modify_cmds = mlx5_hlist_create(s, MLX5_FLOW_HDR_MODIFY_HTABLE_SZ,
-                                           0, MLX5_HLIST_WRITE_MOST |
-                                           MLX5_HLIST_DIRECT_KEY,
-                                           flow_dv_modify_create_cb,
-                                           flow_dv_modify_match_cb,
-                                           flow_dv_modify_remove_cb);
-       if (!sh->modify_cmds) {
-               DRV_LOG(ERR, "hdr modify hash creation failed");
-               err = ENOMEM;
-               goto error;
-       }
-       sh->modify_cmds->ctx = sh;
-       snprintf(s, sizeof(s), "%s_encaps_decaps", sh->ibdev_name);
-       sh->encaps_decaps = mlx5_hlist_create(s,
-                                             MLX5_FLOW_ENCAP_DECAP_HTABLE_SZ,
-                                             0, MLX5_HLIST_DIRECT_KEY |
-                                             MLX5_HLIST_WRITE_MOST,
-                                             flow_dv_encap_decap_create_cb,
-                                             flow_dv_encap_decap_match_cb,
-                                             flow_dv_encap_decap_remove_cb);
-       if (!sh->encaps_decaps) {
-               DRV_LOG(ERR, "encap decap hash creation failed");
-               err = ENOMEM;
+       sh->dest_array_list = mlx5_list_create(s, sh, true,
+                                              flow_dv_dest_array_create_cb,
+                                              flow_dv_dest_array_match_cb,
+                                              flow_dv_dest_array_remove_cb,
+                                              flow_dv_dest_array_clone_cb,
+                                             flow_dv_dest_array_clone_free_cb);
+       if (!sh->dest_array_list)
                goto error;
-       }
-       sh->encaps_decaps->ctx = sh;
 #endif
 #ifdef HAVE_MLX5DV_DR
        void *domain;
@@ -461,7 +427,7 @@ mlx5_alloc_shared_dr(struct mlx5_priv *priv)
                goto error;
        }
 #endif
-       if (!sh->tunnel_hub)
+       if (!sh->tunnel_hub && priv->config.dv_miss_info)
                err = mlx5_alloc_tunnel_hub(sh);
        if (err) {
                DRV_LOG(ERR, "mlx5_alloc_tunnel_hub failed err=%d", err);
@@ -531,6 +497,22 @@ error:
                sh->tunnel_hub = NULL;
        }
        mlx5_free_table_hash_list(priv);
+       if (sh->port_id_action_list) {
+               mlx5_list_destroy(sh->port_id_action_list);
+               sh->port_id_action_list = NULL;
+       }
+       if (sh->push_vlan_action_list) {
+               mlx5_list_destroy(sh->push_vlan_action_list);
+               sh->push_vlan_action_list = NULL;
+       }
+       if (sh->sample_action_list) {
+               mlx5_list_destroy(sh->sample_action_list);
+               sh->sample_action_list = NULL;
+       }
+       if (sh->dest_array_list) {
+               mlx5_list_destroy(sh->dest_array_list);
+               sh->dest_array_list = NULL;
+       }
        return err;
 }
 
@@ -592,9 +574,23 @@ mlx5_os_free_shared_dr(struct mlx5_priv *priv)
                mlx5_release_tunnel_hub(sh, priv->dev_port);
                sh->tunnel_hub = NULL;
        }
-       mlx5_list_destroy(&sh->port_id_action_list);
-       mlx5_list_destroy(&sh->push_vlan_action_list);
        mlx5_free_table_hash_list(priv);
+       if (sh->port_id_action_list) {
+               mlx5_list_destroy(sh->port_id_action_list);
+               sh->port_id_action_list = NULL;
+       }
+       if (sh->push_vlan_action_list) {
+               mlx5_list_destroy(sh->push_vlan_action_list);
+               sh->push_vlan_action_list = NULL;
+       }
+       if (sh->sample_action_list) {
+               mlx5_list_destroy(sh->sample_action_list);
+               sh->sample_action_list = NULL;
+       }
+       if (sh->dest_array_list) {
+               mlx5_list_destroy(sh->dest_array_list);
+               sh->dest_array_list = NULL;
+       }
 }
 
 /**
@@ -1256,7 +1252,7 @@ err_secondary:
         * Look for sibling devices in order to reuse their switch domain
         * if any, otherwise allocate one.
         */
-       MLX5_ETH_FOREACH_DEV(port_id, priv->pci_dev) {
+       MLX5_ETH_FOREACH_DEV(port_id, NULL) {
                const struct mlx5_priv *opriv =
                        rte_eth_devices[port_id].data->dev_private;
 
@@ -1798,11 +1794,14 @@ err_secondary:
                        err = ENOTSUP;
                        goto error;
        }
-       mlx5_list_create(&priv->hrxqs, "hrxq", eth_dev, mlx5_hrxq_create_cb,
-                        mlx5_hrxq_match_cb,
-                        mlx5_hrxq_remove_cb,
-                        mlx5_hrxq_clone_cb,
-                        mlx5_hrxq_clone_free_cb);
+       priv->hrxqs = mlx5_list_create("hrxq", eth_dev, true,
+                                      mlx5_hrxq_create_cb,
+                                      mlx5_hrxq_match_cb,
+                                      mlx5_hrxq_remove_cb,
+                                      mlx5_hrxq_clone_cb,
+                                      mlx5_hrxq_clone_free_cb);
+       if (!priv->hrxqs)
+               goto error;
        rte_rwlock_init(&priv->ind_tbls_lock);
        /* Query availability of metadata reg_c's. */
        err = mlx5_flow_discover_mreg_c(eth_dev);
@@ -1828,15 +1827,16 @@ err_secondary:
            priv->sh->dv_regc0_mask) {
                priv->mreg_cp_tbl = mlx5_hlist_create(MLX5_FLOW_MREG_HNAME,
                                                      MLX5_FLOW_MREG_HTABLE_SZ,
-                                                     0, 0,
+                                                     false, true, eth_dev,
                                                      flow_dv_mreg_create_cb,
                                                      flow_dv_mreg_match_cb,
-                                                     flow_dv_mreg_remove_cb);
+                                                     flow_dv_mreg_remove_cb,
+                                                     flow_dv_mreg_clone_cb,
+                                                   flow_dv_mreg_clone_free_cb);
                if (!priv->mreg_cp_tbl) {
                        err = ENOMEM;
                        goto error;
                }
-               priv->mreg_cp_tbl->ctx = eth_dev;
        }
        rte_spinlock_init(&priv->shared_act_sl);
        mlx5_flow_counter_mode_config(eth_dev);
@@ -1861,7 +1861,8 @@ error:
                        mlx5_l3t_destroy(priv->mtr_profile_tbl);
                if (own_domain_id)
                        claim_zero(rte_eth_switch_domain_free(priv->domain_id));
-               mlx5_list_destroy(&priv->hrxqs);
+               if (priv->hrxqs)
+                       mlx5_list_destroy(priv->hrxqs);
                mlx5_free(priv);
                if (eth_dev != NULL)
                        eth_dev->data->dev_private = NULL;
@@ -1994,7 +1995,7 @@ mlx5_device_bond_pci_match(const struct ibv_device *ibv_dev,
                /* Process slave interface names in the loop. */
                snprintf(tmp_str, sizeof(tmp_str),
                         "/sys/class/net/%s", ifname);
-               if (mlx5_dev_to_pci_addr(tmp_str, &pci_addr)) {
+               if (mlx5_get_pci_addr(tmp_str, &pci_addr)) {
                        DRV_LOG(WARNING, "can not get PCI address"
                                         " for netdev \"%s\"", ifname);
                        continue;
@@ -2171,8 +2172,8 @@ mlx5_os_pci_probe_pf(struct rte_pci_device *pci_dev,
                        break;
                } else {
                        /* Bonding device not found. */
-                       if (mlx5_dev_to_pci_addr
-                               (ibv_list[ret]->ibdev_path, &pci_addr))
+                       if (mlx5_get_pci_addr(ibv_list[ret]->ibdev_path,
+                                             &pci_addr))
                                continue;
                        if (owner_pci.domain != pci_addr.domain ||
                            owner_pci.bus != pci_addr.bus ||
@@ -2510,6 +2511,7 @@ mlx5_os_pci_probe_pf(struct rte_pci_device *pci_dev,
                dev_config.decap_en = 1;
                dev_config.log_hp_size = MLX5_ARG_UNSET;
                dev_config.allow_duplicate_pattern = 1;
+               list[i].numa_node = pci_dev->device.numa_node;
                list[i].eth_dev = mlx5_dev_spawn(&pci_dev->device,
                                                 &list[i],
                                                 &dev_config,
@@ -2707,7 +2709,6 @@ mlx5_os_open_device(const struct mlx5_dev_spawn_data *spawn,
        int dbmap_env;
        int err = 0;
 
-       sh->numa_node = spawn->pci_dev->device.numa_node;
        pthread_mutex_init(&sh->txpp.mutex, NULL);
        /*
         * Configure environment variable "MLX5_BF_SHUT_UP"