aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/infiniband/sw/rdmavt/qp.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/infiniband/sw/rdmavt/qp.c')
-rw-r--r--drivers/infiniband/sw/rdmavt/qp.c48
1 files changed, 13 insertions, 35 deletions
diff --git a/drivers/infiniband/sw/rdmavt/qp.c b/drivers/infiniband/sw/rdmavt/qp.c
index 727e81cc2c8f..459865439a0b 100644
--- a/drivers/infiniband/sw/rdmavt/qp.c
+++ b/drivers/infiniband/sw/rdmavt/qp.c
@@ -118,10 +118,9 @@ const int ib_rvt_state_ops[IB_QPS_ERR + 1] = {
118EXPORT_SYMBOL(ib_rvt_state_ops); 118EXPORT_SYMBOL(ib_rvt_state_ops);
119 119
120static void get_map_page(struct rvt_qpn_table *qpt, 120static void get_map_page(struct rvt_qpn_table *qpt,
121 struct rvt_qpn_map *map, 121 struct rvt_qpn_map *map)
122 gfp_t gfp)
123{ 122{
124 unsigned long page = get_zeroed_page(gfp); 123 unsigned long page = get_zeroed_page(GFP_KERNEL);
125 124
126 /* 125 /*
127 * Free the page if someone raced with us installing it. 126 * Free the page if someone raced with us installing it.
@@ -173,7 +172,7 @@ static int init_qpn_table(struct rvt_dev_info *rdi, struct rvt_qpn_table *qpt)
173 rdi->dparms.qpn_res_start, rdi->dparms.qpn_res_end); 172 rdi->dparms.qpn_res_start, rdi->dparms.qpn_res_end);
174 for (i = rdi->dparms.qpn_res_start; i <= rdi->dparms.qpn_res_end; i++) { 173 for (i = rdi->dparms.qpn_res_start; i <= rdi->dparms.qpn_res_end; i++) {
175 if (!map->page) { 174 if (!map->page) {
176 get_map_page(qpt, map, GFP_KERNEL); 175 get_map_page(qpt, map);
177 if (!map->page) { 176 if (!map->page) {
178 ret = -ENOMEM; 177 ret = -ENOMEM;
179 break; 178 break;
@@ -342,14 +341,14 @@ static inline unsigned mk_qpn(struct rvt_qpn_table *qpt,
342 * Return: The queue pair number 341 * Return: The queue pair number
343 */ 342 */
344static int alloc_qpn(struct rvt_dev_info *rdi, struct rvt_qpn_table *qpt, 343static int alloc_qpn(struct rvt_dev_info *rdi, struct rvt_qpn_table *qpt,
345 enum ib_qp_type type, u8 port_num, gfp_t gfp) 344 enum ib_qp_type type, u8 port_num)
346{ 345{
347 u32 i, offset, max_scan, qpn; 346 u32 i, offset, max_scan, qpn;
348 struct rvt_qpn_map *map; 347 struct rvt_qpn_map *map;
349 u32 ret; 348 u32 ret;
350 349
351 if (rdi->driver_f.alloc_qpn) 350 if (rdi->driver_f.alloc_qpn)
352 return rdi->driver_f.alloc_qpn(rdi, qpt, type, port_num, gfp); 351 return rdi->driver_f.alloc_qpn(rdi, qpt, type, port_num);
353 352
354 if (type == IB_QPT_SMI || type == IB_QPT_GSI) { 353 if (type == IB_QPT_SMI || type == IB_QPT_GSI) {
355 unsigned n; 354 unsigned n;
@@ -374,7 +373,7 @@ static int alloc_qpn(struct rvt_dev_info *rdi, struct rvt_qpn_table *qpt,
374 max_scan = qpt->nmaps - !offset; 373 max_scan = qpt->nmaps - !offset;
375 for (i = 0;;) { 374 for (i = 0;;) {
376 if (unlikely(!map->page)) { 375 if (unlikely(!map->page)) {
377 get_map_page(qpt, map, gfp); 376 get_map_page(qpt, map);
378 if (unlikely(!map->page)) 377 if (unlikely(!map->page))
379 break; 378 break;
380 } 379 }
@@ -672,7 +671,6 @@ struct ib_qp *rvt_create_qp(struct ib_pd *ibpd,
672 struct ib_qp *ret = ERR_PTR(-ENOMEM); 671 struct ib_qp *ret = ERR_PTR(-ENOMEM);
673 struct rvt_dev_info *rdi = ib_to_rvt(ibpd->device); 672 struct rvt_dev_info *rdi = ib_to_rvt(ibpd->device);
674 void *priv = NULL; 673 void *priv = NULL;
675 gfp_t gfp;
676 size_t sqsize; 674 size_t sqsize;
677 675
678 if (!rdi) 676 if (!rdi)
@@ -680,18 +678,9 @@ struct ib_qp *rvt_create_qp(struct ib_pd *ibpd,
680 678
681 if (init_attr->cap.max_send_sge > rdi->dparms.props.max_sge || 679 if (init_attr->cap.max_send_sge > rdi->dparms.props.max_sge ||
682 init_attr->cap.max_send_wr > rdi->dparms.props.max_qp_wr || 680 init_attr->cap.max_send_wr > rdi->dparms.props.max_qp_wr ||
683 init_attr->create_flags & ~(IB_QP_CREATE_USE_GFP_NOIO)) 681 init_attr->create_flags)
684 return ERR_PTR(-EINVAL); 682 return ERR_PTR(-EINVAL);
685 683
686 /* GFP_NOIO is applicable to RC QP's only */
687
688 if (init_attr->create_flags & IB_QP_CREATE_USE_GFP_NOIO &&
689 init_attr->qp_type != IB_QPT_RC)
690 return ERR_PTR(-EINVAL);
691
692 gfp = init_attr->create_flags & IB_QP_CREATE_USE_GFP_NOIO ?
693 GFP_NOIO : GFP_KERNEL;
694
695 /* Check receive queue parameters if no SRQ is specified. */ 684 /* Check receive queue parameters if no SRQ is specified. */
696 if (!init_attr->srq) { 685 if (!init_attr->srq) {
697 if (init_attr->cap.max_recv_sge > rdi->dparms.props.max_sge || 686 if (init_attr->cap.max_recv_sge > rdi->dparms.props.max_sge ||
@@ -719,14 +708,7 @@ struct ib_qp *rvt_create_qp(struct ib_pd *ibpd,
719 sz = sizeof(struct rvt_sge) * 708 sz = sizeof(struct rvt_sge) *
720 init_attr->cap.max_send_sge + 709 init_attr->cap.max_send_sge +
721 sizeof(struct rvt_swqe); 710 sizeof(struct rvt_swqe);
722 if (gfp == GFP_NOIO) 711 swq = vzalloc_node(sqsize * sz, rdi->dparms.node);
723 swq = __vmalloc(
724 sqsize * sz,
725 gfp | __GFP_ZERO, PAGE_KERNEL);
726 else
727 swq = vzalloc_node(
728 sqsize * sz,
729 rdi->dparms.node);
730 if (!swq) 712 if (!swq)
731 return ERR_PTR(-ENOMEM); 713 return ERR_PTR(-ENOMEM);
732 714
@@ -741,7 +723,8 @@ struct ib_qp *rvt_create_qp(struct ib_pd *ibpd,
741 } else if (init_attr->cap.max_recv_sge > 1) 723 } else if (init_attr->cap.max_recv_sge > 1)
742 sg_list_sz = sizeof(*qp->r_sg_list) * 724 sg_list_sz = sizeof(*qp->r_sg_list) *
743 (init_attr->cap.max_recv_sge - 1); 725 (init_attr->cap.max_recv_sge - 1);
744 qp = kzalloc_node(sz + sg_list_sz, gfp, rdi->dparms.node); 726 qp = kzalloc_node(sz + sg_list_sz, GFP_KERNEL,
727 rdi->dparms.node);
745 if (!qp) 728 if (!qp)
746 goto bail_swq; 729 goto bail_swq;
747 730
@@ -751,7 +734,7 @@ struct ib_qp *rvt_create_qp(struct ib_pd *ibpd,
751 kzalloc_node( 734 kzalloc_node(
752 sizeof(*qp->s_ack_queue) * 735 sizeof(*qp->s_ack_queue) *
753 rvt_max_atomic(rdi), 736 rvt_max_atomic(rdi),
754 gfp, 737 GFP_KERNEL,
755 rdi->dparms.node); 738 rdi->dparms.node);
756 if (!qp->s_ack_queue) 739 if (!qp->s_ack_queue)
757 goto bail_qp; 740 goto bail_qp;
@@ -766,7 +749,7 @@ struct ib_qp *rvt_create_qp(struct ib_pd *ibpd,
766 * Driver needs to set up it's private QP structure and do any 749 * Driver needs to set up it's private QP structure and do any
767 * initialization that is needed. 750 * initialization that is needed.
768 */ 751 */
769 priv = rdi->driver_f.qp_priv_alloc(rdi, qp, gfp); 752 priv = rdi->driver_f.qp_priv_alloc(rdi, qp);
770 if (IS_ERR(priv)) { 753 if (IS_ERR(priv)) {
771 ret = priv; 754 ret = priv;
772 goto bail_qp; 755 goto bail_qp;
@@ -786,11 +769,6 @@ struct ib_qp *rvt_create_qp(struct ib_pd *ibpd,
786 qp->r_rq.wq = vmalloc_user( 769 qp->r_rq.wq = vmalloc_user(
787 sizeof(struct rvt_rwq) + 770 sizeof(struct rvt_rwq) +
788 qp->r_rq.size * sz); 771 qp->r_rq.size * sz);
789 else if (gfp == GFP_NOIO)
790 qp->r_rq.wq = __vmalloc(
791 sizeof(struct rvt_rwq) +
792 qp->r_rq.size * sz,
793 gfp | __GFP_ZERO, PAGE_KERNEL);
794 else 772 else
795 qp->r_rq.wq = vzalloc_node( 773 qp->r_rq.wq = vzalloc_node(
796 sizeof(struct rvt_rwq) + 774 sizeof(struct rvt_rwq) +
@@ -824,7 +802,7 @@ struct ib_qp *rvt_create_qp(struct ib_pd *ibpd,
824 802
825 err = alloc_qpn(rdi, &rdi->qp_dev->qpn_table, 803 err = alloc_qpn(rdi, &rdi->qp_dev->qpn_table,
826 init_attr->qp_type, 804 init_attr->qp_type,
827 init_attr->port_num, gfp); 805 init_attr->port_num);
828 if (err < 0) { 806 if (err < 0) {
829 ret = ERR_PTR(err); 807 ret = ERR_PTR(err);
830 goto bail_rq_wq; 808 goto bail_rq_wq;