Blame view
include/linux/elevator.h
7.04 KB
1da177e4c
|
1 2 |
#ifndef _LINUX_ELEVATOR_H #define _LINUX_ELEVATOR_H |
4a893e837
|
3 |
#include <linux/percpu.h> |
9361401eb
|
4 |
#ifdef CONFIG_BLOCK |
165125e1e
|
5 |
typedef int (elevator_merge_fn) (struct request_queue *, struct request **, |
1da177e4c
|
6 |
struct bio *); |
165125e1e
|
7 |
typedef void (elevator_merge_req_fn) (struct request_queue *, struct request *, struct request *); |
1da177e4c
|
8 |
|
165125e1e
|
9 |
typedef void (elevator_merged_fn) (struct request_queue *, struct request *, int); |
1da177e4c
|
10 |
|
165125e1e
|
11 |
typedef int (elevator_allow_merge_fn) (struct request_queue *, struct request *, struct bio *); |
da7752650
|
12 |
|
812d40264
|
13 14 |
typedef void (elevator_bio_merged_fn) (struct request_queue *, struct request *, struct bio *); |
165125e1e
|
15 |
typedef int (elevator_dispatch_fn) (struct request_queue *, int); |
1da177e4c
|
16 |
|
165125e1e
|
17 18 19 20 21 |
typedef void (elevator_add_req_fn) (struct request_queue *, struct request *); typedef int (elevator_queue_empty_fn) (struct request_queue *); typedef struct request *(elevator_request_list_fn) (struct request_queue *, struct request *); typedef void (elevator_completed_req_fn) (struct request_queue *, struct request *); typedef int (elevator_may_queue_fn) (struct request_queue *, int); |
1da177e4c
|
22 |
|
165125e1e
|
23 |
typedef int (elevator_set_req_fn) (struct request_queue *, struct request *, gfp_t); |
bb37b94c6
|
24 |
typedef void (elevator_put_req_fn) (struct request *); |
165125e1e
|
25 26 |
typedef void (elevator_activate_req_fn) (struct request_queue *, struct request *); typedef void (elevator_deactivate_req_fn) (struct request_queue *, struct request *); |
1da177e4c
|
27 |
|
165125e1e
|
28 |
typedef void *(elevator_init_fn) (struct request_queue *); |
b374d18a4
|
29 |
typedef void (elevator_exit_fn) (struct elevator_queue *); |
1da177e4c
|
30 31 32 33 34 35 |
struct elevator_ops { elevator_merge_fn *elevator_merge_fn; elevator_merged_fn *elevator_merged_fn; elevator_merge_req_fn *elevator_merge_req_fn; |
da7752650
|
36 |
elevator_allow_merge_fn *elevator_allow_merge_fn; |
812d40264
|
37 |
elevator_bio_merged_fn *elevator_bio_merged_fn; |
1da177e4c
|
38 |
|
8922e16cf
|
39 |
elevator_dispatch_fn *elevator_dispatch_fn; |
1da177e4c
|
40 |
elevator_add_req_fn *elevator_add_req_fn; |
8922e16cf
|
41 |
elevator_activate_req_fn *elevator_activate_req_fn; |
1da177e4c
|
42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 |
elevator_deactivate_req_fn *elevator_deactivate_req_fn; elevator_queue_empty_fn *elevator_queue_empty_fn; elevator_completed_req_fn *elevator_completed_req_fn; elevator_request_list_fn *elevator_former_req_fn; elevator_request_list_fn *elevator_latter_req_fn; elevator_set_req_fn *elevator_set_req_fn; elevator_put_req_fn *elevator_put_req_fn; elevator_may_queue_fn *elevator_may_queue_fn; elevator_init_fn *elevator_init_fn; elevator_exit_fn *elevator_exit_fn; |
e17a9489b
|
57 |
void (*trim)(struct io_context *); |
1da177e4c
|
58 59 60 |
}; #define ELV_NAME_MAX (16) |
e572ec7e4
|
61 62 |
struct elv_fs_entry { struct attribute attr; |
b374d18a4
|
63 64 |
ssize_t (*show)(struct elevator_queue *, char *); ssize_t (*store)(struct elevator_queue *, const char *, size_t); |
e572ec7e4
|
65 |
}; |
1da177e4c
|
66 67 68 69 70 71 72 |
/* * identifies an elevator type, such as AS or deadline */ struct elevator_type { struct list_head list; struct elevator_ops ops; |
e572ec7e4
|
73 |
struct elv_fs_entry *elevator_attrs; |
1da177e4c
|
74 75 76 77 78 |
char elevator_name[ELV_NAME_MAX]; struct module *elevator_owner; }; /* |
540695886
|
79 |
* each queue has an elevator_queue associated with it |
1da177e4c
|
80 81 82 83 84 85 86 |
*/ struct elevator_queue { struct elevator_ops *ops; void *elevator_data; struct kobject kobj; struct elevator_type *elevator_type; |
3d1ab40f4
|
87 |
struct mutex sysfs_lock; |
9817064b6
|
88 |
struct hlist_head *hash; |
1da177e4c
|
89 90 91 92 93 |
}; /* * block elevator interface */ |
165125e1e
|
94 95 96 97 98 99 100 |
extern void elv_dispatch_sort(struct request_queue *, struct request *); extern void elv_dispatch_add_tail(struct request_queue *, struct request *); extern void elv_add_request(struct request_queue *, struct request *, int, int); extern void __elv_add_request(struct request_queue *, struct request *, int, int); extern void elv_insert(struct request_queue *, struct request *, int); extern int elv_merge(struct request_queue *, struct request **, struct bio *); extern void elv_merge_requests(struct request_queue *, struct request *, |
1da177e4c
|
101 |
struct request *); |
165125e1e
|
102 |
extern void elv_merged_request(struct request_queue *, struct request *, int); |
812d40264
|
103 104 |
extern void elv_bio_merged(struct request_queue *q, struct request *, struct bio *); |
165125e1e
|
105 106 |
extern void elv_requeue_request(struct request_queue *, struct request *); extern int elv_queue_empty(struct request_queue *); |
165125e1e
|
107 108 109 110 111 |
extern struct request *elv_former_request(struct request_queue *, struct request *); extern struct request *elv_latter_request(struct request_queue *, struct request *); extern int elv_register_queue(struct request_queue *q); extern void elv_unregister_queue(struct request_queue *q); extern int elv_may_queue(struct request_queue *, int); |
11914a53d
|
112 |
extern void elv_abort_queue(struct request_queue *); |
165125e1e
|
113 114 115 |
extern void elv_completed_request(struct request_queue *, struct request *); extern int elv_set_request(struct request_queue *, struct request *, gfp_t); extern void elv_put_request(struct request_queue *, struct request *); |
26308eab6
|
116 |
extern void elv_drain_elevator(struct request_queue *); |
1da177e4c
|
117 118 119 120 |
/* * io scheduler registration */ |
2fdd82bd8
|
121 |
extern void elv_register(struct elevator_type *); |
1da177e4c
|
122 123 124 125 126 |
extern void elv_unregister(struct elevator_type *); /* * io scheduler sysfs switching */ |
165125e1e
|
127 128 |
extern ssize_t elv_iosched_show(struct request_queue *, char *); extern ssize_t elv_iosched_store(struct request_queue *, const char *, size_t); |
1da177e4c
|
129 |
|
165125e1e
|
130 |
extern int elevator_init(struct request_queue *, char *); |
b374d18a4
|
131 |
extern void elevator_exit(struct elevator_queue *); |
5dd531a03
|
132 |
extern int elevator_change(struct request_queue *, const char *); |
1da177e4c
|
133 |
extern int elv_rq_merge_ok(struct request *, struct bio *); |
1da177e4c
|
134 135 |
/* |
2e662b65f
|
136 137 |
* Helper functions. */ |
165125e1e
|
138 139 |
extern struct request *elv_rb_former_request(struct request_queue *, struct request *); extern struct request *elv_rb_latter_request(struct request_queue *, struct request *); |
2e662b65f
|
140 141 142 143 144 145 146 147 148 |
/* * rb support functions. */ extern struct request *elv_rb_add(struct rb_root *, struct request *); extern void elv_rb_del(struct rb_root *, struct request *); extern struct request *elv_rb_find(struct rb_root *, sector_t); /* |
1da177e4c
|
149 150 151 152 153 154 155 156 157 158 159 160 |
* Return values from elevator merger */ #define ELEVATOR_NO_MERGE 0 #define ELEVATOR_FRONT_MERGE 1 #define ELEVATOR_BACK_MERGE 2 /* * Insertion selection */ #define ELEVATOR_INSERT_FRONT 1 #define ELEVATOR_INSERT_BACK 2 #define ELEVATOR_INSERT_SORT 3 |
797e7dbbe
|
161 |
#define ELEVATOR_INSERT_REQUEUE 4 |
1da177e4c
|
162 163 164 165 166 167 168 169 170 |
/* * return values from elevator_may_queue_fn */ enum { ELV_MQUEUE_MAY, ELV_MQUEUE_NO, ELV_MQUEUE_MUST, }; |
2e46e8b27
|
171 |
#define rq_end_sector(rq) (blk_rq_pos(rq) + blk_rq_sectors(rq)) |
2e662b65f
|
172 |
#define rb_entry_rq(node) rb_entry((node), struct request, rb_node) |
1b47f531e
|
173 |
|
1fbfdfcdd
|
174 |
/* |
c7c22e4d5
|
175 |
* Hack to reuse the csd.list list_head as the fifo time holder while |
1fbfdfcdd
|
176 177 |
* the request is in the io scheduler. Saves an unsigned long in rq. */ |
c7c22e4d5
|
178 179 |
#define rq_fifo_time(rq) ((unsigned long) (rq)->csd.list.next) #define rq_set_fifo_time(rq,exp) ((rq)->csd.list.next = (void *) (exp)) |
1fbfdfcdd
|
180 181 182 |
#define rq_entry_fifo(ptr) list_entry((ptr), struct request, queuelist) #define rq_fifo_clear(rq) do { \ list_del_init(&(rq)->queuelist); \ |
c7c22e4d5
|
183 |
INIT_LIST_HEAD(&(rq)->csd.list); \ |
1fbfdfcdd
|
184 |
} while (0) |
4a893e837
|
185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 |
/* * io context count accounting */ #define elv_ioc_count_mod(name, __val) \ do { \ preempt_disable(); \ __get_cpu_var(name) += (__val); \ preempt_enable(); \ } while (0) #define elv_ioc_count_inc(name) elv_ioc_count_mod(name, 1) #define elv_ioc_count_dec(name) elv_ioc_count_mod(name, -1) #define elv_ioc_count_read(name) \ ({ \ unsigned long __val = 0; \ int __cpu; \ smp_wmb(); \ for_each_possible_cpu(__cpu) \ __val += per_cpu(name, __cpu); \ __val; \ }) |
9361401eb
|
207 |
#endif /* CONFIG_BLOCK */ |
1da177e4c
|
208 |
#endif |