RDMA/siw: Factor out siw_rx_data helper

Remove the redundant code given they share the same logic.

Acked-by: Bernard Metzler <bmt@zurich.ibm.com>
Signed-off-by: Guoqing Jiang <guoqing.jiang@linux.dev>
Link: https://lore.kernel.org/r/20231113115726.12762-8-guoqing.jiang@linux.dev
Signed-off-by: Leon Romanovsky <leon@kernel.org>
This commit is contained in:
Guoqing Jiang 2023-11-13 19:57:16 +08:00 committed by Leon Romanovsky
parent 065186d228
commit 60d2136db8

View file

@ -405,6 +405,20 @@ static struct siw_wqe *siw_rqe_get(struct siw_qp *qp)
return wqe;
}
static int siw_rx_data(struct siw_mem *mem_p, struct siw_rx_stream *srx,
unsigned int *pbl_idx, u64 addr, int bytes)
{
int rv;
if (mem_p->mem_obj == NULL)
rv = siw_rx_kva(srx, ib_virt_dma_to_ptr(addr), bytes);
else if (!mem_p->is_pbl)
rv = siw_rx_umem(srx, mem_p->umem, addr, bytes);
else
rv = siw_rx_pbl(srx, pbl_idx, mem_p, addr, bytes);
return rv;
}
/*
* siw_proc_send:
*
@ -485,17 +499,8 @@ int siw_proc_send(struct siw_qp *qp)
break;
}
mem_p = *mem;
if (mem_p->mem_obj == NULL)
rv = siw_rx_kva(srx,
ib_virt_dma_to_ptr(sge->laddr + frx->sge_off),
sge_bytes);
else if (!mem_p->is_pbl)
rv = siw_rx_umem(srx, mem_p->umem,
rv = siw_rx_data(mem_p, srx, &frx->pbl_idx,
sge->laddr + frx->sge_off, sge_bytes);
else
rv = siw_rx_pbl(srx, &frx->pbl_idx, mem_p,
sge->laddr + frx->sge_off, sge_bytes);
if (unlikely(rv != sge_bytes)) {
wqe->processed += rcvd_bytes;
@ -598,17 +603,8 @@ int siw_proc_write(struct siw_qp *qp)
return -EINVAL;
}
if (mem->mem_obj == NULL)
rv = siw_rx_kva(srx,
(void *)(uintptr_t)(srx->ddp_to + srx->fpdu_part_rcvd),
bytes);
else if (!mem->is_pbl)
rv = siw_rx_umem(srx, mem->umem,
rv = siw_rx_data(mem, srx, &frx->pbl_idx,
srx->ddp_to + srx->fpdu_part_rcvd, bytes);
else
rv = siw_rx_pbl(srx, &frx->pbl_idx, mem,
srx->ddp_to + srx->fpdu_part_rcvd, bytes);
if (unlikely(rv != bytes)) {
siw_init_terminate(qp, TERM_ERROR_LAYER_DDP,
DDP_ETYPE_CATASTROPHIC,
@ -849,16 +845,7 @@ int siw_proc_rresp(struct siw_qp *qp)
mem_p = *mem;
bytes = min(srx->fpdu_part_rem, srx->skb_new);
if (mem_p->mem_obj == NULL)
rv = siw_rx_kva(srx,
ib_virt_dma_to_ptr(sge->laddr + wqe->processed),
bytes);
else if (!mem_p->is_pbl)
rv = siw_rx_umem(srx, mem_p->umem, sge->laddr + wqe->processed,
bytes);
else
rv = siw_rx_pbl(srx, &frx->pbl_idx, mem_p,
rv = siw_rx_data(mem_p, srx, &frx->pbl_idx,
sge->laddr + wqe->processed, bytes);
if (rv != bytes) {
wqe->wc_status = SIW_WC_GENERAL_ERR;