Commit 324d9e78 authored by Israel Rukshin's avatar Israel Rukshin Committed by Christoph Hellwig

nvme-rdma: introduce nvme_rdma_sgl structure

Remove first_sgl pointer from struct nvme_rdma_request and use pointer
arithmetic instead. The inline scatterlist, if exists, will be located
right after the nvme_rdma_request. This patch is needed as a preparation
for adding PI support.
Signed-off-by: default avatarIsrael Rukshin <israelr@mellanox.com>
Reviewed-by: default avatarMax Gurtovoy <maxg@mellanox.com>
Signed-off-by: default avatarChristoph Hellwig <hch@lst.de>
parent ba7ca2ae
...@@ -48,6 +48,11 @@ struct nvme_rdma_qe { ...@@ -48,6 +48,11 @@ struct nvme_rdma_qe {
u64 dma; u64 dma;
}; };
struct nvme_rdma_sgl {
int nents;
struct sg_table sg_table;
};
struct nvme_rdma_queue; struct nvme_rdma_queue;
struct nvme_rdma_request { struct nvme_rdma_request {
struct nvme_request req; struct nvme_request req;
...@@ -58,12 +63,10 @@ struct nvme_rdma_request { ...@@ -58,12 +63,10 @@ struct nvme_rdma_request {
refcount_t ref; refcount_t ref;
struct ib_sge sge[1 + NVME_RDMA_MAX_INLINE_SEGMENTS]; struct ib_sge sge[1 + NVME_RDMA_MAX_INLINE_SEGMENTS];
u32 num_sge; u32 num_sge;
int nents;
struct ib_reg_wr reg_wr; struct ib_reg_wr reg_wr;
struct ib_cqe reg_cqe; struct ib_cqe reg_cqe;
struct nvme_rdma_queue *queue; struct nvme_rdma_queue *queue;
struct sg_table sg_table; struct nvme_rdma_sgl data_sgl;
struct scatterlist first_sgl[];
}; };
enum nvme_rdma_queue_flags { enum nvme_rdma_queue_flags {
...@@ -1158,8 +1161,9 @@ static void nvme_rdma_unmap_data(struct nvme_rdma_queue *queue, ...@@ -1158,8 +1161,9 @@ static void nvme_rdma_unmap_data(struct nvme_rdma_queue *queue,
req->mr = NULL; req->mr = NULL;
} }
ib_dma_unmap_sg(ibdev, req->sg_table.sgl, req->nents, rq_dma_dir(rq)); ib_dma_unmap_sg(ibdev, req->data_sgl.sg_table.sgl, req->data_sgl.nents,
sg_free_table_chained(&req->sg_table, NVME_INLINE_SG_CNT); rq_dma_dir(rq));
sg_free_table_chained(&req->data_sgl.sg_table, NVME_INLINE_SG_CNT);
} }
static int nvme_rdma_set_sg_null(struct nvme_command *c) static int nvme_rdma_set_sg_null(struct nvme_command *c)
...@@ -1178,7 +1182,7 @@ static int nvme_rdma_map_sg_inline(struct nvme_rdma_queue *queue, ...@@ -1178,7 +1182,7 @@ static int nvme_rdma_map_sg_inline(struct nvme_rdma_queue *queue,
int count) int count)
{ {
struct nvme_sgl_desc *sg = &c->common.dptr.sgl; struct nvme_sgl_desc *sg = &c->common.dptr.sgl;
struct scatterlist *sgl = req->sg_table.sgl; struct scatterlist *sgl = req->data_sgl.sg_table.sgl;
struct ib_sge *sge = &req->sge[1]; struct ib_sge *sge = &req->sge[1];
u32 len = 0; u32 len = 0;
int i; int i;
...@@ -1203,8 +1207,8 @@ static int nvme_rdma_map_sg_single(struct nvme_rdma_queue *queue, ...@@ -1203,8 +1207,8 @@ static int nvme_rdma_map_sg_single(struct nvme_rdma_queue *queue,
{ {
struct nvme_keyed_sgl_desc *sg = &c->common.dptr.ksgl; struct nvme_keyed_sgl_desc *sg = &c->common.dptr.ksgl;
sg->addr = cpu_to_le64(sg_dma_address(req->sg_table.sgl)); sg->addr = cpu_to_le64(sg_dma_address(req->data_sgl.sg_table.sgl));
put_unaligned_le24(sg_dma_len(req->sg_table.sgl), sg->length); put_unaligned_le24(sg_dma_len(req->data_sgl.sg_table.sgl), sg->length);
put_unaligned_le32(queue->device->pd->unsafe_global_rkey, sg->key); put_unaligned_le32(queue->device->pd->unsafe_global_rkey, sg->key);
sg->type = NVME_KEY_SGL_FMT_DATA_DESC << 4; sg->type = NVME_KEY_SGL_FMT_DATA_DESC << 4;
return 0; return 0;
...@@ -1225,7 +1229,8 @@ static int nvme_rdma_map_sg_fr(struct nvme_rdma_queue *queue, ...@@ -1225,7 +1229,8 @@ static int nvme_rdma_map_sg_fr(struct nvme_rdma_queue *queue,
* Align the MR to a 4K page size to match the ctrl page size and * Align the MR to a 4K page size to match the ctrl page size and
* the block virtual boundary. * the block virtual boundary.
*/ */
nr = ib_map_mr_sg(req->mr, req->sg_table.sgl, count, NULL, SZ_4K); nr = ib_map_mr_sg(req->mr, req->data_sgl.sg_table.sgl, count, NULL,
SZ_4K);
if (unlikely(nr < count)) { if (unlikely(nr < count)) {
ib_mr_pool_put(queue->qp, &queue->qp->rdma_mrs, req->mr); ib_mr_pool_put(queue->qp, &queue->qp->rdma_mrs, req->mr);
req->mr = NULL; req->mr = NULL;
...@@ -1272,17 +1277,18 @@ static int nvme_rdma_map_data(struct nvme_rdma_queue *queue, ...@@ -1272,17 +1277,18 @@ static int nvme_rdma_map_data(struct nvme_rdma_queue *queue,
if (!blk_rq_nr_phys_segments(rq)) if (!blk_rq_nr_phys_segments(rq))
return nvme_rdma_set_sg_null(c); return nvme_rdma_set_sg_null(c);
req->sg_table.sgl = req->first_sgl; req->data_sgl.sg_table.sgl = (struct scatterlist *)(req + 1);
ret = sg_alloc_table_chained(&req->sg_table, ret = sg_alloc_table_chained(&req->data_sgl.sg_table,
blk_rq_nr_phys_segments(rq), req->sg_table.sgl, blk_rq_nr_phys_segments(rq), req->data_sgl.sg_table.sgl,
NVME_INLINE_SG_CNT); NVME_INLINE_SG_CNT);
if (ret) if (ret)
return -ENOMEM; return -ENOMEM;
req->nents = blk_rq_map_sg(rq->q, rq, req->sg_table.sgl); req->data_sgl.nents = blk_rq_map_sg(rq->q, rq,
req->data_sgl.sg_table.sgl);
count = ib_dma_map_sg(ibdev, req->sg_table.sgl, req->nents, count = ib_dma_map_sg(ibdev, req->data_sgl.sg_table.sgl,
rq_dma_dir(rq)); req->data_sgl.nents, rq_dma_dir(rq));
if (unlikely(count <= 0)) { if (unlikely(count <= 0)) {
ret = -EIO; ret = -EIO;
goto out_free_table; goto out_free_table;
...@@ -1311,9 +1317,10 @@ static int nvme_rdma_map_data(struct nvme_rdma_queue *queue, ...@@ -1311,9 +1317,10 @@ static int nvme_rdma_map_data(struct nvme_rdma_queue *queue,
return 0; return 0;
out_unmap_sg: out_unmap_sg:
ib_dma_unmap_sg(ibdev, req->sg_table.sgl, req->nents, rq_dma_dir(rq)); ib_dma_unmap_sg(ibdev, req->data_sgl.sg_table.sgl, req->data_sgl.nents,
rq_dma_dir(rq));
out_free_table: out_free_table:
sg_free_table_chained(&req->sg_table, NVME_INLINE_SG_CNT); sg_free_table_chained(&req->data_sgl.sg_table, NVME_INLINE_SG_CNT);
return ret; return ret;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment