linux/include/net/sch_generic.h
<<
>>
Prefs
   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 <net/gen_stats.h>
  16#include <net/rtnetlink.h>
  17
  18struct Qdisc_ops;
  19struct qdisc_walker;
  20struct tcf_walker;
  21struct module;
  22
  23struct qdisc_rate_table {
  24        struct tc_ratespec rate;
  25        u32             data[256];
  26        struct qdisc_rate_table *next;
  27        int             refcnt;
  28};
  29
  30enum qdisc_state_t {
  31        __QDISC_STATE_SCHED,
  32        __QDISC_STATE_DEACTIVATED,
  33};
  34
  35struct qdisc_size_table {
  36        struct rcu_head         rcu;
  37        struct list_head        list;
  38        struct tc_sizespec      szopts;
  39        int                     refcnt;
  40        u16                     data[];
  41};
  42
  43/* similar to sk_buff_head, but skb->prev pointer is undefined. */
  44struct qdisc_skb_head {
  45        struct sk_buff  *head;
  46        struct sk_buff  *tail;
  47        __u32           qlen;
  48        spinlock_t      lock;
  49};
  50
  51struct Qdisc {
  52        int                     (*enqueue)(struct sk_buff *skb,
  53                                           struct Qdisc *sch,
  54                                           struct sk_buff **to_free);
  55        struct sk_buff *        (*dequeue)(struct Qdisc *sch);
  56        unsigned int            flags;
  57#define TCQ_F_BUILTIN           1
  58#define TCQ_F_INGRESS           2
  59#define TCQ_F_CAN_BYPASS        4
  60#define TCQ_F_MQROOT            8
  61#define TCQ_F_ONETXQUEUE        0x10 /* dequeue_skb() can assume all skbs are for
  62                                      * q->dev_queue : It can test
  63                                      * netif_xmit_frozen_or_stopped() before
  64                                      * dequeueing next packet.
  65                                      * Its true for MQ/MQPRIO slaves, or non
  66                                      * multiqueue device.
  67                                      */
  68#define TCQ_F_WARN_NONWC        (1 << 16)
  69#define TCQ_F_CPUSTATS          0x20 /* run using percpu statistics */
  70#define TCQ_F_NOPARENT          0x40 /* root of its hierarchy :
  71                                      * qdisc_tree_decrease_qlen() should stop.
  72                                      */
  73#define TCQ_F_INVISIBLE         0x80 /* invisible by default in dump */
  74#define TCQ_F_OFFLOADED         0x200 /* qdisc is offloaded to HW */
  75        u32                     limit;
  76        const struct Qdisc_ops  *ops;
  77        struct qdisc_size_table __rcu *stab;
  78        struct hlist_node       hash;
  79        u32                     handle;
  80        u32                     parent;
  81
  82        struct netdev_queue     *dev_queue;
  83
  84        struct net_rate_estimator __rcu *rate_est;
  85        struct gnet_stats_basic_cpu __percpu *cpu_bstats;
  86        struct gnet_stats_queue __percpu *cpu_qstats;
  87
  88        /*
  89         * For performance sake on SMP, we put highly modified fields at the end
  90         */
  91        struct sk_buff          *gso_skb ____cacheline_aligned_in_smp;
  92        struct qdisc_skb_head   q;
  93        struct gnet_stats_basic_packed bstats;
  94        seqcount_t              running;
  95        struct gnet_stats_queue qstats;
  96        unsigned long           state;
  97        struct Qdisc            *next_sched;
  98        struct sk_buff          *skb_bad_txq;
  99        int                     padded;
 100        refcount_t              refcnt;
 101
 102        spinlock_t              busylock ____cacheline_aligned_in_smp;
 103};
 104
 105static inline void qdisc_refcount_inc(struct Qdisc *qdisc)
 106{
 107        if (qdisc->flags & TCQ_F_BUILTIN)
 108                return;
 109        refcount_inc(&qdisc->refcnt);
 110}
 111
 112static inline bool qdisc_is_running(const struct Qdisc *qdisc)
 113{
 114        return (raw_read_seqcount(&qdisc->running) & 1) ? true : false;
 115}
 116
 117static inline bool qdisc_run_begin(struct Qdisc *qdisc)
 118{
 119        if (qdisc_is_running(qdisc))
 120                return false;
 121        /* Variant of write_seqcount_begin() telling lockdep a trylock
 122         * was attempted.
 123         */
 124        raw_write_seqcount_begin(&qdisc->running);
 125        seqcount_acquire(&qdisc->running.dep_map, 0, 1, _RET_IP_);
 126        return true;
 127}
 128
 129static inline void qdisc_run_end(struct Qdisc *qdisc)
 130{
 131        write_seqcount_end(&qdisc->running);
 132}
 133
 134static inline bool qdisc_may_bulk(const struct Qdisc *qdisc)
 135{
 136        return qdisc->flags & TCQ_F_ONETXQUEUE;
 137}
 138
 139static inline int qdisc_avail_bulklimit(const struct netdev_queue *txq)
 140{
 141#ifdef CONFIG_BQL
 142        /* Non-BQL migrated drivers will return 0, too. */
 143        return dql_avail(&txq->dql);
 144#else
 145        return 0;
 146#endif
 147}
 148
 149struct Qdisc_class_ops {
 150        /* Child qdisc manipulation */
 151        struct netdev_queue *   (*select_queue)(struct Qdisc *, struct tcmsg *);
 152        int                     (*graft)(struct Qdisc *, unsigned long cl,
 153                                        struct Qdisc *, struct Qdisc **);
 154        struct Qdisc *          (*leaf)(struct Qdisc *, unsigned long cl);
 155        void                    (*qlen_notify)(struct Qdisc *, unsigned long);
 156
 157        /* Class manipulation routines */
 158        unsigned long           (*find)(struct Qdisc *, u32 classid);
 159        int                     (*change)(struct Qdisc *, u32, u32,
 160                                        struct nlattr **, unsigned long *);
 161        int                     (*delete)(struct Qdisc *, unsigned long);
 162        void                    (*walk)(struct Qdisc *, struct qdisc_walker * arg);
 163
 164        /* Filter manipulation */
 165        struct tcf_block *      (*tcf_block)(struct Qdisc *, unsigned long);
 166        unsigned long           (*bind_tcf)(struct Qdisc *, unsigned long,
 167                                        u32 classid);
 168        void                    (*unbind_tcf)(struct Qdisc *, unsigned long);
 169
 170        /* rtnetlink specific */
 171        int                     (*dump)(struct Qdisc *, unsigned long,
 172                                        struct sk_buff *skb, struct tcmsg*);
 173        int                     (*dump_stats)(struct Qdisc *, unsigned long,
 174                                        struct gnet_dump *);
 175};
 176
 177struct Qdisc_ops {
 178        struct Qdisc_ops        *next;
 179        const struct Qdisc_class_ops    *cl_ops;
 180        char                    id[IFNAMSIZ];
 181        int                     priv_size;
 182        unsigned int            static_flags;
 183
 184        int                     (*enqueue)(struct sk_buff *skb,
 185                                           struct Qdisc *sch,
 186                                           struct sk_buff **to_free);
 187        struct sk_buff *        (*dequeue)(struct Qdisc *);
 188        struct sk_buff *        (*peek)(struct Qdisc *);
 189
 190        int                     (*init)(struct Qdisc *, struct nlattr *arg);
 191        void                    (*reset)(struct Qdisc *);
 192        void                    (*destroy)(struct Qdisc *);
 193        int                     (*change)(struct Qdisc *, struct nlattr *arg);
 194        void                    (*attach)(struct Qdisc *);
 195
 196        int                     (*dump)(struct Qdisc *, struct sk_buff *);
 197        int                     (*dump_stats)(struct Qdisc *, struct gnet_dump *);
 198
 199        struct module           *owner;
 200};
 201
 202
 203struct tcf_result {
 204        union {
 205                struct {
 206                        unsigned long   class;
 207                        u32             classid;
 208                };
 209                const struct tcf_proto *goto_tp;
 210        };
 211};
 212
 213struct tcf_proto_ops {
 214        struct list_head        head;
 215        char                    kind[IFNAMSIZ];
 216
 217        int                     (*classify)(struct sk_buff *,
 218                                            const struct tcf_proto *,
 219                                            struct tcf_result *);
 220        int                     (*init)(struct tcf_proto*);
 221        void                    (*destroy)(struct tcf_proto*);
 222
 223        void*                   (*get)(struct tcf_proto*, u32 handle);
 224        int                     (*change)(struct net *net, struct sk_buff *,
 225                                        struct tcf_proto*, unsigned long,
 226                                        u32 handle, struct nlattr **,
 227                                        void **, bool);
 228        int                     (*delete)(struct tcf_proto*, void *, bool*);
 229        void                    (*walk)(struct tcf_proto*, struct tcf_walker *arg);
 230        void                    (*bind_class)(void *, u32, unsigned long);
 231
 232        /* rtnetlink specific */
 233        int                     (*dump)(struct net*, struct tcf_proto*, void *,
 234                                        struct sk_buff *skb, struct tcmsg*);
 235
 236        struct module           *owner;
 237};
 238
 239struct tcf_proto {
 240        /* Fast access part */
 241        struct tcf_proto __rcu  *next;
 242        void __rcu              *root;
 243        int                     (*classify)(struct sk_buff *,
 244                                            const struct tcf_proto *,
 245                                            struct tcf_result *);
 246        __be16                  protocol;
 247
 248        /* All the rest */
 249        u32                     prio;
 250        u32                     classid;
 251        struct Qdisc            *q;
 252        void                    *data;
 253        const struct tcf_proto_ops      *ops;
 254        struct tcf_chain        *chain;
 255        struct rcu_head         rcu;
 256};
 257
 258struct qdisc_skb_cb {
 259        unsigned int            pkt_len;
 260        u16                     slave_dev_queue_mapping;
 261        u16                     tc_classid;
 262#define QDISC_CB_PRIV_LEN 20
 263        unsigned char           data[QDISC_CB_PRIV_LEN];
 264};
 265
 266typedef void tcf_chain_head_change_t(struct tcf_proto *tp_head, void *priv);
 267
 268struct tcf_chain {
 269        struct tcf_proto __rcu *filter_chain;
 270        tcf_chain_head_change_t *chain_head_change;
 271        void *chain_head_change_priv;
 272        struct list_head list;
 273        struct tcf_block *block;
 274        u32 index; /* chain index */
 275        unsigned int refcnt;
 276};
 277
 278struct tcf_block {
 279        struct list_head chain_list;
 280        struct net *net;
 281        struct Qdisc *q;
 282        struct list_head cb_list;
 283        struct work_struct work;
 284};
 285
 286static inline void qdisc_cb_private_validate(const struct sk_buff *skb, int sz)
 287{
 288        struct qdisc_skb_cb *qcb;
 289
 290        BUILD_BUG_ON(sizeof(skb->cb) < offsetof(struct qdisc_skb_cb, data) + sz);
 291        BUILD_BUG_ON(sizeof(qcb->data) < sz);
 292}
 293
 294static inline int qdisc_qlen(const struct Qdisc *q)
 295{
 296        return q->q.qlen;
 297}
 298
 299static inline struct qdisc_skb_cb *qdisc_skb_cb(const struct sk_buff *skb)
 300{
 301        return (struct qdisc_skb_cb *)skb->cb;
 302}
 303
 304static inline spinlock_t *qdisc_lock(struct Qdisc *qdisc)
 305{
 306        return &qdisc->q.lock;
 307}
 308
 309static inline struct Qdisc *qdisc_root(const struct Qdisc *qdisc)
 310{
 311        struct Qdisc *q = rcu_dereference_rtnl(qdisc->dev_queue->qdisc);
 312
 313        return q;
 314}
 315
 316static inline struct Qdisc *qdisc_root_sleeping(const struct Qdisc *qdisc)
 317{
 318        return qdisc->dev_queue->qdisc_sleeping;
 319}
 320
 321/* The qdisc root lock is a mechanism by which to top level
 322 * of a qdisc tree can be locked from any qdisc node in the
 323 * forest.  This allows changing the configuration of some
 324 * aspect of the qdisc tree while blocking out asynchronous
 325 * qdisc access in the packet processing paths.
 326 *
 327 * It is only legal to do this when the root will not change
 328 * on us.  Otherwise we'll potentially lock the wrong qdisc
 329 * root.  This is enforced by holding the RTNL semaphore, which
 330 * all users of this lock accessor must do.
 331 */
 332static inline spinlock_t *qdisc_root_lock(const struct Qdisc *qdisc)
 333{
 334        struct Qdisc *root = qdisc_root(qdisc);
 335
 336        ASSERT_RTNL();
 337        return qdisc_lock(root);
 338}
 339
 340static inline spinlock_t *qdisc_root_sleeping_lock(const struct Qdisc *qdisc)
 341{
 342        struct Qdisc *root = qdisc_root_sleeping(qdisc);
 343
 344        ASSERT_RTNL();
 345        return qdisc_lock(root);
 346}
 347
 348static inline seqcount_t *qdisc_root_sleeping_running(const struct Qdisc *qdisc)
 349{
 350        struct Qdisc *root = qdisc_root_sleeping(qdisc);
 351
 352        ASSERT_RTNL();
 353        return &root->running;
 354}
 355
 356static inline struct net_device *qdisc_dev(const struct Qdisc *qdisc)
 357{
 358        return qdisc->dev_queue->dev;
 359}
 360
 361static inline void sch_tree_lock(const struct Qdisc *q)
 362{
 363        spin_lock_bh(qdisc_root_sleeping_lock(q));
 364}
 365
 366static inline void sch_tree_unlock(const struct Qdisc *q)
 367{
 368        spin_unlock_bh(qdisc_root_sleeping_lock(q));
 369}
 370
 371extern struct Qdisc noop_qdisc;
 372extern struct Qdisc_ops noop_qdisc_ops;
 373extern struct Qdisc_ops pfifo_fast_ops;
 374extern struct Qdisc_ops mq_qdisc_ops;
 375extern struct Qdisc_ops noqueue_qdisc_ops;
 376extern const struct Qdisc_ops *default_qdisc_ops;
 377static inline const struct Qdisc_ops *
 378get_default_qdisc_ops(const struct net_device *dev, int ntx)
 379{
 380        return ntx < dev->real_num_tx_queues ?
 381                        default_qdisc_ops : &pfifo_fast_ops;
 382}
 383
 384struct Qdisc_class_common {
 385        u32                     classid;
 386        struct hlist_node       hnode;
 387};
 388
 389struct Qdisc_class_hash {
 390        struct hlist_head       *hash;
 391        unsigned int            hashsize;
 392        unsigned int            hashmask;
 393        unsigned int            hashelems;
 394};
 395
 396static inline unsigned int qdisc_class_hash(u32 id, u32 mask)
 397{
 398        id ^= id >> 8;
 399        id ^= id >> 4;
 400        return id & mask;
 401}
 402
 403static inline struct Qdisc_class_common *
 404qdisc_class_find(const struct Qdisc_class_hash *hash, u32 id)
 405{
 406        struct Qdisc_class_common *cl;
 407        unsigned int h;
 408
 409        if (!id)
 410                return NULL;
 411
 412        h = qdisc_class_hash(id, hash->hashmask);
 413        hlist_for_each_entry(cl, &hash->hash[h], hnode) {
 414                if (cl->classid == id)
 415                        return cl;
 416        }
 417        return NULL;
 418}
 419
 420static inline int tc_classid_to_hwtc(struct net_device *dev, u32 classid)
 421{
 422        u32 hwtc = TC_H_MIN(classid) - TC_H_MIN_PRIORITY;
 423
 424        return (hwtc < netdev_get_num_tc(dev)) ? hwtc : -EINVAL;
 425}
 426
 427int qdisc_class_hash_init(struct Qdisc_class_hash *);
 428void qdisc_class_hash_insert(struct Qdisc_class_hash *,
 429                             struct Qdisc_class_common *);
 430void qdisc_class_hash_remove(struct Qdisc_class_hash *,
 431                             struct Qdisc_class_common *);
 432void qdisc_class_hash_grow(struct Qdisc *, struct Qdisc_class_hash *);
 433void qdisc_class_hash_destroy(struct Qdisc_class_hash *);
 434
 435void dev_init_scheduler(struct net_device *dev);
 436void dev_shutdown(struct net_device *dev);
 437void dev_activate(struct net_device *dev);
 438void dev_deactivate(struct net_device *dev);
 439void dev_deactivate_many(struct list_head *head);
 440struct Qdisc *dev_graft_qdisc(struct netdev_queue *dev_queue,
 441                              struct Qdisc *qdisc);
 442void qdisc_reset(struct Qdisc *qdisc);
 443void qdisc_destroy(struct Qdisc *qdisc);
 444void qdisc_tree_reduce_backlog(struct Qdisc *qdisc, unsigned int n,
 445                               unsigned int len);
 446struct Qdisc *qdisc_alloc(struct netdev_queue *dev_queue,
 447                          const struct Qdisc_ops *ops);
 448void qdisc_free(struct Qdisc *qdisc);
 449struct Qdisc *qdisc_create_dflt(struct netdev_queue *dev_queue,
 450                                const struct Qdisc_ops *ops, u32 parentid);
 451void __qdisc_calculate_pkt_len(struct sk_buff *skb,
 452                               const struct qdisc_size_table *stab);
 453int skb_do_redirect(struct sk_buff *);
 454
 455static inline void skb_reset_tc(struct sk_buff *skb)
 456{
 457#ifdef CONFIG_NET_CLS_ACT
 458        skb->tc_redirected = 0;
 459#endif
 460}
 461
 462static inline bool skb_at_tc_ingress(const struct sk_buff *skb)
 463{
 464#ifdef CONFIG_NET_CLS_ACT
 465        return skb->tc_at_ingress;
 466#else
 467        return false;
 468#endif
 469}
 470
 471static inline bool skb_skip_tc_classify(struct sk_buff *skb)
 472{
 473#ifdef CONFIG_NET_CLS_ACT
 474        if (skb->tc_skip_classify) {
 475                skb->tc_skip_classify = 0;
 476                return true;
 477        }
 478#endif
 479        return false;
 480}
 481
 482/* Reset all TX qdiscs greater then index of a device.  */
 483static inline void qdisc_reset_all_tx_gt(struct net_device *dev, unsigned int i)
 484{
 485        struct Qdisc *qdisc;
 486
 487        for (; i < dev->num_tx_queues; i++) {
 488                qdisc = rtnl_dereference(netdev_get_tx_queue(dev, i)->qdisc);
 489                if (qdisc) {
 490                        spin_lock_bh(qdisc_lock(qdisc));
 491                        qdisc_reset(qdisc);
 492                        spin_unlock_bh(qdisc_lock(qdisc));
 493                }
 494        }
 495}
 496
 497static inline void qdisc_reset_all_tx(struct net_device *dev)
 498{
 499        qdisc_reset_all_tx_gt(dev, 0);
 500}
 501
 502/* Are all TX queues of the device empty?  */
 503static inline bool qdisc_all_tx_empty(const struct net_device *dev)
 504{
 505        unsigned int i;
 506
 507        rcu_read_lock();
 508        for (i = 0; i < dev->num_tx_queues; i++) {
 509                struct netdev_queue *txq = netdev_get_tx_queue(dev, i);
 510                const struct Qdisc *q = rcu_dereference(txq->qdisc);
 511
 512                if (q->q.qlen) {
 513                        rcu_read_unlock();
 514                        return false;
 515                }
 516        }
 517        rcu_read_unlock();
 518        return true;
 519}
 520
 521/* Are any of the TX qdiscs changing?  */
 522static inline bool qdisc_tx_changing(const struct net_device *dev)
 523{
 524        unsigned int i;
 525
 526        for (i = 0; i < dev->num_tx_queues; i++) {
 527                struct netdev_queue *txq = netdev_get_tx_queue(dev, i);
 528                if (rcu_access_pointer(txq->qdisc) != txq->qdisc_sleeping)
 529                        return true;
 530        }
 531        return false;
 532}
 533
 534/* Is the device using the noop qdisc on all queues?  */
 535static inline bool qdisc_tx_is_noop(const struct net_device *dev)
 536{
 537        unsigned int i;
 538
 539        for (i = 0; i < dev->num_tx_queues; i++) {
 540                struct netdev_queue *txq = netdev_get_tx_queue(dev, i);
 541                if (rcu_access_pointer(txq->qdisc) != &noop_qdisc)
 542                        return false;
 543        }
 544        return true;
 545}
 546
 547static inline unsigned int qdisc_pkt_len(const struct sk_buff *skb)
 548{
 549        return qdisc_skb_cb(skb)->pkt_len;
 550}
 551
 552/* additional qdisc xmit flags (NET_XMIT_MASK in linux/netdevice.h) */
 553enum net_xmit_qdisc_t {
 554        __NET_XMIT_STOLEN = 0x00010000,
 555        __NET_XMIT_BYPASS = 0x00020000,
 556};
 557
 558#ifdef CONFIG_NET_CLS_ACT
 559#define net_xmit_drop_count(e)  ((e) & __NET_XMIT_STOLEN ? 0 : 1)
 560#else
 561#define net_xmit_drop_count(e)  (1)
 562#endif
 563
 564static inline void qdisc_calculate_pkt_len(struct sk_buff *skb,
 565                                           const struct Qdisc *sch)
 566{
 567#ifdef CONFIG_NET_SCHED
 568        struct qdisc_size_table *stab = rcu_dereference_bh(sch->stab);
 569
 570        if (stab)
 571                __qdisc_calculate_pkt_len(skb, stab);
 572#endif
 573}
 574
 575static inline int qdisc_enqueue(struct sk_buff *skb, struct Qdisc *sch,
 576                                struct sk_buff **to_free)
 577{
 578        qdisc_calculate_pkt_len(skb, sch);
 579        return sch->enqueue(skb, sch, to_free);
 580}
 581
 582static inline bool qdisc_is_percpu_stats(const struct Qdisc *q)
 583{
 584        return q->flags & TCQ_F_CPUSTATS;
 585}
 586
 587static inline void _bstats_update(struct gnet_stats_basic_packed *bstats,
 588                                  __u64 bytes, __u32 packets)
 589{
 590        bstats->bytes += bytes;
 591        bstats->packets += packets;
 592}
 593
 594static inline void bstats_update(struct gnet_stats_basic_packed *bstats,
 595                                 const struct sk_buff *skb)
 596{
 597        _bstats_update(bstats,
 598                       qdisc_pkt_len(skb),
 599                       skb_is_gso(skb) ? skb_shinfo(skb)->gso_segs : 1);
 600}
 601
 602static inline void _bstats_cpu_update(struct gnet_stats_basic_cpu *bstats,
 603                                      __u64 bytes, __u32 packets)
 604{
 605        u64_stats_update_begin(&bstats->syncp);
 606        _bstats_update(&bstats->bstats, bytes, packets);
 607        u64_stats_update_end(&bstats->syncp);
 608}
 609
 610static inline void bstats_cpu_update(struct gnet_stats_basic_cpu *bstats,
 611                                     const struct sk_buff *skb)
 612{
 613        u64_stats_update_begin(&bstats->syncp);
 614        bstats_update(&bstats->bstats, skb);
 615        u64_stats_update_end(&bstats->syncp);
 616}
 617
 618static inline void qdisc_bstats_cpu_update(struct Qdisc *sch,
 619                                           const struct sk_buff *skb)
 620{
 621        bstats_cpu_update(this_cpu_ptr(sch->cpu_bstats), skb);
 622}
 623
 624static inline void qdisc_bstats_update(struct Qdisc *sch,
 625                                       const struct sk_buff *skb)
 626{
 627        bstats_update(&sch->bstats, skb);
 628}
 629
 630static inline void qdisc_qstats_backlog_dec(struct Qdisc *sch,
 631                                            const struct sk_buff *skb)
 632{
 633        sch->qstats.backlog -= qdisc_pkt_len(skb);
 634}
 635
 636static inline void qdisc_qstats_backlog_inc(struct Qdisc *sch,
 637                                            const struct sk_buff *skb)
 638{
 639        sch->qstats.backlog += qdisc_pkt_len(skb);
 640}
 641
 642static inline void __qdisc_qstats_drop(struct Qdisc *sch, int count)
 643{
 644        sch->qstats.drops += count;
 645}
 646
 647static inline void qstats_drop_inc(struct gnet_stats_queue *qstats)
 648{
 649        qstats->drops++;
 650}
 651
 652static inline void qstats_overlimit_inc(struct gnet_stats_queue *qstats)
 653{
 654        qstats->overlimits++;
 655}
 656
 657static inline void qdisc_qstats_drop(struct Qdisc *sch)
 658{
 659        qstats_drop_inc(&sch->qstats);
 660}
 661
 662static inline void qdisc_qstats_cpu_drop(struct Qdisc *sch)
 663{
 664        this_cpu_inc(sch->cpu_qstats->drops);
 665}
 666
 667static inline void qdisc_qstats_overlimit(struct Qdisc *sch)
 668{
 669        sch->qstats.overlimits++;
 670}
 671
 672static inline void qdisc_skb_head_init(struct qdisc_skb_head *qh)
 673{
 674        qh->head = NULL;
 675        qh->tail = NULL;
 676        qh->qlen = 0;
 677}
 678
 679static inline int __qdisc_enqueue_tail(struct sk_buff *skb, struct Qdisc *sch,
 680                                       struct qdisc_skb_head *qh)
 681{
 682        struct sk_buff *last = qh->tail;
 683
 684        if (last) {
 685                skb->next = NULL;
 686                last->next = skb;
 687                qh->tail = skb;
 688        } else {
 689                qh->tail = skb;
 690                qh->head = skb;
 691        }
 692        qh->qlen++;
 693        qdisc_qstats_backlog_inc(sch, skb);
 694
 695        return NET_XMIT_SUCCESS;
 696}
 697
 698static inline int qdisc_enqueue_tail(struct sk_buff *skb, struct Qdisc *sch)
 699{
 700        return __qdisc_enqueue_tail(skb, sch, &sch->q);
 701}
 702
 703static inline struct sk_buff *__qdisc_dequeue_head(struct qdisc_skb_head *qh)
 704{
 705        struct sk_buff *skb = qh->head;
 706
 707        if (likely(skb != NULL)) {
 708                qh->head = skb->next;
 709                qh->qlen--;
 710                if (qh->head == NULL)
 711                        qh->tail = NULL;
 712                skb->next = NULL;
 713        }
 714
 715        return skb;
 716}
 717
 718static inline struct sk_buff *qdisc_dequeue_head(struct Qdisc *sch)
 719{
 720        struct sk_buff *skb = __qdisc_dequeue_head(&sch->q);
 721
 722        if (likely(skb != NULL)) {
 723                qdisc_qstats_backlog_dec(sch, skb);
 724                qdisc_bstats_update(sch, skb);
 725        }
 726
 727        return skb;
 728}
 729
 730/* Instead of calling kfree_skb() while root qdisc lock is held,
 731 * queue the skb for future freeing at end of __dev_xmit_skb()
 732 */
 733static inline void __qdisc_drop(struct sk_buff *skb, struct sk_buff **to_free)
 734{
 735        skb->next = *to_free;
 736        *to_free = skb;
 737}
 738
 739static inline unsigned int __qdisc_queue_drop_head(struct Qdisc *sch,
 740                                                   struct qdisc_skb_head *qh,
 741                                                   struct sk_buff **to_free)
 742{
 743        struct sk_buff *skb = __qdisc_dequeue_head(qh);
 744
 745        if (likely(skb != NULL)) {
 746                unsigned int len = qdisc_pkt_len(skb);
 747
 748                qdisc_qstats_backlog_dec(sch, skb);
 749                __qdisc_drop(skb, to_free);
 750                return len;
 751        }
 752
 753        return 0;
 754}
 755
 756static inline unsigned int qdisc_queue_drop_head(struct Qdisc *sch,
 757                                                 struct sk_buff **to_free)
 758{
 759        return __qdisc_queue_drop_head(sch, &sch->q, to_free);
 760}
 761
 762static inline struct sk_buff *qdisc_peek_head(struct Qdisc *sch)
 763{
 764        const struct qdisc_skb_head *qh = &sch->q;
 765
 766        return qh->head;
 767}
 768
 769/* generic pseudo peek method for non-work-conserving qdisc */
 770static inline struct sk_buff *qdisc_peek_dequeued(struct Qdisc *sch)
 771{
 772        /* we can reuse ->gso_skb because peek isn't called for root qdiscs */
 773        if (!sch->gso_skb) {
 774                sch->gso_skb = sch->dequeue(sch);
 775                if (sch->gso_skb) {
 776                        /* it's still part of the queue */
 777                        qdisc_qstats_backlog_inc(sch, sch->gso_skb);
 778                        sch->q.qlen++;
 779                }
 780        }
 781
 782        return sch->gso_skb;
 783}
 784
 785/* use instead of qdisc->dequeue() for all qdiscs queried with ->peek() */
 786static inline struct sk_buff *qdisc_dequeue_peeked(struct Qdisc *sch)
 787{
 788        struct sk_buff *skb = sch->gso_skb;
 789
 790        if (skb) {
 791                sch->gso_skb = NULL;
 792                qdisc_qstats_backlog_dec(sch, skb);
 793                sch->q.qlen--;
 794        } else {
 795                skb = sch->dequeue(sch);
 796        }
 797
 798        return skb;
 799}
 800
 801static inline void __qdisc_reset_queue(struct qdisc_skb_head *qh)
 802{
 803        /*
 804         * We do not know the backlog in bytes of this list, it
 805         * is up to the caller to correct it
 806         */
 807        ASSERT_RTNL();
 808        if (qh->qlen) {
 809                rtnl_kfree_skbs(qh->head, qh->tail);
 810
 811                qh->head = NULL;
 812                qh->tail = NULL;
 813                qh->qlen = 0;
 814        }
 815}
 816
 817static inline void qdisc_reset_queue(struct Qdisc *sch)
 818{
 819        __qdisc_reset_queue(&sch->q);
 820        sch->qstats.backlog = 0;
 821}
 822
 823static inline struct Qdisc *qdisc_replace(struct Qdisc *sch, struct Qdisc *new,
 824                                          struct Qdisc **pold)
 825{
 826        struct Qdisc *old;
 827
 828        sch_tree_lock(sch);
 829        old = *pold;
 830        *pold = new;
 831        if (old != NULL) {
 832                unsigned int qlen = old->q.qlen;
 833                unsigned int backlog = old->qstats.backlog;
 834
 835                qdisc_reset(old);
 836                qdisc_tree_reduce_backlog(old, qlen, backlog);
 837        }
 838        sch_tree_unlock(sch);
 839
 840        return old;
 841}
 842
 843static inline void rtnl_qdisc_drop(struct sk_buff *skb, struct Qdisc *sch)
 844{
 845        rtnl_kfree_skbs(skb, skb);
 846        qdisc_qstats_drop(sch);
 847}
 848
 849
 850static inline int qdisc_drop(struct sk_buff *skb, struct Qdisc *sch,
 851                             struct sk_buff **to_free)
 852{
 853        __qdisc_drop(skb, to_free);
 854        qdisc_qstats_drop(sch);
 855
 856        return NET_XMIT_DROP;
 857}
 858
 859/* Length to Time (L2T) lookup in a qdisc_rate_table, to determine how
 860   long it will take to send a packet given its size.
 861 */
 862static inline u32 qdisc_l2t(struct qdisc_rate_table* rtab, unsigned int pktlen)
 863{
 864        int slot = pktlen + rtab->rate.cell_align + rtab->rate.overhead;
 865        if (slot < 0)
 866                slot = 0;
 867        slot >>= rtab->rate.cell_log;
 868        if (slot > 255)
 869                return rtab->data[255]*(slot >> 8) + rtab->data[slot & 0xFF];
 870        return rtab->data[slot];
 871}
 872
 873struct psched_ratecfg {
 874        u64     rate_bytes_ps; /* bytes per second */
 875        u32     mult;
 876        u16     overhead;
 877        u8      linklayer;
 878        u8      shift;
 879};
 880
 881static inline u64 psched_l2t_ns(const struct psched_ratecfg *r,
 882                                unsigned int len)
 883{
 884        len += r->overhead;
 885
 886        if (unlikely(r->linklayer == TC_LINKLAYER_ATM))
 887                return ((u64)(DIV_ROUND_UP(len,48)*53) * r->mult) >> r->shift;
 888
 889        return ((u64)len * r->mult) >> r->shift;
 890}
 891
 892void psched_ratecfg_precompute(struct psched_ratecfg *r,
 893                               const struct tc_ratespec *conf,
 894                               u64 rate64);
 895
 896static inline void psched_ratecfg_getrate(struct tc_ratespec *res,
 897                                          const struct psched_ratecfg *r)
 898{
 899        memset(res, 0, sizeof(*res));
 900
 901        /* legacy struct tc_ratespec has a 32bit @rate field
 902         * Qdisc using 64bit rate should add new attributes
 903         * in order to maintain compatibility.
 904         */
 905        res->rate = min_t(u64, r->rate_bytes_ps, ~0U);
 906
 907        res->overhead = r->overhead;
 908        res->linklayer = (r->linklayer & TC_LINKLAYER_MASK);
 909}
 910
 911/* Mini Qdisc serves for specific needs of ingress/clsact Qdisc.
 912 * The fast path only needs to access filter list and to update stats
 913 */
 914struct mini_Qdisc {
 915        struct tcf_proto *filter_list;
 916        struct gnet_stats_basic_cpu __percpu *cpu_bstats;
 917        struct gnet_stats_queue __percpu *cpu_qstats;
 918        struct rcu_head rcu;
 919};
 920
 921static inline void mini_qdisc_bstats_cpu_update(struct mini_Qdisc *miniq,
 922                                                const struct sk_buff *skb)
 923{
 924        bstats_cpu_update(this_cpu_ptr(miniq->cpu_bstats), skb);
 925}
 926
 927static inline void mini_qdisc_qstats_cpu_drop(struct mini_Qdisc *miniq)
 928{
 929        this_cpu_inc(miniq->cpu_qstats->drops);
 930}
 931
 932struct mini_Qdisc_pair {
 933        struct mini_Qdisc miniq1;
 934        struct mini_Qdisc miniq2;
 935        struct mini_Qdisc __rcu **p_miniq;
 936};
 937
 938void mini_qdisc_pair_swap(struct mini_Qdisc_pair *miniqp,
 939                          struct tcf_proto *tp_head);
 940void mini_qdisc_pair_init(struct mini_Qdisc_pair *miniqp, struct Qdisc *qdisc,
 941                          struct mini_Qdisc __rcu **p_miniq);
 942
 943#endif
 944