@@ -118,8 +118,26 @@ struct mlxsw_sp_fid *mlxsw_sp_acl_dummy_fid(struct mlxsw_sp *mlxsw_sp)
118
118
return mlxsw_sp -> acl -> dummy_fid ;
119
119
}
120
120
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
+
121
138
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 ,
123
141
const struct mlxsw_sp_acl_profile_ops * ops )
124
142
{
125
143
struct mlxsw_sp_acl * acl = mlxsw_sp -> acl ;
@@ -132,6 +150,9 @@ mlxsw_sp_acl_ruleset_create(struct mlxsw_sp *mlxsw_sp,
132
150
if (!ruleset )
133
151
return ERR_PTR (- ENOMEM );
134
152
ruleset -> ref_count = 1 ;
153
+ ruleset -> ht_key .dev = dev ;
154
+ ruleset -> ht_key .ingress = ingress ;
155
+ ruleset -> ht_key .chain_index = chain_index ;
135
156
ruleset -> ht_key .ops = ops ;
136
157
137
158
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,
142
163
if (err )
143
164
goto err_ops_ruleset_add ;
144
165
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 ;
176
166
err = rhashtable_insert_fast (& acl -> ruleset_ht , & ruleset -> ht_node ,
177
167
mlxsw_sp_acl_ruleset_ht_params );
178
168
if (err )
179
- return err ;
180
- if (!ruleset -> ht_key .chain_index ) {
169
+ goto err_ht_insert ;
170
+
171
+ if (!chain_index ) {
181
172
/* We only need ruleset with chain index 0, the implicit one,
182
173
* to be directly bound to device. The rest of the rulesets
183
174
* are bound by "Goto action set".
184
175
*/
185
- err = ops -> ruleset_bind (mlxsw_sp , ruleset -> priv , dev , ingress );
176
+ err = mlxsw_sp_acl_ruleset_bind (mlxsw_sp , ruleset ,
177
+ dev , ingress );
186
178
if (err )
187
- goto err_ops_ruleset_bind ;
179
+ goto err_ruleset_bind ;
188
180
}
189
- return 0 ;
190
181
191
- err_ops_ruleset_bind :
182
+ return ruleset ;
183
+
184
+ err_ruleset_bind :
192
185
rhashtable_remove_fast (& acl -> ruleset_ht , & ruleset -> ht_node ,
193
186
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 );
195
194
}
196
195
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 )
199
198
{
200
199
const struct mlxsw_sp_acl_profile_ops * ops = ruleset -> ht_key .ops ;
201
200
struct mlxsw_sp_acl * acl = mlxsw_sp -> acl ;
202
201
203
202
if (!ruleset -> ht_key .chain_index )
204
- ops -> ruleset_unbind (mlxsw_sp , ruleset -> priv );
203
+ mlxsw_sp_acl_ruleset_unbind (mlxsw_sp , ruleset );
205
204
rhashtable_remove_fast (& acl -> ruleset_ht , & ruleset -> ht_node ,
206
205
mlxsw_sp_acl_ruleset_ht_params );
206
+ ops -> ruleset_del (mlxsw_sp , ruleset -> priv );
207
+ rhashtable_destroy (& ruleset -> rule_ht );
208
+ kfree (ruleset );
207
209
}
208
210
209
211
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,
216
218
{
217
219
if (-- ruleset -> ref_count )
218
220
return ;
219
- mlxsw_sp_acl_ruleset_unbind (mlxsw_sp , ruleset );
220
221
mlxsw_sp_acl_ruleset_destroy (mlxsw_sp , ruleset );
221
222
}
222
223
@@ -263,7 +264,6 @@ mlxsw_sp_acl_ruleset_get(struct mlxsw_sp *mlxsw_sp, struct net_device *dev,
263
264
const struct mlxsw_sp_acl_profile_ops * ops ;
264
265
struct mlxsw_sp_acl * acl = mlxsw_sp -> acl ;
265
266
struct mlxsw_sp_acl_ruleset * ruleset ;
266
- int err ;
267
267
268
268
ops = acl -> ops -> profile_ops (mlxsw_sp , profile );
269
269
if (!ops )
@@ -275,18 +275,8 @@ mlxsw_sp_acl_ruleset_get(struct mlxsw_sp *mlxsw_sp, struct net_device *dev,
275
275
mlxsw_sp_acl_ruleset_ref_inc (ruleset );
276
276
return ruleset ;
277
277
}
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 );
290
280
}
291
281
292
282
void mlxsw_sp_acl_ruleset_put (struct mlxsw_sp * mlxsw_sp ,
0 commit comments