@ -23,6 +23,7 @@
*/
*/
# include "suricata-common.h"
# include "suricata-common.h"
# include "suricata.h"
# define _THREAD_AFFINITY
# define _THREAD_AFFINITY
# include "util-affinity.h"
# include "util-affinity.h"
# include "conf.h"
# include "conf.h"
@ -316,6 +317,40 @@ static uint16_t GetNextAvailableCPU(ThreadsAffinityType *taf)
return cpu ;
return cpu ;
}
}
/**
* \ brief Check if CPU affinity configuration node follows format used in Suricata 7 and below
* \ retval true if CPU affinity uses Suricata < = 7.0 , false if it uses the new format ( Suricata
* > = 8.0 )
*/
static bool AffinityConfigIsLegacy ( void )
{
static bool is_using_legacy_affinity_format = false ;
if ( thread_affinity_init_done = = 0 ) {
// reset the flag
is_using_legacy_affinity_format = false ;
} else {
return is_using_legacy_affinity_format ;
}
SCConfNode * root = SCConfGetNode ( " threading.cpu-affinity " ) ;
if ( root = = NULL ) {
return is_using_legacy_affinity_format ;
}
SCConfNode * affinity ;
TAILQ_FOREACH ( affinity , & root - > head , next ) {
// If a child does not contain "-cpu-set", then the conf is legacy
// Names in the legacy format (list of *-cpu-sets) contain
// list item IDs - "0" : "management-cpu-set", "1" : "worker-cpu-set"
if ( strstr ( affinity - > name , " -cpu-set " ) = = NULL ) {
is_using_legacy_affinity_format = true ;
return is_using_legacy_affinity_format ;
}
}
return is_using_legacy_affinity_format ;
}
# endif /* OS_WIN32 and __OpenBSD__ */
# endif /* OS_WIN32 and __OpenBSD__ */
/**
/**
@ -326,6 +361,7 @@ void AffinitySetupLoadFromConfig(void)
# if !defined __CYGWIN__ && !defined OS_WIN32 && !defined __OpenBSD__ && !defined sun
# if !defined __CYGWIN__ && !defined OS_WIN32 && !defined __OpenBSD__ && !defined sun
if ( thread_affinity_init_done = = 0 ) {
if ( thread_affinity_init_done = = 0 ) {
AffinitySetupInit ( ) ;
AffinitySetupInit ( ) ;
AffinityConfigIsLegacy ( ) ;
thread_affinity_init_done = 1 ;
thread_affinity_init_done = 1 ;
}
}
@ -338,7 +374,8 @@ void AffinitySetupLoadFromConfig(void)
SCConfNode * affinity ;
SCConfNode * affinity ;
TAILQ_FOREACH ( affinity , & root - > head , next ) {
TAILQ_FOREACH ( affinity , & root - > head , next ) {
const char * setname = GetAffinitySetName ( affinity - > name ) ;
char * v = AffinityConfigIsLegacy ( ) ? affinity - > val : affinity - > name ;
const char * setname = GetAffinitySetName ( v ) ;
if ( setname = = NULL ) {
if ( setname = = NULL ) {
continue ;
continue ;
}
}
@ -351,16 +388,17 @@ void AffinitySetupLoadFromConfig(void)
SCLogConfig ( " Found CPU affinity definition for \" %s \" " , setname ) ;
SCLogConfig ( " Found CPU affinity definition for \" %s \" " , setname ) ;
SetupCpuSets ( taf , affinity , setname ) ;
SCConfNode * aff_query_node = AffinityConfigIsLegacy ( ) ? affinity - > head . tqh_first : affinity ;
if ( SetupAffinityPriority ( taf , affinity , setname ) < 0 ) {
SetupCpuSets ( taf , aff_query_node , setname ) ;
if ( SetupAffinityPriority ( taf , aff_query_node , setname ) < 0 ) {
SCLogError ( " Failed to setup priority for CPU affinity type: %s " , setname ) ;
SCLogError ( " Failed to setup priority for CPU affinity type: %s " , setname ) ;
continue ;
continue ;
}
}
if ( SetupAffinityMode ( taf , aff inity ) < 0 ) {
if ( SetupAffinityMode ( taf , aff _query_node ) < 0 ) {
SCLogError ( " Failed to setup mode for CPU affinity type: %s " , setname ) ;
SCLogError ( " Failed to setup mode for CPU affinity type: %s " , setname ) ;
continue ;
continue ;
}
}
if ( SetupAffinityThreads ( taf , aff inity ) < 0 ) {
if ( SetupAffinityThreads ( taf , aff _query_node ) < 0 ) {
SCLogError ( " Failed to setup threads for CPU affinity type: %s " , setname ) ;
SCLogError ( " Failed to setup threads for CPU affinity type: %s " , setname ) ;
continue ;
continue ;
}
}