Skip to content

Commit 9fe5fdf

Browse files
jpirkodavem330
authored andcommitted
mlxsw: spectrum_acl: Reshuffle code around mlxsw_sp_acl_ruleset_create/destroy
In order to prepare for follow-up changes, make the bind/unbind helpers very simple. That required move of ht insertion/removal and bind/unbind calls into mlxsw_sp_acl_ruleset_create/destroy. Signed-off-by: Jiri Pirko <[email protected]> Acked-by: David Ahern <[email protected]> Signed-off-by: David S. Miller <[email protected]>
1 parent 51ab299 commit 9fe5fdf

File tree

1 file changed

+46
-56
lines changed

1 file changed

+46
-56
lines changed

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

Lines changed: 46 additions & 56 deletions
Original file line numberDiff line numberDiff line change
@@ -118,8 +118,26 @@ struct mlxsw_sp_fid *mlxsw_sp_acl_dummy_fid(struct mlxsw_sp *mlxsw_sp)
118118
return mlxsw_sp->acl->dummy_fid;
119119
}
120120

121+
static int mlxsw_sp_acl_ruleset_bind(struct mlxsw_sp *mlxsw_sp,
122+
struct mlxsw_sp_acl_ruleset *ruleset,
123+
struct net_device *dev, bool ingress)
124+
{
125+
const struct mlxsw_sp_acl_profile_ops *ops = ruleset->ht_key.ops;
126+
127+
return ops->ruleset_bind(mlxsw_sp, ruleset->priv, dev, ingress);
128+
}
129+
130+
static void mlxsw_sp_acl_ruleset_unbind(struct mlxsw_sp *mlxsw_sp,
131+
struct mlxsw_sp_acl_ruleset *ruleset)
132+
{
133+
const struct mlxsw_sp_acl_profile_ops *ops = ruleset->ht_key.ops;
134+
135+
ops->ruleset_unbind(mlxsw_sp, ruleset->priv);
136+
}
137+
121138
static struct mlxsw_sp_acl_ruleset *
122-
mlxsw_sp_acl_ruleset_create(struct mlxsw_sp *mlxsw_sp,
139+
mlxsw_sp_acl_ruleset_create(struct mlxsw_sp *mlxsw_sp, struct net_device *dev,
140+
bool ingress, u32 chain_index,
123141
const struct mlxsw_sp_acl_profile_ops *ops)
124142
{
125143
struct mlxsw_sp_acl *acl = mlxsw_sp->acl;
@@ -132,6 +150,9 @@ mlxsw_sp_acl_ruleset_create(struct mlxsw_sp *mlxsw_sp,
132150
if (!ruleset)
133151
return ERR_PTR(-ENOMEM);
134152
ruleset->ref_count = 1;
153+
ruleset->ht_key.dev = dev;
154+
ruleset->ht_key.ingress = ingress;
155+
ruleset->ht_key.chain_index = chain_index;
135156
ruleset->ht_key.ops = ops;
136157

137158
err = rhashtable_init(&ruleset->rule_ht, &mlxsw_sp_acl_rule_ht_params);
@@ -142,68 +163,49 @@ mlxsw_sp_acl_ruleset_create(struct mlxsw_sp *mlxsw_sp,
142163
if (err)
143164
goto err_ops_ruleset_add;
144165

145-
return ruleset;
146-
147-
err_ops_ruleset_add:
148-
rhashtable_destroy(&ruleset->rule_ht);
149-
err_rhashtable_init:
150-
kfree(ruleset);
151-
return ERR_PTR(err);
152-
}
153-
154-
static void mlxsw_sp_acl_ruleset_destroy(struct mlxsw_sp *mlxsw_sp,
155-
struct mlxsw_sp_acl_ruleset *ruleset)
156-
{
157-
const struct mlxsw_sp_acl_profile_ops *ops = ruleset->ht_key.ops;
158-
159-
ops->ruleset_del(mlxsw_sp, ruleset->priv);
160-
rhashtable_destroy(&ruleset->rule_ht);
161-
kfree(ruleset);
162-
}
163-
164-
static int mlxsw_sp_acl_ruleset_bind(struct mlxsw_sp *mlxsw_sp,
165-
struct mlxsw_sp_acl_ruleset *ruleset,
166-
struct net_device *dev, bool ingress,
167-
u32 chain_index)
168-
{
169-
const struct mlxsw_sp_acl_profile_ops *ops = ruleset->ht_key.ops;
170-
struct mlxsw_sp_acl *acl = mlxsw_sp->acl;
171-
int err;
172-
173-
ruleset->ht_key.dev = dev;
174-
ruleset->ht_key.ingress = ingress;
175-
ruleset->ht_key.chain_index = chain_index;
176166
err = rhashtable_insert_fast(&acl->ruleset_ht, &ruleset->ht_node,
177167
mlxsw_sp_acl_ruleset_ht_params);
178168
if (err)
179-
return err;
180-
if (!ruleset->ht_key.chain_index) {
169+
goto err_ht_insert;
170+
171+
if (!chain_index) {
181172
/* We only need ruleset with chain index 0, the implicit one,
182173
* to be directly bound to device. The rest of the rulesets
183174
* are bound by "Goto action set".
184175
*/
185-
err = ops->ruleset_bind(mlxsw_sp, ruleset->priv, dev, ingress);
176+
err = mlxsw_sp_acl_ruleset_bind(mlxsw_sp, ruleset,
177+
dev, ingress);
186178
if (err)
187-
goto err_ops_ruleset_bind;
179+
goto err_ruleset_bind;
188180
}
189-
return 0;
190181

191-
err_ops_ruleset_bind:
182+
return ruleset;
183+
184+
err_ruleset_bind:
192185
rhashtable_remove_fast(&acl->ruleset_ht, &ruleset->ht_node,
193186
mlxsw_sp_acl_ruleset_ht_params);
194-
return err;
187+
err_ht_insert:
188+
ops->ruleset_del(mlxsw_sp, ruleset->priv);
189+
err_ops_ruleset_add:
190+
rhashtable_destroy(&ruleset->rule_ht);
191+
err_rhashtable_init:
192+
kfree(ruleset);
193+
return ERR_PTR(err);
195194
}
196195

197-
static void mlxsw_sp_acl_ruleset_unbind(struct mlxsw_sp *mlxsw_sp,
198-
struct mlxsw_sp_acl_ruleset *ruleset)
196+
static void mlxsw_sp_acl_ruleset_destroy(struct mlxsw_sp *mlxsw_sp,
197+
struct mlxsw_sp_acl_ruleset *ruleset)
199198
{
200199
const struct mlxsw_sp_acl_profile_ops *ops = ruleset->ht_key.ops;
201200
struct mlxsw_sp_acl *acl = mlxsw_sp->acl;
202201

203202
if (!ruleset->ht_key.chain_index)
204-
ops->ruleset_unbind(mlxsw_sp, ruleset->priv);
203+
mlxsw_sp_acl_ruleset_unbind(mlxsw_sp, ruleset);
205204
rhashtable_remove_fast(&acl->ruleset_ht, &ruleset->ht_node,
206205
mlxsw_sp_acl_ruleset_ht_params);
206+
ops->ruleset_del(mlxsw_sp, ruleset->priv);
207+
rhashtable_destroy(&ruleset->rule_ht);
208+
kfree(ruleset);
207209
}
208210

209211
static void mlxsw_sp_acl_ruleset_ref_inc(struct mlxsw_sp_acl_ruleset *ruleset)
@@ -216,7 +218,6 @@ static void mlxsw_sp_acl_ruleset_ref_dec(struct mlxsw_sp *mlxsw_sp,
216218
{
217219
if (--ruleset->ref_count)
218220
return;
219-
mlxsw_sp_acl_ruleset_unbind(mlxsw_sp, ruleset);
220221
mlxsw_sp_acl_ruleset_destroy(mlxsw_sp, ruleset);
221222
}
222223

@@ -263,7 +264,6 @@ mlxsw_sp_acl_ruleset_get(struct mlxsw_sp *mlxsw_sp, struct net_device *dev,
263264
const struct mlxsw_sp_acl_profile_ops *ops;
264265
struct mlxsw_sp_acl *acl = mlxsw_sp->acl;
265266
struct mlxsw_sp_acl_ruleset *ruleset;
266-
int err;
267267

268268
ops = acl->ops->profile_ops(mlxsw_sp, profile);
269269
if (!ops)
@@ -275,18 +275,8 @@ mlxsw_sp_acl_ruleset_get(struct mlxsw_sp *mlxsw_sp, struct net_device *dev,
275275
mlxsw_sp_acl_ruleset_ref_inc(ruleset);
276276
return ruleset;
277277
}
278-
ruleset = mlxsw_sp_acl_ruleset_create(mlxsw_sp, ops);
279-
if (IS_ERR(ruleset))
280-
return ruleset;
281-
err = mlxsw_sp_acl_ruleset_bind(mlxsw_sp, ruleset, dev,
282-
ingress, chain_index);
283-
if (err)
284-
goto err_ruleset_bind;
285-
return ruleset;
286-
287-
err_ruleset_bind:
288-
mlxsw_sp_acl_ruleset_destroy(mlxsw_sp, ruleset);
289-
return ERR_PTR(err);
278+
return mlxsw_sp_acl_ruleset_create(mlxsw_sp, dev, ingress,
279+
chain_index, ops);
290280
}
291281

292282
void mlxsw_sp_acl_ruleset_put(struct mlxsw_sp *mlxsw_sp,

0 commit comments

Comments
 (0)