[openssl] master update

beldmit at gmail.com beldmit at gmail.com
Thu Dec 24 11:37:55 UTC 2020


The branch master has been updated
       via  ae031148fde2b55238d56dcbe4ac05625382d970 (commit)
      from  38f7931429859a3bd07725dbc451c0b4cac26a10 (commit)


- Log -----------------------------------------------------------------
commit ae031148fde2b55238d56dcbe4ac05625382d970
Author: Matt Caswell <matt at openssl.org>
Date:   Tue Dec 22 15:16:51 2020 +0000

    Optimise OPENSSL_init_crypto to not need a lock when loading config
    
    Most of the time we don't have any explicit settings when loading a
    config file. Therefore we optimise things so that we don't need to use
    a lock in that instance.
    
    Partially addresses performance issues in #13725
    
    Reviewed-by: Dmitry Belyavskiy <beldmit at gmail.com>
    (Merged from https://github.com/openssl/openssl/pull/13731)

-----------------------------------------------------------------------

Summary of changes:
 crypto/init.c | 25 ++++++++++++++++++++-----
 1 file changed, 20 insertions(+), 5 deletions(-)

diff --git a/crypto/init.c b/crypto/init.c
index ba8706655b..f1100df169 100644
--- a/crypto/init.c
+++ b/crypto/init.c
@@ -233,8 +233,16 @@ static CRYPTO_ONCE config = CRYPTO_ONCE_STATIC_INIT;
 static int config_inited = 0;
 static const OPENSSL_INIT_SETTINGS *conf_settings = NULL;
 DEFINE_RUN_ONCE_STATIC(ossl_init_config)
+{
+    int ret = openssl_config_int(NULL);
+
+    config_inited = 1;
+    return ret;
+}
+DEFINE_RUN_ONCE_STATIC_ALT(ossl_init_config_settings, ossl_init_config)
 {
     int ret = openssl_config_int(conf_settings);
+
     config_inited = 1;
     return ret;
 }
@@ -539,11 +547,18 @@ int OPENSSL_init_crypto(uint64_t opts, const OPENSSL_INIT_SETTINGS *settings)
 
     if (opts & OPENSSL_INIT_LOAD_CONFIG) {
         int ret;
-        CRYPTO_THREAD_write_lock(init_lock);
-        conf_settings = settings;
-        ret = RUN_ONCE(&config, ossl_init_config);
-        conf_settings = NULL;
-        CRYPTO_THREAD_unlock(init_lock);
+
+        if (settings == NULL) {
+            ret = RUN_ONCE(&config, ossl_init_config);
+        } else {
+            CRYPTO_THREAD_write_lock(init_lock);
+            conf_settings = settings;
+            ret = RUN_ONCE_ALT(&config, ossl_init_config_settings,
+                               ossl_init_config);
+            conf_settings = NULL;
+            CRYPTO_THREAD_unlock(init_lock);
+        }
+
         if (ret <= 0)
             return 0;
     }


More information about the openssl-commits mailing list