mirror of
https://gitlab.torproject.org/tpo/core/tor.git
synced 2024-12-06 19:41:15 +01:00
r18051@catbus: nickm | 2008-02-12 15:20:43 -0500
Re-tune mempool parametes based on testing on peacetime: use smaller chuncks, free them a little more aggressively, and try very hard to concentrate allocations on fuller chunks. Also, lots of new documentation. svn:r13484
This commit is contained in:
@@ -28,8 +28,13 @@ const char aes_c_id[] = "$Id$";
|
||||
/* We have 3 strategies for getting AES: Via OpenSSL's AES_encrypt function,
|
||||
* via OpenSSL's EVP_EncryptUpdate function, or via the built-in AES
|
||||
* implementation below. */
|
||||
|
||||
/** Defined iff we're using openssl's AES functions for AES. */
|
||||
#undef USE_OPENSSL_AES
|
||||
/** Defined iff we're using openssl's EVP code for AES. */
|
||||
#undef USE_OPENSSL_EVP
|
||||
/** Defined iff we're using Tor's internal AES implementation, defined
|
||||
* below. */
|
||||
#undef USE_BUILTIN_AES
|
||||
|
||||
/* Figure out our CPU type. We use this to pick an AES implementation.
|
||||
@@ -130,6 +135,7 @@ static void rijndaelEncrypt(const u32 rk[/*4*(Nr + 1)*/], int Nr,
|
||||
/*======================================================================*/
|
||||
/* Interface to AES code, and counter implementation */
|
||||
|
||||
/** Implements an aes counter-mode cipher. */
|
||||
struct aes_cnt_cipher {
|
||||
/** This next element (howevever it's defined) is the AES key. */
|
||||
#if defined(USE_OPENSSL_EVP)
|
||||
|
||||
@@ -330,6 +330,7 @@ struct sockaddr_in6 {
|
||||
|
||||
typedef uint8_t maskbits_t;
|
||||
struct in_addr;
|
||||
/** DOCDOC */
|
||||
typedef struct tor_addr_t
|
||||
{
|
||||
sa_family_t family;
|
||||
|
||||
+13
-17
@@ -12,7 +12,7 @@
|
||||
#define MEMPOOL_PRIVATE
|
||||
#include "mempool.h"
|
||||
|
||||
//#define LAZY_CHUNK_SORT
|
||||
#define LAZY_CHUNK_SORT
|
||||
|
||||
/* OVERVIEW:
|
||||
*
|
||||
@@ -193,7 +193,9 @@ mp_chunk_new(mp_pool_t *pool)
|
||||
return chunk;
|
||||
}
|
||||
|
||||
/** DOCDOC */
|
||||
/** Take a <b>chunk</b> that has just been allocated or removed from
|
||||
* <b>pool</b>'s empty chunk list, and add it to the head of the used chunk
|
||||
* list. */
|
||||
static INLINE void
|
||||
add_newly_used_chunk_to_used_list(mp_pool_t *pool, mp_chunk_t *chunk)
|
||||
{
|
||||
@@ -347,7 +349,6 @@ mp_pool_release(void *item)
|
||||
|
||||
++pool->n_empty_chunks;
|
||||
}
|
||||
|
||||
--chunk->n_allocated;
|
||||
}
|
||||
|
||||
@@ -404,7 +405,8 @@ mp_pool_new(size_t item_size, size_t chunk_capacity)
|
||||
}
|
||||
|
||||
#ifdef LAZY_CHUNK_SORT
|
||||
/** DOCDOC */
|
||||
/** Helper function for qsort: used to sort pointers to mp_chunk_t into
|
||||
* descending order of fullness. */
|
||||
static int
|
||||
mp_pool_sort_used_chunks_helper(const void *_a, const void *_b)
|
||||
{
|
||||
@@ -413,7 +415,9 @@ mp_pool_sort_used_chunks_helper(const void *_a, const void *_b)
|
||||
return b->n_allocated - a->n_allocated;
|
||||
}
|
||||
|
||||
/** DOCDOC */
|
||||
/** Sort the used chunks in <b>pool</b> into descending order of fullness,
|
||||
* so that we preferentially fill up mostly full chunks before we make
|
||||
* nearly empty chunks less nearly empty. */
|
||||
static void
|
||||
mp_pool_sort_used_chunks(mp_pool_t *pool)
|
||||
{
|
||||
@@ -426,7 +430,6 @@ mp_pool_sort_used_chunks(mp_pool_t *pool)
|
||||
}
|
||||
if (!inverted)
|
||||
return;
|
||||
ASSERT(n);
|
||||
//printf("Sort %d/%d\n",inverted,n);
|
||||
chunks = ALLOC(sizeof(mp_chunk_t *)*n);
|
||||
#ifdef ALLOC_CAN_RETURN_NULL
|
||||
@@ -456,12 +459,9 @@ mp_pool_sort_used_chunks(mp_pool_t *pool)
|
||||
#endif
|
||||
|
||||
/** If there are more than <b>n</b> empty chunks in <b>pool</b>, free the
|
||||
* excess ones that have been empty for the longest. (If <b>n</b> is less
|
||||
* than zero, free only empty chunks that were not used since the last
|
||||
* call to mp_pool_clean(), leaving only -<b>n</b>.)
|
||||
* DOCDOC Keep_recently_used, n_to_keep
|
||||
* XXXX020 maybe dump negative n_to_keep behavior, if k_r_u turns out to be
|
||||
* smarter.
|
||||
* excess ones that have been empty for the longest. If
|
||||
* <b>keep_recently_used</b> is true, do not free chunks unless they have been
|
||||
* empty since the last call to this function.
|
||||
**/
|
||||
void
|
||||
mp_pool_clean(mp_pool_t *pool, int n_to_keep, int keep_recently_used)
|
||||
@@ -471,12 +471,8 @@ mp_pool_clean(mp_pool_t *pool, int n_to_keep, int keep_recently_used)
|
||||
#ifdef LAZY_CHUNK_SORT
|
||||
mp_pool_sort_used_chunks(pool);
|
||||
#endif
|
||||
ASSERT(n_to_keep >= 0);
|
||||
|
||||
if (n_to_keep < 0) {
|
||||
/* As said in the documentation, "negative n" means "leave an additional
|
||||
* -n chunks". So replace n with a positive number. */
|
||||
n_to_keep = pool->min_empty_chunks + (-n_to_keep);
|
||||
}
|
||||
if (keep_recently_used) {
|
||||
int n_recently_used = pool->n_empty_chunks - pool->min_empty_chunks;
|
||||
if (n_to_keep < n_recently_used)
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
/* $Id$ */
|
||||
|
||||
/**
|
||||
* \file util.h
|
||||
* \file mempool.h
|
||||
* \brief Headers for mempool.c
|
||||
**/
|
||||
|
||||
|
||||
+11
-5
@@ -1105,8 +1105,13 @@ log_cert_lifetime(X509 *cert, const char *problem)
|
||||
tor_free(s2);
|
||||
}
|
||||
|
||||
/** DOCDOC helper.
|
||||
* cert_out needs to be freed. id_cert_out doesn't. */
|
||||
/** Helper function: try to extract a link certificate and an identity
|
||||
* certificate from <b>tls</b>, and store them in *<b>cert_out</b> and
|
||||
* *<b>id_cert_out</b> respectively. Log all messages at level
|
||||
* <b>severity</b>.
|
||||
*
|
||||
* Note that a reference is added to cert_out, so it needs to be
|
||||
* freed. id_cert_out doesn't. */
|
||||
static void
|
||||
try_to_extract_certs_from_tls(int severity, tor_tls_t *tls,
|
||||
X509 **cert_out, X509 **id_cert_out)
|
||||
@@ -1141,12 +1146,12 @@ try_to_extract_certs_from_tls(int severity, tor_tls_t *tls,
|
||||
}
|
||||
|
||||
/** If the provided tls connection is authenticated and has a
|
||||
* certificate that is currently valid and signed, then set
|
||||
* certificate chain that is currently valid and signed, then set
|
||||
* *<b>identity_key</b> to the identity certificate's key and return
|
||||
* 0. Else, return -1 and log complaints with log-level <b>severity</b>.
|
||||
*/
|
||||
int
|
||||
tor_tls_verify_v1(int severity, tor_tls_t *tls, crypto_pk_env_t **identity_key)
|
||||
tor_tls_verify(int severity, tor_tls_t *tls, crypto_pk_env_t **identity_key)
|
||||
{
|
||||
X509 *cert = NULL, *id_cert = NULL;
|
||||
EVP_PKEY *id_pkey = NULL;
|
||||
@@ -1279,7 +1284,8 @@ _check_no_tls_errors(const char *fname, int line)
|
||||
tls_log_errors(LOG_WARN, NULL);
|
||||
}
|
||||
|
||||
/**DOCDOC */
|
||||
/** Return true iff the initial TLS connection at <b>tls</b> did not use a v2
|
||||
* TLS handshake. Output undefined if the handshake isn't finished. */
|
||||
int
|
||||
tor_tls_used_v1_handshake(tor_tls_t *tls)
|
||||
{
|
||||
|
||||
+1
-2
@@ -55,8 +55,7 @@ void tor_tls_set_renegotiate_callback(tor_tls_t *tls,
|
||||
int tor_tls_is_server(tor_tls_t *tls);
|
||||
void tor_tls_free(tor_tls_t *tls);
|
||||
int tor_tls_peer_has_cert(tor_tls_t *tls);
|
||||
int tor_tls_verify_v1(int severity, tor_tls_t *tls,
|
||||
crypto_pk_env_t **identity);
|
||||
int tor_tls_verify(int severity, tor_tls_t *tls, crypto_pk_env_t **identity);
|
||||
int tor_tls_check_lifetime(tor_tls_t *tls, int tolerance);
|
||||
int tor_tls_read(tor_tls_t *tls, char *cp, size_t len);
|
||||
int tor_tls_write(tor_tls_t *tls, const char *cp, size_t n);
|
||||
|
||||
Reference in New Issue
Block a user