From: Nikola Pajkovsky Date: Thu, 16 Oct 2025 06:25:06 +0000 (+0200) Subject: provider: reduce lock contention in ossl_provider_find X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=94cc3b7995d82c23b3449708f03f7bff0ba98e92;p=thirdparty%2Fopenssl.git provider: reduce lock contention in ossl_provider_find 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 Reviewed-by: Saša Nedvědický Reviewed-by: Paul Dale Reviewed-by: Neil Horman (Merged from https://github.com/openssl/openssl/pull/28927) --- diff --git a/crypto/provider_core.c b/crypto/provider_core.c index 010a2262e15..87700889d3c 100644 --- a/crypto/provider_core.c +++ b/crypto/provider_core.c @@ -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);