mirror of
https://github.com/AuxXxilium/linux_dsm_epyc7002.git
synced 2025-01-19 08:27:39 +07:00
net/mlx5: Simplify matching group searches
Instead of using two different structs for searching groups with the same match, use a single struct and thus simplify the code, make it more readable and smaller size which means less code cache misses. text data bss dec hex before: 35524 2744 0 38268 957c after: 35038 2744 0 37782 9396 When testing add 70000 rules, delete all the rules, and repeat three times taking the average, we get (time in seconds): Before the change: insert 16.80, delete 11.02 After the change: insert 16.55, delete 10.95 Signed-off-by: Eli Cohen <eli@mellanox.com> Reviewed-by: Mark Bloch <markb@mellanox.com> Reviewed-by: Maor Gottlieb <maorg@mellanox.com> Signed-off-by: Saeed Mahameed <saeedm@mellanox.com>
This commit is contained in:
parent
d528d49705
commit
b820ce00e0
@ -1577,28 +1577,19 @@ struct match_list {
|
||||
struct mlx5_flow_group *g;
|
||||
};
|
||||
|
||||
struct match_list_head {
|
||||
struct list_head list;
|
||||
struct match_list first;
|
||||
};
|
||||
|
||||
static void free_match_list(struct match_list_head *head, bool ft_locked)
|
||||
static void free_match_list(struct match_list *head, bool ft_locked)
|
||||
{
|
||||
if (!list_empty(&head->list)) {
|
||||
struct match_list *iter, *match_tmp;
|
||||
struct match_list *iter, *match_tmp;
|
||||
|
||||
list_del(&head->first.list);
|
||||
tree_put_node(&head->first.g->node, ft_locked);
|
||||
list_for_each_entry_safe(iter, match_tmp, &head->list,
|
||||
list) {
|
||||
tree_put_node(&iter->g->node, ft_locked);
|
||||
list_del(&iter->list);
|
||||
kfree(iter);
|
||||
}
|
||||
list_for_each_entry_safe(iter, match_tmp, &head->list,
|
||||
list) {
|
||||
tree_put_node(&iter->g->node, ft_locked);
|
||||
list_del(&iter->list);
|
||||
kfree(iter);
|
||||
}
|
||||
}
|
||||
|
||||
static int build_match_list(struct match_list_head *match_head,
|
||||
static int build_match_list(struct match_list *match_head,
|
||||
struct mlx5_flow_table *ft,
|
||||
const struct mlx5_flow_spec *spec,
|
||||
bool ft_locked)
|
||||
@ -1615,14 +1606,8 @@ static int build_match_list(struct match_list_head *match_head,
|
||||
rhl_for_each_entry_rcu(g, tmp, list, hash) {
|
||||
struct match_list *curr_match;
|
||||
|
||||
if (likely(list_empty(&match_head->list))) {
|
||||
if (!tree_get_node(&g->node))
|
||||
continue;
|
||||
match_head->first.g = g;
|
||||
list_add_tail(&match_head->first.list,
|
||||
&match_head->list);
|
||||
if (unlikely(!tree_get_node(&g->node)))
|
||||
continue;
|
||||
}
|
||||
|
||||
curr_match = kmalloc(sizeof(*curr_match), GFP_ATOMIC);
|
||||
if (!curr_match) {
|
||||
@ -1630,10 +1615,6 @@ static int build_match_list(struct match_list_head *match_head,
|
||||
err = -ENOMEM;
|
||||
goto out;
|
||||
}
|
||||
if (!tree_get_node(&g->node)) {
|
||||
kfree(curr_match);
|
||||
continue;
|
||||
}
|
||||
curr_match->g = g;
|
||||
list_add_tail(&curr_match->list, &match_head->list);
|
||||
}
|
||||
@ -1785,9 +1766,9 @@ _mlx5_add_flow_rules(struct mlx5_flow_table *ft,
|
||||
|
||||
{
|
||||
struct mlx5_flow_steering *steering = get_steering(&ft->node);
|
||||
struct mlx5_flow_group *g;
|
||||
struct mlx5_flow_handle *rule;
|
||||
struct match_list_head match_head;
|
||||
struct match_list match_head;
|
||||
struct mlx5_flow_group *g;
|
||||
bool take_write = false;
|
||||
struct fs_fte *fte;
|
||||
int version;
|
||||
|
Loading…
Reference in New Issue
Block a user