Skip to content

Commit 6f043b5

Browse files
tstrukherbertx
authored andcommitted
crypto: qat - Fix invalid synchronization between register/unregister sym algs
The synchronization method used atomic was bogus. Use a proper synchronization with mutex. Cc: [email protected] Signed-off-by: Tadeusz Struk <[email protected]> Signed-off-by: Herbert Xu <[email protected]>
1 parent 030f4e9 commit 6f043b5

File tree

1 file changed

+16
-8
lines changed

1 file changed

+16
-8
lines changed

drivers/crypto/qat/qat_common/qat_algs.c

+16-8
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,8 @@
7373
ICP_QAT_HW_CIPHER_KEY_CONVERT, \
7474
ICP_QAT_HW_CIPHER_DECRYPT)
7575

76-
static atomic_t active_dev;
76+
static DEFINE_MUTEX(algs_lock);
77+
static unsigned int active_devs;
7778

7879
struct qat_alg_buf {
7980
uint32_t len;
@@ -1280,7 +1281,10 @@ static struct crypto_alg qat_algs[] = { {
12801281

12811282
int qat_algs_register(void)
12821283
{
1283-
if (atomic_add_return(1, &active_dev) == 1) {
1284+
int ret = 0;
1285+
1286+
mutex_lock(&algs_lock);
1287+
if (++active_devs == 1) {
12841288
int i;
12851289

12861290
for (i = 0; i < ARRAY_SIZE(qat_algs); i++)
@@ -1289,21 +1293,25 @@ int qat_algs_register(void)
12891293
CRYPTO_ALG_TYPE_AEAD | CRYPTO_ALG_ASYNC :
12901294
CRYPTO_ALG_TYPE_ABLKCIPHER | CRYPTO_ALG_ASYNC;
12911295

1292-
return crypto_register_algs(qat_algs, ARRAY_SIZE(qat_algs));
1296+
ret = crypto_register_algs(qat_algs, ARRAY_SIZE(qat_algs));
12931297
}
1294-
return 0;
1298+
mutex_unlock(&algs_lock);
1299+
return ret;
12951300
}
12961301

12971302
int qat_algs_unregister(void)
12981303
{
1299-
if (atomic_sub_return(1, &active_dev) == 0)
1300-
return crypto_unregister_algs(qat_algs, ARRAY_SIZE(qat_algs));
1301-
return 0;
1304+
int ret = 0;
1305+
1306+
mutex_lock(&algs_lock);
1307+
if (--active_devs == 0)
1308+
ret = crypto_unregister_algs(qat_algs, ARRAY_SIZE(qat_algs));
1309+
mutex_unlock(&algs_lock);
1310+
return ret;
13021311
}
13031312

13041313
int qat_algs_init(void)
13051314
{
1306-
atomic_set(&active_dev, 0);
13071315
crypto_get_default_rng();
13081316
return 0;
13091317
}

0 commit comments

Comments
 (0)