Lines Matching refs:qdisc
81 #define TCQ_F_NOLOCK 0x100 /* qdisc does not require locking */
82 #define TCQ_F_OFFLOADED 0x200 /* qdisc is offloaded to HW */
113 /* for NOLOCK qdisc, true if there are no enqueued skbs */
121 static inline void qdisc_refcount_inc(struct Qdisc *qdisc)
123 if (qdisc->flags & TCQ_F_BUILTIN)
125 refcount_inc(&qdisc->refcnt);
128 /* Intended to be used by unlocked users, when concurrent qdisc release is
132 static inline struct Qdisc *qdisc_refcount_inc_nz(struct Qdisc *qdisc)
134 if (qdisc->flags & TCQ_F_BUILTIN)
135 return qdisc;
136 if (refcount_inc_not_zero(&qdisc->refcnt))
137 return qdisc;
141 static inline bool qdisc_is_running(struct Qdisc *qdisc)
143 if (qdisc->flags & TCQ_F_NOLOCK)
144 return spin_is_locked(&qdisc->seqlock);
145 return (raw_read_seqcount(&qdisc->running) & 1) ? true : false;
153 static inline bool qdisc_is_empty(const struct Qdisc *qdisc)
155 if (qdisc_is_percpu_stats(qdisc))
156 return READ_ONCE(qdisc->empty);
157 return !READ_ONCE(qdisc->q.qlen);
160 static inline bool qdisc_run_begin(struct Qdisc *qdisc)
162 if (qdisc->flags & TCQ_F_NOLOCK) {
163 if (spin_trylock(&qdisc->seqlock))
171 if (test_and_set_bit(__QDISC_STATE_MISSED, &qdisc->state))
178 if (!spin_trylock(&qdisc->seqlock))
182 WRITE_ONCE(qdisc->empty, false);
183 } else if (qdisc_is_running(qdisc)) {
189 raw_write_seqcount_begin(&qdisc->running);
190 seqcount_acquire(&qdisc->running.dep_map, 0, 1, _RET_IP_);
194 static inline void qdisc_run_end(struct Qdisc *qdisc)
196 write_seqcount_end(&qdisc->running);
197 if (qdisc->flags & TCQ_F_NOLOCK) {
198 spin_unlock(&qdisc->seqlock);
207 &qdisc->state))) {
208 clear_bit(__QDISC_STATE_MISSED, &qdisc->state);
209 __netif_schedule(qdisc);
214 static inline bool qdisc_may_bulk(const struct Qdisc *qdisc)
216 return qdisc->flags & TCQ_F_ONETXQUEUE;
231 /* Child qdisc manipulation */
537 static inline spinlock_t *qdisc_lock(struct Qdisc *qdisc)
539 return &qdisc->q.lock;
542 static inline struct Qdisc *qdisc_root(const struct Qdisc *qdisc)
544 struct Qdisc *q = rcu_dereference_rtnl(qdisc->dev_queue->qdisc);
549 static inline struct Qdisc *qdisc_root_bh(const struct Qdisc *qdisc)
551 return rcu_dereference_bh(qdisc->dev_queue->qdisc);
554 static inline struct Qdisc *qdisc_root_sleeping(const struct Qdisc *qdisc)
556 return qdisc->dev_queue->qdisc_sleeping;
559 /* The qdisc root lock is a mechanism by which to top level
560 * of a qdisc tree can be locked from any qdisc node in the
562 * aspect of the qdisc tree while blocking out asynchronous
563 * qdisc access in the packet processing paths.
566 * on us. Otherwise we'll potentially lock the wrong qdisc
570 static inline spinlock_t *qdisc_root_lock(const struct Qdisc *qdisc)
572 struct Qdisc *root = qdisc_root(qdisc);
578 static inline spinlock_t *qdisc_root_sleeping_lock(const struct Qdisc *qdisc)
580 struct Qdisc *root = qdisc_root_sleeping(qdisc);
586 static inline seqcount_t *qdisc_root_sleeping_running(const struct Qdisc *qdisc)
588 struct Qdisc *root = qdisc_root_sleeping(qdisc);
594 static inline struct net_device *qdisc_dev(const struct Qdisc *qdisc)
596 return qdisc->dev_queue->dev;
682 struct Qdisc *qdisc);
683 void qdisc_reset(struct Qdisc *qdisc);
684 void qdisc_put(struct Qdisc *qdisc);
685 void qdisc_put_unlocked(struct Qdisc *qdisc);
686 void qdisc_tree_reduce_backlog(struct Qdisc *qdisc, int n, int len);
714 void qdisc_free(struct Qdisc *qdisc);
745 struct Qdisc *qdisc;
748 qdisc = rtnl_dereference(netdev_get_tx_queue(dev, i)->qdisc);
749 if (qdisc) {
750 spin_lock_bh(qdisc_lock(qdisc));
751 qdisc_reset(qdisc);
752 spin_unlock_bh(qdisc_lock(qdisc));
765 const struct Qdisc *q = rcu_dereference(txq->qdisc);
783 if (rcu_access_pointer(txq->qdisc) != txq->qdisc_sleeping)
789 /* Is the device using the noop qdisc on all queues? */
796 if (rcu_access_pointer(txq->qdisc) != &noop_qdisc)
807 /* additional qdisc xmit flags (NET_XMIT_MASK in linux/netdevice.h) */
1052 /* Instead of calling kfree_skb() while root qdisc lock is held,
1095 /* generic pseudo peek method for non-work-conserving qdisc */
1141 /* use instead of qdisc->dequeue() for all qdiscs queried with ->peek() */
1318 void mini_qdisc_pair_init(struct mini_Qdisc_pair *miniqp, struct Qdisc *qdisc,
1323 /* Make sure qdisc is no longer in SCHED state. */