blk-mq: really fix plug list flushing for nomerge queues
[linux-2.6-block.git] / include / net / pkt_sched.h
CommitLineData
1da177e4
LT
1#ifndef __NET_PKT_SCHED_H
2#define __NET_PKT_SCHED_H
3
538e43a4 4#include <linux/jiffies.h>
641b9e0e 5#include <linux/ktime.h>
d8b9605d 6#include <linux/if_vlan.h>
1da177e4
LT
7#include <net/sch_generic.h>
8
fd2c3ef7 9struct qdisc_walker {
1da177e4
LT
10 int stop;
11 int skip;
12 int count;
13 int (*fn)(struct Qdisc *, unsigned long cl, struct qdisc_walker *);
14};
15
5d944c64 16#define QDISC_ALIGNTO 64
3d54b82f 17#define QDISC_ALIGN(len) (((len) + QDISC_ALIGNTO-1) & ~(QDISC_ALIGNTO-1))
1da177e4
LT
18
19static inline void *qdisc_priv(struct Qdisc *q)
20{
3d54b82f 21 return (char *) q + QDISC_ALIGN(sizeof(struct Qdisc));
1da177e4
LT
22}
23
24/*
25 Timer resolution MUST BE < 10% of min_schedulable_packet_size/bandwidth
26
27 Normal IP packet size ~ 512byte, hence:
28
29 0.5Kbyte/1Mbyte/sec = 0.5msec, so that we need 50usec timer for
30 10Mbit ethernet.
31
32 10msec resolution -> <50Kbit/sec.
33
34 The result: [34]86 is not good choice for QoS router :-(
35
25985edc 36 The things are not so bad, because we may use artificial
1da177e4
LT
37 clock evaluated by integration of network data flow
38 in the most critical places.
1da177e4
LT
39 */
40
1da177e4
LT
41typedef u64 psched_time_t;
42typedef long psched_tdiff_t;
43
a4a710c4
JP
44/* Avoid doing 64 bit divide */
45#define PSCHED_SHIFT 6
ca44d6e6
JP
46#define PSCHED_TICKS2NS(x) ((s64)(x) << PSCHED_SHIFT)
47#define PSCHED_NS2TICKS(x) ((x) >> PSCHED_SHIFT)
1da177e4 48
ca44d6e6 49#define PSCHED_TICKS_PER_SEC PSCHED_NS2TICKS(NSEC_PER_SEC)
a084980d 50#define PSCHED_PASTPERFECT 0
1da177e4 51
3bebcda2
PM
52static inline psched_time_t psched_get_time(void)
53{
d2de875c 54 return PSCHED_NS2TICKS(ktime_get_ns());
3bebcda2
PM
55}
56
03cc45c0
PM
57static inline psched_tdiff_t
58psched_tdiff_bounded(psched_time_t tv1, psched_time_t tv2, psched_time_t bound)
59{
60 return min(tv1 - tv2, bound);
61}
62
4179477f
PM
63struct qdisc_watchdog {
64 struct hrtimer timer;
65 struct Qdisc *qdisc;
66};
67
5c15257f 68void qdisc_watchdog_init(struct qdisc_watchdog *wd, struct Qdisc *qdisc);
f2600cf0 69void qdisc_watchdog_schedule_ns(struct qdisc_watchdog *wd, u64 expires, bool throttle);
34c5d292
JP
70
71static inline void qdisc_watchdog_schedule(struct qdisc_watchdog *wd,
72 psched_time_t expires)
73{
f2600cf0 74 qdisc_watchdog_schedule_ns(wd, PSCHED_TICKS2NS(expires), true);
34c5d292
JP
75}
76
5c15257f 77void qdisc_watchdog_cancel(struct qdisc_watchdog *wd);
4179477f 78
1da177e4
LT
79extern struct Qdisc_ops pfifo_qdisc_ops;
80extern struct Qdisc_ops bfifo_qdisc_ops;
57dbb2d8 81extern struct Qdisc_ops pfifo_head_drop_qdisc_ops;
1da177e4 82
5c15257f
JP
83int fifo_set_limit(struct Qdisc *q, unsigned int limit);
84struct Qdisc *fifo_create_dflt(struct Qdisc *sch, struct Qdisc_ops *ops,
85 unsigned int limit);
86
87int register_qdisc(struct Qdisc_ops *qops);
88int unregister_qdisc(struct Qdisc_ops *qops);
6da7c8fc 89void qdisc_get_default(char *id, size_t len);
90int qdisc_set_default(const char *id);
91
95dc1929 92void qdisc_list_add(struct Qdisc *q);
5c15257f
JP
93void qdisc_list_del(struct Qdisc *q);
94struct Qdisc *qdisc_lookup(struct net_device *dev, u32 handle);
95struct Qdisc *qdisc_lookup_class(struct net_device *dev, u32 handle);
96struct qdisc_rate_table *qdisc_get_rtab(struct tc_ratespec *r,
97 struct nlattr *tab);
98void qdisc_put_rtab(struct qdisc_rate_table *tab);
99void qdisc_put_stab(struct qdisc_size_table *tab);
6e765a00 100void qdisc_warn_nonwc(const char *txt, struct Qdisc *qdisc);
5c15257f
JP
101int sch_direct_xmit(struct sk_buff *skb, struct Qdisc *q,
102 struct net_device *dev, struct netdev_queue *txq,
55a93b3e 103 spinlock_t *root_lock, bool validate);
5c15257f
JP
104
105void __qdisc_run(struct Qdisc *q);
1da177e4 106
37437bb2 107static inline void qdisc_run(struct Qdisc *q)
1da177e4 108{
bc135b23 109 if (qdisc_run_begin(q))
37437bb2 110 __qdisc_run(q);
1da177e4
LT
111}
112
5c15257f 113int tc_classify(struct sk_buff *skb, const struct tcf_proto *tp,
3b3ae880 114 struct tcf_result *res, bool compat_mode);
1da177e4 115
d8b9605d
JP
116static inline __be16 tc_skb_protocol(const struct sk_buff *skb)
117{
118 /* We need to take extra care in case the skb came via
119 * vlan accelerated path. In that case, use skb->vlan_proto
120 * as the original vlan header was already stripped.
121 */
df8a39de 122 if (skb_vlan_tag_present(skb))
d8b9605d
JP
123 return skb->vlan_proto;
124 return skb->protocol;
125}
126
1da177e4
LT
127/* Calculate maximal size of packet seen by hard_start_xmit
128 routine of this device.
129 */
95c96174 130static inline unsigned int psched_mtu(const struct net_device *dev)
1da177e4 131{
3b04ddde 132 return dev->mtu + dev->hard_header_len;
1da177e4
LT
133}
134
135#endif