| .. | .. |
|---|
| 845 | 845 | } |
|---|
| 846 | 846 | |
|---|
| 847 | 847 | 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 |
|---|
| 858 | 848 | hfsc_adjust_levels(struct hfsc_class *cl) |
|---|
| 859 | 849 | { |
|---|
| 860 | 850 | struct hfsc_class *p; |
|---|
| .. | .. |
|---|
| 936 | 926 | if (opt == NULL) |
|---|
| 937 | 927 | return -EINVAL; |
|---|
| 938 | 928 | |
|---|
| 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); |
|---|
| 940 | 931 | if (err < 0) |
|---|
| 941 | 932 | return err; |
|---|
| 942 | 933 | |
|---|
| .. | .. |
|---|
| 1076 | 1067 | qdisc_class_hash_insert(&q->clhash, &cl->cl_common); |
|---|
| 1077 | 1068 | list_add_tail(&cl->siblings, &parent->children); |
|---|
| 1078 | 1069 | if (parent->level == 0) |
|---|
| 1079 | | - hfsc_purge_queue(sch, parent); |
|---|
| 1070 | + qdisc_purge_queue(parent->qdisc); |
|---|
| 1080 | 1071 | hfsc_adjust_levels(parent); |
|---|
| 1081 | 1072 | sch_tree_unlock(sch); |
|---|
| 1082 | 1073 | |
|---|
| .. | .. |
|---|
| 1112 | 1103 | list_del(&cl->siblings); |
|---|
| 1113 | 1104 | hfsc_adjust_levels(cl->cl_parent); |
|---|
| 1114 | 1105 | |
|---|
| 1115 | | - hfsc_purge_queue(sch, cl); |
|---|
| 1106 | + qdisc_purge_queue(cl->qdisc); |
|---|
| 1116 | 1107 | qdisc_class_hash_remove(&q->clhash, &cl->cl_common); |
|---|
| 1117 | 1108 | |
|---|
| 1118 | 1109 | sch_tree_unlock(sch); |
|---|
| .. | .. |
|---|
| 1145 | 1136 | case TC_ACT_STOLEN: |
|---|
| 1146 | 1137 | case TC_ACT_TRAP: |
|---|
| 1147 | 1138 | *qerr = NET_XMIT_SUCCESS | __NET_XMIT_STOLEN; |
|---|
| 1148 | | - /* fall through */ |
|---|
| 1139 | + fallthrough; |
|---|
| 1149 | 1140 | case TC_ACT_SHOT: |
|---|
| 1150 | 1141 | return NULL; |
|---|
| 1151 | 1142 | } |
|---|
| .. | .. |
|---|
| 1310 | 1301 | if (cl->level == 0) |
|---|
| 1311 | 1302 | tcm->tcm_info = cl->qdisc->handle; |
|---|
| 1312 | 1303 | |
|---|
| 1313 | | - nest = nla_nest_start(skb, TCA_OPTIONS); |
|---|
| 1304 | + nest = nla_nest_start_noflag(skb, TCA_OPTIONS); |
|---|
| 1314 | 1305 | if (nest == NULL) |
|---|
| 1315 | 1306 | goto nla_put_failure; |
|---|
| 1316 | 1307 | if (hfsc_dump_curves(skb, cl) < 0) |
|---|
| .. | .. |
|---|
| 1328 | 1319 | { |
|---|
| 1329 | 1320 | struct hfsc_class *cl = (struct hfsc_class *)arg; |
|---|
| 1330 | 1321 | struct tc_hfsc_stats xstats; |
|---|
| 1322 | + __u32 qlen; |
|---|
| 1331 | 1323 | |
|---|
| 1332 | | - cl->qstats.backlog = cl->qdisc->qstats.backlog; |
|---|
| 1324 | + qdisc_qstats_qlen_backlog(cl->qdisc, &qlen, &cl->qstats.backlog); |
|---|
| 1333 | 1325 | xstats.level = cl->level; |
|---|
| 1334 | 1326 | xstats.period = cl->cl_vtperiod; |
|---|
| 1335 | 1327 | xstats.work = cl->cl_total; |
|---|
| .. | .. |
|---|
| 1337 | 1329 | |
|---|
| 1338 | 1330 | if (gnet_stats_copy_basic(qdisc_root_sleeping_running(sch), d, NULL, &cl->bstats) < 0 || |
|---|
| 1339 | 1331 | gnet_stats_copy_rate_est(d, &cl->rate_est) < 0 || |
|---|
| 1340 | | - gnet_stats_copy_queue(d, NULL, &cl->qstats, cl->qdisc->q.qlen) < 0) |
|---|
| 1332 | + gnet_stats_copy_queue(d, NULL, &cl->qstats, qlen) < 0) |
|---|
| 1341 | 1333 | return -1; |
|---|
| 1342 | 1334 | |
|---|
| 1343 | 1335 | return gnet_stats_copy_app(d, &xstats, sizeof(xstats)); |
|---|
| .. | .. |
|---|
| 1492 | 1484 | } |
|---|
| 1493 | 1485 | q->eligible = RB_ROOT; |
|---|
| 1494 | 1486 | qdisc_watchdog_cancel(&q->watchdog); |
|---|
| 1495 | | - sch->qstats.backlog = 0; |
|---|
| 1496 | | - sch->q.qlen = 0; |
|---|
| 1497 | 1487 | } |
|---|
| 1498 | 1488 | |
|---|
| 1499 | 1489 | static void |
|---|
| .. | .. |
|---|
| 1539 | 1529 | static int |
|---|
| 1540 | 1530 | hfsc_enqueue(struct sk_buff *skb, struct Qdisc *sch, struct sk_buff **to_free) |
|---|
| 1541 | 1531 | { |
|---|
| 1532 | + unsigned int len = qdisc_pkt_len(skb); |
|---|
| 1542 | 1533 | struct hfsc_class *cl; |
|---|
| 1543 | | - int uninitialized_var(err); |
|---|
| 1534 | + int err; |
|---|
| 1535 | + bool first; |
|---|
| 1544 | 1536 | |
|---|
| 1545 | 1537 | cl = hfsc_classify(skb, sch, &err); |
|---|
| 1546 | 1538 | if (cl == NULL) { |
|---|
| .. | .. |
|---|
| 1550 | 1542 | return err; |
|---|
| 1551 | 1543 | } |
|---|
| 1552 | 1544 | |
|---|
| 1545 | + first = !cl->qdisc->q.qlen; |
|---|
| 1553 | 1546 | err = qdisc_enqueue(skb, cl->qdisc, to_free); |
|---|
| 1554 | 1547 | if (unlikely(err != NET_XMIT_SUCCESS)) { |
|---|
| 1555 | 1548 | if (net_xmit_drop_count(err)) { |
|---|
| .. | .. |
|---|
| 1559 | 1552 | return err; |
|---|
| 1560 | 1553 | } |
|---|
| 1561 | 1554 | |
|---|
| 1562 | | - if (cl->qdisc->q.qlen == 1) { |
|---|
| 1563 | | - unsigned int len = qdisc_pkt_len(skb); |
|---|
| 1564 | | - |
|---|
| 1555 | + if (first) { |
|---|
| 1565 | 1556 | if (cl->cl_flags & HFSC_RSC) |
|---|
| 1566 | 1557 | init_ed(cl, len); |
|---|
| 1567 | 1558 | if (cl->cl_flags & HFSC_FSC) |
|---|
| .. | .. |
|---|
| 1576 | 1567 | |
|---|
| 1577 | 1568 | } |
|---|
| 1578 | 1569 | |
|---|
| 1579 | | - qdisc_qstats_backlog_inc(sch, skb); |
|---|
| 1570 | + sch->qstats.backlog += len; |
|---|
| 1580 | 1571 | sch->q.qlen++; |
|---|
| 1581 | 1572 | |
|---|
| 1582 | 1573 | return NET_XMIT_SUCCESS; |
|---|