]> git.ipfire.org Git - thirdparty/openssl.git/commitdiff
provider: reduce lock contention in ossl_provider_find
authorNikola Pajkovsky <nikolap@openssl.org>
Thu, 16 Oct 2025 06:25:06 +0000 (08:25 +0200)
committerNeil Horman <nhorman@openssl.org>
Tue, 21 Oct 2025 12:01:00 +0000 (08:01 -0400)
There's really no point to always take write lock, and sort the
store->providers every time. Instead, check if store->providers is
sorted, and if not, then upgrade to the write lock, otherwise use read
lock.

Signed-off-by: Nikola Pajkovsky <nikolap@openssl.org>
Reviewed-by: Saša Nedvědický <sashan@openssl.org>
Reviewed-by: Paul Dale <paul.dale@oracle.com>
Reviewed-by: Neil Horman <nhorman@openssl.org>
(Merged from https://github.com/openssl/openssl/pull/28927)

crypto/provider_core.c

index 010a2262e15b734e14b312bd53a10308b7462e92..87700889d3c2414b7640f31a2b1db3e37056f198 100644 (file)
@@ -418,9 +418,15 @@ OSSL_PROVIDER *ossl_provider_find(OSSL_LIB_CTX *libctx, const char *name,
 #endif
 
         tmpl.name = (char *)name;
-        if (!CRYPTO_THREAD_write_lock(store->lock))
+        if (!CRYPTO_THREAD_read_lock(store->lock))
             return NULL;
-        sk_OSSL_PROVIDER_sort(store->providers);
+        if (!sk_OSSL_PROVIDER_is_sorted(store->providers)) {
+            CRYPTO_THREAD_unlock(store->lock);
+            if (!CRYPTO_THREAD_write_lock(store->lock))
+                return NULL;
+            if (!sk_OSSL_PROVIDER_is_sorted(store->providers))
+                sk_OSSL_PROVIDER_sort(store->providers);
+        }
         if ((i = sk_OSSL_PROVIDER_find(store->providers, &tmpl)) != -1)
             prov = sk_OSSL_PROVIDER_value(store->providers, i);
         CRYPTO_THREAD_unlock(store->lock);