hc
2024-12-19 9370bb92b2d16684ee45cf24e879c93c509162da
kernel/net/sched/sch_prio.c
....@@ -1,10 +1,6 @@
1
+// SPDX-License-Identifier: GPL-2.0-or-later
12 /*
23 * net/sched/sch_prio.c Simple 3-band priority "scheduler".
3
- *
4
- * This program is free software; you can redistribute it and/or
5
- * modify it under the terms of the GNU General Public License
6
- * as published by the Free Software Foundation; either version
7
- * 2 of the License, or (at your option) any later version.
84 *
95 * Authors: Alexey Kuznetsov, <kuznet@ms2.inr.ac.ru>
106 * Fixes: 19990609: J Hadi Salim <hadi@nortelnetworks.com>:
....@@ -50,7 +46,7 @@
5046 case TC_ACT_QUEUED:
5147 case TC_ACT_TRAP:
5248 *qerr = NET_XMIT_SUCCESS | __NET_XMIT_STOLEN;
53
- /* fall through */
49
+ fallthrough;
5450 case TC_ACT_SHOT:
5551 return NULL;
5652 }
....@@ -72,6 +68,7 @@
7268 static int
7369 prio_enqueue(struct sk_buff *skb, struct Qdisc *sch, struct sk_buff **to_free)
7470 {
71
+ unsigned int len = qdisc_pkt_len(skb);
7572 struct Qdisc *qdisc;
7673 int ret;
7774
....@@ -88,7 +85,7 @@
8885
8986 ret = qdisc_enqueue(skb, qdisc, to_free);
9087 if (ret == NET_XMIT_SUCCESS) {
91
- qdisc_qstats_backlog_inc(sch, skb);
88
+ sch->qstats.backlog += len;
9289 sch->q.qlen++;
9390 return NET_XMIT_SUCCESS;
9491 }
....@@ -138,8 +135,6 @@
138135
139136 for (prio = 0; prio < q->bands; prio++)
140137 qdisc_reset(q->queues[prio]);
141
- sch->qstats.backlog = 0;
142
- sch->q.qlen = 0;
143138 }
144139
145140 static int prio_offload(struct Qdisc *sch, struct tc_prio_qopt *qopt)
....@@ -215,13 +210,8 @@
215210 q->bands = qopt->bands;
216211 memcpy(q->prio2band, qopt->priomap, TC_PRIO_MAX+1);
217212
218
- for (i = q->bands; i < oldbands; i++) {
219
- struct Qdisc *child = q->queues[i];
220
-
221
- qdisc_tree_reduce_backlog(child, child->q.qlen,
222
- child->qstats.backlog);
223
- qdisc_put(child);
224
- }
213
+ for (i = q->bands; i < oldbands; i++)
214
+ qdisc_tree_flush_backlog(q->queues[i]);
225215
226216 for (i = oldbands; i < q->bands; i++) {
227217 q->queues[i] = queues[i];
....@@ -230,6 +220,9 @@
230220 }
231221
232222 sch_tree_unlock(sch);
223
+
224
+ for (i = q->bands; i < oldbands; i++)
225
+ qdisc_put(q->queues[i]);
233226 return 0;
234227 }
235228
....@@ -251,7 +244,6 @@
251244
252245 static int prio_dump_offload(struct Qdisc *sch)
253246 {
254
- struct net_device *dev = qdisc_dev(sch);
255247 struct tc_prio_qopt_offload hw_stats = {
256248 .command = TC_PRIO_STATS,
257249 .handle = sch->handle,
....@@ -263,21 +255,8 @@
263255 },
264256 },
265257 };
266
- int err;
267258
268
- sch->flags &= ~TCQ_F_OFFLOADED;
269
- if (!tc_can_offload(dev) || !dev->netdev_ops->ndo_setup_tc)
270
- return 0;
271
-
272
- err = dev->netdev_ops->ndo_setup_tc(dev, TC_SETUP_QDISC_PRIO,
273
- &hw_stats);
274
- if (err == -EOPNOTSUPP)
275
- return 0;
276
-
277
- if (!err)
278
- sch->flags |= TCQ_F_OFFLOADED;
279
-
280
- return err;
259
+ return qdisc_offload_dump_helper(sch, TC_SETUP_QDISC_PRIO, &hw_stats);
281260 }
282261
283262 static int prio_dump(struct Qdisc *sch, struct sk_buff *skb)
....@@ -309,10 +288,7 @@
309288 {
310289 struct prio_sched_data *q = qdisc_priv(sch);
311290 struct tc_prio_qopt_offload graft_offload;
312
- struct net_device *dev = qdisc_dev(sch);
313291 unsigned long band = arg - 1;
314
- bool any_qdisc_is_offloaded;
315
- int err;
316292
317293 if (!new) {
318294 new = qdisc_create_dflt(sch->dev_queue, &pfifo_qdisc_ops,
....@@ -325,33 +301,15 @@
325301
326302 *old = qdisc_replace(sch, new, &q->queues[band]);
327303
328
- if (!tc_can_offload(dev))
329
- return 0;
330
-
331304 graft_offload.handle = sch->handle;
332305 graft_offload.parent = sch->parent;
333306 graft_offload.graft_params.band = band;
334307 graft_offload.graft_params.child_handle = new->handle;
335308 graft_offload.command = TC_PRIO_GRAFT;
336309
337
- err = dev->netdev_ops->ndo_setup_tc(dev, TC_SETUP_QDISC_PRIO,
338
- &graft_offload);
339
-
340
- /* Don't report error if the graft is part of destroy operation. */
341
- if (err && new != &noop_qdisc) {
342
- /* Don't report error if the parent, the old child and the new
343
- * one are not offloaded.
344
- */
345
- any_qdisc_is_offloaded = sch->flags & TCQ_F_OFFLOADED;
346
- any_qdisc_is_offloaded |= new->flags & TCQ_F_OFFLOADED;
347
- if (*old)
348
- any_qdisc_is_offloaded |= (*old)->flags &
349
- TCQ_F_OFFLOADED;
350
-
351
- if (any_qdisc_is_offloaded)
352
- NL_SET_ERR_MSG(extack, "Offloading graft operation failed.");
353
- }
354
-
310
+ qdisc_offload_graft_helper(qdisc_dev(sch), sch, new, *old,
311
+ TC_SETUP_QDISC_PRIO, &graft_offload,
312
+ extack);
355313 return 0;
356314 }
357315
....@@ -403,7 +361,7 @@
403361 cl_q = q->queues[cl - 1];
404362 if (gnet_stats_copy_basic(qdisc_root_sleeping_running(sch),
405363 d, cl_q->cpu_bstats, &cl_q->bstats) < 0 ||
406
- gnet_stats_copy_queue(d, NULL, &cl_q->qstats, cl_q->q.qlen) < 0)
364
+ qdisc_qstats_copy(d, cl_q) < 0)
407365 return -1;
408366
409367 return 0;