diff options
author | Vsevolod Stakhov <vsevolod@highsecure.ru> | 2017-10-26 15:52:11 +0100 |
---|---|---|
committer | Vsevolod Stakhov <vsevolod@highsecure.ru> | 2017-10-26 15:52:42 +0100 |
commit | 22d602b81fe3315007075f7807bb9d944a72cb94 (patch) | |
tree | 1841992bbb7f8457d8c2b07ad2cb6ab57facc523 /src | |
parent | b08a65087f4ec74b6076038d26bf084bb485973c (diff) | |
download | rspamd-22d602b81fe3315007075f7807bb9d944a72cb94.tar.gz rspamd-22d602b81fe3315007075f7807bb9d944a72cb94.zip |
[Feature] Use rdtsc where possible
Diffstat (limited to 'src')
-rw-r--r-- | src/client/rspamc.c | 2 | ||||
-rw-r--r-- | src/client/rspamdclient.c | 4 | ||||
-rw-r--r-- | src/libserver/protocol.c | 2 | ||||
-rw-r--r-- | src/libserver/re_cache.c | 4 | ||||
-rw-r--r-- | src/libserver/symbols_cache.c | 16 | ||||
-rw-r--r-- | src/libserver/task.c | 2 | ||||
-rw-r--r-- | src/libutil/expression.c | 4 | ||||
-rw-r--r-- | src/libutil/util.c | 27 | ||||
-rw-r--r-- | src/libutil/util.h | 2 | ||||
-rw-r--r-- | src/lua/lua_util.c | 7 |
10 files changed, 45 insertions, 25 deletions
diff --git a/src/client/rspamc.c b/src/client/rspamc.c index bd199fda3..08c23a1b8 100644 --- a/src/client/rspamc.c +++ b/src/client/rspamc.c @@ -1481,7 +1481,7 @@ rspamc_client_cb (struct rspamd_client_connection *conn, struct rspamc_callback_data *cbdata = (struct rspamc_callback_data *)ud; struct rspamc_command *cmd; FILE *out = stdout; - gdouble finish = rspamd_get_ticks (), diff; + gdouble finish = rspamd_get_ticks (FALSE), diff; const gchar *body; gsize body_len; diff --git a/src/client/rspamdclient.c b/src/client/rspamdclient.c index 7ea096183..4a58b3628 100644 --- a/src/client/rspamdclient.c +++ b/src/client/rspamdclient.c @@ -114,7 +114,7 @@ rspamd_client_finish_handler (struct rspamd_http_connection *conn, if (!c->req_sent) { c->req_sent = TRUE; - c->send_time = rspamd_get_ticks (); + c->send_time = rspamd_get_ticks (FALSE); rspamd_http_connection_reset (c->http_conn); rspamd_http_connection_read_message (c->http_conn, c->req, @@ -435,7 +435,7 @@ rspamd_client_command (struct rspamd_client_connection *conn, req->msg->url = rspamd_fstring_append (req->msg->url, command, strlen (command)); conn->req = req; - conn->start_time = rspamd_get_ticks (); + conn->start_time = rspamd_get_ticks (FALSE); if (compressed) { rspamd_http_connection_write_message (conn->http_conn, req->msg, NULL, diff --git a/src/libserver/protocol.c b/src/libserver/protocol.c index 6180adccb..d8973dea6 100644 --- a/src/libserver/protocol.c +++ b/src/libserver/protocol.c @@ -1126,7 +1126,7 @@ rspamd_protocol_write_ucl (struct rspamd_task *task, cached, rspamd_protocol_cached_dtor); /* We also set scan time here */ - task->time_real_finish = rspamd_get_ticks (); + task->time_real_finish = rspamd_get_ticks (FALSE); task->time_virtual_finish = rspamd_get_virtual_ticks (); } diff --git a/src/libserver/re_cache.c b/src/libserver/re_cache.c index c51caff8f..d34cc6824 100644 --- a/src/libserver/re_cache.c +++ b/src/libserver/re_cache.c @@ -508,7 +508,7 @@ rspamd_re_cache_process_pcre (struct rspamd_re_runtime *rt, pr = rspamd_random_double_fast (); if (pr > 0.9) { - t1 = rspamd_get_ticks (); + t1 = rspamd_get_ticks (TRUE); } while (rspamd_regexp_search (re, @@ -536,7 +536,7 @@ rspamd_re_cache_process_pcre (struct rspamd_re_runtime *rt, } if (pr > 0.9) { - t2 = rspamd_get_ticks (); + t2 = rspamd_get_ticks (TRUE); if (t2 - t1 > slow_time) { msg_info_task ("regexp '%16s' took %.2f seconds to execute", diff --git a/src/libserver/symbols_cache.c b/src/libserver/symbols_cache.c index de0a806fa..ece7895da 100644 --- a/src/libserver/symbols_cache.c +++ b/src/libserver/symbols_cache.c @@ -1270,7 +1270,7 @@ rspamd_symbols_cache_check_symbol (struct rspamd_task *task, struct rspamd_task **ptask; lua_State *L; gboolean check = TRUE; - const gdouble slow_diff_limit = 1e5; + const gdouble slow_diff_limit = 1e7; if (item->func) { @@ -1309,10 +1309,10 @@ rspamd_symbols_cache_check_symbol (struct rspamd_task *task, rspamd_symbols_cache_watcher_cb, item); msg_debug_task ("execute %s, %d", item->symbol, item->id); - t1 = rspamd_get_ticks (); + t1 = rspamd_get_ticks (TRUE); item->func (task, item->user_data); - t2 = rspamd_get_ticks (); - diff = (t2 - t1) * 1e6; + t2 = rspamd_get_ticks (TRUE); + diff = (t2 - t1); if (G_UNLIKELY (RSPAMD_TASK_IS_PROFILING (task))) { rspamd_task_profile_set (task, item->symbol, diff); @@ -1323,8 +1323,8 @@ rspamd_symbols_cache_check_symbol (struct rspamd_task *task, } if (diff > slow_diff_limit) { - msg_info_task ("slow rule: %s: %d ms", item->symbol, - (gint)(diff / 1000.)); + msg_info_task ("slow rule: %s: %.0f ticks", item->symbol, + diff); } if (rspamd_worker_is_normal (task->worker)) { @@ -2038,7 +2038,7 @@ rspamd_symbols_cache_resort_cb (gint fd, short what, gpointer ud) cache = cbdata->cache; /* Plan new event */ tm = rspamd_time_jitter (cache->reload_time, 0); - cur_ticks = rspamd_get_ticks (); + cur_ticks = rspamd_get_ticks (TRUE); msg_debug_cache ("resort symbols cache, next reload in %.2f seconds", tm); g_assert (cache != NULL); evtimer_set (&cbdata->resort_ev, rspamd_symbols_cache_resort_cb, cbdata); @@ -2138,7 +2138,7 @@ rspamd_symbols_cache_start_refresh (struct symbols_cache * cache, struct rspamd_cache_refresh_cbdata *cbdata; cbdata = rspamd_mempool_alloc0 (cache->static_pool, sizeof (*cbdata)); - cbdata->last_resort = rspamd_get_ticks (); + cbdata->last_resort = rspamd_get_ticks (TRUE); cbdata->ev_base = ev_base; cbdata->w = w; cbdata->cache = cache; diff --git a/src/libserver/task.c b/src/libserver/task.c index 04ce2b759..8bb8ecaa0 100644 --- a/src/libserver/task.c +++ b/src/libserver/task.c @@ -80,7 +80,7 @@ rspamd_task_new (struct rspamd_worker *worker, struct rspamd_config *cfg, } gettimeofday (&new_task->tv, NULL); - new_task->time_real = rspamd_get_ticks (); + new_task->time_real = rspamd_get_ticks (FALSE); new_task->time_virtual = rspamd_get_virtual_ticks (); if (pool == NULL) { diff --git a/src/libutil/expression.c b/src/libutil/expression.c index b49935cb4..dae574da5 100644 --- a/src/libutil/expression.c +++ b/src/libutil/expression.c @@ -1007,7 +1007,7 @@ rspamd_ast_process_node (struct rspamd_expression *expr, gint flags, GNode *node */ if ((expr->evals & 0x1F) == (GPOINTER_TO_UINT (node) >> 4 & 0x1F)) { calc_ticks = TRUE; - t1 = rspamd_get_ticks (); + t1 = rspamd_get_ticks (TRUE); } elt->value = expr->subr->process (data, elt->p.atom); @@ -1021,7 +1021,7 @@ rspamd_ast_process_node (struct rspamd_expression *expr, gint flags, GNode *node } if (calc_ticks) { - t2 = rspamd_get_ticks (); + t2 = rspamd_get_ticks (TRUE); elt->p.atom->avg_ticks += ((t2 - t1) - elt->p.atom->avg_ticks) / (expr->evals); } diff --git a/src/libutil/util.c b/src/libutil/util.c index f2d9d41b0..f022b4689 100644 --- a/src/libutil/util.c +++ b/src/libutil/util.c @@ -70,6 +70,9 @@ #ifdef HAVE_SYS_RESOURCE_H #include <sys/resource.h> #endif +#ifdef HAVE_RDTSCP +#include <x86intrin.h> +#endif #include <math.h> /* for pow */ #include "cryptobox.h" @@ -1761,24 +1764,36 @@ restart: } gdouble -rspamd_get_ticks (void) +rspamd_get_ticks (gboolean rdtsc_ok) { gdouble res; +#ifdef HAVE_RDTSCP + guint tmp; + guint64 r64; + + if (rdtsc_ok) { + r64 = __builtin_ia32_rdtscp (&tmp); + /* Preserve lower 52 bits */ + res = r64 & ((1ULL << 53) - 1); + return res; + } + +#endif #ifdef HAVE_CLOCK_GETTIME struct timespec ts; gint clk_id = CLOCK_MONOTONIC; -#ifdef CLOCK_MONOTONIC_FAST +# ifdef CLOCK_MONOTONIC_FAST clk_id = CLOCK_MONOTONIC_FAST; -#endif -#ifdef CLOCK_MONOTONIC_COARSE +# endif +# ifdef CLOCK_MONOTONIC_COARSE clk_id = CLOCK_MONOTONIC_COARSE; -#endif +# endif clock_gettime (clk_id, &ts); res = (double)ts.tv_sec + ts.tv_nsec / 1000000000.; -#elif defined(__APPLE__) +# elif defined(__APPLE__) res = mach_absolute_time () / 1000000000.; #else struct timeval tv; diff --git a/src/libutil/util.h b/src/libutil/util.h index d8a1eae60..ab677210e 100644 --- a/src/libutil/util.h +++ b/src/libutil/util.h @@ -295,7 +295,7 @@ gint rspamd_read_passphrase (gchar *buf, gint size, gint rwflag, gpointer key); * Portably return the current clock ticks as seconds * @return */ -gdouble rspamd_get_ticks (void); +gdouble rspamd_get_ticks (gboolean rdtsc_ok); /** * Portably return the current virtual clock ticks as seconds diff --git a/src/lua/lua_util.c b/src/lua/lua_util.c index 538c8d9f7..b2041c704 100644 --- a/src/lua/lua_util.c +++ b/src/lua/lua_util.c @@ -1439,8 +1439,13 @@ static gint lua_util_get_ticks (lua_State *L) { gdouble ticks; + gboolean rdtsc = FALSE; - ticks = rspamd_get_ticks (); + if (lua_isboolean (L, 1)) { + rdtsc = lua_toboolean (L, 1); + } + + ticks = rspamd_get_ticks (rdtsc); lua_pushnumber (L, ticks); return 1; |