crypto: qat - Don't attempt to register algorithm multiple times
authorTadeusz Struk <tadeusz.struk@intel.com>
Wed, 22 Jul 2015 05:07:47 +0000 (22:07 -0700)
committerHerbert Xu <herbert@gondor.apana.org.au>
Thu, 23 Jul 2015 10:14:28 +0000 (18:14 +0800)
When multiple devices are present in the system the driver attempts
to register the same algorithm many times.

Changes in v2:
 - use proper synchronization mechanizm between register and unregister

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

index 557a7408710da1b021e2b36b282d8b8e8e1fb5eb..fe352a6a1630dd6f25b562e8d6d56daea96fd891 100644 (file)
@@ -58,6 +58,9 @@
 #include "adf_common_drv.h"
 #include "qat_crypto.h"
 
+static DEFINE_MUTEX(algs_lock);
+static unsigned int active_devs;
+
 struct qat_rsa_input_params {
        union {
                struct {
@@ -629,11 +632,21 @@ static struct akcipher_alg rsa = {
 
 int qat_asym_algs_register(void)
 {
-       rsa.base.cra_flags = 0;
-       return crypto_register_akcipher(&rsa);
+       int ret = 0;
+
+       mutex_lock(&algs_lock);
+       if (++active_devs == 1) {
+               rsa.base.cra_flags = 0;
+               ret = crypto_register_akcipher(&rsa);
+       }
+       mutex_unlock(&algs_lock);
+       return ret;
 }
 
 void qat_asym_algs_unregister(void)
 {
-       crypto_unregister_akcipher(&rsa);
+       mutex_lock(&algs_lock);
+       if (--active_devs == 0)
+               crypto_unregister_akcipher(&rsa);
+       mutex_unlock(&algs_lock);
 }