From: Victor Julien Date: Mon, 26 Feb 2024 11:17:15 +0000 (+0100) Subject: detect: optimize sig_cnt setting X-Git-Tag: suricata-8.0.0-beta1~1672 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=c4ac6cdc9a861973d3da5a4015c40210ebb6b3e0;p=thirdparty%2Fsuricata.git detect: optimize sig_cnt setting Utilize _popcnt64 where available. --- diff --git a/configure.ac b/configure.ac index c510e7fccb..1c0a39a5cc 100644 --- a/configure.ac +++ b/configure.ac @@ -219,6 +219,11 @@ [], [ #include ]) + AC_CHECK_DECL([_popcnt64], + AC_DEFINE([HAVE_POPCNT64], [1], [Use _popcnt64]), + [], [ + #include + ]) AC_CHECK_HEADERS([malloc.h]) AC_CHECK_DECL([malloc_trim], diff --git a/src/detect-engine-siggroup.c b/src/detect-engine-siggroup.c index 4be0b1c264..b08218193a 100644 --- a/src/detect-engine-siggroup.c +++ b/src/detect-engine-siggroup.c @@ -437,6 +437,24 @@ error: return -1; } +#ifdef HAVE_POPCNT64 +#include +static uint32_t Popcnt(const uint8_t *array, const uint32_t size) +{ + /* input needs to be a multiple of 8 for u64 casts to work */ + DEBUG_VALIDATE_BUG_ON(size < 8); + DEBUG_VALIDATE_BUG_ON(size % 8); + + uint32_t cnt = 0; + uint64_t *ptr = (uint64_t *)array; + for (uint64_t idx = 0; idx < size; idx += 8) { + cnt += _popcnt64(*ptr); + ptr++; + } + return cnt; +} +#endif + /** * \brief Updates the SigGroupHead->sig_cnt with the total count of all the * Signatures present in this SigGroupHead. @@ -447,14 +465,17 @@ error: */ void SigGroupHeadSetSigCnt(SigGroupHead *sgh, uint32_t max_idx) { - uint32_t sig; sgh->init->max_sig_id = MAX(max_idx, sgh->init->max_sig_id); - sgh->init->sig_cnt = 0; - for (sig = 0; sig < sgh->init->max_sig_id + 1; sig++) { +#ifdef HAVE_POPCNT64 + sgh->init->sig_cnt = Popcnt(sgh->init->sig_array, sgh->init->sig_size); +#else + uint32_t cnt = 0; + for (uint32_t sig = 0; sig < sgh->init->max_sig_id + 1; sig++) { if (sgh->init->sig_array[sig / 8] & (1 << (sig % 8))) - sgh->init->sig_cnt++; + cnt++; } - + sgh->init->sig_cnt = cnt; +#endif return; } diff --git a/src/suricata.c b/src/suricata.c index 213f6d95e9..462537c14e 100644 --- a/src/suricata.c +++ b/src/suricata.c @@ -765,6 +765,9 @@ static void PrintBuildInfo(void) strlcat(features, "RUST ", sizeof(features)); #if defined(SC_ADDRESS_SANITIZER) strlcat(features, "ASAN ", sizeof(features)); +#endif +#if defined(HAVE_POPCNT64) + strlcat(features, "POPCNT64 ", sizeof(features)); #endif if (strlen(features) == 0) { strlcat(features, "none", sizeof(features));