]>
git.proxmox.com Git - ceph.git/blob - ceph/src/common/numa.cc
1 // -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*-
2 // vim: ts=8 sw=2 smarttab
10 #include "include/stringify.h"
11 #include "common/safe_io.h"
15 #if defined(__linux__)
16 int parse_cpu_set_list(const char *s
,
23 int a
= strtol(s
, &end
, 10);
29 int b
= strtol(s
, &end
, 10);
39 *cpu_set_size
= a
+ 1;
52 std::string
cpu_set_to_str_list(size_t cpu_set_size
,
53 const cpu_set_t
*cpu_set
)
58 while (a
< cpu_set_size
&& !CPU_ISSET(a
, cpu_set
)) {
61 if (a
>= cpu_set_size
) {
65 while (b
< cpu_set_size
&& CPU_ISSET(b
, cpu_set
)) {
72 r
+= stringify(a
) + "-" + stringify(b
- 1);
81 std::set
<int> cpu_set_to_set(size_t cpu_set_size
,
82 const cpu_set_t
*cpu_set
)
87 while (a
< cpu_set_size
&& !CPU_ISSET(a
, cpu_set
)) {
90 if (a
>= cpu_set_size
) {
94 while (b
< cpu_set_size
&& CPU_ISSET(b
, cpu_set
)) {
106 int get_numa_node_cpu_set(
108 size_t *cpu_set_size
,
111 std::string fn
= "/sys/devices/system/node/node";
112 fn
+= stringify(node
);
114 int fd
= ::open(fn
.c_str(), O_RDONLY
);
119 int r
= safe_read(fd
, &buf
, sizeof(buf
));
124 while (r
> 0 && ::isspace(buf
[--r
])) {
127 r
= parse_cpu_set_list(buf
, cpu_set_size
, cpu_set
);
137 static int easy_readdir(const std::string
& dir
, std::set
<std::string
> *out
)
139 DIR *h
= ::opendir(dir
.c_str());
143 struct dirent
*de
= nullptr;
144 while ((de
= ::readdir(h
))) {
145 if (strcmp(de
->d_name
, ".") == 0 ||
146 strcmp(de
->d_name
, "..") == 0) {
149 out
->insert(de
->d_name
);
155 int set_cpu_affinity_all_threads(size_t cpu_set_size
, cpu_set_t
*cpu_set
)
157 // first set my affinity
158 int r
= sched_setaffinity(getpid(), cpu_set_size
, cpu_set
);
163 // make 2 passes here so that we (hopefully) catch racing threads creating
165 for (unsigned pass
= 0; pass
< 2; ++pass
) {
166 // enumerate all child threads from /proc
167 std::set
<std::string
> ls
;
168 std::string path
= "/proc/"s
+ stringify(getpid()) + "/task";
169 r
= easy_readdir(path
, &ls
);
174 pid_t tid
= atoll(i
.c_str());
178 r
= sched_setaffinity(tid
, cpu_set_size
, cpu_set
);
187 #elif defined(__FreeBSD__)
189 int parse_cpu_set_list(const char *s
,
190 size_t *cpu_set_size
,
196 std::string
cpu_set_to_str_list(size_t cpu_set_size
,
197 const cpu_set_t
*cpu_set
)
202 std::set
<int> cpu_set_to_set(size_t cpu_set_size
,
203 const cpu_set_t
*cpu_set
)
208 int get_numa_node_cpu_set(int node
,
209 size_t *cpu_set_size
,
215 int set_cpu_affinity_all_threads(size_t cpu_set_size
,