Lines Matching defs:chains

14 #define chains_lock(chains) ((chains)->lock)
15 #define chains_ht(chains) ((chains)->chains_ht)
16 #define prios_ht(chains) ((chains)->prios_ht)
17 #define chains_default_ft(chains) ((chains)->chains_default_ft)
18 #define chains_end_ft(chains) ((chains)->chains_end_ft)
48 struct mlx5_fs_chains *chains;
89 bool mlx5_chains_prios_supported(struct mlx5_fs_chains *chains)
91 return chains->flags & MLX5_CHAINS_AND_PRIOS_SUPPORTED;
94 bool mlx5_chains_ignore_flow_level_supported(struct mlx5_fs_chains *chains)
96 return chains->flags & MLX5_CHAINS_IGNORE_FLOW_LEVEL_SUPPORTED;
99 bool mlx5_chains_backwards_supported(struct mlx5_fs_chains *chains)
101 return mlx5_chains_prios_supported(chains) &&
102 mlx5_chains_ignore_flow_level_supported(chains);
105 u32 mlx5_chains_get_chain_range(struct mlx5_fs_chains *chains)
107 if (!mlx5_chains_prios_supported(chains))
110 if (mlx5_chains_ignore_flow_level_supported(chains))
117 u32 mlx5_chains_get_nf_ft_chain(struct mlx5_fs_chains *chains)
119 return mlx5_chains_get_chain_range(chains) + 1;
122 u32 mlx5_chains_get_prio_range(struct mlx5_fs_chains *chains)
124 if (mlx5_chains_ignore_flow_level_supported(chains))
127 if (!chains->dev->priv.eswitch ||
128 chains->dev->priv.eswitch->mode != MLX5_ESWITCH_OFFLOADS)
135 static unsigned int mlx5_chains_get_level_range(struct mlx5_fs_chains *chains)
137 if (mlx5_chains_ignore_flow_level_supported(chains))
145 mlx5_chains_set_end_ft(struct mlx5_fs_chains *chains,
148 chains_end_ft(chains) = ft;
152 mlx5_chains_create_table(struct mlx5_fs_chains *chains,
160 if (chains->flags & MLX5_CHAINS_FT_TUNNEL_SUPPORTED)
164 sz = (chain == mlx5_chains_get_nf_ft_chain(chains)) ? FT_TBL_SZ : POOL_NEXT_SIZE;
167 /* We use chains_default_ft(chains) as the table's next_ft till
171 ft_attr.next_ft = chains_default_ft(chains);
178 if (!mlx5_chains_ignore_flow_level_supported(chains) ||
180 ft_attr.level = chains->fs_base_level;
181 ft_attr.prio = chains->fs_base_prio + prio - 1;
182 ns = (chains->ns == MLX5_FLOW_NAMESPACE_FDB) ?
183 mlx5_get_fdb_sub_ns(chains->dev, chain) :
184 mlx5_get_flow_namespace(chains->dev, chains->ns);
187 ft_attr.prio = chains->fs_base_prio;
195 ft_attr.level = chains->fs_base_level + 1;
196 ns = mlx5_get_flow_namespace(chains->dev, chains->ns);
200 ft_attr.autogroup.max_num_groups = chains->group_num;
203 mlx5_core_warn(chains->dev, "Failed to create chains table err %d (chain: %d, prio: %d, level: %d, size: %d)\n",
214 struct mlx5_eswitch *esw = chain->chains->dev->priv.eswitch;
216 struct mlx5_fs_chains *chains = chain->chains;
222 if (chain->chain == mlx5_chains_get_nf_ft_chain(chains) ||
223 !mlx5_chains_prios_supported(chains) ||
224 !chains->chains_mapping)
227 err = mlx5_chains_get_chain_mapping(chains, chain->chain, &index);
237 err = mlx5_chains_get_chain_mapping(chains, chain->chain, &index);
238 mapping_remove(chains->chains_mapping, MLX5_FS_DEFAULT_FLOW_TAG);
245 if (chains->ns == MLX5_FLOW_NAMESPACE_FDB) {
252 } else if (chains->ns == MLX5_FLOW_NAMESPACE_KERNEL) {
272 mod_hdr = mlx5_modify_header_alloc(chains->dev, chains->ns,
287 mapping_remove(chains->chains_mapping, chain->id);
293 struct mlx5_fs_chains *chains = chain->chains;
301 mlx5_modify_header_dealloc(chains->dev, chain->miss_modify_hdr);
302 mapping_remove(chains->chains_mapping, chain->id);
306 mlx5_chains_create_chain(struct mlx5_fs_chains *chains, u32 chain)
315 chain_s->chains = chains;
323 err = rhashtable_insert_fast(&chains_ht(chains), &chain_s->node,
340 struct mlx5_fs_chains *chains = chain->chains;
342 rhashtable_remove_fast(&chains_ht(chains), &chain->node,
350 mlx5_chains_get_chain(struct mlx5_fs_chains *chains, u32 chain)
354 chain_s = rhashtable_lookup_fast(&chains_ht(chains), &chain,
357 chain_s = mlx5_chains_create_chain(chains, chain);
372 struct mlx5_fs_chains *chains = chain->chains;
377 if (mlx5_chains_ignore_flow_level_supported(chain->chains))
384 if (chains->chains_mapping && next_ft == chains_end_ft(chains) &&
385 chain->chain != mlx5_chains_get_nf_ft_chain(chains) &&
386 mlx5_chains_prios_supported(chains)) {
460 mlx5_chains_create_prio(struct mlx5_fs_chains *chains,
474 chain_s = mlx5_chains_get_chain(chains, chain);
497 next_ft = (chain == mlx5_chains_get_nf_ft_chain(chains)) ?
498 chains_default_ft(chains) :
499 chains_end_ft(chains);
512 ft = mlx5_chains_create_table(chains, chain, prio, level);
544 err = rhashtable_insert_fast(&prios_ht(chains), &prio_s->node,
561 rhashtable_remove_fast(&prios_ht(chains), &prio_s->node,
578 mlx5_chains_destroy_prio(struct mlx5_fs_chains *chains,
587 rhashtable_remove_fast(&prios_ht(chains), &prio->node,
597 mlx5_chains_get_table(struct mlx5_fs_chains *chains, u32 chain, u32 prio,
605 if ((chain > mlx5_chains_get_chain_range(chains) &&
606 chain != mlx5_chains_get_nf_ft_chain(chains)) ||
607 prio > mlx5_chains_get_prio_range(chains) ||
608 level > mlx5_chains_get_level_range(chains))
615 prev_fts = mlx5_chains_get_table(chains, chain, prio, l);
626 mutex_lock(&chains_lock(chains));
627 prio_s = rhashtable_lookup_fast(&prios_ht(chains), &key,
630 prio_s = mlx5_chains_create_prio(chains, chain,
637 mutex_unlock(&chains_lock(chains));
642 mutex_unlock(&chains_lock(chains));
645 mlx5_chains_put_table(chains, chain, prio, l);
650 mlx5_chains_put_table(struct mlx5_fs_chains *chains, u32 chain, u32 prio,
660 mutex_lock(&chains_lock(chains));
661 prio_s = rhashtable_lookup_fast(&prios_ht(chains), &key,
667 mlx5_chains_destroy_prio(chains, prio_s);
668 mutex_unlock(&chains_lock(chains));
671 mlx5_chains_put_table(chains, chain, prio, level);
676 mutex_unlock(&chains_lock(chains));
683 mlx5_chains_get_tc_end_ft(struct mlx5_fs_chains *chains)
685 return chains_end_ft(chains);
689 mlx5_chains_create_global_table(struct mlx5_fs_chains *chains)
694 if (!mlx5_chains_ignore_flow_level_supported(chains)) {
697 mlx5_core_warn(chains->dev,
702 chain = mlx5_chains_get_chain_range(chains),
703 prio = mlx5_chains_get_prio_range(chains);
704 level = mlx5_chains_get_level_range(chains);
706 return mlx5_chains_create_table(chains, chain, prio, level);
713 mlx5_chains_destroy_global_table(struct mlx5_fs_chains *chains,
722 struct mlx5_fs_chains *chains;
725 chains = kzalloc(sizeof(*chains), GFP_KERNEL);
726 if (!chains)
729 chains->dev = dev;
730 chains->flags = attr->flags;
731 chains->ns = attr->ns;
732 chains->group_num = attr->max_grp_num;
733 chains->chains_mapping = attr->mapping;
734 chains->fs_base_prio = attr->fs_base_prio;
735 chains->fs_base_level = attr->fs_base_level;
736 chains_default_ft(chains) = chains_end_ft(chains) = attr->default_ft;
738 err = rhashtable_init(&chains_ht(chains), &chain_params);
742 err = rhashtable_init(&prios_ht(chains), &prio_params);
746 mutex_init(&chains_lock(chains));
748 return chains;
751 rhashtable_destroy(&chains_ht(chains));
753 kfree(chains);
758 mlx5_chains_cleanup(struct mlx5_fs_chains *chains)
760 mutex_destroy(&chains_lock(chains));
761 rhashtable_destroy(&prios_ht(chains));
762 rhashtable_destroy(&chains_ht(chains));
764 kfree(chains);
770 struct mlx5_fs_chains *chains;
772 chains = mlx5_chains_init(dev, attr);
774 return chains;
778 mlx5_chains_destroy(struct mlx5_fs_chains *chains)
780 mlx5_chains_cleanup(chains);
784 mlx5_chains_get_chain_mapping(struct mlx5_fs_chains *chains, u32 chain,
787 struct mapping_ctx *ctx = chains->chains_mapping;
796 mlx5_chains_put_chain_mapping(struct mlx5_fs_chains *chains, u32 chain_mapping)
798 struct mapping_ctx *ctx = chains->chains_mapping;
804 mlx5_chains_print_info(struct mlx5_fs_chains *chains)
806 mlx5_core_dbg(chains->dev, "Flow table chains groups(%d)\n", chains->group_num);