ethdev: support representor id as iterator filter
[dpdk.git] / drivers / net / mlx5 / mlx5.c
index 7493180..a9cf988 100644 (file)
@@ -90,6 +90,9 @@
 /* Allow L3 VXLAN flow creation. */
 #define MLX5_L3_VXLAN_EN "l3_vxlan_en"
 
+/* Activate DV flow steering. */
+#define MLX5_DV_FLOW_EN "dv_flow_en"
+
 /* Activate Netlink support in VF mode. */
 #define MLX5_VF_NL_EN "vf_nl_en"
 
@@ -283,8 +286,8 @@ mlx5_dev_close(struct rte_eth_dev *dev)
                close(priv->nl_socket_route);
        if (priv->nl_socket_rdma >= 0)
                close(priv->nl_socket_rdma);
-       if (priv->mnl_socket)
-               mlx5_nl_flow_socket_destroy(priv->mnl_socket);
+       if (priv->tcf_context)
+               mlx5_flow_tcf_context_destroy(priv->tcf_context);
        ret = mlx5_hrxq_ibv_verify(dev);
        if (ret)
                DRV_LOG(WARNING, "port %u some hash Rx queue still remain",
@@ -491,6 +494,8 @@ mlx5_args_check(const char *key, const char *val, void *opaque)
                config->l3_vxlan_en = !!tmp;
        } else if (strcmp(MLX5_VF_NL_EN, key) == 0) {
                config->vf_nl_en = !!tmp;
+       } else if (strcmp(MLX5_DV_FLOW_EN, key) == 0) {
+               config->dv_flow_en = !!tmp;
        } else {
                DRV_LOG(WARNING, "%s: unknown parameter", key);
                rte_errno = EINVAL;
@@ -528,6 +533,7 @@ mlx5_args(struct mlx5_dev_config *config, struct rte_devargs *devargs)
                MLX5_RX_VEC_EN,
                MLX5_L3_VXLAN_EN,
                MLX5_VF_NL_EN,
+               MLX5_DV_FLOW_EN,
                MLX5_REPRESENTOR,
                NULL,
        };
@@ -1078,13 +1084,14 @@ mlx5_dev_spawn(struct rte_device *dpdk_dev,
                err = ENOMEM;
                goto error;
        }
-       if (priv->representor)
+       if (priv->representor) {
                eth_dev->data->dev_flags |= RTE_ETH_DEV_REPRESENTOR;
+               eth_dev->data->representor_id = priv->representor_id;
+       }
        eth_dev->data->dev_private = priv;
        priv->dev_data = eth_dev->data;
        eth_dev->data->mac_addrs = priv->mac;
        eth_dev->device = dpdk_dev;
-       eth_dev->device->driver = &mlx5_driver.driver;
        err = mlx5_uar_init_primary(eth_dev);
        if (err) {
                err = rte_errno;
@@ -1133,8 +1140,8 @@ mlx5_dev_spawn(struct rte_device *dpdk_dev,
        claim_zero(mlx5_mac_addr_add(eth_dev, &mac, 0, 0));
        if (vf && config.vf_nl_en)
                mlx5_nl_mac_addr_sync(eth_dev);
-       priv->mnl_socket = mlx5_nl_flow_socket_create();
-       if (!priv->mnl_socket) {
+       priv->tcf_context = mlx5_flow_tcf_context_create();
+       if (!priv->tcf_context) {
                err = -rte_errno;
                DRV_LOG(WARNING,
                        "flow rules relying on switch offloads will not be"
@@ -1149,16 +1156,16 @@ mlx5_dev_spawn(struct rte_device *dpdk_dev,
                        error.message =
                                "cannot retrieve network interface index";
                } else {
-                       err = mlx5_nl_flow_init(priv->mnl_socket, ifindex,
-                                               &error);
+                       err = mlx5_flow_tcf_init(priv->tcf_context,
+                                                ifindex, &error);
                }
                if (err) {
                        DRV_LOG(WARNING,
                                "flow rules relying on switch offloads will"
                                " not be supported: %s: %s",
                                error.message, strerror(rte_errno));
-                       mlx5_nl_flow_socket_destroy(priv->mnl_socket);
-                       priv->mnl_socket = NULL;
+                       mlx5_flow_tcf_context_destroy(priv->tcf_context);
+                       priv->tcf_context = NULL;
                }
        }
        TAILQ_INIT(&priv->flows);
@@ -1188,7 +1195,6 @@ mlx5_dev_spawn(struct rte_device *dpdk_dev,
        if (err < 0)
                goto error;
        priv->config.flow_prio = err;
-       mlx5_flow_init_driver_ops(eth_dev);
        /*
         * Once the device is added to the list of memory event
         * callback, its global MR cache table cannot be expanded
@@ -1214,16 +1220,21 @@ error:
                        close(priv->nl_socket_route);
                if (priv->nl_socket_rdma >= 0)
                        close(priv->nl_socket_rdma);
-               if (priv->mnl_socket)
-                       mlx5_nl_flow_socket_destroy(priv->mnl_socket);
+               if (priv->tcf_context)
+                       mlx5_flow_tcf_context_destroy(priv->tcf_context);
                if (own_domain_id)
                        claim_zero(rte_eth_switch_domain_free(priv->domain_id));
                rte_free(priv);
+               if (eth_dev != NULL)
+                       eth_dev->data->dev_private = NULL;
        }
        if (pd)
                claim_zero(mlx5_glue->dealloc_pd(pd));
-       if (eth_dev)
+       if (eth_dev != NULL) {
+               /* mac_addrs must not be freed alone because part of dev_private */
+               eth_dev->data->mac_addrs = NULL;
                rte_eth_dev_release_port(eth_dev);
+       }
        if (ctx)
                claim_zero(mlx5_glue->close_device(ctx));
        assert(err > 0);
@@ -1443,8 +1454,8 @@ mlx5_pci_probe(struct rte_pci_driver *pci_drv __rte_unused,
                        if (!list[i].eth_dev)
                                continue;
                        mlx5_dev_close(list[i].eth_dev);
-                       if (rte_eal_process_type() == RTE_PROC_PRIMARY)
-                               rte_free(list[i].eth_dev->data->dev_private);
+                       /* mac_addrs must not be freed because in dev_private */
+                       list[i].eth_dev->data->mac_addrs = NULL;
                        claim_zero(rte_eth_dev_release_port(list[i].eth_dev));
                }
                /* Restore original error. */