nvme: clarify single SGL descriptor case
If only one descriptor is needed, there is a special case in the spec for SGL1 using the Data Block descriptor type. Add a comment to make it clear what is going on. Also tweak the SGL1 setup to copy from the first SGL descriptor list element instead of relying on the last value from the loop above, since that could be easily broken by accident. Change-Id: I49ef97fe5bf18d2bf1d86b4310a7d3abdfd03e57 Signed-off-by: Daniel Verkamp <daniel.verkamp@intel.com>
This commit is contained in:
parent
1524f2935c
commit
3cec6c846b
@ -702,9 +702,15 @@ _nvme_qpair_build_hw_sgl_request(struct spdk_nvme_qpair *qpair, struct nvme_requ
|
||||
}
|
||||
|
||||
if (nseg == 1) {
|
||||
/*
|
||||
* The whole transfer can be described by a single SGL descriptor.
|
||||
* Use the special case described by the spec where SGL1's type is Data Block.
|
||||
* This means the SGL in the tracker is not used at all, so copy the first (and only)
|
||||
* SGL element into SGL1.
|
||||
*/
|
||||
req->cmd.dptr.sgl1.type = SPDK_NVME_SGL_TYPE_DATA_BLOCK;
|
||||
req->cmd.dptr.sgl1.address = phys_addr;
|
||||
req->cmd.dptr.sgl1.length = data_transfered;
|
||||
req->cmd.dptr.sgl1.address = tr->u.sgl[0].address;
|
||||
req->cmd.dptr.sgl1.length = tr->u.sgl[0].length;
|
||||
} else {
|
||||
/* For now we can only support 1 SGL segment in NVMe controller */
|
||||
req->cmd.dptr.sgl1.type = SPDK_NVME_SGL_TYPE_LAST_SEGMENT;
|
||||
|
Loading…
x
Reference in New Issue
Block a user