blob: e4310b696dd380cab365dd85df57f0802c908cdd [file] [log] [blame]
Amaury Denoyellef75c6402021-04-14 15:03:51 +02001#define _GNU_SOURCE
2#include <sched.h>
3
4#include <haproxy/compat.h>
5#include <haproxy/cpuset.h>
6#include <haproxy/intops.h>
7
8void ha_cpuset_zero(struct hap_cpuset *set)
9{
10#if defined(CPUSET_USE_CPUSET) || defined(CPUSET_USE_FREEBSD_CPUSET)
11 CPU_ZERO(&set->cpuset);
12
13#elif defined(CPUSET_USE_ULONG)
14 set->cpuset = 0;
15#endif
16}
17
18int ha_cpuset_set(struct hap_cpuset *set, int cpu)
19{
20 if (cpu >= ha_cpuset_size())
21 return 1;
22
23#if defined(CPUSET_USE_CPUSET) || defined(CPUSET_USE_FREEBSD_CPUSET)
24 CPU_SET(cpu, &set->cpuset);
25 return 0;
26
27#elif defined(CPUSET_USE_ULONG)
28 set->cpuset |= (0x1 << cpu);
29 return 0;
30#endif
31}
32
33int ha_cpuset_clr(struct hap_cpuset *set, int cpu)
34{
35 if (cpu >= ha_cpuset_size())
36 return 1;
37
38#if defined(CPUSET_USE_CPUSET) || defined(CPUSET_USE_FREEBSD_CPUSET)
39 CPU_CLR(cpu, &set->cpuset);
40 return 0;
41
42#elif defined(CPUSET_USE_ULONG)
43 set->cpuset &= ~(0x1 << cpu);
44 return 0;
45#endif
46}
47
48void ha_cpuset_and(struct hap_cpuset *dst, const struct hap_cpuset *src)
49{
50#if defined(CPUSET_USE_CPUSET)
51 CPU_AND(&dst->cpuset, &dst->cpuset, &src->cpuset);
52
53#elif defined(CPUSET_USE_FREEBSD_CPUSET)
54 CPU_AND(&dst->cpuset, &src->cpuset);
55
56#elif defined(CPUSET_USE_ULONG)
57 dst->cpuset &= src->cpuset;
58#endif
59}
60
61int ha_cpuset_count(const struct hap_cpuset *set)
62{
63#if defined(CPUSET_USE_CPUSET) || defined(CPUSET_USE_FREEBSD_CPUSET)
64 return CPU_COUNT(&set->cpuset);
65
66#elif defined(CPUSET_USE_ULONG)
67 return my_popcountl(set->cpuset);
68#endif
69}
70
71int ha_cpuset_ffs(const struct hap_cpuset *set)
72{
73#if defined(CPUSET_USE_CPUSET)
74 int n;
75
76 if (!CPU_COUNT(&set->cpuset))
77 return 0;
78
79 for (n = 0; !CPU_ISSET(n, &set->cpuset); ++n)
80 ;
81
82 return n + 1;
83
84#elif defined(CPUSET_USE_FREEBSD_CPUSET)
85 return CPU_FFS(&set->cpuset);
86
87#elif defined(CPUSET_USE_ULONG)
88 if (!set->cpuset)
89 return 0;
90
91 return my_ffsl(set->cpuset);
92#endif
93}
94
95void ha_cpuset_assign(struct hap_cpuset *dst, const struct hap_cpuset *src)
96{
97#if defined(CPUSET_USE_CPUSET)
98 CPU_ZERO(&dst->cpuset);
99 CPU_OR(&dst->cpuset, &dst->cpuset, &src->cpuset);
100
101#elif defined(CPUSET_USE_FREEBSD_CPUSET)
102 CPU_COPY(&src->cpuset, &dst->cpuset);
103
104#elif defined(CPUSET_USE_ULONG)
105 dst->cpuset = src->cpuset;
106#endif
107}
108
109int ha_cpuset_size()
110{
111#if defined(CPUSET_USE_CPUSET)
112 return CPU_SETSIZE;
113
114#elif defined(CPUSET_USE_FREEBSD_CPUSET)
115 return MAXCPU;
116
117#elif defined(CPUSET_USE_ULONG)
118 return LONGBITS;
119
120#endif
121}