libcli/smb/smb_direct.c wait for IBV_WC_RDMA_READ completion
authorStefan Metzmacher <metze@samba.org>
Wed, 5 Oct 2016 15:54:46 +0000 (17:54 +0200)
committerStefan Metzmacher <metze@samba.org>
Fri, 1 Jun 2018 12:35:17 +0000 (14:35 +0200)
libcli/smb/smb_direct.c

index 774186b9f01f56547002f8fe077f47501eee7156..4dcd3b3ec2087e27d05c50c68a3e1dc75149a559 100644 (file)
@@ -972,9 +972,6 @@ static struct tevent_req *smb_direct_connection_negotiate_connect_send(TALLOC_CT
        struct tevent_req *req;
        struct smb_direct_connection_negotiate_connect_state *state;
        struct smb_direct_io *rdma_read = NULL;
-       struct smb_direct_io *neg_send = NULL;
-       struct smb_direct_io *neg_recv = NULL;
-       struct ibv_recv_wr *bad_recv_wr = NULL;
        struct ibv_send_wr *bad_send_wr = NULL;
        NTSTATUS status;
        int ret;
@@ -1007,16 +1004,6 @@ DEBUG(0,("%s:%s: here...\n", __location__, __func__));
                return tevent_req_post(req, ev);
        }
 
-       neg_recv = smb_direct_io_create(c);
-       if (tevent_req_nomem(neg_recv, req)) {
-               return tevent_req_post(req, ev);
-       }
-       neg_recv->sge[0].addr = (uint64_t) (uintptr_t) neg_recv->data;
-       neg_recv->sge[0].length = sizeof(neg_recv->data);
-       neg_recv->sge[0].lkey = neg_recv->data_mr->lkey;
-       neg_recv->recv_wr.sg_list = neg_recv->sge;
-       neg_recv->recv_wr.num_sge = 1;
-
        rdma_read = smb_direct_io_create(c);
        if (tevent_req_nomem(rdma_read, req)) {
                return tevent_req_post(req, ev);
@@ -1031,36 +1018,6 @@ DEBUG(0,("%s:%s: here...\n", __location__, __func__));
        rdma_read->send_wr.wr.rdma.rkey = 1;
        rdma_read->send_wr.wr.rdma.remote_addr = 1;
 
-       neg_send = smb_direct_io_create(c);
-       if (tevent_req_nomem(neg_send, req)) {
-               return tevent_req_post(req, ev);
-       }
-       SSVAL(neg_send->data, 0x00, 0x0100);
-       SSVAL(neg_send->data, 0x02, 0x0100);
-       SSVAL(neg_send->data, 0x04, 0x0000);
-       SSVAL(neg_send->data, 0x06, c->state.send_credit_target);
-       SIVAL(neg_send->data, 0x08, c->state.max_send_size);
-       SIVAL(neg_send->data, 0x0C, c->state.max_receive_size);
-       SIVAL(neg_send->data, 0x10, c->state.max_fragmented_size);
-       neg_send->sge[0].addr = (uint64_t) (uintptr_t) neg_send->data;
-       neg_send->sge[0].length = 0x14;
-       neg_send->sge[0].lkey = neg_send->data_mr->lkey;
-       neg_send->send_wr.opcode = IBV_WR_SEND;
-       neg_send->send_wr.send_flags = IBV_SEND_SIGNALED;
-       neg_send->send_wr.sg_list = neg_send->sge;
-       neg_send->send_wr.num_sge = 1;
-
-       errno = 0;
-       ret = ibv_post_recv(c->ibv.qp, &neg_recv->recv_wr, &bad_recv_wr);
-       if (ret != 0) {
-               status = map_nt_error_from_unix_common(errno);
-               DEBUG(0,("%s:%s: ret[%d] errno[%d] status[%s]\n",
-                       __location__, __FUNCTION__, ret, errno, nt_errstr(status)));
-               tevent_req_nterror(req, status);
-               return tevent_req_post(req, ev);
-       }
-
-       rdma_read->send_wr.next = &neg_send->send_wr;
        errno = 0;
        ret = ibv_post_send(c->ibv.qp, &rdma_read->send_wr, &bad_send_wr);
        if (ret != 0) {
@@ -1171,6 +1128,10 @@ static void smb_direct_connection_negotiate_connect_ibv_handler(struct tevent_co
        uint32_t max_fragmented_size;
        uint32_t tmp;
        struct smb_direct_io *io = NULL;
+       struct smb_direct_io *neg_send = NULL;
+       struct smb_direct_io *neg_recv = NULL;
+       struct ibv_recv_wr *bad_recv_wr = NULL;
+       struct ibv_send_wr *bad_send_wr = NULL;
 
        errno = 0;
        ret = ibv_get_cq_event(c->ibv.comp_channel,
@@ -1239,13 +1200,66 @@ static void smb_direct_connection_negotiate_connect_ibv_handler(struct tevent_co
                                   struct smb_direct_io);
 
        switch (wc.opcode) {
-       case IBV_WC_SEND:
-               DEBUG(0,("%s:%s: GOT SEND[%p] next[%p] ret[%d] errno[%d]\n",
+       case IBV_WC_RDMA_READ:
+               DEBUG(0,("%s:%s: GOT RDMA_READ[%p] next[%p] ret[%d] errno[%d]\n",
                        __location__, __FUNCTION__, io, io->send_wr.next, ret, errno));
                TALLOC_FREE(io);
+
+               neg_recv = smb_direct_io_create(c);
+               if (tevent_req_nomem(neg_recv, req)) {
+                       return;
+               }
+               neg_recv->sge[0].addr = (uint64_t) (uintptr_t) neg_recv->data;
+               neg_recv->sge[0].length = sizeof(neg_recv->data);
+               neg_recv->sge[0].lkey = neg_recv->data_mr->lkey;
+               neg_recv->recv_wr.sg_list = neg_recv->sge;
+               neg_recv->recv_wr.num_sge = 1;
+
+               neg_send = smb_direct_io_create(c);
+               if (tevent_req_nomem(neg_send, req)) {
+                       return;
+               }
+               SSVAL(neg_send->data, 0x00, 0x0100);
+               SSVAL(neg_send->data, 0x02, 0x0100);
+               SSVAL(neg_send->data, 0x04, 0x0000);
+               SSVAL(neg_send->data, 0x06, c->state.send_credit_target);
+               SIVAL(neg_send->data, 0x08, c->state.max_send_size);
+               SIVAL(neg_send->data, 0x0C, c->state.max_receive_size);
+               SIVAL(neg_send->data, 0x10, c->state.max_fragmented_size);
+               neg_send->sge[0].addr = (uint64_t) (uintptr_t) neg_send->data;
+               neg_send->sge[0].length = 0x14;
+               neg_send->sge[0].lkey = neg_send->data_mr->lkey;
+               neg_send->send_wr.opcode = IBV_WR_SEND;
+               neg_send->send_wr.send_flags = IBV_SEND_SIGNALED;
+               neg_send->send_wr.sg_list = neg_send->sge;
+               neg_send->send_wr.num_sge = 1;
+
+               errno = 0;
+               ret = ibv_post_recv(c->ibv.qp, &neg_recv->recv_wr, &bad_recv_wr);
+               if (ret != 0) {
+                       status = map_nt_error_from_unix_common(errno);
+                       DEBUG(0,("%s:%s: ret[%d] errno[%d] status[%s]\n",
+                               __location__, __FUNCTION__, ret, errno, nt_errstr(status)));
+                       tevent_req_nterror(req, status);
+                       return;
+               }
+
+               errno = 0;
+               ret = ibv_post_send(c->ibv.qp, &neg_send->send_wr, &bad_send_wr);
+               if (ret != 0) {
+                       status = map_nt_error_from_unix_common(errno);
+                       DEBUG(0,("%s:%s: ret[%d] errno[%d] status[%s]\n",
+                               __location__, __FUNCTION__, ret, errno, nt_errstr(status)));
+                       tevent_req_nterror(req, status);
+                       return;
+               }
+
+               DEBUG(0,("%s:%s: ret[%d] errno[%d]\n",
+                       __location__, __FUNCTION__, ret, errno));
                break;
-       case IBV_WC_RDMA_READ:
-               DEBUG(0,("%s:%s: GOT RDMA_READ[%p] next[%p] ret[%d] errno[%d]\n",
+
+       case IBV_WC_SEND:
+               DEBUG(0,("%s:%s: GOT SEND[%p] next[%p] ret[%d] errno[%d]\n",
                        __location__, __FUNCTION__, io, io->send_wr.next, ret, errno));
                TALLOC_FREE(io);
                break;