net/9p/trans_rdma.c:551: undefined reference to `rdma_disconnect'
From: kbuild test robot
Date: Fri May 25 2018 - 17:37:32 EST
tree: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git master
head: 62d18ecfa64137349fac9c5817784fbd48b54f48
commit: 9533b292a7acc62c294ebcbd9e1f9f9d52adb10b IB: remove redundant INFINIBAND kconfig dependencies
date: 2 weeks ago
config: x86_64-randconfig-x003-05251014 (attached as .config)
compiler: gcc-7 (Debian 7.3.0-16) 7.3.0
reproduce:
git checkout 9533b292a7acc62c294ebcbd9e1f9f9d52adb10b
# save the attached .config to linux build tree
make ARCH=x86_64
All errors (new ones prefixed by >>):
net/9p/trans_rdma.o: In function `rdma_request':
>> net/9p/trans_rdma.c:551: undefined reference to `rdma_disconnect'
net/9p/trans_rdma.o: In function `rdma_destroy_trans':
>> net/9p/trans_rdma.c:383: undefined reference to `ib_destroy_qp'
>> net/9p/trans_rdma.c:386: undefined reference to `ib_dealloc_pd'
>> net/9p/trans_rdma.c:389: undefined reference to `ib_free_cq'
>> net/9p/trans_rdma.c:392: undefined reference to `rdma_destroy_id'
net/9p/trans_rdma.o: In function `rdma_close':
net/9p/trans_rdma.c:569: undefined reference to `rdma_disconnect'
net/9p/trans_rdma.o: In function `p9_cm_event_handler':
net/9p/trans_rdma.c:298: undefined reference to `rdma_disconnect'
net/9p/trans_rdma.o: In function `rdma_create_trans':
>> net/9p/trans_rdma.c:660: undefined reference to `__rdma_create_id'
net/9p/trans_rdma.o: In function `p9_rdma_bind_privport':
>> net/9p/trans_rdma.c:627: undefined reference to `rdma_bind_addr'
net/9p/trans_rdma.o: In function `rdma_create_trans':
>> net/9p/trans_rdma.c:682: undefined reference to `rdma_resolve_addr'
>> net/9p/trans_rdma.c:692: undefined reference to `rdma_resolve_route'
>> net/9p/trans_rdma.c:700: undefined reference to `__ib_alloc_cq'
>> net/9p/trans_rdma.c:707: undefined reference to `__ib_alloc_pd'
>> net/9p/trans_rdma.c:723: undefined reference to `rdma_create_qp'
>> net/9p/trans_rdma.c:734: undefined reference to `rdma_connect'
vim +551 net/9p/trans_rdma.c
fc79d4b1 Tom Tucker 2008-10-22 376
fc79d4b1 Tom Tucker 2008-10-22 377 static void rdma_destroy_trans(struct p9_trans_rdma *rdma)
fc79d4b1 Tom Tucker 2008-10-22 378 {
fc79d4b1 Tom Tucker 2008-10-22 379 if (!rdma)
fc79d4b1 Tom Tucker 2008-10-22 380 return;
fc79d4b1 Tom Tucker 2008-10-22 381
fc79d4b1 Tom Tucker 2008-10-22 382 if (rdma->qp && !IS_ERR(rdma->qp))
fc79d4b1 Tom Tucker 2008-10-22 @383 ib_destroy_qp(rdma->qp);
fc79d4b1 Tom Tucker 2008-10-22 384
fc79d4b1 Tom Tucker 2008-10-22 385 if (rdma->pd && !IS_ERR(rdma->pd))
fc79d4b1 Tom Tucker 2008-10-22 @386 ib_dealloc_pd(rdma->pd);
fc79d4b1 Tom Tucker 2008-10-22 387
fc79d4b1 Tom Tucker 2008-10-22 388 if (rdma->cq && !IS_ERR(rdma->cq))
7cf20fc6 Christoph Hellwig 2016-03-03 @389 ib_free_cq(rdma->cq);
fc79d4b1 Tom Tucker 2008-10-22 390
fc79d4b1 Tom Tucker 2008-10-22 391 if (rdma->cm_id && !IS_ERR(rdma->cm_id))
fc79d4b1 Tom Tucker 2008-10-22 @392 rdma_destroy_id(rdma->cm_id);
fc79d4b1 Tom Tucker 2008-10-22 393
fc79d4b1 Tom Tucker 2008-10-22 394 kfree(rdma);
fc79d4b1 Tom Tucker 2008-10-22 395 }
fc79d4b1 Tom Tucker 2008-10-22 396
fc79d4b1 Tom Tucker 2008-10-22 397 static int
fc79d4b1 Tom Tucker 2008-10-22 398 post_recv(struct p9_client *client, struct p9_rdma_context *c)
fc79d4b1 Tom Tucker 2008-10-22 399 {
fc79d4b1 Tom Tucker 2008-10-22 400 struct p9_trans_rdma *rdma = client->trans;
fc79d4b1 Tom Tucker 2008-10-22 401 struct ib_recv_wr wr, *bad_wr;
fc79d4b1 Tom Tucker 2008-10-22 402 struct ib_sge sge;
fc79d4b1 Tom Tucker 2008-10-22 403
fc79d4b1 Tom Tucker 2008-10-22 404 c->busa = ib_dma_map_single(rdma->cm_id->device,
fc79d4b1 Tom Tucker 2008-10-22 405 c->rc->sdata, client->msize,
fc79d4b1 Tom Tucker 2008-10-22 406 DMA_FROM_DEVICE);
fc79d4b1 Tom Tucker 2008-10-22 407 if (ib_dma_mapping_error(rdma->cm_id->device, c->busa))
fc79d4b1 Tom Tucker 2008-10-22 408 goto error;
fc79d4b1 Tom Tucker 2008-10-22 409
7cf20fc6 Christoph Hellwig 2016-03-03 410 c->cqe.done = recv_done;
7cf20fc6 Christoph Hellwig 2016-03-03 411
fc79d4b1 Tom Tucker 2008-10-22 412 sge.addr = c->busa;
fc79d4b1 Tom Tucker 2008-10-22 413 sge.length = client->msize;
2f31fa88 Jason Gunthorpe 2015-07-30 414 sge.lkey = rdma->pd->local_dma_lkey;
fc79d4b1 Tom Tucker 2008-10-22 415
fc79d4b1 Tom Tucker 2008-10-22 416 wr.next = NULL;
7cf20fc6 Christoph Hellwig 2016-03-03 417 wr.wr_cqe = &c->cqe;
fc79d4b1 Tom Tucker 2008-10-22 418 wr.sg_list = &sge;
fc79d4b1 Tom Tucker 2008-10-22 419 wr.num_sge = 1;
fc79d4b1 Tom Tucker 2008-10-22 420 return ib_post_recv(rdma->qp, &wr, &bad_wr);
fc79d4b1 Tom Tucker 2008-10-22 421
fc79d4b1 Tom Tucker 2008-10-22 422 error:
5d385153 Joe Perches 2011-11-28 423 p9_debug(P9_DEBUG_ERROR, "EIO\n");
fc79d4b1 Tom Tucker 2008-10-22 424 return -EIO;
fc79d4b1 Tom Tucker 2008-10-22 425 }
fc79d4b1 Tom Tucker 2008-10-22 426
fc79d4b1 Tom Tucker 2008-10-22 427 static int rdma_request(struct p9_client *client, struct p9_req_t *req)
fc79d4b1 Tom Tucker 2008-10-22 428 {
fc79d4b1 Tom Tucker 2008-10-22 429 struct p9_trans_rdma *rdma = client->trans;
fc79d4b1 Tom Tucker 2008-10-22 430 struct ib_send_wr wr, *bad_wr;
fc79d4b1 Tom Tucker 2008-10-22 431 struct ib_sge sge;
fc79d4b1 Tom Tucker 2008-10-22 432 int err = 0;
fc79d4b1 Tom Tucker 2008-10-22 433 unsigned long flags;
fc79d4b1 Tom Tucker 2008-10-22 434 struct p9_rdma_context *c = NULL;
fc79d4b1 Tom Tucker 2008-10-22 435 struct p9_rdma_context *rpl_context = NULL;
fc79d4b1 Tom Tucker 2008-10-22 436
1cff3306 Simon Derr 2013-06-21 437 /* When an error occurs between posting the recv and the send,
1cff3306 Simon Derr 2013-06-21 438 * there will be a receive context posted without a pending request.
1cff3306 Simon Derr 2013-06-21 439 * Since there is no way to "un-post" it, we remember it and skip
1cff3306 Simon Derr 2013-06-21 440 * post_recv() for the next request.
1cff3306 Simon Derr 2013-06-21 441 * So here,
1cff3306 Simon Derr 2013-06-21 442 * see if we are this `next request' and need to absorb an excess rc.
1cff3306 Simon Derr 2013-06-21 443 * If yes, then drop and free our own, and do not recv_post().
1cff3306 Simon Derr 2013-06-21 444 **/
1cff3306 Simon Derr 2013-06-21 445 if (unlikely(atomic_read(&rdma->excess_rc) > 0)) {
1cff3306 Simon Derr 2013-06-21 446 if ((atomic_sub_return(1, &rdma->excess_rc) >= 0)) {
1cff3306 Simon Derr 2013-06-21 447 /* Got one ! */
1cff3306 Simon Derr 2013-06-21 448 kfree(req->rc);
1cff3306 Simon Derr 2013-06-21 449 req->rc = NULL;
1cff3306 Simon Derr 2013-06-21 450 goto dont_need_post_recv;
1cff3306 Simon Derr 2013-06-21 451 } else {
1cff3306 Simon Derr 2013-06-21 452 /* We raced and lost. */
1cff3306 Simon Derr 2013-06-21 453 atomic_inc(&rdma->excess_rc);
1cff3306 Simon Derr 2013-06-21 454 }
1cff3306 Simon Derr 2013-06-21 455 }
1cff3306 Simon Derr 2013-06-21 456
fc79d4b1 Tom Tucker 2008-10-22 457 /* Allocate an fcall for the reply */
eeff66ef Aneesh Kumar K.V 2011-03-08 458 rpl_context = kmalloc(sizeof *rpl_context, GFP_NOFS);
1d6400c7 Davidlohr Bueso 2010-09-13 459 if (!rpl_context) {
1d6400c7 Davidlohr Bueso 2010-09-13 460 err = -ENOMEM;
2f52d07c Simon Derr 2013-06-21 461 goto recv_error;
1d6400c7 Davidlohr Bueso 2010-09-13 462 }
fc79d4b1 Tom Tucker 2008-10-22 463 rpl_context->rc = req->rc;
fc79d4b1 Tom Tucker 2008-10-22 464
fc79d4b1 Tom Tucker 2008-10-22 465 /*
fc79d4b1 Tom Tucker 2008-10-22 466 * Post a receive buffer for this request. We need to ensure
fc79d4b1 Tom Tucker 2008-10-22 467 * there is a reply buffer available for every outstanding
fc79d4b1 Tom Tucker 2008-10-22 468 * request. A flushed request can result in no reply for an
fc79d4b1 Tom Tucker 2008-10-22 469 * outstanding request, so we must keep a count to avoid
fc79d4b1 Tom Tucker 2008-10-22 470 * overflowing the RQ.
fc79d4b1 Tom Tucker 2008-10-22 471 */
2f52d07c Simon Derr 2013-06-21 472 if (down_interruptible(&rdma->rq_sem)) {
2f52d07c Simon Derr 2013-06-21 473 err = -EINTR;
2f52d07c Simon Derr 2013-06-21 474 goto recv_error;
2f52d07c Simon Derr 2013-06-21 475 }
fd453d0e Simon Derr 2013-06-21 476
fc79d4b1 Tom Tucker 2008-10-22 477 err = post_recv(client, rpl_context);
fd453d0e Simon Derr 2013-06-21 478 if (err) {
fd453d0e Simon Derr 2013-06-21 479 p9_debug(P9_DEBUG_FCALL, "POST RECV failed\n");
2f52d07c Simon Derr 2013-06-21 480 goto recv_error;
fd453d0e Simon Derr 2013-06-21 481 }
fc79d4b1 Tom Tucker 2008-10-22 482 /* remove posted receive buffer from request structure */
fc79d4b1 Tom Tucker 2008-10-22 483 req->rc = NULL;
fc79d4b1 Tom Tucker 2008-10-22 484
1cff3306 Simon Derr 2013-06-21 485 dont_need_post_recv:
fc79d4b1 Tom Tucker 2008-10-22 486 /* Post the request */
eeff66ef Aneesh Kumar K.V 2011-03-08 487 c = kmalloc(sizeof *c, GFP_NOFS);
1d6400c7 Davidlohr Bueso 2010-09-13 488 if (!c) {
1d6400c7 Davidlohr Bueso 2010-09-13 489 err = -ENOMEM;
2f52d07c Simon Derr 2013-06-21 490 goto send_error;
1d6400c7 Davidlohr Bueso 2010-09-13 491 }
fc79d4b1 Tom Tucker 2008-10-22 492 c->req = req;
fc79d4b1 Tom Tucker 2008-10-22 493
fc79d4b1 Tom Tucker 2008-10-22 494 c->busa = ib_dma_map_single(rdma->cm_id->device,
fc79d4b1 Tom Tucker 2008-10-22 495 c->req->tc->sdata, c->req->tc->size,
fc79d4b1 Tom Tucker 2008-10-22 496 DMA_TO_DEVICE);
2f52d07c Simon Derr 2013-06-21 497 if (ib_dma_mapping_error(rdma->cm_id->device, c->busa)) {
2f52d07c Simon Derr 2013-06-21 498 err = -EIO;
2f52d07c Simon Derr 2013-06-21 499 goto send_error;
2f52d07c Simon Derr 2013-06-21 500 }
fc79d4b1 Tom Tucker 2008-10-22 501
7cf20fc6 Christoph Hellwig 2016-03-03 502 c->cqe.done = send_done;
7cf20fc6 Christoph Hellwig 2016-03-03 503
fc79d4b1 Tom Tucker 2008-10-22 504 sge.addr = c->busa;
fc79d4b1 Tom Tucker 2008-10-22 505 sge.length = c->req->tc->size;
2f31fa88 Jason Gunthorpe 2015-07-30 506 sge.lkey = rdma->pd->local_dma_lkey;
fc79d4b1 Tom Tucker 2008-10-22 507
fc79d4b1 Tom Tucker 2008-10-22 508 wr.next = NULL;
7cf20fc6 Christoph Hellwig 2016-03-03 509 wr.wr_cqe = &c->cqe;
fc79d4b1 Tom Tucker 2008-10-22 510 wr.opcode = IB_WR_SEND;
fc79d4b1 Tom Tucker 2008-10-22 511 wr.send_flags = IB_SEND_SIGNALED;
fc79d4b1 Tom Tucker 2008-10-22 512 wr.sg_list = &sge;
fc79d4b1 Tom Tucker 2008-10-22 513 wr.num_sge = 1;
fc79d4b1 Tom Tucker 2008-10-22 514
2f52d07c Simon Derr 2013-06-21 515 if (down_interruptible(&rdma->sq_sem)) {
2f52d07c Simon Derr 2013-06-21 516 err = -EINTR;
2f52d07c Simon Derr 2013-06-21 517 goto send_error;
2f52d07c Simon Derr 2013-06-21 518 }
2f52d07c Simon Derr 2013-06-21 519
3f9d5b8d Simon Derr 2014-03-10 520 /* Mark request as `sent' *before* we actually send it,
3f9d5b8d Simon Derr 2014-03-10 521 * because doing if after could erase the REQ_STATUS_RCVD
3f9d5b8d Simon Derr 2014-03-10 522 * status in case of a very fast reply.
3f9d5b8d Simon Derr 2014-03-10 523 */
3f9d5b8d Simon Derr 2014-03-10 524 req->status = REQ_STATUS_SENT;
2f52d07c Simon Derr 2013-06-21 525 err = ib_post_send(rdma->qp, &wr, &bad_wr);
2f52d07c Simon Derr 2013-06-21 526 if (err)
2f52d07c Simon Derr 2013-06-21 527 goto send_error;
fc79d4b1 Tom Tucker 2008-10-22 528
2f52d07c Simon Derr 2013-06-21 529 /* Success */
2f52d07c Simon Derr 2013-06-21 530 return 0;
fc79d4b1 Tom Tucker 2008-10-22 531
2f52d07c Simon Derr 2013-06-21 532 /* Handle errors that happened during or while preparing the send: */
2f52d07c Simon Derr 2013-06-21 533 send_error:
3f9d5b8d Simon Derr 2014-03-10 534 req->status = REQ_STATUS_ERROR;
1d6400c7 Davidlohr Bueso 2010-09-13 535 kfree(c);
2f52d07c Simon Derr 2013-06-21 536 p9_debug(P9_DEBUG_ERROR, "Error %d in rdma_request()\n", err);
1cff3306 Simon Derr 2013-06-21 537
1cff3306 Simon Derr 2013-06-21 538 /* Ach.
1cff3306 Simon Derr 2013-06-21 539 * We did recv_post(), but not send. We have one recv_post in excess.
1cff3306 Simon Derr 2013-06-21 540 */
1cff3306 Simon Derr 2013-06-21 541 atomic_inc(&rdma->excess_rc);
2f52d07c Simon Derr 2013-06-21 542 return err;
2f52d07c Simon Derr 2013-06-21 543
2f52d07c Simon Derr 2013-06-21 544 /* Handle errors that happened during or while preparing post_recv(): */
2f52d07c Simon Derr 2013-06-21 545 recv_error:
1d6400c7 Davidlohr Bueso 2010-09-13 546 kfree(rpl_context);
fc79d4b1 Tom Tucker 2008-10-22 547 spin_lock_irqsave(&rdma->req_lock, flags);
fc79d4b1 Tom Tucker 2008-10-22 548 if (rdma->state < P9_RDMA_CLOSING) {
fc79d4b1 Tom Tucker 2008-10-22 549 rdma->state = P9_RDMA_CLOSING;
fc79d4b1 Tom Tucker 2008-10-22 550 spin_unlock_irqrestore(&rdma->req_lock, flags);
fc79d4b1 Tom Tucker 2008-10-22 @551 rdma_disconnect(rdma->cm_id);
fc79d4b1 Tom Tucker 2008-10-22 552 } else
fc79d4b1 Tom Tucker 2008-10-22 553 spin_unlock_irqrestore(&rdma->req_lock, flags);
fc79d4b1 Tom Tucker 2008-10-22 554 return err;
fc79d4b1 Tom Tucker 2008-10-22 555 }
fc79d4b1 Tom Tucker 2008-10-22 556
fc79d4b1 Tom Tucker 2008-10-22 557 static void rdma_close(struct p9_client *client)
fc79d4b1 Tom Tucker 2008-10-22 558 {
fc79d4b1 Tom Tucker 2008-10-22 559 struct p9_trans_rdma *rdma;
fc79d4b1 Tom Tucker 2008-10-22 560
fc79d4b1 Tom Tucker 2008-10-22 561 if (!client)
fc79d4b1 Tom Tucker 2008-10-22 562 return;
fc79d4b1 Tom Tucker 2008-10-22 563
fc79d4b1 Tom Tucker 2008-10-22 564 rdma = client->trans;
fc79d4b1 Tom Tucker 2008-10-22 565 if (!rdma)
fc79d4b1 Tom Tucker 2008-10-22 566 return;
fc79d4b1 Tom Tucker 2008-10-22 567
fc79d4b1 Tom Tucker 2008-10-22 568 client->status = Disconnected;
fc79d4b1 Tom Tucker 2008-10-22 @569 rdma_disconnect(rdma->cm_id);
fc79d4b1 Tom Tucker 2008-10-22 570 rdma_destroy_trans(rdma);
fc79d4b1 Tom Tucker 2008-10-22 571 }
fc79d4b1 Tom Tucker 2008-10-22 572
fc79d4b1 Tom Tucker 2008-10-22 573 /**
fc79d4b1 Tom Tucker 2008-10-22 574 * alloc_rdma - Allocate and initialize the rdma transport structure
fc79d4b1 Tom Tucker 2008-10-22 575 * @opts: Mount options structure
fc79d4b1 Tom Tucker 2008-10-22 576 */
fc79d4b1 Tom Tucker 2008-10-22 577 static struct p9_trans_rdma *alloc_rdma(struct p9_rdma_opts *opts)
fc79d4b1 Tom Tucker 2008-10-22 578 {
fc79d4b1 Tom Tucker 2008-10-22 579 struct p9_trans_rdma *rdma;
fc79d4b1 Tom Tucker 2008-10-22 580
fc79d4b1 Tom Tucker 2008-10-22 581 rdma = kzalloc(sizeof(struct p9_trans_rdma), GFP_KERNEL);
fc79d4b1 Tom Tucker 2008-10-22 582 if (!rdma)
fc79d4b1 Tom Tucker 2008-10-22 583 return NULL;
fc79d4b1 Tom Tucker 2008-10-22 584
c4fac910 David Howells 2017-07-05 585 rdma->port = opts->port;
c4fac910 David Howells 2017-07-05 586 rdma->privport = opts->privport;
fc79d4b1 Tom Tucker 2008-10-22 587 rdma->sq_depth = opts->sq_depth;
fc79d4b1 Tom Tucker 2008-10-22 588 rdma->rq_depth = opts->rq_depth;
fc79d4b1 Tom Tucker 2008-10-22 589 rdma->timeout = opts->timeout;
fc79d4b1 Tom Tucker 2008-10-22 590 spin_lock_init(&rdma->req_lock);
fc79d4b1 Tom Tucker 2008-10-22 591 init_completion(&rdma->cm_done);
fc79d4b1 Tom Tucker 2008-10-22 592 sema_init(&rdma->sq_sem, rdma->sq_depth);
fd453d0e Simon Derr 2013-06-21 593 sema_init(&rdma->rq_sem, rdma->rq_depth);
1cff3306 Simon Derr 2013-06-21 594 atomic_set(&rdma->excess_rc, 0);
fc79d4b1 Tom Tucker 2008-10-22 595
fc79d4b1 Tom Tucker 2008-10-22 596 return rdma;
fc79d4b1 Tom Tucker 2008-10-22 597 }
fc79d4b1 Tom Tucker 2008-10-22 598
fc79d4b1 Tom Tucker 2008-10-22 599 static int rdma_cancel(struct p9_client *client, struct p9_req_t *req)
fc79d4b1 Tom Tucker 2008-10-22 600 {
931700d2 Simon Derr 2014-03-10 601 /* Nothing to do here.
931700d2 Simon Derr 2014-03-10 602 * We will take care of it (if we have to) in rdma_cancelled()
931700d2 Simon Derr 2014-03-10 603 */
fc79d4b1 Tom Tucker 2008-10-22 604 return 1;
fc79d4b1 Tom Tucker 2008-10-22 605 }
fc79d4b1 Tom Tucker 2008-10-22 606
931700d2 Simon Derr 2014-03-10 607 /* A request has been fully flushed without a reply.
931700d2 Simon Derr 2014-03-10 608 * That means we have posted one buffer in excess.
931700d2 Simon Derr 2014-03-10 609 */
931700d2 Simon Derr 2014-03-10 610 static int rdma_cancelled(struct p9_client *client, struct p9_req_t *req)
931700d2 Simon Derr 2014-03-10 611 {
931700d2 Simon Derr 2014-03-10 612 struct p9_trans_rdma *rdma = client->trans;
931700d2 Simon Derr 2014-03-10 613 atomic_inc(&rdma->excess_rc);
931700d2 Simon Derr 2014-03-10 614 return 0;
931700d2 Simon Derr 2014-03-10 615 }
931700d2 Simon Derr 2014-03-10 616
f569d3ef Dominique Martinet 2015-01-09 617 static int p9_rdma_bind_privport(struct p9_trans_rdma *rdma)
f569d3ef Dominique Martinet 2015-01-09 618 {
f569d3ef Dominique Martinet 2015-01-09 619 struct sockaddr_in cl = {
f569d3ef Dominique Martinet 2015-01-09 620 .sin_family = AF_INET,
f569d3ef Dominique Martinet 2015-01-09 621 .sin_addr.s_addr = htonl(INADDR_ANY),
f569d3ef Dominique Martinet 2015-01-09 622 };
f569d3ef Dominique Martinet 2015-01-09 623 int port, err = -EINVAL;
f569d3ef Dominique Martinet 2015-01-09 624
f569d3ef Dominique Martinet 2015-01-09 625 for (port = P9_DEF_MAX_RESVPORT; port >= P9_DEF_MIN_RESVPORT; port--) {
f569d3ef Dominique Martinet 2015-01-09 626 cl.sin_port = htons((ushort)port);
f569d3ef Dominique Martinet 2015-01-09 @627 err = rdma_bind_addr(rdma->cm_id, (struct sockaddr *)&cl);
f569d3ef Dominique Martinet 2015-01-09 628 if (err != -EADDRINUSE)
f569d3ef Dominique Martinet 2015-01-09 629 break;
f569d3ef Dominique Martinet 2015-01-09 630 }
f569d3ef Dominique Martinet 2015-01-09 631 return err;
f569d3ef Dominique Martinet 2015-01-09 632 }
f569d3ef Dominique Martinet 2015-01-09 633
fc79d4b1 Tom Tucker 2008-10-22 634 /**
fc79d4b1 Tom Tucker 2008-10-22 635 * trans_create_rdma - Transport method for creating atransport instance
fc79d4b1 Tom Tucker 2008-10-22 636 * @client: client instance
fc79d4b1 Tom Tucker 2008-10-22 637 * @addr: IP address string
fc79d4b1 Tom Tucker 2008-10-22 638 * @args: Mount options string
fc79d4b1 Tom Tucker 2008-10-22 639 */
fc79d4b1 Tom Tucker 2008-10-22 640 static int
fc79d4b1 Tom Tucker 2008-10-22 641 rdma_create_trans(struct p9_client *client, const char *addr, char *args)
fc79d4b1 Tom Tucker 2008-10-22 642 {
fc79d4b1 Tom Tucker 2008-10-22 643 int err;
fc79d4b1 Tom Tucker 2008-10-22 644 struct p9_rdma_opts opts;
fc79d4b1 Tom Tucker 2008-10-22 645 struct p9_trans_rdma *rdma;
fc79d4b1 Tom Tucker 2008-10-22 646 struct rdma_conn_param conn_param;
fc79d4b1 Tom Tucker 2008-10-22 647 struct ib_qp_init_attr qp_attr;
fc79d4b1 Tom Tucker 2008-10-22 648
fc79d4b1 Tom Tucker 2008-10-22 649 /* Parse the transport specific mount options */
fc79d4b1 Tom Tucker 2008-10-22 650 err = parse_opts(args, &opts);
fc79d4b1 Tom Tucker 2008-10-22 651 if (err < 0)
fc79d4b1 Tom Tucker 2008-10-22 652 return err;
fc79d4b1 Tom Tucker 2008-10-22 653
fc79d4b1 Tom Tucker 2008-10-22 654 /* Create and initialize the RDMA transport structure */
fc79d4b1 Tom Tucker 2008-10-22 655 rdma = alloc_rdma(&opts);
fc79d4b1 Tom Tucker 2008-10-22 656 if (!rdma)
fc79d4b1 Tom Tucker 2008-10-22 657 return -ENOMEM;
fc79d4b1 Tom Tucker 2008-10-22 658
fc79d4b1 Tom Tucker 2008-10-22 659 /* Create the RDMA CM ID */
fa20105e Guy Shapiro 2015-10-22 @660 rdma->cm_id = rdma_create_id(&init_net, p9_cm_event_handler, client,
fa20105e Guy Shapiro 2015-10-22 661 RDMA_PS_TCP, IB_QPT_RC);
fc79d4b1 Tom Tucker 2008-10-22 662 if (IS_ERR(rdma->cm_id))
fc79d4b1 Tom Tucker 2008-10-22 663 goto error;
fc79d4b1 Tom Tucker 2008-10-22 664
517ac45a Tom Tucker 2008-10-23 665 /* Associate the client with the transport */
517ac45a Tom Tucker 2008-10-23 666 client->trans = rdma;
517ac45a Tom Tucker 2008-10-23 667
f569d3ef Dominique Martinet 2015-01-09 668 /* Bind to a privileged port if we need to */
f569d3ef Dominique Martinet 2015-01-09 669 if (opts.privport) {
f569d3ef Dominique Martinet 2015-01-09 670 err = p9_rdma_bind_privport(rdma);
f569d3ef Dominique Martinet 2015-01-09 671 if (err < 0) {
f569d3ef Dominique Martinet 2015-01-09 672 pr_err("%s (%d): problem binding to privport: %d\n",
f569d3ef Dominique Martinet 2015-01-09 673 __func__, task_pid_nr(current), -err);
f569d3ef Dominique Martinet 2015-01-09 674 goto error;
f569d3ef Dominique Martinet 2015-01-09 675 }
f569d3ef Dominique Martinet 2015-01-09 676 }
f569d3ef Dominique Martinet 2015-01-09 677
fc79d4b1 Tom Tucker 2008-10-22 678 /* Resolve the server's address */
fc79d4b1 Tom Tucker 2008-10-22 679 rdma->addr.sin_family = AF_INET;
fc79d4b1 Tom Tucker 2008-10-22 680 rdma->addr.sin_addr.s_addr = in_aton(addr);
fc79d4b1 Tom Tucker 2008-10-22 681 rdma->addr.sin_port = htons(opts.port);
fc79d4b1 Tom Tucker 2008-10-22 @682 err = rdma_resolve_addr(rdma->cm_id, NULL,
fc79d4b1 Tom Tucker 2008-10-22 683 (struct sockaddr *)&rdma->addr,
fc79d4b1 Tom Tucker 2008-10-22 684 rdma->timeout);
fc79d4b1 Tom Tucker 2008-10-22 685 if (err)
fc79d4b1 Tom Tucker 2008-10-22 686 goto error;
fc79d4b1 Tom Tucker 2008-10-22 687 err = wait_for_completion_interruptible(&rdma->cm_done);
fc79d4b1 Tom Tucker 2008-10-22 688 if (err || (rdma->state != P9_RDMA_ADDR_RESOLVED))
fc79d4b1 Tom Tucker 2008-10-22 689 goto error;
fc79d4b1 Tom Tucker 2008-10-22 690
fc79d4b1 Tom Tucker 2008-10-22 691 /* Resolve the route to the server */
fc79d4b1 Tom Tucker 2008-10-22 @692 err = rdma_resolve_route(rdma->cm_id, rdma->timeout);
fc79d4b1 Tom Tucker 2008-10-22 693 if (err)
fc79d4b1 Tom Tucker 2008-10-22 694 goto error;
fc79d4b1 Tom Tucker 2008-10-22 695 err = wait_for_completion_interruptible(&rdma->cm_done);
fc79d4b1 Tom Tucker 2008-10-22 696 if (err || (rdma->state != P9_RDMA_ROUTE_RESOLVED))
fc79d4b1 Tom Tucker 2008-10-22 697 goto error;
fc79d4b1 Tom Tucker 2008-10-22 698
fc79d4b1 Tom Tucker 2008-10-22 699 /* Create the Completion Queue */
7cf20fc6 Christoph Hellwig 2016-03-03 @700 rdma->cq = ib_alloc_cq(rdma->cm_id->device, client,
7cf20fc6 Christoph Hellwig 2016-03-03 701 opts.sq_depth + opts.rq_depth + 1,
7cf20fc6 Christoph Hellwig 2016-03-03 702 0, IB_POLL_SOFTIRQ);
fc79d4b1 Tom Tucker 2008-10-22 703 if (IS_ERR(rdma->cq))
fc79d4b1 Tom Tucker 2008-10-22 704 goto error;
fc79d4b1 Tom Tucker 2008-10-22 705
fc79d4b1 Tom Tucker 2008-10-22 706 /* Create the Protection Domain */
ed082d36 Christoph Hellwig 2016-09-05 @707 rdma->pd = ib_alloc_pd(rdma->cm_id->device, 0);
fc79d4b1 Tom Tucker 2008-10-22 708 if (IS_ERR(rdma->pd))
fc79d4b1 Tom Tucker 2008-10-22 709 goto error;
fc79d4b1 Tom Tucker 2008-10-22 710
fc79d4b1 Tom Tucker 2008-10-22 711 /* Create the Queue Pair */
fc79d4b1 Tom Tucker 2008-10-22 712 memset(&qp_attr, 0, sizeof qp_attr);
fc79d4b1 Tom Tucker 2008-10-22 713 qp_attr.event_handler = qp_event_handler;
fc79d4b1 Tom Tucker 2008-10-22 714 qp_attr.qp_context = client;
fc79d4b1 Tom Tucker 2008-10-22 715 qp_attr.cap.max_send_wr = opts.sq_depth;
fc79d4b1 Tom Tucker 2008-10-22 716 qp_attr.cap.max_recv_wr = opts.rq_depth;
fc79d4b1 Tom Tucker 2008-10-22 717 qp_attr.cap.max_send_sge = P9_RDMA_SEND_SGE;
fc79d4b1 Tom Tucker 2008-10-22 718 qp_attr.cap.max_recv_sge = P9_RDMA_RECV_SGE;
fc79d4b1 Tom Tucker 2008-10-22 719 qp_attr.sq_sig_type = IB_SIGNAL_REQ_WR;
fc79d4b1 Tom Tucker 2008-10-22 720 qp_attr.qp_type = IB_QPT_RC;
fc79d4b1 Tom Tucker 2008-10-22 721 qp_attr.send_cq = rdma->cq;
fc79d4b1 Tom Tucker 2008-10-22 722 qp_attr.recv_cq = rdma->cq;
fc79d4b1 Tom Tucker 2008-10-22 @723 err = rdma_create_qp(rdma->cm_id, rdma->pd, &qp_attr);
fc79d4b1 Tom Tucker 2008-10-22 724 if (err)
fc79d4b1 Tom Tucker 2008-10-22 725 goto error;
fc79d4b1 Tom Tucker 2008-10-22 726 rdma->qp = rdma->cm_id->qp;
fc79d4b1 Tom Tucker 2008-10-22 727
fc79d4b1 Tom Tucker 2008-10-22 728 /* Request a connection */
fc79d4b1 Tom Tucker 2008-10-22 729 memset(&conn_param, 0, sizeof(conn_param));
fc79d4b1 Tom Tucker 2008-10-22 730 conn_param.private_data = NULL;
fc79d4b1 Tom Tucker 2008-10-22 731 conn_param.private_data_len = 0;
fc79d4b1 Tom Tucker 2008-10-22 732 conn_param.responder_resources = P9_RDMA_IRD;
fc79d4b1 Tom Tucker 2008-10-22 733 conn_param.initiator_depth = P9_RDMA_ORD;
fc79d4b1 Tom Tucker 2008-10-22 @734 err = rdma_connect(rdma->cm_id, &conn_param);
fc79d4b1 Tom Tucker 2008-10-22 735 if (err)
fc79d4b1 Tom Tucker 2008-10-22 736 goto error;
fc79d4b1 Tom Tucker 2008-10-22 737 err = wait_for_completion_interruptible(&rdma->cm_done);
fc79d4b1 Tom Tucker 2008-10-22 738 if (err || (rdma->state != P9_RDMA_CONNECTED))
fc79d4b1 Tom Tucker 2008-10-22 739 goto error;
fc79d4b1 Tom Tucker 2008-10-22 740
fc79d4b1 Tom Tucker 2008-10-22 741 client->status = Connected;
fc79d4b1 Tom Tucker 2008-10-22 742
fc79d4b1 Tom Tucker 2008-10-22 743 return 0;
fc79d4b1 Tom Tucker 2008-10-22 744
fc79d4b1 Tom Tucker 2008-10-22 745 error:
fc79d4b1 Tom Tucker 2008-10-22 746 rdma_destroy_trans(rdma);
fc79d4b1 Tom Tucker 2008-10-22 747 return -ENOTCONN;
fc79d4b1 Tom Tucker 2008-10-22 748 }
fc79d4b1 Tom Tucker 2008-10-22 749
:::::: The code at line 551 was first introduced by commit
:::::: fc79d4b104f0eb8c2a7242150eaf8756ced4c344 9p: rdma: RDMA Transport Support for 9P
:::::: TO: Tom Tucker <tom@xxxxxxxxxxxxxxxxxxxxx>
:::::: CC: Eric Van Hensbergen <ericvh@opteron.(none)>
---
0-DAY kernel test infrastructure Open Source Technology Center
https://lists.01.org/pipermail/kbuild-all Intel Corporation
Attachment:
.config.gz
Description: application/gzip