aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/infiniband/core/verbs.c150
-rw-r--r--include/rdma/ib_verbs.h9
2 files changed, 138 insertions, 21 deletions
diff --git a/drivers/infiniband/core/verbs.c b/drivers/infiniband/core/verbs.c
index 25c1c1ea4460..89277e5129be 100644
--- a/drivers/infiniband/core/verbs.c
+++ b/drivers/infiniband/core/verbs.c
@@ -320,24 +320,44 @@ struct ib_qp *ib_create_qp(struct ib_pd *pd,
320 struct ib_qp_init_attr *qp_init_attr) 320 struct ib_qp_init_attr *qp_init_attr)
321{ 321{
322 struct ib_qp *qp; 322 struct ib_qp *qp;
323 struct ib_device *device;
323 324
324 qp = pd->device->create_qp(pd, qp_init_attr, NULL); 325 device = pd ? pd->device : qp_init_attr->xrcd->device;
326 qp = device->create_qp(pd, qp_init_attr, NULL);
325 327
326 if (!IS_ERR(qp)) { 328 if (!IS_ERR(qp)) {
327 qp->device = pd->device; 329 qp->device = device;
328 qp->pd = pd; 330
329 qp->send_cq = qp_init_attr->send_cq; 331 if (qp_init_attr->qp_type == IB_QPT_XRC_TGT) {
330 qp->recv_cq = qp_init_attr->recv_cq; 332 qp->pd = NULL;
331 qp->srq = qp_init_attr->srq; 333 qp->send_cq = qp->recv_cq = NULL;
334 qp->srq = NULL;
335 qp->xrcd = qp_init_attr->xrcd;
336 atomic_inc(&qp_init_attr->xrcd->usecnt);
337 } else {
338 if (qp_init_attr->qp_type == IB_QPT_XRC_INI) {
339 qp->recv_cq = NULL;
340 qp->srq = NULL;
341 } else {
342 qp->recv_cq = qp_init_attr->recv_cq;
343 atomic_inc(&qp_init_attr->recv_cq->usecnt);
344 qp->srq = qp_init_attr->srq;
345 if (qp->srq)
346 atomic_inc(&qp_init_attr->srq->usecnt);
347 }
348
349 qp->pd = pd;
350 qp->send_cq = qp_init_attr->send_cq;
351 qp->xrcd = NULL;
352
353 atomic_inc(&pd->usecnt);
354 atomic_inc(&qp_init_attr->send_cq->usecnt);
355 }
356
332 qp->uobject = NULL; 357 qp->uobject = NULL;
333 qp->event_handler = qp_init_attr->event_handler; 358 qp->event_handler = qp_init_attr->event_handler;
334 qp->qp_context = qp_init_attr->qp_context; 359 qp->qp_context = qp_init_attr->qp_context;
335 qp->qp_type = qp_init_attr->qp_type; 360 qp->qp_type = qp_init_attr->qp_type;
336 atomic_inc(&pd->usecnt);
337 atomic_inc(&qp_init_attr->send_cq->usecnt);
338 atomic_inc(&qp_init_attr->recv_cq->usecnt);
339 if (qp_init_attr->srq)
340 atomic_inc(&qp_init_attr->srq->usecnt);
341 } 361 }
342 362
343 return qp; 363 return qp;
@@ -346,8 +366,8 @@ EXPORT_SYMBOL(ib_create_qp);
346 366
347static const struct { 367static const struct {
348 int valid; 368 int valid;
349 enum ib_qp_attr_mask req_param[IB_QPT_RAW_ETHERTYPE + 1]; 369 enum ib_qp_attr_mask req_param[IB_QPT_MAX];
350 enum ib_qp_attr_mask opt_param[IB_QPT_RAW_ETHERTYPE + 1]; 370 enum ib_qp_attr_mask opt_param[IB_QPT_MAX];
351} qp_state_table[IB_QPS_ERR + 1][IB_QPS_ERR + 1] = { 371} qp_state_table[IB_QPS_ERR + 1][IB_QPS_ERR + 1] = {
352 [IB_QPS_RESET] = { 372 [IB_QPS_RESET] = {
353 [IB_QPS_RESET] = { .valid = 1 }, 373 [IB_QPS_RESET] = { .valid = 1 },
@@ -363,6 +383,12 @@ static const struct {
363 [IB_QPT_RC] = (IB_QP_PKEY_INDEX | 383 [IB_QPT_RC] = (IB_QP_PKEY_INDEX |
364 IB_QP_PORT | 384 IB_QP_PORT |
365 IB_QP_ACCESS_FLAGS), 385 IB_QP_ACCESS_FLAGS),
386 [IB_QPT_XRC_INI] = (IB_QP_PKEY_INDEX |
387 IB_QP_PORT |
388 IB_QP_ACCESS_FLAGS),
389 [IB_QPT_XRC_TGT] = (IB_QP_PKEY_INDEX |
390 IB_QP_PORT |
391 IB_QP_ACCESS_FLAGS),
366 [IB_QPT_SMI] = (IB_QP_PKEY_INDEX | 392 [IB_QPT_SMI] = (IB_QP_PKEY_INDEX |
367 IB_QP_QKEY), 393 IB_QP_QKEY),
368 [IB_QPT_GSI] = (IB_QP_PKEY_INDEX | 394 [IB_QPT_GSI] = (IB_QP_PKEY_INDEX |
@@ -385,6 +411,12 @@ static const struct {
385 [IB_QPT_RC] = (IB_QP_PKEY_INDEX | 411 [IB_QPT_RC] = (IB_QP_PKEY_INDEX |
386 IB_QP_PORT | 412 IB_QP_PORT |
387 IB_QP_ACCESS_FLAGS), 413 IB_QP_ACCESS_FLAGS),
414 [IB_QPT_XRC_INI] = (IB_QP_PKEY_INDEX |
415 IB_QP_PORT |
416 IB_QP_ACCESS_FLAGS),
417 [IB_QPT_XRC_TGT] = (IB_QP_PKEY_INDEX |
418 IB_QP_PORT |
419 IB_QP_ACCESS_FLAGS),
388 [IB_QPT_SMI] = (IB_QP_PKEY_INDEX | 420 [IB_QPT_SMI] = (IB_QP_PKEY_INDEX |
389 IB_QP_QKEY), 421 IB_QP_QKEY),
390 [IB_QPT_GSI] = (IB_QP_PKEY_INDEX | 422 [IB_QPT_GSI] = (IB_QP_PKEY_INDEX |
@@ -404,6 +436,16 @@ static const struct {
404 IB_QP_RQ_PSN | 436 IB_QP_RQ_PSN |
405 IB_QP_MAX_DEST_RD_ATOMIC | 437 IB_QP_MAX_DEST_RD_ATOMIC |
406 IB_QP_MIN_RNR_TIMER), 438 IB_QP_MIN_RNR_TIMER),
439 [IB_QPT_XRC_INI] = (IB_QP_AV |
440 IB_QP_PATH_MTU |
441 IB_QP_DEST_QPN |
442 IB_QP_RQ_PSN),
443 [IB_QPT_XRC_TGT] = (IB_QP_AV |
444 IB_QP_PATH_MTU |
445 IB_QP_DEST_QPN |
446 IB_QP_RQ_PSN |
447 IB_QP_MAX_DEST_RD_ATOMIC |
448 IB_QP_MIN_RNR_TIMER),
407 }, 449 },
408 .opt_param = { 450 .opt_param = {
409 [IB_QPT_UD] = (IB_QP_PKEY_INDEX | 451 [IB_QPT_UD] = (IB_QP_PKEY_INDEX |
@@ -414,6 +456,12 @@ static const struct {
414 [IB_QPT_RC] = (IB_QP_ALT_PATH | 456 [IB_QPT_RC] = (IB_QP_ALT_PATH |
415 IB_QP_ACCESS_FLAGS | 457 IB_QP_ACCESS_FLAGS |
416 IB_QP_PKEY_INDEX), 458 IB_QP_PKEY_INDEX),
459 [IB_QPT_XRC_INI] = (IB_QP_ALT_PATH |
460 IB_QP_ACCESS_FLAGS |
461 IB_QP_PKEY_INDEX),
462 [IB_QPT_XRC_TGT] = (IB_QP_ALT_PATH |
463 IB_QP_ACCESS_FLAGS |
464 IB_QP_PKEY_INDEX),
417 [IB_QPT_SMI] = (IB_QP_PKEY_INDEX | 465 [IB_QPT_SMI] = (IB_QP_PKEY_INDEX |
418 IB_QP_QKEY), 466 IB_QP_QKEY),
419 [IB_QPT_GSI] = (IB_QP_PKEY_INDEX | 467 [IB_QPT_GSI] = (IB_QP_PKEY_INDEX |
@@ -434,6 +482,13 @@ static const struct {
434 IB_QP_RNR_RETRY | 482 IB_QP_RNR_RETRY |
435 IB_QP_SQ_PSN | 483 IB_QP_SQ_PSN |
436 IB_QP_MAX_QP_RD_ATOMIC), 484 IB_QP_MAX_QP_RD_ATOMIC),
485 [IB_QPT_XRC_INI] = (IB_QP_TIMEOUT |
486 IB_QP_RETRY_CNT |
487 IB_QP_RNR_RETRY |
488 IB_QP_SQ_PSN |
489 IB_QP_MAX_QP_RD_ATOMIC),
490 [IB_QPT_XRC_TGT] = (IB_QP_TIMEOUT |
491 IB_QP_SQ_PSN),
437 [IB_QPT_SMI] = IB_QP_SQ_PSN, 492 [IB_QPT_SMI] = IB_QP_SQ_PSN,
438 [IB_QPT_GSI] = IB_QP_SQ_PSN, 493 [IB_QPT_GSI] = IB_QP_SQ_PSN,
439 }, 494 },
@@ -449,6 +504,15 @@ static const struct {
449 IB_QP_ACCESS_FLAGS | 504 IB_QP_ACCESS_FLAGS |
450 IB_QP_MIN_RNR_TIMER | 505 IB_QP_MIN_RNR_TIMER |
451 IB_QP_PATH_MIG_STATE), 506 IB_QP_PATH_MIG_STATE),
507 [IB_QPT_XRC_INI] = (IB_QP_CUR_STATE |
508 IB_QP_ALT_PATH |
509 IB_QP_ACCESS_FLAGS |
510 IB_QP_PATH_MIG_STATE),
511 [IB_QPT_XRC_TGT] = (IB_QP_CUR_STATE |
512 IB_QP_ALT_PATH |
513 IB_QP_ACCESS_FLAGS |
514 IB_QP_MIN_RNR_TIMER |
515 IB_QP_PATH_MIG_STATE),
452 [IB_QPT_SMI] = (IB_QP_CUR_STATE | 516 [IB_QPT_SMI] = (IB_QP_CUR_STATE |
453 IB_QP_QKEY), 517 IB_QP_QKEY),
454 [IB_QPT_GSI] = (IB_QP_CUR_STATE | 518 [IB_QPT_GSI] = (IB_QP_CUR_STATE |
@@ -473,6 +537,15 @@ static const struct {
473 IB_QP_ALT_PATH | 537 IB_QP_ALT_PATH |
474 IB_QP_PATH_MIG_STATE | 538 IB_QP_PATH_MIG_STATE |
475 IB_QP_MIN_RNR_TIMER), 539 IB_QP_MIN_RNR_TIMER),
540 [IB_QPT_XRC_INI] = (IB_QP_CUR_STATE |
541 IB_QP_ACCESS_FLAGS |
542 IB_QP_ALT_PATH |
543 IB_QP_PATH_MIG_STATE),
544 [IB_QPT_XRC_TGT] = (IB_QP_CUR_STATE |
545 IB_QP_ACCESS_FLAGS |
546 IB_QP_ALT_PATH |
547 IB_QP_PATH_MIG_STATE |
548 IB_QP_MIN_RNR_TIMER),
476 [IB_QPT_SMI] = (IB_QP_CUR_STATE | 549 [IB_QPT_SMI] = (IB_QP_CUR_STATE |
477 IB_QP_QKEY), 550 IB_QP_QKEY),
478 [IB_QPT_GSI] = (IB_QP_CUR_STATE | 551 [IB_QPT_GSI] = (IB_QP_CUR_STATE |
@@ -485,6 +558,8 @@ static const struct {
485 [IB_QPT_UD] = IB_QP_EN_SQD_ASYNC_NOTIFY, 558 [IB_QPT_UD] = IB_QP_EN_SQD_ASYNC_NOTIFY,
486 [IB_QPT_UC] = IB_QP_EN_SQD_ASYNC_NOTIFY, 559 [IB_QPT_UC] = IB_QP_EN_SQD_ASYNC_NOTIFY,
487 [IB_QPT_RC] = IB_QP_EN_SQD_ASYNC_NOTIFY, 560 [IB_QPT_RC] = IB_QP_EN_SQD_ASYNC_NOTIFY,
561 [IB_QPT_XRC_INI] = IB_QP_EN_SQD_ASYNC_NOTIFY,
562 [IB_QPT_XRC_TGT] = IB_QP_EN_SQD_ASYNC_NOTIFY, /* ??? */
488 [IB_QPT_SMI] = IB_QP_EN_SQD_ASYNC_NOTIFY, 563 [IB_QPT_SMI] = IB_QP_EN_SQD_ASYNC_NOTIFY,
489 [IB_QPT_GSI] = IB_QP_EN_SQD_ASYNC_NOTIFY 564 [IB_QPT_GSI] = IB_QP_EN_SQD_ASYNC_NOTIFY
490 } 565 }
@@ -507,6 +582,15 @@ static const struct {
507 IB_QP_ACCESS_FLAGS | 582 IB_QP_ACCESS_FLAGS |
508 IB_QP_MIN_RNR_TIMER | 583 IB_QP_MIN_RNR_TIMER |
509 IB_QP_PATH_MIG_STATE), 584 IB_QP_PATH_MIG_STATE),
585 [IB_QPT_XRC_INI] = (IB_QP_CUR_STATE |
586 IB_QP_ALT_PATH |
587 IB_QP_ACCESS_FLAGS |
588 IB_QP_PATH_MIG_STATE),
589 [IB_QPT_XRC_TGT] = (IB_QP_CUR_STATE |
590 IB_QP_ALT_PATH |
591 IB_QP_ACCESS_FLAGS |
592 IB_QP_MIN_RNR_TIMER |
593 IB_QP_PATH_MIG_STATE),
510 [IB_QPT_SMI] = (IB_QP_CUR_STATE | 594 [IB_QPT_SMI] = (IB_QP_CUR_STATE |
511 IB_QP_QKEY), 595 IB_QP_QKEY),
512 [IB_QPT_GSI] = (IB_QP_CUR_STATE | 596 [IB_QPT_GSI] = (IB_QP_CUR_STATE |
@@ -535,6 +619,25 @@ static const struct {
535 IB_QP_PKEY_INDEX | 619 IB_QP_PKEY_INDEX |
536 IB_QP_MIN_RNR_TIMER | 620 IB_QP_MIN_RNR_TIMER |
537 IB_QP_PATH_MIG_STATE), 621 IB_QP_PATH_MIG_STATE),
622 [IB_QPT_XRC_INI] = (IB_QP_PORT |
623 IB_QP_AV |
624 IB_QP_TIMEOUT |
625 IB_QP_RETRY_CNT |
626 IB_QP_RNR_RETRY |
627 IB_QP_MAX_QP_RD_ATOMIC |
628 IB_QP_ALT_PATH |
629 IB_QP_ACCESS_FLAGS |
630 IB_QP_PKEY_INDEX |
631 IB_QP_PATH_MIG_STATE),
632 [IB_QPT_XRC_TGT] = (IB_QP_PORT |
633 IB_QP_AV |
634 IB_QP_TIMEOUT |
635 IB_QP_MAX_DEST_RD_ATOMIC |
636 IB_QP_ALT_PATH |
637 IB_QP_ACCESS_FLAGS |
638 IB_QP_PKEY_INDEX |
639 IB_QP_MIN_RNR_TIMER |
640 IB_QP_PATH_MIG_STATE),
538 [IB_QPT_SMI] = (IB_QP_PKEY_INDEX | 641 [IB_QPT_SMI] = (IB_QP_PKEY_INDEX |
539 IB_QP_QKEY), 642 IB_QP_QKEY),
540 [IB_QPT_GSI] = (IB_QP_PKEY_INDEX | 643 [IB_QPT_GSI] = (IB_QP_PKEY_INDEX |
@@ -619,20 +722,27 @@ int ib_destroy_qp(struct ib_qp *qp)
619 struct ib_pd *pd; 722 struct ib_pd *pd;
620 struct ib_cq *scq, *rcq; 723 struct ib_cq *scq, *rcq;
621 struct ib_srq *srq; 724 struct ib_srq *srq;
725 struct ib_xrcd *xrcd;
622 int ret; 726 int ret;
623 727
624 pd = qp->pd; 728 pd = qp->pd;
625 scq = qp->send_cq; 729 scq = qp->send_cq;
626 rcq = qp->recv_cq; 730 rcq = qp->recv_cq;
627 srq = qp->srq; 731 srq = qp->srq;
732 xrcd = qp->xrcd;
628 733
629 ret = qp->device->destroy_qp(qp); 734 ret = qp->device->destroy_qp(qp);
630 if (!ret) { 735 if (!ret) {
631 atomic_dec(&pd->usecnt); 736 if (pd)
632 atomic_dec(&scq->usecnt); 737 atomic_dec(&pd->usecnt);
633 atomic_dec(&rcq->usecnt); 738 if (scq)
739 atomic_dec(&scq->usecnt);
740 if (rcq)
741 atomic_dec(&rcq->usecnt);
634 if (srq) 742 if (srq)
635 atomic_dec(&srq->usecnt); 743 atomic_dec(&srq->usecnt);
744 if (xrcd)
745 atomic_dec(&xrcd->usecnt);
636 } 746 }
637 747
638 return ret; 748 return ret;
diff --git a/include/rdma/ib_verbs.h b/include/rdma/ib_verbs.h
index 516647a22135..c3d7602b5e90 100644
--- a/include/rdma/ib_verbs.h
+++ b/include/rdma/ib_verbs.h
@@ -579,7 +579,11 @@ enum ib_qp_type {
579 IB_QPT_UC, 579 IB_QPT_UC,
580 IB_QPT_UD, 580 IB_QPT_UD,
581 IB_QPT_RAW_IPV6, 581 IB_QPT_RAW_IPV6,
582 IB_QPT_RAW_ETHERTYPE 582 IB_QPT_RAW_ETHERTYPE,
583 /* Save 8 for RAW_PACKET */
584 IB_QPT_XRC_INI = 9,
585 IB_QPT_XRC_TGT,
586 IB_QPT_MAX
583}; 587};
584 588
585enum ib_qp_create_flags { 589enum ib_qp_create_flags {
@@ -593,6 +597,7 @@ struct ib_qp_init_attr {
593 struct ib_cq *send_cq; 597 struct ib_cq *send_cq;
594 struct ib_cq *recv_cq; 598 struct ib_cq *recv_cq;
595 struct ib_srq *srq; 599 struct ib_srq *srq;
600 struct ib_xrcd *xrcd; /* XRC TGT QPs only */
596 struct ib_qp_cap cap; 601 struct ib_qp_cap cap;
597 enum ib_sig_type sq_sig_type; 602 enum ib_sig_type sq_sig_type;
598 enum ib_qp_type qp_type; 603 enum ib_qp_type qp_type;
@@ -784,6 +789,7 @@ struct ib_send_wr {
784 u32 rkey; 789 u32 rkey;
785 } fast_reg; 790 } fast_reg;
786 } wr; 791 } wr;
792 u32 xrc_remote_srq_num; /* XRC TGT QPs only */
787}; 793};
788 794
789struct ib_recv_wr { 795struct ib_recv_wr {
@@ -919,6 +925,7 @@ struct ib_qp {
919 struct ib_cq *send_cq; 925 struct ib_cq *send_cq;
920 struct ib_cq *recv_cq; 926 struct ib_cq *recv_cq;
921 struct ib_srq *srq; 927 struct ib_srq *srq;
928 struct ib_xrcd *xrcd; /* XRC TGT QPs only */
922 struct ib_uobject *uobject; 929 struct ib_uobject *uobject;
923 void (*event_handler)(struct ib_event *, void *); 930 void (*event_handler)(struct ib_event *, void *);
924 void *qp_context; 931 void *qp_context;