]> Git Repo - linux.git/blame - include/net/sch_generic.h
net/sched: Introduce tc block netdev tracking infra
[linux.git] / include / net / sch_generic.h
CommitLineData
b2441318 1/* SPDX-License-Identifier: GPL-2.0 */
1da177e4
LT
2#ifndef __NET_SCHED_GENERIC_H
3#define __NET_SCHED_GENERIC_H
4
1da177e4
LT
5#include <linux/netdevice.h>
6#include <linux/types.h>
7#include <linux/rcupdate.h>
1da177e4
LT
8#include <linux/pkt_sched.h>
9#include <linux/pkt_cls.h>
22e0f8b9 10#include <linux/percpu.h>
5772e9a3 11#include <linux/dynamic_queue_limits.h>
5bc17018 12#include <linux/list.h>
7b936405 13#include <linux/refcount.h>
7aa0045d 14#include <linux/workqueue.h>
c266f64d 15#include <linux/mutex.h>
4f8116c8 16#include <linux/rwsem.h>
97394bef 17#include <linux/atomic.h>
59eb87cb 18#include <linux/hashtable.h>
1da177e4 19#include <net/gen_stats.h>
be577ddc 20#include <net/rtnetlink.h>
a7323311 21#include <net/flow_offload.h>
913b47d3 22#include <linux/xarray.h>
1da177e4
LT
23
24struct Qdisc_ops;
25struct qdisc_walker;
26struct tcf_walker;
27struct module;
d58e468b 28struct bpf_flow_keys;
1da177e4 29
fd2c3ef7 30struct qdisc_rate_table {
1da177e4
LT
31 struct tc_ratespec rate;
32 u32 data[256];
33 struct qdisc_rate_table *next;
34 int refcnt;
35};
36
fd2c3ef7 37enum qdisc_state_t {
37437bb2 38 __QDISC_STATE_SCHED,
a9312ae8 39 __QDISC_STATE_DEACTIVATED,
a90c57f2 40 __QDISC_STATE_MISSED,
c4fef01b 41 __QDISC_STATE_DRAINING,
97604c65
ED
42};
43
44enum qdisc_state2_t {
29cbcd85
AD
45 /* Only for !TCQ_F_NOLOCK qdisc. Never access it directly.
46 * Use qdisc_run_begin/end() or qdisc_is_running() instead.
47 */
97604c65 48 __QDISC_STATE2_RUNNING,
e2627c8c
DM
49};
50
c4fef01b
YL
51#define QDISC_STATE_MISSED BIT(__QDISC_STATE_MISSED)
52#define QDISC_STATE_DRAINING BIT(__QDISC_STATE_DRAINING)
53
54#define QDISC_STATE_NON_EMPTY (QDISC_STATE_MISSED | \
55 QDISC_STATE_DRAINING)
56
175f9c1b 57struct qdisc_size_table {
a2da570d 58 struct rcu_head rcu;
175f9c1b
JK
59 struct list_head list;
60 struct tc_sizespec szopts;
61 int refcnt;
62 u16 data[];
63};
64
48da34b7
FW
65/* similar to sk_buff_head, but skb->prev pointer is undefined. */
66struct qdisc_skb_head {
67 struct sk_buff *head;
68 struct sk_buff *tail;
73eb628d 69 __u32 qlen;
48da34b7
FW
70 spinlock_t lock;
71};
72
fd2c3ef7 73struct Qdisc {
520ac30f
ED
74 int (*enqueue)(struct sk_buff *skb,
75 struct Qdisc *sch,
76 struct sk_buff **to_free);
77 struct sk_buff * (*dequeue)(struct Qdisc *sch);
05bdd2f1 78 unsigned int flags;
b00355db 79#define TCQ_F_BUILTIN 1
fd245a4a
ED
80#define TCQ_F_INGRESS 2
81#define TCQ_F_CAN_BYPASS 4
82#define TCQ_F_MQROOT 8
1abbe139
ED
83#define TCQ_F_ONETXQUEUE 0x10 /* dequeue_skb() can assume all skbs are for
84 * q->dev_queue : It can test
85 * netif_xmit_frozen_or_stopped() before
86 * dequeueing next packet.
87 * Its true for MQ/MQPRIO slaves, or non
88 * multiqueue device.
89 */
b00355db 90#define TCQ_F_WARN_NONWC (1 << 16)
22e0f8b9 91#define TCQ_F_CPUSTATS 0x20 /* run using percpu statistics */
4eaf3b84
ED
92#define TCQ_F_NOPARENT 0x40 /* root of its hierarchy :
93 * qdisc_tree_decrease_qlen() should stop.
94 */
49b49971 95#define TCQ_F_INVISIBLE 0x80 /* invisible by default in dump */
6b3ba914 96#define TCQ_F_NOLOCK 0x100 /* qdisc does not require locking */
7a4fa291 97#define TCQ_F_OFFLOADED 0x200 /* qdisc is offloaded to HW */
45203a3b 98 u32 limit;
05bdd2f1 99 const struct Qdisc_ops *ops;
a2da570d 100 struct qdisc_size_table __rcu *stab;
59cc1f61 101 struct hlist_node hash;
1da177e4
LT
102 u32 handle;
103 u32 parent;
72b25a91 104
5e140dfc 105 struct netdev_queue *dev_queue;
5e140dfc 106
1c0d32fd 107 struct net_rate_estimator __rcu *rate_est;
50dc9a85 108 struct gnet_stats_basic_sync __percpu *cpu_bstats;
0d32ef8c 109 struct gnet_stats_queue __percpu *cpu_qstats;
846e463a 110 int pad;
e9be0e99 111 refcount_t refcnt;
0d32ef8c 112
5e140dfc
ED
113 /*
114 * For performance sake on SMP, we put highly modified fields at the end
115 */
a53851e2 116 struct sk_buff_head gso_skb ____cacheline_aligned_in_smp;
48da34b7 117 struct qdisc_skb_head q;
50dc9a85 118 struct gnet_stats_basic_sync bstats;
0d32ef8c 119 struct gnet_stats_queue qstats;
4d202a0d 120 unsigned long state;
97604c65 121 unsigned long state2; /* must be written under qdisc spinlock */
4d202a0d 122 struct Qdisc *next_sched;
70e57d5e 123 struct sk_buff_head skb_bad_txq;
45203a3b
ED
124
125 spinlock_t busylock ____cacheline_aligned_in_smp;
96009c7d 126 spinlock_t seqlock;
28cff537 127
3a7d0d07 128 struct rcu_head rcu;
606509f2 129 netdevice_tracker dev_tracker;
846e463a
ED
130 /* private data */
131 long privdata[] ____cacheline_aligned;
1da177e4
LT
132};
133
551143d8
ED
134static inline void qdisc_refcount_inc(struct Qdisc *qdisc)
135{
136 if (qdisc->flags & TCQ_F_BUILTIN)
137 return;
138 refcount_inc(&qdisc->refcnt);
139}
140
84ad0af0
PY
141static inline bool qdisc_refcount_dec_if_one(struct Qdisc *qdisc)
142{
143 if (qdisc->flags & TCQ_F_BUILTIN)
144 return true;
145 return refcount_dec_if_one(&qdisc->refcnt);
146}
147
9d7e82ce
VB
148/* Intended to be used by unlocked users, when concurrent qdisc release is
149 * possible.
150 */
151
152static inline struct Qdisc *qdisc_refcount_inc_nz(struct Qdisc *qdisc)
153{
154 if (qdisc->flags & TCQ_F_BUILTIN)
155 return qdisc;
156 if (refcount_inc_not_zero(&qdisc->refcnt))
157 return qdisc;
158 return NULL;
159}
160
29cbcd85
AD
161/* For !TCQ_F_NOLOCK qdisc: callers must either call this within a qdisc
162 * root_lock section, or provide their own memory barriers -- ordering
163 * against qdisc_run_begin/end() atomic bit operations.
164 */
96009c7d 165static inline bool qdisc_is_running(struct Qdisc *qdisc)
bc135b23 166{
32f7b44d 167 if (qdisc->flags & TCQ_F_NOLOCK)
96009c7d 168 return spin_is_locked(&qdisc->seqlock);
97604c65 169 return test_bit(__QDISC_STATE2_RUNNING, &qdisc->state2);
bc135b23
ED
170}
171
c4fef01b
YL
172static inline bool nolock_qdisc_is_empty(const struct Qdisc *qdisc)
173{
174 return !(READ_ONCE(qdisc->state) & QDISC_STATE_NON_EMPTY);
175}
176
9c01c9f1
PA
177static inline bool qdisc_is_percpu_stats(const struct Qdisc *q)
178{
179 return q->flags & TCQ_F_CPUSTATS;
180}
181
28cff537
PA
182static inline bool qdisc_is_empty(const struct Qdisc *qdisc)
183{
9c01c9f1 184 if (qdisc_is_percpu_stats(qdisc))
d3e0f575 185 return nolock_qdisc_is_empty(qdisc);
90b2be27 186 return !READ_ONCE(qdisc->q.qlen);
28cff537
PA
187}
188
29cbcd85
AD
189/* For !TCQ_F_NOLOCK qdisc, qdisc_run_begin/end() must be invoked with
190 * the qdisc root lock acquired.
191 */
bc135b23
ED
192static inline bool qdisc_run_begin(struct Qdisc *qdisc)
193{
32f7b44d 194 if (qdisc->flags & TCQ_F_NOLOCK) {
a90c57f2 195 if (spin_trylock(&qdisc->seqlock))
d3e0f575 196 return true;
a90c57f2 197
a54ce370
VR
198 /* No need to insist if the MISSED flag was already set.
199 * Note that test_and_set_bit() also gives us memory ordering
200 * guarantees wrt potential earlier enqueue() and below
201 * spin_trylock(), both of which are necessary to prevent races
89837eb4 202 */
a54ce370 203 if (test_and_set_bit(__QDISC_STATE_MISSED, &qdisc->state))
a90c57f2
YL
204 return false;
205
a54ce370
VR
206 /* Try to take the lock again to make sure that we will either
207 * grab it or the CPU that still has it will see MISSED set
208 * when testing it in qdisc_run_end()
a90c57f2 209 */
d3e0f575 210 return spin_trylock(&qdisc->seqlock);
32f7b44d 211 }
97604c65 212 return !__test_and_set_bit(__QDISC_STATE2_RUNNING, &qdisc->state2);
bc135b23
ED
213}
214
215static inline void qdisc_run_end(struct Qdisc *qdisc)
216{
a90c57f2 217 if (qdisc->flags & TCQ_F_NOLOCK) {
96009c7d 218 spin_unlock(&qdisc->seqlock);
a90c57f2 219
2e8728c9
GF
220 /* spin_unlock() only has store-release semantic. The unlock
221 * and test_bit() ordering is a store-load ordering, so a full
222 * memory barrier is needed here.
223 */
224 smp_mb();
225
a90c57f2 226 if (unlikely(test_bit(__QDISC_STATE_MISSED,
c4fef01b 227 &qdisc->state)))
a90c57f2 228 __netif_schedule(qdisc);
dd25296a 229 } else {
97604c65 230 __clear_bit(__QDISC_STATE2_RUNNING, &qdisc->state2);
a90c57f2 231 }
fd245a4a
ED
232}
233
5772e9a3
JDB
234static inline bool qdisc_may_bulk(const struct Qdisc *qdisc)
235{
236 return qdisc->flags & TCQ_F_ONETXQUEUE;
237}
238
239static inline int qdisc_avail_bulklimit(const struct netdev_queue *txq)
240{
241#ifdef CONFIG_BQL
242 /* Non-BQL migrated drivers will return 0, too. */
243 return dql_avail(&txq->dql);
244#else
245 return 0;
246#endif
247}
248
fd2c3ef7 249struct Qdisc_class_ops {
dfcd2a2b 250 unsigned int flags;
1da177e4 251 /* Child qdisc manipulation */
926e61b7 252 struct netdev_queue * (*select_queue)(struct Qdisc *, struct tcmsg *);
1da177e4 253 int (*graft)(struct Qdisc *, unsigned long cl,
653d6fd6
AA
254 struct Qdisc *, struct Qdisc **,
255 struct netlink_ext_ack *extack);
1da177e4 256 struct Qdisc * (*leaf)(struct Qdisc *, unsigned long cl);
43effa1e 257 void (*qlen_notify)(struct Qdisc *, unsigned long);
1da177e4
LT
258
259 /* Class manipulation routines */
143976ce 260 unsigned long (*find)(struct Qdisc *, u32 classid);
1da177e4 261 int (*change)(struct Qdisc *, u32, u32,
793d81d6
AA
262 struct nlattr **, unsigned long *,
263 struct netlink_ext_ack *);
4dd78a73
MM
264 int (*delete)(struct Qdisc *, unsigned long,
265 struct netlink_ext_ack *);
1da177e4
LT
266 void (*walk)(struct Qdisc *, struct qdisc_walker * arg);
267
268 /* Filter manipulation */
0ac4bd68 269 struct tcf_block * (*tcf_block)(struct Qdisc *sch,
cbaacc4e
AA
270 unsigned long arg,
271 struct netlink_ext_ack *extack);
1da177e4
LT
272 unsigned long (*bind_tcf)(struct Qdisc *, unsigned long,
273 u32 classid);
274 void (*unbind_tcf)(struct Qdisc *, unsigned long);
275
276 /* rtnetlink specific */
277 int (*dump)(struct Qdisc *, unsigned long,
278 struct sk_buff *skb, struct tcmsg*);
279 int (*dump_stats)(struct Qdisc *, unsigned long,
280 struct gnet_dump *);
281};
282
dfcd2a2b
VB
283/* Qdisc_class_ops flag values */
284
285/* Implements API that doesn't require rtnl lock */
286enum qdisc_class_ops_flags {
287 QDISC_CLASS_OPS_DOIT_UNLOCKED = 1,
288};
289
fd2c3ef7 290struct Qdisc_ops {
1da177e4 291 struct Qdisc_ops *next;
20fea08b 292 const struct Qdisc_class_ops *cl_ops;
1da177e4
LT
293 char id[IFNAMSIZ];
294 int priv_size;
d59f5ffa 295 unsigned int static_flags;
1da177e4 296
520ac30f
ED
297 int (*enqueue)(struct sk_buff *skb,
298 struct Qdisc *sch,
299 struct sk_buff **to_free);
1da177e4 300 struct sk_buff * (*dequeue)(struct Qdisc *);
90d841fd 301 struct sk_buff * (*peek)(struct Qdisc *);
1da177e4 302
e63d7dfd
AA
303 int (*init)(struct Qdisc *sch, struct nlattr *arg,
304 struct netlink_ext_ack *extack);
1da177e4
LT
305 void (*reset)(struct Qdisc *);
306 void (*destroy)(struct Qdisc *);
0ac4bd68 307 int (*change)(struct Qdisc *sch,
2030721c
AA
308 struct nlattr *arg,
309 struct netlink_ext_ack *extack);
0ac4bd68 310 void (*attach)(struct Qdisc *sch);
48bfd55e 311 int (*change_tx_queue_len)(struct Qdisc *, unsigned int);
1e080f17
JK
312 void (*change_real_num_tx)(struct Qdisc *sch,
313 unsigned int new_real_tx);
1da177e4
LT
314
315 int (*dump)(struct Qdisc *, struct sk_buff *);
316 int (*dump_stats)(struct Qdisc *, struct gnet_dump *);
317
d47a6b0e
JP
318 void (*ingress_block_set)(struct Qdisc *sch,
319 u32 block_index);
320 void (*egress_block_set)(struct Qdisc *sch,
321 u32 block_index);
322 u32 (*ingress_block_get)(struct Qdisc *sch);
323 u32 (*egress_block_get)(struct Qdisc *sch);
324
1da177e4
LT
325 struct module *owner;
326};
327
fd2c3ef7 328struct tcf_result {
db50514f
JP
329 union {
330 struct {
331 unsigned long class;
332 u32 classid;
333 };
334 const struct tcf_proto *goto_tp;
335 };
1da177e4
LT
336};
337
9f407f17
JP
338struct tcf_chain;
339
fd2c3ef7 340struct tcf_proto_ops {
36272874 341 struct list_head head;
1da177e4
LT
342 char kind[IFNAMSIZ];
343
dc7f9f6e
ED
344 int (*classify)(struct sk_buff *,
345 const struct tcf_proto *,
346 struct tcf_result *);
1da177e4 347 int (*init)(struct tcf_proto*);
12db03b6 348 void (*destroy)(struct tcf_proto *tp, bool rtnl_held,
715df5ec 349 struct netlink_ext_ack *extack);
1da177e4 350
8113c095 351 void* (*get)(struct tcf_proto*, u32 handle);
7d5509fa 352 void (*put)(struct tcf_proto *tp, void *f);
c1b52739 353 int (*change)(struct net *net, struct sk_buff *,
af4c6641 354 struct tcf_proto*, unsigned long,
add93b61 355 u32 handle, struct nlattr **,
695176bf 356 void **, u32,
7306db38 357 struct netlink_ext_ack *);
8865fdd4 358 int (*delete)(struct tcf_proto *tp, void *arg,
12db03b6 359 bool *last, bool rtnl_held,
571acf21 360 struct netlink_ext_ack *);
a5b72a08 361 bool (*delete_empty)(struct tcf_proto *tp);
12db03b6
VB
362 void (*walk)(struct tcf_proto *tp,
363 struct tcf_walker *arg, bool rtnl_held);
e56185c7 364 int (*reoffload)(struct tcf_proto *tp, bool add,
a7323311 365 flow_setup_cb_t *cb, void *cb_priv,
e56185c7 366 struct netlink_ext_ack *extack);
a449a3e7
VB
367 void (*hw_add)(struct tcf_proto *tp,
368 void *type_data);
369 void (*hw_del)(struct tcf_proto *tp,
370 void *type_data);
2e24cd75
CW
371 void (*bind_class)(void *, u32, unsigned long,
372 void *, unsigned long);
9f407f17
JP
373 void * (*tmplt_create)(struct net *net,
374 struct tcf_chain *chain,
375 struct nlattr **tca,
376 struct netlink_ext_ack *extack);
377 void (*tmplt_destroy)(void *tmplt_priv);
80cd22c3
PB
378 struct tcf_exts * (*get_exts)(const struct tcf_proto *tp,
379 u32 handle);
1da177e4
LT
380
381 /* rtnetlink specific */
8113c095 382 int (*dump)(struct net*, struct tcf_proto*, void *,
12db03b6
VB
383 struct sk_buff *skb, struct tcmsg*,
384 bool);
f8ab1807
VB
385 int (*terse_dump)(struct net *net,
386 struct tcf_proto *tp, void *fh,
387 struct sk_buff *skb,
388 struct tcmsg *t, bool rtnl_held);
9f407f17
JP
389 int (*tmplt_dump)(struct sk_buff *skb,
390 struct net *net,
391 void *tmplt_priv);
1da177e4
LT
392
393 struct module *owner;
12db03b6
VB
394 int flags;
395};
396
a5b72a08
DC
397/* Classifiers setting TCF_PROTO_OPS_DOIT_UNLOCKED in tcf_proto_ops->flags
398 * are expected to implement tcf_proto_ops->delete_empty(), otherwise race
399 * conditions can occur when filters are inserted/deleted simultaneously.
400 */
12db03b6
VB
401enum tcf_proto_ops_flags {
402 TCF_PROTO_OPS_DOIT_UNLOCKED = 1,
1da177e4
LT
403};
404
fd2c3ef7 405struct tcf_proto {
1da177e4 406 /* Fast access part */
25d8c0d5
JF
407 struct tcf_proto __rcu *next;
408 void __rcu *root;
7fd4b288
PA
409
410 /* called under RCU BH lock*/
dc7f9f6e
ED
411 int (*classify)(struct sk_buff *,
412 const struct tcf_proto *,
413 struct tcf_result *);
66c6f529 414 __be16 protocol;
1da177e4
LT
415
416 /* All the rest */
417 u32 prio;
1da177e4 418 void *data;
dc7f9f6e 419 const struct tcf_proto_ops *ops;
5bc17018 420 struct tcf_chain *chain;
8b64678e
VB
421 /* Lock protects tcf_proto shared state and can be used by unlocked
422 * classifiers to protect their private data.
423 */
424 spinlock_t lock;
425 bool deleting;
4dbfa766 426 refcount_t refcnt;
25d8c0d5 427 struct rcu_head rcu;
59eb87cb 428 struct hlist_node destroy_ht_node;
1da177e4
LT
429};
430
175f9c1b 431struct qdisc_skb_cb {
089b19a9
SF
432 struct {
433 unsigned int pkt_len;
434 u16 slave_dev_queue_mapping;
435 u16 tc_classid;
d58e468b 436 };
25711786
ED
437#define QDISC_CB_PRIV_LEN 20
438 unsigned char data[QDISC_CB_PRIV_LEN];
175f9c1b
JK
439};
440
c7eb7d72
JP
441typedef void tcf_chain_head_change_t(struct tcf_proto *tp_head, void *priv);
442
2190d1d0 443struct tcf_chain {
ed76f5ed
VB
444 /* Protects filter_chain. */
445 struct mutex filter_chain_lock;
2190d1d0 446 struct tcf_proto __rcu *filter_chain;
5bc17018
JP
447 struct list_head list;
448 struct tcf_block *block;
449 u32 index; /* chain index */
450 unsigned int refcnt;
1f3ed383 451 unsigned int action_refcnt;
32a4f5ec 452 bool explicitly_created;
726d0612 453 bool flushing;
9f407f17
JP
454 const struct tcf_proto_ops *tmplt_ops;
455 void *tmplt_priv;
ee3bbfe8 456 struct rcu_head rcu;
6529eaba
JP
457};
458
2190d1d0 459struct tcf_block {
913b47d3 460 struct xarray ports; /* datapath accessible */
c266f64d
VB
461 /* Lock protects tcf_block and lifetime-management data of chains
462 * attached to the block (refcnt, action_refcnt, explicitly_created).
463 */
464 struct mutex lock;
5bc17018 465 struct list_head chain_list;
48617387 466 u32 index; /* block index for shared blocks */
a7df4870 467 u32 classid; /* which class this block belongs to */
cfebd7e2 468 refcount_t refcnt;
855319be 469 struct net *net;
69d78ef2 470 struct Qdisc *q;
4f8116c8 471 struct rw_semaphore cb_lock; /* protects cb_list and offload counters */
14bfb13f 472 struct flow_block flow_block;
f36fe1c4
JP
473 struct list_head owner_list;
474 bool keep_dst;
97394bef 475 atomic_t offloadcnt; /* Number of oddloaded filters */
caa72601 476 unsigned int nooffloaddevcnt; /* Number of devs unable to do offload */
c9f14470 477 unsigned int lockeddevcnt; /* Number of devs that require rtnl lock. */
f71e0ca4
JP
478 struct {
479 struct tcf_chain *chain;
480 struct list_head filter_chain_list;
481 } chain0;
0607e439 482 struct rcu_head rcu;
59eb87cb
JH
483 DECLARE_HASHTABLE(proto_destroy_ht, 7);
484 struct mutex proto_destroy_lock; /* Lock for proto_destroy hashtable. */
2190d1d0
JP
485};
486
ed76f5ed
VB
487static inline bool lockdep_tcf_chain_is_locked(struct tcf_chain *chain)
488{
489 return lockdep_is_held(&chain->filter_chain_lock);
490}
8b64678e
VB
491
492static inline bool lockdep_tcf_proto_is_locked(struct tcf_proto *tp)
493{
494 return lockdep_is_held(&tp->lock);
495}
ed76f5ed
VB
496
497#define tcf_chain_dereference(p, chain) \
498 rcu_dereference_protected(p, lockdep_tcf_chain_is_locked(chain))
499
8b64678e
VB
500#define tcf_proto_dereference(p, tp) \
501 rcu_dereference_protected(p, lockdep_tcf_proto_is_locked(tp))
502
16bda13d
DM
503static inline void qdisc_cb_private_validate(const struct sk_buff *skb, int sz)
504{
505 struct qdisc_skb_cb *qcb;
5ee31c68 506
038ebb1a 507 BUILD_BUG_ON(sizeof(skb->cb) < sizeof(*qcb));
16bda13d
DM
508 BUILD_BUG_ON(sizeof(qcb->data) < sz);
509}
510
05bdd2f1 511static inline int qdisc_qlen(const struct Qdisc *q)
bbd8a0d3
KK
512{
513 return q->q.qlen;
514}
515
73eb628d 516static inline int qdisc_qlen_sum(const struct Qdisc *q)
7e66016f 517{
73eb628d
PA
518 __u32 qlen = q->qstats.qlen;
519 int i;
7e66016f 520
73eb628d
PA
521 if (qdisc_is_percpu_stats(q)) {
522 for_each_possible_cpu(i)
523 qlen += per_cpu_ptr(q->cpu_qstats, i)->qlen;
524 } else {
6172abc1 525 qlen += q->q.qlen;
73eb628d 526 }
7e66016f
JF
527
528 return qlen;
529}
530
bfe0d029 531static inline struct qdisc_skb_cb *qdisc_skb_cb(const struct sk_buff *skb)
175f9c1b
JK
532{
533 return (struct qdisc_skb_cb *)skb->cb;
534}
535
83874000
DM
536static inline spinlock_t *qdisc_lock(struct Qdisc *qdisc)
537{
538 return &qdisc->q.lock;
539}
540
05bdd2f1 541static inline struct Qdisc *qdisc_root(const struct Qdisc *qdisc)
7698b4fc 542{
46e5da40
JF
543 struct Qdisc *q = rcu_dereference_rtnl(qdisc->dev_queue->qdisc);
544
545 return q;
7698b4fc
DM
546}
547
159d2c7d
ED
548static inline struct Qdisc *qdisc_root_bh(const struct Qdisc *qdisc)
549{
550 return rcu_dereference_bh(qdisc->dev_queue->qdisc);
551}
552
05bdd2f1 553static inline struct Qdisc *qdisc_root_sleeping(const struct Qdisc *qdisc)
2540e051 554{
d636fc5d 555 return rcu_dereference_rtnl(qdisc->dev_queue->qdisc_sleeping);
2540e051
JP
556}
557
05bdd2f1 558static inline spinlock_t *qdisc_root_sleeping_lock(const struct Qdisc *qdisc)
f6f9b93f
JP
559{
560 struct Qdisc *root = qdisc_root_sleeping(qdisc);
561
562 ASSERT_RTNL();
563 return qdisc_lock(root);
564}
565
05bdd2f1 566static inline struct net_device *qdisc_dev(const struct Qdisc *qdisc)
5ce2d488
DM
567{
568 return qdisc->dev_queue->dev;
569}
1da177e4 570
ca1e4ab1 571static inline void sch_tree_lock(struct Qdisc *q)
78a5b30b 572{
ca1e4ab1
MM
573 if (q->flags & TCQ_F_MQROOT)
574 spin_lock_bh(qdisc_lock(q));
575 else
576 spin_lock_bh(qdisc_root_sleeping_lock(q));
78a5b30b
DM
577}
578
ca1e4ab1 579static inline void sch_tree_unlock(struct Qdisc *q)
78a5b30b 580{
ca1e4ab1
MM
581 if (q->flags & TCQ_F_MQROOT)
582 spin_unlock_bh(qdisc_lock(q));
583 else
584 spin_unlock_bh(qdisc_root_sleeping_lock(q));
78a5b30b
DM
585}
586
e41a33e6
TG
587extern struct Qdisc noop_qdisc;
588extern struct Qdisc_ops noop_qdisc_ops;
6ec1c69a 589extern struct Qdisc_ops pfifo_fast_ops;
5579ee46 590extern const u8 sch_default_prio2band[TC_PRIO_MAX + 1];
6ec1c69a 591extern struct Qdisc_ops mq_qdisc_ops;
d66d6c31 592extern struct Qdisc_ops noqueue_qdisc_ops;
6da7c8fc 593extern const struct Qdisc_ops *default_qdisc_ops;
1f27cde3
ED
594static inline const struct Qdisc_ops *
595get_default_qdisc_ops(const struct net_device *dev, int ntx)
596{
597 return ntx < dev->real_num_tx_queues ?
598 default_qdisc_ops : &pfifo_fast_ops;
599}
e41a33e6 600
fd2c3ef7 601struct Qdisc_class_common {
6fe1c7a5 602 u32 classid;
8798481b 603 unsigned int filter_cnt;
6fe1c7a5
PM
604 struct hlist_node hnode;
605};
606
fd2c3ef7 607struct Qdisc_class_hash {
6fe1c7a5
PM
608 struct hlist_head *hash;
609 unsigned int hashsize;
610 unsigned int hashmask;
611 unsigned int hashelems;
612};
613
614static inline unsigned int qdisc_class_hash(u32 id, u32 mask)
615{
616 id ^= id >> 8;
617 id ^= id >> 4;
618 return id & mask;
619}
620
621static inline struct Qdisc_class_common *
05bdd2f1 622qdisc_class_find(const struct Qdisc_class_hash *hash, u32 id)
6fe1c7a5
PM
623{
624 struct Qdisc_class_common *cl;
6fe1c7a5
PM
625 unsigned int h;
626
7d3f0cd4
GF
627 if (!id)
628 return NULL;
629
6fe1c7a5 630 h = qdisc_class_hash(id, hash->hashmask);
b67bfe0d 631 hlist_for_each_entry(cl, &hash->hash[h], hnode) {
6fe1c7a5
PM
632 if (cl->classid == id)
633 return cl;
634 }
635 return NULL;
636}
637
8798481b
PT
638static inline bool qdisc_class_in_use(const struct Qdisc_class_common *cl)
639{
640 return cl->filter_cnt > 0;
641}
642
643static inline void qdisc_class_get(struct Qdisc_class_common *cl)
644{
645 unsigned int res;
646
647 if (check_add_overflow(cl->filter_cnt, 1, &res))
648 WARN(1, "Qdisc class overflow");
649
650 cl->filter_cnt = res;
651}
652
653static inline void qdisc_class_put(struct Qdisc_class_common *cl)
654{
655 unsigned int res;
656
657 if (check_sub_overflow(cl->filter_cnt, 1, &res))
658 WARN(1, "Qdisc class underflow");
659
660 cl->filter_cnt = res;
661}
662
384c181e
AN
663static inline int tc_classid_to_hwtc(struct net_device *dev, u32 classid)
664{
665 u32 hwtc = TC_H_MIN(classid) - TC_H_MIN_PRIORITY;
666
667 return (hwtc < netdev_get_num_tc(dev)) ? hwtc : -EINVAL;
668}
669
5c15257f
JP
670int qdisc_class_hash_init(struct Qdisc_class_hash *);
671void qdisc_class_hash_insert(struct Qdisc_class_hash *,
672 struct Qdisc_class_common *);
673void qdisc_class_hash_remove(struct Qdisc_class_hash *,
674 struct Qdisc_class_common *);
675void qdisc_class_hash_grow(struct Qdisc *, struct Qdisc_class_hash *);
676void qdisc_class_hash_destroy(struct Qdisc_class_hash *);
677
48bfd55e 678int dev_qdisc_change_tx_queue_len(struct net_device *dev);
1e080f17
JK
679void dev_qdisc_change_real_num_tx(struct net_device *dev,
680 unsigned int new_real_tx);
5c15257f
JP
681void dev_init_scheduler(struct net_device *dev);
682void dev_shutdown(struct net_device *dev);
683void dev_activate(struct net_device *dev);
684void dev_deactivate(struct net_device *dev);
685void dev_deactivate_many(struct list_head *head);
686struct Qdisc *dev_graft_qdisc(struct netdev_queue *dev_queue,
687 struct Qdisc *qdisc);
688void qdisc_reset(struct Qdisc *qdisc);
84ad0af0 689void qdisc_destroy(struct Qdisc *qdisc);
86bd446b 690void qdisc_put(struct Qdisc *qdisc);
3a7d0d07 691void qdisc_put_unlocked(struct Qdisc *qdisc);
5f2939d9 692void qdisc_tree_reduce_backlog(struct Qdisc *qdisc, int n, int len);
b592843c
JK
693#ifdef CONFIG_NET_SCHED
694int qdisc_offload_dump_helper(struct Qdisc *q, enum tc_setup_type type,
695 void *type_data);
bfaee911
JK
696void qdisc_offload_graft_helper(struct net_device *dev, struct Qdisc *sch,
697 struct Qdisc *new, struct Qdisc *old,
698 enum tc_setup_type type, void *type_data,
699 struct netlink_ext_ack *extack);
b592843c
JK
700#else
701static inline int
702qdisc_offload_dump_helper(struct Qdisc *q, enum tc_setup_type type,
703 void *type_data)
704{
705 q->flags &= ~TCQ_F_OFFLOADED;
706 return 0;
707}
bfaee911
JK
708
709static inline void
710qdisc_offload_graft_helper(struct net_device *dev, struct Qdisc *sch,
711 struct Qdisc *new, struct Qdisc *old,
712 enum tc_setup_type type, void *type_data,
713 struct netlink_ext_ack *extack)
714{
715}
b592843c 716#endif
aac4daa8
VO
717void qdisc_offload_query_caps(struct net_device *dev,
718 enum tc_setup_type type,
719 void *caps, size_t caps_len);
5c15257f 720struct Qdisc *qdisc_alloc(struct netdev_queue *dev_queue,
d0bd684d
AA
721 const struct Qdisc_ops *ops,
722 struct netlink_ext_ack *extack);
81d947e2 723void qdisc_free(struct Qdisc *qdisc);
5c15257f 724struct Qdisc *qdisc_create_dflt(struct netdev_queue *dev_queue,
a38a9882
AA
725 const struct Qdisc_ops *ops, u32 parentid,
726 struct netlink_ext_ack *extack);
5c15257f
JP
727void __qdisc_calculate_pkt_len(struct sk_buff *skb,
728 const struct qdisc_size_table *stab);
27b29f63 729int skb_do_redirect(struct sk_buff *);
1da177e4 730
fdc5432a
DB
731static inline bool skb_at_tc_ingress(const struct sk_buff *skb)
732{
e420bed0 733#ifdef CONFIG_NET_XGRESS
8dc07fdb 734 return skb->tc_at_ingress;
fdc5432a
DB
735#else
736 return false;
737#endif
738}
739
e7246e12
WB
740static inline bool skb_skip_tc_classify(struct sk_buff *skb)
741{
742#ifdef CONFIG_NET_CLS_ACT
743 if (skb->tc_skip_classify) {
744 skb->tc_skip_classify = 0;
745 return true;
746 }
747#endif
748 return false;
749}
750
3a053b1a 751/* Reset all TX qdiscs greater than index of a device. */
f0796d5c 752static inline void qdisc_reset_all_tx_gt(struct net_device *dev, unsigned int i)
5aa70995 753{
4ef6acff
JF
754 struct Qdisc *qdisc;
755
f0796d5c 756 for (; i < dev->num_tx_queues; i++) {
46e5da40 757 qdisc = rtnl_dereference(netdev_get_tx_queue(dev, i)->qdisc);
4ef6acff
JF
758 if (qdisc) {
759 spin_lock_bh(qdisc_lock(qdisc));
760 qdisc_reset(qdisc);
761 spin_unlock_bh(qdisc_lock(qdisc));
762 }
763 }
5aa70995
DM
764}
765
3e745dd6
DM
766/* Are all TX queues of the device empty? */
767static inline bool qdisc_all_tx_empty(const struct net_device *dev)
768{
e8a0464c 769 unsigned int i;
46e5da40
JF
770
771 rcu_read_lock();
e8a0464c
DM
772 for (i = 0; i < dev->num_tx_queues; i++) {
773 struct netdev_queue *txq = netdev_get_tx_queue(dev, i);
46e5da40 774 const struct Qdisc *q = rcu_dereference(txq->qdisc);
3e745dd6 775
1f5e6fdd 776 if (!qdisc_is_empty(q)) {
46e5da40 777 rcu_read_unlock();
e8a0464c 778 return false;
46e5da40 779 }
e8a0464c 780 }
46e5da40 781 rcu_read_unlock();
e8a0464c 782 return true;
3e745dd6
DM
783}
784
6fa9864b 785/* Are any of the TX qdiscs changing? */
05bdd2f1 786static inline bool qdisc_tx_changing(const struct net_device *dev)
6fa9864b 787{
e8a0464c 788 unsigned int i;
46e5da40 789
e8a0464c
DM
790 for (i = 0; i < dev->num_tx_queues; i++) {
791 struct netdev_queue *txq = netdev_get_tx_queue(dev, i);
d636fc5d
ED
792
793 if (rcu_access_pointer(txq->qdisc) !=
794 rcu_access_pointer(txq->qdisc_sleeping))
e8a0464c
DM
795 return true;
796 }
797 return false;
6fa9864b
DM
798}
799
e8a0464c 800/* Is the device using the noop qdisc on all queues? */
05297949
DM
801static inline bool qdisc_tx_is_noop(const struct net_device *dev)
802{
e8a0464c 803 unsigned int i;
46e5da40 804
e8a0464c
DM
805 for (i = 0; i < dev->num_tx_queues; i++) {
806 struct netdev_queue *txq = netdev_get_tx_queue(dev, i);
46e5da40 807 if (rcu_access_pointer(txq->qdisc) != &noop_qdisc)
e8a0464c
DM
808 return false;
809 }
810 return true;
05297949
DM
811}
812
bfe0d029 813static inline unsigned int qdisc_pkt_len(const struct sk_buff *skb)
0abf77e5 814{
175f9c1b 815 return qdisc_skb_cb(skb)->pkt_len;
0abf77e5
JK
816}
817
c27f339a 818/* additional qdisc xmit flags (NET_XMIT_MASK in linux/netdevice.h) */
378a2f09
JP
819enum net_xmit_qdisc_t {
820 __NET_XMIT_STOLEN = 0x00010000,
c27f339a 821 __NET_XMIT_BYPASS = 0x00020000,
378a2f09
JP
822};
823
c27f339a 824#ifdef CONFIG_NET_CLS_ACT
378a2f09 825#define net_xmit_drop_count(e) ((e) & __NET_XMIT_STOLEN ? 0 : 1)
378a2f09
JP
826#else
827#define net_xmit_drop_count(e) (1)
828#endif
829
a2da570d
ED
830static inline void qdisc_calculate_pkt_len(struct sk_buff *skb,
831 const struct Qdisc *sch)
5f86173b 832{
3a682fbd 833#ifdef CONFIG_NET_SCHED
a2da570d
ED
834 struct qdisc_size_table *stab = rcu_dereference_bh(sch->stab);
835
836 if (stab)
837 __qdisc_calculate_pkt_len(skb, stab);
3a682fbd 838#endif
a2da570d
ED
839}
840
ac5c66f2 841static inline int qdisc_enqueue(struct sk_buff *skb, struct Qdisc *sch,
520ac30f 842 struct sk_buff **to_free)
a2da570d
ED
843{
844 qdisc_calculate_pkt_len(skb, sch);
ac5c66f2 845 return sch->enqueue(skb, sch, to_free);
5f86173b
JK
846}
847
50dc9a85 848static inline void _bstats_update(struct gnet_stats_basic_sync *bstats,
38040702
AV
849 __u64 bytes, __u32 packets)
850{
67c9e627 851 u64_stats_update_begin(&bstats->syncp);
50dc9a85
AD
852 u64_stats_add(&bstats->bytes, bytes);
853 u64_stats_add(&bstats->packets, packets);
67c9e627 854 u64_stats_update_end(&bstats->syncp);
38040702
AV
855}
856
50dc9a85 857static inline void bstats_update(struct gnet_stats_basic_sync *bstats,
bfe0d029
ED
858 const struct sk_buff *skb)
859{
38040702
AV
860 _bstats_update(bstats,
861 qdisc_pkt_len(skb),
862 skb_is_gso(skb) ? skb_shinfo(skb)->gso_segs : 1);
863}
864
24ea591d
ED
865static inline void qdisc_bstats_cpu_update(struct Qdisc *sch,
866 const struct sk_buff *skb)
867{
50dc9a85 868 bstats_update(this_cpu_ptr(sch->cpu_bstats), skb);
24ea591d
ED
869}
870
bfe0d029
ED
871static inline void qdisc_bstats_update(struct Qdisc *sch,
872 const struct sk_buff *skb)
bbd8a0d3 873{
bfe0d029 874 bstats_update(&sch->bstats, skb);
bbd8a0d3
KK
875}
876
25331d6c
JF
877static inline void qdisc_qstats_backlog_dec(struct Qdisc *sch,
878 const struct sk_buff *skb)
879{
880 sch->qstats.backlog -= qdisc_pkt_len(skb);
881}
882
40bd0362
JF
883static inline void qdisc_qstats_cpu_backlog_dec(struct Qdisc *sch,
884 const struct sk_buff *skb)
885{
886 this_cpu_sub(sch->cpu_qstats->backlog, qdisc_pkt_len(skb));
887}
888
25331d6c
JF
889static inline void qdisc_qstats_backlog_inc(struct Qdisc *sch,
890 const struct sk_buff *skb)
891{
892 sch->qstats.backlog += qdisc_pkt_len(skb);
893}
894
40bd0362
JF
895static inline void qdisc_qstats_cpu_backlog_inc(struct Qdisc *sch,
896 const struct sk_buff *skb)
897{
898 this_cpu_add(sch->cpu_qstats->backlog, qdisc_pkt_len(skb));
899}
900
73eb628d 901static inline void qdisc_qstats_cpu_qlen_inc(struct Qdisc *sch)
40bd0362 902{
73eb628d 903 this_cpu_inc(sch->cpu_qstats->qlen);
40bd0362
JF
904}
905
73eb628d 906static inline void qdisc_qstats_cpu_qlen_dec(struct Qdisc *sch)
40bd0362 907{
73eb628d 908 this_cpu_dec(sch->cpu_qstats->qlen);
40bd0362
JF
909}
910
911static inline void qdisc_qstats_cpu_requeues_inc(struct Qdisc *sch)
912{
913 this_cpu_inc(sch->cpu_qstats->requeues);
914}
915
25331d6c
JF
916static inline void __qdisc_qstats_drop(struct Qdisc *sch, int count)
917{
918 sch->qstats.drops += count;
919}
920
24ea591d 921static inline void qstats_drop_inc(struct gnet_stats_queue *qstats)
25331d6c 922{
24ea591d 923 qstats->drops++;
25331d6c
JF
924}
925
24ea591d 926static inline void qstats_overlimit_inc(struct gnet_stats_queue *qstats)
b0ab6f92 927{
24ea591d
ED
928 qstats->overlimits++;
929}
b0ab6f92 930
24ea591d
ED
931static inline void qdisc_qstats_drop(struct Qdisc *sch)
932{
933 qstats_drop_inc(&sch->qstats);
934}
935
936static inline void qdisc_qstats_cpu_drop(struct Qdisc *sch)
937{
eb60a8dd 938 this_cpu_inc(sch->cpu_qstats->drops);
b0ab6f92
JF
939}
940
25331d6c
JF
941static inline void qdisc_qstats_overlimit(struct Qdisc *sch)
942{
943 sch->qstats.overlimits++;
944}
945
5dd431b6
PA
946static inline int qdisc_qstats_copy(struct gnet_dump *d, struct Qdisc *sch)
947{
948 __u32 qlen = qdisc_qlen_sum(sch);
949
950 return gnet_stats_copy_queue(d, sch->cpu_qstats, &sch->qstats, qlen);
951}
952
953static inline void qdisc_qstats_qlen_backlog(struct Qdisc *sch, __u32 *qlen,
954 __u32 *backlog)
955{
956 struct gnet_stats_queue qstats = { 0 };
5dd431b6 957
10940eb7
SAS
958 gnet_stats_add_queue(&qstats, sch->cpu_qstats, &sch->qstats);
959 *qlen = qstats.qlen + qdisc_qlen(sch);
5dd431b6
PA
960 *backlog = qstats.backlog;
961}
962
e5f0e8f8
PA
963static inline void qdisc_tree_flush_backlog(struct Qdisc *sch)
964{
965 __u32 qlen, backlog;
966
967 qdisc_qstats_qlen_backlog(sch, &qlen, &backlog);
968 qdisc_tree_reduce_backlog(sch, qlen, backlog);
969}
970
971static inline void qdisc_purge_queue(struct Qdisc *sch)
972{
973 __u32 qlen, backlog;
974
975 qdisc_qstats_qlen_backlog(sch, &qlen, &backlog);
976 qdisc_reset(sch);
977 qdisc_tree_reduce_backlog(sch, qlen, backlog);
978}
979
aea890b8
DM
980static inline void __qdisc_enqueue_tail(struct sk_buff *skb,
981 struct qdisc_skb_head *qh)
9972b25d 982{
48da34b7
FW
983 struct sk_buff *last = qh->tail;
984
985 if (last) {
986 skb->next = NULL;
987 last->next = skb;
988 qh->tail = skb;
989 } else {
990 qh->tail = skb;
991 qh->head = skb;
992 }
993 qh->qlen++;
9972b25d
TG
994}
995
996static inline int qdisc_enqueue_tail(struct sk_buff *skb, struct Qdisc *sch)
997{
aea890b8
DM
998 __qdisc_enqueue_tail(skb, &sch->q);
999 qdisc_qstats_backlog_inc(sch, skb);
1000 return NET_XMIT_SUCCESS;
9972b25d
TG
1001}
1002
59697730
DM
1003static inline void __qdisc_enqueue_head(struct sk_buff *skb,
1004 struct qdisc_skb_head *qh)
1005{
1006 skb->next = qh->head;
1007
1008 if (!qh->head)
1009 qh->tail = skb;
1010 qh->head = skb;
1011 qh->qlen++;
1012}
1013
48da34b7 1014static inline struct sk_buff *__qdisc_dequeue_head(struct qdisc_skb_head *qh)
9972b25d 1015{
48da34b7
FW
1016 struct sk_buff *skb = qh->head;
1017
1018 if (likely(skb != NULL)) {
1019 qh->head = skb->next;
1020 qh->qlen--;
1021 if (qh->head == NULL)
1022 qh->tail = NULL;
1023 skb->next = NULL;
1024 }
9972b25d 1025
ec323368
FW
1026 return skb;
1027}
1028
1029static inline struct sk_buff *qdisc_dequeue_head(struct Qdisc *sch)
1030{
1031 struct sk_buff *skb = __qdisc_dequeue_head(&sch->q);
1032
9190b3b3 1033 if (likely(skb != NULL)) {
25331d6c 1034 qdisc_qstats_backlog_dec(sch, skb);
9190b3b3
ED
1035 qdisc_bstats_update(sch, skb);
1036 }
9972b25d
TG
1037
1038 return skb;
1039}
1040
b6a3c606
VN
1041struct tc_skb_cb {
1042 struct qdisc_skb_cb qdisc_cb;
1043 u32 drop_reason;
1044
1045 u16 zone; /* Only valid if post_ct = true */
1046 u16 mru;
1047 u8 post_ct:1;
1048 u8 post_ct_snat:1;
1049 u8 post_ct_dnat:1;
1050};
1051
1052static inline struct tc_skb_cb *tc_skb_cb(const struct sk_buff *skb)
1053{
1054 struct tc_skb_cb *cb = (struct tc_skb_cb *)skb->cb;
1055
1056 BUILD_BUG_ON(sizeof(*cb) > sizeof_field(struct sk_buff, cb));
1057 return cb;
1058}
1059
1060static inline enum skb_drop_reason
1061tcf_get_drop_reason(const struct sk_buff *skb)
1062{
1063 return tc_skb_cb(skb)->drop_reason;
1064}
1065
1066static inline void tcf_set_drop_reason(const struct sk_buff *skb,
1067 enum skb_drop_reason reason)
1068{
1069 tc_skb_cb(skb)->drop_reason = reason;
1070}
1071
520ac30f
ED
1072/* Instead of calling kfree_skb() while root qdisc lock is held,
1073 * queue the skb for future freeing at end of __dev_xmit_skb()
1074 */
1075static inline void __qdisc_drop(struct sk_buff *skb, struct sk_buff **to_free)
1076{
1077 skb->next = *to_free;
1078 *to_free = skb;
1079}
1080
35d889d1
AK
1081static inline void __qdisc_drop_all(struct sk_buff *skb,
1082 struct sk_buff **to_free)
1083{
1084 if (skb->prev)
1085 skb->prev->next = *to_free;
1086 else
1087 skb->next = *to_free;
1088 *to_free = skb;
1089}
1090
57dbb2d8 1091static inline unsigned int __qdisc_queue_drop_head(struct Qdisc *sch,
48da34b7 1092 struct qdisc_skb_head *qh,
520ac30f 1093 struct sk_buff **to_free)
57dbb2d8 1094{
48da34b7 1095 struct sk_buff *skb = __qdisc_dequeue_head(qh);
57dbb2d8
HPP
1096
1097 if (likely(skb != NULL)) {
1098 unsigned int len = qdisc_pkt_len(skb);
520ac30f 1099
25331d6c 1100 qdisc_qstats_backlog_dec(sch, skb);
520ac30f 1101 __qdisc_drop(skb, to_free);
57dbb2d8
HPP
1102 return len;
1103 }
1104
1105 return 0;
1106}
1107
48a8f519
PM
1108static inline struct sk_buff *qdisc_peek_head(struct Qdisc *sch)
1109{
48da34b7
FW
1110 const struct qdisc_skb_head *qh = &sch->q;
1111
1112 return qh->head;
48a8f519
PM
1113}
1114
77be155c
JP
1115/* generic pseudo peek method for non-work-conserving qdisc */
1116static inline struct sk_buff *qdisc_peek_dequeued(struct Qdisc *sch)
1117{
a53851e2
JF
1118 struct sk_buff *skb = skb_peek(&sch->gso_skb);
1119
77be155c 1120 /* we can reuse ->gso_skb because peek isn't called for root qdiscs */
a53851e2
JF
1121 if (!skb) {
1122 skb = sch->dequeue(sch);
1123
1124 if (skb) {
1125 __skb_queue_head(&sch->gso_skb, skb);
61c9eaf9 1126 /* it's still part of the queue */
a53851e2 1127 qdisc_qstats_backlog_inc(sch, skb);
61c9eaf9 1128 sch->q.qlen++;
a27758ff 1129 }
61c9eaf9 1130 }
77be155c 1131
a53851e2 1132 return skb;
77be155c
JP
1133}
1134
8a53e616
PA
1135static inline void qdisc_update_stats_at_dequeue(struct Qdisc *sch,
1136 struct sk_buff *skb)
1137{
1138 if (qdisc_is_percpu_stats(sch)) {
1139 qdisc_qstats_cpu_backlog_dec(sch, skb);
1140 qdisc_bstats_cpu_update(sch, skb);
73eb628d 1141 qdisc_qstats_cpu_qlen_dec(sch);
8a53e616
PA
1142 } else {
1143 qdisc_qstats_backlog_dec(sch, skb);
1144 qdisc_bstats_update(sch, skb);
1145 sch->q.qlen--;
1146 }
1147}
1148
1149static inline void qdisc_update_stats_at_enqueue(struct Qdisc *sch,
1150 unsigned int pkt_len)
1151{
1152 if (qdisc_is_percpu_stats(sch)) {
73eb628d 1153 qdisc_qstats_cpu_qlen_inc(sch);
8a53e616
PA
1154 this_cpu_add(sch->cpu_qstats->backlog, pkt_len);
1155 } else {
1156 sch->qstats.backlog += pkt_len;
1157 sch->q.qlen++;
1158 }
1159}
1160
77be155c
JP
1161/* use instead of qdisc->dequeue() for all qdiscs queried with ->peek() */
1162static inline struct sk_buff *qdisc_dequeue_peeked(struct Qdisc *sch)
1163{
a53851e2 1164 struct sk_buff *skb = skb_peek(&sch->gso_skb);
77be155c 1165
61c9eaf9 1166 if (skb) {
a53851e2 1167 skb = __skb_dequeue(&sch->gso_skb);
9c01c9f1
PA
1168 if (qdisc_is_percpu_stats(sch)) {
1169 qdisc_qstats_cpu_backlog_dec(sch, skb);
73eb628d 1170 qdisc_qstats_cpu_qlen_dec(sch);
9c01c9f1
PA
1171 } else {
1172 qdisc_qstats_backlog_dec(sch, skb);
1173 sch->q.qlen--;
1174 }
61c9eaf9 1175 } else {
77be155c 1176 skb = sch->dequeue(sch);
61c9eaf9 1177 }
77be155c
JP
1178
1179 return skb;
1180}
1181
48da34b7 1182static inline void __qdisc_reset_queue(struct qdisc_skb_head *qh)
9972b25d
TG
1183{
1184 /*
1185 * We do not know the backlog in bytes of this list, it
1186 * is up to the caller to correct it
1187 */
48da34b7
FW
1188 ASSERT_RTNL();
1189 if (qh->qlen) {
1190 rtnl_kfree_skbs(qh->head, qh->tail);
1191
1192 qh->head = NULL;
1193 qh->tail = NULL;
1194 qh->qlen = 0;
1b5c5493 1195 }
9972b25d
TG
1196}
1197
1198static inline void qdisc_reset_queue(struct Qdisc *sch)
1199{
1b5c5493 1200 __qdisc_reset_queue(&sch->q);
9972b25d
TG
1201}
1202
86a7996c
WC
1203static inline struct Qdisc *qdisc_replace(struct Qdisc *sch, struct Qdisc *new,
1204 struct Qdisc **pold)
1205{
1206 struct Qdisc *old;
1207
1208 sch_tree_lock(sch);
1209 old = *pold;
1210 *pold = new;
e5f0e8f8 1211 if (old != NULL)
938e0fcd 1212 qdisc_purge_queue(old);
86a7996c
WC
1213 sch_tree_unlock(sch);
1214
1215 return old;
1216}
1217
1b5c5493
ED
1218static inline void rtnl_qdisc_drop(struct sk_buff *skb, struct Qdisc *sch)
1219{
1220 rtnl_kfree_skbs(skb, skb);
1221 qdisc_qstats_drop(sch);
1222}
1223
40bd0362
JF
1224static inline int qdisc_drop_cpu(struct sk_buff *skb, struct Qdisc *sch,
1225 struct sk_buff **to_free)
1226{
1227 __qdisc_drop(skb, to_free);
1228 qdisc_qstats_cpu_drop(sch);
1229
1230 return NET_XMIT_DROP;
1231}
520ac30f
ED
1232
1233static inline int qdisc_drop(struct sk_buff *skb, struct Qdisc *sch,
1234 struct sk_buff **to_free)
9972b25d 1235{
520ac30f 1236 __qdisc_drop(skb, to_free);
25331d6c 1237 qdisc_qstats_drop(sch);
9972b25d
TG
1238
1239 return NET_XMIT_DROP;
1240}
1241
35d889d1
AK
1242static inline int qdisc_drop_all(struct sk_buff *skb, struct Qdisc *sch,
1243 struct sk_buff **to_free)
1244{
1245 __qdisc_drop_all(skb, to_free);
1246 qdisc_qstats_drop(sch);
1247
1248 return NET_XMIT_DROP;
1249}
1250
292f1c7f 1251struct psched_ratecfg {
130d3d68 1252 u64 rate_bytes_ps; /* bytes per second */
01cb71d2
ED
1253 u32 mult;
1254 u16 overhead;
fb80445c 1255 u16 mpu;
8a8e3d84 1256 u8 linklayer;
01cb71d2 1257 u8 shift;
292f1c7f
JP
1258};
1259
1260static inline u64 psched_l2t_ns(const struct psched_ratecfg *r,
1261 unsigned int len)
1262{
8a8e3d84
JDB
1263 len += r->overhead;
1264
fb80445c
KB
1265 if (len < r->mpu)
1266 len = r->mpu;
1267
8a8e3d84
JDB
1268 if (unlikely(r->linklayer == TC_LINKLAYER_ATM))
1269 return ((u64)(DIV_ROUND_UP(len,48)*53) * r->mult) >> r->shift;
1270
1271 return ((u64)len * r->mult) >> r->shift;
292f1c7f
JP
1272}
1273
5c15257f 1274void psched_ratecfg_precompute(struct psched_ratecfg *r,
3e1e3aae
ED
1275 const struct tc_ratespec *conf,
1276 u64 rate64);
292f1c7f 1277
01cb71d2
ED
1278static inline void psched_ratecfg_getrate(struct tc_ratespec *res,
1279 const struct psched_ratecfg *r)
292f1c7f 1280{
01cb71d2 1281 memset(res, 0, sizeof(*res));
3e1e3aae
ED
1282
1283 /* legacy struct tc_ratespec has a 32bit @rate field
1284 * Qdisc using 64bit rate should add new attributes
1285 * in order to maintain compatibility.
1286 */
1287 res->rate = min_t(u64, r->rate_bytes_ps, ~0U);
1288
01cb71d2 1289 res->overhead = r->overhead;
fb80445c 1290 res->mpu = r->mpu;
8a8e3d84 1291 res->linklayer = (r->linklayer & TC_LINKLAYER_MASK);
292f1c7f
JP
1292}
1293
2ffe0395
BZ
1294struct psched_pktrate {
1295 u64 rate_pkts_ps; /* packets per second */
1296 u32 mult;
1297 u8 shift;
1298};
1299
1300static inline u64 psched_pkt2t_ns(const struct psched_pktrate *r,
1301 unsigned int pkt_num)
1302{
1303 return ((u64)pkt_num * r->mult) >> r->shift;
1304}
1305
1306void psched_ppscfg_precompute(struct psched_pktrate *r, u64 pktrate64);
1307
46209401
JP
1308/* Mini Qdisc serves for specific needs of ingress/clsact Qdisc.
1309 * The fast path only needs to access filter list and to update stats
1310 */
1311struct mini_Qdisc {
1312 struct tcf_proto *filter_list;
7d17c544 1313 struct tcf_block *block;
50dc9a85 1314 struct gnet_stats_basic_sync __percpu *cpu_bstats;
46209401 1315 struct gnet_stats_queue __percpu *cpu_qstats;
26746382 1316 unsigned long rcu_state;
46209401
JP
1317};
1318
1319static inline void mini_qdisc_bstats_cpu_update(struct mini_Qdisc *miniq,
1320 const struct sk_buff *skb)
1321{
50dc9a85 1322 bstats_update(this_cpu_ptr(miniq->cpu_bstats), skb);
46209401
JP
1323}
1324
1325static inline void mini_qdisc_qstats_cpu_drop(struct mini_Qdisc *miniq)
1326{
1327 this_cpu_inc(miniq->cpu_qstats->drops);
1328}
1329
1330struct mini_Qdisc_pair {
1331 struct mini_Qdisc miniq1;
1332 struct mini_Qdisc miniq2;
1333 struct mini_Qdisc __rcu **p_miniq;
1334};
1335
1336void mini_qdisc_pair_swap(struct mini_Qdisc_pair *miniqp,
1337 struct tcf_proto *tp_head);
1338void mini_qdisc_pair_init(struct mini_Qdisc_pair *miniqp, struct Qdisc *qdisc,
1339 struct mini_Qdisc __rcu **p_miniq);
7d17c544
PB
1340void mini_qdisc_pair_block_init(struct mini_Qdisc_pair *miniqp,
1341 struct tcf_block *block);
46209401 1342
f7116fb4
JK
1343void mq_change_real_num_tx(struct Qdisc *sch, unsigned int new_real_tx);
1344
c129412f 1345int sch_frag_xmit_hook(struct sk_buff *skb, int (*xmit)(struct sk_buff *skb));
cd11b164 1346
3a415d59
ED
1347/* Make sure qdisc is no longer in SCHED state. */
1348static inline void qdisc_synchronize(const struct Qdisc *q)
1349{
1350 while (test_bit(__QDISC_STATE_SCHED, &q->state))
1351 msleep(1);
1352}
1353
1da177e4 1354#endif
This page took 1.938614 seconds and 4 git commands to generate.