On Mon, 16 Mar 2020 at 15:30, Marcel Apfelbaum <marcel.apfelb...@gmail.com> wrote:
> Hi Yuval, > > On 3/7/20 2:56 PM, Yuval Shaia wrote: > > The function build_host_sge_array uses two sge arrays, one for input and > > one for output. > > Since the size of the two arrays is the same, the function can write > > directly to the given source array (i.e. input/output argument). > > > > Signed-off-by: Yuval Shaia <yuval.shaia...@gmail.com> > > --- > > hw/rdma/rdma_backend.c | 40 +++++++++++++++++----------------------- > > 1 file changed, 17 insertions(+), 23 deletions(-) > > > > diff --git a/hw/rdma/rdma_backend.c b/hw/rdma/rdma_backend.c > > index c346407cd3..79b9cfb487 100644 > > --- a/hw/rdma/rdma_backend.c > > +++ b/hw/rdma/rdma_backend.c > > @@ -378,30 +378,27 @@ static void ah_cache_init(void) > > } > > > > static int build_host_sge_array(RdmaDeviceResources *rdma_dev_res, > > - struct ibv_sge *dsge, struct ibv_sge > *ssge, > > - uint8_t num_sge, uint64_t *total_length) > > + struct ibv_sge *sge, uint8_t num_sge, > > + uint64_t *total_length) > > { > > RdmaRmMR *mr; > > - int ssge_idx; > > + int idx; > > > > - for (ssge_idx = 0; ssge_idx < num_sge; ssge_idx++) { > > - mr = rdma_rm_get_mr(rdma_dev_res, ssge[ssge_idx].lkey); > > + for (idx = 0; idx < num_sge; idx++) { > > + mr = rdma_rm_get_mr(rdma_dev_res, sge[idx].lkey); > > if (unlikely(!mr)) { > > - rdma_error_report("Invalid lkey 0x%x", ssge[ssge_idx].lkey); > > - return VENDOR_ERR_INVLKEY | ssge[ssge_idx].lkey; > > + rdma_error_report("Invalid lkey 0x%x", sge[idx].lkey); > > + return VENDOR_ERR_INVLKEY | sge[idx].lkey; > > } > > > > #ifdef LEGACY_RDMA_REG_MR > > - dsge->addr = (uintptr_t)mr->virt + ssge[ssge_idx].addr - > mr->start; > > + sge[idx].addr = (uintptr_t)mr->virt + sge[idx].addr - mr->start; > > #else > > - dsge->addr = ssge[ssge_idx].addr; > > + sge[idx].addr = sge[idx].addr; > > It seems we don't need the above line. > Other than that it looks good to me. > Yeah, thanks. It is fixed in the next patch but better be fixed here. Will fix and post new set. > > Thanks, > Marcel > > > #endif > > - dsge->length = ssge[ssge_idx].length; > > - dsge->lkey = rdma_backend_mr_lkey(&mr->backend_mr); > > + sge[idx].lkey = rdma_backend_mr_lkey(&mr->backend_mr); > > > > - *total_length += dsge->length; > > - > > - dsge++; > > + *total_length += sge[idx].length; > > } > > > > return 0; > > @@ -484,7 +481,6 @@ void rdma_backend_post_send(RdmaBackendDev > *backend_dev, > > void *ctx) > > { > > BackendCtx *bctx; > > - struct ibv_sge new_sge[MAX_SGE]; > > uint32_t bctx_id; > > int rc; > > struct ibv_send_wr wr = {}, *bad_wr; > > @@ -518,7 +514,7 @@ void rdma_backend_post_send(RdmaBackendDev > *backend_dev, > > > > rdma_protected_gslist_append_int32(&qp->cqe_ctx_list, bctx_id); > > > > - rc = build_host_sge_array(backend_dev->rdma_dev_res, new_sge, sge, > num_sge, > > + rc = build_host_sge_array(backend_dev->rdma_dev_res, sge, num_sge, > > > &backend_dev->rdma_dev_res->stats.tx_len); > > if (rc) { > > complete_work(IBV_WC_GENERAL_ERR, rc, ctx); > > @@ -538,7 +534,7 @@ void rdma_backend_post_send(RdmaBackendDev > *backend_dev, > > wr.num_sge = num_sge; > > wr.opcode = IBV_WR_SEND; > > wr.send_flags = IBV_SEND_SIGNALED; > > - wr.sg_list = new_sge; > > + wr.sg_list = sge; > > wr.wr_id = bctx_id; > > > > rc = ibv_post_send(qp->ibqp, &wr, &bad_wr); > > @@ -601,7 +597,6 @@ void rdma_backend_post_recv(RdmaBackendDev > *backend_dev, > > struct ibv_sge *sge, uint32_t num_sge, > void *ctx) > > { > > BackendCtx *bctx; > > - struct ibv_sge new_sge[MAX_SGE]; > > uint32_t bctx_id; > > int rc; > > struct ibv_recv_wr wr = {}, *bad_wr; > > @@ -635,7 +630,7 @@ void rdma_backend_post_recv(RdmaBackendDev > *backend_dev, > > > > rdma_protected_gslist_append_int32(&qp->cqe_ctx_list, bctx_id); > > > > - rc = build_host_sge_array(backend_dev->rdma_dev_res, new_sge, sge, > num_sge, > > + rc = build_host_sge_array(backend_dev->rdma_dev_res, sge, num_sge, > > > &backend_dev->rdma_dev_res->stats.rx_bufs_len); > > if (rc) { > > complete_work(IBV_WC_GENERAL_ERR, rc, ctx); > > @@ -643,7 +638,7 @@ void rdma_backend_post_recv(RdmaBackendDev > *backend_dev, > > } > > > > wr.num_sge = num_sge; > > - wr.sg_list = new_sge; > > + wr.sg_list = sge; > > wr.wr_id = bctx_id; > > rc = ibv_post_recv(qp->ibqp, &wr, &bad_wr); > > if (rc) { > > @@ -671,7 +666,6 @@ void rdma_backend_post_srq_recv(RdmaBackendDev > *backend_dev, > > uint32_t num_sge, void *ctx) > > { > > BackendCtx *bctx; > > - struct ibv_sge new_sge[MAX_SGE]; > > uint32_t bctx_id; > > int rc; > > struct ibv_recv_wr wr = {}, *bad_wr; > > @@ -688,7 +682,7 @@ void rdma_backend_post_srq_recv(RdmaBackendDev > *backend_dev, > > > > rdma_protected_gslist_append_int32(&srq->cqe_ctx_list, bctx_id); > > > > - rc = build_host_sge_array(backend_dev->rdma_dev_res, new_sge, sge, > num_sge, > > + rc = build_host_sge_array(backend_dev->rdma_dev_res, sge, num_sge, > > > &backend_dev->rdma_dev_res->stats.rx_bufs_len); > > if (rc) { > > complete_work(IBV_WC_GENERAL_ERR, rc, ctx); > > @@ -696,7 +690,7 @@ void rdma_backend_post_srq_recv(RdmaBackendDev > *backend_dev, > > } > > > > wr.num_sge = num_sge; > > - wr.sg_list = new_sge; > > + wr.sg_list = sge; > > wr.wr_id = bctx_id; > > rc = ibv_post_srq_recv(srq->ibsrq, &wr, &bad_wr); > > if (rc) { > >