.. | .. |
---|
24 | 24 | ELEVATOR_DISCARD_MERGE = 3, |
---|
25 | 25 | }; |
---|
26 | 26 | |
---|
27 | | -typedef enum elv_merge (elevator_merge_fn) (struct request_queue *, struct request **, |
---|
28 | | - struct bio *); |
---|
29 | | - |
---|
30 | | -typedef void (elevator_merge_req_fn) (struct request_queue *, struct request *, struct request *); |
---|
31 | | - |
---|
32 | | -typedef void (elevator_merged_fn) (struct request_queue *, struct request *, enum elv_merge); |
---|
33 | | - |
---|
34 | | -typedef int (elevator_allow_bio_merge_fn) (struct request_queue *, |
---|
35 | | - struct request *, struct bio *); |
---|
36 | | - |
---|
37 | | -typedef int (elevator_allow_rq_merge_fn) (struct request_queue *, |
---|
38 | | - struct request *, struct request *); |
---|
39 | | - |
---|
40 | | -typedef void (elevator_bio_merged_fn) (struct request_queue *, |
---|
41 | | - struct request *, struct bio *); |
---|
42 | | - |
---|
43 | | -typedef int (elevator_dispatch_fn) (struct request_queue *, int); |
---|
44 | | - |
---|
45 | | -typedef void (elevator_add_req_fn) (struct request_queue *, struct request *); |
---|
46 | | -typedef struct request *(elevator_request_list_fn) (struct request_queue *, struct request *); |
---|
47 | | -typedef void (elevator_completed_req_fn) (struct request_queue *, struct request *); |
---|
48 | | -typedef int (elevator_may_queue_fn) (struct request_queue *, unsigned int); |
---|
49 | | - |
---|
50 | | -typedef void (elevator_init_icq_fn) (struct io_cq *); |
---|
51 | | -typedef void (elevator_exit_icq_fn) (struct io_cq *); |
---|
52 | | -typedef int (elevator_set_req_fn) (struct request_queue *, struct request *, |
---|
53 | | - struct bio *, gfp_t); |
---|
54 | | -typedef void (elevator_put_req_fn) (struct request *); |
---|
55 | | -typedef void (elevator_activate_req_fn) (struct request_queue *, struct request *); |
---|
56 | | -typedef void (elevator_deactivate_req_fn) (struct request_queue *, struct request *); |
---|
57 | | - |
---|
58 | | -typedef int (elevator_init_fn) (struct request_queue *, |
---|
59 | | - struct elevator_type *e); |
---|
60 | | -typedef void (elevator_exit_fn) (struct elevator_queue *); |
---|
61 | | -typedef void (elevator_registered_fn) (struct request_queue *); |
---|
62 | | - |
---|
63 | | -struct elevator_ops |
---|
64 | | -{ |
---|
65 | | - elevator_merge_fn *elevator_merge_fn; |
---|
66 | | - elevator_merged_fn *elevator_merged_fn; |
---|
67 | | - elevator_merge_req_fn *elevator_merge_req_fn; |
---|
68 | | - elevator_allow_bio_merge_fn *elevator_allow_bio_merge_fn; |
---|
69 | | - elevator_allow_rq_merge_fn *elevator_allow_rq_merge_fn; |
---|
70 | | - elevator_bio_merged_fn *elevator_bio_merged_fn; |
---|
71 | | - |
---|
72 | | - elevator_dispatch_fn *elevator_dispatch_fn; |
---|
73 | | - elevator_add_req_fn *elevator_add_req_fn; |
---|
74 | | - elevator_activate_req_fn *elevator_activate_req_fn; |
---|
75 | | - elevator_deactivate_req_fn *elevator_deactivate_req_fn; |
---|
76 | | - |
---|
77 | | - elevator_completed_req_fn *elevator_completed_req_fn; |
---|
78 | | - |
---|
79 | | - elevator_request_list_fn *elevator_former_req_fn; |
---|
80 | | - elevator_request_list_fn *elevator_latter_req_fn; |
---|
81 | | - |
---|
82 | | - elevator_init_icq_fn *elevator_init_icq_fn; /* see iocontext.h */ |
---|
83 | | - elevator_exit_icq_fn *elevator_exit_icq_fn; /* ditto */ |
---|
84 | | - |
---|
85 | | - elevator_set_req_fn *elevator_set_req_fn; |
---|
86 | | - elevator_put_req_fn *elevator_put_req_fn; |
---|
87 | | - |
---|
88 | | - elevator_may_queue_fn *elevator_may_queue_fn; |
---|
89 | | - |
---|
90 | | - elevator_init_fn *elevator_init_fn; |
---|
91 | | - elevator_exit_fn *elevator_exit_fn; |
---|
92 | | - elevator_registered_fn *elevator_registered_fn; |
---|
93 | | -}; |
---|
94 | | - |
---|
95 | 27 | struct blk_mq_alloc_data; |
---|
96 | 28 | struct blk_mq_hw_ctx; |
---|
97 | 29 | |
---|
.. | .. |
---|
103 | 35 | void (*depth_updated)(struct blk_mq_hw_ctx *); |
---|
104 | 36 | |
---|
105 | 37 | bool (*allow_merge)(struct request_queue *, struct request *, struct bio *); |
---|
106 | | - bool (*bio_merge)(struct blk_mq_hw_ctx *, struct bio *); |
---|
| 38 | + bool (*bio_merge)(struct request_queue *, struct bio *, unsigned int); |
---|
107 | 39 | int (*request_merge)(struct request_queue *q, struct request **, struct bio *); |
---|
108 | 40 | void (*request_merged)(struct request_queue *, struct request *, enum elv_merge); |
---|
109 | 41 | void (*requests_merged)(struct request_queue *, struct request *, struct request *); |
---|
110 | 42 | void (*limit_depth)(unsigned int, struct blk_mq_alloc_data *); |
---|
111 | | - void (*prepare_request)(struct request *, struct bio *bio); |
---|
| 43 | + void (*prepare_request)(struct request *); |
---|
112 | 44 | void (*finish_request)(struct request *); |
---|
113 | 45 | void (*insert_requests)(struct blk_mq_hw_ctx *, struct list_head *, bool); |
---|
114 | 46 | struct request *(*dispatch_request)(struct blk_mq_hw_ctx *); |
---|
115 | 47 | bool (*has_work)(struct blk_mq_hw_ctx *); |
---|
116 | | - void (*completed_request)(struct request *); |
---|
117 | | - void (*started_request)(struct request *); |
---|
| 48 | + void (*completed_request)(struct request *, u64); |
---|
118 | 49 | void (*requeue_request)(struct request *); |
---|
119 | 50 | struct request *(*former_request)(struct request_queue *, struct request *); |
---|
120 | 51 | struct request *(*next_request)(struct request_queue *, struct request *); |
---|
121 | 52 | void (*init_icq)(struct io_cq *); |
---|
122 | 53 | void (*exit_icq)(struct io_cq *); |
---|
123 | | - void (*elevator_registered_fn)(struct request_queue *q); |
---|
124 | 54 | |
---|
125 | 55 | ANDROID_KABI_RESERVE(1); |
---|
126 | 56 | ANDROID_KABI_RESERVE(2); |
---|
.. | .. |
---|
145 | 75 | struct kmem_cache *icq_cache; |
---|
146 | 76 | |
---|
147 | 77 | /* fields provided by elevator implementation */ |
---|
148 | | - union { |
---|
149 | | - struct elevator_ops sq; |
---|
150 | | - struct elevator_mq_ops mq; |
---|
151 | | - } ops; |
---|
| 78 | + struct elevator_mq_ops ops; |
---|
| 79 | + |
---|
152 | 80 | size_t icq_size; /* see iocontext.h */ |
---|
153 | 81 | size_t icq_align; /* ditto */ |
---|
154 | 82 | struct elv_fs_entry *elevator_attrs; |
---|
155 | | - char elevator_name[ELV_NAME_MAX]; |
---|
| 83 | + const char *elevator_name; |
---|
156 | 84 | const char *elevator_alias; |
---|
| 85 | + const unsigned int elevator_features; |
---|
157 | 86 | struct module *elevator_owner; |
---|
158 | | - bool uses_mq; |
---|
159 | 87 | #ifdef CONFIG_BLK_DEBUG_FS |
---|
160 | 88 | const struct blk_mq_debugfs_attr *queue_debugfs_attrs; |
---|
161 | 89 | const struct blk_mq_debugfs_attr *hctx_debugfs_attrs; |
---|
.. | .. |
---|
186 | 114 | struct kobject kobj; |
---|
187 | 115 | struct mutex sysfs_lock; |
---|
188 | 116 | unsigned int registered:1; |
---|
189 | | - unsigned int uses_mq:1; |
---|
190 | 117 | DECLARE_HASHTABLE(hash, ELV_HASH_BITS); |
---|
191 | 118 | }; |
---|
192 | 119 | |
---|
193 | 120 | /* |
---|
194 | 121 | * block elevator interface |
---|
195 | 122 | */ |
---|
196 | | -extern void elv_dispatch_sort(struct request_queue *, struct request *); |
---|
197 | | -extern void elv_dispatch_add_tail(struct request_queue *, struct request *); |
---|
198 | | -extern void elv_add_request(struct request_queue *, struct request *, int); |
---|
199 | | -extern void __elv_add_request(struct request_queue *, struct request *, int); |
---|
200 | 123 | extern enum elv_merge elv_merge(struct request_queue *, struct request **, |
---|
201 | 124 | struct bio *); |
---|
202 | 125 | extern void elv_merge_requests(struct request_queue *, struct request *, |
---|
203 | 126 | struct request *); |
---|
204 | 127 | extern void elv_merged_request(struct request_queue *, struct request *, |
---|
205 | 128 | enum elv_merge); |
---|
206 | | -extern void elv_bio_merged(struct request_queue *q, struct request *, |
---|
207 | | - struct bio *); |
---|
208 | 129 | extern bool elv_attempt_insert_merge(struct request_queue *, struct request *); |
---|
209 | | -extern void elv_requeue_request(struct request_queue *, struct request *); |
---|
210 | 130 | extern struct request *elv_former_request(struct request_queue *, struct request *); |
---|
211 | 131 | extern struct request *elv_latter_request(struct request_queue *, struct request *); |
---|
212 | | -extern int elv_may_queue(struct request_queue *, unsigned int); |
---|
213 | | -extern void elv_completed_request(struct request_queue *, struct request *); |
---|
214 | | -extern int elv_set_request(struct request_queue *q, struct request *rq, |
---|
215 | | - struct bio *bio, gfp_t gfp_mask); |
---|
216 | | -extern void elv_put_request(struct request_queue *, struct request *); |
---|
217 | | -extern void elv_drain_elevator(struct request_queue *); |
---|
218 | 132 | |
---|
219 | 133 | /* |
---|
220 | 134 | * io scheduler registration |
---|
221 | 135 | */ |
---|
222 | | -extern void __init load_default_elevator_module(void); |
---|
223 | 136 | extern int elv_register(struct elevator_type *); |
---|
224 | 137 | extern void elv_unregister(struct elevator_type *); |
---|
225 | 138 | |
---|
.. | .. |
---|
256 | 169 | #define ELEVATOR_INSERT_FLUSH 5 |
---|
257 | 170 | #define ELEVATOR_INSERT_SORT_MERGE 6 |
---|
258 | 171 | |
---|
259 | | -/* |
---|
260 | | - * return values from elevator_may_queue_fn |
---|
261 | | - */ |
---|
262 | | -enum { |
---|
263 | | - ELV_MQUEUE_MAY, |
---|
264 | | - ELV_MQUEUE_NO, |
---|
265 | | - ELV_MQUEUE_MUST, |
---|
266 | | -}; |
---|
267 | | - |
---|
268 | 172 | #define rq_end_sector(rq) (blk_rq_pos(rq) + blk_rq_sectors(rq)) |
---|
269 | 173 | #define rb_entry_rq(node) rb_entry((node), struct request, rb_node) |
---|
270 | 174 | |
---|
271 | 175 | #define rq_entry_fifo(ptr) list_entry((ptr), struct request, queuelist) |
---|
272 | 176 | #define rq_fifo_clear(rq) list_del_init(&(rq)->queuelist) |
---|
273 | 177 | |
---|
274 | | -#else /* CONFIG_BLOCK */ |
---|
| 178 | +/* |
---|
| 179 | + * Elevator features. |
---|
| 180 | + */ |
---|
275 | 181 | |
---|
276 | | -static inline void load_default_elevator_module(void) { } |
---|
| 182 | +/* Supports zoned block devices sequential write constraint */ |
---|
| 183 | +#define ELEVATOR_F_ZBD_SEQ_WRITE (1U << 0) |
---|
| 184 | +/* Supports scheduling on multiple hardware queues */ |
---|
| 185 | +#define ELEVATOR_F_MQ_AWARE (1U << 1) |
---|
277 | 186 | |
---|
278 | 187 | #endif /* CONFIG_BLOCK */ |
---|
279 | 188 | #endif |
---|