Lines Matching refs:fte

369 find_flow_rule(struct fs_fte *fte,
595 static void modify_fte(struct fs_fte *fte)
603 fs_get_obj(fg, fte->node.parent);
605 dev = get_dev(&fte->node);
608 err = root->cmds->update_fte(root, ft, fg, fte->modify_mask, fte);
612 __func__, fg->id, fte->index);
613 fte->modify_mask = 0;
619 struct fs_fte *fte;
622 fs_get_obj(fte, rule->node.parent);
631 --fte->dests_size;
632 fte->modify_mask |=
635 fte->action.action &= ~MLX5_FLOW_CONTEXT_ACTION_COUNT;
640 --fte->dests_size;
641 fte->modify_mask |= BIT(MLX5_SET_FTE_MODIFY_ENABLE_MASK_ACTION);
642 fte->action.action &= ~MLX5_FLOW_CONTEXT_ACTION_ALLOW;
647 --fte->dests_size;
648 --fte->fwd_dests;
650 if (!fte->fwd_dests)
651 fte->action.action &=
653 fte->modify_mask |=
667 struct fs_fte *fte;
670 fs_get_obj(fte, node);
671 fs_get_obj(fg, fte->node.parent);
674 trace_mlx5_fs_del_fte(fte);
675 WARN_ON(fte->dests_size);
679 err = root->cmds->delete_fte(root, ft, fte);
682 "flow steering can't delete fte in index %d of flow group id %d\n",
683 fte->index, fg->id);
692 struct fs_fte *fte;
695 fs_get_obj(fte, node);
696 fs_get_obj(fg, fte->node.parent);
699 &fte->hash,
702 ida_free(&fg->fte_allocator, fte->index - fg->start_index);
703 kmem_cache_free(steering->ftes_cache, fte);
747 static int insert_fte(struct mlx5_flow_group *fg, struct fs_fte *fte)
756 fte->index = index + fg->start_index;
758 &fte->hash,
763 tree_add_node(&fte->node, &fg->node);
764 list_add_tail(&fte->node.list, &fg->node.children);
777 struct fs_fte *fte;
779 fte = kmem_cache_zalloc(steering->ftes_cache, GFP_KERNEL);
780 if (!fte)
783 memcpy(fte->val, &spec->match_value, sizeof(fte->val));
784 fte->node.type = FS_TYPE_FLOW_ENTRY;
785 fte->action = *flow_act;
786 fte->flow_context = spec->flow_context;
788 tree_init_node(&fte->node, del_hw_fte, del_sw_fte);
790 return fte;
1112 struct fs_fte *fte;
1116 fs_get_obj(fte, rule->node.parent);
1117 if (!(fte->action.action & MLX5_FLOW_CONTEXT_ACTION_FWD_DEST))
1119 down_write_ref_node(&fte->node, false);
1120 fs_get_obj(fg, fte->node.parent);
1126 modify_mask, fte);
1127 up_write_ref_node(&fte->node, false);
1456 static void destroy_flow_handle(struct fs_fte *fte,
1463 fte->dests_size--;
1472 create_flow_handle(struct fs_fte *fte,
1491 rule = find_flow_rule(fte, dest + i);
1509 list_add(&rule->node.list, &fte->node.children);
1511 list_add_tail(&rule->node.list, &fte->node.children);
1513 fte->dests_size++;
1516 fte->fwd_dests++;
1529 destroy_flow_handle(fte, handle, dest, i);
1533 /* fte should not be deleted while calling this function */
1535 add_rule_fte(struct fs_fte *fte,
1548 handle = create_flow_handle(fte, dest, dest_num, &modify_mask,
1558 if (!(fte->status & FS_FTE_STATUS_EXISTING))
1559 err = root->cmds->create_fte(root, ft, fg, fte);
1561 err = root->cmds->update_fte(root, ft, fg, modify_mask, fte);
1565 fte->node.active = true;
1566 fte->status |= FS_FTE_STATUS_EXISTING;
1573 destroy_flow_handle(fte, handle, dest, handle->num_rules);
1710 static struct mlx5_flow_rule *find_flow_rule(struct fs_fte *fte,
1715 list_for_each_entry(rule, &fte->node.children, node.list) {
1773 static int check_conflicting_ftes(struct fs_fte *fte,
1777 if (check_conflicting_actions(flow_act, &fte->action)) {
1778 mlx5_core_warn(get_dev(&fte->node),
1784 fte->flow_context.flow_tag != flow_context->flow_tag) {
1785 mlx5_core_warn(get_dev(&fte->node),
1787 fte->flow_context.flow_tag,
1800 struct fs_fte *fte)
1807 ret = check_conflicting_ftes(fte, &spec->flow_context, flow_act);
1811 old_action = fte->action.action;
1812 fte->action.action |= flow_act->action;
1813 handle = add_rule_fte(fte, fg, dest, dest_num,
1816 fte->action.action = old_action;
1819 trace_mlx5_fs_set_fte(fte, false);
1824 tree_add_node(&handle->rule[i]->node, &fte->node);
1978 struct fs_fte *fte;
1982 fte = alloc_fte(ft, spec, flow_act);
1983 if (IS_ERR(fte))
1990 /* Try to find an fte with identical match value and attempt update its
2004 kmem_cache_free(steering->ftes_cache, fte);
2009 /* No group with matching fte found, or we skipped the search.
2010 * Try to add a new fte to any matching fg.
2041 err = insert_fte(g, fte);
2046 kmem_cache_free(steering->ftes_cache, fte);
2050 nested_down_write_ref_node(&fte->node, FS_LOCK_CHILD);
2052 rule = add_rule_fg(g, spec, flow_act, dest, dest_num, fte);
2053 up_write_ref_node(&fte->node, false);
2055 tree_put_node(&fte->node, false);
2060 kmem_cache_free(steering->ftes_cache, fte);
2077 struct fs_fte *fte;
2138 fte = alloc_fte(ft, spec, flow_act);
2139 if (IS_ERR(fte)) {
2141 err = PTR_ERR(fte);
2152 err = insert_fte(g, fte);
2156 nested_down_write_ref_node(&fte->node, FS_LOCK_CHILD);
2158 rule = add_rule_fg(g, spec, flow_act, dest, dest_num, fte);
2159 up_write_ref_node(&fte->node, false);
2161 tree_put_node(&fte->node, false);
2167 kmem_cache_free(steering->ftes_cache, fte);
2247 struct fs_fte *fte;
2262 fs_get_obj(fte, handle->rule[0]->node.parent);
2263 down_write_ref_node(&fte->node, false);
2266 if (list_empty(&fte->node.children)) {
2267 fte->node.del_hw_func(&fte->node);
2269 fte->node.del_hw_func = NULL;
2270 up_write_ref_node(&fte->node, false);
2271 tree_put_node(&fte->node, false);
2272 } else if (fte->dests_size) {
2273 if (fte->modify_mask)
2274 modify_fte(fte);
2275 up_write_ref_node(&fte->node, false);
2277 up_write_ref_node(&fte->node, false);