pthread-rxkad-stats-20050529
authorTom Keiser <tkeiser@psu.edu>
Mon, 30 May 2005 05:55:12 +0000 (05:55 +0000)
committerDerrick Brashear <shadow@dementia.org>
Mon, 30 May 2005 05:55:12 +0000 (05:55 +0000)
FIXES 17547

speed up rxkad by keeping stats per-thread

18 files changed:
src/des/des.c
src/des/key_sched.c
src/des/new_rnd_key.c
src/des/stats.h
src/kauth/test/test_getticket.c
src/kauth/test/test_rxkad_free.c
src/libafsrpc/afsrpc.def
src/libafsrpc/afsrpc.exp
src/rx/rx.c
src/rxkad/bg-fcrypt.c
src/rxkad/domestic/crypt_conn.c
src/rxkad/domestic/fcrypt.c
src/rxkad/rxkad.p.h
src/rxkad/rxkad_client.c
src/rxkad/rxkad_common.c
src/rxkad/rxkad_server.c
src/shlibafsrpc/afsrpc.exp
src/shlibafsrpc/mapfile

index 5536066..b4f7bf6 100644 (file)
@@ -65,10 +65,6 @@ RCSID
 #define DBG_PRINT(s)
 #endif
 
-#ifdef AFS_PTHREAD_ENV
-pthread_mutex_t rxkad_stats_mutex;
-#endif /* AFS_PTHREAD_ENV */
-
 /* encrypt == 0  ==> decrypt, else encrypt */
 
 afs_int32
@@ -105,12 +101,10 @@ des_ecb_encrypt(void * clear, void * cipher,
 #ifdef DEBUG
     afs_uint32 dbg_tmp[2];
 #endif
-    LOCK_RXKAD_STATS;
     if (encrypt)
-       rxkad_stats.des_encrypts[DES_ENCRYPT]++;
+       INC_RXKAD_STATS(des_encrypts[DES_ENCRYPT]);
     else
-       rxkad_stats.des_encrypts[DES_DECRYPT]++;
-    UNLOCK_RXKAD_STATS;
+       INC_RXKAD_STATS(des_encrypts[DES_DECRYPT]);
     /*
      * Use L1,R1 and L2,R2 as two sets of "64-bit" registers always
      * work from L1,R1 input to L2,R2 output; initialize the cleartext
index 38e75a0..93eefb0 100644 (file)
@@ -66,9 +66,7 @@ des_key_sched(register des_cblock k, des_key_schedule schedule)
     n = 0;
     p_char = k_char;
 
-    LOCK_RXKAD_STATS;
-    rxkad_stats.des_key_scheds++;
-    UNLOCK_RXKAD_STATS;
+    INC_RXKAD_STATS(des_key_scheds);
 #ifdef lint
     n = n;                     /* fool it in case of VAXASM */
 #endif
index c1f11bf..ab44a5e 100644 (file)
@@ -257,9 +257,7 @@ des_generate_random_block(des_cblock block)
 {
     int i;
 
-    LOCK_RXKAD_STATS;
-    rxkad_stats.des_randoms++;
-    UNLOCK_RXKAD_STATS;
+    INC_RXKAD_STATS(des_randoms);
     /*
      * Encrypt the sequence number to get the new random block:
      */
index 7699ee2..da49b95 100644 (file)
 /* Some Cheap statistics which should be shared with the rxkad definitions, but
  * aren't.  The layout should match the layout in rxkad/rxkad.p.h. */
 
+#ifndef OPENAFS_DES_STATS_H
+#define OPENAFS_DES_STATS_H
+
+
+/* this is an optimization for pthreads environments.  Instead of having global
+   rxkad statistics, make them thread-specific, and only perform aggregation on
+   the stats structures when necessary.  Furthermore, don't do any locking, and
+   live with the nearly accurate aggregation (e.g. you might miss a few increments,
+   but the resulting aggregation should be almost correct). */
+
+#ifdef AFS_PTHREAD_ENV
+typedef struct rxkad_stats_t {
+#else
 struct rxkad_stats {
+#endif
     afs_uint32 connections[3]; /* client side only */
     afs_uint32 destroyObject;  /* client security objects */
     afs_uint32 destroyClient;  /* client connections */
@@ -30,16 +44,105 @@ struct rxkad_stats {
     afs_uint32 des_encrypts[2];        /* DECRYPT==0, ENCRYPT==1 */
     afs_uint32 des_key_scheds; /* key schedule creations */
     afs_uint32 des_randoms;    /* random blocks generated */
-    long spares[10];
+    afs_uint32 clientObjects;
+    afs_uint32 serverObjects;
+    long spares[8];
+#ifdef AFS_PTHREAD_ENV
+    struct rxkad_stats_t * next;
+    struct rxkad_stats_t * prev;
+} rxkad_stats_t;                       /* put these here for convenience */
+#else /* AFS_PTHREAD_ENV */
 } rxkad_stats;                 /* put these here for convenience */
+#endif /* AFS_PTHREAD_ENV */
+
 
 #ifdef AFS_PTHREAD_ENV
+struct rxkad_global_stats {
+    rxkad_stats_t * first;
+    rxkad_stats_t * last;
+} rxkad_global_stats;
+
 #include <pthread.h>
 #include <assert.h>
-extern pthread_mutex_t rxkad_stats_mutex;
-#define LOCK_RXKAD_STATS assert(pthread_mutex_lock(&rxkad_stats_mutex)==0)
-#define UNLOCK_RXKAD_STATS assert(pthread_mutex_unlock(&rxkad_stats_mutex)==0)
+extern pthread_mutex_t rxkad_global_stats_lock;
+extern pthread_key_t rxkad_stats_key;
+
+extern void rxkad_global_stats_init();
+extern rxkad_stats_t * rxkad_thr_stats_init();
+extern int rxkad_stats_agg(rxkad_stats_t *);
+
+#ifndef BEGIN
+#define BEGIN do {
+#define END   } while(0)
+#endif
+#define RXKAD_GLOBAL_STATS_LOCK assert(pthread_mutex_lock(&rxkad_global_stats_lock)==0)
+#define RXKAD_GLOBAL_STATS_UNLOCK assert(pthread_mutex_unlock(&rxkad_global_stats_lock)==0)
+#define GET_RXKAD_STATS(stats) rxkad_stats_agg(stats)
+#define GET_RXKAD_THR_STATS(rxkad_stats) \
+    BEGIN \
+        (rxkad_stats) = ((rxkad_stats_t*)pthread_getspecific(rxkad_stats_key)); \
+        if ((rxkad_stats) == NULL) { \
+            assert(((rxkad_stats) = rxkad_thr_stats_init()) != NULL); \
+        } \
+    END
+#define INC_RXKAD_STATS(stats_elem) \
+    BEGIN \
+        rxkad_stats_t * rxkad_stats; \
+        rxkad_stats = ((rxkad_stats_t*)pthread_getspecific(rxkad_stats_key)); \
+        if (rxkad_stats == NULL) { \
+            assert(((rxkad_stats) = rxkad_thr_stats_init()) != NULL); \
+        } \
+        rxkad_stats->stats_elem++; \
+    END
+#define DEC_RXKAD_STATS(stats_elem) \
+    BEGIN \
+        rxkad_stats_t * rxkad_stats; \
+        rxkad_stats = ((rxkad_stats_t*)pthread_getspecific(rxkad_stats_key)); \
+        if (rxkad_stats == NULL) { \
+            assert(((rxkad_stats) = rxkad_thr_stats_init()) != NULL); \
+        } \
+        rxkad_stats->stats_elem--; \
+    END
+#define ADD_RXKAD_STATS(stats_elem, inc_value) \
+    BEGIN \
+        rxkad_stats_t * rxkad_stats; \
+        rxkad_stats = ((rxkad_stats_t*)pthread_getspecific(rxkad_stats_key)); \
+        if (rxkad_stats == NULL) { \
+            assert(((rxkad_stats) = rxkad_thr_stats_init()) != NULL); \
+        } \
+        rxkad_stats->stats_elem += inc_value; \
+    END
+#define SUB_RXKAD_STATS(stats_elem, dec_value) \
+    BEGIN \
+        rxkad_stats_t * rxkad_stats; \
+        rxkad_stats = ((rxkad_stats_t*)pthread_getspecific(rxkad_stats_key)); \
+        if (rxkad_stats == NULL) { \
+            assert(((rxkad_stats) = rxkad_thr_stats_init()) != NULL); \
+        } \
+        rxkad_stats->stats_elem -= dec_value; \
+    END
+#else /* AFS_PTHREAD_ENV */
+#define INC_RXKAD_STATS(stats_elem) rxkad_stats.stats_elem++
+#define DEC_RXKAD_STATS(stats_elem) rxkad_stats.stats_elem--
+#define ADD_RXKAD_STATS(stats_elem, inc_value) rxkad_stats.stats_elem += (inc_value)
+#define SUB_RXKAD_STATS(stats_elem, dec_value) rxkad_stats.stats_elem -= (dec_value)
+#define GET_RXKAD_STATS(stats) memcpy((stats), &rxkad_stats, sizeof(rxkad_stats))
+#endif /* AFS_PTHREAD_ENV */
+
+
+#if defined(AFS_NT40_ENV) && defined(AFS_PTHREAD_ENV)
+#ifndef RXKAD_STATS_DECLSPEC
+#define RXKAD_STATS_DECLSPEC __declspec(dllimport) extern
+#endif
 #else
-#define LOCK_RXKAD_STATS
-#define UNLOCK_RXKAD_STATS
+#define RXKAD_STATS_DECLSPEC extern
 #endif
+
+#ifdef AFS_PTHREAD_ENV
+RXKAD_STATS_DECLSPEC struct rxkad_global_stats rxkad_global_stats;
+#else /* AFS_PTHREAD_ENV */
+RXKAD_STATS_DECLSPEC struct rxkad_stats rxkad_stats;
+#endif
+
+
+#endif /* OPENAFS_DES_STATS_H */
index a509e76..9c9eec3 100644 (file)
@@ -64,7 +64,7 @@ static void
 PrintRxkadStats()
 {
     printf("New Objects client %d, server %d.  Destroyed objects %d.\n",
-          rxkad_stats_clientObjects, rxkad_stats_serverObjects,
+          rxkad_stats.clientObjects, rxkad_stats.serverObjects,
           rxkad_stats.destroyObject);
     printf("client conns: %d %d %d, destroyed client %d.\n",
           rxkad_stats.connections[0], rxkad_stats.connections[1],
index 5cc555d..e54cce5 100644 (file)
@@ -38,7 +38,7 @@ static void
 PrintRxkadStats()
 {
     printf("New Objects client %d, server %d.  Destroyed objects %d.\n",
-          rxkad_stats_clientObjects, rxkad_stats_serverObjects,
+          rxkad_stats.clientObjects, rxkad_stats.serverObjects,
           rxkad_stats.destroyObject);
     printf("client conns: %d %d %d, destroyed client %d.\n",
           rxkad_stats.connections[0], rxkad_stats.connections[1],
index 69feb96..e84db83 100644 (file)
@@ -67,7 +67,7 @@ EXPORTS
        xdrrec_skiprecord                       @71
        xdrrx_create                            @72
        hton_syserr_conv                        @73
-       rxkad_stats                             @74 DATA
+       rxkad_global_stats                      @74 DATA
        com_err                                 @75
        error_message                           @76
        rx_socket                               @77 DATA
@@ -213,5 +213,7 @@ EXPORTS
         StartRXAFS_FetchData64                  @218
         StartRXAFS_StoreData64                  @219
         rx_StartClientThread                    @220
+       rxkad_global_stats_lock                 @221 DATA
+       rxkad_stats_key                         @222 DATA
 
 
index 4269ce7..b0bfac6 100644 (file)
@@ -79,7 +79,9 @@ xdrrx_create
 xdr_afsuuid
 xdr_int64
 hton_syserr_conv
-rxkad_stats
+rxkad_global_stats
+rxkad_global_stats_lock
+rxkad_stats_key
 _et_list
 et_list_mutex
 com_err
index bc3fe35..018d003 100644 (file)
@@ -153,7 +153,6 @@ static unsigned int rxi_rpc_process_stat_cnt;
  */
 
 extern pthread_mutex_t rx_stats_mutex;
-extern pthread_mutex_t rxkad_stats_mutex;
 extern pthread_mutex_t des_init_mutex;
 extern pthread_mutex_t des_random_mutex;
 extern pthread_mutex_t rx_clock_mutex;
@@ -207,8 +206,6 @@ rxi_InitPthread(void)
           (&rxkad_client_uid_mutex, (const pthread_mutexattr_t *)0) == 0);
     assert(pthread_mutex_init
           (&rxkad_random_mutex, (const pthread_mutexattr_t *)0) == 0);
-    assert(pthread_mutex_init
-          (&rxkad_stats_mutex, (const pthread_mutexattr_t *)0) == 0);
     assert(pthread_mutex_init(&rx_debug_mutex, (const pthread_mutexattr_t *)0)
           == 0);
 
@@ -218,6 +215,8 @@ rxi_InitPthread(void)
           == 0);
     assert(pthread_key_create(&rx_thread_id_key, NULL) == 0);
     assert(pthread_key_create(&rx_ts_info_key, NULL) == 0);
+    rxkad_global_stats_init();
 }
 
 pthread_once_t rx_once_init = PTHREAD_ONCE_INIT;
index 5892e7b..0c3cabc 100644 (file)
@@ -74,6 +74,7 @@ RCSID
 #include "rxkad.h"
 #include "fcrypt.h"
 #include "private_data.h"
+#include <des/stats.h>
 
 #undef WORDS_BIGENDIAN
 #ifdef AFSBIG_ENDIAN
@@ -507,9 +508,7 @@ afs_int32
 fc_ecb_encrypt(afs_uint32 * in, afs_uint32 * out, fc_KeySchedule sched,
               int encrypt)
 {
-    LOCK_RXKAD_STATS;
-    rxkad_stats.fc_encrypts[encrypt]++;
-    UNLOCK_RXKAD_STATS;
+    INC_RXKAD_STATS(fc_encrypts[encrypt]);
     if (encrypt)
        fc_ecb_enc(in[0], in[1], out, sched);
     else
@@ -669,9 +668,7 @@ fc_keysched(void *key_, fc_KeySchedule sched)
     ROT56R(hi, lo, 11);
     *sched++ = EFF_NTOHL(lo);
 #endif
-    LOCK_RXKAD_STATS;
-    rxkad_stats.fc_key_scheds++;
-    UNLOCK_RXKAD_STATS;
+    INC_RXKAD_STATS(fc_key_scheds);
     return 0;
 }
 
@@ -692,9 +689,7 @@ rxkad_EncryptPacket(const struct rx_connection * rx_connection_not_used,
 
     obj = rx_SecurityObjectOf(rx_connection_not_used);
     tp = (struct rxkad_cprivate *)obj->privateData;
-    LOCK_RXKAD_STATS;
-    rxkad_stats.bytesEncrypted[rxkad_TypeIndex(tp->type)] += len;
-    UNLOCK_RXKAD_STATS;
+    ADD_RXKAD_STATS(bytesEncrypted[rxkad_TypeIndex(tp->type)],len);
     {
        /* What is this good for?
         * It turns out that the security header for auth_enc is of
@@ -730,9 +725,7 @@ rxkad_DecryptPacket(const struct rx_connection * rx_connection_not_used,
 
     obj = rx_SecurityObjectOf(rx_connection_not_used);
     tp = (struct rxkad_cprivate *)obj->privateData;
-    LOCK_RXKAD_STATS;
-    rxkad_stats.bytesDecrypted[rxkad_TypeIndex(tp->type)] += len;
-    UNLOCK_RXKAD_STATS;
+    ADD_RXKAD_STATS(bytesDecrypted[rxkad_TypeIndex(tp->type)],len);
     memcpy(ivec, iv, sizeof(ivec));    /* Must use copy of iv */
     for (frag = &packet->wirevec[1]; len > 0; frag++) {
        int iov_len = frag->iov_len;
index 67970e0..6a3484b 100644 (file)
@@ -42,6 +42,7 @@ RCSID
 #endif
 #endif /* KERNEL */
 
+#include <des/stats.h>
 #include "private_data.h"
 #define XPRT_RXKAD_CRYPT
 
@@ -61,9 +62,7 @@ rxkad_DecryptPacket(const struct rx_connection *conn,
 
     obj = rx_SecurityObjectOf(conn);
     tp = (struct rxkad_cprivate *)obj->privateData;
-    LOCK_RXKAD_STATS;
-    rxkad_stats.bytesDecrypted[rxkad_TypeIndex(tp->type)] += len;
-    UNLOCK_RXKAD_STATS;
+    ADD_RXKAD_STATS(bytesDecrypted[rxkad_TypeIndex(tp->type)],len);
     memcpy((void *)xor, (void *)ivec, sizeof(xor));
     for (i = 0; len; i++) {
        data = rx_data(packet, i, tlen);
@@ -97,9 +96,7 @@ rxkad_EncryptPacket(const struct rx_connection * conn,
 
     obj = rx_SecurityObjectOf(conn);
     tp = (struct rxkad_cprivate *)obj->privateData;
-    LOCK_RXKAD_STATS;
-    rxkad_stats.bytesEncrypted[rxkad_TypeIndex(tp->type)] += len;
-    UNLOCK_RXKAD_STATS;
+    ADD_RXKAD_STATS(bytesEncrypted[rxkad_TypeIndex(tp->type)],len);
     /*
      * afs_int32 cksum;
      * cksum = htonl(0);                
index b7c959e..ec336a2 100644 (file)
@@ -55,7 +55,7 @@ RCSID
 #include "sboxes.h"
 #include "fcrypt.h"
 #include "rxkad.h"
-
+#include <des/stats.h>
 
 #ifdef TCRYPT
 int ROUNDS = 16;
@@ -102,9 +102,7 @@ fc_keysched(struct ktc_encryptionKey *key, fc_KeySchedule schedule)
        kword[1] = (kword[1] >> 11) | (temp << (56 - 32 - 11));
        schedule[i] = kword[0];
     }
-    LOCK_RXKAD_STATS;
-    rxkad_stats.fc_key_scheds++;
-    UNLOCK_RXKAD_STATS;
+    INC_RXKAD_STATS(fc_key_scheds);
     return 0;
 }
 
@@ -140,9 +138,7 @@ fc_ecb_encrypt(void * clear, void * cipher,
 #endif
 
     if (encrypt) {
-       LOCK_RXKAD_STATS;
-       rxkad_stats.fc_encrypts[ENCRYPT]++;
-       UNLOCK_RXKAD_STATS;
+       INC_RXKAD_STATS(fc_encrypts[ENCRYPT]);
        for (i = 0; i < (ROUNDS / 2); i++) {
            S = *schedule++ ^ R;        /* xor R with key bits from schedule */
            Pchar[Byte2] = sbox0[Schar[Byte0]]; /* do 8-bit S Box subst. */
@@ -160,9 +156,7 @@ fc_ecb_encrypt(void * clear, void * cipher,
            R ^= P;
        }
     } else {
-       LOCK_RXKAD_STATS;
-       rxkad_stats.fc_encrypts[DECRYPT]++;
-       UNLOCK_RXKAD_STATS;
+       INC_RXKAD_STATS(fc_encrypts[DECRYPT]);
        schedule = &schedule[ROUNDS - 1];       /* start at end of key schedule */
        for (i = 0; i < (ROUNDS / 2); i++) {
            S = *schedule-- ^ L;        /* xor R with key bits from schedule */
index 92824f7..d2969bc 100644 (file)
@@ -90,52 +90,6 @@ typedef char rxkad_level;
 #define rxkad_TypeIndex(type) \
     ((((type) == 1) || ((type) == 2)) ? (type) : 0)
 
-struct rxkad_stats {
-    afs_uint32 connections[3]; /* client side only */
-    afs_uint32 destroyObject;  /* client security objects */
-    afs_uint32 destroyClient;  /* client connections */
-    afs_uint32 destroyUnused;  /* unused server conn */
-    afs_uint32 destroyUnauth;  /* unauthenticated server conn */
-    afs_uint32 destroyConn[3]; /* server conn per level */
-    afs_uint32 expired;                /* server packets rejected */
-    afs_uint32 challengesSent; /* server challenges sent */
-    afs_uint32 challenges[3];  /* challenges seen by client */
-    afs_uint32 responses[3];   /* responses seen by server */
-    afs_uint32 preparePackets[6];
-    afs_uint32 checkPackets[6];
-    afs_uint32 bytesEncrypted[2];      /* index just by type */
-    afs_uint32 bytesDecrypted[2];
-    afs_uint32 fc_encrypts[2]; /* DECRYPT==0, ENCRYPT==1 */
-    afs_uint32 fc_key_scheds;  /* key schedule creations */
-    afs_uint32 des_encrypts[2];        /* DECRYPT==0, ENCRYPT==1 */
-    afs_uint32 des_key_scheds; /* key schedule creations */
-    afs_uint32 des_randoms;    /* random blocks generated */
-    long spares[10];
-};
-
-#if defined(AFS_NT40_ENV) && defined(AFS_PTHREAD_ENV)
-#ifndef RXKAD_STATS_DECLSPEC
-#define RXKAD_STATS_DECLSPEC __declspec(dllimport) extern
-#endif
-#else
-#define RXKAD_STATS_DECLSPEC extern
-#endif
-RXKAD_STATS_DECLSPEC struct rxkad_stats rxkad_stats;
-#ifdef AFS_PTHREAD_ENV
-#include <pthread.h>
-#include <assert.h>
-extern pthread_mutex_t rxkad_stats_mutex;
-#define LOCK_RXKAD_STATS assert(pthread_mutex_lock(&rxkad_stats_mutex)==0)
-#define UNLOCK_RXKAD_STATS assert(pthread_mutex_unlock(&rxkad_stats_mutex)==0)
-#else
-#define LOCK_RXKAD_STATS
-#define UNLOCK_RXKAD_STATS
-#endif
-
-
-/* gak! using up spares already! */
-#define rxkad_stats_clientObjects (rxkad_stats.spares[0])
-#define rxkad_stats_serverObjects (rxkad_stats.spares[1])
 
 extern int rxkad_EpochWasSet;  /* TRUE => we called rx_SetEpoch */
 
index d30cd73..8fe23ab 100644 (file)
@@ -63,6 +63,7 @@ RCSID
 #endif /* AFS_PTHREAD_ENV */
 #endif /* KERNEL */
 
+#include <des/stats.h>
 #include "private_data.h"
 #define XPRT_RXKAD_CLIENT
 
@@ -207,9 +208,7 @@ rxkad_NewClientSecurityObject(rxkad_level level,
     }
     memcpy(tcp->ticket, ticket, ticketLen);
 
-    LOCK_RXKAD_STATS;
-    rxkad_stats_clientObjects++;
-    UNLOCK_RXKAD_STATS;
+    INC_RXKAD_STATS(clientObjects);
     return tsc;
 }
 
@@ -255,9 +254,7 @@ rxkad_GetResponse(struct rx_securityClass *aobj, struct rx_connection *aconn,
 
     if (level > tcp->level)
        return RXKADLEVELFAIL;
-    LOCK_RXKAD_STATS;
-    rxkad_stats.challenges[rxkad_LevelIndex(tcp->level)]++;
-    UNLOCK_RXKAD_STATS;
+    INC_RXKAD_STATS(challenges[rxkad_LevelIndex(tcp->level)]);
     if (v2) {
        int i;
        afs_uint32 xor[2];
index ee4c841..3f1727d 100644 (file)
@@ -71,6 +71,7 @@ RCSID
 
 #endif /* KERNEL */
 
+#include <des/stats.h>
 #include "private_data.h"
 #define XPRT_RXKAD_COMMON
 
@@ -83,7 +84,112 @@ RCSID
 #endif
 /* variable initialization for the benefit of darwin compiler; if it causes
    problems elsewhere, conditionalize for darwin or fc_test compile breaks */
+#ifdef AFS_PTHREAD_ENV
+struct rxkad_global_stats rxkad_global_stats = { 0 };
+pthread_mutex_t rxkad_global_stats_lock;
+pthread_key_t rxkad_stats_key;
+#else /* AFS_PTHREAD_ENV */
 struct rxkad_stats rxkad_stats = { { 0 } };
+#endif /* AFS_PTHREAD_ENV */
+
+#ifdef AFS_PTHREAD_ENV
+/* rxkad_stats related stuff */
+
+/*
+ * Macro to insert an element at the tail of a doubly linked list
+ */
+#define DLL_INSERT_TAIL(ptr,head,tail,next,prev) \
+    do {                                        \
+       (ptr)->next = NULL;                      \
+        (ptr)->prev = (tail);                   \
+       (tail) = (ptr);                          \
+       if ((ptr)->prev)                         \
+           (ptr)->prev->next = (ptr);           \
+       else                                     \
+           (head) = (ptr);                      \
+       assert((head) && ((head)->prev == NULL)); \
+    } while(0)
+
+void rxkad_global_stats_init() {
+    assert(pthread_mutex_init(&rxkad_global_stats_lock, (const pthread_mutexattr_t *)0) == 0);
+    assert(pthread_key_create(&rxkad_stats_key, NULL) == 0);
+    memset(&rxkad_global_stats, 0, sizeof(rxkad_global_stats));
+}
+
+rxkad_stats_t * 
+rxkad_thr_stats_init() {
+    rxkad_stats_t * rxkad_stats;
+    rxkad_stats = (rxkad_stats_t *)malloc(sizeof(rxkad_stats_t));
+    assert(rxkad_stats != NULL && pthread_setspecific(rxkad_stats_key,rxkad_stats) == 0);
+    memset(rxkad_stats,0,sizeof(rxkad_stats_t));
+    RXKAD_GLOBAL_STATS_LOCK;
+    DLL_INSERT_TAIL(rxkad_stats, rxkad_global_stats.first, rxkad_global_stats.last, next, prev);
+    RXKAD_GLOBAL_STATS_UNLOCK;
+    return rxkad_stats;
+}
+
+int rxkad_stats_agg(rxkad_stats_t * rxkad_stats) {
+    rxkad_stats_t * thr_stats;
+    assert(rxkad_stats != NULL);
+    memset(rxkad_stats, 0, sizeof(rxkad_stats_t));
+    RXKAD_GLOBAL_STATS_LOCK;
+    for (thr_stats = rxkad_global_stats.first; thr_stats != NULL; thr_stats = thr_stats->next) {
+        rxkad_stats->connections[0] += thr_stats->connections[0];
+       rxkad_stats->connections[1] += thr_stats->connections[1];
+       rxkad_stats->connections[2] += thr_stats->connections[2];
+       rxkad_stats->destroyObject += thr_stats->destroyObject;
+       rxkad_stats->destroyClient += thr_stats->destroyClient;
+       rxkad_stats->destroyUnused += thr_stats->destroyUnused;
+       rxkad_stats->destroyUnauth += thr_stats->destroyUnauth;
+       rxkad_stats->destroyConn[0] += thr_stats->destroyConn[0];
+       rxkad_stats->destroyConn[1] += thr_stats->destroyConn[1];
+       rxkad_stats->destroyConn[2] += thr_stats->destroyConn[2];
+       rxkad_stats->expired += thr_stats->expired;
+       rxkad_stats->challengesSent += thr_stats->challengesSent;
+       rxkad_stats->challenges[0] += thr_stats->challenges[0];
+       rxkad_stats->challenges[1] += thr_stats->challenges[1];
+       rxkad_stats->challenges[2] += thr_stats->challenges[2];
+       rxkad_stats->responses[0] += thr_stats->responses[0];
+       rxkad_stats->responses[1] += thr_stats->responses[1];
+       rxkad_stats->responses[2] += thr_stats->responses[2];
+       rxkad_stats->preparePackets[0] += thr_stats->preparePackets[0];
+       rxkad_stats->preparePackets[1] += thr_stats->preparePackets[1];
+       rxkad_stats->preparePackets[2] += thr_stats->preparePackets[2];
+       rxkad_stats->preparePackets[3] += thr_stats->preparePackets[3];
+       rxkad_stats->preparePackets[4] += thr_stats->preparePackets[4];
+       rxkad_stats->preparePackets[5] += thr_stats->preparePackets[5];
+       rxkad_stats->checkPackets[0] += thr_stats->checkPackets[0];
+       rxkad_stats->checkPackets[1] += thr_stats->checkPackets[1];
+       rxkad_stats->checkPackets[2] += thr_stats->checkPackets[2];
+       rxkad_stats->checkPackets[3] += thr_stats->checkPackets[3];
+       rxkad_stats->checkPackets[4] += thr_stats->checkPackets[4];
+       rxkad_stats->checkPackets[5] += thr_stats->checkPackets[5];
+       rxkad_stats->bytesEncrypted[0] += thr_stats->bytesEncrypted[0];
+       rxkad_stats->bytesEncrypted[1] += thr_stats->bytesEncrypted[1];
+       rxkad_stats->bytesDecrypted[0] += thr_stats->bytesDecrypted[0];
+       rxkad_stats->bytesDecrypted[1] += thr_stats->bytesDecrypted[1];
+       rxkad_stats->fc_encrypts[0] += thr_stats->fc_encrypts[0];
+       rxkad_stats->fc_encrypts[1] += thr_stats->fc_encrypts[1];
+       rxkad_stats->fc_key_scheds += thr_stats->fc_key_scheds;
+       rxkad_stats->des_encrypts[0] += thr_stats->des_encrypts[0];
+       rxkad_stats->des_encrypts[1] += thr_stats->des_encrypts[1];
+       rxkad_stats->des_key_scheds += thr_stats->des_key_scheds;
+       rxkad_stats->des_randoms += thr_stats->des_randoms;
+       rxkad_stats->spares[0] += thr_stats->spares[0];
+       rxkad_stats->spares[1] += thr_stats->spares[1];
+       rxkad_stats->spares[2] += thr_stats->spares[2];
+       rxkad_stats->spares[3] += thr_stats->spares[3];
+       rxkad_stats->spares[4] += thr_stats->spares[4];
+       rxkad_stats->spares[5] += thr_stats->spares[5];
+       rxkad_stats->spares[6] += thr_stats->spares[6];
+       rxkad_stats->spares[7] += thr_stats->spares[7];
+       rxkad_stats->spares[8] += thr_stats->spares[8];
+       rxkad_stats->spares[9] += thr_stats->spares[9];
+    }
+    RXKAD_GLOBAL_STATS_UNLOCK;
+    return 0;
+}
+#endif /* AFS_PTHREAD_ENV */
 
 /* static prototypes */
 static afs_int32 ComputeSum(struct rx_packet *apacket,
@@ -207,9 +313,7 @@ FreeObject(struct rx_securityClass *aobj)
     } else {
        return RXKADINCONSISTENCY;
     }                          /* unknown type */
-    LOCK_RXKAD_STATS;
-    rxkad_stats.destroyObject++;
-    UNLOCK_RXKAD_STATS;
+    INC_RXKAD_STATS(destroyObject);
     return 0;
 }
 
@@ -251,9 +355,7 @@ rxkad_NewConnection(struct rx_securityClass *aobj,
        rxkad_SetLevel(aconn, tcp->level);      /* set header and trailer sizes */
        rxkad_AllocCID(aobj, aconn);    /* CHANGES cid AND epoch!!!! */
        rxkad_DeriveXORInfo(aconn, tcp->keysched, tcp->ivec, tccp->preSeq);
-       LOCK_RXKAD_STATS;
-       rxkad_stats.connections[rxkad_LevelIndex(tcp->level)]++;
-       UNLOCK_RXKAD_STATS;
+       INC_RXKAD_STATS(connections[rxkad_LevelIndex(tcp->level)]);
     }
 
     aobj->refCount++;          /* attached connection */
@@ -272,20 +374,16 @@ rxkad_DestroyConnection(struct rx_securityClass *aobj,
        sconn = (struct rxkad_sconn *)aconn->securityData;
        if (sconn) {
            aconn->securityData = 0;
-           LOCK_RXKAD_STATS;
            if (sconn->authenticated)
-               rxkad_stats.destroyConn[rxkad_LevelIndex(sconn->level)]++;
+               INC_RXKAD_STATS(destroyConn[rxkad_LevelIndex(sconn->level)]);
            else
-               rxkad_stats.destroyUnauth++;
-           UNLOCK_RXKAD_STATS;
+               INC_RXKAD_STATS(destroyUnauth);
            rock = sconn->rock;
            if (rock)
                rxi_Free(rock, sizeof(struct rxkad_serverinfo));
            rxi_Free(sconn, sizeof(struct rxkad_sconn));
        } else {
-           LOCK_RXKAD_STATS;
-           rxkad_stats.destroyUnused++;
-           UNLOCK_RXKAD_STATS;
+           INC_RXKAD_STATS(destroyUnused);
        }
     } else {                   /* client */
        struct rxkad_cconn *cconn;
@@ -298,9 +396,7 @@ rxkad_DestroyConnection(struct rx_securityClass *aobj,
            aconn->securityData = 0;
            rxi_Free(cconn, sizeof(struct rxkad_cconn));
        }
-       LOCK_RXKAD_STATS;
-       rxkad_stats.destroyClient++;
-       UNLOCK_RXKAD_STATS;
+       INC_RXKAD_STATS(destroyClient);
     }
     aobj->refCount--;          /* decrement connection counter */
     if (aobj->refCount <= 0) {
@@ -341,17 +437,13 @@ rxkad_CheckPacket(struct rx_securityClass *aobj, struct rx_call *acall,
        if (sconn && sconn->authenticated
            && (osi_Time() < sconn->expirationTime)) {
            level = sconn->level;
-           LOCK_RXKAD_STATS;
-           rxkad_stats.checkPackets[rxkad_StatIndex(rxkad_server, level)]++;
-           UNLOCK_RXKAD_STATS;
+           INC_RXKAD_STATS(checkPackets[rxkad_StatIndex(rxkad_server, level)]);
            sconn->stats.packetsReceived++;
            sconn->stats.bytesReceived += len;
            schedule = (fc_KeySchedule *) sconn->keysched;
            ivec = (fc_InitializationVector *) sconn->ivec;
        } else {
-           LOCK_RXKAD_STATS;
-           rxkad_stats.expired++;
-           UNLOCK_RXKAD_STATS;
+           INC_RXKAD_STATS(expired);
            return RXKADEXPIRED;
        }
        preSeq = sconn->preSeq;
@@ -366,9 +458,7 @@ rxkad_CheckPacket(struct rx_securityClass *aobj, struct rx_call *acall,
        if (!(tcp->type & rxkad_client))
            return RXKADINCONSISTENCY;
        level = tcp->level;
-       LOCK_RXKAD_STATS;
-       rxkad_stats.checkPackets[rxkad_StatIndex(rxkad_client, level)]++;
-       UNLOCK_RXKAD_STATS;
+       INC_RXKAD_STATS(checkPackets[rxkad_StatIndex(rxkad_client, level)]);
        cconn->stats.packetsReceived++;
        cconn->stats.bytesReceived += len;
        preSeq = cconn->preSeq;
@@ -434,18 +524,13 @@ rxkad_PreparePacket(struct rx_securityClass *aobj, struct rx_call *acall,
        if (sconn && sconn->authenticated
            && (osi_Time() < sconn->expirationTime)) {
            level = sconn->level;
-           LOCK_RXKAD_STATS;
-           rxkad_stats.
-               preparePackets[rxkad_StatIndex(rxkad_server, level)]++;
-           UNLOCK_RXKAD_STATS;
+           INC_RXKAD_STATS(preparePackets[rxkad_StatIndex(rxkad_server, level)]);
            sconn->stats.packetsSent++;
            sconn->stats.bytesSent += len;
            schedule = (fc_KeySchedule *) sconn->keysched;
            ivec = (fc_InitializationVector *) sconn->ivec;
        } else {
-           LOCK_RXKAD_STATS;
-           rxkad_stats.expired++;      /* this is a pretty unlikely path... */
-           UNLOCK_RXKAD_STATS;
+           INC_RXKAD_STATS(expired);   /* this is a pretty unlikely path... */
            return RXKADEXPIRED;
        }
        preSeq = sconn->preSeq;
@@ -457,9 +542,7 @@ rxkad_PreparePacket(struct rx_securityClass *aobj, struct rx_call *acall,
        if (!(tcp->type & rxkad_client))
            return RXKADINCONSISTENCY;
        level = tcp->level;
-       LOCK_RXKAD_STATS;
-       rxkad_stats.preparePackets[rxkad_StatIndex(rxkad_client, level)]++;
-       UNLOCK_RXKAD_STATS;
+       INC_RXKAD_STATS(preparePackets[rxkad_StatIndex(rxkad_client, level)]);
        cconn->stats.packetsSent++;
        cconn->stats.bytesSent += len;
        preSeq = cconn->preSeq;
index bb14d1c..20fb014 100644 (file)
@@ -36,6 +36,7 @@ RCSID
 #include <rx/xdr.h>
 #include <des.h>
 #include <afs/afsutil.h>
+#include <des/stats.h>
 #include "private_data.h"
 #define XPRT_RXKAD_SERVER
 
@@ -160,9 +161,7 @@ rxkad_NewServerSecurityObject(rxkad_level level, char *get_key_rock,
     tsp->user_ok = user_ok;    /* to inform server of client id. */
     init_random_int32();
 
-    LOCK_RXKAD_STATS;
-    rxkad_stats_serverObjects++;
-    UNLOCK_RXKAD_STATS;
+    INC_RXKAD_STATS(serverObjects);
     return tsc;
 }
 
@@ -238,9 +237,7 @@ rxkad_GetChallenge(struct rx_securityClass *aobj, struct rx_connection *aconn,
     rx_packetwrite(apacket, 0, challengeSize, challenge);
     rx_SetDataSize(apacket, challengeSize);
     sconn->tried = 1;
-    LOCK_RXKAD_STATS;
-    rxkad_stats.challengesSent++;
-    UNLOCK_RXKAD_STATS;
+    INC_RXKAD_STATS(challengesSent);
     return 0;
 }
 
@@ -405,9 +402,7 @@ rxkad_CheckResponse(struct rx_securityClass *aobj,
        return RXKADLEVELFAIL;
     sconn->level = level;
     rxkad_SetLevel(aconn, sconn->level);
-    LOCK_RXKAD_STATS;
-    rxkad_stats.responses[rxkad_LevelIndex(sconn->level)]++;
-    UNLOCK_RXKAD_STATS;
+    INC_RXKAD_STATS(responses[rxkad_LevelIndex(sconn->level)]);
     /* now compute endpoint-specific info used for computing 16 bit checksum */
     rxkad_DeriveXORInfo(aconn, sconn->keysched, sconn->ivec, sconn->preSeq);
 
index 4269ce7..b0bfac6 100644 (file)
@@ -79,7 +79,9 @@ xdrrx_create
 xdr_afsuuid
 xdr_int64
 hton_syserr_conv
-rxkad_stats
+rxkad_global_stats
+rxkad_global_stats_lock
+rxkad_stats_key
 _et_list
 et_list_mutex
 com_err
index b152edf..7486e2c 100644 (file)
@@ -54,7 +54,9 @@
        tkt_MakeTicket;
        xdrrx_create;
        hton_syserr_conv;
-       rxkad_stats;
+       rxkad_global_stats;
+       rxkad_global_stats_lock;
+       rxkad_stats_key;
        com_err;
        error_message;
        rx_socket;