• Giovanni Cabiddu's avatar
    crypto: qat - fix unregistration of crypto algorithms · 9b2f33a1
    Giovanni Cabiddu authored
    The function adf_dev_init(), through the subsystem qat_crypto, populates
    the list of list of crypto instances accel_dev->crypto_list.
    If the list of instances is not empty, the function adf_dev_start() will
    then call qat_algs_registers() and qat_asym_algs_register() to register
    the crypto algorithms into the crypto framework.
    
    If any of the functions in adf_dev_start() fail, the caller of such
    function, in the error path calls adf_dev_down() which in turn call
    adf_dev_stop() and adf_dev_shutdown(), see for example the function
    state_store in adf_sriov.c.
    However, if the registration of crypto algorithms is not done,
    adf_dev_stop() will try to unregister the algorithms regardless.
    This might cause the counter active_devs in qat_algs.c and
    qat_asym_algs.c to get to a negative value.
    
    Add a new state, ADF_STATUS_CRYPTO_ALGS_REGISTERED, which tracks if the
    crypto algorithms are registered into the crypto framework. Then use
    this to unregister the algorithms if such flag is set. This ensures that
    the crypto algorithms are only unregistered if previously registered.
    
    Fixes: d8cba25d ("crypto: qat - Intel(R) QAT driver framework")
    Signed-off-by: default avatarGiovanni Cabiddu <giovanni.cabiddu@intel.com>
    Reviewed-by: default avatarAdam Guerin <adam.guerin@intel.com>
    Signed-off-by: default avatarHerbert Xu <herbert@gondor.apana.org.au>
    9b2f33a1
adf_init.c 12.3 KB