crypto: qat - ring returning retry even though ring has BW
authorHarvijay Saini <harvijayx.saini@intel.com>
Wed, 9 Dec 2015 19:59:45 +0000 (11:59 -0800)
committerHerbert Xu <herbert@gondor.apana.org.au>
Fri, 11 Dec 2015 14:55:16 +0000 (22:55 +0800)
When many threads submit multiple requests they get blocked until all
responses are processed, which prevents them from submitting more requests
even though there is space on the rings.
To fix this we need to decrement the inflight counter early to in the callback.

Signed-off-by: Harvijay Saini <harvijayx.saini@intel.com>
Signed-off-by: Tadeusz Struk <tadeusz.struk@intel.com>
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
drivers/crypto/qat/qat_common/adf_transport.c

index eff00cd282e5cbf8e10d31c8918e3b382c458e08..a6f3766a74f024b4820022b9a2ef124126f2989f 100644 (file)
@@ -141,6 +141,7 @@ static int adf_handle_response(struct adf_etr_ring_data *ring)
 
        while (*msg != ADF_RING_EMPTY_SIG) {
                ring->callback((uint32_t *)msg);
+               atomic_dec(ring->inflights);
                *msg = ADF_RING_EMPTY_SIG;
                ring->head = adf_modulo(ring->head +
                                        ADF_MSG_SIZE_TO_BYTES(ring->msg_size),
@@ -148,12 +149,10 @@ static int adf_handle_response(struct adf_etr_ring_data *ring)
                msg_counter++;
                msg = (uint32_t *)((uintptr_t)ring->base_addr + ring->head);
        }
-       if (msg_counter > 0) {
+       if (msg_counter > 0)
                WRITE_CSR_RING_HEAD(ring->bank->csr_addr,
                                    ring->bank->bank_number,
                                    ring->ring_number, ring->head);
-               atomic_sub(msg_counter, ring->inflights);
-       }
        return 0;
 }