]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
crypto: api - Call crypto_schedule_test outside of mutex
authorHerbert Xu <herbert@gondor.apana.org.au>
Fri, 15 Nov 2024 01:56:28 +0000 (09:56 +0800)
committerHerbert Xu <herbert@gondor.apana.org.au>
Tue, 10 Dec 2024 05:44:20 +0000 (13:44 +0800)
There is no need to hold the crypto mutex when scheduling a self-
test.  In fact prior to the patch introducing asynchronous testing,
this was done outside of the locked area.

Move the crypto_schedule_test call back out of the locked area.

Also move crypto_remove_final to the else branch under the schedule-
test call as the list of algorithms to be removed is non-empty only
when the test larval is NULL (i.e., testing is disabled).

Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
crypto/algapi.c

index 7e061d8a1d52dd28fc19f3e15820d87c93d729bd..5318c214debb0eaa960ee99ae9f8a6457af3b2ab 100644 (file)
@@ -407,6 +407,7 @@ EXPORT_SYMBOL_GPL(crypto_remove_final);
 int crypto_register_alg(struct crypto_alg *alg)
 {
        struct crypto_larval *larval;
+       bool test_started = false;
        LIST_HEAD(algs_to_put);
        int err;
 
@@ -418,17 +419,19 @@ int crypto_register_alg(struct crypto_alg *alg)
        down_write(&crypto_alg_sem);
        larval = __crypto_register_alg(alg, &algs_to_put);
        if (!IS_ERR_OR_NULL(larval)) {
-               bool test_started = crypto_boot_test_finished();
-
+               test_started = crypto_boot_test_finished();
                larval->test_started = test_started;
-               if (test_started)
-                       crypto_schedule_test(larval);
        }
        up_write(&crypto_alg_sem);
 
        if (IS_ERR(larval))
                return PTR_ERR(larval);
-       crypto_remove_final(&algs_to_put);
+
+       if (test_started)
+               crypto_schedule_test(larval);
+       else
+               crypto_remove_final(&algs_to_put);
+
        return 0;
 }
 EXPORT_SYMBOL_GPL(crypto_register_alg);
@@ -642,10 +645,8 @@ int crypto_register_instance(struct crypto_template *tmpl,
        larval = __crypto_register_alg(&inst->alg, &algs_to_put);
        if (IS_ERR(larval))
                goto unlock;
-       else if (larval) {
+       else if (larval)
                larval->test_started = true;
-               crypto_schedule_test(larval);
-       }
 
        hlist_add_head(&inst->list, &tmpl->instances);
        inst->tmpl = tmpl;
@@ -655,7 +656,12 @@ unlock:
 
        if (IS_ERR(larval))
                return PTR_ERR(larval);
-       crypto_remove_final(&algs_to_put);
+
+       if (larval)
+               crypto_schedule_test(larval);
+       else
+               crypto_remove_final(&algs_to_put);
+
        return 0;
 }
 EXPORT_SYMBOL_GPL(crypto_register_instance);
@@ -1040,7 +1046,6 @@ static void __init crypto_start_tests(void)
 
                        l->test_started = true;
                        larval = l;
-                       crypto_schedule_test(larval);
                        break;
                }
 
@@ -1048,6 +1053,8 @@ static void __init crypto_start_tests(void)
 
                if (!larval)
                        break;
+
+               crypto_schedule_test(larval);
        }
 }