Fix for running in a container without mem limit set on Windows; (#23297)
authorMaoni Stephens <Maoni0@users.noreply.github.com>
Mon, 18 Mar 2019 20:39:29 +0000 (13:39 -0700)
committerJan Kotas <jkotas@microsoft.com>
Mon, 18 Mar 2019 20:39:29 +0000 (13:39 -0700)
also fixing the LocalGC standalone case on Linux

src/gc/unix/cgroup.cpp
src/gc/windows/gcenv.windows.cpp
src/pal/src/misc/cgroup.cpp
src/vm/gcenv.os.cpp

index b66323a..88eb415 100644 (file)
@@ -434,10 +434,19 @@ void CleanupCGroup()
 
 size_t GetRestrictedPhysicalMemoryLimit()
 {
-    size_t physical_memory_limit;
+    size_t physical_memory_limit = 0;
  
     if (!CGroup::GetPhysicalMemoryLimit(&physical_memory_limit))
-         physical_memory_limit = SIZE_T_MAX;
+         return 0;
+
+    // If there's no memory limit specified on the container this 
+    // actually returns 0x7FFFFFFFFFFFF000 (2^63-1 rounded down to 
+    // 4k which is a common page size). So we know we are not
+    // running in a memory restricted environment.
+    if (physical_memory_limit > 0x7FFFFFFF00000000)
+    {
+        return 0;
+    }
 
     struct rlimit curr_rlimit;
     size_t rlimit_soft_limit = (size_t)RLIM_INFINITY;
index f032405..f7d069c 100644 (file)
@@ -286,16 +286,21 @@ static size_t GetRestrictedPhysicalMemoryLimit()
             if ((limit_info.BasicLimitInformation.LimitFlags & JOB_OBJECT_LIMIT_WORKINGSET) != 0)
                 job_workingset_limit = limit_info.BasicLimitInformation.MaximumWorkingSetSize;
 
-            job_physical_memory_limit = min (job_memory_limit, job_process_memory_limit);
-            job_physical_memory_limit = min (job_physical_memory_limit, job_workingset_limit);
+            if ((job_memory_limit != (size_t)UINTPTR_MAX) ||
+                (job_process_memory_limit != (size_t)UINTPTR_MAX) ||
+                (job_workingset_limit != (size_t)UINTPTR_MAX))
+            {
+                job_physical_memory_limit = min (job_memory_limit, job_process_memory_limit);
+                job_physical_memory_limit = min (job_physical_memory_limit, job_workingset_limit);
 
-            MEMORYSTATUSEX ms;
-            ::GetProcessMemoryLoad(&ms);
-            total_virtual = ms.ullTotalVirtual;
-            total_physical = ms.ullAvailPhys;
+                MEMORYSTATUSEX ms;
+                ::GetProcessMemoryLoad(&ms);
+                total_virtual = ms.ullTotalVirtual;
+                total_physical = ms.ullAvailPhys;
 
-            // A sanity check in case someone set a larger limit than there is actual physical memory.
-            job_physical_memory_limit = (size_t) min (job_physical_memory_limit, ms.ullTotalPhys);
+                // A sanity check in case someone set a larger limit than there is actual physical memory.
+                job_physical_memory_limit = (size_t) min (job_physical_memory_limit, ms.ullTotalPhys);
+            }
         }
     }
 
index 304b813..144ac66 100644 (file)
@@ -386,20 +386,18 @@ size_t
 PALAPI
 PAL_GetRestrictedPhysicalMemoryLimit()
 {
-    size_t physical_memory_limit;
+    size_t physical_memory_limit = 0;
 
     if (!CGroup::GetPhysicalMemoryLimit(&physical_memory_limit))
          return 0;
-    else
+
+    // If there's no memory limit specified on the container this 
+    // actually returns 0x7FFFFFFFFFFFF000 (2^63-1 rounded down to 
+    // 4k which is a common page size). So we know we are not
+    // running in a memory restricted environment.
+    if (physical_memory_limit > 0x7FFFFFFF00000000)
     {
-        // If there's no memory limit specified on the container this 
-        // actually returns 0x7FFFFFFFFFFFF000 (2^63-1 rounded down to 
-        // 4k which is a common page size). So we know we are not
-        // running in a memory restricted environment.
-        if (physical_memory_limit > 0x7FFFFFFF00000000)
-        {
-            return 0;
-        }
+        return 0;
     }
 
     struct rlimit curr_rlimit;
index 0e37931..4d6a19c 100644 (file)
@@ -494,16 +494,21 @@ static size_t GetRestrictedPhysicalMemoryLimit()
             if ((limit_info.BasicLimitInformation.LimitFlags & JOB_OBJECT_LIMIT_WORKINGSET) != 0)
                 job_workingset_limit = limit_info.BasicLimitInformation.MaximumWorkingSetSize;
 
-            job_physical_memory_limit = min (job_memory_limit, job_process_memory_limit);
-            job_physical_memory_limit = min (job_physical_memory_limit, job_workingset_limit);
+            if ((job_memory_limit != (size_t)MAX_PTR) ||
+                (job_process_memory_limit != (size_t)MAX_PTR) ||
+                (job_workingset_limit != (size_t)MAX_PTR))
+            {
+                job_physical_memory_limit = min (job_memory_limit, job_process_memory_limit);
+                job_physical_memory_limit = min (job_physical_memory_limit, job_workingset_limit);
 
-            MEMORYSTATUSEX ms;
-            ::GetProcessMemoryLoad(&ms);
-            total_virtual = ms.ullTotalVirtual;
-            total_physical = ms.ullAvailPhys;
+                MEMORYSTATUSEX ms;
+                ::GetProcessMemoryLoad(&ms);
+                total_virtual = ms.ullTotalVirtual;
+                total_physical = ms.ullAvailPhys;
 
-            // A sanity check in case someone set a larger limit than there is actual physical memory.
-            job_physical_memory_limit = (size_t) min (job_physical_memory_limit, ms.ullTotalPhys);
+                // A sanity check in case someone set a larger limit than there is actual physical memory.
+                job_physical_memory_limit = (size_t) min (job_physical_memory_limit, ms.ullTotalPhys);
+            }
         }
     }