]>
Commit | Line | Data |
---|---|---|
1 | /* | |
2 | * Copyright (C) 1996-2025 The Squid Software Foundation and contributors | |
3 | * | |
4 | * Squid software is distributed under GPLv2+ license and includes | |
5 | * contributions from numerous individuals and organizations. | |
6 | * Please see the COPYING and CONTRIBUTORS files for details. | |
7 | */ | |
8 | ||
9 | /* DEBUG: section 54 Interprocess Communication */ | |
10 | ||
11 | #include "squid.h" | |
12 | #include "base/TextException.h" | |
13 | #include "CpuAffinitySet.h" | |
14 | #include "debug/Stream.h" | |
15 | #include "util.h" | |
16 | ||
17 | #include <cerrno> | |
18 | #include <cstring> | |
19 | ||
20 | CpuAffinitySet::CpuAffinitySet() | |
21 | { | |
22 | CPU_ZERO(&theCpuSet); | |
23 | CPU_ZERO(&theOrigCpuSet); | |
24 | } | |
25 | ||
26 | void | |
27 | CpuAffinitySet::apply() | |
28 | { | |
29 | Must(CPU_COUNT(&theCpuSet) > 0); // CPU affinity mask set | |
30 | Must(!applied()); | |
31 | ||
32 | bool success = false; | |
33 | if (sched_getaffinity(0, sizeof(theOrigCpuSet), &theOrigCpuSet)) { | |
34 | int xerrno = errno; | |
35 | debugs(54, DBG_IMPORTANT, "ERROR: failed to get CPU affinity for " | |
36 | "process PID " << getpid() << ", ignoring CPU affinity for " | |
37 | "this process: " << xstrerr(xerrno)); | |
38 | } else { | |
39 | cpu_set_t cpuSet; | |
40 | memcpy(&cpuSet, &theCpuSet, sizeof(cpuSet)); | |
41 | CPU_AND(&cpuSet, &cpuSet, &theOrigCpuSet); | |
42 | if (CPU_COUNT(&cpuSet) <= 0) { | |
43 | debugs(54, DBG_IMPORTANT, "ERROR: invalid CPU affinity for process " | |
44 | "PID " << getpid() << ", may be caused by an invalid core in " | |
45 | "'cpu_affinity_map' or by external affinity restrictions"); | |
46 | } else if (sched_setaffinity(0, sizeof(cpuSet), &cpuSet)) { | |
47 | int xerrno = errno; | |
48 | debugs(54, DBG_IMPORTANT, "ERROR: failed to set CPU affinity for " | |
49 | "process PID " << getpid() << ": " << xstrerr(xerrno)); | |
50 | } else | |
51 | success = true; | |
52 | } | |
53 | if (!success) | |
54 | CPU_ZERO(&theOrigCpuSet); | |
55 | } | |
56 | ||
57 | void | |
58 | CpuAffinitySet::undo() | |
59 | { | |
60 | if (applied()) { | |
61 | if (sched_setaffinity(0, sizeof(theOrigCpuSet), &theOrigCpuSet)) { | |
62 | int xerrno = errno; | |
63 | debugs(54, DBG_IMPORTANT, "ERROR: failed to restore original CPU " | |
64 | "affinity for process PID " << getpid() << ": " << | |
65 | xstrerr(xerrno)); | |
66 | } | |
67 | CPU_ZERO(&theOrigCpuSet); | |
68 | } | |
69 | } | |
70 | ||
71 | bool | |
72 | CpuAffinitySet::applied() | |
73 | { | |
74 | // NOTE: cannot be const. | |
75 | // According to CPU_SET(3) and, apparently, on some systems (e.g., | |
76 | // OpenSuSE 10.3) CPU_COUNT macro expects a non-const argument. | |
77 | return (CPU_COUNT(&theOrigCpuSet) > 0); | |
78 | } | |
79 | ||
80 | void | |
81 | CpuAffinitySet::set(const cpu_set_t &aCpuSet) | |
82 | { | |
83 | memcpy(&theCpuSet, &aCpuSet, sizeof(theCpuSet)); | |
84 | } | |
85 |