staging/rdma/hfi1: Add a credit push on diagpkt allocate fail
authorDean Luick <dean.luick@intel.com>
Tue, 1 Dec 2015 20:38:17 +0000 (15:38 -0500)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Mon, 21 Dec 2015 21:51:55 +0000 (13:51 -0800)
When sending a diagnostic packet, if the send context does not
have enough room, force a credit return and try again.

Reviewed-by: Dennis Dalessandro <dennis.dalessandro@intel.com>
Signed-off-by: Dean Luick <dean.luick@intel.com>
Signed-off-by: Jubin John <jubin.john@intel.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/staging/rdma/hfi1/diag.c

index 0aaad7412842bdeb967fe68422f116ea98367994..e4cd333bba83cf9190c4163f4a0647bcafcfdad4 100644 (file)
@@ -379,6 +379,7 @@ static ssize_t diagpkt_send(struct diag_pkt *dp)
        pio_release_cb credit_cb = NULL;
        void *credit_arg = NULL;
        struct diagpkt_wait *wait = NULL;
+       int trycount = 0;
 
        dd = hfi1_lookup(dp->unit);
        if (!dd || !(dd->flags & HFI1_PRESENT) || !dd->kregbase) {
@@ -493,8 +494,15 @@ static ssize_t diagpkt_send(struct diag_pkt *dp)
                credit_arg = wait;
        }
 
+retry:
        pbuf = sc_buffer_alloc(sc, total_len, credit_cb, credit_arg);
        if (!pbuf) {
+               if (trycount == 0) {
+                       /* force a credit return and try again */
+                       sc_return_credits(sc);
+                       trycount = 1;
+                       goto retry;
+               }
                /*
                 * No send buffer means no credit callback.  Undo
                 * the wait set-up that was done above.  We free wait