Description
Currently on aarch64 mutex locking can be slower then necessary under load. The patch below adds an option to substitute the mutex in ssl locking callback with a spinlock using gcc intrinsics.
diff -Nau -x Makefile -x .Tpo -x .deps orig-trafficserver-5.3.2/iocore/net/SSLUtils.cc trafficserver-5.3.2/iocore/net/SSLUtils.cc
— orig-trafficserver-5.3.2/iocore/net/SSLUtils.cc 2015-09-08 13:05:06.000000000 -0700
+++ trafficserver-5.3.2/iocore/net/SSLUtils.cc 2016-02-26 11:44:55.709451000 -0800
@@ -119,9 +119,17 @@
#endif
-static pthread_mutex_t *mutex_buf = NULL;
static bool open_ssl_initialized = false;
+#ifdef SSL_USE_SPINLOCK
+#include "Spinlock.h"
+#define SSL_locking_callback SSL_locking_callback_spinlock
+static Spinlock *spinlock_buf = NULL;
+#else
+#define SSL_locking_callback SSL_locking_callback_mutex
+static pthread_mutex_t *mutex_buf = NULL;
+#endif
+
RecRawStatBlock *ssl_rsb = NULL;
static InkHashTable *ssl_cipher_name_table = NULL;
@@ -135,9 +143,24 @@
{ return (unsigned long)pthread_self(); }+#ifdef SSL_USE_SPINLOCK
+static void
+SSL_locking_callback_spinlock(int mode, int type, const char * /* file ATS_UNUSED /, int / line ATS_UNUSED */)
+{
+ ink_assert(type < CRYPTO_num_locks());
+ if (mode & CRYPTO_LOCK)
{ + spinlock_buf[type].lock(); + }else if (mode & CRYPTO_UNLOCK)
{ + spinlock_buf[type].unlock(); + }else
{ + Debug("ssl", "invalid SSL locking mode 0x%x", mode); + ink_assert(0); + }+}
+#else
static void
-SSL_locking_callback(int mode, int type, const char * /* file ATS_UNUSED /, int / line ATS_UNUSED */)
+SSL_locking_callback_mutex(int mode, int type, const char * /* file ATS_UNUSED /, int / line ATS_UNUSED */)
}
+#endif
static bool
SSL_CTX_add_extra_chain_cert_file(SSL_CTX *ctx, const char *chainfile)
@@ -758,11 +782,14 @@
SSL_load_error_strings();
SSL_library_init();
+#ifdef SSL_USE_SPINLOCK
+ spinlock_buf = new Spinlock[CRYPTO_num_locks()];
+#else
mutex_buf = (pthread_mutex_t *)OPENSSL_malloc(CRYPTO_num_locks() * sizeof(pthread_mutex_t));
-
for (int i = 0; i < CRYPTO_num_locks(); i++)
+#endif
CRYPTO_set_locking_callback(SSL_locking_callback);
CRYPTO_set_id_callback(SSL_pthreads_thread_id);
diff -Nau -x Makefile -x .Tpo -x .deps orig-trafficserver-5.3.2/iocore/net/Spinlock.h trafficserver-5.3.2/iocore/net/Spinlock.h
— orig-trafficserver-5.3.2/iocore/net/Spinlock.h 1969-12-31 16:00:00.000000000 -0800
+++ trafficserver-5.3.2/iocore/net/Spinlock.h 2016-02-26 11:34:06.359451000 -0800
@@ -0,0 +1,38 @@
+/** @file
+
+Author: Shay Gal-On
+
+A class implementing a simple spinlock using GCC atomics,
+using sched_yield while lock fails.
+
+*/
+
+#include <sched.h>
+
+class Spinlock
+{
+public:
+ int _data;
+
+public:
+ bool try_lock()
+
+
+ void lock()
+ {
+ for( unsigned k = 0; !try_lock(); ++k )
+
+ }
+
+ void unlock()
+
+};
+
+