Skip to content

Commit c80edd8

Browse files
committed
Merge tag 'mlx5-updates-2022-12-08' of git://git.kernel.org/pub/scm/linux/kernel/git/saeed/linux
Saeed Mahameed says: ==================== mlx5-updates-2022-12-08 1) Support range match action in SW steering Yevgeny Kliteynik says: ======================= The following patch series adds support for a range match action in SW Steering. SW steering is able to match only on the exact values of the packet fields, as requested by the user: the user provides mask for the fields that are of interest, and the exact values to be matched on when the traffic is handled. The following patch series add new type of action - Range Match, where the user provides a field to be matched on and a range of values (min to max) that will be considered as hit. There are several new notions that were implemented in order to support Range Match: - MATCH_RANGES Steering Table Entry (STE): the new STE type that allows matching the packets' fields on the range of values instead of a specific value. - Match Definer: this is a general FW object that defines which fields in the packet will be referenced by the mask and tag of each STE. Match definer ID is part of STE fields, and it defines how the HW needs to interpret the STE's mask/tag values. Till now SW steering used the definers that were managed by FW and implemented the STE layout as described by the HW spec. Now that we're adding a new type of STE, SW steering needs to also be able to define this new STE's layout, and this is do ======================= 2) From OZ add support for meter mtu offload 2.1: Refactor the code to allow both metering and range post actions as a pre-step for adding police mtu offload support. 2.2: Instantiate mtu green/red flow tables with a single match-all rule. Add the green/red actions to the hit/miss table accordingly 2.3: Initialize the meter object with the TC police mtu parameter. Use the hardware range match action feature. 3) From MaorD, support routes with more than 2 nexthops in multipath 4) Michael and Or, improve and extend vport representor counters. * tag 'mlx5-updates-2022-12-08' of git://git.kernel.org/pub/scm/linux/kernel/git/saeed/linux: net/mlx5: Expose steering dropped packets counter net/mlx5: Refactor and expand rep vport stat group net/mlx5e: multipath, support routes with more than 2 nexthops net/mlx5e: TC, add support for meter mtu offload net/mlx5e: meter, add mtu post meter tables net/mlx5e: meter, refactor to allow multiple post meter tables net/mlx5: DR, Add support for range match action net/mlx5: DR, Add function that tells if STE miss addr has been initialized net/mlx5: DR, Some refactoring of miss address handling net/mlx5: DR, Manage definers with refcounts net/mlx5: DR, Handle FT action in a separate function net/mlx5: DR, Rework is_fw_table function net/mlx5: DR, Add functions to create/destroy MATCH_DEFINER general object net/mlx5: fs, add match on ranges API net/mlx5: mlx5_ifc updates for MATCH_DEFINER general object ==================== Link: https://lore.kernel.org/r/[email protected] Signed-off-by: Jakub Kicinski <[email protected]>
2 parents 043cd1e + 4fe1b3a commit c80edd8

33 files changed

+1373
-195
lines changed

drivers/net/ethernet/mellanox/mlx5/core/Makefile

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -111,6 +111,7 @@ mlx5_core-$(CONFIG_MLX5_SW_STEERING) += steering/dr_domain.o steering/dr_table.o
111111
steering/dr_ste_v2.o \
112112
steering/dr_cmd.o steering/dr_fw.o \
113113
steering/dr_action.o steering/fs_dr.o \
114+
steering/dr_definer.o \
114115
steering/dr_dbg.o lib/smfs.o
115116
#
116117
# SF device

drivers/net/ethernet/mellanox/mlx5/core/diag/fs_tracepoint.c

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -228,6 +228,17 @@ const char *parse_fs_hdrs(struct trace_seq *p,
228228
return ret;
229229
}
230230

231+
static const char
232+
*fs_dest_range_field_to_str(enum mlx5_flow_dest_range_field field)
233+
{
234+
switch (field) {
235+
case MLX5_FLOW_DEST_RANGE_FIELD_PKT_LEN:
236+
return "packet len";
237+
default:
238+
return "unknown dest range field";
239+
}
240+
}
241+
231242
const char *parse_fs_dst(struct trace_seq *p,
232243
const struct mlx5_flow_destination *dst,
233244
u32 counter_id)
@@ -259,6 +270,11 @@ const char *parse_fs_dst(struct trace_seq *p,
259270
case MLX5_FLOW_DESTINATION_TYPE_PORT:
260271
trace_seq_printf(p, "port\n");
261272
break;
273+
case MLX5_FLOW_DESTINATION_TYPE_RANGE:
274+
trace_seq_printf(p, "field=%s min=%d max=%d\n",
275+
fs_dest_range_field_to_str(dst->range.field),
276+
dst->range.min, dst->range.max);
277+
break;
262278
case MLX5_FLOW_DESTINATION_TYPE_NONE:
263279
trace_seq_printf(p, "none\n");
264280
break;

drivers/net/ethernet/mellanox/mlx5/core/en/tc/act/police.c

Lines changed: 17 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33

44
#include "act.h"
55
#include "en/tc_priv.h"
6+
#include "fs_core.h"
67

78
static bool police_act_validate_control(enum flow_action_id act_id,
89
struct netlink_ext_ack *extack)
@@ -71,6 +72,8 @@ fill_meter_params_from_act(const struct flow_action_entry *act,
7172
params->mode = MLX5_RATE_LIMIT_PPS;
7273
params->rate = act->police.rate_pkt_ps;
7374
params->burst = act->police.burst_pkt;
75+
} else if (act->police.mtu) {
76+
params->mtu = act->police.mtu;
7477
} else {
7578
return -EOPNOTSUPP;
7679
}
@@ -84,14 +87,25 @@ tc_act_parse_police(struct mlx5e_tc_act_parse_state *parse_state,
8487
struct mlx5e_priv *priv,
8588
struct mlx5_flow_attr *attr)
8689
{
90+
enum mlx5_flow_namespace_type ns = mlx5e_get_flow_namespace(parse_state->flow);
91+
struct mlx5e_flow_meter_params *params = &attr->meter_attr.params;
8792
int err;
8893

89-
err = fill_meter_params_from_act(act, &attr->meter_attr.params);
94+
err = fill_meter_params_from_act(act, params);
9095
if (err)
9196
return err;
9297

93-
attr->action |= MLX5_FLOW_CONTEXT_ACTION_EXECUTE_ASO;
94-
attr->exe_aso_type = MLX5_EXE_ASO_FLOW_METER;
98+
if (params->mtu) {
99+
if (!(mlx5_fs_get_capabilities(priv->mdev, ns) &
100+
MLX5_FLOW_STEERING_CAP_MATCH_RANGES))
101+
return -EOPNOTSUPP;
102+
103+
attr->action |= MLX5_FLOW_CONTEXT_ACTION_FWD_DEST;
104+
attr->flags |= MLX5_ATTR_FLAG_MTU;
105+
} else {
106+
attr->action |= MLX5_FLOW_CONTEXT_ACTION_EXECUTE_ASO;
107+
attr->exe_aso_type = MLX5_EXE_ASO_FLOW_METER;
108+
}
95109

96110
return 0;
97111
}

drivers/net/ethernet/mellanox/mlx5/core/en/tc/meter.c

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -241,7 +241,7 @@ mlx5e_flow_meter_destroy_aso_obj(struct mlx5_core_dev *mdev, u32 obj_id)
241241
}
242242

243243
static struct mlx5e_flow_meter_handle *
244-
__mlx5e_flow_meter_alloc(struct mlx5e_flow_meters *flow_meters)
244+
__mlx5e_flow_meter_alloc(struct mlx5e_flow_meters *flow_meters, bool alloc_aso)
245245
{
246246
struct mlx5_core_dev *mdev = flow_meters->mdev;
247247
struct mlx5e_flow_meter_aso_obj *meters_obj;
@@ -268,6 +268,9 @@ __mlx5e_flow_meter_alloc(struct mlx5e_flow_meters *flow_meters)
268268
}
269269
meter->act_counter = counter;
270270

271+
if (!alloc_aso)
272+
goto no_aso;
273+
271274
meters_obj = list_first_entry_or_null(&flow_meters->partial_list,
272275
struct mlx5e_flow_meter_aso_obj,
273276
entry);
@@ -300,11 +303,12 @@ __mlx5e_flow_meter_alloc(struct mlx5e_flow_meters *flow_meters)
300303
}
301304

302305
bitmap_set(meters_obj->meters_map, pos, 1);
303-
meter->flow_meters = flow_meters;
304306
meter->meters_obj = meters_obj;
305307
meter->obj_id = meters_obj->base_id + pos / 2;
306308
meter->idx = pos % 2;
307309

310+
no_aso:
311+
meter->flow_meters = flow_meters;
308312
mlx5_core_dbg(mdev, "flow meter allocated, obj_id=0x%x, index=%d\n",
309313
meter->obj_id, meter->idx);
310314

@@ -332,6 +336,9 @@ __mlx5e_flow_meter_free(struct mlx5e_flow_meter_handle *meter)
332336
mlx5_fc_destroy(mdev, meter->act_counter);
333337
mlx5_fc_destroy(mdev, meter->drop_counter);
334338

339+
if (meter->params.mtu)
340+
goto out_no_aso;
341+
335342
meters_obj = meter->meters_obj;
336343
pos = (meter->obj_id - meters_obj->base_id) * 2 + meter->idx;
337344
bitmap_clear(meters_obj->meters_map, pos, 1);
@@ -345,6 +352,7 @@ __mlx5e_flow_meter_free(struct mlx5e_flow_meter_handle *meter)
345352
list_add(&meters_obj->entry, &flow_meters->partial_list);
346353
}
347354

355+
out_no_aso:
348356
mlx5_core_dbg(mdev, "flow meter freed, obj_id=0x%x, index=%d\n",
349357
meter->obj_id, meter->idx);
350358
kfree(meter);
@@ -409,12 +417,13 @@ mlx5e_tc_meter_alloc(struct mlx5e_flow_meters *flow_meters,
409417
{
410418
struct mlx5e_flow_meter_handle *meter;
411419

412-
meter = __mlx5e_flow_meter_alloc(flow_meters);
420+
meter = __mlx5e_flow_meter_alloc(flow_meters, !params->mtu);
413421
if (IS_ERR(meter))
414422
return meter;
415423

416424
hash_add(flow_meters->hashtbl, &meter->hlist, params->index);
417425
meter->params.index = params->index;
426+
meter->params.mtu = params->mtu;
418427
meter->refcnt++;
419428

420429
return meter;

drivers/net/ethernet/mellanox/mlx5/core/en/tc/meter.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ struct mlx5e_flow_meter_params {
2020
u32 index;
2121
u64 rate;
2222
u64 burst;
23+
u32 mtu;
2324
};
2425

2526
struct mlx5e_flow_meter_handle {

0 commit comments

Comments
 (0)