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