diff --git a/src/condor_procd/proc_family.cpp b/src/condor_procd/proc_family.cpp
index d35ffcc..2a5839f 100644
--- a/src/condor_procd/proc_family.cpp
+++ b/src/condor_procd/proc_family.cpp
@@ -36,6 +36,10 @@
#include <unistd.h>
long ProcFamily::clock_tick = sysconf( _SC_CLK_TCK );
+
+// Swap accounting is sometimes turned off. We use this variable so we
+// warn about that situation only once.
+bool ProcFamily::have_warned_about_memsw = false;
#endif
ProcFamily::ProcFamily(ProcFamilyMonitor* monitor,
@@ -425,10 +429,19 @@ ProcFamily::update_max_image_size_cgroup()
return;
}
if ((err = cgroup_get_value_uint64(memct, "memory.memsw.max_usage_in_bytes", &max_image))) {
- dprintf(D_PROCFAMILY,
- "Unable to load max memory usage for cgroup %s (ProcFamily %u): %u %s\n",
- m_cgroup_string.c_str(), m_root_pid, err, cgroup_strerror(err));
- return;
+ // On newer nodes, swap accounting is disabled by default.
+ // In some cases, swap accounting causes a kernel oops at the time of writing.
+ // So, we check memory.max_usage_in_bytes instead.
+ int err2 = cgroup_get_value_uint64(memct, "memory.max_usage_in_bytes", &max_image);
+ if (err2) {
+ dprintf(D_PROCFAMILY,
+ "Unable to load max memory usage for cgroup %s (ProcFamily %u): %u %s\n",
+ m_cgroup_string.c_str(), m_root_pid, err, cgroup_strerror(err));
+ return;
+ } else if (!have_warned_about_memsw) {
+ have_warned_about_memsw = true;
+ dprintf(D_ALWAYS, "Swap acounting is not available; only doing RAM accounting.\n");
+ }
}
m_max_image_size = max_image/1024;
}
diff --git a/src/condor_procd/proc_family.h b/src/condor_procd/proc_family.h
index 28a854c..d831d8e 100644
--- a/src/condor_procd/proc_family.h
+++ b/src/condor_procd/proc_family.h
@@ -181,6 +181,7 @@ private:
std::string m_cgroup_string;
CgroupManager &m_cm;
static long clock_tick;
+ static bool have_warned_about_memsw;
int count_tasks_cgroup();
int aggregate_usage_cgroup_blockio(ProcFamilyUsage*);
diff --git a/src/condor_starter.V6.1/cgroup.linux.cpp b/src/condor_starter.V6.1/cgroup.linux.cpp
index 97407b3..4fbd00d 100644
--- a/src/condor_starter.V6.1/cgroup.linux.cpp
+++ b/src/condor_starter.V6.1/cgroup.linux.cpp
@@ -185,13 +185,6 @@ int CgroupManager::create(const std::string &cgroup_string, Cgroup &cgroup,
has_cgroup, changed_cgroup)) {
return -1;
}
- if ((preferred_controllers & CPUACCT_CONTROLLER) &&
- initialize_controller(*cgroupp, CPUACCT_CONTROLLER,
- CPUACCT_CONTROLLER_STR,
- required_controllers & CPUACCT_CONTROLLER,
- has_cgroup, changed_cgroup)) {
- return -1;
- }
if ((preferred_controllers & BLOCK_CONTROLLER) &&
initialize_controller(*cgroupp, BLOCK_CONTROLLER,
BLOCK_CONTROLLER_STR,
diff --git a/src/condor_starter.V6.1/cgroup_limits.cpp b/src/condor_starter.V6.1/cgroup_limits.cpp
index 71830a5..93e311c 100644
--- a/src/condor_starter.V6.1/cgroup_limits.cpp
+++ b/src/condor_starter.V6.1/cgroup_limits.cpp
@@ -20,7 +20,7 @@ CgroupLimits::CgroupLimits(std::string &cgroup) : m_cgroup_string(cgroup)
int CgroupLimits::set_memory_limit_bytes(uint64_t mem_bytes, bool soft)
{
if (!m_cgroup.isValid() || !CgroupManager::getInstance().isMounted(CgroupManager::MEMORY_CONTROLLER)) {
- dprintf(D_ALWAYS, "Unable to set memory limit because cgroup is invalid.");
+ dprintf(D_ALWAYS, "Unable to set memory limit because cgroup is invalid.\n");
return 1;
}
@@ -55,7 +55,7 @@ int CgroupLimits::set_memory_limit_bytes(uint64_t mem_bytes, bool soft)
int CgroupLimits::set_cpu_shares(uint64_t shares)
{
if (!m_cgroup.isValid() || !CgroupManager::getInstance().isMounted(CgroupManager::CPU_CONTROLLER)) {
- dprintf(D_ALWAYS, "Unable to set CPU shares because cgroup is invalid.");
+ dprintf(D_ALWAYS, "Unable to set CPU shares because cgroup is invalid.\n");
return 1;
}
@@ -89,7 +89,7 @@ int CgroupLimits::set_cpu_shares(uint64_t shares)
int CgroupLimits::set_blockio_weight(uint64_t weight)
{
if (!m_cgroup.isValid() || !CgroupManager::getInstance().isMounted(CgroupManager::BLOCK_CONTROLLER)) {
- dprintf(D_ALWAYS, "Unable to set blockio weight because cgroup is invalid.");
+ dprintf(D_ALWAYS, "Unable to set blockio weight because cgroup is invalid.\n");
return 1;
}