Skip to content

Commit 45b6274

Browse files
jpirkodavem330
authored andcommitted
mlxsw: spectrum: Offload multichain TC rules
Reflect chain index coming down from TC core and create a ruleset per chain. Note that only chain 0, being the implicit chain, is bound to the device for processing. The rest of chains have to be "jumped-to" by actions. Signed-off-by: Jiri Pirko <[email protected]> Signed-off-by: David S. Miller <[email protected]>
1 parent ae99e18 commit 45b6274

File tree

4 files changed

+25
-15
lines changed

4 files changed

+25
-15
lines changed

drivers/net/ethernet/mellanox/mlxsw/spectrum.c

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1733,9 +1733,6 @@ mlxsw_sp_setup_tc_cls_flower(struct mlxsw_sp_port *mlxsw_sp_port,
17331733
else
17341734
return -EOPNOTSUPP;
17351735

1736-
if (f->common.chain_index)
1737-
return -EOPNOTSUPP;
1738-
17391736
switch (f->command) {
17401737
case TC_CLSFLOWER_REPLACE:
17411738
return mlxsw_sp_flower_replace(mlxsw_sp_port, ingress, f);

drivers/net/ethernet/mellanox/mlxsw/spectrum.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -440,8 +440,8 @@ struct mlxsw_sp_acl_ruleset;
440440
/* spectrum_acl.c */
441441
struct mlxsw_afk *mlxsw_sp_acl_afk(struct mlxsw_sp_acl *acl);
442442
struct mlxsw_sp_acl_ruleset *
443-
mlxsw_sp_acl_ruleset_get(struct mlxsw_sp *mlxsw_sp,
444-
struct net_device *dev, bool ingress,
443+
mlxsw_sp_acl_ruleset_get(struct mlxsw_sp *mlxsw_sp, struct net_device *dev,
444+
bool ingress, u32 chain_index,
445445
enum mlxsw_sp_acl_profile profile);
446446
void mlxsw_sp_acl_ruleset_put(struct mlxsw_sp *mlxsw_sp,
447447
struct mlxsw_sp_acl_ruleset *ruleset);

drivers/net/ethernet/mellanox/mlxsw/spectrum_acl.c

Lines changed: 20 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,7 @@ struct mlxsw_afk *mlxsw_sp_acl_afk(struct mlxsw_sp_acl *acl)
7474
struct mlxsw_sp_acl_ruleset_ht_key {
7575
struct net_device *dev; /* dev this ruleset is bound to */
7676
bool ingress;
77+
u32 chain_index;
7778
const struct mlxsw_sp_acl_profile_ops *ops;
7879
};
7980

@@ -163,21 +164,29 @@ static void mlxsw_sp_acl_ruleset_destroy(struct mlxsw_sp *mlxsw_sp,
163164

164165
static int mlxsw_sp_acl_ruleset_bind(struct mlxsw_sp *mlxsw_sp,
165166
struct mlxsw_sp_acl_ruleset *ruleset,
166-
struct net_device *dev, bool ingress)
167+
struct net_device *dev, bool ingress,
168+
u32 chain_index)
167169
{
168170
const struct mlxsw_sp_acl_profile_ops *ops = ruleset->ht_key.ops;
169171
struct mlxsw_sp_acl *acl = mlxsw_sp->acl;
170172
int err;
171173

172174
ruleset->ht_key.dev = dev;
173175
ruleset->ht_key.ingress = ingress;
176+
ruleset->ht_key.chain_index = chain_index;
174177
err = rhashtable_insert_fast(&acl->ruleset_ht, &ruleset->ht_node,
175178
mlxsw_sp_acl_ruleset_ht_params);
176179
if (err)
177180
return err;
178-
err = ops->ruleset_bind(mlxsw_sp, ruleset->priv, dev, ingress);
179-
if (err)
180-
goto err_ops_ruleset_bind;
181+
if (!ruleset->ht_key.chain_index) {
182+
/* We only need ruleset with chain index 0, the implicit one,
183+
* to be directly bound to device. The rest of the rulesets
184+
* are bound by "Goto action set".
185+
*/
186+
err = ops->ruleset_bind(mlxsw_sp, ruleset->priv, dev, ingress);
187+
if (err)
188+
goto err_ops_ruleset_bind;
189+
}
181190
return 0;
182191

183192
err_ops_ruleset_bind:
@@ -192,7 +201,8 @@ static void mlxsw_sp_acl_ruleset_unbind(struct mlxsw_sp *mlxsw_sp,
192201
const struct mlxsw_sp_acl_profile_ops *ops = ruleset->ht_key.ops;
193202
struct mlxsw_sp_acl *acl = mlxsw_sp->acl;
194203

195-
ops->ruleset_unbind(mlxsw_sp, ruleset->priv);
204+
if (!ruleset->ht_key.chain_index)
205+
ops->ruleset_unbind(mlxsw_sp, ruleset->priv);
196206
rhashtable_remove_fast(&acl->ruleset_ht, &ruleset->ht_node,
197207
mlxsw_sp_acl_ruleset_ht_params);
198208
}
@@ -212,8 +222,8 @@ static void mlxsw_sp_acl_ruleset_ref_dec(struct mlxsw_sp *mlxsw_sp,
212222
}
213223

214224
struct mlxsw_sp_acl_ruleset *
215-
mlxsw_sp_acl_ruleset_get(struct mlxsw_sp *mlxsw_sp,
216-
struct net_device *dev, bool ingress,
225+
mlxsw_sp_acl_ruleset_get(struct mlxsw_sp *mlxsw_sp, struct net_device *dev,
226+
bool ingress, u32 chain_index,
217227
enum mlxsw_sp_acl_profile profile)
218228
{
219229
const struct mlxsw_sp_acl_profile_ops *ops;
@@ -229,6 +239,7 @@ mlxsw_sp_acl_ruleset_get(struct mlxsw_sp *mlxsw_sp,
229239
memset(&ht_key, 0, sizeof(ht_key));
230240
ht_key.dev = dev;
231241
ht_key.ingress = ingress;
242+
ht_key.chain_index = chain_index;
232243
ht_key.ops = ops;
233244
ruleset = rhashtable_lookup_fast(&acl->ruleset_ht, &ht_key,
234245
mlxsw_sp_acl_ruleset_ht_params);
@@ -239,7 +250,8 @@ mlxsw_sp_acl_ruleset_get(struct mlxsw_sp *mlxsw_sp,
239250
ruleset = mlxsw_sp_acl_ruleset_create(mlxsw_sp, ops);
240251
if (IS_ERR(ruleset))
241252
return ruleset;
242-
err = mlxsw_sp_acl_ruleset_bind(mlxsw_sp, ruleset, dev, ingress);
253+
err = mlxsw_sp_acl_ruleset_bind(mlxsw_sp, ruleset, dev,
254+
ingress, chain_index);
243255
if (err)
244256
goto err_ruleset_bind;
245257
return ruleset;

drivers/net/ethernet/mellanox/mlxsw/spectrum_flower.c

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -378,6 +378,7 @@ int mlxsw_sp_flower_replace(struct mlxsw_sp_port *mlxsw_sp_port, bool ingress,
378378
int err;
379379

380380
ruleset = mlxsw_sp_acl_ruleset_get(mlxsw_sp, dev, ingress,
381+
f->common.chain_index,
381382
MLXSW_SP_ACL_PROFILE_FLOWER);
382383
if (IS_ERR(ruleset))
383384
return PTR_ERR(ruleset);
@@ -421,7 +422,7 @@ void mlxsw_sp_flower_destroy(struct mlxsw_sp_port *mlxsw_sp_port, bool ingress,
421422
struct mlxsw_sp_acl_rule *rule;
422423

423424
ruleset = mlxsw_sp_acl_ruleset_get(mlxsw_sp, mlxsw_sp_port->dev,
424-
ingress,
425+
ingress, f->common.chain_index,
425426
MLXSW_SP_ACL_PROFILE_FLOWER);
426427
if (IS_ERR(ruleset))
427428
return;
@@ -447,7 +448,7 @@ int mlxsw_sp_flower_stats(struct mlxsw_sp_port *mlxsw_sp_port, bool ingress,
447448
int err;
448449

449450
ruleset = mlxsw_sp_acl_ruleset_get(mlxsw_sp, mlxsw_sp_port->dev,
450-
ingress,
451+
ingress, f->common.chain_index,
451452
MLXSW_SP_ACL_PROFILE_FLOWER);
452453
if (WARN_ON(IS_ERR(ruleset)))
453454
return -EINVAL;

0 commit comments

Comments
 (0)