nvme_admin_passthru DMA failure

Patrick Sheridan patrick.sheridan at seagate.com
Fri Oct 7 14:15:26 PDT 2016

There is a problem when using an NVME_IOCTL_ADMIN_CMD to submit an
nvme_admin_passthru struct such that user data
(nvme_passthru_cmd.addr) does not get DMA'd to the drive correctly.

The problem first appeared in kernel tags/v4.5.1 and was absent in
tags/v4.5.  The only relevant difference between those was in
block/blk-core.c, so this is likely a block layer problem:

diff --git a/block/blk-core.c b/block/blk-core.c
index b83d297..45f4d7e 100644
--- a/block/blk-core.c
+++ b/block/blk-core.c
@@ -2198,7 +2198,7 @@ int blk_insert_cloned_request(struct
request_queue *q, struct request *rq)
        if (q->mq_ops) {
                if (blk_queue_io_stat(q))
                        blk_account_io_start(rq, true);
-               blk_mq_insert_request(rq, false, true, true);
+               blk_mq_insert_request(rq, false, true, false);
                return 0;

Reverting the blk_mq_insert_request to use async = true resolves the
issue in 4.5.1, but the latest (sha:  c8d2bc9) no longer uses this

There's been a lot of changes since 4.5.1, so I haven't been able to
pin down where the problem is, and would appreciate any help.


Patrick Sheridan, PhD
Senior Engineer
Seagate Technology
389 Disc Dr. Longmont, CO 80503

More information about the Linux-nvme mailing list