| From ab477c1ff5e0a744c072404bf7db51bfe1f05b6e Mon Sep 17 00:00:00 2001 |
| From: Bart Van Assche <bvanassche@acm.org> |
| Date: Sun, 19 Oct 2014 18:05:33 +0300 |
| Subject: srp-target: Retry when QP creation fails with ENOMEM |
| |
| From: Bart Van Assche <bvanassche@acm.org> |
| |
| commit ab477c1ff5e0a744c072404bf7db51bfe1f05b6e upstream. |
| |
| It is not guaranteed to that srp_sq_size is supported |
| by the HCA. So if we failed to create the QP with ENOMEM, |
| try with a smaller srp_sq_size. Keep it up until we hit |
| MIN_SRPT_SQ_SIZE, then fail the connection. |
| |
| Reported-by: Mark Lehrer <lehrer@gmail.com> |
| Signed-off-by: Bart Van Assche <bvanassche@acm.org> |
| Signed-off-by: Sagi Grimberg <sagig@mellanox.com> |
| Signed-off-by: Nicholas Bellinger <nab@linux-iscsi.org> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| |
| --- |
| drivers/infiniband/ulp/srpt/ib_srpt.c | 8 ++++++++ |
| 1 file changed, 8 insertions(+) |
| |
| --- a/drivers/infiniband/ulp/srpt/ib_srpt.c |
| +++ b/drivers/infiniband/ulp/srpt/ib_srpt.c |
| @@ -2091,6 +2091,7 @@ static int srpt_create_ch_ib(struct srpt |
| if (!qp_init) |
| goto out; |
| |
| +retry: |
| ch->cq = ib_create_cq(sdev->device, srpt_completion, NULL, ch, |
| ch->rq_size + srp_sq_size, 0); |
| if (IS_ERR(ch->cq)) { |
| @@ -2114,6 +2115,13 @@ static int srpt_create_ch_ib(struct srpt |
| ch->qp = ib_create_qp(sdev->pd, qp_init); |
| if (IS_ERR(ch->qp)) { |
| ret = PTR_ERR(ch->qp); |
| + if (ret == -ENOMEM) { |
| + srp_sq_size /= 2; |
| + if (srp_sq_size >= MIN_SRPT_SQ_SIZE) { |
| + ib_destroy_cq(ch->cq); |
| + goto retry; |
| + } |
| + } |
| printk(KERN_ERR "failed to create_qp ret= %d\n", ret); |
| goto err_destroy_cq; |
| } |