hc
2024-10-22 8ac6c7a54ed1b98d142dce24b11c6de6a1e239a5
kernel/net/sched/sch_hfsc.c
....@@ -845,16 +845,6 @@
845845 }
846846
847847 static void
848
-hfsc_purge_queue(struct Qdisc *sch, struct hfsc_class *cl)
849
-{
850
- unsigned int len = cl->qdisc->q.qlen;
851
- unsigned int backlog = cl->qdisc->qstats.backlog;
852
-
853
- qdisc_reset(cl->qdisc);
854
- qdisc_tree_reduce_backlog(cl->qdisc, len, backlog);
855
-}
856
-
857
-static void
858848 hfsc_adjust_levels(struct hfsc_class *cl)
859849 {
860850 struct hfsc_class *p;
....@@ -936,7 +926,8 @@
936926 if (opt == NULL)
937927 return -EINVAL;
938928
939
- err = nla_parse_nested(tb, TCA_HFSC_MAX, opt, hfsc_policy, NULL);
929
+ err = nla_parse_nested_deprecated(tb, TCA_HFSC_MAX, opt, hfsc_policy,
930
+ NULL);
940931 if (err < 0)
941932 return err;
942933
....@@ -1021,6 +1012,10 @@
10211012 if (parent == NULL)
10221013 return -ENOENT;
10231014 }
1015
+ if (!(parent->cl_flags & HFSC_FSC) && parent != &q->root) {
1016
+ NL_SET_ERR_MSG(extack, "Invalid parent - parent class must have FSC");
1017
+ return -EINVAL;
1018
+ }
10241019
10251020 if (classid == 0 || TC_H_MAJ(classid ^ sch->handle) != 0)
10261021 return -EINVAL;
....@@ -1076,7 +1071,7 @@
10761071 qdisc_class_hash_insert(&q->clhash, &cl->cl_common);
10771072 list_add_tail(&cl->siblings, &parent->children);
10781073 if (parent->level == 0)
1079
- hfsc_purge_queue(sch, parent);
1074
+ qdisc_purge_queue(parent->qdisc);
10801075 hfsc_adjust_levels(parent);
10811076 sch_tree_unlock(sch);
10821077
....@@ -1112,7 +1107,7 @@
11121107 list_del(&cl->siblings);
11131108 hfsc_adjust_levels(cl->cl_parent);
11141109
1115
- hfsc_purge_queue(sch, cl);
1110
+ qdisc_purge_queue(cl->qdisc);
11161111 qdisc_class_hash_remove(&q->clhash, &cl->cl_common);
11171112
11181113 sch_tree_unlock(sch);
....@@ -1145,7 +1140,7 @@
11451140 case TC_ACT_STOLEN:
11461141 case TC_ACT_TRAP:
11471142 *qerr = NET_XMIT_SUCCESS | __NET_XMIT_STOLEN;
1148
- /* fall through */
1143
+ fallthrough;
11491144 case TC_ACT_SHOT:
11501145 return NULL;
11511146 }
....@@ -1310,7 +1305,7 @@
13101305 if (cl->level == 0)
13111306 tcm->tcm_info = cl->qdisc->handle;
13121307
1313
- nest = nla_nest_start(skb, TCA_OPTIONS);
1308
+ nest = nla_nest_start_noflag(skb, TCA_OPTIONS);
13141309 if (nest == NULL)
13151310 goto nla_put_failure;
13161311 if (hfsc_dump_curves(skb, cl) < 0)
....@@ -1328,8 +1323,9 @@
13281323 {
13291324 struct hfsc_class *cl = (struct hfsc_class *)arg;
13301325 struct tc_hfsc_stats xstats;
1326
+ __u32 qlen;
13311327
1332
- cl->qstats.backlog = cl->qdisc->qstats.backlog;
1328
+ qdisc_qstats_qlen_backlog(cl->qdisc, &qlen, &cl->qstats.backlog);
13331329 xstats.level = cl->level;
13341330 xstats.period = cl->cl_vtperiod;
13351331 xstats.work = cl->cl_total;
....@@ -1337,7 +1333,7 @@
13371333
13381334 if (gnet_stats_copy_basic(qdisc_root_sleeping_running(sch), d, NULL, &cl->bstats) < 0 ||
13391335 gnet_stats_copy_rate_est(d, &cl->rate_est) < 0 ||
1340
- gnet_stats_copy_queue(d, NULL, &cl->qstats, cl->qdisc->q.qlen) < 0)
1336
+ gnet_stats_copy_queue(d, NULL, &cl->qstats, qlen) < 0)
13411337 return -1;
13421338
13431339 return gnet_stats_copy_app(d, &xstats, sizeof(xstats));
....@@ -1492,8 +1488,6 @@
14921488 }
14931489 q->eligible = RB_ROOT;
14941490 qdisc_watchdog_cancel(&q->watchdog);
1495
- sch->qstats.backlog = 0;
1496
- sch->q.qlen = 0;
14971491 }
14981492
14991493 static void
....@@ -1539,8 +1533,10 @@
15391533 static int
15401534 hfsc_enqueue(struct sk_buff *skb, struct Qdisc *sch, struct sk_buff **to_free)
15411535 {
1536
+ unsigned int len = qdisc_pkt_len(skb);
15421537 struct hfsc_class *cl;
1543
- int uninitialized_var(err);
1538
+ int err;
1539
+ bool first;
15441540
15451541 cl = hfsc_classify(skb, sch, &err);
15461542 if (cl == NULL) {
....@@ -1550,6 +1546,7 @@
15501546 return err;
15511547 }
15521548
1549
+ first = !cl->qdisc->q.qlen;
15531550 err = qdisc_enqueue(skb, cl->qdisc, to_free);
15541551 if (unlikely(err != NET_XMIT_SUCCESS)) {
15551552 if (net_xmit_drop_count(err)) {
....@@ -1559,9 +1556,7 @@
15591556 return err;
15601557 }
15611558
1562
- if (cl->qdisc->q.qlen == 1) {
1563
- unsigned int len = qdisc_pkt_len(skb);
1564
-
1559
+ if (first) {
15651560 if (cl->cl_flags & HFSC_RSC)
15661561 init_ed(cl, len);
15671562 if (cl->cl_flags & HFSC_FSC)
....@@ -1576,7 +1571,7 @@
15761571
15771572 }
15781573
1579
- qdisc_qstats_backlog_inc(sch, skb);
1574
+ sch->qstats.backlog += len;
15801575 sch->q.qlen++;
15811576
15821577 return NET_XMIT_SUCCESS;