diff options
Diffstat (limited to 'drivers/infiniband/hw/mthca/mthca_provider.c')
-rw-r--r-- | drivers/infiniband/hw/mthca/mthca_provider.c | 33 |
1 files changed, 26 insertions, 7 deletions
diff --git a/drivers/infiniband/hw/mthca/mthca_provider.c b/drivers/infiniband/hw/mthca/mthca_provider.c index a2eae8a30167..230ae21db8fd 100644 --- a/drivers/infiniband/hw/mthca/mthca_provider.c +++ b/drivers/infiniband/hw/mthca/mthca_provider.c | |||
@@ -115,6 +115,16 @@ static int mthca_query_device(struct ib_device *ibdev, | |||
115 | props->max_mcast_qp_attach = MTHCA_QP_PER_MGM; | 115 | props->max_mcast_qp_attach = MTHCA_QP_PER_MGM; |
116 | props->max_total_mcast_qp_attach = props->max_mcast_qp_attach * | 116 | props->max_total_mcast_qp_attach = props->max_mcast_qp_attach * |
117 | props->max_mcast_grp; | 117 | props->max_mcast_grp; |
118 | /* | ||
119 | * If Sinai memory key optimization is being used, then only | ||
120 | * the 8-bit key portion will change. For other HCAs, the | ||
121 | * unused index bits will also be used for FMR remapping. | ||
122 | */ | ||
123 | if (mdev->mthca_flags & MTHCA_FLAG_SINAI_OPT) | ||
124 | props->max_map_per_fmr = 255; | ||
125 | else | ||
126 | props->max_map_per_fmr = | ||
127 | (1 << (32 - long_log2(mdev->limits.num_mpts))) - 1; | ||
118 | 128 | ||
119 | err = 0; | 129 | err = 0; |
120 | out: | 130 | out: |
@@ -783,18 +793,24 @@ static int mthca_resize_cq(struct ib_cq *ibcq, int entries, struct ib_udata *uda | |||
783 | if (entries < 1 || entries > dev->limits.max_cqes) | 793 | if (entries < 1 || entries > dev->limits.max_cqes) |
784 | return -EINVAL; | 794 | return -EINVAL; |
785 | 795 | ||
796 | mutex_lock(&cq->mutex); | ||
797 | |||
786 | entries = roundup_pow_of_two(entries + 1); | 798 | entries = roundup_pow_of_two(entries + 1); |
787 | if (entries == ibcq->cqe + 1) | 799 | if (entries == ibcq->cqe + 1) { |
788 | return 0; | 800 | ret = 0; |
801 | goto out; | ||
802 | } | ||
789 | 803 | ||
790 | if (cq->is_kernel) { | 804 | if (cq->is_kernel) { |
791 | ret = mthca_alloc_resize_buf(dev, cq, entries); | 805 | ret = mthca_alloc_resize_buf(dev, cq, entries); |
792 | if (ret) | 806 | if (ret) |
793 | return ret; | 807 | goto out; |
794 | lkey = cq->resize_buf->buf.mr.ibmr.lkey; | 808 | lkey = cq->resize_buf->buf.mr.ibmr.lkey; |
795 | } else { | 809 | } else { |
796 | if (ib_copy_from_udata(&ucmd, udata, sizeof ucmd)) | 810 | if (ib_copy_from_udata(&ucmd, udata, sizeof ucmd)) { |
797 | return -EFAULT; | 811 | ret = -EFAULT; |
812 | goto out; | ||
813 | } | ||
798 | lkey = ucmd.lkey; | 814 | lkey = ucmd.lkey; |
799 | } | 815 | } |
800 | 816 | ||
@@ -811,7 +827,7 @@ static int mthca_resize_cq(struct ib_cq *ibcq, int entries, struct ib_udata *uda | |||
811 | cq->resize_buf = NULL; | 827 | cq->resize_buf = NULL; |
812 | spin_unlock_irq(&cq->lock); | 828 | spin_unlock_irq(&cq->lock); |
813 | } | 829 | } |
814 | return ret; | 830 | goto out; |
815 | } | 831 | } |
816 | 832 | ||
817 | if (cq->is_kernel) { | 833 | if (cq->is_kernel) { |
@@ -838,7 +854,10 @@ static int mthca_resize_cq(struct ib_cq *ibcq, int entries, struct ib_udata *uda | |||
838 | } else | 854 | } else |
839 | ibcq->cqe = entries - 1; | 855 | ibcq->cqe = entries - 1; |
840 | 856 | ||
841 | return 0; | 857 | out: |
858 | mutex_unlock(&cq->mutex); | ||
859 | |||
860 | return ret; | ||
842 | } | 861 | } |
843 | 862 | ||
844 | static int mthca_destroy_cq(struct ib_cq *cq) | 863 | static int mthca_destroy_cq(struct ib_cq *cq) |