Skip to content

Commit 94e2557

Browse files
Jiri Pirkodavem330
authored andcommitted
net: sched: move block device tracking into tcf_block_get/put_ext()
Inserting the device to block xarray in qdisc_create() is not suitable place to do this. As it requires use of tcf_block() callback, it causes multiple issues. It is called for all qdisc types, which is incorrect. So, instead, move it to more suitable place, which is tcf_block_get_ext() and make sure it is only done for qdiscs that use block infrastructure and also only for blocks which are shared. Symmetrically, alter the cleanup path, move the xarray entry removal into tcf_block_put_ext(). Fixes: 913b47d ("net/sched: Introduce tc block netdev tracking infra") Reported-by: Ido Schimmel <[email protected]> Closes: https://lore.kernel.org/all/ZY1hBb8GFwycfgvd@shredder/ Reported-by: Kui-Feng Lee <[email protected]> Closes: https://lore.kernel.org/all/[email protected]/ Reported-and-tested-by: [email protected] Closes: https://lore.kernel.org/all/[email protected]/ Reported-and-tested-by: [email protected] Closes: https://lore.kernel.org/all/[email protected]/ Reported-and-tested-by: [email protected] Closes: https://lore.kernel.org/all/[email protected]/ Signed-off-by: Jiri Pirko <[email protected]> Tested-by: Ido Schimmel <[email protected]> Reviewed-by: Victor Nogueira <[email protected]> Tested-by: Victor Nogueira <[email protected]> Reviewed-by: Jamal Hadi Salim <[email protected]> Acked-by: Jamal Hadi Salim <[email protected]> Signed-off-by: David S. Miller <[email protected]>
1 parent e63c182 commit 94e2557

File tree

3 files changed

+14
-55
lines changed

3 files changed

+14
-55
lines changed

net/sched/cls_api.c

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1428,6 +1428,7 @@ int tcf_block_get_ext(struct tcf_block **p_block, struct Qdisc *q,
14281428
struct tcf_block_ext_info *ei,
14291429
struct netlink_ext_ack *extack)
14301430
{
1431+
struct net_device *dev = qdisc_dev(q);
14311432
struct net *net = qdisc_net(q);
14321433
struct tcf_block *block = NULL;
14331434
int err;
@@ -1461,9 +1462,18 @@ int tcf_block_get_ext(struct tcf_block **p_block, struct Qdisc *q,
14611462
if (err)
14621463
goto err_block_offload_bind;
14631464

1465+
if (tcf_block_shared(block)) {
1466+
err = xa_insert(&block->ports, dev->ifindex, dev, GFP_KERNEL);
1467+
if (err) {
1468+
NL_SET_ERR_MSG(extack, "block dev insert failed");
1469+
goto err_dev_insert;
1470+
}
1471+
}
1472+
14641473
*p_block = block;
14651474
return 0;
14661475

1476+
err_dev_insert:
14671477
err_block_offload_bind:
14681478
tcf_chain0_head_change_cb_del(block, ei);
14691479
err_chain0_head_change_cb_add:
@@ -1502,8 +1512,12 @@ EXPORT_SYMBOL(tcf_block_get);
15021512
void tcf_block_put_ext(struct tcf_block *block, struct Qdisc *q,
15031513
struct tcf_block_ext_info *ei)
15041514
{
1515+
struct net_device *dev = qdisc_dev(q);
1516+
15051517
if (!block)
15061518
return;
1519+
if (tcf_block_shared(block))
1520+
xa_erase(&block->ports, dev->ifindex);
15071521
tcf_chain0_head_change_cb_del(block, ei);
15081522
tcf_block_owner_del(block, q, ei->binder_type);
15091523

net/sched/sch_api.c

Lines changed: 0 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -1209,43 +1209,6 @@ static int qdisc_graft(struct net_device *dev, struct Qdisc *parent,
12091209
return 0;
12101210
}
12111211

1212-
static int qdisc_block_add_dev(struct Qdisc *sch, struct net_device *dev,
1213-
struct netlink_ext_ack *extack)
1214-
{
1215-
const struct Qdisc_class_ops *cl_ops = sch->ops->cl_ops;
1216-
struct tcf_block *block;
1217-
int err;
1218-
1219-
block = cl_ops->tcf_block(sch, TC_H_MIN_INGRESS, NULL);
1220-
if (block) {
1221-
err = xa_insert(&block->ports, dev->ifindex, dev, GFP_KERNEL);
1222-
if (err) {
1223-
NL_SET_ERR_MSG(extack,
1224-
"ingress block dev insert failed");
1225-
return err;
1226-
}
1227-
}
1228-
1229-
block = cl_ops->tcf_block(sch, TC_H_MIN_EGRESS, NULL);
1230-
if (block) {
1231-
err = xa_insert(&block->ports, dev->ifindex, dev, GFP_KERNEL);
1232-
if (err) {
1233-
NL_SET_ERR_MSG(extack,
1234-
"Egress block dev insert failed");
1235-
goto err_out;
1236-
}
1237-
}
1238-
1239-
return 0;
1240-
1241-
err_out:
1242-
block = cl_ops->tcf_block(sch, TC_H_MIN_INGRESS, NULL);
1243-
if (block)
1244-
xa_erase(&block->ports, dev->ifindex);
1245-
1246-
return err;
1247-
}
1248-
12491212
static int qdisc_block_indexes_set(struct Qdisc *sch, struct nlattr **tca,
12501213
struct netlink_ext_ack *extack)
12511214
{
@@ -1416,10 +1379,6 @@ static struct Qdisc *qdisc_create(struct net_device *dev,
14161379
qdisc_hash_add(sch, false);
14171380
trace_qdisc_create(ops, dev, parent);
14181381

1419-
err = qdisc_block_add_dev(sch, dev, extack);
1420-
if (err)
1421-
goto err_out4;
1422-
14231382
return sch;
14241383

14251384
err_out4:

net/sched/sch_generic.c

Lines changed: 0 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1052,8 +1052,6 @@ static void __qdisc_destroy(struct Qdisc *qdisc)
10521052
{
10531053
const struct Qdisc_ops *ops = qdisc->ops;
10541054
struct net_device *dev = qdisc_dev(qdisc);
1055-
const struct Qdisc_class_ops *cops;
1056-
struct tcf_block *block;
10571055

10581056
#ifdef CONFIG_NET_SCHED
10591057
qdisc_hash_del(qdisc);
@@ -1064,18 +1062,6 @@ static void __qdisc_destroy(struct Qdisc *qdisc)
10641062

10651063
qdisc_reset(qdisc);
10661064

1067-
cops = ops->cl_ops;
1068-
if (ops->ingress_block_get) {
1069-
block = cops->tcf_block(qdisc, TC_H_MIN_INGRESS, NULL);
1070-
if (block)
1071-
xa_erase(&block->ports, dev->ifindex);
1072-
}
1073-
1074-
if (ops->egress_block_get) {
1075-
block = cops->tcf_block(qdisc, TC_H_MIN_EGRESS, NULL);
1076-
if (block)
1077-
xa_erase(&block->ports, dev->ifindex);
1078-
}
10791065

10801066
if (ops->destroy)
10811067
ops->destroy(qdisc);

0 commit comments

Comments
 (0)