From 94cc3b7995d82c23b3449708f03f7bff0ba98e92 Mon Sep 17 00:00:00 2001 From: Nikola Pajkovsky Date: Thu, 16 Oct 2025 08:25:06 +0200 Subject: [PATCH] provider: reduce lock contention in ossl_provider_find MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit 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) --- crypto/provider_core.c | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) 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); -- 2.47.3