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
pathway.

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.

Regards,
Patrick

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



More information about the Linux-nvme mailing list