Hi Here is an example of using blk-mq with a host that has an eMMC Command Queue Engine (CQE). Points to note: - it is a bit rough, lacks explanation, patches need splitting up - does seem to work, but not tested properly - uses BLK_MQ_F_BLOCKING BLK_MQ_F_BLOCKING is used for a number of reasons: 1. Since v4.12 if a queue has only 1 hw queue (and mmc only ever has 1), then requests are never issued directly (refer blk_mq_make_request()) which means there is no practical advantage not to use BLK_MQ_F_BLOCKING 2. CQE only supports reads / writes so the CQE implementation makes use of the existing non-CQE code for discards and flushes - which are both blocking at this time. 3. blk-mq has no support for runtime pm and mmc runtime pm is blocking 4. host claiming is blocking 5. existing synchronization does not support requests being issued simultaneously One small concern is that the block layer workqueue runs with elevated priority (WQ_HIGHPRI). It is not clear to me whether that might be undesirable on the occasion mmc is polling, for example mmc_poll_for_busy() when the host implements host->ops->card_busy() Adrian Hunter (3): mmc: core: Add parameter use_blk_mq mmc: core: Introduce host claiming by context mmc: block: Add blk-mq support for CQE drivers/mmc/Kconfig | 11 ++ drivers/mmc/core/block.c | 88 ++++++++++-- drivers/mmc/core/block.h | 2 + drivers/mmc/core/core.c | 116 ++++++++++++++- drivers/mmc/core/core.h | 10 ++ drivers/mmc/core/host.c | 2 + drivers/mmc/core/host.h | 4 + drivers/mmc/core/queue.c | 363 +++++++++++++++++++++++++++++++++++++++++------ drivers/mmc/core/queue.h | 4 + include/linux/mmc/host.h | 8 +- 10 files changed, 545 insertions(+), 63 deletions(-) Regards Adrian