| @@ -579,7 +579,9 @@ static void del_sw_flow_group(struct fs_node *node) · 578 unmodified lines |
| 579 | 579 | |
| 580 | 580 | rhashtable_destroy(&fg->ftes_hash); |
| 581 | 581 | ida_destroy(&fg->fte_allocator); |
| 582 | | − if (ft->autogroup.active && fg->max_ftes == ft->autogroup.group_size) |
| 582 | + if (ft->autogroup.active && |
| 583 | + fg->max_ftes == ft->autogroup.group_size && |
| 584 | + fg->start_index < ft->autogroup.max_fte) |
| 583 | 585 | ft->autogroup.num_groups--; |
| 584 | 586 | err = rhltable_remove(&ft->fgs_hash, |
| 585 | 587 | &fg->hash, |
| @@ -1121,9 +1123,14 @@ struct mlx5_flow_table* · 535 unmodified lines |
| 1121 | 1123 | mlx5_create_auto_grouped_flow_table(struct mlx5_flow_namespace *ns, |
| 1122 | 1124 | struct mlx5_flow_table_attr *ft_attr) |
| 1123 | 1125 | { |
| 1126 | + int num_reserved_entries = ft_attr->autogroup.num_reserved_entries; |
| 1127 | + int autogroups_max_fte = ft_attr->max_fte - num_reserved_entries; |
| 1128 | + int max_num_groups = ft_attr->autogroup.max_num_groups; |
| 1124 | 1129 | struct mlx5_flow_table *ft; |
| 1125 | 1130 | |
| 1126 | | − if (ft_attr->autogroup.max_num_groups > ft_attr->max_fte) |
| 1131 | + if (max_num_groups > autogroups_max_fte) |
| 1132 | + return ERR_PTR(-EINVAL); |
| 1133 | + if (num_reserved_entries > ft_attr->max_fte) |
| 1127 | 1134 | return ERR_PTR(-EINVAL); |
| 1128 | 1135 | |
| 1129 | 1136 | ft = mlx5_create_flow_table(ns, ft_attr); |
| @@ -1131,10 +1138,10 @@ mlx5_create_auto_grouped_flow_table(struct mlx5_flow_namespace *ns, · 1 unmodified line |
| 1131 | 1138 | return ft; |
| 1132 | 1139 | |
| 1133 | 1140 | ft->autogroup.active = true; |
| 1134 | | − ft->autogroup.required_groups = ft_attr->autogroup.max_num_groups; |
| 1141 | + ft->autogroup.required_groups = max_num_groups; |
| 1142 | + ft->autogroup.max_fte = autogroups_max_fte; |
| 1135 | 1143 | /* We save place for flow groups in addition to max types */ |
| 1136 | | − ft->autogroup.group_size = ft->max_fte / |
| 1137 | | − (ft->autogroup.required_groups + 1); |
| 1144 | + ft->autogroup.group_size = autogroups_max_fte / (max_num_groups + 1); |
| 1138 | 1145 | |
| 1139 | 1146 | return ft; |
| 1140 | 1147 | } |
| @@ -1156,7 +1163,7 @@ struct mlx5_flow_group *mlx5_create_flow_group(struct mlx5_flow_table *ft, · 15 unmodified lines |
| 1156 | 1163 | struct mlx5_flow_group *fg; |
| 1157 | 1164 | int err; |
| 1158 | 1165 | |
| 1159 | | − if (ft->autogroup.active) |
| 1166 | + if (ft->autogroup.active && start_index < ft->autogroup.max_fte) |
| 1160 | 1167 | return ERR_PTR(-EPERM); |
| 1161 | 1168 | |
| 1162 | 1169 | down_write_ref_node(&ft->node, false); |
| @@ -1329,9 +1336,10 @@ static struct mlx5_flow_group *alloc_auto_flow_group(struct mlx5_flow_table *ft · 166 unmodified lines |
| 1329 | 1336 | const struct mlx5_flow_spec *spec) |
| 1330 | 1337 | { |
| 1331 | 1338 | struct list_head *prev = &ft->node.children; |
| 1332 | | − struct mlx5_flow_group *fg; |
| 1339 | + u32 max_fte = ft->autogroup.max_fte; |
| 1333 | 1340 | unsigned int candidate_index = 0; |
| 1334 | 1341 | unsigned int group_size = 0; |
| 1342 | + struct mlx5_flow_group *fg; |
| 1335 | 1343 | |
| 1336 | 1344 | if (!ft->autogroup.active) |
| 1337 | 1345 | return ERR_PTR(-ENOENT); |
| @@ -1339,7 +1347,7 @@ static struct mlx5_flow_group *alloc_auto_flow_group(struct mlx5_flow_table *ft · 1 unmodified line |
| 1339 | 1347 | if (ft->autogroup.num_groups < ft->autogroup.required_groups) |
| 1340 | 1348 | group_size = ft->autogroup.group_size; |
| 1341 | 1349 | |
| 1342 | | − /* ft->max_fte == ft->autogroup.max_types */ |
| 1350 | + /* max_fte == ft->autogroup.max_types */ |
| 1343 | 1351 | if (group_size == 0) |
| 1344 | 1352 | group_size = 1; |
| 1345 | 1353 | |
| @@ -1352,7 +1360,7 @@ static struct mlx5_flow_group *alloc_auto_flow_group(struct mlx5_flow_table *ft · 6 unmodified lines |
| 1352 | 1360 | prev = &fg->node.list; |
| 1353 | 1361 | } |
| 1354 | 1362 | |
| 1355 | | − if (candidate_index + group_size > ft->max_fte) |
| 1363 | + if (candidate_index + group_size > max_fte) |
| 1356 | 1364 | return ERR_PTR(-ENOSPC); |
| 1357 | 1365 | |
| 1358 | 1366 | fg = alloc_insert_flow_group(ft, |