root/include/net/sch_generic.h

/* [<][>][^][v][top][bottom][index][help] */

INCLUDED FROM


DEFINITIONS

This source file includes following definitions.
  1. qdisc_refcount_inc
  2. qdisc_refcount_inc_nz
  3. qdisc_is_running
  4. qdisc_is_percpu_stats
  5. qdisc_is_empty
  6. qdisc_run_begin
  7. qdisc_run_end
  8. qdisc_may_bulk
  9. qdisc_avail_bulklimit
  10. lockdep_tcf_chain_is_locked
  11. lockdep_tcf_proto_is_locked
  12. lockdep_tcf_chain_is_locked
  13. lockdep_tcf_proto_is_locked
  14. qdisc_cb_private_validate
  15. qdisc_qlen_cpu
  16. qdisc_qlen
  17. qdisc_qlen_sum
  18. qdisc_lock
  19. qdisc_root
  20. qdisc_root_bh
  21. qdisc_root_sleeping
  22. qdisc_root_lock
  23. qdisc_root_sleeping_lock
  24. qdisc_root_sleeping_running
  25. qdisc_dev
  26. sch_tree_lock
  27. sch_tree_unlock
  28. get_default_qdisc_ops
  29. qdisc_class_hash
  30. qdisc_class_find
  31. tc_classid_to_hwtc
  32. qdisc_offload_dump_helper
  33. qdisc_offload_graft_helper
  34. skb_at_tc_ingress
  35. skb_skip_tc_classify
  36. qdisc_reset_all_tx_gt
  37. qdisc_reset_all_tx
  38. qdisc_all_tx_empty
  39. qdisc_tx_changing
  40. qdisc_tx_is_noop
  41. qdisc_pkt_len
  42. qdisc_calculate_pkt_len
  43. qdisc_enqueue
  44. _bstats_update
  45. bstats_update
  46. _bstats_cpu_update
  47. bstats_cpu_update
  48. qdisc_bstats_cpu_update
  49. qdisc_bstats_update
  50. qdisc_qstats_backlog_dec
  51. qdisc_qstats_cpu_backlog_dec
  52. qdisc_qstats_backlog_inc
  53. qdisc_qstats_cpu_backlog_inc
  54. qdisc_qstats_cpu_qlen_inc
  55. qdisc_qstats_cpu_qlen_dec
  56. qdisc_qstats_cpu_requeues_inc
  57. __qdisc_qstats_drop
  58. qstats_drop_inc
  59. qstats_overlimit_inc
  60. qdisc_qstats_drop
  61. qdisc_qstats_cpu_drop
  62. qdisc_qstats_overlimit
  63. qdisc_qstats_copy
  64. qdisc_qstats_qlen_backlog
  65. qdisc_tree_flush_backlog
  66. qdisc_purge_queue
  67. qdisc_skb_head_init
  68. __qdisc_enqueue_tail
  69. qdisc_enqueue_tail
  70. __qdisc_enqueue_head
  71. __qdisc_dequeue_head
  72. qdisc_dequeue_head
  73. __qdisc_drop
  74. __qdisc_drop_all
  75. __qdisc_queue_drop_head
  76. qdisc_queue_drop_head
  77. qdisc_peek_head
  78. qdisc_peek_dequeued
  79. qdisc_update_stats_at_dequeue
  80. qdisc_update_stats_at_enqueue
  81. qdisc_dequeue_peeked
  82. __qdisc_reset_queue
  83. qdisc_reset_queue
  84. qdisc_replace
  85. rtnl_qdisc_drop
  86. qdisc_drop_cpu
  87. qdisc_drop
  88. qdisc_drop_all
  89. qdisc_l2t
  90. psched_l2t_ns
  91. psched_ratecfg_getrate
  92. mini_qdisc_bstats_cpu_update
  93. mini_qdisc_qstats_cpu_drop
  94. skb_tc_reinsert

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

/* [<][>][^][v][top][bottom][index][help] */