diff options
| -rw-r--r-- | drivers/infiniband/hw/ipath/ipath_qp.c | 27 |
1 files changed, 16 insertions, 11 deletions
diff --git a/drivers/infiniband/hw/ipath/ipath_qp.c b/drivers/infiniband/hw/ipath/ipath_qp.c index 68f01513214f..a77a0dad0fa0 100644 --- a/drivers/infiniband/hw/ipath/ipath_qp.c +++ b/drivers/infiniband/hw/ipath/ipath_qp.c | |||
| @@ -685,16 +685,22 @@ struct ib_qp *ipath_create_qp(struct ib_pd *ibpd, | |||
| 685 | ret = ERR_PTR(-ENOMEM); | 685 | ret = ERR_PTR(-ENOMEM); |
| 686 | goto bail; | 686 | goto bail; |
| 687 | } | 687 | } |
| 688 | qp->r_rq.size = init_attr->cap.max_recv_wr + 1; | 688 | if (init_attr->srq) { |
| 689 | sz = sizeof(struct ipath_sge) * | 689 | qp->r_rq.size = 0; |
| 690 | init_attr->cap.max_recv_sge + | 690 | qp->r_rq.max_sge = 0; |
| 691 | sizeof(struct ipath_rwqe); | 691 | qp->r_rq.wq = NULL; |
| 692 | qp->r_rq.wq = vmalloc(qp->r_rq.size * sz); | 692 | } else { |
| 693 | if (!qp->r_rq.wq) { | 693 | qp->r_rq.size = init_attr->cap.max_recv_wr + 1; |
| 694 | kfree(qp); | 694 | qp->r_rq.max_sge = init_attr->cap.max_recv_sge; |
| 695 | vfree(swq); | 695 | sz = (sizeof(struct ipath_sge) * qp->r_rq.max_sge) + |
| 696 | ret = ERR_PTR(-ENOMEM); | 696 | sizeof(struct ipath_rwqe); |
| 697 | goto bail; | 697 | qp->r_rq.wq = vmalloc(qp->r_rq.size * sz); |
| 698 | if (!qp->r_rq.wq) { | ||
| 699 | kfree(qp); | ||
| 700 | vfree(swq); | ||
| 701 | ret = ERR_PTR(-ENOMEM); | ||
| 702 | goto bail; | ||
| 703 | } | ||
| 698 | } | 704 | } |
| 699 | 705 | ||
| 700 | /* | 706 | /* |
| @@ -713,7 +719,6 @@ struct ib_qp *ipath_create_qp(struct ib_pd *ibpd, | |||
| 713 | qp->s_wq = swq; | 719 | qp->s_wq = swq; |
| 714 | qp->s_size = init_attr->cap.max_send_wr + 1; | 720 | qp->s_size = init_attr->cap.max_send_wr + 1; |
| 715 | qp->s_max_sge = init_attr->cap.max_send_sge; | 721 | qp->s_max_sge = init_attr->cap.max_send_sge; |
| 716 | qp->r_rq.max_sge = init_attr->cap.max_recv_sge; | ||
| 717 | qp->s_flags = init_attr->sq_sig_type == IB_SIGNAL_REQ_WR ? | 722 | qp->s_flags = init_attr->sq_sig_type == IB_SIGNAL_REQ_WR ? |
| 718 | 1 << IPATH_S_SIGNAL_REQ_WR : 0; | 723 | 1 << IPATH_S_SIGNAL_REQ_WR : 0; |
| 719 | dev = to_idev(ibpd->device); | 724 | dev = to_idev(ibpd->device); |
