• Giovanni Cabiddu's avatar
    crypto: qat - add backlog mechanism · 38682383
    Giovanni Cabiddu authored
    The implementations of the crypto algorithms (aead, skcipher, etc) in
    the QAT driver do not properly support requests with the
    CRYPTO_TFM_REQ_MAY_BACKLOG flag set. If the HW queue is full, the driver
    returns -EBUSY but does not enqueue the request. This can result in
    applications like dm-crypt waiting indefinitely for the completion of a
    request that was never submitted to the hardware.
    
    Fix this by adding a software backlog queue: if the ring buffer is more
    than eighty percent full, then the request is enqueued to a backlog
    list and the error code -EBUSY is returned back to the caller.
    Requests in the backlog queue are resubmitted at a later time, in the
    context of the callback of a previously submitted request.
    The request for which -EBUSY is returned is then marked as -EINPROGRESS
    once submitted to the HW queues.
    
    The submission loop inside the function qat_alg_send_message() has been
    modified to decide which submission policy to use based on the request
    flags. If the request does not have the CRYPTO_TFM_REQ_MAY_BACKLOG set,
    the previous behaviour has been preserved.
    
    Based on a patch by
    Vishnu Das Ramachandran <vishnu.dasx.ramachandran@intel.com>
    
    Cc: stable@vger.kernel.org
    Fixes: d370cec3 ("crypto: qat - Intel(R) QAT crypto interface")
    Reported-by: default avatarMikulas Patocka <mpatocka@redhat.com>
    Reported-by: default avatarKyle Sanderson <kyle.leet@gmail.com>
    Signed-off-by: default avatarGiovanni Cabiddu <giovanni.cabiddu@intel.com>
    Reviewed-by: default avatarMarco Chiappero <marco.chiappero@intel.com>
    Signed-off-by: default avatarHerbert Xu <herbert@gondor.apana.org.au>
    38682383
qat_algs.c 46.3 KB