suricata
util-affinity.h
Go to the documentation of this file.
1 /* Copyright (C) 2010 Open Information Security Foundation
2  *
3  * You can copy, redistribute or modify this Program under the terms of
4  * the GNU General Public License version 2 as published by the Free
5  * Software Foundation.
6  *
7  * This program is distributed in the hope that it will be useful,
8  * but WITHOUT ANY WARRANTY; without even the implied warranty of
9  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
10  * GNU General Public License for more details.
11  *
12  * You should have received a copy of the GNU General Public License
13  * version 2 along with this program; if not, write to the Free Software
14  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
15  * 02110-1301, USA.
16  */
17 
18 /**
19  * \file
20  *
21  * \author Eric Leblond <eric@regit.org>
22  */
23 
24 #ifndef SURICATA_UTIL_AFFINITY_H
25 #define SURICATA_UTIL_AFFINITY_H
26 #include "suricata-common.h"
27 #include "conf.h"
28 #include "threads.h"
29 #include "threadvars.h"
30 
31 #ifdef HAVE_HWLOC
32 #include <hwloc.h>
33 #endif /* HAVE_HWLOC */
34 
35 #if defined OS_FREEBSD
36 #include <sched.h>
37 #include <sys/param.h>
38 #include <sys/resource.h>
39 #include <sys/cpuset.h>
40 #include <sys/thr.h>
41 #define cpu_set_t cpuset_t
42 #elif defined __OpenBSD__
43 #include <sched.h>
44 #include <sys/param.h>
45 #include <sys/resource.h>
46 #elif defined OS_DARWIN
47 #include <mach/mach.h>
48 #include <mach/mach_init.h>
49 #include <mach/thread_policy.h>
50 #define cpu_set_t thread_affinity_policy_data_t
51 #define CPU_SET(cpu_id, new_mask) (*(new_mask)).affinity_tag = (cpu_id + 1)
52 #define CPU_ISSET(cpu_id, new_mask) ((*(new_mask)).affinity_tag == (cpu_id + 1))
53 #define CPU_ZERO(new_mask) (*(new_mask)).affinity_tag = THREAD_AFFINITY_TAG_NULL
54 #endif
55 
56 enum {
62 };
63 
64 enum {
68 };
69 
70 #define MAX_NUMA_NODES 16
71 
72 typedef struct ThreadsAffinityType_ {
73  const char *name;
75  struct ThreadsAffinityType_ *parent; // e.g. worker-cpu-set for interfaces
77 
78 #if !defined __CYGWIN__ && !defined OS_WIN32 && !defined __OpenBSD__ && !defined sun
79  cpu_set_t cpu_set;
80  cpu_set_t lowprio_cpu;
81  cpu_set_t medprio_cpu;
82  cpu_set_t hiprio_cpu;
83 #endif
84  int prio;
85  uint32_t nb_threads;
86  uint32_t nb_children;
88  uint16_t lcpu[MAX_NUMA_NODES]; /* use by exclusive mode */
89  uint8_t mode_flag;
90  // a flag to avoid multiple warnings when no CPU is set
93 
94 /** store thread affinity mode for all type of threads */
95 #ifndef _THREAD_AFFINITY
97 #endif
98 
100 void AffinitySetupLoadFromConfig(void);
102  const char *name, const char *interface_name);
103 ThreadsAffinityType *GetAffinityTypeForNameAndIface(const char *name, const char *interface_name);
105  ThreadsAffinityType *parent, const char *interface_name);
106 
107 void TopologyDestroy(void);
110 #ifdef HAVE_DPDK
111 uint16_t UtilAffinityCpusOverlap(ThreadsAffinityType *taf1, ThreadsAffinityType *taf2);
112 void UtilAffinityCpusExclude(ThreadsAffinityType *mod_taf, ThreadsAffinityType *static_taf);
113 #endif /* HAVE_DPDK */
114 
116  const char *name, SCConfNode *node, void (*Callback)(int i, void *data), void *data);
117 
118 #ifdef UNITTESTS
120 #endif
121 
122 #endif /* SURICATA_UTIL_AFFINITY_H */
ThreadsAffinityType_::medprio_cpu
cpu_set_t medprio_cpu
Definition: util-affinity.h:81
WORKER_CPU_SET
@ WORKER_CPU_SET
Definition: util-affinity.h:58
ThreadsAffinityType_::nb_threads
uint32_t nb_threads
Definition: util-affinity.h:85
MANAGEMENT_CPU_SET
@ MANAGEMENT_CPU_SET
Definition: util-affinity.h:60
UtilAffinityGetAffinedCPUNum
uint16_t UtilAffinityGetAffinedCPUNum(ThreadsAffinityType *taf)
Return the total number of CPUs in a given affinity.
Definition: util-affinity.c:1043
FindAffinityByInterface
ThreadsAffinityType * FindAffinityByInterface(ThreadsAffinityType *parent, const char *interface_name)
Definition: util-affinity.c:113
ThreadsAffinityType_::lcpu
uint16_t lcpu[MAX_NUMA_NODES]
Definition: util-affinity.h:88
MAX_NUMA_NODES
#define MAX_NUMA_NODES
Definition: util-affinity.h:70
GetOrAllocAffinityTypeForIfaceOfName
ThreadsAffinityType * GetOrAllocAffinityTypeForIfaceOfName(const char *name, const char *interface_name)
Finds affinity by its name and interface name. Interfaces are children of cpu-set names....
Definition: util-affinity.c:177
ThreadsAffinityType_::lowprio_cpu
cpu_set_t lowprio_cpu
Definition: util-affinity.h:80
threads.h
ThreadsAffinityType
struct ThreadsAffinityType_ ThreadsAffinityType
MAX_AFFINITY
@ MAX_AFFINITY
Definition: util-affinity.h:67
ThreadsAffinityType_::nb_children
uint32_t nb_children
Definition: util-affinity.h:86
VERDICT_CPU_SET
@ VERDICT_CPU_SET
Definition: util-affinity.h:59
AffinityGetNextCPU
uint16_t AffinityGetNextCPU(ThreadVars *tv, ThreadsAffinityType *taf)
Definition: util-affinity.c:1006
ThreadsAffinityType_::hiprio_cpu
cpu_set_t hiprio_cpu
Definition: util-affinity.h:82
ThreadingAffinityRegisterTests
void ThreadingAffinityRegisterTests(void)
Register all threading affinity unit tests.
Definition: util-affinity.c:1992
BALANCED_AFFINITY
@ BALANCED_AFFINITY
Definition: util-affinity.h:65
ThreadVars_
Per thread variable structure.
Definition: threadvars.h:58
thread_affinity
ThreadsAffinityType thread_affinity[MAX_CPU_SET]
Definition: util-affinity.c:38
GetAffinityTypeForNameAndIface
ThreadsAffinityType * GetAffinityTypeForNameAndIface(const char *name, const char *interface_name)
Find affinity by name (*-cpu-set name) and an interface name.
Definition: util-affinity.c:138
ThreadsAffinityType_::nocpu_warned
bool nocpu_warned
Definition: util-affinity.h:91
conf.h
BuildCpusetWithCallback
int BuildCpusetWithCallback(const char *name, SCConfNode *node, void(*Callback)(int i, void *data), void *data)
Definition: util-affinity.c:227
ThreadsAffinityType_::cpu_set
cpu_set_t cpu_set
Definition: util-affinity.h:79
ThreadsAffinityType_::mode_flag
uint8_t mode_flag
Definition: util-affinity.h:89
ThreadsAffinityType_::parent
struct ThreadsAffinityType_ * parent
Definition: util-affinity.h:75
name
const char * name
Definition: tm-threads.c:2163
RECEIVE_CPU_SET
@ RECEIVE_CPU_SET
Definition: util-affinity.h:57
ThreadsAffinityType_::name
const char * name
Definition: util-affinity.h:73
suricata-common.h
ThreadsAffinityType_::children
struct ThreadsAffinityType_ ** children
Definition: util-affinity.h:74
tv
ThreadVars * tv
Definition: fuzz_decodepcapfile.c:32
threadvars.h
ThreadsAffinityType_
Definition: util-affinity.h:72
TopologyDestroy
void TopologyDestroy(void)
MAX_CPU_SET
@ MAX_CPU_SET
Definition: util-affinity.h:61
AffinitySetupLoadFromConfig
void AffinitySetupLoadFromConfig(void)
Extract CPU affinity configuration from current config file.
Definition: util-affinity.c:588
ThreadsAffinityType_::nb_children_capacity
uint32_t nb_children_capacity
Definition: util-affinity.h:87
ThreadsAffinityType_::taf_mutex
SCMutex taf_mutex
Definition: util-affinity.h:76
ThreadsAffinityType_::prio
int prio
Definition: util-affinity.h:84
SCConfNode_
Definition: conf.h:37
EXCLUSIVE_AFFINITY
@ EXCLUSIVE_AFFINITY
Definition: util-affinity.h:66
SCMutex
#define SCMutex
Definition: threads-debug.h:114
AffinityGetYamlPath
char * AffinityGetYamlPath(ThreadsAffinityType *taf)
Get the YAML path for the given affinity type. The path is built using the parent name (if available)...
Definition: util-affinity.c:429