diff options
Diffstat (limited to 'drivers/infiniband/sw/rdmavt/qp.c')
-rw-r--r-- | drivers/infiniband/sw/rdmavt/qp.c | 48 |
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] = { | |||
118 | EXPORT_SYMBOL(ib_rvt_state_ops); | 118 | EXPORT_SYMBOL(ib_rvt_state_ops); |
119 | 119 | ||
120 | static void get_map_page(struct rvt_qpn_table *qpt, | 120 | static 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 | */ |
344 | static int alloc_qpn(struct rvt_dev_info *rdi, struct rvt_qpn_table *qpt, | 343 | static 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; |