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