1 #ifndef _LINUX_ELEVATOR_H
2 #define _LINUX_ELEVATOR_H
3
4 #define ELEVATOR_DEBUG
5
6 typedef void (elevator_fn) (struct request *, elevator_t *,
7 struct list_head *,
8 struct list_head *, int);
9
10 typedef int (elevator_merge_fn) (request_queue_t *, struct request **,
11 struct buffer_head *, int, int *, int *);
12
13 typedef void (elevator_dequeue_fn) (struct request *);
14
15 struct elevator_s
16 {
17 int sequence;
18
19 int read_latency;
20 int write_latency;
21 int max_bomb_segments;
22
23 unsigned int nr_segments;
24 int read_pendings;
25
26 elevator_fn * elevator_fn;
27 elevator_merge_fn *elevator_merge_fn;
28 elevator_dequeue_fn *dequeue_fn;
29
30 unsigned int queue_ID;
31 };
32
33 void elevator_noop(struct request *, elevator_t *, struct list_head *, struct list_head *, int);
34 int elevator_noop_merge(request_queue_t *, struct request **, struct buffer_head *, int, int *, int *);
35 void elevator_noop_dequeue(struct request *);
36 void elevator_linus(struct request *, elevator_t *, struct list_head *, struct list_head *, int);
37 int elevator_linus_merge(request_queue_t *, struct request **, struct buffer_head *, int, int *, int *);
38
39 typedef struct blkelv_ioctl_arg_s {
40 int queue_ID;
41 int read_latency;
42 int write_latency;
43 int max_bomb_segments;
44 } blkelv_ioctl_arg_t;
45
46 #define BLKELVGET _IOR(0x12,106,sizeof(blkelv_ioctl_arg_t))
47 #define BLKELVSET _IOW(0x12,107,sizeof(blkelv_ioctl_arg_t))
48
49 extern int blkelvget_ioctl(elevator_t *, blkelv_ioctl_arg_t *);
50 extern int blkelvset_ioctl(elevator_t *, const blkelv_ioctl_arg_t *);
51
52 extern void elevator_init(elevator_t *, elevator_t);
53
54 /*
55 * Return values from elevator merger
56 */
57 #define ELEVATOR_NO_MERGE 0
58 #define ELEVATOR_FRONT_MERGE 1
59 #define ELEVATOR_BACK_MERGE 2
60
61 /*
62 * This is used in the elevator algorithm. We don't prioritise reads
63 * over writes any more --- although reads are more time-critical than
64 * writes, by treating them equally we increase filesystem throughput.
65 * This turns out to give better overall performance. -- sct
66 */
67 #define IN_ORDER(s1,s2) \
68 ((((s1)->rq_dev == (s2)->rq_dev && \
69 (s1)->sector < (s2)->sector)) || \
70 (s1)->rq_dev < (s2)->rq_dev)
71
72 static inline int elevator_request_latency(elevator_t * elevator, int rw)
73 {
74 int latency;
75
76 latency = elevator->read_latency;
77 if (rw != READ)
78 latency = elevator->write_latency;
79
80 return latency;
81 }
82
83 #define ELEVATOR_NOOP \
84 ((elevator_t) { \
85 0, /* sequence */ \
86 \
87 0, /* read_latency */ \
88 0, /* write_latency */ \
89 0, /* max_bomb_segments */ \
90 \
91 0, /* nr_segments */ \
92 0, /* read_pendings */ \
93 \
94 elevator_noop, /* elevator_fn */ \
95 elevator_noop_merge, /* elevator_merge_fn */ \
96 elevator_noop_dequeue, /* dequeue_fn */ \
97 })
98
99 #define ELEVATOR_LINUS \
100 ((elevator_t) { \
101 0, /* not used */ \
102 \
103 1000000, /* read passovers */ \
104 2000000, /* write passovers */ \
105 0, /* max_bomb_segments */ \
106 \
107 0, /* not used */ \
108 0, /* not used */ \
109 \
110 elevator_linus, /* elevator_fn */ \
111 elevator_linus_merge, /* elevator_merge_fn */ \
112 elevator_noop_dequeue, /* dequeue_fn */ \
113 })
114
115 #endif
116
This page was automatically generated by the
LXR engine.
Visit the LXR main site for more
information.