On Mon, Mar 25, 2019 at 07:03:23PM -0700, Sagi Grimberg wrote:
The scatterlist in the nvme target is always allocated by the nvmet code itself an thus never contains multi-page sg list entries.
I am wondering if it is true.
Not look at other target code yet, however seems it isn't true for loop, see the following code in nvme_loop_queue_rq():
iod->req.sg = iod->sg_table.sgl; iod->req.sg_cnt = blk_rq_map_sg(req->q, req, iod->sg_table.sgl); iod->req.transfer_len = blk_rq_payload_bytes(req);
And it has been triggered by nvme/011 in Yi's test.
Yes, loop is an exception in this case.
Thanks for the clarification!
Another candidate fix is to set nvmet-loop's queue segment boundary mask as PAGE_SIZE - 1.
Also there is the same issue for block device backed target.
If no one objects, I'd like to take the approach of adjusting segment boundary mask.
Thanks, Ming