Skip to content

Commit 8d1a77f

Browse files
Alexander Aringdavem330
authored andcommitted
net: sch: api: add extack support in tcf_block_get
This patch adds extack support for the function tcf_block_get which is a common used function in the tc subsystem. Callers which are interested in the receiving error can assign extack to get a more detailed information why tcf_block_get failed. Cc: David Ahern <[email protected]> Acked-by: Jamal Hadi Salim <[email protected]> Signed-off-by: Alexander Aring <[email protected]> Signed-off-by: David S. Miller <[email protected]>
1 parent e9bc3fa commit 8d1a77f

File tree

15 files changed

+36
-25
lines changed

15 files changed

+36
-25
lines changed

include/net/pkt_cls.h

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -39,9 +39,11 @@ struct tcf_chain *tcf_chain_get(struct tcf_block *block, u32 chain_index,
3939
bool create);
4040
void tcf_chain_put(struct tcf_chain *chain);
4141
int tcf_block_get(struct tcf_block **p_block,
42-
struct tcf_proto __rcu **p_filter_chain, struct Qdisc *q);
42+
struct tcf_proto __rcu **p_filter_chain, struct Qdisc *q,
43+
struct netlink_ext_ack *extack);
4344
int tcf_block_get_ext(struct tcf_block **p_block, struct Qdisc *q,
44-
struct tcf_block_ext_info *ei);
45+
struct tcf_block_ext_info *ei,
46+
struct netlink_ext_ack *extack);
4547
void tcf_block_put(struct tcf_block *block);
4648
void tcf_block_put_ext(struct tcf_block *block, struct Qdisc *q,
4749
struct tcf_block_ext_info *ei);

net/sched/cls_api.c

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -281,20 +281,24 @@ static void tcf_block_offload_unbind(struct tcf_block *block, struct Qdisc *q,
281281
}
282282

283283
int tcf_block_get_ext(struct tcf_block **p_block, struct Qdisc *q,
284-
struct tcf_block_ext_info *ei)
284+
struct tcf_block_ext_info *ei,
285+
struct netlink_ext_ack *extack)
285286
{
286287
struct tcf_block *block = kzalloc(sizeof(*block), GFP_KERNEL);
287288
struct tcf_chain *chain;
288289
int err;
289290

290-
if (!block)
291+
if (!block) {
292+
NL_SET_ERR_MSG(extack, "Memory allocation for block failed");
291293
return -ENOMEM;
294+
}
292295
INIT_LIST_HEAD(&block->chain_list);
293296
INIT_LIST_HEAD(&block->cb_list);
294297

295298
/* Create chain 0 by default, it has to be always present. */
296299
chain = tcf_chain_create(block, 0);
297300
if (!chain) {
301+
NL_SET_ERR_MSG(extack, "Failed to create new tcf chain");
298302
err = -ENOMEM;
299303
goto err_chain_create;
300304
}
@@ -321,15 +325,16 @@ static void tcf_chain_head_change_dflt(struct tcf_proto *tp_head, void *priv)
321325
}
322326

323327
int tcf_block_get(struct tcf_block **p_block,
324-
struct tcf_proto __rcu **p_filter_chain, struct Qdisc *q)
328+
struct tcf_proto __rcu **p_filter_chain, struct Qdisc *q,
329+
struct netlink_ext_ack *extack)
325330
{
326331
struct tcf_block_ext_info ei = {
327332
.chain_head_change = tcf_chain_head_change_dflt,
328333
.chain_head_change_priv = p_filter_chain,
329334
};
330335

331336
WARN_ON(!p_filter_chain);
332-
return tcf_block_get_ext(p_block, q, &ei);
337+
return tcf_block_get_ext(p_block, q, &ei, extack);
333338
}
334339
EXPORT_SYMBOL(tcf_block_get);
335340

net/sched/sch_atm.c

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -283,7 +283,8 @@ static int atm_tc_change(struct Qdisc *sch, u32 classid, u32 parent,
283283
goto err_out;
284284
}
285285

286-
error = tcf_block_get(&flow->block, &flow->filter_list, sch);
286+
error = tcf_block_get(&flow->block, &flow->filter_list, sch,
287+
extack);
287288
if (error) {
288289
kfree(flow);
289290
goto err_out;
@@ -550,7 +551,8 @@ static int atm_tc_init(struct Qdisc *sch, struct nlattr *opt,
550551
p->link.q = &noop_qdisc;
551552
pr_debug("atm_tc_init: link (%p) qdisc %p\n", &p->link, p->link.q);
552553

553-
err = tcf_block_get(&p->link.block, &p->link.filter_list, sch);
554+
err = tcf_block_get(&p->link.block, &p->link.filter_list, sch,
555+
extack);
554556
if (err)
555557
return err;
556558

net/sched/sch_cbq.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1160,7 +1160,7 @@ static int cbq_init(struct Qdisc *sch, struct nlattr *opt,
11601160
if (!q->link.R_tab)
11611161
return -EINVAL;
11621162

1163-
err = tcf_block_get(&q->link.block, &q->link.filter_list, sch);
1163+
err = tcf_block_get(&q->link.block, &q->link.filter_list, sch, extack);
11641164
if (err)
11651165
goto put_rtab;
11661166

@@ -1576,7 +1576,7 @@ cbq_change_class(struct Qdisc *sch, u32 classid, u32 parentid, struct nlattr **t
15761576
if (cl == NULL)
15771577
goto failure;
15781578

1579-
err = tcf_block_get(&cl->block, &cl->filter_list, sch);
1579+
err = tcf_block_get(&cl->block, &cl->filter_list, sch, extack);
15801580
if (err) {
15811581
kfree(cl);
15821582
return err;

net/sched/sch_drr.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -417,7 +417,7 @@ static int drr_init_qdisc(struct Qdisc *sch, struct nlattr *opt,
417417
struct drr_sched *q = qdisc_priv(sch);
418418
int err;
419419

420-
err = tcf_block_get(&q->block, &q->filter_list, sch);
420+
err = tcf_block_get(&q->block, &q->filter_list, sch, extack);
421421
if (err)
422422
return err;
423423
err = qdisc_class_hash_init(&q->clhash);

net/sched/sch_dsmark.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -348,7 +348,7 @@ static int dsmark_init(struct Qdisc *sch, struct nlattr *opt,
348348
if (!opt)
349349
goto errout;
350350

351-
err = tcf_block_get(&p->block, &p->filter_list, sch);
351+
err = tcf_block_get(&p->block, &p->filter_list, sch, extack);
352352
if (err)
353353
return err;
354354

net/sched/sch_fq_codel.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -484,7 +484,7 @@ static int fq_codel_init(struct Qdisc *sch, struct nlattr *opt,
484484
return err;
485485
}
486486

487-
err = tcf_block_get(&q->block, &q->filter_list, sch);
487+
err = tcf_block_get(&q->block, &q->filter_list, sch, extack);
488488
if (err)
489489
return err;
490490

net/sched/sch_hfsc.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1034,7 +1034,7 @@ hfsc_change_class(struct Qdisc *sch, u32 classid, u32 parentid,
10341034
if (cl == NULL)
10351035
return -ENOBUFS;
10361036

1037-
err = tcf_block_get(&cl->block, &cl->filter_list, sch);
1037+
err = tcf_block_get(&cl->block, &cl->filter_list, sch, extack);
10381038
if (err) {
10391039
kfree(cl);
10401040
return err;
@@ -1409,7 +1409,7 @@ hfsc_init_qdisc(struct Qdisc *sch, struct nlattr *opt,
14091409
return err;
14101410
q->eligible = RB_ROOT;
14111411

1412-
err = tcf_block_get(&q->root.block, &q->root.filter_list, sch);
1412+
err = tcf_block_get(&q->root.block, &q->root.filter_list, sch, extack);
14131413
if (err)
14141414
return err;
14151415

net/sched/sch_htb.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1032,7 +1032,7 @@ static int htb_init(struct Qdisc *sch, struct nlattr *opt,
10321032
if (!opt)
10331033
return -EINVAL;
10341034

1035-
err = tcf_block_get(&q->block, &q->filter_list, sch);
1035+
err = tcf_block_get(&q->block, &q->filter_list, sch, extack);
10361036
if (err)
10371037
return err;
10381038

@@ -1397,7 +1397,7 @@ static int htb_change_class(struct Qdisc *sch, u32 classid,
13971397
if (!cl)
13981398
goto failure;
13991399

1400-
err = tcf_block_get(&cl->block, &cl->filter_list, sch);
1400+
err = tcf_block_get(&cl->block, &cl->filter_list, sch, extack);
14011401
if (err) {
14021402
kfree(cl);
14031403
goto failure;

net/sched/sch_ingress.c

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -78,7 +78,7 @@ static int ingress_init(struct Qdisc *sch, struct nlattr *opt,
7878
q->block_info.chain_head_change = clsact_chain_head_change;
7979
q->block_info.chain_head_change_priv = &q->miniqp;
8080

81-
err = tcf_block_get_ext(&q->block, sch, &q->block_info);
81+
err = tcf_block_get_ext(&q->block, sch, &q->block_info, extack);
8282
if (err)
8383
return err;
8484

@@ -186,7 +186,8 @@ static int clsact_init(struct Qdisc *sch, struct nlattr *opt,
186186
q->ingress_block_info.chain_head_change = clsact_chain_head_change;
187187
q->ingress_block_info.chain_head_change_priv = &q->miniqp_ingress;
188188

189-
err = tcf_block_get_ext(&q->ingress_block, sch, &q->ingress_block_info);
189+
err = tcf_block_get_ext(&q->ingress_block, sch, &q->ingress_block_info,
190+
extack);
190191
if (err)
191192
return err;
192193

@@ -196,7 +197,8 @@ static int clsact_init(struct Qdisc *sch, struct nlattr *opt,
196197
q->egress_block_info.chain_head_change = clsact_chain_head_change;
197198
q->egress_block_info.chain_head_change_priv = &q->miniqp_egress;
198199

199-
err = tcf_block_get_ext(&q->egress_block, sch, &q->egress_block_info);
200+
err = tcf_block_get_ext(&q->egress_block, sch, &q->egress_block_info,
201+
extack);
200202
if (err)
201203
return err;
202204

net/sched/sch_multiq.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -248,7 +248,7 @@ static int multiq_init(struct Qdisc *sch, struct nlattr *opt,
248248
if (!opt)
249249
return -EINVAL;
250250

251-
err = tcf_block_get(&q->block, &q->filter_list, sch);
251+
err = tcf_block_get(&q->block, &q->filter_list, sch, extack);
252252
if (err)
253253
return err;
254254

net/sched/sch_prio.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -215,7 +215,7 @@ static int prio_init(struct Qdisc *sch, struct nlattr *opt,
215215
if (!opt)
216216
return -EINVAL;
217217

218-
err = tcf_block_get(&q->block, &q->filter_list, sch);
218+
err = tcf_block_get(&q->block, &q->filter_list, sch, extack);
219219
if (err)
220220
return err;
221221

net/sched/sch_qfq.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1424,7 +1424,7 @@ static int qfq_init_qdisc(struct Qdisc *sch, struct nlattr *opt,
14241424
int i, j, err;
14251425
u32 max_cl_shift, maxbudg_shift, max_classes;
14261426

1427-
err = tcf_block_get(&q->block, &q->filter_list, sch);
1427+
err = tcf_block_get(&q->block, &q->filter_list, sch, extack);
14281428
if (err)
14291429
return err;
14301430

net/sched/sch_sfb.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -556,7 +556,7 @@ static int sfb_init(struct Qdisc *sch, struct nlattr *opt,
556556
struct sfb_sched_data *q = qdisc_priv(sch);
557557
int err;
558558

559-
err = tcf_block_get(&q->block, &q->filter_list, sch);
559+
err = tcf_block_get(&q->block, &q->filter_list, sch, extack);
560560
if (err)
561561
return err;
562562

net/sched/sch_sfq.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -731,7 +731,7 @@ static int sfq_init(struct Qdisc *sch, struct nlattr *opt,
731731
q->sch = sch;
732732
timer_setup(&q->perturb_timer, sfq_perturbation, TIMER_DEFERRABLE);
733733

734-
err = tcf_block_get(&q->block, &q->filter_list, sch);
734+
err = tcf_block_get(&q->block, &q->filter_list, sch, extack);
735735
if (err)
736736
return err;
737737

0 commit comments

Comments
 (0)