|
@@ -298,8 +298,9 @@ rpcrdma_recvcq_process_wc(struct ib_wc *wc, struct list_head *sched_list)
|
|
|
|
|
|
rep->rr_len = wc->byte_len;
|
|
|
ib_dma_sync_single_for_cpu(rdmab_to_ia(rep->rr_buffer)->ri_id->device,
|
|
|
- rep->rr_iov.addr, rep->rr_len, DMA_FROM_DEVICE);
|
|
|
- prefetch(rep->rr_base);
|
|
|
+ rdmab_addr(rep->rr_rdmabuf),
|
|
|
+ rep->rr_len, DMA_FROM_DEVICE);
|
|
|
+ prefetch(rdmab_to_msg(rep->rr_rdmabuf));
|
|
|
|
|
|
out_schedule:
|
|
|
list_add_tail(&rep->rr_list, sched_list);
|
|
@@ -1092,23 +1093,21 @@ static struct rpcrdma_rep *
|
|
|
rpcrdma_create_rep(struct rpcrdma_xprt *r_xprt)
|
|
|
{
|
|
|
struct rpcrdma_create_data_internal *cdata = &r_xprt->rx_data;
|
|
|
- size_t rlen = 1 << fls(cdata->inline_rsize +
|
|
|
- sizeof(struct rpcrdma_rep));
|
|
|
struct rpcrdma_ia *ia = &r_xprt->rx_ia;
|
|
|
struct rpcrdma_rep *rep;
|
|
|
int rc;
|
|
|
|
|
|
rc = -ENOMEM;
|
|
|
- rep = kmalloc(rlen, GFP_KERNEL);
|
|
|
+ rep = kzalloc(sizeof(*rep), GFP_KERNEL);
|
|
|
if (rep == NULL)
|
|
|
goto out;
|
|
|
- memset(rep, 0, sizeof(*rep));
|
|
|
|
|
|
- rc = rpcrdma_register_internal(ia, rep->rr_base, rlen -
|
|
|
- offsetof(struct rpcrdma_rep, rr_base),
|
|
|
- &rep->rr_handle, &rep->rr_iov);
|
|
|
- if (rc)
|
|
|
+ rep->rr_rdmabuf = rpcrdma_alloc_regbuf(ia, cdata->inline_rsize,
|
|
|
+ GFP_KERNEL);
|
|
|
+ if (IS_ERR(rep->rr_rdmabuf)) {
|
|
|
+ rc = PTR_ERR(rep->rr_rdmabuf);
|
|
|
goto out_free;
|
|
|
+ }
|
|
|
|
|
|
rep->rr_buffer = &r_xprt->rx_buf;
|
|
|
return rep;
|
|
@@ -1306,7 +1305,7 @@ rpcrdma_destroy_rep(struct rpcrdma_ia *ia, struct rpcrdma_rep *rep)
|
|
|
if (!rep)
|
|
|
return;
|
|
|
|
|
|
- rpcrdma_deregister_internal(ia, rep->rr_handle, &rep->rr_iov);
|
|
|
+ rpcrdma_free_regbuf(ia, rep->rr_rdmabuf);
|
|
|
kfree(rep);
|
|
|
}
|
|
|
|
|
@@ -2209,11 +2208,13 @@ rpcrdma_ep_post_recv(struct rpcrdma_ia *ia,
|
|
|
|
|
|
recv_wr.next = NULL;
|
|
|
recv_wr.wr_id = (u64) (unsigned long) rep;
|
|
|
- recv_wr.sg_list = &rep->rr_iov;
|
|
|
+ recv_wr.sg_list = &rep->rr_rdmabuf->rg_iov;
|
|
|
recv_wr.num_sge = 1;
|
|
|
|
|
|
ib_dma_sync_single_for_cpu(ia->ri_id->device,
|
|
|
- rep->rr_iov.addr, rep->rr_iov.length, DMA_BIDIRECTIONAL);
|
|
|
+ rdmab_addr(rep->rr_rdmabuf),
|
|
|
+ rdmab_length(rep->rr_rdmabuf),
|
|
|
+ DMA_BIDIRECTIONAL);
|
|
|
|
|
|
rc = ib_post_recv(ia->ri_id->qp, &recv_wr, &recv_wr_fail);
|
|
|
|