]> git.karo-electronics.de Git - karo-tx-linux.git/blob - block/blk-mq-sched.c
block: enumify ELEVATOR_*_MERGE
[karo-tx-linux.git] / block / blk-mq-sched.c
1 /*
2  * blk-mq scheduling framework
3  *
4  * Copyright (C) 2016 Jens Axboe
5  */
6 #include <linux/kernel.h>
7 #include <linux/module.h>
8 #include <linux/blk-mq.h>
9
10 #include <trace/events/block.h>
11
12 #include "blk.h"
13 #include "blk-mq.h"
14 #include "blk-mq-sched.h"
15 #include "blk-mq-tag.h"
16 #include "blk-wbt.h"
17
18 void blk_mq_sched_free_hctx_data(struct request_queue *q,
19                                  void (*exit)(struct blk_mq_hw_ctx *))
20 {
21         struct blk_mq_hw_ctx *hctx;
22         int i;
23
24         queue_for_each_hw_ctx(q, hctx, i) {
25                 if (exit && hctx->sched_data)
26                         exit(hctx);
27                 kfree(hctx->sched_data);
28                 hctx->sched_data = NULL;
29         }
30 }
31 EXPORT_SYMBOL_GPL(blk_mq_sched_free_hctx_data);
32
33 int blk_mq_sched_init_hctx_data(struct request_queue *q, size_t size,
34                                 int (*init)(struct blk_mq_hw_ctx *),
35                                 void (*exit)(struct blk_mq_hw_ctx *))
36 {
37         struct blk_mq_hw_ctx *hctx;
38         int ret;
39         int i;
40
41         queue_for_each_hw_ctx(q, hctx, i) {
42                 hctx->sched_data = kmalloc_node(size, GFP_KERNEL, hctx->numa_node);
43                 if (!hctx->sched_data) {
44                         ret = -ENOMEM;
45                         goto error;
46                 }
47
48                 if (init) {
49                         ret = init(hctx);
50                         if (ret) {
51                                 /*
52                                  * We don't want to give exit() a partially
53                                  * initialized sched_data. init() must clean up
54                                  * if it fails.
55                                  */
56                                 kfree(hctx->sched_data);
57                                 hctx->sched_data = NULL;
58                                 goto error;
59                         }
60                 }
61         }
62
63         return 0;
64 error:
65         blk_mq_sched_free_hctx_data(q, exit);
66         return ret;
67 }
68 EXPORT_SYMBOL_GPL(blk_mq_sched_init_hctx_data);
69
70 static void __blk_mq_sched_assign_ioc(struct request_queue *q,
71                                       struct request *rq, struct io_context *ioc)
72 {
73         struct io_cq *icq;
74
75         spin_lock_irq(q->queue_lock);
76         icq = ioc_lookup_icq(ioc, q);
77         spin_unlock_irq(q->queue_lock);
78
79         if (!icq) {
80                 icq = ioc_create_icq(ioc, q, GFP_ATOMIC);
81                 if (!icq)
82                         return;
83         }
84
85         rq->elv.icq = icq;
86         if (!blk_mq_sched_get_rq_priv(q, rq)) {
87                 rq->rq_flags |= RQF_ELVPRIV;
88                 get_io_context(icq->ioc);
89                 return;
90         }
91
92         rq->elv.icq = NULL;
93 }
94
95 static void blk_mq_sched_assign_ioc(struct request_queue *q,
96                                     struct request *rq, struct bio *bio)
97 {
98         struct io_context *ioc;
99
100         ioc = rq_ioc(bio);
101         if (ioc)
102                 __blk_mq_sched_assign_ioc(q, rq, ioc);
103 }
104
105 struct request *blk_mq_sched_get_request(struct request_queue *q,
106                                          struct bio *bio,
107                                          unsigned int op,
108                                          struct blk_mq_alloc_data *data)
109 {
110         struct elevator_queue *e = q->elevator;
111         struct blk_mq_hw_ctx *hctx;
112         struct blk_mq_ctx *ctx;
113         struct request *rq;
114
115         blk_queue_enter_live(q);
116         ctx = blk_mq_get_ctx(q);
117         hctx = blk_mq_map_queue(q, ctx->cpu);
118
119         blk_mq_set_alloc_data(data, q, data->flags, ctx, hctx);
120
121         if (e) {
122                 data->flags |= BLK_MQ_REQ_INTERNAL;
123
124                 /*
125                  * Flush requests are special and go directly to the
126                  * dispatch list.
127                  */
128                 if (!op_is_flush(op) && e->type->ops.mq.get_request) {
129                         rq = e->type->ops.mq.get_request(q, op, data);
130                         if (rq)
131                                 rq->rq_flags |= RQF_QUEUED;
132                 } else
133                         rq = __blk_mq_alloc_request(data, op);
134         } else {
135                 rq = __blk_mq_alloc_request(data, op);
136                 if (rq)
137                         data->hctx->tags->rqs[rq->tag] = rq;
138         }
139
140         if (rq) {
141                 if (!op_is_flush(op)) {
142                         rq->elv.icq = NULL;
143                         if (e && e->type->icq_cache)
144                                 blk_mq_sched_assign_ioc(q, rq, bio);
145                 }
146                 data->hctx->queued++;
147                 return rq;
148         }
149
150         blk_queue_exit(q);
151         return NULL;
152 }
153
154 void blk_mq_sched_put_request(struct request *rq)
155 {
156         struct request_queue *q = rq->q;
157         struct elevator_queue *e = q->elevator;
158
159         if (rq->rq_flags & RQF_ELVPRIV) {
160                 blk_mq_sched_put_rq_priv(rq->q, rq);
161                 if (rq->elv.icq) {
162                         put_io_context(rq->elv.icq->ioc);
163                         rq->elv.icq = NULL;
164                 }
165         }
166
167         if ((rq->rq_flags & RQF_QUEUED) && e && e->type->ops.mq.put_request)
168                 e->type->ops.mq.put_request(rq);
169         else
170                 blk_mq_finish_request(rq);
171 }
172
173 void blk_mq_sched_dispatch_requests(struct blk_mq_hw_ctx *hctx)
174 {
175         struct elevator_queue *e = hctx->queue->elevator;
176         LIST_HEAD(rq_list);
177
178         if (unlikely(blk_mq_hctx_stopped(hctx)))
179                 return;
180
181         hctx->run++;
182
183         /*
184          * If we have previous entries on our dispatch list, grab them first for
185          * more fair dispatch.
186          */
187         if (!list_empty_careful(&hctx->dispatch)) {
188                 spin_lock(&hctx->lock);
189                 if (!list_empty(&hctx->dispatch))
190                         list_splice_init(&hctx->dispatch, &rq_list);
191                 spin_unlock(&hctx->lock);
192         }
193
194         /*
195          * Only ask the scheduler for requests, if we didn't have residual
196          * requests from the dispatch list. This is to avoid the case where
197          * we only ever dispatch a fraction of the requests available because
198          * of low device queue depth. Once we pull requests out of the IO
199          * scheduler, we can no longer merge or sort them. So it's best to
200          * leave them there for as long as we can. Mark the hw queue as
201          * needing a restart in that case.
202          */
203         if (!list_empty(&rq_list)) {
204                 blk_mq_sched_mark_restart(hctx);
205                 blk_mq_dispatch_rq_list(hctx, &rq_list);
206         } else if (!e || !e->type->ops.mq.dispatch_request) {
207                 blk_mq_flush_busy_ctxs(hctx, &rq_list);
208                 blk_mq_dispatch_rq_list(hctx, &rq_list);
209         } else {
210                 do {
211                         struct request *rq;
212
213                         rq = e->type->ops.mq.dispatch_request(hctx);
214                         if (!rq)
215                                 break;
216                         list_add(&rq->queuelist, &rq_list);
217                 } while (blk_mq_dispatch_rq_list(hctx, &rq_list));
218         }
219 }
220
221 void blk_mq_sched_move_to_dispatch(struct blk_mq_hw_ctx *hctx,
222                                    struct list_head *rq_list,
223                                    struct request *(*get_rq)(struct blk_mq_hw_ctx *))
224 {
225         do {
226                 struct request *rq;
227
228                 rq = get_rq(hctx);
229                 if (!rq)
230                         break;
231
232                 list_add_tail(&rq->queuelist, rq_list);
233         } while (1);
234 }
235 EXPORT_SYMBOL_GPL(blk_mq_sched_move_to_dispatch);
236
237 bool blk_mq_sched_try_merge(struct request_queue *q, struct bio *bio,
238                             struct request **merged_request)
239 {
240         struct request *rq;
241
242         switch (elv_merge(q, &rq, bio)) {
243         case ELEVATOR_BACK_MERGE:
244                 if (!blk_mq_sched_allow_merge(q, rq, bio))
245                         return false;
246                 if (!bio_attempt_back_merge(q, rq, bio))
247                         return false;
248                 *merged_request = attempt_back_merge(q, rq);
249                 if (!*merged_request)
250                         elv_merged_request(q, rq, ELEVATOR_BACK_MERGE);
251                 return true;
252         case ELEVATOR_FRONT_MERGE:
253                 if (!blk_mq_sched_allow_merge(q, rq, bio))
254                         return false;
255                 if (!bio_attempt_front_merge(q, rq, bio))
256                         return false;
257                 *merged_request = attempt_front_merge(q, rq);
258                 if (!*merged_request)
259                         elv_merged_request(q, rq, ELEVATOR_FRONT_MERGE);
260                 return true;
261         default:
262                 return false;
263         }
264 }
265 EXPORT_SYMBOL_GPL(blk_mq_sched_try_merge);
266
267 bool __blk_mq_sched_bio_merge(struct request_queue *q, struct bio *bio)
268 {
269         struct elevator_queue *e = q->elevator;
270
271         if (e->type->ops.mq.bio_merge) {
272                 struct blk_mq_ctx *ctx = blk_mq_get_ctx(q);
273                 struct blk_mq_hw_ctx *hctx = blk_mq_map_queue(q, ctx->cpu);
274
275                 blk_mq_put_ctx(ctx);
276                 return e->type->ops.mq.bio_merge(hctx, bio);
277         }
278
279         return false;
280 }
281
282 bool blk_mq_sched_try_insert_merge(struct request_queue *q, struct request *rq)
283 {
284         return rq_mergeable(rq) && elv_attempt_insert_merge(q, rq);
285 }
286 EXPORT_SYMBOL_GPL(blk_mq_sched_try_insert_merge);
287
288 void blk_mq_sched_request_inserted(struct request *rq)
289 {
290         trace_block_rq_insert(rq->q, rq);
291 }
292 EXPORT_SYMBOL_GPL(blk_mq_sched_request_inserted);
293
294 static bool blk_mq_sched_bypass_insert(struct blk_mq_hw_ctx *hctx,
295                                        struct request *rq)
296 {
297         if (rq->tag == -1) {
298                 rq->rq_flags |= RQF_SORTED;
299                 return false;
300         }
301
302         /*
303          * If we already have a real request tag, send directly to
304          * the dispatch list.
305          */
306         spin_lock(&hctx->lock);
307         list_add(&rq->queuelist, &hctx->dispatch);
308         spin_unlock(&hctx->lock);
309         return true;
310 }
311
312 static void blk_mq_sched_restart_hctx(struct blk_mq_hw_ctx *hctx)
313 {
314         if (test_bit(BLK_MQ_S_SCHED_RESTART, &hctx->state)) {
315                 clear_bit(BLK_MQ_S_SCHED_RESTART, &hctx->state);
316                 if (blk_mq_hctx_has_pending(hctx))
317                         blk_mq_run_hw_queue(hctx, true);
318         }
319 }
320
321 void blk_mq_sched_restart_queues(struct blk_mq_hw_ctx *hctx)
322 {
323         unsigned int i;
324
325         if (!(hctx->flags & BLK_MQ_F_TAG_SHARED))
326                 blk_mq_sched_restart_hctx(hctx);
327         else {
328                 struct request_queue *q = hctx->queue;
329
330                 if (!test_bit(QUEUE_FLAG_RESTART, &q->queue_flags))
331                         return;
332
333                 clear_bit(QUEUE_FLAG_RESTART, &q->queue_flags);
334
335                 queue_for_each_hw_ctx(q, hctx, i)
336                         blk_mq_sched_restart_hctx(hctx);
337         }
338 }
339
340 /*
341  * Add flush/fua to the queue. If we fail getting a driver tag, then
342  * punt to the requeue list. Requeue will re-invoke us from a context
343  * that's safe to block from.
344  */
345 static void blk_mq_sched_insert_flush(struct blk_mq_hw_ctx *hctx,
346                                       struct request *rq, bool can_block)
347 {
348         if (blk_mq_get_driver_tag(rq, &hctx, can_block)) {
349                 blk_insert_flush(rq);
350                 blk_mq_run_hw_queue(hctx, true);
351         } else
352                 blk_mq_add_to_requeue_list(rq, true, true);
353 }
354
355 void blk_mq_sched_insert_request(struct request *rq, bool at_head,
356                                  bool run_queue, bool async, bool can_block)
357 {
358         struct request_queue *q = rq->q;
359         struct elevator_queue *e = q->elevator;
360         struct blk_mq_ctx *ctx = rq->mq_ctx;
361         struct blk_mq_hw_ctx *hctx = blk_mq_map_queue(q, ctx->cpu);
362
363         if (rq->tag == -1 && op_is_flush(rq->cmd_flags)) {
364                 blk_mq_sched_insert_flush(hctx, rq, can_block);
365                 return;
366         }
367
368         if (e && blk_mq_sched_bypass_insert(hctx, rq))
369                 goto run;
370
371         if (e && e->type->ops.mq.insert_requests) {
372                 LIST_HEAD(list);
373
374                 list_add(&rq->queuelist, &list);
375                 e->type->ops.mq.insert_requests(hctx, &list, at_head);
376         } else {
377                 spin_lock(&ctx->lock);
378                 __blk_mq_insert_request(hctx, rq, at_head);
379                 spin_unlock(&ctx->lock);
380         }
381
382 run:
383         if (run_queue)
384                 blk_mq_run_hw_queue(hctx, async);
385 }
386
387 void blk_mq_sched_insert_requests(struct request_queue *q,
388                                   struct blk_mq_ctx *ctx,
389                                   struct list_head *list, bool run_queue_async)
390 {
391         struct blk_mq_hw_ctx *hctx = blk_mq_map_queue(q, ctx->cpu);
392         struct elevator_queue *e = hctx->queue->elevator;
393
394         if (e) {
395                 struct request *rq, *next;
396
397                 /*
398                  * We bypass requests that already have a driver tag assigned,
399                  * which should only be flushes. Flushes are only ever inserted
400                  * as single requests, so we shouldn't ever hit the
401                  * WARN_ON_ONCE() below (but let's handle it just in case).
402                  */
403                 list_for_each_entry_safe(rq, next, list, queuelist) {
404                         if (WARN_ON_ONCE(rq->tag != -1)) {
405                                 list_del_init(&rq->queuelist);
406                                 blk_mq_sched_bypass_insert(hctx, rq);
407                         }
408                 }
409         }
410
411         if (e && e->type->ops.mq.insert_requests)
412                 e->type->ops.mq.insert_requests(hctx, list, false);
413         else
414                 blk_mq_insert_requests(hctx, ctx, list);
415
416         blk_mq_run_hw_queue(hctx, run_queue_async);
417 }
418
419 static void blk_mq_sched_free_tags(struct blk_mq_tag_set *set,
420                                    struct blk_mq_hw_ctx *hctx,
421                                    unsigned int hctx_idx)
422 {
423         if (hctx->sched_tags) {
424                 blk_mq_free_rqs(set, hctx->sched_tags, hctx_idx);
425                 blk_mq_free_rq_map(hctx->sched_tags);
426                 hctx->sched_tags = NULL;
427         }
428 }
429
430 int blk_mq_sched_setup(struct request_queue *q)
431 {
432         struct blk_mq_tag_set *set = q->tag_set;
433         struct blk_mq_hw_ctx *hctx;
434         int ret, i;
435
436         /*
437          * Default to 256, since we don't split into sync/async like the
438          * old code did. Additionally, this is a per-hw queue depth.
439          */
440         q->nr_requests = 2 * BLKDEV_MAX_RQ;
441
442         /*
443          * We're switching to using an IO scheduler, so setup the hctx
444          * scheduler tags and switch the request map from the regular
445          * tags to scheduler tags. First allocate what we need, so we
446          * can safely fail and fallback, if needed.
447          */
448         ret = 0;
449         queue_for_each_hw_ctx(q, hctx, i) {
450                 hctx->sched_tags = blk_mq_alloc_rq_map(set, i, q->nr_requests, 0);
451                 if (!hctx->sched_tags) {
452                         ret = -ENOMEM;
453                         break;
454                 }
455                 ret = blk_mq_alloc_rqs(set, hctx->sched_tags, i, q->nr_requests);
456                 if (ret)
457                         break;
458         }
459
460         /*
461          * If we failed, free what we did allocate
462          */
463         if (ret) {
464                 queue_for_each_hw_ctx(q, hctx, i) {
465                         if (!hctx->sched_tags)
466                                 continue;
467                         blk_mq_sched_free_tags(set, hctx, i);
468                 }
469
470                 return ret;
471         }
472
473         return 0;
474 }
475
476 void blk_mq_sched_teardown(struct request_queue *q)
477 {
478         struct blk_mq_tag_set *set = q->tag_set;
479         struct blk_mq_hw_ctx *hctx;
480         int i;
481
482         queue_for_each_hw_ctx(q, hctx, i)
483                 blk_mq_sched_free_tags(set, hctx, i);
484 }
485
486 int blk_mq_sched_init(struct request_queue *q)
487 {
488         int ret;
489
490 #if defined(CONFIG_DEFAULT_SQ_NONE)
491         if (q->nr_hw_queues == 1)
492                 return 0;
493 #endif
494 #if defined(CONFIG_DEFAULT_MQ_NONE)
495         if (q->nr_hw_queues > 1)
496                 return 0;
497 #endif
498
499         mutex_lock(&q->sysfs_lock);
500         ret = elevator_init(q, NULL);
501         mutex_unlock(&q->sysfs_lock);
502
503         return ret;
504 }