[4/5] 9p: factor out 'post_send()'
Commit Message
From: Ye Bin <yebin10@huawei.com>
Factor out 'post_send()' to send request. No functional change.
Signed-off-by: Ye Bin <yebin10@huawei.com>
---
net/9p/trans_rdma.c | 130 +++++++++++++++++++++++---------------------
1 file changed, 69 insertions(+), 61 deletions(-)
@@ -417,14 +417,72 @@ post_recv(struct p9_client *client, struct p9_rdma_context *c)
return err;
}
-static int rdma_request(struct p9_client *client, struct p9_req_t *req)
+static int post_send(struct p9_client *client, struct p9_req_t *req)
{
struct p9_trans_rdma *rdma = client->trans;
+ struct p9_rdma_context *c = NULL;
struct ib_send_wr wr;
struct ib_sge sge;
+ int err;
+
+ c = kmalloc(sizeof *c, GFP_NOFS);
+ if (!c) {
+ err = -ENOMEM;
+ goto error;
+ }
+ c->req = req;
+
+ c->busa = ib_dma_map_single(rdma->cm_id->device,
+ c->req->tc.sdata, c->req->tc.size,
+ DMA_TO_DEVICE);
+ if (ib_dma_mapping_error(rdma->cm_id->device, c->busa)) {
+ err = -EIO;
+ goto error;
+ }
+
+ c->cqe.done = send_done;
+
+ sge.addr = c->busa;
+ sge.length = c->req->tc.size;
+ sge.lkey = rdma->pd->local_dma_lkey;
+
+ wr.next = NULL;
+ wr.wr_cqe = &c->cqe;
+ wr.opcode = IB_WR_SEND;
+ wr.send_flags = IB_SEND_SIGNALED;
+ wr.sg_list = &sge;
+ wr.num_sge = 1;
+
+ if (down_interruptible(&rdma->sq_sem)) {
+ err = -EINTR;
+ goto mapping_error;
+ }
+
+ /* Mark request as `sent' *before* we actually send it,
+ * because doing if after could erase the REQ_STATUS_RCVD
+ * status in case of a very fast reply.
+ */
+ req->status = REQ_STATUS_SENT;
+ err = ib_post_send(rdma->qp, &wr, NULL);
+ if (err)
+ goto sem_error;
+
+ return 0;
+sem_error:
+ up(&rdma->sq_sem);
+mapping_error:
+ ib_dma_unmap_single(rdma->cm_id->device, c->busa,
+ c->req->tc.size, DMA_TO_DEVICE);
+error:
+ kfree(c);
+ return err;
+}
+
+static int rdma_request(struct p9_client *client, struct p9_req_t *req)
+{
+ struct p9_trans_rdma *rdma = client->trans;
int err = 0;
unsigned long flags;
- struct p9_rdma_context *c = NULL;
struct p9_rdma_context *rpl_context = NULL;
/* When an error occurs between posting the recv and the send,
@@ -476,67 +534,17 @@ static int rdma_request(struct p9_client *client, struct p9_req_t *req)
req->rc.sdata = NULL;
dont_need_post_recv:
- /* Post the request */
- c = kmalloc(sizeof *c, GFP_NOFS);
- if (!c) {
- err = -ENOMEM;
- goto send_error;
- }
- c->req = req;
-
- c->busa = ib_dma_map_single(rdma->cm_id->device,
- c->req->tc.sdata, c->req->tc.size,
- DMA_TO_DEVICE);
- if (ib_dma_mapping_error(rdma->cm_id->device, c->busa)) {
- err = -EIO;
- goto send_error;
- }
-
- c->cqe.done = send_done;
-
- sge.addr = c->busa;
- sge.length = c->req->tc.size;
- sge.lkey = rdma->pd->local_dma_lkey;
-
- wr.next = NULL;
- wr.wr_cqe = &c->cqe;
- wr.opcode = IB_WR_SEND;
- wr.send_flags = IB_SEND_SIGNALED;
- wr.sg_list = &sge;
- wr.num_sge = 1;
-
- if (down_interruptible(&rdma->sq_sem)) {
- err = -EINTR;
- goto mapping_error;
- }
-
- /* Mark request as `sent' *before* we actually send it,
- * because doing if after could erase the REQ_STATUS_RCVD
- * status in case of a very fast reply.
- */
- req->status = REQ_STATUS_SENT;
- err = ib_post_send(rdma->qp, &wr, NULL);
+ err = post_send(client, req);
if (err) {
- up(&rdma->sq_sem);
- goto mapping_error;
+ req->status = REQ_STATUS_ERROR;
+ p9_debug(P9_DEBUG_ERROR, "Error %d in rdma_request()\n", err);
+
+ /* Ach.
+ * We did recv_post(), but not send. We have one recv_post
+ * in excess.
+ */
+ atomic_inc(&rdma->excess_rc);
}
-
- /* Success */
- return 0;
-
- /* Handle errors that happened during or while preparing the send: */
- mapping_error:
- ib_dma_unmap_single(rdma->cm_id->device, c->busa,
- c->req->tc.size, DMA_TO_DEVICE);
- send_error:
- req->status = REQ_STATUS_ERROR;
- kfree(c);
- p9_debug(P9_DEBUG_ERROR, "Error %d in rdma_request()\n", err);
-
- /* Ach.
- * We did recv_post(), but not send. We have one recv_post in excess.
- */
- atomic_inc(&rdma->excess_rc);
return err;
/* Handle errors that happened during or while preparing post_recv(): */