xprtrdma: Simplify rpcrdma_convert_kvec() and frwr_map()

Clean up.

Remove a conditional branch from the SGL set-up loop in frwr_map():
Instead of using either sg_set_page() or sg_set_buf(), initialize
the mr_page field properly when rpcrdma_convert_kvec() converts the
kvec to an SGL entry. frwr_map() can then invoke sg_set_page()
unconditionally.

Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
Reviewed-by: Tom Talpey <tom@talpey.com>
Signed-off-by: Anna Schumaker <Anna.Schumaker@Netapp.com>
This commit is contained in:
Chuck Lever 2021-02-04 11:59:07 -05:00 коммит произвёл Anna Schumaker
Родитель 9929f4adce
Коммит 54e6aec57c
3 изменённых файлов: 10 добавлений и 13 удалений

Просмотреть файл

@ -306,14 +306,10 @@ struct rpcrdma_mr_seg *frwr_map(struct rpcrdma_xprt *r_xprt,
if (nsegs > ep->re_max_fr_depth) if (nsegs > ep->re_max_fr_depth)
nsegs = ep->re_max_fr_depth; nsegs = ep->re_max_fr_depth;
for (i = 0; i < nsegs;) { for (i = 0; i < nsegs;) {
if (seg->mr_page) sg_set_page(&mr->mr_sg[i],
sg_set_page(&mr->mr_sg[i], seg->mr_page,
seg->mr_page, seg->mr_len,
seg->mr_len, offset_in_page(seg->mr_offset));
offset_in_page(seg->mr_offset));
else
sg_set_buf(&mr->mr_sg[i], seg->mr_offset,
seg->mr_len);
++seg; ++seg;
++i; ++i;

Просмотреть файл

@ -213,7 +213,7 @@ static struct rpcrdma_mr_seg *
rpcrdma_convert_kvec(struct kvec *vec, struct rpcrdma_mr_seg *seg, rpcrdma_convert_kvec(struct kvec *vec, struct rpcrdma_mr_seg *seg,
unsigned int *n) unsigned int *n)
{ {
seg->mr_page = NULL; seg->mr_page = virt_to_page(vec->iov_base);
seg->mr_offset = vec->iov_base; seg->mr_offset = vec->iov_base;
seg->mr_len = vec->iov_len; seg->mr_len = vec->iov_len;
++seg; ++seg;

Просмотреть файл

@ -283,10 +283,11 @@ enum {
RPCRDMA_MAX_IOV_SEGS, RPCRDMA_MAX_IOV_SEGS,
}; };
struct rpcrdma_mr_seg { /* chunk descriptors */ /* Arguments for DMA mapping and registration */
u32 mr_len; /* length of chunk or segment */ struct rpcrdma_mr_seg {
struct page *mr_page; /* owning page, if any */ u32 mr_len; /* length of segment */
char *mr_offset; /* kva if no page, else offset */ struct page *mr_page; /* underlying struct page */
char *mr_offset; /* IN: page offset, OUT: iova */
}; };
/* The Send SGE array is provisioned to send a maximum size /* The Send SGE array is provisioned to send a maximum size