···13041304 dm_set_md_type(md, dm_table_get_type(t));1305130513061306 /* setup md->queue to reflect md's type (may block) */13071307- r = dm_setup_md_queue(md);13071307+ r = dm_setup_md_queue(md, t);13081308 if (r) {13091309 DMWARN("unable to set up device queue for new table.");13101310 goto err_unlock_md_type;
+26-7
drivers/md/dm.c
···224224225225 /* for blk-mq request-based DM support */226226 struct blk_mq_tag_set *tag_set;227227- bool use_blk_mq;227227+ bool use_blk_mq:1;228228+ bool init_tio_pdu:1;228229};229230230231#ifdef CONFIG_DM_MQ_DEFAULT···244243{245244 return md->use_blk_mq;246245}246246+EXPORT_SYMBOL_GPL(dm_use_blk_mq);247247248248/*249249 * For mempools pre-allocation at the table loading time.···18911889 tio->clone = NULL;18921890 tio->orig = rq;18931891 tio->error = 0;18941894- memset(&tio->info, 0, sizeof(tio->info));18921892+ /*18931893+ * Avoid initializing info for blk-mq; it passes18941894+ * target-specific data through info.ptr18951895+ * (see: dm_mq_init_request)18961896+ */18971897+ if (!md->init_tio_pdu)18981898+ memset(&tio->info, 0, sizeof(tio->info));18951899 if (md->kworker_task)18961900 init_kthread_work(&tio->work, map_tio_request);18971901}···23212313 goto bad_io_barrier;2322231423232315 md->use_blk_mq = use_blk_mq;23162316+ md->init_tio_pdu = false;23242317 md->type = DM_TYPE_NONE;23252318 mutex_init(&md->suspend_lock);23262319 mutex_init(&md->type_lock);···26622653 */26632654 tio->md = md;2664265526562656+ if (md->init_tio_pdu) {26572657+ /* target-specific per-io data is immediately after the tio */26582658+ tio->info.ptr = tio + 1;26592659+ }26602660+26652661 return 0;26662662}26672663···27182704 .init_request = dm_mq_init_request,27192705};2720270627212721-static int dm_mq_init_request_queue(struct mapped_device *md)27072707+static int dm_mq_init_request_queue(struct mapped_device *md,27082708+ struct dm_target *immutable_tgt)27222709{27232710 struct request_queue *q;27242711 int err;···27412726 md->tag_set->driver_data = md;2742272727432728 md->tag_set->cmd_size = sizeof(struct dm_rq_target_io);27292729+ if (immutable_tgt && immutable_tgt->per_io_data_size) {27302730+ /* any target-specific per-io data is immediately after the tio */27312731+ md->tag_set->cmd_size += immutable_tgt->per_io_data_size;27322732+ md->init_tio_pdu = true;27332733+ }2744273427452735 err = blk_mq_alloc_tag_set(md->tag_set);27462736 if (err)···27832763/*27842764 * Setup the DM device's queue based on md's type27852765 */27862786-int dm_setup_md_queue(struct mapped_device *md)27662766+int dm_setup_md_queue(struct mapped_device *md, struct dm_table *t)27872767{27882768 int r;27892769 unsigned md_type = filter_md_type(dm_get_md_type(md), md);···27972777 }27982778 break;27992779 case DM_TYPE_MQ_REQUEST_BASED:28002800- r = dm_mq_init_request_queue(md);27802780+ r = dm_mq_init_request_queue(md, dm_table_get_immutable_target(t));28012781 if (r) {28022782 DMERR("Cannot initialize queue for request-based dm-mq mapped device");28032783 return r;···35253505 if (!pool_size)35263506 pool_size = dm_get_reserved_rq_based_ios();35273507 front_pad = offsetof(struct dm_rq_clone_bio_info, clone);35283528- /* per_io_data_size is not used. */35293529- WARN_ON(per_io_data_size != 0);35083508+ /* per_io_data_size is used for blk-mq pdu at queue allocation */35303509 break;35313510 default:35323511 BUG();
+1-1
drivers/md/dm.h
···8686unsigned dm_get_md_type(struct mapped_device *md);8787struct target_type *dm_get_immutable_target_type(struct mapped_device *md);88888989-int dm_setup_md_queue(struct mapped_device *md);8989+int dm_setup_md_queue(struct mapped_device *md, struct dm_table *t);90909191/*9292 * To check the return value from dm_table_find_target().