|
@@ -384,6 +384,7 @@ static int send_reply(struct svcxprt_rdma *rdma,
|
|
|
int byte_count)
|
|
|
{
|
|
|
struct ib_send_wr send_wr;
|
|
|
+ u32 xdr_off;
|
|
|
int sge_no;
|
|
|
int sge_bytes;
|
|
|
int page_no;
|
|
@@ -418,8 +419,8 @@ static int send_reply(struct svcxprt_rdma *rdma,
|
|
|
ctxt->direction = DMA_TO_DEVICE;
|
|
|
|
|
|
/* Map the payload indicated by 'byte_count' */
|
|
|
+ xdr_off = 0;
|
|
|
for (sge_no = 1; byte_count && sge_no < vec->count; sge_no++) {
|
|
|
- int xdr_off = 0;
|
|
|
sge_bytes = min_t(size_t, vec->sge[sge_no].iov_len, byte_count);
|
|
|
byte_count -= sge_bytes;
|
|
|
ctxt->sge[sge_no].addr =
|
|
@@ -457,6 +458,13 @@ static int send_reply(struct svcxprt_rdma *rdma,
|
|
|
}
|
|
|
rqstp->rq_next_page = rqstp->rq_respages + 1;
|
|
|
|
|
|
+ /* The loop above bumps sc_dma_used for each sge. The
|
|
|
+ * xdr_buf.tail gets a separate sge, but resides in the
|
|
|
+ * same page as xdr_buf.head. Don't count it twice.
|
|
|
+ */
|
|
|
+ if (sge_no > ctxt->count)
|
|
|
+ atomic_dec(&rdma->sc_dma_used);
|
|
|
+
|
|
|
if (sge_no > rdma->sc_max_sge) {
|
|
|
pr_err("svcrdma: Too many sges (%d)\n", sge_no);
|
|
|
goto err;
|