IB/{hfi1, qib, rvt} Cleanup open coded sge usage
authorMichael J. Ruhl <michael.j.ruhl@intel.com>
Thu, 24 Jan 2019 03:08:29 +0000 (19:08 -0800)
committerDoug Ledford <dledford@redhat.com>
Wed, 30 Jan 2019 19:22:32 +0000 (14:22 -0500)
Several locations for manipulating sges use an open coded sequence
that is covered by helper functions.

Use the appropriate helper functions.

Signed-off-by: Michael J. Ruhl <michael.j.ruhl@intel.com>
Signed-off-by: Dennis Dalessandro <dennis.dalessandro@intel.com>
Signed-off-by: Doug Ledford <dledford@redhat.com>
drivers/infiniband/hw/hfi1/ud.c
drivers/infiniband/hw/qib/qib_sdma.c
drivers/infiniband/sw/rdmavt/qp.c

index 88242fe..c98d94c 100644 (file)
@@ -222,31 +222,11 @@ static void ud_loopback(struct rvt_qp *sqp, struct rvt_swqe *swqe)
        ssge.num_sge = swqe->wr.num_sge;
        sge = &ssge.sge;
        while (length) {
-               u32 len = sge->length;
+               u32 len = rvt_get_sge_length(sge, length);
 
-               if (len > length)
-                       len = length;
-               if (len > sge->sge_length)
-                       len = sge->sge_length;
                WARN_ON_ONCE(len == 0);
                rvt_copy_sge(qp, &qp->r_sge, sge->vaddr, len, true, false);
-               sge->vaddr += len;
-               sge->length -= len;
-               sge->sge_length -= len;
-               if (sge->sge_length == 0) {
-                       if (--ssge.num_sge)
-                               *sge = *ssge.sg_list++;
-               } else if (sge->length == 0 && sge->mr->lkey) {
-                       if (++sge->n >= RVT_SEGSZ) {
-                               if (++sge->m >= sge->mr->mapsz)
-                                       break;
-                               sge->n = 0;
-                       }
-                       sge->vaddr =
-                               sge->mr->map[sge->m]->segs[sge->n].vaddr;
-                       sge->length =
-                               sge->mr->map[sge->m]->segs[sge->n].length;
-               }
+               rvt_update_sge(&ssge, len, false);
                length -= len;
        }
        rvt_put_ss(&qp->r_sge);
index 3d64081..99e11c3 100644 (file)
@@ -565,13 +565,8 @@ retry:
        sge = &ss->sge;
        while (dwords) {
                u32 dw;
-               u32 len;
+               u32 len = rvt_get_sge_length(sge, dwords << 2);
 
-               len = dwords << 2;
-               if (len > sge->length)
-                       len = sge->length;
-               if (len > sge->sge_length)
-                       len = sge->sge_length;
                dw = (len + 3) >> 2;
                addr = dma_map_single(&ppd->dd->pcidev->dev, sge->vaddr,
                                      dw << 2, DMA_TO_DEVICE);
@@ -594,24 +589,7 @@ retry:
                        descqp = &ppd->sdma_descq[0].qw[0];
                        ++ppd->sdma_generation;
                }
-               sge->vaddr += len;
-               sge->length -= len;
-               sge->sge_length -= len;
-               if (sge->sge_length == 0) {
-                       if (--ss->num_sge)
-                               *sge = *ss->sg_list++;
-               } else if (sge->length == 0 && sge->mr->lkey) {
-                       if (++sge->n >= RVT_SEGSZ) {
-                               if (++sge->m >= sge->mr->mapsz)
-                                       break;
-                               sge->n = 0;
-                       }
-                       sge->vaddr =
-                               sge->mr->map[sge->m]->segs[sge->n].vaddr;
-                       sge->length =
-                               sge->mr->map[sge->m]->segs[sge->n].length;
-               }
-
+               rvt_update_sge(ss, len, false);
                dwoffset += dw;
                dwords -= dw;
        }
index a1bd8cf..16247d2 100644 (file)
@@ -2986,34 +2986,12 @@ do_write:
 
        sge = &sqp->s_sge.sge;
        while (sqp->s_len) {
-               u32 len = sqp->s_len;
+               u32 len = rvt_get_sge_length(sge, sqp->s_len);
 
-               if (len > sge->length)
-                       len = sge->length;
-               if (len > sge->sge_length)
-                       len = sge->sge_length;
                WARN_ON_ONCE(len == 0);
                rvt_copy_sge(qp, &qp->r_sge, sge->vaddr,
                             len, release, copy_last);
-               sge->vaddr += len;
-               sge->length -= len;
-               sge->sge_length -= len;
-               if (sge->sge_length == 0) {
-                       if (!release)
-                               rvt_put_mr(sge->mr);
-                       if (--sqp->s_sge.num_sge)
-                               *sge = *sqp->s_sge.sg_list++;
-               } else if (sge->length == 0 && sge->mr->lkey) {
-                       if (++sge->n >= RVT_SEGSZ) {
-                               if (++sge->m >= sge->mr->mapsz)
-                                       break;
-                               sge->n = 0;
-                       }
-                       sge->vaddr =
-                               sge->mr->map[sge->m]->segs[sge->n].vaddr;
-                       sge->length =
-                               sge->mr->map[sge->m]->segs[sge->n].length;
-               }
+               rvt_update_sge(&sqp->s_sge, len, !release);
                sqp->s_len -= len;
        }
        if (release)