Linux kernel mirror (for testing)
git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel
os
linux
1/* SPDX-License-Identifier: GPL-2.0 */
2#ifndef __NET_SCHED_GENERIC_H
3#define __NET_SCHED_GENERIC_H
4
5#include <linux/netdevice.h>
6#include <linux/types.h>
7#include <linux/rcupdate.h>
8#include <linux/pkt_sched.h>
9#include <linux/pkt_cls.h>
10#include <linux/percpu.h>
11#include <linux/dynamic_queue_limits.h>
12#include <linux/list.h>
13#include <linux/refcount.h>
14#include <linux/workqueue.h>
15#include <linux/mutex.h>
16#include <linux/rwsem.h>
17#include <linux/atomic.h>
18#include <net/gen_stats.h>
19#include <net/rtnetlink.h>
20#include <net/flow_offload.h>
21
22struct Qdisc_ops;
23struct qdisc_walker;
24struct tcf_walker;
25struct module;
26struct bpf_flow_keys;
27
28struct qdisc_rate_table {
29 struct tc_ratespec rate;
30 u32 data[256];
31 struct qdisc_rate_table *next;
32 int refcnt;
33};
34
35enum qdisc_state_t {
36 __QDISC_STATE_SCHED,
37 __QDISC_STATE_DEACTIVATED,
38};
39
40struct qdisc_size_table {
41 struct rcu_head rcu;
42 struct list_head list;
43 struct tc_sizespec szopts;
44 int refcnt;
45 u16 data[];
46};
47
48/* similar to sk_buff_head, but skb->prev pointer is undefined. */
49struct qdisc_skb_head {
50 struct sk_buff *head;
51 struct sk_buff *tail;
52 __u32 qlen;
53 spinlock_t lock;
54};
55
56struct Qdisc {
57 int (*enqueue)(struct sk_buff *skb,
58 struct Qdisc *sch,
59 struct sk_buff **to_free);
60 struct sk_buff * (*dequeue)(struct Qdisc *sch);
61 unsigned int flags;
62#define TCQ_F_BUILTIN 1
63#define TCQ_F_INGRESS 2
64#define TCQ_F_CAN_BYPASS 4
65#define TCQ_F_MQROOT 8
66#define TCQ_F_ONETXQUEUE 0x10 /* dequeue_skb() can assume all skbs are for
67 * q->dev_queue : It can test
68 * netif_xmit_frozen_or_stopped() before
69 * dequeueing next packet.
70 * Its true for MQ/MQPRIO slaves, or non
71 * multiqueue device.
72 */
73#define TCQ_F_WARN_NONWC (1 << 16)
74#define TCQ_F_CPUSTATS 0x20 /* run using percpu statistics */
75#define TCQ_F_NOPARENT 0x40 /* root of its hierarchy :
76 * qdisc_tree_decrease_qlen() should stop.
77 */
78#define TCQ_F_INVISIBLE 0x80 /* invisible by default in dump */
79#define TCQ_F_NOLOCK 0x100 /* qdisc does not require locking */
80#define TCQ_F_OFFLOADED 0x200 /* qdisc is offloaded to HW */
81 u32 limit;
82 const struct Qdisc_ops *ops;
83 struct qdisc_size_table __rcu *stab;
84 struct hlist_node hash;
85 u32 handle;
86 u32 parent;
87
88 struct netdev_queue *dev_queue;
89
90 struct net_rate_estimator __rcu *rate_est;
91 struct gnet_stats_basic_cpu __percpu *cpu_bstats;
92 struct gnet_stats_queue __percpu *cpu_qstats;
93 int padded;
94 refcount_t refcnt;
95
96 /*
97 * For performance sake on SMP, we put highly modified fields at the end
98 */
99 struct sk_buff_head gso_skb ____cacheline_aligned_in_smp;
100 struct qdisc_skb_head q;
101 struct gnet_stats_basic_packed bstats;
102 seqcount_t running;
103 struct gnet_stats_queue qstats;
104 unsigned long state;
105 struct Qdisc *next_sched;
106 struct sk_buff_head skb_bad_txq;
107
108 spinlock_t busylock ____cacheline_aligned_in_smp;
109 spinlock_t seqlock;
110
111 /* for NOLOCK qdisc, true if there are no enqueued skbs */
112 bool empty;
113 struct rcu_head rcu;
114};
115
116static inline void qdisc_refcount_inc(struct Qdisc *qdisc)
117{
118 if (qdisc->flags & TCQ_F_BUILTIN)
119 return;
120 refcount_inc(&qdisc->refcnt);
121}
122
123/* Intended to be used by unlocked users, when concurrent qdisc release is
124 * possible.
125 */
126
127static inline struct Qdisc *qdisc_refcount_inc_nz(struct Qdisc *qdisc)
128{
129 if (qdisc->flags & TCQ_F_BUILTIN)
130 return qdisc;
131 if (refcount_inc_not_zero(&qdisc->refcnt))
132 return qdisc;
133 return NULL;
134}
135
136static inline bool qdisc_is_running(struct Qdisc *qdisc)
137{
138 if (qdisc->flags & TCQ_F_NOLOCK)
139 return spin_is_locked(&qdisc->seqlock);
140 return (raw_read_seqcount(&qdisc->running) & 1) ? true : false;
141}
142
143static inline bool qdisc_is_percpu_stats(const struct Qdisc *q)
144{
145 return q->flags & TCQ_F_CPUSTATS;
146}
147
148static inline bool qdisc_is_empty(const struct Qdisc *qdisc)
149{
150 if (qdisc_is_percpu_stats(qdisc))
151 return qdisc->empty;
152 return !qdisc->q.qlen;
153}
154
155static inline bool qdisc_run_begin(struct Qdisc *qdisc)
156{
157 if (qdisc->flags & TCQ_F_NOLOCK) {
158 if (!spin_trylock(&qdisc->seqlock))
159 return false;
160 qdisc->empty = false;
161 } else if (qdisc_is_running(qdisc)) {
162 return false;
163 }
164 /* Variant of write_seqcount_begin() telling lockdep a trylock
165 * was attempted.
166 */
167 raw_write_seqcount_begin(&qdisc->running);
168 seqcount_acquire(&qdisc->running.dep_map, 0, 1, _RET_IP_);
169 return true;
170}
171
172static inline void qdisc_run_end(struct Qdisc *qdisc)
173{
174 write_seqcount_end(&qdisc->running);
175 if (qdisc->flags & TCQ_F_NOLOCK)
176 spin_unlock(&qdisc->seqlock);
177}
178
179static inline bool qdisc_may_bulk(const struct Qdisc *qdisc)
180{
181 return qdisc->flags & TCQ_F_ONETXQUEUE;
182}
183
184static inline int qdisc_avail_bulklimit(const struct netdev_queue *txq)
185{
186#ifdef CONFIG_BQL
187 /* Non-BQL migrated drivers will return 0, too. */
188 return dql_avail(&txq->dql);
189#else
190 return 0;
191#endif
192}
193
194struct Qdisc_class_ops {
195 unsigned int flags;
196 /* Child qdisc manipulation */
197 struct netdev_queue * (*select_queue)(struct Qdisc *, struct tcmsg *);
198 int (*graft)(struct Qdisc *, unsigned long cl,
199 struct Qdisc *, struct Qdisc **,
200 struct netlink_ext_ack *extack);
201 struct Qdisc * (*leaf)(struct Qdisc *, unsigned long cl);
202 void (*qlen_notify)(struct Qdisc *, unsigned long);
203
204 /* Class manipulation routines */
205 unsigned long (*find)(struct Qdisc *, u32 classid);
206 int (*change)(struct Qdisc *, u32, u32,
207 struct nlattr **, unsigned long *,
208 struct netlink_ext_ack *);
209 int (*delete)(struct Qdisc *, unsigned long);
210 void (*walk)(struct Qdisc *, struct qdisc_walker * arg);
211
212 /* Filter manipulation */
213 struct tcf_block * (*tcf_block)(struct Qdisc *sch,
214 unsigned long arg,
215 struct netlink_ext_ack *extack);
216 unsigned long (*bind_tcf)(struct Qdisc *, unsigned long,
217 u32 classid);
218 void (*unbind_tcf)(struct Qdisc *, unsigned long);
219
220 /* rtnetlink specific */
221 int (*dump)(struct Qdisc *, unsigned long,
222 struct sk_buff *skb, struct tcmsg*);
223 int (*dump_stats)(struct Qdisc *, unsigned long,
224 struct gnet_dump *);
225};
226
227/* Qdisc_class_ops flag values */
228
229/* Implements API that doesn't require rtnl lock */
230enum qdisc_class_ops_flags {
231 QDISC_CLASS_OPS_DOIT_UNLOCKED = 1,
232};
233
234struct Qdisc_ops {
235 struct Qdisc_ops *next;
236 const struct Qdisc_class_ops *cl_ops;
237 char id[IFNAMSIZ];
238 int priv_size;
239 unsigned int static_flags;
240
241 int (*enqueue)(struct sk_buff *skb,
242 struct Qdisc *sch,
243 struct sk_buff **to_free);
244 struct sk_buff * (*dequeue)(struct Qdisc *);
245 struct sk_buff * (*peek)(struct Qdisc *);
246
247 int (*init)(struct Qdisc *sch, struct nlattr *arg,
248 struct netlink_ext_ack *extack);
249 void (*reset)(struct Qdisc *);
250 void (*destroy)(struct Qdisc *);
251 int (*change)(struct Qdisc *sch,
252 struct nlattr *arg,
253 struct netlink_ext_ack *extack);
254 void (*attach)(struct Qdisc *sch);
255 int (*change_tx_queue_len)(struct Qdisc *, unsigned int);
256
257 int (*dump)(struct Qdisc *, struct sk_buff *);
258 int (*dump_stats)(struct Qdisc *, struct gnet_dump *);
259
260 void (*ingress_block_set)(struct Qdisc *sch,
261 u32 block_index);
262 void (*egress_block_set)(struct Qdisc *sch,
263 u32 block_index);
264 u32 (*ingress_block_get)(struct Qdisc *sch);
265 u32 (*egress_block_get)(struct Qdisc *sch);
266
267 struct module *owner;
268};
269
270
271struct tcf_result {
272 union {
273 struct {
274 unsigned long class;
275 u32 classid;
276 };
277 const struct tcf_proto *goto_tp;
278
279 /* used in the skb_tc_reinsert function */
280 struct {
281 bool ingress;
282 struct gnet_stats_queue *qstats;
283 };
284 };
285};
286
287struct tcf_chain;
288
289struct tcf_proto_ops {
290 struct list_head head;
291 char kind[IFNAMSIZ];
292
293 int (*classify)(struct sk_buff *,
294 const struct tcf_proto *,
295 struct tcf_result *);
296 int (*init)(struct tcf_proto*);
297 void (*destroy)(struct tcf_proto *tp, bool rtnl_held,
298 struct netlink_ext_ack *extack);
299
300 void* (*get)(struct tcf_proto*, u32 handle);
301 void (*put)(struct tcf_proto *tp, void *f);
302 int (*change)(struct net *net, struct sk_buff *,
303 struct tcf_proto*, unsigned long,
304 u32 handle, struct nlattr **,
305 void **, bool, bool,
306 struct netlink_ext_ack *);
307 int (*delete)(struct tcf_proto *tp, void *arg,
308 bool *last, bool rtnl_held,
309 struct netlink_ext_ack *);
310 void (*walk)(struct tcf_proto *tp,
311 struct tcf_walker *arg, bool rtnl_held);
312 int (*reoffload)(struct tcf_proto *tp, bool add,
313 flow_setup_cb_t *cb, void *cb_priv,
314 struct netlink_ext_ack *extack);
315 void (*hw_add)(struct tcf_proto *tp,
316 void *type_data);
317 void (*hw_del)(struct tcf_proto *tp,
318 void *type_data);
319 void (*bind_class)(void *, u32, unsigned long);
320 void * (*tmplt_create)(struct net *net,
321 struct tcf_chain *chain,
322 struct nlattr **tca,
323 struct netlink_ext_ack *extack);
324 void (*tmplt_destroy)(void *tmplt_priv);
325
326 /* rtnetlink specific */
327 int (*dump)(struct net*, struct tcf_proto*, void *,
328 struct sk_buff *skb, struct tcmsg*,
329 bool);
330 int (*tmplt_dump)(struct sk_buff *skb,
331 struct net *net,
332 void *tmplt_priv);
333
334 struct module *owner;
335 int flags;
336};
337
338enum tcf_proto_ops_flags {
339 TCF_PROTO_OPS_DOIT_UNLOCKED = 1,
340};
341
342struct tcf_proto {
343 /* Fast access part */
344 struct tcf_proto __rcu *next;
345 void __rcu *root;
346
347 /* called under RCU BH lock*/
348 int (*classify)(struct sk_buff *,
349 const struct tcf_proto *,
350 struct tcf_result *);
351 __be16 protocol;
352
353 /* All the rest */
354 u32 prio;
355 void *data;
356 const struct tcf_proto_ops *ops;
357 struct tcf_chain *chain;
358 /* Lock protects tcf_proto shared state and can be used by unlocked
359 * classifiers to protect their private data.
360 */
361 spinlock_t lock;
362 bool deleting;
363 refcount_t refcnt;
364 struct rcu_head rcu;
365};
366
367struct qdisc_skb_cb {
368 struct {
369 unsigned int pkt_len;
370 u16 slave_dev_queue_mapping;
371 u16 tc_classid;
372 };
373#define QDISC_CB_PRIV_LEN 20
374 unsigned char data[QDISC_CB_PRIV_LEN];
375};
376
377typedef void tcf_chain_head_change_t(struct tcf_proto *tp_head, void *priv);
378
379struct tcf_chain {
380 /* Protects filter_chain. */
381 struct mutex filter_chain_lock;
382 struct tcf_proto __rcu *filter_chain;
383 struct list_head list;
384 struct tcf_block *block;
385 u32 index; /* chain index */
386 unsigned int refcnt;
387 unsigned int action_refcnt;
388 bool explicitly_created;
389 bool flushing;
390 const struct tcf_proto_ops *tmplt_ops;
391 void *tmplt_priv;
392 struct rcu_head rcu;
393};
394
395struct tcf_block {
396 /* Lock protects tcf_block and lifetime-management data of chains
397 * attached to the block (refcnt, action_refcnt, explicitly_created).
398 */
399 struct mutex lock;
400 struct list_head chain_list;
401 u32 index; /* block index for shared blocks */
402 refcount_t refcnt;
403 struct net *net;
404 struct Qdisc *q;
405 struct rw_semaphore cb_lock; /* protects cb_list and offload counters */
406 struct flow_block flow_block;
407 struct list_head owner_list;
408 bool keep_dst;
409 atomic_t offloadcnt; /* Number of oddloaded filters */
410 unsigned int nooffloaddevcnt; /* Number of devs unable to do offload */
411 unsigned int lockeddevcnt; /* Number of devs that require rtnl lock. */
412 struct {
413 struct tcf_chain *chain;
414 struct list_head filter_chain_list;
415 } chain0;
416 struct rcu_head rcu;
417};
418
419#ifdef CONFIG_PROVE_LOCKING
420static inline bool lockdep_tcf_chain_is_locked(struct tcf_chain *chain)
421{
422 return lockdep_is_held(&chain->filter_chain_lock);
423}
424
425static inline bool lockdep_tcf_proto_is_locked(struct tcf_proto *tp)
426{
427 return lockdep_is_held(&tp->lock);
428}
429#else
430static inline bool lockdep_tcf_chain_is_locked(struct tcf_block *chain)
431{
432 return true;
433}
434
435static inline bool lockdep_tcf_proto_is_locked(struct tcf_proto *tp)
436{
437 return true;
438}
439#endif /* #ifdef CONFIG_PROVE_LOCKING */
440
441#define tcf_chain_dereference(p, chain) \
442 rcu_dereference_protected(p, lockdep_tcf_chain_is_locked(chain))
443
444#define tcf_proto_dereference(p, tp) \
445 rcu_dereference_protected(p, lockdep_tcf_proto_is_locked(tp))
446
447static inline void qdisc_cb_private_validate(const struct sk_buff *skb, int sz)
448{
449 struct qdisc_skb_cb *qcb;
450
451 BUILD_BUG_ON(sizeof(skb->cb) < offsetof(struct qdisc_skb_cb, data) + sz);
452 BUILD_BUG_ON(sizeof(qcb->data) < sz);
453}
454
455static inline int qdisc_qlen_cpu(const struct Qdisc *q)
456{
457 return this_cpu_ptr(q->cpu_qstats)->qlen;
458}
459
460static inline int qdisc_qlen(const struct Qdisc *q)
461{
462 return q->q.qlen;
463}
464
465static inline int qdisc_qlen_sum(const struct Qdisc *q)
466{
467 __u32 qlen = q->qstats.qlen;
468 int i;
469
470 if (qdisc_is_percpu_stats(q)) {
471 for_each_possible_cpu(i)
472 qlen += per_cpu_ptr(q->cpu_qstats, i)->qlen;
473 } else {
474 qlen += q->q.qlen;
475 }
476
477 return qlen;
478}
479
480static inline struct qdisc_skb_cb *qdisc_skb_cb(const struct sk_buff *skb)
481{
482 return (struct qdisc_skb_cb *)skb->cb;
483}
484
485static inline spinlock_t *qdisc_lock(struct Qdisc *qdisc)
486{
487 return &qdisc->q.lock;
488}
489
490static inline struct Qdisc *qdisc_root(const struct Qdisc *qdisc)
491{
492 struct Qdisc *q = rcu_dereference_rtnl(qdisc->dev_queue->qdisc);
493
494 return q;
495}
496
497static inline struct Qdisc *qdisc_root_bh(const struct Qdisc *qdisc)
498{
499 return rcu_dereference_bh(qdisc->dev_queue->qdisc);
500}
501
502static inline struct Qdisc *qdisc_root_sleeping(const struct Qdisc *qdisc)
503{
504 return qdisc->dev_queue->qdisc_sleeping;
505}
506
507/* The qdisc root lock is a mechanism by which to top level
508 * of a qdisc tree can be locked from any qdisc node in the
509 * forest. This allows changing the configuration of some
510 * aspect of the qdisc tree while blocking out asynchronous
511 * qdisc access in the packet processing paths.
512 *
513 * It is only legal to do this when the root will not change
514 * on us. Otherwise we'll potentially lock the wrong qdisc
515 * root. This is enforced by holding the RTNL semaphore, which
516 * all users of this lock accessor must do.
517 */
518static inline spinlock_t *qdisc_root_lock(const struct Qdisc *qdisc)
519{
520 struct Qdisc *root = qdisc_root(qdisc);
521
522 ASSERT_RTNL();
523 return qdisc_lock(root);
524}
525
526static inline spinlock_t *qdisc_root_sleeping_lock(const struct Qdisc *qdisc)
527{
528 struct Qdisc *root = qdisc_root_sleeping(qdisc);
529
530 ASSERT_RTNL();
531 return qdisc_lock(root);
532}
533
534static inline seqcount_t *qdisc_root_sleeping_running(const struct Qdisc *qdisc)
535{
536 struct Qdisc *root = qdisc_root_sleeping(qdisc);
537
538 ASSERT_RTNL();
539 return &root->running;
540}
541
542static inline struct net_device *qdisc_dev(const struct Qdisc *qdisc)
543{
544 return qdisc->dev_queue->dev;
545}
546
547static inline void sch_tree_lock(const struct Qdisc *q)
548{
549 spin_lock_bh(qdisc_root_sleeping_lock(q));
550}
551
552static inline void sch_tree_unlock(const struct Qdisc *q)
553{
554 spin_unlock_bh(qdisc_root_sleeping_lock(q));
555}
556
557extern struct Qdisc noop_qdisc;
558extern struct Qdisc_ops noop_qdisc_ops;
559extern struct Qdisc_ops pfifo_fast_ops;
560extern struct Qdisc_ops mq_qdisc_ops;
561extern struct Qdisc_ops noqueue_qdisc_ops;
562extern const struct Qdisc_ops *default_qdisc_ops;
563static inline const struct Qdisc_ops *
564get_default_qdisc_ops(const struct net_device *dev, int ntx)
565{
566 return ntx < dev->real_num_tx_queues ?
567 default_qdisc_ops : &pfifo_fast_ops;
568}
569
570struct Qdisc_class_common {
571 u32 classid;
572 struct hlist_node hnode;
573};
574
575struct Qdisc_class_hash {
576 struct hlist_head *hash;
577 unsigned int hashsize;
578 unsigned int hashmask;
579 unsigned int hashelems;
580};
581
582static inline unsigned int qdisc_class_hash(u32 id, u32 mask)
583{
584 id ^= id >> 8;
585 id ^= id >> 4;
586 return id & mask;
587}
588
589static inline struct Qdisc_class_common *
590qdisc_class_find(const struct Qdisc_class_hash *hash, u32 id)
591{
592 struct Qdisc_class_common *cl;
593 unsigned int h;
594
595 if (!id)
596 return NULL;
597
598 h = qdisc_class_hash(id, hash->hashmask);
599 hlist_for_each_entry(cl, &hash->hash[h], hnode) {
600 if (cl->classid == id)
601 return cl;
602 }
603 return NULL;
604}
605
606static inline int tc_classid_to_hwtc(struct net_device *dev, u32 classid)
607{
608 u32 hwtc = TC_H_MIN(classid) - TC_H_MIN_PRIORITY;
609
610 return (hwtc < netdev_get_num_tc(dev)) ? hwtc : -EINVAL;
611}
612
613int qdisc_class_hash_init(struct Qdisc_class_hash *);
614void qdisc_class_hash_insert(struct Qdisc_class_hash *,
615 struct Qdisc_class_common *);
616void qdisc_class_hash_remove(struct Qdisc_class_hash *,
617 struct Qdisc_class_common *);
618void qdisc_class_hash_grow(struct Qdisc *, struct Qdisc_class_hash *);
619void qdisc_class_hash_destroy(struct Qdisc_class_hash *);
620
621int dev_qdisc_change_tx_queue_len(struct net_device *dev);
622void dev_init_scheduler(struct net_device *dev);
623void dev_shutdown(struct net_device *dev);
624void dev_activate(struct net_device *dev);
625void dev_deactivate(struct net_device *dev);
626void dev_deactivate_many(struct list_head *head);
627struct Qdisc *dev_graft_qdisc(struct netdev_queue *dev_queue,
628 struct Qdisc *qdisc);
629void qdisc_reset(struct Qdisc *qdisc);
630void qdisc_put(struct Qdisc *qdisc);
631void qdisc_put_unlocked(struct Qdisc *qdisc);
632void qdisc_tree_reduce_backlog(struct Qdisc *qdisc, int n, int len);
633#ifdef CONFIG_NET_SCHED
634int qdisc_offload_dump_helper(struct Qdisc *q, enum tc_setup_type type,
635 void *type_data);
636void qdisc_offload_graft_helper(struct net_device *dev, struct Qdisc *sch,
637 struct Qdisc *new, struct Qdisc *old,
638 enum tc_setup_type type, void *type_data,
639 struct netlink_ext_ack *extack);
640#else
641static inline int
642qdisc_offload_dump_helper(struct Qdisc *q, enum tc_setup_type type,
643 void *type_data)
644{
645 q->flags &= ~TCQ_F_OFFLOADED;
646 return 0;
647}
648
649static inline void
650qdisc_offload_graft_helper(struct net_device *dev, struct Qdisc *sch,
651 struct Qdisc *new, struct Qdisc *old,
652 enum tc_setup_type type, void *type_data,
653 struct netlink_ext_ack *extack)
654{
655}
656#endif
657struct Qdisc *qdisc_alloc(struct netdev_queue *dev_queue,
658 const struct Qdisc_ops *ops,
659 struct netlink_ext_ack *extack);
660void qdisc_free(struct Qdisc *qdisc);
661struct Qdisc *qdisc_create_dflt(struct netdev_queue *dev_queue,
662 const struct Qdisc_ops *ops, u32 parentid,
663 struct netlink_ext_ack *extack);
664void __qdisc_calculate_pkt_len(struct sk_buff *skb,
665 const struct qdisc_size_table *stab);
666int skb_do_redirect(struct sk_buff *);
667
668static inline void skb_reset_tc(struct sk_buff *skb)
669{
670#ifdef CONFIG_NET_CLS_ACT
671 skb->tc_redirected = 0;
672#endif
673}
674
675static inline bool skb_is_tc_redirected(const struct sk_buff *skb)
676{
677#ifdef CONFIG_NET_CLS_ACT
678 return skb->tc_redirected;
679#else
680 return false;
681#endif
682}
683
684static inline bool skb_at_tc_ingress(const struct sk_buff *skb)
685{
686#ifdef CONFIG_NET_CLS_ACT
687 return skb->tc_at_ingress;
688#else
689 return false;
690#endif
691}
692
693static inline bool skb_skip_tc_classify(struct sk_buff *skb)
694{
695#ifdef CONFIG_NET_CLS_ACT
696 if (skb->tc_skip_classify) {
697 skb->tc_skip_classify = 0;
698 return true;
699 }
700#endif
701 return false;
702}
703
704/* Reset all TX qdiscs greater than index of a device. */
705static inline void qdisc_reset_all_tx_gt(struct net_device *dev, unsigned int i)
706{
707 struct Qdisc *qdisc;
708
709 for (; i < dev->num_tx_queues; i++) {
710 qdisc = rtnl_dereference(netdev_get_tx_queue(dev, i)->qdisc);
711 if (qdisc) {
712 spin_lock_bh(qdisc_lock(qdisc));
713 qdisc_reset(qdisc);
714 spin_unlock_bh(qdisc_lock(qdisc));
715 }
716 }
717}
718
719static inline void qdisc_reset_all_tx(struct net_device *dev)
720{
721 qdisc_reset_all_tx_gt(dev, 0);
722}
723
724/* Are all TX queues of the device empty? */
725static inline bool qdisc_all_tx_empty(const struct net_device *dev)
726{
727 unsigned int i;
728
729 rcu_read_lock();
730 for (i = 0; i < dev->num_tx_queues; i++) {
731 struct netdev_queue *txq = netdev_get_tx_queue(dev, i);
732 const struct Qdisc *q = rcu_dereference(txq->qdisc);
733
734 if (!qdisc_is_empty(q)) {
735 rcu_read_unlock();
736 return false;
737 }
738 }
739 rcu_read_unlock();
740 return true;
741}
742
743/* Are any of the TX qdiscs changing? */
744static inline bool qdisc_tx_changing(const struct net_device *dev)
745{
746 unsigned int i;
747
748 for (i = 0; i < dev->num_tx_queues; i++) {
749 struct netdev_queue *txq = netdev_get_tx_queue(dev, i);
750 if (rcu_access_pointer(txq->qdisc) != txq->qdisc_sleeping)
751 return true;
752 }
753 return false;
754}
755
756/* Is the device using the noop qdisc on all queues? */
757static inline bool qdisc_tx_is_noop(const struct net_device *dev)
758{
759 unsigned int i;
760
761 for (i = 0; i < dev->num_tx_queues; i++) {
762 struct netdev_queue *txq = netdev_get_tx_queue(dev, i);
763 if (rcu_access_pointer(txq->qdisc) != &noop_qdisc)
764 return false;
765 }
766 return true;
767}
768
769static inline unsigned int qdisc_pkt_len(const struct sk_buff *skb)
770{
771 return qdisc_skb_cb(skb)->pkt_len;
772}
773
774/* additional qdisc xmit flags (NET_XMIT_MASK in linux/netdevice.h) */
775enum net_xmit_qdisc_t {
776 __NET_XMIT_STOLEN = 0x00010000,
777 __NET_XMIT_BYPASS = 0x00020000,
778};
779
780#ifdef CONFIG_NET_CLS_ACT
781#define net_xmit_drop_count(e) ((e) & __NET_XMIT_STOLEN ? 0 : 1)
782#else
783#define net_xmit_drop_count(e) (1)
784#endif
785
786static inline void qdisc_calculate_pkt_len(struct sk_buff *skb,
787 const struct Qdisc *sch)
788{
789#ifdef CONFIG_NET_SCHED
790 struct qdisc_size_table *stab = rcu_dereference_bh(sch->stab);
791
792 if (stab)
793 __qdisc_calculate_pkt_len(skb, stab);
794#endif
795}
796
797static inline int qdisc_enqueue(struct sk_buff *skb, struct Qdisc *sch,
798 struct sk_buff **to_free)
799{
800 qdisc_calculate_pkt_len(skb, sch);
801 return sch->enqueue(skb, sch, to_free);
802}
803
804static inline void _bstats_update(struct gnet_stats_basic_packed *bstats,
805 __u64 bytes, __u32 packets)
806{
807 bstats->bytes += bytes;
808 bstats->packets += packets;
809}
810
811static inline void bstats_update(struct gnet_stats_basic_packed *bstats,
812 const struct sk_buff *skb)
813{
814 _bstats_update(bstats,
815 qdisc_pkt_len(skb),
816 skb_is_gso(skb) ? skb_shinfo(skb)->gso_segs : 1);
817}
818
819static inline void _bstats_cpu_update(struct gnet_stats_basic_cpu *bstats,
820 __u64 bytes, __u32 packets)
821{
822 u64_stats_update_begin(&bstats->syncp);
823 _bstats_update(&bstats->bstats, bytes, packets);
824 u64_stats_update_end(&bstats->syncp);
825}
826
827static inline void bstats_cpu_update(struct gnet_stats_basic_cpu *bstats,
828 const struct sk_buff *skb)
829{
830 u64_stats_update_begin(&bstats->syncp);
831 bstats_update(&bstats->bstats, skb);
832 u64_stats_update_end(&bstats->syncp);
833}
834
835static inline void qdisc_bstats_cpu_update(struct Qdisc *sch,
836 const struct sk_buff *skb)
837{
838 bstats_cpu_update(this_cpu_ptr(sch->cpu_bstats), skb);
839}
840
841static inline void qdisc_bstats_update(struct Qdisc *sch,
842 const struct sk_buff *skb)
843{
844 bstats_update(&sch->bstats, skb);
845}
846
847static inline void qdisc_qstats_backlog_dec(struct Qdisc *sch,
848 const struct sk_buff *skb)
849{
850 sch->qstats.backlog -= qdisc_pkt_len(skb);
851}
852
853static inline void qdisc_qstats_cpu_backlog_dec(struct Qdisc *sch,
854 const struct sk_buff *skb)
855{
856 this_cpu_sub(sch->cpu_qstats->backlog, qdisc_pkt_len(skb));
857}
858
859static inline void qdisc_qstats_backlog_inc(struct Qdisc *sch,
860 const struct sk_buff *skb)
861{
862 sch->qstats.backlog += qdisc_pkt_len(skb);
863}
864
865static inline void qdisc_qstats_cpu_backlog_inc(struct Qdisc *sch,
866 const struct sk_buff *skb)
867{
868 this_cpu_add(sch->cpu_qstats->backlog, qdisc_pkt_len(skb));
869}
870
871static inline void qdisc_qstats_cpu_qlen_inc(struct Qdisc *sch)
872{
873 this_cpu_inc(sch->cpu_qstats->qlen);
874}
875
876static inline void qdisc_qstats_cpu_qlen_dec(struct Qdisc *sch)
877{
878 this_cpu_dec(sch->cpu_qstats->qlen);
879}
880
881static inline void qdisc_qstats_cpu_requeues_inc(struct Qdisc *sch)
882{
883 this_cpu_inc(sch->cpu_qstats->requeues);
884}
885
886static inline void __qdisc_qstats_drop(struct Qdisc *sch, int count)
887{
888 sch->qstats.drops += count;
889}
890
891static inline void qstats_drop_inc(struct gnet_stats_queue *qstats)
892{
893 qstats->drops++;
894}
895
896static inline void qstats_overlimit_inc(struct gnet_stats_queue *qstats)
897{
898 qstats->overlimits++;
899}
900
901static inline void qdisc_qstats_drop(struct Qdisc *sch)
902{
903 qstats_drop_inc(&sch->qstats);
904}
905
906static inline void qdisc_qstats_cpu_drop(struct Qdisc *sch)
907{
908 this_cpu_inc(sch->cpu_qstats->drops);
909}
910
911static inline void qdisc_qstats_overlimit(struct Qdisc *sch)
912{
913 sch->qstats.overlimits++;
914}
915
916static inline int qdisc_qstats_copy(struct gnet_dump *d, struct Qdisc *sch)
917{
918 __u32 qlen = qdisc_qlen_sum(sch);
919
920 return gnet_stats_copy_queue(d, sch->cpu_qstats, &sch->qstats, qlen);
921}
922
923static inline void qdisc_qstats_qlen_backlog(struct Qdisc *sch, __u32 *qlen,
924 __u32 *backlog)
925{
926 struct gnet_stats_queue qstats = { 0 };
927 __u32 len = qdisc_qlen_sum(sch);
928
929 __gnet_stats_copy_queue(&qstats, sch->cpu_qstats, &sch->qstats, len);
930 *qlen = qstats.qlen;
931 *backlog = qstats.backlog;
932}
933
934static inline void qdisc_tree_flush_backlog(struct Qdisc *sch)
935{
936 __u32 qlen, backlog;
937
938 qdisc_qstats_qlen_backlog(sch, &qlen, &backlog);
939 qdisc_tree_reduce_backlog(sch, qlen, backlog);
940}
941
942static inline void qdisc_purge_queue(struct Qdisc *sch)
943{
944 __u32 qlen, backlog;
945
946 qdisc_qstats_qlen_backlog(sch, &qlen, &backlog);
947 qdisc_reset(sch);
948 qdisc_tree_reduce_backlog(sch, qlen, backlog);
949}
950
951static inline void qdisc_skb_head_init(struct qdisc_skb_head *qh)
952{
953 qh->head = NULL;
954 qh->tail = NULL;
955 qh->qlen = 0;
956}
957
958static inline void __qdisc_enqueue_tail(struct sk_buff *skb,
959 struct qdisc_skb_head *qh)
960{
961 struct sk_buff *last = qh->tail;
962
963 if (last) {
964 skb->next = NULL;
965 last->next = skb;
966 qh->tail = skb;
967 } else {
968 qh->tail = skb;
969 qh->head = skb;
970 }
971 qh->qlen++;
972}
973
974static inline int qdisc_enqueue_tail(struct sk_buff *skb, struct Qdisc *sch)
975{
976 __qdisc_enqueue_tail(skb, &sch->q);
977 qdisc_qstats_backlog_inc(sch, skb);
978 return NET_XMIT_SUCCESS;
979}
980
981static inline void __qdisc_enqueue_head(struct sk_buff *skb,
982 struct qdisc_skb_head *qh)
983{
984 skb->next = qh->head;
985
986 if (!qh->head)
987 qh->tail = skb;
988 qh->head = skb;
989 qh->qlen++;
990}
991
992static inline struct sk_buff *__qdisc_dequeue_head(struct qdisc_skb_head *qh)
993{
994 struct sk_buff *skb = qh->head;
995
996 if (likely(skb != NULL)) {
997 qh->head = skb->next;
998 qh->qlen--;
999 if (qh->head == NULL)
1000 qh->tail = NULL;
1001 skb->next = NULL;
1002 }
1003
1004 return skb;
1005}
1006
1007static inline struct sk_buff *qdisc_dequeue_head(struct Qdisc *sch)
1008{
1009 struct sk_buff *skb = __qdisc_dequeue_head(&sch->q);
1010
1011 if (likely(skb != NULL)) {
1012 qdisc_qstats_backlog_dec(sch, skb);
1013 qdisc_bstats_update(sch, skb);
1014 }
1015
1016 return skb;
1017}
1018
1019/* Instead of calling kfree_skb() while root qdisc lock is held,
1020 * queue the skb for future freeing at end of __dev_xmit_skb()
1021 */
1022static inline void __qdisc_drop(struct sk_buff *skb, struct sk_buff **to_free)
1023{
1024 skb->next = *to_free;
1025 *to_free = skb;
1026}
1027
1028static inline void __qdisc_drop_all(struct sk_buff *skb,
1029 struct sk_buff **to_free)
1030{
1031 if (skb->prev)
1032 skb->prev->next = *to_free;
1033 else
1034 skb->next = *to_free;
1035 *to_free = skb;
1036}
1037
1038static inline unsigned int __qdisc_queue_drop_head(struct Qdisc *sch,
1039 struct qdisc_skb_head *qh,
1040 struct sk_buff **to_free)
1041{
1042 struct sk_buff *skb = __qdisc_dequeue_head(qh);
1043
1044 if (likely(skb != NULL)) {
1045 unsigned int len = qdisc_pkt_len(skb);
1046
1047 qdisc_qstats_backlog_dec(sch, skb);
1048 __qdisc_drop(skb, to_free);
1049 return len;
1050 }
1051
1052 return 0;
1053}
1054
1055static inline unsigned int qdisc_queue_drop_head(struct Qdisc *sch,
1056 struct sk_buff **to_free)
1057{
1058 return __qdisc_queue_drop_head(sch, &sch->q, to_free);
1059}
1060
1061static inline struct sk_buff *qdisc_peek_head(struct Qdisc *sch)
1062{
1063 const struct qdisc_skb_head *qh = &sch->q;
1064
1065 return qh->head;
1066}
1067
1068/* generic pseudo peek method for non-work-conserving qdisc */
1069static inline struct sk_buff *qdisc_peek_dequeued(struct Qdisc *sch)
1070{
1071 struct sk_buff *skb = skb_peek(&sch->gso_skb);
1072
1073 /* we can reuse ->gso_skb because peek isn't called for root qdiscs */
1074 if (!skb) {
1075 skb = sch->dequeue(sch);
1076
1077 if (skb) {
1078 __skb_queue_head(&sch->gso_skb, skb);
1079 /* it's still part of the queue */
1080 qdisc_qstats_backlog_inc(sch, skb);
1081 sch->q.qlen++;
1082 }
1083 }
1084
1085 return skb;
1086}
1087
1088static inline void qdisc_update_stats_at_dequeue(struct Qdisc *sch,
1089 struct sk_buff *skb)
1090{
1091 if (qdisc_is_percpu_stats(sch)) {
1092 qdisc_qstats_cpu_backlog_dec(sch, skb);
1093 qdisc_bstats_cpu_update(sch, skb);
1094 qdisc_qstats_cpu_qlen_dec(sch);
1095 } else {
1096 qdisc_qstats_backlog_dec(sch, skb);
1097 qdisc_bstats_update(sch, skb);
1098 sch->q.qlen--;
1099 }
1100}
1101
1102static inline void qdisc_update_stats_at_enqueue(struct Qdisc *sch,
1103 unsigned int pkt_len)
1104{
1105 if (qdisc_is_percpu_stats(sch)) {
1106 qdisc_qstats_cpu_qlen_inc(sch);
1107 this_cpu_add(sch->cpu_qstats->backlog, pkt_len);
1108 } else {
1109 sch->qstats.backlog += pkt_len;
1110 sch->q.qlen++;
1111 }
1112}
1113
1114/* use instead of qdisc->dequeue() for all qdiscs queried with ->peek() */
1115static inline struct sk_buff *qdisc_dequeue_peeked(struct Qdisc *sch)
1116{
1117 struct sk_buff *skb = skb_peek(&sch->gso_skb);
1118
1119 if (skb) {
1120 skb = __skb_dequeue(&sch->gso_skb);
1121 if (qdisc_is_percpu_stats(sch)) {
1122 qdisc_qstats_cpu_backlog_dec(sch, skb);
1123 qdisc_qstats_cpu_qlen_dec(sch);
1124 } else {
1125 qdisc_qstats_backlog_dec(sch, skb);
1126 sch->q.qlen--;
1127 }
1128 } else {
1129 skb = sch->dequeue(sch);
1130 }
1131
1132 return skb;
1133}
1134
1135static inline void __qdisc_reset_queue(struct qdisc_skb_head *qh)
1136{
1137 /*
1138 * We do not know the backlog in bytes of this list, it
1139 * is up to the caller to correct it
1140 */
1141 ASSERT_RTNL();
1142 if (qh->qlen) {
1143 rtnl_kfree_skbs(qh->head, qh->tail);
1144
1145 qh->head = NULL;
1146 qh->tail = NULL;
1147 qh->qlen = 0;
1148 }
1149}
1150
1151static inline void qdisc_reset_queue(struct Qdisc *sch)
1152{
1153 __qdisc_reset_queue(&sch->q);
1154 sch->qstats.backlog = 0;
1155}
1156
1157static inline struct Qdisc *qdisc_replace(struct Qdisc *sch, struct Qdisc *new,
1158 struct Qdisc **pold)
1159{
1160 struct Qdisc *old;
1161
1162 sch_tree_lock(sch);
1163 old = *pold;
1164 *pold = new;
1165 if (old != NULL)
1166 qdisc_tree_flush_backlog(old);
1167 sch_tree_unlock(sch);
1168
1169 return old;
1170}
1171
1172static inline void rtnl_qdisc_drop(struct sk_buff *skb, struct Qdisc *sch)
1173{
1174 rtnl_kfree_skbs(skb, skb);
1175 qdisc_qstats_drop(sch);
1176}
1177
1178static inline int qdisc_drop_cpu(struct sk_buff *skb, struct Qdisc *sch,
1179 struct sk_buff **to_free)
1180{
1181 __qdisc_drop(skb, to_free);
1182 qdisc_qstats_cpu_drop(sch);
1183
1184 return NET_XMIT_DROP;
1185}
1186
1187static inline int qdisc_drop(struct sk_buff *skb, struct Qdisc *sch,
1188 struct sk_buff **to_free)
1189{
1190 __qdisc_drop(skb, to_free);
1191 qdisc_qstats_drop(sch);
1192
1193 return NET_XMIT_DROP;
1194}
1195
1196static inline int qdisc_drop_all(struct sk_buff *skb, struct Qdisc *sch,
1197 struct sk_buff **to_free)
1198{
1199 __qdisc_drop_all(skb, to_free);
1200 qdisc_qstats_drop(sch);
1201
1202 return NET_XMIT_DROP;
1203}
1204
1205/* Length to Time (L2T) lookup in a qdisc_rate_table, to determine how
1206 long it will take to send a packet given its size.
1207 */
1208static inline u32 qdisc_l2t(struct qdisc_rate_table* rtab, unsigned int pktlen)
1209{
1210 int slot = pktlen + rtab->rate.cell_align + rtab->rate.overhead;
1211 if (slot < 0)
1212 slot = 0;
1213 slot >>= rtab->rate.cell_log;
1214 if (slot > 255)
1215 return rtab->data[255]*(slot >> 8) + rtab->data[slot & 0xFF];
1216 return rtab->data[slot];
1217}
1218
1219struct psched_ratecfg {
1220 u64 rate_bytes_ps; /* bytes per second */
1221 u32 mult;
1222 u16 overhead;
1223 u8 linklayer;
1224 u8 shift;
1225};
1226
1227static inline u64 psched_l2t_ns(const struct psched_ratecfg *r,
1228 unsigned int len)
1229{
1230 len += r->overhead;
1231
1232 if (unlikely(r->linklayer == TC_LINKLAYER_ATM))
1233 return ((u64)(DIV_ROUND_UP(len,48)*53) * r->mult) >> r->shift;
1234
1235 return ((u64)len * r->mult) >> r->shift;
1236}
1237
1238void psched_ratecfg_precompute(struct psched_ratecfg *r,
1239 const struct tc_ratespec *conf,
1240 u64 rate64);
1241
1242static inline void psched_ratecfg_getrate(struct tc_ratespec *res,
1243 const struct psched_ratecfg *r)
1244{
1245 memset(res, 0, sizeof(*res));
1246
1247 /* legacy struct tc_ratespec has a 32bit @rate field
1248 * Qdisc using 64bit rate should add new attributes
1249 * in order to maintain compatibility.
1250 */
1251 res->rate = min_t(u64, r->rate_bytes_ps, ~0U);
1252
1253 res->overhead = r->overhead;
1254 res->linklayer = (r->linklayer & TC_LINKLAYER_MASK);
1255}
1256
1257/* Mini Qdisc serves for specific needs of ingress/clsact Qdisc.
1258 * The fast path only needs to access filter list and to update stats
1259 */
1260struct mini_Qdisc {
1261 struct tcf_proto *filter_list;
1262 struct gnet_stats_basic_cpu __percpu *cpu_bstats;
1263 struct gnet_stats_queue __percpu *cpu_qstats;
1264 struct rcu_head rcu;
1265};
1266
1267static inline void mini_qdisc_bstats_cpu_update(struct mini_Qdisc *miniq,
1268 const struct sk_buff *skb)
1269{
1270 bstats_cpu_update(this_cpu_ptr(miniq->cpu_bstats), skb);
1271}
1272
1273static inline void mini_qdisc_qstats_cpu_drop(struct mini_Qdisc *miniq)
1274{
1275 this_cpu_inc(miniq->cpu_qstats->drops);
1276}
1277
1278struct mini_Qdisc_pair {
1279 struct mini_Qdisc miniq1;
1280 struct mini_Qdisc miniq2;
1281 struct mini_Qdisc __rcu **p_miniq;
1282};
1283
1284void mini_qdisc_pair_swap(struct mini_Qdisc_pair *miniqp,
1285 struct tcf_proto *tp_head);
1286void mini_qdisc_pair_init(struct mini_Qdisc_pair *miniqp, struct Qdisc *qdisc,
1287 struct mini_Qdisc __rcu **p_miniq);
1288
1289static inline void skb_tc_reinsert(struct sk_buff *skb, struct tcf_result *res)
1290{
1291 struct gnet_stats_queue *stats = res->qstats;
1292 int ret;
1293
1294 if (res->ingress)
1295 ret = netif_receive_skb(skb);
1296 else
1297 ret = dev_queue_xmit(skb);
1298 if (ret && stats)
1299 qstats_overlimit_inc(res->qstats);
1300}
1301
1302#endif