1320ae51fSJens Axboe #include <linux/kernel.h> 2320ae51fSJens Axboe #include <linux/module.h> 3320ae51fSJens Axboe #include <linux/backing-dev.h> 4320ae51fSJens Axboe #include <linux/bio.h> 5320ae51fSJens Axboe #include <linux/blkdev.h> 6320ae51fSJens Axboe #include <linux/mm.h> 7320ae51fSJens Axboe #include <linux/init.h> 8320ae51fSJens Axboe #include <linux/slab.h> 9320ae51fSJens Axboe #include <linux/workqueue.h> 10320ae51fSJens Axboe #include <linux/smp.h> 11320ae51fSJens Axboe #include <linux/llist.h> 12320ae51fSJens Axboe #include <linux/list_sort.h> 13320ae51fSJens Axboe #include <linux/cpu.h> 14320ae51fSJens Axboe #include <linux/cache.h> 15320ae51fSJens Axboe #include <linux/sched/sysctl.h> 16320ae51fSJens Axboe #include <linux/delay.h> 17320ae51fSJens Axboe 18320ae51fSJens Axboe #include <trace/events/block.h> 19320ae51fSJens Axboe 20320ae51fSJens Axboe #include <linux/blk-mq.h> 21320ae51fSJens Axboe #include "blk.h" 22320ae51fSJens Axboe #include "blk-mq.h" 23320ae51fSJens Axboe #include "blk-mq-tag.h" 24320ae51fSJens Axboe 25320ae51fSJens Axboe static DEFINE_MUTEX(all_q_mutex); 26320ae51fSJens Axboe static LIST_HEAD(all_q_list); 27320ae51fSJens Axboe 28320ae51fSJens Axboe static void __blk_mq_run_hw_queue(struct blk_mq_hw_ctx *hctx); 29320ae51fSJens Axboe 30320ae51fSJens Axboe static struct blk_mq_ctx *__blk_mq_get_ctx(struct request_queue *q, 31320ae51fSJens Axboe unsigned int cpu) 32320ae51fSJens Axboe { 33320ae51fSJens Axboe return per_cpu_ptr(q->queue_ctx, cpu); 34320ae51fSJens Axboe } 35320ae51fSJens Axboe 36320ae51fSJens Axboe /* 37320ae51fSJens Axboe * This assumes per-cpu software queueing queues. They could be per-node 38320ae51fSJens Axboe * as well, for instance. For now this is hardcoded as-is. Note that we don't 39320ae51fSJens Axboe * care about preemption, since we know the ctx's are persistent. This does 40320ae51fSJens Axboe * mean that we can't rely on ctx always matching the currently running CPU. 41320ae51fSJens Axboe */ 42320ae51fSJens Axboe static struct blk_mq_ctx *blk_mq_get_ctx(struct request_queue *q) 43320ae51fSJens Axboe { 44320ae51fSJens Axboe return __blk_mq_get_ctx(q, get_cpu()); 45320ae51fSJens Axboe } 46320ae51fSJens Axboe 47320ae51fSJens Axboe static void blk_mq_put_ctx(struct blk_mq_ctx *ctx) 48320ae51fSJens Axboe { 49320ae51fSJens Axboe put_cpu(); 50320ae51fSJens Axboe } 51320ae51fSJens Axboe 52320ae51fSJens Axboe /* 53320ae51fSJens Axboe * Check if any of the ctx's have pending work in this hardware queue 54320ae51fSJens Axboe */ 55320ae51fSJens Axboe static bool blk_mq_hctx_has_pending(struct blk_mq_hw_ctx *hctx) 56320ae51fSJens Axboe { 57320ae51fSJens Axboe unsigned int i; 58320ae51fSJens Axboe 59320ae51fSJens Axboe for (i = 0; i < hctx->nr_ctx_map; i++) 60320ae51fSJens Axboe if (hctx->ctx_map[i]) 61320ae51fSJens Axboe return true; 62320ae51fSJens Axboe 63320ae51fSJens Axboe return false; 64320ae51fSJens Axboe } 65320ae51fSJens Axboe 66320ae51fSJens Axboe /* 67320ae51fSJens Axboe * Mark this ctx as having pending work in this hardware queue 68320ae51fSJens Axboe */ 69320ae51fSJens Axboe static void blk_mq_hctx_mark_pending(struct blk_mq_hw_ctx *hctx, 70320ae51fSJens Axboe struct blk_mq_ctx *ctx) 71320ae51fSJens Axboe { 72320ae51fSJens Axboe if (!test_bit(ctx->index_hw, hctx->ctx_map)) 73320ae51fSJens Axboe set_bit(ctx->index_hw, hctx->ctx_map); 74320ae51fSJens Axboe } 75320ae51fSJens Axboe 76320ae51fSJens Axboe static struct request *blk_mq_alloc_rq(struct blk_mq_hw_ctx *hctx, gfp_t gfp, 77320ae51fSJens Axboe bool reserved) 78320ae51fSJens Axboe { 79320ae51fSJens Axboe struct request *rq; 80320ae51fSJens Axboe unsigned int tag; 81320ae51fSJens Axboe 82320ae51fSJens Axboe tag = blk_mq_get_tag(hctx->tags, gfp, reserved); 83320ae51fSJens Axboe if (tag != BLK_MQ_TAG_FAIL) { 84320ae51fSJens Axboe rq = hctx->rqs[tag]; 85320ae51fSJens Axboe rq->tag = tag; 86320ae51fSJens Axboe 87320ae51fSJens Axboe return rq; 88320ae51fSJens Axboe } 89320ae51fSJens Axboe 90320ae51fSJens Axboe return NULL; 91320ae51fSJens Axboe } 92320ae51fSJens Axboe 93320ae51fSJens Axboe static int blk_mq_queue_enter(struct request_queue *q) 94320ae51fSJens Axboe { 95320ae51fSJens Axboe int ret; 96320ae51fSJens Axboe 97320ae51fSJens Axboe __percpu_counter_add(&q->mq_usage_counter, 1, 1000000); 98320ae51fSJens Axboe smp_wmb(); 99320ae51fSJens Axboe /* we have problems to freeze the queue if it's initializing */ 100320ae51fSJens Axboe if (!blk_queue_bypass(q) || !blk_queue_init_done(q)) 101320ae51fSJens Axboe return 0; 102320ae51fSJens Axboe 103320ae51fSJens Axboe __percpu_counter_add(&q->mq_usage_counter, -1, 1000000); 104320ae51fSJens Axboe 105320ae51fSJens Axboe spin_lock_irq(q->queue_lock); 106320ae51fSJens Axboe ret = wait_event_interruptible_lock_irq(q->mq_freeze_wq, 10743a5e4e2SMing Lei !blk_queue_bypass(q) || blk_queue_dying(q), 10843a5e4e2SMing Lei *q->queue_lock); 109320ae51fSJens Axboe /* inc usage with lock hold to avoid freeze_queue runs here */ 11043a5e4e2SMing Lei if (!ret && !blk_queue_dying(q)) 111320ae51fSJens Axboe __percpu_counter_add(&q->mq_usage_counter, 1, 1000000); 11243a5e4e2SMing Lei else if (blk_queue_dying(q)) 11343a5e4e2SMing Lei ret = -ENODEV; 114320ae51fSJens Axboe spin_unlock_irq(q->queue_lock); 115320ae51fSJens Axboe 116320ae51fSJens Axboe return ret; 117320ae51fSJens Axboe } 118320ae51fSJens Axboe 119320ae51fSJens Axboe static void blk_mq_queue_exit(struct request_queue *q) 120320ae51fSJens Axboe { 121320ae51fSJens Axboe __percpu_counter_add(&q->mq_usage_counter, -1, 1000000); 122320ae51fSJens Axboe } 123320ae51fSJens Axboe 12443a5e4e2SMing Lei static void __blk_mq_drain_queue(struct request_queue *q) 12543a5e4e2SMing Lei { 12643a5e4e2SMing Lei while (true) { 12743a5e4e2SMing Lei s64 count; 12843a5e4e2SMing Lei 12943a5e4e2SMing Lei spin_lock_irq(q->queue_lock); 13043a5e4e2SMing Lei count = percpu_counter_sum(&q->mq_usage_counter); 13143a5e4e2SMing Lei spin_unlock_irq(q->queue_lock); 13243a5e4e2SMing Lei 13343a5e4e2SMing Lei if (count == 0) 13443a5e4e2SMing Lei break; 13543a5e4e2SMing Lei blk_mq_run_queues(q, false); 13643a5e4e2SMing Lei msleep(10); 13743a5e4e2SMing Lei } 13843a5e4e2SMing Lei } 13943a5e4e2SMing Lei 140320ae51fSJens Axboe /* 141320ae51fSJens Axboe * Guarantee no request is in use, so we can change any data structure of 142320ae51fSJens Axboe * the queue afterward. 143320ae51fSJens Axboe */ 144320ae51fSJens Axboe static void blk_mq_freeze_queue(struct request_queue *q) 145320ae51fSJens Axboe { 146320ae51fSJens Axboe bool drain; 147320ae51fSJens Axboe 148320ae51fSJens Axboe spin_lock_irq(q->queue_lock); 149320ae51fSJens Axboe drain = !q->bypass_depth++; 150320ae51fSJens Axboe queue_flag_set(QUEUE_FLAG_BYPASS, q); 151320ae51fSJens Axboe spin_unlock_irq(q->queue_lock); 152320ae51fSJens Axboe 15343a5e4e2SMing Lei if (drain) 15443a5e4e2SMing Lei __blk_mq_drain_queue(q); 155320ae51fSJens Axboe } 15643a5e4e2SMing Lei 15743a5e4e2SMing Lei void blk_mq_drain_queue(struct request_queue *q) 15843a5e4e2SMing Lei { 15943a5e4e2SMing Lei __blk_mq_drain_queue(q); 160320ae51fSJens Axboe } 161320ae51fSJens Axboe 162320ae51fSJens Axboe static void blk_mq_unfreeze_queue(struct request_queue *q) 163320ae51fSJens Axboe { 164320ae51fSJens Axboe bool wake = false; 165320ae51fSJens Axboe 166320ae51fSJens Axboe spin_lock_irq(q->queue_lock); 167320ae51fSJens Axboe if (!--q->bypass_depth) { 168320ae51fSJens Axboe queue_flag_clear(QUEUE_FLAG_BYPASS, q); 169320ae51fSJens Axboe wake = true; 170320ae51fSJens Axboe } 171320ae51fSJens Axboe WARN_ON_ONCE(q->bypass_depth < 0); 172320ae51fSJens Axboe spin_unlock_irq(q->queue_lock); 173320ae51fSJens Axboe if (wake) 174320ae51fSJens Axboe wake_up_all(&q->mq_freeze_wq); 175320ae51fSJens Axboe } 176320ae51fSJens Axboe 177320ae51fSJens Axboe bool blk_mq_can_queue(struct blk_mq_hw_ctx *hctx) 178320ae51fSJens Axboe { 179320ae51fSJens Axboe return blk_mq_has_free_tags(hctx->tags); 180320ae51fSJens Axboe } 181320ae51fSJens Axboe EXPORT_SYMBOL(blk_mq_can_queue); 182320ae51fSJens Axboe 18394eddfbeSJens Axboe static void blk_mq_rq_ctx_init(struct request_queue *q, struct blk_mq_ctx *ctx, 18494eddfbeSJens Axboe struct request *rq, unsigned int rw_flags) 185320ae51fSJens Axboe { 18694eddfbeSJens Axboe if (blk_queue_io_stat(q)) 18794eddfbeSJens Axboe rw_flags |= REQ_IO_STAT; 18894eddfbeSJens Axboe 189320ae51fSJens Axboe rq->mq_ctx = ctx; 190320ae51fSJens Axboe rq->cmd_flags = rw_flags; 1910fec08b4SMing Lei rq->start_time = jiffies; 1920fec08b4SMing Lei set_start_time_ns(rq); 193320ae51fSJens Axboe ctx->rq_dispatched[rw_is_sync(rw_flags)]++; 194320ae51fSJens Axboe } 195320ae51fSJens Axboe 196320ae51fSJens Axboe static struct request *__blk_mq_alloc_request(struct blk_mq_hw_ctx *hctx, 197f0276924SShaohua Li gfp_t gfp, bool reserved, 198f0276924SShaohua Li int rw) 199320ae51fSJens Axboe { 200f0276924SShaohua Li struct request *req; 201f0276924SShaohua Li bool is_flush = false; 202f0276924SShaohua Li /* 203f0276924SShaohua Li * flush need allocate a request, leave at least one request for 204f0276924SShaohua Li * non-flush IO to avoid deadlock 205f0276924SShaohua Li */ 206f0276924SShaohua Li if ((rw & REQ_FLUSH) && !(rw & REQ_FLUSH_SEQ)) { 207f0276924SShaohua Li if (atomic_inc_return(&hctx->pending_flush) >= 208f0276924SShaohua Li hctx->queue_depth - hctx->reserved_tags - 1) { 209f0276924SShaohua Li atomic_dec(&hctx->pending_flush); 210f0276924SShaohua Li return NULL; 211f0276924SShaohua Li } 212f0276924SShaohua Li is_flush = true; 213f0276924SShaohua Li } 214f0276924SShaohua Li req = blk_mq_alloc_rq(hctx, gfp, reserved); 215f0276924SShaohua Li if (!req && is_flush) 216f0276924SShaohua Li atomic_dec(&hctx->pending_flush); 217f0276924SShaohua Li return req; 218320ae51fSJens Axboe } 219320ae51fSJens Axboe 220320ae51fSJens Axboe static struct request *blk_mq_alloc_request_pinned(struct request_queue *q, 221320ae51fSJens Axboe int rw, gfp_t gfp, 222320ae51fSJens Axboe bool reserved) 223320ae51fSJens Axboe { 224320ae51fSJens Axboe struct request *rq; 225320ae51fSJens Axboe 226320ae51fSJens Axboe do { 227320ae51fSJens Axboe struct blk_mq_ctx *ctx = blk_mq_get_ctx(q); 228320ae51fSJens Axboe struct blk_mq_hw_ctx *hctx = q->mq_ops->map_queue(q, ctx->cpu); 229320ae51fSJens Axboe 230f0276924SShaohua Li rq = __blk_mq_alloc_request(hctx, gfp & ~__GFP_WAIT, reserved, rw); 231320ae51fSJens Axboe if (rq) { 23294eddfbeSJens Axboe blk_mq_rq_ctx_init(q, ctx, rq, rw); 233320ae51fSJens Axboe break; 234959a35f1SJeff Moyer } 235320ae51fSJens Axboe 236320ae51fSJens Axboe blk_mq_put_ctx(ctx); 237959a35f1SJeff Moyer if (!(gfp & __GFP_WAIT)) 238959a35f1SJeff Moyer break; 239959a35f1SJeff Moyer 240320ae51fSJens Axboe __blk_mq_run_hw_queue(hctx); 241320ae51fSJens Axboe blk_mq_wait_for_tags(hctx->tags); 242320ae51fSJens Axboe } while (1); 243320ae51fSJens Axboe 244320ae51fSJens Axboe return rq; 245320ae51fSJens Axboe } 246320ae51fSJens Axboe 2473228f48bSChristoph Hellwig struct request *blk_mq_alloc_request(struct request_queue *q, int rw, 2483228f48bSChristoph Hellwig gfp_t gfp, bool reserved) 249320ae51fSJens Axboe { 250320ae51fSJens Axboe struct request *rq; 251320ae51fSJens Axboe 252320ae51fSJens Axboe if (blk_mq_queue_enter(q)) 253320ae51fSJens Axboe return NULL; 254320ae51fSJens Axboe 2553228f48bSChristoph Hellwig rq = blk_mq_alloc_request_pinned(q, rw, gfp, reserved); 256959a35f1SJeff Moyer if (rq) 257320ae51fSJens Axboe blk_mq_put_ctx(rq->mq_ctx); 258320ae51fSJens Axboe return rq; 259320ae51fSJens Axboe } 260320ae51fSJens Axboe 261320ae51fSJens Axboe struct request *blk_mq_alloc_reserved_request(struct request_queue *q, int rw, 262320ae51fSJens Axboe gfp_t gfp) 263320ae51fSJens Axboe { 264320ae51fSJens Axboe struct request *rq; 265320ae51fSJens Axboe 266320ae51fSJens Axboe if (blk_mq_queue_enter(q)) 267320ae51fSJens Axboe return NULL; 268320ae51fSJens Axboe 269320ae51fSJens Axboe rq = blk_mq_alloc_request_pinned(q, rw, gfp, true); 270959a35f1SJeff Moyer if (rq) 271320ae51fSJens Axboe blk_mq_put_ctx(rq->mq_ctx); 272320ae51fSJens Axboe return rq; 273320ae51fSJens Axboe } 274320ae51fSJens Axboe EXPORT_SYMBOL(blk_mq_alloc_reserved_request); 275320ae51fSJens Axboe 276320ae51fSJens Axboe /* 277320ae51fSJens Axboe * Re-init and set pdu, if we have it 278320ae51fSJens Axboe */ 279320ae51fSJens Axboe static void blk_mq_rq_init(struct blk_mq_hw_ctx *hctx, struct request *rq) 280320ae51fSJens Axboe { 281320ae51fSJens Axboe blk_rq_init(hctx->queue, rq); 282320ae51fSJens Axboe 283320ae51fSJens Axboe if (hctx->cmd_size) 284320ae51fSJens Axboe rq->special = blk_mq_rq_to_pdu(rq); 285320ae51fSJens Axboe } 286320ae51fSJens Axboe 287320ae51fSJens Axboe static void __blk_mq_free_request(struct blk_mq_hw_ctx *hctx, 288320ae51fSJens Axboe struct blk_mq_ctx *ctx, struct request *rq) 289320ae51fSJens Axboe { 290320ae51fSJens Axboe const int tag = rq->tag; 291320ae51fSJens Axboe struct request_queue *q = rq->q; 292320ae51fSJens Axboe 293f0276924SShaohua Li if ((rq->cmd_flags & REQ_FLUSH) && !(rq->cmd_flags & REQ_FLUSH_SEQ)) 294f0276924SShaohua Li atomic_dec(&hctx->pending_flush); 295f0276924SShaohua Li 296320ae51fSJens Axboe blk_mq_rq_init(hctx, rq); 297320ae51fSJens Axboe blk_mq_put_tag(hctx->tags, tag); 298320ae51fSJens Axboe 299320ae51fSJens Axboe blk_mq_queue_exit(q); 300320ae51fSJens Axboe } 301320ae51fSJens Axboe 302320ae51fSJens Axboe void blk_mq_free_request(struct request *rq) 303320ae51fSJens Axboe { 304320ae51fSJens Axboe struct blk_mq_ctx *ctx = rq->mq_ctx; 305320ae51fSJens Axboe struct blk_mq_hw_ctx *hctx; 306320ae51fSJens Axboe struct request_queue *q = rq->q; 307320ae51fSJens Axboe 308320ae51fSJens Axboe ctx->rq_completed[rq_is_sync(rq)]++; 309320ae51fSJens Axboe 310320ae51fSJens Axboe hctx = q->mq_ops->map_queue(q, ctx->cpu); 311320ae51fSJens Axboe __blk_mq_free_request(hctx, ctx, rq); 312320ae51fSJens Axboe } 313320ae51fSJens Axboe 314320ae51fSJens Axboe static void blk_mq_bio_endio(struct request *rq, struct bio *bio, int error) 315320ae51fSJens Axboe { 316320ae51fSJens Axboe if (error) 317320ae51fSJens Axboe clear_bit(BIO_UPTODATE, &bio->bi_flags); 318320ae51fSJens Axboe else if (!test_bit(BIO_UPTODATE, &bio->bi_flags)) 319320ae51fSJens Axboe error = -EIO; 320320ae51fSJens Axboe 321320ae51fSJens Axboe if (unlikely(rq->cmd_flags & REQ_QUIET)) 322320ae51fSJens Axboe set_bit(BIO_QUIET, &bio->bi_flags); 323320ae51fSJens Axboe 324320ae51fSJens Axboe /* don't actually finish bio if it's part of flush sequence */ 325320ae51fSJens Axboe if (!(rq->cmd_flags & REQ_FLUSH_SEQ)) 326320ae51fSJens Axboe bio_endio(bio, error); 327320ae51fSJens Axboe } 328320ae51fSJens Axboe 329*30a91cb4SChristoph Hellwig void blk_mq_end_io(struct request *rq, int error) 330320ae51fSJens Axboe { 331320ae51fSJens Axboe struct bio *bio = rq->bio; 332320ae51fSJens Axboe unsigned int bytes = 0; 333320ae51fSJens Axboe 334320ae51fSJens Axboe trace_block_rq_complete(rq->q, rq); 335320ae51fSJens Axboe 336320ae51fSJens Axboe while (bio) { 337320ae51fSJens Axboe struct bio *next = bio->bi_next; 338320ae51fSJens Axboe 339320ae51fSJens Axboe bio->bi_next = NULL; 3404f024f37SKent Overstreet bytes += bio->bi_iter.bi_size; 341320ae51fSJens Axboe blk_mq_bio_endio(rq, bio, error); 342320ae51fSJens Axboe bio = next; 343320ae51fSJens Axboe } 344320ae51fSJens Axboe 345320ae51fSJens Axboe blk_account_io_completion(rq, bytes); 346320ae51fSJens Axboe 3470d11e6acSMing Lei blk_account_io_done(rq); 3480d11e6acSMing Lei 349320ae51fSJens Axboe if (rq->end_io) 350320ae51fSJens Axboe rq->end_io(rq, error); 351320ae51fSJens Axboe else 352320ae51fSJens Axboe blk_mq_free_request(rq); 353320ae51fSJens Axboe } 354*30a91cb4SChristoph Hellwig EXPORT_SYMBOL(blk_mq_end_io); 355320ae51fSJens Axboe 356*30a91cb4SChristoph Hellwig static void __blk_mq_complete_request_remote(void *data) 357320ae51fSJens Axboe { 3583d6efbf6SChristoph Hellwig struct request *rq = data; 359320ae51fSJens Axboe 360*30a91cb4SChristoph Hellwig rq->q->softirq_done_fn(rq); 361320ae51fSJens Axboe } 362320ae51fSJens Axboe 363*30a91cb4SChristoph Hellwig void __blk_mq_complete_request(struct request *rq) 364320ae51fSJens Axboe { 365320ae51fSJens Axboe struct blk_mq_ctx *ctx = rq->mq_ctx; 366320ae51fSJens Axboe int cpu; 367320ae51fSJens Axboe 368*30a91cb4SChristoph Hellwig if (!ctx->ipi_redirect) { 369*30a91cb4SChristoph Hellwig rq->q->softirq_done_fn(rq); 370*30a91cb4SChristoph Hellwig return; 371*30a91cb4SChristoph Hellwig } 372320ae51fSJens Axboe 373320ae51fSJens Axboe cpu = get_cpu(); 3743d6efbf6SChristoph Hellwig if (cpu != ctx->cpu && cpu_online(ctx->cpu)) { 375*30a91cb4SChristoph Hellwig rq->csd.func = __blk_mq_complete_request_remote; 3763d6efbf6SChristoph Hellwig rq->csd.info = rq; 3773d6efbf6SChristoph Hellwig rq->csd.flags = 0; 3783d6efbf6SChristoph Hellwig __smp_call_function_single(ctx->cpu, &rq->csd, 0); 3793d6efbf6SChristoph Hellwig } else { 380*30a91cb4SChristoph Hellwig rq->q->softirq_done_fn(rq); 3813d6efbf6SChristoph Hellwig } 382320ae51fSJens Axboe put_cpu(); 383320ae51fSJens Axboe } 384*30a91cb4SChristoph Hellwig 385*30a91cb4SChristoph Hellwig /** 386*30a91cb4SChristoph Hellwig * blk_mq_complete_request - end I/O on a request 387*30a91cb4SChristoph Hellwig * @rq: the request being processed 388*30a91cb4SChristoph Hellwig * 389*30a91cb4SChristoph Hellwig * Description: 390*30a91cb4SChristoph Hellwig * Ends all I/O on a request. It does not handle partial completions. 391*30a91cb4SChristoph Hellwig * The actual completion happens out-of-order, through a IPI handler. 392*30a91cb4SChristoph Hellwig **/ 393*30a91cb4SChristoph Hellwig void blk_mq_complete_request(struct request *rq) 394*30a91cb4SChristoph Hellwig { 395*30a91cb4SChristoph Hellwig if (unlikely(blk_should_fake_timeout(rq->q))) 396*30a91cb4SChristoph Hellwig return; 397*30a91cb4SChristoph Hellwig if (!blk_mark_rq_complete(rq)) 398*30a91cb4SChristoph Hellwig __blk_mq_complete_request(rq); 399*30a91cb4SChristoph Hellwig } 400*30a91cb4SChristoph Hellwig EXPORT_SYMBOL(blk_mq_complete_request); 401320ae51fSJens Axboe 402320ae51fSJens Axboe static void blk_mq_start_request(struct request *rq) 403320ae51fSJens Axboe { 404320ae51fSJens Axboe struct request_queue *q = rq->q; 405320ae51fSJens Axboe 406320ae51fSJens Axboe trace_block_rq_issue(q, rq); 407320ae51fSJens Axboe 408320ae51fSJens Axboe /* 409320ae51fSJens Axboe * Just mark start time and set the started bit. Due to memory 410320ae51fSJens Axboe * ordering, we know we'll see the correct deadline as long as 411320ae51fSJens Axboe * REQ_ATOMIC_STARTED is seen. 412320ae51fSJens Axboe */ 413320ae51fSJens Axboe rq->deadline = jiffies + q->rq_timeout; 414320ae51fSJens Axboe set_bit(REQ_ATOM_STARTED, &rq->atomic_flags); 415320ae51fSJens Axboe } 416320ae51fSJens Axboe 417320ae51fSJens Axboe static void blk_mq_requeue_request(struct request *rq) 418320ae51fSJens Axboe { 419320ae51fSJens Axboe struct request_queue *q = rq->q; 420320ae51fSJens Axboe 421320ae51fSJens Axboe trace_block_rq_requeue(q, rq); 422320ae51fSJens Axboe clear_bit(REQ_ATOM_STARTED, &rq->atomic_flags); 423320ae51fSJens Axboe } 424320ae51fSJens Axboe 425320ae51fSJens Axboe struct blk_mq_timeout_data { 426320ae51fSJens Axboe struct blk_mq_hw_ctx *hctx; 427320ae51fSJens Axboe unsigned long *next; 428320ae51fSJens Axboe unsigned int *next_set; 429320ae51fSJens Axboe }; 430320ae51fSJens Axboe 431320ae51fSJens Axboe static void blk_mq_timeout_check(void *__data, unsigned long *free_tags) 432320ae51fSJens Axboe { 433320ae51fSJens Axboe struct blk_mq_timeout_data *data = __data; 434320ae51fSJens Axboe struct blk_mq_hw_ctx *hctx = data->hctx; 435320ae51fSJens Axboe unsigned int tag; 436320ae51fSJens Axboe 437320ae51fSJens Axboe /* It may not be in flight yet (this is where 438320ae51fSJens Axboe * the REQ_ATOMIC_STARTED flag comes in). The requests are 439320ae51fSJens Axboe * statically allocated, so we know it's always safe to access the 440320ae51fSJens Axboe * memory associated with a bit offset into ->rqs[]. 441320ae51fSJens Axboe */ 442320ae51fSJens Axboe tag = 0; 443320ae51fSJens Axboe do { 444320ae51fSJens Axboe struct request *rq; 445320ae51fSJens Axboe 446320ae51fSJens Axboe tag = find_next_zero_bit(free_tags, hctx->queue_depth, tag); 447320ae51fSJens Axboe if (tag >= hctx->queue_depth) 448320ae51fSJens Axboe break; 449320ae51fSJens Axboe 450320ae51fSJens Axboe rq = hctx->rqs[tag++]; 451320ae51fSJens Axboe 452320ae51fSJens Axboe if (!test_bit(REQ_ATOM_STARTED, &rq->atomic_flags)) 453320ae51fSJens Axboe continue; 454320ae51fSJens Axboe 455320ae51fSJens Axboe blk_rq_check_expired(rq, data->next, data->next_set); 456320ae51fSJens Axboe } while (1); 457320ae51fSJens Axboe } 458320ae51fSJens Axboe 459320ae51fSJens Axboe static void blk_mq_hw_ctx_check_timeout(struct blk_mq_hw_ctx *hctx, 460320ae51fSJens Axboe unsigned long *next, 461320ae51fSJens Axboe unsigned int *next_set) 462320ae51fSJens Axboe { 463320ae51fSJens Axboe struct blk_mq_timeout_data data = { 464320ae51fSJens Axboe .hctx = hctx, 465320ae51fSJens Axboe .next = next, 466320ae51fSJens Axboe .next_set = next_set, 467320ae51fSJens Axboe }; 468320ae51fSJens Axboe 469320ae51fSJens Axboe /* 470320ae51fSJens Axboe * Ask the tagging code to iterate busy requests, so we can 471320ae51fSJens Axboe * check them for timeout. 472320ae51fSJens Axboe */ 473320ae51fSJens Axboe blk_mq_tag_busy_iter(hctx->tags, blk_mq_timeout_check, &data); 474320ae51fSJens Axboe } 475320ae51fSJens Axboe 476320ae51fSJens Axboe static void blk_mq_rq_timer(unsigned long data) 477320ae51fSJens Axboe { 478320ae51fSJens Axboe struct request_queue *q = (struct request_queue *) data; 479320ae51fSJens Axboe struct blk_mq_hw_ctx *hctx; 480320ae51fSJens Axboe unsigned long next = 0; 481320ae51fSJens Axboe int i, next_set = 0; 482320ae51fSJens Axboe 483320ae51fSJens Axboe queue_for_each_hw_ctx(q, hctx, i) 484320ae51fSJens Axboe blk_mq_hw_ctx_check_timeout(hctx, &next, &next_set); 485320ae51fSJens Axboe 486320ae51fSJens Axboe if (next_set) 487320ae51fSJens Axboe mod_timer(&q->timeout, round_jiffies_up(next)); 488320ae51fSJens Axboe } 489320ae51fSJens Axboe 490320ae51fSJens Axboe /* 491320ae51fSJens Axboe * Reverse check our software queue for entries that we could potentially 492320ae51fSJens Axboe * merge with. Currently includes a hand-wavy stop count of 8, to not spend 493320ae51fSJens Axboe * too much time checking for merges. 494320ae51fSJens Axboe */ 495320ae51fSJens Axboe static bool blk_mq_attempt_merge(struct request_queue *q, 496320ae51fSJens Axboe struct blk_mq_ctx *ctx, struct bio *bio) 497320ae51fSJens Axboe { 498320ae51fSJens Axboe struct request *rq; 499320ae51fSJens Axboe int checked = 8; 500320ae51fSJens Axboe 501320ae51fSJens Axboe list_for_each_entry_reverse(rq, &ctx->rq_list, queuelist) { 502320ae51fSJens Axboe int el_ret; 503320ae51fSJens Axboe 504320ae51fSJens Axboe if (!checked--) 505320ae51fSJens Axboe break; 506320ae51fSJens Axboe 507320ae51fSJens Axboe if (!blk_rq_merge_ok(rq, bio)) 508320ae51fSJens Axboe continue; 509320ae51fSJens Axboe 510320ae51fSJens Axboe el_ret = blk_try_merge(rq, bio); 511320ae51fSJens Axboe if (el_ret == ELEVATOR_BACK_MERGE) { 512320ae51fSJens Axboe if (bio_attempt_back_merge(q, rq, bio)) { 513320ae51fSJens Axboe ctx->rq_merged++; 514320ae51fSJens Axboe return true; 515320ae51fSJens Axboe } 516320ae51fSJens Axboe break; 517320ae51fSJens Axboe } else if (el_ret == ELEVATOR_FRONT_MERGE) { 518320ae51fSJens Axboe if (bio_attempt_front_merge(q, rq, bio)) { 519320ae51fSJens Axboe ctx->rq_merged++; 520320ae51fSJens Axboe return true; 521320ae51fSJens Axboe } 522320ae51fSJens Axboe break; 523320ae51fSJens Axboe } 524320ae51fSJens Axboe } 525320ae51fSJens Axboe 526320ae51fSJens Axboe return false; 527320ae51fSJens Axboe } 528320ae51fSJens Axboe 529320ae51fSJens Axboe void blk_mq_add_timer(struct request *rq) 530320ae51fSJens Axboe { 531320ae51fSJens Axboe __blk_add_timer(rq, NULL); 532320ae51fSJens Axboe } 533320ae51fSJens Axboe 534320ae51fSJens Axboe /* 535320ae51fSJens Axboe * Run this hardware queue, pulling any software queues mapped to it in. 536320ae51fSJens Axboe * Note that this function currently has various problems around ordering 537320ae51fSJens Axboe * of IO. In particular, we'd like FIFO behaviour on handling existing 538320ae51fSJens Axboe * items on the hctx->dispatch list. Ignore that for now. 539320ae51fSJens Axboe */ 540320ae51fSJens Axboe static void __blk_mq_run_hw_queue(struct blk_mq_hw_ctx *hctx) 541320ae51fSJens Axboe { 542320ae51fSJens Axboe struct request_queue *q = hctx->queue; 543320ae51fSJens Axboe struct blk_mq_ctx *ctx; 544320ae51fSJens Axboe struct request *rq; 545320ae51fSJens Axboe LIST_HEAD(rq_list); 546320ae51fSJens Axboe int bit, queued; 547320ae51fSJens Axboe 548320ae51fSJens Axboe if (unlikely(test_bit(BLK_MQ_S_STOPPED, &hctx->flags))) 549320ae51fSJens Axboe return; 550320ae51fSJens Axboe 551320ae51fSJens Axboe hctx->run++; 552320ae51fSJens Axboe 553320ae51fSJens Axboe /* 554320ae51fSJens Axboe * Touch any software queue that has pending entries. 555320ae51fSJens Axboe */ 556320ae51fSJens Axboe for_each_set_bit(bit, hctx->ctx_map, hctx->nr_ctx) { 557320ae51fSJens Axboe clear_bit(bit, hctx->ctx_map); 558320ae51fSJens Axboe ctx = hctx->ctxs[bit]; 559320ae51fSJens Axboe BUG_ON(bit != ctx->index_hw); 560320ae51fSJens Axboe 561320ae51fSJens Axboe spin_lock(&ctx->lock); 562320ae51fSJens Axboe list_splice_tail_init(&ctx->rq_list, &rq_list); 563320ae51fSJens Axboe spin_unlock(&ctx->lock); 564320ae51fSJens Axboe } 565320ae51fSJens Axboe 566320ae51fSJens Axboe /* 567320ae51fSJens Axboe * If we have previous entries on our dispatch list, grab them 568320ae51fSJens Axboe * and stuff them at the front for more fair dispatch. 569320ae51fSJens Axboe */ 570320ae51fSJens Axboe if (!list_empty_careful(&hctx->dispatch)) { 571320ae51fSJens Axboe spin_lock(&hctx->lock); 572320ae51fSJens Axboe if (!list_empty(&hctx->dispatch)) 573320ae51fSJens Axboe list_splice_init(&hctx->dispatch, &rq_list); 574320ae51fSJens Axboe spin_unlock(&hctx->lock); 575320ae51fSJens Axboe } 576320ae51fSJens Axboe 577320ae51fSJens Axboe /* 578320ae51fSJens Axboe * Delete and return all entries from our dispatch list 579320ae51fSJens Axboe */ 580320ae51fSJens Axboe queued = 0; 581320ae51fSJens Axboe 582320ae51fSJens Axboe /* 583320ae51fSJens Axboe * Now process all the entries, sending them to the driver. 584320ae51fSJens Axboe */ 585320ae51fSJens Axboe while (!list_empty(&rq_list)) { 586320ae51fSJens Axboe int ret; 587320ae51fSJens Axboe 588320ae51fSJens Axboe rq = list_first_entry(&rq_list, struct request, queuelist); 589320ae51fSJens Axboe list_del_init(&rq->queuelist); 590320ae51fSJens Axboe blk_mq_start_request(rq); 591320ae51fSJens Axboe 5924f7f418cSChristoph Hellwig if (q->dma_drain_size && blk_rq_bytes(rq)) { 5934f7f418cSChristoph Hellwig /* 5944f7f418cSChristoph Hellwig * make sure space for the drain appears we 5954f7f418cSChristoph Hellwig * know we can do this because max_hw_segments 5964f7f418cSChristoph Hellwig * has been adjusted to be one fewer than the 5974f7f418cSChristoph Hellwig * device can handle 5984f7f418cSChristoph Hellwig */ 5994f7f418cSChristoph Hellwig rq->nr_phys_segments++; 6004f7f418cSChristoph Hellwig } 6014f7f418cSChristoph Hellwig 602320ae51fSJens Axboe /* 603320ae51fSJens Axboe * Last request in the series. Flag it as such, this 604320ae51fSJens Axboe * enables drivers to know when IO should be kicked off, 605320ae51fSJens Axboe * if they don't do it on a per-request basis. 606320ae51fSJens Axboe * 607320ae51fSJens Axboe * Note: the flag isn't the only condition drivers 608320ae51fSJens Axboe * should do kick off. If drive is busy, the last 609320ae51fSJens Axboe * request might not have the bit set. 610320ae51fSJens Axboe */ 611320ae51fSJens Axboe if (list_empty(&rq_list)) 612320ae51fSJens Axboe rq->cmd_flags |= REQ_END; 613320ae51fSJens Axboe 614320ae51fSJens Axboe ret = q->mq_ops->queue_rq(hctx, rq); 615320ae51fSJens Axboe switch (ret) { 616320ae51fSJens Axboe case BLK_MQ_RQ_QUEUE_OK: 617320ae51fSJens Axboe queued++; 618320ae51fSJens Axboe continue; 619320ae51fSJens Axboe case BLK_MQ_RQ_QUEUE_BUSY: 620320ae51fSJens Axboe /* 621320ae51fSJens Axboe * FIXME: we should have a mechanism to stop the queue 622320ae51fSJens Axboe * like blk_stop_queue, otherwise we will waste cpu 623320ae51fSJens Axboe * time 624320ae51fSJens Axboe */ 625320ae51fSJens Axboe list_add(&rq->queuelist, &rq_list); 626320ae51fSJens Axboe blk_mq_requeue_request(rq); 627320ae51fSJens Axboe break; 628320ae51fSJens Axboe default: 629320ae51fSJens Axboe pr_err("blk-mq: bad return on queue: %d\n", ret); 630320ae51fSJens Axboe rq->errors = -EIO; 631320ae51fSJens Axboe case BLK_MQ_RQ_QUEUE_ERROR: 632320ae51fSJens Axboe blk_mq_end_io(rq, rq->errors); 633320ae51fSJens Axboe break; 634320ae51fSJens Axboe } 635320ae51fSJens Axboe 636320ae51fSJens Axboe if (ret == BLK_MQ_RQ_QUEUE_BUSY) 637320ae51fSJens Axboe break; 638320ae51fSJens Axboe } 639320ae51fSJens Axboe 640320ae51fSJens Axboe if (!queued) 641320ae51fSJens Axboe hctx->dispatched[0]++; 642320ae51fSJens Axboe else if (queued < (1 << (BLK_MQ_MAX_DISPATCH_ORDER - 1))) 643320ae51fSJens Axboe hctx->dispatched[ilog2(queued) + 1]++; 644320ae51fSJens Axboe 645320ae51fSJens Axboe /* 646320ae51fSJens Axboe * Any items that need requeuing? Stuff them into hctx->dispatch, 647320ae51fSJens Axboe * that is where we will continue on next queue run. 648320ae51fSJens Axboe */ 649320ae51fSJens Axboe if (!list_empty(&rq_list)) { 650320ae51fSJens Axboe spin_lock(&hctx->lock); 651320ae51fSJens Axboe list_splice(&rq_list, &hctx->dispatch); 652320ae51fSJens Axboe spin_unlock(&hctx->lock); 653320ae51fSJens Axboe } 654320ae51fSJens Axboe } 655320ae51fSJens Axboe 656320ae51fSJens Axboe void blk_mq_run_hw_queue(struct blk_mq_hw_ctx *hctx, bool async) 657320ae51fSJens Axboe { 658320ae51fSJens Axboe if (unlikely(test_bit(BLK_MQ_S_STOPPED, &hctx->flags))) 659320ae51fSJens Axboe return; 660320ae51fSJens Axboe 661320ae51fSJens Axboe if (!async) 662320ae51fSJens Axboe __blk_mq_run_hw_queue(hctx); 663320ae51fSJens Axboe else { 664320ae51fSJens Axboe struct request_queue *q = hctx->queue; 665320ae51fSJens Axboe 666320ae51fSJens Axboe kblockd_schedule_delayed_work(q, &hctx->delayed_work, 0); 667320ae51fSJens Axboe } 668320ae51fSJens Axboe } 669320ae51fSJens Axboe 670320ae51fSJens Axboe void blk_mq_run_queues(struct request_queue *q, bool async) 671320ae51fSJens Axboe { 672320ae51fSJens Axboe struct blk_mq_hw_ctx *hctx; 673320ae51fSJens Axboe int i; 674320ae51fSJens Axboe 675320ae51fSJens Axboe queue_for_each_hw_ctx(q, hctx, i) { 676320ae51fSJens Axboe if ((!blk_mq_hctx_has_pending(hctx) && 677320ae51fSJens Axboe list_empty_careful(&hctx->dispatch)) || 678320ae51fSJens Axboe test_bit(BLK_MQ_S_STOPPED, &hctx->flags)) 679320ae51fSJens Axboe continue; 680320ae51fSJens Axboe 681320ae51fSJens Axboe blk_mq_run_hw_queue(hctx, async); 682320ae51fSJens Axboe } 683320ae51fSJens Axboe } 684320ae51fSJens Axboe EXPORT_SYMBOL(blk_mq_run_queues); 685320ae51fSJens Axboe 686320ae51fSJens Axboe void blk_mq_stop_hw_queue(struct blk_mq_hw_ctx *hctx) 687320ae51fSJens Axboe { 688320ae51fSJens Axboe cancel_delayed_work(&hctx->delayed_work); 689320ae51fSJens Axboe set_bit(BLK_MQ_S_STOPPED, &hctx->state); 690320ae51fSJens Axboe } 691320ae51fSJens Axboe EXPORT_SYMBOL(blk_mq_stop_hw_queue); 692320ae51fSJens Axboe 693280d45f6SChristoph Hellwig void blk_mq_stop_hw_queues(struct request_queue *q) 694280d45f6SChristoph Hellwig { 695280d45f6SChristoph Hellwig struct blk_mq_hw_ctx *hctx; 696280d45f6SChristoph Hellwig int i; 697280d45f6SChristoph Hellwig 698280d45f6SChristoph Hellwig queue_for_each_hw_ctx(q, hctx, i) 699280d45f6SChristoph Hellwig blk_mq_stop_hw_queue(hctx); 700280d45f6SChristoph Hellwig } 701280d45f6SChristoph Hellwig EXPORT_SYMBOL(blk_mq_stop_hw_queues); 702280d45f6SChristoph Hellwig 703320ae51fSJens Axboe void blk_mq_start_hw_queue(struct blk_mq_hw_ctx *hctx) 704320ae51fSJens Axboe { 705320ae51fSJens Axboe clear_bit(BLK_MQ_S_STOPPED, &hctx->state); 706320ae51fSJens Axboe __blk_mq_run_hw_queue(hctx); 707320ae51fSJens Axboe } 708320ae51fSJens Axboe EXPORT_SYMBOL(blk_mq_start_hw_queue); 709320ae51fSJens Axboe 710320ae51fSJens Axboe void blk_mq_start_stopped_hw_queues(struct request_queue *q) 711320ae51fSJens Axboe { 712320ae51fSJens Axboe struct blk_mq_hw_ctx *hctx; 713320ae51fSJens Axboe int i; 714320ae51fSJens Axboe 715320ae51fSJens Axboe queue_for_each_hw_ctx(q, hctx, i) { 716320ae51fSJens Axboe if (!test_bit(BLK_MQ_S_STOPPED, &hctx->state)) 717320ae51fSJens Axboe continue; 718320ae51fSJens Axboe 719320ae51fSJens Axboe clear_bit(BLK_MQ_S_STOPPED, &hctx->state); 720320ae51fSJens Axboe blk_mq_run_hw_queue(hctx, true); 721320ae51fSJens Axboe } 722320ae51fSJens Axboe } 723320ae51fSJens Axboe EXPORT_SYMBOL(blk_mq_start_stopped_hw_queues); 724320ae51fSJens Axboe 725320ae51fSJens Axboe static void blk_mq_work_fn(struct work_struct *work) 726320ae51fSJens Axboe { 727320ae51fSJens Axboe struct blk_mq_hw_ctx *hctx; 728320ae51fSJens Axboe 729320ae51fSJens Axboe hctx = container_of(work, struct blk_mq_hw_ctx, delayed_work.work); 730320ae51fSJens Axboe __blk_mq_run_hw_queue(hctx); 731320ae51fSJens Axboe } 732320ae51fSJens Axboe 733320ae51fSJens Axboe static void __blk_mq_insert_request(struct blk_mq_hw_ctx *hctx, 73472a0a36eSChristoph Hellwig struct request *rq, bool at_head) 735320ae51fSJens Axboe { 736320ae51fSJens Axboe struct blk_mq_ctx *ctx = rq->mq_ctx; 737320ae51fSJens Axboe 73801b983c9SJens Axboe trace_block_rq_insert(hctx->queue, rq); 73901b983c9SJens Axboe 74072a0a36eSChristoph Hellwig if (at_head) 74172a0a36eSChristoph Hellwig list_add(&rq->queuelist, &ctx->rq_list); 74272a0a36eSChristoph Hellwig else 743320ae51fSJens Axboe list_add_tail(&rq->queuelist, &ctx->rq_list); 744320ae51fSJens Axboe blk_mq_hctx_mark_pending(hctx, ctx); 745320ae51fSJens Axboe 746320ae51fSJens Axboe /* 747320ae51fSJens Axboe * We do this early, to ensure we are on the right CPU. 748320ae51fSJens Axboe */ 749320ae51fSJens Axboe blk_mq_add_timer(rq); 750320ae51fSJens Axboe } 751320ae51fSJens Axboe 752320ae51fSJens Axboe void blk_mq_insert_request(struct request_queue *q, struct request *rq, 75372a0a36eSChristoph Hellwig bool at_head, bool run_queue) 754320ae51fSJens Axboe { 755320ae51fSJens Axboe struct blk_mq_hw_ctx *hctx; 756320ae51fSJens Axboe struct blk_mq_ctx *ctx, *current_ctx; 757320ae51fSJens Axboe 758320ae51fSJens Axboe ctx = rq->mq_ctx; 759320ae51fSJens Axboe hctx = q->mq_ops->map_queue(q, ctx->cpu); 760320ae51fSJens Axboe 761320ae51fSJens Axboe if (rq->cmd_flags & (REQ_FLUSH | REQ_FUA)) { 762320ae51fSJens Axboe blk_insert_flush(rq); 763320ae51fSJens Axboe } else { 764320ae51fSJens Axboe current_ctx = blk_mq_get_ctx(q); 765320ae51fSJens Axboe 766320ae51fSJens Axboe if (!cpu_online(ctx->cpu)) { 767320ae51fSJens Axboe ctx = current_ctx; 768320ae51fSJens Axboe hctx = q->mq_ops->map_queue(q, ctx->cpu); 769320ae51fSJens Axboe rq->mq_ctx = ctx; 770320ae51fSJens Axboe } 771320ae51fSJens Axboe spin_lock(&ctx->lock); 77272a0a36eSChristoph Hellwig __blk_mq_insert_request(hctx, rq, at_head); 773320ae51fSJens Axboe spin_unlock(&ctx->lock); 774320ae51fSJens Axboe 775320ae51fSJens Axboe blk_mq_put_ctx(current_ctx); 776320ae51fSJens Axboe } 777320ae51fSJens Axboe 778320ae51fSJens Axboe if (run_queue) 779320ae51fSJens Axboe __blk_mq_run_hw_queue(hctx); 780320ae51fSJens Axboe } 781320ae51fSJens Axboe EXPORT_SYMBOL(blk_mq_insert_request); 782320ae51fSJens Axboe 783320ae51fSJens Axboe /* 784320ae51fSJens Axboe * This is a special version of blk_mq_insert_request to bypass FLUSH request 785320ae51fSJens Axboe * check. Should only be used internally. 786320ae51fSJens Axboe */ 787320ae51fSJens Axboe void blk_mq_run_request(struct request *rq, bool run_queue, bool async) 788320ae51fSJens Axboe { 789320ae51fSJens Axboe struct request_queue *q = rq->q; 790320ae51fSJens Axboe struct blk_mq_hw_ctx *hctx; 791320ae51fSJens Axboe struct blk_mq_ctx *ctx, *current_ctx; 792320ae51fSJens Axboe 793320ae51fSJens Axboe current_ctx = blk_mq_get_ctx(q); 794320ae51fSJens Axboe 795320ae51fSJens Axboe ctx = rq->mq_ctx; 796320ae51fSJens Axboe if (!cpu_online(ctx->cpu)) { 797320ae51fSJens Axboe ctx = current_ctx; 798320ae51fSJens Axboe rq->mq_ctx = ctx; 799320ae51fSJens Axboe } 800320ae51fSJens Axboe hctx = q->mq_ops->map_queue(q, ctx->cpu); 801320ae51fSJens Axboe 802320ae51fSJens Axboe /* ctx->cpu might be offline */ 803320ae51fSJens Axboe spin_lock(&ctx->lock); 80472a0a36eSChristoph Hellwig __blk_mq_insert_request(hctx, rq, false); 805320ae51fSJens Axboe spin_unlock(&ctx->lock); 806320ae51fSJens Axboe 807320ae51fSJens Axboe blk_mq_put_ctx(current_ctx); 808320ae51fSJens Axboe 809320ae51fSJens Axboe if (run_queue) 810320ae51fSJens Axboe blk_mq_run_hw_queue(hctx, async); 811320ae51fSJens Axboe } 812320ae51fSJens Axboe 813320ae51fSJens Axboe static void blk_mq_insert_requests(struct request_queue *q, 814320ae51fSJens Axboe struct blk_mq_ctx *ctx, 815320ae51fSJens Axboe struct list_head *list, 816320ae51fSJens Axboe int depth, 817320ae51fSJens Axboe bool from_schedule) 818320ae51fSJens Axboe 819320ae51fSJens Axboe { 820320ae51fSJens Axboe struct blk_mq_hw_ctx *hctx; 821320ae51fSJens Axboe struct blk_mq_ctx *current_ctx; 822320ae51fSJens Axboe 823320ae51fSJens Axboe trace_block_unplug(q, depth, !from_schedule); 824320ae51fSJens Axboe 825320ae51fSJens Axboe current_ctx = blk_mq_get_ctx(q); 826320ae51fSJens Axboe 827320ae51fSJens Axboe if (!cpu_online(ctx->cpu)) 828320ae51fSJens Axboe ctx = current_ctx; 829320ae51fSJens Axboe hctx = q->mq_ops->map_queue(q, ctx->cpu); 830320ae51fSJens Axboe 831320ae51fSJens Axboe /* 832320ae51fSJens Axboe * preemption doesn't flush plug list, so it's possible ctx->cpu is 833320ae51fSJens Axboe * offline now 834320ae51fSJens Axboe */ 835320ae51fSJens Axboe spin_lock(&ctx->lock); 836320ae51fSJens Axboe while (!list_empty(list)) { 837320ae51fSJens Axboe struct request *rq; 838320ae51fSJens Axboe 839320ae51fSJens Axboe rq = list_first_entry(list, struct request, queuelist); 840320ae51fSJens Axboe list_del_init(&rq->queuelist); 841320ae51fSJens Axboe rq->mq_ctx = ctx; 84272a0a36eSChristoph Hellwig __blk_mq_insert_request(hctx, rq, false); 843320ae51fSJens Axboe } 844320ae51fSJens Axboe spin_unlock(&ctx->lock); 845320ae51fSJens Axboe 846320ae51fSJens Axboe blk_mq_put_ctx(current_ctx); 847320ae51fSJens Axboe 848320ae51fSJens Axboe blk_mq_run_hw_queue(hctx, from_schedule); 849320ae51fSJens Axboe } 850320ae51fSJens Axboe 851320ae51fSJens Axboe static int plug_ctx_cmp(void *priv, struct list_head *a, struct list_head *b) 852320ae51fSJens Axboe { 853320ae51fSJens Axboe struct request *rqa = container_of(a, struct request, queuelist); 854320ae51fSJens Axboe struct request *rqb = container_of(b, struct request, queuelist); 855320ae51fSJens Axboe 856320ae51fSJens Axboe return !(rqa->mq_ctx < rqb->mq_ctx || 857320ae51fSJens Axboe (rqa->mq_ctx == rqb->mq_ctx && 858320ae51fSJens Axboe blk_rq_pos(rqa) < blk_rq_pos(rqb))); 859320ae51fSJens Axboe } 860320ae51fSJens Axboe 861320ae51fSJens Axboe void blk_mq_flush_plug_list(struct blk_plug *plug, bool from_schedule) 862320ae51fSJens Axboe { 863320ae51fSJens Axboe struct blk_mq_ctx *this_ctx; 864320ae51fSJens Axboe struct request_queue *this_q; 865320ae51fSJens Axboe struct request *rq; 866320ae51fSJens Axboe LIST_HEAD(list); 867320ae51fSJens Axboe LIST_HEAD(ctx_list); 868320ae51fSJens Axboe unsigned int depth; 869320ae51fSJens Axboe 870320ae51fSJens Axboe list_splice_init(&plug->mq_list, &list); 871320ae51fSJens Axboe 872320ae51fSJens Axboe list_sort(NULL, &list, plug_ctx_cmp); 873320ae51fSJens Axboe 874320ae51fSJens Axboe this_q = NULL; 875320ae51fSJens Axboe this_ctx = NULL; 876320ae51fSJens Axboe depth = 0; 877320ae51fSJens Axboe 878320ae51fSJens Axboe while (!list_empty(&list)) { 879320ae51fSJens Axboe rq = list_entry_rq(list.next); 880320ae51fSJens Axboe list_del_init(&rq->queuelist); 881320ae51fSJens Axboe BUG_ON(!rq->q); 882320ae51fSJens Axboe if (rq->mq_ctx != this_ctx) { 883320ae51fSJens Axboe if (this_ctx) { 884320ae51fSJens Axboe blk_mq_insert_requests(this_q, this_ctx, 885320ae51fSJens Axboe &ctx_list, depth, 886320ae51fSJens Axboe from_schedule); 887320ae51fSJens Axboe } 888320ae51fSJens Axboe 889320ae51fSJens Axboe this_ctx = rq->mq_ctx; 890320ae51fSJens Axboe this_q = rq->q; 891320ae51fSJens Axboe depth = 0; 892320ae51fSJens Axboe } 893320ae51fSJens Axboe 894320ae51fSJens Axboe depth++; 895320ae51fSJens Axboe list_add_tail(&rq->queuelist, &ctx_list); 896320ae51fSJens Axboe } 897320ae51fSJens Axboe 898320ae51fSJens Axboe /* 899320ae51fSJens Axboe * If 'this_ctx' is set, we know we have entries to complete 900320ae51fSJens Axboe * on 'ctx_list'. Do those. 901320ae51fSJens Axboe */ 902320ae51fSJens Axboe if (this_ctx) { 903320ae51fSJens Axboe blk_mq_insert_requests(this_q, this_ctx, &ctx_list, depth, 904320ae51fSJens Axboe from_schedule); 905320ae51fSJens Axboe } 906320ae51fSJens Axboe } 907320ae51fSJens Axboe 908320ae51fSJens Axboe static void blk_mq_bio_to_request(struct request *rq, struct bio *bio) 909320ae51fSJens Axboe { 910320ae51fSJens Axboe init_request_from_bio(rq, bio); 911320ae51fSJens Axboe blk_account_io_start(rq, 1); 912320ae51fSJens Axboe } 913320ae51fSJens Axboe 914320ae51fSJens Axboe static void blk_mq_make_request(struct request_queue *q, struct bio *bio) 915320ae51fSJens Axboe { 916320ae51fSJens Axboe struct blk_mq_hw_ctx *hctx; 917320ae51fSJens Axboe struct blk_mq_ctx *ctx; 918320ae51fSJens Axboe const int is_sync = rw_is_sync(bio->bi_rw); 919320ae51fSJens Axboe const int is_flush_fua = bio->bi_rw & (REQ_FLUSH | REQ_FUA); 920320ae51fSJens Axboe int rw = bio_data_dir(bio); 921320ae51fSJens Axboe struct request *rq; 922320ae51fSJens Axboe unsigned int use_plug, request_count = 0; 923320ae51fSJens Axboe 924320ae51fSJens Axboe /* 925320ae51fSJens Axboe * If we have multiple hardware queues, just go directly to 926320ae51fSJens Axboe * one of those for sync IO. 927320ae51fSJens Axboe */ 928320ae51fSJens Axboe use_plug = !is_flush_fua && ((q->nr_hw_queues == 1) || !is_sync); 929320ae51fSJens Axboe 930320ae51fSJens Axboe blk_queue_bounce(q, &bio); 931320ae51fSJens Axboe 93214ec77f3SNicholas Bellinger if (bio_integrity_enabled(bio) && bio_integrity_prep(bio)) { 93314ec77f3SNicholas Bellinger bio_endio(bio, -EIO); 93414ec77f3SNicholas Bellinger return; 93514ec77f3SNicholas Bellinger } 93614ec77f3SNicholas Bellinger 937320ae51fSJens Axboe if (use_plug && blk_attempt_plug_merge(q, bio, &request_count)) 938320ae51fSJens Axboe return; 939320ae51fSJens Axboe 940320ae51fSJens Axboe if (blk_mq_queue_enter(q)) { 941320ae51fSJens Axboe bio_endio(bio, -EIO); 942320ae51fSJens Axboe return; 943320ae51fSJens Axboe } 944320ae51fSJens Axboe 945320ae51fSJens Axboe ctx = blk_mq_get_ctx(q); 946320ae51fSJens Axboe hctx = q->mq_ops->map_queue(q, ctx->cpu); 947320ae51fSJens Axboe 948320ae51fSJens Axboe trace_block_getrq(q, bio, rw); 949f0276924SShaohua Li rq = __blk_mq_alloc_request(hctx, GFP_ATOMIC, false, bio->bi_rw); 950320ae51fSJens Axboe if (likely(rq)) 951f0276924SShaohua Li blk_mq_rq_ctx_init(q, ctx, rq, bio->bi_rw); 952320ae51fSJens Axboe else { 953320ae51fSJens Axboe blk_mq_put_ctx(ctx); 954320ae51fSJens Axboe trace_block_sleeprq(q, bio, rw); 955f0276924SShaohua Li rq = blk_mq_alloc_request_pinned(q, bio->bi_rw, 956f0276924SShaohua Li __GFP_WAIT|GFP_ATOMIC, false); 957320ae51fSJens Axboe ctx = rq->mq_ctx; 958320ae51fSJens Axboe hctx = q->mq_ops->map_queue(q, ctx->cpu); 959320ae51fSJens Axboe } 960320ae51fSJens Axboe 961320ae51fSJens Axboe hctx->queued++; 962320ae51fSJens Axboe 963320ae51fSJens Axboe if (unlikely(is_flush_fua)) { 964320ae51fSJens Axboe blk_mq_bio_to_request(rq, bio); 965320ae51fSJens Axboe blk_mq_put_ctx(ctx); 966320ae51fSJens Axboe blk_insert_flush(rq); 967320ae51fSJens Axboe goto run_queue; 968320ae51fSJens Axboe } 969320ae51fSJens Axboe 970320ae51fSJens Axboe /* 971320ae51fSJens Axboe * A task plug currently exists. Since this is completely lockless, 972320ae51fSJens Axboe * utilize that to temporarily store requests until the task is 973320ae51fSJens Axboe * either done or scheduled away. 974320ae51fSJens Axboe */ 975320ae51fSJens Axboe if (use_plug) { 976320ae51fSJens Axboe struct blk_plug *plug = current->plug; 977320ae51fSJens Axboe 978320ae51fSJens Axboe if (plug) { 979320ae51fSJens Axboe blk_mq_bio_to_request(rq, bio); 98092f399c7SShaohua Li if (list_empty(&plug->mq_list)) 981320ae51fSJens Axboe trace_block_plug(q); 982320ae51fSJens Axboe else if (request_count >= BLK_MAX_REQUEST_COUNT) { 983320ae51fSJens Axboe blk_flush_plug_list(plug, false); 984320ae51fSJens Axboe trace_block_plug(q); 985320ae51fSJens Axboe } 986320ae51fSJens Axboe list_add_tail(&rq->queuelist, &plug->mq_list); 987320ae51fSJens Axboe blk_mq_put_ctx(ctx); 988320ae51fSJens Axboe return; 989320ae51fSJens Axboe } 990320ae51fSJens Axboe } 991320ae51fSJens Axboe 992320ae51fSJens Axboe spin_lock(&ctx->lock); 993320ae51fSJens Axboe 994320ae51fSJens Axboe if ((hctx->flags & BLK_MQ_F_SHOULD_MERGE) && 995320ae51fSJens Axboe blk_mq_attempt_merge(q, ctx, bio)) 996320ae51fSJens Axboe __blk_mq_free_request(hctx, ctx, rq); 997320ae51fSJens Axboe else { 998320ae51fSJens Axboe blk_mq_bio_to_request(rq, bio); 99972a0a36eSChristoph Hellwig __blk_mq_insert_request(hctx, rq, false); 1000320ae51fSJens Axboe } 1001320ae51fSJens Axboe 1002320ae51fSJens Axboe spin_unlock(&ctx->lock); 1003320ae51fSJens Axboe blk_mq_put_ctx(ctx); 1004320ae51fSJens Axboe 1005320ae51fSJens Axboe /* 1006320ae51fSJens Axboe * For a SYNC request, send it to the hardware immediately. For an 1007320ae51fSJens Axboe * ASYNC request, just ensure that we run it later on. The latter 1008320ae51fSJens Axboe * allows for merging opportunities and more efficient dispatching. 1009320ae51fSJens Axboe */ 1010320ae51fSJens Axboe run_queue: 1011320ae51fSJens Axboe blk_mq_run_hw_queue(hctx, !is_sync || is_flush_fua); 1012320ae51fSJens Axboe } 1013320ae51fSJens Axboe 1014320ae51fSJens Axboe /* 1015320ae51fSJens Axboe * Default mapping to a software queue, since we use one per CPU. 1016320ae51fSJens Axboe */ 1017320ae51fSJens Axboe struct blk_mq_hw_ctx *blk_mq_map_queue(struct request_queue *q, const int cpu) 1018320ae51fSJens Axboe { 1019320ae51fSJens Axboe return q->queue_hw_ctx[q->mq_map[cpu]]; 1020320ae51fSJens Axboe } 1021320ae51fSJens Axboe EXPORT_SYMBOL(blk_mq_map_queue); 1022320ae51fSJens Axboe 1023320ae51fSJens Axboe struct blk_mq_hw_ctx *blk_mq_alloc_single_hw_queue(struct blk_mq_reg *reg, 1024320ae51fSJens Axboe unsigned int hctx_index) 1025320ae51fSJens Axboe { 1026320ae51fSJens Axboe return kmalloc_node(sizeof(struct blk_mq_hw_ctx), 1027320ae51fSJens Axboe GFP_KERNEL | __GFP_ZERO, reg->numa_node); 1028320ae51fSJens Axboe } 1029320ae51fSJens Axboe EXPORT_SYMBOL(blk_mq_alloc_single_hw_queue); 1030320ae51fSJens Axboe 1031320ae51fSJens Axboe void blk_mq_free_single_hw_queue(struct blk_mq_hw_ctx *hctx, 1032320ae51fSJens Axboe unsigned int hctx_index) 1033320ae51fSJens Axboe { 1034320ae51fSJens Axboe kfree(hctx); 1035320ae51fSJens Axboe } 1036320ae51fSJens Axboe EXPORT_SYMBOL(blk_mq_free_single_hw_queue); 1037320ae51fSJens Axboe 1038320ae51fSJens Axboe static void blk_mq_hctx_notify(void *data, unsigned long action, 1039320ae51fSJens Axboe unsigned int cpu) 1040320ae51fSJens Axboe { 1041320ae51fSJens Axboe struct blk_mq_hw_ctx *hctx = data; 1042320ae51fSJens Axboe struct blk_mq_ctx *ctx; 1043320ae51fSJens Axboe LIST_HEAD(tmp); 1044320ae51fSJens Axboe 1045320ae51fSJens Axboe if (action != CPU_DEAD && action != CPU_DEAD_FROZEN) 1046320ae51fSJens Axboe return; 1047320ae51fSJens Axboe 1048320ae51fSJens Axboe /* 1049320ae51fSJens Axboe * Move ctx entries to new CPU, if this one is going away. 1050320ae51fSJens Axboe */ 1051320ae51fSJens Axboe ctx = __blk_mq_get_ctx(hctx->queue, cpu); 1052320ae51fSJens Axboe 1053320ae51fSJens Axboe spin_lock(&ctx->lock); 1054320ae51fSJens Axboe if (!list_empty(&ctx->rq_list)) { 1055320ae51fSJens Axboe list_splice_init(&ctx->rq_list, &tmp); 1056320ae51fSJens Axboe clear_bit(ctx->index_hw, hctx->ctx_map); 1057320ae51fSJens Axboe } 1058320ae51fSJens Axboe spin_unlock(&ctx->lock); 1059320ae51fSJens Axboe 1060320ae51fSJens Axboe if (list_empty(&tmp)) 1061320ae51fSJens Axboe return; 1062320ae51fSJens Axboe 1063320ae51fSJens Axboe ctx = blk_mq_get_ctx(hctx->queue); 1064320ae51fSJens Axboe spin_lock(&ctx->lock); 1065320ae51fSJens Axboe 1066320ae51fSJens Axboe while (!list_empty(&tmp)) { 1067320ae51fSJens Axboe struct request *rq; 1068320ae51fSJens Axboe 1069320ae51fSJens Axboe rq = list_first_entry(&tmp, struct request, queuelist); 1070320ae51fSJens Axboe rq->mq_ctx = ctx; 1071320ae51fSJens Axboe list_move_tail(&rq->queuelist, &ctx->rq_list); 1072320ae51fSJens Axboe } 1073320ae51fSJens Axboe 1074320ae51fSJens Axboe blk_mq_hctx_mark_pending(hctx, ctx); 1075320ae51fSJens Axboe 1076320ae51fSJens Axboe spin_unlock(&ctx->lock); 1077320ae51fSJens Axboe blk_mq_put_ctx(ctx); 1078320ae51fSJens Axboe } 1079320ae51fSJens Axboe 1080320ae51fSJens Axboe static void blk_mq_init_hw_commands(struct blk_mq_hw_ctx *hctx, 1081320ae51fSJens Axboe void (*init)(void *, struct blk_mq_hw_ctx *, 1082320ae51fSJens Axboe struct request *, unsigned int), 1083320ae51fSJens Axboe void *data) 1084320ae51fSJens Axboe { 1085320ae51fSJens Axboe unsigned int i; 1086320ae51fSJens Axboe 1087320ae51fSJens Axboe for (i = 0; i < hctx->queue_depth; i++) { 1088320ae51fSJens Axboe struct request *rq = hctx->rqs[i]; 1089320ae51fSJens Axboe 1090320ae51fSJens Axboe init(data, hctx, rq, i); 1091320ae51fSJens Axboe } 1092320ae51fSJens Axboe } 1093320ae51fSJens Axboe 1094320ae51fSJens Axboe void blk_mq_init_commands(struct request_queue *q, 1095320ae51fSJens Axboe void (*init)(void *, struct blk_mq_hw_ctx *, 1096320ae51fSJens Axboe struct request *, unsigned int), 1097320ae51fSJens Axboe void *data) 1098320ae51fSJens Axboe { 1099320ae51fSJens Axboe struct blk_mq_hw_ctx *hctx; 1100320ae51fSJens Axboe unsigned int i; 1101320ae51fSJens Axboe 1102320ae51fSJens Axboe queue_for_each_hw_ctx(q, hctx, i) 1103320ae51fSJens Axboe blk_mq_init_hw_commands(hctx, init, data); 1104320ae51fSJens Axboe } 1105320ae51fSJens Axboe EXPORT_SYMBOL(blk_mq_init_commands); 1106320ae51fSJens Axboe 1107320ae51fSJens Axboe static void blk_mq_free_rq_map(struct blk_mq_hw_ctx *hctx) 1108320ae51fSJens Axboe { 1109320ae51fSJens Axboe struct page *page; 1110320ae51fSJens Axboe 1111320ae51fSJens Axboe while (!list_empty(&hctx->page_list)) { 11126753471cSDave Hansen page = list_first_entry(&hctx->page_list, struct page, lru); 11136753471cSDave Hansen list_del_init(&page->lru); 1114320ae51fSJens Axboe __free_pages(page, page->private); 1115320ae51fSJens Axboe } 1116320ae51fSJens Axboe 1117320ae51fSJens Axboe kfree(hctx->rqs); 1118320ae51fSJens Axboe 1119320ae51fSJens Axboe if (hctx->tags) 1120320ae51fSJens Axboe blk_mq_free_tags(hctx->tags); 1121320ae51fSJens Axboe } 1122320ae51fSJens Axboe 1123320ae51fSJens Axboe static size_t order_to_size(unsigned int order) 1124320ae51fSJens Axboe { 1125320ae51fSJens Axboe size_t ret = PAGE_SIZE; 1126320ae51fSJens Axboe 1127320ae51fSJens Axboe while (order--) 1128320ae51fSJens Axboe ret *= 2; 1129320ae51fSJens Axboe 1130320ae51fSJens Axboe return ret; 1131320ae51fSJens Axboe } 1132320ae51fSJens Axboe 1133320ae51fSJens Axboe static int blk_mq_init_rq_map(struct blk_mq_hw_ctx *hctx, 1134320ae51fSJens Axboe unsigned int reserved_tags, int node) 1135320ae51fSJens Axboe { 1136320ae51fSJens Axboe unsigned int i, j, entries_per_page, max_order = 4; 1137320ae51fSJens Axboe size_t rq_size, left; 1138320ae51fSJens Axboe 1139320ae51fSJens Axboe INIT_LIST_HEAD(&hctx->page_list); 1140320ae51fSJens Axboe 1141320ae51fSJens Axboe hctx->rqs = kmalloc_node(hctx->queue_depth * sizeof(struct request *), 1142320ae51fSJens Axboe GFP_KERNEL, node); 1143320ae51fSJens Axboe if (!hctx->rqs) 1144320ae51fSJens Axboe return -ENOMEM; 1145320ae51fSJens Axboe 1146320ae51fSJens Axboe /* 1147320ae51fSJens Axboe * rq_size is the size of the request plus driver payload, rounded 1148320ae51fSJens Axboe * to the cacheline size 1149320ae51fSJens Axboe */ 1150320ae51fSJens Axboe rq_size = round_up(sizeof(struct request) + hctx->cmd_size, 1151320ae51fSJens Axboe cache_line_size()); 1152320ae51fSJens Axboe left = rq_size * hctx->queue_depth; 1153320ae51fSJens Axboe 1154320ae51fSJens Axboe for (i = 0; i < hctx->queue_depth;) { 1155320ae51fSJens Axboe int this_order = max_order; 1156320ae51fSJens Axboe struct page *page; 1157320ae51fSJens Axboe int to_do; 1158320ae51fSJens Axboe void *p; 1159320ae51fSJens Axboe 1160320ae51fSJens Axboe while (left < order_to_size(this_order - 1) && this_order) 1161320ae51fSJens Axboe this_order--; 1162320ae51fSJens Axboe 1163320ae51fSJens Axboe do { 1164320ae51fSJens Axboe page = alloc_pages_node(node, GFP_KERNEL, this_order); 1165320ae51fSJens Axboe if (page) 1166320ae51fSJens Axboe break; 1167320ae51fSJens Axboe if (!this_order--) 1168320ae51fSJens Axboe break; 1169320ae51fSJens Axboe if (order_to_size(this_order) < rq_size) 1170320ae51fSJens Axboe break; 1171320ae51fSJens Axboe } while (1); 1172320ae51fSJens Axboe 1173320ae51fSJens Axboe if (!page) 1174320ae51fSJens Axboe break; 1175320ae51fSJens Axboe 1176320ae51fSJens Axboe page->private = this_order; 11776753471cSDave Hansen list_add_tail(&page->lru, &hctx->page_list); 1178320ae51fSJens Axboe 1179320ae51fSJens Axboe p = page_address(page); 1180320ae51fSJens Axboe entries_per_page = order_to_size(this_order) / rq_size; 1181320ae51fSJens Axboe to_do = min(entries_per_page, hctx->queue_depth - i); 1182320ae51fSJens Axboe left -= to_do * rq_size; 1183320ae51fSJens Axboe for (j = 0; j < to_do; j++) { 1184320ae51fSJens Axboe hctx->rqs[i] = p; 1185320ae51fSJens Axboe blk_mq_rq_init(hctx, hctx->rqs[i]); 1186320ae51fSJens Axboe p += rq_size; 1187320ae51fSJens Axboe i++; 1188320ae51fSJens Axboe } 1189320ae51fSJens Axboe } 1190320ae51fSJens Axboe 1191320ae51fSJens Axboe if (i < (reserved_tags + BLK_MQ_TAG_MIN)) 1192320ae51fSJens Axboe goto err_rq_map; 1193320ae51fSJens Axboe else if (i != hctx->queue_depth) { 1194320ae51fSJens Axboe hctx->queue_depth = i; 1195320ae51fSJens Axboe pr_warn("%s: queue depth set to %u because of low memory\n", 1196320ae51fSJens Axboe __func__, i); 1197320ae51fSJens Axboe } 1198320ae51fSJens Axboe 1199320ae51fSJens Axboe hctx->tags = blk_mq_init_tags(hctx->queue_depth, reserved_tags, node); 1200320ae51fSJens Axboe if (!hctx->tags) { 1201320ae51fSJens Axboe err_rq_map: 1202320ae51fSJens Axboe blk_mq_free_rq_map(hctx); 1203320ae51fSJens Axboe return -ENOMEM; 1204320ae51fSJens Axboe } 1205320ae51fSJens Axboe 1206320ae51fSJens Axboe return 0; 1207320ae51fSJens Axboe } 1208320ae51fSJens Axboe 1209320ae51fSJens Axboe static int blk_mq_init_hw_queues(struct request_queue *q, 1210320ae51fSJens Axboe struct blk_mq_reg *reg, void *driver_data) 1211320ae51fSJens Axboe { 1212320ae51fSJens Axboe struct blk_mq_hw_ctx *hctx; 1213320ae51fSJens Axboe unsigned int i, j; 1214320ae51fSJens Axboe 1215320ae51fSJens Axboe /* 1216320ae51fSJens Axboe * Initialize hardware queues 1217320ae51fSJens Axboe */ 1218320ae51fSJens Axboe queue_for_each_hw_ctx(q, hctx, i) { 1219320ae51fSJens Axboe unsigned int num_maps; 1220320ae51fSJens Axboe int node; 1221320ae51fSJens Axboe 1222320ae51fSJens Axboe node = hctx->numa_node; 1223320ae51fSJens Axboe if (node == NUMA_NO_NODE) 1224320ae51fSJens Axboe node = hctx->numa_node = reg->numa_node; 1225320ae51fSJens Axboe 1226320ae51fSJens Axboe INIT_DELAYED_WORK(&hctx->delayed_work, blk_mq_work_fn); 1227320ae51fSJens Axboe spin_lock_init(&hctx->lock); 1228320ae51fSJens Axboe INIT_LIST_HEAD(&hctx->dispatch); 1229320ae51fSJens Axboe hctx->queue = q; 1230320ae51fSJens Axboe hctx->queue_num = i; 1231320ae51fSJens Axboe hctx->flags = reg->flags; 1232320ae51fSJens Axboe hctx->queue_depth = reg->queue_depth; 1233f0276924SShaohua Li hctx->reserved_tags = reg->reserved_tags; 1234320ae51fSJens Axboe hctx->cmd_size = reg->cmd_size; 1235f0276924SShaohua Li atomic_set(&hctx->pending_flush, 0); 1236320ae51fSJens Axboe 1237320ae51fSJens Axboe blk_mq_init_cpu_notifier(&hctx->cpu_notifier, 1238320ae51fSJens Axboe blk_mq_hctx_notify, hctx); 1239320ae51fSJens Axboe blk_mq_register_cpu_notifier(&hctx->cpu_notifier); 1240320ae51fSJens Axboe 1241320ae51fSJens Axboe if (blk_mq_init_rq_map(hctx, reg->reserved_tags, node)) 1242320ae51fSJens Axboe break; 1243320ae51fSJens Axboe 1244320ae51fSJens Axboe /* 1245320ae51fSJens Axboe * Allocate space for all possible cpus to avoid allocation in 1246320ae51fSJens Axboe * runtime 1247320ae51fSJens Axboe */ 1248320ae51fSJens Axboe hctx->ctxs = kmalloc_node(nr_cpu_ids * sizeof(void *), 1249320ae51fSJens Axboe GFP_KERNEL, node); 1250320ae51fSJens Axboe if (!hctx->ctxs) 1251320ae51fSJens Axboe break; 1252320ae51fSJens Axboe 1253320ae51fSJens Axboe num_maps = ALIGN(nr_cpu_ids, BITS_PER_LONG) / BITS_PER_LONG; 1254320ae51fSJens Axboe hctx->ctx_map = kzalloc_node(num_maps * sizeof(unsigned long), 1255320ae51fSJens Axboe GFP_KERNEL, node); 1256320ae51fSJens Axboe if (!hctx->ctx_map) 1257320ae51fSJens Axboe break; 1258320ae51fSJens Axboe 1259320ae51fSJens Axboe hctx->nr_ctx_map = num_maps; 1260320ae51fSJens Axboe hctx->nr_ctx = 0; 1261320ae51fSJens Axboe 1262320ae51fSJens Axboe if (reg->ops->init_hctx && 1263320ae51fSJens Axboe reg->ops->init_hctx(hctx, driver_data, i)) 1264320ae51fSJens Axboe break; 1265320ae51fSJens Axboe } 1266320ae51fSJens Axboe 1267320ae51fSJens Axboe if (i == q->nr_hw_queues) 1268320ae51fSJens Axboe return 0; 1269320ae51fSJens Axboe 1270320ae51fSJens Axboe /* 1271320ae51fSJens Axboe * Init failed 1272320ae51fSJens Axboe */ 1273320ae51fSJens Axboe queue_for_each_hw_ctx(q, hctx, j) { 1274320ae51fSJens Axboe if (i == j) 1275320ae51fSJens Axboe break; 1276320ae51fSJens Axboe 1277320ae51fSJens Axboe if (reg->ops->exit_hctx) 1278320ae51fSJens Axboe reg->ops->exit_hctx(hctx, j); 1279320ae51fSJens Axboe 1280320ae51fSJens Axboe blk_mq_unregister_cpu_notifier(&hctx->cpu_notifier); 1281320ae51fSJens Axboe blk_mq_free_rq_map(hctx); 1282320ae51fSJens Axboe kfree(hctx->ctxs); 1283320ae51fSJens Axboe } 1284320ae51fSJens Axboe 1285320ae51fSJens Axboe return 1; 1286320ae51fSJens Axboe } 1287320ae51fSJens Axboe 1288320ae51fSJens Axboe static void blk_mq_init_cpu_queues(struct request_queue *q, 1289320ae51fSJens Axboe unsigned int nr_hw_queues) 1290320ae51fSJens Axboe { 1291320ae51fSJens Axboe unsigned int i; 1292320ae51fSJens Axboe 1293320ae51fSJens Axboe for_each_possible_cpu(i) { 1294320ae51fSJens Axboe struct blk_mq_ctx *__ctx = per_cpu_ptr(q->queue_ctx, i); 1295320ae51fSJens Axboe struct blk_mq_hw_ctx *hctx; 1296320ae51fSJens Axboe 1297320ae51fSJens Axboe memset(__ctx, 0, sizeof(*__ctx)); 1298320ae51fSJens Axboe __ctx->cpu = i; 1299320ae51fSJens Axboe spin_lock_init(&__ctx->lock); 1300320ae51fSJens Axboe INIT_LIST_HEAD(&__ctx->rq_list); 1301320ae51fSJens Axboe __ctx->queue = q; 1302320ae51fSJens Axboe 1303320ae51fSJens Axboe /* If the cpu isn't online, the cpu is mapped to first hctx */ 1304320ae51fSJens Axboe hctx = q->mq_ops->map_queue(q, i); 1305320ae51fSJens Axboe hctx->nr_ctx++; 1306320ae51fSJens Axboe 1307320ae51fSJens Axboe if (!cpu_online(i)) 1308320ae51fSJens Axboe continue; 1309320ae51fSJens Axboe 1310320ae51fSJens Axboe /* 1311320ae51fSJens Axboe * Set local node, IFF we have more than one hw queue. If 1312320ae51fSJens Axboe * not, we remain on the home node of the device 1313320ae51fSJens Axboe */ 1314320ae51fSJens Axboe if (nr_hw_queues > 1 && hctx->numa_node == NUMA_NO_NODE) 1315320ae51fSJens Axboe hctx->numa_node = cpu_to_node(i); 1316320ae51fSJens Axboe } 1317320ae51fSJens Axboe } 1318320ae51fSJens Axboe 1319320ae51fSJens Axboe static void blk_mq_map_swqueue(struct request_queue *q) 1320320ae51fSJens Axboe { 1321320ae51fSJens Axboe unsigned int i; 1322320ae51fSJens Axboe struct blk_mq_hw_ctx *hctx; 1323320ae51fSJens Axboe struct blk_mq_ctx *ctx; 1324320ae51fSJens Axboe 1325320ae51fSJens Axboe queue_for_each_hw_ctx(q, hctx, i) { 1326320ae51fSJens Axboe hctx->nr_ctx = 0; 1327320ae51fSJens Axboe } 1328320ae51fSJens Axboe 1329320ae51fSJens Axboe /* 1330320ae51fSJens Axboe * Map software to hardware queues 1331320ae51fSJens Axboe */ 1332320ae51fSJens Axboe queue_for_each_ctx(q, ctx, i) { 1333320ae51fSJens Axboe /* If the cpu isn't online, the cpu is mapped to first hctx */ 1334320ae51fSJens Axboe hctx = q->mq_ops->map_queue(q, i); 1335320ae51fSJens Axboe ctx->index_hw = hctx->nr_ctx; 1336320ae51fSJens Axboe hctx->ctxs[hctx->nr_ctx++] = ctx; 1337320ae51fSJens Axboe } 1338320ae51fSJens Axboe } 1339320ae51fSJens Axboe 1340320ae51fSJens Axboe struct request_queue *blk_mq_init_queue(struct blk_mq_reg *reg, 1341320ae51fSJens Axboe void *driver_data) 1342320ae51fSJens Axboe { 1343320ae51fSJens Axboe struct blk_mq_hw_ctx **hctxs; 1344320ae51fSJens Axboe struct blk_mq_ctx *ctx; 1345320ae51fSJens Axboe struct request_queue *q; 1346320ae51fSJens Axboe int i; 1347320ae51fSJens Axboe 1348320ae51fSJens Axboe if (!reg->nr_hw_queues || 1349320ae51fSJens Axboe !reg->ops->queue_rq || !reg->ops->map_queue || 1350320ae51fSJens Axboe !reg->ops->alloc_hctx || !reg->ops->free_hctx) 1351320ae51fSJens Axboe return ERR_PTR(-EINVAL); 1352320ae51fSJens Axboe 1353320ae51fSJens Axboe if (!reg->queue_depth) 1354320ae51fSJens Axboe reg->queue_depth = BLK_MQ_MAX_DEPTH; 1355320ae51fSJens Axboe else if (reg->queue_depth > BLK_MQ_MAX_DEPTH) { 1356320ae51fSJens Axboe pr_err("blk-mq: queuedepth too large (%u)\n", reg->queue_depth); 1357320ae51fSJens Axboe reg->queue_depth = BLK_MQ_MAX_DEPTH; 1358320ae51fSJens Axboe } 1359320ae51fSJens Axboe 1360320ae51fSJens Axboe if (reg->queue_depth < (reg->reserved_tags + BLK_MQ_TAG_MIN)) 1361320ae51fSJens Axboe return ERR_PTR(-EINVAL); 1362320ae51fSJens Axboe 1363320ae51fSJens Axboe ctx = alloc_percpu(struct blk_mq_ctx); 1364320ae51fSJens Axboe if (!ctx) 1365320ae51fSJens Axboe return ERR_PTR(-ENOMEM); 1366320ae51fSJens Axboe 1367320ae51fSJens Axboe hctxs = kmalloc_node(reg->nr_hw_queues * sizeof(*hctxs), GFP_KERNEL, 1368320ae51fSJens Axboe reg->numa_node); 1369320ae51fSJens Axboe 1370320ae51fSJens Axboe if (!hctxs) 1371320ae51fSJens Axboe goto err_percpu; 1372320ae51fSJens Axboe 1373320ae51fSJens Axboe for (i = 0; i < reg->nr_hw_queues; i++) { 1374320ae51fSJens Axboe hctxs[i] = reg->ops->alloc_hctx(reg, i); 1375320ae51fSJens Axboe if (!hctxs[i]) 1376320ae51fSJens Axboe goto err_hctxs; 1377320ae51fSJens Axboe 1378320ae51fSJens Axboe hctxs[i]->numa_node = NUMA_NO_NODE; 1379320ae51fSJens Axboe hctxs[i]->queue_num = i; 1380320ae51fSJens Axboe } 1381320ae51fSJens Axboe 1382320ae51fSJens Axboe q = blk_alloc_queue_node(GFP_KERNEL, reg->numa_node); 1383320ae51fSJens Axboe if (!q) 1384320ae51fSJens Axboe goto err_hctxs; 1385320ae51fSJens Axboe 1386320ae51fSJens Axboe q->mq_map = blk_mq_make_queue_map(reg); 1387320ae51fSJens Axboe if (!q->mq_map) 1388320ae51fSJens Axboe goto err_map; 1389320ae51fSJens Axboe 1390320ae51fSJens Axboe setup_timer(&q->timeout, blk_mq_rq_timer, (unsigned long) q); 1391320ae51fSJens Axboe blk_queue_rq_timeout(q, 30000); 1392320ae51fSJens Axboe 1393320ae51fSJens Axboe q->nr_queues = nr_cpu_ids; 1394320ae51fSJens Axboe q->nr_hw_queues = reg->nr_hw_queues; 1395320ae51fSJens Axboe 1396320ae51fSJens Axboe q->queue_ctx = ctx; 1397320ae51fSJens Axboe q->queue_hw_ctx = hctxs; 1398320ae51fSJens Axboe 1399320ae51fSJens Axboe q->mq_ops = reg->ops; 140094eddfbeSJens Axboe q->queue_flags |= QUEUE_FLAG_MQ_DEFAULT; 1401320ae51fSJens Axboe 14021be036e9SChristoph Hellwig q->sg_reserved_size = INT_MAX; 14031be036e9SChristoph Hellwig 1404320ae51fSJens Axboe blk_queue_make_request(q, blk_mq_make_request); 1405320ae51fSJens Axboe blk_queue_rq_timed_out(q, reg->ops->timeout); 1406320ae51fSJens Axboe if (reg->timeout) 1407320ae51fSJens Axboe blk_queue_rq_timeout(q, reg->timeout); 1408320ae51fSJens Axboe 1409*30a91cb4SChristoph Hellwig if (reg->ops->complete) 1410*30a91cb4SChristoph Hellwig blk_queue_softirq_done(q, reg->ops->complete); 1411*30a91cb4SChristoph Hellwig 1412320ae51fSJens Axboe blk_mq_init_flush(q); 1413320ae51fSJens Axboe blk_mq_init_cpu_queues(q, reg->nr_hw_queues); 1414320ae51fSJens Axboe 1415320ae51fSJens Axboe if (blk_mq_init_hw_queues(q, reg, driver_data)) 1416320ae51fSJens Axboe goto err_hw; 1417320ae51fSJens Axboe 1418320ae51fSJens Axboe blk_mq_map_swqueue(q); 1419320ae51fSJens Axboe 1420320ae51fSJens Axboe mutex_lock(&all_q_mutex); 1421320ae51fSJens Axboe list_add_tail(&q->all_q_node, &all_q_list); 1422320ae51fSJens Axboe mutex_unlock(&all_q_mutex); 1423320ae51fSJens Axboe 1424320ae51fSJens Axboe return q; 1425320ae51fSJens Axboe err_hw: 1426320ae51fSJens Axboe kfree(q->mq_map); 1427320ae51fSJens Axboe err_map: 1428320ae51fSJens Axboe blk_cleanup_queue(q); 1429320ae51fSJens Axboe err_hctxs: 1430320ae51fSJens Axboe for (i = 0; i < reg->nr_hw_queues; i++) { 1431320ae51fSJens Axboe if (!hctxs[i]) 1432320ae51fSJens Axboe break; 1433320ae51fSJens Axboe reg->ops->free_hctx(hctxs[i], i); 1434320ae51fSJens Axboe } 1435320ae51fSJens Axboe kfree(hctxs); 1436320ae51fSJens Axboe err_percpu: 1437320ae51fSJens Axboe free_percpu(ctx); 1438320ae51fSJens Axboe return ERR_PTR(-ENOMEM); 1439320ae51fSJens Axboe } 1440320ae51fSJens Axboe EXPORT_SYMBOL(blk_mq_init_queue); 1441320ae51fSJens Axboe 1442320ae51fSJens Axboe void blk_mq_free_queue(struct request_queue *q) 1443320ae51fSJens Axboe { 1444320ae51fSJens Axboe struct blk_mq_hw_ctx *hctx; 1445320ae51fSJens Axboe int i; 1446320ae51fSJens Axboe 1447320ae51fSJens Axboe queue_for_each_hw_ctx(q, hctx, i) { 1448320ae51fSJens Axboe kfree(hctx->ctx_map); 1449320ae51fSJens Axboe kfree(hctx->ctxs); 1450320ae51fSJens Axboe blk_mq_free_rq_map(hctx); 1451320ae51fSJens Axboe blk_mq_unregister_cpu_notifier(&hctx->cpu_notifier); 1452320ae51fSJens Axboe if (q->mq_ops->exit_hctx) 1453320ae51fSJens Axboe q->mq_ops->exit_hctx(hctx, i); 1454320ae51fSJens Axboe q->mq_ops->free_hctx(hctx, i); 1455320ae51fSJens Axboe } 1456320ae51fSJens Axboe 1457320ae51fSJens Axboe free_percpu(q->queue_ctx); 1458320ae51fSJens Axboe kfree(q->queue_hw_ctx); 1459320ae51fSJens Axboe kfree(q->mq_map); 1460320ae51fSJens Axboe 1461320ae51fSJens Axboe q->queue_ctx = NULL; 1462320ae51fSJens Axboe q->queue_hw_ctx = NULL; 1463320ae51fSJens Axboe q->mq_map = NULL; 1464320ae51fSJens Axboe 1465320ae51fSJens Axboe mutex_lock(&all_q_mutex); 1466320ae51fSJens Axboe list_del_init(&q->all_q_node); 1467320ae51fSJens Axboe mutex_unlock(&all_q_mutex); 1468320ae51fSJens Axboe } 1469320ae51fSJens Axboe 1470320ae51fSJens Axboe /* Basically redo blk_mq_init_queue with queue frozen */ 1471f618ef7cSPaul Gortmaker static void blk_mq_queue_reinit(struct request_queue *q) 1472320ae51fSJens Axboe { 1473320ae51fSJens Axboe blk_mq_freeze_queue(q); 1474320ae51fSJens Axboe 1475320ae51fSJens Axboe blk_mq_update_queue_map(q->mq_map, q->nr_hw_queues); 1476320ae51fSJens Axboe 1477320ae51fSJens Axboe /* 1478320ae51fSJens Axboe * redo blk_mq_init_cpu_queues and blk_mq_init_hw_queues. FIXME: maybe 1479320ae51fSJens Axboe * we should change hctx numa_node according to new topology (this 1480320ae51fSJens Axboe * involves free and re-allocate memory, worthy doing?) 1481320ae51fSJens Axboe */ 1482320ae51fSJens Axboe 1483320ae51fSJens Axboe blk_mq_map_swqueue(q); 1484320ae51fSJens Axboe 1485320ae51fSJens Axboe blk_mq_unfreeze_queue(q); 1486320ae51fSJens Axboe } 1487320ae51fSJens Axboe 1488f618ef7cSPaul Gortmaker static int blk_mq_queue_reinit_notify(struct notifier_block *nb, 1489320ae51fSJens Axboe unsigned long action, void *hcpu) 1490320ae51fSJens Axboe { 1491320ae51fSJens Axboe struct request_queue *q; 1492320ae51fSJens Axboe 1493320ae51fSJens Axboe /* 1494320ae51fSJens Axboe * Before new mapping is established, hotadded cpu might already start 1495320ae51fSJens Axboe * handling requests. This doesn't break anything as we map offline 1496320ae51fSJens Axboe * CPUs to first hardware queue. We will re-init queue below to get 1497320ae51fSJens Axboe * optimal settings. 1498320ae51fSJens Axboe */ 1499320ae51fSJens Axboe if (action != CPU_DEAD && action != CPU_DEAD_FROZEN && 1500320ae51fSJens Axboe action != CPU_ONLINE && action != CPU_ONLINE_FROZEN) 1501320ae51fSJens Axboe return NOTIFY_OK; 1502320ae51fSJens Axboe 1503320ae51fSJens Axboe mutex_lock(&all_q_mutex); 1504320ae51fSJens Axboe list_for_each_entry(q, &all_q_list, all_q_node) 1505320ae51fSJens Axboe blk_mq_queue_reinit(q); 1506320ae51fSJens Axboe mutex_unlock(&all_q_mutex); 1507320ae51fSJens Axboe return NOTIFY_OK; 1508320ae51fSJens Axboe } 1509320ae51fSJens Axboe 1510320ae51fSJens Axboe static int __init blk_mq_init(void) 1511320ae51fSJens Axboe { 1512320ae51fSJens Axboe blk_mq_cpu_init(); 1513320ae51fSJens Axboe 1514320ae51fSJens Axboe /* Must be called after percpu_counter_hotcpu_callback() */ 1515320ae51fSJens Axboe hotcpu_notifier(blk_mq_queue_reinit_notify, -10); 1516320ae51fSJens Axboe 1517320ae51fSJens Axboe return 0; 1518320ae51fSJens Axboe } 1519320ae51fSJens Axboe subsys_initcall(blk_mq_init); 1520