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