Uploaded image for project: 'Traffic Server'
  1. Traffic Server
  2. TS-4234

ATS on AARCH64 use spinlock for SSL locking

    XMLWordPrintableJSON

Details

    • Improvement
    • Status: Open
    • Major
    • Resolution: Unresolved
    • None
    • sometime
    • SSL
    • None

    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 */)

      { ink_assert(type < CRYPTO_num_locks()); @@ -150,6 +173,7 @@ ink_assert(0); }

      }
      +#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++)

      { pthread_mutex_init(&mutex_buf[i], NULL); }

      +#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()
      +

      { + int r = __sync_lock_test_and_set( &_data, 1 ); + return r == 0; + }

      +
      + void lock()
      + {
      + for( unsigned k = 0; !try_lock(); ++k )
      +

      { + sched_yield(); + }

      + }
      +
      + void unlock()
      +

      { + __sync_lock_release( &_data ); + }

      +};
      +
      +

      Attachments

        Activity

          People

            Unassigned Unassigned
            shaygalon Shay Gal-On
            Votes:
            0 Vote for this issue
            Watchers:
            4 Start watching this issue

            Dates

              Created:
              Updated: