xprtrdma: Clean up fixup_copy_count accounting
fixup_copy_count should count only the number of bytes copied to the page list. The head and tail are now always handled without a data copy. And the debugging at the end of rpcrdma_inline_fixup() is also no longer necessary, since copy_len will be non-zero when there is reply data in the tail (a normal and valid case). Signed-off-by: Chuck Lever <chuck.lever@oracle.com> Tested-by: Steve Wise <swise@opengridcomputing.com> Signed-off-by: Anna Schumaker <Anna.Schumaker@Netapp.com>
This commit is contained in:
parent
cfabe2c634
commit
64695bde6c
net/sunrpc/xprtrdma
|
@ -755,11 +755,14 @@ rpcrdma_count_chunks(struct rpcrdma_rep *rep, int wrchunk, __be32 **iptrp)
|
||||||
* many cases this function simply updates iov_base pointers in
|
* many cases this function simply updates iov_base pointers in
|
||||||
* rq_rcv_buf to point directly to the received reply data, to
|
* rq_rcv_buf to point directly to the received reply data, to
|
||||||
* avoid copying reply data.
|
* avoid copying reply data.
|
||||||
|
*
|
||||||
|
* Returns the count of bytes which had to be memcopied.
|
||||||
*/
|
*/
|
||||||
static void
|
static unsigned long
|
||||||
rpcrdma_inline_fixup(struct rpc_rqst *rqst, char *srcp, int copy_len, int pad)
|
rpcrdma_inline_fixup(struct rpc_rqst *rqst, char *srcp, int copy_len, int pad)
|
||||||
{
|
{
|
||||||
int i, npages, curlen, olen;
|
unsigned long fixup_copy_count;
|
||||||
|
int i, npages, curlen;
|
||||||
char *destp;
|
char *destp;
|
||||||
struct page **ppages;
|
struct page **ppages;
|
||||||
int page_base;
|
int page_base;
|
||||||
|
@ -781,13 +784,10 @@ rpcrdma_inline_fixup(struct rpc_rqst *rqst, char *srcp, int copy_len, int pad)
|
||||||
srcp += curlen;
|
srcp += curlen;
|
||||||
copy_len -= curlen;
|
copy_len -= curlen;
|
||||||
|
|
||||||
olen = copy_len;
|
|
||||||
i = 0;
|
|
||||||
rpcx_to_rdmax(rqst->rq_xprt)->rx_stats.fixup_copy_count += olen;
|
|
||||||
page_base = rqst->rq_rcv_buf.page_base;
|
page_base = rqst->rq_rcv_buf.page_base;
|
||||||
ppages = rqst->rq_rcv_buf.pages + (page_base >> PAGE_SHIFT);
|
ppages = rqst->rq_rcv_buf.pages + (page_base >> PAGE_SHIFT);
|
||||||
page_base &= ~PAGE_MASK;
|
page_base &= ~PAGE_MASK;
|
||||||
|
fixup_copy_count = 0;
|
||||||
if (copy_len && rqst->rq_rcv_buf.page_len) {
|
if (copy_len && rqst->rq_rcv_buf.page_len) {
|
||||||
int pagelist_len;
|
int pagelist_len;
|
||||||
|
|
||||||
|
@ -795,7 +795,7 @@ rpcrdma_inline_fixup(struct rpc_rqst *rqst, char *srcp, int copy_len, int pad)
|
||||||
if (pagelist_len > copy_len)
|
if (pagelist_len > copy_len)
|
||||||
pagelist_len = copy_len;
|
pagelist_len = copy_len;
|
||||||
npages = PAGE_ALIGN(page_base + pagelist_len) >> PAGE_SHIFT;
|
npages = PAGE_ALIGN(page_base + pagelist_len) >> PAGE_SHIFT;
|
||||||
for (; i < npages; i++) {
|
for (i = 0; i < npages; i++) {
|
||||||
curlen = PAGE_SIZE - page_base;
|
curlen = PAGE_SIZE - page_base;
|
||||||
if (curlen > pagelist_len)
|
if (curlen > pagelist_len)
|
||||||
curlen = pagelist_len;
|
curlen = pagelist_len;
|
||||||
|
@ -809,6 +809,7 @@ rpcrdma_inline_fixup(struct rpc_rqst *rqst, char *srcp, int copy_len, int pad)
|
||||||
kunmap_atomic(destp);
|
kunmap_atomic(destp);
|
||||||
srcp += curlen;
|
srcp += curlen;
|
||||||
copy_len -= curlen;
|
copy_len -= curlen;
|
||||||
|
fixup_copy_count += curlen;
|
||||||
pagelist_len -= curlen;
|
pagelist_len -= curlen;
|
||||||
if (!pagelist_len)
|
if (!pagelist_len)
|
||||||
break;
|
break;
|
||||||
|
@ -833,10 +834,7 @@ rpcrdma_inline_fixup(struct rpc_rqst *rqst, char *srcp, int copy_len, int pad)
|
||||||
rqst->rq_private_buf.tail[0].iov_base = srcp;
|
rqst->rq_private_buf.tail[0].iov_base = srcp;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (copy_len)
|
return fixup_copy_count;
|
||||||
dprintk("RPC: %s: %d bytes in"
|
|
||||||
" %d extra segments (%d lost)\n",
|
|
||||||
__func__, olen, i, copy_len);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
@ -999,8 +997,10 @@ rpcrdma_reply_handler(struct rpcrdma_rep *rep)
|
||||||
rep->rr_len -= RPCRDMA_HDRLEN_MIN;
|
rep->rr_len -= RPCRDMA_HDRLEN_MIN;
|
||||||
status = rep->rr_len;
|
status = rep->rr_len;
|
||||||
}
|
}
|
||||||
/* Fix up the rpc results for upper layer */
|
|
||||||
rpcrdma_inline_fixup(rqst, (char *)iptr, rep->rr_len, rdmalen);
|
r_xprt->rx_stats.fixup_copy_count +=
|
||||||
|
rpcrdma_inline_fixup(rqst, (char *)iptr, rep->rr_len,
|
||||||
|
rdmalen);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case rdma_nomsg:
|
case rdma_nomsg:
|
||||||
|
|
Loading…
Reference in New Issue