Lines Matching refs:rdma
35 #include <rdma/ib_verbs.h>
36 #include <rdma/rdma_cm.h>
153 struct p9_trans_rdma *rdma = clnt->trans;
155 if (rdma->port != P9_PORT)
156 seq_printf(m, ",port=%u", rdma->port);
157 if (rdma->sq_depth != P9_RDMA_SQ_DEPTH)
158 seq_printf(m, ",sq=%u", rdma->sq_depth);
159 if (rdma->rq_depth != P9_RDMA_RQ_DEPTH)
160 seq_printf(m, ",rq=%u", rdma->rq_depth);
161 if (rdma->timeout != P9_RDMA_TIMEOUT)
162 seq_printf(m, ",timeout=%lu", rdma->timeout);
163 if (rdma->privport)
169 * parse_opts - parse mount options into rdma options structure
171 * @opts: rdma transport-specific structure to parse options into
243 struct p9_trans_rdma *rdma = c->trans;
246 BUG_ON(rdma->state != P9_RDMA_INIT);
247 rdma->state = P9_RDMA_ADDR_RESOLVED;
251 BUG_ON(rdma->state != P9_RDMA_ADDR_RESOLVED);
252 rdma->state = P9_RDMA_ROUTE_RESOLVED;
256 BUG_ON(rdma->state != P9_RDMA_ROUTE_RESOLVED);
257 rdma->state = P9_RDMA_CONNECTED;
261 if (rdma)
262 rdma->state = P9_RDMA_CLOSED;
281 rdma_disconnect(rdma->cm_id);
286 complete(&rdma->cm_done);
294 struct p9_trans_rdma *rdma = client->trans;
302 ib_dma_unmap_single(rdma->cm_id->device, c->busa, client->msize,
329 up(&rdma->rq_sem);
336 rdma->state = P9_RDMA_FLUSHING;
345 struct p9_trans_rdma *rdma = client->trans;
349 ib_dma_unmap_single(rdma->cm_id->device,
352 up(&rdma->sq_sem);
363 static void rdma_destroy_trans(struct p9_trans_rdma *rdma)
365 if (!rdma)
368 if (rdma->qp && !IS_ERR(rdma->qp))
369 ib_destroy_qp(rdma->qp);
371 if (rdma->pd && !IS_ERR(rdma->pd))
372 ib_dealloc_pd(rdma->pd);
374 if (rdma->cq && !IS_ERR(rdma->cq))
375 ib_free_cq(rdma->cq);
377 if (rdma->cm_id && !IS_ERR(rdma->cm_id))
378 rdma_destroy_id(rdma->cm_id);
380 kfree(rdma);
386 struct p9_trans_rdma *rdma = client->trans;
391 c->busa = ib_dma_map_single(rdma->cm_id->device,
394 if (ib_dma_mapping_error(rdma->cm_id->device, c->busa))
401 sge.lkey = rdma->pd->local_dma_lkey;
408 ret = ib_post_recv(rdma->qp, &wr, NULL);
410 ib_dma_unmap_single(rdma->cm_id->device, c->busa,
421 struct p9_trans_rdma *rdma = client->trans;
437 if (unlikely(atomic_read(&rdma->excess_rc) > 0)) {
438 if ((atomic_sub_return(1, &rdma->excess_rc) >= 0)) {
445 atomic_inc(&rdma->excess_rc);
464 if (down_interruptible(&rdma->rq_sem)) {
486 c->busa = ib_dma_map_single(rdma->cm_id->device,
489 if (ib_dma_mapping_error(rdma->cm_id->device, c->busa)) {
498 sge.lkey = rdma->pd->local_dma_lkey;
507 if (down_interruptible(&rdma->sq_sem)) {
517 err = ib_post_send(rdma->qp, &wr, NULL);
525 ib_dma_unmap_single(rdma->cm_id->device, c->busa,
536 atomic_inc(&rdma->excess_rc);
542 spin_lock_irqsave(&rdma->req_lock, flags);
543 if (err != -EINTR && rdma->state < P9_RDMA_CLOSING) {
544 rdma->state = P9_RDMA_CLOSING;
545 spin_unlock_irqrestore(&rdma->req_lock, flags);
546 rdma_disconnect(rdma->cm_id);
548 spin_unlock_irqrestore(&rdma->req_lock, flags);
554 struct p9_trans_rdma *rdma;
559 rdma = client->trans;
560 if (!rdma)
564 rdma_disconnect(rdma->cm_id);
565 rdma_destroy_trans(rdma);
569 * alloc_rdma - Allocate and initialize the rdma transport structure
574 struct p9_trans_rdma *rdma;
576 rdma = kzalloc(sizeof(struct p9_trans_rdma), GFP_KERNEL);
577 if (!rdma)
580 rdma->port = opts->port;
581 rdma->privport = opts->privport;
582 rdma->sq_depth = opts->sq_depth;
583 rdma->rq_depth = opts->rq_depth;
584 rdma->timeout = opts->timeout;
585 spin_lock_init(&rdma->req_lock);
586 init_completion(&rdma->cm_done);
587 sema_init(&rdma->sq_sem, rdma->sq_depth);
588 sema_init(&rdma->rq_sem, rdma->rq_depth);
589 atomic_set(&rdma->excess_rc, 0);
591 return rdma;
607 struct p9_trans_rdma *rdma = client->trans;
608 atomic_inc(&rdma->excess_rc);
612 static int p9_rdma_bind_privport(struct p9_trans_rdma *rdma)
622 err = rdma_bind_addr(rdma->cm_id, (struct sockaddr *)&cl);
640 struct p9_trans_rdma *rdma;
653 rdma = alloc_rdma(&opts);
654 if (!rdma)
658 rdma->cm_id = rdma_create_id(&init_net, p9_cm_event_handler, client,
660 if (IS_ERR(rdma->cm_id))
664 client->trans = rdma;
668 err = p9_rdma_bind_privport(rdma);
677 rdma->addr.sin_family = AF_INET;
678 rdma->addr.sin_addr.s_addr = in_aton(addr);
679 rdma->addr.sin_port = htons(opts.port);
680 err = rdma_resolve_addr(rdma->cm_id, NULL,
681 (struct sockaddr *)&rdma->addr,
682 rdma->timeout);
685 err = wait_for_completion_interruptible(&rdma->cm_done);
686 if (err || (rdma->state != P9_RDMA_ADDR_RESOLVED))
690 err = rdma_resolve_route(rdma->cm_id, rdma->timeout);
693 err = wait_for_completion_interruptible(&rdma->cm_done);
694 if (err || (rdma->state != P9_RDMA_ROUTE_RESOLVED))
698 rdma->cq = ib_alloc_cq_any(rdma->cm_id->device, client,
701 if (IS_ERR(rdma->cq))
705 rdma->pd = ib_alloc_pd(rdma->cm_id->device, 0);
706 if (IS_ERR(rdma->pd))
719 qp_attr.send_cq = rdma->cq;
720 qp_attr.recv_cq = rdma->cq;
721 err = rdma_create_qp(rdma->cm_id, rdma->pd, &qp_attr);
724 rdma->qp = rdma->cm_id->qp;
732 err = rdma_connect(rdma->cm_id, &conn_param);
735 err = wait_for_completion_interruptible(&rdma->cm_done);
736 if (err || (rdma->state != P9_RDMA_CONNECTED))
744 rdma_destroy_trans(rdma);
749 .name = "rdma",