Lines Matching refs:steering

525 		pr_warn("mlx5: flow steering node is not in tree or garbaged\n");
538 return root->dev->priv.steering;
576 mlx5_core_warn(dev, "flow steering can't destroy ft\n");
682 "flow steering can't delete fte in index %d of flow group id %d\n",
690 struct mlx5_flow_steering *steering = get_steering(node);
703 kmem_cache_free(steering->ftes_cache, fte);
720 mlx5_core_warn(dev, "flow steering can't destroy fg %d of ft %d\n",
726 struct mlx5_flow_steering *steering = get_steering(node);
744 kmem_cache_free(steering->fgs_cache, fg);
776 struct mlx5_flow_steering *steering = get_steering(&ft->node);
779 fte = kmem_cache_zalloc(steering->ftes_cache, GFP_KERNEL);
793 static void dealloc_flow_group(struct mlx5_flow_steering *steering,
797 kmem_cache_free(steering->fgs_cache, fg);
800 static struct mlx5_flow_group *alloc_flow_group(struct mlx5_flow_steering *steering,
809 fg = kmem_cache_zalloc(steering->fgs_cache, GFP_KERNEL);
815 kmem_cache_free(steering->fgs_cache, fg);
837 struct mlx5_flow_steering *steering = get_steering(&ft->node);
841 fg = alloc_flow_group(steering, match_criteria_enable, match_criteria,
851 dealloc_flow_group(steering, fg);
1242 pr_err("mlx5: flow steering failed to find root of namespace\n");
1973 struct mlx5_flow_steering *steering = get_steering(&ft->node);
2004 kmem_cache_free(steering->ftes_cache, fte);
2046 kmem_cache_free(steering->ftes_cache, fte);
2060 kmem_cache_free(steering->ftes_cache, fte);
2072 struct mlx5_flow_steering *steering = get_steering(&ft->node);
2167 kmem_cache_free(steering->ftes_cache, fte);
2409 struct mlx5_flow_steering *steering = dev->priv.steering;
2411 if (!steering || !steering->fdb_sub_ns)
2414 return steering->fdb_sub_ns[n];
2438 struct mlx5_flow_steering *steering = dev->priv.steering;
2444 if (!steering)
2449 if (steering->fdb_root_ns)
2450 return &steering->fdb_root_ns->ns;
2453 if (steering->port_sel_root_ns)
2454 return &steering->port_sel_root_ns->ns;
2457 if (steering->sniffer_rx_root_ns)
2458 return &steering->sniffer_rx_root_ns->ns;
2461 if (steering->sniffer_tx_root_ns)
2462 return &steering->sniffer_tx_root_ns->ns;
2465 root_ns = steering->fdb_root_ns;
2471 root_ns = steering->egress_root_ns;
2475 root_ns = steering->rdma_rx_root_ns;
2479 root_ns = steering->rdma_rx_root_ns;
2483 root_ns = steering->rdma_tx_root_ns;
2486 root_ns = steering->rdma_rx_root_ns;
2490 root_ns = steering->rdma_tx_root_ns;
2494 root_ns = steering->rdma_rx_root_ns;
2498 root_ns = steering->rdma_tx_root_ns;
2502 root_ns = steering->rdma_rx_root_ns;
2506 root_ns = steering->rdma_tx_root_ns;
2511 root_ns = steering->root_ns;
2535 struct mlx5_flow_steering *steering = dev->priv.steering;
2537 if (!steering)
2542 if (vport >= steering->esw_egress_acl_vports)
2544 if (steering->esw_egress_root_ns &&
2545 steering->esw_egress_root_ns[vport])
2546 return &steering->esw_egress_root_ns[vport]->ns;
2550 if (vport >= steering->esw_ingress_acl_vports)
2552 if (steering->esw_ingress_root_ns &&
2553 steering->esw_ingress_root_ns[vport])
2554 return &steering->esw_ingress_root_ns[vport]->ns;
2652 static int init_root_tree_recursive(struct mlx5_flow_steering *steering,
2658 int max_ft_level = MLX5_CAP_FLOWTABLE(steering->dev,
2669 !has_required_caps(steering->dev, &init_node->caps))
2690 err = init_root_tree_recursive(steering, &init_node->children[i],
2703 static int init_root_tree(struct mlx5_flow_steering *steering,
2711 err = init_root_tree_recursive(steering, &init_node->children[i],
2732 *create_root_ns(struct mlx5_flow_steering *steering,
2744 root_ns->dev = steering->dev;
2810 static int create_anchor_flow_table(struct mlx5_flow_steering *steering)
2816 ns = mlx5_get_flow_namespace(steering->dev, MLX5_FLOW_NAMESPACE_ANCHOR);
2826 mlx5_core_err(steering->dev, "Failed to create last anchor flow table");
2832 static int init_root_ns(struct mlx5_flow_steering *steering)
2836 steering->root_ns = create_root_ns(steering, FS_FT_NIC_RX);
2837 if (!steering->root_ns)
2840 err = init_root_tree(steering, &root_fs, &steering->root_ns->ns.node);
2844 set_prio_attrs(steering->root_ns);
2845 err = create_anchor_flow_table(steering);
2852 cleanup_root_ns(steering->root_ns);
2853 steering->root_ns = NULL;
2879 static int init_sniffer_tx_root_ns(struct mlx5_flow_steering *steering)
2883 steering->sniffer_tx_root_ns = create_root_ns(steering, FS_FT_SNIFFER_TX);
2884 if (!steering->sniffer_tx_root_ns)
2888 prio = fs_create_prio(&steering->sniffer_tx_root_ns->ns, 0, 1);
2892 static int init_sniffer_rx_root_ns(struct mlx5_flow_steering *steering)
2896 steering->sniffer_rx_root_ns = create_root_ns(steering, FS_FT_SNIFFER_RX);
2897 if (!steering->sniffer_rx_root_ns)
2901 prio = fs_create_prio(&steering->sniffer_rx_root_ns->ns, 0, 1);
2906 static int init_port_sel_root_ns(struct mlx5_flow_steering *steering)
2910 steering->port_sel_root_ns = create_root_ns(steering, FS_FT_PORT_SEL);
2911 if (!steering->port_sel_root_ns)
2915 prio = fs_create_prio(&steering->port_sel_root_ns->ns, 0,
2920 static int init_rdma_rx_root_ns(struct mlx5_flow_steering *steering)
2924 steering->rdma_rx_root_ns = create_root_ns(steering, FS_FT_RDMA_RX);
2925 if (!steering->rdma_rx_root_ns)
2928 err = init_root_tree(steering, &rdma_rx_root_fs,
2929 &steering->rdma_rx_root_ns->ns.node);
2933 set_prio_attrs(steering->rdma_rx_root_ns);
2938 cleanup_root_ns(steering->rdma_rx_root_ns);
2939 steering->rdma_rx_root_ns = NULL;
2943 static int init_rdma_tx_root_ns(struct mlx5_flow_steering *steering)
2947 steering->rdma_tx_root_ns = create_root_ns(steering, FS_FT_RDMA_TX);
2948 if (!steering->rdma_tx_root_ns)
2951 err = init_root_tree(steering, &rdma_tx_root_fs,
2952 &steering->rdma_tx_root_ns->ns.node);
2956 set_prio_attrs(steering->rdma_tx_root_ns);
2961 cleanup_root_ns(steering->rdma_tx_root_ns);
2962 steering->rdma_tx_root_ns = NULL;
2971 static void store_fdb_sub_ns_prio_chain(struct mlx5_flow_steering *steering,
2976 while (steering->fdb_sub_ns[chain])
2979 steering->fdb_sub_ns[chain] = ns;
2982 static int create_fdb_sub_ns_prio_chain(struct mlx5_flow_steering *steering,
2999 store_fdb_sub_ns_prio_chain(steering, ns);
3004 static int create_fdb_chains(struct mlx5_flow_steering *steering,
3014 maj_prio = fs_create_prio_chained(&steering->fdb_root_ns->ns,
3021 err = create_fdb_sub_ns_prio_chain(steering, maj_prio);
3029 static int create_fdb_fast_path(struct mlx5_flow_steering *steering)
3033 steering->fdb_sub_ns = kcalloc(FDB_NUM_CHAINS,
3034 sizeof(*steering->fdb_sub_ns),
3036 if (!steering->fdb_sub_ns)
3039 err = create_fdb_chains(steering, FDB_TC_OFFLOAD, FDB_TC_MAX_CHAIN + 1);
3043 err = create_fdb_chains(steering, FDB_FT_OFFLOAD, 1);
3050 static int create_fdb_bypass(struct mlx5_flow_steering *steering)
3056 prio = fs_create_prio(&steering->fdb_root_ns->ns, FDB_BYPASS_PATH, 0);
3072 static void cleanup_fdb_root_ns(struct mlx5_flow_steering *steering)
3074 cleanup_root_ns(steering->fdb_root_ns);
3075 steering->fdb_root_ns = NULL;
3076 kfree(steering->fdb_sub_ns);
3077 steering->fdb_sub_ns = NULL;
3080 static int init_fdb_root_ns(struct mlx5_flow_steering *steering)
3085 steering->fdb_root_ns = create_root_ns(steering, FS_FT_FDB);
3086 if (!steering->fdb_root_ns)
3089 err = create_fdb_bypass(steering);
3093 maj_prio = fs_create_prio(&steering->fdb_root_ns->ns, FDB_CRYPTO_INGRESS, 3);
3099 err = create_fdb_fast_path(steering);
3103 maj_prio = fs_create_prio(&steering->fdb_root_ns->ns, FDB_TC_MISS, 1);
3109 maj_prio = fs_create_prio(&steering->fdb_root_ns->ns, FDB_BR_OFFLOAD, 4);
3115 maj_prio = fs_create_prio(&steering->fdb_root_ns->ns, FDB_SLOW_PATH, 1);
3121 maj_prio = fs_create_prio(&steering->fdb_root_ns->ns, FDB_CRYPTO_EGRESS, 3);
3132 maj_prio = fs_create_prio(&steering->fdb_root_ns->ns, FDB_PER_VPORT, 1);
3138 set_prio_attrs(steering->fdb_root_ns);
3142 cleanup_fdb_root_ns(steering);
3146 static int init_egress_acl_root_ns(struct mlx5_flow_steering *steering, int vport)
3150 steering->esw_egress_root_ns[vport] = create_root_ns(steering, FS_FT_ESW_EGRESS_ACL);
3151 if (!steering->esw_egress_root_ns[vport])
3155 prio = fs_create_prio(&steering->esw_egress_root_ns[vport]->ns, 0, 1);
3159 static int init_ingress_acl_root_ns(struct mlx5_flow_steering *steering, int vport)
3163 steering->esw_ingress_root_ns[vport] = create_root_ns(steering, FS_FT_ESW_INGRESS_ACL);
3164 if (!steering->esw_ingress_root_ns[vport])
3168 prio = fs_create_prio(&steering->esw_ingress_root_ns[vport]->ns, 0, 1);
3174 struct mlx5_flow_steering *steering = dev->priv.steering;
3178 steering->esw_egress_root_ns =
3180 sizeof(*steering->esw_egress_root_ns),
3182 if (!steering->esw_egress_root_ns)
3186 err = init_egress_acl_root_ns(steering, i);
3190 steering->esw_egress_acl_vports = total_vports;
3195 cleanup_root_ns(steering->esw_egress_root_ns[i]);
3196 kfree(steering->esw_egress_root_ns);
3197 steering->esw_egress_root_ns = NULL;
3203 struct mlx5_flow_steering *steering = dev->priv.steering;
3206 if (!steering->esw_egress_root_ns)
3209 for (i = 0; i < steering->esw_egress_acl_vports; i++)
3210 cleanup_root_ns(steering->esw_egress_root_ns[i]);
3212 kfree(steering->esw_egress_root_ns);
3213 steering->esw_egress_root_ns = NULL;
3218 struct mlx5_flow_steering *steering = dev->priv.steering;
3222 steering->esw_ingress_root_ns =
3224 sizeof(*steering->esw_ingress_root_ns),
3226 if (!steering->esw_ingress_root_ns)
3230 err = init_ingress_acl_root_ns(steering, i);
3234 steering->esw_ingress_acl_vports = total_vports;
3239 cleanup_root_ns(steering->esw_ingress_root_ns[i]);
3240 kfree(steering->esw_ingress_root_ns);
3241 steering->esw_ingress_root_ns = NULL;
3247 struct mlx5_flow_steering *steering = dev->priv.steering;
3250 if (!steering->esw_ingress_root_ns)
3253 for (i = 0; i < steering->esw_ingress_acl_vports; i++)
3254 cleanup_root_ns(steering->esw_ingress_root_ns[i]);
3256 kfree(steering->esw_ingress_root_ns);
3257 steering->esw_ingress_root_ns = NULL;
3276 static int init_egress_root_ns(struct mlx5_flow_steering *steering)
3280 steering->egress_root_ns = create_root_ns(steering,
3282 if (!steering->egress_root_ns)
3285 err = init_root_tree(steering, &egress_root_fs,
3286 &steering->egress_root_ns->ns.node);
3289 set_prio_attrs(steering->egress_root_ns);
3292 cleanup_root_ns(steering->egress_root_ns);
3293 steering->egress_root_ns = NULL;
3317 "Software managed steering is not supported by current device");
3322 "Software managed steering is not supported when eswitch offloads enabled.");
3344 dev->priv.steering->mode = mode;
3354 if (dev->priv.steering->mode == MLX5_FLOW_STEERING_MODE_SMFS)
3371 struct mlx5_flow_steering *steering = dev->priv.steering;
3373 cleanup_root_ns(steering->root_ns);
3374 cleanup_fdb_root_ns(steering);
3375 cleanup_root_ns(steering->port_sel_root_ns);
3376 cleanup_root_ns(steering->sniffer_rx_root_ns);
3377 cleanup_root_ns(steering->sniffer_tx_root_ns);
3378 cleanup_root_ns(steering->rdma_rx_root_ns);
3379 cleanup_root_ns(steering->rdma_tx_root_ns);
3380 cleanup_root_ns(steering->egress_root_ns);
3388 struct mlx5_flow_steering *steering = dev->priv.steering;
3401 err = init_root_ns(steering);
3408 err = init_fdb_root_ns(steering);
3415 err = init_sniffer_rx_root_ns(steering);
3421 err = init_sniffer_tx_root_ns(steering);
3427 err = init_port_sel_root_ns(steering);
3434 err = init_rdma_rx_root_ns(steering);
3440 err = init_rdma_tx_root_ns(steering);
3446 err = init_egress_root_ns(steering);
3460 struct mlx5_flow_steering *steering = dev->priv.steering;
3462 kmem_cache_destroy(steering->ftes_cache);
3463 kmem_cache_destroy(steering->fgs_cache);
3464 kfree(steering);
3471 struct mlx5_flow_steering *steering;
3482 steering = kzalloc(sizeof(*steering), GFP_KERNEL);
3483 if (!steering) {
3488 steering->dev = dev;
3489 dev->priv.steering = steering;
3492 steering->mode = MLX5_FLOW_STEERING_MODE_SMFS;
3494 steering->mode = MLX5_FLOW_STEERING_MODE_DMFS;
3496 steering->fgs_cache = kmem_cache_create("mlx5_fs_fgs",
3499 steering->ftes_cache = kmem_cache_create("mlx5_fs_ftes", sizeof(struct fs_fte), 0,
3501 if (!steering->ftes_cache || !steering->fgs_cache) {
3515 struct mlx5_flow_root_namespace *root = dev->priv.steering->root_ns;
3554 struct mlx5_flow_root_namespace *root = dev->priv.steering->root_ns;
3743 "Can't peer namespace of different steering mode\n");
3751 * It is not safe to call this function while steering operations