Program Listing for File OneTimeSysSetup.cpp
↰ Return to documentation for file (include/input/linux/RT/OneTimeSysSetup.cpp)
#include "OneTimeSysSetup.hpp"
void
OneTimeSysSetup::FixCPU(int core_number)
{
int valid_res = CoreValid(core_number);
if (valid_res < 0) {
switch (valid_res) {
case PDJE_RT_ERROR::FAILED_TO_SCHED_GETAFFINITY:
throw "failed to sched getaffinity";
case PDJE_RT_ERROR::FAILED_TO_SET_CPU_NUMBER:
throw "failed to set cpu number";
}
}
cpu_set_t cpu_set;
CPU_ZERO(&cpu_set);
CPU_SET(core_number, &cpu_set);
if (sched_setaffinity(0, sizeof(cpu_set), &cpu_set) != 0) {
throw "failed to set affinity";
}
if (numa_available() != -1) {
int node = numa_node_of_cpu(core_number);
node = node >= 0 ? node : 0;
int policy = MPOL_BIND;
bitmask *node_mask = numa_allocate_nodemask();
if (!node_mask) {
throw "failed to allocate node mask";
} else {
numa_bitmask_clearall(node_mask);
numa_bitmask_setbit(node_mask, node);
if (set_mempolicy(policy, node_mask->maskp, node_mask->size)) {
throw "set mem policy failed";
}
numa_free_nodemask(node_mask);
}
}
}
int
OneTimeSysSetup::CoreValid(int core_number)
{
cpu_set_t allowed;
CPU_ZERO(&allowed);
if (sched_getaffinity(0, sizeof(allowed), &allowed) != 0) {
return PDJE_RT_ERROR::FAILED_TO_SCHED_GETAFFINITY;
}
if (!CPU_ISSET(core_number, &allowed)) {
for (int i = 0; i < CPU_SETSIZE; ++i) {
if (CPU_ISSET(i, &allowed)) {
core_number = i;
break;
}
}
if (!CPU_ISSET(core_number, &allowed)) {
return PDJE_RT_ERROR::FAILED_TO_SET_CPU_NUMBER;
}
}
return 0;
}
void
OneTimeSysSetup::MLock()
{
mlockall(MCL_CURRENT | MCL_FUTURE);
}